/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact 3214e390ca5ff0b19fb5084e5bd5870da623389d:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d  ******.** This m
0180: 6f 64 75 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43  odule contains C
0190: 20 63 6f 64 65 20 74 68 61 74 20 67 65 6e 65 72   code that gener
01a0: 61 74 65 73 20 56 44 42 45 20 63 6f 64 65 20 75  ates VDBE code u
01b0: 73 65 64 20 74 6f 20 70 72 6f 63 65 73 73 0a 2a  sed to process.*
01c0: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
01d0: 73 65 20 6f 66 20 53 51 4c 20 73 74 61 74 65 6d  se of SQL statem
01e0: 65 6e 74 73 2e 20 20 54 68 69 73 20 6d 6f 64 75  ents.  This modu
01f0: 6c 65 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  le is responsibl
0200: 65 20 66 6f 72 0a 2a 2a 20 67 65 6e 65 72 61 74  e for.** generat
0210: 69 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68 61  ing the code tha
0220: 74 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20  t loops through 
0230: 61 20 74 61 62 6c 65 20 6c 6f 6f 6b 69 6e 67 20  a table looking 
0240: 66 6f 72 20 61 70 70 6c 69 63 61 62 6c 65 0a 2a  for applicable.*
0250: 2a 20 72 6f 77 73 2e 20 20 49 6e 64 69 63 65 73  * rows.  Indices
0260: 20 61 72 65 20 73 65 6c 65 63 74 65 64 20 61 6e   are selected an
0270: 64 20 75 73 65 64 20 74 6f 20 73 70 65 65 64 20  d used to speed 
0280: 74 68 65 20 73 65 61 72 63 68 20 77 68 65 6e 20  the search when 
0290: 64 6f 69 6e 67 0a 2a 2a 20 73 6f 20 69 73 20 61  doing.** so is a
02a0: 70 70 6c 69 63 61 62 6c 65 2e 20 20 42 65 63 61  pplicable.  Beca
02b0: 75 73 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 20  use this module 
02c0: 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
02d0: 6f 72 20 73 65 6c 65 63 74 69 6e 67 0a 2a 2a 20  or selecting.** 
02e0: 69 6e 64 69 63 65 73 2c 20 79 6f 75 20 6d 69 67  indices, you mig
02f0: 68 74 20 61 6c 73 6f 20 74 68 69 6e 6b 20 6f 66  ht also think of
0300: 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 61 73 20   this module as 
0310: 74 68 65 20 22 71 75 65 72 79 20 6f 70 74 69 6d  the "query optim
0320: 69 7a 65 72 22 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  izer"..*/.#inclu
0330: 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22  de "sqliteInt.h"
0340: 0a 23 69 6e 63 6c 75 64 65 20 22 77 68 65 72 65  .#include "where
0350: 49 6e 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 52 65  Int.h"../*.** Re
0360: 74 75 72 6e 20 74 68 65 20 65 73 74 69 6d 61 74  turn the estimat
0370: 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74  ed number of out
0380: 70 75 74 20 72 6f 77 73 20 66 72 6f 6d 20 61 20  put rows from a 
0390: 57 48 45 52 45 20 63 6c 61 75 73 65 0a 2a 2f 0a  WHERE clause.*/.
03a0: 75 36 34 20 73 71 6c 69 74 65 33 57 68 65 72 65  u64 sqlite3Where
03b0: 4f 75 74 70 75 74 52 6f 77 43 6f 75 6e 74 28 57  OutputRowCount(W
03c0: 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
03d0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
03e0: 74 65 33 4c 6f 67 45 73 74 54 6f 49 6e 74 28 70  te3LogEstToInt(p
03f0: 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 29 3b  WInfo->nRowOut);
0400: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
0410: 20 6f 6e 65 20 6f 66 20 74 68 65 20 57 48 45 52   one of the WHER
0420: 45 5f 44 49 53 54 49 4e 43 54 5f 78 78 78 78 78  E_DISTINCT_xxxxx
0430: 20 76 61 6c 75 65 73 20 74 6f 20 69 6e 64 69 63   values to indic
0440: 61 74 65 20 68 6f 77 20 74 68 69 73 0a 2a 2a 20  ate how this.** 
0450: 57 48 45 52 45 20 63 6c 61 75 73 65 20 72 65 74  WHERE clause ret
0460: 75 72 6e 73 20 6f 75 74 70 75 74 73 20 66 6f 72  urns outputs for
0470: 20 44 49 53 54 49 4e 43 54 20 70 72 6f 63 65 73   DISTINCT proces
0480: 73 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  sing..*/.int sql
0490: 69 74 65 33 57 68 65 72 65 49 73 44 69 73 74 69  ite3WhereIsDisti
04a0: 6e 63 74 28 57 68 65 72 65 49 6e 66 6f 20 2a 70  nct(WhereInfo *p
04b0: 57 49 6e 66 6f 29 7b 0a 20 20 72 65 74 75 72 6e  WInfo){.  return
04c0: 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e   pWInfo->eDistin
04d0: 63 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ct;.}../*.** Ret
04e0: 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
04f0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 72 65 74  WHERE clause ret
0500: 75 72 6e 73 20 72 6f 77 73 20 69 6e 20 4f 52 44  urns rows in ORD
0510: 45 52 20 42 59 20 6f 72 64 65 72 2e 0a 2a 2a 20  ER BY order..** 
0520: 52 65 74 75 72 6e 20 46 41 4c 53 45 20 69 66 20  Return FALSE if 
0530: 74 68 65 20 6f 75 74 70 75 74 20 6e 65 65 64 73  the output needs
0540: 20 74 6f 20 62 65 20 73 6f 72 74 65 64 2e 0a 2a   to be sorted..*
0550: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65  /.int sqlite3Whe
0560: 72 65 49 73 4f 72 64 65 72 65 64 28 57 68 65 72  reIsOrdered(Wher
0570: 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a  eInfo *pWInfo){.
0580: 20 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 2d    return pWInfo-
0590: 3e 6e 4f 42 53 61 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  >nOBSat;.}../*.*
05a0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 56 44 42  * Return the VDB
05b0: 45 20 61 64 64 72 65 73 73 20 6f 72 20 6c 61 62  E address or lab
05c0: 65 6c 20 74 6f 20 6a 75 6d 70 20 74 6f 20 69 6e  el to jump to in
05d0: 20 6f 72 64 65 72 20 74 6f 20 63 6f 6e 74 69 6e   order to contin
05e0: 75 65 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c  ue.** immediatel
05f0: 79 20 77 69 74 68 20 74 68 65 20 6e 65 78 74 20  y with the next 
0600: 72 6f 77 20 6f 66 20 61 20 57 48 45 52 45 20 63  row of a WHERE c
0610: 6c 61 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  lause..*/.int sq
0620: 6c 69 74 65 33 57 68 65 72 65 43 6f 6e 74 69 6e  lite3WhereContin
0630: 75 65 4c 61 62 65 6c 28 57 68 65 72 65 49 6e 66  ueLabel(WhereInf
0640: 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 61 73  o *pWInfo){.  as
0650: 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 69 43  sert( pWInfo->iC
0660: 6f 6e 74 69 6e 75 65 21 3d 30 20 29 3b 0a 20 20  ontinue!=0 );.  
0670: 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 69  return pWInfo->i
0680: 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a  Continue;.}../*.
0690: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 56 44  ** Return the VD
06a0: 42 45 20 61 64 64 72 65 73 73 20 6f 72 20 6c 61  BE address or la
06b0: 62 65 6c 20 74 6f 20 6a 75 6d 70 20 74 6f 20 69  bel to jump to i
06c0: 6e 20 6f 72 64 65 72 20 74 6f 20 62 72 65 61 6b  n order to break
06d0: 0a 2a 2a 20 6f 75 74 20 6f 66 20 61 20 57 48 45  .** out of a WHE
06e0: 52 45 20 6c 6f 6f 70 2e 0a 2a 2f 0a 69 6e 74 20  RE loop..*/.int 
06f0: 73 71 6c 69 74 65 33 57 68 65 72 65 42 72 65 61  sqlite3WhereBrea
0700: 6b 4c 61 62 65 6c 28 57 68 65 72 65 49 6e 66 6f  kLabel(WhereInfo
0710: 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 72 65 74   *pWInfo){.  ret
0720: 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65  urn pWInfo->iBre
0730: 61 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ak;.}../*.** Ret
0740: 75 72 6e 20 54 52 55 45 20 69 66 20 61 6e 20 55  urn TRUE if an U
0750: 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20  PDATE or DELETE 
0760: 73 74 61 74 65 6d 65 6e 74 20 63 61 6e 20 6f 70  statement can op
0770: 65 72 61 74 65 20 64 69 72 65 63 74 6c 79 20 6f  erate directly o
0780: 6e 0a 2a 2a 20 74 68 65 20 72 6f 77 69 64 73 20  n.** the rowids 
0790: 72 65 74 75 72 6e 65 64 20 62 79 20 61 20 57 48  returned by a WH
07a0: 45 52 45 20 63 6c 61 75 73 65 2e 20 20 52 65 74  ERE clause.  Ret
07b0: 75 72 6e 20 46 41 4c 53 45 20 69 66 20 64 6f 69  urn FALSE if doi
07c0: 6e 67 20 61 6e 0a 2a 2a 20 55 50 44 41 54 45 20  ng an.** UPDATE 
07d0: 6f 72 20 44 45 4c 45 54 45 20 6d 69 67 68 74 20  or DELETE might 
07e0: 63 68 61 6e 67 65 20 73 75 62 73 65 71 75 65 6e  change subsequen
07f0: 74 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 72  t WHERE clause r
0800: 65 73 75 6c 74 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  esults..**.** If
0810: 20 74 68 65 20 4f 4e 45 50 41 53 53 20 6f 70 74   the ONEPASS opt
0820: 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 75 73 65  imization is use
0830: 64 20 28 69 66 20 74 68 69 73 20 72 6f 75 74 69  d (if this routi
0840: 6e 65 20 72 65 74 75 72 6e 73 20 74 72 75 65 29  ne returns true)
0850: 0a 2a 2a 20 74 68 65 6e 20 61 6c 73 6f 20 77 72  .** then also wr
0860: 69 74 65 20 74 68 65 20 69 6e 64 69 63 65 73 20  ite the indices 
0870: 6f 66 20 6f 70 65 6e 20 63 75 72 73 6f 72 73 20  of open cursors 
0880: 75 73 65 64 20 62 79 20 4f 4e 45 50 41 53 53 0a  used by ONEPASS.
0890: 2a 2a 20 69 6e 74 6f 20 61 69 43 75 72 5b 30 5d  ** into aiCur[0]
08a0: 20 61 6e 64 20 61 69 43 75 72 5b 31 5d 2e 20 20   and aiCur[1].  
08b0: 69 61 43 75 72 5b 30 5d 20 67 65 74 73 20 74 68  iaCur[0] gets th
08c0: 65 20 63 75 72 73 6f 72 20 6f 66 20 74 68 65 20  e cursor of the 
08d0: 64 61 74 61 0a 2a 2a 20 74 61 62 6c 65 20 61 6e  data.** table an
08e0: 64 20 69 61 43 75 72 5b 31 5d 20 67 65 74 73 20  d iaCur[1] gets 
08f0: 74 68 65 20 63 75 72 73 6f 72 20 75 73 65 64 20  the cursor used 
0900: 62 79 20 61 6e 20 61 75 78 69 6c 69 61 72 79 20  by an auxiliary 
0910: 69 6e 64 65 78 2e 0a 2a 2a 20 45 69 74 68 65 72  index..** Either
0920: 20 76 61 6c 75 65 20 6d 61 79 20 62 65 20 2d 31   value may be -1
0930: 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61  , indicating tha
0940: 74 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20  t cursor is not 
0950: 75 73 65 64 2e 0a 2a 2a 20 41 6e 79 20 63 75 72  used..** Any cur
0960: 73 6f 72 73 20 72 65 74 75 72 6e 65 64 20 77 69  sors returned wi
0970: 6c 6c 20 68 61 76 65 20 62 65 65 6e 20 6f 70 65  ll have been ope
0980: 6e 65 64 20 66 6f 72 20 77 72 69 74 69 6e 67 2e  ned for writing.
0990: 0a 2a 2a 0a 2a 2a 20 61 69 43 75 72 5b 30 5d 20  .**.** aiCur[0] 
09a0: 61 6e 64 20 61 69 43 75 72 5b 31 5d 20 62 6f 74  and aiCur[1] bot
09b0: 68 20 67 65 74 20 2d 31 20 69 66 20 74 68 65 20  h get -1 if the 
09c0: 77 68 65 72 65 2d 63 6c 61 75 73 65 20 6c 6f 67  where-clause log
09d0: 69 63 20 69 73 0a 2a 2a 20 75 6e 61 62 6c 65 20  ic is.** unable 
09e0: 74 6f 20 75 73 65 20 74 68 65 20 4f 4e 45 50 41  to use the ONEPA
09f0: 53 53 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e  SS optimization.
0a00: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 57  .*/.int sqlite3W
0a10: 68 65 72 65 4f 6b 4f 6e 65 50 61 73 73 28 57 68  hereOkOnePass(Wh
0a20: 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c  ereInfo *pWInfo,
0a30: 20 69 6e 74 20 2a 61 69 43 75 72 29 7b 0a 20 20   int *aiCur){.  
0a40: 6d 65 6d 63 70 79 28 61 69 43 75 72 2c 20 70 57  memcpy(aiCur, pW
0a50: 49 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e 65 50 61  Info->aiCurOnePa
0a60: 73 73 2c 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a  ss, sizeof(int)*
0a70: 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 57 49  2);.  return pWI
0a80: 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 3b 0a  nfo->okOnePass;.
0a90: 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  }../*.** Move th
0aa0: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 53 72  e content of pSr
0ab0: 63 20 69 6e 74 6f 20 70 44 65 73 74 0a 2a 2f 0a  c into pDest.*/.
0ac0: 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72  static void wher
0ad0: 65 4f 72 4d 6f 76 65 28 57 68 65 72 65 4f 72 53  eOrMove(WhereOrS
0ae0: 65 74 20 2a 70 44 65 73 74 2c 20 57 68 65 72 65  et *pDest, Where
0af0: 4f 72 53 65 74 20 2a 70 53 72 63 29 7b 0a 20 20  OrSet *pSrc){.  
0b00: 70 44 65 73 74 2d 3e 6e 20 3d 20 70 53 72 63 2d  pDest->n = pSrc-
0b10: 3e 6e 3b 0a 20 20 6d 65 6d 63 70 79 28 70 44 65  >n;.  memcpy(pDe
0b20: 73 74 2d 3e 61 2c 20 70 53 72 63 2d 3e 61 2c 20  st->a, pSrc->a, 
0b30: 70 44 65 73 74 2d 3e 6e 2a 73 69 7a 65 6f 66 28  pDest->n*sizeof(
0b40: 70 44 65 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 7d  pDest->a[0]));.}
0b50: 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 69  ../*.** Try to i
0b60: 6e 73 65 72 74 20 61 20 6e 65 77 20 70 72 65 72  nsert a new prer
0b70: 65 71 75 69 73 69 74 65 2f 63 6f 73 74 20 65 6e  equisite/cost en
0b80: 74 72 79 20 69 6e 74 6f 20 74 68 65 20 57 68 65  try into the Whe
0b90: 72 65 4f 72 53 65 74 20 70 53 65 74 2e 0a 2a 2a  reOrSet pSet..**
0ba0: 0a 2a 2a 20 54 68 65 20 6e 65 77 20 65 6e 74 72  .** The new entr
0bb0: 79 20 6d 69 67 68 74 20 6f 76 65 72 77 72 69 74  y might overwrit
0bc0: 65 20 61 6e 20 65 78 69 73 74 69 6e 67 20 65 6e  e an existing en
0bd0: 74 72 79 2c 20 6f 72 20 69 74 20 6d 69 67 68 74  try, or it might
0be0: 20 62 65 0a 2a 2a 20 61 70 70 65 6e 64 65 64 2c   be.** appended,
0bf0: 20 6f 72 20 69 74 20 6d 69 67 68 74 20 62 65 20   or it might be 
0c00: 64 69 73 63 61 72 64 65 64 2e 20 20 44 6f 20 77  discarded.  Do w
0c10: 68 61 74 65 76 65 72 20 69 73 20 74 68 65 20 72  hatever is the r
0c20: 69 67 68 74 20 74 68 69 6e 67 0a 2a 2a 20 73 6f  ight thing.** so
0c30: 20 74 68 61 74 20 70 53 65 74 20 6b 65 65 70 73   that pSet keeps
0c40: 20 74 68 65 20 4e 5f 4f 52 5f 43 4f 53 54 20 62   the N_OR_COST b
0c50: 65 73 74 20 65 6e 74 72 69 65 73 20 73 65 65 6e  est entries seen
0c60: 20 73 6f 20 66 61 72 2e 0a 2a 2f 0a 73 74 61 74   so far..*/.stat
0c70: 69 63 20 69 6e 74 20 77 68 65 72 65 4f 72 49 6e  ic int whereOrIn
0c80: 73 65 72 74 28 0a 20 20 57 68 65 72 65 4f 72 53  sert(.  WhereOrS
0c90: 65 74 20 2a 70 53 65 74 2c 20 20 20 20 20 20 2f  et *pSet,      /
0ca0: 2a 20 54 68 65 20 57 68 65 72 65 4f 72 53 65 74  * The WhereOrSet
0cb0: 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 20 2a   to be updated *
0cc0: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 70 72 65 72  /.  Bitmask prer
0cd0: 65 71 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 72  eq,        /* Pr
0ce0: 65 72 65 71 75 69 73 69 74 65 73 20 6f 66 20 74  erequisites of t
0cf0: 68 65 20 6e 65 77 20 65 6e 74 72 79 20 2a 2f 0a  he new entry */.
0d00: 20 20 4c 6f 67 45 73 74 20 72 52 75 6e 2c 20 20    LogEst rRun,  
0d10: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 75 6e 2d           /* Run-
0d20: 63 6f 73 74 20 6f 66 20 74 68 65 20 6e 65 77 20  cost of the new 
0d30: 65 6e 74 72 79 20 2a 2f 0a 20 20 4c 6f 67 45 73  entry */.  LogEs
0d40: 74 20 6e 4f 75 74 20 20 20 20 20 20 20 20 20 20  t nOut          
0d50: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f    /* Number of o
0d60: 75 74 70 75 74 73 20 66 6f 72 20 74 68 65 20 6e  utputs for the n
0d70: 65 77 20 65 6e 74 72 79 20 2a 2f 0a 29 7b 0a 20  ew entry */.){. 
0d80: 20 75 31 36 20 69 3b 0a 20 20 57 68 65 72 65 4f   u16 i;.  WhereO
0d90: 72 43 6f 73 74 20 2a 70 3b 0a 20 20 66 6f 72 28  rCost *p;.  for(
0da0: 69 3d 70 53 65 74 2d 3e 6e 2c 20 70 3d 70 53 65  i=pSet->n, p=pSe
0db0: 74 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20  t->a; i>0; i--, 
0dc0: 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 72 52  p++){.    if( rR
0dd0: 75 6e 3c 3d 70 2d 3e 72 52 75 6e 20 26 26 20 28  un<=p->rRun && (
0de0: 70 72 65 72 65 71 20 26 20 70 2d 3e 70 72 65 72  prereq & p->prer
0df0: 65 71 29 3d 3d 70 72 65 72 65 71 20 29 7b 0a 20  eq)==prereq ){. 
0e00: 20 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65 4f       goto whereO
0e10: 72 49 6e 73 65 72 74 5f 64 6f 6e 65 3b 0a 20 20  rInsert_done;.  
0e20: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 72    }.    if( p->r
0e30: 52 75 6e 3c 3d 72 52 75 6e 20 26 26 20 28 70 2d  Run<=rRun && (p-
0e40: 3e 70 72 65 72 65 71 20 26 20 70 72 65 72 65 71  >prereq & prereq
0e50: 29 3d 3d 70 2d 3e 70 72 65 72 65 71 20 29 7b 0a  )==p->prereq ){.
0e60: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
0e70: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
0e80: 70 53 65 74 2d 3e 6e 3c 4e 5f 4f 52 5f 43 4f 53  pSet->n<N_OR_COS
0e90: 54 20 29 7b 0a 20 20 20 20 70 20 3d 20 26 70 53  T ){.    p = &pS
0ea0: 65 74 2d 3e 61 5b 70 53 65 74 2d 3e 6e 2b 2b 5d  et->a[pSet->n++]
0eb0: 3b 0a 20 20 20 20 70 2d 3e 6e 4f 75 74 20 3d 20  ;.    p->nOut = 
0ec0: 6e 4f 75 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  nOut;.  }else{. 
0ed0: 20 20 20 70 20 3d 20 70 53 65 74 2d 3e 61 3b 0a     p = pSet->a;.
0ee0: 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 70      for(i=1; i<p
0ef0: 53 65 74 2d 3e 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Set->n; i++){.  
0f00: 20 20 20 20 69 66 28 20 70 2d 3e 72 52 75 6e 3e      if( p->rRun>
0f10: 70 53 65 74 2d 3e 61 5b 69 5d 2e 72 52 75 6e 20  pSet->a[i].rRun 
0f20: 29 20 70 20 3d 20 70 53 65 74 2d 3e 61 20 2b 20  ) p = pSet->a + 
0f30: 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  i;.    }.    if(
0f40: 20 70 2d 3e 72 52 75 6e 3c 3d 72 52 75 6e 20 29   p->rRun<=rRun )
0f50: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 77   return 0;.  }.w
0f60: 68 65 72 65 4f 72 49 6e 73 65 72 74 5f 64 6f 6e  hereOrInsert_don
0f70: 65 3a 0a 20 20 70 2d 3e 70 72 65 72 65 71 20 3d  e:.  p->prereq =
0f80: 20 70 72 65 72 65 71 3b 0a 20 20 70 2d 3e 72 52   prereq;.  p->rR
0f90: 75 6e 20 3d 20 72 52 75 6e 3b 0a 20 20 69 66 28  un = rRun;.  if(
0fa0: 20 70 2d 3e 6e 4f 75 74 3e 6e 4f 75 74 20 29 20   p->nOut>nOut ) 
0fb0: 70 2d 3e 6e 4f 75 74 20 3d 20 6e 4f 75 74 3b 0a  p->nOut = nOut;.
0fc0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f    return 1;.}../
0fd0: 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
0fe0: 61 20 70 72 65 61 6c 6c 6f 63 61 74 65 64 20 57  a preallocated W
0ff0: 68 65 72 65 43 6c 61 75 73 65 20 73 74 72 75 63  hereClause struc
1000: 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ture..*/.static 
1010: 76 6f 69 64 20 77 68 65 72 65 43 6c 61 75 73 65  void whereClause
1020: 49 6e 69 74 28 0a 20 20 57 68 65 72 65 43 6c 61  Init(.  WhereCla
1030: 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20  use *pWC,       
1040: 20 2f 2a 20 54 68 65 20 57 68 65 72 65 43 6c 61   /* The WhereCla
1050: 75 73 65 20 74 6f 20 62 65 20 69 6e 69 74 69 61  use to be initia
1060: 6c 69 7a 65 64 20 2a 2f 0a 20 20 57 68 65 72 65  lized */.  Where
1070: 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 20 20 20  Info *pWInfo    
1080: 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
1090: 20 70 72 6f 63 65 73 73 69 6e 67 20 63 6f 6e 74   processing cont
10a0: 65 78 74 20 2a 2f 0a 29 7b 0a 20 20 70 57 43 2d  ext */.){.  pWC-
10b0: 3e 70 57 49 6e 66 6f 20 3d 20 70 57 49 6e 66 6f  >pWInfo = pWInfo
10c0: 3b 0a 20 20 70 57 43 2d 3e 70 4f 75 74 65 72 20  ;.  pWC->pOuter 
10d0: 3d 20 30 3b 0a 20 20 70 57 43 2d 3e 6e 54 65 72  = 0;.  pWC->nTer
10e0: 6d 20 3d 20 30 3b 0a 20 20 70 57 43 2d 3e 6e 53  m = 0;.  pWC->nS
10f0: 6c 6f 74 20 3d 20 41 72 72 61 79 53 69 7a 65 28  lot = ArraySize(
1100: 70 57 43 2d 3e 61 53 74 61 74 69 63 29 3b 0a 20  pWC->aStatic);. 
1110: 20 70 57 43 2d 3e 61 20 3d 20 70 57 43 2d 3e 61   pWC->a = pWC->a
1120: 53 74 61 74 69 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f  Static;.}../* Fo
1130: 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20  rward reference 
1140: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
1150: 68 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28  hereClauseClear(
1160: 57 68 65 72 65 43 6c 61 75 73 65 2a 29 3b 0a 0a  WhereClause*);..
1170: 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65  /*.** Deallocate
1180: 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 73 73 6f   all memory asso
1190: 63 69 61 74 65 64 20 77 69 74 68 20 61 20 57 68  ciated with a Wh
11a0: 65 72 65 4f 72 49 6e 66 6f 20 6f 62 6a 65 63 74  ereOrInfo object
11b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
11c0: 20 77 68 65 72 65 4f 72 49 6e 66 6f 44 65 6c 65   whereOrInfoDele
11d0: 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  te(sqlite3 *db, 
11e0: 57 68 65 72 65 4f 72 49 6e 66 6f 20 2a 70 29 7b  WhereOrInfo *p){
11f0: 0a 20 20 77 68 65 72 65 43 6c 61 75 73 65 43 6c  .  whereClauseCl
1200: 65 61 72 28 26 70 2d 3e 77 63 29 3b 0a 20 20 73  ear(&p->wc);.  s
1210: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
1220: 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65   p);.}../*.** De
1230: 61 6c 6c 6f 63 61 74 65 20 61 6c 6c 20 6d 65 6d  allocate all mem
1240: 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77  ory associated w
1250: 69 74 68 20 61 20 57 68 65 72 65 41 6e 64 49 6e  ith a WhereAndIn
1260: 66 6f 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74  fo object..*/.st
1270: 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 41  atic void whereA
1280: 6e 64 49 6e 66 6f 44 65 6c 65 74 65 28 73 71 6c  ndInfoDelete(sql
1290: 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 41  ite3 *db, WhereA
12a0: 6e 64 49 6e 66 6f 20 2a 70 29 7b 0a 20 20 77 68  ndInfo *p){.  wh
12b0: 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28 26  ereClauseClear(&
12c0: 70 2d 3e 77 63 29 3b 0a 20 20 73 71 6c 69 74 65  p->wc);.  sqlite
12d0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a  3DbFree(db, p);.
12e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63  }../*.** Dealloc
12f0: 61 74 65 20 61 20 57 68 65 72 65 43 6c 61 75 73  ate a WhereClaus
1300: 65 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68  e structure.  Th
1310: 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 73 74  e WhereClause st
1320: 72 75 63 74 75 72 65 0a 2a 2a 20 69 74 73 65 6c  ructure.** itsel
1330: 66 20 69 73 20 6e 6f 74 20 66 72 65 65 64 2e 20  f is not freed. 
1340: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
1350: 20 74 68 65 20 69 6e 76 65 72 73 65 20 6f 66 20   the inverse of 
1360: 77 68 65 72 65 43 6c 61 75 73 65 49 6e 69 74 28  whereClauseInit(
1370: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  )..*/.static voi
1380: 64 20 77 68 65 72 65 43 6c 61 75 73 65 43 6c 65  d whereClauseCle
1390: 61 72 28 57 68 65 72 65 43 6c 61 75 73 65 20 2a  ar(WhereClause *
13a0: 70 57 43 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  pWC){.  int i;. 
13b0: 20 57 68 65 72 65 54 65 72 6d 20 2a 61 3b 0a 20   WhereTerm *a;. 
13c0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
13d0: 57 43 2d 3e 70 57 49 6e 66 6f 2d 3e 70 50 61 72  WC->pWInfo->pPar
13e0: 73 65 2d 3e 64 62 3b 0a 20 20 66 6f 72 28 69 3d  se->db;.  for(i=
13f0: 70 57 43 2d 3e 6e 54 65 72 6d 2d 31 2c 20 61 3d  pWC->nTerm-1, a=
1400: 70 57 43 2d 3e 61 3b 20 69 3e 3d 30 3b 20 69 2d  pWC->a; i>=0; i-
1410: 2d 2c 20 61 2b 2b 29 7b 0a 20 20 20 20 69 66 28  -, a++){.    if(
1420: 20 61 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45   a->wtFlags & TE
1430: 52 4d 5f 44 59 4e 41 4d 49 43 20 29 7b 0a 20 20  RM_DYNAMIC ){.  
1440: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
1450: 65 6c 65 74 65 28 64 62 2c 20 61 2d 3e 70 45 78  elete(db, a->pEx
1460: 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  pr);.    }.    i
1470: 66 28 20 61 2d 3e 77 74 46 6c 61 67 73 20 26 20  f( a->wtFlags & 
1480: 54 45 52 4d 5f 4f 52 49 4e 46 4f 20 29 7b 0a 20  TERM_ORINFO ){. 
1490: 20 20 20 20 20 77 68 65 72 65 4f 72 49 6e 66 6f       whereOrInfo
14a0: 44 65 6c 65 74 65 28 64 62 2c 20 61 2d 3e 75 2e  Delete(db, a->u.
14b0: 70 4f 72 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 65  pOrInfo);.    }e
14c0: 6c 73 65 20 69 66 28 20 61 2d 3e 77 74 46 6c 61  lse if( a->wtFla
14d0: 67 73 20 26 20 54 45 52 4d 5f 41 4e 44 49 4e 46  gs & TERM_ANDINF
14e0: 4f 20 29 7b 0a 20 20 20 20 20 20 77 68 65 72 65  O ){.      where
14f0: 41 6e 64 49 6e 66 6f 44 65 6c 65 74 65 28 64 62  AndInfoDelete(db
1500: 2c 20 61 2d 3e 75 2e 70 41 6e 64 49 6e 66 6f 29  , a->u.pAndInfo)
1510: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
1520: 28 20 70 57 43 2d 3e 61 21 3d 70 57 43 2d 3e 61  ( pWC->a!=pWC->a
1530: 53 74 61 74 69 63 20 29 7b 0a 20 20 20 20 73 71  Static ){.    sq
1540: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
1550: 70 57 43 2d 3e 61 29 3b 0a 20 20 7d 0a 7d 0a 0a  pWC->a);.  }.}..
1560: 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 73 69 6e 67  /*.** Add a sing
1570: 6c 65 20 6e 65 77 20 57 68 65 72 65 54 65 72 6d  le new WhereTerm
1580: 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20 57 68   entry to the Wh
1590: 65 72 65 43 6c 61 75 73 65 20 6f 62 6a 65 63 74  ereClause object
15a0: 20 70 57 43 2e 0a 2a 2a 20 54 68 65 20 6e 65 77   pWC..** The new
15b0: 20 57 68 65 72 65 54 65 72 6d 20 6f 62 6a 65 63   WhereTerm objec
15c0: 74 20 69 73 20 63 6f 6e 73 74 72 75 63 74 65 64  t is constructed
15d0: 20 66 72 6f 6d 20 45 78 70 72 20 70 20 61 6e 64   from Expr p and
15e0: 20 77 69 74 68 20 77 74 46 6c 61 67 73 2e 0a 2a   with wtFlags..*
15f0: 2a 20 54 68 65 20 69 6e 64 65 78 20 69 6e 20 70  * The index in p
1600: 57 43 2d 3e 61 5b 5d 20 6f 66 20 74 68 65 20 6e  WC->a[] of the n
1610: 65 77 20 57 68 65 72 65 54 65 72 6d 20 69 73 20  ew WhereTerm is 
1620: 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63  returned on succ
1630: 65 73 73 2e 0a 2a 2a 20 30 20 69 73 20 72 65 74  ess..** 0 is ret
1640: 75 72 6e 65 64 20 69 66 20 74 68 65 20 6e 65 77  urned if the new
1650: 20 57 68 65 72 65 54 65 72 6d 20 63 6f 75 6c 64   WhereTerm could
1660: 20 6e 6f 74 20 62 65 20 61 64 64 65 64 20 64 75   not be added du
1670: 65 20 74 6f 20 61 20 6d 65 6d 6f 72 79 0a 2a 2a  e to a memory.**
1680: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f   allocation erro
1690: 72 2e 20 20 54 68 65 20 6d 65 6d 6f 72 79 20 61  r.  The memory a
16a0: 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 75 72  llocation failur
16b0: 65 20 77 69 6c 6c 20 62 65 20 72 65 63 6f 72 64  e will be record
16c0: 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 64 62 2d  ed in.** the db-
16d0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c  >mallocFailed fl
16e0: 61 67 20 73 6f 20 74 68 61 74 20 68 69 67 68 65  ag so that highe
16f0: 72 2d 6c 65 76 65 6c 20 66 75 6e 63 74 69 6f 6e  r-level function
1700: 73 20 63 61 6e 20 64 65 74 65 63 74 20 69 74 2e  s can detect it.
1710: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
1720: 69 6e 65 20 77 69 6c 6c 20 69 6e 63 72 65 61 73  ine will increas
1730: 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  e the size of th
1740: 65 20 70 57 43 2d 3e 61 5b 5d 20 61 72 72 61 79  e pWC->a[] array
1750: 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a   as necessary..*
1760: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 77 74 46 6c  *.** If the wtFl
1770: 61 67 73 20 61 72 67 75 6d 65 6e 74 20 69 6e 63  ags argument inc
1780: 6c 75 64 65 73 20 54 45 52 4d 5f 44 59 4e 41 4d  ludes TERM_DYNAM
1790: 49 43 2c 20 74 68 65 6e 20 72 65 73 70 6f 6e 73  IC, then respons
17a0: 69 62 69 6c 69 74 79 0a 2a 2a 20 66 6f 72 20 66  ibility.** for f
17b0: 72 65 65 69 6e 67 20 74 68 65 20 65 78 70 72 65  reeing the expre
17c0: 73 73 69 6f 6e 20 70 20 69 73 20 61 73 73 75 6d  ssion p is assum
17d0: 65 64 20 62 79 20 74 68 65 20 57 68 65 72 65 43  ed by the WhereC
17e0: 6c 61 75 73 65 20 6f 62 6a 65 63 74 20 70 57 43  lause object pWC
17f0: 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 72 75  ..** This is tru
1800: 65 20 65 76 65 6e 20 69 66 20 74 68 69 73 20 72  e even if this r
1810: 6f 75 74 69 6e 65 20 66 61 69 6c 73 20 74 6f 20  outine fails to 
1820: 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 57  allocate a new W
1830: 68 65 72 65 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20  hereTerm..**.** 
1840: 57 41 52 4e 49 4e 47 3a 20 20 54 68 69 73 20 72  WARNING:  This r
1850: 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 72 65 61  outine might rea
1860: 6c 6c 6f 63 61 74 65 20 74 68 65 20 73 70 61 63  llocate the spac
1870: 65 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a  e used to store.
1880: 2a 2a 20 57 68 65 72 65 54 65 72 6d 73 2e 20 20  ** WhereTerms.  
1890: 41 6c 6c 20 70 6f 69 6e 74 65 72 73 20 74 6f 20  All pointers to 
18a0: 57 68 65 72 65 54 65 72 6d 73 20 73 68 6f 75 6c  WhereTerms shoul
18b0: 64 20 62 65 20 69 6e 76 61 6c 69 64 61 74 65 64  d be invalidated
18c0: 20 61 66 74 65 72 0a 2a 2a 20 63 61 6c 6c 69 6e   after.** callin
18d0: 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20  g this routine. 
18e0: 20 53 75 63 68 20 70 6f 69 6e 74 65 72 73 20 6d   Such pointers m
18f0: 61 79 20 62 65 20 72 65 69 6e 69 74 69 61 6c 69  ay be reinitiali
1900: 7a 65 64 20 62 79 20 72 65 66 65 72 65 6e 63 69  zed by referenci
1910: 6e 67 0a 2a 2a 20 74 68 65 20 70 57 43 2d 3e 61  ng.** the pWC->a
1920: 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a 73 74 61  [] array..*/.sta
1930: 74 69 63 20 69 6e 74 20 77 68 65 72 65 43 6c 61  tic int whereCla
1940: 75 73 65 49 6e 73 65 72 74 28 57 68 65 72 65 43  useInsert(WhereC
1950: 6c 61 75 73 65 20 2a 70 57 43 2c 20 45 78 70 72  lause *pWC, Expr
1960: 20 2a 70 2c 20 75 38 20 77 74 46 6c 61 67 73 29   *p, u8 wtFlags)
1970: 7b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  {.  WhereTerm *p
1980: 54 65 72 6d 3b 0a 20 20 69 6e 74 20 69 64 78 3b  Term;.  int idx;
1990: 0a 20 20 74 65 73 74 63 61 73 65 28 20 77 74 46  .  testcase( wtF
19a0: 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54  lags & TERM_VIRT
19b0: 55 41 4c 20 29 3b 0a 20 20 69 66 28 20 70 57 43  UAL );.  if( pWC
19c0: 2d 3e 6e 54 65 72 6d 3e 3d 70 57 43 2d 3e 6e 53  ->nTerm>=pWC->nS
19d0: 6c 6f 74 20 29 7b 0a 20 20 20 20 57 68 65 72 65  lot ){.    Where
19e0: 54 65 72 6d 20 2a 70 4f 6c 64 20 3d 20 70 57 43  Term *pOld = pWC
19f0: 2d 3e 61 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ->a;.    sqlite3
1a00: 20 2a 64 62 20 3d 20 70 57 43 2d 3e 70 57 49 6e   *db = pWC->pWIn
1a10: 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a  fo->pParse->db;.
1a20: 20 20 20 20 70 57 43 2d 3e 61 20 3d 20 73 71 6c      pWC->a = sql
1a30: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
1a40: 64 62 2c 20 73 69 7a 65 6f 66 28 70 57 43 2d 3e  db, sizeof(pWC->
1a50: 61 5b 30 5d 29 2a 70 57 43 2d 3e 6e 53 6c 6f 74  a[0])*pWC->nSlot
1a60: 2a 32 20 29 3b 0a 20 20 20 20 69 66 28 20 70 57  *2 );.    if( pW
1a70: 43 2d 3e 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20  C->a==0 ){.     
1a80: 20 69 66 28 20 77 74 46 6c 61 67 73 20 26 20 54   if( wtFlags & T
1a90: 45 52 4d 5f 44 59 4e 41 4d 49 43 20 29 7b 0a 20  ERM_DYNAMIC ){. 
1aa0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
1ab0: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 29 3b  prDelete(db, p);
1ac0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
1ad0: 57 43 2d 3e 61 20 3d 20 70 4f 6c 64 3b 0a 20 20  WC->a = pOld;.  
1ae0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
1af0: 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28 70    }.    memcpy(p
1b00: 57 43 2d 3e 61 2c 20 70 4f 6c 64 2c 20 73 69 7a  WC->a, pOld, siz
1b10: 65 6f 66 28 70 57 43 2d 3e 61 5b 30 5d 29 2a 70  eof(pWC->a[0])*p
1b20: 57 43 2d 3e 6e 54 65 72 6d 29 3b 0a 20 20 20 20  WC->nTerm);.    
1b30: 69 66 28 20 70 4f 6c 64 21 3d 70 57 43 2d 3e 61  if( pOld!=pWC->a
1b40: 53 74 61 74 69 63 20 29 7b 0a 20 20 20 20 20 20  Static ){.      
1b50: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
1b60: 2c 20 70 4f 6c 64 29 3b 0a 20 20 20 20 7d 0a 20  , pOld);.    }. 
1b70: 20 20 20 70 57 43 2d 3e 6e 53 6c 6f 74 20 3d 20     pWC->nSlot = 
1b80: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 53  sqlite3DbMallocS
1b90: 69 7a 65 28 64 62 2c 20 70 57 43 2d 3e 61 29 2f  ize(db, pWC->a)/
1ba0: 73 69 7a 65 6f 66 28 70 57 43 2d 3e 61 5b 30 5d  sizeof(pWC->a[0]
1bb0: 29 3b 0a 20 20 7d 0a 20 20 70 54 65 72 6d 20 3d  );.  }.  pTerm =
1bc0: 20 26 70 57 43 2d 3e 61 5b 69 64 78 20 3d 20 70   &pWC->a[idx = p
1bd0: 57 43 2d 3e 6e 54 65 72 6d 2b 2b 5d 3b 0a 20 20  WC->nTerm++];.  
1be0: 69 66 28 20 70 20 26 26 20 45 78 70 72 48 61 73  if( p && ExprHas
1bf0: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 55  Property(p, EP_U
1c00: 6e 6c 69 6b 65 6c 79 29 20 29 7b 0a 20 20 20 20  nlikely) ){.    
1c10: 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62  pTerm->truthProb
1c20: 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
1c30: 28 70 2d 3e 69 54 61 62 6c 65 29 20 2d 20 39 39  (p->iTable) - 99
1c40: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
1c50: 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 20  Term->truthProb 
1c60: 3d 20 31 3b 0a 20 20 7d 0a 20 20 70 54 65 72 6d  = 1;.  }.  pTerm
1c70: 2d 3e 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65  ->pExpr = sqlite
1c80: 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65  3ExprSkipCollate
1c90: 28 70 29 3b 0a 20 20 70 54 65 72 6d 2d 3e 77 74  (p);.  pTerm->wt
1ca0: 46 6c 61 67 73 20 3d 20 77 74 46 6c 61 67 73 3b  Flags = wtFlags;
1cb0: 0a 20 20 70 54 65 72 6d 2d 3e 70 57 43 20 3d 20  .  pTerm->pWC = 
1cc0: 70 57 43 3b 0a 20 20 70 54 65 72 6d 2d 3e 69 50  pWC;.  pTerm->iP
1cd0: 61 72 65 6e 74 20 3d 20 2d 31 3b 0a 20 20 72 65  arent = -1;.  re
1ce0: 74 75 72 6e 20 69 64 78 3b 0a 7d 0a 0a 2f 2a 0a  turn idx;.}../*.
1cf0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1d00: 69 64 65 6e 74 69 66 69 65 73 20 73 75 62 65 78  identifies subex
1d10: 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65  pressions in the
1d20: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 77 68   WHERE clause wh
1d30: 65 72 65 0a 2a 2a 20 65 61 63 68 20 73 75 62 65  ere.** each sube
1d40: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 73 65 70  xpression is sep
1d50: 61 72 61 74 65 64 20 62 79 20 74 68 65 20 41 4e  arated by the AN
1d60: 44 20 6f 70 65 72 61 74 6f 72 20 6f 72 20 73 6f  D operator or so
1d70: 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 6f 70 65 72  me other.** oper
1d80: 61 74 6f 72 20 73 70 65 63 69 66 69 65 64 20 69  ator specified i
1d90: 6e 20 74 68 65 20 6f 70 20 70 61 72 61 6d 65 74  n the op paramet
1da0: 65 72 2e 20 20 54 68 65 20 57 68 65 72 65 43 6c  er.  The WhereCl
1db0: 61 75 73 65 20 73 74 72 75 63 74 75 72 65 0a 2a  ause structure.*
1dc0: 2a 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68  * is filled with
1dd0: 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 73 75 62   pointers to sub
1de0: 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 20 46 6f  expressions.  Fo
1df0: 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a  r example:.**.**
1e00: 20 20 20 20 57 48 45 52 45 20 20 61 3d 3d 27 68      WHERE  a=='h
1e10: 65 6c 6c 6f 27 20 41 4e 44 20 63 6f 61 6c 65 73  ello' AND coales
1e20: 63 65 28 62 2c 31 31 29 3c 31 30 20 41 4e 44 20  ce(b,11)<10 AND 
1e30: 28 63 2b 31 32 21 3d 64 20 4f 52 20 63 3d 3d 32  (c+12!=d OR c==2
1e40: 32 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  2).**           
1e50: 5c 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 5c  \________/     \
1e60: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f  _______________/
1e70: 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f       \__________
1e80: 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 20 20 20 20 20 20  ______/.**      
1e90: 20 20 20 20 20 20 73 6c 6f 74 5b 30 5d 20 20 20        slot[0]   
1ea0: 20 20 20 20 20 20 20 20 20 73 6c 6f 74 5b 31 5d           slot[1]
1eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
1ec0: 6c 6f 74 5b 32 5d 0a 2a 2a 0a 2a 2a 20 54 68 65  lot[2].**.** The
1ed0: 20 6f 72 69 67 69 6e 61 6c 20 57 48 45 52 45 20   original WHERE 
1ee0: 63 6c 61 75 73 65 20 69 6e 20 70 45 78 70 72 20  clause in pExpr 
1ef0: 69 73 20 75 6e 61 6c 74 65 72 65 64 2e 20 20 41  is unaltered.  A
1f00: 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  ll this routine.
1f10: 2a 2a 20 64 6f 65 73 20 69 73 20 6d 61 6b 65 20  ** does is make 
1f20: 73 6c 6f 74 5b 5d 20 65 6e 74 72 69 65 73 20 70  slot[] entries p
1f30: 6f 69 6e 74 20 74 6f 20 73 75 62 73 74 72 75 63  oint to substruc
1f40: 74 75 72 65 20 77 69 74 68 69 6e 20 70 45 78 70  ture within pExp
1f50: 72 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20  r..**.** In the 
1f60: 70 72 65 76 69 6f 75 73 20 73 65 6e 74 65 6e 63  previous sentenc
1f70: 65 20 61 6e 64 20 69 6e 20 74 68 65 20 64 69 61  e and in the dia
1f80: 67 72 61 6d 2c 20 22 73 6c 6f 74 5b 5d 22 20 72  gram, "slot[]" r
1f90: 65 66 65 72 73 20 74 6f 0a 2a 2a 20 74 68 65 20  efers to.** the 
1fa0: 57 68 65 72 65 43 6c 61 75 73 65 2e 61 5b 5d 20  WhereClause.a[] 
1fb0: 61 72 72 61 79 2e 20 20 54 68 65 20 73 6c 6f 74  array.  The slot
1fc0: 5b 5d 20 61 72 72 61 79 20 67 72 6f 77 73 20 61  [] array grows a
1fd0: 73 20 6e 65 65 64 65 64 20 74 6f 20 63 6f 6e 74  s needed to cont
1fe0: 61 69 6e 0a 2a 2a 20 61 6c 6c 20 74 65 72 6d 73  ain.** all terms
1ff0: 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
2000: 61 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ause..*/.static 
2010: 76 6f 69 64 20 77 68 65 72 65 53 70 6c 69 74 28  void whereSplit(
2020: 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
2030: 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 75  , Expr *pExpr, u
2040: 38 20 6f 70 29 7b 0a 20 20 70 57 43 2d 3e 6f 70  8 op){.  pWC->op
2050: 20 3d 20 6f 70 3b 0a 20 20 69 66 28 20 70 45 78   = op;.  if( pEx
2060: 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  pr==0 ) return;.
2070: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21    if( pExpr->op!
2080: 3d 6f 70 20 29 7b 0a 20 20 20 20 77 68 65 72 65  =op ){.    where
2090: 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57 43  ClauseInsert(pWC
20a0: 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 7d  , pExpr, 0);.  }
20b0: 65 6c 73 65 7b 0a 20 20 20 20 77 68 65 72 65 53  else{.    whereS
20c0: 70 6c 69 74 28 70 57 43 2c 20 70 45 78 70 72 2d  plit(pWC, pExpr-
20d0: 3e 70 4c 65 66 74 2c 20 6f 70 29 3b 0a 20 20 20  >pLeft, op);.   
20e0: 20 77 68 65 72 65 53 70 6c 69 74 28 70 57 43 2c   whereSplit(pWC,
20f0: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
2100: 6f 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  op);.  }.}../*.*
2110: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 20 57  * Initialize a W
2120: 68 65 72 65 4d 61 73 6b 53 65 74 20 6f 62 6a 65  hereMaskSet obje
2130: 63 74 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 69 6e  ct.*/.#define in
2140: 69 74 4d 61 73 6b 53 65 74 28 50 29 20 20 28 50  itMaskSet(P)  (P
2150: 29 2d 3e 6e 3d 30 0a 0a 2f 2a 0a 2a 2a 20 52 65  )->n=0../*.** Re
2160: 74 75 72 6e 20 74 68 65 20 62 69 74 6d 61 73 6b  turn the bitmask
2170: 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 63   for the given c
2180: 75 72 73 6f 72 20 6e 75 6d 62 65 72 2e 20 20 52  ursor number.  R
2190: 65 74 75 72 6e 20 30 20 69 66 0a 2a 2a 20 69 43  eturn 0 if.** iC
21a0: 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 69 6e 20  ursor is not in 
21b0: 74 68 65 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74  the set..*/.stat
21c0: 69 63 20 42 69 74 6d 61 73 6b 20 67 65 74 4d 61  ic Bitmask getMa
21d0: 73 6b 28 57 68 65 72 65 4d 61 73 6b 53 65 74 20  sk(WhereMaskSet 
21e0: 2a 70 4d 61 73 6b 53 65 74 2c 20 69 6e 74 20 69  *pMaskSet, int i
21f0: 43 75 72 73 6f 72 29 7b 0a 20 20 69 6e 74 20 69  Cursor){.  int i
2200: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4d 61 73  ;.  assert( pMas
2210: 6b 53 65 74 2d 3e 6e 3c 3d 28 69 6e 74 29 73 69  kSet->n<=(int)si
2220: 7a 65 6f 66 28 42 69 74 6d 61 73 6b 29 2a 38 20  zeof(Bitmask)*8 
2230: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
2240: 70 4d 61 73 6b 53 65 74 2d 3e 6e 3b 20 69 2b 2b  pMaskSet->n; i++
2250: 29 7b 0a 20 20 20 20 69 66 28 20 70 4d 61 73 6b  ){.    if( pMask
2260: 53 65 74 2d 3e 69 78 5b 69 5d 3d 3d 69 43 75 72  Set->ix[i]==iCur
2270: 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 72 65 74  sor ){.      ret
2280: 75 72 6e 20 4d 41 53 4b 42 49 54 28 69 29 3b 0a  urn MASKBIT(i);.
2290: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
22a0: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rn 0;.}../*.** C
22b0: 72 65 61 74 65 20 61 20 6e 65 77 20 6d 61 73 6b  reate a new mask
22c0: 20 66 6f 72 20 63 75 72 73 6f 72 20 69 43 75 72   for cursor iCur
22d0: 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65  sor..**.** There
22e0: 20 69 73 20 6f 6e 65 20 63 75 72 73 6f 72 20 70   is one cursor p
22f0: 65 72 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20  er table in the 
2300: 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 54 68  FROM clause.  Th
2310: 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 74  e number of.** t
2320: 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f  ables in the FRO
2330: 4d 20 63 6c 61 75 73 65 20 69 73 20 6c 69 6d 69  M clause is limi
2340: 74 65 64 20 62 79 20 61 20 74 65 73 74 20 65 61  ted by a test ea
2350: 72 6c 79 20 69 6e 20 74 68 65 0a 2a 2a 20 73 71  rly in the.** sq
2360: 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
2370: 29 20 72 6f 75 74 69 6e 65 2e 20 20 53 6f 20 77  ) routine.  So w
2380: 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20  e know that the 
2390: 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 5d 0a 2a  pMaskSet->ix[].*
23a0: 2a 20 61 72 72 61 79 20 77 69 6c 6c 20 6e 65 76  * array will nev
23b0: 65 72 20 6f 76 65 72 66 6c 6f 77 2e 0a 2a 2f 0a  er overflow..*/.
23c0: 73 74 61 74 69 63 20 76 6f 69 64 20 63 72 65 61  static void crea
23d0: 74 65 4d 61 73 6b 28 57 68 65 72 65 4d 61 73 6b  teMask(WhereMask
23e0: 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 69  Set *pMaskSet, i
23f0: 6e 74 20 69 43 75 72 73 6f 72 29 7b 0a 20 20 61  nt iCursor){.  a
2400: 73 73 65 72 74 28 20 70 4d 61 73 6b 53 65 74 2d  ssert( pMaskSet-
2410: 3e 6e 20 3c 20 41 72 72 61 79 53 69 7a 65 28 70  >n < ArraySize(p
2420: 4d 61 73 6b 53 65 74 2d 3e 69 78 29 20 29 3b 0a  MaskSet->ix) );.
2430: 20 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 70    pMaskSet->ix[p
2440: 4d 61 73 6b 53 65 74 2d 3e 6e 2b 2b 5d 20 3d 20  MaskSet->n++] = 
2450: 69 43 75 72 73 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a  iCursor;.}../*.*
2460: 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73  * These routines
2470: 20 77 61 6c 6b 20 28 72 65 63 75 72 73 69 76 65   walk (recursive
2480: 6c 79 29 20 61 6e 20 65 78 70 72 65 73 73 69 6f  ly) an expressio
2490: 6e 20 74 72 65 65 20 61 6e 64 20 67 65 6e 65 72  n tree and gener
24a0: 61 74 65 0a 2a 2a 20 61 20 62 69 74 6d 61 73 6b  ate.** a bitmask
24b0: 20 69 6e 64 69 63 61 74 69 6e 67 20 77 68 69 63   indicating whic
24c0: 68 20 74 61 62 6c 65 73 20 61 72 65 20 75 73 65  h tables are use
24d0: 64 20 69 6e 20 74 68 61 74 20 65 78 70 72 65 73  d in that expres
24e0: 73 69 6f 6e 0a 2a 2a 20 74 72 65 65 2e 0a 2a 2f  sion.** tree..*/
24f0: 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20  .static Bitmask 
2500: 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61  exprListTableUsa
2510: 67 65 28 57 68 65 72 65 4d 61 73 6b 53 65 74 2a  ge(WhereMaskSet*
2520: 2c 20 45 78 70 72 4c 69 73 74 2a 29 3b 0a 73 74  , ExprList*);.st
2530: 61 74 69 63 20 42 69 74 6d 61 73 6b 20 65 78 70  atic Bitmask exp
2540: 72 53 65 6c 65 63 74 54 61 62 6c 65 55 73 61 67  rSelectTableUsag
2550: 65 28 57 68 65 72 65 4d 61 73 6b 53 65 74 2a 2c  e(WhereMaskSet*,
2560: 20 53 65 6c 65 63 74 2a 29 3b 0a 73 74 61 74 69   Select*);.stati
2570: 63 20 42 69 74 6d 61 73 6b 20 65 78 70 72 54 61  c Bitmask exprTa
2580: 62 6c 65 55 73 61 67 65 28 57 68 65 72 65 4d 61  bleUsage(WhereMa
2590: 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c  skSet *pMaskSet,
25a0: 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 42 69 74   Expr *p){.  Bit
25b0: 6d 61 73 6b 20 6d 61 73 6b 20 3d 20 30 3b 0a 20  mask mask = 0;. 
25c0: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
25d0: 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 6f  rn 0;.  if( p->o
25e0: 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a  p==TK_COLUMN ){.
25f0: 20 20 20 20 6d 61 73 6b 20 3d 20 67 65 74 4d 61      mask = getMa
2600: 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d 3e  sk(pMaskSet, p->
2610: 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 72 65 74  iTable);.    ret
2620: 75 72 6e 20 6d 61 73 6b 3b 0a 20 20 7d 0a 20 20  urn mask;.  }.  
2630: 6d 61 73 6b 20 3d 20 65 78 70 72 54 61 62 6c 65  mask = exprTable
2640: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
2650: 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 6d 61  p->pRight);.  ma
2660: 73 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c 65 55  sk |= exprTableU
2670: 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70  sage(pMaskSet, p
2680: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66 28 20  ->pLeft);.  if( 
2690: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
26a0: 70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  p, EP_xIsSelect)
26b0: 20 29 7b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20   ){.    mask |= 
26c0: 65 78 70 72 53 65 6c 65 63 74 54 61 62 6c 65 55  exprSelectTableU
26d0: 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70  sage(pMaskSet, p
26e0: 2d 3e 78 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20  ->x.pSelect);.  
26f0: 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 61 73 6b 20  }else{.    mask 
2700: 7c 3d 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65  |= exprListTable
2710: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
2720: 70 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 7d  p->x.pList);.  }
2730: 0a 20 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b 0a  .  return mask;.
2740: 7d 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b  }.static Bitmask
2750: 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73   exprListTableUs
2760: 61 67 65 28 57 68 65 72 65 4d 61 73 6b 53 65 74  age(WhereMaskSet
2770: 20 2a 70 4d 61 73 6b 53 65 74 2c 20 45 78 70 72   *pMaskSet, Expr
2780: 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20  List *pList){.  
2790: 69 6e 74 20 69 3b 0a 20 20 42 69 74 6d 61 73 6b  int i;.  Bitmask
27a0: 20 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 69 66 28   mask = 0;.  if(
27b0: 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 66 6f   pList ){.    fo
27c0: 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
27d0: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
27e0: 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 54     mask |= exprT
27f0: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
2800: 65 74 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  et, pList->a[i].
2810: 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20  pExpr);.    }.  
2820: 7d 0a 20 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b  }.  return mask;
2830: 0a 7d 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73  .}.static Bitmas
2840: 6b 20 65 78 70 72 53 65 6c 65 63 74 54 61 62 6c  k exprSelectTabl
2850: 65 55 73 61 67 65 28 57 68 65 72 65 4d 61 73 6b  eUsage(WhereMask
2860: 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 53  Set *pMaskSet, S
2870: 65 6c 65 63 74 20 2a 70 53 29 7b 0a 20 20 42 69  elect *pS){.  Bi
2880: 74 6d 61 73 6b 20 6d 61 73 6b 20 3d 20 30 3b 0a  tmask mask = 0;.
2890: 20 20 77 68 69 6c 65 28 20 70 53 20 29 7b 0a 20    while( pS ){. 
28a0: 20 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63     SrcList *pSrc
28b0: 20 3d 20 70 53 2d 3e 70 53 72 63 3b 0a 20 20 20   = pS->pSrc;.   
28c0: 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69 73   mask |= exprLis
28d0: 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  tTableUsage(pMas
28e0: 6b 53 65 74 2c 20 70 53 2d 3e 70 45 4c 69 73 74  kSet, pS->pEList
28f0: 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65  );.    mask |= e
2900: 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67  xprListTableUsag
2910: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e  e(pMaskSet, pS->
2920: 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 6d  pGroupBy);.    m
2930: 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69 73 74 54  ask |= exprListT
2940: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
2950: 65 74 2c 20 70 53 2d 3e 70 4f 72 64 65 72 42 79  et, pS->pOrderBy
2960: 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65  );.    mask |= e
2970: 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d  xprTableUsage(pM
2980: 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70 57 68 65  askSet, pS->pWhe
2990: 72 65 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d  re);.    mask |=
29a0: 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28   exprTableUsage(
29b0: 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70 48  pMaskSet, pS->pH
29c0: 61 76 69 6e 67 29 3b 0a 20 20 20 20 69 66 28 20  aving);.    if( 
29d0: 41 4c 57 41 59 53 28 70 53 72 63 21 3d 30 29 20  ALWAYS(pSrc!=0) 
29e0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  ){.      int i;.
29f0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
2a00: 3c 70 53 72 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b  <pSrc->nSrc; i++
2a10: 29 7b 0a 20 20 20 20 20 20 20 20 6d 61 73 6b 20  ){.        mask 
2a20: 7c 3d 20 65 78 70 72 53 65 6c 65 63 74 54 61 62  |= exprSelectTab
2a30: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
2a40: 2c 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 53 65  , pSrc->a[i].pSe
2a50: 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20 6d  lect);.        m
2a60: 61 73 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c 65  ask |= exprTable
2a70: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
2a80: 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 4f 6e 29 3b  pSrc->a[i].pOn);
2a90: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2aa0: 20 20 20 70 53 20 3d 20 70 53 2d 3e 70 50 72 69     pS = pS->pPri
2ab0: 6f 72 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  or;.  }.  return
2ac0: 20 6d 61 73 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   mask;.}../*.** 
2ad0: 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
2ae0: 68 65 20 67 69 76 65 6e 20 6f 70 65 72 61 74 6f  he given operato
2af0: 72 20 69 73 20 6f 6e 65 20 6f 66 20 74 68 65 20  r is one of the 
2b00: 6f 70 65 72 61 74 6f 72 73 20 74 68 61 74 20 69  operators that i
2b10: 73 0a 2a 2a 20 61 6c 6c 6f 77 65 64 20 66 6f 72  s.** allowed for
2b20: 20 61 6e 20 69 6e 64 65 78 61 62 6c 65 20 57 48   an indexable WH
2b30: 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 2e  ERE clause term.
2b40: 20 20 54 68 65 20 61 6c 6c 6f 77 65 64 20 6f 70    The allowed op
2b50: 65 72 61 74 6f 72 73 20 61 72 65 0a 2a 2a 20 22  erators are.** "
2b60: 3d 22 2c 20 22 3c 22 2c 20 22 3e 22 2c 20 22 3c  =", "<", ">", "<
2b70: 3d 22 2c 20 22 3e 3d 22 2c 20 22 49 4e 22 2c 20  =", ">=", "IN", 
2b80: 61 6e 64 20 22 49 53 20 4e 55 4c 4c 22 0a 2a 2f  and "IS NULL".*/
2b90: 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f  .static int allo
2ba0: 77 65 64 4f 70 28 69 6e 74 20 6f 70 29 7b 0a 20  wedOp(int op){. 
2bb0: 20 61 73 73 65 72 74 28 20 54 4b 5f 47 54 3e 54   assert( TK_GT>T
2bc0: 4b 5f 45 51 20 26 26 20 54 4b 5f 47 54 3c 54 4b  K_EQ && TK_GT<TK
2bd0: 5f 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _GE );.  assert(
2be0: 20 54 4b 5f 4c 54 3e 54 4b 5f 45 51 20 26 26 20   TK_LT>TK_EQ && 
2bf0: 54 4b 5f 4c 54 3c 54 4b 5f 47 45 20 29 3b 0a 20  TK_LT<TK_GE );. 
2c00: 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 45 3e 54   assert( TK_LE>T
2c10: 4b 5f 45 51 20 26 26 20 54 4b 5f 4c 45 3c 54 4b  K_EQ && TK_LE<TK
2c20: 5f 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _GE );.  assert(
2c30: 20 54 4b 5f 47 45 3d 3d 54 4b 5f 45 51 2b 34 20   TK_GE==TK_EQ+4 
2c40: 29 3b 0a 20 20 72 65 74 75 72 6e 20 6f 70 3d 3d  );.  return op==
2c50: 54 4b 5f 49 4e 20 7c 7c 20 28 6f 70 3e 3d 54 4b  TK_IN || (op>=TK
2c60: 5f 45 51 20 26 26 20 6f 70 3c 3d 54 4b 5f 47 45  _EQ && op<=TK_GE
2c70: 29 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55  ) || op==TK_ISNU
2c80: 4c 4c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 77 61  LL;.}../*.** Swa
2c90: 70 20 74 77 6f 20 6f 62 6a 65 63 74 73 20 6f 66  p two objects of
2ca0: 20 74 79 70 65 20 54 59 50 45 2e 0a 2a 2f 0a 23   type TYPE..*/.#
2cb0: 64 65 66 69 6e 65 20 53 57 41 50 28 54 59 50 45  define SWAP(TYPE
2cc0: 2c 41 2c 42 29 20 7b 54 59 50 45 20 74 3d 41 3b  ,A,B) {TYPE t=A;
2cd0: 20 41 3d 42 3b 20 42 3d 74 3b 7d 0a 0a 2f 2a 0a   A=B; B=t;}../*.
2ce0: 2a 2a 20 43 6f 6d 6d 75 74 65 20 61 20 63 6f 6d  ** Commute a com
2cf0: 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72  parison operator
2d00: 2e 20 20 45 78 70 72 65 73 73 69 6f 6e 73 20 6f  .  Expressions o
2d10: 66 20 74 68 65 20 66 6f 72 6d 20 22 58 20 6f 70  f the form "X op
2d20: 20 59 22 0a 2a 2a 20 61 72 65 20 63 6f 6e 76 65   Y".** are conve
2d30: 72 74 65 64 20 69 6e 74 6f 20 22 59 20 6f 70 20  rted into "Y op 
2d40: 58 22 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6c 65 66  X"..**.** If lef
2d50: 74 2f 72 69 67 68 74 20 70 72 65 63 65 64 65 6e  t/right preceden
2d60: 63 65 20 72 75 6c 65 73 20 63 6f 6d 65 20 69 6e  ce rules come in
2d70: 74 6f 20 70 6c 61 79 20 77 68 65 6e 20 64 65 74  to play when det
2d80: 65 72 6d 69 6e 69 6e 67 20 74 68 65 0a 2a 2a 20  ermining the.** 
2d90: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
2da0: 63 65 2c 20 74 68 65 6e 20 43 4f 4c 4c 41 54 45  ce, then COLLATE
2db0: 20 6f 70 65 72 61 74 6f 72 73 20 61 72 65 20 61   operators are a
2dc0: 64 6a 75 73 74 65 64 20 74 6f 20 65 6e 73 75 72  djusted to ensur
2dd0: 65 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 63 6f  e.** that the co
2de0: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
2df0: 20 64 6f 65 73 20 6e 6f 74 20 63 68 61 6e 67 65   does not change
2e00: 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a  .  For example:.
2e10: 2a 2a 20 22 59 20 63 6f 6c 6c 61 74 65 20 4e 4f  ** "Y collate NO
2e20: 43 41 53 45 20 6f 70 20 58 22 20 62 65 63 6f 6d  CASE op X" becom
2e30: 65 73 20 22 58 20 6f 70 20 59 22 20 62 65 63 61  es "X op Y" beca
2e40: 75 73 65 20 61 6e 79 20 63 6f 6c 6c 61 74 69 6f  use any collatio
2e50: 6e 20 73 65 71 75 65 6e 63 65 20 6f 6e 0a 2a 2a  n sequence on.**
2e60: 20 74 68 65 20 6c 65 66 74 20 68 61 6e 64 20 73   the left hand s
2e70: 69 64 65 20 6f 66 20 61 20 63 6f 6d 70 61 72 69  ide of a compari
2e80: 73 6f 6e 20 6f 76 65 72 72 69 64 65 73 20 61 6e  son overrides an
2e90: 79 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  y collation sequ
2ea0: 65 6e 63 65 20 0a 2a 2a 20 61 74 74 61 63 68 65  ence .** attache
2eb0: 64 20 74 6f 20 74 68 65 20 72 69 67 68 74 2e 20  d to the right. 
2ec0: 46 6f 72 20 74 68 65 20 73 61 6d 65 20 72 65 61  For the same rea
2ed0: 73 6f 6e 20 74 68 65 20 45 50 5f 43 6f 6c 6c 61  son the EP_Colla
2ee0: 74 65 20 66 6c 61 67 0a 2a 2a 20 69 73 20 6e 6f  te flag.** is no
2ef0: 74 20 63 6f 6d 6d 75 74 65 64 2e 0a 2a 2f 0a 73  t commuted..*/.s
2f00: 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 72 43  tatic void exprC
2f10: 6f 6d 6d 75 74 65 28 50 61 72 73 65 20 2a 70 50  ommute(Parse *pP
2f20: 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
2f30: 72 29 7b 0a 20 20 75 31 36 20 65 78 70 52 69 67  r){.  u16 expRig
2f40: 68 74 20 3d 20 28 70 45 78 70 72 2d 3e 70 52 69  ht = (pExpr->pRi
2f50: 67 68 74 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  ght->flags & EP_
2f60: 43 6f 6c 6c 61 74 65 29 3b 0a 20 20 75 31 36 20  Collate);.  u16 
2f70: 65 78 70 4c 65 66 74 20 3d 20 28 70 45 78 70 72  expLeft = (pExpr
2f80: 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20 26  ->pLeft->flags &
2f90: 20 45 50 5f 43 6f 6c 6c 61 74 65 29 3b 0a 20 20   EP_Collate);.  
2fa0: 61 73 73 65 72 74 28 20 61 6c 6c 6f 77 65 64 4f  assert( allowedO
2fb0: 70 28 70 45 78 70 72 2d 3e 6f 70 29 20 26 26 20  p(pExpr->op) && 
2fc0: 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 49 4e  pExpr->op!=TK_IN
2fd0: 20 29 3b 0a 20 20 69 66 28 20 65 78 70 52 69 67   );.  if( expRig
2fe0: 68 74 3d 3d 65 78 70 4c 65 66 74 20 29 7b 0a 20  ht==expLeft ){. 
2ff0: 20 20 20 2f 2a 20 45 69 74 68 65 72 20 58 20 61     /* Either X a
3000: 6e 64 20 59 20 62 6f 74 68 20 68 61 76 65 20 43  nd Y both have C
3010: 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 20  OLLATE operator 
3020: 6f 72 20 6e 65 69 74 68 65 72 20 64 6f 20 2a 2f  or neither do */
3030: 0a 20 20 20 20 69 66 28 20 65 78 70 52 69 67 68  .    if( expRigh
3040: 74 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 42 6f  t ){.      /* Bo
3050: 74 68 20 58 20 61 6e 64 20 59 20 68 61 76 65 20  th X and Y have 
3060: 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72  COLLATE operator
3070: 73 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 58 20  s.  Make sure X 
3080: 69 73 20 61 6c 77 61 79 73 0a 20 20 20 20 20 20  is always.      
3090: 2a 2a 20 75 73 65 64 20 62 79 20 63 6c 65 61 72  ** used by clear
30a0: 69 6e 67 20 74 68 65 20 45 50 5f 43 6f 6c 6c 61  ing the EP_Colla
30b0: 74 65 20 66 6c 61 67 20 66 72 6f 6d 20 59 2e 20  te flag from Y. 
30c0: 2a 2f 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  */.      pExpr->
30d0: 70 52 69 67 68 74 2d 3e 66 6c 61 67 73 20 26 3d  pRight->flags &=
30e0: 20 7e 45 50 5f 43 6f 6c 6c 61 74 65 3b 0a 20 20   ~EP_Collate;.  
30f0: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69    }else if( sqli
3100: 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
3110: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
3120: 65 66 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  eft)!=0 ){.     
3130: 20 2f 2a 20 4e 65 69 74 68 65 72 20 58 20 6e 6f   /* Neither X no
3140: 72 20 59 20 68 61 76 65 20 43 4f 4c 4c 41 54 45  r Y have COLLATE
3150: 20 6f 70 65 72 61 74 6f 72 73 2c 20 62 75 74 20   operators, but 
3160: 58 20 68 61 73 20 61 20 6e 6f 6e 2d 64 65 66 61  X has a non-defa
3170: 75 6c 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6c  ult.      ** col
3180: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e  lating sequence.
3190: 20 20 53 6f 20 61 64 64 20 74 68 65 20 45 50 5f    So add the EP_
31a0: 43 6f 6c 6c 61 74 65 20 6d 61 72 6b 65 72 20 6f  Collate marker o
31b0: 6e 20 58 20 74 6f 20 63 61 75 73 65 0a 20 20 20  n X to cause.   
31c0: 20 20 20 2a 2a 20 69 74 20 74 6f 20 62 65 20 73     ** it to be s
31d0: 65 61 72 63 68 65 64 20 66 69 72 73 74 2e 20 2a  earched first. *
31e0: 2f 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70  /.      pExpr->p
31f0: 4c 65 66 74 2d 3e 66 6c 61 67 73 20 7c 3d 20 45  Left->flags |= E
3200: 50 5f 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 7d  P_Collate;.    }
3210: 0a 20 20 7d 0a 20 20 53 57 41 50 28 45 78 70 72  .  }.  SWAP(Expr
3220: 2a 2c 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  *,pExpr->pRight,
3230: 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
3240: 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3e 3d   if( pExpr->op>=
3250: 54 4b 5f 47 54 20 29 7b 0a 20 20 20 20 61 73 73  TK_GT ){.    ass
3260: 65 72 74 28 20 54 4b 5f 4c 54 3d 3d 54 4b 5f 47  ert( TK_LT==TK_G
3270: 54 2b 32 20 29 3b 0a 20 20 20 20 61 73 73 65 72  T+2 );.    asser
3280: 74 28 20 54 4b 5f 47 45 3d 3d 54 4b 5f 4c 45 2b  t( TK_GE==TK_LE+
3290: 32 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  2 );.    assert(
32a0: 20 54 4b 5f 47 54 3e 54 4b 5f 45 51 20 29 3b 0a   TK_GT>TK_EQ );.
32b0: 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47      assert( TK_G
32c0: 54 3c 54 4b 5f 4c 45 20 29 3b 0a 20 20 20 20 61  T<TK_LE );.    a
32d0: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
32e0: 3e 3d 54 4b 5f 47 54 20 26 26 20 70 45 78 70 72  >=TK_GT && pExpr
32f0: 2d 3e 6f 70 3c 3d 54 4b 5f 47 45 20 29 3b 0a 20  ->op<=TK_GE );. 
3300: 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 28     pExpr->op = (
3310: 28 70 45 78 70 72 2d 3e 6f 70 2d 54 4b 5f 47 54  (pExpr->op-TK_GT
3320: 29 5e 32 29 2b 54 4b 5f 47 54 3b 0a 20 20 7d 0a  )^2)+TK_GT;.  }.
3330: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 6c 61  }../*.** Transla
3340: 74 65 20 66 72 6f 6d 20 54 4b 5f 78 78 20 6f 70  te from TK_xx op
3350: 65 72 61 74 6f 72 20 74 6f 20 57 4f 5f 78 78 20  erator to WO_xx 
3360: 62 69 74 6d 61 73 6b 2e 0a 2a 2f 0a 73 74 61 74  bitmask..*/.stat
3370: 69 63 20 75 31 36 20 6f 70 65 72 61 74 6f 72 4d  ic u16 operatorM
3380: 61 73 6b 28 69 6e 74 20 6f 70 29 7b 0a 20 20 75  ask(int op){.  u
3390: 31 36 20 63 3b 0a 20 20 61 73 73 65 72 74 28 20  16 c;.  assert( 
33a0: 61 6c 6c 6f 77 65 64 4f 70 28 6f 70 29 20 29 3b  allowedOp(op) );
33b0: 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e  .  if( op==TK_IN
33c0: 20 29 7b 0a 20 20 20 20 63 20 3d 20 57 4f 5f 49   ){.    c = WO_I
33d0: 4e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  N;.  }else if( o
33e0: 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b 0a  p==TK_ISNULL ){.
33f0: 20 20 20 20 63 20 3d 20 57 4f 5f 49 53 4e 55 4c      c = WO_ISNUL
3400: 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  L;.  }else{.    
3410: 61 73 73 65 72 74 28 20 28 57 4f 5f 45 51 3c 3c  assert( (WO_EQ<<
3420: 28 6f 70 2d 54 4b 5f 45 51 29 29 20 3c 20 30 78  (op-TK_EQ)) < 0x
3430: 37 66 66 66 20 29 3b 0a 20 20 20 20 63 20 3d 20  7fff );.    c = 
3440: 28 75 31 36 29 28 57 4f 5f 45 51 3c 3c 28 6f 70  (u16)(WO_EQ<<(op
3450: 2d 54 4b 5f 45 51 29 29 3b 0a 20 20 7d 0a 20 20  -TK_EQ));.  }.  
3460: 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 49  assert( op!=TK_I
3470: 53 4e 55 4c 4c 20 7c 7c 20 63 3d 3d 57 4f 5f 49  SNULL || c==WO_I
3480: 53 4e 55 4c 4c 20 29 3b 0a 20 20 61 73 73 65 72  SNULL );.  asser
3490: 74 28 20 6f 70 21 3d 54 4b 5f 49 4e 20 7c 7c 20  t( op!=TK_IN || 
34a0: 63 3d 3d 57 4f 5f 49 4e 20 29 3b 0a 20 20 61 73  c==WO_IN );.  as
34b0: 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 45 51 20  sert( op!=TK_EQ 
34c0: 7c 7c 20 63 3d 3d 57 4f 5f 45 51 20 29 3b 0a 20  || c==WO_EQ );. 
34d0: 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f   assert( op!=TK_
34e0: 4c 54 20 7c 7c 20 63 3d 3d 57 4f 5f 4c 54 20 29  LT || c==WO_LT )
34f0: 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d  ;.  assert( op!=
3500: 54 4b 5f 4c 45 20 7c 7c 20 63 3d 3d 57 4f 5f 4c  TK_LE || c==WO_L
3510: 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f  E );.  assert( o
3520: 70 21 3d 54 4b 5f 47 54 20 7c 7c 20 63 3d 3d 57  p!=TK_GT || c==W
3530: 4f 5f 47 54 20 29 3b 0a 20 20 61 73 73 65 72 74  O_GT );.  assert
3540: 28 20 6f 70 21 3d 54 4b 5f 47 45 20 7c 7c 20 63  ( op!=TK_GE || c
3550: 3d 3d 57 4f 5f 47 45 20 29 3b 0a 20 20 72 65 74  ==WO_GE );.  ret
3560: 75 72 6e 20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn c;.}../*.** 
3570: 41 64 76 61 6e 63 65 20 74 6f 20 74 68 65 20 6e  Advance to the n
3580: 65 78 74 20 57 68 65 72 65 54 65 72 6d 20 74 68  ext WhereTerm th
3590: 61 74 20 6d 61 74 63 68 65 73 20 61 63 63 6f 72  at matches accor
35a0: 64 69 6e 67 20 74 6f 20 74 68 65 20 63 72 69 74  ding to the crit
35b0: 65 72 69 61 0a 2a 2a 20 65 73 74 61 62 6c 69 73  eria.** establis
35c0: 68 65 64 20 77 68 65 6e 20 74 68 65 20 70 53 63  hed when the pSc
35d0: 61 6e 20 6f 62 6a 65 63 74 20 77 61 73 20 69 6e  an object was in
35e0: 69 74 69 61 6c 69 7a 65 64 20 62 79 20 77 68 65  itialized by whe
35f0: 72 65 53 63 61 6e 49 6e 69 74 28 29 2e 0a 2a 2a  reScanInit()..**
3600: 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20   Return NULL if 
3610: 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72  there are no mor
3620: 65 20 6d 61 74 63 68 69 6e 67 20 57 68 65 72 65  e matching Where
3630: 54 65 72 6d 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  Terms..*/.static
3640: 20 57 68 65 72 65 54 65 72 6d 20 2a 77 68 65 72   WhereTerm *wher
3650: 65 53 63 61 6e 4e 65 78 74 28 57 68 65 72 65 53  eScanNext(WhereS
3660: 63 61 6e 20 2a 70 53 63 61 6e 29 7b 0a 20 20 69  can *pScan){.  i
3670: 6e 74 20 69 43 75 72 3b 20 20 20 20 20 20 20 20  nt iCur;        
3680: 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f      /* The curso
3690: 72 20 6f 6e 20 74 68 65 20 4c 48 53 20 6f 66 20  r on the LHS of 
36a0: 74 68 65 20 74 65 72 6d 20 2a 2f 0a 20 20 69 6e  the term */.  in
36b0: 74 20 69 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20  t iColumn;      
36c0: 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c 75 6d 6e     /* The column
36d0: 20 6f 6e 20 74 68 65 20 4c 48 53 20 6f 66 20 74   on the LHS of t
36e0: 68 65 20 74 65 72 6d 2e 20 20 2d 31 20 66 6f 72  he term.  -1 for
36f0: 20 49 50 4b 20 2a 2f 0a 20 20 45 78 70 72 20 2a   IPK */.  Expr *
3700: 70 58 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  pX;            /
3710: 2a 20 41 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  * An expression 
3720: 62 65 69 6e 67 20 74 65 73 74 65 64 20 2a 2f 0a  being tested */.
3730: 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
3740: 57 43 3b 20 20 20 20 2f 2a 20 53 68 6f 72 74 68  WC;    /* Shorth
3750: 61 6e 64 20 66 6f 72 20 70 53 63 61 6e 2d 3e 70  and for pScan->p
3760: 57 43 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  WC */.  WhereTer
3770: 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 2f 2a 20  m *pTerm;    /* 
3780: 54 68 65 20 74 65 72 6d 20 62 65 69 6e 67 20 74  The term being t
3790: 65 73 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6b  ested */.  int k
37a0: 20 3d 20 70 53 63 61 6e 2d 3e 6b 3b 20 20 20 20   = pScan->k;    
37b0: 2f 2a 20 57 68 65 72 65 20 74 6f 20 73 74 61 72  /* Where to star
37c0: 74 20 73 63 61 6e 6e 69 6e 67 20 2a 2f 0a 0a 20  t scanning */.. 
37d0: 20 77 68 69 6c 65 28 20 70 53 63 61 6e 2d 3e 69   while( pScan->i
37e0: 45 71 75 69 76 3c 3d 70 53 63 61 6e 2d 3e 6e 45  Equiv<=pScan->nE
37f0: 71 75 69 76 20 29 7b 0a 20 20 20 20 69 43 75 72  quiv ){.    iCur
3800: 20 3d 20 70 53 63 61 6e 2d 3e 61 45 71 75 69 76   = pScan->aEquiv
3810: 5b 70 53 63 61 6e 2d 3e 69 45 71 75 69 76 2d 32  [pScan->iEquiv-2
3820: 5d 3b 0a 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d  ];.    iColumn =
3830: 20 70 53 63 61 6e 2d 3e 61 45 71 75 69 76 5b 70   pScan->aEquiv[p
3840: 53 63 61 6e 2d 3e 69 45 71 75 69 76 2d 31 5d 3b  Scan->iEquiv-1];
3850: 0a 20 20 20 20 77 68 69 6c 65 28 20 28 70 57 43  .    while( (pWC
3860: 20 3d 20 70 53 63 61 6e 2d 3e 70 57 43 29 21 3d   = pScan->pWC)!=
3870: 30 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 70  0 ){.      for(p
3880: 54 65 72 6d 3d 70 57 43 2d 3e 61 2b 6b 3b 20 6b  Term=pWC->a+k; k
3890: 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 6b 2b 2b  <pWC->nTerm; k++
38a0: 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  , pTerm++){.    
38b0: 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c      if( pTerm->l
38c0: 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 0a  eftCursor==iCur.
38d0: 20 20 20 20 20 20 20 20 20 26 26 20 70 54 65 72           && pTer
38e0: 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3d  m->u.leftColumn=
38f0: 3d 69 43 6f 6c 75 6d 6e 0a 20 20 20 20 20 20 20  =iColumn.       
3900: 20 20 26 26 20 28 70 53 63 61 6e 2d 3e 69 45 71    && (pScan->iEq
3910: 75 69 76 3c 3d 32 20 7c 7c 20 21 45 78 70 72 48  uiv<=2 || !ExprH
3920: 61 73 50 72 6f 70 65 72 74 79 28 70 54 65 72 6d  asProperty(pTerm
3930: 2d 3e 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d  ->pExpr, EP_From
3940: 4a 6f 69 6e 29 29 0a 20 20 20 20 20 20 20 20 29  Join)).        )
3950: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
3960: 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  (pTerm->eOperato
3970: 72 20 26 20 57 4f 5f 45 51 55 49 56 29 21 3d 30  r & WO_EQUIV)!=0
3980: 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20 70  .           && p
3990: 53 63 61 6e 2d 3e 6e 45 71 75 69 76 3c 41 72 72  Scan->nEquiv<Arr
39a0: 61 79 53 69 7a 65 28 70 53 63 61 6e 2d 3e 61 45  aySize(pScan->aE
39b0: 71 75 69 76 29 0a 20 20 20 20 20 20 20 20 20 20  quiv).          
39c0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
39d0: 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20  nt j;.          
39e0: 20 20 70 58 20 3d 20 73 71 6c 69 74 65 33 45 78    pX = sqlite3Ex
39f0: 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 54  prSkipCollate(pT
3a00: 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67  erm->pExpr->pRig
3a10: 68 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ht);.           
3a20: 20 61 73 73 65 72 74 28 20 70 58 2d 3e 6f 70 3d   assert( pX->op=
3a30: 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20  =TK_COLUMN );.  
3a40: 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d            for(j=
3a50: 30 3b 20 6a 3c 70 53 63 61 6e 2d 3e 6e 45 71 75  0; j<pScan->nEqu
3a60: 69 76 3b 20 6a 2b 3d 32 29 7b 0a 20 20 20 20 20  iv; j+=2){.     
3a70: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 53 63           if( pSc
3a80: 61 6e 2d 3e 61 45 71 75 69 76 5b 6a 5d 3d 3d 70  an->aEquiv[j]==p
3a90: 58 2d 3e 69 54 61 62 6c 65 0a 20 20 20 20 20 20  X->iTable.      
3aa0: 20 20 20 20 20 20 20 20 20 26 26 20 70 53 63 61           && pSca
3ab0: 6e 2d 3e 61 45 71 75 69 76 5b 6a 2b 31 5d 3d 3d  n->aEquiv[j+1]==
3ac0: 70 58 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20  pX->iColumn ){. 
3ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ae0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
3af0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
3b00: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
3b10: 20 20 69 66 28 20 6a 3d 3d 70 53 63 61 6e 2d 3e    if( j==pScan->
3b20: 6e 45 71 75 69 76 20 29 7b 0a 20 20 20 20 20 20  nEquiv ){.      
3b30: 20 20 20 20 20 20 20 20 70 53 63 61 6e 2d 3e 61          pScan->a
3b40: 45 71 75 69 76 5b 6a 5d 20 3d 20 70 58 2d 3e 69  Equiv[j] = pX->i
3b50: 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 20  Table;.         
3b60: 20 20 20 20 20 70 53 63 61 6e 2d 3e 61 45 71 75       pScan->aEqu
3b70: 69 76 5b 6a 2b 31 5d 20 3d 20 70 58 2d 3e 69 43  iv[j+1] = pX->iC
3b80: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 20  olumn;.         
3b90: 20 20 20 20 20 70 53 63 61 6e 2d 3e 6e 45 71 75       pScan->nEqu
3ba0: 69 76 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 20  iv += 2;.       
3bb0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
3bc0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
3bd0: 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74   (pTerm->eOperat
3be0: 6f 72 20 26 20 70 53 63 61 6e 2d 3e 6f 70 4d 61  or & pScan->opMa
3bf0: 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  sk)!=0 ){.      
3c00: 20 20 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20        /* Verify 
3c10: 74 68 65 20 61 66 66 69 6e 69 74 79 20 61 6e 64  the affinity and
3c20: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
3c30: 6e 63 65 20 6d 61 74 63 68 20 2a 2f 0a 20 20 20  nce match */.   
3c40: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 53 63           if( pSc
3c50: 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65 20 26 26  an->zCollName &&
3c60: 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74   (pTerm->eOperat
3c70: 6f 72 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 29 3d  or & WO_ISNULL)=
3c80: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
3c90: 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
3ca0: 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ll;.            
3cb0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20    Parse *pParse 
3cc0: 3d 20 70 57 43 2d 3e 70 57 49 6e 66 6f 2d 3e 70  = pWC->pWInfo->p
3cd0: 50 61 72 73 65 3b 0a 20 20 20 20 20 20 20 20 20  Parse;.         
3ce0: 20 20 20 20 20 70 58 20 3d 20 70 54 65 72 6d 2d       pX = pTerm-
3cf0: 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  >pExpr;.        
3d00: 20 20 20 20 20 20 69 66 28 20 21 73 71 6c 69 74        if( !sqlit
3d10: 65 33 49 6e 64 65 78 41 66 66 69 6e 69 74 79 4f  e3IndexAffinityO
3d20: 6b 28 70 58 2c 20 70 53 63 61 6e 2d 3e 69 64 78  k(pX, pScan->idx
3d30: 61 66 66 29 20 29 7b 0a 20 20 20 20 20 20 20 20  aff) ){.        
3d40: 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
3d50: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
3d60: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
3d70: 61 73 73 65 72 74 28 70 58 2d 3e 70 4c 65 66 74  assert(pX->pLeft
3d80: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
3d90: 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
3da0: 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c  BinaryCompareCol
3db0: 6c 53 65 71 28 70 50 61 72 73 65 2c 0a 20 20 20  lSeq(pParse,.   
3dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
3df0: 58 2d 3e 70 4c 65 66 74 2c 20 70 58 2d 3e 70 52  X->pLeft, pX->pR
3e00: 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20 20  ight);.         
3e10: 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 3d 3d       if( pColl==
3e20: 30 20 29 20 70 43 6f 6c 6c 20 3d 20 70 50 61 72  0 ) pColl = pPar
3e30: 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c  se->db->pDfltCol
3e40: 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  l;.             
3e50: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
3e60: 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  Cmp(pColl->zName
3e70: 2c 20 70 53 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61  , pScan->zCollNa
3e80: 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  me) ){.         
3e90: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
3ea0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
3eb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
3ec0: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28             if( (
3ed0: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
3ee0: 20 26 20 57 4f 5f 45 51 29 21 3d 30 0a 20 20 20   & WO_EQ)!=0.   
3ef0: 20 20 20 20 20 20 20 20 20 20 26 26 20 28 70 58            && (pX
3f00: 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d   = pTerm->pExpr-
3f10: 3e 70 52 69 67 68 74 29 2d 3e 6f 70 3d 3d 54 4b  >pRight)->op==TK
3f20: 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20 20 20 20 20  _COLUMN.        
3f30: 20 20 20 20 20 26 26 20 70 58 2d 3e 69 54 61 62       && pX->iTab
3f40: 6c 65 3d 3d 70 53 63 61 6e 2d 3e 61 45 71 75 69  le==pScan->aEqui
3f50: 76 5b 30 5d 0a 20 20 20 20 20 20 20 20 20 20 20  v[0].           
3f60: 20 20 26 26 20 70 58 2d 3e 69 43 6f 6c 75 6d 6e    && pX->iColumn
3f70: 3d 3d 70 53 63 61 6e 2d 3e 61 45 71 75 69 76 5b  ==pScan->aEquiv[
3f80: 31 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 29  1].            )
3f90: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
3fa0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
3fb0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
3fc0: 20 20 20 20 70 53 63 61 6e 2d 3e 6b 20 3d 20 6b      pScan->k = k
3fd0: 2b 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +1;.            
3fe0: 72 65 74 75 72 6e 20 70 54 65 72 6d 3b 0a 20 20  return pTerm;.  
3ff0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
4000: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
4010: 20 20 70 53 63 61 6e 2d 3e 70 57 43 20 3d 20 70    pScan->pWC = p
4020: 53 63 61 6e 2d 3e 70 57 43 2d 3e 70 4f 75 74 65  Scan->pWC->pOute
4030: 72 3b 0a 20 20 20 20 20 20 6b 20 3d 20 30 3b 0a  r;.      k = 0;.
4040: 20 20 20 20 7d 0a 20 20 20 20 70 53 63 61 6e 2d      }.    pScan-
4050: 3e 70 57 43 20 3d 20 70 53 63 61 6e 2d 3e 70 4f  >pWC = pScan->pO
4060: 72 69 67 57 43 3b 0a 20 20 20 20 6b 20 3d 20 30  rigWC;.    k = 0
4070: 3b 0a 20 20 20 20 70 53 63 61 6e 2d 3e 69 45 71  ;.    pScan->iEq
4080: 75 69 76 20 2b 3d 20 32 3b 0a 20 20 7d 0a 20 20  uiv += 2;.  }.  
4090: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
40a0: 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 20  ** Initialize a 
40b0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 73 63 61  WHERE clause sca
40c0: 6e 6e 65 72 20 6f 62 6a 65 63 74 2e 20 20 52 65  nner object.  Re
40d0: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
40e0: 6f 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 6d  o the.** first m
40f0: 61 74 63 68 2e 20 20 52 65 74 75 72 6e 20 4e 55  atch.  Return NU
4100: 4c 4c 20 69 66 20 74 68 65 72 65 20 61 72 65 20  LL if there are 
4110: 6e 6f 20 6d 61 74 63 68 65 73 2e 0a 2a 2a 0a 2a  no matches..**.*
4120: 2a 20 54 68 65 20 73 63 61 6e 6e 65 72 20 77 69  * The scanner wi
4130: 6c 6c 20 62 65 20 73 65 61 72 63 68 69 6e 67 20  ll be searching 
4140: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
4150: 20 70 57 43 2e 20 20 49 74 20 77 69 6c 6c 20 6c   pWC.  It will l
4160: 6f 6f 6b 0a 2a 2a 20 66 6f 72 20 74 65 72 6d 73  ook.** for terms
4170: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 58 20   of the form "X 
4180: 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 20 77 68 65  <op> <expr>" whe
4190: 72 65 20 58 20 69 73 20 63 6f 6c 75 6d 6e 20 69  re X is column i
41a0: 43 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65 0a  Column of table.
41b0: 2a 2a 20 69 43 75 72 2e 20 20 54 68 65 20 3c 6f  ** iCur.  The <o
41c0: 70 3e 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f  p> must be one o
41d0: 66 20 74 68 65 20 6f 70 65 72 61 74 6f 72 73 20  f the operators 
41e0: 64 65 73 63 72 69 62 65 64 20 62 79 20 6f 70 4d  described by opM
41f0: 61 73 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ask..**.** If th
4200: 65 20 73 65 61 72 63 68 20 69 73 20 66 6f 72 20  e search is for 
4210: 58 20 61 6e 64 20 74 68 65 20 57 48 45 52 45 20  X and the WHERE 
4220: 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20  clause contains 
4230: 74 65 72 6d 73 20 6f 66 20 74 68 65 0a 2a 2a 20  terms of the.** 
4240: 66 6f 72 6d 20 58 3d 59 20 74 68 65 6e 20 74 68  form X=Y then th
4250: 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74  is routine might
4260: 20 61 6c 73 6f 20 72 65 74 75 72 6e 20 74 65 72   also return ter
4270: 6d 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a 2a  ms of the form.*
4280: 2a 20 22 59 20 3c 6f 70 3e 20 3c 65 78 70 72 3e  * "Y <op> <expr>
4290: 22 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20 6f  ".  The number o
42a0: 66 20 6c 65 76 65 6c 73 20 6f 66 20 74 72 61 6e  f levels of tran
42b0: 73 69 74 69 76 69 74 79 20 69 73 20 6c 69 6d 69  sitivity is limi
42c0: 74 65 64 2c 0a 2a 2a 20 62 75 74 20 69 73 20 65  ted,.** but is e
42d0: 6e 6f 75 67 68 20 74 6f 20 68 61 6e 64 6c 65 20  nough to handle 
42e0: 6d 6f 73 74 20 63 6f 6d 6d 6f 6e 6c 79 20 6f 63  most commonly oc
42f0: 63 75 72 72 69 6e 67 20 53 51 4c 20 73 74 61 74  curring SQL stat
4300: 65 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  ements..**.** If
4310: 20 58 20 69 73 20 6e 6f 74 20 74 68 65 20 49 4e   X is not the IN
4320: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
4330: 59 20 74 68 65 6e 20 58 20 6d 75 73 74 20 62 65  Y then X must be
4340: 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68   compatible with
4350: 0a 2a 2a 20 69 6e 64 65 78 20 70 49 64 78 2e 0a  .** index pIdx..
4360: 2a 2f 0a 73 74 61 74 69 63 20 57 68 65 72 65 54  */.static WhereT
4370: 65 72 6d 20 2a 77 68 65 72 65 53 63 61 6e 49 6e  erm *whereScanIn
4380: 69 74 28 0a 20 20 57 68 65 72 65 53 63 61 6e 20  it(.  WhereScan 
4390: 2a 70 53 63 61 6e 2c 20 20 20 20 20 20 20 2f 2a  *pScan,       /*
43a0: 20 54 68 65 20 57 68 65 72 65 53 63 61 6e 20 6f   The WhereScan o
43b0: 62 6a 65 63 74 20 62 65 69 6e 67 20 69 6e 69 74  bject being init
43c0: 69 61 6c 69 7a 65 64 20 2a 2f 0a 20 20 57 68 65  ialized */.  Whe
43d0: 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20  reClause *pWC,  
43e0: 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
43f0: 45 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20 73  E clause to be s
4400: 63 61 6e 6e 65 64 20 2a 2f 0a 20 20 69 6e 74 20  canned */.  int 
4410: 69 43 75 72 2c 20 20 20 20 20 20 20 20 20 20 20  iCur,           
4420: 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 74 6f      /* Cursor to
4430: 20 73 63 61 6e 20 66 6f 72 20 2a 2f 0a 20 20 69   scan for */.  i
4440: 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20  nt iColumn,     
4450: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e         /* Column
4460: 20 74 6f 20 73 63 61 6e 20 66 6f 72 20 2a 2f 0a   to scan for */.
4470: 20 20 75 33 32 20 6f 70 4d 61 73 6b 2c 20 20 20    u32 opMask,   
4480: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65            /* Ope
4490: 72 61 74 6f 72 28 73 29 20 74 6f 20 73 63 61 6e  rator(s) to scan
44a0: 20 66 6f 72 20 2a 2f 0a 20 20 49 6e 64 65 78 20   for */.  Index 
44b0: 2a 70 49 64 78 20 20 20 20 20 20 20 20 20 20 20  *pIdx           
44c0: 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 63 6f 6d    /* Must be com
44d0: 70 61 74 69 62 6c 65 20 77 69 74 68 20 74 68 69  patible with thi
44e0: 73 20 69 6e 64 65 78 20 2a 2f 0a 29 7b 0a 20 20  s index */.){.  
44f0: 69 6e 74 20 6a 3b 0a 0a 20 20 2f 2a 20 6d 65 6d  int j;..  /* mem
4500: 73 65 74 28 70 53 63 61 6e 2c 20 30 2c 20 73 69  set(pScan, 0, si
4510: 7a 65 6f 66 28 2a 70 53 63 61 6e 29 29 3b 20 2a  zeof(*pScan)); *
4520: 2f 0a 20 20 70 53 63 61 6e 2d 3e 70 4f 72 69 67  /.  pScan->pOrig
4530: 57 43 20 3d 20 70 57 43 3b 0a 20 20 70 53 63 61  WC = pWC;.  pSca
4540: 6e 2d 3e 70 57 43 20 3d 20 70 57 43 3b 0a 20 20  n->pWC = pWC;.  
4550: 69 66 28 20 70 49 64 78 20 26 26 20 69 43 6f 6c  if( pIdx && iCol
4560: 75 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20 20 70 53  umn>=0 ){.    pS
4570: 63 61 6e 2d 3e 69 64 78 61 66 66 20 3d 20 70 49  can->idxaff = pI
4580: 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c  dx->pTable->aCol
4590: 5b 69 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69  [iColumn].affini
45a0: 74 79 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ty;.    for(j=0;
45b0: 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
45c0: 6a 5d 21 3d 69 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b  j]!=iColumn; j++
45d0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 4e 45 56  ){.      if( NEV
45e0: 45 52 28 6a 3e 3d 70 49 64 78 2d 3e 6e 4b 65 79  ER(j>=pIdx->nKey
45f0: 43 6f 6c 29 20 29 20 72 65 74 75 72 6e 20 30 3b  Col) ) return 0;
4600: 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 63 61 6e  .    }.    pScan
4610: 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65 20 3d 20 70 49  ->zCollName = pI
4620: 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 3b 0a 20  dx->azColl[j];. 
4630: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 53 63 61   }else{.    pSca
4640: 6e 2d 3e 69 64 78 61 66 66 20 3d 20 30 3b 0a 20  n->idxaff = 0;. 
4650: 20 20 20 70 53 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e     pScan->zCollN
4660: 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70  ame = 0;.  }.  p
4670: 53 63 61 6e 2d 3e 6f 70 4d 61 73 6b 20 3d 20 6f  Scan->opMask = o
4680: 70 4d 61 73 6b 3b 0a 20 20 70 53 63 61 6e 2d 3e  pMask;.  pScan->
4690: 6b 20 3d 20 30 3b 0a 20 20 70 53 63 61 6e 2d 3e  k = 0;.  pScan->
46a0: 61 45 71 75 69 76 5b 30 5d 20 3d 20 69 43 75 72  aEquiv[0] = iCur
46b0: 3b 0a 20 20 70 53 63 61 6e 2d 3e 61 45 71 75 69  ;.  pScan->aEqui
46c0: 76 5b 31 5d 20 3d 20 69 43 6f 6c 75 6d 6e 3b 0a  v[1] = iColumn;.
46d0: 20 20 70 53 63 61 6e 2d 3e 6e 45 71 75 69 76 20    pScan->nEquiv 
46e0: 3d 20 32 3b 0a 20 20 70 53 63 61 6e 2d 3e 69 45  = 2;.  pScan->iE
46f0: 71 75 69 76 20 3d 20 32 3b 0a 20 20 72 65 74 75  quiv = 2;.  retu
4700: 72 6e 20 77 68 65 72 65 53 63 61 6e 4e 65 78 74  rn whereScanNext
4710: 28 70 53 63 61 6e 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  (pScan);.}../*.*
4720: 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61 20 74  * Search for a t
4730: 65 72 6d 20 69 6e 20 74 68 65 20 57 48 45 52 45  erm in the WHERE
4740: 20 63 6c 61 75 73 65 20 74 68 61 74 20 69 73 20   clause that is 
4750: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 58 20 3c  of the form "X <
4760: 6f 70 3e 20 3c 65 78 70 72 3e 22 0a 2a 2a 20 77  op> <expr>".** w
4770: 68 65 72 65 20 58 20 69 73 20 61 20 72 65 66 65  here X is a refe
4780: 72 65 6e 63 65 20 74 6f 20 74 68 65 20 69 43 6f  rence to the iCo
4790: 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20 69 43  lumn of table iC
47a0: 75 72 20 61 6e 64 20 3c 6f 70 3e 20 69 73 20 6f  ur and <op> is o
47b0: 6e 65 20 6f 66 0a 2a 2a 20 74 68 65 20 57 4f 5f  ne of.** the WO_
47c0: 78 78 20 6f 70 65 72 61 74 6f 72 20 63 6f 64 65  xx operator code
47d0: 73 20 73 70 65 63 69 66 69 65 64 20 62 79 20 74  s specified by t
47e0: 68 65 20 6f 70 20 70 61 72 61 6d 65 74 65 72 2e  he op parameter.
47f0: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .** Return a poi
4800: 6e 74 65 72 20 74 6f 20 74 68 65 20 74 65 72 6d  nter to the term
4810: 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66 20 6e  .  Return 0 if n
4820: 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20  ot found..**.** 
4830: 54 68 65 20 74 65 72 6d 20 72 65 74 75 72 6e 65  The term returne
4840: 64 20 6d 69 67 68 74 20 62 79 20 59 3d 3c 65 78  d might by Y=<ex
4850: 70 72 3e 20 69 66 20 74 68 65 72 65 20 69 73 20  pr> if there is 
4860: 61 6e 6f 74 68 65 72 20 63 6f 6e 73 74 72 61 69  another constrai
4870: 6e 74 20 69 6e 0a 2a 2a 20 74 68 65 20 57 48 45  nt in.** the WHE
4880: 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 20 73  RE clause that s
4890: 70 65 63 69 66 69 65 73 20 74 68 61 74 20 58 3d  pecifies that X=
48a0: 59 2e 20 20 41 6e 79 20 73 75 63 68 20 63 6f 6e  Y.  Any such con
48b0: 73 74 72 61 69 6e 74 73 20 77 69 6c 6c 20 62 65  straints will be
48c0: 0a 2a 2a 20 69 64 65 6e 74 69 66 69 65 64 20 62  .** identified b
48d0: 79 20 74 68 65 20 57 4f 5f 45 51 55 49 56 20 62  y the WO_EQUIV b
48e0: 69 74 20 69 6e 20 74 68 65 20 70 54 65 72 6d 2d  it in the pTerm-
48f0: 3e 65 4f 70 65 72 61 74 6f 72 20 66 69 65 6c 64  >eOperator field
4900: 2e 20 20 54 68 65 0a 2a 2a 20 61 45 71 75 69 76  .  The.** aEquiv
4910: 5b 5d 20 61 72 72 61 79 20 68 6f 6c 64 73 20 58  [] array holds X
4920: 20 61 6e 64 20 61 6c 6c 20 69 74 73 20 65 71 75   and all its equ
4930: 69 76 61 6c 65 6e 74 73 2c 20 77 69 74 68 20 65  ivalents, with e
4940: 61 63 68 20 53 51 4c 20 76 61 72 69 61 62 6c 65  ach SQL variable
4950: 0a 2a 2a 20 74 61 6b 69 6e 67 20 75 70 20 74 77  .** taking up tw
4960: 6f 20 73 6c 6f 74 73 20 69 6e 20 61 45 71 75 69  o slots in aEqui
4970: 76 5b 5d 2e 20 20 54 68 65 20 66 69 72 73 74 20  v[].  The first 
4980: 73 6c 6f 74 20 69 73 20 66 6f 72 20 74 68 65 20  slot is for the 
4990: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 0a 2a 2a  cursor number.**
49a0: 20 61 6e 64 20 74 68 65 20 73 65 63 6f 6e 64 20   and the second 
49b0: 69 73 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d  is for the colum
49c0: 6e 20 6e 75 6d 62 65 72 2e 20 20 54 68 65 72 65  n number.  There
49d0: 20 61 72 65 20 32 32 20 73 6c 6f 74 73 20 69 6e   are 22 slots in
49e0: 20 61 45 71 75 69 76 5b 5d 0a 2a 2a 20 73 6f 20   aEquiv[].** so 
49f0: 74 68 61 74 20 6d 65 61 6e 73 20 77 65 20 63 61  that means we ca
4a00: 6e 20 6c 6f 6f 6b 20 66 6f 72 20 58 20 70 6c 75  n look for X plu
4a10: 73 20 75 70 20 74 6f 20 31 30 20 6f 74 68 65 72  s up to 10 other
4a20: 20 65 71 75 69 76 61 6c 65 6e 74 20 76 61 6c 75   equivalent valu
4a30: 65 73 2e 0a 2a 2a 20 48 65 6e 63 65 20 61 20 73  es..** Hence a s
4a40: 65 61 72 63 68 20 66 6f 72 20 58 20 77 69 6c 6c  earch for X will
4a50: 20 72 65 74 75 72 6e 20 3c 65 78 70 72 3e 20 69   return <expr> i
4a60: 66 20 58 3d 41 31 20 61 6e 64 20 41 31 3d 41 32  f X=A1 and A1=A2
4a70: 20 61 6e 64 20 41 32 3d 41 33 0a 2a 2a 20 61 6e   and A2=A3.** an
4a80: 64 20 2e 2e 2e 20 61 6e 64 20 41 39 3d 41 31 30  d ... and A9=A10
4a90: 20 61 6e 64 20 41 31 30 3d 3c 65 78 70 72 3e 2e   and A10=<expr>.
4aa0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20  .**.** If there 
4ab0: 61 72 65 20 6d 75 6c 74 69 70 6c 65 20 74 65 72  are multiple ter
4ac0: 6d 73 20 69 6e 20 74 68 65 20 57 48 45 52 45 20  ms in the WHERE 
4ad0: 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 66 6f  clause of the fo
4ae0: 72 6d 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72  rm "X <op> <expr
4af0: 3e 22 0a 2a 2a 20 74 68 65 6e 20 74 72 79 20 66  >".** then try f
4b00: 6f 72 20 74 68 65 20 6f 6e 65 20 77 69 74 68 20  or the one with 
4b10: 6e 6f 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20  no dependencies 
4b20: 6f 6e 20 3c 65 78 70 72 3e 20 2d 20 69 6e 20 6f  on <expr> - in o
4b30: 74 68 65 72 20 77 6f 72 64 73 20 77 68 65 72 65  ther words where
4b40: 0a 2a 2a 20 3c 65 78 70 72 3e 20 69 73 20 61 20  .** <expr> is a 
4b50: 63 6f 6e 73 74 61 6e 74 20 65 78 70 72 65 73 73  constant express
4b60: 69 6f 6e 20 6f 66 20 73 6f 6d 65 20 6b 69 6e 64  ion of some kind
4b70: 2e 20 20 4f 6e 6c 79 20 72 65 74 75 72 6e 20 65  .  Only return e
4b80: 6e 74 72 69 65 73 20 6f 66 0a 2a 2a 20 74 68 65  ntries of.** the
4b90: 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 59 22   form "X <op> Y"
4ba0: 20 77 68 65 72 65 20 59 20 69 73 20 61 20 63 6f   where Y is a co
4bb0: 6c 75 6d 6e 20 69 6e 20 61 6e 6f 74 68 65 72 20  lumn in another 
4bc0: 74 61 62 6c 65 20 69 66 20 6e 6f 20 74 65 72 6d  table if no term
4bd0: 73 20 6f 66 0a 2a 2a 20 74 68 65 20 66 6f 72 6d  s of.** the form
4be0: 20 22 58 20 3c 6f 70 3e 20 3c 63 6f 6e 73 74 2d   "X <op> <const-
4bf0: 65 78 70 72 3e 22 20 65 78 69 73 74 2e 20 20 20  expr>" exist.   
4c00: 49 66 20 6e 6f 20 74 65 72 6d 73 20 77 69 74 68  If no terms with
4c10: 20 61 20 63 6f 6e 73 74 61 6e 74 20 52 48 53 0a   a constant RHS.
4c20: 2a 2a 20 65 78 69 73 74 2c 20 74 72 79 20 74 6f  ** exist, try to
4c30: 20 72 65 74 75 72 6e 20 61 20 74 65 72 6d 20 74   return a term t
4c40: 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  hat does not use
4c50: 20 57 4f 5f 45 51 55 49 56 2e 0a 2a 2f 0a 73 74   WO_EQUIV..*/.st
4c60: 61 74 69 63 20 57 68 65 72 65 54 65 72 6d 20 2a  atic WhereTerm *
4c70: 66 69 6e 64 54 65 72 6d 28 0a 20 20 57 68 65 72  findTerm(.  Wher
4c80: 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20  eClause *pWC,   
4c90: 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63    /* The WHERE c
4ca0: 6c 61 75 73 65 20 74 6f 20 62 65 20 73 65 61 72  lause to be sear
4cb0: 63 68 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 43  ched */.  int iC
4cc0: 75 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ur,             
4cd0: 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72  /* Cursor number
4ce0: 20 6f 66 20 4c 48 53 20 2a 2f 0a 20 20 69 6e 74   of LHS */.  int
4cf0: 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 20   iColumn,       
4d00: 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d     /* Column num
4d10: 62 65 72 20 6f 66 20 4c 48 53 20 2a 2f 0a 20 20  ber of LHS */.  
4d20: 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79  Bitmask notReady
4d30: 2c 20 20 20 20 20 2f 2a 20 52 48 53 20 6d 75 73  ,     /* RHS mus
4d40: 74 20 6e 6f 74 20 6f 76 65 72 6c 61 70 20 77 69  t not overlap wi
4d50: 74 68 20 74 68 69 73 20 6d 61 73 6b 20 2a 2f 0a  th this mask */.
4d60: 20 20 75 33 32 20 6f 70 2c 20 20 20 20 20 20 20    u32 op,       
4d70: 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
4d80: 6f 66 20 57 4f 5f 78 78 20 76 61 6c 75 65 73 20  of WO_xx values 
4d90: 64 65 73 63 72 69 62 69 6e 67 20 6f 70 65 72 61  describing opera
4da0: 74 6f 72 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  tor */.  Index *
4db0: 70 49 64 78 20 20 20 20 20 20 20 20 20 20 20 2f  pIdx           /
4dc0: 2a 20 4d 75 73 74 20 62 65 20 63 6f 6d 70 61 74  * Must be compat
4dd0: 69 62 6c 65 20 77 69 74 68 20 74 68 69 73 20 69  ible with this i
4de0: 6e 64 65 78 2c 20 69 66 20 6e 6f 74 20 4e 55 4c  ndex, if not NUL
4df0: 4c 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 54  L */.){.  WhereT
4e00: 65 72 6d 20 2a 70 52 65 73 75 6c 74 20 3d 20 30  erm *pResult = 0
4e10: 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  ;.  WhereTerm *p
4e20: 3b 0a 20 20 57 68 65 72 65 53 63 61 6e 20 73 63  ;.  WhereScan sc
4e30: 61 6e 3b 0a 0a 20 20 70 20 3d 20 77 68 65 72 65  an;..  p = where
4e40: 53 63 61 6e 49 6e 69 74 28 26 73 63 61 6e 2c 20  ScanInit(&scan, 
4e50: 70 57 43 2c 20 69 43 75 72 2c 20 69 43 6f 6c 75  pWC, iCur, iColu
4e60: 6d 6e 2c 20 6f 70 2c 20 70 49 64 78 29 3b 0a 20  mn, op, pIdx);. 
4e70: 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20   while( p ){.   
4e80: 20 69 66 28 20 28 70 2d 3e 70 72 65 72 65 71 52   if( (p->prereqR
4e90: 69 67 68 74 20 26 20 6e 6f 74 52 65 61 64 79 29  ight & notReady)
4ea0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==0 ){.      if(
4eb0: 20 70 2d 3e 70 72 65 72 65 71 52 69 67 68 74 3d   p->prereqRight=
4ec0: 3d 30 20 26 26 20 28 70 2d 3e 65 4f 70 65 72 61  =0 && (p->eOpera
4ed0: 74 6f 72 26 57 4f 5f 45 51 29 21 3d 30 20 29 7b  tor&WO_EQ)!=0 ){
4ee0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
4ef0: 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  p;.      }.     
4f00: 20 69 66 28 20 70 52 65 73 75 6c 74 3d 3d 30 20   if( pResult==0 
4f10: 29 20 70 52 65 73 75 6c 74 20 3d 20 70 3b 0a 20  ) pResult = p;. 
4f20: 20 20 20 7d 0a 20 20 20 20 70 20 3d 20 77 68 65     }.    p = whe
4f30: 72 65 53 63 61 6e 4e 65 78 74 28 26 73 63 61 6e  reScanNext(&scan
4f40: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
4f50: 70 52 65 73 75 6c 74 3b 0a 7d 0a 0a 2f 2a 20 46  pResult;.}../* F
4f60: 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65  orward reference
4f70: 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20   */.static void 
4f80: 65 78 70 72 41 6e 61 6c 79 7a 65 28 53 72 63 4c  exprAnalyze(SrcL
4f90: 69 73 74 2a 2c 20 57 68 65 72 65 43 6c 61 75 73  ist*, WhereClaus
4fa0: 65 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a  e*, int);../*.**
4fb0: 20 43 61 6c 6c 20 65 78 70 72 41 6e 61 6c 79 7a   Call exprAnalyz
4fc0: 65 20 6f 6e 20 61 6c 6c 20 74 65 72 6d 73 20 69  e on all terms i
4fd0: 6e 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65  n a WHERE clause
4fe0: 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  .  .*/.static vo
4ff0: 69 64 20 65 78 70 72 41 6e 61 6c 79 7a 65 41 6c  id exprAnalyzeAl
5000: 6c 28 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  l(.  SrcList *pT
5010: 61 62 4c 69 73 74 2c 20 20 20 20 20 20 20 2f 2a  abList,       /*
5020: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
5030: 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
5040: 65 20 2a 70 57 43 20 20 20 20 20 20 20 20 20 2f  e *pWC         /
5050: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
5060: 73 65 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65  se to be analyze
5070: 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  d */.){.  int i;
5080: 0a 20 20 66 6f 72 28 69 3d 70 57 43 2d 3e 6e 54  .  for(i=pWC->nT
5090: 65 72 6d 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d  erm-1; i>=0; i--
50a0: 29 7b 0a 20 20 20 20 65 78 70 72 41 6e 61 6c 79  ){.    exprAnaly
50b0: 7a 65 28 70 54 61 62 4c 69 73 74 2c 20 70 57 43  ze(pTabList, pWC
50c0: 2c 20 69 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66  , i);.  }.}..#if
50d0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
50e0: 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a 41 54 49  _LIKE_OPTIMIZATI
50f0: 4f 4e 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74  ON./*.** Check t
5100: 6f 20 73 65 65 20 69 66 20 74 68 65 20 67 69 76  o see if the giv
5110: 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  en expression is
5120: 20 61 20 4c 49 4b 45 20 6f 72 20 47 4c 4f 42 20   a LIKE or GLOB 
5130: 6f 70 65 72 61 74 6f 72 20 74 68 61 74 0a 2a 2a  operator that.**
5140: 20 63 61 6e 20 62 65 20 6f 70 74 69 6d 69 7a 65   can be optimize
5150: 64 20 75 73 69 6e 67 20 69 6e 65 71 75 61 6c 69  d using inequali
5160: 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 20  ty constraints. 
5170: 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
5180: 69 74 20 69 73 0a 2a 2a 20 73 6f 20 61 6e 64 20  it is.** so and 
5190: 66 61 6c 73 65 20 69 66 20 6e 6f 74 2e 0a 2a 2a  false if not..**
51a0: 0a 2a 2a 20 49 6e 20 6f 72 64 65 72 20 66 6f 72  .** In order for
51b0: 20 74 68 65 20 6f 70 65 72 61 74 6f 72 20 74 6f   the operator to
51c0: 20 62 65 20 6f 70 74 69 6d 69 7a 69 62 6c 65 2c   be optimizible,
51d0: 20 74 68 65 20 52 48 53 20 6d 75 73 74 20 62 65   the RHS must be
51e0: 20 61 20 73 74 72 69 6e 67 0a 2a 2a 20 6c 69 74   a string.** lit
51f0: 65 72 61 6c 20 74 68 61 74 20 64 6f 65 73 20 6e  eral that does n
5200: 6f 74 20 62 65 67 69 6e 20 77 69 74 68 20 61 20  ot begin with a 
5210: 77 69 6c 64 63 61 72 64 2e 20 20 0a 2a 2f 0a 73  wildcard.  .*/.s
5220: 74 61 74 69 63 20 69 6e 74 20 69 73 4c 69 6b 65  tatic int isLike
5230: 4f 72 47 6c 6f 62 28 0a 20 20 50 61 72 73 65 20  OrGlob(.  Parse 
5240: 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50  *pParse,    /* P
5250: 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20  arsing and code 
5260: 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65  generating conte
5270: 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45  xt */.  Expr *pE
5280: 78 70 72 2c 20 20 20 20 20 20 2f 2a 20 54 65 73  xpr,      /* Tes
5290: 74 20 74 68 69 73 20 65 78 70 72 65 73 73 69 6f  t this expressio
52a0: 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 2a 70 70  n */.  Expr **pp
52b0: 50 72 65 66 69 78 2c 20 20 2f 2a 20 50 6f 69 6e  Prefix,  /* Poin
52c0: 74 65 72 20 74 6f 20 54 4b 5f 53 54 52 49 4e 47  ter to TK_STRING
52d0: 20 65 78 70 72 65 73 73 69 6f 6e 20 77 69 74 68   expression with
52e0: 20 70 61 74 74 65 72 6e 20 70 72 65 66 69 78 20   pattern prefix 
52f0: 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 73 43 6f 6d  */.  int *pisCom
5300: 70 6c 65 74 65 2c 20 2f 2a 20 54 72 75 65 20 69  plete, /* True i
5310: 66 20 74 68 65 20 6f 6e 6c 79 20 77 69 6c 64 63  f the only wildc
5320: 61 72 64 20 69 73 20 25 20 69 6e 20 74 68 65 20  ard is % in the 
5330: 6c 61 73 74 20 63 68 61 72 61 63 74 65 72 20 2a  last character *
5340: 2f 0a 20 20 69 6e 74 20 2a 70 6e 6f 43 61 73 65  /.  int *pnoCase
5350: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
5360: 20 75 70 70 65 72 63 61 73 65 20 69 73 20 65 71   uppercase is eq
5370: 75 69 76 61 6c 65 6e 74 20 74 6f 20 6c 6f 77 65  uivalent to lowe
5380: 72 63 61 73 65 20 2a 2f 0a 29 7b 0a 20 20 63 6f  rcase */.){.  co
5390: 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 30 3b  nst char *z = 0;
53a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 72 69           /* Stri
53b0: 6e 67 20 6f 6e 20 52 48 53 20 6f 66 20 4c 49 4b  ng on RHS of LIK
53c0: 45 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  E operator */.  
53d0: 45 78 70 72 20 2a 70 52 69 67 68 74 2c 20 2a 70  Expr *pRight, *p
53e0: 4c 65 66 74 3b 20 20 20 20 20 20 2f 2a 20 52 69  Left;      /* Ri
53f0: 67 68 74 20 61 6e 64 20 6c 65 66 74 20 73 69 7a  ght and left siz
5400: 65 20 6f 66 20 4c 49 4b 45 20 6f 70 65 72 61 74  e of LIKE operat
5410: 6f 72 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  or */.  ExprList
5420: 20 2a 70 4c 69 73 74 3b 20 20 20 20 20 20 20 20   *pList;        
5430: 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 6f 70     /* List of op
5440: 65 72 61 6e 64 73 20 74 6f 20 74 68 65 20 4c 49  erands to the LI
5450: 4b 45 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  KE operator */. 
5460: 20 69 6e 74 20 63 3b 20 20 20 20 20 20 20 20 20   int c;         
5470: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
5480: 6e 65 20 63 68 61 72 61 63 74 65 72 20 69 6e 20  ne character in 
5490: 7a 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74  z[] */.  int cnt
54a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
54b0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
54c0: 20 6e 6f 6e 2d 77 69 6c 64 63 61 72 64 20 70 72   non-wildcard pr
54d0: 65 66 69 78 20 63 68 61 72 61 63 74 65 72 73 20  efix characters 
54e0: 2a 2f 0a 20 20 63 68 61 72 20 77 63 5b 33 5d 3b  */.  char wc[3];
54f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5500: 2f 2a 20 57 69 6c 64 63 61 72 64 20 63 68 61 72  /* Wildcard char
5510: 61 63 74 65 72 73 20 2a 2f 0a 20 20 73 71 6c 69  acters */.  sqli
5520: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
5530: 2d 3e 64 62 3b 20 20 2f 2a 20 44 61 74 61 62 61  ->db;  /* Databa
5540: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
5550: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
5560: 20 2a 70 56 61 6c 20 3d 20 30 3b 0a 20 20 69 6e   *pVal = 0;.  in
5570: 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  t op;           
5580: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 63 6f           /* Opco
5590: 64 65 20 6f 66 20 70 52 69 67 68 74 20 2a 2f 0a  de of pRight */.
55a0: 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 49  .  if( !sqlite3I
55b0: 73 4c 69 6b 65 46 75 6e 63 74 69 6f 6e 28 64 62  sLikeFunction(db
55c0: 2c 20 70 45 78 70 72 2c 20 70 6e 6f 43 61 73 65  , pExpr, pnoCase
55d0: 2c 20 77 63 29 20 29 7b 0a 20 20 20 20 72 65 74  , wc) ){.    ret
55e0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 69 66 64 65  urn 0;.  }.#ifde
55f0: 66 20 53 51 4c 49 54 45 5f 45 42 43 44 49 43 0a  f SQLITE_EBCDIC.
5600: 20 20 69 66 28 20 2a 70 6e 6f 43 61 73 65 20 29    if( *pnoCase )
5610: 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69   return 0;.#endi
5620: 66 0a 20 20 70 4c 69 73 74 20 3d 20 70 45 78 70  f.  pList = pExp
5630: 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 70 4c  r->x.pList;.  pL
5640: 65 66 74 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 31  eft = pList->a[1
5650: 5d 2e 70 45 78 70 72 3b 0a 20 20 69 66 28 20 70  ].pExpr;.  if( p
5660: 4c 65 66 74 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c  Left->op!=TK_COL
5670: 55 4d 4e 20 0a 20 20 20 7c 7c 20 73 71 6c 69 74  UMN .   || sqlit
5680: 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70  e3ExprAffinity(p
5690: 4c 65 66 74 29 21 3d 53 51 4c 49 54 45 5f 41 46  Left)!=SQLITE_AF
56a0: 46 5f 54 45 58 54 20 0a 20 20 20 7c 7c 20 49 73  F_TEXT .   || Is
56b0: 56 69 72 74 75 61 6c 28 70 4c 65 66 74 2d 3e 70  Virtual(pLeft->p
56c0: 54 61 62 29 0a 20 20 29 7b 0a 20 20 20 20 2f 2a  Tab).  ){.    /*
56d0: 20 49 4d 50 3a 20 52 2d 30 32 30 36 35 2d 34 39   IMP: R-02065-49
56e0: 34 36 35 20 54 68 65 20 6c 65 66 74 2d 68 61 6e  465 The left-han
56f0: 64 20 73 69 64 65 20 6f 66 20 74 68 65 20 4c 49  d side of the LI
5700: 4b 45 20 6f 72 20 47 4c 4f 42 20 6f 70 65 72 61  KE or GLOB opera
5710: 74 6f 72 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20  tor must.    ** 
5720: 62 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  be the name of a
5730: 6e 20 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e  n indexed column
5740: 20 77 69 74 68 20 54 45 58 54 20 61 66 66 69 6e   with TEXT affin
5750: 69 74 79 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75  ity. */.    retu
5760: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65  rn 0;.  }.  asse
5770: 72 74 28 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75  rt( pLeft->iColu
5780: 6d 6e 21 3d 28 2d 31 29 20 29 3b 20 2f 2a 20 42  mn!=(-1) ); /* B
5790: 65 63 61 75 73 65 20 49 50 4b 20 6e 65 76 65 72  ecause IPK never
57a0: 20 68 61 73 20 41 46 46 5f 54 45 58 54 20 2a 2f   has AFF_TEXT */
57b0: 0a 0a 20 20 70 52 69 67 68 74 20 3d 20 73 71 6c  ..  pRight = sql
57c0: 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c  ite3ExprSkipColl
57d0: 61 74 65 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e  ate(pList->a[0].
57e0: 70 45 78 70 72 29 3b 0a 20 20 6f 70 20 3d 20 70  pExpr);.  op = p
57f0: 52 69 67 68 74 2d 3e 6f 70 3b 0a 20 20 69 66 28  Right->op;.  if(
5800: 20 6f 70 3d 3d 54 4b 5f 56 41 52 49 41 42 4c 45   op==TK_VARIABLE
5810: 20 29 7b 0a 20 20 20 20 56 64 62 65 20 2a 70 52   ){.    Vdbe *pR
5820: 65 70 72 65 70 61 72 65 20 3d 20 70 50 61 72 73  eprepare = pPars
5830: 65 2d 3e 70 52 65 70 72 65 70 61 72 65 3b 0a 20  e->pReprepare;. 
5840: 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 52     int iCol = pR
5850: 69 67 68 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20  ight->iColumn;. 
5860: 20 20 20 70 56 61 6c 20 3d 20 73 71 6c 69 74 65     pVal = sqlite
5870: 33 56 64 62 65 47 65 74 42 6f 75 6e 64 56 61 6c  3VdbeGetBoundVal
5880: 75 65 28 70 52 65 70 72 65 70 61 72 65 2c 20 69  ue(pReprepare, i
5890: 43 6f 6c 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f  Col, SQLITE_AFF_
58a0: 4e 4f 4e 45 29 3b 0a 20 20 20 20 69 66 28 20 70  NONE);.    if( p
58b0: 56 61 6c 20 26 26 20 73 71 6c 69 74 65 33 5f 76  Val && sqlite3_v
58c0: 61 6c 75 65 5f 74 79 70 65 28 70 56 61 6c 29 3d  alue_type(pVal)=
58d0: 3d 53 51 4c 49 54 45 5f 54 45 58 54 20 29 7b 0a  =SQLITE_TEXT ){.
58e0: 20 20 20 20 20 20 7a 20 3d 20 28 63 68 61 72 20        z = (char 
58f0: 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
5900: 74 65 78 74 28 70 56 61 6c 29 3b 0a 20 20 20 20  text(pVal);.    
5910: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  }.    sqlite3Vdb
5920: 65 53 65 74 56 61 72 6d 61 73 6b 28 70 50 61 72  eSetVarmask(pPar
5930: 73 65 2d 3e 70 56 64 62 65 2c 20 69 43 6f 6c 29  se->pVdbe, iCol)
5940: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 52  ;.    assert( pR
5950: 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 56 41 52  ight->op==TK_VAR
5960: 49 41 42 4c 45 20 7c 7c 20 70 52 69 67 68 74 2d  IABLE || pRight-
5970: 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52  >op==TK_REGISTER
5980: 20 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   );.  }else if( 
5990: 6f 70 3d 3d 54 4b 5f 53 54 52 49 4e 47 20 29 7b  op==TK_STRING ){
59a0: 0a 20 20 20 20 7a 20 3d 20 70 52 69 67 68 74 2d  .    z = pRight-
59b0: 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 7d 0a 20  >u.zToken;.  }. 
59c0: 20 69 66 28 20 7a 20 29 7b 0a 20 20 20 20 63 6e   if( z ){.    cn
59d0: 74 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65  t = 0;.    while
59e0: 28 20 28 63 3d 7a 5b 63 6e 74 5d 29 21 3d 30 20  ( (c=z[cnt])!=0 
59f0: 26 26 20 63 21 3d 77 63 5b 30 5d 20 26 26 20 63  && c!=wc[0] && c
5a00: 21 3d 77 63 5b 31 5d 20 26 26 20 63 21 3d 77 63  !=wc[1] && c!=wc
5a10: 5b 32 5d 20 29 7b 0a 20 20 20 20 20 20 63 6e 74  [2] ){.      cnt
5a20: 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ++;.    }.    if
5a30: 28 20 63 6e 74 21 3d 30 20 26 26 20 32 35 35 21  ( cnt!=0 && 255!
5a40: 3d 28 75 38 29 7a 5b 63 6e 74 2d 31 5d 20 29 7b  =(u8)z[cnt-1] ){
5a50: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 50 72  .      Expr *pPr
5a60: 65 66 69 78 3b 0a 20 20 20 20 20 20 2a 70 69 73  efix;.      *pis
5a70: 43 6f 6d 70 6c 65 74 65 20 3d 20 63 3d 3d 77 63  Complete = c==wc
5a80: 5b 30 5d 20 26 26 20 7a 5b 63 6e 74 2b 31 5d 3d  [0] && z[cnt+1]=
5a90: 3d 30 3b 0a 20 20 20 20 20 20 70 50 72 65 66 69  =0;.      pPrefi
5aa0: 78 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28  x = sqlite3Expr(
5ab0: 64 62 2c 20 54 4b 5f 53 54 52 49 4e 47 2c 20 7a  db, TK_STRING, z
5ac0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 72  );.      if( pPr
5ad0: 65 66 69 78 20 29 20 70 50 72 65 66 69 78 2d 3e  efix ) pPrefix->
5ae0: 75 2e 7a 54 6f 6b 65 6e 5b 63 6e 74 5d 20 3d 20  u.zToken[cnt] = 
5af0: 30 3b 0a 20 20 20 20 20 20 2a 70 70 50 72 65 66  0;.      *ppPref
5b00: 69 78 20 3d 20 70 50 72 65 66 69 78 3b 0a 20 20  ix = pPrefix;.  
5b10: 20 20 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 56      if( op==TK_V
5b20: 41 52 49 41 42 4c 45 20 29 7b 0a 20 20 20 20 20  ARIABLE ){.     
5b30: 20 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61     Vdbe *v = pPa
5b40: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 20 20  rse->pVdbe;.    
5b50: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
5b60: 65 74 56 61 72 6d 61 73 6b 28 76 2c 20 70 52 69  etVarmask(v, pRi
5b70: 67 68 74 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20  ght->iColumn);. 
5b80: 20 20 20 20 20 20 20 69 66 28 20 2a 70 69 73 43         if( *pisC
5b90: 6f 6d 70 6c 65 74 65 20 26 26 20 70 52 69 67 68  omplete && pRigh
5ba0: 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 31 5d 20 29  t->u.zToken[1] )
5bb0: 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  {.          /* I
5bc0: 66 20 74 68 65 20 72 68 73 20 6f 66 20 74 68 65  f the rhs of the
5bd0: 20 4c 49 4b 45 20 65 78 70 72 65 73 73 69 6f 6e   LIKE expression
5be0: 20 69 73 20 61 20 76 61 72 69 61 62 6c 65 2c 20   is a variable, 
5bf0: 61 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 0a  and the current.
5c00: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 76 61 6c            ** val
5c10: 75 65 20 6f 66 20 74 68 65 20 76 61 72 69 61 62  ue of the variab
5c20: 6c 65 20 6d 65 61 6e 73 20 74 68 65 72 65 20 69  le means there i
5c30: 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 69 6e 76  s no need to inv
5c40: 6f 6b 65 20 74 68 65 20 4c 49 4b 45 0a 20 20 20  oke the LIKE.   
5c50: 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69         ** functi
5c60: 6f 6e 2c 20 74 68 65 6e 20 6e 6f 20 4f 50 5f 56  on, then no OP_V
5c70: 61 72 69 61 62 6c 65 20 77 69 6c 6c 20 62 65 20  ariable will be 
5c80: 61 64 64 65 64 20 74 6f 20 74 68 65 20 70 72 6f  added to the pro
5c90: 67 72 61 6d 2e 0a 20 20 20 20 20 20 20 20 20 20  gram..          
5ca0: 2a 2a 20 54 68 69 73 20 63 61 75 73 65 73 20 70  ** This causes p
5cb0: 72 6f 62 6c 65 6d 73 20 66 6f 72 20 74 68 65 20  roblems for the 
5cc0: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72  sqlite3_bind_par
5cd0: 61 6d 65 74 65 72 5f 6e 61 6d 65 28 29 0a 20 20  ameter_name().  
5ce0: 20 20 20 20 20 20 20 20 2a 2a 20 41 50 49 2e 20          ** API. 
5cf0: 54 6f 20 77 6f 72 6b 61 72 6f 75 6e 64 20 74 68  To workaround th
5d00: 65 6d 2c 20 61 64 64 20 61 20 64 75 6d 6d 79 20  em, add a dummy 
5d10: 4f 50 5f 56 61 72 69 61 62 6c 65 20 68 65 72 65  OP_Variable here
5d20: 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 20 0a  ..          */ .
5d30: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 72 31            int r1
5d40: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
5d50: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
5d60: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
5d70: 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50  xprCodeTarget(pP
5d80: 61 72 73 65 2c 20 70 52 69 67 68 74 2c 20 72 31  arse, pRight, r1
5d90: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
5da0: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 33  ite3VdbeChangeP3
5db0: 28 76 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43  (v, sqlite3VdbeC
5dc0: 75 72 72 65 6e 74 41 64 64 72 28 76 29 2d 31 2c  urrentAddr(v)-1,
5dd0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73   0);.          s
5de0: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
5df0: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
5e00: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
5e10: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
5e20: 20 20 20 20 20 7a 20 3d 20 30 3b 0a 20 20 20 20       z = 0;.    
5e30: 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33  }.  }..  sqlite3
5e40: 56 61 6c 75 65 46 72 65 65 28 70 56 61 6c 29 3b  ValueFree(pVal);
5e50: 0a 20 20 72 65 74 75 72 6e 20 28 7a 21 3d 30 29  .  return (z!=0)
5e60: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
5e70: 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f  LITE_OMIT_LIKE_O
5e80: 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a  PTIMIZATION */..
5e90: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
5ea0: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
5eb0: 45 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f  E./*.** Check to
5ec0: 20 73 65 65 20 69 66 20 74 68 65 20 67 69 76 65   see if the give
5ed0: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  n expression is 
5ee0: 6f 66 20 74 68 65 20 66 6f 72 6d 0a 2a 2a 0a 2a  of the form.**.*
5ef0: 2a 20 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e  *         column
5f00: 20 4d 41 54 43 48 20 65 78 70 72 0a 2a 2a 0a 2a   MATCH expr.**.*
5f10: 2a 20 49 66 20 69 74 20 69 73 20 74 68 65 6e 20  * If it is then 
5f20: 72 65 74 75 72 6e 20 54 52 55 45 2e 20 20 49 66  return TRUE.  If
5f30: 20 6e 6f 74 2c 20 72 65 74 75 72 6e 20 46 41 4c   not, return FAL
5f40: 53 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  SE..*/.static in
5f50: 74 20 69 73 4d 61 74 63 68 4f 66 43 6f 6c 75 6d  t isMatchOfColum
5f60: 6e 28 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  n(.  Expr *pExpr
5f70: 20 20 20 20 20 20 2f 2a 20 54 65 73 74 20 74 68        /* Test th
5f80: 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f  is expression */
5f90: 0a 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  .){.  ExprList *
5fa0: 70 4c 69 73 74 3b 0a 0a 20 20 69 66 28 20 70 45  pList;..  if( pE
5fb0: 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 46 55 4e 43  xpr->op!=TK_FUNC
5fc0: 54 49 4f 4e 20 29 7b 0a 20 20 20 20 72 65 74 75  TION ){.    retu
5fd0: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 0;.  }.  if( 
5fe0: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
5ff0: 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 22  Expr->u.zToken,"
6000: 6d 61 74 63 68 22 29 21 3d 30 20 29 7b 0a 20 20  match")!=0 ){.  
6010: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
6020: 20 20 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d    pList = pExpr-
6030: 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 69 66 28 20  >x.pList;.  if( 
6040: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 32 20  pList->nExpr!=2 
6050: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
6060: 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 69 73 74  .  }.  if( pList
6070: 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 2d 3e 6f 70  ->a[1].pExpr->op
6080: 20 21 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b   != TK_COLUMN ){
6090: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
60a0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d   }.  return 1;.}
60b0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
60c0: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
60d0: 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66  BLE */../*.** If
60e0: 20 74 68 65 20 70 42 61 73 65 20 65 78 70 72 65   the pBase expre
60f0: 73 73 69 6f 6e 20 6f 72 69 67 69 6e 61 74 65 64  ssion originated
6100: 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55 53   in the ON or US
6110: 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 0a 2a 2a  ING clause of.**
6120: 20 61 20 6a 6f 69 6e 2c 20 74 68 65 6e 20 74 72   a join, then tr
6130: 61 6e 73 66 65 72 20 74 68 65 20 61 70 70 72 6f  ansfer the appro
6140: 70 72 69 61 74 65 20 6d 61 72 6b 69 6e 67 73 20  priate markings 
6150: 6f 76 65 72 20 74 6f 20 64 65 72 69 76 65 64 2e  over to derived.
6160: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
6170: 74 72 61 6e 73 66 65 72 4a 6f 69 6e 4d 61 72 6b  transferJoinMark
6180: 69 6e 67 73 28 45 78 70 72 20 2a 70 44 65 72 69  ings(Expr *pDeri
6190: 76 65 64 2c 20 45 78 70 72 20 2a 70 42 61 73 65  ved, Expr *pBase
61a0: 29 7b 0a 20 20 69 66 28 20 70 44 65 72 69 76 65  ){.  if( pDerive
61b0: 64 20 29 7b 0a 20 20 20 20 70 44 65 72 69 76 65  d ){.    pDerive
61c0: 64 2d 3e 66 6c 61 67 73 20 7c 3d 20 70 42 61 73  d->flags |= pBas
61d0: 65 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 46 72  e->flags & EP_Fr
61e0: 6f 6d 4a 6f 69 6e 3b 0a 20 20 20 20 70 44 65 72  omJoin;.    pDer
61f0: 69 76 65 64 2d 3e 69 52 69 67 68 74 4a 6f 69 6e  ived->iRightJoin
6200: 54 61 62 6c 65 20 3d 20 70 42 61 73 65 2d 3e 69  Table = pBase->i
6210: 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 3b 0a  RightJoinTable;.
6220: 20 20 7d 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69    }.}..#if !defi
6230: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
6240: 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 29  OR_OPTIMIZATION)
6250: 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
6260: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
6270: 59 29 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65  Y)./*.** Analyze
6280: 20 61 20 74 65 72 6d 20 74 68 61 74 20 63 6f 6e   a term that con
6290: 73 69 73 74 73 20 6f 66 20 74 77 6f 20 6f 72 20  sists of two or 
62a0: 6d 6f 72 65 20 4f 52 2d 63 6f 6e 6e 65 63 74 65  more OR-connecte
62b0: 64 0a 2a 2a 20 73 75 62 74 65 72 6d 73 2e 20 20  d.** subterms.  
62c0: 53 6f 20 69 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  So in:.**.**    
62d0: 20 2e 2e 2e 20 57 48 45 52 45 20 20 28 61 3d 35   ... WHERE  (a=5
62e0: 29 20 41 4e 44 20 28 62 3d 37 20 4f 52 20 63 3d  ) AND (b=7 OR c=
62f0: 39 20 4f 52 20 64 3d 31 33 29 20 41 4e 44 20 28  9 OR d=13) AND (
6300: 64 3d 31 33 29 0a 2a 2a 20 20 20 20 20 20 20 20  d=13).**        
6310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6320: 20 20 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e    ^^^^^^^^^^^^^^
6330: 5e 5e 5e 5e 5e 5e 0a 2a 2a 0a 2a 2a 20 54 68 69  ^^^^^^.**.** Thi
6340: 73 20 72 6f 75 74 69 6e 65 20 61 6e 61 6c 79 7a  s routine analyz
6350: 65 73 20 74 65 72 6d 73 20 73 75 63 68 20 61 73  es terms such as
6360: 20 74 68 65 20 6d 69 64 64 6c 65 20 74 65 72 6d   the middle term
6370: 20 69 6e 20 74 68 65 20 61 62 6f 76 65 20 65 78   in the above ex
6380: 61 6d 70 6c 65 2e 0a 2a 2a 20 41 20 57 68 65 72  ample..** A Wher
6390: 65 4f 72 54 65 72 6d 20 6f 62 6a 65 63 74 20 69  eOrTerm object i
63a0: 73 20 63 6f 6d 70 75 74 65 64 20 61 6e 64 20 61  s computed and a
63b0: 74 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 74  ttached to the t
63c0: 65 72 6d 20 75 6e 64 65 72 0a 2a 2a 20 61 6e 61  erm under.** ana
63d0: 6c 79 73 69 73 2c 20 72 65 67 61 72 64 6c 65 73  lysis, regardles
63e0: 73 20 6f 66 20 74 68 65 20 6f 75 74 63 6f 6d 65  s of the outcome
63f0: 20 6f 66 20 74 68 65 20 61 6e 61 6c 79 73 69 73   of the analysis
6400: 2e 20 20 48 65 6e 63 65 3a 0a 2a 2a 0a 2a 2a 20  .  Hence:.**.** 
6410: 20 20 20 20 57 68 65 72 65 54 65 72 6d 2e 77 74      WhereTerm.wt
6420: 46 6c 61 67 73 20 20 20 7c 3d 20 20 54 45 52 4d  Flags   |=  TERM
6430: 5f 4f 52 49 4e 46 4f 0a 2a 2a 20 20 20 20 20 57  _ORINFO.**     W
6440: 68 65 72 65 54 65 72 6d 2e 75 2e 70 4f 72 49 6e  hereTerm.u.pOrIn
6450: 66 6f 20 20 3d 20 20 61 20 64 79 6e 61 6d 69 63  fo  =  a dynamic
6460: 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 57  ally allocated W
6470: 68 65 72 65 4f 72 54 65 72 6d 20 6f 62 6a 65 63  hereOrTerm objec
6480: 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 65 72 6d  t.**.** The term
6490: 20 62 65 69 6e 67 20 61 6e 61 6c 79 7a 65 64 20   being analyzed 
64a0: 6d 75 73 74 20 68 61 76 65 20 74 77 6f 20 6f 72  must have two or
64b0: 20 6d 6f 72 65 20 6f 66 20 4f 52 2d 63 6f 6e 6e   more of OR-conn
64c0: 65 63 74 65 64 20 73 75 62 74 65 72 6d 73 2e 0a  ected subterms..
64d0: 2a 2a 20 41 20 73 69 6e 67 6c 65 20 73 75 62 74  ** A single subt
64e0: 65 72 6d 20 6d 69 67 68 74 20 62 65 20 61 20 73  erm might be a s
64f0: 65 74 20 6f 66 20 41 4e 44 2d 63 6f 6e 6e 65 63  et of AND-connec
6500: 74 65 64 20 73 75 62 2d 73 75 62 74 65 72 6d 73  ted sub-subterms
6510: 2e 0a 2a 2a 20 45 78 61 6d 70 6c 65 73 20 6f 66  ..** Examples of
6520: 20 74 65 72 6d 73 20 75 6e 64 65 72 20 61 6e 61   terms under ana
6530: 6c 79 73 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  lysis:.**.**    
6540: 20 28 41 29 20 20 20 20 20 74 31 2e 78 3d 74 32   (A)     t1.x=t2
6550: 2e 79 20 4f 52 20 74 31 2e 78 3d 74 32 2e 7a 20  .y OR t1.x=t2.z 
6560: 4f 52 20 74 31 2e 79 3d 31 35 20 4f 52 20 74 31  OR t1.y=15 OR t1
6570: 2e 7a 3d 74 33 2e 61 2b 35 0a 2a 2a 20 20 20 20  .z=t3.a+5.**    
6580: 20 28 42 29 20 20 20 20 20 78 3d 65 78 70 72 31   (B)     x=expr1
6590: 20 4f 52 20 65 78 70 72 32 3d 78 20 4f 52 20 78   OR expr2=x OR x
65a0: 3d 65 78 70 72 33 0a 2a 2a 20 20 20 20 20 28 43  =expr3.**     (C
65b0: 29 20 20 20 20 20 74 31 2e 78 3d 74 32 2e 79 20  )     t1.x=t2.y 
65c0: 4f 52 20 28 74 31 2e 78 3d 74 32 2e 7a 20 41 4e  OR (t1.x=t2.z AN
65d0: 44 20 74 31 2e 79 3d 31 35 29 0a 2a 2a 20 20 20  D t1.y=15).**   
65e0: 20 20 28 44 29 20 20 20 20 20 78 3d 65 78 70 72    (D)     x=expr
65f0: 31 20 4f 52 20 28 79 3e 31 31 20 41 4e 44 20 79  1 OR (y>11 AND y
6600: 3c 32 32 20 41 4e 44 20 7a 20 4c 49 4b 45 20 27  <22 AND z LIKE '
6610: 2a 68 65 6c 6c 6f 2a 27 29 0a 2a 2a 20 20 20 20  *hello*').**    
6620: 20 28 45 29 20 20 20 20 20 28 70 2e 61 3d 31 20   (E)     (p.a=1 
6630: 41 4e 44 20 71 2e 62 3d 32 20 41 4e 44 20 72 2e  AND q.b=2 AND r.
6640: 63 3d 33 29 20 4f 52 20 28 70 2e 78 3d 34 20 41  c=3) OR (p.x=4 A
6650: 4e 44 20 71 2e 79 3d 35 20 41 4e 44 20 72 2e 7a  ND q.y=5 AND r.z
6660: 3d 36 29 0a 2a 2a 0a 2a 2a 20 43 41 53 45 20 31  =6).**.** CASE 1
6670: 3a 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6c 6c 20 73  :.**.** If all s
6680: 75 62 74 65 72 6d 73 20 61 72 65 20 6f 66 20 74  ubterms are of t
6690: 68 65 20 66 6f 72 6d 20 54 2e 43 3d 65 78 70 72  he form T.C=expr
66a0: 20 66 6f 72 20 73 6f 6d 65 20 73 69 6e 67 6c 65   for some single
66b0: 20 63 6f 6c 75 6d 6e 20 6f 66 20 43 20 61 6e 64   column of C and
66c0: 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 74 61 62  .** a single tab
66d0: 6c 65 20 54 20 28 61 73 20 73 68 6f 77 6e 20 69  le T (as shown i
66e0: 6e 20 65 78 61 6d 70 6c 65 20 42 20 61 62 6f 76  n example B abov
66f0: 65 29 20 74 68 65 6e 20 63 72 65 61 74 65 20 61  e) then create a
6700: 20 6e 65 77 20 76 69 72 74 75 61 6c 0a 2a 2a 20   new virtual.** 
6710: 74 65 72 6d 20 74 68 61 74 20 69 73 20 61 6e 20  term that is an 
6720: 65 71 75 69 76 61 6c 65 6e 74 20 49 4e 20 65 78  equivalent IN ex
6730: 70 72 65 73 73 69 6f 6e 2e 20 20 49 6e 20 6f 74  pression.  In ot
6740: 68 65 72 20 77 6f 72 64 73 2c 20 69 66 20 74 68  her words, if th
6750: 65 20 74 65 72 6d 0a 2a 2a 20 62 65 69 6e 67 20  e term.** being 
6760: 61 6e 61 6c 79 7a 65 64 20 69 73 3a 0a 2a 2a 0a  analyzed is:.**.
6770: 2a 2a 20 20 20 20 20 20 78 20 3d 20 65 78 70 72  **      x = expr
6780: 31 20 20 4f 52 20 20 65 78 70 72 32 20 3d 20 78  1  OR  expr2 = x
6790: 20 20 4f 52 20 20 78 20 3d 20 65 78 70 72 33 0a    OR  x = expr3.
67a0: 2a 2a 0a 2a 2a 20 74 68 65 6e 20 63 72 65 61 74  **.** then creat
67b0: 65 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c 20  e a new virtual 
67c0: 74 65 72 6d 20 6c 69 6b 65 20 74 68 69 73 3a 0a  term like this:.
67d0: 2a 2a 0a 2a 2a 20 20 20 20 20 20 78 20 49 4e 20  **.**      x IN 
67e0: 28 65 78 70 72 31 2c 65 78 70 72 32 2c 65 78 70  (expr1,expr2,exp
67f0: 72 33 29 0a 2a 2a 0a 2a 2a 20 43 41 53 45 20 32  r3).**.** CASE 2
6800: 3a 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6c 6c 20 73  :.**.** If all s
6810: 75 62 74 65 72 6d 73 20 61 72 65 20 69 6e 64 65  ubterms are inde
6820: 78 61 62 6c 65 20 62 79 20 61 20 73 69 6e 67 6c  xable by a singl
6830: 65 20 74 61 62 6c 65 20 54 2c 20 74 68 65 6e 20  e table T, then 
6840: 73 65 74 0a 2a 2a 0a 2a 2a 20 20 20 20 20 57 68  set.**.**     Wh
6850: 65 72 65 54 65 72 6d 2e 65 4f 70 65 72 61 74 6f  ereTerm.eOperato
6860: 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3d  r              =
6870: 20 20 57 4f 5f 4f 52 0a 2a 2a 20 20 20 20 20 57    WO_OR.**     W
6880: 68 65 72 65 54 65 72 6d 2e 75 2e 70 4f 72 49 6e  hereTerm.u.pOrIn
6890: 66 6f 2d 3e 69 6e 64 65 78 61 62 6c 65 20 20 7c  fo->indexable  |
68a0: 3d 20 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75  =  the cursor nu
68b0: 6d 62 65 72 20 66 6f 72 20 74 61 62 6c 65 20 54  mber for table T
68c0: 0a 2a 2a 0a 2a 2a 20 41 20 73 75 62 74 65 72 6d  .**.** A subterm
68d0: 20 69 73 20 22 69 6e 64 65 78 61 62 6c 65 22 20   is "indexable" 
68e0: 69 66 20 69 74 20 69 73 20 6f 66 20 74 68 65 20  if it is of the 
68f0: 66 6f 72 6d 0a 2a 2a 20 22 54 2e 43 20 3c 6f 70  form.** "T.C <op
6900: 3e 20 3c 65 78 70 72 3e 22 20 77 68 65 72 65 20  > <expr>" where 
6910: 43 20 69 73 20 61 6e 79 20 63 6f 6c 75 6d 6e 20  C is any column 
6920: 6f 66 20 74 61 62 6c 65 20 54 20 61 6e 64 20 0a  of table T and .
6930: 2a 2a 20 3c 6f 70 3e 20 69 73 20 6f 6e 65 20 6f  ** <op> is one o
6940: 66 20 22 3d 22 2c 20 22 3c 22 2c 20 22 3c 3d 22  f "=", "<", "<="
6950: 2c 20 22 3e 22 2c 20 22 3e 3d 22 2c 20 22 49 53  , ">", ">=", "IS
6960: 20 4e 55 4c 4c 22 2c 20 6f 72 20 22 49 4e 22 2e   NULL", or "IN".
6970: 0a 2a 2a 20 41 20 73 75 62 74 65 72 6d 20 69 73  .** A subterm is
6980: 20 61 6c 73 6f 20 69 6e 64 65 78 61 62 6c 65 20   also indexable 
6990: 69 66 20 69 74 20 69 73 20 61 6e 20 41 4e 44 20  if it is an AND 
69a0: 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 0a 2a  of two or more.*
69b0: 2a 20 73 75 62 73 75 62 74 65 72 6d 73 20 61 74  * subsubterms at
69c0: 20 6c 65 61 73 74 20 6f 6e 65 20 6f 66 20 77 68   least one of wh
69d0: 69 63 68 20 69 73 20 69 6e 64 65 78 61 62 6c 65  ich is indexable
69e0: 2e 20 20 49 6e 64 65 78 61 62 6c 65 20 41 4e 44  .  Indexable AND
69f0: 20 0a 2a 2a 20 73 75 62 74 65 72 6d 73 20 68 61   .** subterms ha
6a00: 76 65 20 74 68 65 69 72 20 65 4f 70 65 72 61 74  ve their eOperat
6a10: 6f 72 20 73 65 74 20 74 6f 20 57 4f 5f 41 4e 44  or set to WO_AND
6a20: 20 61 6e 64 20 74 68 65 79 20 68 61 76 65 0a 2a   and they have.*
6a30: 2a 20 75 2e 70 41 6e 64 49 6e 66 6f 20 73 65 74  * u.pAndInfo set
6a40: 20 74 6f 20 61 20 64 79 6e 61 6d 69 63 61 6c 6c   to a dynamicall
6a50: 79 20 61 6c 6c 6f 63 61 74 65 64 20 57 68 65 72  y allocated Wher
6a60: 65 41 6e 64 54 65 72 6d 20 6f 62 6a 65 63 74 2e  eAndTerm object.
6a70: 0a 2a 2a 0a 2a 2a 20 46 72 6f 6d 20 61 6e 6f 74  .**.** From anot
6a80: 68 65 72 20 70 6f 69 6e 74 20 6f 66 20 76 69 65  her point of vie
6a90: 77 2c 20 22 69 6e 64 65 78 61 62 6c 65 22 20 6d  w, "indexable" m
6aa0: 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 73 75  eans that the su
6ab0: 62 74 65 72 6d 20 63 6f 75 6c 64 0a 2a 2a 20 70  bterm could.** p
6ac0: 6f 74 65 6e 74 69 61 6c 6c 79 20 62 65 20 75 73  otentially be us
6ad0: 65 64 20 77 69 74 68 20 61 6e 20 69 6e 64 65 78  ed with an index
6ae0: 20 69 66 20 61 6e 20 61 70 70 72 6f 70 72 69 61   if an appropria
6af0: 74 65 20 69 6e 64 65 78 20 65 78 69 73 74 73 2e  te index exists.
6b00: 0a 2a 2a 20 54 68 69 73 20 61 6e 61 6c 79 73 69  .** This analysi
6b10: 73 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 73 69  s does not consi
6b20: 64 65 72 20 77 68 65 74 68 65 72 20 6f 72 20 6e  der whether or n
6b30: 6f 74 20 74 68 65 20 69 6e 64 65 78 20 65 78 69  ot the index exi
6b40: 73 74 73 3b 20 74 68 61 74 0a 2a 2a 20 69 73 20  sts; that.** is 
6b50: 64 65 63 69 64 65 64 20 65 6c 73 65 77 68 65 72  decided elsewher
6b60: 65 2e 20 20 54 68 69 73 20 61 6e 61 6c 79 73 69  e.  This analysi
6b70: 73 20 6f 6e 6c 79 20 6c 6f 6f 6b 73 20 61 74 20  s only looks at 
6b80: 77 68 65 74 68 65 72 20 73 75 62 74 65 72 6d 73  whether subterms
6b90: 0a 2a 2a 20 61 70 70 72 6f 70 72 69 61 74 65 20  .** appropriate 
6ba0: 66 6f 72 20 69 6e 64 65 78 69 6e 67 20 65 78 69  for indexing exi
6bb0: 73 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 65 78  st..**.** All ex
6bc0: 61 6d 70 6c 65 73 20 41 20 74 68 72 6f 75 67 68  amples A through
6bd0: 20 45 20 61 62 6f 76 65 20 73 61 74 69 73 66 79   E above satisfy
6be0: 20 63 61 73 65 20 32 2e 20 20 42 75 74 20 69 66   case 2.  But if
6bf0: 20 61 20 74 65 72 6d 0a 2a 2a 20 61 6c 73 6f 20   a term.** also 
6c00: 73 74 61 74 69 73 66 69 65 73 20 63 61 73 65 20  statisfies case 
6c10: 31 20 28 73 75 63 68 20 61 73 20 42 29 20 77 65  1 (such as B) we
6c20: 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20 6f   know that the o
6c30: 70 74 69 6d 69 7a 65 72 20 77 69 6c 6c 0a 2a 2a  ptimizer will.**
6c40: 20 61 6c 77 61 79 73 20 70 72 65 66 65 72 20 63   always prefer c
6c50: 61 73 65 20 31 2c 20 73 6f 20 69 6e 20 74 68 61  ase 1, so in tha
6c60: 74 20 63 61 73 65 20 77 65 20 70 72 65 74 65 6e  t case we preten
6c70: 64 20 74 68 61 74 20 63 61 73 65 20 32 20 69 73  d that case 2 is
6c80: 20 6e 6f 74 0a 2a 2a 20 73 61 74 69 73 66 69 65   not.** satisfie
6c90: 64 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 6d 69 67 68  d..**.** It migh
6ca0: 74 20 62 65 20 74 68 65 20 63 61 73 65 20 74 68  t be the case th
6cb0: 61 74 20 6d 75 6c 74 69 70 6c 65 20 74 61 62 6c  at multiple tabl
6cc0: 65 73 20 61 72 65 20 69 6e 64 65 78 61 62 6c 65  es are indexable
6cd0: 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 0a  .  For example,.
6ce0: 2a 2a 20 28 45 29 20 61 62 6f 76 65 20 69 73 20  ** (E) above is 
6cf0: 69 6e 64 65 78 61 62 6c 65 20 6f 6e 20 74 61 62  indexable on tab
6d00: 6c 65 73 20 50 2c 20 51 2c 20 61 6e 64 20 52 2e  les P, Q, and R.
6d10: 0a 2a 2a 0a 2a 2a 20 54 65 72 6d 73 20 74 68 61  .**.** Terms tha
6d20: 74 20 73 61 74 69 73 66 79 20 63 61 73 65 20 32  t satisfy case 2
6d30: 20 61 72 65 20 63 61 6e 64 69 64 61 74 65 73 20   are candidates 
6d40: 66 6f 72 20 6c 6f 6f 6b 75 70 20 62 79 20 75 73  for lookup by us
6d50: 69 6e 67 0a 2a 2a 20 73 65 70 61 72 61 74 65 20  ing.** separate 
6d60: 69 6e 64 69 63 65 73 20 74 6f 20 66 69 6e 64 20  indices to find 
6d70: 72 6f 77 69 64 73 20 66 6f 72 20 65 61 63 68 20  rowids for each 
6d80: 73 75 62 74 65 72 6d 20 61 6e 64 20 63 6f 6d 70  subterm and comp
6d90: 6f 73 69 6e 67 0a 2a 2a 20 74 68 65 20 75 6e 69  osing.** the uni
6da0: 6f 6e 20 6f 66 20 61 6c 6c 20 72 6f 77 69 64 73  on of all rowids
6db0: 20 75 73 69 6e 67 20 61 20 52 6f 77 53 65 74 20   using a RowSet 
6dc0: 6f 62 6a 65 63 74 2e 20 20 54 68 69 73 20 69 73  object.  This is
6dd0: 20 73 69 6d 69 6c 61 72 0a 2a 2a 20 74 6f 20 22   similar.** to "
6de0: 62 69 74 6d 61 70 20 69 6e 64 69 63 65 73 22 20  bitmap indices" 
6df0: 69 6e 20 6f 74 68 65 72 20 64 61 74 61 62 61 73  in other databas
6e00: 65 20 65 6e 67 69 6e 65 73 2e 0a 2a 2a 0a 2a 2a  e engines..**.**
6e10: 20 4f 54 48 45 52 57 49 53 45 3a 0a 2a 2a 0a 2a   OTHERWISE:.**.*
6e20: 2a 20 49 66 20 6e 65 69 74 68 65 72 20 63 61 73  * If neither cas
6e30: 65 20 31 20 6e 6f 72 20 63 61 73 65 20 32 20 61  e 1 nor case 2 a
6e40: 70 70 6c 79 2c 20 74 68 65 6e 20 6c 65 61 76 65  pply, then leave
6e50: 20 74 68 65 20 65 4f 70 65 72 61 74 6f 72 20 73   the eOperator s
6e60: 65 74 20 74 6f 0a 2a 2a 20 7a 65 72 6f 2e 20 20  et to.** zero.  
6e70: 54 68 69 73 20 74 65 72 6d 20 69 73 20 6e 6f 74  This term is not
6e80: 20 75 73 65 66 75 6c 20 66 6f 72 20 73 65 61 72   useful for sear
6e90: 63 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ch..*/.static vo
6ea0: 69 64 20 65 78 70 72 41 6e 61 6c 79 7a 65 4f 72  id exprAnalyzeOr
6eb0: 54 65 72 6d 28 0a 20 20 53 72 63 4c 69 73 74 20  Term(.  SrcList 
6ec0: 2a 70 53 72 63 2c 20 20 20 20 20 20 20 20 20 20  *pSrc,          
6ed0: 20 20 2f 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c    /* the FROM cl
6ee0: 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 43  ause */.  WhereC
6ef0: 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20  lause *pWC,     
6f00: 20 20 20 20 2f 2a 20 74 68 65 20 63 6f 6d 70 6c      /* the compl
6f10: 65 74 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  ete WHERE clause
6f20: 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78 54 65 72   */.  int idxTer
6f30: 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m               
6f40: 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20  /* Index of the 
6f50: 4f 52 2d 74 65 72 6d 20 74 6f 20 62 65 20 61 6e  OR-term to be an
6f60: 61 6c 79 7a 65 64 20 2a 2f 0a 29 7b 0a 20 20 57  alyzed */.){.  W
6f70: 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
6f80: 20 3d 20 70 57 43 2d 3e 70 57 49 6e 66 6f 3b 20   = pWC->pWInfo; 
6f90: 20 20 20 20 20 20 20 2f 2a 20 57 48 45 52 45 20         /* WHERE 
6fa0: 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e  clause processin
6fb0: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 50  g context */.  P
6fc0: 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70  arse *pParse = p
6fd0: 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 20 20  WInfo->pParse;  
6fe0: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72         /* Parser
6ff0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73 71   context */.  sq
7000: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
7010: 73 65 2d 3e 64 62 3b 20 20 20 20 20 20 20 20 20  se->db;         
7020: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
7030: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
7040: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
7050: 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78  rm = &pWC->a[idx
7060: 54 65 72 6d 5d 3b 20 20 20 20 2f 2a 20 54 68 65  Term];    /* The
7070: 20 74 65 72 6d 20 74 6f 20 62 65 20 61 6e 61 6c   term to be anal
7080: 79 7a 65 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a  yzed */.  Expr *
7090: 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70  pExpr = pTerm->p
70a0: 45 78 70 72 3b 20 20 20 20 20 20 20 20 20 20 20  Expr;           
70b0: 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73    /* The express
70c0: 69 6f 6e 20 6f 66 20 74 68 65 20 74 65 72 6d 20  ion of the term 
70d0: 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  */.  int i;     
70e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
70f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7100: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f  Loop counters */
7110: 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
7120: 70 4f 72 57 63 3b 20 20 20 20 20 20 20 2f 2a 20  pOrWc;       /* 
7130: 42 72 65 61 6b 75 70 20 6f 66 20 70 54 65 72 6d  Breakup of pTerm
7140: 20 69 6e 74 6f 20 73 75 62 74 65 72 6d 73 20 2a   into subterms *
7150: 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  /.  WhereTerm *p
7160: 4f 72 54 65 72 6d 3b 20 20 20 20 20 20 20 2f 2a  OrTerm;       /*
7170: 20 41 20 53 75 62 2d 74 65 72 6d 20 77 69 74 68   A Sub-term with
7180: 69 6e 20 74 68 65 20 70 4f 72 57 63 20 2a 2f 0a  in the pOrWc */.
7190: 20 20 57 68 65 72 65 4f 72 49 6e 66 6f 20 2a 70    WhereOrInfo *p
71a0: 4f 72 49 6e 66 6f 3b 20 20 20 20 20 2f 2a 20 41  OrInfo;     /* A
71b0: 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
71c0: 61 74 69 6f 6e 20 61 73 73 6f 63 69 61 74 65 64  ation associated
71d0: 20 77 69 74 68 20 70 54 65 72 6d 20 2a 2f 0a 20   with pTerm */. 
71e0: 20 42 69 74 6d 61 73 6b 20 63 68 6e 67 54 6f 49   Bitmask chngToI
71f0: 4e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61  N;         /* Ta
7200: 62 6c 65 73 20 74 68 61 74 20 6d 69 67 68 74 20  bles that might 
7210: 73 61 74 69 73 66 79 20 63 61 73 65 20 31 20 2a  satisfy case 1 *
7220: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 69 6e 64 65  /.  Bitmask inde
7230: 78 61 62 6c 65 3b 20 20 20 20 20 20 20 20 2f 2a  xable;        /*
7240: 20 54 61 62 6c 65 73 20 74 68 61 74 20 61 72 65   Tables that are
7250: 20 69 6e 64 65 78 61 62 6c 65 2c 20 73 61 74 69   indexable, sati
7260: 73 66 79 69 6e 67 20 63 61 73 65 20 32 20 2a 2f  sfying case 2 */
7270: 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 42 72 65 61  ..  /*.  ** Brea
7280: 6b 20 74 68 65 20 4f 52 20 63 6c 61 75 73 65 20  k the OR clause 
7290: 69 6e 74 6f 20 69 74 73 20 73 65 70 61 72 61 74  into its separat
72a0: 65 20 73 75 62 74 65 72 6d 73 2e 20 20 54 68 65  e subterms.  The
72b0: 20 73 75 62 74 65 72 6d 73 20 61 72 65 0a 20 20   subterms are.  
72c0: 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 61 20 57  ** stored in a W
72d0: 68 65 72 65 43 6c 61 75 73 65 20 73 74 72 75 63  hereClause struc
72e0: 74 75 72 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ture containing 
72f0: 77 69 74 68 69 6e 20 74 68 65 20 57 68 65 72 65  within the Where
7300: 4f 72 49 6e 66 6f 0a 20 20 2a 2a 20 6f 62 6a 65  OrInfo.  ** obje
7310: 63 74 20 74 68 61 74 20 69 73 20 61 74 74 61 63  ct that is attac
7320: 68 65 64 20 74 6f 20 74 68 65 20 6f 72 69 67 69  hed to the origi
7330: 6e 61 6c 20 4f 52 20 63 6c 61 75 73 65 20 74 65  nal OR clause te
7340: 72 6d 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  rm..  */.  asser
7350: 74 28 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61  t( (pTerm->wtFla
7360: 67 73 20 26 20 28 54 45 52 4d 5f 44 59 4e 41 4d  gs & (TERM_DYNAM
7370: 49 43 7c 54 45 52 4d 5f 4f 52 49 4e 46 4f 7c 54  IC|TERM_ORINFO|T
7380: 45 52 4d 5f 41 4e 44 49 4e 46 4f 29 29 3d 3d 30  ERM_ANDINFO))==0
7390: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
73a0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52 20 29  xpr->op==TK_OR )
73b0: 3b 0a 20 20 70 54 65 72 6d 2d 3e 75 2e 70 4f 72  ;.  pTerm->u.pOr
73c0: 49 6e 66 6f 20 3d 20 70 4f 72 49 6e 66 6f 20 3d  Info = pOrInfo =
73d0: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
73e0: 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
73f0: 2a 70 4f 72 49 6e 66 6f 29 29 3b 0a 20 20 69 66  *pOrInfo));.  if
7400: 28 20 70 4f 72 49 6e 66 6f 3d 3d 30 20 29 20 72  ( pOrInfo==0 ) r
7410: 65 74 75 72 6e 3b 0a 20 20 70 54 65 72 6d 2d 3e  eturn;.  pTerm->
7420: 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f  wtFlags |= TERM_
7430: 4f 52 49 4e 46 4f 3b 0a 20 20 70 4f 72 57 63 20  ORINFO;.  pOrWc 
7440: 3d 20 26 70 4f 72 49 6e 66 6f 2d 3e 77 63 3b 0a  = &pOrInfo->wc;.
7450: 20 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 69    whereClauseIni
7460: 74 28 70 4f 72 57 63 2c 20 70 57 49 6e 66 6f 29  t(pOrWc, pWInfo)
7470: 3b 0a 20 20 77 68 65 72 65 53 70 6c 69 74 28 70  ;.  whereSplit(p
7480: 4f 72 57 63 2c 20 70 45 78 70 72 2c 20 54 4b 5f  OrWc, pExpr, TK_
7490: 4f 52 29 3b 0a 20 20 65 78 70 72 41 6e 61 6c 79  OR);.  exprAnaly
74a0: 7a 65 41 6c 6c 28 70 53 72 63 2c 20 70 4f 72 57  zeAll(pSrc, pOrW
74b0: 63 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  c);.  if( db->ma
74c0: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74  llocFailed ) ret
74d0: 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70  urn;.  assert( p
74e0: 4f 72 57 63 2d 3e 6e 54 65 72 6d 3e 3d 32 20 29  OrWc->nTerm>=2 )
74f0: 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 43 6f 6d  ;..  /*.  ** Com
7500: 70 75 74 65 20 74 68 65 20 73 65 74 20 6f 66 20  pute the set of 
7510: 74 61 62 6c 65 73 20 74 68 61 74 20 6d 69 67 68  tables that migh
7520: 74 20 73 61 74 69 73 66 79 20 63 61 73 65 73 20  t satisfy cases 
7530: 31 20 6f 72 20 32 2e 0a 20 20 2a 2f 0a 20 20 69  1 or 2..  */.  i
7540: 6e 64 65 78 61 62 6c 65 20 3d 20 7e 28 42 69 74  ndexable = ~(Bit
7550: 6d 61 73 6b 29 30 3b 0a 20 20 63 68 6e 67 54 6f  mask)0;.  chngTo
7560: 49 4e 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30  IN = ~(Bitmask)0
7570: 3b 0a 20 20 66 6f 72 28 69 3d 70 4f 72 57 63 2d  ;.  for(i=pOrWc-
7580: 3e 6e 54 65 72 6d 2d 31 2c 20 70 4f 72 54 65 72  >nTerm-1, pOrTer
7590: 6d 3d 70 4f 72 57 63 2d 3e 61 3b 20 69 3e 3d 30  m=pOrWc->a; i>=0
75a0: 20 26 26 20 69 6e 64 65 78 61 62 6c 65 3b 20 69   && indexable; i
75b0: 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a  --, pOrTerm++){.
75c0: 20 20 20 20 69 66 28 20 28 70 4f 72 54 65 72 6d      if( (pOrTerm
75d0: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
75e0: 5f 53 49 4e 47 4c 45 29 3d 3d 30 20 29 7b 0a 20  _SINGLE)==0 ){. 
75f0: 20 20 20 20 20 57 68 65 72 65 41 6e 64 49 6e 66       WhereAndInf
7600: 6f 20 2a 70 41 6e 64 49 6e 66 6f 3b 0a 20 20 20  o *pAndInfo;.   
7610: 20 20 20 61 73 73 65 72 74 28 20 28 70 4f 72 54     assert( (pOrT
7620: 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 28  erm->wtFlags & (
7630: 54 45 52 4d 5f 41 4e 44 49 4e 46 4f 7c 54 45 52  TERM_ANDINFO|TER
7640: 4d 5f 4f 52 49 4e 46 4f 29 29 3d 3d 30 20 29 3b  M_ORINFO))==0 );
7650: 0a 20 20 20 20 20 20 63 68 6e 67 54 6f 49 4e 20  .      chngToIN 
7660: 3d 20 30 3b 0a 20 20 20 20 20 20 70 41 6e 64 49  = 0;.      pAndI
7670: 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  nfo = sqlite3DbM
7680: 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a  allocRaw(db, siz
7690: 65 6f 66 28 2a 70 41 6e 64 49 6e 66 6f 29 29 3b  eof(*pAndInfo));
76a0: 0a 20 20 20 20 20 20 69 66 28 20 70 41 6e 64 49  .      if( pAndI
76b0: 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 57  nfo ){.        W
76c0: 68 65 72 65 43 6c 61 75 73 65 20 2a 70 41 6e 64  hereClause *pAnd
76d0: 57 43 3b 0a 20 20 20 20 20 20 20 20 57 68 65 72  WC;.        Wher
76e0: 65 54 65 72 6d 20 2a 70 41 6e 64 54 65 72 6d 3b  eTerm *pAndTerm;
76f0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a  .        int j;.
7700: 20 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20          Bitmask 
7710: 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70  b = 0;.        p
7720: 4f 72 54 65 72 6d 2d 3e 75 2e 70 41 6e 64 49 6e  OrTerm->u.pAndIn
7730: 66 6f 20 3d 20 70 41 6e 64 49 6e 66 6f 3b 0a 20  fo = pAndInfo;. 
7740: 20 20 20 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e         pOrTerm->
7750: 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f  wtFlags |= TERM_
7760: 41 4e 44 49 4e 46 4f 3b 0a 20 20 20 20 20 20 20  ANDINFO;.       
7770: 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61   pOrTerm->eOpera
7780: 74 6f 72 20 3d 20 57 4f 5f 41 4e 44 3b 0a 20 20  tor = WO_AND;.  
7790: 20 20 20 20 20 20 70 41 6e 64 57 43 20 3d 20 26        pAndWC = &
77a0: 70 41 6e 64 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20  pAndInfo->wc;.  
77b0: 20 20 20 20 20 20 77 68 65 72 65 43 6c 61 75 73        whereClaus
77c0: 65 49 6e 69 74 28 70 41 6e 64 57 43 2c 20 70 57  eInit(pAndWC, pW
77d0: 43 2d 3e 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20  C->pWInfo);.    
77e0: 20 20 20 20 77 68 65 72 65 53 70 6c 69 74 28 70      whereSplit(p
77f0: 41 6e 64 57 43 2c 20 70 4f 72 54 65 72 6d 2d 3e  AndWC, pOrTerm->
7800: 70 45 78 70 72 2c 20 54 4b 5f 41 4e 44 29 3b 0a  pExpr, TK_AND);.
7810: 20 20 20 20 20 20 20 20 65 78 70 72 41 6e 61 6c          exprAnal
7820: 79 7a 65 41 6c 6c 28 70 53 72 63 2c 20 70 41 6e  yzeAll(pSrc, pAn
7830: 64 57 43 29 3b 0a 20 20 20 20 20 20 20 20 70 41  dWC);.        pA
7840: 6e 64 57 43 2d 3e 70 4f 75 74 65 72 20 3d 20 70  ndWC->pOuter = p
7850: 57 43 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  WC;.        test
7860: 63 61 73 65 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63  case( db->malloc
7870: 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20  Failed );.      
7880: 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f    if( !db->mallo
7890: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20  cFailed ){.     
78a0: 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 41       for(j=0, pA
78b0: 6e 64 54 65 72 6d 3d 70 41 6e 64 57 43 2d 3e 61  ndTerm=pAndWC->a
78c0: 3b 20 6a 3c 70 41 6e 64 57 43 2d 3e 6e 54 65 72  ; j<pAndWC->nTer
78d0: 6d 3b 20 6a 2b 2b 2c 20 70 41 6e 64 54 65 72 6d  m; j++, pAndTerm
78e0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
78f0: 20 61 73 73 65 72 74 28 20 70 41 6e 64 54 65 72   assert( pAndTer
7900: 6d 2d 3e 70 45 78 70 72 20 29 3b 0a 20 20 20 20  m->pExpr );.    
7910: 20 20 20 20 20 20 20 20 69 66 28 20 61 6c 6c 6f          if( allo
7920: 77 65 64 4f 70 28 70 41 6e 64 54 65 72 6d 2d 3e  wedOp(pAndTerm->
7930: 70 45 78 70 72 2d 3e 6f 70 29 20 29 7b 0a 20 20  pExpr->op) ){.  
7940: 20 20 20 20 20 20 20 20 20 20 20 20 62 20 7c 3d              b |=
7950: 20 67 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f   getMask(&pWInfo
7960: 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 70 41 6e 64  ->sMaskSet, pAnd
7970: 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
7980: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
7990: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
79a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
79b0: 6e 64 65 78 61 62 6c 65 20 26 3d 20 62 3b 0a 20  ndexable &= b;. 
79c0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
79d0: 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 77 74   if( pOrTerm->wt
79e0: 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 50  Flags & TERM_COP
79f0: 49 45 44 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  IED ){.      /* 
7a00: 53 6b 69 70 20 74 68 69 73 20 74 65 72 6d 20 66  Skip this term f
7a10: 6f 72 20 6e 6f 77 2e 20 20 57 65 20 72 65 76 69  or now.  We revi
7a20: 73 69 74 20 69 74 20 77 68 65 6e 20 77 65 20 70  sit it when we p
7a30: 72 6f 63 65 73 73 20 74 68 65 0a 20 20 20 20 20  rocess the.     
7a40: 20 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e   ** correspondin
7a50: 67 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 74  g TERM_VIRTUAL t
7a60: 65 72 6d 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65  erm */.    }else
7a70: 7b 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20  {.      Bitmask 
7a80: 62 3b 0a 20 20 20 20 20 20 62 20 3d 20 67 65 74  b;.      b = get
7a90: 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d  Mask(&pWInfo->sM
7aa0: 61 73 6b 53 65 74 2c 20 70 4f 72 54 65 72 6d 2d  askSet, pOrTerm-
7ab0: 3e 6c 65 66 74 43 75 72 73 6f 72 29 3b 0a 20 20  >leftCursor);.  
7ac0: 20 20 20 20 69 66 28 20 70 4f 72 54 65 72 6d 2d      if( pOrTerm-
7ad0: 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
7ae0: 56 49 52 54 55 41 4c 20 29 7b 0a 20 20 20 20 20  VIRTUAL ){.     
7af0: 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f     WhereTerm *pO
7b00: 74 68 65 72 20 3d 20 26 70 4f 72 57 63 2d 3e 61  ther = &pOrWc->a
7b10: 5b 70 4f 72 54 65 72 6d 2d 3e 69 50 61 72 65 6e  [pOrTerm->iParen
7b20: 74 5d 3b 0a 20 20 20 20 20 20 20 20 62 20 7c 3d  t];.        b |=
7b30: 20 67 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f   getMask(&pWInfo
7b40: 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 70 4f 74 68  ->sMaskSet, pOth
7b50: 65 72 2d 3e 6c 65 66 74 43 75 72 73 6f 72 29 3b  er->leftCursor);
7b60: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
7b70: 6e 64 65 78 61 62 6c 65 20 26 3d 20 62 3b 0a 20  ndexable &= b;. 
7b80: 20 20 20 20 20 69 66 28 20 28 70 4f 72 54 65 72       if( (pOrTer
7b90: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
7ba0: 4f 5f 45 51 29 3d 3d 30 20 29 7b 0a 20 20 20 20  O_EQ)==0 ){.    
7bb0: 20 20 20 20 63 68 6e 67 54 6f 49 4e 20 3d 20 30      chngToIN = 0
7bc0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
7bd0: 20 20 20 20 20 20 20 63 68 6e 67 54 6f 49 4e 20         chngToIN 
7be0: 26 3d 20 62 3b 0a 20 20 20 20 20 20 7d 0a 20 20  &= b;.      }.  
7bf0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20    }.  }..  /*.  
7c00: 2a 2a 20 52 65 63 6f 72 64 20 74 68 65 20 73 65  ** Record the se
7c10: 74 20 6f 66 20 74 61 62 6c 65 73 20 74 68 61 74  t of tables that
7c20: 20 73 61 74 69 73 66 79 20 63 61 73 65 20 32 2e   satisfy case 2.
7c30: 20 20 54 68 65 20 73 65 74 20 6d 69 67 68 74 20    The set might 
7c40: 62 65 0a 20 20 2a 2a 20 65 6d 70 74 79 2e 0a 20  be.  ** empty.. 
7c50: 20 2a 2f 0a 20 20 70 4f 72 49 6e 66 6f 2d 3e 69   */.  pOrInfo->i
7c60: 6e 64 65 78 61 62 6c 65 20 3d 20 69 6e 64 65 78  ndexable = index
7c70: 61 62 6c 65 3b 0a 20 20 70 54 65 72 6d 2d 3e 65  able;.  pTerm->e
7c80: 4f 70 65 72 61 74 6f 72 20 3d 20 69 6e 64 65 78  Operator = index
7c90: 61 62 6c 65 3d 3d 30 20 3f 20 30 20 3a 20 57 4f  able==0 ? 0 : WO
7ca0: 5f 4f 52 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  _OR;..  /*.  ** 
7cb0: 63 68 6e 67 54 6f 49 4e 20 68 6f 6c 64 73 20 61  chngToIN holds a
7cc0: 20 73 65 74 20 6f 66 20 74 61 62 6c 65 73 20 74   set of tables t
7cd0: 68 61 74 20 2a 6d 69 67 68 74 2a 20 73 61 74 69  hat *might* sati
7ce0: 73 66 79 20 63 61 73 65 20 31 2e 20 20 42 75 74  sfy case 1.  But
7cf0: 0a 20 20 2a 2a 20 77 65 20 68 61 76 65 20 74 6f  .  ** we have to
7d00: 20 64 6f 20 73 6f 6d 65 20 61 64 64 69 74 69 6f   do some additio
7d10: 6e 61 6c 20 63 68 65 63 6b 69 6e 67 20 74 6f 20  nal checking to 
7d20: 73 65 65 20 69 66 20 63 61 73 65 20 31 20 72 65  see if case 1 re
7d30: 61 6c 6c 79 0a 20 20 2a 2a 20 69 73 20 73 61 74  ally.  ** is sat
7d40: 69 73 66 69 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a  isfied..  **.  *
7d50: 2a 20 63 68 6e 67 54 6f 49 4e 20 77 69 6c 6c 20  * chngToIN will 
7d60: 68 6f 6c 64 20 65 69 74 68 65 72 20 30 2c 20 31  hold either 0, 1
7d70: 2c 20 6f 72 20 32 20 62 69 74 73 2e 20 20 54 68  , or 2 bits.  Th
7d80: 65 20 30 2d 62 69 74 20 63 61 73 65 20 6d 65 61  e 0-bit case mea
7d90: 6e 73 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65  ns.  ** that the
7da0: 72 65 20 69 73 20 6e 6f 20 70 6f 73 73 69 62 69  re is no possibi
7db0: 6c 69 74 79 20 6f 66 20 74 72 61 6e 73 66 6f 72  lity of transfor
7dc0: 6d 69 6e 67 20 74 68 65 20 4f 52 20 63 6c 61 75  ming the OR clau
7dd0: 73 65 20 69 6e 74 6f 20 61 6e 0a 20 20 2a 2a 20  se into an.  ** 
7de0: 49 4e 20 6f 70 65 72 61 74 6f 72 20 62 65 63 61  IN operator beca
7df0: 75 73 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  use one or more 
7e00: 74 65 72 6d 73 20 69 6e 20 74 68 65 20 4f 52 20  terms in the OR 
7e10: 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 0a 20  clause contain. 
7e20: 20 2a 2a 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74   ** something ot
7e30: 68 65 72 20 74 68 61 6e 20 3d 3d 20 6f 6e 20 61  her than == on a
7e40: 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 73   column in the s
7e50: 69 6e 67 6c 65 20 74 61 62 6c 65 2e 20 20 54 68  ingle table.  Th
7e60: 65 20 31 2d 62 69 74 0a 20 20 2a 2a 20 63 61 73  e 1-bit.  ** cas
7e70: 65 20 6d 65 61 6e 73 20 74 68 61 74 20 65 76 65  e means that eve
7e80: 72 79 20 74 65 72 6d 20 6f 66 20 74 68 65 20 4f  ry term of the O
7e90: 52 20 63 6c 61 75 73 65 20 69 73 20 6f 66 20 74  R clause is of t
7ea0: 68 65 20 66 6f 72 6d 0a 20 20 2a 2a 20 22 74 61  he form.  ** "ta
7eb0: 62 6c 65 2e 63 6f 6c 75 6d 6e 3d 65 78 70 72 22  ble.column=expr"
7ec0: 20 66 6f 72 20 73 6f 6d 65 20 73 69 6e 67 6c 65   for some single
7ed0: 20 74 61 62 6c 65 2e 20 20 54 68 65 20 6f 6e 65   table.  The one
7ee0: 20 62 69 74 20 74 68 61 74 20 69 73 20 73 65 74   bit that is set
7ef0: 0a 20 20 2a 2a 20 77 69 6c 6c 20 63 6f 72 72 65  .  ** will corre
7f00: 73 70 6f 6e 64 20 74 6f 20 74 68 65 20 63 6f 6d  spond to the com
7f10: 6d 6f 6e 20 74 61 62 6c 65 2e 20 20 57 65 20 73  mon table.  We s
7f20: 74 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63 68 65  till need to che
7f30: 63 6b 20 74 6f 20 6d 61 6b 65 0a 20 20 2a 2a 20  ck to make.  ** 
7f40: 73 75 72 65 20 74 68 65 20 73 61 6d 65 20 63 6f  sure the same co
7f50: 6c 75 6d 6e 20 69 73 20 75 73 65 64 20 6f 6e 20  lumn is used on 
7f60: 61 6c 6c 20 74 65 72 6d 73 2e 20 20 54 68 65 20  all terms.  The 
7f70: 32 2d 62 69 74 20 63 61 73 65 20 69 73 20 77 68  2-bit case is wh
7f80: 65 6e 0a 20 20 2a 2a 20 74 68 65 20 61 6c 6c 20  en.  ** the all 
7f90: 74 65 72 6d 73 20 61 72 65 20 6f 66 20 74 68 65  terms are of the
7fa0: 20 66 6f 72 6d 20 22 74 61 62 6c 65 31 2e 63 6f   form "table1.co
7fb0: 6c 75 6d 6e 3d 74 61 62 6c 65 32 2e 63 6f 6c 75  lumn=table2.colu
7fc0: 6d 6e 22 2e 20 20 49 74 0a 20 20 2a 2a 20 6d 69  mn".  It.  ** mi
7fd0: 67 68 74 20 62 65 20 70 6f 73 73 69 62 6c 65 20  ght be possible 
7fe0: 74 6f 20 66 6f 72 6d 20 61 6e 20 49 4e 20 6f 70  to form an IN op
7ff0: 65 72 61 74 6f 72 20 77 69 74 68 20 65 69 74 68  erator with eith
8000: 65 72 20 74 61 62 6c 65 31 2e 63 6f 6c 75 6d 6e  er table1.column
8010: 0a 20 20 2a 2a 20 6f 72 20 74 61 62 6c 65 32 2e  .  ** or table2.
8020: 63 6f 6c 75 6d 6e 20 61 73 20 74 68 65 20 4c 48  column as the LH
8030: 53 20 69 66 20 65 69 74 68 65 72 20 69 73 20 63  S if either is c
8040: 6f 6d 6d 6f 6e 20 74 6f 20 65 76 65 72 79 20 74  ommon to every t
8050: 65 72 6d 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20  erm of.  ** the 
8060: 4f 52 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 0a  OR clause..  **.
8070: 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74    ** Note that t
8080: 65 72 6d 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  erms of the form
8090: 20 22 74 61 62 6c 65 2e 63 6f 6c 75 6d 6e 31 3d   "table.column1=
80a0: 74 61 62 6c 65 2e 63 6f 6c 75 6d 6e 32 22 20 28  table.column2" (
80b0: 74 68 65 0a 20 20 2a 2a 20 73 61 6d 65 20 74 61  the.  ** same ta
80c0: 62 6c 65 20 6f 6e 20 62 6f 74 68 20 73 69 7a 65  ble on both size
80d0: 73 20 6f 66 20 74 68 65 20 3d 3d 29 20 63 61 6e  s of the ==) can
80e0: 6e 6f 74 20 62 65 20 6f 70 74 69 6d 69 7a 65 64  not be optimized
80f0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 68 6e  ..  */.  if( chn
8100: 67 54 6f 49 4e 20 29 7b 0a 20 20 20 20 69 6e 74  gToIN ){.    int
8110: 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 3d 20   okToChngToIN = 
8120: 30 3b 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69  0;     /* True i
8130: 66 20 74 68 65 20 63 6f 6e 76 65 72 73 69 6f 6e  f the conversion
8140: 20 74 6f 20 49 4e 20 69 73 20 76 61 6c 69 64 20   to IN is valid 
8150: 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 75  */.    int iColu
8160: 6d 6e 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20  mn = -1;        
8170: 20 2f 2a 20 43 6f 6c 75 6d 6e 20 69 6e 64 65 78   /* Column index
8180: 20 6f 6e 20 6c 68 73 20 6f 66 20 49 4e 20 6f 70   on lhs of IN op
8190: 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 69 6e  erator */.    in
81a0: 74 20 69 43 75 72 73 6f 72 20 3d 20 2d 31 3b 20  t iCursor = -1; 
81b0: 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
81c0: 20 63 75 72 73 6f 72 20 63 6f 6d 6d 6f 6e 20 74   cursor common t
81d0: 6f 20 61 6c 6c 20 74 65 72 6d 73 20 2a 2f 0a 20  o all terms */. 
81e0: 20 20 20 69 6e 74 20 6a 20 3d 20 30 3b 20 20 20     int j = 0;   
81f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8200: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
8210: 0a 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66  .    /* Search f
8220: 6f 72 20 61 20 74 61 62 6c 65 20 61 6e 64 20 63  or a table and c
8230: 6f 6c 75 6d 6e 20 74 68 61 74 20 61 70 70 65 61  olumn that appea
8240: 72 73 20 6f 6e 20 6f 6e 65 20 73 69 64 65 20 6f  rs on one side o
8250: 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 74 68  r the.    ** oth
8260: 65 72 20 6f 66 20 74 68 65 20 3d 3d 20 6f 70 65  er of the == ope
8270: 72 61 74 6f 72 20 69 6e 20 65 76 65 72 79 20 73  rator in every s
8280: 75 62 74 65 72 6d 2e 20 20 54 68 61 74 20 74 61  ubterm.  That ta
8290: 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 0a 20  ble and column. 
82a0: 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65     ** will be re
82b0: 63 6f 72 64 65 64 20 69 6e 20 69 43 75 72 73 6f  corded in iCurso
82c0: 72 20 61 6e 64 20 69 43 6f 6c 75 6d 6e 2e 20 20  r and iColumn.  
82d0: 54 68 65 72 65 20 6d 69 67 68 74 20 6e 6f 74 20  There might not 
82e0: 62 65 20 61 6e 79 0a 20 20 20 20 2a 2a 20 73 75  be any.    ** su
82f0: 63 68 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c  ch table and col
8300: 75 6d 6e 2e 20 20 53 65 74 20 6f 6b 54 6f 43 68  umn.  Set okToCh
8310: 6e 67 54 6f 49 4e 20 69 66 20 61 6e 20 61 70 70  ngToIN if an app
8320: 72 6f 70 72 69 61 74 65 20 74 61 62 6c 65 0a 20  ropriate table. 
8330: 20 20 20 2a 2a 20 61 6e 64 20 63 6f 6c 75 6d 6e     ** and column
8340: 20 69 73 20 66 6f 75 6e 64 20 62 75 74 20 6c 65   is found but le
8350: 61 76 65 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e  ave okToChngToIN
8360: 20 66 61 6c 73 65 20 69 66 20 6e 6f 74 20 66 6f   false if not fo
8370: 75 6e 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  und..    */.    
8380: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 32 20 26 26 20  for(j=0; j<2 && 
8390: 21 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 3b 20 6a  !okToChngToIN; j
83a0: 2b 2b 29 7b 0a 20 20 20 20 20 20 70 4f 72 54 65  ++){.      pOrTe
83b0: 72 6d 20 3d 20 70 4f 72 57 63 2d 3e 61 3b 0a 20  rm = pOrWc->a;. 
83c0: 20 20 20 20 20 66 6f 72 28 69 3d 70 4f 72 57 63       for(i=pOrWc
83d0: 2d 3e 6e 54 65 72 6d 2d 31 3b 20 69 3e 3d 30 3b  ->nTerm-1; i>=0;
83e0: 20 69 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b 29   i--, pOrTerm++)
83f0: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
8400: 28 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72  ( pOrTerm->eOper
8410: 61 74 6f 72 20 26 20 57 4f 5f 45 51 20 29 3b 0a  ator & WO_EQ );.
8420: 20 20 20 20 20 20 20 20 70 4f 72 54 65 72 6d 2d          pOrTerm-
8430: 3e 77 74 46 6c 61 67 73 20 26 3d 20 7e 54 45 52  >wtFlags &= ~TER
8440: 4d 5f 4f 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  M_OR_OK;.       
8450: 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65   if( pOrTerm->le
8460: 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 73 6f  ftCursor==iCurso
8470: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  r ){.          /
8480: 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 32 2d  * This is the 2-
8490: 62 69 74 20 63 61 73 65 20 61 6e 64 20 77 65 20  bit case and we 
84a0: 61 72 65 20 6f 6e 20 74 68 65 20 73 65 63 6f 6e  are on the secon
84b0: 64 20 69 74 65 72 61 74 69 6f 6e 20 61 6e 64 0a  d iteration and.
84c0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 75 72            ** cur
84d0: 72 65 6e 74 20 74 65 72 6d 20 69 73 20 66 72 6f  rent term is fro
84e0: 6d 20 74 68 65 20 66 69 72 73 74 20 69 74 65 72  m the first iter
84f0: 61 74 69 6f 6e 2e 20 20 53 6f 20 73 6b 69 70 20  ation.  So skip 
8500: 74 68 69 73 20 74 65 72 6d 2e 20 2a 2f 0a 20 20  this term. */.  
8510: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
8520: 6a 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20  j==1 );.        
8530: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
8540: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
8550: 28 20 28 63 68 6e 67 54 6f 49 4e 20 26 20 67 65  ( (chngToIN & ge
8560: 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73  tMask(&pWInfo->s
8570: 4d 61 73 6b 53 65 74 2c 20 70 4f 72 54 65 72 6d  MaskSet, pOrTerm
8580: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 29 29 3d 3d  ->leftCursor))==
8590: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  0 ){.          /
85a0: 2a 20 54 68 69 73 20 74 65 72 6d 20 6d 75 73 74  * This term must
85b0: 20 62 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20   be of the form 
85c0: 74 31 2e 61 3d 3d 74 32 2e 62 20 77 68 65 72 65  t1.a==t2.b where
85d0: 20 74 32 20 69 73 20 69 6e 20 74 68 65 0a 20 20   t2 is in the.  
85e0: 20 20 20 20 20 20 20 20 2a 2a 20 63 68 6e 67 54          ** chngT
85f0: 6f 49 4e 20 73 65 74 20 62 75 74 20 74 31 20 69  oIN set but t1 i
8600: 73 20 6e 6f 74 2e 20 20 54 68 69 73 20 74 65 72  s not.  This ter
8610: 6d 20 77 69 6c 6c 20 62 65 20 65 69 74 68 65 72  m will be either
8620: 20 70 72 65 63 65 65 64 65 64 0a 20 20 20 20 20   preceeded.     
8630: 20 20 20 20 20 2a 2a 20 6f 72 20 66 6f 6c 6c 77       ** or follw
8640: 65 64 20 62 79 20 61 6e 20 69 6e 76 65 72 74 65  ed by an inverte
8650: 64 20 63 6f 70 79 20 28 74 32 2e 62 3d 3d 74 31  d copy (t2.b==t1
8660: 2e 61 29 2e 20 20 53 6b 69 70 20 74 68 69 73 20  .a).  Skip this 
8670: 74 65 72 6d 20 0a 20 20 20 20 20 20 20 20 20 20  term .          
8680: 2a 2a 20 61 6e 64 20 75 73 65 20 69 74 73 20 69  ** and use its i
8690: 6e 76 65 72 73 69 6f 6e 2e 20 2a 2f 0a 20 20 20  nversion. */.   
86a0: 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
86b0: 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67   pOrTerm->wtFlag
86c0: 73 20 26 20 54 45 52 4d 5f 43 4f 50 49 45 44 20  s & TERM_COPIED 
86d0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73  );.          tes
86e0: 74 63 61 73 65 28 20 70 4f 72 54 65 72 6d 2d 3e  tcase( pOrTerm->
86f0: 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
8700: 49 52 54 55 41 4c 20 29 3b 0a 20 20 20 20 20 20  IRTUAL );.      
8710: 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 72 54      assert( pOrT
8720: 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 28  erm->wtFlags & (
8730: 54 45 52 4d 5f 43 4f 50 49 45 44 7c 54 45 52 4d  TERM_COPIED|TERM
8740: 5f 56 49 52 54 55 41 4c 29 20 29 3b 0a 20 20 20  _VIRTUAL) );.   
8750: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
8760: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
8770: 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 70 4f 72     iColumn = pOr
8780: 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75  Term->u.leftColu
8790: 6d 6e 3b 0a 20 20 20 20 20 20 20 20 69 43 75 72  mn;.        iCur
87a0: 73 6f 72 20 3d 20 70 4f 72 54 65 72 6d 2d 3e 6c  sor = pOrTerm->l
87b0: 65 66 74 43 75 72 73 6f 72 3b 0a 20 20 20 20 20  eftCursor;.     
87c0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
87d0: 7d 0a 20 20 20 20 20 20 69 66 28 20 69 3c 30 20  }.      if( i<0 
87e0: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f  ){.        /* No
87f0: 20 63 61 6e 64 69 64 61 74 65 20 74 61 62 6c 65   candidate table
8800: 2b 63 6f 6c 75 6d 6e 20 77 61 73 20 66 6f 75 6e  +column was foun
8810: 64 2e 20 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c  d.  This can onl
8820: 79 20 6f 63 63 75 72 0a 20 20 20 20 20 20 20 20  y occur.        
8830: 2a 2a 20 6f 6e 20 74 68 65 20 73 65 63 6f 6e 64  ** on the second
8840: 20 69 74 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20   iteration */.  
8850: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6a 3d        assert( j=
8860: 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  =1 );.        as
8870: 73 65 72 74 28 20 49 73 50 6f 77 65 72 4f 66 54  sert( IsPowerOfT
8880: 77 6f 28 63 68 6e 67 54 6f 49 4e 29 20 29 3b 0a  wo(chngToIN) );.
8890: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
88a0: 63 68 6e 67 54 6f 49 4e 3d 3d 67 65 74 4d 61 73  chngToIN==getMas
88b0: 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b  k(&pWInfo->sMask
88c0: 53 65 74 2c 20 69 43 75 72 73 6f 72 29 20 29 3b  Set, iCursor) );
88d0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
88e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 74 65        }.      te
88f0: 73 74 63 61 73 65 28 20 6a 3d 3d 31 20 29 3b 0a  stcase( j==1 );.
8900: 0a 20 20 20 20 20 20 2f 2a 20 57 65 20 68 61 76  .      /* We hav
8910: 65 20 66 6f 75 6e 64 20 61 20 63 61 6e 64 69 64  e found a candid
8920: 61 74 65 20 74 61 62 6c 65 20 61 6e 64 20 63 6f  ate table and co
8930: 6c 75 6d 6e 2e 20 20 43 68 65 63 6b 20 74 6f 20  lumn.  Check to 
8940: 73 65 65 20 69 66 20 74 68 61 74 0a 20 20 20 20  see if that.    
8950: 20 20 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20 63    ** table and c
8960: 6f 6c 75 6d 6e 20 69 73 20 63 6f 6d 6d 6f 6e 20  olumn is common 
8970: 74 6f 20 65 76 65 72 79 20 74 65 72 6d 20 69 6e  to every term in
8980: 20 74 68 65 20 4f 52 20 63 6c 61 75 73 65 20 2a   the OR clause *
8990: 2f 0a 20 20 20 20 20 20 6f 6b 54 6f 43 68 6e 67  /.      okToChng
89a0: 54 6f 49 4e 20 3d 20 31 3b 0a 20 20 20 20 20 20  ToIN = 1;.      
89b0: 66 6f 72 28 3b 20 69 3e 3d 30 20 26 26 20 6f 6b  for(; i>=0 && ok
89c0: 54 6f 43 68 6e 67 54 6f 49 4e 3b 20 69 2d 2d 2c  ToChngToIN; i--,
89d0: 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20   pOrTerm++){.   
89e0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 72       assert( pOr
89f0: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
8a00: 26 20 57 4f 5f 45 51 20 29 3b 0a 20 20 20 20 20  & WO_EQ );.     
8a10: 20 20 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e     if( pOrTerm->
8a20: 6c 65 66 74 43 75 72 73 6f 72 21 3d 69 43 75 72  leftCursor!=iCur
8a30: 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  sor ){.         
8a40: 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67   pOrTerm->wtFlag
8a50: 73 20 26 3d 20 7e 54 45 52 4d 5f 4f 52 5f 4f 4b  s &= ~TERM_OR_OK
8a60: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
8a70: 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 75 2e 6c  if( pOrTerm->u.l
8a80: 65 66 74 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 75  eftColumn!=iColu
8a90: 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  mn ){.          
8aa0: 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 3d 20 30  okToChngToIN = 0
8ab0: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
8ac0: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 61  .          int a
8ad0: 66 66 4c 65 66 74 2c 20 61 66 66 52 69 67 68 74  ffLeft, affRight
8ae0: 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ;.          /* I
8af0: 66 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64  f the right-hand
8b00: 20 73 69 64 65 20 69 73 20 61 6c 73 6f 20 61 20   side is also a 
8b10: 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20 74 68 65  column, then the
8b20: 20 61 66 66 69 6e 69 74 69 65 73 0a 20 20 20 20   affinities.    
8b30: 20 20 20 20 20 20 2a 2a 20 6f 66 20 62 6f 74 68        ** of both
8b40: 20 72 69 67 68 74 20 61 6e 64 20 6c 65 66 74 20   right and left 
8b50: 73 69 64 65 73 20 6d 75 73 74 20 62 65 20 73 75  sides must be su
8b60: 63 68 20 74 68 61 74 20 6e 6f 20 74 79 70 65 0a  ch that no type.
8b70: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e            ** con
8b80: 76 65 72 73 69 6f 6e 73 20 61 72 65 20 72 65 71  versions are req
8b90: 75 69 72 65 64 20 6f 6e 20 74 68 65 20 72 69 67  uired on the rig
8ba0: 68 74 2e 20 20 28 54 69 63 6b 65 74 20 23 32 32  ht.  (Ticket #22
8bb0: 34 39 29 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  49).          */
8bc0: 0a 20 20 20 20 20 20 20 20 20 20 61 66 66 52 69  .          affRi
8bd0: 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ght = sqlite3Exp
8be0: 72 41 66 66 69 6e 69 74 79 28 70 4f 72 54 65 72  rAffinity(pOrTer
8bf0: 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74  m->pExpr->pRight
8c00: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 66 66  );.          aff
8c10: 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78  Left = sqlite3Ex
8c20: 70 72 41 66 66 69 6e 69 74 79 28 70 4f 72 54 65  prAffinity(pOrTe
8c30: 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 4c 65 66 74  rm->pExpr->pLeft
8c40: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
8c50: 20 61 66 66 52 69 67 68 74 21 3d 30 20 26 26 20   affRight!=0 && 
8c60: 61 66 66 52 69 67 68 74 21 3d 61 66 66 4c 65 66  affRight!=affLef
8c70: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t ){.           
8c80: 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 3d 20   okToChngToIN = 
8c90: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  0;.          }el
8ca0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
8cb0: 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  pOrTerm->wtFlags
8cc0: 20 7c 3d 20 54 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a   |= TERM_OR_OK;.
8cd0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
8ce0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
8cf0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74    }..    /* At t
8d00: 68 69 73 20 70 6f 69 6e 74 2c 20 6f 6b 54 6f 43  his point, okToC
8d10: 68 6e 67 54 6f 49 4e 20 69 73 20 74 72 75 65 20  hngToIN is true 
8d20: 69 66 20 6f 72 69 67 69 6e 61 6c 20 70 54 65 72  if original pTer
8d30: 6d 20 73 61 74 69 73 66 69 65 73 0a 20 20 20 20  m satisfies.    
8d40: 2a 2a 20 63 61 73 65 20 31 2e 20 20 49 6e 20 74  ** case 1.  In t
8d50: 68 61 74 20 63 61 73 65 2c 20 63 6f 6e 73 74 72  hat case, constr
8d60: 75 63 74 20 61 20 6e 65 77 20 76 69 72 74 75 61  uct a new virtua
8d70: 6c 20 74 65 72 6d 20 74 68 61 74 20 69 73 20 0a  l term that is .
8d80: 20 20 20 20 2a 2a 20 70 54 65 72 6d 20 63 6f 6e      ** pTerm con
8d90: 76 65 72 74 65 64 20 69 6e 74 6f 20 61 6e 20 49  verted into an I
8da0: 4e 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 20 20  N operator..    
8db0: 2a 2f 0a 20 20 20 20 69 66 28 20 6f 6b 54 6f 43  */.    if( okToC
8dc0: 68 6e 67 54 6f 49 4e 20 29 7b 0a 20 20 20 20 20  hngToIN ){.     
8dd0: 20 45 78 70 72 20 2a 70 44 75 70 3b 20 20 20 20   Expr *pDup;    
8de0: 20 20 20 20 20 20 20 20 2f 2a 20 41 20 74 72 61          /* A tra
8df0: 6e 73 69 65 6e 74 20 64 75 70 6c 69 63 61 74 65  nsient duplicate
8e00: 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20   expression */. 
8e10: 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70       ExprList *p
8e20: 4c 69 73 74 20 3d 20 30 3b 20 20 20 2f 2a 20 54  List = 0;   /* T
8e30: 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e  he RHS of the IN
8e40: 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20   operator */.   
8e50: 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d     Expr *pLeft =
8e60: 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65   0;       /* The
8e70: 20 4c 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f   LHS of the IN o
8e80: 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20  perator */.     
8e90: 20 45 78 70 72 20 2a 70 4e 65 77 3b 20 20 20 20   Expr *pNew;    
8ea0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
8eb0: 6f 6d 70 6c 65 74 65 20 49 4e 20 6f 70 65 72 61  omplete IN opera
8ec0: 74 6f 72 20 2a 2f 0a 0a 20 20 20 20 20 20 66 6f  tor */..      fo
8ed0: 72 28 69 3d 70 4f 72 57 63 2d 3e 6e 54 65 72 6d  r(i=pOrWc->nTerm
8ee0: 2d 31 2c 20 70 4f 72 54 65 72 6d 3d 70 4f 72 57  -1, pOrTerm=pOrW
8ef0: 63 2d 3e 61 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c  c->a; i>=0; i--,
8f00: 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20   pOrTerm++){.   
8f10: 20 20 20 20 20 69 66 28 20 28 70 4f 72 54 65 72       if( (pOrTer
8f20: 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
8f30: 4d 5f 4f 52 5f 4f 4b 29 3d 3d 30 20 29 20 63 6f  M_OR_OK)==0 ) co
8f40: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
8f50: 61 73 73 65 72 74 28 20 70 4f 72 54 65 72 6d 2d  assert( pOrTerm-
8f60: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
8f70: 45 51 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  EQ );.        as
8f80: 73 65 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e 6c  sert( pOrTerm->l
8f90: 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 73  eftCursor==iCurs
8fa0: 6f 72 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  or );.        as
8fb0: 73 65 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e 75  sert( pOrTerm->u
8fc0: 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3d 3d 69 43 6f  .leftColumn==iCo
8fd0: 6c 75 6d 6e 20 29 3b 0a 20 20 20 20 20 20 20 20  lumn );.        
8fe0: 70 44 75 70 20 3d 20 73 71 6c 69 74 65 33 45 78  pDup = sqlite3Ex
8ff0: 70 72 44 75 70 28 64 62 2c 20 70 4f 72 54 65 72  prDup(db, pOrTer
9000: 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74  m->pExpr->pRight
9010: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 4c  , 0);.        pL
9020: 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ist = sqlite3Exp
9030: 72 4c 69 73 74 41 70 70 65 6e 64 28 70 57 49 6e  rListAppend(pWIn
9040: 66 6f 2d 3e 70 50 61 72 73 65 2c 20 70 4c 69 73  fo->pParse, pLis
9050: 74 2c 20 70 44 75 70 29 3b 0a 20 20 20 20 20 20  t, pDup);.      
9060: 20 20 70 4c 65 66 74 20 3d 20 70 4f 72 54 65 72    pLeft = pOrTer
9070: 6d 2d 3e 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b  m->pExpr->pLeft;
9080: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
9090: 73 73 65 72 74 28 20 70 4c 65 66 74 21 3d 30 20  ssert( pLeft!=0 
90a0: 29 3b 0a 20 20 20 20 20 20 70 44 75 70 20 3d 20  );.      pDup = 
90b0: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
90c0: 62 2c 20 70 4c 65 66 74 2c 20 30 29 3b 0a 20 20  b, pLeft, 0);.  
90d0: 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74      pNew = sqlit
90e0: 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
90f0: 54 4b 5f 49 4e 2c 20 70 44 75 70 2c 20 30 2c 20  TK_IN, pDup, 0, 
9100: 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e  0);.      if( pN
9110: 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  ew ){.        in
9120: 74 20 69 64 78 4e 65 77 3b 0a 20 20 20 20 20 20  t idxNew;.      
9130: 20 20 74 72 61 6e 73 66 65 72 4a 6f 69 6e 4d 61    transferJoinMa
9140: 72 6b 69 6e 67 73 28 70 4e 65 77 2c 20 70 45 78  rkings(pNew, pEx
9150: 70 72 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  pr);.        ass
9160: 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
9170: 70 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 78  perty(pNew, EP_x
9180: 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20  IsSelect) );.   
9190: 20 20 20 20 20 70 4e 65 77 2d 3e 78 2e 70 4c 69       pNew->x.pLi
91a0: 73 74 20 3d 20 70 4c 69 73 74 3b 0a 20 20 20 20  st = pList;.    
91b0: 20 20 20 20 69 64 78 4e 65 77 20 3d 20 77 68 65      idxNew = whe
91c0: 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70  reClauseInsert(p
91d0: 57 43 2c 20 70 4e 65 77 2c 20 54 45 52 4d 5f 56  WC, pNew, TERM_V
91e0: 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41  IRTUAL|TERM_DYNA
91f0: 4d 49 43 29 3b 0a 20 20 20 20 20 20 20 20 74 65  MIC);.        te
9200: 73 74 63 61 73 65 28 20 69 64 78 4e 65 77 3d 3d  stcase( idxNew==
9210: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 65 78 70  0 );.        exp
9220: 72 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20 70  rAnalyze(pSrc, p
9230: 57 43 2c 20 69 64 78 4e 65 77 29 3b 0a 20 20 20  WC, idxNew);.   
9240: 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57       pTerm = &pW
9250: 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20  C->a[idxTerm];. 
9260: 20 20 20 20 20 20 20 70 57 43 2d 3e 61 5b 69 64         pWC->a[id
9270: 78 4e 65 77 5d 2e 69 50 61 72 65 6e 74 20 3d 20  xNew].iParent = 
9280: 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 20 20 20  idxTerm;.       
9290: 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d   pTerm->nChild =
92a0: 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   1;.      }else{
92b0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
92c0: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
92d0: 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 20 20 20  b, pList);.     
92e0: 20 7d 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e   }.      pTerm->
92f0: 65 4f 70 65 72 61 74 6f 72 20 3d 20 57 4f 5f 4e  eOperator = WO_N
9300: 4f 4f 50 3b 20 20 2f 2a 20 63 61 73 65 20 31 20  OOP;  /* case 1 
9310: 74 72 75 6d 70 73 20 63 61 73 65 20 32 20 2a 2f  trumps case 2 */
9320: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e  .    }.  }.}.#en
9330: 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f  dif /* !SQLITE_O
9340: 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54  MIT_OR_OPTIMIZAT
9350: 49 4f 4e 20 26 26 20 21 53 51 4c 49 54 45 5f 4f  ION && !SQLITE_O
9360: 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a  MIT_SUBQUERY */.
9370: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 6e 70 75 74  ./*.** The input
9380: 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   to this routine
9390: 20 69 73 20 61 6e 20 57 68 65 72 65 54 65 72 6d   is an WhereTerm
93a0: 20 73 74 72 75 63 74 75 72 65 20 77 69 74 68 20   structure with 
93b0: 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 22 70 45 78  only the.** "pEx
93c0: 70 72 22 20 66 69 65 6c 64 20 66 69 6c 6c 65 64  pr" field filled
93d0: 20 69 6e 2e 20 20 54 68 65 20 6a 6f 62 20 6f 66   in.  The job of
93e0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
93f0: 20 74 6f 20 61 6e 61 6c 79 7a 65 20 74 68 65 0a   to analyze the.
9400: 2a 2a 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  ** subexpression
9410: 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 20 61 6c   and populate al
9420: 6c 20 74 68 65 20 6f 74 68 65 72 20 66 69 65 6c  l the other fiel
9430: 64 73 20 6f 66 20 74 68 65 20 57 68 65 72 65 54  ds of the WhereT
9440: 65 72 6d 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  erm.** structure
9450: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65  ..**.** If the e
9460: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6f 66 20  xpression is of 
9470: 74 68 65 20 66 6f 72 6d 20 22 3c 65 78 70 72 3e  the form "<expr>
9480: 20 3c 6f 70 3e 20 58 22 20 69 74 20 67 65 74 73   <op> X" it gets
9490: 20 63 6f 6d 6d 75 74 65 64 0a 2a 2a 20 74 6f 20   commuted.** to 
94a0: 74 68 65 20 73 74 61 6e 64 61 72 64 20 66 6f 72  the standard for
94b0: 6d 20 6f 66 20 22 58 20 3c 6f 70 3e 20 3c 65 78  m of "X <op> <ex
94c0: 70 72 3e 22 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  pr>"..**.** If t
94d0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
94e0: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 58 20   of the form "X 
94f0: 3c 6f 70 3e 20 59 22 20 77 68 65 72 65 20 62 6f  <op> Y" where bo
9500: 74 68 20 58 20 61 6e 64 20 59 20 61 72 65 0a 2a  th X and Y are.*
9510: 2a 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20  * columns, then 
9520: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 65 78 70  the original exp
9530: 72 65 73 73 69 6f 6e 20 69 73 20 75 6e 63 68 61  ression is uncha
9540: 6e 67 65 64 20 61 6e 64 20 61 20 6e 65 77 20 76  nged and a new v
9550: 69 72 74 75 61 6c 0a 2a 2a 20 74 65 72 6d 20 6f  irtual.** term o
9560: 66 20 74 68 65 20 66 6f 72 6d 20 22 59 20 3c 6f  f the form "Y <o
9570: 70 3e 20 58 22 20 69 73 20 61 64 64 65 64 20 74  p> X" is added t
9580: 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  o the WHERE clau
9590: 73 65 20 61 6e 64 0a 2a 2a 20 61 6e 61 6c 79 7a  se and.** analyz
95a0: 65 64 20 73 65 70 61 72 61 74 65 6c 79 2e 20 20  ed separately.  
95b0: 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 74 65 72  The original ter
95c0: 6d 20 69 73 20 6d 61 72 6b 65 64 20 77 69 74 68  m is marked with
95d0: 20 54 45 52 4d 5f 43 4f 50 49 45 44 0a 2a 2a 20   TERM_COPIED.** 
95e0: 61 6e 64 20 74 68 65 20 6e 65 77 20 74 65 72 6d  and the new term
95f0: 20 69 73 20 6d 61 72 6b 65 64 20 77 69 74 68 20   is marked with 
9600: 54 45 52 4d 5f 44 59 4e 41 4d 49 43 20 28 62 65  TERM_DYNAMIC (be
9610: 63 61 75 73 65 20 69 74 27 73 20 70 45 78 70 72  cause it's pExpr
9620: 0a 2a 2a 20 6e 65 65 64 73 20 74 6f 20 62 65 20  .** needs to be 
9630: 66 72 65 65 64 20 77 69 74 68 20 74 68 65 20 57  freed with the W
9640: 68 65 72 65 43 6c 61 75 73 65 29 20 61 6e 64 20  hereClause) and 
9650: 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 28 62 65  TERM_VIRTUAL (be
9660: 63 61 75 73 65 20 69 74 0a 2a 2a 20 69 73 20 61  cause it.** is a
9670: 20 63 6f 6d 6d 75 74 65 64 20 63 6f 70 79 20 6f   commuted copy o
9680: 66 20 61 20 70 72 69 6f 72 20 74 65 72 6d 2e 29  f a prior term.)
9690: 20 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 74    The original t
96a0: 65 72 6d 20 68 61 73 20 6e 43 68 69 6c 64 3d 31  erm has nChild=1
96b0: 0a 2a 2a 20 61 6e 64 20 74 68 65 20 63 6f 70 79  .** and the copy
96c0: 20 68 61 73 20 69 64 78 50 61 72 65 6e 74 20 73   has idxParent s
96d0: 65 74 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20  et to the index 
96e0: 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  of the original 
96f0: 74 65 72 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  term..*/.static 
9700: 76 6f 69 64 20 65 78 70 72 41 6e 61 6c 79 7a 65  void exprAnalyze
9710: 28 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72  (.  SrcList *pSr
9720: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  c,            /*
9730: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
9740: 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
9750: 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20  e *pWC,         
9760: 2f 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  /* the WHERE cla
9770: 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78  use */.  int idx
9780: 54 65 72 6d 20 20 20 20 20 20 20 20 20 20 20 20  Term            
9790: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74     /* Index of t
97a0: 68 65 20 74 65 72 6d 20 74 6f 20 62 65 20 61 6e  he term to be an
97b0: 61 6c 79 7a 65 64 20 2a 2f 0a 29 7b 0a 20 20 57  alyzed */.){.  W
97c0: 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
97d0: 20 3d 20 70 57 43 2d 3e 70 57 49 6e 66 6f 3b 20   = pWC->pWInfo; 
97e0: 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  /* WHERE clause 
97f0: 70 72 6f 63 65 73 73 69 6e 67 20 63 6f 6e 74 65  processing conte
9800: 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  xt */.  WhereTer
9810: 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20  m *pTerm;       
9820: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
9830: 74 65 72 6d 20 74 6f 20 62 65 20 61 6e 61 6c 79  term to be analy
9840: 7a 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 4d 61  zed */.  WhereMa
9850: 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 3b  skSet *pMaskSet;
9860: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74            /* Set
9870: 20 6f 66 20 74 61 62 6c 65 20 69 6e 64 65 78 20   of table index 
9880: 6d 61 73 6b 73 20 2a 2f 0a 20 20 45 78 70 72 20  masks */.  Expr 
9890: 2a 70 45 78 70 72 3b 20 20 20 20 20 20 20 20 20  *pExpr;         
98a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
98b0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f  he expression to
98c0: 20 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a   be analyzed */.
98d0: 20 20 42 69 74 6d 61 73 6b 20 70 72 65 72 65 71    Bitmask prereq
98e0: 4c 65 66 74 3b 20 20 20 20 20 20 20 20 20 20 20  Left;           
98f0: 20 20 20 2f 2a 20 50 72 65 72 65 71 75 65 73 69     /* Prerequesi
9900: 74 65 73 20 6f 66 20 74 68 65 20 70 45 78 70 72  tes of the pExpr
9910: 2d 3e 70 4c 65 66 74 20 2a 2f 0a 20 20 42 69 74  ->pLeft */.  Bit
9920: 6d 61 73 6b 20 70 72 65 72 65 71 41 6c 6c 3b 20  mask prereqAll; 
9930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9940: 20 50 72 65 72 65 71 75 65 73 69 74 65 73 20 6f   Prerequesites o
9950: 66 20 70 45 78 70 72 20 2a 2f 0a 20 20 42 69 74  f pExpr */.  Bit
9960: 6d 61 73 6b 20 65 78 74 72 61 52 69 67 68 74 20  mask extraRight 
9970: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  = 0;          /*
9980: 20 45 78 74 72 61 20 64 65 70 65 6e 64 65 6e 63   Extra dependenc
9990: 69 65 73 20 6f 6e 20 4c 45 46 54 20 4a 4f 49 4e  ies on LEFT JOIN
99a0: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 53 74 72   */.  Expr *pStr
99b0: 31 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  1 = 0;          
99c0: 20 20 20 20 20 20 20 2f 2a 20 52 48 53 20 6f 66         /* RHS of
99d0: 20 4c 49 4b 45 2f 47 4c 4f 42 20 6f 70 65 72 61   LIKE/GLOB opera
99e0: 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43  tor */.  int isC
99f0: 6f 6d 70 6c 65 74 65 20 3d 20 30 3b 20 20 20 20  omplete = 0;    
9a00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 48 53            /* RHS
9a10: 20 6f 66 20 4c 49 4b 45 2f 47 4c 4f 42 20 65 6e   of LIKE/GLOB en
9a20: 64 73 20 77 69 74 68 20 77 69 6c 64 63 61 72 64  ds with wildcard
9a30: 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43 61 73 65   */.  int noCase
9a40: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
9a50: 20 20 20 20 20 20 20 2f 2a 20 4c 49 4b 45 2f 47         /* LIKE/G
9a60: 4c 4f 42 20 64 69 73 74 69 6e 67 75 69 73 68 65  LOB distinguishe
9a70: 73 20 63 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20  s case */.  int 
9a80: 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  op;             
9a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9aa0: 54 6f 70 2d 6c 65 76 65 6c 20 6f 70 65 72 61 74  Top-level operat
9ab0: 6f 72 2e 20 20 70 45 78 70 72 2d 3e 6f 70 20 2a  or.  pExpr->op *
9ac0: 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  /.  Parse *pPars
9ad0: 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72  e = pWInfo->pPar
9ae0: 73 65 3b 20 20 2f 2a 20 50 61 72 73 69 6e 67 20  se;  /* Parsing 
9af0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73 71 6c  context */.  sql
9b00: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
9b10: 65 2d 3e 64 62 3b 20 20 20 20 20 20 20 20 2f 2a  e->db;        /*
9b20: 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
9b30: 74 69 6f 6e 20 2a 2f 0a 0a 20 20 69 66 28 20 64  tion */..  if( d
9b40: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
9b50: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  ){.    return;. 
9b60: 20 7d 0a 20 20 70 54 65 72 6d 20 3d 20 26 70 57   }.  pTerm = &pW
9b70: 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20  C->a[idxTerm];. 
9b80: 20 70 4d 61 73 6b 53 65 74 20 3d 20 26 70 57 49   pMaskSet = &pWI
9b90: 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 3b 0a 20  nfo->sMaskSet;. 
9ba0: 20 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e   pExpr = pTerm->
9bb0: 70 45 78 70 72 3b 0a 20 20 61 73 73 65 72 74 28  pExpr;.  assert(
9bc0: 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41   pExpr->op!=TK_A
9bd0: 53 20 26 26 20 70 45 78 70 72 2d 3e 6f 70 21 3d  S && pExpr->op!=
9be0: 54 4b 5f 43 4f 4c 4c 41 54 45 20 29 3b 0a 20 20  TK_COLLATE );.  
9bf0: 70 72 65 72 65 71 4c 65 66 74 20 3d 20 65 78 70  prereqLeft = exp
9c00: 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  rTableUsage(pMas
9c10: 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 70 4c 65  kSet, pExpr->pLe
9c20: 66 74 29 3b 0a 20 20 6f 70 20 3d 20 70 45 78 70  ft);.  op = pExp
9c30: 72 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d  r->op;.  if( op=
9c40: 3d 54 4b 5f 49 4e 20 29 7b 0a 20 20 20 20 61 73  =TK_IN ){.    as
9c50: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 52 69  sert( pExpr->pRi
9c60: 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66  ght==0 );.    if
9c70: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
9c80: 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
9c90: 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20  elect) ){.      
9ca0: 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
9cb0: 68 74 20 3d 20 65 78 70 72 53 65 6c 65 63 74 54  ht = exprSelectT
9cc0: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
9cd0: 65 74 2c 20 70 45 78 70 72 2d 3e 78 2e 70 53 65  et, pExpr->x.pSe
9ce0: 6c 65 63 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65  lect);.    }else
9cf0: 7b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 70  {.      pTerm->p
9d00: 72 65 72 65 71 52 69 67 68 74 20 3d 20 65 78 70  rereqRight = exp
9d10: 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65 28  rListTableUsage(
9d20: 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d  pMaskSet, pExpr-
9d30: 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20 7d  >x.pList);.    }
9d40: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d  .  }else if( op=
9d50: 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20  =TK_ISNULL ){.  
9d60: 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52    pTerm->prereqR
9d70: 69 67 68 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  ight = 0;.  }els
9d80: 65 7b 0a 20 20 20 20 70 54 65 72 6d 2d 3e 70 72  e{.    pTerm->pr
9d90: 65 72 65 71 52 69 67 68 74 20 3d 20 65 78 70 72  ereqRight = expr
9da0: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
9db0: 53 65 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  Set, pExpr->pRig
9dc0: 68 74 29 3b 0a 20 20 7d 0a 20 20 70 72 65 72 65  ht);.  }.  prere
9dd0: 71 41 6c 6c 20 3d 20 65 78 70 72 54 61 62 6c 65  qAll = exprTable
9de0: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
9df0: 70 45 78 70 72 29 3b 0a 20 20 69 66 28 20 45 78  pExpr);.  if( Ex
9e00: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
9e10: 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  xpr, EP_FromJoin
9e20: 29 20 29 7b 0a 20 20 20 20 42 69 74 6d 61 73 6b  ) ){.    Bitmask
9e30: 20 78 20 3d 20 67 65 74 4d 61 73 6b 28 70 4d 61   x = getMask(pMa
9e40: 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 69 52  skSet, pExpr->iR
9e50: 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 29 3b 0a  ightJoinTable);.
9e60: 20 20 20 20 70 72 65 72 65 71 41 6c 6c 20 7c 3d      prereqAll |=
9e70: 20 78 3b 0a 20 20 20 20 65 78 74 72 61 52 69 67   x;.    extraRig
9e80: 68 74 20 3d 20 78 2d 31 3b 20 20 2f 2a 20 4f 4e  ht = x-1;  /* ON
9e90: 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 6d 61   clause terms ma
9ea0: 79 20 6e 6f 74 20 62 65 20 75 73 65 64 20 77 69  y not be used wi
9eb0: 74 68 20 61 6e 20 69 6e 64 65 78 0a 20 20 20 20  th an index.    
9ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ed0: 20 20 20 2a 2a 20 6f 6e 20 6c 65 66 74 20 74 61     ** on left ta
9ee0: 62 6c 65 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f  ble of a LEFT JO
9ef0: 49 4e 2e 20 20 54 69 63 6b 65 74 20 23 33 30 31  IN.  Ticket #301
9f00: 35 20 2a 2f 0a 20 20 7d 0a 20 20 70 54 65 72 6d  5 */.  }.  pTerm
9f10: 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20 70 72  ->prereqAll = pr
9f20: 65 72 65 71 41 6c 6c 3b 0a 20 20 70 54 65 72 6d  ereqAll;.  pTerm
9f30: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 2d  ->leftCursor = -
9f40: 31 3b 0a 20 20 70 54 65 72 6d 2d 3e 69 50 61 72  1;.  pTerm->iPar
9f50: 65 6e 74 20 3d 20 2d 31 3b 0a 20 20 70 54 65 72  ent = -1;.  pTer
9f60: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 30  m->eOperator = 0
9f70: 3b 0a 20 20 69 66 28 20 61 6c 6c 6f 77 65 64 4f  ;.  if( allowedO
9f80: 70 28 6f 70 29 20 29 7b 0a 20 20 20 20 45 78 70  p(op) ){.    Exp
9f90: 72 20 2a 70 4c 65 66 74 20 3d 20 73 71 6c 69 74  r *pLeft = sqlit
9fa0: 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74  e3ExprSkipCollat
9fb0: 65 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  e(pExpr->pLeft);
9fc0: 0a 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68  .    Expr *pRigh
9fd0: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53  t = sqlite3ExprS
9fe0: 6b 69 70 43 6f 6c 6c 61 74 65 28 70 45 78 70 72  kipCollate(pExpr
9ff0: 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 75  ->pRight);.    u
a000: 31 36 20 6f 70 4d 61 73 6b 20 3d 20 28 70 54 65  16 opMask = (pTe
a010: 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20  rm->prereqRight 
a020: 26 20 70 72 65 72 65 71 4c 65 66 74 29 3d 3d 30  & prereqLeft)==0
a030: 20 3f 20 57 4f 5f 41 4c 4c 20 3a 20 57 4f 5f 45   ? WO_ALL : WO_E
a040: 51 55 49 56 3b 0a 20 20 20 20 69 66 28 20 70 4c  QUIV;.    if( pL
a050: 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  eft->op==TK_COLU
a060: 4d 4e 20 29 7b 0a 20 20 20 20 20 20 70 54 65 72  MN ){.      pTer
a070: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20  m->leftCursor = 
a080: 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20  pLeft->iTable;. 
a090: 20 20 20 20 20 70 54 65 72 6d 2d 3e 75 2e 6c 65       pTerm->u.le
a0a0: 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66 74  ftColumn = pLeft
a0b0: 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  ->iColumn;.     
a0c0: 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
a0d0: 72 20 3d 20 6f 70 65 72 61 74 6f 72 4d 61 73 6b  r = operatorMask
a0e0: 28 6f 70 29 20 26 20 6f 70 4d 61 73 6b 3b 0a 20  (op) & opMask;. 
a0f0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 52 69     }.    if( pRi
a100: 67 68 74 20 26 26 20 70 52 69 67 68 74 2d 3e 6f  ght && pRight->o
a110: 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a  p==TK_COLUMN ){.
a120: 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20        WhereTerm 
a130: 2a 70 4e 65 77 3b 0a 20 20 20 20 20 20 45 78 70  *pNew;.      Exp
a140: 72 20 2a 70 44 75 70 3b 0a 20 20 20 20 20 20 75  r *pDup;.      u
a150: 31 36 20 65 45 78 74 72 61 4f 70 20 3d 20 30 3b  16 eExtraOp = 0;
a160: 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61          /* Extra
a170: 20 62 69 74 73 20 66 6f 72 20 70 4e 65 77 2d 3e   bits for pNew->
a180: 65 4f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20  eOperator */.   
a190: 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65     if( pTerm->le
a1a0: 66 74 43 75 72 73 6f 72 3e 3d 30 20 29 7b 0a 20  ftCursor>=0 ){. 
a1b0: 20 20 20 20 20 20 20 69 6e 74 20 69 64 78 4e 65         int idxNe
a1c0: 77 3b 0a 20 20 20 20 20 20 20 20 70 44 75 70 20  w;.        pDup 
a1d0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
a1e0: 28 64 62 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a  (db, pExpr, 0);.
a1f0: 20 20 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e          if( db->
a200: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
a210: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
a220: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
a230: 70 44 75 70 29 3b 0a 20 20 20 20 20 20 20 20 20  pDup);.         
a240: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20   return;.       
a250: 20 7d 0a 20 20 20 20 20 20 20 20 69 64 78 4e 65   }.        idxNe
a260: 77 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49  w = whereClauseI
a270: 6e 73 65 72 74 28 70 57 43 2c 20 70 44 75 70 2c  nsert(pWC, pDup,
a280: 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45   TERM_VIRTUAL|TE
a290: 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20  RM_DYNAMIC);.   
a2a0: 20 20 20 20 20 69 66 28 20 69 64 78 4e 65 77 3d       if( idxNew=
a2b0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  =0 ) return;.   
a2c0: 20 20 20 20 20 70 4e 65 77 20 3d 20 26 70 57 43       pNew = &pWC
a2d0: 2d 3e 61 5b 69 64 78 4e 65 77 5d 3b 0a 20 20 20  ->a[idxNew];.   
a2e0: 20 20 20 20 20 70 4e 65 77 2d 3e 69 50 61 72 65       pNew->iPare
a2f0: 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20  nt = idxTerm;.  
a300: 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70        pTerm = &p
a310: 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a  WC->a[idxTerm];.
a320: 20 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 6e          pTerm->n
a330: 43 68 69 6c 64 20 3d 20 31 3b 0a 20 20 20 20 20  Child = 1;.     
a340: 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67     pTerm->wtFlag
a350: 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 50 49 45 44  s |= TERM_COPIED
a360: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 45  ;.        if( pE
a370: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 0a 20  xpr->op==TK_EQ. 
a380: 20 20 20 20 20 20 20 20 26 26 20 21 45 78 70 72          && !Expr
a390: 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
a3a0: 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 0a  r, EP_FromJoin).
a3b0: 20 20 20 20 20 20 20 20 20 26 26 20 4f 70 74 69           && Opti
a3c0: 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28  mizationEnabled(
a3d0: 64 62 2c 20 53 51 4c 49 54 45 5f 54 72 61 6e 73  db, SQLITE_Trans
a3e0: 69 74 69 76 65 29 0a 20 20 20 20 20 20 20 20 29  itive).        )
a3f0: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 54 65 72  {.          pTer
a400: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 7c 3d 20  m->eOperator |= 
a410: 57 4f 5f 45 51 55 49 56 3b 0a 20 20 20 20 20 20  WO_EQUIV;.      
a420: 20 20 20 20 65 45 78 74 72 61 4f 70 20 3d 20 57      eExtraOp = W
a430: 4f 5f 45 51 55 49 56 3b 0a 20 20 20 20 20 20 20  O_EQUIV;.       
a440: 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
a450: 20 20 20 20 20 20 20 20 70 44 75 70 20 3d 20 70          pDup = p
a460: 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 70 4e  Expr;.        pN
a470: 65 77 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20  ew = pTerm;.    
a480: 20 20 7d 0a 20 20 20 20 20 20 65 78 70 72 43 6f    }.      exprCo
a490: 6d 6d 75 74 65 28 70 50 61 72 73 65 2c 20 70 44  mmute(pParse, pD
a4a0: 75 70 29 3b 0a 20 20 20 20 20 20 70 4c 65 66 74  up);.      pLeft
a4b0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b   = sqlite3ExprSk
a4c0: 69 70 43 6f 6c 6c 61 74 65 28 70 44 75 70 2d 3e  ipCollate(pDup->
a4d0: 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 70 4e  pLeft);.      pN
a4e0: 65 77 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d  ew->leftCursor =
a4f0: 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a   pLeft->iTable;.
a500: 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 6c 65        pNew->u.le
a510: 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66 74  ftColumn = pLeft
a520: 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  ->iColumn;.     
a530: 20 74 65 73 74 63 61 73 65 28 20 28 70 72 65 72   testcase( (prer
a540: 65 71 4c 65 66 74 20 7c 20 65 78 74 72 61 52 69  eqLeft | extraRi
a550: 67 68 74 29 20 21 3d 20 70 72 65 72 65 71 4c 65  ght) != prereqLe
a560: 66 74 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77  ft );.      pNew
a570: 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d 20  ->prereqRight = 
a580: 70 72 65 72 65 71 4c 65 66 74 20 7c 20 65 78 74  prereqLeft | ext
a590: 72 61 52 69 67 68 74 3b 0a 20 20 20 20 20 20 70  raRight;.      p
a5a0: 4e 65 77 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d  New->prereqAll =
a5b0: 20 70 72 65 72 65 71 41 6c 6c 3b 0a 20 20 20 20   prereqAll;.    
a5c0: 20 20 70 4e 65 77 2d 3e 65 4f 70 65 72 61 74 6f    pNew->eOperato
a5d0: 72 20 3d 20 28 6f 70 65 72 61 74 6f 72 4d 61 73  r = (operatorMas
a5e0: 6b 28 70 44 75 70 2d 3e 6f 70 29 20 2b 20 65 45  k(pDup->op) + eE
a5f0: 78 74 72 61 4f 70 29 20 26 20 6f 70 4d 61 73 6b  xtraOp) & opMask
a600: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66  ;.    }.  }..#if
a610: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
a620: 5f 42 45 54 57 45 45 4e 5f 4f 50 54 49 4d 49 5a  _BETWEEN_OPTIMIZ
a630: 41 54 49 4f 4e 0a 20 20 2f 2a 20 49 66 20 61 20  ATION.  /* If a 
a640: 74 65 72 6d 20 69 73 20 74 68 65 20 42 45 54 57  term is the BETW
a650: 45 45 4e 20 6f 70 65 72 61 74 6f 72 2c 20 63 72  EEN operator, cr
a660: 65 61 74 65 20 74 77 6f 20 6e 65 77 20 76 69 72  eate two new vir
a670: 74 75 61 6c 20 74 65 72 6d 73 0a 20 20 2a 2a 20  tual terms.  ** 
a680: 74 68 61 74 20 64 65 66 69 6e 65 20 74 68 65 20  that define the 
a690: 72 61 6e 67 65 20 74 68 61 74 20 74 68 65 20 42  range that the B
a6a0: 45 54 57 45 45 4e 20 69 6d 70 6c 65 6d 65 6e 74  ETWEEN implement
a6b0: 73 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a  s.  For example:
a6c0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20  .  **.  **      
a6d0: 61 20 42 45 54 57 45 45 4e 20 62 20 41 4e 44 20  a BETWEEN b AND 
a6e0: 63 0a 20 20 2a 2a 0a 20 20 2a 2a 20 69 73 20 63  c.  **.  ** is c
a6f0: 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 3a 0a 20  onverted into:. 
a700: 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 28 61   **.  **      (a
a710: 20 42 45 54 57 45 45 4e 20 62 20 41 4e 44 20 63   BETWEEN b AND c
a720: 29 20 41 4e 44 20 28 61 3e 3d 62 29 20 41 4e 44  ) AND (a>=b) AND
a730: 20 28 61 3c 3d 63 29 0a 20 20 2a 2a 0a 20 20 2a   (a<=c).  **.  *
a740: 2a 20 54 68 65 20 74 77 6f 20 6e 65 77 20 74 65  * The two new te
a750: 72 6d 73 20 61 72 65 20 61 64 64 65 64 20 6f 6e  rms are added on
a760: 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
a770: 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 6f 62  e WhereClause ob
a780: 6a 65 63 74 2e 0a 20 20 2a 2a 20 54 68 65 20 6e  ject..  ** The n
a790: 65 77 20 74 65 72 6d 73 20 61 72 65 20 22 64 79  ew terms are "dy
a7a0: 6e 61 6d 69 63 22 20 61 6e 64 20 61 72 65 20 63  namic" and are c
a7b0: 68 69 6c 64 72 65 6e 20 6f 66 20 74 68 65 20 6f  hildren of the o
a7c0: 72 69 67 69 6e 61 6c 20 42 45 54 57 45 45 4e 0a  riginal BETWEEN.
a7d0: 20 20 2a 2a 20 74 65 72 6d 2e 20 20 54 68 61 74    ** term.  That
a7e0: 20 6d 65 61 6e 73 20 74 68 61 74 20 69 66 20 74   means that if t
a7f0: 68 65 20 42 45 54 57 45 45 4e 20 74 65 72 6d 20  he BETWEEN term 
a800: 69 73 20 63 6f 64 65 64 2c 20 74 68 65 20 63 68  is coded, the ch
a810: 69 6c 64 72 65 6e 20 61 72 65 0a 20 20 2a 2a 20  ildren are.  ** 
a820: 73 6b 69 70 70 65 64 2e 20 20 4f 72 2c 20 69 66  skipped.  Or, if
a830: 20 74 68 65 20 63 68 69 6c 64 72 65 6e 20 61 72   the children ar
a840: 65 20 73 61 74 69 73 66 69 65 64 20 62 79 20 61  e satisfied by a
a850: 6e 20 69 6e 64 65 78 2c 20 74 68 65 20 6f 72 69  n index, the ori
a860: 67 69 6e 61 6c 0a 20 20 2a 2a 20 42 45 54 57 45  ginal.  ** BETWE
a870: 45 4e 20 74 65 72 6d 20 69 73 20 73 6b 69 70 70  EN term is skipp
a880: 65 64 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 20  ed..  */.  else 
a890: 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  if( pExpr->op==T
a8a0: 4b 5f 42 45 54 57 45 45 4e 20 26 26 20 70 57 43  K_BETWEEN && pWC
a8b0: 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 7b 0a  ->op==TK_AND ){.
a8c0: 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c      ExprList *pL
a8d0: 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  ist = pExpr->x.p
a8e0: 4c 69 73 74 3b 0a 20 20 20 20 69 6e 74 20 69 3b  List;.    int i;
a8f0: 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73  .    static cons
a900: 74 20 75 38 20 6f 70 73 5b 5d 20 3d 20 7b 54 4b  t u8 ops[] = {TK
a910: 5f 47 45 2c 20 54 4b 5f 4c 45 7d 3b 0a 20 20 20  _GE, TK_LE};.   
a920: 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d   assert( pList!=
a930: 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
a940: 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 32   pList->nExpr==2
a950: 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   );.    for(i=0;
a960: 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<2; i++){.    
a970: 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72    Expr *pNewExpr
a980: 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 64 78 4e  ;.      int idxN
a990: 65 77 3b 0a 20 20 20 20 20 20 70 4e 65 77 45 78  ew;.      pNewEx
a9a0: 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70  pr = sqlite3PExp
a9b0: 72 28 70 50 61 72 73 65 2c 20 6f 70 73 5b 69 5d  r(pParse, ops[i]
a9c0: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
a9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a9e0: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
a9f0: 62 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  b, pExpr->pLeft,
aa00: 20 30 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20   0),.           
aa10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa20: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70    sqlite3ExprDup
aa30: 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d  (db, pList->a[i]
aa40: 2e 70 45 78 70 72 2c 20 30 29 2c 20 30 29 3b 0a  .pExpr, 0), 0);.
aa50: 20 20 20 20 20 20 74 72 61 6e 73 66 65 72 4a 6f        transferJo
aa60: 69 6e 4d 61 72 6b 69 6e 67 73 28 70 4e 65 77 45  inMarkings(pNewE
aa70: 78 70 72 2c 20 70 45 78 70 72 29 3b 0a 20 20 20  xpr, pExpr);.   
aa80: 20 20 20 69 64 78 4e 65 77 20 3d 20 77 68 65 72     idxNew = wher
aa90: 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57  eClauseInsert(pW
aaa0: 43 2c 20 70 4e 65 77 45 78 70 72 2c 20 54 45 52  C, pNewExpr, TER
aab0: 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44  M_VIRTUAL|TERM_D
aac0: 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 74  YNAMIC);.      t
aad0: 65 73 74 63 61 73 65 28 20 69 64 78 4e 65 77 3d  estcase( idxNew=
aae0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 65 78 70 72  =0 );.      expr
aaf0: 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20 70 57  Analyze(pSrc, pW
ab00: 43 2c 20 69 64 78 4e 65 77 29 3b 0a 20 20 20 20  C, idxNew);.    
ab10: 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e    pTerm = &pWC->
ab20: 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20  a[idxTerm];.    
ab30: 20 20 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d    pWC->a[idxNew]
ab40: 2e 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65  .iParent = idxTe
ab50: 72 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54  rm;.    }.    pT
ab60: 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 32 3b  erm->nChild = 2;
ab70: 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  .  }.#endif /* S
ab80: 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 45 54 57 45  QLITE_OMIT_BETWE
ab90: 45 4e 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20  EN_OPTIMIZATION 
aba0: 2a 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  */..#if !defined
abb0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f  (SQLITE_OMIT_OR_
abc0: 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 29 20 26 26  OPTIMIZATION) &&
abd0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
abe0: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 0a  _OMIT_SUBQUERY).
abf0: 20 20 2f 2a 20 41 6e 61 6c 79 7a 65 20 61 20 74    /* Analyze a t
ac00: 65 72 6d 20 74 68 61 74 20 69 73 20 63 6f 6d 70  erm that is comp
ac10: 6f 73 65 64 20 6f 66 20 74 77 6f 20 6f 72 20 6d  osed of two or m
ac20: 6f 72 65 20 73 75 62 74 65 72 6d 73 20 63 6f 6e  ore subterms con
ac30: 6e 65 63 74 65 64 20 62 79 0a 20 20 2a 2a 20 61  nected by.  ** a
ac40: 6e 20 4f 52 20 6f 70 65 72 61 74 6f 72 2e 0a 20  n OR operator.. 
ac50: 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 28 20 70   */.  else if( p
ac60: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52 20  Expr->op==TK_OR 
ac70: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
ac80: 57 43 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29  WC->op==TK_AND )
ac90: 3b 0a 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a  ;.    exprAnalyz
aca0: 65 4f 72 54 65 72 6d 28 70 53 72 63 2c 20 70 57  eOrTerm(pSrc, pW
acb0: 43 2c 20 69 64 78 54 65 72 6d 29 3b 0a 20 20 20  C, idxTerm);.   
acc0: 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61   pTerm = &pWC->a
acd0: 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 7d 0a 23  [idxTerm];.  }.#
ace0: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
acf0: 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41  OMIT_OR_OPTIMIZA
ad00: 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  TION */..#ifndef
ad10: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b   SQLITE_OMIT_LIK
ad20: 45 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 20  E_OPTIMIZATION. 
ad30: 20 2f 2a 20 41 64 64 20 63 6f 6e 73 74 72 61 69   /* Add constrai
ad40: 6e 74 73 20 74 6f 20 72 65 64 75 63 65 20 74 68  nts to reduce th
ad50: 65 20 73 65 61 72 63 68 20 73 70 61 63 65 20 6f  e search space o
ad60: 6e 20 61 20 4c 49 4b 45 20 6f 72 20 47 4c 4f 42  n a LIKE or GLOB
ad70: 0a 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72 2e 0a  .  ** operator..
ad80: 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 6c 69 6b 65    **.  ** A like
ad90: 20 70 61 74 74 65 72 6e 20 6f 66 20 74 68 65 20   pattern of the 
ada0: 66 6f 72 6d 20 22 78 20 4c 49 4b 45 20 27 61 62  form "x LIKE 'ab
adb0: 63 25 27 22 20 69 73 20 63 68 61 6e 67 65 64 20  c%'" is changed 
adc0: 69 6e 74 6f 20 63 6f 6e 73 74 72 61 69 6e 74 73  into constraints
add0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20  .  **.  **      
ade0: 20 20 20 20 78 3e 3d 27 61 62 63 27 20 41 4e 44      x>='abc' AND
adf0: 20 78 3c 27 61 62 64 27 20 41 4e 44 20 78 20 4c   x<'abd' AND x L
ae00: 49 4b 45 20 27 61 62 63 25 27 0a 20 20 2a 2a 0a  IKE 'abc%'.  **.
ae10: 20 20 2a 2a 20 54 68 65 20 6c 61 73 74 20 63 68    ** The last ch
ae20: 61 72 61 63 74 65 72 20 6f 66 20 74 68 65 20 70  aracter of the p
ae30: 72 65 66 69 78 20 22 61 62 63 22 20 69 73 20 69  refix "abc" is i
ae40: 6e 63 72 65 6d 65 6e 74 65 64 20 74 6f 20 66 6f  ncremented to fo
ae50: 72 6d 20 74 68 65 0a 20 20 2a 2a 20 74 65 72 6d  rm the.  ** term
ae60: 69 6e 61 74 69 6f 6e 20 63 6f 6e 64 69 74 69 6f  ination conditio
ae70: 6e 20 22 61 62 64 22 2e 0a 20 20 2a 2f 0a 20 20  n "abd"..  */.  
ae80: 69 66 28 20 70 57 43 2d 3e 6f 70 3d 3d 54 4b 5f  if( pWC->op==TK_
ae90: 41 4e 44 20 0a 20 20 20 26 26 20 69 73 4c 69 6b  AND .   && isLik
aea0: 65 4f 72 47 6c 6f 62 28 70 50 61 72 73 65 2c 20  eOrGlob(pParse, 
aeb0: 70 45 78 70 72 2c 20 26 70 53 74 72 31 2c 20 26  pExpr, &pStr1, &
aec0: 69 73 43 6f 6d 70 6c 65 74 65 2c 20 26 6e 6f 43  isComplete, &noC
aed0: 61 73 65 29 0a 20 20 29 7b 0a 20 20 20 20 45 78  ase).  ){.    Ex
aee0: 70 72 20 2a 70 4c 65 66 74 3b 20 20 20 20 20 20  pr *pLeft;      
aef0: 20 2f 2a 20 4c 48 53 20 6f 66 20 4c 49 4b 45 2f   /* LHS of LIKE/
af00: 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72 20 2a 2f  GLOB operator */
af10: 0a 20 20 20 20 45 78 70 72 20 2a 70 53 74 72 32  .    Expr *pStr2
af20: 3b 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20  ;       /* Copy 
af30: 6f 66 20 70 53 74 72 31 20 2d 20 52 48 53 20 6f  of pStr1 - RHS o
af40: 66 20 4c 49 4b 45 2f 47 4c 4f 42 20 6f 70 65 72  f LIKE/GLOB oper
af50: 61 74 6f 72 20 2a 2f 0a 20 20 20 20 45 78 70 72  ator */.    Expr
af60: 20 2a 70 4e 65 77 45 78 70 72 31 3b 0a 20 20 20   *pNewExpr1;.   
af70: 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72 32   Expr *pNewExpr2
af80: 3b 0a 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77  ;.    int idxNew
af90: 31 3b 0a 20 20 20 20 69 6e 74 20 69 64 78 4e 65  1;.    int idxNe
afa0: 77 32 3b 0a 20 20 20 20 54 6f 6b 65 6e 20 73 43  w2;.    Token sC
afb0: 6f 6c 6c 53 65 71 4e 61 6d 65 3b 20 20 2f 2a 20  ollSeqName;  /* 
afc0: 4e 61 6d 65 20 6f 66 20 63 6f 6c 6c 61 74 69 6e  Name of collatin
afd0: 67 20 73 65 71 75 65 6e 63 65 20 2a 2f 0a 0a 20  g sequence */.. 
afe0: 20 20 20 70 4c 65 66 74 20 3d 20 70 45 78 70 72     pLeft = pExpr
aff0: 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e  ->x.pList->a[1].
b000: 70 45 78 70 72 3b 0a 20 20 20 20 70 53 74 72 32  pExpr;.    pStr2
b010: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
b020: 70 28 64 62 2c 20 70 53 74 72 31 2c 20 30 29 3b  p(db, pStr1, 0);
b030: 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e 6d 61  .    if( !db->ma
b040: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
b050: 20 20 20 20 75 38 20 63 2c 20 2a 70 43 3b 20 20      u8 c, *pC;  
b060: 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 63 68 61       /* Last cha
b070: 72 61 63 74 65 72 20 62 65 66 6f 72 65 20 74 68  racter before th
b080: 65 20 66 69 72 73 74 20 77 69 6c 64 63 61 72 64  e first wildcard
b090: 20 2a 2f 0a 20 20 20 20 20 20 70 43 20 3d 20 28   */.      pC = (
b0a0: 75 38 2a 29 26 70 53 74 72 32 2d 3e 75 2e 7a 54  u8*)&pStr2->u.zT
b0b0: 6f 6b 65 6e 5b 73 71 6c 69 74 65 33 53 74 72 6c  oken[sqlite3Strl
b0c0: 65 6e 33 30 28 70 53 74 72 32 2d 3e 75 2e 7a 54  en30(pStr2->u.zT
b0d0: 6f 6b 65 6e 29 2d 31 5d 3b 0a 20 20 20 20 20 20  oken)-1];.      
b0e0: 63 20 3d 20 2a 70 43 3b 0a 20 20 20 20 20 20 69  c = *pC;.      i
b0f0: 66 28 20 6e 6f 43 61 73 65 20 29 7b 0a 20 20 20  f( noCase ){.   
b100: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e       /* The poin
b110: 74 20 69 73 20 74 6f 20 69 6e 63 72 65 6d 65 6e  t is to incremen
b120: 74 20 74 68 65 20 6c 61 73 74 20 63 68 61 72 61  t the last chara
b130: 63 74 65 72 20 62 65 66 6f 72 65 20 74 68 65 20  cter before the 
b140: 66 69 72 73 74 0a 20 20 20 20 20 20 20 20 2a 2a  first.        **
b150: 20 77 69 6c 64 63 61 72 64 2e 20 20 42 75 74 20   wildcard.  But 
b160: 69 66 20 77 65 20 69 6e 63 72 65 6d 65 6e 74 20  if we increment 
b170: 27 40 27 2c 20 74 68 61 74 20 77 69 6c 6c 20 70  '@', that will p
b180: 75 73 68 20 69 74 20 69 6e 74 6f 20 74 68 65 0a  ush it into the.
b190: 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 70 68 61          ** alpha
b1a0: 62 65 74 69 63 20 72 61 6e 67 65 20 77 68 65 72  betic range wher
b1b0: 65 20 63 61 73 65 20 63 6f 6e 76 65 72 73 69 6f  e case conversio
b1c0: 6e 73 20 77 69 6c 6c 20 6d 65 73 73 20 75 70 20  ns will mess up 
b1d0: 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  the .        ** 
b1e0: 69 6e 65 71 75 61 6c 69 74 79 2e 20 20 54 6f 20  inequality.  To 
b1f0: 61 76 6f 69 64 20 74 68 69 73 2c 20 6d 61 6b 65  avoid this, make
b200: 20 73 75 72 65 20 74 6f 20 61 6c 73 6f 20 72 75   sure to also ru
b210: 6e 20 74 68 65 20 66 75 6c 6c 0a 20 20 20 20 20  n the full.     
b220: 20 20 20 2a 2a 20 4c 49 4b 45 20 6f 6e 20 61 6c     ** LIKE on al
b230: 6c 20 63 61 6e 64 69 64 61 74 65 20 65 78 70 72  l candidate expr
b240: 65 73 73 69 6f 6e 73 20 62 79 20 63 6c 65 61 72  essions by clear
b250: 69 6e 67 20 74 68 65 20 69 73 43 6f 6d 70 6c 65  ing the isComple
b260: 74 65 20 66 6c 61 67 0a 20 20 20 20 20 20 20 20  te flag.        
b270: 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 63  */.        if( c
b280: 3d 3d 27 41 27 2d 31 20 29 20 69 73 43 6f 6d 70  =='A'-1 ) isComp
b290: 6c 65 74 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  lete = 0;.      
b2a0: 20 20 63 20 3d 20 73 71 6c 69 74 65 33 55 70 70    c = sqlite3Upp
b2b0: 65 72 54 6f 4c 6f 77 65 72 5b 63 5d 3b 0a 20 20  erToLower[c];.  
b2c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 70 43 20      }.      *pC 
b2d0: 3d 20 63 20 2b 20 31 3b 0a 20 20 20 20 7d 0a 20  = c + 1;.    }. 
b2e0: 20 20 20 73 43 6f 6c 6c 53 65 71 4e 61 6d 65 2e     sCollSeqName.
b2f0: 7a 20 3d 20 6e 6f 43 61 73 65 20 3f 20 22 4e 4f  z = noCase ? "NO
b300: 43 41 53 45 22 20 3a 20 22 42 49 4e 41 52 59 22  CASE" : "BINARY"
b310: 3b 0a 20 20 20 20 73 43 6f 6c 6c 53 65 71 4e 61  ;.    sCollSeqNa
b320: 6d 65 2e 6e 20 3d 20 36 3b 0a 20 20 20 20 70 4e  me.n = 6;.    pN
b330: 65 77 45 78 70 72 31 20 3d 20 73 71 6c 69 74 65  ewExpr1 = sqlite
b340: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4c 65  3ExprDup(db, pLe
b350: 66 74 2c 20 30 29 3b 0a 20 20 20 20 70 4e 65 77  ft, 0);.    pNew
b360: 45 78 70 72 31 20 3d 20 73 71 6c 69 74 65 33 50  Expr1 = sqlite3P
b370: 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f  Expr(pParse, TK_
b380: 47 45 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  GE, .           
b390: 73 71 6c 69 74 65 33 45 78 70 72 41 64 64 43 6f  sqlite3ExprAddCo
b3a0: 6c 6c 61 74 65 54 6f 6b 65 6e 28 70 50 61 72 73  llateToken(pPars
b3b0: 65 2c 70 4e 65 77 45 78 70 72 31 2c 26 73 43 6f  e,pNewExpr1,&sCo
b3c0: 6c 6c 53 65 71 4e 61 6d 65 29 2c 0a 20 20 20 20  llSeqName),.    
b3d0: 20 20 20 20 20 20 20 70 53 74 72 31 2c 20 30 29         pStr1, 0)
b3e0: 3b 0a 20 20 20 20 74 72 61 6e 73 66 65 72 4a 6f  ;.    transferJo
b3f0: 69 6e 4d 61 72 6b 69 6e 67 73 28 70 4e 65 77 45  inMarkings(pNewE
b400: 78 70 72 31 2c 20 70 45 78 70 72 29 3b 0a 20 20  xpr1, pExpr);.  
b410: 20 20 69 64 78 4e 65 77 31 20 3d 20 77 68 65 72    idxNew1 = wher
b420: 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57  eClauseInsert(pW
b430: 43 2c 20 70 4e 65 77 45 78 70 72 31 2c 20 54 45  C, pNewExpr1, TE
b440: 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f  RM_VIRTUAL|TERM_
b450: 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 74 65  DYNAMIC);.    te
b460: 73 74 63 61 73 65 28 20 69 64 78 4e 65 77 31 3d  stcase( idxNew1=
b470: 3d 30 20 29 3b 0a 20 20 20 20 65 78 70 72 41 6e  =0 );.    exprAn
b480: 61 6c 79 7a 65 28 70 53 72 63 2c 20 70 57 43 2c  alyze(pSrc, pWC,
b490: 20 69 64 78 4e 65 77 31 29 3b 0a 20 20 20 20 70   idxNew1);.    p
b4a0: 4e 65 77 45 78 70 72 32 20 3d 20 73 71 6c 69 74  NewExpr2 = sqlit
b4b0: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4c  e3ExprDup(db, pL
b4c0: 65 66 74 2c 20 30 29 3b 0a 20 20 20 20 70 4e 65  eft, 0);.    pNe
b4d0: 77 45 78 70 72 32 20 3d 20 73 71 6c 69 74 65 33  wExpr2 = sqlite3
b4e0: 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
b4f0: 5f 4c 54 2c 0a 20 20 20 20 20 20 20 20 20 20 20  _LT,.           
b500: 73 71 6c 69 74 65 33 45 78 70 72 41 64 64 43 6f  sqlite3ExprAddCo
b510: 6c 6c 61 74 65 54 6f 6b 65 6e 28 70 50 61 72 73  llateToken(pPars
b520: 65 2c 70 4e 65 77 45 78 70 72 32 2c 26 73 43 6f  e,pNewExpr2,&sCo
b530: 6c 6c 53 65 71 4e 61 6d 65 29 2c 0a 20 20 20 20  llSeqName),.    
b540: 20 20 20 20 20 20 20 70 53 74 72 32 2c 20 30 29         pStr2, 0)
b550: 3b 0a 20 20 20 20 74 72 61 6e 73 66 65 72 4a 6f  ;.    transferJo
b560: 69 6e 4d 61 72 6b 69 6e 67 73 28 70 4e 65 77 45  inMarkings(pNewE
b570: 78 70 72 32 2c 20 70 45 78 70 72 29 3b 0a 20 20  xpr2, pExpr);.  
b580: 20 20 69 64 78 4e 65 77 32 20 3d 20 77 68 65 72    idxNew2 = wher
b590: 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57  eClauseInsert(pW
b5a0: 43 2c 20 70 4e 65 77 45 78 70 72 32 2c 20 54 45  C, pNewExpr2, TE
b5b0: 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f  RM_VIRTUAL|TERM_
b5c0: 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 74 65  DYNAMIC);.    te
b5d0: 73 74 63 61 73 65 28 20 69 64 78 4e 65 77 32 3d  stcase( idxNew2=
b5e0: 3d 30 20 29 3b 0a 20 20 20 20 65 78 70 72 41 6e  =0 );.    exprAn
b5f0: 61 6c 79 7a 65 28 70 53 72 63 2c 20 70 57 43 2c  alyze(pSrc, pWC,
b600: 20 69 64 78 4e 65 77 32 29 3b 0a 20 20 20 20 70   idxNew2);.    p
b610: 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69  Term = &pWC->a[i
b620: 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20 69 66 28  dxTerm];.    if(
b630: 20 69 73 43 6f 6d 70 6c 65 74 65 20 29 7b 0a 20   isComplete ){. 
b640: 20 20 20 20 20 70 57 43 2d 3e 61 5b 69 64 78 4e       pWC->a[idxN
b650: 65 77 31 5d 2e 69 50 61 72 65 6e 74 20 3d 20 69  ew1].iParent = i
b660: 64 78 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 57  dxTerm;.      pW
b670: 43 2d 3e 61 5b 69 64 78 4e 65 77 32 5d 2e 69 50  C->a[idxNew2].iP
b680: 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b  arent = idxTerm;
b690: 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43  .      pTerm->nC
b6a0: 68 69 6c 64 20 3d 20 32 3b 0a 20 20 20 20 7d 0a  hild = 2;.    }.
b6b0: 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
b6c0: 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f  LITE_OMIT_LIKE_O
b6d0: 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a  PTIMIZATION */..
b6e0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
b6f0: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
b700: 0a 20 20 2f 2a 20 41 64 64 20 61 20 57 4f 5f 4d  .  /* Add a WO_M
b710: 41 54 43 48 20 61 75 78 69 6c 69 61 72 79 20 74  ATCH auxiliary t
b720: 65 72 6d 20 74 6f 20 74 68 65 20 63 6f 6e 73 74  erm to the const
b730: 72 61 69 6e 74 20 73 65 74 20 69 66 20 74 68 65  raint set if the
b740: 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 65 78  .  ** current ex
b750: 70 72 65 73 73 69 6f 6e 20 69 73 20 6f 66 20 74  pression is of t
b760: 68 65 20 66 6f 72 6d 3a 20 20 63 6f 6c 75 6d 6e  he form:  column
b770: 20 4d 41 54 43 48 20 65 78 70 72 2e 0a 20 20 2a   MATCH expr..  *
b780: 2a 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69  * This informati
b790: 6f 6e 20 69 73 20 75 73 65 64 20 62 79 20 74 68  on is used by th
b7a0: 65 20 78 42 65 73 74 49 6e 64 65 78 20 6d 65 74  e xBestIndex met
b7b0: 68 6f 64 73 20 6f 66 0a 20 20 2a 2a 20 76 69 72  hods of.  ** vir
b7c0: 74 75 61 6c 20 74 61 62 6c 65 73 2e 20 20 54 68  tual tables.  Th
b7d0: 65 20 6e 61 74 69 76 65 20 71 75 65 72 79 20 6f  e native query o
b7e0: 70 74 69 6d 69 7a 65 72 20 64 6f 65 73 20 6e 6f  ptimizer does no
b7f0: 74 20 61 74 74 65 6d 70 74 0a 20 20 2a 2a 20 74  t attempt.  ** t
b800: 6f 20 64 6f 20 61 6e 79 74 68 69 6e 67 20 77 69  o do anything wi
b810: 74 68 20 4d 41 54 43 48 20 66 75 6e 63 74 69 6f  th MATCH functio
b820: 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69  ns..  */.  if( i
b830: 73 4d 61 74 63 68 4f 66 43 6f 6c 75 6d 6e 28 70  sMatchOfColumn(p
b840: 45 78 70 72 29 20 29 7b 0a 20 20 20 20 69 6e 74  Expr) ){.    int
b850: 20 69 64 78 4e 65 77 3b 0a 20 20 20 20 45 78 70   idxNew;.    Exp
b860: 72 20 2a 70 52 69 67 68 74 2c 20 2a 70 4c 65 66  r *pRight, *pLef
b870: 74 3b 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d  t;.    WhereTerm
b880: 20 2a 70 4e 65 77 54 65 72 6d 3b 0a 20 20 20 20   *pNewTerm;.    
b890: 42 69 74 6d 61 73 6b 20 70 72 65 72 65 71 43 6f  Bitmask prereqCo
b8a0: 6c 75 6d 6e 2c 20 70 72 65 72 65 71 45 78 70 72  lumn, prereqExpr
b8b0: 3b 0a 0a 20 20 20 20 70 52 69 67 68 74 20 3d 20  ;..    pRight = 
b8c0: 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e  pExpr->x.pList->
b8d0: 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[0].pExpr;.    
b8e0: 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 78  pLeft = pExpr->x
b8f0: 2e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78  .pList->a[1].pEx
b900: 70 72 3b 0a 20 20 20 20 70 72 65 72 65 71 45 78  pr;.    prereqEx
b910: 70 72 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73  pr = exprTableUs
b920: 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 52  age(pMaskSet, pR
b930: 69 67 68 74 29 3b 0a 20 20 20 20 70 72 65 72 65  ight);.    prere
b940: 71 43 6f 6c 75 6d 6e 20 3d 20 65 78 70 72 54 61  qColumn = exprTa
b950: 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65  bleUsage(pMaskSe
b960: 74 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20 20 69  t, pLeft);.    i
b970: 66 28 20 28 70 72 65 72 65 71 45 78 70 72 20 26  f( (prereqExpr &
b980: 20 70 72 65 72 65 71 43 6f 6c 75 6d 6e 29 3d 3d   prereqColumn)==
b990: 30 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  0 ){.      Expr 
b9a0: 2a 70 4e 65 77 45 78 70 72 3b 0a 20 20 20 20 20  *pNewExpr;.     
b9b0: 20 70 4e 65 77 45 78 70 72 20 3d 20 73 71 6c 69   pNewExpr = sqli
b9c0: 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
b9d0: 20 54 4b 5f 4d 41 54 43 48 2c 20 0a 20 20 20 20   TK_MATCH, .    
b9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b9f0: 20 20 20 20 20 20 20 20 20 20 30 2c 20 73 71 6c            0, sql
ba00: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
ba10: 70 52 69 67 68 74 2c 20 30 29 2c 20 30 29 3b 0a  pRight, 0), 0);.
ba20: 20 20 20 20 20 20 69 64 78 4e 65 77 20 3d 20 77        idxNew = w
ba30: 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74  hereClauseInsert
ba40: 28 70 57 43 2c 20 70 4e 65 77 45 78 70 72 2c 20  (pWC, pNewExpr, 
ba50: 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52  TERM_VIRTUAL|TER
ba60: 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20  M_DYNAMIC);.    
ba70: 20 20 74 65 73 74 63 61 73 65 28 20 69 64 78 4e    testcase( idxN
ba80: 65 77 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  ew==0 );.      p
ba90: 4e 65 77 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e  NewTerm = &pWC->
baa0: 61 5b 69 64 78 4e 65 77 5d 3b 0a 20 20 20 20 20  a[idxNew];.     
bab0: 20 70 4e 65 77 54 65 72 6d 2d 3e 70 72 65 72 65   pNewTerm->prere
bac0: 71 52 69 67 68 74 20 3d 20 70 72 65 72 65 71 45  qRight = prereqE
bad0: 78 70 72 3b 0a 20 20 20 20 20 20 70 4e 65 77 54  xpr;.      pNewT
bae0: 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20  erm->leftCursor 
baf0: 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3b  = pLeft->iTable;
bb00: 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d  .      pNewTerm-
bb10: 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20  >u.leftColumn = 
bb20: 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a  pLeft->iColumn;.
bb30: 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e        pNewTerm->
bb40: 65 4f 70 65 72 61 74 6f 72 20 3d 20 57 4f 5f 4d  eOperator = WO_M
bb50: 41 54 43 48 3b 0a 20 20 20 20 20 20 70 4e 65 77  ATCH;.      pNew
bb60: 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 20 3d 20  Term->iParent = 
bb70: 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 20 20 70  idxTerm;.      p
bb80: 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69  Term = &pWC->a[i
bb90: 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 70  dxTerm];.      p
bba0: 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 31  Term->nChild = 1
bbb0: 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 77  ;.      pTerm->w
bbc0: 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43  tFlags |= TERM_C
bbd0: 4f 50 49 45 44 3b 0a 20 20 20 20 20 20 70 4e 65  OPIED;.      pNe
bbe0: 77 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c  wTerm->prereqAll
bbf0: 20 3d 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71   = pTerm->prereq
bc00: 41 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  All;.    }.  }.#
bc10: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
bc20: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
bc30: 45 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c  E */..#ifdef SQL
bc40: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
bc50: 5f 4f 52 5f 53 54 41 54 34 0a 20 20 2f 2a 20 57  _OR_STAT4.  /* W
bc60: 68 65 6e 20 73 71 6c 69 74 65 5f 73 74 61 74 33  hen sqlite_stat3
bc70: 20 68 69 73 74 6f 67 72 61 6d 20 64 61 74 61 20   histogram data 
bc80: 69 73 20 61 76 61 69 6c 61 62 6c 65 20 61 6e 20  is available an 
bc90: 6f 70 65 72 61 74 6f 72 20 6f 66 20 74 68 65 0a  operator of the.
bca0: 20 20 2a 2a 20 66 6f 72 6d 20 22 78 20 49 53 20    ** form "x IS 
bcb0: 4e 4f 54 20 4e 55 4c 4c 22 20 63 61 6e 20 73 6f  NOT NULL" can so
bcc0: 6d 65 74 69 6d 65 73 20 62 65 20 65 76 61 6c 75  metimes be evalu
bcd0: 61 74 65 64 20 6d 6f 72 65 20 65 66 66 69 63 69  ated more effici
bce0: 65 6e 74 6c 79 0a 20 20 2a 2a 20 61 73 20 22 78  ently.  ** as "x
bcf0: 3e 4e 55 4c 4c 22 20 69 66 20 78 20 69 73 20 6e  >NULL" if x is n
bd00: 6f 74 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52  ot an INTEGER PR
bd10: 49 4d 41 52 59 20 4b 45 59 2e 20 20 53 6f 20 63  IMARY KEY.  So c
bd20: 6f 6e 73 74 72 75 63 74 20 61 0a 20 20 2a 2a 20  onstruct a.  ** 
bd30: 76 69 72 74 75 61 6c 20 74 65 72 6d 20 6f 66 20  virtual term of 
bd40: 74 68 61 74 20 66 6f 72 6d 2e 0a 20 20 2a 2a 0a  that form..  **.
bd50: 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74    ** Note that t
bd60: 68 65 20 76 69 72 74 75 61 6c 20 74 65 72 6d 20  he virtual term 
bd70: 6d 75 73 74 20 62 65 20 74 61 67 67 65 64 20 77  must be tagged w
bd80: 69 74 68 20 54 45 52 4d 5f 56 4e 55 4c 4c 2e 20  ith TERM_VNULL. 
bd90: 20 54 68 69 73 0a 20 20 2a 2a 20 54 45 52 4d 5f   This.  ** TERM_
bda0: 56 4e 55 4c 4c 20 74 61 67 20 77 69 6c 6c 20 73  VNULL tag will s
bdb0: 75 70 70 72 65 73 73 20 74 68 65 20 6e 6f 74 2d  uppress the not-
bdc0: 6e 75 6c 6c 20 63 68 65 63 6b 20 61 74 20 74 68  null check at th
bdd0: 65 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20 2a 2a  e beginning.  **
bde0: 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20 20 57   of the loop.  W
bdf0: 69 74 68 6f 75 74 20 74 68 65 20 54 45 52 4d 5f  ithout the TERM_
be00: 56 4e 55 4c 4c 20 66 6c 61 67 2c 20 74 68 65 20  VNULL flag, the 
be10: 6e 6f 74 2d 6e 75 6c 6c 20 63 68 65 63 6b 20 61  not-null check a
be20: 74 0a 20 20 2a 2a 20 74 68 65 20 73 74 61 72 74  t.  ** the start
be30: 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 77 69 6c   of the loop wil
be40: 6c 20 70 72 65 76 65 6e 74 20 61 6e 79 20 72 65  l prevent any re
be50: 73 75 6c 74 73 20 66 72 6f 6d 20 62 65 69 6e 67  sults from being
be60: 20 72 65 74 75 72 6e 65 64 2e 0a 20 20 2a 2f 0a   returned..  */.
be70: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d    if( pExpr->op=
be80: 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 0a 20 20 20 26  =TK_NOTNULL.   &
be90: 26 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e  & pExpr->pLeft->
bea0: 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20  op==TK_COLUMN.  
beb0: 20 26 26 20 70 45 78 70 72 2d 3e 70 4c 65 66 74   && pExpr->pLeft
bec0: 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 0a 20 20 20  ->iColumn>=0.   
bed0: 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45  && OptimizationE
bee0: 6e 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54  nabled(db, SQLIT
bef0: 45 5f 53 74 61 74 33 29 0a 20 20 29 7b 0a 20 20  E_Stat3).  ){.  
bf00: 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72    Expr *pNewExpr
bf10: 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66  ;.    Expr *pLef
bf20: 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  t = pExpr->pLeft
bf30: 3b 0a 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77  ;.    int idxNew
bf40: 3b 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20  ;.    WhereTerm 
bf50: 2a 70 4e 65 77 54 65 72 6d 3b 0a 0a 20 20 20 20  *pNewTerm;..    
bf60: 70 4e 65 77 45 78 70 72 20 3d 20 73 71 6c 69 74  pNewExpr = sqlit
bf70: 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
bf80: 54 4b 5f 47 54 2c 0a 20 20 20 20 20 20 20 20 20  TK_GT,.         
bf90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bfa0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 75     sqlite3ExprDu
bfb0: 70 28 64 62 2c 20 70 4c 65 66 74 2c 20 30 29 2c  p(db, pLeft, 0),
bfc0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
bfd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
bfe0: 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
bff0: 2c 20 54 4b 5f 4e 55 4c 4c 2c 20 30 2c 20 30 2c  , TK_NULL, 0, 0,
c000: 20 30 29 2c 20 30 29 3b 0a 0a 20 20 20 20 69 64   0), 0);..    id
c010: 78 4e 65 77 20 3d 20 77 68 65 72 65 43 6c 61 75  xNew = whereClau
c020: 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e  seInsert(pWC, pN
c030: 65 77 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20  ewExpr,.        
c040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c050: 20 20 20 20 20 20 54 45 52 4d 5f 56 49 52 54 55        TERM_VIRTU
c060: 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 7c  AL|TERM_DYNAMIC|
c070: 54 45 52 4d 5f 56 4e 55 4c 4c 29 3b 0a 20 20 20  TERM_VNULL);.   
c080: 20 69 66 28 20 69 64 78 4e 65 77 20 29 7b 0a 20   if( idxNew ){. 
c090: 20 20 20 20 20 70 4e 65 77 54 65 72 6d 20 3d 20       pNewTerm = 
c0a0: 26 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 3b  &pWC->a[idxNew];
c0b0: 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d  .      pNewTerm-
c0c0: 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d 20 30  >prereqRight = 0
c0d0: 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d  ;.      pNewTerm
c0e0: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 70  ->leftCursor = p
c0f0: 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20 20  Left->iTable;.  
c100: 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 75 2e      pNewTerm->u.
c110: 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65  leftColumn = pLe
c120: 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  ft->iColumn;.   
c130: 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 65 4f 70     pNewTerm->eOp
c140: 65 72 61 74 6f 72 20 3d 20 57 4f 5f 47 54 3b 0a  erator = WO_GT;.
c150: 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e        pNewTerm->
c160: 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72  iParent = idxTer
c170: 6d 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d  m;.      pTerm =
c180: 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d   &pWC->a[idxTerm
c190: 5d 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e  ];.      pTerm->
c1a0: 6e 43 68 69 6c 64 20 3d 20 31 3b 0a 20 20 20 20  nChild = 1;.    
c1b0: 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73    pTerm->wtFlags
c1c0: 20 7c 3d 20 54 45 52 4d 5f 43 4f 50 49 45 44 3b   |= TERM_COPIED;
c1d0: 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d  .      pNewTerm-
c1e0: 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20 70 54 65  >prereqAll = pTe
c1f0: 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 3b 0a 20  rm->prereqAll;. 
c200: 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20     }.  }.#endif 
c210: 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
c220: 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 20  _STAT3_OR_STAT4 
c230: 2a 2f 0a 0a 20 20 2f 2a 20 50 72 65 76 65 6e 74  */..  /* Prevent
c240: 20 4f 4e 20 63 6c 61 75 73 65 20 74 65 72 6d 73   ON clause terms
c250: 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20   of a LEFT JOIN 
c260: 66 72 6f 6d 20 62 65 69 6e 67 20 75 73 65 64 20  from being used 
c270: 74 6f 20 64 72 69 76 65 0a 20 20 2a 2a 20 61 6e  to drive.  ** an
c280: 20 69 6e 64 65 78 20 66 6f 72 20 74 61 62 6c 65   index for table
c290: 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66  s to the left of
c2a0: 20 74 68 65 20 6a 6f 69 6e 2e 0a 20 20 2a 2f 0a   the join..  */.
c2b0: 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52    pTerm->prereqR
c2c0: 69 67 68 74 20 7c 3d 20 65 78 74 72 61 52 69 67  ight |= extraRig
c2d0: 68 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ht;.}../*.** Thi
c2e0: 73 20 66 75 6e 63 74 69 6f 6e 20 73 65 61 72 63  s function searc
c2f0: 68 65 73 20 70 4c 69 73 74 20 66 6f 72 20 61 20  hes pList for a 
c300: 65 6e 74 72 79 20 74 68 61 74 20 6d 61 74 63 68  entry that match
c310: 65 73 20 74 68 65 20 69 43 6f 6c 2d 74 68 20 63  es the iCol-th c
c320: 6f 6c 75 6d 6e 0a 2a 2a 20 6f 66 20 69 6e 64 65  olumn.** of inde
c330: 78 20 70 49 64 78 2e 0a 2a 2a 0a 2a 2a 20 49 66  x pIdx..**.** If
c340: 20 73 75 63 68 20 61 6e 20 65 78 70 72 65 73 73   such an express
c350: 69 6f 6e 20 69 73 20 66 6f 75 6e 64 2c 20 69 74  ion is found, it
c360: 73 20 69 6e 64 65 78 20 69 6e 20 70 4c 69 73 74  s index in pList
c370: 2d 3e 61 5b 5d 20 69 73 20 72 65 74 75 72 6e 65  ->a[] is returne
c380: 64 2e 20 49 66 0a 2a 2a 20 6e 6f 20 65 78 70 72  d. If.** no expr
c390: 65 73 73 69 6f 6e 20 69 73 20 66 6f 75 6e 64 2c  ession is found,
c3a0: 20 2d 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e   -1 is returned.
c3b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
c3c0: 69 6e 64 49 6e 64 65 78 43 6f 6c 28 0a 20 20 50  indIndexCol(.  P
c3d0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
c3e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
c3f0: 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20  * Parse context 
c400: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
c410: 4c 69 73 74 2c 20 20 20 20 20 20 20 20 20 20 20  List,           
c420: 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69       /* Expressi
c430: 6f 6e 20 6c 69 73 74 20 74 6f 20 73 65 61 72 63  on list to searc
c440: 68 20 2a 2f 0a 20 20 69 6e 74 20 69 42 61 73 65  h */.  int iBase
c450: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
c460: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72         /* Cursor
c470: 20 66 6f 72 20 74 61 62 6c 65 20 61 73 73 6f 63   for table assoc
c480: 69 61 74 65 64 20 77 69 74 68 20 70 49 64 78 20  iated with pIdx 
c490: 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  */.  Index *pIdx
c4a0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
c4b0: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f       /* Index to
c4c0: 20 6d 61 74 63 68 20 63 6f 6c 75 6d 6e 20 6f 66   match column of
c4d0: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 20 20   */.  int iCol  
c4e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c4f0: 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20        /* Column 
c500: 6f 66 20 69 6e 64 65 78 20 74 6f 20 6d 61 74 63  of index to matc
c510: 68 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  h */.){.  int i;
c520: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
c530: 43 6f 6c 6c 20 3d 20 70 49 64 78 2d 3e 61 7a 43  Coll = pIdx->azC
c540: 6f 6c 6c 5b 69 43 6f 6c 5d 3b 0a 0a 20 20 66 6f  oll[iCol];..  fo
c550: 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
c560: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
c570: 20 45 78 70 72 20 2a 70 20 3d 20 73 71 6c 69 74   Expr *p = sqlit
c580: 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74  e3ExprSkipCollat
c590: 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  e(pList->a[i].pE
c5a0: 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20 70 2d  xpr);.    if( p-
c5b0: 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20  >op==TK_COLUMN. 
c5c0: 20 20 20 20 26 26 20 70 2d 3e 69 43 6f 6c 75 6d      && p->iColum
c5d0: 6e 3d 3d 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  n==pIdx->aiColum
c5e0: 6e 5b 69 43 6f 6c 5d 0a 20 20 20 20 20 26 26 20  n[iCol].     && 
c5f0: 70 2d 3e 69 54 61 62 6c 65 3d 3d 69 42 61 73 65  p->iTable==iBase
c600: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 43 6f  .    ){.      Co
c610: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73  llSeq *pColl = s
c620: 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
c630: 71 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2d  q(pParse, pList-
c640: 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[i].pExpr);.  
c650: 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 70      if( ALWAYS(p
c660: 43 6f 6c 6c 29 20 26 26 20 30 3d 3d 73 71 6c 69  Coll) && 0==sqli
c670: 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 6c  te3StrICmp(pColl
c680: 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 6c 29 20  ->zName, zColl) 
c690: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
c6a0: 6e 20 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n i;.      }.   
c6b0: 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
c6c0: 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   -1;.}../*.** Re
c6d0: 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65  turn true if the
c6e0: 20 44 49 53 54 49 4e 43 54 20 65 78 70 72 65 73   DISTINCT expres
c6f0: 73 69 6f 6e 2d 6c 69 73 74 20 70 61 73 73 65 64  sion-list passed
c700: 20 61 73 20 74 68 65 20 74 68 69 72 64 20 61 72   as the third ar
c710: 67 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 72 65 64  gument.** is red
c720: 75 6e 64 61 6e 74 2e 0a 2a 2a 0a 2a 2a 20 41 20  undant..**.** A 
c730: 44 49 53 54 49 4e 43 54 20 6c 69 73 74 20 69 73  DISTINCT list is
c740: 20 72 65 64 75 6e 64 61 6e 74 20 69 66 20 74 68   redundant if th
c750: 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61  e database conta
c760: 69 6e 73 20 73 6f 6d 65 20 73 75 62 73 65 74 20  ins some subset 
c770: 6f 66 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 20 74 68  of.** columns th
c780: 61 74 20 61 72 65 20 75 6e 69 71 75 65 20 61 6e  at are unique an
c790: 64 20 6e 6f 6e 2d 6e 75 6c 6c 2e 0a 2a 2f 0a 73  d non-null..*/.s
c7a0: 74 61 74 69 63 20 69 6e 74 20 69 73 44 69 73 74  tatic int isDist
c7b0: 69 6e 63 74 52 65 64 75 6e 64 61 6e 74 28 0a 20  inctRedundant(. 
c7c0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
c7d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
c7e0: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
c7f0: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62  .  SrcList *pTab
c800: 4c 69 73 74 2c 20 20 20 20 20 20 20 20 2f 2a 20  List,        /* 
c810: 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  The FROM clause 
c820: 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  */.  WhereClause
c830: 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20 2f   *pWC,         /
c840: 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
c850: 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  se */.  ExprList
c860: 20 2a 70 44 69 73 74 69 6e 63 74 20 20 20 20 20   *pDistinct     
c870: 20 20 2f 2a 20 54 68 65 20 72 65 73 75 6c 74 20    /* The result 
c880: 73 65 74 20 74 68 61 74 20 6e 65 65 64 73 20 74  set that needs t
c890: 6f 20 62 65 20 44 49 53 54 49 4e 43 54 20 2a 2f  o be DISTINCT */
c8a0: 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  .){.  Table *pTa
c8b0: 62 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  b;.  Index *pIdx
c8c0: 3b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  ;.  int i;      
c8d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c8e0: 20 20 20 20 0a 20 20 69 6e 74 20 69 42 61 73 65      .  int iBase
c8f0: 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  ;..  /* If there
c900: 20 69 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e   is more than on
c910: 65 20 74 61 62 6c 65 20 6f 72 20 73 75 62 2d 73  e table or sub-s
c920: 65 6c 65 63 74 20 69 6e 20 74 68 65 20 46 52 4f  elect in the FRO
c930: 4d 20 63 6c 61 75 73 65 20 6f 66 0a 20 20 2a 2a  M clause of.  **
c940: 20 74 68 69 73 20 71 75 65 72 79 2c 20 74 68 65   this query, the
c950: 6e 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65  n it will not be
c960: 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 73 68 6f   possible to sho
c970: 77 20 74 68 61 74 20 74 68 65 20 44 49 53 54 49  w that the DISTI
c980: 4e 43 54 20 0a 20 20 2a 2a 20 63 6c 61 75 73 65  NCT .  ** clause
c990: 20 69 73 20 72 65 64 75 6e 64 61 6e 74 2e 20 2a   is redundant. *
c9a0: 2f 0a 20 20 69 66 28 20 70 54 61 62 4c 69 73 74  /.  if( pTabList
c9b0: 2d 3e 6e 53 72 63 21 3d 31 20 29 20 72 65 74 75  ->nSrc!=1 ) retu
c9c0: 72 6e 20 30 3b 0a 20 20 69 42 61 73 65 20 3d 20  rn 0;.  iBase = 
c9d0: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e 69  pTabList->a[0].i
c9e0: 43 75 72 73 6f 72 3b 0a 20 20 70 54 61 62 20 3d  Cursor;.  pTab =
c9f0: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e   pTabList->a[0].
ca00: 70 54 61 62 3b 0a 0a 20 20 2f 2a 20 49 66 20 61  pTab;..  /* If a
ca10: 6e 79 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  ny of the expres
ca20: 73 69 6f 6e 73 20 69 73 20 61 6e 20 49 50 4b 20  sions is an IPK 
ca30: 63 6f 6c 75 6d 6e 20 6f 6e 20 74 61 62 6c 65 20  column on table 
ca40: 69 42 61 73 65 2c 20 74 68 65 6e 20 72 65 74 75  iBase, then retu
ca50: 72 6e 20 0a 20 20 2a 2a 20 74 72 75 65 2e 20 4e  rn .  ** true. N
ca60: 6f 74 65 3a 20 54 68 65 20 28 70 2d 3e 69 54 61  ote: The (p->iTa
ca70: 62 6c 65 3d 3d 69 42 61 73 65 29 20 70 61 72 74  ble==iBase) part
ca80: 20 6f 66 20 74 68 69 73 20 74 65 73 74 20 6d 61   of this test ma
ca90: 79 20 62 65 20 66 61 6c 73 65 20 69 66 20 74 68  y be false if th
caa0: 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 53  e.  ** current S
cab0: 45 4c 45 43 54 20 69 73 20 61 20 63 6f 72 72 65  ELECT is a corre
cac0: 6c 61 74 65 64 20 73 75 62 2d 71 75 65 72 79 2e  lated sub-query.
cad0: 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  .  */.  for(i=0;
cae0: 20 69 3c 70 44 69 73 74 69 6e 63 74 2d 3e 6e 45   i<pDistinct->nE
caf0: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45  xpr; i++){.    E
cb00: 78 70 72 20 2a 70 20 3d 20 73 71 6c 69 74 65 33  xpr *p = sqlite3
cb10: 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28  ExprSkipCollate(
cb20: 70 44 69 73 74 69 6e 63 74 2d 3e 61 5b 69 5d 2e  pDistinct->a[i].
cb30: 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20  pExpr);.    if( 
cb40: 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  p->op==TK_COLUMN
cb50: 20 26 26 20 70 2d 3e 69 54 61 62 6c 65 3d 3d 69   && p->iTable==i
cb60: 42 61 73 65 20 26 26 20 70 2d 3e 69 43 6f 6c 75  Base && p->iColu
cb70: 6d 6e 3c 30 20 29 20 72 65 74 75 72 6e 20 31 3b  mn<0 ) return 1;
cb80: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20  .  }..  /* Loop 
cb90: 74 68 72 6f 75 67 68 20 61 6c 6c 20 69 6e 64 69  through all indi
cba0: 63 65 73 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  ces on the table
cbb0: 2c 20 63 68 65 63 6b 69 6e 67 20 65 61 63 68 20  , checking each 
cbc0: 74 6f 20 73 65 65 20 69 66 20 69 74 20 6d 61 6b  to see if it mak
cbd0: 65 73 0a 20 20 2a 2a 20 74 68 65 20 44 49 53 54  es.  ** the DIST
cbe0: 49 4e 43 54 20 71 75 61 6c 69 66 69 65 72 20 72  INCT qualifier r
cbf0: 65 64 75 6e 64 61 6e 74 2e 20 49 74 20 64 6f 65  edundant. It doe
cc00: 73 20 73 6f 20 69 66 3a 0a 20 20 2a 2a 0a 20 20  s so if:.  **.  
cc10: 2a 2a 20 20 20 31 2e 20 54 68 65 20 69 6e 64 65  **   1. The inde
cc20: 78 20 69 73 20 69 74 73 65 6c 66 20 55 4e 49 51  x is itself UNIQ
cc30: 55 45 2c 20 61 6e 64 0a 20 20 2a 2a 0a 20 20 2a  UE, and.  **.  *
cc40: 2a 20 20 20 32 2e 20 41 6c 6c 20 6f 66 20 74 68  *   2. All of th
cc50: 65 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  e columns in the
cc60: 20 69 6e 64 65 78 20 61 72 65 20 65 69 74 68 65   index are eithe
cc70: 72 20 70 61 72 74 20 6f 66 20 74 68 65 20 70 44  r part of the pD
cc80: 69 73 74 69 6e 63 74 0a 20 20 2a 2a 20 20 20 20  istinct.  **    
cc90: 20 20 6c 69 73 74 2c 20 6f 72 20 65 6c 73 65 20    list, or else 
cca0: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
ccb0: 20 63 6f 6e 74 61 69 6e 73 20 61 20 74 65 72 6d   contains a term
ccc0: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 63 6f   of the form "co
ccd0: 6c 3d 58 22 2c 0a 20 20 2a 2a 20 20 20 20 20 20  l=X",.  **      
cce0: 77 68 65 72 65 20 58 20 69 73 20 61 20 63 6f 6e  where X is a con
ccf0: 73 74 61 6e 74 20 76 61 6c 75 65 2e 20 54 68 65  stant value. The
cd00: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
cd10: 6e 63 65 73 20 6f 66 20 74 68 65 0a 20 20 2a 2a  nces of the.  **
cd20: 20 20 20 20 20 20 63 6f 6d 70 61 72 69 73 6f 6e        comparison
cd30: 20 61 6e 64 20 73 65 6c 65 63 74 2d 6c 69 73 74   and select-list
cd40: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6d 75 73   expressions mus
cd50: 74 20 6d 61 74 63 68 20 74 68 6f 73 65 20 6f 66  t match those of
cd60: 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 2a 2a   the index..  **
cd70: 0a 20 20 2a 2a 20 20 20 33 2e 20 41 6c 6c 20 6f  .  **   3. All o
cd80: 66 20 74 68 6f 73 65 20 69 6e 64 65 78 20 63 6f  f those index co
cd90: 6c 75 6d 6e 73 20 66 6f 72 20 77 68 69 63 68 20  lumns for which 
cda0: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
cdb0: 20 64 6f 65 73 20 6e 6f 74 0a 20 20 2a 2a 20 20   does not.  **  
cdc0: 20 20 20 20 63 6f 6e 74 61 69 6e 20 61 20 22 63      contain a "c
cdd0: 6f 6c 3d 58 22 20 74 65 72 6d 20 61 72 65 20 73  ol=X" term are s
cde0: 75 62 6a 65 63 74 20 74 6f 20 61 20 4e 4f 54 20  ubject to a NOT 
cdf0: 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74 2e  NULL constraint.
ce00: 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 49 64 78  .  */.  for(pIdx
ce10: 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70  =pTab->pIndex; p
ce20: 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  Idx; pIdx=pIdx->
ce30: 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  pNext){.    if( 
ce40: 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f  pIdx->onError==O
ce50: 45 5f 4e 6f 6e 65 20 29 20 63 6f 6e 74 69 6e 75  E_None ) continu
ce60: 65 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  e;.    for(i=0; 
ce70: 69 3c 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b  i<pIdx->nKeyCol;
ce80: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 31 36   i++){.      i16
ce90: 20 69 43 6f 6c 20 3d 20 70 49 64 78 2d 3e 61 69   iCol = pIdx->ai
cea0: 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20  Column[i];.     
ceb0: 20 69 66 28 20 30 3d 3d 66 69 6e 64 54 65 72 6d   if( 0==findTerm
cec0: 28 70 57 43 2c 20 69 42 61 73 65 2c 20 69 43 6f  (pWC, iBase, iCo
ced0: 6c 2c 20 7e 28 42 69 74 6d 61 73 6b 29 30 2c 20  l, ~(Bitmask)0, 
cee0: 57 4f 5f 45 51 2c 20 70 49 64 78 29 20 29 7b 0a  WO_EQ, pIdx) ){.
cef0: 20 20 20 20 20 20 20 20 69 6e 74 20 69 49 64 78          int iIdx
cf00: 43 6f 6c 20 3d 20 66 69 6e 64 49 6e 64 65 78 43  Col = findIndexC
cf10: 6f 6c 28 70 50 61 72 73 65 2c 20 70 44 69 73 74  ol(pParse, pDist
cf20: 69 6e 63 74 2c 20 69 42 61 73 65 2c 20 70 49 64  inct, iBase, pId
cf30: 78 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 69  x, i);.        i
cf40: 66 28 20 69 49 64 78 43 6f 6c 3c 30 20 7c 7c 20  f( iIdxCol<0 || 
cf50: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
cf60: 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 20 29 7b 0a 20  .notNull==0 ){. 
cf70: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
cf80: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
cf90: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
cfa0: 69 3d 3d 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c  i==pIdx->nKeyCol
cfb0: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69   ){.      /* Thi
cfc0: 73 20 69 6e 64 65 78 20 69 6d 70 6c 69 65 73 20  s index implies 
cfd0: 74 68 61 74 20 74 68 65 20 44 49 53 54 49 4e 43  that the DISTINC
cfe0: 54 20 71 75 61 6c 69 66 69 65 72 20 69 73 20 72  T qualifier is r
cff0: 65 64 75 6e 64 61 6e 74 2e 20 2a 2f 0a 20 20 20  edundant. */.   
d000: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
d010: 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
d020: 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45 73   0;.}.../*.** Es
d030: 74 69 6d 61 74 65 20 74 68 65 20 6c 6f 67 61 72  timate the logar
d040: 69 74 68 6d 20 6f 66 20 74 68 65 20 69 6e 70 75  ithm of the inpu
d050: 74 20 76 61 6c 75 65 20 74 6f 20 62 61 73 65 20  t value to base 
d060: 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4c 6f 67  2..*/.static Log
d070: 45 73 74 20 65 73 74 4c 6f 67 28 4c 6f 67 45 73  Est estLog(LogEs
d080: 74 20 4e 29 7b 0a 20 20 72 65 74 75 72 6e 20 4e  t N){.  return N
d090: 3c 3d 31 30 20 3f 20 30 20 3a 20 73 71 6c 69 74  <=10 ? 0 : sqlit
d0a0: 65 33 4c 6f 67 45 73 74 28 4e 29 20 2d 20 33 33  e3LogEst(N) - 33
d0b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 77 6f 20 72  ;.}../*.** Two r
d0c0: 6f 75 74 69 6e 65 73 20 66 6f 72 20 70 72 69 6e  outines for prin
d0d0: 74 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74  ting the content
d0e0: 20 6f 66 20 61 6e 20 73 71 6c 69 74 65 33 5f 69   of an sqlite3_i
d0f0: 6e 64 65 78 5f 69 6e 66 6f 0a 2a 2a 20 73 74 72  ndex_info.** str
d100: 75 63 74 75 72 65 2e 20 20 55 73 65 64 20 66 6f  ucture.  Used fo
d110: 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 64 65  r testing and de
d120: 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 20 20 49  bugging only.  I
d130: 66 20 6e 65 69 74 68 65 72 0a 2a 2a 20 53 51 4c  f neither.** SQL
d140: 49 54 45 5f 54 45 53 54 20 6f 72 20 53 51 4c 49  ITE_TEST or SQLI
d150: 54 45 5f 44 45 42 55 47 20 61 72 65 20 64 65 66  TE_DEBUG are def
d160: 69 6e 65 64 2c 20 74 68 65 6e 20 74 68 65 73 65  ined, then these
d170: 20 72 6f 75 74 69 6e 65 73 0a 2a 2a 20 61 72 65   routines.** are
d180: 20 6e 6f 2d 6f 70 73 2e 0a 2a 2f 0a 23 69 66 20   no-ops..*/.#if 
d190: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
d1a0: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
d1b0: 45 29 20 26 26 20 64 65 66 69 6e 65 64 28 57 48  E) && defined(WH
d1c0: 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
d1d0: 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20 54 52  ).static void TR
d1e0: 41 43 45 5f 49 44 58 5f 49 4e 50 55 54 53 28 73  ACE_IDX_INPUTS(s
d1f0: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
d200: 6f 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  o *p){.  int i;.
d210: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 57 68    if( !sqlite3Wh
d220: 65 72 65 54 72 61 63 65 20 29 20 72 65 74 75 72  ereTrace ) retur
d230: 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  n;.  for(i=0; i<
d240: 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20  p->nConstraint; 
d250: 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
d260: 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20  3DebugPrintf("  
d270: 63 6f 6e 73 74 72 61 69 6e 74 5b 25 64 5d 3a 20  constraint[%d]: 
d280: 63 6f 6c 3d 25 64 20 74 65 72 6d 69 64 3d 25 64  col=%d termid=%d
d290: 20 6f 70 3d 25 64 20 75 73 61 62 6c 65 64 3d 25   op=%d usabled=%
d2a0: 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69 2c 0a  d\n",.       i,.
d2b0: 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74         p->aConst
d2c0: 72 61 69 6e 74 5b 69 5d 2e 69 43 6f 6c 75 6d 6e  raint[i].iColumn
d2d0: 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e  ,.       p->aCon
d2e0: 73 74 72 61 69 6e 74 5b 69 5d 2e 69 54 65 72 6d  straint[i].iTerm
d2f0: 4f 66 66 73 65 74 2c 0a 20 20 20 20 20 20 20 70  Offset,.       p
d300: 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d  ->aConstraint[i]
d310: 2e 6f 70 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61  .op,.       p->a
d320: 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 75 73  Constraint[i].us
d330: 61 62 6c 65 29 3b 0a 20 20 7d 0a 20 20 66 6f 72  able);.  }.  for
d340: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 72 64 65  (i=0; i<p->nOrde
d350: 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  rBy; i++){.    s
d360: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
d370: 66 28 22 20 20 6f 72 64 65 72 62 79 5b 25 64 5d  f("  orderby[%d]
d380: 3a 20 63 6f 6c 3d 25 64 20 64 65 73 63 3d 25 64  : col=%d desc=%d
d390: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69 2c 0a 20  \n",.       i,. 
d3a0: 20 20 20 20 20 20 70 2d 3e 61 4f 72 64 65 72 42        p->aOrderB
d3b0: 79 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 2c 0a 20 20  y[i].iColumn,.  
d3c0: 20 20 20 20 20 70 2d 3e 61 4f 72 64 65 72 42 79       p->aOrderBy
d3d0: 5b 69 5d 2e 64 65 73 63 29 3b 0a 20 20 7d 0a 7d  [i].desc);.  }.}
d3e0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 54 52 41  .static void TRA
d3f0: 43 45 5f 49 44 58 5f 4f 55 54 50 55 54 53 28 73  CE_IDX_OUTPUTS(s
d400: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
d410: 6f 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  o *p){.  int i;.
d420: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 57 68    if( !sqlite3Wh
d430: 65 72 65 54 72 61 63 65 20 29 20 72 65 74 75 72  ereTrace ) retur
d440: 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  n;.  for(i=0; i<
d450: 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20  p->nConstraint; 
d460: 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
d470: 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20  3DebugPrintf("  
d480: 75 73 61 67 65 5b 25 64 5d 3a 20 61 72 67 76 49  usage[%d]: argvI
d490: 64 78 3d 25 64 20 6f 6d 69 74 3d 25 64 5c 6e 22  dx=%d omit=%d\n"
d4a0: 2c 0a 20 20 20 20 20 20 20 69 2c 0a 20 20 20 20  ,.       i,.    
d4b0: 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e     p->aConstrain
d4c0: 74 55 73 61 67 65 5b 69 5d 2e 61 72 67 76 49 6e  tUsage[i].argvIn
d4d0: 64 65 78 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61  dex,.       p->a
d4e0: 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b  ConstraintUsage[
d4f0: 69 5d 2e 6f 6d 69 74 29 3b 0a 20 20 7d 0a 20 20  i].omit);.  }.  
d500: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
d510: 74 66 28 22 20 20 69 64 78 4e 75 6d 3d 25 64 5c  tf("  idxNum=%d\
d520: 6e 22 2c 20 70 2d 3e 69 64 78 4e 75 6d 29 3b 0a  n", p->idxNum);.
d530: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
d540: 69 6e 74 66 28 22 20 20 69 64 78 53 74 72 3d 25  intf("  idxStr=%
d550: 73 5c 6e 22 2c 20 70 2d 3e 69 64 78 53 74 72 29  s\n", p->idxStr)
d560: 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67  ;.  sqlite3Debug
d570: 50 72 69 6e 74 66 28 22 20 20 6f 72 64 65 72 42  Printf("  orderB
d580: 79 43 6f 6e 73 75 6d 65 64 3d 25 64 5c 6e 22 2c  yConsumed=%d\n",
d590: 20 70 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75   p->orderByConsu
d5a0: 6d 65 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  med);.  sqlite3D
d5b0: 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 65 73  ebugPrintf("  es
d5c0: 74 69 6d 61 74 65 64 43 6f 73 74 3d 25 67 5c 6e  timatedCost=%g\n
d5d0: 22 2c 20 70 2d 3e 65 73 74 69 6d 61 74 65 64 43  ", p->estimatedC
d5e0: 6f 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  ost);.  sqlite3D
d5f0: 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 65 73  ebugPrintf("  es
d600: 74 69 6d 61 74 65 64 52 6f 77 73 3d 25 6c 6c 64  timatedRows=%lld
d610: 5c 6e 22 2c 20 70 2d 3e 65 73 74 69 6d 61 74 65  \n", p->estimate
d620: 64 52 6f 77 73 29 3b 0a 7d 0a 23 65 6c 73 65 0a  dRows);.}.#else.
d630: 23 64 65 66 69 6e 65 20 54 52 41 43 45 5f 49 44  #define TRACE_ID
d640: 58 5f 49 4e 50 55 54 53 28 41 29 0a 23 64 65 66  X_INPUTS(A).#def
d650: 69 6e 65 20 54 52 41 43 45 5f 49 44 58 5f 4f 55  ine TRACE_IDX_OU
d660: 54 50 55 54 53 28 41 29 0a 23 65 6e 64 69 66 0a  TPUTS(A).#endif.
d670: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
d680: 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49  OMIT_AUTOMATIC_I
d690: 4e 44 45 58 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  NDEX./*.** Retur
d6a0: 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 57 48  n TRUE if the WH
d6b0: 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20  ERE clause term 
d6c0: 70 54 65 72 6d 20 69 73 20 6f 66 20 61 20 66 6f  pTerm is of a fo
d6d0: 72 6d 20 77 68 65 72 65 20 69 74 0a 2a 2a 20 63  rm where it.** c
d6e0: 6f 75 6c 64 20 62 65 20 75 73 65 64 20 77 69 74  ould be used wit
d6f0: 68 20 61 6e 20 69 6e 64 65 78 20 74 6f 20 61 63  h an index to ac
d700: 63 65 73 73 20 70 53 72 63 2c 20 61 73 73 75 6d  cess pSrc, assum
d710: 69 6e 67 20 61 6e 20 61 70 70 72 6f 70 72 69 61  ing an appropria
d720: 74 65 0a 2a 2a 20 69 6e 64 65 78 20 65 78 69 73  te.** index exis
d730: 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ted..*/.static i
d740: 6e 74 20 74 65 72 6d 43 61 6e 44 72 69 76 65 49  nt termCanDriveI
d750: 6e 64 65 78 28 0a 20 20 57 68 65 72 65 54 65 72  ndex(.  WhereTer
d760: 6d 20 2a 70 54 65 72 6d 2c 20 20 20 20 20 20 20  m *pTerm,       
d770: 20 20 20 20 20 20 20 2f 2a 20 57 48 45 52 45 20         /* WHERE 
d780: 63 6c 61 75 73 65 20 74 65 72 6d 20 74 6f 20 63  clause term to c
d790: 68 65 63 6b 20 2a 2f 0a 20 20 73 74 72 75 63 74  heck */.  struct
d7a0: 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
d7b0: 53 72 63 2c 20 20 20 20 20 2f 2a 20 54 61 62 6c  Src,     /* Tabl
d7c0: 65 20 77 65 20 61 72 65 20 74 72 79 69 6e 67 20  e we are trying 
d7d0: 74 6f 20 61 63 63 65 73 73 20 2a 2f 0a 20 20 42  to access */.  B
d7e0: 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 20  itmask notReady 
d7f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d800: 20 54 61 62 6c 65 73 20 69 6e 20 6f 75 74 65 72   Tables in outer
d810: 20 6c 6f 6f 70 73 20 6f 66 20 74 68 65 20 6a 6f   loops of the jo
d820: 69 6e 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20  in */.){.  char 
d830: 61 66 66 3b 0a 20 20 69 66 28 20 70 54 65 72 6d  aff;.  if( pTerm
d840: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 21 3d 70 53  ->leftCursor!=pS
d850: 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 20 72 65  rc->iCursor ) re
d860: 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 70  turn 0;.  if( (p
d870: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
d880: 26 20 57 4f 5f 45 51 29 3d 3d 30 20 29 20 72 65  & WO_EQ)==0 ) re
d890: 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 70  turn 0;.  if( (p
d8a0: 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
d8b0: 74 20 26 20 6e 6f 74 52 65 61 64 79 29 21 3d 30  t & notReady)!=0
d8c0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
d8d0: 66 28 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74  f( pTerm->u.left
d8e0: 43 6f 6c 75 6d 6e 3c 30 20 29 20 72 65 74 75 72  Column<0 ) retur
d8f0: 6e 20 30 3b 0a 20 20 61 66 66 20 3d 20 70 53 72  n 0;.  aff = pSr
d900: 63 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 54  c->pTab->aCol[pT
d910: 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d  erm->u.leftColum
d920: 6e 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 69  n].affinity;.  i
d930: 66 28 20 21 73 71 6c 69 74 65 33 49 6e 64 65 78  f( !sqlite3Index
d940: 41 66 66 69 6e 69 74 79 4f 6b 28 70 54 65 72 6d  AffinityOk(pTerm
d950: 2d 3e 70 45 78 70 72 2c 20 61 66 66 29 20 29 20  ->pExpr, aff) ) 
d960: 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75  return 0;.  retu
d970: 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  rn 1;.}.#endif..
d980: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
d990: 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49  OMIT_AUTOMATIC_I
d9a0: 4e 44 45 58 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  NDEX./*.** Gener
d9b0: 61 74 65 20 63 6f 64 65 20 74 6f 20 63 6f 6e 73  ate code to cons
d9c0: 74 72 75 63 74 20 74 68 65 20 49 6e 64 65 78 20  truct the Index 
d9d0: 6f 62 6a 65 63 74 20 66 6f 72 20 61 6e 20 61 75  object for an au
d9e0: 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 0a 2a 2a  tomatic index.**
d9f0: 20 61 6e 64 20 74 6f 20 73 65 74 20 75 70 20 74   and to set up t
da00: 68 65 20 57 68 65 72 65 4c 65 76 65 6c 20 6f 62  he WhereLevel ob
da10: 6a 65 63 74 20 70 4c 65 76 65 6c 20 73 6f 20 74  ject pLevel so t
da20: 68 61 74 20 74 68 65 20 63 6f 64 65 20 67 65 6e  hat the code gen
da30: 65 72 61 74 6f 72 0a 2a 2a 20 6d 61 6b 65 73 20  erator.** makes 
da40: 75 73 65 20 6f 66 20 74 68 65 20 61 75 74 6f 6d  use of the autom
da50: 61 74 69 63 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73  atic index..*/.s
da60: 74 61 74 69 63 20 76 6f 69 64 20 63 6f 6e 73 74  tatic void const
da70: 72 75 63 74 41 75 74 6f 6d 61 74 69 63 49 6e 64  ructAutomaticInd
da80: 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ex(.  Parse *pPa
da90: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  rse,            
daa0: 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67    /* The parsing
dab0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68   context */.  Wh
dac0: 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20  ereClause *pWC, 
dad0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
dae0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
daf0: 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
db00: 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20 20 2f  t_item *pSrc,  /
db10: 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * The FROM claus
db20: 65 20 74 65 72 6d 20 74 6f 20 67 65 74 20 74 68  e term to get th
db30: 65 20 6e 65 78 74 20 69 6e 64 65 78 20 2a 2f 0a  e next index */.
db40: 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61    Bitmask notRea
db50: 64 79 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  dy,           /*
db60: 20 4d 61 73 6b 20 6f 66 20 63 75 72 73 6f 72 73   Mask of cursors
db70: 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20 61 76   that are not av
db80: 61 69 6c 61 62 6c 65 20 2a 2f 0a 20 20 57 68 65  ailable */.  Whe
db90: 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 20  reLevel *pLevel 
dba0: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
dbb0: 65 20 6e 65 77 20 69 6e 64 65 78 20 68 65 72 65  e new index here
dbc0: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 4b 65   */.){.  int nKe
dbd0: 79 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20  yCol;           
dbe0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
dbf0: 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  f columns in the
dc00: 20 63 6f 6e 73 74 72 75 63 74 65 64 20 69 6e 64   constructed ind
dc10: 65 78 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  ex */.  WhereTer
dc20: 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20  m *pTerm;       
dc30: 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20      /* A single 
dc40: 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52  term of the WHER
dc50: 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68  E clause */.  Wh
dc60: 65 72 65 54 65 72 6d 20 2a 70 57 43 45 6e 64 3b  ereTerm *pWCEnd;
dc70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64            /* End
dc80: 20 6f 66 20 70 57 43 2d 3e 61 5b 5d 20 2a 2f 0a   of pWC->a[] */.
dc90: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20    Index *pIdx;  
dca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
dcb0: 20 4f 62 6a 65 63 74 20 64 65 73 63 72 69 62 69   Object describi
dcc0: 6e 67 20 74 68 65 20 74 72 61 6e 73 69 65 6e 74  ng the transient
dcd0: 20 69 6e 64 65 78 20 2a 2f 0a 20 20 56 64 62 65   index */.  Vdbe
dce0: 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20   *v;            
dcf0: 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 70 61          /* Prepa
dd00: 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 75 6e  red statement un
dd10: 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
dd20: 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 49 6e   */.  int addrIn
dd30: 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  it;             
dd40: 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
dd50: 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  the initializati
dd60: 6f 6e 20 62 79 70 61 73 73 20 6a 75 6d 70 20 2a  on bypass jump *
dd70: 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 6c  /.  Table *pTabl
dd80: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
dd90: 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 62 65 69  /* The table bei
dda0: 6e 67 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20  ng indexed */.  
ddb0: 69 6e 74 20 61 64 64 72 54 6f 70 3b 20 20 20 20  int addrTop;    
ddc0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
ddd0: 6f 70 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  op of the index 
dde0: 66 69 6c 6c 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69  fill loop */.  i
ddf0: 6e 74 20 72 65 67 52 65 63 6f 72 64 3b 20 20 20  nt regRecord;   
de00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
de10: 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 61  gister holding a
de20: 6e 20 69 6e 64 65 78 20 72 65 63 6f 72 64 20 2a  n index record *
de30: 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20  /.  int n;      
de40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de50: 2f 2a 20 43 6f 6c 75 6d 6e 20 63 6f 75 6e 74 65  /* Column counte
de60: 72 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20  r */.  int i;   
de70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de80: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
de90: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 42 69  er */.  int mxBi
dea0: 74 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20  tCol;           
deb0: 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 63      /* Maximum c
dec0: 6f 6c 75 6d 6e 20 69 6e 20 70 53 72 63 2d 3e 63  olumn in pSrc->c
ded0: 6f 6c 55 73 65 64 20 2a 2f 0a 20 20 43 6f 6c 6c  olUsed */.  Coll
dee0: 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 20  Seq *pColl;     
def0: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61          /* Colla
df00: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 74 6f  ting sequence to
df10: 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20 2a 2f 0a   on a column */.
df20: 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f    WhereLoop *pLo
df30: 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  op;           /*
df40: 20 54 68 65 20 4c 6f 6f 70 20 6f 62 6a 65 63 74   The Loop object
df50: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 6f 74   */.  char *zNot
df60: 55 73 65 64 3b 20 20 20 20 20 20 20 20 20 20 20  Used;           
df70: 20 20 2f 2a 20 45 78 74 72 61 20 73 70 61 63 65    /* Extra space
df80: 20 6f 6e 20 74 68 65 20 65 6e 64 20 6f 66 20 70   on the end of p
df90: 49 64 78 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  Idx */.  Bitmask
dfa0: 20 69 64 78 43 6f 6c 73 3b 20 20 20 20 20 20 20   idxCols;       
dfb0: 20 20 20 20 20 2f 2a 20 42 69 74 6d 61 70 20 6f       /* Bitmap o
dfc0: 66 20 63 6f 6c 75 6d 6e 73 20 75 73 65 64 20 66  f columns used f
dfd0: 6f 72 20 69 6e 64 65 78 69 6e 67 20 2a 2f 0a 20  or indexing */. 
dfe0: 20 42 69 74 6d 61 73 6b 20 65 78 74 72 61 43 6f   Bitmask extraCo
dff0: 6c 73 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ls;          /* 
e000: 42 69 74 6d 61 70 20 6f 66 20 61 64 64 69 74 69  Bitmap of additi
e010: 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a  onal columns */.
e020: 20 20 75 38 20 73 65 6e 74 57 61 72 6e 69 6e 67    u8 sentWarning
e030: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a   = 0;         /*
e040: 20 54 72 75 65 20 69 66 20 61 20 77 61 72 6e 6e   True if a warnn
e050: 69 6e 67 20 68 61 73 20 62 65 65 6e 20 69 73 73  ing has been iss
e060: 75 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20 47 65 6e  ued */..  /* Gen
e070: 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 73 6b  erate code to sk
e080: 69 70 20 6f 76 65 72 20 74 68 65 20 63 72 65 61  ip over the crea
e090: 74 69 6f 6e 20 61 6e 64 20 69 6e 69 74 69 61 6c  tion and initial
e0a0: 69 7a 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a 20  ization of the. 
e0b0: 20 2a 2a 20 74 72 61 6e 73 69 65 6e 74 20 69 6e   ** transient in
e0c0: 64 65 78 20 6f 6e 20 32 6e 64 20 61 6e 64 20 73  dex on 2nd and s
e0d0: 75 62 73 65 71 75 65 6e 74 20 69 74 65 72 61 74  ubsequent iterat
e0e0: 69 6f 6e 73 20 6f 66 20 74 68 65 20 6c 6f 6f 70  ions of the loop
e0f0: 2e 20 2a 2f 0a 20 20 76 20 3d 20 70 50 61 72 73  . */.  v = pPars
e100: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65  e->pVdbe;.  asse
e110: 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 61 64  rt( v!=0 );.  ad
e120: 64 72 49 6e 69 74 20 3d 20 73 71 6c 69 74 65 33  drInit = sqlite3
e130: 43 6f 64 65 4f 6e 63 65 28 70 50 61 72 73 65 29  CodeOnce(pParse)
e140: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
e150: 29 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 74  );..  /* Count t
e160: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  he number of col
e170: 75 6d 6e 73 20 74 68 61 74 20 77 69 6c 6c 20 62  umns that will b
e180: 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 69  e added to the i
e190: 6e 64 65 78 0a 20 20 2a 2a 20 61 6e 64 20 75 73  ndex.  ** and us
e1a0: 65 64 20 74 6f 20 6d 61 74 63 68 20 57 48 45 52  ed to match WHER
e1b0: 45 20 63 6c 61 75 73 65 20 63 6f 6e 73 74 72 61  E clause constra
e1c0: 69 6e 74 73 20 2a 2f 0a 20 20 6e 4b 65 79 43 6f  ints */.  nKeyCo
e1d0: 6c 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65 20  l = 0;.  pTable 
e1e0: 3d 20 70 53 72 63 2d 3e 70 54 61 62 3b 0a 20 20  = pSrc->pTab;.  
e1f0: 70 57 43 45 6e 64 20 3d 20 26 70 57 43 2d 3e 61  pWCEnd = &pWC->a
e200: 5b 70 57 43 2d 3e 6e 54 65 72 6d 5d 3b 0a 20 20  [pWC->nTerm];.  
e210: 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e  pLoop = pLevel->
e220: 70 57 4c 6f 6f 70 3b 0a 20 20 69 64 78 43 6f 6c  pWLoop;.  idxCol
e230: 73 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 54 65  s = 0;.  for(pTe
e240: 72 6d 3d 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d  rm=pWC->a; pTerm
e250: 3c 70 57 43 45 6e 64 3b 20 70 54 65 72 6d 2b 2b  <pWCEnd; pTerm++
e260: 29 7b 0a 20 20 20 20 69 66 28 20 74 65 72 6d 43  ){.    if( termC
e270: 61 6e 44 72 69 76 65 49 6e 64 65 78 28 70 54 65  anDriveIndex(pTe
e280: 72 6d 2c 20 70 53 72 63 2c 20 6e 6f 74 52 65 61  rm, pSrc, notRea
e290: 64 79 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  dy) ){.      int
e2a0: 20 69 43 6f 6c 20 3d 20 70 54 65 72 6d 2d 3e 75   iCol = pTerm->u
e2b0: 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20  .leftColumn;.   
e2c0: 20 20 20 42 69 74 6d 61 73 6b 20 63 4d 61 73 6b     Bitmask cMask
e2d0: 20 3d 20 69 43 6f 6c 3e 3d 42 4d 53 20 3f 20 4d   = iCol>=BMS ? M
e2e0: 41 53 4b 42 49 54 28 42 4d 53 2d 31 29 20 3a 20  ASKBIT(BMS-1) : 
e2f0: 4d 41 53 4b 42 49 54 28 69 43 6f 6c 29 3b 0a 20  MASKBIT(iCol);. 
e300: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
e310: 43 6f 6c 3d 3d 42 4d 53 20 29 3b 0a 20 20 20 20  Col==BMS );.    
e320: 20 20 74 65 73 74 63 61 73 65 28 20 69 43 6f 6c    testcase( iCol
e330: 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20  ==BMS-1 );.     
e340: 20 69 66 28 20 21 73 65 6e 74 57 61 72 6e 69 6e   if( !sentWarnin
e350: 67 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  g ){.        sql
e360: 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f  ite3_log(SQLITE_
e370: 57 41 52 4e 49 4e 47 5f 41 55 54 4f 49 4e 44 45  WARNING_AUTOINDE
e380: 58 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  X,.            "
e390: 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20  automatic index 
e3a0: 6f 6e 20 25 73 28 25 73 29 22 2c 20 70 54 61 62  on %s(%s)", pTab
e3b0: 6c 65 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20  le->zName,.     
e3c0: 20 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 61         pTable->a
e3d0: 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 29  Col[iCol].zName)
e3e0: 3b 0a 20 20 20 20 20 20 20 20 73 65 6e 74 57 61  ;.        sentWa
e3f0: 72 6e 69 6e 67 20 3d 20 31 3b 0a 20 20 20 20 20  rning = 1;.     
e400: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28 69 64   }.      if( (id
e410: 78 43 6f 6c 73 20 26 20 63 4d 61 73 6b 29 3d 3d  xCols & cMask)==
e420: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  0 ){.        if(
e430: 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65   whereLoopResize
e440: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c 6f  (pParse->db, pLo
e450: 6f 70 2c 20 6e 4b 65 79 43 6f 6c 2b 31 29 20 29  op, nKeyCol+1) )
e460: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20   return;.       
e470: 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6e   pLoop->aLTerm[n
e480: 4b 65 79 43 6f 6c 2b 2b 5d 20 3d 20 70 54 65 72  KeyCol++] = pTer
e490: 6d 3b 0a 20 20 20 20 20 20 20 20 69 64 78 43 6f  m;.        idxCo
e4a0: 6c 73 20 7c 3d 20 63 4d 61 73 6b 3b 0a 20 20 20  ls |= cMask;.   
e4b0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
e4c0: 20 61 73 73 65 72 74 28 20 6e 4b 65 79 43 6f 6c   assert( nKeyCol
e4d0: 3e 30 20 29 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 75  >0 );.  pLoop->u
e4e0: 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 70 4c 6f  .btree.nEq = pLo
e4f0: 6f 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20 6e 4b 65  op->nLTerm = nKe
e500: 79 43 6f 6c 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 77  yCol;.  pLoop->w
e510: 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 43  sFlags = WHERE_C
e520: 4f 4c 55 4d 4e 5f 45 51 20 7c 20 57 48 45 52 45  OLUMN_EQ | WHERE
e530: 5f 49 44 58 5f 4f 4e 4c 59 20 7c 20 57 48 45 52  _IDX_ONLY | WHER
e540: 45 5f 49 4e 44 45 58 45 44 0a 20 20 20 20 20 20  E_INDEXED.      
e550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
e560: 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45   WHERE_AUTO_INDE
e570: 58 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 74  X;..  /* Count t
e580: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 64 64  he number of add
e590: 69 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 73 20  itional columns 
e5a0: 6e 65 65 64 65 64 20 74 6f 20 63 72 65 61 74 65  needed to create
e5b0: 20 61 0a 20 20 2a 2a 20 63 6f 76 65 72 69 6e 67   a.  ** covering
e5c0: 20 69 6e 64 65 78 2e 20 20 41 20 22 63 6f 76 65   index.  A "cove
e5d0: 72 69 6e 67 20 69 6e 64 65 78 22 20 69 73 20 61  ring index" is a
e5e0: 6e 20 69 6e 64 65 78 20 74 68 61 74 20 63 6f 6e  n index that con
e5f0: 74 61 69 6e 73 20 61 6c 6c 0a 20 20 2a 2a 20 63  tains all.  ** c
e600: 6f 6c 75 6d 6e 73 20 74 68 61 74 20 61 72 65 20  olumns that are 
e610: 6e 65 65 64 65 64 20 62 79 20 74 68 65 20 71 75  needed by the qu
e620: 65 72 79 2e 20 20 57 69 74 68 20 61 20 63 6f 76  ery.  With a cov
e630: 65 72 69 6e 67 20 69 6e 64 65 78 2c 20 74 68 65  ering index, the
e640: 0a 20 20 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 74  .  ** original t
e650: 61 62 6c 65 20 6e 65 76 65 72 20 6e 65 65 64 73  able never needs
e660: 20 74 6f 20 62 65 20 61 63 63 65 73 73 65 64 2e   to be accessed.
e670: 20 20 41 75 74 6f 6d 61 74 69 63 20 69 6e 64 69    Automatic indi
e680: 63 65 73 20 6d 75 73 74 0a 20 20 2a 2a 20 62 65  ces must.  ** be
e690: 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65   a covering inde
e6a0: 78 20 62 65 63 61 75 73 65 20 74 68 65 20 69 6e  x because the in
e6b0: 64 65 78 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  dex will not be 
e6c0: 75 70 64 61 74 65 64 20 69 66 20 74 68 65 0a 20  updated if the. 
e6d0: 20 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 74 61 62   ** original tab
e6e0: 6c 65 20 63 68 61 6e 67 65 73 20 61 6e 64 20 74  le changes and t
e6f0: 68 65 20 69 6e 64 65 78 20 61 6e 64 20 74 61 62  he index and tab
e700: 6c 65 20 63 61 6e 6e 6f 74 20 62 6f 74 68 20 62  le cannot both b
e710: 65 20 75 73 65 64 0a 20 20 2a 2a 20 69 66 20 74  e used.  ** if t
e720: 68 65 79 20 67 6f 20 6f 75 74 20 6f 66 20 73 79  hey go out of sy
e730: 6e 63 2e 0a 20 20 2a 2f 0a 20 20 65 78 74 72 61  nc..  */.  extra
e740: 43 6f 6c 73 20 3d 20 70 53 72 63 2d 3e 63 6f 6c  Cols = pSrc->col
e750: 55 73 65 64 20 26 20 28 7e 69 64 78 43 6f 6c 73  Used & (~idxCols
e760: 20 7c 20 4d 41 53 4b 42 49 54 28 42 4d 53 2d 31   | MASKBIT(BMS-1
e770: 29 29 3b 0a 20 20 6d 78 42 69 74 43 6f 6c 20 3d  ));.  mxBitCol =
e780: 20 28 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3e   (pTable->nCol >
e790: 3d 20 42 4d 53 2d 31 29 20 3f 20 42 4d 53 2d 31  = BMS-1) ? BMS-1
e7a0: 20 3a 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b   : pTable->nCol;
e7b0: 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 54 61  .  testcase( pTa
e7c0: 62 6c 65 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 31  ble->nCol==BMS-1
e7d0: 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
e7e0: 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3d 3d 42 4d  pTable->nCol==BM
e7f0: 53 2d 32 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30  S-2 );.  for(i=0
e800: 3b 20 69 3c 6d 78 42 69 74 43 6f 6c 3b 20 69 2b  ; i<mxBitCol; i+
e810: 2b 29 7b 0a 20 20 20 20 69 66 28 20 65 78 74 72  +){.    if( extr
e820: 61 43 6f 6c 73 20 26 20 4d 41 53 4b 42 49 54 28  aCols & MASKBIT(
e830: 69 29 20 29 20 6e 4b 65 79 43 6f 6c 2b 2b 3b 0a  i) ) nKeyCol++;.
e840: 20 20 7d 0a 20 20 69 66 28 20 70 53 72 63 2d 3e    }.  if( pSrc->
e850: 63 6f 6c 55 73 65 64 20 26 20 4d 41 53 4b 42 49  colUsed & MASKBI
e860: 54 28 42 4d 53 2d 31 29 20 29 7b 0a 20 20 20 20  T(BMS-1) ){.    
e870: 6e 4b 65 79 43 6f 6c 20 2b 3d 20 70 54 61 62 6c  nKeyCol += pTabl
e880: 65 2d 3e 6e 43 6f 6c 20 2d 20 42 4d 53 20 2b 20  e->nCol - BMS + 
e890: 31 3b 0a 20 20 7d 0a 20 20 70 4c 6f 6f 70 2d 3e  1;.  }.  pLoop->
e8a0: 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45  wsFlags |= WHERE
e8b0: 5f 43 4f 4c 55 4d 4e 5f 45 51 20 7c 20 57 48 45  _COLUMN_EQ | WHE
e8c0: 52 45 5f 49 44 58 5f 4f 4e 4c 59 3b 0a 0a 20 20  RE_IDX_ONLY;..  
e8d0: 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20 74 68 65  /* Construct the
e8e0: 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 74 6f   Index object to
e8f0: 20 64 65 73 63 72 69 62 65 20 74 68 69 73 20 69   describe this i
e900: 6e 64 65 78 20 2a 2f 0a 20 20 70 49 64 78 20 3d  ndex */.  pIdx =
e910: 20 73 71 6c 69 74 65 33 41 6c 6c 6f 63 61 74 65   sqlite3Allocate
e920: 49 6e 64 65 78 4f 62 6a 65 63 74 28 70 50 61 72  IndexObject(pPar
e930: 73 65 2d 3e 64 62 2c 20 6e 4b 65 79 43 6f 6c 2b  se->db, nKeyCol+
e940: 31 2c 20 30 2c 20 26 7a 4e 6f 74 55 73 65 64 29  1, 0, &zNotUsed)
e950: 3b 0a 20 20 69 66 28 20 70 49 64 78 3d 3d 30 20  ;.  if( pIdx==0 
e960: 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 4c 6f 6f  ) return;.  pLoo
e970: 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
e980: 78 20 3d 20 70 49 64 78 3b 0a 20 20 70 49 64 78  x = pIdx;.  pIdx
e990: 2d 3e 7a 4e 61 6d 65 20 3d 20 22 61 75 74 6f 2d  ->zName = "auto-
e9a0: 69 6e 64 65 78 22 3b 0a 20 20 70 49 64 78 2d 3e  index";.  pIdx->
e9b0: 70 54 61 62 6c 65 20 3d 20 70 54 61 62 6c 65 3b  pTable = pTable;
e9c0: 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 69 64 78 43  .  n = 0;.  idxC
e9d0: 6f 6c 73 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70  ols = 0;.  for(p
e9e0: 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 70 54 65  Term=pWC->a; pTe
e9f0: 72 6d 3c 70 57 43 45 6e 64 3b 20 70 54 65 72 6d  rm<pWCEnd; pTerm
ea00: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 74 65 72  ++){.    if( ter
ea10: 6d 43 61 6e 44 72 69 76 65 49 6e 64 65 78 28 70  mCanDriveIndex(p
ea20: 54 65 72 6d 2c 20 70 53 72 63 2c 20 6e 6f 74 52  Term, pSrc, notR
ea30: 65 61 64 79 29 20 29 7b 0a 20 20 20 20 20 20 69  eady) ){.      i
ea40: 6e 74 20 69 43 6f 6c 20 3d 20 70 54 65 72 6d 2d  nt iCol = pTerm-
ea50: 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20  >u.leftColumn;. 
ea60: 20 20 20 20 20 42 69 74 6d 61 73 6b 20 63 4d 61       Bitmask cMa
ea70: 73 6b 20 3d 20 69 43 6f 6c 3e 3d 42 4d 53 20 3f  sk = iCol>=BMS ?
ea80: 20 4d 41 53 4b 42 49 54 28 42 4d 53 2d 31 29 20   MASKBIT(BMS-1) 
ea90: 3a 20 4d 41 53 4b 42 49 54 28 69 43 6f 6c 29 3b  : MASKBIT(iCol);
eaa0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
eab0: 20 69 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a   iCol==BMS-1 );.
eac0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
ead0: 69 43 6f 6c 3d 3d 42 4d 53 20 29 3b 0a 20 20 20  iCol==BMS );.   
eae0: 20 20 20 69 66 28 20 28 69 64 78 43 6f 6c 73 20     if( (idxCols 
eaf0: 26 20 63 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20  & cMask)==0 ){. 
eb00: 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 58 20         Expr *pX 
eb10: 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a  = pTerm->pExpr;.
eb20: 20 20 20 20 20 20 20 20 69 64 78 43 6f 6c 73 20          idxCols 
eb30: 7c 3d 20 63 4d 61 73 6b 3b 0a 20 20 20 20 20 20  |= cMask;.      
eb40: 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e    pIdx->aiColumn
eb50: 5b 6e 5d 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c  [n] = pTerm->u.l
eb60: 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  eftColumn;.     
eb70: 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
eb80: 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43  e3BinaryCompareC
eb90: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
eba0: 58 2d 3e 70 4c 65 66 74 2c 20 70 58 2d 3e 70 52  X->pLeft, pX->pR
ebb0: 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20 70  ight);.        p
ebc0: 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d  Idx->azColl[n] =
ebd0: 20 41 4c 57 41 59 53 28 70 43 6f 6c 6c 29 20 3f   ALWAYS(pColl) ?
ebe0: 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 20 3a 20   pColl->zName : 
ebf0: 22 42 49 4e 41 52 59 22 3b 0a 20 20 20 20 20 20  "BINARY";.      
ec00: 20 20 6e 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20    n++;.      }. 
ec10: 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72     }.  }.  asser
ec20: 74 28 20 28 75 33 32 29 6e 3d 3d 70 4c 6f 6f 70  t( (u32)n==pLoop
ec30: 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 29 3b  ->u.btree.nEq );
ec40: 0a 0a 20 20 2f 2a 20 41 64 64 20 61 64 64 69 74  ..  /* Add addit
ec50: 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 73 20 6e 65  ional columns ne
ec60: 65 64 65 64 20 74 6f 20 6d 61 6b 65 20 74 68 65  eded to make the
ec70: 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78   automatic index
ec80: 20 69 6e 74 6f 0a 20 20 2a 2a 20 61 20 63 6f 76   into.  ** a cov
ec90: 65 72 69 6e 67 20 69 6e 64 65 78 20 2a 2f 0a 20  ering index */. 
eca0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6d 78 42 69   for(i=0; i<mxBi
ecb0: 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  tCol; i++){.    
ecc0: 69 66 28 20 65 78 74 72 61 43 6f 6c 73 20 26 20  if( extraCols & 
ecd0: 4d 41 53 4b 42 49 54 28 69 29 20 29 7b 0a 20 20  MASKBIT(i) ){.  
ece0: 20 20 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75      pIdx->aiColu
ecf0: 6d 6e 5b 6e 5d 20 3d 20 69 3b 0a 20 20 20 20 20  mn[n] = i;.     
ed00: 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d   pIdx->azColl[n]
ed10: 20 3d 20 22 42 49 4e 41 52 59 22 3b 0a 20 20 20   = "BINARY";.   
ed20: 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20     n++;.    }.  
ed30: 7d 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 63 6f  }.  if( pSrc->co
ed40: 6c 55 73 65 64 20 26 20 4d 41 53 4b 42 49 54 28  lUsed & MASKBIT(
ed50: 42 4d 53 2d 31 29 20 29 7b 0a 20 20 20 20 66 6f  BMS-1) ){.    fo
ed60: 72 28 69 3d 42 4d 53 2d 31 3b 20 69 3c 70 54 61  r(i=BMS-1; i<pTa
ed70: 62 6c 65 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  ble->nCol; i++){
ed80: 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 61 69 43  .      pIdx->aiC
ed90: 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 69 3b 0a 20 20  olumn[n] = i;.  
eda0: 20 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c      pIdx->azColl
edb0: 5b 6e 5d 20 3d 20 22 42 49 4e 41 52 59 22 3b 0a  [n] = "BINARY";.
edc0: 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 7d        n++;.    }
edd0: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e  .  }.  assert( n
ede0: 3d 3d 6e 4b 65 79 43 6f 6c 20 29 3b 0a 20 20 70  ==nKeyCol );.  p
edf0: 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d  Idx->aiColumn[n]
ee00: 20 3d 20 2d 31 3b 0a 20 20 70 49 64 78 2d 3e 61   = -1;.  pIdx->a
ee10: 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 22 42 49 4e 41  zColl[n] = "BINA
ee20: 52 59 22 3b 0a 0a 20 20 2f 2a 20 43 72 65 61 74  RY";..  /* Creat
ee30: 65 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20  e the automatic 
ee40: 69 6e 64 65 78 20 2a 2f 0a 20 20 61 73 73 65 72  index */.  asser
ee50: 74 28 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43  t( pLevel->iIdxC
ee60: 75 72 3e 3d 30 20 29 3b 0a 20 20 70 4c 65 76 65  ur>=0 );.  pLeve
ee70: 6c 2d 3e 69 49 64 78 43 75 72 20 3d 20 70 50 61  l->iIdxCur = pPa
ee80: 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 73  rse->nTab++;.  s
ee90: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
eea0: 28 76 2c 20 4f 50 5f 4f 70 65 6e 41 75 74 6f 69  (v, OP_OpenAutoi
eeb0: 6e 64 65 78 2c 20 70 4c 65 76 65 6c 2d 3e 69 49  ndex, pLevel->iI
eec0: 64 78 43 75 72 2c 20 6e 4b 65 79 43 6f 6c 2b 31  dxCur, nKeyCol+1
eed0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
eee0: 53 65 74 50 34 4b 65 79 49 6e 66 6f 28 70 50 61  SetP4KeyInfo(pPa
eef0: 72 73 65 2c 20 70 49 64 78 29 3b 0a 20 20 56 64  rse, pIdx);.  Vd
ef00: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 66  beComment((v, "f
ef10: 6f 72 20 25 73 22 2c 20 70 54 61 62 6c 65 2d 3e  or %s", pTable->
ef20: 7a 4e 61 6d 65 29 29 3b 0a 0a 20 20 2f 2a 20 46  zName));..  /* F
ef30: 69 6c 6c 20 74 68 65 20 61 75 74 6f 6d 61 74 69  ill the automati
ef40: 63 20 69 6e 64 65 78 20 77 69 74 68 20 63 6f 6e  c index with con
ef50: 74 65 6e 74 20 2a 2f 0a 20 20 61 64 64 72 54 6f  tent */.  addrTo
ef60: 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  p = sqlite3VdbeA
ef70: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 77 69  ddOp1(v, OP_Rewi
ef80: 6e 64 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62  nd, pLevel->iTab
ef90: 43 75 72 29 3b 20 56 64 62 65 43 6f 76 65 72 61  Cur); VdbeCovera
efa0: 67 65 28 76 29 3b 0a 20 20 72 65 67 52 65 63 6f  ge(v);.  regReco
efb0: 72 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  rd = sqlite3GetT
efc0: 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
efd0: 20 20 73 71 6c 69 74 65 33 47 65 6e 65 72 61 74    sqlite3Generat
efe0: 65 49 6e 64 65 78 4b 65 79 28 70 50 61 72 73 65  eIndexKey(pParse
eff0: 2c 20 70 49 64 78 2c 20 70 4c 65 76 65 6c 2d 3e  , pIdx, pLevel->
f000: 69 54 61 62 43 75 72 2c 20 72 65 67 52 65 63 6f  iTabCur, regReco
f010: 72 64 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b  rd, 0, 0, 0, 0);
f020: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
f030: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e  dOp2(v, OP_IdxIn
f040: 73 65 72 74 2c 20 70 4c 65 76 65 6c 2d 3e 69 49  sert, pLevel->iI
f050: 64 78 43 75 72 2c 20 72 65 67 52 65 63 6f 72 64  dxCur, regRecord
f060: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
f070: 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
f080: 41 47 5f 55 53 45 53 45 45 4b 52 45 53 55 4c 54  AG_USESEEKRESULT
f090: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
f0a0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78  AddOp2(v, OP_Nex
f0b0: 74 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43  t, pLevel->iTabC
f0c0: 75 72 2c 20 61 64 64 72 54 6f 70 2b 31 29 3b 20  ur, addrTop+1); 
f0d0: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
f0e0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  .  sqlite3VdbeCh
f0f0: 61 6e 67 65 50 35 28 76 2c 20 53 51 4c 49 54 45  angeP5(v, SQLITE
f100: 5f 53 54 4d 54 53 54 41 54 55 53 5f 41 55 54 4f  _STMTSTATUS_AUTO
f110: 49 4e 44 45 58 29 3b 0a 20 20 73 71 6c 69 74 65  INDEX);.  sqlite
f120: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
f130: 20 61 64 64 72 54 6f 70 29 3b 0a 20 20 73 71 6c   addrTop);.  sql
f140: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
f150: 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 52 65  eg(pParse, regRe
f160: 63 6f 72 64 29 3b 0a 20 20 0a 20 20 2f 2a 20 4a  cord);.  .  /* J
f170: 75 6d 70 20 68 65 72 65 20 77 68 65 6e 20 73 6b  ump here when sk
f180: 69 70 70 69 6e 67 20 74 68 65 20 69 6e 69 74 69  ipping the initi
f190: 61 6c 69 7a 61 74 69 6f 6e 20 2a 2f 0a 20 20 73  alization */.  s
f1a0: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
f1b0: 72 65 28 76 2c 20 61 64 64 72 49 6e 69 74 29 3b  re(v, addrInit);
f1c0: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
f1d0: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54  ITE_OMIT_AUTOMAT
f1e0: 49 43 5f 49 4e 44 45 58 20 2a 2f 0a 0a 23 69 66  IC_INDEX */..#if
f1f0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
f200: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a  _VIRTUALTABLE./*
f210: 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64  .** Allocate and
f220: 20 70 6f 70 75 6c 61 74 65 20 61 6e 20 73 71 6c   populate an sql
f230: 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
f240: 73 74 72 75 63 74 75 72 65 2e 20 49 74 20 69 73  structure. It is
f250: 20 74 68 65 20 0a 2a 2a 20 72 65 73 70 6f 6e 73   the .** respons
f260: 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63  ibility of the c
f270: 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61  aller to eventua
f280: 6c 6c 79 20 72 65 6c 65 61 73 65 20 74 68 65 20  lly release the 
f290: 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 62 79 20  structure.** by 
f2a0: 70 61 73 73 69 6e 67 20 74 68 65 20 70 6f 69 6e  passing the poin
f2b0: 74 65 72 20 72 65 74 75 72 6e 65 64 20 62 79 20  ter returned by 
f2c0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 74 6f  this function to
f2d0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29 2e   sqlite3_free().
f2e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74  .*/.static sqlit
f2f0: 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 61  e3_index_info *a
f300: 6c 6c 6f 63 61 74 65 49 6e 64 65 78 49 6e 66 6f  llocateIndexInfo
f310: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
f320: 65 2c 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  e,.  WhereClause
f330: 20 2a 70 57 43 2c 0a 20 20 73 74 72 75 63 74 20   *pWC,.  struct 
f340: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53  SrcList_item *pS
f350: 72 63 2c 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  rc,.  ExprList *
f360: 70 4f 72 64 65 72 42 79 0a 29 7b 0a 20 20 69 6e  pOrderBy.){.  in
f370: 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 6e 54  t i, j;.  int nT
f380: 65 72 6d 3b 0a 20 20 73 74 72 75 63 74 20 73 71  erm;.  struct sq
f390: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
f3a0: 74 72 61 69 6e 74 20 2a 70 49 64 78 43 6f 6e 73  traint *pIdxCons
f3b0: 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69 74  ;.  struct sqlit
f3c0: 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62 79  e3_index_orderby
f3d0: 20 2a 70 49 64 78 4f 72 64 65 72 42 79 3b 0a 20   *pIdxOrderBy;. 
f3e0: 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f   struct sqlite3_
f3f0: 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
f400: 5f 75 73 61 67 65 20 2a 70 55 73 61 67 65 3b 0a  _usage *pUsage;.
f410: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
f420: 72 6d 3b 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72  rm;.  int nOrder
f430: 42 79 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e  By;.  sqlite3_in
f440: 64 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e  dex_info *pIdxIn
f450: 66 6f 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20  fo;..  /* Count 
f460: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 6f  the number of po
f470: 73 73 69 62 6c 65 20 57 48 45 52 45 20 63 6c 61  ssible WHERE cla
f480: 75 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  use constraints 
f490: 72 65 66 65 72 72 69 6e 67 0a 20 20 2a 2a 20 74  referring.  ** t
f4a0: 6f 20 74 68 69 73 20 76 69 72 74 75 61 6c 20 74  o this virtual t
f4b0: 61 62 6c 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  able */.  for(i=
f4c0: 6e 54 65 72 6d 3d 30 2c 20 70 54 65 72 6d 3d 70  nTerm=0, pTerm=p
f4d0: 57 43 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54  WC->a; i<pWC->nT
f4e0: 65 72 6d 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b  erm; i++, pTerm+
f4f0: 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65 72  +){.    if( pTer
f500: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 21 3d  m->leftCursor !=
f510: 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29   pSrc->iCursor )
f520: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61   continue;.    a
f530: 73 73 65 72 74 28 20 49 73 50 6f 77 65 72 4f 66  ssert( IsPowerOf
f540: 54 77 6f 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  Two(pTerm->eOper
f550: 61 74 6f 72 20 26 20 7e 57 4f 5f 45 51 55 49 56  ator & ~WO_EQUIV
f560: 29 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  ) );.    testcas
f570: 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  e( pTerm->eOpera
f580: 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20  tor & WO_IN );. 
f590: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
f5a0: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
f5b0: 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20  WO_ISNULL );.   
f5c0: 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
f5d0: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
f5e0: 5f 41 4c 4c 20 29 3b 0a 20 20 20 20 69 66 28 20  _ALL );.    if( 
f5f0: 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  (pTerm->eOperato
f600: 72 20 26 20 7e 28 57 4f 5f 49 53 4e 55 4c 4c 7c  r & ~(WO_ISNULL|
f610: 57 4f 5f 45 51 55 49 56 29 29 3d 3d 30 20 29 20  WO_EQUIV))==0 ) 
f620: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
f630: 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  ( pTerm->wtFlags
f640: 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 20 29 20   & TERM_VNULL ) 
f650: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 6e 54  continue;.    nT
f660: 65 72 6d 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  erm++;.  }..  /*
f670: 20 49 66 20 74 68 65 20 4f 52 44 45 52 20 42 59   If the ORDER BY
f680: 20 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73   clause contains
f690: 20 6f 6e 6c 79 20 63 6f 6c 75 6d 6e 73 20 69 6e   only columns in
f6a0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 0a 20 20   the current .  
f6b0: 2a 2a 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  ** virtual table
f6c0: 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65 20 73   then allocate s
f6d0: 70 61 63 65 20 66 6f 72 20 74 68 65 20 61 4f 72  pace for the aOr
f6e0: 64 65 72 42 79 20 70 61 72 74 20 6f 66 0a 20 20  derBy part of.  
f6f0: 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69  ** the sqlite3_i
f700: 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74  ndex_info struct
f710: 75 72 65 2e 0a 20 20 2a 2f 0a 20 20 6e 4f 72 64  ure..  */.  nOrd
f720: 65 72 42 79 20 3d 20 30 3b 0a 20 20 69 66 28 20  erBy = 0;.  if( 
f730: 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
f740: 69 6e 74 20 6e 20 3d 20 70 4f 72 64 65 72 42 79  int n = pOrderBy
f750: 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 66 6f 72  ->nExpr;.    for
f760: 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b  (i=0; i<n; i++){
f770: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78  .      Expr *pEx
f780: 70 72 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61  pr = pOrderBy->a
f790: 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [i].pExpr;.     
f7a0: 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d   if( pExpr->op!=
f7b0: 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 45 78  TK_COLUMN || pEx
f7c0: 70 72 2d 3e 69 54 61 62 6c 65 21 3d 70 53 72 63  pr->iTable!=pSrc
f7d0: 2d 3e 69 43 75 72 73 6f 72 20 29 20 62 72 65 61  ->iCursor ) brea
f7e0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  k;.    }.    if(
f7f0: 20 69 3d 3d 6e 29 7b 0a 20 20 20 20 20 20 6e 4f   i==n){.      nO
f800: 72 64 65 72 42 79 20 3d 20 6e 3b 0a 20 20 20 20  rderBy = n;.    
f810: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  }.  }..  /* Allo
f820: 63 61 74 65 20 74 68 65 20 73 71 6c 69 74 65 33  cate the sqlite3
f830: 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75  _index_info stru
f840: 63 74 75 72 65 0a 20 20 2a 2f 0a 20 20 70 49 64  cture.  */.  pId
f850: 78 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44  xInfo = sqlite3D
f860: 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 50 61 72  bMallocZero(pPar
f870: 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f 66 28 2a  se->db, sizeof(*
f880: 70 49 64 78 49 6e 66 6f 29 0a 20 20 20 20 20 20  pIdxInfo).      
f890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f8a0: 20 20 20 20 20 2b 20 28 73 69 7a 65 6f 66 28 2a       + (sizeof(*
f8b0: 70 49 64 78 43 6f 6e 73 29 20 2b 20 73 69 7a 65  pIdxCons) + size
f8c0: 6f 66 28 2a 70 55 73 61 67 65 29 29 2a 6e 54 65  of(*pUsage))*nTe
f8d0: 72 6d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  rm.             
f8e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 20                + 
f8f0: 73 69 7a 65 6f 66 28 2a 70 49 64 78 4f 72 64 65  sizeof(*pIdxOrde
f900: 72 42 79 29 2a 6e 4f 72 64 65 72 42 79 20 29 3b  rBy)*nOrderBy );
f910: 0a 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f 3d  .  if( pIdxInfo=
f920: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
f930: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
f940: 2c 20 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79  , "out of memory
f950: 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  ");.    return 0
f960: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74  ;.  }..  /* Init
f970: 69 61 6c 69 7a 65 20 74 68 65 20 73 74 72 75 63  ialize the struc
f980: 74 75 72 65 2e 20 20 54 68 65 20 73 71 6c 69 74  ture.  The sqlit
f990: 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74  e3_index_info st
f9a0: 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73  ructure contains
f9b0: 0a 20 20 2a 2a 20 6d 61 6e 79 20 66 69 65 6c 64  .  ** many field
f9c0: 73 20 74 68 61 74 20 61 72 65 20 64 65 63 6c 61  s that are decla
f9d0: 72 65 64 20 22 63 6f 6e 73 74 22 20 74 6f 20 70  red "const" to p
f9e0: 72 65 76 65 6e 74 20 78 42 65 73 74 49 6e 64 65  revent xBestInde
f9f0: 78 20 66 72 6f 6d 0a 20 20 2a 2a 20 63 68 61 6e  x from.  ** chan
fa00: 67 69 6e 67 20 74 68 65 6d 2e 20 20 57 65 20 68  ging them.  We h
fa10: 61 76 65 20 74 6f 20 64 6f 20 73 6f 6d 65 20 66  ave to do some f
fa20: 75 6e 6b 79 20 63 61 73 74 69 6e 67 20 69 6e 20  unky casting in 
fa30: 6f 72 64 65 72 20 74 6f 0a 20 20 2a 2a 20 69 6e  order to.  ** in
fa40: 69 74 69 61 6c 69 7a 65 20 74 68 6f 73 65 20 66  itialize those f
fa50: 69 65 6c 64 73 2e 0a 20 20 2a 2f 0a 20 20 70 49  ields..  */.  pI
fa60: 64 78 43 6f 6e 73 20 3d 20 28 73 74 72 75 63 74  dxCons = (struct
fa70: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63   sqlite3_index_c
fa80: 6f 6e 73 74 72 61 69 6e 74 2a 29 26 70 49 64 78  onstraint*)&pIdx
fa90: 49 6e 66 6f 5b 31 5d 3b 0a 20 20 70 49 64 78 4f  Info[1];.  pIdxO
faa0: 72 64 65 72 42 79 20 3d 20 28 73 74 72 75 63 74  rderBy = (struct
fab0: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f   sqlite3_index_o
fac0: 72 64 65 72 62 79 2a 29 26 70 49 64 78 43 6f 6e  rderby*)&pIdxCon
fad0: 73 5b 6e 54 65 72 6d 5d 3b 0a 20 20 70 55 73 61  s[nTerm];.  pUsa
fae0: 67 65 20 3d 20 28 73 74 72 75 63 74 20 73 71 6c  ge = (struct sql
faf0: 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
fb00: 72 61 69 6e 74 5f 75 73 61 67 65 2a 29 26 70 49  raint_usage*)&pI
fb10: 64 78 4f 72 64 65 72 42 79 5b 6e 4f 72 64 65 72  dxOrderBy[nOrder
fb20: 42 79 5d 3b 0a 20 20 2a 28 69 6e 74 2a 29 26 70  By];.  *(int*)&p
fb30: 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72  IdxInfo->nConstr
fb40: 61 69 6e 74 20 3d 20 6e 54 65 72 6d 3b 0a 20 20  aint = nTerm;.  
fb50: 2a 28 69 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f  *(int*)&pIdxInfo
fb60: 2d 3e 6e 4f 72 64 65 72 42 79 20 3d 20 6e 4f 72  ->nOrderBy = nOr
fb70: 64 65 72 42 79 3b 0a 20 20 2a 28 73 74 72 75 63  derBy;.  *(struc
fb80: 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  t sqlite3_index_
fb90: 63 6f 6e 73 74 72 61 69 6e 74 2a 2a 29 26 70 49  constraint**)&pI
fba0: 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61  dxInfo->aConstra
fbb0: 69 6e 74 20 3d 20 70 49 64 78 43 6f 6e 73 3b 0a  int = pIdxCons;.
fbc0: 20 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74    *(struct sqlit
fbd0: 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62 79  e3_index_orderby
fbe0: 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 4f  **)&pIdxInfo->aO
fbf0: 72 64 65 72 42 79 20 3d 20 70 49 64 78 4f 72 64  rderBy = pIdxOrd
fc00: 65 72 42 79 3b 0a 20 20 2a 28 73 74 72 75 63 74  erBy;.  *(struct
fc10: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63   sqlite3_index_c
fc20: 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61 67 65 2a  onstraint_usage*
fc30: 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f  *)&pIdxInfo->aCo
fc40: 6e 73 74 72 61 69 6e 74 55 73 61 67 65 20 3d 0a  nstraintUsage =.
fc50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc90: 20 20 20 70 55 73 61 67 65 3b 0a 0a 20 20 66 6f     pUsage;..  fo
fca0: 72 28 69 3d 6a 3d 30 2c 20 70 54 65 72 6d 3d 70  r(i=j=0, pTerm=p
fcb0: 57 43 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54  WC->a; i<pWC->nT
fcc0: 65 72 6d 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b  erm; i++, pTerm+
fcd0: 2b 29 7b 0a 20 20 20 20 75 38 20 6f 70 3b 0a 20  +){.    u8 op;. 
fce0: 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65     if( pTerm->le
fcf0: 66 74 43 75 72 73 6f 72 20 21 3d 20 70 53 72 63  ftCursor != pSrc
fd00: 2d 3e 69 43 75 72 73 6f 72 20 29 20 63 6f 6e 74  ->iCursor ) cont
fd10: 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74  inue;.    assert
fd20: 28 20 49 73 50 6f 77 65 72 4f 66 54 77 6f 28 70  ( IsPowerOfTwo(p
fd30: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
fd40: 26 20 7e 57 4f 5f 45 51 55 49 56 29 20 29 3b 0a  & ~WO_EQUIV) );.
fd50: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
fd60: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
fd70: 20 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 74 65   WO_IN );.    te
fd80: 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65  stcase( pTerm->e
fd90: 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53  Operator & WO_IS
fda0: 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 74 65 73 74  NULL );.    test
fdb0: 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70  case( pTerm->eOp
fdc0: 65 72 61 74 6f 72 20 26 20 57 4f 5f 41 4c 4c 20  erator & WO_ALL 
fdd0: 29 3b 0a 20 20 20 20 69 66 28 20 28 70 54 65 72  );.    if( (pTer
fde0: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 7e  m->eOperator & ~
fdf0: 28 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 45 51  (WO_ISNULL|WO_EQ
fe00: 55 49 56 29 29 3d 3d 30 20 29 20 63 6f 6e 74 69  UIV))==0 ) conti
fe10: 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 54 65  nue;.    if( pTe
fe20: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
fe30: 52 4d 5f 56 4e 55 4c 4c 20 29 20 63 6f 6e 74 69  RM_VNULL ) conti
fe40: 6e 75 65 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e  nue;.    pIdxCon
fe50: 73 5b 6a 5d 2e 69 43 6f 6c 75 6d 6e 20 3d 20 70  s[j].iColumn = p
fe60: 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75  Term->u.leftColu
fe70: 6d 6e 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e 73  mn;.    pIdxCons
fe80: 5b 6a 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74 20  [j].iTermOffset 
fe90: 3d 20 69 3b 0a 20 20 20 20 6f 70 20 3d 20 28 75  = i;.    op = (u
fea0: 38 29 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  8)pTerm->eOperat
feb0: 6f 72 20 26 20 57 4f 5f 41 4c 4c 3b 0a 20 20 20  or & WO_ALL;.   
fec0: 20 69 66 28 20 6f 70 3d 3d 57 4f 5f 49 4e 20 29   if( op==WO_IN )
fed0: 20 6f 70 20 3d 20 57 4f 5f 45 51 3b 0a 20 20 20   op = WO_EQ;.   
fee0: 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 6f 70 20   pIdxCons[j].op 
fef0: 3d 20 6f 70 3b 0a 20 20 20 20 2f 2a 20 54 68 65  = op;.    /* The
ff00: 20 64 69 72 65 63 74 20 61 73 73 69 67 6e 6d 65   direct assignme
ff10: 6e 74 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f  nt in the previo
ff20: 75 73 20 6c 69 6e 65 20 69 73 20 70 6f 73 73 69  us line is possi
ff30: 62 6c 65 20 6f 6e 6c 79 20 62 65 63 61 75 73 65  ble only because
ff40: 0a 20 20 20 20 2a 2a 20 74 68 65 20 57 4f 5f 20  .    ** the WO_ 
ff50: 61 6e 64 20 53 51 4c 49 54 45 5f 49 4e 44 45 58  and SQLITE_INDEX
ff60: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 20 63 6f 64  _CONSTRAINT_ cod
ff70: 65 73 20 61 72 65 20 69 64 65 6e 74 69 63 61 6c  es are identical
ff80: 2e 20 20 54 68 65 0a 20 20 20 20 2a 2a 20 66 6f  .  The.    ** fo
ff90: 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 73 20  llowing asserts 
ffa0: 76 65 72 69 66 79 20 74 68 69 73 20 66 61 63 74  verify this fact
ffb0: 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
ffc0: 20 57 4f 5f 45 51 3d 3d 53 51 4c 49 54 45 5f 49   WO_EQ==SQLITE_I
ffd0: 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  NDEX_CONSTRAINT_
ffe0: 45 51 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  EQ );.    assert
fff0: 28 20 57 4f 5f 4c 54 3d 3d 53 51 4c 49 54 45 5f  ( WO_LT==SQLITE_
10000 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54  INDEX_CONSTRAINT
10010 5f 4c 54 20 29 3b 0a 20 20 20 20 61 73 73 65 72  _LT );.    asser
10020 74 28 20 57 4f 5f 4c 45 3d 3d 53 51 4c 49 54 45  t( WO_LE==SQLITE
10030 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e  _INDEX_CONSTRAIN
10040 54 5f 4c 45 20 29 3b 0a 20 20 20 20 61 73 73 65  T_LE );.    asse
10050 72 74 28 20 57 4f 5f 47 54 3d 3d 53 51 4c 49 54  rt( WO_GT==SQLIT
10060 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49  E_INDEX_CONSTRAI
10070 4e 54 5f 47 54 20 29 3b 0a 20 20 20 20 61 73 73  NT_GT );.    ass
10080 65 72 74 28 20 57 4f 5f 47 45 3d 3d 53 51 4c 49  ert( WO_GE==SQLI
10090 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41  TE_INDEX_CONSTRA
100a0 49 4e 54 5f 47 45 20 29 3b 0a 20 20 20 20 61 73  INT_GE );.    as
100b0 73 65 72 74 28 20 57 4f 5f 4d 41 54 43 48 3d 3d  sert( WO_MATCH==
100c0 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e  SQLITE_INDEX_CON
100d0 53 54 52 41 49 4e 54 5f 4d 41 54 43 48 20 29 3b  STRAINT_MATCH );
100e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65  .    assert( pTe
100f0 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
10100 28 57 4f 5f 49 4e 7c 57 4f 5f 45 51 7c 57 4f 5f  (WO_IN|WO_EQ|WO_
10110 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c 57  LT|WO_LE|WO_GT|W
10120 4f 5f 47 45 7c 57 4f 5f 4d 41 54 43 48 29 20 29  O_GE|WO_MATCH) )
10130 3b 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20 7d 0a 20  ;.    j++;.  }. 
10140 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64   for(i=0; i<nOrd
10150 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  erBy; i++){.    
10160 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4f  Expr *pExpr = pO
10170 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78  rderBy->a[i].pEx
10180 70 72 3b 0a 20 20 20 20 70 49 64 78 4f 72 64 65  pr;.    pIdxOrde
10190 72 42 79 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 20 3d  rBy[i].iColumn =
101a0 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b   pExpr->iColumn;
101b0 0a 20 20 20 20 70 49 64 78 4f 72 64 65 72 42 79  .    pIdxOrderBy
101c0 5b 69 5d 2e 64 65 73 63 20 3d 20 70 4f 72 64 65  [i].desc = pOrde
101d0 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72  rBy->a[i].sortOr
101e0 64 65 72 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  der;.  }..  retu
101f0 72 6e 20 70 49 64 78 49 6e 66 6f 3b 0a 7d 0a 0a  rn pIdxInfo;.}..
10200 2f 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65 20  /*.** The table 
10210 6f 62 6a 65 63 74 20 72 65 66 65 72 65 6e 63 65  object reference
10220 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
10230 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74  econd argument t
10240 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  o this function.
10250 2a 2a 20 6d 75 73 74 20 72 65 70 72 65 73 65 6e  ** must represen
10260 74 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c  t a virtual tabl
10270 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  e. This function
10280 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 78 42 65   invokes the xBe
10290 73 74 49 6e 64 65 78 28 29 0a 2a 2a 20 6d 65 74  stIndex().** met
102a0 68 6f 64 20 6f 66 20 74 68 65 20 76 69 72 74 75  hod of the virtu
102b0 61 6c 20 74 61 62 6c 65 20 77 69 74 68 20 74 68  al table with th
102c0 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  e sqlite3_index_
102d0 69 6e 66 6f 20 6f 62 6a 65 63 74 20 74 68 61 74  info object that
102e0 0a 2a 2a 20 63 6f 6d 65 73 20 69 6e 20 61 73 20  .** comes in as 
102f0 74 68 65 20 33 72 64 20 61 72 67 75 6d 65 6e 74  the 3rd argument
10300 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
10310 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  n..**.** If an e
10320 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 70 50 61  rror occurs, pPa
10330 72 73 65 20 69 73 20 70 6f 70 75 6c 61 74 65 64  rse is populated
10340 20 77 69 74 68 20 61 6e 20 65 72 72 6f 72 20 6d   with an error m
10350 65 73 73 61 67 65 20 61 6e 64 20 61 0a 2a 2a 20  essage and a.** 
10360 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 69  non-zero value i
10370 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
10380 72 77 69 73 65 2c 20 30 20 69 73 20 72 65 74 75  rwise, 0 is retu
10390 72 6e 65 64 20 61 6e 64 20 74 68 65 20 6f 75 74  rned and the out
103a0 70 75 74 0a 2a 2a 20 70 61 72 74 20 6f 66 20 74  put.** part of t
103b0 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  he sqlite3_index
103c0 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  _info structure 
103d0 69 73 20 6c 65 66 74 20 70 6f 70 75 6c 61 74 65  is left populate
103e0 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68 65 72  d..**.** Whether
103f0 20 6f 72 20 6e 6f 74 20 61 6e 20 65 72 72 6f 72   or not an error
10400 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 69 74   is returned, it
10410 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69   is the responsi
10420 62 69 6c 69 74 79 20 6f 66 20 74 68 65 0a 2a 2a  bility of the.**
10430 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74   caller to event
10440 75 61 6c 6c 79 20 66 72 65 65 20 70 2d 3e 69 64  ually free p->id
10450 78 53 74 72 20 69 66 20 70 2d 3e 6e 65 65 64 54  xStr if p->needT
10460 6f 46 72 65 65 49 64 78 53 74 72 20 69 6e 64 69  oFreeIdxStr indi
10470 63 61 74 65 73 0a 2a 2a 20 74 68 61 74 20 74 68  cates.** that th
10480 69 73 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a  is is required..
10490 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 74  */.static int vt
104a0 61 62 42 65 73 74 49 6e 64 65 78 28 50 61 72 73  abBestIndex(Pars
104b0 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65  e *pParse, Table
104c0 20 2a 70 54 61 62 2c 20 73 71 6c 69 74 65 33 5f   *pTab, sqlite3_
104d0 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a  index_info *p){.
104e0 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a    sqlite3_vtab *
104f0 70 56 74 61 62 20 3d 20 73 71 6c 69 74 65 33 47  pVtab = sqlite3G
10500 65 74 56 54 61 62 6c 65 28 70 50 61 72 73 65 2d  etVTable(pParse-
10510 3e 64 62 2c 20 70 54 61 62 29 2d 3e 70 56 74 61  >db, pTab)->pVta
10520 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  b;.  int i;.  in
10530 74 20 72 63 3b 0a 0a 20 20 54 52 41 43 45 5f 49  t rc;..  TRACE_I
10540 44 58 5f 49 4e 50 55 54 53 28 70 29 3b 0a 20 20  DX_INPUTS(p);.  
10550 72 63 20 3d 20 70 56 74 61 62 2d 3e 70 4d 6f 64  rc = pVtab->pMod
10560 75 6c 65 2d 3e 78 42 65 73 74 49 6e 64 65 78 28  ule->xBestIndex(
10570 70 56 74 61 62 2c 20 70 29 3b 0a 20 20 54 52 41  pVtab, p);.  TRA
10580 43 45 5f 49 44 58 5f 4f 55 54 50 55 54 53 28 70  CE_IDX_OUTPUTS(p
10590 29 3b 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51  );..  if( rc!=SQ
105a0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
105b0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  f( rc==SQLITE_NO
105c0 4d 45 4d 20 29 7b 0a 20 20 20 20 20 20 70 50 61  MEM ){.      pPa
105d0 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
105e0 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d  ailed = 1;.    }
105f0 65 6c 73 65 20 69 66 28 20 21 70 56 74 61 62 2d  else if( !pVtab-
10600 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20  >zErrMsg ){.    
10610 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
10620 67 28 70 50 61 72 73 65 2c 20 22 25 73 22 2c 20  g(pParse, "%s", 
10630 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 72 63  sqlite3ErrStr(rc
10640 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ));.    }else{. 
10650 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
10660 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25 73  rMsg(pParse, "%s
10670 22 2c 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73  ", pVtab->zErrMs
10680 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  g);.    }.  }.  
10690 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 56 74  sqlite3_free(pVt
106a0 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20  ab->zErrMsg);.  
106b0 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20 3d  pVtab->zErrMsg =
106c0 20 30 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20   0;..  for(i=0; 
106d0 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74  i<p->nConstraint
106e0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
106f0 21 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b  !p->aConstraint[
10700 69 5d 2e 75 73 61 62 6c 65 20 26 26 20 70 2d 3e  i].usable && p->
10710 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65  aConstraintUsage
10720 5b 69 5d 2e 61 72 67 76 49 6e 64 65 78 3e 30 20  [i].argvIndex>0 
10730 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
10740 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
10750 20 0a 20 20 20 20 20 20 20 20 20 20 22 74 61 62   .          "tab
10760 6c 65 20 25 73 3a 20 78 42 65 73 74 49 6e 64 65  le %s: xBestInde
10770 78 20 72 65 74 75 72 6e 65 64 20 61 6e 20 69 6e  x returned an in
10780 76 61 6c 69 64 20 70 6c 61 6e 22 2c 20 70 54 61  valid plan", pTa
10790 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  b->zName);.    }
107a0 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70  .  }..  return p
107b0 50 61 72 73 65 2d 3e 6e 45 72 72 3b 0a 7d 0a 23  Parse->nErr;.}.#
107c0 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
107d0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
107e0 52 54 55 41 4c 54 41 42 4c 45 29 20 2a 2f 0a 0a  RTUALTABLE) */..
107f0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
10800 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53  NABLE_STAT3_OR_S
10810 54 41 54 34 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d  TAT4./*.** Estim
10820 61 74 65 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e  ate the location
10830 20 6f 66 20 61 20 70 61 72 74 69 63 75 6c 61 72   of a particular
10840 20 6b 65 79 20 61 6d 6f 6e 67 20 61 6c 6c 20 6b   key among all k
10850 65 79 73 20 69 6e 20 61 6e 0a 2a 2a 20 69 6e 64  eys in an.** ind
10860 65 78 2e 20 20 53 74 6f 72 65 20 74 68 65 20 72  ex.  Store the r
10870 65 73 75 6c 74 73 20 69 6e 20 61 53 74 61 74 20  esults in aStat 
10880 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
10890 2a 20 20 20 20 61 53 74 61 74 5b 30 5d 20 20 20  *    aStat[0]   
108a0 20 20 20 45 73 74 2e 20 6e 75 6d 62 65 72 20 6f     Est. number o
108b0 66 20 72 6f 77 73 20 6c 65 73 73 20 74 68 61 6e  f rows less than
108c0 20 70 56 61 6c 0a 2a 2a 20 20 20 20 61 53 74 61   pVal.**    aSta
108d0 74 5b 31 5d 20 20 20 20 20 20 45 73 74 2e 20 6e  t[1]      Est. n
108e0 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 65 71  umber of rows eq
108f0 75 61 6c 20 74 6f 20 70 56 61 6c 0a 2a 2a 0a 2a  ual to pVal.**.*
10900 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
10910 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a 2a  OK on success..*
10920 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68  /.static void wh
10930 65 72 65 4b 65 79 53 74 61 74 73 28 0a 20 20 50  ereKeyStats(.  P
10940 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
10950 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
10960 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
10970 6e 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  n */.  Index *pI
10980 64 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  dx,             
10990 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20 63     /* Index to c
109a0 6f 6e 73 69 64 65 72 20 64 6f 6d 61 69 6e 20 6f  onsider domain o
109b0 66 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52  f */.  UnpackedR
109c0 65 63 6f 72 64 20 2a 70 52 65 63 2c 20 20 20 20  ecord *pRec,    
109d0 20 20 20 2f 2a 20 56 65 63 74 6f 72 20 6f 66 20     /* Vector of 
109e0 76 61 6c 75 65 73 20 74 6f 20 63 6f 6e 73 69 64  values to consid
109f0 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 6f 75 6e  er */.  int roun
10a00 64 55 70 2c 20 20 20 20 20 20 20 20 20 20 20 20  dUp,            
10a10 20 20 20 20 2f 2a 20 52 6f 75 6e 64 20 75 70 20      /* Round up 
10a20 69 66 20 74 72 75 65 2e 20 20 52 6f 75 6e 64 20  if true.  Round 
10a30 64 6f 77 6e 20 69 66 20 66 61 6c 73 65 20 2a 2f  down if false */
10a40 0a 20 20 74 52 6f 77 63 6e 74 20 2a 61 53 74 61  .  tRowcnt *aSta
10a50 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  t              /
10a60 2a 20 4f 55 54 3a 20 73 74 61 74 73 20 77 72 69  * OUT: stats wri
10a70 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  tten here */.){.
10a80 20 20 49 6e 64 65 78 53 61 6d 70 6c 65 20 2a 61    IndexSample *a
10a90 53 61 6d 70 6c 65 20 3d 20 70 49 64 78 2d 3e 61  Sample = pIdx->a
10aa0 53 61 6d 70 6c 65 3b 0a 20 20 69 6e 74 20 69 43  Sample;.  int iC
10ab0 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ol;             
10ac0 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
10ad0 66 20 72 65 71 75 69 72 65 64 20 73 74 61 74 73  f required stats
10ae0 20 69 6e 20 61 6e 45 71 5b 5d 20 65 74 63 2e 20   in anEq[] etc. 
10af0 2a 2f 0a 20 20 69 6e 74 20 69 4d 69 6e 20 3d 20  */.  int iMin = 
10b00 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
10b10 20 2f 2a 20 53 6d 61 6c 6c 65 73 74 20 73 61 6d   /* Smallest sam
10b20 70 6c 65 20 6e 6f 74 20 79 65 74 20 74 65 73 74  ple not yet test
10b30 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20  ed */.  int i = 
10b40 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 3b 20 20  pIdx->nSample;  
10b50 20 20 20 20 2f 2a 20 53 6d 61 6c 6c 65 73 74 20      /* Smallest 
10b60 73 61 6d 70 6c 65 20 6c 61 72 67 65 72 20 74 68  sample larger th
10b70 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 70  an or equal to p
10b80 52 65 63 20 2a 2f 0a 20 20 69 6e 74 20 69 54 65  Rec */.  int iTe
10b90 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
10ba0 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 73 61 6d       /* Next sam
10bb0 70 6c 65 20 74 6f 20 74 65 73 74 20 2a 2f 0a 20  ple to test */. 
10bc0 20 69 6e 74 20 72 65 73 3b 20 20 20 20 20 20 20   int res;       
10bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10be0 52 65 73 75 6c 74 20 6f 66 20 63 6f 6d 70 61 72  Result of compar
10bf0 69 73 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 20 2a  ison operation *
10c00 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
10c10 45 5f 44 45 42 55 47 0a 20 20 55 4e 55 53 45 44  E_DEBUG.  UNUSED
10c20 5f 50 41 52 41 4d 45 54 45 52 28 20 70 50 61 72  _PARAMETER( pPar
10c30 73 65 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61  se );.#endif.  a
10c40 73 73 65 72 74 28 20 70 52 65 63 21 3d 30 20 29  ssert( pRec!=0 )
10c50 3b 0a 20 20 69 43 6f 6c 20 3d 20 70 52 65 63 2d  ;.  iCol = pRec-
10c60 3e 6e 46 69 65 6c 64 20 2d 20 31 3b 0a 20 20 61  >nField - 1;.  a
10c70 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6e 53 61  ssert( pIdx->nSa
10c80 6d 70 6c 65 3e 30 20 29 3b 0a 20 20 61 73 73 65  mple>0 );.  asse
10c90 72 74 28 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64  rt( pRec->nField
10ca0 3e 30 20 26 26 20 69 43 6f 6c 3c 70 49 64 78 2d  >0 && iCol<pIdx-
10cb0 3e 6e 53 61 6d 70 6c 65 43 6f 6c 20 29 3b 0a 20  >nSampleCol );. 
10cc0 20 64 6f 7b 0a 20 20 20 20 69 54 65 73 74 20 3d   do{.    iTest =
10cd0 20 28 69 4d 69 6e 2b 69 29 2f 32 3b 0a 20 20 20   (iMin+i)/2;.   
10ce0 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33 56 64   res = sqlite3Vd
10cf0 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
10d00 61 53 61 6d 70 6c 65 5b 69 54 65 73 74 5d 2e 6e  aSample[iTest].n
10d10 2c 20 61 53 61 6d 70 6c 65 5b 69 54 65 73 74 5d  , aSample[iTest]
10d20 2e 70 2c 20 70 52 65 63 2c 20 30 29 3b 0a 20 20  .p, pRec, 0);.  
10d30 20 20 69 66 28 20 72 65 73 3c 30 20 29 7b 0a 20    if( res<0 ){. 
10d40 20 20 20 20 20 69 4d 69 6e 20 3d 20 69 54 65 73       iMin = iTes
10d50 74 2b 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  t+1;.    }else{.
10d60 20 20 20 20 20 20 69 20 3d 20 69 54 65 73 74 3b        i = iTest;
10d70 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28  .    }.  }while(
10d80 20 72 65 73 20 26 26 20 69 4d 69 6e 3c 69 20 29   res && iMin<i )
10d90 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
10da0 5f 44 45 42 55 47 0a 20 20 2f 2a 20 54 68 65 20  _DEBUG.  /* The 
10db0 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74  following assert
10dc0 20 73 74 61 74 65 6d 65 6e 74 73 20 63 68 65 63   statements chec
10dd0 6b 20 74 68 61 74 20 74 68 65 20 62 69 6e 61 72  k that the binar
10de0 79 20 73 65 61 72 63 68 20 63 6f 64 65 0a 20 20  y search code.  
10df0 2a 2a 20 61 62 6f 76 65 20 66 6f 75 6e 64 20 74  ** above found t
10e00 68 65 20 72 69 67 68 74 20 61 6e 73 77 65 72 2e  he right answer.
10e10 20 54 68 69 73 20 62 6c 6f 63 6b 20 73 65 72 76   This block serv
10e20 65 73 20 6e 6f 20 70 75 72 70 6f 73 65 20 6f 74  es no purpose ot
10e30 68 65 72 0a 20 20 2a 2a 20 74 68 61 6e 20 74 6f  her.  ** than to
10e40 20 69 6e 76 6f 6b 65 20 74 68 65 20 61 73 73 65   invoke the asse
10e50 72 74 73 2e 20 20 2a 2f 0a 20 20 69 66 28 20 72  rts.  */.  if( r
10e60 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  es==0 ){.    /* 
10e70 49 66 20 28 72 65 73 3d 3d 30 29 20 69 73 20 74  If (res==0) is t
10e80 72 75 65 2c 20 74 68 65 6e 20 73 61 6d 70 6c 65  rue, then sample
10e90 20 24 69 20 6d 75 73 74 20 62 65 20 65 71 75 61   $i must be equa
10ea0 6c 20 74 6f 20 70 52 65 63 20 2a 2f 0a 20 20 20  l to pRec */.   
10eb0 20 61 73 73 65 72 74 28 20 69 3c 70 49 64 78 2d   assert( i<pIdx-
10ec0 3e 6e 53 61 6d 70 6c 65 20 29 3b 0a 20 20 20 20  >nSample );.    
10ed0 61 73 73 65 72 74 28 20 30 3d 3d 73 71 6c 69 74  assert( 0==sqlit
10ee0 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
10ef0 61 72 65 28 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e  are(aSample[i].n
10f00 2c 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 70 2c 20  , aSample[i].p, 
10f10 70 52 65 63 2c 20 30 29 0a 20 20 20 20 20 20 20  pRec, 0).       
10f20 20 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d    || pParse->db-
10f30 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
10f40 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
10f50 20 4f 74 68 65 72 77 69 73 65 2c 20 70 52 65 63   Otherwise, pRec
10f60 20 6d 75 73 74 20 62 65 20 73 6d 61 6c 6c 65 72   must be smaller
10f70 20 74 68 61 6e 20 73 61 6d 70 6c 65 20 24 69 20   than sample $i 
10f80 61 6e 64 20 6c 61 72 67 65 72 20 74 68 61 6e 0a  and larger than.
10f90 20 20 20 20 2a 2a 20 73 61 6d 70 6c 65 20 28 24      ** sample ($
10fa0 69 2d 31 29 2e 20 20 2a 2f 0a 20 20 20 20 61 73  i-1).  */.    as
10fb0 73 65 72 74 28 20 69 3d 3d 70 49 64 78 2d 3e 6e  sert( i==pIdx->n
10fc0 53 61 6d 70 6c 65 20 0a 20 20 20 20 20 20 20 20  Sample .        
10fd0 20 7c 7c 20 73 71 6c 69 74 65 33 56 64 62 65 52   || sqlite3VdbeR
10fe0 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 61 53 61  ecordCompare(aSa
10ff0 6d 70 6c 65 5b 69 5d 2e 6e 2c 20 61 53 61 6d 70  mple[i].n, aSamp
11000 6c 65 5b 69 5d 2e 70 2c 20 70 52 65 63 2c 20 30  le[i].p, pRec, 0
11010 29 3e 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  )>0.         || 
11020 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
11030 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
11040 61 73 73 65 72 74 28 20 69 3d 3d 30 0a 20 20 20  assert( i==0.   
11050 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33        || sqlite3
11060 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
11070 65 28 61 53 61 6d 70 6c 65 5b 69 2d 31 5d 2e 6e  e(aSample[i-1].n
11080 2c 20 61 53 61 6d 70 6c 65 5b 69 2d 31 5d 2e 70  , aSample[i-1].p
11090 2c 20 70 52 65 63 2c 20 30 29 3c 30 0a 20 20 20  , pRec, 0)<0.   
110a0 20 20 20 20 20 20 7c 7c 20 70 50 61 72 73 65 2d        || pParse-
110b0 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
110c0 64 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20  d );.  }.#endif 
110d0 2f 2a 20 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /* ifdef SQLITE_
110e0 44 45 42 55 47 20 2a 2f 0a 0a 20 20 2f 2a 20 41  DEBUG */..  /* A
110f0 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 61 53  t this point, aS
11100 61 6d 70 6c 65 5b 69 5d 20 69 73 20 74 68 65 20  ample[i] is the 
11110 66 69 72 73 74 20 73 61 6d 70 6c 65 20 74 68 61  first sample tha
11120 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  t is greater tha
11130 6e 0a 20 20 2a 2a 20 6f 72 20 65 71 75 61 6c 20  n.  ** or equal 
11140 74 6f 20 70 56 61 6c 2e 20 20 4f 72 20 69 66 20  to pVal.  Or if 
11150 69 3d 3d 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65  i==pIdx->nSample
11160 2c 20 74 68 65 6e 20 61 6c 6c 20 73 61 6d 70 6c  , then all sampl
11170 65 73 20 61 72 65 20 6c 65 73 73 0a 20 20 2a 2a  es are less.  **
11180 20 74 68 61 6e 20 70 56 61 6c 2e 20 20 49 66 20   than pVal.  If 
11190 61 53 61 6d 70 6c 65 5b 69 5d 3d 3d 70 56 61 6c  aSample[i]==pVal
111a0 2c 20 74 68 65 6e 20 72 65 73 3d 3d 30 2e 0a 20  , then res==0.. 
111b0 20 2a 2f 0a 20 20 69 66 28 20 72 65 73 3d 3d 30   */.  if( res==0
111c0 20 29 7b 0a 20 20 20 20 61 53 74 61 74 5b 30 5d   ){.    aStat[0]
111d0 20 3d 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 61 6e   = aSample[i].an
111e0 4c 74 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 61 53  Lt[iCol];.    aS
111f0 74 61 74 5b 31 5d 20 3d 20 61 53 61 6d 70 6c 65  tat[1] = aSample
11200 5b 69 5d 2e 61 6e 45 71 5b 69 43 6f 6c 5d 3b 0a  [i].anEq[iCol];.
11210 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 74 52 6f    }else{.    tRo
11220 77 63 6e 74 20 69 4c 6f 77 65 72 2c 20 69 55 70  wcnt iLower, iUp
11230 70 65 72 2c 20 69 47 61 70 3b 0a 20 20 20 20 69  per, iGap;.    i
11240 66 28 20 69 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( i==0 ){.     
11250 20 69 4c 6f 77 65 72 20 3d 20 30 3b 0a 20 20 20   iLower = 0;.   
11260 20 20 20 69 55 70 70 65 72 20 3d 20 61 53 61 6d     iUpper = aSam
11270 70 6c 65 5b 30 5d 2e 61 6e 4c 74 5b 69 43 6f 6c  ple[0].anLt[iCol
11280 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  ];.    }else{.  
11290 20 20 20 20 69 36 34 20 6e 52 6f 77 30 20 3d 20      i64 nRow0 = 
112a0 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 54 6f 49  sqlite3LogEstToI
112b0 6e 74 28 70 49 64 78 2d 3e 61 69 52 6f 77 4c 6f  nt(pIdx->aiRowLo
112c0 67 45 73 74 5b 30 5d 29 3b 0a 20 20 20 20 20 20  gEst[0]);.      
112d0 69 55 70 70 65 72 20 3d 20 69 3e 3d 70 49 64 78  iUpper = i>=pIdx
112e0 2d 3e 6e 53 61 6d 70 6c 65 20 3f 20 6e 52 6f 77  ->nSample ? nRow
112f0 30 20 3a 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 61  0 : aSample[i].a
11300 6e 4c 74 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 20  nLt[iCol];.     
11310 20 69 4c 6f 77 65 72 20 3d 20 61 53 61 6d 70 6c   iLower = aSampl
11320 65 5b 69 2d 31 5d 2e 61 6e 45 71 5b 69 43 6f 6c  e[i-1].anEq[iCol
11330 5d 20 2b 20 61 53 61 6d 70 6c 65 5b 69 2d 31 5d  ] + aSample[i-1]
11340 2e 61 6e 4c 74 5b 69 43 6f 6c 5d 3b 0a 20 20 20  .anLt[iCol];.   
11350 20 7d 0a 20 20 20 20 61 53 74 61 74 5b 31 5d 20   }.    aStat[1] 
11360 3d 20 28 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c  = (pIdx->nKeyCol
11370 3e 69 43 6f 6c 20 3f 20 70 49 64 78 2d 3e 61 41  >iCol ? pIdx->aA
11380 76 67 45 71 5b 69 43 6f 6c 5d 20 3a 20 31 29 3b  vgEq[iCol] : 1);
11390 0a 20 20 20 20 69 66 28 20 69 4c 6f 77 65 72 3e  .    if( iLower>
113a0 3d 69 55 70 70 65 72 20 29 7b 0a 20 20 20 20 20  =iUpper ){.     
113b0 20 69 47 61 70 20 3d 20 30 3b 0a 20 20 20 20 7d   iGap = 0;.    }
113c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 47 61 70  else{.      iGap
113d0 20 3d 20 69 55 70 70 65 72 20 2d 20 69 4c 6f 77   = iUpper - iLow
113e0 65 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  er;.    }.    if
113f0 28 20 72 6f 75 6e 64 55 70 20 29 7b 0a 20 20 20  ( roundUp ){.   
11400 20 20 20 69 47 61 70 20 3d 20 28 69 47 61 70 2a     iGap = (iGap*
11410 32 29 2f 33 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  2)/3;.    }else{
11420 0a 20 20 20 20 20 20 69 47 61 70 20 3d 20 69 47  .      iGap = iG
11430 61 70 2f 33 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ap/3;.    }.    
11440 61 53 74 61 74 5b 30 5d 20 3d 20 69 4c 6f 77 65  aStat[0] = iLowe
11450 72 20 2b 20 69 47 61 70 3b 0a 20 20 7d 0a 7d 0a  r + iGap;.  }.}.
11460 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
11470 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52  _ENABLE_STAT3_OR
11480 5f 53 54 41 54 34 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _STAT4 */../*.**
11490 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 4e 55   If it is not NU
114a0 4c 4c 2c 20 70 54 65 72 6d 20 69 73 20 61 20 74  LL, pTerm is a t
114b0 65 72 6d 20 74 68 61 74 20 70 72 6f 76 69 64 65  erm that provide
114c0 73 20 61 6e 20 75 70 70 65 72 20 6f 72 20 6c 6f  s an upper or lo
114d0 77 65 72 0a 2a 2a 20 62 6f 75 6e 64 20 6f 6e 20  wer.** bound on 
114e0 61 20 72 61 6e 67 65 20 73 63 61 6e 2e 20 57 69  a range scan. Wi
114f0 74 68 6f 75 74 20 63 6f 6e 73 69 64 65 72 69 6e  thout considerin
11500 67 20 70 54 65 72 6d 2c 20 69 74 20 69 73 20 65  g pTerm, it is e
11510 73 74 69 6d 61 74 65 64 20 0a 2a 2a 20 74 68 61  stimated .** tha
11520 74 20 74 68 65 20 73 63 61 6e 20 77 69 6c 6c 20  t the scan will 
11530 76 69 73 69 74 20 6e 4e 65 77 20 72 6f 77 73 2e  visit nNew rows.
11540 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   This function r
11550 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65  eturns the numbe
11560 72 0a 2a 2a 20 65 73 74 69 6d 61 74 65 64 20 74  r.** estimated t
11570 6f 20 62 65 20 76 69 73 69 74 65 64 20 61 66 74  o be visited aft
11580 65 72 20 74 61 6b 69 6e 67 20 70 54 65 72 6d 20  er taking pTerm 
11590 69 6e 74 6f 20 61 63 63 6f 75 6e 74 2e 0a 2a 2a  into account..**
115a0 0a 2a 2a 20 49 66 20 74 68 65 20 75 73 65 72 20  .** If the user 
115b0 65 78 70 6c 69 63 69 74 6c 79 20 73 70 65 63 69  explicitly speci
115c0 66 69 65 64 20 61 20 6c 69 6b 65 6c 69 68 6f 6f  fied a likelihoo
115d0 64 28 29 20 76 61 6c 75 65 20 66 6f 72 20 74 68  d() value for th
115e0 69 73 20 74 65 72 6d 2c 0a 2a 2a 20 74 68 65 6e  is term,.** then
115f0 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
11600 65 20 69 73 20 74 68 65 20 6c 69 6b 65 6c 69 68  e is the likelih
11610 6f 6f 64 20 6d 75 6c 74 69 70 6c 69 65 64 20 62  ood multiplied b
11620 79 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a  y the number of.
11630 2a 2a 20 69 6e 70 75 74 20 72 6f 77 73 2e 20 4f  ** input rows. O
11640 74 68 65 72 77 69 73 65 2c 20 74 68 69 73 20 66  therwise, this f
11650 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20  unction assumes 
11660 74 68 61 74 20 61 6e 20 22 49 53 20 4e 4f 54 20  that an "IS NOT 
11670 4e 55 4c 4c 22 20 74 65 72 6d 0a 2a 2a 20 68 61  NULL" term.** ha
11680 73 20 61 20 6c 69 6b 65 6c 69 68 6f 6f 64 20 6f  s a likelihood o
11690 66 20 30 2e 35 30 2c 20 61 6e 64 20 61 6e 79 20  f 0.50, and any 
116a0 6f 74 68 65 72 20 74 65 72 6d 20 61 20 6c 69 6b  other term a lik
116b0 65 6c 69 68 6f 6f 64 20 6f 66 20 30 2e 32 35 2e  elihood of 0.25.
116c0 0a 2a 2f 0a 73 74 61 74 69 63 20 4c 6f 67 45 73  .*/.static LogEs
116d0 74 20 77 68 65 72 65 52 61 6e 67 65 41 64 6a 75  t whereRangeAdju
116e0 73 74 28 57 68 65 72 65 54 65 72 6d 20 2a 70 54  st(WhereTerm *pT
116f0 65 72 6d 2c 20 4c 6f 67 45 73 74 20 6e 4e 65 77  erm, LogEst nNew
11700 29 7b 0a 20 20 4c 6f 67 45 73 74 20 6e 52 65 74  ){.  LogEst nRet
11710 20 3d 20 6e 4e 65 77 3b 0a 20 20 69 66 28 20 70   = nNew;.  if( p
11720 54 65 72 6d 20 29 7b 0a 20 20 20 20 69 66 28 20  Term ){.    if( 
11730 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62  pTerm->truthProb
11740 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 52 65  <=0 ){.      nRe
11750 74 20 2b 3d 20 70 54 65 72 6d 2d 3e 74 72 75 74  t += pTerm->trut
11760 68 50 72 6f 62 3b 0a 20 20 20 20 7d 65 6c 73 65  hProb;.    }else
11770 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 77 74 46   if( (pTerm->wtF
11780 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c  lags & TERM_VNUL
11790 4c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e  L)==0 ){.      n
117a0 52 65 74 20 2d 3d 20 32 30 3b 20 20 20 20 20 20  Ret -= 20;      
117b0 20 20 61 73 73 65 72 74 28 20 32 30 3d 3d 73 71    assert( 20==sq
117c0 6c 69 74 65 33 4c 6f 67 45 73 74 28 34 29 20 29  lite3LogEst(4) )
117d0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
117e0 74 75 72 6e 20 6e 52 65 74 3b 0a 7d 0a 0a 2f 2a  turn nRet;.}../*
117f0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
11800 6e 20 69 73 20 75 73 65 64 20 74 6f 20 65 73 74  n is used to est
11810 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72  imate the number
11820 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77 69   of rows that wi
11830 6c 6c 20 62 65 20 76 69 73 69 74 65 64 0a 2a 2a  ll be visited.**
11840 20 62 79 20 73 63 61 6e 6e 69 6e 67 20 61 6e 20   by scanning an 
11850 69 6e 64 65 78 20 66 6f 72 20 61 20 72 61 6e 67  index for a rang
11860 65 20 6f 66 20 76 61 6c 75 65 73 2e 20 54 68 65  e of values. The
11870 20 72 61 6e 67 65 20 6d 61 79 20 68 61 76 65 20   range may have 
11880 61 6e 20 75 70 70 65 72 0a 2a 2a 20 62 6f 75 6e  an upper.** boun
11890 64 2c 20 61 20 6c 6f 77 65 72 20 62 6f 75 6e 64  d, a lower bound
118a0 2c 20 6f 72 20 62 6f 74 68 2e 20 54 68 65 20 57  , or both. The W
118b0 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d  HERE clause term
118c0 73 20 74 68 61 74 20 73 65 74 20 74 68 65 20 75  s that set the u
118d0 70 70 65 72 0a 2a 2a 20 61 6e 64 20 6c 6f 77 65  pper.** and lowe
118e0 72 20 62 6f 75 6e 64 73 20 61 72 65 20 72 65 70  r bounds are rep
118f0 72 65 73 65 6e 74 65 64 20 62 79 20 70 4c 6f 77  resented by pLow
11900 65 72 20 61 6e 64 20 70 55 70 70 65 72 20 72 65  er and pUpper re
11910 73 70 65 63 74 69 76 65 6c 79 2e 20 46 6f 72 0a  spectively. For.
11920 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 61 73 73 75  ** example, assu
11930 6d 69 6e 67 20 74 68 61 74 20 69 6e 64 65 78 20  ming that index 
11940 70 20 69 73 20 6f 6e 20 74 31 28 61 29 3a 0a 2a  p is on t1(a):.*
11950 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d 20  *.**   ... FROM 
11960 74 31 20 57 48 45 52 45 20 61 20 3e 20 3f 20 41  t1 WHERE a > ? A
11970 4e 44 20 61 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 20  ND a < ? ....** 
11980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11990 20 20 20 7c 5f 5f 5f 5f 5f 7c 20 20 20 7c 5f 5f     |_____|   |__
119a0 5f 5f 5f 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20  ___|.**         
119b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
119c0 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20          |.**    
119d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
119e0 20 70 4c 6f 77 65 72 20 20 20 20 70 55 70 70 65   pLower    pUppe
119f0 72 0a 2a 2a 0a 2a 2a 20 49 66 20 65 69 74 68 65  r.**.** If eithe
11a00 72 20 6f 66 20 74 68 65 20 75 70 70 65 72 20 6f  r of the upper o
11a10 72 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20 69 73  r lower bound is
11a20 20 6e 6f 74 20 70 72 65 73 65 6e 74 2c 20 74 68   not present, th
11a30 65 6e 20 4e 55 4c 4c 20 69 73 20 70 61 73 73 65  en NULL is passe
11a40 64 20 69 6e 0a 2a 2a 20 70 6c 61 63 65 20 6f 66  d in.** place of
11a50 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
11a60 6e 67 20 57 68 65 72 65 54 65 72 6d 2e 0a 2a 2a  ng WhereTerm..**
11a70 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 69 6e  .** The value in
11a80 20 28 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77   (pBuilder->pNew
11a90 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 29 20 69  ->u.btree.nEq) i
11aa0 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  s the index of t
11ab0 68 65 20 69 6e 64 65 78 0a 2a 2a 20 63 6f 6c 75  he index.** colu
11ac0 6d 6e 20 73 75 62 6a 65 63 74 20 74 6f 20 74 68  mn subject to th
11ad0 65 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69  e range constrai
11ae0 6e 74 2e 20 4f 72 2c 20 65 71 75 69 76 61 6c 65  nt. Or, equivale
11af0 6e 74 6c 79 2c 20 74 68 65 20 6e 75 6d 62 65 72  ntly, the number
11b00 20 6f 66 0a 2a 2a 20 65 71 75 61 6c 69 74 79 20   of.** equality 
11b10 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 70 74 69  constraints opti
11b20 6d 69 7a 65 64 20 62 79 20 74 68 65 20 70 72 6f  mized by the pro
11b30 70 6f 73 65 64 20 69 6e 64 65 78 20 73 63 61 6e  posed index scan
11b40 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 0a 2a  . For example,.*
11b50 2a 20 61 73 73 75 6d 69 6e 67 20 69 6e 64 65 78  * assuming index
11b60 20 70 20 69 73 20 6f 6e 20 74 31 28 61 2c 20 62   p is on t1(a, b
11b70 29 2c 20 61 6e 64 20 74 68 65 20 53 51 4c 20 71  ), and the SQL q
11b80 75 65 72 79 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  uery is:.**.**  
11b90 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 57 48 45   ... FROM t1 WHE
11ba0 52 45 20 61 20 3d 20 3f 20 41 4e 44 20 62 20 3e  RE a = ? AND b >
11bb0 20 3f 20 41 4e 44 20 62 20 3c 20 3f 20 2e 2e 2e   ? AND b < ? ...
11bc0 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 6e 45 71 20  .**.** then nEq 
11bd0 69 73 20 73 65 74 20 74 6f 20 31 20 28 61 73 20  is set to 1 (as 
11be0 74 68 65 20 72 61 6e 67 65 20 72 65 73 74 72 69  the range restri
11bf0 63 74 65 64 20 63 6f 6c 75 6d 6e 2c 20 62 2c 20  cted column, b, 
11c00 69 73 20 74 68 65 20 73 65 63 6f 6e 64 20 0a 2a  is the second .*
11c10 2a 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75  * left-most colu
11c20 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64 65 78 29  mn of the index)
11c30 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 71 75 65  . Or, if the que
11c40 72 79 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e  ry is:.**.**   .
11c50 2e 2e 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45  .. FROM t1 WHERE
11c60 20 61 20 3e 20 3f 20 41 4e 44 20 61 20 3c 20 3f   a > ? AND a < ?
11c70 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20   ....**.** then 
11c80 6e 45 71 20 69 73 20 73 65 74 20 74 6f 20 30 2e  nEq is set to 0.
11c90 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73  .**.** When this
11ca0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
11cb0 6c 65 64 2c 20 2a 70 6e 4f 75 74 20 69 73 20 73  led, *pnOut is s
11cc0 65 74 20 74 6f 20 74 68 65 20 73 71 6c 69 74 65  et to the sqlite
11cd0 33 4c 6f 67 45 73 74 28 29 20 6f 66 20 74 68 65  3LogEst() of the
11ce0 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  .** number of ro
11cf0 77 73 20 74 68 61 74 20 74 68 65 20 69 6e 64 65  ws that the inde
11d00 78 20 73 63 61 6e 20 69 73 20 65 78 70 65 63 74  x scan is expect
11d10 65 64 20 74 6f 20 76 69 73 69 74 20 77 69 74 68  ed to visit with
11d20 6f 75 74 20 0a 2a 2a 20 63 6f 6e 73 69 64 65 72  out .** consider
11d30 69 6e 67 20 74 68 65 20 72 61 6e 67 65 20 63 6f  ing the range co
11d40 6e 73 74 72 61 69 6e 74 73 2e 20 49 66 20 6e 45  nstraints. If nE
11d50 71 20 69 73 20 30 2c 20 74 68 69 73 20 69 73 20  q is 0, this is 
11d60 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 0a 2a  the number of .*
11d70 2a 20 72 6f 77 73 20 69 6e 20 74 68 65 20 69 6e  * rows in the in
11d80 64 65 78 2e 20 41 73 73 75 6d 69 6e 67 20 6e 6f  dex. Assuming no
11d90 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 2a   error occurs, *
11da0 70 6e 4f 75 74 20 69 73 20 61 64 6a 75 73 74 65  pnOut is adjuste
11db0 64 20 28 72 65 64 75 63 65 64 29 0a 2a 2a 20 74  d (reduced).** t
11dc0 6f 20 61 63 63 6f 75 6e 74 20 66 6f 72 20 74 68  o account for th
11dd0 65 20 72 61 6e 67 65 20 63 6f 6e 74 72 61 69 6e  e range contrain
11de0 74 73 20 70 4c 6f 77 65 72 20 61 6e 64 20 70 55  ts pLower and pU
11df0 70 70 65 72 2e 0a 2a 2a 20 0a 2a 2a 20 49 6e 20  pper..** .** In 
11e00 74 68 65 20 61 62 73 65 6e 63 65 20 6f 66 20 73  the absence of s
11e10 71 6c 69 74 65 5f 73 74 61 74 34 20 41 4e 41 4c  qlite_stat4 ANAL
11e20 59 5a 45 20 64 61 74 61 2c 20 6f 72 20 69 66 20  YZE data, or if 
11e30 73 75 63 68 20 64 61 74 61 20 63 61 6e 6e 6f 74  such data cannot
11e40 20 62 65 0a 2a 2a 20 75 73 65 64 2c 20 61 20 73   be.** used, a s
11e50 69 6e 67 6c 65 20 72 61 6e 67 65 20 69 6e 65 71  ingle range ineq
11e60 75 61 6c 69 74 79 20 72 65 64 75 63 65 73 20 74  uality reduces t
11e70 68 65 20 73 65 61 72 63 68 20 73 70 61 63 65 20  he search space 
11e80 62 79 20 61 20 66 61 63 74 6f 72 20 6f 66 20 34  by a factor of 4
11e90 2e 20 0a 2a 2a 20 61 6e 64 20 61 20 70 61 69 72  . .** and a pair
11ea0 20 6f 66 20 63 6f 6e 73 74 72 61 69 6e 74 73 20   of constraints 
11eb0 28 78 3e 3f 20 41 4e 44 20 78 3c 3f 29 20 72 65  (x>? AND x<?) re
11ec0 64 75 63 65 73 20 74 68 65 20 65 78 70 65 63 74  duces the expect
11ed0 65 64 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  ed number of.** 
11ee0 72 6f 77 73 20 76 69 73 69 74 65 64 20 62 79 20  rows visited by 
11ef0 61 20 66 61 63 74 6f 72 20 6f 66 20 36 34 2e 0a  a factor of 64..
11f00 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68  */.static int wh
11f10 65 72 65 52 61 6e 67 65 53 63 61 6e 45 73 74 28  ereRangeScanEst(
11f20 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
11f30 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69  ,       /* Parsi
11f40 6e 67 20 26 20 63 6f 64 65 20 67 65 6e 65 72 61  ng & code genera
11f50 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  ting context */.
11f60 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64    WhereLoopBuild
11f70 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 0a 20 20  er *pBuilder,.  
11f80 57 68 65 72 65 54 65 72 6d 20 2a 70 4c 6f 77 65  WhereTerm *pLowe
11f90 72 2c 20 20 20 2f 2a 20 4c 6f 77 65 72 20 62 6f  r,   /* Lower bo
11fa0 75 6e 64 20 6f 6e 20 74 68 65 20 72 61 6e 67 65  und on the range
11fb0 2e 20 65 78 3a 20 22 78 3e 31 32 33 22 20 4d 69  . ex: "x>123" Mi
11fc0 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  ght be NULL */. 
11fd0 20 57 68 65 72 65 54 65 72 6d 20 2a 70 55 70 70   WhereTerm *pUpp
11fe0 65 72 2c 20 20 20 2f 2a 20 55 70 70 65 72 20 62  er,   /* Upper b
11ff0 6f 75 6e 64 20 6f 6e 20 74 68 65 20 72 61 6e 67  ound on the rang
12000 65 2e 20 65 78 3a 20 22 78 3c 34 35 35 22 20 4d  e. ex: "x<455" M
12010 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a  ight be NULL */.
12020 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f    WhereLoop *pLo
12030 6f 70 20 20 20 20 20 2f 2a 20 4d 6f 64 69 66 79  op     /* Modify
12040 20 74 68 65 20 2e 6e 4f 75 74 20 61 6e 64 20 6d   the .nOut and m
12050 61 79 62 65 20 2e 72 52 75 6e 20 66 69 65 6c 64  aybe .rRun field
12060 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  s */.){.  int rc
12070 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
12080 69 6e 74 20 6e 4f 75 74 20 3d 20 70 4c 6f 6f 70  int nOut = pLoop
12090 2d 3e 6e 4f 75 74 3b 0a 20 20 4c 6f 67 45 73 74  ->nOut;.  LogEst
120a0 20 6e 4e 65 77 3b 0a 0a 23 69 66 64 65 66 20 53   nNew;..#ifdef S
120b0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
120c0 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 49 6e  T3_OR_STAT4.  In
120d0 64 65 78 20 2a 70 20 3d 20 70 4c 6f 6f 70 2d 3e  dex *p = pLoop->
120e0 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a  u.btree.pIndex;.
120f0 20 20 69 6e 74 20 6e 45 71 20 3d 20 70 4c 6f 6f    int nEq = pLoo
12100 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a  p->u.btree.nEq;.
12110 0a 20 20 69 66 28 20 70 2d 3e 6e 53 61 6d 70 6c  .  if( p->nSampl
12120 65 3e 30 0a 20 20 20 26 26 20 6e 45 71 3d 3d 70  e>0.   && nEq==p
12130 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c  Builder->nRecVal
12140 69 64 0a 20 20 20 26 26 20 6e 45 71 3c 70 2d 3e  id.   && nEq<p->
12150 6e 53 61 6d 70 6c 65 43 6f 6c 0a 20 20 20 26 26  nSampleCol.   &&
12160 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61   OptimizationEna
12170 62 6c 65 64 28 70 50 61 72 73 65 2d 3e 64 62 2c  bled(pParse->db,
12180 20 53 51 4c 49 54 45 5f 53 74 61 74 33 29 20 0a   SQLITE_Stat3) .
12190 20 20 29 7b 0a 20 20 20 20 55 6e 70 61 63 6b 65    ){.    Unpacke
121a0 64 52 65 63 6f 72 64 20 2a 70 52 65 63 20 3d 20  dRecord *pRec = 
121b0 70 42 75 69 6c 64 65 72 2d 3e 70 52 65 63 3b 0a  pBuilder->pRec;.
121c0 20 20 20 20 74 52 6f 77 63 6e 74 20 61 5b 32 5d      tRowcnt a[2]
121d0 3b 0a 20 20 20 20 75 38 20 61 66 66 3b 0a 0a 20  ;.    u8 aff;.. 
121e0 20 20 20 2f 2a 20 56 61 72 69 61 62 6c 65 20 69     /* Variable i
121f0 4c 6f 77 65 72 20 77 69 6c 6c 20 62 65 20 73 65  Lower will be se
12200 74 20 74 6f 20 74 68 65 20 65 73 74 69 6d 61 74  t to the estimat
12210 65 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20  e of the number 
12220 6f 66 20 72 6f 77 73 20 69 6e 20 0a 20 20 20 20  of rows in .    
12230 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 74 68 61  ** the index tha
12240 74 20 61 72 65 20 6c 65 73 73 20 74 68 61 6e 20  t are less than 
12250 74 68 65 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20  the lower bound 
12260 6f 66 20 74 68 65 20 72 61 6e 67 65 20 71 75 65  of the range que
12270 72 79 2e 20 54 68 65 0a 20 20 20 20 2a 2a 20 6c  ry. The.    ** l
12280 6f 77 65 72 20 62 6f 75 6e 64 20 62 65 69 6e 67  ower bound being
12290 20 74 68 65 20 63 6f 6e 63 61 74 65 6e 61 74 69   the concatenati
122a0 6f 6e 20 6f 66 20 24 50 20 61 6e 64 20 24 4c 2c  on of $P and $L,
122b0 20 77 68 65 72 65 20 24 50 20 69 73 20 74 68 65   where $P is the
122c0 0a 20 20 20 20 2a 2a 20 6b 65 79 2d 70 72 65 66  .    ** key-pref
122d0 69 78 20 66 6f 72 6d 65 64 20 62 79 20 74 68 65  ix formed by the
122e0 20 6e 45 71 20 76 61 6c 75 65 73 20 6d 61 74 63   nEq values matc
122f0 68 65 64 20 61 67 61 69 6e 73 74 20 74 68 65 20  hed against the 
12300 6e 45 71 20 6c 65 66 74 2d 6d 6f 73 74 0a 20 20  nEq left-most.  
12310 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20 6f 66 20    ** columns of 
12320 74 68 65 20 69 6e 64 65 78 2c 20 61 6e 64 20 24  the index, and $
12330 4c 20 69 73 20 74 68 65 20 76 61 6c 75 65 20 69  L is the value i
12340 6e 20 70 4c 6f 77 65 72 2e 0a 20 20 20 20 2a 2a  n pLower..    **
12350 0a 20 20 20 20 2a 2a 20 4f 72 2c 20 69 66 20 70  .    ** Or, if p
12360 4c 6f 77 65 72 20 69 73 20 4e 55 4c 4c 20 6f 72  Lower is NULL or
12370 20 24 4c 20 63 61 6e 6e 6f 74 20 62 65 20 65 78   $L cannot be ex
12380 74 72 61 63 74 65 64 20 66 72 6f 6d 20 69 74 20  tracted from it 
12390 28 62 65 63 61 75 73 65 20 69 74 0a 20 20 20 20  (because it.    
123a0 2a 2a 20 69 73 20 6e 6f 74 20 61 20 73 69 6d 70  ** is not a simp
123b0 6c 65 20 76 61 72 69 61 62 6c 65 20 6f 72 20 6c  le variable or l
123c0 69 74 65 72 61 6c 20 76 61 6c 75 65 29 2c 20 74  iteral value), t
123d0 68 65 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20 6f  he lower bound o
123e0 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 61 6e  f the.    ** ran
123f0 67 65 20 69 73 20 24 50 2e 20 44 75 65 20 74 6f  ge is $P. Due to
12400 20 61 20 71 75 69 72 6b 20 69 6e 20 74 68 65 20   a quirk in the 
12410 77 61 79 20 77 68 65 72 65 4b 65 79 53 74 61 74  way whereKeyStat
12420 73 28 29 20 77 6f 72 6b 73 2c 20 65 76 65 6e 0a  s() works, even.
12430 20 20 20 20 2a 2a 20 69 66 20 24 4c 20 69 73 20      ** if $L is 
12440 61 76 61 69 6c 61 62 6c 65 2c 20 77 68 65 72 65  available, where
12450 4b 65 79 53 74 61 74 73 28 29 20 69 73 20 63 61  KeyStats() is ca
12460 6c 6c 65 64 20 66 6f 72 20 62 6f 74 68 20 28 24  lled for both ($
12470 50 29 20 61 6e 64 20 0a 20 20 20 20 2a 2a 20 28  P) and .    ** (
12480 24 50 3a 24 4c 29 20 61 6e 64 20 74 68 65 20 6c  $P:$L) and the l
12490 61 72 67 65 72 20 6f 66 20 74 68 65 20 74 77 6f  arger of the two
124a0 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65 73   returned values
124b0 20 75 73 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20   used..    **.  
124c0 20 20 2a 2a 20 53 69 6d 69 6c 61 72 6c 79 2c 20    ** Similarly, 
124d0 69 55 70 70 65 72 20 69 73 20 74 6f 20 62 65 20  iUpper is to be 
124e0 73 65 74 20 74 6f 20 74 68 65 20 65 73 74 69 6d  set to the estim
124f0 61 74 65 20 6f 66 20 74 68 65 20 6e 75 6d 62 65  ate of the numbe
12500 72 20 6f 66 20 72 6f 77 73 0a 20 20 20 20 2a 2a  r of rows.    **
12510 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20 75   less than the u
12520 70 70 65 72 20 62 6f 75 6e 64 20 6f 66 20 74 68  pper bound of th
12530 65 20 72 61 6e 67 65 20 71 75 65 72 79 2e 20 57  e range query. W
12540 68 65 72 65 20 74 68 65 20 75 70 70 65 72 20 62  here the upper b
12550 6f 75 6e 64 0a 20 20 20 20 2a 2a 20 69 73 20 65  ound.    ** is e
12560 69 74 68 65 72 20 28 24 50 29 20 6f 72 20 28 24  ither ($P) or ($
12570 50 3a 24 55 29 2e 20 41 67 61 69 6e 2c 20 65 76  P:$U). Again, ev
12580 65 6e 20 69 66 20 24 55 20 69 73 20 61 76 61 69  en if $U is avai
12590 6c 61 62 6c 65 2c 20 62 6f 74 68 20 76 61 6c 75  lable, both valu
125a0 65 73 0a 20 20 20 20 2a 2a 20 6f 66 20 69 55 70  es.    ** of iUp
125b0 70 65 72 20 61 72 65 20 72 65 71 75 65 73 74 65  per are requeste
125c0 64 20 6f 66 20 77 68 65 72 65 4b 65 79 53 74 61  d of whereKeySta
125d0 74 73 28 29 20 61 6e 64 20 74 68 65 20 73 6d 61  ts() and the sma
125e0 6c 6c 65 72 20 75 73 65 64 2e 0a 20 20 20 20 2a  ller used..    *
125f0 2f 0a 20 20 20 20 74 52 6f 77 63 6e 74 20 69 4c  /.    tRowcnt iL
12600 6f 77 65 72 3b 0a 20 20 20 20 74 52 6f 77 63 6e  ower;.    tRowcn
12610 74 20 69 55 70 70 65 72 3b 0a 0a 20 20 20 20 69  t iUpper;..    i
12620 66 28 20 6e 45 71 3d 3d 70 2d 3e 6e 4b 65 79 43  f( nEq==p->nKeyC
12630 6f 6c 20 29 7b 0a 20 20 20 20 20 20 61 66 66 20  ol ){.      aff 
12640 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54  = SQLITE_AFF_INT
12650 45 47 45 52 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  EGER;.    }else{
12660 0a 20 20 20 20 20 20 61 66 66 20 3d 20 70 2d 3e  .      aff = p->
12670 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 70 2d 3e  pTable->aCol[p->
12680 61 69 43 6f 6c 75 6d 6e 5b 6e 45 71 5d 5d 2e 61  aiColumn[nEq]].a
12690 66 66 69 6e 69 74 79 3b 0a 20 20 20 20 7d 0a 20  ffinity;.    }. 
126a0 20 20 20 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20     /* Determine 
126b0 69 4c 6f 77 65 72 20 61 6e 64 20 69 55 70 70 65  iLower and iUppe
126c0 72 20 75 73 69 6e 67 20 28 24 50 29 20 6f 6e 6c  r using ($P) onl
126d0 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 45  y. */.    if( nE
126e0 71 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 4c  q==0 ){.      iL
126f0 6f 77 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  ower = 0;.      
12700 69 55 70 70 65 72 20 3d 20 73 71 6c 69 74 65 33  iUpper = sqlite3
12710 4c 6f 67 45 73 74 54 6f 49 6e 74 28 70 2d 3e 61  LogEstToInt(p->a
12720 69 52 6f 77 4c 6f 67 45 73 74 5b 30 5d 29 3b 0a  iRowLogEst[0]);.
12730 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
12740 20 2f 2a 20 4e 6f 74 65 3a 20 74 68 69 73 20 63   /* Note: this c
12750 61 6c 6c 20 63 6f 75 6c 64 20 62 65 20 6f 70 74  all could be opt
12760 69 6d 69 7a 65 64 20 61 77 61 79 20 2d 20 73 69  imized away - si
12770 6e 63 65 20 74 68 65 20 73 61 6d 65 20 76 61 6c  nce the same val
12780 75 65 73 20 6d 75 73 74 20 0a 20 20 20 20 20 20  ues must .      
12790 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 72 65 71  ** have been req
127a0 75 65 73 74 65 64 20 77 68 65 6e 20 74 65 73 74  uested when test
127b0 69 6e 67 20 6b 65 79 20 24 50 20 69 6e 20 77 68  ing key $P in wh
127c0 65 72 65 45 71 75 61 6c 53 63 61 6e 45 73 74 28  ereEqualScanEst(
127d0 29 2e 20 20 2a 2f 0a 20 20 20 20 20 20 77 68 65  ).  */.      whe
127e0 72 65 4b 65 79 53 74 61 74 73 28 70 50 61 72 73  reKeyStats(pPars
127f0 65 2c 20 70 2c 20 70 52 65 63 2c 20 30 2c 20 61  e, p, pRec, 0, a
12800 29 3b 0a 20 20 20 20 20 20 69 4c 6f 77 65 72 20  );.      iLower 
12810 3d 20 61 5b 30 5d 3b 0a 20 20 20 20 20 20 69 55  = a[0];.      iU
12820 70 70 65 72 20 3d 20 61 5b 30 5d 20 2b 20 61 5b  pper = a[0] + a[
12830 31 5d 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  1];.    }..    /
12840 2a 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 69  * If possible, i
12850 6d 70 72 6f 76 65 20 6f 6e 20 74 68 65 20 69 4c  mprove on the iL
12860 6f 77 65 72 20 65 73 74 69 6d 61 74 65 20 75 73  ower estimate us
12870 69 6e 67 20 28 24 50 3a 24 4c 29 2e 20 2a 2f 0a  ing ($P:$L). */.
12880 20 20 20 20 69 66 28 20 70 4c 6f 77 65 72 20 29      if( pLower )
12890 7b 0a 20 20 20 20 20 20 69 6e 74 20 62 4f 6b 3b  {.      int bOk;
128a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
128b0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 76      /* True if v
128c0 61 6c 75 65 20 69 73 20 65 78 74 72 61 63 74 65  alue is extracte
128d0 64 20 66 72 6f 6d 20 70 45 78 70 72 20 2a 2f 0a  d from pExpr */.
128e0 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70        Expr *pExp
128f0 72 20 3d 20 70 4c 6f 77 65 72 2d 3e 70 45 78 70  r = pLower->pExp
12900 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20  r->pRight;.     
12910 20 61 73 73 65 72 74 28 20 28 70 4c 6f 77 65 72   assert( (pLower
12920 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57  ->eOperator & (W
12930 4f 5f 47 54 7c 57 4f 5f 47 45 29 29 21 3d 30 20  O_GT|WO_GE))!=0 
12940 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
12950 6c 69 74 65 33 53 74 61 74 34 50 72 6f 62 65 53  lite3Stat4ProbeS
12960 65 74 56 61 6c 75 65 28 70 50 61 72 73 65 2c 20  etValue(pParse, 
12970 70 2c 20 26 70 52 65 63 2c 20 70 45 78 70 72 2c  p, &pRec, pExpr,
12980 20 61 66 66 2c 20 6e 45 71 2c 20 26 62 4f 6b 29   aff, nEq, &bOk)
12990 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
129a0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 4f 6b  SQLITE_OK && bOk
129b0 20 29 7b 0a 20 20 20 20 20 20 20 20 74 52 6f 77   ){.        tRow
129c0 63 6e 74 20 69 4e 65 77 3b 0a 20 20 20 20 20 20  cnt iNew;.      
129d0 20 20 77 68 65 72 65 4b 65 79 53 74 61 74 73 28    whereKeyStats(
129e0 70 50 61 72 73 65 2c 20 70 2c 20 70 52 65 63 2c  pParse, p, pRec,
129f0 20 30 2c 20 61 29 3b 0a 20 20 20 20 20 20 20 20   0, a);.        
12a00 69 4e 65 77 20 3d 20 61 5b 30 5d 20 2b 20 28 28  iNew = a[0] + ((
12a10 70 4c 6f 77 65 72 2d 3e 65 4f 70 65 72 61 74 6f  pLower->eOperato
12a20 72 20 26 20 57 4f 5f 47 54 29 20 3f 20 61 5b 31  r & WO_GT) ? a[1
12a30 5d 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ] : 0);.        
12a40 69 66 28 20 69 4e 65 77 3e 69 4c 6f 77 65 72 20  if( iNew>iLower 
12a50 29 20 69 4c 6f 77 65 72 20 3d 20 69 4e 65 77 3b  ) iLower = iNew;
12a60 0a 20 20 20 20 20 20 20 20 6e 4f 75 74 2d 2d 3b  .        nOut--;
12a70 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
12a80 20 20 20 20 2f 2a 20 49 66 20 70 6f 73 73 69 62      /* If possib
12a90 6c 65 2c 20 69 6d 70 72 6f 76 65 20 6f 6e 20 74  le, improve on t
12aa0 68 65 20 69 55 70 70 65 72 20 65 73 74 69 6d 61  he iUpper estima
12ab0 74 65 20 75 73 69 6e 67 20 28 24 50 3a 24 55 29  te using ($P:$U)
12ac0 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 55 70  . */.    if( pUp
12ad0 70 65 72 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  per ){.      int
12ae0 20 62 4f 6b 3b 20 20 20 20 20 20 20 20 20 20 20   bOk;           
12af0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
12b00 20 69 66 20 76 61 6c 75 65 20 69 73 20 65 78 74   if value is ext
12b10 72 61 63 74 65 64 20 66 72 6f 6d 20 70 45 78 70  racted from pExp
12b20 72 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20  r */.      Expr 
12b30 2a 70 45 78 70 72 20 3d 20 70 55 70 70 65 72 2d  *pExpr = pUpper-
12b40 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a  >pExpr->pRight;.
12b50 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
12b60 55 70 70 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72  Upper->eOperator
12b70 20 26 20 28 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29   & (WO_LT|WO_LE)
12b80 29 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 63  )!=0 );.      rc
12b90 20 3d 20 73 71 6c 69 74 65 33 53 74 61 74 34 50   = sqlite3Stat4P
12ba0 72 6f 62 65 53 65 74 56 61 6c 75 65 28 70 50 61  robeSetValue(pPa
12bb0 72 73 65 2c 20 70 2c 20 26 70 52 65 63 2c 20 70  rse, p, &pRec, p
12bc0 45 78 70 72 2c 20 61 66 66 2c 20 6e 45 71 2c 20  Expr, aff, nEq, 
12bd0 26 62 4f 6b 29 3b 0a 20 20 20 20 20 20 69 66 28  &bOk);.      if(
12be0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
12bf0 26 20 62 4f 6b 20 29 7b 0a 20 20 20 20 20 20 20  & bOk ){.       
12c00 20 74 52 6f 77 63 6e 74 20 69 4e 65 77 3b 0a 20   tRowcnt iNew;. 
12c10 20 20 20 20 20 20 20 77 68 65 72 65 4b 65 79 53         whereKeyS
12c20 74 61 74 73 28 70 50 61 72 73 65 2c 20 70 2c 20  tats(pParse, p, 
12c30 70 52 65 63 2c 20 31 2c 20 61 29 3b 0a 20 20 20  pRec, 1, a);.   
12c40 20 20 20 20 20 69 4e 65 77 20 3d 20 61 5b 30 5d       iNew = a[0]
12c50 20 2b 20 28 28 70 55 70 70 65 72 2d 3e 65 4f 70   + ((pUpper->eOp
12c60 65 72 61 74 6f 72 20 26 20 57 4f 5f 4c 45 29 20  erator & WO_LE) 
12c70 3f 20 61 5b 31 5d 20 3a 20 30 29 3b 0a 20 20 20  ? a[1] : 0);.   
12c80 20 20 20 20 20 69 66 28 20 69 4e 65 77 3c 69 55       if( iNew<iU
12c90 70 70 65 72 20 29 20 69 55 70 70 65 72 20 3d 20  pper ) iUpper = 
12ca0 69 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 6e 4f  iNew;.        nO
12cb0 75 74 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ut--;.      }.  
12cc0 20 20 7d 0a 0a 20 20 20 20 70 42 75 69 6c 64 65    }..    pBuilde
12cd0 72 2d 3e 70 52 65 63 20 3d 20 70 52 65 63 3b 0a  r->pRec = pRec;.
12ce0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
12cf0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69  TE_OK ){.      i
12d00 66 28 20 69 55 70 70 65 72 3e 69 4c 6f 77 65 72  f( iUpper>iLower
12d10 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 4e 65 77   ){.        nNew
12d20 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
12d30 28 69 55 70 70 65 72 20 2d 20 69 4c 6f 77 65 72  (iUpper - iLower
12d40 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
12d50 20 20 20 20 20 20 20 20 6e 4e 65 77 20 3d 20 31          nNew = 1
12d60 30 3b 20 20 20 20 20 20 20 20 61 73 73 65 72 74  0;        assert
12d70 28 20 31 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67  ( 10==sqlite3Log
12d80 45 73 74 28 32 29 20 29 3b 0a 20 20 20 20 20 20  Est(2) );.      
12d90 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 4e 65 77  }.      if( nNew
12da0 3c 6e 4f 75 74 20 29 7b 0a 20 20 20 20 20 20 20  <nOut ){.       
12db0 20 6e 4f 75 74 20 3d 20 6e 4e 65 77 3b 0a 20 20   nOut = nNew;.  
12dc0 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4c 6f 6f      }.      pLoo
12dd0 70 2d 3e 6e 4f 75 74 20 3d 20 28 4c 6f 67 45 73  p->nOut = (LogEs
12de0 74 29 6e 4f 75 74 3b 0a 20 20 20 20 20 20 57 48  t)nOut;.      WH
12df0 45 52 45 54 52 41 43 45 28 30 78 31 30 2c 20 28  ERETRACE(0x10, (
12e00 22 72 61 6e 67 65 20 73 63 61 6e 20 72 65 67 69  "range scan regi
12e10 6f 6e 73 3a 20 25 75 2e 2e 25 75 20 20 65 73 74  ons: %u..%u  est
12e20 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%d\n",.        
12e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12e40 20 28 75 33 32 29 69 4c 6f 77 65 72 2c 20 28 75   (u32)iLower, (u
12e50 33 32 29 69 55 70 70 65 72 2c 20 6e 4f 75 74 29  32)iUpper, nOut)
12e60 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
12e70 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
12e80 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 55 4e 55  .  }.#else.  UNU
12e90 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 50  SED_PARAMETER(pP
12ea0 61 72 73 65 29 3b 0a 20 20 55 4e 55 53 45 44 5f  arse);.  UNUSED_
12eb0 50 41 52 41 4d 45 54 45 52 28 70 42 75 69 6c 64  PARAMETER(pBuild
12ec0 65 72 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73  er);.#endif.  as
12ed0 73 65 72 74 28 20 70 4c 6f 77 65 72 20 7c 7c 20  sert( pLower || 
12ee0 70 55 70 70 65 72 20 29 3b 0a 20 20 61 73 73 65  pUpper );.  asse
12ef0 72 74 28 20 70 55 70 70 65 72 3d 3d 30 20 7c 7c  rt( pUpper==0 ||
12f00 20 28 70 55 70 70 65 72 2d 3e 77 74 46 6c 61 67   (pUpper->wtFlag
12f10 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d  s & TERM_VNULL)=
12f20 3d 30 20 29 3b 0a 20 20 6e 4e 65 77 20 3d 20 77  =0 );.  nNew = w
12f30 68 65 72 65 52 61 6e 67 65 41 64 6a 75 73 74 28  hereRangeAdjust(
12f40 70 4c 6f 77 65 72 2c 20 6e 4f 75 74 29 3b 0a 20  pLower, nOut);. 
12f50 20 6e 4e 65 77 20 3d 20 77 68 65 72 65 52 61 6e   nNew = whereRan
12f60 67 65 41 64 6a 75 73 74 28 70 55 70 70 65 72 2c  geAdjust(pUpper,
12f70 20 6e 4e 65 77 29 3b 0a 0a 20 20 2f 2a 20 54 55   nNew);..  /* TU
12f80 4e 49 4e 47 3a 20 49 66 20 74 68 65 72 65 20 69  NING: If there i
12f90 73 20 62 6f 74 68 20 61 6e 20 75 70 70 65 72 20  s both an upper 
12fa0 61 6e 64 20 6c 6f 77 65 72 20 6c 69 6d 69 74 2c  and lower limit,
12fb0 20 61 73 73 75 6d 65 20 74 68 65 20 72 61 6e 67   assume the rang
12fc0 65 20 69 73 0a 20 20 2a 2a 20 72 65 64 75 63 65  e is.  ** reduce
12fd0 64 20 62 79 20 61 6e 20 61 64 64 69 74 69 6f 6e  d by an addition
12fe0 61 6c 20 37 35 25 2e 20 54 68 69 73 20 6d 65 61  al 75%. This mea
12ff0 6e 73 20 74 68 61 74 2c 20 62 79 20 64 65 66 61  ns that, by defa
13000 75 6c 74 2c 20 61 6e 20 6f 70 65 6e 2d 65 6e 64  ult, an open-end
13010 65 64 0a 20 20 2a 2a 20 72 61 6e 67 65 20 71 75  ed.  ** range qu
13020 65 72 79 20 28 65 2e 67 2e 20 63 6f 6c 20 3e 20  ery (e.g. col > 
13030 3f 29 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f  ?) is assumed to
13040 20 6d 61 74 63 68 20 31 2f 34 20 6f 66 20 74 68   match 1/4 of th
13050 65 20 72 6f 77 73 20 69 6e 20 74 68 65 0a 20 20  e rows in the.  
13060 2a 2a 20 69 6e 64 65 78 2e 20 57 68 69 6c 65 20  ** index. While 
13070 61 20 63 6c 6f 73 65 64 20 72 61 6e 67 65 20 28  a closed range (
13080 65 2e 67 2e 20 63 6f 6c 20 42 45 54 57 45 45 4e  e.g. col BETWEEN
13090 20 3f 20 41 4e 44 20 3f 29 20 69 73 20 65 73 74   ? AND ?) is est
130a0 69 6d 61 74 65 64 20 74 6f 0a 20 20 2a 2a 20 6d  imated to.  ** m
130b0 61 74 63 68 20 31 2f 36 34 20 6f 66 20 74 68 65  atch 1/64 of the
130c0 20 69 6e 64 65 78 2e 20 2a 2f 20 0a 20 20 69 66   index. */ .  if
130d0 28 20 70 4c 6f 77 65 72 20 26 26 20 70 55 70 70  ( pLower && pUpp
130e0 65 72 20 29 20 6e 4e 65 77 20 2d 3d 20 32 30 3b  er ) nNew -= 20;
130f0 0a 0a 20 20 6e 4f 75 74 20 2d 3d 20 28 70 4c 6f  ..  nOut -= (pLo
13100 77 65 72 21 3d 30 29 20 2b 20 28 70 55 70 70 65  wer!=0) + (pUppe
13110 72 21 3d 30 29 3b 0a 20 20 69 66 28 20 6e 4e 65  r!=0);.  if( nNe
13120 77 3c 31 30 20 29 20 6e 4e 65 77 20 3d 20 31 30  w<10 ) nNew = 10
13130 3b 0a 20 20 69 66 28 20 6e 4e 65 77 3c 6e 4f 75  ;.  if( nNew<nOu
13140 74 20 29 20 6e 4f 75 74 20 3d 20 6e 4e 65 77 3b  t ) nOut = nNew;
13150 0a 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 3d  .  pLoop->nOut =
13160 20 28 4c 6f 67 45 73 74 29 6e 4f 75 74 3b 0a 20   (LogEst)nOut;. 
13170 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
13180 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
13190 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41  BLE_STAT3_OR_STA
131a0 54 34 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74  T4./*.** Estimat
131b0 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
131c0 72 6f 77 73 20 74 68 61 74 20 77 69 6c 6c 20 62  rows that will b
131d0 65 20 72 65 74 75 72 6e 65 64 20 62 61 73 65 64  e returned based
131e0 20 6f 6e 0a 2a 2a 20 61 6e 20 65 71 75 61 6c 69   on.** an equali
131f0 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 78 3d  ty constraint x=
13200 56 41 4c 55 45 20 61 6e 64 20 77 68 65 72 65 20  VALUE and where 
13210 74 68 61 74 20 56 41 4c 55 45 20 6f 63 63 75 72  that VALUE occur
13220 73 20 69 6e 0a 2a 2a 20 74 68 65 20 68 69 73 74  s in.** the hist
13230 6f 67 72 61 6d 20 64 61 74 61 2e 20 20 54 68 69  ogram data.  Thi
13240 73 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 77 68 65  s only works whe
13250 6e 20 78 20 69 73 20 74 68 65 20 6c 65 66 74 2d  n x is the left-
13260 6d 6f 73 74 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 6f  most.** column o
13270 66 20 61 6e 20 69 6e 64 65 78 20 61 6e 64 20 73  f an index and s
13280 71 6c 69 74 65 5f 73 74 61 74 33 20 68 69 73 74  qlite_stat3 hist
13290 6f 67 72 61 6d 20 64 61 74 61 20 69 73 20 61 76  ogram data is av
132a0 61 69 6c 61 62 6c 65 0a 2a 2a 20 66 6f 72 20 74  ailable.** for t
132b0 68 61 74 20 69 6e 64 65 78 2e 20 20 57 68 65 6e  hat index.  When
132c0 20 70 45 78 70 72 3d 3d 4e 55 4c 4c 20 74 68 61   pExpr==NULL tha
132d0 74 20 6d 65 61 6e 73 20 74 68 65 20 63 6f 6e 73  t means the cons
132e0 74 72 61 69 6e 74 20 69 73 0a 2a 2a 20 22 78 20  traint is.** "x 
132f0 49 53 20 4e 55 4c 4c 22 20 69 6e 73 74 65 61 64  IS NULL" instead
13300 20 6f 66 20 22 78 3d 56 41 4c 55 45 22 2e 0a 2a   of "x=VALUE"..*
13310 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 65  *.** Write the e
13320 73 74 69 6d 61 74 65 64 20 72 6f 77 20 63 6f 75  stimated row cou
13330 6e 74 20 69 6e 74 6f 20 2a 70 6e 52 6f 77 20 61  nt into *pnRow a
13340 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  nd return SQLITE
13350 5f 4f 4b 2e 20 0a 2a 2a 20 49 66 20 75 6e 61 62  _OK. .** If unab
13360 6c 65 20 74 6f 20 6d 61 6b 65 20 61 6e 20 65 73  le to make an es
13370 74 69 6d 61 74 65 2c 20 6c 65 61 76 65 20 2a 70  timate, leave *p
13380 6e 52 6f 77 20 75 6e 63 68 61 6e 67 65 64 20 61  nRow unchanged a
13390 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e  nd return.** non
133a0 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  -zero..**.** Thi
133b0 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 66 61  s routine can fa
133c0 69 6c 20 69 66 20 69 74 20 69 73 20 75 6e 61 62  il if it is unab
133d0 6c 65 20 74 6f 20 6c 6f 61 64 20 61 20 63 6f 6c  le to load a col
133e0 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 0a  lating sequence.
133f0 2a 2a 20 72 65 71 75 69 72 65 64 20 66 6f 72 20  ** required for 
13400 73 74 72 69 6e 67 20 63 6f 6d 70 61 72 69 73 6f  string compariso
13410 6e 2c 20 6f 72 20 69 66 20 75 6e 61 62 6c 65 20  n, or if unable 
13420 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f  to allocate memo
13430 72 79 0a 2a 2a 20 66 6f 72 20 61 20 55 54 46 20  ry.** for a UTF 
13440 63 6f 6e 76 65 72 73 69 6f 6e 20 72 65 71 75 69  conversion requi
13450 72 65 64 20 66 6f 72 20 63 6f 6d 70 61 72 69 73  red for comparis
13460 6f 6e 2e 20 20 54 68 65 20 65 72 72 6f 72 20 69  on.  The error i
13470 73 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 74  s stored.** in t
13480 68 65 20 70 50 61 72 73 65 20 73 74 72 75 63 74  he pParse struct
13490 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ure..*/.static i
134a0 6e 74 20 77 68 65 72 65 45 71 75 61 6c 53 63 61  nt whereEqualSca
134b0 6e 45 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70  nEst(.  Parse *p
134c0 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20  Parse,       /* 
134d0 50 61 72 73 69 6e 67 20 26 20 63 6f 64 65 20 67  Parsing & code g
134e0 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78  enerating contex
134f0 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70  t */.  WhereLoop
13500 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65  Builder *pBuilde
13510 72 2c 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  r,.  Expr *pExpr
13520 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70  ,         /* Exp
13530 72 65 73 73 69 6f 6e 20 66 6f 72 20 56 41 4c 55  ression for VALU
13540 45 20 69 6e 20 74 68 65 20 78 3d 56 41 4c 55 45  E in the x=VALUE
13550 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20   constraint */. 
13560 20 74 52 6f 77 63 6e 74 20 2a 70 6e 52 6f 77 20   tRowcnt *pnRow 
13570 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
13580 68 65 20 72 65 76 69 73 65 64 20 72 6f 77 20 65  he revised row e
13590 73 74 69 6d 61 74 65 20 68 65 72 65 20 2a 2f 0a  stimate here */.
135a0 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 20 3d 20  ){.  Index *p = 
135b0 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e  pBuilder->pNew->
135c0 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a  u.btree.pIndex;.
135d0 20 20 69 6e 74 20 6e 45 71 20 3d 20 70 42 75 69    int nEq = pBui
135e0 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74  lder->pNew->u.bt
135f0 72 65 65 2e 6e 45 71 3b 0a 20 20 55 6e 70 61 63  ree.nEq;.  Unpac
13600 6b 65 64 52 65 63 6f 72 64 20 2a 70 52 65 63 20  kedRecord *pRec 
13610 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 52 65 63  = pBuilder->pRec
13620 3b 0a 20 20 75 38 20 61 66 66 3b 20 20 20 20 20  ;.  u8 aff;     
13630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13640 20 43 6f 6c 75 6d 6e 20 61 66 66 69 6e 69 74 79   Column affinity
13650 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
13660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13670 2f 2a 20 53 75 62 66 75 6e 63 74 69 6f 6e 20 72  /* Subfunction r
13680 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
13690 74 52 6f 77 63 6e 74 20 61 5b 32 5d 3b 20 20 20  tRowcnt a[2];   
136a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61            /* Sta
136b0 74 69 73 74 69 63 73 20 2a 2f 0a 20 20 69 6e 74  tistics */.  int
136c0 20 62 4f 6b 3b 0a 0a 20 20 61 73 73 65 72 74 28   bOk;..  assert(
136d0 20 6e 45 71 3e 3d 31 20 29 3b 0a 20 20 61 73 73   nEq>=1 );.  ass
136e0 65 72 74 28 20 6e 45 71 3c 3d 28 70 2d 3e 6e 4b  ert( nEq<=(p->nK
136f0 65 79 43 6f 6c 2b 31 29 20 29 3b 0a 20 20 61 73  eyCol+1) );.  as
13700 73 65 72 74 28 20 70 2d 3e 61 53 61 6d 70 6c 65  sert( p->aSample
13710 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
13720 20 70 2d 3e 6e 53 61 6d 70 6c 65 3e 30 20 29 3b   p->nSample>0 );
13730 0a 20 20 61 73 73 65 72 74 28 20 70 42 75 69 6c  .  assert( pBuil
13740 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3c 6e  der->nRecValid<n
13750 45 71 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 76  Eq );..  /* If v
13760 61 6c 75 65 73 20 61 72 65 20 6e 6f 74 20 61 76  alues are not av
13770 61 69 6c 61 62 6c 65 20 66 6f 72 20 61 6c 6c 20  ailable for all 
13780 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 69 6e  fields of the in
13790 64 65 78 20 74 6f 20 74 68 65 20 6c 65 66 74 0a  dex to the left.
137a0 20 20 2a 2a 20 6f 66 20 74 68 69 73 20 6f 6e 65    ** of this one
137b0 2c 20 6e 6f 20 65 73 74 69 6d 61 74 65 20 63 61  , no estimate ca
137c0 6e 20 62 65 20 6d 61 64 65 2e 20 52 65 74 75 72  n be made. Retur
137d0 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e  n SQLITE_NOTFOUN
137e0 44 2e 20 2a 2f 0a 20 20 69 66 28 20 70 42 75 69  D. */.  if( pBui
137f0 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3c  lder->nRecValid<
13800 28 6e 45 71 2d 31 29 20 29 7b 0a 20 20 20 20 72  (nEq-1) ){.    r
13810 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54  eturn SQLITE_NOT
13820 46 4f 55 4e 44 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  FOUND;.  }..  /*
13830 20 54 68 69 73 20 69 73 20 61 6e 20 6f 70 74 69   This is an opti
13840 6d 69 7a 61 74 69 6f 6e 20 6f 6e 6c 79 2e 20 54  mization only. T
13850 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  he call to sqlit
13860 65 33 53 74 61 74 34 50 72 6f 62 65 53 65 74 56  e3Stat4ProbeSetV
13870 61 6c 75 65 28 29 0a 20 20 2a 2a 20 62 65 6c 6f  alue().  ** belo
13880 77 20 77 6f 75 6c 64 20 72 65 74 75 72 6e 20 74  w would return t
13890 68 65 20 73 61 6d 65 20 76 61 6c 75 65 2e 20 20  he same value.  
138a0 2a 2f 0a 20 20 69 66 28 20 6e 45 71 3e 70 2d 3e  */.  if( nEq>p->
138b0 6e 4b 65 79 43 6f 6c 20 29 7b 0a 20 20 20 20 2a  nKeyCol ){.    *
138c0 70 6e 52 6f 77 20 3d 20 31 3b 0a 20 20 20 20 72  pnRow = 1;.    r
138d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
138e0 0a 20 20 7d 0a 0a 20 20 61 66 66 20 3d 20 70 2d  .  }..  aff = p-
138f0 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 70 2d  >pTable->aCol[p-
13900 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 45 71 2d 31 5d  >aiColumn[nEq-1]
13910 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 72 63  ].affinity;.  rc
13920 20 3d 20 73 71 6c 69 74 65 33 53 74 61 74 34 50   = sqlite3Stat4P
13930 72 6f 62 65 53 65 74 56 61 6c 75 65 28 70 50 61  robeSetValue(pPa
13940 72 73 65 2c 20 70 2c 20 26 70 52 65 63 2c 20 70  rse, p, &pRec, p
13950 45 78 70 72 2c 20 61 66 66 2c 20 6e 45 71 2d 31  Expr, aff, nEq-1
13960 2c 20 26 62 4f 6b 29 3b 0a 20 20 70 42 75 69 6c  , &bOk);.  pBuil
13970 64 65 72 2d 3e 70 52 65 63 20 3d 20 70 52 65 63  der->pRec = pRec
13980 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
13990 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
139a0 63 3b 0a 20 20 69 66 28 20 62 4f 6b 3d 3d 30 20  c;.  if( bOk==0 
139b0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
139c0 4e 4f 54 46 4f 55 4e 44 3b 0a 20 20 70 42 75 69  NOTFOUND;.  pBui
139d0 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20  lder->nRecValid 
139e0 3d 20 6e 45 71 3b 0a 0a 20 20 77 68 65 72 65 4b  = nEq;..  whereK
139f0 65 79 53 74 61 74 73 28 70 50 61 72 73 65 2c 20  eyStats(pParse, 
13a00 70 2c 20 70 52 65 63 2c 20 30 2c 20 61 29 3b 0a  p, pRec, 0, a);.
13a10 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78 31    WHERETRACE(0x1
13a20 30 2c 28 22 65 71 75 61 6c 69 74 79 20 73 63 61  0,("equality sca
13a30 6e 20 72 65 67 69 6f 6e 73 3a 20 25 64 5c 6e 22  n regions: %d\n"
13a40 2c 20 28 69 6e 74 29 61 5b 31 5d 29 29 3b 0a 20  , (int)a[1]));. 
13a50 20 2a 70 6e 52 6f 77 20 3d 20 61 5b 31 5d 3b 0a   *pnRow = a[1];.
13a60 20 20 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a    .  return rc;.
13a70 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
13a80 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f  TE_ENABLE_STAT3_
13a90 4f 52 5f 53 54 41 54 34 20 2a 2f 0a 0a 23 69 66  OR_STAT4 */..#if
13aa0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
13ab0 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34  E_STAT3_OR_STAT4
13ac0 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20  ./*.** Estimate 
13ad0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
13ae0 77 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  ws that will be 
13af0 72 65 74 75 72 6e 65 64 20 62 61 73 65 64 20 6f  returned based o
13b00 6e 0a 2a 2a 20 61 6e 20 49 4e 20 63 6f 6e 73 74  n.** an IN const
13b10 72 61 69 6e 74 20 77 68 65 72 65 20 74 68 65 20  raint where the 
13b20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20  right-hand side 
13b30 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74  of the IN operat
13b40 6f 72 0a 2a 2a 20 69 73 20 61 20 6c 69 73 74 20  or.** is a list 
13b50 6f 66 20 76 61 6c 75 65 73 2e 20 20 45 78 61 6d  of values.  Exam
13b60 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  ple:.**.**      
13b70 20 20 57 48 45 52 45 20 78 20 49 4e 20 28 31 2c    WHERE x IN (1,
13b80 32 2c 33 2c 34 29 0a 2a 2a 0a 2a 2a 20 57 72 69  2,3,4).**.** Wri
13b90 74 65 20 74 68 65 20 65 73 74 69 6d 61 74 65 64  te the estimated
13ba0 20 72 6f 77 20 63 6f 75 6e 74 20 69 6e 74 6f 20   row count into 
13bb0 2a 70 6e 52 6f 77 20 61 6e 64 20 72 65 74 75 72  *pnRow and retur
13bc0 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 0a 2a 2a  n SQLITE_OK. .**
13bd0 20 49 66 20 75 6e 61 62 6c 65 20 74 6f 20 6d 61   If unable to ma
13be0 6b 65 20 61 6e 20 65 73 74 69 6d 61 74 65 2c 20  ke an estimate, 
13bf0 6c 65 61 76 65 20 2a 70 6e 52 6f 77 20 75 6e 63  leave *pnRow unc
13c00 68 61 6e 67 65 64 20 61 6e 64 20 72 65 74 75 72  hanged and retur
13c10 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a  n.** non-zero..*
13c20 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
13c30 65 20 63 61 6e 20 66 61 69 6c 20 69 66 20 69 74  e can fail if it
13c40 20 69 73 20 75 6e 61 62 6c 65 20 74 6f 20 6c 6f   is unable to lo
13c50 61 64 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73  ad a collating s
13c60 65 71 75 65 6e 63 65 0a 2a 2a 20 72 65 71 75 69  equence.** requi
13c70 72 65 64 20 66 6f 72 20 73 74 72 69 6e 67 20 63  red for string c
13c80 6f 6d 70 61 72 69 73 6f 6e 2c 20 6f 72 20 69 66  omparison, or if
13c90 20 75 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63   unable to alloc
13ca0 61 74 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20 66 6f  ate memory.** fo
13cb0 72 20 61 20 55 54 46 20 63 6f 6e 76 65 72 73 69  r a UTF conversi
13cc0 6f 6e 20 72 65 71 75 69 72 65 64 20 66 6f 72 20  on required for 
13cd0 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 20 54 68 65  comparison.  The
13ce0 20 65 72 72 6f 72 20 69 73 20 73 74 6f 72 65 64   error is stored
13cf0 0a 2a 2a 20 69 6e 20 74 68 65 20 70 50 61 72 73  .** in the pPars
13d00 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  e structure..*/.
13d10 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
13d20 49 6e 53 63 61 6e 45 73 74 28 0a 20 20 50 61 72  InScanEst(.  Par
13d30 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
13d40 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 26 20 63    /* Parsing & c
13d50 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63  ode generating c
13d60 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72  ontext */.  Wher
13d70 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42  eLoopBuilder *pB
13d80 75 69 6c 64 65 72 2c 0a 20 20 45 78 70 72 4c 69  uilder,.  ExprLi
13d90 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f  st *pList,     /
13da0 2a 20 54 68 65 20 76 61 6c 75 65 20 6c 69 73 74  * The value list
13db0 20 6f 6e 20 74 68 65 20 52 48 53 20 6f 66 20 22   on the RHS of "
13dc0 78 20 49 4e 20 28 76 31 2c 76 32 2c 76 33 2c 2e  x IN (v1,v2,v3,.
13dd0 2e 2e 29 22 20 2a 2f 0a 20 20 74 52 6f 77 63 6e  ..)" */.  tRowcn
13de0 74 20 2a 70 6e 52 6f 77 20 20 20 20 20 20 20 2f  t *pnRow       /
13df0 2a 20 57 72 69 74 65 20 74 68 65 20 72 65 76 69  * Write the revi
13e00 73 65 64 20 72 6f 77 20 65 73 74 69 6d 61 74 65  sed row estimate
13e10 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 49 6e   here */.){.  In
13e20 64 65 78 20 2a 70 20 3d 20 70 42 75 69 6c 64 65  dex *p = pBuilde
13e30 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65  r->pNew->u.btree
13e40 2e 70 49 6e 64 65 78 3b 0a 20 20 69 36 34 20 6e  .pIndex;.  i64 n
13e50 52 6f 77 30 20 3d 20 73 71 6c 69 74 65 33 4c 6f  Row0 = sqlite3Lo
13e60 67 45 73 74 54 6f 49 6e 74 28 70 2d 3e 61 69 52  gEstToInt(p->aiR
13e70 6f 77 4c 6f 67 45 73 74 5b 30 5d 29 3b 0a 20 20  owLogEst[0]);.  
13e80 69 6e 74 20 6e 52 65 63 56 61 6c 69 64 20 3d 20  int nRecValid = 
13e90 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61  pBuilder->nRecVa
13ea0 6c 69 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  lid;.  int rc = 
13eb0 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 2f  SQLITE_OK;     /
13ec0 2a 20 53 75 62 66 75 6e 63 74 69 6f 6e 20 72 65  * Subfunction re
13ed0 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 74  turn code */.  t
13ee0 52 6f 77 63 6e 74 20 6e 45 73 74 3b 20 20 20 20  Rowcnt nEst;    
13ef0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
13f00 20 6f 66 20 72 6f 77 73 20 66 6f 72 20 61 20 73   of rows for a s
13f10 69 6e 67 6c 65 20 74 65 72 6d 20 2a 2f 0a 20 20  ingle term */.  
13f20 74 52 6f 77 63 6e 74 20 6e 52 6f 77 45 73 74 20  tRowcnt nRowEst 
13f30 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 65 77 20 65  = 0;    /* New e
13f40 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20 6e  stimate of the n
13f50 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 2a 2f  umber of rows */
13f60 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
13f70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
13f80 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20  op counter */.. 
13f90 20 61 73 73 65 72 74 28 20 70 2d 3e 61 53 61 6d   assert( p->aSam
13fa0 70 6c 65 21 3d 30 20 29 3b 0a 20 20 66 6f 72 28  ple!=0 );.  for(
13fb0 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=0; rc==SQLITE_
13fc0 4f 4b 20 26 26 20 69 3c 70 4c 69 73 74 2d 3e 6e  OK && i<pList->n
13fd0 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
13fe0 6e 45 73 74 20 3d 20 6e 52 6f 77 30 3b 0a 20 20  nEst = nRow0;.  
13ff0 20 20 72 63 20 3d 20 77 68 65 72 65 45 71 75 61    rc = whereEqua
14000 6c 53 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c  lScanEst(pParse,
14010 20 70 42 75 69 6c 64 65 72 2c 20 70 4c 69 73 74   pBuilder, pList
14020 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 26 6e  ->a[i].pExpr, &n
14030 45 73 74 29 3b 0a 20 20 20 20 6e 52 6f 77 45 73  Est);.    nRowEs
14040 74 20 2b 3d 20 6e 45 73 74 3b 0a 20 20 20 20 70  t += nEst;.    p
14050 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c  Builder->nRecVal
14060 69 64 20 3d 20 6e 52 65 63 56 61 6c 69 64 3b 0a  id = nRecValid;.
14070 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53    }..  if( rc==S
14080 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
14090 69 66 28 20 6e 52 6f 77 45 73 74 20 3e 20 6e 52  if( nRowEst > nR
140a0 6f 77 30 20 29 20 6e 52 6f 77 45 73 74 20 3d 20  ow0 ) nRowEst = 
140b0 6e 52 6f 77 30 3b 0a 20 20 20 20 2a 70 6e 52 6f  nRow0;.    *pnRo
140c0 77 20 3d 20 6e 52 6f 77 45 73 74 3b 0a 20 20 20  w = nRowEst;.   
140d0 20 57 48 45 52 45 54 52 41 43 45 28 30 78 31 30   WHERETRACE(0x10
140e0 2c 28 22 49 4e 20 72 6f 77 20 65 73 74 69 6d 61  ,("IN row estima
140f0 74 65 3a 20 65 73 74 3d 25 67 5c 6e 22 2c 20 6e  te: est=%g\n", n
14100 52 6f 77 45 73 74 29 29 3b 0a 20 20 7d 0a 20 20  RowEst));.  }.  
14110 61 73 73 65 72 74 28 20 70 42 75 69 6c 64 65 72  assert( pBuilder
14120 2d 3e 6e 52 65 63 56 61 6c 69 64 3d 3d 6e 52 65  ->nRecValid==nRe
14130 63 56 61 6c 69 64 20 29 3b 0a 20 20 72 65 74 75  cValid );.  retu
14140 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20  rn rc;.}.#endif 
14150 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
14160 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 20  _STAT3_OR_STAT4 
14170 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 61 62 6c  */../*.** Disabl
14180 65 20 61 20 74 65 72 6d 20 69 6e 20 74 68 65 20  e a term in the 
14190 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 45  WHERE clause.  E
141a0 78 63 65 70 74 2c 20 64 6f 20 6e 6f 74 20 64 69  xcept, do not di
141b0 73 61 62 6c 65 20 74 68 65 20 74 65 72 6d 0a 2a  sable the term.*
141c0 2a 20 69 66 20 69 74 20 63 6f 6e 74 72 6f 6c 73  * if it controls
141d0 20 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f   a LEFT OUTER JO
141e0 49 4e 20 61 6e 64 20 69 74 20 64 69 64 20 6e 6f  IN and it did no
141f0 74 20 6f 72 69 67 69 6e 61 74 65 20 69 6e 20 74  t originate in t
14200 68 65 20 4f 4e 0a 2a 2a 20 6f 72 20 55 53 49 4e  he ON.** or USIN
14210 47 20 63 6c 61 75 73 65 20 6f 66 20 74 68 61 74  G clause of that
14220 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e   join..**.** Con
14230 73 69 64 65 72 20 74 68 65 20 74 65 72 6d 20 74  sider the term t
14240 32 2e 7a 3d 27 6f 6b 27 20 69 6e 20 74 68 65 20  2.z='ok' in the 
14250 66 6f 6c 6c 6f 77 69 6e 67 20 71 75 65 72 69 65  following querie
14260 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 20  s:.**.**   (1)  
14270 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
14280 20 4c 45 46 54 20 4a 4f 49 4e 20 74 32 20 4f 4e   LEFT JOIN t2 ON
14290 20 74 31 2e 61 3d 74 32 2e 78 20 57 48 45 52 45   t1.a=t2.x WHERE
142a0 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 20 20 20   t2.z='ok'.**   
142b0 28 32 29 20 20 53 45 4c 45 43 54 20 2a 20 46 52  (2)  SELECT * FR
142c0 4f 4d 20 74 31 20 4c 45 46 54 20 4a 4f 49 4e 20  OM t1 LEFT JOIN 
142d0 74 32 20 4f 4e 20 74 31 2e 61 3d 74 32 2e 78 20  t2 ON t1.a=t2.x 
142e0 41 4e 44 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a  AND t2.z='ok'.**
142f0 20 20 20 28 33 29 20 20 53 45 4c 45 43 54 20 2a     (3)  SELECT *
14300 20 46 52 4f 4d 20 74 31 2c 20 74 32 20 57 48 45   FROM t1, t2 WHE
14310 52 45 20 74 31 2e 61 3d 74 32 2e 78 20 41 4e 44  RE t1.a=t2.x AND
14320 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 0a 2a 2a   t2.z='ok'.**.**
14330 20 54 68 65 20 74 32 2e 7a 3d 27 6f 6b 27 20 69   The t2.z='ok' i
14340 73 20 64 69 73 61 62 6c 65 64 20 69 6e 20 74 68  s disabled in th
14350 65 20 69 6e 20 28 32 29 20 62 65 63 61 75 73 65  e in (2) because
14360 20 69 74 20 6f 72 69 67 69 6e 61 74 65 73 0a 2a   it originates.*
14370 2a 20 69 6e 20 74 68 65 20 4f 4e 20 63 6c 61 75  * in the ON clau
14380 73 65 2e 20 20 54 68 65 20 74 65 72 6d 20 69 73  se.  The term is
14390 20 64 69 73 61 62 6c 65 64 20 69 6e 20 28 33 29   disabled in (3)
143a0 20 62 65 63 61 75 73 65 20 69 74 20 69 73 20 6e   because it is n
143b0 6f 74 20 70 61 72 74 0a 2a 2a 20 6f 66 20 61 20  ot part.** of a 
143c0 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 2e  LEFT OUTER JOIN.
143d0 20 20 49 6e 20 28 31 29 2c 20 74 68 65 20 74 65    In (1), the te
143e0 72 6d 20 69 73 20 6e 6f 74 20 64 69 73 61 62 6c  rm is not disabl
143f0 65 64 2e 0a 2a 2a 0a 2a 2a 20 44 69 73 61 62 6c  ed..**.** Disabl
14400 69 6e 67 20 61 20 74 65 72 6d 20 63 61 75 73 65  ing a term cause
14410 73 20 74 68 61 74 20 74 65 72 6d 20 74 6f 20 6e  s that term to n
14420 6f 74 20 62 65 20 74 65 73 74 65 64 20 69 6e 20  ot be tested in 
14430 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a 2a  the inner loop.*
14440 2a 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20 20  * of the join.  
14450 44 69 73 61 62 6c 69 6e 67 20 69 73 20 61 6e 20  Disabling is an 
14460 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 57  optimization.  W
14470 68 65 6e 20 74 65 72 6d 73 20 61 72 65 20 73 61  hen terms are sa
14480 74 69 73 66 69 65 64 0a 2a 2a 20 62 79 20 69 6e  tisfied.** by in
14490 64 69 63 65 73 2c 20 77 65 20 64 69 73 61 62 6c  dices, we disabl
144a0 65 20 74 68 65 6d 20 74 6f 20 70 72 65 76 65 6e  e them to preven
144b0 74 20 72 65 64 75 6e 64 61 6e 74 20 74 65 73 74  t redundant test
144c0 73 20 69 6e 20 74 68 65 20 69 6e 6e 65 72 0a 2a  s in the inner.*
144d0 2a 20 6c 6f 6f 70 2e 20 20 57 65 20 77 6f 75 6c  * loop.  We woul
144e0 64 20 67 65 74 20 74 68 65 20 63 6f 72 72 65 63  d get the correc
144f0 74 20 72 65 73 75 6c 74 73 20 69 66 20 6e 6f 74  t results if not
14500 68 69 6e 67 20 77 65 72 65 20 65 76 65 72 20 64  hing were ever d
14510 69 73 61 62 6c 65 64 2c 0a 2a 2a 20 62 75 74 20  isabled,.** but 
14520 6a 6f 69 6e 73 20 6d 69 67 68 74 20 72 75 6e 20  joins might run 
14530 61 20 6c 69 74 74 6c 65 20 73 6c 6f 77 65 72 2e  a little slower.
14540 20 20 54 68 65 20 74 72 69 63 6b 20 69 73 20 74    The trick is t
14550 6f 20 64 69 73 61 62 6c 65 20 61 73 20 6d 75 63  o disable as muc
14560 68 0a 2a 2a 20 61 73 20 77 65 20 63 61 6e 20 77  h.** as we can w
14570 69 74 68 6f 75 74 20 64 69 73 61 62 6c 69 6e 67  ithout disabling
14580 20 74 6f 6f 20 6d 75 63 68 2e 20 20 49 66 20 77   too much.  If w
14590 65 20 64 69 73 61 62 6c 65 64 20 69 6e 20 28 31  e disabled in (1
145a0 29 2c 20 77 65 27 64 20 67 65 74 0a 2a 2a 20 74  ), we'd get.** t
145b0 68 65 20 77 72 6f 6e 67 20 61 6e 73 77 65 72 2e  he wrong answer.
145c0 20 20 53 65 65 20 74 69 63 6b 65 74 20 23 38 31    See ticket #81
145d0 33 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  3..*/.static voi
145e0 64 20 64 69 73 61 62 6c 65 54 65 72 6d 28 57 68  d disableTerm(Wh
145f0 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c  ereLevel *pLevel
14600 2c 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65  , WhereTerm *pTe
14610 72 6d 29 7b 0a 20 20 69 66 28 20 70 54 65 72 6d  rm){.  if( pTerm
14620 0a 20 20 20 20 20 20 26 26 20 28 70 54 65 72 6d  .      && (pTerm
14630 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
14640 5f 43 4f 44 45 44 29 3d 3d 30 0a 20 20 20 20 20  _CODED)==0.     
14650 20 26 26 20 28 70 4c 65 76 65 6c 2d 3e 69 4c 65   && (pLevel->iLe
14660 66 74 4a 6f 69 6e 3d 3d 30 20 7c 7c 20 45 78 70  ftJoin==0 || Exp
14670 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 54 65  rHasProperty(pTe
14680 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f 46 72  rm->pExpr, EP_Fr
14690 6f 6d 4a 6f 69 6e 29 29 0a 20 20 20 20 20 20 26  omJoin)).      &
146a0 26 20 28 70 4c 65 76 65 6c 2d 3e 6e 6f 74 52 65  & (pLevel->notRe
146b0 61 64 79 20 26 20 70 54 65 72 6d 2d 3e 70 72 65  ady & pTerm->pre
146c0 72 65 71 41 6c 6c 29 3d 3d 30 0a 20 20 29 7b 0a  reqAll)==0.  ){.
146d0 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61      pTerm->wtFla
146e0 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44  gs |= TERM_CODED
146f0 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  ;.    if( pTerm-
14700 3e 69 50 61 72 65 6e 74 3e 3d 30 20 29 7b 0a 20  >iParent>=0 ){. 
14710 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a       WhereTerm *
14720 70 4f 74 68 65 72 20 3d 20 26 70 54 65 72 6d 2d  pOther = &pTerm-
14730 3e 70 57 43 2d 3e 61 5b 70 54 65 72 6d 2d 3e 69  >pWC->a[pTerm->i
14740 50 61 72 65 6e 74 5d 3b 0a 20 20 20 20 20 20 69  Parent];.      i
14750 66 28 20 28 2d 2d 70 4f 74 68 65 72 2d 3e 6e 43  f( (--pOther->nC
14760 68 69 6c 64 29 3d 3d 30 20 29 7b 0a 20 20 20 20  hild)==0 ){.    
14770 20 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28      disableTerm(
14780 70 4c 65 76 65 6c 2c 20 70 4f 74 68 65 72 29 3b  pLevel, pOther);
14790 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
147a0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65   }.}../*.** Code
147b0 20 61 6e 20 4f 50 5f 41 66 66 69 6e 69 74 79 20   an OP_Affinity 
147c0 6f 70 63 6f 64 65 20 74 6f 20 61 70 70 6c 79 20  opcode to apply 
147d0 74 68 65 20 63 6f 6c 75 6d 6e 20 61 66 66 69 6e  the column affin
147e0 69 74 79 20 73 74 72 69 6e 67 20 7a 41 66 66 0a  ity string zAff.
147f0 2a 2a 20 74 6f 20 74 68 65 20 6e 20 72 65 67 69  ** to the n regi
14800 73 74 65 72 73 20 73 74 61 72 74 69 6e 67 20 61  sters starting a
14810 74 20 62 61 73 65 2e 20 0a 2a 2a 0a 2a 2a 20 41  t base. .**.** A
14820 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f  s an optimizatio
14830 6e 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f  n, SQLITE_AFF_NO
14840 4e 45 20 65 6e 74 72 69 65 73 20 28 77 68 69 63  NE entries (whic
14850 68 20 61 72 65 20 6e 6f 2d 6f 70 73 29 20 61 74  h are no-ops) at
14860 20 74 68 65 0a 2a 2a 20 62 65 67 69 6e 6e 69 6e   the.** beginnin
14870 67 20 61 6e 64 20 65 6e 64 20 6f 66 20 7a 41 66  g and end of zAf
14880 66 20 61 72 65 20 69 67 6e 6f 72 65 64 2e 20 20  f are ignored.  
14890 49 66 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 69  If all entries i
148a0 6e 20 7a 41 66 66 20 61 72 65 0a 2a 2a 20 53 51  n zAff are.** SQ
148b0 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 2c 20 74  LITE_AFF_NONE, t
148c0 68 65 6e 20 6e 6f 20 63 6f 64 65 20 67 65 74 73  hen no code gets
148d0 20 67 65 6e 65 72 61 74 65 64 2e 0a 2a 2a 0a 2a   generated..**.*
148e0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  * This routine m
148f0 61 6b 65 73 20 69 74 73 20 6f 77 6e 20 63 6f 70  akes its own cop
14900 79 20 6f 66 20 7a 41 66 66 20 73 6f 20 74 68 61  y of zAff so tha
14910 74 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20  t the caller is 
14920 66 72 65 65 0a 2a 2a 20 74 6f 20 6d 6f 64 69 66  free.** to modif
14930 79 20 7a 41 66 66 20 61 66 74 65 72 20 74 68 69  y zAff after thi
14940 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
14950 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
14960 64 20 63 6f 64 65 41 70 70 6c 79 41 66 66 69 6e  d codeApplyAffin
14970 69 74 79 28 50 61 72 73 65 20 2a 70 50 61 72 73  ity(Parse *pPars
14980 65 2c 20 69 6e 74 20 62 61 73 65 2c 20 69 6e 74  e, int base, int
14990 20 6e 2c 20 63 68 61 72 20 2a 7a 41 66 66 29 7b   n, char *zAff){
149a0 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
149b0 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 66  rse->pVdbe;.  if
149c0 28 20 7a 41 66 66 3d 3d 30 20 29 7b 0a 20 20 20  ( zAff==0 ){.   
149d0 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
149e0 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
149f0 64 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  d );.    return;
14a00 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 76  .  }.  assert( v
14a10 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 64 6a  !=0 );..  /* Adj
14a20 75 73 74 20 62 61 73 65 20 61 6e 64 20 6e 20 74  ust base and n t
14a30 6f 20 73 6b 69 70 20 6f 76 65 72 20 53 51 4c 49  o skip over SQLI
14a40 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 65 6e 74 72  TE_AFF_NONE entr
14a50 69 65 73 20 61 74 20 74 68 65 20 62 65 67 69 6e  ies at the begin
14a60 6e 69 6e 67 0a 20 20 2a 2a 20 61 6e 64 20 65 6e  ning.  ** and en
14a70 64 20 6f 66 20 74 68 65 20 61 66 66 69 6e 69 74  d of the affinit
14a80 79 20 73 74 72 69 6e 67 2e 0a 20 20 2a 2f 0a 20  y string..  */. 
14a90 20 77 68 69 6c 65 28 20 6e 3e 30 20 26 26 20 7a   while( n>0 && z
14aa0 41 66 66 5b 30 5d 3d 3d 53 51 4c 49 54 45 5f 41  Aff[0]==SQLITE_A
14ab0 46 46 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 6e  FF_NONE ){.    n
14ac0 2d 2d 3b 0a 20 20 20 20 62 61 73 65 2b 2b 3b 0a  --;.    base++;.
14ad0 20 20 20 20 7a 41 66 66 2b 2b 3b 0a 20 20 7d 0a      zAff++;.  }.
14ae0 20 20 77 68 69 6c 65 28 20 6e 3e 31 20 26 26 20    while( n>1 && 
14af0 7a 41 66 66 5b 6e 2d 31 5d 3d 3d 53 51 4c 49 54  zAff[n-1]==SQLIT
14b00 45 5f 41 46 46 5f 4e 4f 4e 45 20 29 7b 0a 20 20  E_AFF_NONE ){.  
14b10 20 20 6e 2d 2d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a    n--;.  }..  /*
14b20 20 43 6f 64 65 20 74 68 65 20 4f 50 5f 41 66 66   Code the OP_Aff
14b30 69 6e 69 74 79 20 6f 70 63 6f 64 65 20 69 66 20  inity opcode if 
14b40 74 68 65 72 65 20 69 73 20 61 6e 79 74 68 69 6e  there is anythin
14b50 67 20 6c 65 66 74 20 74 6f 20 64 6f 2e 20 2a 2f  g left to do. */
14b60 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20  .  if( n>0 ){.  
14b70 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
14b80 4f 70 32 28 76 2c 20 4f 50 5f 41 66 66 69 6e 69  Op2(v, OP_Affini
14b90 74 79 2c 20 62 61 73 65 2c 20 6e 29 3b 0a 20 20  ty, base, n);.  
14ba0 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
14bb0 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 7a 41 66  ngeP4(v, -1, zAf
14bc0 66 2c 20 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74  f, n);.    sqlit
14bd0 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e  e3ExprCacheAffin
14be0 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65  ityChange(pParse
14bf0 2c 20 62 61 73 65 2c 20 6e 29 3b 0a 20 20 7d 0a  , base, n);.  }.
14c00 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  }.../*.** Genera
14c10 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20 73 69  te code for a si
14c20 6e 67 6c 65 20 65 71 75 61 6c 69 74 79 20 74 65  ngle equality te
14c30 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  rm of the WHERE 
14c40 63 6c 61 75 73 65 2e 20 20 41 6e 20 65 71 75 61  clause.  An equa
14c50 6c 69 74 79 0a 2a 2a 20 74 65 72 6d 20 63 61 6e  lity.** term can
14c60 20 62 65 20 65 69 74 68 65 72 20 58 3d 65 78 70   be either X=exp
14c70 72 20 6f 72 20 58 20 49 4e 20 28 2e 2e 2e 29 2e  r or X IN (...).
14c80 20 20 20 70 54 65 72 6d 20 69 73 20 74 68 65 20     pTerm is the 
14c90 74 65 72 6d 20 74 6f 20 62 65 20 0a 2a 2a 20 63  term to be .** c
14ca0 6f 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  oded..**.** The 
14cb0 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 66 6f  current value fo
14cc0 72 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74  r the constraint
14cd0 20 69 73 20 6c 65 66 74 20 69 6e 20 72 65 67 69   is left in regi
14ce0 73 74 65 72 20 69 52 65 67 2e 0a 2a 2a 0a 2a 2a  ster iReg..**.**
14cf0 20 46 6f 72 20 61 20 63 6f 6e 73 74 72 61 69 6e   For a constrain
14d00 74 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 58 3d  t of the form X=
14d10 65 78 70 72 2c 20 74 68 65 20 65 78 70 72 65 73  expr, the expres
14d20 73 69 6f 6e 20 69 73 20 65 76 61 6c 75 61 74 65  sion is evaluate
14d30 64 20 61 6e 64 20 69 74 73 0a 2a 2a 20 72 65 73  d and its.** res
14d40 75 6c 74 20 69 73 20 6c 65 66 74 20 6f 6e 20 74  ult is left on t
14d50 68 65 20 73 74 61 63 6b 2e 20 20 46 6f 72 20 63  he stack.  For c
14d60 6f 6e 73 74 72 61 69 6e 74 73 20 6f 66 20 74 68  onstraints of th
14d70 65 20 66 6f 72 6d 20 58 20 49 4e 20 28 2e 2e 2e  e form X IN (...
14d80 29 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  ).** this routin
14d90 65 20 73 65 74 73 20 75 70 20 61 20 6c 6f 6f 70  e sets up a loop
14da0 20 74 68 61 74 20 77 69 6c 6c 20 69 74 65 72 61   that will itera
14db0 74 65 20 6f 76 65 72 20 61 6c 6c 20 76 61 6c 75  te over all valu
14dc0 65 73 20 6f 66 20 58 2e 0a 2a 2f 0a 73 74 61 74  es of X..*/.stat
14dd0 69 63 20 69 6e 74 20 63 6f 64 65 45 71 75 61 6c  ic int codeEqual
14de0 69 74 79 54 65 72 6d 28 0a 20 20 50 61 72 73 65  ityTerm(.  Parse
14df0 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f   *pParse,      /
14e00 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f  * The parsing co
14e10 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65  ntext */.  Where
14e20 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 20 20 2f  Term *pTerm,   /
14e30 2a 20 54 68 65 20 74 65 72 6d 20 6f 66 20 74 68  * The term of th
14e40 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
14e50 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20  o be coded */.  
14e60 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76  WhereLevel *pLev
14e70 65 6c 2c 20 2f 2a 20 54 68 65 20 6c 65 76 65 6c  el, /* The level
14e80 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   of the FROM cla
14e90 75 73 65 20 77 65 20 61 72 65 20 77 6f 72 6b 69  use we are worki
14ea0 6e 67 20 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  ng on */.  int i
14eb0 45 71 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  Eq,            /
14ec0 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20 65  * Index of the e
14ed0 71 75 61 6c 69 74 79 20 74 65 72 6d 20 77 69 74  quality term wit
14ee0 68 69 6e 20 74 68 69 73 20 6c 65 76 65 6c 20 2a  hin this level *
14ef0 2f 0a 20 20 69 6e 74 20 62 52 65 76 2c 20 20 20  /.  int bRev,   
14f00 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
14f10 66 6f 72 20 72 65 76 65 72 73 65 2d 6f 72 64 65  for reverse-orde
14f20 72 20 49 4e 20 6f 70 65 72 61 74 69 6f 6e 73 20  r IN operations 
14f30 2a 2f 0a 20 20 69 6e 74 20 69 54 61 72 67 65 74  */.  int iTarget
14f40 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74 74 65           /* Atte
14f50 6d 70 74 20 74 6f 20 6c 65 61 76 65 20 72 65 73  mpt to leave res
14f60 75 6c 74 73 20 69 6e 20 74 68 69 73 20 72 65 67  ults in this reg
14f70 69 73 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 45 78  ister */.){.  Ex
14f80 70 72 20 2a 70 58 20 3d 20 70 54 65 72 6d 2d 3e  pr *pX = pTerm->
14f90 70 45 78 70 72 3b 0a 20 20 56 64 62 65 20 2a 76  pExpr;.  Vdbe *v
14fa0 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
14fb0 3b 0a 20 20 69 6e 74 20 69 52 65 67 3b 20 20 20  ;.  int iReg;   
14fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14fd0 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69  * Register holdi
14fe0 6e 67 20 72 65 73 75 6c 74 73 20 2a 2f 0a 0a 20  ng results */.. 
14ff0 20 61 73 73 65 72 74 28 20 69 54 61 72 67 65 74   assert( iTarget
15000 3e 30 20 29 3b 0a 20 20 69 66 28 20 70 58 2d 3e  >0 );.  if( pX->
15010 6f 70 3d 3d 54 4b 5f 45 51 20 29 7b 0a 20 20 20  op==TK_EQ ){.   
15020 20 69 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45   iReg = sqlite3E
15030 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50  xprCodeTarget(pP
15040 61 72 73 65 2c 20 70 58 2d 3e 70 52 69 67 68 74  arse, pX->pRight
15050 2c 20 69 54 61 72 67 65 74 29 3b 0a 20 20 7d 65  , iTarget);.  }e
15060 6c 73 65 20 69 66 28 20 70 58 2d 3e 6f 70 3d 3d  lse if( pX->op==
15070 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20  TK_ISNULL ){.   
15080 20 69 52 65 67 20 3d 20 69 54 61 72 67 65 74 3b   iReg = iTarget;
15090 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
150a0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp2(v, OP_Nul
150b0 6c 2c 20 30 2c 20 69 52 65 67 29 3b 0a 23 69 66  l, 0, iReg);.#if
150c0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
150d0 5f 53 55 42 51 55 45 52 59 0a 20 20 7d 65 6c 73  _SUBQUERY.  }els
150e0 65 7b 0a 20 20 20 20 69 6e 74 20 65 54 79 70 65  e{.    int eType
150f0 3b 0a 20 20 20 20 69 6e 74 20 69 54 61 62 3b 0a  ;.    int iTab;.
15100 20 20 20 20 73 74 72 75 63 74 20 49 6e 4c 6f 6f      struct InLoo
15110 70 20 2a 70 49 6e 3b 0a 20 20 20 20 57 68 65 72  p *pIn;.    Wher
15120 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 20 3d 20 70  eLoop *pLoop = p
15130 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 0a  Level->pWLoop;..
15140 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e      if( (pLoop->
15150 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
15160 56 49 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30  VIRTUALTABLE)==0
15170 0a 20 20 20 20 20 20 26 26 20 70 4c 6f 6f 70 2d  .      && pLoop-
15180 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 21  >u.btree.pIndex!
15190 3d 30 0a 20 20 20 20 20 20 26 26 20 70 4c 6f 6f  =0.      && pLoo
151a0 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
151b0 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 45  x->aSortOrder[iE
151c0 71 5d 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  q].    ){.      
151d0 74 65 73 74 63 61 73 65 28 20 69 45 71 3d 3d 30  testcase( iEq==0
151e0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
151f0 73 65 28 20 62 52 65 76 20 29 3b 0a 20 20 20 20  se( bRev );.    
15200 20 20 62 52 65 76 20 3d 20 21 62 52 65 76 3b 0a    bRev = !bRev;.
15210 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
15220 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20  ( pX->op==TK_IN 
15230 29 3b 0a 20 20 20 20 69 52 65 67 20 3d 20 69 54  );.    iReg = iT
15240 61 72 67 65 74 3b 0a 20 20 20 20 65 54 79 70 65  arget;.    eType
15250 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e   = sqlite3FindIn
15260 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 58  Index(pParse, pX
15270 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 65 54  , 0);.    if( eT
15280 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 49 4e  ype==IN_INDEX_IN
15290 44 45 58 5f 44 45 53 43 20 29 7b 0a 20 20 20 20  DEX_DESC ){.    
152a0 20 20 74 65 73 74 63 61 73 65 28 20 62 52 65 76    testcase( bRev
152b0 20 29 3b 0a 20 20 20 20 20 20 62 52 65 76 20 3d   );.      bRev =
152c0 20 21 62 52 65 76 3b 0a 20 20 20 20 7d 0a 20 20   !bRev;.    }.  
152d0 20 20 69 54 61 62 20 3d 20 70 58 2d 3e 69 54 61    iTab = pX->iTa
152e0 62 6c 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ble;.    sqlite3
152f0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 62 52  VdbeAddOp2(v, bR
15300 65 76 20 3f 20 4f 50 5f 4c 61 73 74 20 3a 20 4f  ev ? OP_Last : O
15310 50 5f 52 65 77 69 6e 64 2c 20 69 54 61 62 2c 20  P_Rewind, iTab, 
15320 30 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65  0);.    VdbeCove
15330 72 61 67 65 49 66 28 76 2c 20 62 52 65 76 29 3b  rageIf(v, bRev);
15340 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67  .    VdbeCoverag
15350 65 49 66 28 76 2c 20 21 62 52 65 76 29 3b 0a 20  eIf(v, !bRev);. 
15360 20 20 20 61 73 73 65 72 74 28 20 28 70 4c 6f 6f     assert( (pLoo
15370 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
15380 52 45 5f 4d 55 4c 54 49 5f 4f 52 29 3d 3d 30 20  RE_MULTI_OR)==0 
15390 29 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 77 73  );.    pLoop->ws
153a0 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 49  Flags |= WHERE_I
153b0 4e 5f 41 42 4c 45 3b 0a 20 20 20 20 69 66 28 20  N_ABLE;.    if( 
153c0 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e  pLevel->u.in.nIn
153d0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 4c 65  ==0 ){.      pLe
153e0 76 65 6c 2d 3e 61 64 64 72 4e 78 74 20 3d 20 73  vel->addrNxt = s
153f0 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
15400 62 65 6c 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20  bel(v);.    }.  
15410 20 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e    pLevel->u.in.n
15420 49 6e 2b 2b 3b 0a 20 20 20 20 70 4c 65 76 65 6c  In++;.    pLevel
15430 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 20 3d  ->u.in.aInLoop =
15440 0a 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  .       sqlite3D
15450 62 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 70  bReallocOrFree(p
15460 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c 65 76 65  Parse->db, pLeve
15470 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 2c  l->u.in.aInLoop,
15480 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
15490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
154a0 69 7a 65 6f 66 28 70 4c 65 76 65 6c 2d 3e 75 2e  izeof(pLevel->u.
154b0 69 6e 2e 61 49 6e 4c 6f 6f 70 5b 30 5d 29 2a 70  in.aInLoop[0])*p
154c0 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 29  Level->u.in.nIn)
154d0 3b 0a 20 20 20 20 70 49 6e 20 3d 20 70 4c 65 76  ;.    pIn = pLev
154e0 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70  el->u.in.aInLoop
154f0 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 20 29 7b  ;.    if( pIn ){
15500 0a 20 20 20 20 20 20 70 49 6e 20 2b 3d 20 70 4c  .      pIn += pL
15510 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 20 2d  evel->u.in.nIn -
15520 20 31 3b 0a 20 20 20 20 20 20 70 49 6e 2d 3e 69   1;.      pIn->i
15530 43 75 72 20 3d 20 69 54 61 62 3b 0a 20 20 20 20  Cur = iTab;.    
15540 20 20 69 66 28 20 65 54 79 70 65 3d 3d 49 4e 5f    if( eType==IN_
15550 49 4e 44 45 58 5f 52 4f 57 49 44 20 29 7b 0a 20  INDEX_ROWID ){. 
15560 20 20 20 20 20 20 20 70 49 6e 2d 3e 61 64 64 72         pIn->addr
15570 49 6e 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56  InTop = sqlite3V
15580 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
15590 52 6f 77 69 64 2c 20 69 54 61 62 2c 20 69 52 65  Rowid, iTab, iRe
155a0 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  g);.      }else{
155b0 0a 20 20 20 20 20 20 20 20 70 49 6e 2d 3e 61 64  .        pIn->ad
155c0 64 72 49 6e 54 6f 70 20 3d 20 73 71 6c 69 74 65  drInTop = sqlite
155d0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
155e0 50 5f 43 6f 6c 75 6d 6e 2c 20 69 54 61 62 2c 20  P_Column, iTab, 
155f0 30 2c 20 69 52 65 67 29 3b 0a 20 20 20 20 20 20  0, iReg);.      
15600 7d 0a 20 20 20 20 20 20 70 49 6e 2d 3e 65 45 6e  }.      pIn->eEn
15610 64 4c 6f 6f 70 4f 70 20 3d 20 62 52 65 76 20 3f  dLoopOp = bRev ?
15620 20 4f 50 5f 50 72 65 76 49 66 4f 70 65 6e 20 3a   OP_PrevIfOpen :
15630 20 4f 50 5f 4e 65 78 74 49 66 4f 70 65 6e 3b 0a   OP_NextIfOpen;.
15640 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
15650 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 73  eAddOp1(v, OP_Is
15660 4e 75 6c 6c 2c 20 69 52 65 67 29 3b 20 56 64 62  Null, iReg); Vdb
15670 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
15680 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
15690 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 20  Level->u.in.nIn 
156a0 3d 20 30 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  = 0;.    }.#endi
156b0 66 0a 20 20 7d 0a 20 20 64 69 73 61 62 6c 65 54  f.  }.  disableT
156c0 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 54 65 72  erm(pLevel, pTer
156d0 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 52 65  m);.  return iRe
156e0 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  g;.}../*.** Gene
156f0 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77  rate code that w
15700 69 6c 6c 20 65 76 61 6c 75 61 74 65 20 61 6c 6c  ill evaluate all
15710 20 3d 3d 20 61 6e 64 20 49 4e 20 63 6f 6e 73 74   == and IN const
15720 72 61 69 6e 74 73 20 66 6f 72 20 61 6e 0a 2a 2a  raints for an.**
15730 20 69 6e 64 65 78 20 73 63 61 6e 2e 0a 2a 2a 0a   index scan..**.
15740 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  ** For example, 
15750 63 6f 6e 73 69 64 65 72 20 74 61 62 6c 65 20 74  consider table t
15760 31 28 61 2c 62 2c 63 2c 64 2c 65 2c 66 29 20 77  1(a,b,c,d,e,f) w
15770 69 74 68 20 69 6e 64 65 78 20 69 31 28 61 2c 62  ith index i1(a,b
15780 2c 63 29 2e 0a 2a 2a 20 53 75 70 70 6f 73 65 20  ,c)..** Suppose 
15790 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
157a0 20 69 73 20 74 68 69 73 3a 20 20 61 3d 3d 35 20   is this:  a==5 
157b0 41 4e 44 20 62 20 49 4e 20 28 31 2c 32 2c 33 29  AND b IN (1,2,3)
157c0 20 41 4e 44 20 63 3e 35 20 41 4e 44 20 63 3c 31   AND c>5 AND c<1
157d0 30 0a 2a 2a 20 54 68 65 20 69 6e 64 65 78 20 68  0.** The index h
157e0 61 73 20 61 73 20 6d 61 6e 79 20 61 73 20 74 68  as as many as th
157f0 72 65 65 20 65 71 75 61 6c 69 74 79 20 63 6f 6e  ree equality con
15800 73 74 72 61 69 6e 74 73 2c 20 62 75 74 20 69 6e  straints, but in
15810 20 74 68 69 73 0a 2a 2a 20 65 78 61 6d 70 6c 65   this.** example
15820 2c 20 74 68 65 20 74 68 69 72 64 20 22 63 22 20  , the third "c" 
15830 76 61 6c 75 65 20 69 73 20 61 6e 20 69 6e 65 71  value is an ineq
15840 75 61 6c 69 74 79 2e 20 20 53 6f 20 6f 6e 6c 79  uality.  So only
15850 20 74 77 6f 20 0a 2a 2a 20 63 6f 6e 73 74 72 61   two .** constra
15860 69 6e 74 73 20 61 72 65 20 63 6f 64 65 64 2e 20  ints are coded. 
15870 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   This routine wi
15880 6c 6c 20 67 65 6e 65 72 61 74 65 20 63 6f 64 65  ll generate code
15890 20 74 6f 20 65 76 61 6c 75 61 74 65 0a 2a 2a 20   to evaluate.** 
158a0 61 3d 3d 35 20 61 6e 64 20 62 20 49 4e 20 28 31  a==5 and b IN (1
158b0 2c 32 2c 33 29 2e 20 20 54 68 65 20 63 75 72 72  ,2,3).  The curr
158c0 65 6e 74 20 76 61 6c 75 65 73 20 66 6f 72 20 61  ent values for a
158d0 20 61 6e 64 20 62 20 77 69 6c 6c 20 62 65 20 73   and b will be s
158e0 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 63 6f 6e 73  tored.** in cons
158f0 65 63 75 74 69 76 65 20 72 65 67 69 73 74 65 72  ecutive register
15900 73 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20  s and the index 
15910 6f 66 20 74 68 65 20 66 69 72 73 74 20 72 65 67  of the first reg
15920 69 73 74 65 72 20 69 73 20 72 65 74 75 72 6e 65  ister is returne
15930 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20  d..**.** In the 
15940 65 78 61 6d 70 6c 65 20 61 62 6f 76 65 20 6e 45  example above nE
15950 71 3d 3d 32 2e 20 20 42 75 74 20 74 68 69 73 20  q==2.  But this 
15960 73 75 62 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73  subroutine works
15970 20 66 6f 72 20 61 6e 79 20 76 61 6c 75 65 0a 2a   for any value.*
15980 2a 20 6f 66 20 6e 45 71 20 69 6e 63 6c 75 64 69  * of nEq includi
15990 6e 67 20 30 2e 20 20 49 66 20 6e 45 71 3d 3d 30  ng 0.  If nEq==0
159a0 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
159b0 73 20 6e 65 61 72 6c 79 20 61 20 6e 6f 2d 6f 70  s nearly a no-op
159c0 2e 0a 2a 2a 20 54 68 65 20 6f 6e 6c 79 20 74 68  ..** The only th
159d0 69 6e 67 20 69 74 20 64 6f 65 73 20 69 73 20 61  ing it does is a
159e0 6c 6c 6f 63 61 74 65 20 74 68 65 20 70 4c 65 76  llocate the pLev
159f0 65 6c 2d 3e 69 4d 65 6d 20 6d 65 6d 6f 72 79 20  el->iMem memory 
15a00 63 65 6c 6c 20 61 6e 64 0a 2a 2a 20 63 6f 6d 70  cell and.** comp
15a10 75 74 65 20 74 68 65 20 61 66 66 69 6e 69 74 79  ute the affinity
15a20 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54   string..**.** T
15a30 68 65 20 6e 45 78 74 72 61 52 65 67 20 70 61 72  he nExtraReg par
15a40 61 6d 65 74 65 72 20 69 73 20 30 20 6f 72 20 31  ameter is 0 or 1
15a50 2e 20 20 49 74 20 69 73 20 30 20 69 66 20 61 6c  .  It is 0 if al
15a60 6c 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 63  l WHERE clause c
15a70 6f 6e 73 74 72 61 69 6e 74 73 0a 2a 2a 20 61 72  onstraints.** ar
15a80 65 20 3d 3d 20 6f 72 20 49 4e 20 61 6e 64 20 61  e == or IN and a
15a90 72 65 20 63 6f 76 65 72 65 64 20 62 79 20 74 68  re covered by th
15aa0 65 20 6e 45 71 2e 20 20 6e 45 78 74 72 61 52 65  e nEq.  nExtraRe
15ab0 67 20 69 73 20 31 20 69 66 20 74 68 65 72 65 20  g is 1 if there 
15ac0 69 73 0a 2a 2a 20 61 6e 20 69 6e 65 71 75 61 6c  is.** an inequal
15ad0 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 28  ity constraint (
15ae0 73 75 63 68 20 61 73 20 74 68 65 20 22 63 3e 3d  such as the "c>=
15af0 35 20 41 4e 44 20 63 3c 31 30 22 20 69 6e 20 74  5 AND c<10" in t
15b00 68 65 20 65 78 61 6d 70 6c 65 29 20 74 68 61 74  he example) that
15b10 0a 2a 2a 20 6f 63 63 75 72 73 20 61 66 74 65 72  .** occurs after
15b20 20 74 68 65 20 6e 45 71 20 71 75 61 6c 69 74 79   the nEq quality
15b30 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 0a 2a 2a   constraints..**
15b40 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
15b50 20 61 6c 6c 6f 63 61 74 65 73 20 61 20 72 61 6e   allocates a ran
15b60 67 65 20 6f 66 20 6e 45 71 2b 6e 45 78 74 72 61  ge of nEq+nExtra
15b70 52 65 67 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73  Reg memory cells
15b80 20 61 6e 64 20 72 65 74 75 72 6e 73 0a 2a 2a 20   and returns.** 
15b90 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  the index of the
15ba0 20 66 69 72 73 74 20 6d 65 6d 6f 72 79 20 63 65   first memory ce
15bb0 6c 6c 20 69 6e 20 74 68 61 74 20 72 61 6e 67 65  ll in that range
15bc0 2e 20 54 68 65 20 63 6f 64 65 20 74 68 61 74 0a  . The code that.
15bd0 2a 2a 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f  ** calls this ro
15be0 75 74 69 6e 65 20 77 69 6c 6c 20 75 73 65 20 74  utine will use t
15bf0 68 61 74 20 6d 65 6d 6f 72 79 20 72 61 6e 67 65  hat memory range
15c00 20 74 6f 20 73 74 6f 72 65 20 6b 65 79 73 20 66   to store keys f
15c10 6f 72 0a 2a 2a 20 73 74 61 72 74 20 61 6e 64 20  or.** start and 
15c20 74 65 72 6d 69 6e 61 74 69 6f 6e 20 63 6f 6e 64  termination cond
15c30 69 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 6c 6f  itions of the lo
15c40 6f 70 2e 0a 2a 2a 20 6b 65 79 20 76 61 6c 75 65  op..** key value
15c50 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20 20 49   of the loop.  I
15c60 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 49 4e  f one or more IN
15c70 20 6f 70 65 72 61 74 6f 72 73 20 61 70 70 65 61   operators appea
15c80 72 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20  r, then.** this 
15c90 72 6f 75 74 69 6e 65 20 61 6c 6c 6f 63 61 74 65  routine allocate
15ca0 73 20 61 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20  s an additional 
15cb0 6e 45 71 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73  nEq memory cells
15cc0 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c 0a 2a 2a   for internal.**
15cd0 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f   use..**.** Befo
15ce0 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 2a 70  re returning, *p
15cf0 7a 41 66 66 20 69 73 20 73 65 74 20 74 6f 20 70  zAff is set to p
15d00 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72  oint to a buffer
15d10 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 0a 2a 2a   containing a.**
15d20 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63 6f 6c   copy of the col
15d30 75 6d 6e 20 61 66 66 69 6e 69 74 79 20 73 74 72  umn affinity str
15d40 69 6e 67 20 6f 66 20 74 68 65 20 69 6e 64 65 78  ing of the index
15d50 20 61 6c 6c 6f 63 61 74 65 64 20 75 73 69 6e 67   allocated using
15d60 0a 2a 2a 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  .** sqlite3DbMal
15d70 6c 6f 63 28 29 2e 20 45 78 63 65 70 74 2c 20 65  loc(). Except, e
15d80 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 63 6f  ntries in the co
15d90 70 79 20 6f 66 20 74 68 65 20 73 74 72 69 6e 67  py of the string
15da0 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77   associated.** w
15db0 69 74 68 20 65 71 75 61 6c 69 74 79 20 63 6f 6e  ith equality con
15dc0 73 74 72 61 69 6e 74 73 20 74 68 61 74 20 75 73  straints that us
15dd0 65 20 4e 4f 4e 45 20 61 66 66 69 6e 69 74 79 20  e NONE affinity 
15de0 61 72 65 20 73 65 74 20 74 6f 0a 2a 2a 20 53 51  are set to.** SQ
15df0 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 2e 20 54  LITE_AFF_NONE. T
15e00 68 69 73 20 69 73 20 74 6f 20 64 65 61 6c 20 77  his is to deal w
15e10 69 74 68 20 53 51 4c 20 73 75 63 68 20 61 73 20  ith SQL such as 
15e20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a  the following:.*
15e30 2a 0a 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41  *.**   CREATE TA
15e40 42 4c 45 20 74 31 28 61 20 54 45 58 54 20 50 52  BLE t1(a TEXT PR
15e50 49 4d 41 52 59 20 4b 45 59 2c 20 62 29 3b 0a 2a  IMARY KEY, b);.*
15e60 2a 20 20 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46  *   SELECT ... F
15e70 52 4f 4d 20 74 31 20 41 53 20 74 32 2c 20 74 31  ROM t1 AS t2, t1
15e80 20 57 48 45 52 45 20 74 31 2e 61 20 3d 20 74 32   WHERE t1.a = t2
15e90 2e 62 3b 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65  .b;.**.** In the
15ea0 20 65 78 61 6d 70 6c 65 20 61 62 6f 76 65 2c 20   example above, 
15eb0 74 68 65 20 69 6e 64 65 78 20 6f 6e 20 74 31 28  the index on t1(
15ec0 61 29 20 68 61 73 20 54 45 58 54 20 61 66 66 69  a) has TEXT affi
15ed0 6e 69 74 79 2e 20 42 75 74 20 73 69 6e 63 65 0a  nity. But since.
15ee0 2a 2a 20 74 68 65 20 72 69 67 68 74 20 68 61 6e  ** the right han
15ef0 64 20 73 69 64 65 20 6f 66 20 74 68 65 20 65 71  d side of the eq
15f00 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
15f10 74 20 28 74 32 2e 62 29 20 68 61 73 20 4e 4f 4e  t (t2.b) has NON
15f20 45 20 61 66 66 69 6e 69 74 79 2c 0a 2a 2a 20 6e  E affinity,.** n
15f30 6f 20 63 6f 6e 76 65 72 73 69 6f 6e 20 73 68 6f  o conversion sho
15f40 75 6c 64 20 62 65 20 61 74 74 65 6d 70 74 65 64  uld be attempted
15f50 20 62 65 66 6f 72 65 20 75 73 69 6e 67 20 61 20   before using a 
15f60 74 32 2e 62 20 76 61 6c 75 65 20 61 73 20 70 61  t2.b value as pa
15f70 72 74 20 6f 66 0a 2a 2a 20 61 20 6b 65 79 20 74  rt of.** a key t
15f80 6f 20 73 65 61 72 63 68 20 74 68 65 20 69 6e 64  o search the ind
15f90 65 78 2e 20 48 65 6e 63 65 20 74 68 65 20 66 69  ex. Hence the fi
15fa0 72 73 74 20 62 79 74 65 20 69 6e 20 74 68 65 20  rst byte in the 
15fb0 72 65 74 75 72 6e 65 64 20 61 66 66 69 6e 69 74  returned affinit
15fc0 79 0a 2a 2a 20 73 74 72 69 6e 67 20 69 6e 20 74  y.** string in t
15fd0 68 69 73 20 65 78 61 6d 70 6c 65 20 77 6f 75 6c  his example woul
15fe0 64 20 62 65 20 73 65 74 20 74 6f 20 53 51 4c 49  d be set to SQLI
15ff0 54 45 5f 41 46 46 5f 4e 4f 4e 45 2e 0a 2a 2f 0a  TE_AFF_NONE..*/.
16000 73 74 61 74 69 63 20 69 6e 74 20 63 6f 64 65 41  static int codeA
16010 6c 6c 45 71 75 61 6c 69 74 79 54 65 72 6d 73 28  llEqualityTerms(
16020 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
16030 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  ,        /* Pars
16040 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
16050 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65   WhereLevel *pLe
16060 76 65 6c 2c 20 20 20 2f 2a 20 57 68 69 63 68 20  vel,   /* Which 
16070 6e 65 73 74 65 64 20 6c 6f 6f 70 20 6f 66 20 74  nested loop of t
16080 68 65 20 46 52 4f 4d 20 77 65 20 61 72 65 20 63  he FROM we are c
16090 6f 64 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 62  oding */.  int b
160a0 52 65 76 2c 20 20 20 20 20 20 20 20 20 20 20 20  Rev,            
160b0 20 2f 2a 20 52 65 76 65 72 73 65 20 74 68 65 20   /* Reverse the 
160c0 6f 72 64 65 72 20 6f 66 20 49 4e 20 6f 70 65 72  order of IN oper
160d0 61 74 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  ators */.  int n
160e0 45 78 74 72 61 52 65 67 2c 20 20 20 20 20 20 20  ExtraReg,       
160f0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 78   /* Number of ex
16100 74 72 61 20 72 65 67 69 73 74 65 72 73 20 74 6f  tra registers to
16110 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 63   allocate */.  c
16120 68 61 72 20 2a 2a 70 7a 41 66 66 20 20 20 20 20  har **pzAff     
16130 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 65 74       /* OUT: Set
16140 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 66 66   to point to aff
16150 69 6e 69 74 79 20 73 74 72 69 6e 67 20 2a 2f 0a  inity string */.
16160 29 7b 0a 20 20 75 31 36 20 6e 45 71 3b 20 20 20  ){.  u16 nEq;   
16170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16180 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72     /* The number
16190 20 6f 66 20 3d 3d 20 6f 72 20 49 4e 20 63 6f 6e   of == or IN con
161a0 73 74 72 61 69 6e 74 73 20 74 6f 20 63 6f 64 65  straints to code
161b0 20 2a 2f 0a 20 20 75 31 36 20 6e 53 6b 69 70 3b   */.  u16 nSkip;
161c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
161d0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
161e0 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d   left-most colum
161f0 6e 73 20 74 6f 20 73 6b 69 70 20 2a 2f 0a 20 20  ns to skip */.  
16200 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
16210 2d 3e 70 56 64 62 65 3b 20 20 20 20 20 20 2f 2a  ->pVdbe;      /*
16220 20 54 68 65 20 76 6d 20 75 6e 64 65 72 20 63 6f   The vm under co
16230 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20  nstruction */.  
16240 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20  Index *pIdx;    
16250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16260 20 54 68 65 20 69 6e 64 65 78 20 62 65 69 6e 67   The index being
16270 20 75 73 65 64 20 66 6f 72 20 74 68 69 73 20 6c   used for this l
16280 6f 6f 70 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  oop */.  WhereTe
16290 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20  rm *pTerm;      
162a0 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67         /* A sing
162b0 6c 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 65  le constraint te
162c0 72 6d 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f  rm */.  WhereLoo
162d0 70 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20  p *pLoop;       
162e0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 68 65        /* The Whe
162f0 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 2a 2f  reLoop object */
16300 0a 20 20 69 6e 74 20 6a 3b 20 20 20 20 20 20 20  .  int j;       
16310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16320 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
16330 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 42 61 73   */.  int regBas
16340 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
16350 20 20 20 20 2f 2a 20 42 61 73 65 20 72 65 67 69      /* Base regi
16360 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 52  ster */.  int nR
16370 65 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  eg;             
16380 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
16390 72 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 74  r of registers t
163a0 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20  o allocate */.  
163b0 63 68 61 72 20 2a 7a 41 66 66 3b 20 20 20 20 20  char *zAff;     
163c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
163d0 20 41 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67   Affinity string
163e0 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 0a 20   to return */.. 
163f0 20 2f 2a 20 54 68 69 73 20 6d 6f 64 75 6c 65 20   /* This module 
16400 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 6f  is only called o
16410 6e 20 71 75 65 72 79 20 70 6c 61 6e 73 20 74 68  n query plans th
16420 61 74 20 75 73 65 20 61 6e 20 69 6e 64 65 78 2e  at use an index.
16430 20 2a 2f 0a 20 20 70 4c 6f 6f 70 20 3d 20 70 4c   */.  pLoop = pL
16440 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20  evel->pWLoop;.  
16450 61 73 73 65 72 74 28 20 28 70 4c 6f 6f 70 2d 3e  assert( (pLoop->
16460 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
16470 56 49 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30  VIRTUALTABLE)==0
16480 20 29 3b 0a 20 20 6e 45 71 20 3d 20 70 4c 6f 6f   );.  nEq = pLoo
16490 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a  p->u.btree.nEq;.
164a0 20 20 6e 53 6b 69 70 20 3d 20 70 4c 6f 6f 70 2d    nSkip = pLoop-
164b0 3e 75 2e 62 74 72 65 65 2e 6e 53 6b 69 70 3b 0a  >u.btree.nSkip;.
164c0 20 20 70 49 64 78 20 3d 20 70 4c 6f 6f 70 2d 3e    pIdx = pLoop->
164d0 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a  u.btree.pIndex;.
164e0 20 20 61 73 73 65 72 74 28 20 70 49 64 78 21 3d    assert( pIdx!=
164f0 30 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72  0 );..  /* Figur
16500 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 6d  e out how many m
16510 65 6d 6f 72 79 20 63 65 6c 6c 73 20 77 65 20 77  emory cells we w
16520 69 6c 6c 20 6e 65 65 64 20 74 68 65 6e 20 61 6c  ill need then al
16530 6c 6f 63 61 74 65 20 74 68 65 6d 2e 0a 20 20 2a  locate them..  *
16540 2f 0a 20 20 72 65 67 42 61 73 65 20 3d 20 70 50  /.  regBase = pP
16550 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a  arse->nMem + 1;.
16560 20 20 6e 52 65 67 20 3d 20 70 4c 6f 6f 70 2d 3e    nReg = pLoop->
16570 75 2e 62 74 72 65 65 2e 6e 45 71 20 2b 20 6e 45  u.btree.nEq + nE
16580 78 74 72 61 52 65 67 3b 0a 20 20 70 50 61 72 73  xtraReg;.  pPars
16590 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 67 3b  e->nMem += nReg;
165a0 0a 0a 20 20 7a 41 66 66 20 3d 20 73 71 6c 69 74  ..  zAff = sqlit
165b0 65 33 44 62 53 74 72 44 75 70 28 70 50 61 72 73  e3DbStrDup(pPars
165c0 65 2d 3e 64 62 2c 20 73 71 6c 69 74 65 33 49 6e  e->db, sqlite3In
165d0 64 65 78 41 66 66 69 6e 69 74 79 53 74 72 28 76  dexAffinityStr(v
165e0 2c 20 70 49 64 78 29 29 3b 0a 20 20 69 66 28 20  , pIdx));.  if( 
165f0 21 7a 41 66 66 20 29 7b 0a 20 20 20 20 70 50 61  !zAff ){.    pPa
16600 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
16610 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 0a  ailed = 1;.  }..
16620 20 20 69 66 28 20 6e 53 6b 69 70 20 29 7b 0a 20    if( nSkip ){. 
16630 20 20 20 69 6e 74 20 69 49 64 78 43 75 72 20 3d     int iIdxCur =
16640 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72   pLevel->iIdxCur
16650 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
16660 65 41 64 64 4f 70 31 28 76 2c 20 28 62 52 65 76  eAddOp1(v, (bRev
16670 3f 4f 50 5f 4c 61 73 74 3a 4f 50 5f 52 65 77 69  ?OP_Last:OP_Rewi
16680 6e 64 29 2c 20 69 49 64 78 43 75 72 29 3b 0a 20  nd), iIdxCur);. 
16690 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
166a0 66 28 76 2c 20 62 52 65 76 3d 3d 30 29 3b 0a 20  f(v, bRev==0);. 
166b0 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
166c0 66 28 76 2c 20 62 52 65 76 21 3d 30 29 3b 0a 20  f(v, bRev!=0);. 
166d0 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
166e0 76 2c 20 22 62 65 67 69 6e 20 73 6b 69 70 2d 73  v, "begin skip-s
166f0 63 61 6e 20 6f 6e 20 25 73 22 2c 20 70 49 64 78  can on %s", pIdx
16700 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 6a  ->zName));.    j
16710 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
16720 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74 6f 29  dOp0(v, OP_Goto)
16730 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 61 64  ;.    pLevel->ad
16740 64 72 53 6b 69 70 20 3d 20 73 71 6c 69 74 65 33  drSkip = sqlite3
16750 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c  VdbeAddOp4Int(v,
16760 20 28 62 52 65 76 3f 4f 50 5f 53 65 65 6b 4c 54   (bRev?OP_SeekLT
16770 3a 4f 50 5f 53 65 65 6b 47 54 29 2c 0a 20 20 20  :OP_SeekGT),.   
16780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16790 20 20 20 20 20 20 20 20 20 69 49 64 78 43 75 72           iIdxCur
167a0 2c 20 30 2c 20 72 65 67 42 61 73 65 2c 20 6e 53  , 0, regBase, nS
167b0 6b 69 70 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  kip);.    VdbeCo
167c0 76 65 72 61 67 65 49 66 28 76 2c 20 62 52 65 76  verageIf(v, bRev
167d0 3d 3d 30 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  ==0);.    VdbeCo
167e0 76 65 72 61 67 65 49 66 28 76 2c 20 62 52 65 76  verageIf(v, bRev
167f0 21 3d 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  !=0);.    sqlite
16800 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
16810 20 6a 29 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30   j);.    for(j=0
16820 3b 20 6a 3c 6e 53 6b 69 70 3b 20 6a 2b 2b 29 7b  ; j<nSkip; j++){
16830 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
16840 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
16850 6f 6c 75 6d 6e 2c 20 69 49 64 78 43 75 72 2c 20  olumn, iIdxCur, 
16860 6a 2c 20 72 65 67 42 61 73 65 2b 6a 29 3b 0a 20  j, regBase+j);. 
16870 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64       assert( pId
16880 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3e 3d  x->aiColumn[j]>=
16890 30 20 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  0 );.      VdbeC
168a0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c  omment((v, "%s",
168b0 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 61   pIdx->pTable->a
168c0 43 6f 6c 5b 70 49 64 78 2d 3e 61 69 43 6f 6c 75  Col[pIdx->aiColu
168d0 6d 6e 5b 6a 5d 5d 2e 7a 4e 61 6d 65 29 29 3b 0a  mn[j]].zName));.
168e0 20 20 20 20 7d 0a 20 20 7d 20 20 20 20 0a 0a 20      }.  }    .. 
168f0 20 2f 2a 20 45 76 61 6c 75 61 74 65 20 74 68 65   /* Evaluate the
16900 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72   equality constr
16910 61 69 6e 74 73 0a 20 20 2a 2f 0a 20 20 61 73 73  aints.  */.  ass
16920 65 72 74 28 20 7a 41 66 66 3d 3d 30 20 7c 7c 20  ert( zAff==0 || 
16930 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 41 66 66  (int)strlen(zAff
16940 29 3e 3d 6e 45 71 20 29 3b 0a 20 20 66 6f 72 28  )>=nEq );.  for(
16950 6a 3d 6e 53 6b 69 70 3b 20 6a 3c 6e 45 71 3b 20  j=nSkip; j<nEq; 
16960 6a 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 72 31  j++){.    int r1
16970 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 70 4c  ;.    pTerm = pL
16980 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 3b 0a  oop->aLTerm[j];.
16990 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72      assert( pTer
169a0 6d 21 3d 30 20 29 3b 0a 20 20 20 20 2f 2a 20 54  m!=0 );.    /* T
169b0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73  he following tes
169c0 74 63 61 73 65 20 69 73 20 74 72 75 65 20 66 6f  tcase is true fo
169d0 72 20 69 6e 64 69 63 65 73 20 77 69 74 68 20 72  r indices with r
169e0 65 64 75 6e 64 61 6e 74 20 63 6f 6c 75 6d 6e 73  edundant columns
169f0 2e 20 0a 20 20 20 20 2a 2a 20 45 78 3a 20 43 52  . .    ** Ex: CR
16a00 45 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e  EATE INDEX i1 ON
16a10 20 74 31 28 61 2c 62 2c 61 29 3b 20 53 45 4c 45   t1(a,b,a); SELE
16a20 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45  CT * FROM t1 WHE
16a30 52 45 20 61 3d 30 20 41 4e 44 20 62 3d 30 3b 20  RE a=0 AND b=0; 
16a40 2a 2f 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  */.    testcase(
16a50 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73   (pTerm->wtFlags
16a60 20 26 20 54 45 52 4d 5f 43 4f 44 45 44 29 21 3d   & TERM_CODED)!=
16a70 30 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  0 );.    testcas
16a80 65 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  e( pTerm->wtFlag
16a90 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  s & TERM_VIRTUAL
16aa0 20 29 3b 0a 20 20 20 20 72 31 20 3d 20 63 6f 64   );.    r1 = cod
16ab0 65 45 71 75 61 6c 69 74 79 54 65 72 6d 28 70 50  eEqualityTerm(pP
16ac0 61 72 73 65 2c 20 70 54 65 72 6d 2c 20 70 4c 65  arse, pTerm, pLe
16ad0 76 65 6c 2c 20 6a 2c 20 62 52 65 76 2c 20 72 65  vel, j, bRev, re
16ae0 67 42 61 73 65 2b 6a 29 3b 0a 20 20 20 20 69 66  gBase+j);.    if
16af0 28 20 72 31 21 3d 72 65 67 42 61 73 65 2b 6a 20  ( r1!=regBase+j 
16b00 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 52 65  ){.      if( nRe
16b10 67 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  g==1 ){.        
16b20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
16b30 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
16b40 67 42 61 73 65 29 3b 0a 20 20 20 20 20 20 20 20  gBase);.        
16b50 72 65 67 42 61 73 65 20 3d 20 72 31 3b 0a 20 20  regBase = r1;.  
16b60 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
16b70 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
16b80 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79  dOp2(v, OP_SCopy
16b90 2c 20 72 31 2c 20 72 65 67 42 61 73 65 2b 6a 29  , r1, regBase+j)
16ba0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
16bb0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
16bc0 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
16bd0 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20   WO_ISNULL );.  
16be0 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
16bf0 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
16c00 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 69 66 28 20  O_IN );.    if( 
16c10 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  (pTerm->eOperato
16c20 72 20 26 20 28 57 4f 5f 49 53 4e 55 4c 4c 7c 57  r & (WO_ISNULL|W
16c30 4f 5f 49 4e 29 29 3d 3d 30 20 29 7b 0a 20 20 20  O_IN))==0 ){.   
16c40 20 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 20     Expr *pRight 
16c50 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e  = pTerm->pExpr->
16c60 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 69 66  pRight;.      if
16c70 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 6e  ( sqlite3ExprCan
16c80 42 65 4e 75 6c 6c 28 70 52 69 67 68 74 29 20 29  BeNull(pRight) )
16c90 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
16ca0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
16cb0 50 5f 49 73 4e 75 6c 6c 2c 20 72 65 67 42 61 73  P_IsNull, regBas
16cc0 65 2b 6a 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64  e+j, pLevel->add
16cd0 72 42 72 6b 29 3b 0a 20 20 20 20 20 20 20 20 56  rBrk);.        V
16ce0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
16cf0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
16d00 28 20 7a 41 66 66 20 29 7b 0a 20 20 20 20 20 20  ( zAff ){.      
16d10 20 20 69 66 28 20 73 71 6c 69 74 65 33 43 6f 6d    if( sqlite3Com
16d20 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 52 69  pareAffinity(pRi
16d30 67 68 74 2c 20 7a 41 66 66 5b 6a 5d 29 3d 3d 53  ght, zAff[j])==S
16d40 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 29  QLITE_AFF_NONE )
16d50 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 41 66 66  {.          zAff
16d60 5b 6a 5d 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  [j] = SQLITE_AFF
16d70 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d  _NONE;.        }
16d80 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
16d90 69 74 65 33 45 78 70 72 4e 65 65 64 73 4e 6f 41  ite3ExprNeedsNoA
16da0 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 52  ffinityChange(pR
16db0 69 67 68 74 2c 20 7a 41 66 66 5b 6a 5d 29 20 29  ight, zAff[j]) )
16dc0 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 41 66 66  {.          zAff
16dd0 5b 6a 5d 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  [j] = SQLITE_AFF
16de0 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d  _NONE;.        }
16df0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
16e00 20 7d 0a 20 20 2a 70 7a 41 66 66 20 3d 20 7a 41   }.  *pzAff = zA
16e10 66 66 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 67  ff;.  return reg
16e20 42 61 73 65 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  Base;.}..#ifndef
16e30 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50   SQLITE_OMIT_EXP
16e40 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  LAIN./*.** This 
16e50 72 6f 75 74 69 6e 65 20 69 73 20 61 20 68 65 6c  routine is a hel
16e60 70 65 72 20 66 6f 72 20 65 78 70 6c 61 69 6e 49  per for explainI
16e70 6e 64 65 78 52 61 6e 67 65 28 29 20 62 65 6c 6f  ndexRange() belo
16e80 77 0a 2a 2a 0a 2a 2a 20 70 53 74 72 20 68 6f 6c  w.**.** pStr hol
16e90 64 73 20 74 68 65 20 74 65 78 74 20 6f 66 20 61  ds the text of a
16ea0 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61  n expression tha
16eb0 74 20 77 65 20 61 72 65 20 62 75 69 6c 64 69 6e  t we are buildin
16ec0 67 20 75 70 20 6f 6e 65 20 74 65 72 6d 0a 2a 2a  g up one term.**
16ed0 20 61 74 20 61 20 74 69 6d 65 2e 20 20 54 68 69   at a time.  Thi
16ee0 73 20 72 6f 75 74 69 6e 65 20 61 64 64 73 20 61  s routine adds a
16ef0 20 6e 65 77 20 74 65 72 6d 20 74 6f 20 74 68 65   new term to the
16f00 20 65 6e 64 20 6f 66 20 74 68 65 20 65 78 70 72   end of the expr
16f10 65 73 73 69 6f 6e 2e 0a 2a 2a 20 54 65 72 6d 73  ession..** Terms
16f20 20 61 72 65 20 73 65 70 61 72 61 74 65 64 20 62   are separated b
16f30 79 20 41 4e 44 20 73 6f 20 61 64 64 20 74 68 65  y AND so add the
16f40 20 22 41 4e 44 22 20 74 65 78 74 20 66 6f 72 20   "AND" text for 
16f50 73 65 63 6f 6e 64 20 61 6e 64 20 73 75 62 73 65  second and subse
16f60 71 75 65 6e 74 0a 2a 2a 20 74 65 72 6d 73 20 6f  quent.** terms o
16f70 6e 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  nly..*/.static v
16f80 6f 69 64 20 65 78 70 6c 61 69 6e 41 70 70 65 6e  oid explainAppen
16f90 64 54 65 72 6d 28 0a 20 20 53 74 72 41 63 63 75  dTerm(.  StrAccu
16fa0 6d 20 2a 70 53 74 72 2c 20 20 20 20 20 20 20 20  m *pStr,        
16fb0 20 20 20 20 20 2f 2a 20 54 68 65 20 74 65 78 74       /* The text
16fc0 20 65 78 70 72 65 73 73 69 6f 6e 20 62 65 69 6e   expression bein
16fd0 67 20 62 75 69 6c 74 20 2a 2f 0a 20 20 69 6e 74  g built */.  int
16fe0 20 69 54 65 72 6d 2c 20 20 20 20 20 20 20 20 20   iTerm,         
16ff0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
17000 78 20 6f 66 20 74 68 69 73 20 74 65 72 6d 2e 20  x of this term. 
17010 20 46 69 72 73 74 20 69 73 20 7a 65 72 6f 20 2a   First is zero *
17020 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
17030 7a 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 20 20  zColumn,        
17040 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63  /* Name of the c
17050 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74  olumn */.  const
17060 20 63 68 61 72 20 2a 7a 4f 70 20 20 20 20 20 20   char *zOp      
17070 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
17080 66 20 74 68 65 20 6f 70 65 72 61 74 6f 72 20 2a  f the operator *
17090 2f 0a 29 7b 0a 20 20 69 66 28 20 69 54 65 72 6d  /.){.  if( iTerm
170a0 20 29 20 73 71 6c 69 74 65 33 53 74 72 41 63 63   ) sqlite3StrAcc
170b0 75 6d 41 70 70 65 6e 64 28 70 53 74 72 2c 20 22  umAppend(pStr, "
170c0 20 41 4e 44 20 22 2c 20 35 29 3b 0a 20 20 73 71   AND ", 5);.  sq
170d0 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70  lite3StrAccumApp
170e0 65 6e 64 41 6c 6c 28 70 53 74 72 2c 20 7a 43 6f  endAll(pStr, zCo
170f0 6c 75 6d 6e 29 3b 0a 20 20 73 71 6c 69 74 65 33  lumn);.  sqlite3
17100 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 70  StrAccumAppend(p
17110 53 74 72 2c 20 7a 4f 70 2c 20 31 29 3b 0a 20 20  Str, zOp, 1);.  
17120 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41  sqlite3StrAccumA
17130 70 70 65 6e 64 28 70 53 74 72 2c 20 22 3f 22 2c  ppend(pStr, "?",
17140 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72   1);.}../*.** Ar
17150 67 75 6d 65 6e 74 20 70 4c 65 76 65 6c 20 64 65  gument pLevel de
17160 73 63 72 69 62 65 73 20 61 20 73 74 72 61 74 65  scribes a strate
17170 67 79 20 66 6f 72 20 73 63 61 6e 6e 69 6e 67 20  gy for scanning 
17180 74 61 62 6c 65 20 70 54 61 62 2e 20 54 68 69 73  table pTab. This
17190 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65   .** function re
171a0 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20  turns a pointer 
171b0 74 6f 20 61 20 73 74 72 69 6e 67 20 62 75 66 66  to a string buff
171c0 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 20  er containing a 
171d0 64 65 73 63 72 69 70 74 69 6f 6e 0a 2a 2a 20 6f  description.** o
171e0 66 20 74 68 65 20 73 75 62 73 65 74 20 6f 66 20  f the subset of 
171f0 74 61 62 6c 65 20 72 6f 77 73 20 73 63 61 6e 6e  table rows scann
17200 65 64 20 62 79 20 74 68 65 20 73 74 72 61 74 65  ed by the strate
17210 67 79 20 69 6e 20 74 68 65 20 66 6f 72 6d 20 6f  gy in the form o
17220 66 20 61 6e 0a 2a 2a 20 53 51 4c 20 65 78 70 72  f an.** SQL expr
17230 65 73 73 69 6f 6e 2e 20 4f 72 2c 20 69 66 20 61  ession. Or, if a
17240 6c 6c 20 72 6f 77 73 20 61 72 65 20 73 63 61 6e  ll rows are scan
17250 6e 65 64 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74  ned, NULL is ret
17260 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  urned..**.** For
17270 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65   example, if the
17280 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20   query:.**.**   
17290 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
172a0 20 57 48 45 52 45 20 61 3d 31 20 41 4e 44 20 62   WHERE a=1 AND b
172b0 3e 32 3b 0a 2a 2a 0a 2a 2a 20 69 73 20 72 75 6e  >2;.**.** is run
172c0 20 61 6e 64 20 74 68 65 72 65 20 69 73 20 61 6e   and there is an
172d0 20 69 6e 64 65 78 20 6f 6e 20 28 61 2c 20 62 29   index on (a, b)
172e0 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63  , then this func
172f0 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 0a 2a  tion returns a.*
17300 2a 20 73 74 72 69 6e 67 20 73 69 6d 69 6c 61 72  * string similar
17310 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 61 3d   to:.**.**   "a=
17320 3f 20 41 4e 44 20 62 3e 3f 22 0a 2a 2a 0a 2a 2a  ? AND b>?".**.**
17330 20 54 68 65 20 72 65 74 75 72 6e 65 64 20 70 6f   The returned po
17340 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 74 6f 20  inter points to 
17350 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20  memory obtained 
17360 66 72 6f 6d 20 73 71 6c 69 74 65 33 44 62 4d 61  from sqlite3DbMa
17370 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 49 74 20 69 73  lloc()..** It is
17380 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c   the responsibil
17390 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65  ity of the calle
173a0 72 20 74 6f 20 66 72 65 65 20 74 68 65 20 62 75  r to free the bu
173b0 66 66 65 72 20 77 68 65 6e 20 69 74 20 69 73 0a  ffer when it is.
173c0 2a 2a 20 6e 6f 20 6c 6f 6e 67 65 72 20 72 65 71  ** no longer req
173d0 75 69 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  uired..*/.static
173e0 20 63 68 61 72 20 2a 65 78 70 6c 61 69 6e 49 6e   char *explainIn
173f0 64 65 78 52 61 6e 67 65 28 73 71 6c 69 74 65 33  dexRange(sqlite3
17400 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20   *db, WhereLoop 
17410 2a 70 4c 6f 6f 70 2c 20 54 61 62 6c 65 20 2a 70  *pLoop, Table *p
17420 54 61 62 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70  Tab){.  Index *p
17430 49 6e 64 65 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75  Index = pLoop->u
17440 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20  .btree.pIndex;. 
17450 20 75 31 36 20 6e 45 71 20 3d 20 70 4c 6f 6f 70   u16 nEq = pLoop
17460 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20  ->u.btree.nEq;. 
17470 20 75 31 36 20 6e 53 6b 69 70 20 3d 20 70 4c 6f   u16 nSkip = pLo
17480 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 53 6b 69  op->u.btree.nSki
17490 70 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  p;.  int i, j;. 
174a0 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f 6c 20 3d 20   Column *aCol = 
174b0 70 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 69 31  pTab->aCol;.  i1
174c0 36 20 2a 61 69 43 6f 6c 75 6d 6e 20 3d 20 70 49  6 *aiColumn = pI
174d0 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 3b 0a  ndex->aiColumn;.
174e0 20 20 53 74 72 41 63 63 75 6d 20 74 78 74 3b 0a    StrAccum txt;.
174f0 0a 20 20 69 66 28 20 6e 45 71 3d 3d 30 20 26 26  .  if( nEq==0 &&
17500 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73   (pLoop->wsFlags
17510 20 26 20 28 57 48 45 52 45 5f 42 54 4d 5f 4c 49   & (WHERE_BTM_LI
17520 4d 49 54 7c 57 48 45 52 45 5f 54 4f 50 5f 4c 49  MIT|WHERE_TOP_LI
17530 4d 49 54 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20  MIT))==0 ){.    
17540 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
17550 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 49  sqlite3StrAccumI
17560 6e 69 74 28 26 74 78 74 2c 20 30 2c 20 30 2c 20  nit(&txt, 0, 0, 
17570 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54  SQLITE_MAX_LENGT
17580 48 29 3b 0a 20 20 74 78 74 2e 64 62 20 3d 20 64  H);.  txt.db = d
17590 62 3b 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41  b;.  sqlite3StrA
175a0 63 63 75 6d 41 70 70 65 6e 64 28 26 74 78 74 2c  ccumAppend(&txt,
175b0 20 22 20 28 22 2c 20 32 29 3b 0a 20 20 66 6f 72   " (", 2);.  for
175c0 28 69 3d 30 3b 20 69 3c 6e 45 71 3b 20 69 2b 2b  (i=0; i<nEq; i++
175d0 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 20 3d  ){.    char *z =
175e0 20 28 69 3d 3d 70 49 6e 64 65 78 2d 3e 6e 4b 65   (i==pIndex->nKe
175f0 79 43 6f 6c 20 29 20 3f 20 22 72 6f 77 69 64 22  yCol ) ? "rowid"
17600 20 3a 20 61 43 6f 6c 5b 61 69 43 6f 6c 75 6d 6e   : aCol[aiColumn
17610 5b 69 5d 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  [i]].zName;.    
17620 69 66 28 20 69 3e 3d 6e 53 6b 69 70 20 29 7b 0a  if( i>=nSkip ){.
17630 20 20 20 20 20 20 65 78 70 6c 61 69 6e 41 70 70        explainApp
17640 65 6e 64 54 65 72 6d 28 26 74 78 74 2c 20 69 2c  endTerm(&txt, i,
17650 20 7a 2c 20 22 3d 22 29 3b 0a 20 20 20 20 7d 65   z, "=");.    }e
17660 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 69  lse{.      if( i
17670 20 29 20 73 71 6c 69 74 65 33 53 74 72 41 63 63   ) sqlite3StrAcc
17680 75 6d 41 70 70 65 6e 64 28 26 74 78 74 2c 20 22  umAppend(&txt, "
17690 20 41 4e 44 20 22 2c 20 35 29 3b 0a 20 20 20 20   AND ", 5);.    
176a0 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75    sqlite3StrAccu
176b0 6d 41 70 70 65 6e 64 28 26 74 78 74 2c 20 22 41  mAppend(&txt, "A
176c0 4e 59 28 22 2c 20 34 29 3b 0a 20 20 20 20 20 20  NY(", 4);.      
176d0 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41  sqlite3StrAccumA
176e0 70 70 65 6e 64 41 6c 6c 28 26 74 78 74 2c 20 7a  ppendAll(&txt, z
176f0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
17700 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 26  StrAccumAppend(&
17710 74 78 74 2c 20 22 29 22 2c 20 31 29 3b 0a 20 20  txt, ")", 1);.  
17720 20 20 7d 0a 20 20 7d 0a 0a 20 20 6a 20 3d 20 69    }.  }..  j = i
17730 3b 0a 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77  ;.  if( pLoop->w
17740 73 46 6c 61 67 73 26 57 48 45 52 45 5f 42 54 4d  sFlags&WHERE_BTM
17750 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 63 68  _LIMIT ){.    ch
17760 61 72 20 2a 7a 20 3d 20 28 6a 3d 3d 70 49 6e 64  ar *z = (j==pInd
17770 65 78 2d 3e 6e 4b 65 79 43 6f 6c 20 29 20 3f 20  ex->nKeyCol ) ? 
17780 22 72 6f 77 69 64 22 20 3a 20 61 43 6f 6c 5b 61  "rowid" : aCol[a
17790 69 43 6f 6c 75 6d 6e 5b 6a 5d 5d 2e 7a 4e 61 6d  iColumn[j]].zNam
177a0 65 3b 0a 20 20 20 20 65 78 70 6c 61 69 6e 41 70  e;.    explainAp
177b0 70 65 6e 64 54 65 72 6d 28 26 74 78 74 2c 20 69  pendTerm(&txt, i
177c0 2b 2b 2c 20 7a 2c 20 22 3e 22 29 3b 0a 20 20 7d  ++, z, ">");.  }
177d0 0a 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73  .  if( pLoop->ws
177e0 46 6c 61 67 73 26 57 48 45 52 45 5f 54 4f 50 5f  Flags&WHERE_TOP_
177f0 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 63 68 61  LIMIT ){.    cha
17800 72 20 2a 7a 20 3d 20 28 6a 3d 3d 70 49 6e 64 65  r *z = (j==pInde
17810 78 2d 3e 6e 4b 65 79 43 6f 6c 20 29 20 3f 20 22  x->nKeyCol ) ? "
17820 72 6f 77 69 64 22 20 3a 20 61 43 6f 6c 5b 61 69  rowid" : aCol[ai
17830 43 6f 6c 75 6d 6e 5b 6a 5d 5d 2e 7a 4e 61 6d 65  Column[j]].zName
17840 3b 0a 20 20 20 20 65 78 70 6c 61 69 6e 41 70 70  ;.    explainApp
17850 65 6e 64 54 65 72 6d 28 26 74 78 74 2c 20 69 2c  endTerm(&txt, i,
17860 20 7a 2c 20 22 3c 22 29 3b 0a 20 20 7d 0a 20 20   z, "<");.  }.  
17870 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41  sqlite3StrAccumA
17880 70 70 65 6e 64 28 26 74 78 74 2c 20 22 29 22 2c  ppend(&txt, ")",
17890 20 31 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71   1);.  return sq
178a0 6c 69 74 65 33 53 74 72 41 63 63 75 6d 46 69 6e  lite3StrAccumFin
178b0 69 73 68 28 26 74 78 74 29 3b 0a 7d 0a 0a 2f 2a  ish(&txt);.}../*
178c0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
178d0 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20 75 6e 6c  n is a no-op unl
178e0 65 73 73 20 63 75 72 72 65 6e 74 6c 79 20 70 72  ess currently pr
178f0 6f 63 65 73 73 69 6e 67 20 61 6e 20 45 58 50 4c  ocessing an EXPL
17900 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 0a 2a  AIN QUERY PLAN.*
17910 2a 20 63 6f 6d 6d 61 6e 64 2e 20 49 66 20 74 68  * command. If th
17920 65 20 71 75 65 72 79 20 62 65 69 6e 67 20 63 6f  e query being co
17930 6d 70 69 6c 65 64 20 69 73 20 61 6e 20 45 58 50  mpiled is an EXP
17940 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 2c  LAIN QUERY PLAN,
17950 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20 72 65 63   a single.** rec
17960 6f 72 64 20 69 73 20 61 64 64 65 64 20 74 6f 20  ord is added to 
17970 74 68 65 20 6f 75 74 70 75 74 20 74 6f 20 64 65  the output to de
17980 73 63 72 69 62 65 20 74 68 65 20 74 61 62 6c 65  scribe the table
17990 20 73 63 61 6e 20 73 74 72 61 74 65 67 79 20 69   scan strategy i
179a0 6e 20 0a 2a 2a 20 70 4c 65 76 65 6c 2e 0a 2a 2f  n .** pLevel..*/
179b0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
179c0 6c 61 69 6e 4f 6e 65 53 63 61 6e 28 0a 20 20 50  lainOneScan(.  P
179d0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
179e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
179f0 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20  * Parse context 
17a00 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  */.  SrcList *pT
17a10 61 62 4c 69 73 74 2c 20 20 20 20 20 20 20 20 20  abList,         
17a20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 6c 69       /* Table li
17a30 73 74 20 74 68 69 73 20 6c 6f 6f 70 20 72 65 66  st this loop ref
17a40 65 72 73 20 74 6f 20 2a 2f 0a 20 20 57 68 65 72  ers to */.  Wher
17a50 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20  eLevel *pLevel, 
17a60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
17a70 63 61 6e 20 74 6f 20 77 72 69 74 65 20 4f 50 5f  can to write OP_
17a80 45 78 70 6c 61 69 6e 20 6f 70 63 6f 64 65 20 66  Explain opcode f
17a90 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 76  or */.  int iLev
17aa0 65 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  el,             
17ab0 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
17ac0 20 66 6f 72 20 22 6c 65 76 65 6c 22 20 63 6f 6c   for "level" col
17ad0 75 6d 6e 20 6f 66 20 6f 75 74 70 75 74 20 2a 2f  umn of output */
17ae0 0a 20 20 69 6e 74 20 69 46 72 6f 6d 2c 20 20 20  .  int iFrom,   
17af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17b00 20 20 20 2f 2a 20 56 61 6c 75 65 20 66 6f 72 20     /* Value for 
17b10 22 66 72 6f 6d 22 20 63 6f 6c 75 6d 6e 20 6f 66  "from" column of
17b20 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 75 31 36   output */.  u16
17b30 20 77 63 74 72 6c 46 6c 61 67 73 20 20 20 20 20   wctrlFlags     
17b40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17b50 46 6c 61 67 73 20 70 61 73 73 65 64 20 74 6f 20  Flags passed to 
17b60 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
17b70 6e 28 29 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65  n() */.){.#ifnde
17b80 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
17b90 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70   if( pParse->exp
17ba0 6c 61 69 6e 3d 3d 32 20 29 0a 23 65 6e 64 69 66  lain==2 ).#endif
17bb0 0a 20 20 7b 0a 20 20 20 20 73 74 72 75 63 74 20  .  {.    struct 
17bc0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
17bd0 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d  tem = &pTabList-
17be0 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d  >a[pLevel->iFrom
17bf0 5d 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d  ];.    Vdbe *v =
17c00 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20   pParse->pVdbe; 
17c10 20 20 20 20 20 2f 2a 20 56 4d 20 62 65 69 6e 67       /* VM being
17c20 20 63 6f 6e 73 74 72 75 63 74 65 64 20 2a 2f 0a   constructed */.
17c30 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20      sqlite3 *db 
17c40 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20  = pParse->db;   
17c50 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 61    /* Database ha
17c60 6e 64 6c 65 20 2a 2f 0a 20 20 20 20 63 68 61 72  ndle */.    char
17c70 20 2a 7a 4d 73 67 3b 20 20 20 20 20 20 20 20 20   *zMsg;         
17c80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78            /* Tex
17c90 74 20 74 6f 20 61 64 64 20 74 6f 20 45 51 50 20  t to add to EQP 
17ca0 6f 75 74 70 75 74 20 2a 2f 0a 20 20 20 20 69 6e  output */.    in
17cb0 74 20 69 49 64 20 3d 20 70 50 61 72 73 65 2d 3e  t iId = pParse->
17cc0 69 53 65 6c 65 63 74 49 64 3b 20 20 2f 2a 20 53  iSelectId;  /* S
17cd0 65 6c 65 63 74 20 69 64 20 28 6c 65 66 74 2d 6d  elect id (left-m
17ce0 6f 73 74 20 6f 75 74 70 75 74 20 63 6f 6c 75 6d  ost output colum
17cf0 6e 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 73  n) */.    int is
17d00 53 65 61 72 63 68 3b 20 20 20 20 20 20 20 20 20  Search;         
17d10 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
17d20 66 6f 72 20 61 20 53 45 41 52 43 48 2e 20 46 61  for a SEARCH. Fa
17d30 6c 73 65 20 66 6f 72 20 53 43 41 4e 2e 20 2a 2f  lse for SCAN. */
17d40 0a 20 20 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  .    WhereLoop *
17d50 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20  pLoop;          
17d60 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 74 72 6f     /* The contro
17d70 6c 6c 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20  lling WhereLoop 
17d80 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20 75 33  object */.    u3
17d90 32 20 66 6c 61 67 73 3b 20 20 20 20 20 20 20 20  2 flags;        
17da0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
17db0 6c 61 67 73 20 74 68 61 74 20 64 65 73 63 72 69  lags that descri
17dc0 62 65 20 74 68 69 73 20 6c 6f 6f 70 20 2a 2f 0a  be this loop */.
17dd0 0a 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65  .    pLoop = pLe
17de0 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 20  vel->pWLoop;.   
17df0 20 66 6c 61 67 73 20 3d 20 70 4c 6f 6f 70 2d 3e   flags = pLoop->
17e00 77 73 46 6c 61 67 73 3b 0a 20 20 20 20 69 66 28  wsFlags;.    if(
17e10 20 28 66 6c 61 67 73 26 57 48 45 52 45 5f 4d 55   (flags&WHERE_MU
17e20 4c 54 49 5f 4f 52 29 20 7c 7c 20 28 77 63 74 72  LTI_OR) || (wctr
17e30 6c 46 6c 61 67 73 26 57 48 45 52 45 5f 4f 4e 45  lFlags&WHERE_ONE
17e40 54 41 42 4c 45 5f 4f 4e 4c 59 29 20 29 20 72 65  TABLE_ONLY) ) re
17e50 74 75 72 6e 3b 0a 0a 20 20 20 20 69 73 53 65 61  turn;..    isSea
17e60 72 63 68 20 3d 20 28 66 6c 61 67 73 26 28 57 48  rch = (flags&(WH
17e70 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 7c 57 48  ERE_BTM_LIMIT|WH
17e80 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 29 21  ERE_TOP_LIMIT))!
17e90 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  =0.            |
17ea0 7c 20 28 28 66 6c 61 67 73 26 57 48 45 52 45 5f  | ((flags&WHERE_
17eb0 56 49 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30  VIRTUALTABLE)==0
17ec0 20 26 26 20 28 70 4c 6f 6f 70 2d 3e 75 2e 62 74   && (pLoop->u.bt
17ed0 72 65 65 2e 6e 45 71 3e 30 29 29 0a 20 20 20 20  ree.nEq>0)).    
17ee0 20 20 20 20 20 20 20 20 7c 7c 20 28 77 63 74 72          || (wctr
17ef0 6c 46 6c 61 67 73 26 28 57 48 45 52 45 5f 4f 52  lFlags&(WHERE_OR
17f00 44 45 52 42 59 5f 4d 49 4e 7c 57 48 45 52 45 5f  DERBY_MIN|WHERE_
17f10 4f 52 44 45 52 42 59 5f 4d 41 58 29 29 3b 0a 0a  ORDERBY_MAX));..
17f20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74      zMsg = sqlit
17f30 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25  e3MPrintf(db, "%
17f40 73 22 2c 20 69 73 53 65 61 72 63 68 3f 22 53 45  s", isSearch?"SE
17f50 41 52 43 48 22 3a 22 53 43 41 4e 22 29 3b 0a 20  ARCH":"SCAN");. 
17f60 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 53     if( pItem->pS
17f70 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 7a  elect ){.      z
17f80 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70  Msg = sqlite3MAp
17f90 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20  pendf(db, zMsg, 
17fa0 22 25 73 20 53 55 42 51 55 45 52 59 20 25 64 22  "%s SUBQUERY %d"
17fb0 2c 20 7a 4d 73 67 2c 70 49 74 65 6d 2d 3e 69 53  , zMsg,pItem->iS
17fc0 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 7d 65  electId);.    }e
17fd0 6c 73 65 7b 0a 20 20 20 20 20 20 7a 4d 73 67 20  lse{.      zMsg 
17fe0 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64  = sqlite3MAppend
17ff0 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20  f(db, zMsg, "%s 
18000 54 41 42 4c 45 20 25 73 22 2c 20 7a 4d 73 67 2c  TABLE %s", zMsg,
18010 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a   pItem->zName);.
18020 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70      }..    if( p
18030 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 29 7b 0a  Item->zAlias ){.
18040 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c        zMsg = sql
18050 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c  ite3MAppendf(db,
18060 20 7a 4d 73 67 2c 20 22 25 73 20 41 53 20 25 73   zMsg, "%s AS %s
18070 22 2c 20 7a 4d 73 67 2c 20 70 49 74 65 6d 2d 3e  ", zMsg, pItem->
18080 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 7d 0a 20  zAlias);.    }. 
18090 20 20 20 69 66 28 20 28 66 6c 61 67 73 20 26 20     if( (flags & 
180a0 28 57 48 45 52 45 5f 49 50 4b 7c 57 48 45 52 45  (WHERE_IPK|WHERE
180b0 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 29 3d  _VIRTUALTABLE))=
180c0 3d 30 0a 20 20 20 20 20 26 26 20 41 4c 57 41 59  =0.     && ALWAY
180d0 53 28 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  S(pLoop->u.btree
180e0 2e 70 49 6e 64 65 78 21 3d 30 29 0a 20 20 20 20  .pIndex!=0).    
180f0 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  ){.      const c
18100 68 61 72 20 2a 7a 46 6d 74 3b 0a 20 20 20 20 20  har *zFmt;.     
18110 20 49 6e 64 65 78 20 2a 70 49 64 78 20 3d 20 70   Index *pIdx = p
18120 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49  Loop->u.btree.pI
18130 6e 64 65 78 3b 0a 20 20 20 20 20 20 63 68 61 72  ndex;.      char
18140 20 2a 7a 57 68 65 72 65 20 3d 20 65 78 70 6c 61   *zWhere = expla
18150 69 6e 49 6e 64 65 78 52 61 6e 67 65 28 64 62 2c  inIndexRange(db,
18160 20 70 4c 6f 6f 70 2c 20 70 49 74 65 6d 2d 3e 70   pLoop, pItem->p
18170 54 61 62 29 3b 0a 20 20 20 20 20 20 61 73 73 65  Tab);.      asse
18180 72 74 28 20 21 28 66 6c 61 67 73 26 57 48 45 52  rt( !(flags&WHER
18190 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 20 7c 7c  E_AUTO_INDEX) ||
181a0 20 28 66 6c 61 67 73 26 57 48 45 52 45 5f 49 44   (flags&WHERE_ID
181b0 58 5f 4f 4e 4c 59 29 20 29 3b 0a 20 20 20 20 20  X_ONLY) );.     
181c0 20 69 66 28 20 21 48 61 73 52 6f 77 69 64 28 70   if( !HasRowid(p
181d0 49 74 65 6d 2d 3e 70 54 61 62 29 20 26 26 20 49  Item->pTab) && I
181e0 73 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78  sPrimaryKeyIndex
181f0 28 70 49 64 78 29 20 29 7b 0a 20 20 20 20 20 20  (pIdx) ){.      
18200 20 20 7a 46 6d 74 20 3d 20 7a 57 68 65 72 65 20    zFmt = zWhere 
18210 3f 20 22 25 73 20 55 53 49 4e 47 20 50 52 49 4d  ? "%s USING PRIM
18220 41 52 59 20 4b 45 59 25 2e 30 73 25 73 22 20 3a  ARY KEY%.0s%s" :
18230 20 22 25 73 25 2e 30 73 25 73 22 3b 0a 20 20 20   "%s%.0s%s";.   
18240 20 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61     }else if( fla
18250 67 73 20 26 20 57 48 45 52 45 5f 41 55 54 4f 5f  gs & WHERE_AUTO_
18260 49 4e 44 45 58 20 29 7b 0a 20 20 20 20 20 20 20  INDEX ){.       
18270 20 7a 46 6d 74 20 3d 20 22 25 73 20 55 53 49 4e   zFmt = "%s USIN
18280 47 20 41 55 54 4f 4d 41 54 49 43 20 43 4f 56 45  G AUTOMATIC COVE
18290 52 49 4e 47 20 49 4e 44 45 58 25 2e 30 73 25 73  RING INDEX%.0s%s
182a0 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  ";.      }else i
182b0 66 28 20 66 6c 61 67 73 20 26 20 57 48 45 52 45  f( flags & WHERE
182c0 5f 49 44 58 5f 4f 4e 4c 59 20 29 7b 0a 20 20 20  _IDX_ONLY ){.   
182d0 20 20 20 20 20 7a 46 6d 74 20 3d 20 22 25 73 20       zFmt = "%s 
182e0 55 53 49 4e 47 20 43 4f 56 45 52 49 4e 47 20 49  USING COVERING I
182f0 4e 44 45 58 20 25 73 25 73 22 3b 0a 20 20 20 20  NDEX %s%s";.    
18300 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
18310 20 7a 46 6d 74 20 3d 20 22 25 73 20 55 53 49 4e   zFmt = "%s USIN
18320 47 20 49 4e 44 45 58 20 25 73 25 73 22 3b 0a 20  G INDEX %s%s";. 
18330 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 4d 73       }.      zMs
18340 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65  g = sqlite3MAppe
18350 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 7a 46  ndf(db, zMsg, zF
18360 6d 74 2c 20 7a 4d 73 67 2c 20 70 49 64 78 2d 3e  mt, zMsg, pIdx->
18370 7a 4e 61 6d 65 2c 20 7a 57 68 65 72 65 29 3b 0a  zName, zWhere);.
18380 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
18390 72 65 65 28 64 62 2c 20 7a 57 68 65 72 65 29 3b  ree(db, zWhere);
183a0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28  .    }else if( (
183b0 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 50  flags & WHERE_IP
183c0 4b 29 21 3d 30 20 26 26 20 28 66 6c 61 67 73 20  K)!=0 && (flags 
183d0 26 20 57 48 45 52 45 5f 43 4f 4e 53 54 52 41 49  & WHERE_CONSTRAI
183e0 4e 54 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  NT)!=0 ){.      
183f0 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41  zMsg = sqlite3MA
18400 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c  ppendf(db, zMsg,
18410 20 22 25 73 20 55 53 49 4e 47 20 49 4e 54 45 47   "%s USING INTEG
18420 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 22 2c  ER PRIMARY KEY",
18430 20 7a 4d 73 67 29 3b 0a 0a 20 20 20 20 20 20 69   zMsg);..      i
18440 66 28 20 66 6c 61 67 73 26 28 57 48 45 52 45 5f  f( flags&(WHERE_
18450 43 4f 4c 55 4d 4e 5f 45 51 7c 57 48 45 52 45 5f  COLUMN_EQ|WHERE_
18460 43 4f 4c 55 4d 4e 5f 49 4e 29 20 29 7b 0a 20 20  COLUMN_IN) ){.  
18470 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c        zMsg = sql
18480 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c  ite3MAppendf(db,
18490 20 7a 4d 73 67 2c 20 22 25 73 20 28 72 6f 77 69   zMsg, "%s (rowi
184a0 64 3d 3f 29 22 2c 20 7a 4d 73 67 29 3b 0a 20 20  d=?)", zMsg);.  
184b0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 66      }else if( (f
184c0 6c 61 67 73 26 57 48 45 52 45 5f 42 4f 54 48 5f  lags&WHERE_BOTH_
184d0 4c 49 4d 49 54 29 3d 3d 57 48 45 52 45 5f 42 4f  LIMIT)==WHERE_BO
184e0 54 48 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20  TH_LIMIT ){.    
184f0 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74      zMsg = sqlit
18500 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a  e3MAppendf(db, z
18510 4d 73 67 2c 20 22 25 73 20 28 72 6f 77 69 64 3e  Msg, "%s (rowid>
18520 3f 20 41 4e 44 20 72 6f 77 69 64 3c 3f 29 22 2c  ? AND rowid<?)",
18530 20 7a 4d 73 67 29 3b 0a 20 20 20 20 20 20 7d 65   zMsg);.      }e
18540 6c 73 65 20 69 66 28 20 66 6c 61 67 73 26 57 48  lse if( flags&WH
18550 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 7b  ERE_BTM_LIMIT ){
18560 0a 20 20 20 20 20 20 20 20 7a 4d 73 67 20 3d 20  .        zMsg = 
18570 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28  sqlite3MAppendf(
18580 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 28 72  db, zMsg, "%s (r
18590 6f 77 69 64 3e 3f 29 22 2c 20 7a 4d 73 67 29 3b  owid>?)", zMsg);
185a0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
185b0 20 41 4c 57 41 59 53 28 66 6c 61 67 73 26 57 48   ALWAYS(flags&WH
185c0 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 20 29  ERE_TOP_LIMIT) )
185d0 7b 0a 20 20 20 20 20 20 20 20 7a 4d 73 67 20 3d  {.        zMsg =
185e0 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66   sqlite3MAppendf
185f0 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 28  (db, zMsg, "%s (
18600 72 6f 77 69 64 3c 3f 29 22 2c 20 7a 4d 73 67 29  rowid<?)", zMsg)
18610 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
18620 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
18630 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
18640 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20 28 66  .    else if( (f
18650 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52  lags & WHERE_VIR
18660 54 55 41 4c 54 41 42 4c 45 29 21 3d 30 20 29 7b  TUALTABLE)!=0 ){
18670 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71  .      zMsg = sq
18680 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62  lite3MAppendf(db
18690 2c 20 7a 4d 73 67 2c 20 22 25 73 20 56 49 52 54  , zMsg, "%s VIRT
186a0 55 41 4c 20 54 41 42 4c 45 20 49 4e 44 45 58 20  UAL TABLE INDEX 
186b0 25 64 3a 25 73 22 2c 20 7a 4d 73 67 2c 0a 20 20  %d:%s", zMsg,.  
186c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
186d0 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 69 64  pLoop->u.vtab.id
186e0 78 4e 75 6d 2c 20 70 4c 6f 6f 70 2d 3e 75 2e 76  xNum, pLoop->u.v
186f0 74 61 62 2e 69 64 78 53 74 72 29 3b 0a 20 20 20  tab.idxStr);.   
18700 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7a 4d   }.#endif.    zM
18710 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70  sg = sqlite3MApp
18720 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22  endf(db, zMsg, "
18730 25 73 22 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20  %s", zMsg);.    
18740 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
18750 34 28 76 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c  4(v, OP_Explain,
18760 20 69 49 64 2c 20 69 4c 65 76 65 6c 2c 20 69 46   iId, iLevel, iF
18770 72 6f 6d 2c 20 7a 4d 73 67 2c 20 50 34 5f 44 59  rom, zMsg, P4_DY
18780 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65  NAMIC);.  }.}.#e
18790 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 65 78 70  lse.# define exp
187a0 6c 61 69 6e 4f 6e 65 53 63 61 6e 28 75 2c 76 2c  lainOneScan(u,v,
187b0 77 2c 78 2c 79 2c 7a 29 0a 23 65 6e 64 69 66 20  w,x,y,z).#endif 
187c0 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  /* SQLITE_OMIT_E
187d0 58 50 4c 41 49 4e 20 2a 2f 0a 0a 0a 2f 2a 0a 2a  XPLAIN */.../*.*
187e0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
187f0 66 6f 72 20 74 68 65 20 73 74 61 72 74 20 6f 66  for the start of
18800 20 74 68 65 20 69 4c 65 76 65 6c 2d 74 68 20 6c   the iLevel-th l
18810 6f 6f 70 20 69 6e 20 74 68 65 20 57 48 45 52 45  oop in the WHERE
18820 20 63 6c 61 75 73 65 0a 2a 2a 20 69 6d 70 6c 65   clause.** imple
18830 6d 65 6e 74 61 74 69 6f 6e 20 64 65 73 63 72 69  mentation descri
18840 62 65 64 20 62 79 20 70 57 49 6e 66 6f 2e 0a 2a  bed by pWInfo..*
18850 2f 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b  /.static Bitmask
18860 20 63 6f 64 65 4f 6e 65 4c 6f 6f 70 53 74 61 72   codeOneLoopStar
18870 74 28 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  t(.  WhereInfo *
18880 70 57 49 6e 66 6f 2c 20 20 20 2f 2a 20 43 6f 6d  pWInfo,   /* Com
18890 70 6c 65 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f  plete informatio
188a0 6e 20 61 62 6f 75 74 20 74 68 65 20 57 48 45 52  n about the WHER
188b0 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e  E clause */.  in
188c0 74 20 69 4c 65 76 65 6c 2c 20 20 20 20 20 20 20  t iLevel,       
188d0 20 20 20 2f 2a 20 57 68 69 63 68 20 6c 65 76 65     /* Which leve
188e0 6c 20 6f 66 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d  l of pWInfo->a[]
188f0 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 64 65 64   should be coded
18900 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f   */.  Bitmask no
18910 74 52 65 61 64 79 20 20 20 20 20 2f 2a 20 57 68  tReady     /* Wh
18920 69 63 68 20 74 61 62 6c 65 73 20 61 72 65 20 63  ich tables are c
18930 75 72 72 65 6e 74 6c 79 20 61 76 61 69 6c 61 62  urrently availab
18940 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6a  le */.){.  int j
18950 2c 20 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  , k;            
18960 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73  /* Loop counters
18970 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 3b 20   */.  int iCur; 
18980 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
18990 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 66 6f  e VDBE cursor fo
189a0 72 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20  r the table */. 
189b0 20 69 6e 74 20 61 64 64 72 4e 78 74 3b 20 20 20   int addrNxt;   
189c0 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74        /* Where t
189d0 6f 20 6a 75 6d 70 20 74 6f 20 63 6f 6e 74 69 6e  o jump to contin
189e0 75 65 20 77 69 74 68 20 74 68 65 20 6e 65 78 74  ue with the next
189f0 20 49 4e 20 63 61 73 65 20 2a 2f 0a 20 20 69 6e   IN case */.  in
18a00 74 20 6f 6d 69 74 54 61 62 6c 65 3b 20 20 20 20  t omitTable;    
18a10 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 77 65     /* True if we
18a20 20 75 73 65 20 74 68 65 20 69 6e 64 65 78 20 6f   use the index o
18a30 6e 6c 79 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65  nly */.  int bRe
18a40 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  v;            /*
18a50 20 54 72 75 65 20 69 66 20 77 65 20 6e 65 65 64   True if we need
18a60 20 74 6f 20 73 63 61 6e 20 69 6e 20 72 65 76 65   to scan in reve
18a70 72 73 65 20 6f 72 64 65 72 20 2a 2f 0a 20 20 57  rse order */.  W
18a80 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65  hereLevel *pLeve
18a90 6c 3b 20 20 2f 2a 20 54 68 65 20 77 68 65 72 65  l;  /* The where
18aa0 20 6c 65 76 65 6c 20 74 6f 20 62 65 20 63 6f 64   level to be cod
18ab0 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f  ed */.  WhereLoo
18ac0 70 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 2f 2a 20  p *pLoop;    /* 
18ad0 54 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62  The WhereLoop ob
18ae0 6a 65 63 74 20 62 65 69 6e 67 20 63 6f 64 65 64  ject being coded
18af0 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
18b00 65 20 2a 70 57 43 3b 20 20 20 20 2f 2a 20 44 65  e *pWC;    /* De
18b10 63 6f 6d 70 6f 73 69 74 69 6f 6e 20 6f 66 20 74  composition of t
18b20 68 65 20 65 6e 74 69 72 65 20 57 48 45 52 45 20  he entire WHERE 
18b30 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72  clause */.  Wher
18b40 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20  eTerm *pTerm;   
18b50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
18b60 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65   WHERE clause te
18b70 72 6d 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70  rm */.  Parse *p
18b80 50 61 72 73 65 3b 20 20 20 20 20 20 20 20 20 20  Parse;          
18b90 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
18ba0 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
18bb0 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20  sqlite3 *db;    
18bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18bd0 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
18be0 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 56 64 62 65  ection */.  Vdbe
18bf0 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20   *v;            
18c00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
18c10 68 65 20 70 72 65 70 61 72 65 64 20 73 74 6d 74  he prepared stmt
18c20 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
18c30 69 6f 6e 73 20 2a 2f 0a 20 20 73 74 72 75 63 74  ions */.  struct
18c40 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
18c50 54 61 62 49 74 65 6d 3b 20 20 2f 2a 20 46 52 4f  TabItem;  /* FRO
18c60 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20 62 65  M clause term be
18c70 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69  ing coded */.  i
18c80 6e 74 20 61 64 64 72 42 72 6b 3b 20 20 20 20 20  nt addrBrk;     
18c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
18ca0 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 62  * Jump here to b
18cb0 72 65 61 6b 20 6f 75 74 20 6f 66 20 74 68 65 20  reak out of the 
18cc0 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64  loop */.  int ad
18cd0 64 72 43 6f 6e 74 3b 20 20 20 20 20 20 20 20 20  drCont;         
18ce0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d            /* Jum
18cf0 70 20 68 65 72 65 20 74 6f 20 63 6f 6e 74 69 6e  p here to contin
18d00 75 65 20 77 69 74 68 20 6e 65 78 74 20 63 79 63  ue with next cyc
18d10 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 6f 77  le */.  int iRow
18d20 69 64 52 65 67 20 3d 20 30 3b 20 20 20 20 20 20  idReg = 0;      
18d30 20 20 2f 2a 20 52 6f 77 69 64 20 69 73 20 73 74    /* Rowid is st
18d40 6f 72 65 64 20 69 6e 20 74 68 69 73 20 72 65 67  ored in this reg
18d50 69 73 74 65 72 2c 20 69 66 20 6e 6f 74 20 7a 65  ister, if not ze
18d60 72 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65 6c  ro */.  int iRel
18d70 65 61 73 65 52 65 67 20 3d 20 30 3b 20 20 20 20  easeReg = 0;    
18d80 20 20 2f 2a 20 54 65 6d 70 20 72 65 67 69 73 74    /* Temp regist
18d90 65 72 20 74 6f 20 66 72 65 65 20 62 65 66 6f 72  er to free befor
18da0 65 20 72 65 74 75 72 6e 69 6e 67 20 2a 2f 0a 0a  e returning */..
18db0 20 20 70 50 61 72 73 65 20 3d 20 70 57 49 6e 66    pParse = pWInf
18dc0 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20 76 20 3d  o->pParse;.  v =
18dd0 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
18de0 20 20 70 57 43 20 3d 20 26 70 57 49 6e 66 6f 2d    pWC = &pWInfo-
18df0 3e 73 57 43 3b 0a 20 20 64 62 20 3d 20 70 50 61  >sWC;.  db = pPa
18e00 72 73 65 2d 3e 64 62 3b 0a 20 20 70 4c 65 76 65  rse->db;.  pLeve
18e10 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69  l = &pWInfo->a[i
18e20 4c 65 76 65 6c 5d 3b 0a 20 20 70 4c 6f 6f 70 20  Level];.  pLoop 
18e30 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70  = pLevel->pWLoop
18e40 3b 0a 20 20 70 54 61 62 49 74 65 6d 20 3d 20 26  ;.  pTabItem = &
18e50 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
18e60 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f  ->a[pLevel->iFro
18e70 6d 5d 3b 0a 20 20 69 43 75 72 20 3d 20 70 54 61  m];.  iCur = pTa
18e80 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a  bItem->iCursor;.
18e90 20 20 70 4c 65 76 65 6c 2d 3e 6e 6f 74 52 65 61    pLevel->notRea
18ea0 64 79 20 3d 20 6e 6f 74 52 65 61 64 79 20 26 20  dy = notReady & 
18eb0 7e 67 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f  ~getMask(&pWInfo
18ec0 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 69 43 75 72  ->sMaskSet, iCur
18ed0 29 3b 0a 20 20 62 52 65 76 20 3d 20 28 70 57 49  );.  bRev = (pWI
18ee0 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b 3e 3e 69 4c  nfo->revMask>>iL
18ef0 65 76 65 6c 29 26 31 3b 0a 20 20 6f 6d 69 74 54  evel)&1;.  omitT
18f00 61 62 6c 65 20 3d 20 28 70 4c 6f 6f 70 2d 3e 77  able = (pLoop->w
18f10 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
18f20 44 58 5f 4f 4e 4c 59 29 21 3d 30 20 0a 20 20 20  DX_ONLY)!=0 .   
18f30 20 20 20 20 20 20 20 20 26 26 20 28 70 57 49 6e          && (pWIn
18f40 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26  fo->wctrlFlags &
18f50 20 57 48 45 52 45 5f 46 4f 52 43 45 5f 54 41 42   WHERE_FORCE_TAB
18f60 4c 45 29 3d 3d 30 3b 0a 20 20 56 64 62 65 4d 6f  LE)==0;.  VdbeMo
18f70 64 75 6c 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  duleComment((v, 
18f80 22 42 65 67 69 6e 20 57 48 45 52 45 2d 6c 6f 6f  "Begin WHERE-loo
18f90 70 25 64 3a 20 25 73 22 2c 69 4c 65 76 65 6c 2c  p%d: %s",iLevel,
18fa0 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 2d 3e  pTabItem->pTab->
18fb0 7a 4e 61 6d 65 29 29 3b 0a 0a 20 20 2f 2a 20 43  zName));..  /* C
18fc0 72 65 61 74 65 20 6c 61 62 65 6c 73 20 66 6f 72  reate labels for
18fd0 20 74 68 65 20 22 62 72 65 61 6b 22 20 61 6e 64   the "break" and
18fe0 20 22 63 6f 6e 74 69 6e 75 65 22 20 69 6e 73 74   "continue" inst
18ff0 72 75 63 74 69 6f 6e 73 0a 20 20 2a 2a 20 66 6f  ructions.  ** fo
19000 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f  r the current lo
19010 6f 70 2e 20 20 4a 75 6d 70 20 74 6f 20 61 64 64  op.  Jump to add
19020 72 42 72 6b 20 74 6f 20 62 72 65 61 6b 20 6f 75  rBrk to break ou
19030 74 20 6f 66 20 61 20 6c 6f 6f 70 2e 0a 20 20 2a  t of a loop..  *
19040 2a 20 4a 75 6d 70 20 74 6f 20 63 6f 6e 74 20 74  * Jump to cont t
19050 6f 20 67 6f 20 69 6d 6d 65 64 69 61 74 65 6c 79  o go immediately
19060 20 74 6f 20 74 68 65 20 6e 65 78 74 20 69 74 65   to the next ite
19070 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a 20 20  ration of the.  
19080 2a 2a 20 6c 6f 6f 70 2e 0a 20 20 2a 2a 0a 20 20  ** loop..  **.  
19090 2a 2a 20 57 68 65 6e 20 74 68 65 72 65 20 69 73  ** When there is
190a0 20 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 2c   an IN operator,
190b0 20 77 65 20 61 6c 73 6f 20 68 61 76 65 20 61 20   we also have a 
190c0 22 61 64 64 72 4e 78 74 22 20 6c 61 62 65 6c 20  "addrNxt" label 
190d0 74 68 61 74 0a 20 20 2a 2a 20 6d 65 61 6e 73 20  that.  ** means 
190e0 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68  to continue with
190f0 20 74 68 65 20 6e 65 78 74 20 49 4e 20 76 61 6c   the next IN val
19100 75 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 2e 20  ue combination. 
19110 20 57 68 65 6e 0a 20 20 2a 2a 20 74 68 65 72 65   When.  ** there
19120 20 61 72 65 20 6e 6f 20 49 4e 20 6f 70 65 72 61   are no IN opera
19130 74 6f 72 73 20 69 6e 20 74 68 65 20 63 6f 6e 73  tors in the cons
19140 74 72 61 69 6e 74 73 2c 20 74 68 65 20 22 61 64  traints, the "ad
19150 64 72 4e 78 74 22 20 6c 61 62 65 6c 0a 20 20 2a  drNxt" label.  *
19160 2a 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73  * is the same as
19170 20 22 61 64 64 72 42 72 6b 22 2e 0a 20 20 2a 2f   "addrBrk"..  */
19180 0a 20 20 61 64 64 72 42 72 6b 20 3d 20 70 4c 65  .  addrBrk = pLe
19190 76 65 6c 2d 3e 61 64 64 72 42 72 6b 20 3d 20 70  vel->addrBrk = p
191a0 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 20 3d  Level->addrNxt =
191b0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
191c0 4c 61 62 65 6c 28 76 29 3b 0a 20 20 61 64 64 72  Label(v);.  addr
191d0 43 6f 6e 74 20 3d 20 70 4c 65 76 65 6c 2d 3e 61  Cont = pLevel->a
191e0 64 64 72 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65  ddrCont = sqlite
191f0 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
19200 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  );..  /* If this
19210 20 69 73 20 74 68 65 20 72 69 67 68 74 20 74 61   is the right ta
19220 62 6c 65 20 6f 66 20 61 20 4c 45 46 54 20 4f 55  ble of a LEFT OU
19230 54 45 52 20 4a 4f 49 4e 2c 20 61 6c 6c 6f 63 61  TER JOIN, alloca
19240 74 65 20 61 6e 64 0a 20 20 2a 2a 20 69 6e 69 74  te and.  ** init
19250 69 61 6c 69 7a 65 20 61 20 6d 65 6d 6f 72 79 20  ialize a memory 
19260 63 65 6c 6c 20 74 68 61 74 20 72 65 63 6f 72 64  cell that record
19270 73 20 69 66 20 74 68 69 73 20 74 61 62 6c 65 20  s if this table 
19280 6d 61 74 63 68 65 73 20 61 6e 79 0a 20 20 2a 2a  matches any.  **
19290 20 72 6f 77 20 6f 66 20 74 68 65 20 6c 65 66 74   row of the left
192a0 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 6a 6f   table of the jo
192b0 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  in..  */.  if( p
192c0 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 3e 30 20 26  Level->iFrom>0 &
192d0 26 20 28 70 54 61 62 49 74 65 6d 5b 30 5d 2e 6a  & (pTabItem[0].j
192e0 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45 46  ointype & JT_LEF
192f0 54 29 21 3d 30 20 29 7b 0a 20 20 20 20 70 4c 65  T)!=0 ){.    pLe
19300 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 3d  vel->iLeftJoin =
19310 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
19320 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
19330 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
19340 65 67 65 72 2c 20 30 2c 20 70 4c 65 76 65 6c 2d  eger, 0, pLevel-
19350 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b 0a 20 20 20  >iLeftJoin);.   
19360 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
19370 20 22 69 6e 69 74 20 4c 45 46 54 20 4a 4f 49 4e   "init LEFT JOIN
19380 20 6e 6f 2d 6d 61 74 63 68 20 66 6c 61 67 22 29   no-match flag")
19390 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 70 65  );.  }..  /* Spe
193a0 63 69 61 6c 20 63 61 73 65 20 6f 66 20 61 20 46  cial case of a F
193b0 52 4f 4d 20 63 6c 61 75 73 65 20 73 75 62 71 75  ROM clause subqu
193c0 65 72 79 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20  ery implemented 
193d0 61 73 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20  as a co-routine 
193e0 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 49 74 65  */.  if( pTabIte
193f0 6d 2d 3e 76 69 61 43 6f 72 6f 75 74 69 6e 65 20  m->viaCoroutine 
19400 29 7b 0a 20 20 20 20 69 6e 74 20 72 65 67 59 69  ){.    int regYi
19410 65 6c 64 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e  eld = pTabItem->
19420 72 65 67 52 65 74 75 72 6e 3b 0a 20 20 20 20 73  regReturn;.    s
19430 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
19440 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75  (v, OP_InitCorou
19450 74 69 6e 65 2c 20 72 65 67 59 69 65 6c 64 2c 20  tine, regYield, 
19460 30 2c 20 70 54 61 62 49 74 65 6d 2d 3e 61 64 64  0, pTabItem->add
19470 72 46 69 6c 6c 53 75 62 29 3b 0a 20 20 20 20 70  rFillSub);.    p
19480 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 20 73 71 6c  Level->p2 =  sql
19490 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
194a0 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 59  , OP_Yield, regY
194b0 69 65 6c 64 2c 20 61 64 64 72 42 72 6b 29 3b 0a  ield, addrBrk);.
194c0 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
194d0 28 76 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d  (v);.    VdbeCom
194e0 6d 65 6e 74 28 28 76 2c 20 22 6e 65 78 74 20 72  ment((v, "next r
194f0 6f 77 20 6f 66 20 5c 22 25 73 5c 22 22 2c 20 70  ow of \"%s\"", p
19500 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a  TabItem->pTab->z
19510 4e 61 6d 65 29 29 3b 0a 20 20 20 20 70 4c 65 76  Name));.    pLev
19520 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 47 6f 74 6f  el->op = OP_Goto
19530 3b 0a 20 20 7d 65 6c 73 65 0a 0a 23 69 66 6e 64  ;.  }else..#ifnd
19540 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
19550 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 66  IRTUALTABLE.  if
19560 28 20 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  (  (pLoop->wsFla
19570 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55  gs & WHERE_VIRTU
19580 41 4c 54 41 42 4c 45 29 21 3d 30 20 29 7b 0a 20  ALTABLE)!=0 ){. 
19590 20 20 20 2f 2a 20 43 61 73 65 20 31 3a 20 20 54     /* Case 1:  T
195a0 68 65 20 74 61 62 6c 65 20 69 73 20 61 20 76 69  he table is a vi
195b0 72 74 75 61 6c 2d 74 61 62 6c 65 2e 20 20 55 73  rtual-table.  Us
195c0 65 20 74 68 65 20 56 46 69 6c 74 65 72 20 61 6e  e the VFilter an
195d0 64 20 56 4e 65 78 74 0a 20 20 20 20 2a 2a 20 20  d VNext.    **  
195e0 20 20 20 20 20 20 20 20 74 6f 20 61 63 63 65 73          to acces
195f0 73 20 74 68 65 20 64 61 74 61 2e 0a 20 20 20 20  s the data..    
19600 2a 2f 0a 20 20 20 20 69 6e 74 20 69 52 65 67 3b  */.    int iReg;
19610 20 20 20 2f 2a 20 50 33 20 56 61 6c 75 65 20 66     /* P3 Value f
19620 6f 72 20 4f 50 5f 56 46 69 6c 74 65 72 20 2a 2f  or OP_VFilter */
19630 0a 20 20 20 20 69 6e 74 20 61 64 64 72 4e 6f 74  .    int addrNot
19640 46 6f 75 6e 64 3b 0a 20 20 20 20 69 6e 74 20 6e  Found;.    int n
19650 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 70 4c 6f  Constraint = pLo
19660 6f 70 2d 3e 6e 4c 54 65 72 6d 3b 0a 0a 20 20 20  op->nLTerm;..   
19670 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
19680 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20  ePush(pParse);. 
19690 20 20 20 69 52 65 67 20 3d 20 73 71 6c 69 74 65     iReg = sqlite
196a0 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50  3GetTempRange(pP
196b0 61 72 73 65 2c 20 6e 43 6f 6e 73 74 72 61 69 6e  arse, nConstrain
196c0 74 2b 32 29 3b 0a 20 20 20 20 61 64 64 72 4e 6f  t+2);.    addrNo
196d0 74 46 6f 75 6e 64 20 3d 20 70 4c 65 76 65 6c 2d  tFound = pLevel-
196e0 3e 61 64 64 72 42 72 6b 3b 0a 20 20 20 20 66 6f  >addrBrk;.    fo
196f0 72 28 6a 3d 30 3b 20 6a 3c 6e 43 6f 6e 73 74 72  r(j=0; j<nConstr
19700 61 69 6e 74 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  aint; j++){.    
19710 20 20 69 6e 74 20 69 54 61 72 67 65 74 20 3d 20    int iTarget = 
19720 69 52 65 67 2b 6a 2b 32 3b 0a 20 20 20 20 20 20  iReg+j+2;.      
19730 70 54 65 72 6d 20 3d 20 70 4c 6f 6f 70 2d 3e 61  pTerm = pLoop->a
19740 4c 54 65 72 6d 5b 6a 5d 3b 0a 20 20 20 20 20 20  LTerm[j];.      
19750 69 66 28 20 70 54 65 72 6d 3d 3d 30 20 29 20 63  if( pTerm==0 ) c
19760 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69  ontinue;.      i
19770 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  f( pTerm->eOpera
19780 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29 7b 0a 20  tor & WO_IN ){. 
19790 20 20 20 20 20 20 20 63 6f 64 65 45 71 75 61 6c         codeEqual
197a0 69 74 79 54 65 72 6d 28 70 50 61 72 73 65 2c 20  ityTerm(pParse, 
197b0 70 54 65 72 6d 2c 20 70 4c 65 76 65 6c 2c 20 6a  pTerm, pLevel, j
197c0 2c 20 62 52 65 76 2c 20 69 54 61 72 67 65 74 29  , bRev, iTarget)
197d0 3b 0a 20 20 20 20 20 20 20 20 61 64 64 72 4e 6f  ;.        addrNo
197e0 74 46 6f 75 6e 64 20 3d 20 70 4c 65 76 65 6c 2d  tFound = pLevel-
197f0 3e 61 64 64 72 4e 78 74 3b 0a 20 20 20 20 20 20  >addrNxt;.      
19800 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
19810 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
19820 50 61 72 73 65 2c 20 70 54 65 72 6d 2d 3e 70 45  Parse, pTerm->pE
19830 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 69 54 61  xpr->pRight, iTa
19840 72 67 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  rget);.      }. 
19850 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
19860 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
19870 5f 49 6e 74 65 67 65 72 2c 20 70 4c 6f 6f 70 2d  _Integer, pLoop-
19880 3e 75 2e 76 74 61 62 2e 69 64 78 4e 75 6d 2c 20  >u.vtab.idxNum, 
19890 69 52 65 67 29 3b 0a 20 20 20 20 73 71 6c 69 74  iReg);.    sqlit
198a0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
198b0 4f 50 5f 49 6e 74 65 67 65 72 2c 20 6e 43 6f 6e  OP_Integer, nCon
198c0 73 74 72 61 69 6e 74 2c 20 69 52 65 67 2b 31 29  straint, iReg+1)
198d0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
198e0 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 56 46  eAddOp4(v, OP_VF
198f0 69 6c 74 65 72 2c 20 69 43 75 72 2c 20 61 64 64  ilter, iCur, add
19900 72 4e 6f 74 46 6f 75 6e 64 2c 20 69 52 65 67 2c  rNotFound, iReg,
19910 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
19920 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e         pLoop->u.
19930 76 74 61 62 2e 69 64 78 53 74 72 2c 0a 20 20 20  vtab.idxStr,.   
19940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19950 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62     pLoop->u.vtab
19960 2e 6e 65 65 64 46 72 65 65 20 3f 20 50 34 5f 4d  .needFree ? P4_M
19970 50 52 49 4e 54 46 20 3a 20 50 34 5f 53 54 41 54  PRINTF : P4_STAT
19980 49 43 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76  IC);.    VdbeCov
19990 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 70 4c  erage(v);.    pL
199a0 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64  oop->u.vtab.need
199b0 46 72 65 65 20 3d 20 30 3b 0a 20 20 20 20 66 6f  Free = 0;.    fo
199c0 72 28 6a 3d 30 3b 20 6a 3c 6e 43 6f 6e 73 74 72  r(j=0; j<nConstr
199d0 61 69 6e 74 20 26 26 20 6a 3c 31 36 3b 20 6a 2b  aint && j<16; j+
199e0 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70  +){.      if( (p
199f0 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69  Loop->u.vtab.omi
19a00 74 4d 61 73 6b 3e 3e 6a 29 26 31 20 29 7b 0a 20  tMask>>j)&1 ){. 
19a10 20 20 20 20 20 20 20 64 69 73 61 62 6c 65 54 65         disableTe
19a20 72 6d 28 70 4c 65 76 65 6c 2c 20 70 4c 6f 6f 70  rm(pLevel, pLoop
19a30 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 29 3b 0a 20 20  ->aLTerm[j]);.  
19a40 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
19a50 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f  pLevel->op = OP_
19a60 56 4e 65 78 74 3b 0a 20 20 20 20 70 4c 65 76 65  VNext;.    pLeve
19a70 6c 2d 3e 70 31 20 3d 20 69 43 75 72 3b 0a 20 20  l->p1 = iCur;.  
19a80 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 73    pLevel->p2 = s
19a90 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
19aa0 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 73 71  tAddr(v);.    sq
19ab0 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
19ac0 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 69 52  Range(pParse, iR
19ad0 65 67 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b  eg, nConstraint+
19ae0 32 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  2);.    sqlite3E
19af0 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72  xprCachePop(pPar
19b00 73 65 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e  se);.  }else.#en
19b10 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
19b20 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20  IT_VIRTUALTABLE 
19b30 2a 2f 0a 0a 20 20 69 66 28 20 28 70 4c 6f 6f 70  */..  if( (pLoop
19b40 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
19b50 45 5f 49 50 4b 29 21 3d 30 0a 20 20 20 26 26 20  E_IPK)!=0.   && 
19b60 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  (pLoop->wsFlags 
19b70 26 20 28 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  & (WHERE_COLUMN_
19b80 49 4e 7c 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  IN|WHERE_COLUMN_
19b90 45 51 29 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20  EQ))!=0.  ){.   
19ba0 20 2f 2a 20 43 61 73 65 20 32 3a 20 20 57 65 20   /* Case 2:  We 
19bb0 63 61 6e 20 64 69 72 65 63 74 6c 79 20 72 65 66  can directly ref
19bc0 65 72 65 6e 63 65 20 61 20 73 69 6e 67 6c 65 20  erence a single 
19bd0 72 6f 77 20 75 73 69 6e 67 20 61 6e 0a 20 20 20  row using an.   
19be0 20 2a 2a 20 20 20 20 20 20 20 20 20 20 65 71 75   **          equ
19bf0 61 6c 69 74 79 20 63 6f 6d 70 61 72 69 73 6f 6e  ality comparison
19c00 20 61 67 61 69 6e 73 74 20 74 68 65 20 52 4f 57   against the ROW
19c10 49 44 20 66 69 65 6c 64 2e 20 20 4f 72 0a 20 20  ID field.  Or.  
19c20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 77 65    **          we
19c30 20 72 65 66 65 72 65 6e 63 65 20 6d 75 6c 74 69   reference multi
19c40 70 6c 65 20 72 6f 77 73 20 75 73 69 6e 67 20 61  ple rows using a
19c50 20 22 72 6f 77 69 64 20 49 4e 20 28 2e 2e 2e 29   "rowid IN (...)
19c60 22 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  ".    **        
19c70 20 20 63 6f 6e 73 74 72 75 63 74 2e 0a 20 20 20    construct..   
19c80 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
19c90 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e  pLoop->u.btree.n
19ca0 45 71 3d 3d 31 20 29 3b 0a 20 20 20 20 70 54 65  Eq==1 );.    pTe
19cb0 72 6d 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65  rm = pLoop->aLTe
19cc0 72 6d 5b 30 5d 3b 0a 20 20 20 20 61 73 73 65 72  rm[0];.    asser
19cd0 74 28 20 70 54 65 72 6d 21 3d 30 20 29 3b 0a 20  t( pTerm!=0 );. 
19ce0 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d     assert( pTerm
19cf0 2d 3e 70 45 78 70 72 21 3d 30 20 29 3b 0a 20 20  ->pExpr!=0 );.  
19d00 20 20 61 73 73 65 72 74 28 20 6f 6d 69 74 54 61    assert( omitTa
19d10 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 20 20 74 65  ble==0 );.    te
19d20 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 77  stcase( pTerm->w
19d30 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49  tFlags & TERM_VI
19d40 52 54 55 41 4c 20 29 3b 0a 20 20 20 20 69 52 65  RTUAL );.    iRe
19d50 6c 65 61 73 65 52 65 67 20 3d 20 2b 2b 70 50 61  leaseReg = ++pPa
19d60 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 69  rse->nMem;.    i
19d70 52 6f 77 69 64 52 65 67 20 3d 20 63 6f 64 65 45  RowidReg = codeE
19d80 71 75 61 6c 69 74 79 54 65 72 6d 28 70 50 61 72  qualityTerm(pPar
19d90 73 65 2c 20 70 54 65 72 6d 2c 20 70 4c 65 76 65  se, pTerm, pLeve
19da0 6c 2c 20 30 2c 20 62 52 65 76 2c 20 69 52 65 6c  l, 0, bRev, iRel
19db0 65 61 73 65 52 65 67 29 3b 0a 20 20 20 20 69 66  easeReg);.    if
19dc0 28 20 69 52 6f 77 69 64 52 65 67 21 3d 69 52 65  ( iRowidReg!=iRe
19dd0 6c 65 61 73 65 52 65 67 20 29 20 73 71 6c 69 74  leaseReg ) sqlit
19de0 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
19df0 28 70 50 61 72 73 65 2c 20 69 52 65 6c 65 61 73  (pParse, iReleas
19e00 65 52 65 67 29 3b 0a 20 20 20 20 61 64 64 72 4e  eReg);.    addrN
19e10 78 74 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64  xt = pLevel->add
19e20 72 4e 78 74 3b 0a 20 20 20 20 73 71 6c 69 74 65  rNxt;.    sqlite
19e30 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
19e40 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 69 52 6f  P_MustBeInt, iRo
19e50 77 69 64 52 65 67 2c 20 61 64 64 72 4e 78 74 29  widReg, addrNxt)
19e60 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
19e70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
19e80 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e  beAddOp3(v, OP_N
19e90 6f 74 45 78 69 73 74 73 2c 20 69 43 75 72 2c 20  otExists, iCur, 
19ea0 61 64 64 72 4e 78 74 2c 20 69 52 6f 77 69 64 52  addrNxt, iRowidR
19eb0 65 67 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76  eg);.    VdbeCov
19ec0 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71  erage(v);.    sq
19ed0 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66  lite3ExprCacheAf
19ee0 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61  finityChange(pPa
19ef0 72 73 65 2c 20 69 52 6f 77 69 64 52 65 67 2c 20  rse, iRowidReg, 
19f00 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  1);.    sqlite3E
19f10 78 70 72 43 61 63 68 65 53 74 6f 72 65 28 70 50  xprCacheStore(pP
19f20 61 72 73 65 2c 20 69 43 75 72 2c 20 2d 31 2c 20  arse, iCur, -1, 
19f30 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20  iRowidReg);.    
19f40 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
19f50 22 70 6b 22 29 29 3b 0a 20 20 20 20 70 4c 65 76  "pk"));.    pLev
19f60 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 6f 6f 70  el->op = OP_Noop
19f70 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70  ;.  }else if( (p
19f80 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
19f90 57 48 45 52 45 5f 49 50 4b 29 21 3d 30 0a 20 20  WHERE_IPK)!=0.  
19fa0 20 20 20 20 20 20 20 26 26 20 28 70 4c 6f 6f 70         && (pLoop
19fb0 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
19fc0 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 29 21  E_COLUMN_RANGE)!
19fd0 3d 30 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20 43  =0.  ){.    /* C
19fe0 61 73 65 20 33 3a 20 20 57 65 20 68 61 76 65 20  ase 3:  We have 
19ff0 61 6e 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f  an inequality co
1a000 6d 70 61 72 69 73 6f 6e 20 61 67 61 69 6e 73 74  mparison against
1a010 20 74 68 65 20 52 4f 57 49 44 20 66 69 65 6c 64   the ROWID field
1a020 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74  ..    */.    int
1a030 20 74 65 73 74 4f 70 20 3d 20 4f 50 5f 4e 6f 6f   testOp = OP_Noo
1a040 70 3b 0a 20 20 20 20 69 6e 74 20 73 74 61 72 74  p;.    int start
1a050 3b 0a 20 20 20 20 69 6e 74 20 6d 65 6d 45 6e 64  ;.    int memEnd
1a060 56 61 6c 75 65 20 3d 20 30 3b 0a 20 20 20 20 57  Value = 0;.    W
1a070 68 65 72 65 54 65 72 6d 20 2a 70 53 74 61 72 74  hereTerm *pStart
1a080 2c 20 2a 70 45 6e 64 3b 0a 0a 20 20 20 20 61 73  , *pEnd;..    as
1a090 73 65 72 74 28 20 6f 6d 69 74 54 61 62 6c 65 3d  sert( omitTable=
1a0a0 3d 30 20 29 3b 0a 20 20 20 20 6a 20 3d 20 30 3b  =0 );.    j = 0;
1a0b0 0a 20 20 20 20 70 53 74 61 72 74 20 3d 20 70 45  .    pStart = pE
1a0c0 6e 64 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  nd = 0;.    if( 
1a0d0 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
1a0e0 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54   WHERE_BTM_LIMIT
1a0f0 20 29 20 70 53 74 61 72 74 20 3d 20 70 4c 6f 6f   ) pStart = pLoo
1a100 70 2d 3e 61 4c 54 65 72 6d 5b 6a 2b 2b 5d 3b 0a  p->aLTerm[j++];.
1a110 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77      if( pLoop->w
1a120 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54  sFlags & WHERE_T
1a130 4f 50 5f 4c 49 4d 49 54 20 29 20 70 45 6e 64 20  OP_LIMIT ) pEnd 
1a140 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b  = pLoop->aLTerm[
1a150 6a 2b 2b 5d 3b 0a 20 20 20 20 61 73 73 65 72 74  j++];.    assert
1a160 28 20 70 53 74 61 72 74 21 3d 30 20 7c 7c 20 70  ( pStart!=0 || p
1a170 45 6e 64 21 3d 30 20 29 3b 0a 20 20 20 20 69 66  End!=0 );.    if
1a180 28 20 62 52 65 76 20 29 7b 0a 20 20 20 20 20 20  ( bRev ){.      
1a190 70 54 65 72 6d 20 3d 20 70 53 74 61 72 74 3b 0a  pTerm = pStart;.
1a1a0 20 20 20 20 20 20 70 53 74 61 72 74 20 3d 20 70        pStart = p
1a1b0 45 6e 64 3b 0a 20 20 20 20 20 20 70 45 6e 64 20  End;.      pEnd 
1a1c0 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 7d 0a 20  = pTerm;.    }. 
1a1d0 20 20 20 69 66 28 20 70 53 74 61 72 74 20 29 7b     if( pStart ){
1a1e0 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 58 3b  .      Expr *pX;
1a1f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a200 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74  The expression t
1a210 68 61 74 20 64 65 66 69 6e 65 73 20 74 68 65 20  hat defines the 
1a220 73 74 61 72 74 20 62 6f 75 6e 64 20 2a 2f 0a 20  start bound */. 
1a230 20 20 20 20 20 69 6e 74 20 72 31 2c 20 72 54 65       int r1, rTe
1a240 6d 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 52 65  mp;        /* Re
1a250 67 69 73 74 65 72 73 20 66 6f 72 20 68 6f 6c 64  gisters for hold
1a260 69 6e 67 20 74 68 65 20 73 74 61 72 74 20 62 6f  ing the start bo
1a270 75 6e 64 61 72 79 20 2a 2f 0a 0a 20 20 20 20 20  undary */..     
1a280 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   /* The followin
1a290 67 20 63 6f 6e 73 74 61 6e 74 20 6d 61 70 73 20  g constant maps 
1a2a0 54 4b 5f 78 78 20 63 6f 64 65 73 20 69 6e 74 6f  TK_xx codes into
1a2b0 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 0a   corresponding .
1a2c0 20 20 20 20 20 20 2a 2a 20 73 65 65 6b 20 6f 70        ** seek op
1a2d0 63 6f 64 65 73 2e 20 20 49 74 20 64 65 70 65 6e  codes.  It depen
1a2e0 64 73 20 6f 6e 20 61 20 70 61 72 74 69 63 75 6c  ds on a particul
1a2f0 61 72 20 6f 72 64 65 72 69 6e 67 20 6f 66 20 54  ar ordering of T
1a300 4b 5f 78 78 0a 20 20 20 20 20 20 2a 2f 0a 20 20  K_xx.      */.  
1a310 20 20 20 20 63 6f 6e 73 74 20 75 38 20 61 4d 6f      const u8 aMo
1a320 76 65 4f 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  veOp[] = {.     
1a330 20 20 20 20 20 20 2f 2a 20 54 4b 5f 47 54 20 2a        /* TK_GT *
1a340 2f 20 20 4f 50 5f 53 65 65 6b 47 54 2c 0a 20 20  /  OP_SeekGT,.  
1a350 20 20 20 20 20 20 20 20 20 2f 2a 20 54 4b 5f 4c           /* TK_L
1a360 45 20 2a 2f 20 20 4f 50 5f 53 65 65 6b 4c 45 2c  E */  OP_SeekLE,
1a370 0a 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  .           /* T
1a380 4b 5f 4c 54 20 2a 2f 20 20 4f 50 5f 53 65 65 6b  K_LT */  OP_Seek
1a390 4c 54 2c 0a 20 20 20 20 20 20 20 20 20 20 20 2f  LT,.           /
1a3a0 2a 20 54 4b 5f 47 45 20 2a 2f 20 20 4f 50 5f 53  * TK_GE */  OP_S
1a3b0 65 65 6b 47 45 0a 20 20 20 20 20 20 7d 3b 0a 20  eekGE.      };. 
1a3c0 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
1a3d0 4c 45 3d 3d 54 4b 5f 47 54 2b 31 20 29 3b 20 20  LE==TK_GT+1 );  
1a3e0 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65      /* Make sure
1a3f0 20 74 68 65 20 6f 72 64 65 72 69 6e 67 2e 2e 20   the ordering.. 
1a400 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
1a410 20 54 4b 5f 4c 54 3d 3d 54 4b 5f 47 54 2b 32 20   TK_LT==TK_GT+2 
1a420 29 3b 20 20 20 20 20 20 2f 2a 20 20 2e 2e 2e 20  );      /*  ... 
1a430 6f 66 20 74 68 65 20 54 4b 5f 78 78 20 76 61 6c  of the TK_xx val
1a440 75 65 73 2e 2e 2e 20 2a 2f 0a 20 20 20 20 20 20  ues... */.      
1a450 61 73 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d 54  assert( TK_GE==T
1a460 4b 5f 47 54 2b 33 20 29 3b 20 20 20 20 20 20 2f  K_GT+3 );      /
1a470 2a 20 20 2e 2e 2e 20 69 73 20 63 6f 72 72 65 63  *  ... is correc
1a480 63 74 2e 20 2a 2f 0a 0a 20 20 20 20 20 20 61 73  ct. */..      as
1a490 73 65 72 74 28 20 28 70 53 74 61 72 74 2d 3e 77  sert( (pStart->w
1a4a0 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e  tFlags & TERM_VN
1a4b0 55 4c 4c 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ULL)==0 );.     
1a4c0 20 74 65 73 74 63 61 73 65 28 20 70 53 74 61 72   testcase( pStar
1a4d0 74 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  t->wtFlags & TER
1a4e0 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20 20 20  M_VIRTUAL );.   
1a4f0 20 20 20 70 58 20 3d 20 70 53 74 61 72 74 2d 3e     pX = pStart->
1a500 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73  pExpr;.      ass
1a510 65 72 74 28 20 70 58 21 3d 30 20 29 3b 0a 20 20  ert( pX!=0 );.  
1a520 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 53      testcase( pS
1a530 74 61 72 74 2d 3e 6c 65 66 74 43 75 72 73 6f 72  tart->leftCursor
1a540 21 3d 69 43 75 72 20 29 3b 20 2f 2a 20 74 72 61  !=iCur ); /* tra
1a550 6e 73 69 74 69 76 65 20 63 6f 6e 73 74 72 61 69  nsitive constrai
1a560 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 72 31 20  nts */.      r1 
1a570 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
1a580 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 58  eTemp(pParse, pX
1a590 2d 3e 70 52 69 67 68 74 2c 20 26 72 54 65 6d 70  ->pRight, &rTemp
1a5a0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1a5b0 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 61 4d  VdbeAddOp3(v, aM
1a5c0 6f 76 65 4f 70 5b 70 58 2d 3e 6f 70 2d 54 4b 5f  oveOp[pX->op-TK_
1a5d0 47 54 5d 2c 20 69 43 75 72 2c 20 61 64 64 72 42  GT], iCur, addrB
1a5e0 72 6b 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 56  rk, r1);.      V
1a5f0 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
1a600 70 6b 22 29 29 3b 0a 20 20 20 20 20 20 56 64 62  pk"));.      Vdb
1a610 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 70  eCoverageIf(v, p
1a620 58 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 29 3b 0a 20  X->op==TK_GT);. 
1a630 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
1a640 65 49 66 28 76 2c 20 70 58 2d 3e 6f 70 3d 3d 54  eIf(v, pX->op==T
1a650 4b 5f 4c 45 29 3b 0a 20 20 20 20 20 20 56 64 62  K_LE);.      Vdb
1a660 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 70  eCoverageIf(v, p
1a670 58 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54 29 3b 0a 20  X->op==TK_LT);. 
1a680 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
1a690 65 49 66 28 76 2c 20 70 58 2d 3e 6f 70 3d 3d 54  eIf(v, pX->op==T
1a6a0 4b 5f 47 45 29 3b 0a 20 20 20 20 20 20 73 71 6c  K_GE);.      sql
1a6b0 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66  ite3ExprCacheAff
1a6c0 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72  inityChange(pPar
1a6d0 73 65 2c 20 72 31 2c 20 31 29 3b 0a 20 20 20 20  se, r1, 1);.    
1a6e0 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
1a6f0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
1a700 72 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 64 69  rTemp);.      di
1a710 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c  sableTerm(pLevel
1a720 2c 20 70 53 74 61 72 74 29 3b 0a 20 20 20 20 7d  , pStart);.    }
1a730 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
1a740 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1a750 20 62 52 65 76 20 3f 20 4f 50 5f 4c 61 73 74 20   bRev ? OP_Last 
1a760 3a 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 43 75  : OP_Rewind, iCu
1a770 72 2c 20 61 64 64 72 42 72 6b 29 3b 0a 20 20 20  r, addrBrk);.   
1a780 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
1a790 66 28 76 2c 20 62 52 65 76 3d 3d 30 29 3b 0a 20  f(v, bRev==0);. 
1a7a0 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
1a7b0 65 49 66 28 76 2c 20 62 52 65 76 21 3d 30 29 3b  eIf(v, bRev!=0);
1a7c0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
1a7d0 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 45 78 70  End ){.      Exp
1a7e0 72 20 2a 70 58 3b 0a 20 20 20 20 20 20 70 58 20  r *pX;.      pX 
1a7f0 3d 20 70 45 6e 64 2d 3e 70 45 78 70 72 3b 0a 20  = pEnd->pExpr;. 
1a800 20 20 20 20 20 61 73 73 65 72 74 28 20 70 58 21       assert( pX!
1a810 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  =0 );.      asse
1a820 72 74 28 20 28 70 45 6e 64 2d 3e 77 74 46 6c 61  rt( (pEnd->wtFla
1a830 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29  gs & TERM_VNULL)
1a840 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ==0 );.      tes
1a850 74 63 61 73 65 28 20 70 45 6e 64 2d 3e 6c 65 66  tcase( pEnd->lef
1a860 74 43 75 72 73 6f 72 21 3d 69 43 75 72 20 29 3b  tCursor!=iCur );
1a870 20 2f 2a 20 54 72 61 6e 73 69 74 69 76 65 20 63   /* Transitive c
1a880 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20  onstraints */.  
1a890 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
1a8a0 6e 64 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  nd->wtFlags & TE
1a8b0 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20 20  RM_VIRTUAL );.  
1a8c0 20 20 20 20 6d 65 6d 45 6e 64 56 61 6c 75 65 20      memEndValue 
1a8d0 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
1a8e0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1a8f0 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
1a900 70 58 2d 3e 70 52 69 67 68 74 2c 20 6d 65 6d 45  pX->pRight, memE
1a910 6e 64 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20  ndValue);.      
1a920 69 66 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 4c  if( pX->op==TK_L
1a930 54 20 7c 7c 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f  T || pX->op==TK_
1a940 47 54 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65  GT ){.        te
1a950 73 74 4f 70 20 3d 20 62 52 65 76 20 3f 20 4f 50  stOp = bRev ? OP
1a960 5f 4c 65 20 3a 20 4f 50 5f 47 65 3b 0a 20 20 20  _Le : OP_Ge;.   
1a970 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1a980 20 20 74 65 73 74 4f 70 20 3d 20 62 52 65 76 20    testOp = bRev 
1a990 3f 20 4f 50 5f 4c 74 20 3a 20 4f 50 5f 47 74 3b  ? OP_Lt : OP_Gt;
1a9a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64  .      }.      d
1a9b0 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65  isableTerm(pLeve
1a9c0 6c 2c 20 70 45 6e 64 29 3b 0a 20 20 20 20 7d 0a  l, pEnd);.    }.
1a9d0 20 20 20 20 73 74 61 72 74 20 3d 20 73 71 6c 69      start = sqli
1a9e0 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
1a9f0 64 72 28 76 29 3b 0a 20 20 20 20 70 4c 65 76 65  dr(v);.    pLeve
1aa00 6c 2d 3e 6f 70 20 3d 20 62 52 65 76 20 3f 20 4f  l->op = bRev ? O
1aa10 50 5f 50 72 65 76 20 3a 20 4f 50 5f 4e 65 78 74  P_Prev : OP_Next
1aa20 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31  ;.    pLevel->p1
1aa30 20 3d 20 69 43 75 72 3b 0a 20 20 20 20 70 4c 65   = iCur;.    pLe
1aa40 76 65 6c 2d 3e 70 32 20 3d 20 73 74 61 72 74 3b  vel->p2 = start;
1aa50 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 65  .    assert( pLe
1aa60 76 65 6c 2d 3e 70 35 3d 3d 30 20 29 3b 0a 20 20  vel->p5==0 );.  
1aa70 20 20 69 66 28 20 74 65 73 74 4f 70 21 3d 4f 50    if( testOp!=OP
1aa80 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20 69  _Noop ){.      i
1aa90 52 6f 77 69 64 52 65 67 20 3d 20 2b 2b 70 50 61  RowidReg = ++pPa
1aaa0 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
1aab0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1aac0 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20  p2(v, OP_Rowid, 
1aad0 69 43 75 72 2c 20 69 52 6f 77 69 64 52 65 67 29  iCur, iRowidReg)
1aae0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1aaf0 78 70 72 43 61 63 68 65 53 74 6f 72 65 28 70 50  xprCacheStore(pP
1ab00 61 72 73 65 2c 20 69 43 75 72 2c 20 2d 31 2c 20  arse, iCur, -1, 
1ab10 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20  iRowidReg);.    
1ab20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1ab30 4f 70 33 28 76 2c 20 74 65 73 74 4f 70 2c 20 6d  Op3(v, testOp, m
1ab40 65 6d 45 6e 64 56 61 6c 75 65 2c 20 61 64 64 72  emEndValue, addr
1ab50 42 72 6b 2c 20 69 52 6f 77 69 64 52 65 67 29 3b  Brk, iRowidReg);
1ab60 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
1ab70 61 67 65 49 66 28 76 2c 20 74 65 73 74 4f 70 3d  ageIf(v, testOp=
1ab80 3d 4f 50 5f 4c 65 29 3b 0a 20 20 20 20 20 20 56  =OP_Le);.      V
1ab90 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
1aba0 20 74 65 73 74 4f 70 3d 3d 4f 50 5f 4c 74 29 3b   testOp==OP_Lt);
1abb0 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
1abc0 61 67 65 49 66 28 76 2c 20 74 65 73 74 4f 70 3d  ageIf(v, testOp=
1abd0 3d 4f 50 5f 47 65 29 3b 0a 20 20 20 20 20 20 56  =OP_Ge);.      V
1abe0 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
1abf0 20 74 65 73 74 4f 70 3d 3d 4f 50 5f 47 74 29 3b   testOp==OP_Gt);
1ac00 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1ac10 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 53 51  beChangeP5(v, SQ
1ac20 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
1ac30 20 7c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46   | SQLITE_JUMPIF
1ac40 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  NULL);.    }.  }
1ac50 65 6c 73 65 20 69 66 28 20 70 4c 6f 6f 70 2d 3e  else if( pLoop->
1ac60 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
1ac70 49 4e 44 45 58 45 44 20 29 7b 0a 20 20 20 20 2f  INDEXED ){.    /
1ac80 2a 20 43 61 73 65 20 34 3a 20 41 20 73 63 61 6e  * Case 4: A scan
1ac90 20 75 73 69 6e 67 20 61 6e 20 69 6e 64 65 78 2e   using an index.
1aca0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
1acb0 20 20 20 20 20 20 20 54 68 65 20 57 48 45 52 45         The WHERE
1acc0 20 63 6c 61 75 73 65 20 6d 61 79 20 63 6f 6e 74   clause may cont
1acd0 61 69 6e 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65  ain zero or more
1ace0 20 65 71 75 61 6c 69 74 79 20 0a 20 20 20 20 2a   equality .    *
1acf0 2a 20 20 20 20 20 20 20 20 20 74 65 72 6d 73 20  *         terms 
1ad00 28 22 3d 3d 22 20 6f 72 20 22 49 4e 22 20 6f 70  ("==" or "IN" op
1ad10 65 72 61 74 6f 72 73 29 20 74 68 61 74 20 72 65  erators) that re
1ad20 66 65 72 20 74 6f 20 74 68 65 20 4e 0a 20 20 20  fer to the N.   
1ad30 20 2a 2a 20 20 20 20 20 20 20 20 20 6c 65 66 74   **         left
1ad40 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 73 20 6f 66  -most columns of
1ad50 20 74 68 65 20 69 6e 64 65 78 2e 20 49 74 20 6d   the index. It m
1ad60 61 79 20 61 6c 73 6f 20 63 6f 6e 74 61 69 6e 0a  ay also contain.
1ad70 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 69      **         i
1ad80 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72  nequality constr
1ad90 61 69 6e 74 73 20 28 3e 2c 20 3c 2c 20 3e 3d 20  aints (>, <, >= 
1ada0 6f 72 20 3c 3d 29 20 6f 6e 20 74 68 65 20 69 6e  or <=) on the in
1adb0 64 65 78 65 64 0a 20 20 20 20 2a 2a 20 20 20 20  dexed.    **    
1adc0 20 20 20 20 20 63 6f 6c 75 6d 6e 20 74 68 61 74       column that
1add0 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c   immediately fol
1ade0 6c 6f 77 73 20 74 68 65 20 4e 20 65 71 75 61 6c  lows the N equal
1adf0 69 74 69 65 73 2e 20 4f 6e 6c 79 20 0a 20 20 20  ities. Only .   
1ae00 20 2a 2a 20 20 20 20 20 20 20 20 20 74 68 65 20   **         the 
1ae10 72 69 67 68 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d  right-most colum
1ae20 6e 20 63 61 6e 20 62 65 20 61 6e 20 69 6e 65 71  n can be an ineq
1ae30 75 61 6c 69 74 79 20 2d 20 74 68 65 20 72 65 73  uality - the res
1ae40 74 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20 20 20  t must.    **   
1ae50 20 20 20 20 20 20 75 73 65 20 74 68 65 20 22 3d        use the "=
1ae60 3d 22 20 61 6e 64 20 22 49 4e 22 20 6f 70 65 72  =" and "IN" oper
1ae70 61 74 6f 72 73 2e 20 46 6f 72 20 65 78 61 6d 70  ators. For examp
1ae80 6c 65 2c 20 69 66 20 74 68 65 20 0a 20 20 20 20  le, if the .    
1ae90 2a 2a 20 20 20 20 20 20 20 20 20 69 6e 64 65 78  **         index
1aea0 20 69 73 20 6f 6e 20 28 78 2c 79 2c 7a 29 2c 20   is on (x,y,z), 
1aeb0 74 68 65 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69  then the followi
1aec0 6e 67 20 63 6c 61 75 73 65 73 20 61 72 65 20 61  ng clauses are a
1aed0 6c 6c 20 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  ll .    **      
1aee0 20 20 20 6f 70 74 69 6d 69 7a 65 64 3a 0a 20 20     optimized:.  
1aef0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20    **.    **     
1af00 20 20 20 20 20 20 20 78 3d 35 0a 20 20 20 20 2a         x=5.    *
1af10 2a 20 20 20 20 20 20 20 20 20 20 20 20 78 3d 35  *            x=5
1af20 20 41 4e 44 20 79 3d 31 30 0a 20 20 20 20 2a 2a   AND y=10.    **
1af30 20 20 20 20 20 20 20 20 20 20 20 20 78 3d 35 20              x=5 
1af40 41 4e 44 20 79 3c 31 30 0a 20 20 20 20 2a 2a 20  AND y<10.    ** 
1af50 20 20 20 20 20 20 20 20 20 20 20 78 3d 35 20 41             x=5 A
1af60 4e 44 20 79 3e 35 20 41 4e 44 20 79 3c 31 30 0a  ND y>5 AND y<10.
1af70 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
1af80 20 20 78 3d 35 20 41 4e 44 20 79 3d 35 20 41 4e    x=5 AND y=5 AN
1af90 44 20 7a 3c 3d 31 30 0a 20 20 20 20 2a 2a 0a 20  D z<=10.    **. 
1afa0 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 54 68     **         Th
1afb0 65 20 7a 3c 31 30 20 74 65 72 6d 20 6f 66 20 74  e z<10 term of t
1afc0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61 6e  he following can
1afd0 6e 6f 74 20 62 65 20 75 73 65 64 2c 20 6f 6e 6c  not be used, onl
1afe0 79 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  y.    **        
1aff0 20 74 68 65 20 78 3d 35 20 74 65 72 6d 3a 0a 20   the x=5 term:. 
1b000 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
1b010 20 20 20 20 20 20 20 20 78 3d 35 20 41 4e 44 20          x=5 AND 
1b020 7a 3c 31 30 0a 20 20 20 20 2a 2a 0a 20 20 20 20  z<10.    **.    
1b030 2a 2a 20 20 20 20 20 20 20 20 20 4e 20 6d 61 79  **         N may
1b040 20 62 65 20 7a 65 72 6f 20 69 66 20 74 68 65 72   be zero if ther
1b050 65 20 61 72 65 20 69 6e 65 71 75 61 6c 69 74 79  e are inequality
1b060 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 0a 20 20   constraints..  
1b070 20 20 2a 2a 20 20 20 20 20 20 20 20 20 49 66 20    **         If 
1b080 74 68 65 72 65 20 61 72 65 20 6e 6f 20 69 6e 65  there are no ine
1b090 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
1b0a0 6e 74 73 2c 20 74 68 65 6e 20 4e 20 69 73 20 61  nts, then N is a
1b0b0 74 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  t.    **        
1b0c0 20 6c 65 61 73 74 20 6f 6e 65 2e 0a 20 20 20 20   least one..    
1b0d0 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  **.    **       
1b0e0 20 20 54 68 69 73 20 63 61 73 65 20 69 73 20 61    This case is a
1b0f0 6c 73 6f 20 75 73 65 64 20 77 68 65 6e 20 74 68  lso used when th
1b100 65 72 65 20 61 72 65 20 6e 6f 20 57 48 45 52 45  ere are no WHERE
1b110 20 63 6c 61 75 73 65 0a 20 20 20 20 2a 2a 20 20   clause.    **  
1b120 20 20 20 20 20 20 20 63 6f 6e 73 74 72 61 69 6e         constrain
1b130 74 73 20 62 75 74 20 61 6e 20 69 6e 64 65 78 20  ts but an index 
1b140 69 73 20 73 65 6c 65 63 74 65 64 20 61 6e 79 77  is selected anyw
1b150 61 79 2c 20 69 6e 20 6f 72 64 65 72 0a 20 20 20  ay, in order.   
1b160 20 2a 2a 20 20 20 20 20 20 20 20 20 74 6f 20 66   **         to f
1b170 6f 72 63 65 20 74 68 65 20 6f 75 74 70 75 74 20  orce the output 
1b180 6f 72 64 65 72 20 74 6f 20 63 6f 6e 66 6f 72 6d  order to conform
1b190 20 74 6f 20 61 6e 20 4f 52 44 45 52 20 42 59 2e   to an ORDER BY.
1b1a0 0a 20 20 20 20 2a 2f 20 20 0a 20 20 20 20 73 74  .    */  .    st
1b1b0 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61 53  atic const u8 aS
1b1c0 74 61 72 74 4f 70 5b 5d 20 3d 20 7b 0a 20 20 20  tartOp[] = {.   
1b1d0 20 20 20 30 2c 0a 20 20 20 20 20 20 30 2c 0a 20     0,.      0,. 
1b1e0 20 20 20 20 20 4f 50 5f 52 65 77 69 6e 64 2c 20       OP_Rewind, 
1b1f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 32 3a 20            /* 2: 
1b200 28 21 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69  (!start_constrai
1b210 6e 74 73 20 26 26 20 73 74 61 72 74 45 71 20 26  nts && startEq &
1b220 26 20 20 21 62 52 65 76 29 20 2a 2f 0a 20 20 20  &  !bRev) */.   
1b230 20 20 20 4f 50 5f 4c 61 73 74 2c 20 20 20 20 20     OP_Last,     
1b240 20 20 20 20 20 20 20 20 2f 2a 20 33 3a 20 28 21          /* 3: (!
1b250 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74  start_constraint
1b260 73 20 26 26 20 73 74 61 72 74 45 71 20 26 26 20  s && startEq && 
1b270 20 20 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20    bRev) */.     
1b280 20 4f 50 5f 53 65 65 6b 47 54 2c 20 20 20 20 20   OP_SeekGT,     
1b290 20 20 20 20 20 20 2f 2a 20 34 3a 20 28 73 74 61        /* 4: (sta
1b2a0 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 20  rt_constraints  
1b2b0 26 26 20 21 73 74 61 72 74 45 71 20 26 26 20 21  && !startEq && !
1b2c0 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f  bRev) */.      O
1b2d0 50 5f 53 65 65 6b 4c 54 2c 20 20 20 20 20 20 20  P_SeekLT,       
1b2e0 20 20 20 20 2f 2a 20 35 3a 20 28 73 74 61 72 74      /* 5: (start
1b2f0 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 20 26 26  _constraints  &&
1b300 20 21 73 74 61 72 74 45 71 20 26 26 20 20 62 52   !startEq &&  bR
1b310 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f  ev) */.      OP_
1b320 53 65 65 6b 47 45 2c 20 20 20 20 20 20 20 20 20  SeekGE,         
1b330 20 20 2f 2a 20 36 3a 20 28 73 74 61 72 74 5f 63    /* 6: (start_c
1b340 6f 6e 73 74 72 61 69 6e 74 73 20 20 26 26 20 20  onstraints  &&  
1b350 73 74 61 72 74 45 71 20 26 26 20 21 62 52 65 76  startEq && !bRev
1b360 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 53 65  ) */.      OP_Se
1b370 65 6b 4c 45 20 20 20 20 20 20 20 20 20 20 20 20  ekLE            
1b380 2f 2a 20 37 3a 20 28 73 74 61 72 74 5f 63 6f 6e  /* 7: (start_con
1b390 73 74 72 61 69 6e 74 73 20 20 26 26 20 20 73 74  straints  &&  st
1b3a0 61 72 74 45 71 20 26 26 20 20 62 52 65 76 29 20  artEq &&  bRev) 
1b3b0 2a 2f 0a 20 20 20 20 7d 3b 0a 20 20 20 20 73 74  */.    };.    st
1b3c0 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61 45  atic const u8 aE
1b3d0 6e 64 4f 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  ndOp[] = {.     
1b3e0 20 4f 50 5f 49 64 78 47 45 2c 20 20 20 20 20 20   OP_IdxGE,      
1b3f0 20 20 20 20 20 20 2f 2a 20 30 3a 20 28 65 6e 64        /* 0: (end
1b400 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 26 26 20  _constraints && 
1b410 21 62 52 65 76 20 26 26 20 21 65 6e 64 45 71 29  !bRev && !endEq)
1b420 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 49 64 78   */.      OP_Idx
1b430 47 54 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  GT,            /
1b440 2a 20 31 3a 20 28 65 6e 64 5f 63 6f 6e 73 74 72  * 1: (end_constr
1b450 61 69 6e 74 73 20 26 26 20 21 62 52 65 76 20 26  aints && !bRev &
1b460 26 20 20 65 6e 64 45 71 29 20 2a 2f 0a 20 20 20  &  endEq) */.   
1b470 20 20 20 4f 50 5f 49 64 78 4c 45 2c 20 20 20 20     OP_IdxLE,    
1b480 20 20 20 20 20 20 20 20 2f 2a 20 32 3a 20 28 65          /* 2: (e
1b490 6e 64 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 26  nd_constraints &
1b4a0 26 20 20 62 52 65 76 20 26 26 20 21 65 6e 64 45  &  bRev && !endE
1b4b0 71 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 49  q) */.      OP_I
1b4c0 64 78 4c 54 2c 20 20 20 20 20 20 20 20 20 20 20  dxLT,           
1b4d0 20 2f 2a 20 33 3a 20 28 65 6e 64 5f 63 6f 6e 73   /* 3: (end_cons
1b4e0 74 72 61 69 6e 74 73 20 26 26 20 20 62 52 65 76  traints &&  bRev
1b4f0 20 26 26 20 20 65 6e 64 45 71 29 20 2a 2f 0a 20   &&  endEq) */. 
1b500 20 20 20 7d 3b 0a 20 20 20 20 75 31 36 20 6e 45     };.    u16 nE
1b510 71 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72  q = pLoop->u.btr
1b520 65 65 2e 6e 45 71 3b 20 20 20 20 20 2f 2a 20 4e  ee.nEq;     /* N
1b530 75 6d 62 65 72 20 6f 66 20 3d 3d 20 6f 72 20 49  umber of == or I
1b540 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 69  N terms */.    i
1b550 6e 74 20 72 65 67 42 61 73 65 3b 20 20 20 20 20  nt regBase;     
1b560 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
1b570 61 73 65 20 72 65 67 69 73 74 65 72 20 68 6f 6c  ase register hol
1b580 64 69 6e 67 20 63 6f 6e 73 74 72 61 69 6e 74 20  ding constraint 
1b590 76 61 6c 75 65 73 20 2a 2f 0a 20 20 20 20 57 68  values */.    Wh
1b5a0 65 72 65 54 65 72 6d 20 2a 70 52 61 6e 67 65 53  ereTerm *pRangeS
1b5b0 74 61 72 74 20 3d 20 30 3b 20 20 2f 2a 20 49 6e  tart = 0;  /* In
1b5c0 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
1b5d0 69 6e 74 20 61 74 20 72 61 6e 67 65 20 73 74 61  int at range sta
1b5e0 72 74 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 54  rt */.    WhereT
1b5f0 65 72 6d 20 2a 70 52 61 6e 67 65 45 6e 64 20 3d  erm *pRangeEnd =
1b600 20 30 3b 20 20 20 20 2f 2a 20 49 6e 65 71 75 61   0;    /* Inequa
1b610 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20  lity constraint 
1b620 61 74 20 72 61 6e 67 65 20 65 6e 64 20 2a 2f 0a  at range end */.
1b630 20 20 20 20 69 6e 74 20 73 74 61 72 74 45 71 3b      int startEq;
1b640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b650 20 2f 2a 20 54 72 75 65 20 69 66 20 72 61 6e 67   /* True if rang
1b660 65 20 73 74 61 72 74 20 75 73 65 73 20 3d 3d 2c  e start uses ==,
1b670 20 3e 3d 20 6f 72 20 3c 3d 20 2a 2f 0a 20 20 20   >= or <= */.   
1b680 20 69 6e 74 20 65 6e 64 45 71 3b 20 20 20 20 20   int endEq;     
1b690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b6a0 20 54 72 75 65 20 69 66 20 72 61 6e 67 65 20 65   True if range e
1b6b0 6e 64 20 75 73 65 73 20 3d 3d 2c 20 3e 3d 20 6f  nd uses ==, >= o
1b6c0 72 20 3c 3d 20 2a 2f 0a 20 20 20 20 69 6e 74 20  r <= */.    int 
1b6d0 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74  start_constraint
1b6e0 73 3b 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72  s;       /* Star
1b6f0 74 20 6f 66 20 72 61 6e 67 65 20 69 73 20 63 6f  t of range is co
1b700 6e 73 74 72 61 69 6e 65 64 20 2a 2f 0a 20 20 20  nstrained */.   
1b710 20 69 6e 74 20 6e 43 6f 6e 73 74 72 61 69 6e 74   int nConstraint
1b720 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1b730 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6e 73 74   Number of const
1b740 72 61 69 6e 74 20 74 65 72 6d 73 20 2a 2f 0a 20  raint terms */. 
1b750 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20     Index *pIdx; 
1b760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b770 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 77 65 20  /* The index we 
1b780 77 69 6c 6c 20 62 65 20 75 73 69 6e 67 20 2a 2f  will be using */
1b790 0a 20 20 20 20 69 6e 74 20 69 49 64 78 43 75 72  .    int iIdxCur
1b7a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1b7b0 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 63 75    /* The VDBE cu
1b7c0 72 73 6f 72 20 66 6f 72 20 74 68 65 20 69 6e 64  rsor for the ind
1b7d0 65 78 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 45  ex */.    int nE
1b7e0 78 74 72 61 52 65 67 20 3d 20 30 3b 20 20 20 20  xtraReg = 0;    
1b7f0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1b800 20 6f 66 20 65 78 74 72 61 20 72 65 67 69 73 74   of extra regist
1b810 65 72 73 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20  ers needed */.  
1b820 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20    int op;       
1b830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1b840 2a 20 49 6e 73 74 72 75 63 74 69 6f 6e 20 6f 70  * Instruction op
1b850 63 6f 64 65 20 2a 2f 0a 20 20 20 20 63 68 61 72  code */.    char
1b860 20 2a 7a 53 74 61 72 74 41 66 66 3b 20 20 20 20   *zStartAff;    
1b870 20 20 20 20 20 20 20 20 20 2f 2a 20 41 66 66 69           /* Affi
1b880 6e 69 74 79 20 66 6f 72 20 73 74 61 72 74 20 6f  nity for start o
1b890 66 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69  f range constrai
1b8a0 6e 74 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 63  nt */.    char c
1b8b0 45 6e 64 41 66 66 20 3d 20 30 3b 20 20 20 20 20  EndAff = 0;     
1b8c0 20 20 20 20 20 20 20 2f 2a 20 41 66 66 69 6e 69         /* Affini
1b8d0 74 79 20 66 6f 72 20 65 6e 64 20 6f 66 20 72 61  ty for end of ra
1b8e0 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a  nge constraint *
1b8f0 2f 0a 20 20 20 20 75 38 20 62 53 65 65 6b 50 61  /.    u8 bSeekPa
1b900 73 74 4e 75 6c 6c 20 3d 20 30 3b 20 20 20 20 20  stNull = 0;     
1b910 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 73 65     /* True to se
1b920 65 6b 20 70 61 73 74 20 69 6e 69 74 69 61 6c 20  ek past initial 
1b930 6e 75 6c 6c 73 20 2a 2f 0a 20 20 20 20 75 38 20  nulls */.    u8 
1b940 62 53 74 6f 70 41 74 4e 75 6c 6c 20 3d 20 30 3b  bStopAtNull = 0;
1b950 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
1b960 20 63 6f 6e 64 69 74 69 6f 6e 20 74 6f 20 74 65   condition to te
1b970 72 6d 69 6e 61 74 65 20 61 74 20 4e 55 4c 4c 73  rminate at NULLs
1b980 20 2a 2f 0a 0a 20 20 20 20 70 49 64 78 20 3d 20   */..    pIdx = 
1b990 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70  pLoop->u.btree.p
1b9a0 49 6e 64 65 78 3b 0a 20 20 20 20 69 49 64 78 43  Index;.    iIdxC
1b9b0 75 72 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64  ur = pLevel->iId
1b9c0 78 43 75 72 3b 0a 20 20 20 20 61 73 73 65 72 74  xCur;.    assert
1b9d0 28 20 6e 45 71 3e 3d 70 4c 6f 6f 70 2d 3e 75 2e  ( nEq>=pLoop->u.
1b9e0 62 74 72 65 65 2e 6e 53 6b 69 70 20 29 3b 0a 0a  btree.nSkip );..
1b9f0 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 6c      /* If this l
1ba00 6f 6f 70 20 73 61 74 69 73 66 69 65 73 20 61 20  oop satisfies a 
1ba10 73 6f 72 74 20 6f 72 64 65 72 20 28 70 4f 72 64  sort order (pOrd
1ba20 65 72 42 79 29 20 72 65 71 75 65 73 74 20 74 68  erBy) request th
1ba30 61 74 20 0a 20 20 20 20 2a 2a 20 77 61 73 20 70  at .    ** was p
1ba40 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 66 75  assed to this fu
1ba50 6e 63 74 69 6f 6e 20 74 6f 20 69 6d 70 6c 65 6d  nction to implem
1ba60 65 6e 74 20 61 20 22 53 45 4c 45 43 54 20 6d 69  ent a "SELECT mi
1ba70 6e 28 78 29 20 2e 2e 2e 22 20 0a 20 20 20 20 2a  n(x) ..." .    *
1ba80 2a 20 71 75 65 72 79 2c 20 74 68 65 6e 20 74 68  * query, then th
1ba90 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6f 6e  e caller will on
1baa0 6c 79 20 61 6c 6c 6f 77 20 74 68 65 20 6c 6f 6f  ly allow the loo
1bab0 70 20 74 6f 20 72 75 6e 20 66 6f 72 0a 20 20 20  p to run for.   
1bac0 20 2a 2a 20 61 20 73 69 6e 67 6c 65 20 69 74 65   ** a single ite
1bad0 72 61 74 69 6f 6e 2e 20 54 68 69 73 20 6d 65 61  ration. This mea
1bae0 6e 73 20 74 68 61 74 20 74 68 65 20 66 69 72 73  ns that the firs
1baf0 74 20 72 6f 77 20 72 65 74 75 72 6e 65 64 0a 20  t row returned. 
1bb00 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20 6e 6f 74     ** should not
1bb10 20 68 61 76 65 20 61 20 4e 55 4c 4c 20 76 61 6c   have a NULL val
1bb20 75 65 20 73 74 6f 72 65 64 20 69 6e 20 27 78 27  ue stored in 'x'
1bb30 2e 20 49 66 20 63 6f 6c 75 6d 6e 20 27 78 27 20  . If column 'x' 
1bb40 69 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 66 69  is.    ** the fi
1bb50 72 73 74 20 6f 6e 65 20 61 66 74 65 72 20 74 68  rst one after th
1bb60 65 20 6e 45 71 20 65 71 75 61 6c 69 74 79 20 63  e nEq equality c
1bb70 6f 6e 73 74 72 61 69 6e 74 73 20 69 6e 20 74 68  onstraints in th
1bb80 65 20 69 6e 64 65 78 2c 0a 20 20 20 20 2a 2a 20  e index,.    ** 
1bb90 74 68 69 73 20 72 65 71 75 69 72 65 73 20 73 6f  this requires so
1bba0 6d 65 20 73 70 65 63 69 61 6c 20 68 61 6e 64 6c  me special handl
1bbb0 69 6e 67 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ing..    */.    
1bbc0 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e  assert( pWInfo->
1bbd0 70 4f 72 64 65 72 42 79 3d 3d 30 0a 20 20 20 20  pOrderBy==0.    
1bbe0 20 20 20 20 20 7c 7c 20 70 57 49 6e 66 6f 2d 3e       || pWInfo->
1bbf0 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3d  pOrderBy->nExpr=
1bc00 3d 31 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28  =1.         || (
1bc10 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
1bc20 67 73 26 57 48 45 52 45 5f 4f 52 44 45 52 42 59  gs&WHERE_ORDERBY
1bc30 5f 4d 49 4e 29 3d 3d 30 20 29 3b 0a 20 20 20 20  _MIN)==0 );.    
1bc40 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74  if( (pWInfo->wct
1bc50 72 6c 46 6c 61 67 73 26 57 48 45 52 45 5f 4f 52  rlFlags&WHERE_OR
1bc60 44 45 52 42 59 5f 4d 49 4e 29 21 3d 30 0a 20 20  DERBY_MIN)!=0.  
1bc70 20 20 20 26 26 20 70 57 49 6e 66 6f 2d 3e 6e 4f     && pWInfo->nO
1bc80 42 53 61 74 3e 30 0a 20 20 20 20 20 26 26 20 28  BSat>0.     && (
1bc90 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3e 6e 45  pIdx->nKeyCol>nE
1bca0 71 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  q).    ){.      
1bcb0 61 73 73 65 72 74 28 20 70 4c 6f 6f 70 2d 3e 75  assert( pLoop->u
1bcc0 2e 62 74 72 65 65 2e 6e 53 6b 69 70 3d 3d 30 20  .btree.nSkip==0 
1bcd0 29 3b 0a 20 20 20 20 20 20 62 53 65 65 6b 50 61  );.      bSeekPa
1bce0 73 74 4e 75 6c 6c 20 3d 20 31 3b 0a 20 20 20 20  stNull = 1;.    
1bcf0 20 20 6e 45 78 74 72 61 52 65 67 20 3d 20 31 3b    nExtraReg = 1;
1bd00 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 46  .    }..    /* F
1bd10 69 6e 64 20 61 6e 79 20 69 6e 65 71 75 61 6c 69  ind any inequali
1bd20 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 65  ty constraint te
1bd30 72 6d 73 20 66 6f 72 20 74 68 65 20 73 74 61 72  rms for the star
1bd40 74 20 61 6e 64 20 65 6e 64 20 0a 20 20 20 20 2a  t and end .    *
1bd50 2a 20 6f 66 20 74 68 65 20 72 61 6e 67 65 2e 20  * of the range. 
1bd60 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6a 20 3d 20  .    */.    j = 
1bd70 6e 45 71 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f  nEq;.    if( pLo
1bd80 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
1bd90 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 7b  ERE_BTM_LIMIT ){
1bda0 0a 20 20 20 20 20 20 70 52 61 6e 67 65 53 74 61  .      pRangeSta
1bdb0 72 74 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65  rt = pLoop->aLTe
1bdc0 72 6d 5b 6a 2b 2b 5d 3b 0a 20 20 20 20 20 20 6e  rm[j++];.      n
1bdd0 45 78 74 72 61 52 65 67 20 3d 20 31 3b 0a 20 20  ExtraReg = 1;.  
1bde0 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f    }.    if( pLoo
1bdf0 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
1be00 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20 29 7b 0a  RE_TOP_LIMIT ){.
1be10 20 20 20 20 20 20 70 52 61 6e 67 65 45 6e 64 20        pRangeEnd 
1be20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b  = pLoop->aLTerm[
1be30 6a 2b 2b 5d 3b 0a 20 20 20 20 20 20 6e 45 78 74  j++];.      nExt
1be40 72 61 52 65 67 20 3d 20 31 3b 0a 20 20 20 20 20  raReg = 1;.     
1be50 20 69 66 28 20 70 52 61 6e 67 65 53 74 61 72 74   if( pRangeStart
1be60 3d 3d 30 0a 20 20 20 20 20 20 20 26 26 20 28 6a  ==0.       && (j
1be70 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d   = pIdx->aiColum
1be80 6e 5b 6e 45 71 5d 29 3e 3d 30 20 0a 20 20 20 20  n[nEq])>=0 .    
1be90 20 20 20 26 26 20 70 49 64 78 2d 3e 70 54 61 62     && pIdx->pTab
1bea0 6c 65 2d 3e 61 43 6f 6c 5b 6a 5d 2e 6e 6f 74 4e  le->aCol[j].notN
1beb0 75 6c 6c 3d 3d 30 0a 20 20 20 20 20 20 29 7b 0a  ull==0.      ){.
1bec0 20 20 20 20 20 20 20 20 62 53 65 65 6b 50 61 73          bSeekPas
1bed0 74 4e 75 6c 6c 20 3d 20 31 3b 0a 20 20 20 20 20  tNull = 1;.     
1bee0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73   }.    }.    ass
1bef0 65 72 74 28 20 70 52 61 6e 67 65 45 6e 64 3d 3d  ert( pRangeEnd==
1bf00 30 20 7c 7c 20 28 70 52 61 6e 67 65 45 6e 64 2d  0 || (pRangeEnd-
1bf10 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
1bf20 56 4e 55 4c 4c 29 3d 3d 30 20 29 3b 0a 0a 20 20  VNULL)==0 );..  
1bf30 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
1bf40 64 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 61  de to evaluate a
1bf50 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 65  ll constraint te
1bf60 72 6d 73 20 75 73 69 6e 67 20 3d 3d 20 6f 72 20  rms using == or 
1bf70 49 4e 0a 20 20 20 20 2a 2a 20 61 6e 64 20 73 74  IN.    ** and st
1bf80 6f 72 65 20 74 68 65 20 76 61 6c 75 65 73 20 6f  ore the values o
1bf90 66 20 74 68 6f 73 65 20 74 65 72 6d 73 20 69 6e  f those terms in
1bfa0 20 61 6e 20 61 72 72 61 79 20 6f 66 20 72 65 67   an array of reg
1bfb0 69 73 74 65 72 73 0a 20 20 20 20 2a 2a 20 73 74  isters.    ** st
1bfc0 61 72 74 69 6e 67 20 61 74 20 72 65 67 42 61 73  arting at regBas
1bfd0 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 65  e..    */.    re
1bfe0 67 42 61 73 65 20 3d 20 63 6f 64 65 41 6c 6c 45  gBase = codeAllE
1bff0 71 75 61 6c 69 74 79 54 65 72 6d 73 28 70 50 61  qualityTerms(pPa
1c000 72 73 65 2c 70 4c 65 76 65 6c 2c 62 52 65 76 2c  rse,pLevel,bRev,
1c010 6e 45 78 74 72 61 52 65 67 2c 26 7a 53 74 61 72  nExtraReg,&zStar
1c020 74 41 66 66 29 3b 0a 20 20 20 20 61 73 73 65 72  tAff);.    asser
1c030 74 28 20 7a 53 74 61 72 74 41 66 66 3d 3d 30 20  t( zStartAff==0 
1c040 7c 7c 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  || sqlite3Strlen
1c050 33 30 28 7a 53 74 61 72 74 41 66 66 29 3e 3d 6e  30(zStartAff)>=n
1c060 45 71 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 53  Eq );.    if( zS
1c070 74 61 72 74 41 66 66 20 29 20 63 45 6e 64 41 66  tartAff ) cEndAf
1c080 66 20 3d 20 7a 53 74 61 72 74 41 66 66 5b 6e 45  f = zStartAff[nE
1c090 71 5d 3b 0a 20 20 20 20 61 64 64 72 4e 78 74 20  q];.    addrNxt 
1c0a0 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78  = pLevel->addrNx
1c0b0 74 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 77 65  t;..    /* If we
1c0c0 20 61 72 65 20 64 6f 69 6e 67 20 61 20 72 65 76   are doing a rev
1c0d0 65 72 73 65 20 6f 72 64 65 72 20 73 63 61 6e 20  erse order scan 
1c0e0 6f 6e 20 61 6e 20 61 73 63 65 6e 64 69 6e 67 20  on an ascending 
1c0f0 69 6e 64 65 78 2c 20 6f 72 0a 20 20 20 20 2a 2a  index, or.    **
1c100 20 61 20 66 6f 72 77 61 72 64 20 6f 72 64 65 72   a forward order
1c110 20 73 63 61 6e 20 6f 6e 20 61 20 64 65 73 63 65   scan on a desce
1c120 6e 64 69 6e 67 20 69 6e 64 65 78 2c 20 69 6e 74  nding index, int
1c130 65 72 63 68 61 6e 67 65 20 74 68 65 20 0a 20 20  erchange the .  
1c140 20 20 2a 2a 20 73 74 61 72 74 20 61 6e 64 20 65    ** start and e
1c150 6e 64 20 74 65 72 6d 73 20 28 70 52 61 6e 67 65  nd terms (pRange
1c160 53 74 61 72 74 20 61 6e 64 20 70 52 61 6e 67 65  Start and pRange
1c170 45 6e 64 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  End)..    */.   
1c180 20 69 66 28 20 28 6e 45 71 3c 70 49 64 78 2d 3e   if( (nEq<pIdx->
1c190 6e 4b 65 79 43 6f 6c 20 26 26 20 62 52 65 76 3d  nKeyCol && bRev=
1c1a0 3d 28 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64  =(pIdx->aSortOrd
1c1b0 65 72 5b 6e 45 71 5d 3d 3d 53 51 4c 49 54 45 5f  er[nEq]==SQLITE_
1c1c0 53 4f 5f 41 53 43 29 29 0a 20 20 20 20 20 7c 7c  SO_ASC)).     ||
1c1d0 20 28 62 52 65 76 20 26 26 20 70 49 64 78 2d 3e   (bRev && pIdx->
1c1e0 6e 4b 65 79 43 6f 6c 3d 3d 6e 45 71 29 0a 20 20  nKeyCol==nEq).  
1c1f0 20 20 29 7b 0a 20 20 20 20 20 20 53 57 41 50 28    ){.      SWAP(
1c200 57 68 65 72 65 54 65 72 6d 20 2a 2c 20 70 52 61  WhereTerm *, pRa
1c210 6e 67 65 45 6e 64 2c 20 70 52 61 6e 67 65 53 74  ngeEnd, pRangeSt
1c220 61 72 74 29 3b 0a 20 20 20 20 20 20 53 57 41 50  art);.      SWAP
1c230 28 75 38 2c 20 62 53 65 65 6b 50 61 73 74 4e 75  (u8, bSeekPastNu
1c240 6c 6c 2c 20 62 53 74 6f 70 41 74 4e 75 6c 6c 29  ll, bStopAtNull)
1c250 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 74 65 73  ;.    }..    tes
1c260 74 63 61 73 65 28 20 70 52 61 6e 67 65 53 74 61  tcase( pRangeSta
1c270 72 74 20 26 26 20 28 70 52 61 6e 67 65 53 74 61  rt && (pRangeSta
1c280 72 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rt->eOperator & 
1c290 57 4f 5f 4c 45 29 21 3d 30 20 29 3b 0a 20 20 20  WO_LE)!=0 );.   
1c2a0 20 74 65 73 74 63 61 73 65 28 20 70 52 61 6e 67   testcase( pRang
1c2b0 65 53 74 61 72 74 20 26 26 20 28 70 52 61 6e 67  eStart && (pRang
1c2c0 65 53 74 61 72 74 2d 3e 65 4f 70 65 72 61 74 6f  eStart->eOperato
1c2d0 72 20 26 20 57 4f 5f 47 45 29 21 3d 30 20 29 3b  r & WO_GE)!=0 );
1c2e0 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
1c2f0 52 61 6e 67 65 45 6e 64 20 26 26 20 28 70 52 61  RangeEnd && (pRa
1c300 6e 67 65 45 6e 64 2d 3e 65 4f 70 65 72 61 74 6f  ngeEnd->eOperato
1c310 72 20 26 20 57 4f 5f 4c 45 29 21 3d 30 20 29 3b  r & WO_LE)!=0 );
1c320 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
1c330 52 61 6e 67 65 45 6e 64 20 26 26 20 28 70 52 61  RangeEnd && (pRa
1c340 6e 67 65 45 6e 64 2d 3e 65 4f 70 65 72 61 74 6f  ngeEnd->eOperato
1c350 72 20 26 20 57 4f 5f 47 45 29 21 3d 30 20 29 3b  r & WO_GE)!=0 );
1c360 0a 20 20 20 20 73 74 61 72 74 45 71 20 3d 20 21  .    startEq = !
1c370 70 52 61 6e 67 65 53 74 61 72 74 20 7c 7c 20 70  pRangeStart || p
1c380 52 61 6e 67 65 53 74 61 72 74 2d 3e 65 4f 70 65  RangeStart->eOpe
1c390 72 61 74 6f 72 20 26 20 28 57 4f 5f 4c 45 7c 57  rator & (WO_LE|W
1c3a0 4f 5f 47 45 29 3b 0a 20 20 20 20 65 6e 64 45 71  O_GE);.    endEq
1c3b0 20 3d 20 20 20 21 70 52 61 6e 67 65 45 6e 64 20   =   !pRangeEnd 
1c3c0 7c 7c 20 70 52 61 6e 67 65 45 6e 64 2d 3e 65 4f  || pRangeEnd->eO
1c3d0 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 4c 45  perator & (WO_LE
1c3e0 7c 57 4f 5f 47 45 29 3b 0a 20 20 20 20 73 74 61  |WO_GE);.    sta
1c3f0 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 3d  rt_constraints =
1c400 20 70 52 61 6e 67 65 53 74 61 72 74 20 7c 7c 20   pRangeStart || 
1c410 6e 45 71 3e 30 3b 0a 0a 20 20 20 20 2f 2a 20 53  nEq>0;..    /* S
1c420 65 65 6b 20 74 68 65 20 69 6e 64 65 78 20 63 75  eek the index cu
1c430 72 73 6f 72 20 74 6f 20 74 68 65 20 73 74 61 72  rsor to the star
1c440 74 20 6f 66 20 74 68 65 20 72 61 6e 67 65 2e 20  t of the range. 
1c450 2a 2f 0a 20 20 20 20 6e 43 6f 6e 73 74 72 61 69  */.    nConstrai
1c460 6e 74 20 3d 20 6e 45 71 3b 0a 20 20 20 20 69 66  nt = nEq;.    if
1c470 28 20 70 52 61 6e 67 65 53 74 61 72 74 20 29 7b  ( pRangeStart ){
1c480 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 52 69  .      Expr *pRi
1c490 67 68 74 20 3d 20 70 52 61 6e 67 65 53 74 61 72  ght = pRangeStar
1c4a0 74 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74  t->pExpr->pRight
1c4b0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1c4c0 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
1c4d0 70 52 69 67 68 74 2c 20 72 65 67 42 61 73 65 2b  pRight, regBase+
1c4e0 6e 45 71 29 3b 0a 20 20 20 20 20 20 69 66 28 20  nEq);.      if( 
1c4f0 28 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 77 74  (pRangeStart->wt
1c500 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55  Flags & TERM_VNU
1c510 4c 4c 29 3d 3d 30 0a 20 20 20 20 20 20 20 26 26  LL)==0.       &&
1c520 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 6e 42   sqlite3ExprCanB
1c530 65 4e 75 6c 6c 28 70 52 69 67 68 74 29 0a 20 20  eNull(pRight).  
1c540 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 73      ){.        s
1c550 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1c560 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72  (v, OP_IsNull, r
1c570 65 67 42 61 73 65 2b 6e 45 71 2c 20 61 64 64 72  egBase+nEq, addr
1c580 4e 78 74 29 3b 0a 20 20 20 20 20 20 20 20 56 64  Nxt);.        Vd
1c590 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
1c5a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
1c5b0 20 7a 53 74 61 72 74 41 66 66 20 29 7b 0a 20 20   zStartAff ){.  
1c5c0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
1c5d0 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79  3CompareAffinity
1c5e0 28 70 52 69 67 68 74 2c 20 7a 53 74 61 72 74 41  (pRight, zStartA
1c5f0 66 66 5b 6e 45 71 5d 29 3d 3d 53 51 4c 49 54 45  ff[nEq])==SQLITE
1c600 5f 41 46 46 5f 4e 4f 4e 45 29 7b 0a 20 20 20 20  _AFF_NONE){.    
1c610 20 20 20 20 20 20 2f 2a 20 53 69 6e 63 65 20 74        /* Since t
1c620 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73  he comparison is
1c630 20 74 6f 20 62 65 20 70 65 72 66 6f 72 6d 65 64   to be performed
1c640 20 77 69 74 68 20 6e 6f 20 63 6f 6e 76 65 72 73   with no convers
1c650 69 6f 6e 73 0a 20 20 20 20 20 20 20 20 20 20 2a  ions.          *
1c660 2a 20 61 70 70 6c 69 65 64 20 74 6f 20 74 68 65  * applied to the
1c670 20 6f 70 65 72 61 6e 64 73 2c 20 73 65 74 20 74   operands, set t
1c680 68 65 20 61 66 66 69 6e 69 74 79 20 74 6f 20 61  he affinity to a
1c690 70 70 6c 79 20 74 6f 20 70 52 69 67 68 74 20 74  pply to pRight t
1c6a0 6f 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  o .          ** 
1c6b0 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 2e  SQLITE_AFF_NONE.
1c6c0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 7a    */.          z
1c6d0 53 74 61 72 74 41 66 66 5b 6e 45 71 5d 20 3d 20  StartAff[nEq] = 
1c6e0 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b  SQLITE_AFF_NONE;
1c6f0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1c700 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
1c710 70 72 4e 65 65 64 73 4e 6f 41 66 66 69 6e 69 74  prNeedsNoAffinit
1c720 79 43 68 61 6e 67 65 28 70 52 69 67 68 74 2c 20  yChange(pRight, 
1c730 7a 53 74 61 72 74 41 66 66 5b 6e 45 71 5d 29 20  zStartAff[nEq]) 
1c740 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 53 74  ){.          zSt
1c750 61 72 74 41 66 66 5b 6e 45 71 5d 20 3d 20 53 51  artAff[nEq] = SQ
1c760 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20  LITE_AFF_NONE;. 
1c770 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1c780 20 20 0a 20 20 20 20 20 20 6e 43 6f 6e 73 74 72    .      nConstr
1c790 61 69 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 74 65  aint++;.      te
1c7a0 73 74 63 61 73 65 28 20 70 52 61 6e 67 65 53 74  stcase( pRangeSt
1c7b0 61 72 74 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  art->wtFlags & T
1c7c0 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20  ERM_VIRTUAL );. 
1c7d0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 62 53 65     }else if( bSe
1c7e0 65 6b 50 61 73 74 4e 75 6c 6c 20 29 7b 0a 20 20  ekPastNull ){.  
1c7f0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1c800 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp2(v, OP_Null
1c810 2c 20 30 2c 20 72 65 67 42 61 73 65 2b 6e 45 71  , 0, regBase+nEq
1c820 29 3b 0a 20 20 20 20 20 20 6e 43 6f 6e 73 74 72  );.      nConstr
1c830 61 69 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 73 74  aint++;.      st
1c840 61 72 74 45 71 20 3d 20 30 3b 0a 20 20 20 20 20  artEq = 0;.     
1c850 20 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e   start_constrain
1c860 74 73 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ts = 1;.    }.  
1c870 20 20 63 6f 64 65 41 70 70 6c 79 41 66 66 69 6e    codeApplyAffin
1c880 69 74 79 28 70 50 61 72 73 65 2c 20 72 65 67 42  ity(pParse, regB
1c890 61 73 65 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74  ase, nConstraint
1c8a0 20 2d 20 62 53 65 65 6b 50 61 73 74 4e 75 6c 6c   - bSeekPastNull
1c8b0 2c 20 7a 53 74 61 72 74 41 66 66 29 3b 0a 20 20  , zStartAff);.  
1c8c0 20 20 6f 70 20 3d 20 61 53 74 61 72 74 4f 70 5b    op = aStartOp[
1c8d0 28 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e  (start_constrain
1c8e0 74 73 3c 3c 32 29 20 2b 20 28 73 74 61 72 74 45  ts<<2) + (startE
1c8f0 71 3c 3c 31 29 20 2b 20 62 52 65 76 5d 3b 0a 20  q<<1) + bRev];. 
1c900 20 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d 30     assert( op!=0
1c910 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   );.    sqlite3V
1c920 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
1c930 6f 70 2c 20 69 49 64 78 43 75 72 2c 20 61 64 64  op, iIdxCur, add
1c940 72 4e 78 74 2c 20 72 65 67 42 61 73 65 2c 20 6e  rNxt, regBase, n
1c950 43 6f 6e 73 74 72 61 69 6e 74 29 3b 0a 20 20 20  Constraint);.   
1c960 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
1c970 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61  ;.    VdbeCovera
1c980 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 52  geIf(v, op==OP_R
1c990 65 77 69 6e 64 29 3b 20 20 74 65 73 74 63 61 73  ewind);  testcas
1c9a0 65 28 20 6f 70 3d 3d 4f 50 5f 52 65 77 69 6e 64  e( op==OP_Rewind
1c9b0 20 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65   );.    VdbeCove
1c9c0 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50  rageIf(v, op==OP
1c9d0 5f 4c 61 73 74 29 3b 20 20 20 20 74 65 73 74 63  _Last);    testc
1c9e0 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 4c 61 73 74  ase( op==OP_Last
1c9f0 20 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65   );.    VdbeCove
1ca00 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50  rageIf(v, op==OP
1ca10 5f 53 65 65 6b 47 54 29 3b 20 20 74 65 73 74 63  _SeekGT);  testc
1ca20 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b  ase( op==OP_Seek
1ca30 47 54 20 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  GT );.    VdbeCo
1ca40 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
1ca50 4f 50 5f 53 65 65 6b 47 45 29 3b 20 20 74 65 73  OP_SeekGE);  tes
1ca60 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 53 65  tcase( op==OP_Se
1ca70 65 6b 47 45 20 29 3b 0a 20 20 20 20 56 64 62 65  ekGE );.    Vdbe
1ca80 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70  CoverageIf(v, op
1ca90 3d 3d 4f 50 5f 53 65 65 6b 4c 45 29 3b 20 20 74  ==OP_SeekLE);  t
1caa0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f  estcase( op==OP_
1cab0 53 65 65 6b 4c 45 20 29 3b 0a 20 20 20 20 56 64  SeekLE );.    Vd
1cac0 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
1cad0 6f 70 3d 3d 4f 50 5f 53 65 65 6b 4c 54 29 3b 20  op==OP_SeekLT); 
1cae0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f   testcase( op==O
1caf0 50 5f 53 65 65 6b 4c 54 20 29 3b 0a 0a 20 20 20  P_SeekLT );..   
1cb00 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 76 61 6c   /* Load the val
1cb10 75 65 20 66 6f 72 20 74 68 65 20 69 6e 65 71 75  ue for the inequ
1cb20 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
1cb30 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
1cb40 68 65 0a 20 20 20 20 2a 2a 20 72 61 6e 67 65 20  he.    ** range 
1cb50 28 69 66 20 61 6e 79 29 2e 0a 20 20 20 20 2a 2f  (if any)..    */
1cb60 0a 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74  .    nConstraint
1cb70 20 3d 20 6e 45 71 3b 0a 20 20 20 20 69 66 28 20   = nEq;.    if( 
1cb80 70 52 61 6e 67 65 45 6e 64 20 29 7b 0a 20 20 20  pRangeEnd ){.   
1cb90 20 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 20     Expr *pRight 
1cba0 3d 20 70 52 61 6e 67 65 45 6e 64 2d 3e 70 45 78  = pRangeEnd->pEx
1cbb0 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20  pr->pRight;.    
1cbc0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
1cbd0 68 65 52 65 6d 6f 76 65 28 70 50 61 72 73 65 2c  heRemove(pParse,
1cbe0 20 72 65 67 42 61 73 65 2b 6e 45 71 2c 20 31 29   regBase+nEq, 1)
1cbf0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1cc00 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
1cc10 70 52 69 67 68 74 2c 20 72 65 67 42 61 73 65 2b  pRight, regBase+
1cc20 6e 45 71 29 3b 0a 20 20 20 20 20 20 69 66 28 20  nEq);.      if( 
1cc30 28 70 52 61 6e 67 65 45 6e 64 2d 3e 77 74 46 6c  (pRangeEnd->wtFl
1cc40 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c  ags & TERM_VNULL
1cc50 29 3d 3d 30 0a 20 20 20 20 20 20 20 26 26 20 73  )==0.       && s
1cc60 71 6c 69 74 65 33 45 78 70 72 43 61 6e 42 65 4e  qlite3ExprCanBeN
1cc70 75 6c 6c 28 70 52 69 67 68 74 29 0a 20 20 20 20  ull(pRight).    
1cc80 20 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c    ){.        sql
1cc90 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1cca0 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 65 67  , OP_IsNull, reg
1ccb0 42 61 73 65 2b 6e 45 71 2c 20 61 64 64 72 4e 78  Base+nEq, addrNx
1ccc0 74 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  t);.        Vdbe
1ccd0 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
1cce0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 73     }.      if( s
1ccf0 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66  qlite3CompareAff
1cd00 69 6e 69 74 79 28 70 52 69 67 68 74 2c 20 63 45  inity(pRight, cE
1cd10 6e 64 41 66 66 29 21 3d 53 51 4c 49 54 45 5f 41  ndAff)!=SQLITE_A
1cd20 46 46 5f 4e 4f 4e 45 0a 20 20 20 20 20 20 20 26  FF_NONE.       &
1cd30 26 20 21 73 71 6c 69 74 65 33 45 78 70 72 4e 65  & !sqlite3ExprNe
1cd40 65 64 73 4e 6f 41 66 66 69 6e 69 74 79 43 68 61  edsNoAffinityCha
1cd50 6e 67 65 28 70 52 69 67 68 74 2c 20 63 45 6e 64  nge(pRight, cEnd
1cd60 41 66 66 29 0a 20 20 20 20 20 20 29 7b 0a 20 20  Aff).      ){.  
1cd70 20 20 20 20 20 20 63 6f 64 65 41 70 70 6c 79 41        codeApplyA
1cd80 66 66 69 6e 69 74 79 28 70 50 61 72 73 65 2c 20  ffinity(pParse, 
1cd90 72 65 67 42 61 73 65 2b 6e 45 71 2c 20 31 2c 20  regBase+nEq, 1, 
1cda0 26 63 45 6e 64 41 66 66 29 3b 0a 20 20 20 20 20  &cEndAff);.     
1cdb0 20 7d 0a 20 20 20 20 20 20 6e 43 6f 6e 73 74 72   }.      nConstr
1cdc0 61 69 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 74 65  aint++;.      te
1cdd0 73 74 63 61 73 65 28 20 70 52 61 6e 67 65 45 6e  stcase( pRangeEn
1cde0 64 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  d->wtFlags & TER
1cdf0 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20 20 20  M_VIRTUAL );.   
1ce00 20 7d 65 6c 73 65 20 69 66 28 20 62 53 74 6f 70   }else if( bStop
1ce10 41 74 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20  AtNull ){.      
1ce20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1ce30 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  2(v, OP_Null, 0,
1ce40 20 72 65 67 42 61 73 65 2b 6e 45 71 29 3b 0a 20   regBase+nEq);. 
1ce50 20 20 20 20 20 65 6e 64 45 71 20 3d 20 30 3b 0a       endEq = 0;.
1ce60 20 20 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e        nConstrain
1ce70 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  t++;.    }.    s
1ce80 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
1ce90 20 7a 53 74 61 72 74 41 66 66 29 3b 0a 0a 20 20   zStartAff);..  
1cea0 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20    /* Top of the 
1ceb0 6c 6f 6f 70 20 62 6f 64 79 20 2a 2f 0a 20 20 20  loop body */.   
1cec0 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 73 71   pLevel->p2 = sq
1ced0 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
1cee0 41 64 64 72 28 76 29 3b 0a 0a 20 20 20 20 2f 2a  Addr(v);..    /*
1cef0 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 69 6e   Check if the in
1cf00 64 65 78 20 63 75 72 73 6f 72 20 69 73 20 70 61  dex cursor is pa
1cf10 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  st the end of th
1cf20 65 20 72 61 6e 67 65 2e 20 2a 2f 0a 20 20 20 20  e range. */.    
1cf30 69 66 28 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20  if( nConstraint 
1cf40 29 7b 0a 20 20 20 20 20 20 6f 70 20 3d 20 61 45  ){.      op = aE
1cf50 6e 64 4f 70 5b 62 52 65 76 2a 32 20 2b 20 65 6e  ndOp[bRev*2 + en
1cf60 64 45 71 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69  dEq];.      sqli
1cf70 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
1cf80 28 76 2c 20 6f 70 2c 20 69 49 64 78 43 75 72 2c  (v, op, iIdxCur,
1cf90 20 61 64 64 72 4e 78 74 2c 20 72 65 67 42 61 73   addrNxt, regBas
1cfa0 65 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74 29 3b  e, nConstraint);
1cfb0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1cfc0 20 6f 70 3d 3d 4f 50 5f 49 64 78 47 54 20 29 3b   op==OP_IdxGT );
1cfd0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
1cfe0 28 76 2c 20 6f 70 3d 3d 4f 50 5f 49 64 78 47 54  (v, op==OP_IdxGT
1cff0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
1d000 73 65 28 20 6f 70 3d 3d 4f 50 5f 49 64 78 47 45  se( op==OP_IdxGE
1d010 20 29 3b 20 20 56 64 62 65 43 6f 76 65 72 61 67   );  VdbeCoverag
1d020 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 49 64  eIf(v, op==OP_Id
1d030 78 47 45 20 29 3b 0a 20 20 20 20 20 20 74 65 73  xGE );.      tes
1d040 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 49 64  tcase( op==OP_Id
1d050 78 4c 54 20 29 3b 20 20 56 64 62 65 43 6f 76 65  xLT );  VdbeCove
1d060 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50  rageIf(v, op==OP
1d070 5f 49 64 78 4c 54 20 29 3b 0a 20 20 20 20 20 20  _IdxLT );.      
1d080 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50  testcase( op==OP
1d090 5f 49 64 78 4c 45 20 29 3b 20 20 56 64 62 65 43  _IdxLE );  VdbeC
1d0a0 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d  overageIf(v, op=
1d0b0 3d 4f 50 5f 49 64 78 4c 45 20 29 3b 0a 20 20 20  =OP_IdxLE );.   
1d0c0 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 65 6b 20   }..    /* Seek 
1d0d0 74 68 65 20 74 61 62 6c 65 20 63 75 72 73 6f 72  the table cursor
1d0e0 2c 20 69 66 20 72 65 71 75 69 72 65 64 20 2a 2f  , if required */
1d0f0 0a 20 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d  .    disableTerm
1d100 28 70 4c 65 76 65 6c 2c 20 70 52 61 6e 67 65 53  (pLevel, pRangeS
1d110 74 61 72 74 29 3b 0a 20 20 20 20 64 69 73 61 62  tart);.    disab
1d120 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70  leTerm(pLevel, p
1d130 52 61 6e 67 65 45 6e 64 29 3b 0a 20 20 20 20 69  RangeEnd);.    i
1d140 66 28 20 6f 6d 69 74 54 61 62 6c 65 20 29 7b 0a  f( omitTable ){.
1d150 20 20 20 20 20 20 2f 2a 20 70 49 64 78 20 69 73        /* pIdx is
1d160 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65   a covering inde
1d170 78 2e 20 20 4e 6f 20 6e 65 65 64 20 74 6f 20 61  x.  No need to a
1d180 63 63 65 73 73 20 74 68 65 20 6d 61 69 6e 20 74  ccess the main t
1d190 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 7d 65 6c  able. */.    }el
1d1a0 73 65 20 69 66 28 20 48 61 73 52 6f 77 69 64 28  se if( HasRowid(
1d1b0 70 49 64 78 2d 3e 70 54 61 62 6c 65 29 20 29 7b  pIdx->pTable) ){
1d1c0 0a 20 20 20 20 20 20 69 52 6f 77 69 64 52 65 67  .      iRowidReg
1d1d0 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
1d1e0 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  m;.      sqlite3
1d1f0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1d200 5f 49 64 78 52 6f 77 69 64 2c 20 69 49 64 78 43  _IdxRowid, iIdxC
1d210 75 72 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a  ur, iRowidReg);.
1d220 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1d230 72 43 61 63 68 65 53 74 6f 72 65 28 70 50 61 72  rCacheStore(pPar
1d240 73 65 2c 20 69 43 75 72 2c 20 2d 31 2c 20 69 52  se, iCur, -1, iR
1d250 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20 20 20  owidReg);.      
1d260 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1d270 32 28 76 2c 20 4f 50 5f 53 65 65 6b 2c 20 69 43  2(v, OP_Seek, iC
1d280 75 72 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 20  ur, iRowidReg); 
1d290 20 2f 2a 20 44 65 66 65 72 72 65 64 20 73 65 65   /* Deferred see
1d2a0 6b 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 20 69  k */.    }else i
1d2b0 66 28 20 69 43 75 72 21 3d 69 49 64 78 43 75 72  f( iCur!=iIdxCur
1d2c0 20 29 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20   ){.      Index 
1d2d0 2a 70 50 6b 20 3d 20 73 71 6c 69 74 65 33 50 72  *pPk = sqlite3Pr
1d2e0 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 49  imaryKeyIndex(pI
1d2f0 64 78 2d 3e 70 54 61 62 6c 65 29 3b 0a 20 20 20  dx->pTable);.   
1d300 20 20 20 69 52 6f 77 69 64 52 65 67 20 3d 20 73     iRowidReg = s
1d310 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e  qlite3GetTempRan
1d320 67 65 28 70 50 61 72 73 65 2c 20 70 50 6b 2d 3e  ge(pParse, pPk->
1d330 6e 4b 65 79 43 6f 6c 29 3b 0a 20 20 20 20 20 20  nKeyCol);.      
1d340 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 50 6b 2d 3e  for(j=0; j<pPk->
1d350 6e 4b 65 79 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20  nKeyCol; j++){. 
1d360 20 20 20 20 20 20 20 6b 20 3d 20 73 71 6c 69 74         k = sqlit
1d370 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78 28  e3ColumnOfIndex(
1d380 70 49 64 78 2c 20 70 50 6b 2d 3e 61 69 43 6f 6c  pIdx, pPk->aiCol
1d390 75 6d 6e 5b 6a 5d 29 3b 0a 20 20 20 20 20 20 20  umn[j]);.       
1d3a0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1d3b0 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  p3(v, OP_Column,
1d3c0 20 69 49 64 78 43 75 72 2c 20 6b 2c 20 69 52 6f   iIdxCur, k, iRo
1d3d0 77 69 64 52 65 67 2b 6a 29 3b 0a 20 20 20 20 20  widReg+j);.     
1d3e0 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
1d3f0 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c  VdbeAddOp4Int(v,
1d400 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 69 43   OP_NotFound, iC
1d410 75 72 2c 20 61 64 64 72 43 6f 6e 74 2c 0a 20 20  ur, addrCont,.  
1d420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d430 20 20 20 20 20 20 20 20 20 69 52 6f 77 69 64 52           iRowidR
1d440 65 67 2c 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c  eg, pPk->nKeyCol
1d450 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
1d460 76 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  v);.    }..    /
1d470 2a 20 52 65 63 6f 72 64 20 74 68 65 20 69 6e 73  * Record the ins
1d480 74 72 75 63 74 69 6f 6e 20 75 73 65 64 20 74 6f  truction used to
1d490 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c   terminate the l
1d4a0 6f 6f 70 2e 20 44 69 73 61 62 6c 65 20 0a 20 20  oop. Disable .  
1d4b0 20 20 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73    ** WHERE claus
1d4c0 65 20 74 65 72 6d 73 20 6d 61 64 65 20 72 65 64  e terms made red
1d4d0 75 6e 64 61 6e 74 20 62 79 20 74 68 65 20 69 6e  undant by the in
1d4e0 64 65 78 20 72 61 6e 67 65 20 73 63 61 6e 2e 0a  dex range scan..
1d4f0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
1d500 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
1d510 57 48 45 52 45 5f 4f 4e 45 52 4f 57 20 29 7b 0a  WHERE_ONEROW ){.
1d520 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70        pLevel->op
1d530 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20   = OP_Noop;.    
1d540 7d 65 6c 73 65 20 69 66 28 20 62 52 65 76 20 29  }else if( bRev )
1d550 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e  {.      pLevel->
1d560 6f 70 20 3d 20 4f 50 5f 50 72 65 76 3b 0a 20 20  op = OP_Prev;.  
1d570 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
1d580 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e  Level->op = OP_N
1d590 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ext;.    }.    p
1d5a0 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69 49 64 78  Level->p1 = iIdx
1d5b0 43 75 72 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  Cur;.    pLevel-
1d5c0 3e 70 33 20 3d 20 28 70 4c 6f 6f 70 2d 3e 77 73  >p3 = (pLoop->ws
1d5d0 46 6c 61 67 73 26 57 48 45 52 45 5f 55 4e 51 5f  Flags&WHERE_UNQ_
1d5e0 57 41 4e 54 45 44 29 21 3d 30 20 3f 20 31 3a 30  WANTED)!=0 ? 1:0
1d5f0 3b 0a 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70  ;.    if( (pLoop
1d600 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
1d610 45 5f 43 4f 4e 53 54 52 41 49 4e 54 29 3d 3d 30  E_CONSTRAINT)==0
1d620 20 29 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c   ){.      pLevel
1d630 2d 3e 70 35 20 3d 20 53 51 4c 49 54 45 5f 53 54  ->p5 = SQLITE_ST
1d640 4d 54 53 54 41 54 55 53 5f 46 55 4c 4c 53 43 41  MTSTATUS_FULLSCA
1d650 4e 5f 53 54 45 50 3b 0a 20 20 20 20 7d 65 6c 73  N_STEP;.    }els
1d660 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
1d670 20 70 4c 65 76 65 6c 2d 3e 70 35 3d 3d 30 20 29   pLevel->p5==0 )
1d680 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a  ;.    }.  }else.
1d690 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1d6a0 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41  OMIT_OR_OPTIMIZA
1d6b0 54 49 4f 4e 0a 20 20 69 66 28 20 70 4c 6f 6f 70  TION.  if( pLoop
1d6c0 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
1d6d0 45 5f 4d 55 4c 54 49 5f 4f 52 20 29 7b 0a 20 20  E_MULTI_OR ){.  
1d6e0 20 20 2f 2a 20 43 61 73 65 20 35 3a 20 20 54 77    /* Case 5:  Tw
1d6f0 6f 20 6f 72 20 6d 6f 72 65 20 73 65 70 61 72 61  o or more separa
1d700 74 65 6c 79 20 69 6e 64 65 78 65 64 20 74 65 72  tely indexed ter
1d710 6d 73 20 63 6f 6e 6e 65 63 74 65 64 20 62 79 20  ms connected by 
1d720 4f 52 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  OR.    **.    **
1d730 20 45 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a   Example:.    **
1d740 0a 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45  .    **   CREATE
1d750 20 54 41 42 4c 45 20 74 31 28 61 2c 62 2c 63 2c   TABLE t1(a,b,c,
1d760 64 29 3b 0a 20 20 20 20 2a 2a 20 20 20 43 52 45  d);.    **   CRE
1d770 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20  ATE INDEX i1 ON 
1d780 74 31 28 61 29 3b 0a 20 20 20 20 2a 2a 20 20 20  t1(a);.    **   
1d790 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 32 20  CREATE INDEX i2 
1d7a0 4f 4e 20 74 31 28 62 29 3b 0a 20 20 20 20 2a 2a  ON t1(b);.    **
1d7b0 20 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20     CREATE INDEX 
1d7c0 69 33 20 4f 4e 20 74 31 28 63 29 3b 0a 20 20 20  i3 ON t1(c);.   
1d7d0 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 53 45 4c   **.    **   SEL
1d7e0 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48  ECT * FROM t1 WH
1d7f0 45 52 45 20 61 3d 35 20 4f 52 20 62 3d 37 20 4f  ERE a=5 OR b=7 O
1d800 52 20 28 63 3d 31 31 20 41 4e 44 20 64 3d 31 33  R (c=11 AND d=13
1d810 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ).    **.    ** 
1d820 49 6e 20 74 68 65 20 65 78 61 6d 70 6c 65 2c 20  In the example, 
1d830 74 68 65 72 65 20 61 72 65 20 74 68 72 65 65 20  there are three 
1d840 69 6e 64 65 78 65 64 20 74 65 72 6d 73 20 63 6f  indexed terms co
1d850 6e 6e 65 63 74 65 64 20 62 79 20 4f 52 2e 0a 20  nnected by OR.. 
1d860 20 20 20 2a 2a 20 54 68 65 20 74 6f 70 20 6f 66     ** The top of
1d870 20 74 68 65 20 6c 6f 6f 70 20 6c 6f 6f 6b 73 20   the loop looks 
1d880 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20 20 20 2a  like this:.    *
1d890 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  *.    **        
1d8a0 20 20 4e 75 6c 6c 20 20 20 20 20 20 20 31 20 20    Null       1  
1d8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
1d8c0 5a 65 72 6f 20 74 68 65 20 72 6f 77 73 65 74 20  Zero the rowset 
1d8d0 69 6e 20 72 65 67 20 31 0a 20 20 20 20 2a 2a 0a  in reg 1.    **.
1d8e0 20 20 20 20 2a 2a 20 54 68 65 6e 2c 20 66 6f 72      ** Then, for
1d8f0 20 65 61 63 68 20 69 6e 64 65 78 65 64 20 74 65   each indexed te
1d900 72 6d 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  rm, the followin
1d910 67 2e 20 54 68 65 20 61 72 67 75 6d 65 6e 74 73  g. The arguments
1d920 20 74 6f 0a 20 20 20 20 2a 2a 20 52 6f 77 53 65   to.    ** RowSe
1d930 74 54 65 73 74 20 61 72 65 20 73 75 63 68 20 74  tTest are such t
1d940 68 61 74 20 74 68 65 20 72 6f 77 69 64 20 6f 66  hat the rowid of
1d950 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77   the current row
1d960 20 69 73 20 69 6e 73 65 72 74 65 64 0a 20 20 20   is inserted.   
1d970 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 52 6f 77   ** into the Row
1d980 53 65 74 2e 20 49 66 20 69 74 20 69 73 20 61 6c  Set. If it is al
1d990 72 65 61 64 79 20 70 72 65 73 65 6e 74 2c 20 63  ready present, c
1d9a0 6f 6e 74 72 6f 6c 20 73 6b 69 70 73 20 74 68 65  ontrol skips the
1d9b0 0a 20 20 20 20 2a 2a 20 47 6f 73 75 62 20 6f 70  .    ** Gosub op
1d9c0 63 6f 64 65 20 61 6e 64 20 6a 75 6d 70 73 20 73  code and jumps s
1d9d0 74 72 61 69 67 68 74 20 74 6f 20 74 68 65 20 63  traight to the c
1d9e0 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 62 79  ode generated by
1d9f0 20 57 68 65 72 65 45 6e 64 28 29 2e 0a 20 20 20   WhereEnd()..   
1da00 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   **.    **      
1da10 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65    sqlite3WhereBe
1da20 67 69 6e 28 3c 74 65 72 6d 3e 29 0a 20 20 20 20  gin(<term>).    
1da30 2a 2a 20 20 20 20 20 20 20 20 20 20 52 6f 77 53  **          RowS
1da40 65 74 54 65 73 74 20 20 20 20 20 20 20 20 20 20  etTest          
1da50 20 20 20 20 20 20 20 20 23 20 49 6e 73 65 72 74          # Insert
1da60 20 72 6f 77 69 64 20 69 6e 74 6f 20 72 6f 77 73   rowid into rows
1da70 65 74 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  et.    **       
1da80 20 20 20 47 6f 73 75 62 20 20 20 20 20 20 32 20     Gosub      2 
1da90 41 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  A.    **        
1daa0 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
1dab0 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ).    **.    ** 
1dac0 46 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 61 62  Following the ab
1dad0 6f 76 65 2c 20 63 6f 64 65 20 74 6f 20 74 65 72  ove, code to ter
1dae0 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 2e  minate the loop.
1daf0 20 4c 61 62 65 6c 20 41 2c 20 74 68 65 20 74 61   Label A, the ta
1db00 72 67 65 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74  rget.    ** of t
1db10 68 65 20 47 6f 73 75 62 20 61 62 6f 76 65 2c 20  he Gosub above, 
1db20 6a 75 6d 70 73 20 74 6f 20 74 68 65 20 69 6e 73  jumps to the ins
1db30 74 72 75 63 74 69 6f 6e 20 72 69 67 68 74 20 61  truction right a
1db40 66 74 65 72 20 74 68 65 20 47 6f 74 6f 2e 0a 20  fter the Goto.. 
1db50 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
1db60 20 20 20 20 20 20 4e 75 6c 6c 20 20 20 20 20 20        Null      
1db70 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20   1              
1db80 20 20 23 20 5a 65 72 6f 20 74 68 65 20 72 6f 77    # Zero the row
1db90 73 65 74 20 69 6e 20 72 65 67 20 31 0a 20 20 20  set in reg 1.   
1dba0 20 2a 2a 20 20 20 20 20 20 20 20 20 20 47 6f 74   **          Got
1dbb0 6f 20 20 20 20 20 20 20 42 20 20 20 20 20 20 20  o       B       
1dbc0 20 20 20 20 20 20 20 20 20 23 20 54 68 65 20 6c           # The l
1dbd0 6f 6f 70 20 69 73 20 66 69 6e 69 73 68 65 64 2e  oop is finished.
1dbe0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
1dbf0 20 20 20 20 20 41 3a 20 3c 6c 6f 6f 70 20 62 6f       A: <loop bo
1dc00 64 79 3e 20 20 20 20 20 20 20 20 20 20 20 20 20  dy>             
1dc10 20 20 20 20 23 20 52 65 74 75 72 6e 20 64 61 74      # Return dat
1dc20 61 2c 20 77 68 61 74 65 76 65 72 2e 0a 20 20 20  a, whatever..   
1dc30 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   **.    **      
1dc40 20 20 20 20 52 65 74 75 72 6e 20 20 20 20 20 32      Return     2
1dc50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc60 23 20 4a 75 6d 70 20 62 61 63 6b 20 74 6f 20 74  # Jump back to t
1dc70 68 65 20 47 6f 73 75 62 0a 20 20 20 20 2a 2a 0a  he Gosub.    **.
1dc80 20 20 20 20 2a 2a 20 20 20 20 20 20 20 42 3a 20      **       B: 
1dc90 3c 61 66 74 65 72 20 74 68 65 20 6c 6f 6f 70 3e  <after the loop>
1dca0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41  .    **.    ** A
1dcb0 64 64 65 64 20 32 30 31 34 2d 30 35 2d 32 36 3a  dded 2014-05-26:
1dcc0 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 69 73   If the table is
1dcd0 20 61 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44   a WITHOUT ROWID
1dce0 20 74 61 62 6c 65 2c 20 74 68 65 6e 0a 20 20 20   table, then.   
1dcf0 20 2a 2a 20 75 73 65 20 61 6e 20 65 70 68 65 72   ** use an epher
1dd00 6d 65 72 61 6c 20 69 6e 64 65 78 20 69 6e 73 74  meral index inst
1dd10 65 61 64 20 6f 66 20 61 20 52 6f 77 53 65 74 20  ead of a RowSet 
1dd20 74 6f 20 72 65 63 6f 72 64 20 74 68 65 20 70 72  to record the pr
1dd30 69 6d 61 72 79 0a 20 20 20 20 2a 2a 20 6b 65 79  imary.    ** key
1dd40 73 20 6f 66 20 74 68 65 20 72 6f 77 73 20 77 65  s of the rows we
1dd50 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 73 65   have already se
1dd60 65 6e 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  en..    **.    *
1dd70 2f 0a 20 20 20 20 57 68 65 72 65 43 6c 61 75 73  /.    WhereClaus
1dd80 65 20 2a 70 4f 72 57 63 3b 20 20 20 20 2f 2a 20  e *pOrWc;    /* 
1dd90 54 68 65 20 4f 52 2d 63 6c 61 75 73 65 20 62 72  The OR-clause br
1dda0 6f 6b 65 6e 20 6f 75 74 20 69 6e 74 6f 20 73 75  oken out into su
1ddb0 62 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 53 72  bterms */.    Sr
1ddc0 63 4c 69 73 74 20 2a 70 4f 72 54 61 62 3b 20 20  cList *pOrTab;  
1ddd0 20 20 20 20 20 2f 2a 20 53 68 6f 72 74 65 6e 65       /* Shortene
1dde0 64 20 74 61 62 6c 65 20 6c 69 73 74 20 6f 72 20  d table list or 
1ddf0 4f 52 2d 63 6c 61 75 73 65 20 67 65 6e 65 72 61  OR-clause genera
1de00 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 49 6e 64 65  tion */.    Inde
1de10 78 20 2a 70 43 6f 76 20 3d 20 30 3b 20 20 20 20  x *pCov = 0;    
1de20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 74 65           /* Pote
1de30 6e 74 69 61 6c 20 63 6f 76 65 72 69 6e 67 20 69  ntial covering i
1de40 6e 64 65 78 20 28 6f 72 20 4e 55 4c 4c 29 20 2a  ndex (or NULL) *
1de50 2f 0a 20 20 20 20 69 6e 74 20 69 43 6f 76 43 75  /.    int iCovCu
1de60 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  r = pParse->nTab
1de70 2b 2b 3b 20 20 2f 2a 20 43 75 72 73 6f 72 20 75  ++;  /* Cursor u
1de80 73 65 64 20 66 6f 72 20 69 6e 64 65 78 20 73 63  sed for index sc
1de90 61 6e 73 20 28 69 66 20 61 6e 79 29 20 2a 2f 0a  ans (if any) */.
1dea0 0a 20 20 20 20 69 6e 74 20 72 65 67 52 65 74 75  .    int regRetu
1deb0 72 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  rn = ++pParse->n
1dec0 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20 2f  Mem;           /
1ded0 2a 20 52 65 67 69 73 74 65 72 20 75 73 65 64 20  * Register used 
1dee0 77 69 74 68 20 4f 50 5f 47 6f 73 75 62 20 2a 2f  with OP_Gosub */
1def0 0a 20 20 20 20 69 6e 74 20 72 65 67 52 6f 77 73  .    int regRows
1df00 65 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  et = 0;         
1df10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1df20 2a 20 52 65 67 69 73 74 65 72 20 66 6f 72 20 52  * Register for R
1df30 6f 77 53 65 74 20 6f 62 6a 65 63 74 20 2a 2f 0a  owSet object */.
1df40 20 20 20 20 69 6e 74 20 72 65 67 52 6f 77 69 64      int regRowid
1df50 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
1df60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1df70 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e   Register holdin
1df80 67 20 72 6f 77 69 64 20 2a 2f 0a 20 20 20 20 69  g rowid */.    i
1df90 6e 74 20 69 4c 6f 6f 70 42 6f 64 79 20 3d 20 73  nt iLoopBody = s
1dfa0 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
1dfb0 62 65 6c 28 76 29 3b 20 20 2f 2a 20 53 74 61 72  bel(v);  /* Star
1dfc0 74 20 6f 66 20 6c 6f 6f 70 20 62 6f 64 79 20 2a  t of loop body *
1dfd0 2f 0a 20 20 20 20 69 6e 74 20 69 52 65 74 49 6e  /.    int iRetIn
1dfe0 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  it;             
1dff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e000 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 72 65  /* Address of re
1e010 67 52 65 74 75 72 6e 20 69 6e 69 74 20 2a 2f 0a  gReturn init */.
1e020 20 20 20 20 69 6e 74 20 75 6e 74 65 73 74 65 64      int untested
1e030 54 65 72 6d 73 20 3d 20 30 3b 20 20 20 20 20 20  Terms = 0;      
1e040 20 20 20 20 20 20 20 2f 2a 20 53 6f 6d 65 20 74         /* Some t
1e050 65 72 6d 73 20 6e 6f 74 20 63 6f 6d 70 6c 65 74  erms not complet
1e060 65 6c 79 20 74 65 73 74 65 64 20 2a 2f 0a 20 20  ely tested */.  
1e070 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20    int ii;       
1e080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e090 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
1e0a0 6e 74 65 72 20 2a 2f 0a 20 20 20 20 45 78 70 72  nter */.    Expr
1e0b0 20 2a 70 41 6e 64 45 78 70 72 20 3d 20 30 3b 20   *pAndExpr = 0; 
1e0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1e0d0 2a 20 41 6e 20 22 2e 2e 20 41 4e 44 20 28 2e 2e  * An ".. AND (..
1e0e0 2e 29 22 20 65 78 70 72 65 73 73 69 6f 6e 20 2a  .)" expression *
1e0f0 2f 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  /.    Table *pTa
1e100 62 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70 54  b = pTabItem->pT
1e110 61 62 3b 0a 20 20 20 0a 20 20 20 20 70 54 65 72  ab;.   .    pTer
1e120 6d 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72  m = pLoop->aLTer
1e130 6d 5b 30 5d 3b 0a 20 20 20 20 61 73 73 65 72 74  m[0];.    assert
1e140 28 20 70 54 65 72 6d 21 3d 30 20 29 3b 0a 20 20  ( pTerm!=0 );.  
1e150 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d    assert( pTerm-
1e160 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
1e170 4f 52 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  OR );.    assert
1e180 28 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  ( (pTerm->wtFlag
1e190 73 20 26 20 54 45 52 4d 5f 4f 52 49 4e 46 4f 29  s & TERM_ORINFO)
1e1a0 21 3d 30 20 29 3b 0a 20 20 20 20 70 4f 72 57 63  !=0 );.    pOrWc
1e1b0 20 3d 20 26 70 54 65 72 6d 2d 3e 75 2e 70 4f 72   = &pTerm->u.pOr
1e1c0 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20 20 70 4c  Info->wc;.    pL
1e1d0 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 52 65  evel->op = OP_Re
1e1e0 74 75 72 6e 3b 0a 20 20 20 20 70 4c 65 76 65 6c  turn;.    pLevel
1e1f0 2d 3e 70 31 20 3d 20 72 65 67 52 65 74 75 72 6e  ->p1 = regReturn
1e200 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 75 70  ;..    /* Set up
1e210 20 61 20 6e 65 77 20 53 72 63 4c 69 73 74 20 69   a new SrcList i
1e220 6e 20 70 4f 72 54 61 62 20 63 6f 6e 74 61 69 6e  n pOrTab contain
1e230 69 6e 67 20 74 68 65 20 74 61 62 6c 65 20 62 65  ing the table be
1e240 69 6e 67 20 73 63 61 6e 6e 65 64 0a 20 20 20 20  ing scanned.    
1e250 2a 2a 20 62 79 20 74 68 69 73 20 6c 6f 6f 70 20  ** by this loop 
1e260 69 6e 20 74 68 65 20 61 5b 30 5d 20 73 6c 6f 74  in the a[0] slot
1e270 20 61 6e 64 20 61 6c 6c 20 6e 6f 74 52 65 61 64   and all notRead
1e280 79 20 74 61 62 6c 65 73 20 69 6e 20 61 5b 31 2e  y tables in a[1.
1e290 2e 5d 20 73 6c 6f 74 73 2e 0a 20 20 20 20 2a 2a  .] slots..    **
1e2a0 20 54 68 69 73 20 62 65 63 6f 6d 65 73 20 74 68   This becomes th
1e2b0 65 20 53 72 63 4c 69 73 74 20 69 6e 20 74 68 65  e SrcList in the
1e2c0 20 72 65 63 75 72 73 69 76 65 20 63 61 6c 6c 20   recursive call 
1e2d0 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  to sqlite3WhereB
1e2e0 65 67 69 6e 28 29 2e 0a 20 20 20 20 2a 2f 0a 20  egin()..    */. 
1e2f0 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6e     if( pWInfo->n
1e300 4c 65 76 65 6c 3e 31 20 29 7b 0a 20 20 20 20 20  Level>1 ){.     
1e310 20 69 6e 74 20 6e 4e 6f 74 52 65 61 64 79 3b 20   int nNotReady; 
1e320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e330 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66  /* The number of
1e340 20 6e 6f 74 52 65 61 64 79 20 74 61 62 6c 65 73   notReady tables
1e350 20 2a 2f 0a 20 20 20 20 20 20 73 74 72 75 63 74   */.      struct
1e360 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 6f   SrcList_item *o
1e370 72 69 67 53 72 63 3b 20 20 20 20 20 2f 2a 20 4f  rigSrc;     /* O
1e380 72 69 67 69 6e 61 6c 20 6c 69 73 74 20 6f 66 20  riginal list of 
1e390 74 61 62 6c 65 73 20 2a 2f 0a 20 20 20 20 20 20  tables */.      
1e3a0 6e 4e 6f 74 52 65 61 64 79 20 3d 20 70 57 49 6e  nNotReady = pWIn
1e3b0 66 6f 2d 3e 6e 4c 65 76 65 6c 20 2d 20 69 4c 65  fo->nLevel - iLe
1e3c0 76 65 6c 20 2d 20 31 3b 0a 20 20 20 20 20 20 70  vel - 1;.      p
1e3d0 4f 72 54 61 62 20 3d 20 73 71 6c 69 74 65 33 53  OrTab = sqlite3S
1e3e0 74 61 63 6b 41 6c 6c 6f 63 52 61 77 28 64 62 2c  tackAllocRaw(db,
1e3f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1e400 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a               siz
1e410 65 6f 66 28 2a 70 4f 72 54 61 62 29 2b 20 6e 4e  eof(*pOrTab)+ nN
1e420 6f 74 52 65 61 64 79 2a 73 69 7a 65 6f 66 28 70  otReady*sizeof(p
1e430 4f 72 54 61 62 2d 3e 61 5b 30 5d 29 29 3b 0a 20  OrTab->a[0]));. 
1e440 20 20 20 20 20 69 66 28 20 70 4f 72 54 61 62 3d       if( pOrTab=
1e450 3d 30 20 29 20 72 65 74 75 72 6e 20 6e 6f 74 52  =0 ) return notR
1e460 65 61 64 79 3b 0a 20 20 20 20 20 20 70 4f 72 54  eady;.      pOrT
1e470 61 62 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 28 75 38  ab->nAlloc = (u8
1e480 29 28 6e 4e 6f 74 52 65 61 64 79 20 2b 20 31 29  )(nNotReady + 1)
1e490 3b 0a 20 20 20 20 20 20 70 4f 72 54 61 62 2d 3e  ;.      pOrTab->
1e4a0 6e 53 72 63 20 3d 20 70 4f 72 54 61 62 2d 3e 6e  nSrc = pOrTab->n
1e4b0 41 6c 6c 6f 63 3b 0a 20 20 20 20 20 20 6d 65 6d  Alloc;.      mem
1e4c0 63 70 79 28 70 4f 72 54 61 62 2d 3e 61 2c 20 70  cpy(pOrTab->a, p
1e4d0 54 61 62 49 74 65 6d 2c 20 73 69 7a 65 6f 66 28  TabItem, sizeof(
1e4e0 2a 70 54 61 62 49 74 65 6d 29 29 3b 0a 20 20 20  *pTabItem));.   
1e4f0 20 20 20 6f 72 69 67 53 72 63 20 3d 20 70 57 49     origSrc = pWI
1e500 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61  nfo->pTabList->a
1e510 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 31 3b  ;.      for(k=1;
1e520 20 6b 3c 3d 6e 4e 6f 74 52 65 61 64 79 3b 20 6b   k<=nNotReady; k
1e530 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  ++){.        mem
1e540 63 70 79 28 26 70 4f 72 54 61 62 2d 3e 61 5b 6b  cpy(&pOrTab->a[k
1e550 5d 2c 20 26 6f 72 69 67 53 72 63 5b 70 4c 65 76  ], &origSrc[pLev
1e560 65 6c 5b 6b 5d 2e 69 46 72 6f 6d 5d 2c 20 73 69  el[k].iFrom], si
1e570 7a 65 6f 66 28 70 4f 72 54 61 62 2d 3e 61 5b 6b  zeof(pOrTab->a[k
1e580 5d 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ]));.      }.   
1e590 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4f   }else{.      pO
1e5a0 72 54 61 62 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  rTab = pWInfo->p
1e5b0 54 61 62 4c 69 73 74 3b 0a 20 20 20 20 7d 0a 0a  TabList;.    }..
1e5c0 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a      /* Initializ
1e5d0 65 20 74 68 65 20 72 6f 77 73 65 74 20 72 65 67  e the rowset reg
1e5e0 69 73 74 65 72 20 74 6f 20 63 6f 6e 74 61 69 6e  ister to contain
1e5f0 20 4e 55 4c 4c 2e 20 41 6e 20 53 51 4c 20 4e 55   NULL. An SQL NU
1e600 4c 4c 20 69 73 20 0a 20 20 20 20 2a 2a 20 65 71  LL is .    ** eq
1e610 75 69 76 61 6c 65 6e 74 20 74 6f 20 61 6e 20 65  uivalent to an e
1e620 6d 70 74 79 20 72 6f 77 73 65 74 2e 20 20 4f 72  mpty rowset.  Or
1e630 2c 20 63 72 65 61 74 65 20 61 6e 20 65 70 68 65  , create an ephe
1e640 72 6d 65 72 61 6c 20 69 6e 64 65 78 0a 20 20 20  rmeral index.   
1e650 20 2a 2a 20 63 61 70 61 62 6c 65 20 6f 66 20 68   ** capable of h
1e660 6f 6c 64 69 6e 67 20 70 72 69 6d 61 72 79 20 6b  olding primary k
1e670 65 79 73 20 69 6e 20 74 68 65 20 63 61 73 65 20  eys in the case 
1e680 6f 66 20 61 20 57 49 54 48 4f 55 54 20 52 4f 57  of a WITHOUT ROW
1e690 49 44 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ID..    **.    *
1e6a0 2a 20 41 6c 73 6f 20 69 6e 69 74 69 61 6c 69 7a  * Also initializ
1e6b0 65 20 72 65 67 52 65 74 75 72 6e 20 74 6f 20 63  e regReturn to c
1e6c0 6f 6e 74 61 69 6e 20 74 68 65 20 61 64 64 72 65  ontain the addre
1e6d0 73 73 20 6f 66 20 74 68 65 20 69 6e 73 74 72 75  ss of the instru
1e6e0 63 74 69 6f 6e 20 0a 20 20 20 20 2a 2a 20 69 6d  ction .    ** im
1e6f0 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77  mediately follow
1e700 69 6e 67 20 74 68 65 20 4f 50 5f 52 65 74 75 72  ing the OP_Retur
1e710 6e 20 61 74 20 74 68 65 20 62 6f 74 74 6f 6d 20  n at the bottom 
1e720 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20 54 68 69  of the loop. Thi
1e730 73 0a 20 20 20 20 2a 2a 20 69 73 20 72 65 71 75  s.    ** is requ
1e740 69 72 65 64 20 69 6e 20 61 20 66 65 77 20 6f 62  ired in a few ob
1e750 73 63 75 72 65 20 4c 45 46 54 20 4a 4f 49 4e 20  scure LEFT JOIN 
1e760 63 61 73 65 73 20 77 68 65 72 65 20 63 6f 6e 74  cases where cont
1e770 72 6f 6c 20 6a 75 6d 70 73 0a 20 20 20 20 2a 2a  rol jumps.    **
1e780 20 6f 76 65 72 20 74 68 65 20 74 6f 70 20 6f 66   over the top of
1e790 20 74 68 65 20 6c 6f 6f 70 20 69 6e 74 6f 20 74   the loop into t
1e7a0 68 65 20 62 6f 64 79 20 6f 66 20 69 74 2e 20 49  he body of it. I
1e7b0 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20  n this case the 
1e7c0 0a 20 20 20 20 2a 2a 20 63 6f 72 72 65 63 74 20  .    ** correct 
1e7d0 72 65 73 70 6f 6e 73 65 20 66 6f 72 20 74 68 65  response for the
1e7e0 20 65 6e 64 2d 6f 66 2d 6c 6f 6f 70 20 63 6f 64   end-of-loop cod
1e7f0 65 20 28 74 68 65 20 4f 50 5f 52 65 74 75 72 6e  e (the OP_Return
1e800 29 20 69 73 20 74 6f 20 0a 20 20 20 20 2a 2a 20  ) is to .    ** 
1e810 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 74 6f 20  fall through to 
1e820 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63  the next instruc
1e830 74 69 6f 6e 2c 20 6a 75 73 74 20 61 73 20 61 6e  tion, just as an
1e840 20 4f 50 5f 4e 65 78 74 20 64 6f 65 73 20 69 66   OP_Next does if
1e850 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 65 64 20 6f  .    ** called o
1e860 6e 20 61 6e 20 75 6e 69 6e 69 74 69 61 6c 69 7a  n an uninitializ
1e870 65 64 20 63 75 72 73 6f 72 2e 0a 20 20 20 20 2a  ed cursor..    *
1e880 2f 0a 20 20 20 20 69 66 28 20 28 70 57 49 6e 66  /.    if( (pWInf
1e890 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20  o->wctrlFlags & 
1e8a0 57 48 45 52 45 5f 44 55 50 4c 49 43 41 54 45 53  WHERE_DUPLICATES
1e8b0 5f 4f 4b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  _OK)==0 ){.     
1e8c0 20 69 66 28 20 48 61 73 52 6f 77 69 64 28 70 54   if( HasRowid(pT
1e8d0 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ab) ){.        r
1e8e0 65 67 52 6f 77 73 65 74 20 3d 20 2b 2b 70 50 61  egRowset = ++pPa
1e8f0 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
1e900 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1e910 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c  dOp2(v, OP_Null,
1e920 20 30 2c 20 72 65 67 52 6f 77 73 65 74 29 3b 0a   0, regRowset);.
1e930 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1e940 20 20 20 20 20 49 6e 64 65 78 20 2a 70 50 6b 20       Index *pPk 
1e950 3d 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79  = sqlite3Primary
1e960 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29 3b 0a  KeyIndex(pTab);.
1e970 20 20 20 20 20 20 20 20 72 65 67 52 6f 77 73 65          regRowse
1e980 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  t = pParse->nTab
1e990 2b 2b 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  ++;.        sqli
1e9a0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1e9b0 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
1e9c0 6c 2c 20 72 65 67 52 6f 77 73 65 74 2c 20 70 50  l, regRowset, pP
1e9d0 6b 2d 3e 6e 4b 65 79 43 6f 6c 29 3b 0a 20 20 20  k->nKeyCol);.   
1e9e0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1e9f0 53 65 74 50 34 4b 65 79 49 6e 66 6f 28 70 50 61  SetP4KeyInfo(pPa
1ea00 72 73 65 2c 20 70 50 6b 29 3b 0a 20 20 20 20 20  rse, pPk);.     
1ea10 20 7d 0a 20 20 20 20 20 20 72 65 67 52 6f 77 69   }.      regRowi
1ea20 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  d = ++pParse->nM
1ea30 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 52  em;.    }.    iR
1ea40 65 74 49 6e 69 74 20 3d 20 73 71 6c 69 74 65 33  etInit = sqlite3
1ea50 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1ea60 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67  _Integer, 0, reg
1ea70 52 65 74 75 72 6e 29 3b 0a 0a 20 20 20 20 2f 2a  Return);..    /*
1ea80 20 49 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   If the original
1ea90 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 73   WHERE clause is
1eaa0 20 7a 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 20   z of the form: 
1eab0 20 28 78 31 20 4f 52 20 78 32 20 4f 52 20 2e 2e   (x1 OR x2 OR ..
1eac0 2e 29 20 41 4e 44 20 79 0a 20 20 20 20 2a 2a 20  .) AND y.    ** 
1ead0 54 68 65 6e 20 66 6f 72 20 65 76 65 72 79 20 74  Then for every t
1eae0 65 72 6d 20 78 4e 2c 20 65 76 61 6c 75 61 74 65  erm xN, evaluate
1eaf0 20 61 73 20 74 68 65 20 73 75 62 65 78 70 72 65   as the subexpre
1eb00 73 73 69 6f 6e 3a 20 78 4e 20 41 4e 44 20 7a 0a  ssion: xN AND z.
1eb10 20 20 20 20 2a 2a 20 54 68 61 74 20 77 61 79 2c      ** That way,
1eb20 20 74 65 72 6d 73 20 69 6e 20 79 20 74 68 61 74   terms in y that
1eb30 20 61 72 65 20 66 61 63 74 6f 72 65 64 20 69 6e   are factored in
1eb40 74 6f 20 74 68 65 20 64 69 73 6a 75 6e 63 74 69  to the disjuncti
1eb50 6f 6e 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62  on will.    ** b
1eb60 65 20 70 69 63 6b 65 64 20 75 70 20 62 79 20 74  e picked up by t
1eb70 68 65 20 72 65 63 75 72 73 69 76 65 20 63 61 6c  he recursive cal
1eb80 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65  ls to sqlite3Whe
1eb90 72 65 42 65 67 69 6e 28 29 20 62 65 6c 6f 77 2e  reBegin() below.
1eba0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41  .    **.    ** A
1ebb0 63 74 75 61 6c 6c 79 2c 20 65 61 63 68 20 73 75  ctually, each su
1ebc0 62 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63  bexpression is c
1ebd0 6f 6e 76 65 72 74 65 64 20 74 6f 20 22 78 4e 20  onverted to "xN 
1ebe0 41 4e 44 20 77 22 20 77 68 65 72 65 20 77 20 69  AND w" where w i
1ebf0 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 22 69 6e  s.    ** the "in
1ec00 74 65 72 65 73 74 69 6e 67 22 20 74 65 72 6d 73  teresting" terms
1ec10 20 6f 66 20 7a 20 2d 20 74 65 72 6d 73 20 74 68   of z - terms th
1ec20 61 74 20 64 69 64 20 6e 6f 74 20 6f 72 69 67 69  at did not origi
1ec30 6e 61 74 65 20 69 6e 20 74 68 65 0a 20 20 20 20  nate in the.    
1ec40 2a 2a 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63  ** ON or USING c
1ec50 6c 61 75 73 65 20 6f 66 20 61 20 4c 45 46 54 20  lause of a LEFT 
1ec60 4a 4f 49 4e 2c 20 61 6e 64 20 74 65 72 6d 73 20  JOIN, and terms 
1ec70 74 68 61 74 20 61 72 65 20 75 73 61 62 6c 65 20  that are usable 
1ec80 61 73 20 0a 20 20 20 20 2a 2a 20 69 6e 64 69 63  as .    ** indic
1ec90 65 73 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  es..    **.    *
1eca0 2a 20 54 68 69 73 20 6f 70 74 69 6d 69 7a 61 74  * This optimizat
1ecb0 69 6f 6e 20 61 6c 73 6f 20 6f 6e 6c 79 20 61 70  ion also only ap
1ecc0 70 6c 69 65 73 20 69 66 20 74 68 65 20 28 78 31  plies if the (x1
1ecd0 20 4f 52 20 78 32 20 4f 52 20 2e 2e 2e 29 20 74   OR x2 OR ...) t
1ece0 65 72 6d 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f  erm.    ** is no
1ecf0 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74  t contained in t
1ed00 68 65 20 4f 4e 20 63 6c 61 75 73 65 20 6f 66 20  he ON clause of 
1ed10 61 20 4c 45 46 54 20 4a 4f 49 4e 2e 0a 20 20 20  a LEFT JOIN..   
1ed20 20 2a 2a 20 53 65 65 20 74 69 63 6b 65 74 20 68   ** See ticket h
1ed30 74 74 70 3a 2f 2f 77 77 77 2e 73 71 6c 69 74 65  ttp://www.sqlite
1ed40 2e 6f 72 67 2f 73 72 63 2f 69 6e 66 6f 2f 66 32  .org/src/info/f2
1ed50 33 36 39 33 30 34 65 34 0a 20 20 20 20 2a 2f 0a  369304e4.    */.
1ed60 20 20 20 20 69 66 28 20 70 57 43 2d 3e 6e 54 65      if( pWC->nTe
1ed70 72 6d 3e 31 20 29 7b 0a 20 20 20 20 20 20 69 6e  rm>1 ){.      in
1ed80 74 20 69 54 65 72 6d 3b 0a 20 20 20 20 20 20 66  t iTerm;.      f
1ed90 6f 72 28 69 54 65 72 6d 3d 30 3b 20 69 54 65 72  or(iTerm=0; iTer
1eda0 6d 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 54  m<pWC->nTerm; iT
1edb0 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  erm++){.        
1edc0 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 57  Expr *pExpr = pW
1edd0 43 2d 3e 61 5b 69 54 65 72 6d 5d 2e 70 45 78 70  C->a[iTerm].pExp
1ede0 72 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 26  r;.        if( &
1edf0 70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d 20 3d 3d  pWC->a[iTerm] ==
1ee00 20 70 54 65 72 6d 20 29 20 63 6f 6e 74 69 6e 75   pTerm ) continu
1ee10 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 45  e;.        if( E
1ee20 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
1ee30 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69  Expr, EP_FromJoi
1ee40 6e 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  n) ) continue;. 
1ee50 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
1ee60 20 70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d 2e 77   pWC->a[iTerm].w
1ee70 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 4f 52  tFlags & TERM_OR
1ee80 49 4e 46 4f 20 29 3b 0a 20 20 20 20 20 20 20 20  INFO );.        
1ee90 74 65 73 74 63 61 73 65 28 20 70 57 43 2d 3e 61  testcase( pWC->a
1eea0 5b 69 54 65 72 6d 5d 2e 77 74 46 6c 61 67 73 20  [iTerm].wtFlags 
1eeb0 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29  & TERM_VIRTUAL )
1eec0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 57  ;.        if( pW
1eed0 43 2d 3e 61 5b 69 54 65 72 6d 5d 2e 77 74 46 6c  C->a[iTerm].wtFl
1eee0 61 67 73 20 26 20 28 54 45 52 4d 5f 4f 52 49 4e  ags & (TERM_ORIN
1eef0 46 4f 7c 54 45 52 4d 5f 56 49 52 54 55 41 4c 29  FO|TERM_VIRTUAL)
1ef00 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1ef10 20 20 20 20 20 69 66 28 20 28 70 57 43 2d 3e 61       if( (pWC->a
1ef20 5b 69 54 65 72 6d 5d 2e 65 4f 70 65 72 61 74 6f  [iTerm].eOperato
1ef30 72 20 26 20 57 4f 5f 41 4c 4c 29 3d 3d 30 20 29  r & WO_ALL)==0 )
1ef40 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
1ef50 20 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74     pExpr = sqlit
1ef60 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 45  e3ExprDup(db, pE
1ef70 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  xpr, 0);.       
1ef80 20 70 41 6e 64 45 78 70 72 20 3d 20 73 71 6c 69   pAndExpr = sqli
1ef90 74 65 33 45 78 70 72 41 6e 64 28 64 62 2c 20 70  te3ExprAnd(db, p
1efa0 41 6e 64 45 78 70 72 2c 20 70 45 78 70 72 29 3b  AndExpr, pExpr);
1efb0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1efc0 66 28 20 70 41 6e 64 45 78 70 72 20 29 7b 0a 20  f( pAndExpr ){. 
1efd0 20 20 20 20 20 20 20 70 41 6e 64 45 78 70 72 20         pAndExpr 
1efe0 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
1eff0 50 61 72 73 65 2c 20 54 4b 5f 41 4e 44 2c 20 30  Parse, TK_AND, 0
1f000 2c 20 70 41 6e 64 45 78 70 72 2c 20 30 29 3b 0a  , pAndExpr, 0);.
1f010 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
1f020 20 20 20 2f 2a 20 52 75 6e 20 61 20 73 65 70 61     /* Run a sepa
1f030 72 61 74 65 20 57 48 45 52 45 20 63 6c 61 75 73  rate WHERE claus
1f040 65 20 66 6f 72 20 65 61 63 68 20 74 65 72 6d 20  e for each term 
1f050 6f 66 20 74 68 65 20 4f 52 20 63 6c 61 75 73 65  of the OR clause
1f060 2e 20 20 41 66 74 65 72 0a 20 20 20 20 2a 2a 20  .  After.    ** 
1f070 65 6c 69 6d 69 6e 61 74 69 6e 67 20 64 75 70 6c  eliminating dupl
1f080 69 63 61 74 65 73 20 66 72 6f 6d 20 6f 74 68 65  icates from othe
1f090 72 20 57 48 45 52 45 20 63 6c 61 75 73 65 73 2c  r WHERE clauses,
1f0a0 20 74 68 65 20 61 63 74 69 6f 6e 20 66 6f 72 20   the action for 
1f0b0 65 61 63 68 0a 20 20 20 20 2a 2a 20 73 75 62 2d  each.    ** sub-
1f0c0 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 73 20  WHERE clause is 
1f0d0 74 6f 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65  to to invoke the
1f0e0 20 6d 61 69 6e 20 6c 6f 6f 70 20 62 6f 64 79 20   main loop body 
1f0f0 61 73 20 61 20 73 75 62 72 6f 75 74 69 6e 65 2e  as a subroutine.
1f100 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
1f110 69 69 3d 30 3b 20 69 69 3c 70 4f 72 57 63 2d 3e  ii=0; ii<pOrWc->
1f120 6e 54 65 72 6d 3b 20 69 69 2b 2b 29 7b 0a 20 20  nTerm; ii++){.  
1f130 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
1f140 4f 72 54 65 72 6d 20 3d 20 26 70 4f 72 57 63 2d  OrTerm = &pOrWc-
1f150 3e 61 5b 69 69 5d 3b 0a 20 20 20 20 20 20 69 66  >a[ii];.      if
1f160 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43  ( pOrTerm->leftC
1f170 75 72 73 6f 72 3d 3d 69 43 75 72 20 7c 7c 20 28  ursor==iCur || (
1f180 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  pOrTerm->eOperat
1f190 6f 72 20 26 20 57 4f 5f 41 4e 44 29 21 3d 30 20  or & WO_AND)!=0 
1f1a0 29 7b 0a 20 20 20 20 20 20 20 20 57 68 65 72 65  ){.        Where
1f1b0 49 6e 66 6f 20 2a 70 53 75 62 57 49 6e 66 6f 3b  Info *pSubWInfo;
1f1c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
1f1d0 66 6f 20 66 6f 72 20 73 69 6e 67 6c 65 20 4f 52  fo for single OR
1f1e0 2d 74 65 72 6d 20 73 63 61 6e 20 2a 2f 0a 20 20  -term scan */.  
1f1f0 20 20 20 20 20 20 45 78 70 72 20 2a 70 4f 72 45        Expr *pOrE
1f200 78 70 72 20 3d 20 70 4f 72 54 65 72 6d 2d 3e 70  xpr = pOrTerm->p
1f210 45 78 70 72 3b 20 2f 2a 20 43 75 72 72 65 6e 74  Expr; /* Current
1f220 20 4f 52 20 63 6c 61 75 73 65 20 74 65 72 6d 20   OR clause term 
1f230 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6a  */.        int j
1f240 31 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  1 = 0;          
1f250 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
1f260 64 72 65 73 73 20 6f 66 20 6a 75 6d 70 20 6f 70  dress of jump op
1f270 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  eration */.     
1f280 20 20 20 69 66 28 20 70 41 6e 64 45 78 70 72 20     if( pAndExpr 
1f290 26 26 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  && !ExprHasPrope
1f2a0 72 74 79 28 70 4f 72 45 78 70 72 2c 20 45 50 5f  rty(pOrExpr, EP_
1f2b0 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20  FromJoin) ){.   
1f2c0 20 20 20 20 20 20 20 70 41 6e 64 45 78 70 72 2d         pAndExpr-
1f2d0 3e 70 4c 65 66 74 20 3d 20 70 4f 72 45 78 70 72  >pLeft = pOrExpr
1f2e0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 72 45  ;.          pOrE
1f2f0 78 70 72 20 3d 20 70 41 6e 64 45 78 70 72 3b 0a  xpr = pAndExpr;.
1f300 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1f310 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67    /* Loop throug
1f320 68 20 74 61 62 6c 65 20 65 6e 74 72 69 65 73 20  h table entries 
1f330 74 68 61 74 20 6d 61 74 63 68 20 74 65 72 6d 20  that match term 
1f340 70 4f 72 54 65 72 6d 2e 20 2a 2f 0a 20 20 20 20  pOrTerm. */.    
1f350 20 20 20 20 70 53 75 62 57 49 6e 66 6f 20 3d 20      pSubWInfo = 
1f360 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
1f370 6e 28 70 50 61 72 73 65 2c 20 70 4f 72 54 61 62  n(pParse, pOrTab
1f380 2c 20 70 4f 72 45 78 70 72 2c 20 30 2c 20 30 2c  , pOrExpr, 0, 0,
1f390 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1f3a0 20 20 20 20 20 20 20 20 20 57 48 45 52 45 5f 4f           WHERE_O
1f3b0 4d 49 54 5f 4f 50 45 4e 5f 43 4c 4f 53 45 20 7c  MIT_OPEN_CLOSE |
1f3c0 20 57 48 45 52 45 5f 41 4e 44 5f 4f 4e 4c 59 20   WHERE_AND_ONLY 
1f3d0 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  |.              
1f3e0 20 20 20 20 20 20 20 20 20 20 57 48 45 52 45 5f            WHERE_
1f3f0 46 4f 52 43 45 5f 54 41 42 4c 45 20 7c 20 57 48  FORCE_TABLE | WH
1f400 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c  ERE_ONETABLE_ONL
1f410 59 2c 20 69 43 6f 76 43 75 72 29 3b 0a 20 20 20  Y, iCovCur);.   
1f420 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53 75       assert( pSu
1f430 62 57 49 6e 66 6f 20 7c 7c 20 70 50 61 72 73 65  bWInfo || pParse
1f440 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61  ->nErr || db->ma
1f450 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
1f460 20 20 20 20 20 20 69 66 28 20 70 53 75 62 57 49        if( pSubWI
1f470 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20  nfo ){.         
1f480 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 53 75 62   WhereLoop *pSub
1f490 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20 20 20  Loop;.          
1f4a0 65 78 70 6c 61 69 6e 4f 6e 65 53 63 61 6e 28 0a  explainOneScan(.
1f4b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50                pP
1f4c0 61 72 73 65 2c 20 70 4f 72 54 61 62 2c 20 26 70  arse, pOrTab, &p
1f4d0 53 75 62 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2c 20  SubWInfo->a[0], 
1f4e0 69 4c 65 76 65 6c 2c 20 70 4c 65 76 65 6c 2d 3e  iLevel, pLevel->
1f4f0 69 46 72 6f 6d 2c 20 30 0a 20 20 20 20 20 20 20  iFrom, 0.       
1f500 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20     );.          
1f510 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 73  /* This is the s
1f520 75 62 2d 57 48 45 52 45 20 63 6c 61 75 73 65 20  ub-WHERE clause 
1f530 62 6f 64 79 2e 20 20 46 69 72 73 74 20 73 6b 69  body.  First ski
1f540 70 20 6f 76 65 72 0a 20 20 20 20 20 20 20 20 20  p over.         
1f550 20 2a 2a 20 64 75 70 6c 69 63 61 74 65 20 72 6f   ** duplicate ro
1f560 77 73 20 66 72 6f 6d 20 70 72 69 6f 72 20 73 75  ws from prior su
1f570 62 2d 57 48 45 52 45 20 63 6c 61 75 73 65 73 2c  b-WHERE clauses,
1f580 20 61 6e 64 20 72 65 63 6f 72 64 20 74 68 65 0a   and record the.
1f590 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72 6f 77            ** row
1f5a0 69 64 20 28 6f 72 20 50 52 49 4d 41 52 59 20 4b  id (or PRIMARY K
1f5b0 45 59 29 20 66 6f 72 20 74 68 65 20 63 75 72 72  EY) for the curr
1f5c0 65 6e 74 20 72 6f 77 20 73 6f 20 74 68 61 74 20  ent row so that 
1f5d0 74 68 65 20 73 61 6d 65 0a 20 20 20 20 20 20 20  the same.       
1f5e0 20 20 20 2a 2a 20 72 6f 77 20 77 69 6c 6c 20 62     ** row will b
1f5f0 65 20 73 6b 69 70 70 65 64 20 69 6e 20 73 75 62  e skipped in sub
1f600 73 65 71 75 65 6e 74 20 73 75 62 2d 57 48 45 52  sequent sub-WHER
1f610 45 20 63 6c 61 75 73 65 73 2e 0a 20 20 20 20 20  E clauses..     
1f620 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
1f630 20 20 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e 77    if( (pWInfo->w
1f640 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
1f650 45 5f 44 55 50 4c 49 43 41 54 45 53 5f 4f 4b 29  E_DUPLICATES_OK)
1f660 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
1f670 20 20 20 69 6e 74 20 72 3b 0a 20 20 20 20 20 20     int r;.      
1f680 20 20 20 20 20 20 69 6e 74 20 69 53 65 74 20 3d        int iSet =
1f690 20 28 28 69 69 3d 3d 70 4f 72 57 63 2d 3e 6e 54   ((ii==pOrWc->nT
1f6a0 65 72 6d 2d 31 29 3f 2d 31 3a 69 69 29 3b 0a 20  erm-1)?-1:ii);. 
1f6b0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 48             if( H
1f6c0 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 29 7b  asRowid(pTab) ){
1f6d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72  .              r
1f6e0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1f6f0 64 65 47 65 74 43 6f 6c 75 6d 6e 28 70 50 61 72  deGetColumn(pPar
1f700 73 65 2c 20 70 54 61 62 2c 20 2d 31 2c 20 69 43  se, pTab, -1, iC
1f710 75 72 2c 20 72 65 67 52 6f 77 69 64 2c 20 30 29  ur, regRowid, 0)
1f720 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1f730 6a 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  j1 = sqlite3Vdbe
1f740 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f  AddOp4Int(v, OP_
1f750 52 6f 77 53 65 74 54 65 73 74 2c 20 72 65 67 52  RowSetTest, regR
1f760 6f 77 73 65 74 2c 20 30 2c 20 72 2c 69 53 65 74  owset, 0, r,iSet
1f770 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
1f780 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
1f790 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65  ;.            }e
1f7a0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
1f7b0 20 20 20 49 6e 64 65 78 20 2a 70 50 6b 20 3d 20     Index *pPk = 
1f7c0 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65  sqlite3PrimaryKe
1f7d0 79 49 6e 64 65 78 28 70 54 61 62 29 3b 0a 20 20  yIndex(pTab);.  
1f7e0 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
1f7f0 6e 50 6b 20 3d 20 70 50 6b 2d 3e 6e 4b 65 79 43  nPk = pPk->nKeyC
1f800 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ol;.            
1f810 20 20 69 6e 74 20 69 50 6b 3b 0a 0a 20 20 20 20    int iPk;..    
1f820 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 61            /* Rea
1f830 64 20 74 68 65 20 50 4b 20 69 6e 74 6f 20 61 6e  d the PK into an
1f840 20 61 72 72 61 79 20 6f 66 20 74 65 6d 70 20 72   array of temp r
1f850 65 67 69 73 74 65 72 73 2e 20 2a 2f 0a 20 20 20  egisters. */.   
1f860 20 20 20 20 20 20 20 20 20 20 20 72 20 3d 20 73             r = s
1f870 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e  qlite3GetTempRan
1f880 67 65 28 70 50 61 72 73 65 2c 20 6e 50 6b 29 3b  ge(pParse, nPk);
1f890 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66  .              f
1f8a0 6f 72 28 69 50 6b 3d 30 3b 20 69 50 6b 3c 6e 50  or(iPk=0; iPk<nP
1f8b0 6b 3b 20 69 50 6b 2b 2b 29 7b 0a 20 20 20 20 20  k; iPk++){.     
1f8c0 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69             int i
1f8d0 43 6f 6c 20 3d 20 70 50 6b 2d 3e 61 69 43 6f 6c  Col = pPk->aiCol
1f8e0 75 6d 6e 5b 69 50 6b 5d 3b 0a 20 20 20 20 20 20  umn[iPk];.      
1f8f0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1f900 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75  3ExprCodeGetColu
1f910 6d 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c  mn(pParse, pTab,
1f920 20 69 43 6f 6c 2c 20 69 43 75 72 2c 20 72 2b 69   iCol, iCur, r+i
1f930 50 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  Pk, 0);.        
1f940 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
1f950 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20         /* Check 
1f960 69 66 20 74 68 65 20 74 65 6d 70 20 74 61 62 6c  if the temp tabl
1f970 65 20 61 6c 72 65 61 64 79 20 63 6f 6e 74 61 69  e already contai
1f980 6e 73 20 74 68 69 73 20 6b 65 79 2e 20 49 66 20  ns this key. If 
1f990 73 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  so,.            
1f9a0 20 20 2a 2a 20 74 68 65 20 72 6f 77 20 68 61 73    ** the row has
1f9b0 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 69 6e   already been in
1f9c0 63 6c 75 64 65 64 20 69 6e 20 74 68 65 20 72 65  cluded in the re
1f9d0 73 75 6c 74 20 73 65 74 20 61 6e 64 0a 20 20 20  sult set and.   
1f9e0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 61             ** ca
1f9f0 6e 20 62 65 20 69 67 6e 6f 72 65 64 20 28 62 79  n be ignored (by
1fa00 20 6a 75 6d 70 69 6e 67 20 70 61 73 74 20 74 68   jumping past th
1fa10 65 20 47 6f 73 75 62 20 62 65 6c 6f 77 29 2e 20  e Gosub below). 
1fa20 4f 74 68 65 72 77 69 73 65 2c 0a 20 20 20 20 20  Otherwise,.     
1fa30 20 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 73 65           ** inse
1fa40 72 74 20 74 68 65 20 6b 65 79 20 69 6e 74 6f 20  rt the key into 
1fa50 74 68 65 20 74 65 6d 70 20 74 61 62 6c 65 20 61  the temp table a
1fa60 6e 64 20 70 72 6f 63 65 65 64 20 77 69 74 68 20  nd proceed with 
1fa70 70 72 6f 63 65 73 73 69 6e 67 0a 20 20 20 20 20  processing.     
1fa80 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20           ** the 
1fa90 72 6f 77 2e 0a 20 20 20 20 20 20 20 20 20 20 20  row..           
1faa0 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 20 20     **.          
1fab0 20 20 20 20 2a 2a 20 55 73 65 20 73 6f 6d 65 20      ** Use some 
1fac0 6f 66 20 74 68 65 20 73 61 6d 65 20 6f 70 74 69  of the same opti
1fad0 6d 69 7a 61 74 69 6f 6e 73 20 61 73 20 4f 50 5f  mizations as OP_
1fae0 52 6f 77 53 65 74 54 65 73 74 3a 20 49 66 20 69  RowSetTest: If i
1faf0 53 65 74 0a 20 20 20 20 20 20 20 20 20 20 20 20  Set.            
1fb00 20 20 2a 2a 20 69 73 20 7a 65 72 6f 2c 20 61 73    ** is zero, as
1fb10 73 75 6d 65 20 74 68 61 74 20 74 68 65 20 6b 65  sume that the ke
1fb20 79 20 63 61 6e 6e 6f 74 20 61 6c 72 65 61 64 79  y cannot already
1fb30 20 62 65 20 70 72 65 73 65 6e 74 20 69 6e 0a 20   be present in. 
1fb40 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
1fb50 74 68 65 20 74 65 6d 70 20 74 61 62 6c 65 2e 20  the temp table. 
1fb60 41 6e 64 20 69 66 20 69 53 65 74 20 69 73 20 2d  And if iSet is -
1fb70 31 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20 74  1, assume that t
1fb80 68 65 72 65 20 69 73 20 6e 6f 20 0a 20 20 20 20  here is no .    
1fb90 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6e 65 65            ** nee
1fba0 64 20 74 6f 20 69 6e 73 65 72 74 20 74 68 65 20  d to insert the 
1fbb0 6b 65 79 20 69 6e 74 6f 20 74 68 65 20 74 65 6d  key into the tem
1fbc0 70 20 74 61 62 6c 65 2c 20 61 73 20 69 74 20 77  p table, as it w
1fbd0 69 6c 6c 20 6e 65 76 65 72 20 0a 20 20 20 20 20  ill never .     
1fbe0 20 20 20 20 20 20 20 20 20 2a 2a 20 62 65 20 74           ** be t
1fbf0 65 73 74 65 64 20 66 6f 72 2e 20 20 2a 2f 20 0a  ested for.  */ .
1fc00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
1fc10 28 20 69 53 65 74 20 29 7b 0a 20 20 20 20 20 20  ( iSet ){.      
1fc20 20 20 20 20 20 20 20 20 20 20 6a 31 20 3d 20 73            j1 = s
1fc30 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
1fc40 49 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c  Int(v, OP_Found,
1fc50 20 72 65 67 52 6f 77 73 65 74 2c 20 30 2c 20 72   regRowset, 0, r
1fc60 2c 20 6e 50 6b 29 3b 0a 20 20 20 20 20 20 20 20  , nPk);.        
1fc70 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
1fc80 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
1fc90 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1fca0 20 20 20 20 20 20 20 69 66 28 20 69 53 65 74 3e         if( iSet>
1fcb0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
1fcc0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1fcd0 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61  eAddOp3(v, OP_Ma
1fce0 6b 65 52 65 63 6f 72 64 2c 20 72 2c 20 6e 50 6b  keRecord, r, nPk
1fcf0 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20  , regRowid);.   
1fd00 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
1fd10 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
1fd20 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20  , OP_IdxInsert, 
1fd30 72 65 67 52 6f 77 73 65 74 2c 20 72 65 67 52 6f  regRowset, regRo
1fd40 77 69 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  wid, 0);.       
1fd50 20 20 20 20 20 20 20 20 20 69 66 28 20 69 53 65           if( iSe
1fd60 74 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 43  t ) sqlite3VdbeC
1fd70 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41  hangeP5(v, OPFLA
1fd80 47 5f 55 53 45 53 45 45 4b 52 45 53 55 4c 54 29  G_USESEEKRESULT)
1fd90 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1fda0 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  }..             
1fdb0 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20   /* Release the 
1fdc0 61 72 72 61 79 20 6f 66 20 74 65 6d 70 20 72 65  array of temp re
1fdd0 67 69 73 74 65 72 73 20 2a 2f 0a 20 20 20 20 20  gisters */.     
1fde0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1fdf0 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65  ReleaseTempRange
1fe00 28 70 50 61 72 73 65 2c 20 72 2c 20 6e 50 6b 29  (pParse, r, nPk)
1fe10 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
1fe20 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20            }..   
1fe30 20 20 20 20 20 20 20 2f 2a 20 49 6e 76 6f 6b 65         /* Invoke
1fe40 20 74 68 65 20 6d 61 69 6e 20 6c 6f 6f 70 20 62   the main loop b
1fe50 6f 64 79 20 61 73 20 61 20 73 75 62 72 6f 75 74  ody as a subrout
1fe60 69 6e 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ine */.         
1fe70 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1fe80 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
1fe90 72 65 67 52 65 74 75 72 6e 2c 20 69 4c 6f 6f 70  regReturn, iLoop
1fea0 42 6f 64 79 29 3b 0a 0a 20 20 20 20 20 20 20 20  Body);..        
1feb0 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 28    /* Jump here (
1fec0 73 6b 69 70 70 69 6e 67 20 74 68 65 20 6d 61 69  skipping the mai
1fed0 6e 20 6c 6f 6f 70 20 62 6f 64 79 20 73 75 62 72  n loop body subr
1fee0 6f 75 74 69 6e 65 29 20 69 66 20 74 68 65 0a 20  outine) if the. 
1fef0 20 20 20 20 20 20 20 20 20 2a 2a 20 63 75 72 72           ** curr
1ff00 65 6e 74 20 73 75 62 2d 57 48 45 52 45 20 72 6f  ent sub-WHERE ro
1ff10 77 20 69 73 20 61 20 64 75 70 6c 69 63 61 74 65  w is a duplicate
1ff20 20 66 72 6f 6d 20 70 72 69 6f 72 20 73 75 62 2d   from prior sub-
1ff30 57 48 45 52 45 73 2e 20 2a 2f 0a 20 20 20 20 20  WHEREs. */.     
1ff40 20 20 20 20 20 69 66 28 20 6a 31 20 29 20 73 71       if( j1 ) sq
1ff50 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
1ff60 65 28 76 2c 20 6a 31 29 3b 0a 0a 20 20 20 20 20  e(v, j1);..     
1ff70 20 20 20 20 20 2f 2a 20 54 68 65 20 70 53 75 62       /* The pSub
1ff80 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54  WInfo->untestedT
1ff90 65 72 6d 73 20 66 6c 61 67 20 6d 65 61 6e 73 20  erms flag means 
1ffa0 74 68 61 74 20 74 68 69 73 20 4f 52 20 74 65 72  that this OR ter
1ffb0 6d 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63  m.          ** c
1ffc0 6f 6e 74 61 69 6e 65 64 20 6f 6e 65 20 6f 72 20  ontained one or 
1ffd0 6d 6f 72 65 20 41 4e 44 20 74 65 72 6d 20 66 72  more AND term fr
1ffe0 6f 6d 20 61 20 6e 6f 74 52 65 61 64 79 20 74 61  om a notReady ta
1fff0 62 6c 65 2e 20 20 54 68 65 0a 20 20 20 20 20 20  ble.  The.      
20000 20 20 20 20 2a 2a 20 74 65 72 6d 73 20 66 72 6f      ** terms fro
20010 6d 20 74 68 65 20 6e 6f 74 52 65 61 64 79 20 74  m the notReady t
20020 61 62 6c 65 20 63 6f 75 6c 64 20 6e 6f 74 20 62  able could not b
20030 65 20 74 65 73 74 65 64 20 61 6e 64 20 77 69 6c  e tested and wil
20040 6c 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6e  l.          ** n
20050 65 65 64 20 74 6f 20 62 65 20 74 65 73 74 65 64  eed to be tested
20060 20 6c 61 74 65 72 2e 0a 20 20 20 20 20 20 20 20   later..        
20070 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69    */.          i
20080 66 28 20 70 53 75 62 57 49 6e 66 6f 2d 3e 75 6e  f( pSubWInfo->un
20090 74 65 73 74 65 64 54 65 72 6d 73 20 29 20 75 6e  testedTerms ) un
200a0 74 65 73 74 65 64 54 65 72 6d 73 20 3d 20 31 3b  testedTerms = 1;
200b0 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ..          /* I
200c0 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 4f 52 2d  f all of the OR-
200d0 63 6f 6e 6e 65 63 74 65 64 20 74 65 72 6d 73 20  connected terms 
200e0 61 72 65 20 6f 70 74 69 6d 69 7a 65 64 20 75 73  are optimized us
200f0 69 6e 67 20 74 68 65 20 73 61 6d 65 0a 20 20 20  ing the same.   
20100 20 20 20 20 20 20 20 2a 2a 20 69 6e 64 65 78 2c         ** index,
20110 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20 69   and the index i
20120 73 20 6f 70 65 6e 65 64 20 75 73 69 6e 67 20 74  s opened using t
20130 68 65 20 73 61 6d 65 20 63 75 72 73 6f 72 20 6e  he same cursor n
20140 75 6d 62 65 72 0a 20 20 20 20 20 20 20 20 20 20  umber.          
20150 2a 2a 20 62 79 20 65 61 63 68 20 63 61 6c 6c 20  ** by each call 
20160 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  to sqlite3WhereB
20170 65 67 69 6e 28 29 20 6d 61 64 65 20 62 79 20 74  egin() made by t
20180 68 69 73 20 6c 6f 6f 70 2c 20 69 74 20 6d 61 79  his loop, it may
20190 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 65  .          ** be
201a0 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 75 73 65   possible to use
201b0 20 74 68 61 74 20 69 6e 64 65 78 20 61 73 20 61   that index as a
201c0 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 2e   covering index.
201d0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  .          **.  
201e0 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68          ** If th
201f0 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  e call to sqlite
20200 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 61 62  3WhereBegin() ab
20210 6f 76 65 20 72 65 73 75 6c 74 65 64 20 69 6e 20  ove resulted in 
20220 61 20 73 63 61 6e 20 74 68 61 74 0a 20 20 20 20  a scan that.    
20230 20 20 20 20 20 20 2a 2a 20 75 73 65 73 20 61 6e        ** uses an
20240 20 69 6e 64 65 78 2c 20 61 6e 64 20 74 68 69 73   index, and this
20250 20 69 73 20 65 69 74 68 65 72 20 74 68 65 20 66   is either the f
20260 69 72 73 74 20 4f 52 2d 63 6f 6e 6e 65 63 74 65  irst OR-connecte
20270 64 20 74 65 72 6d 0a 20 20 20 20 20 20 20 20 20  d term.         
20280 20 2a 2a 20 70 72 6f 63 65 73 73 65 64 20 6f 72   ** processed or
20290 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 74 68   the index is th
202a0 65 20 73 61 6d 65 20 61 73 20 74 68 61 74 20 75  e same as that u
202b0 73 65 64 20 62 79 20 61 6c 6c 20 70 72 65 76 69  sed by all previ
202c0 6f 75 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ous.          **
202d0 20 74 65 72 6d 73 2c 20 73 65 74 20 70 43 6f 76   terms, set pCov
202e0 20 74 6f 20 74 68 65 20 63 61 6e 64 69 64 61 74   to the candidat
202f0 65 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78  e covering index
20300 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 73 65 74  . Otherwise, set
20310 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70   .          ** p
20320 43 6f 76 20 74 6f 20 4e 55 4c 4c 20 74 6f 20 69  Cov to NULL to i
20330 6e 64 69 63 61 74 65 20 74 68 61 74 20 6e 6f 20  ndicate that no 
20340 63 61 6e 64 69 64 61 74 65 20 63 6f 76 65 72 69  candidate coveri
20350 6e 67 20 69 6e 64 65 78 20 77 69 6c 6c 20 0a 20  ng index will . 
20360 20 20 20 20 20 20 20 20 20 2a 2a 20 62 65 20 61           ** be a
20370 76 61 69 6c 61 62 6c 65 2e 0a 20 20 20 20 20 20  vailable..      
20380 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
20390 20 70 53 75 62 4c 6f 6f 70 20 3d 20 70 53 75 62   pSubLoop = pSub
203a0 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70 57 4c 6f  WInfo->a[0].pWLo
203b0 6f 70 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  op;.          as
203c0 73 65 72 74 28 20 28 70 53 75 62 4c 6f 6f 70 2d  sert( (pSubLoop-
203d0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
203e0 5f 41 55 54 4f 5f 49 4e 44 45 58 29 3d 3d 30 20  _AUTO_INDEX)==0 
203f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
20400 20 28 70 53 75 62 4c 6f 6f 70 2d 3e 77 73 46 6c   (pSubLoop->wsFl
20410 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45  ags & WHERE_INDE
20420 58 45 44 29 21 3d 30 0a 20 20 20 20 20 20 20 20  XED)!=0.        
20430 20 20 20 26 26 20 28 69 69 3d 3d 30 20 7c 7c 20     && (ii==0 || 
20440 70 53 75 62 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65  pSubLoop->u.btre
20450 65 2e 70 49 6e 64 65 78 3d 3d 70 43 6f 76 29 0a  e.pIndex==pCov).
20460 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28 48             && (H
20470 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 7c 7c  asRowid(pTab) ||
20480 20 21 49 73 50 72 69 6d 61 72 79 4b 65 79 49 6e   !IsPrimaryKeyIn
20490 64 65 78 28 70 53 75 62 4c 6f 6f 70 2d 3e 75 2e  dex(pSubLoop->u.
204a0 62 74 72 65 65 2e 70 49 6e 64 65 78 29 29 0a 20  btree.pIndex)). 
204b0 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20           ){.    
204c0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
204d0 70 53 75 62 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e  pSubWInfo->a[0].
204e0 69 49 64 78 43 75 72 3d 3d 69 43 6f 76 43 75 72  iIdxCur==iCovCur
204f0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
20500 70 43 6f 76 20 3d 20 70 53 75 62 4c 6f 6f 70 2d  pCov = pSubLoop-
20510 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b  >u.btree.pIndex;
20520 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
20530 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43  {.            pC
20540 6f 76 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ov = 0;.        
20550 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 2f    }..          /
20560 2a 20 46 69 6e 69 73 68 20 74 68 65 20 6c 6f 6f  * Finish the loo
20570 70 20 74 68 72 6f 75 67 68 20 74 61 62 6c 65 20  p through table 
20580 65 6e 74 72 69 65 73 20 74 68 61 74 20 6d 61 74  entries that mat
20590 63 68 20 74 65 72 6d 20 70 4f 72 54 65 72 6d 2e  ch term pOrTerm.
205a0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73 71   */.          sq
205b0 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70 53  lite3WhereEnd(pS
205c0 75 62 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  ubWInfo);.      
205d0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
205e0 7d 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 75 2e  }.    pLevel->u.
205f0 70 43 6f 76 69 64 78 20 3d 20 70 43 6f 76 3b 0a  pCovidx = pCov;.
20600 20 20 20 20 69 66 28 20 70 43 6f 76 20 29 20 70      if( pCov ) p
20610 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 20 3d  Level->iIdxCur =
20620 20 69 43 6f 76 43 75 72 3b 0a 20 20 20 20 69 66   iCovCur;.    if
20630 28 20 70 41 6e 64 45 78 70 72 20 29 7b 0a 20 20  ( pAndExpr ){.  
20640 20 20 20 20 70 41 6e 64 45 78 70 72 2d 3e 70 4c      pAndExpr->pL
20650 65 66 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 73  eft = 0;.      s
20660 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
20670 28 64 62 2c 20 70 41 6e 64 45 78 70 72 29 3b 0a  (db, pAndExpr);.
20680 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
20690 33 56 64 62 65 43 68 61 6e 67 65 50 31 28 76 2c  3VdbeChangeP1(v,
206a0 20 69 52 65 74 49 6e 69 74 2c 20 73 71 6c 69 74   iRetInit, sqlit
206b0 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
206c0 72 28 76 29 29 3b 0a 20 20 20 20 73 71 6c 69 74  r(v));.    sqlit
206d0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
206e0 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70 4c 65 76  OP_Goto, 0, pLev
206f0 65 6c 2d 3e 61 64 64 72 42 72 6b 29 3b 0a 20 20  el->addrBrk);.  
20700 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
20710 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 4c 6f  olveLabel(v, iLo
20720 6f 70 42 6f 64 79 29 3b 0a 0a 20 20 20 20 69 66  opBody);..    if
20730 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c  ( pWInfo->nLevel
20740 3e 31 20 29 20 73 71 6c 69 74 65 33 53 74 61 63  >1 ) sqlite3Stac
20750 6b 46 72 65 65 28 64 62 2c 20 70 4f 72 54 61 62  kFree(db, pOrTab
20760 29 3b 0a 20 20 20 20 69 66 28 20 21 75 6e 74 65  );.    if( !unte
20770 73 74 65 64 54 65 72 6d 73 20 29 20 64 69 73 61  stedTerms ) disa
20780 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20  bleTerm(pLevel, 
20790 70 54 65 72 6d 29 3b 0a 20 20 7d 65 6c 73 65 0a  pTerm);.  }else.
207a0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
207b0 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a  _OMIT_OR_OPTIMIZ
207c0 41 54 49 4f 4e 20 2a 2f 0a 0a 20 20 7b 0a 20 20  ATION */..  {.  
207d0 20 20 2f 2a 20 43 61 73 65 20 36 3a 20 20 54 68    /* Case 6:  Th
207e0 65 72 65 20 69 73 20 6e 6f 20 75 73 61 62 6c 65  ere is no usable
207f0 20 69 6e 64 65 78 2e 20 20 57 65 20 6d 75 73 74   index.  We must
20800 20 64 6f 20 61 20 63 6f 6d 70 6c 65 74 65 0a 20   do a complete. 
20810 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 73     **          s
20820 63 61 6e 20 6f 66 20 74 68 65 20 65 6e 74 69 72  can of the entir
20830 65 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a  e table..    */.
20840 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
20850 20 75 38 20 61 53 74 65 70 5b 5d 20 3d 20 7b 20   u8 aStep[] = { 
20860 4f 50 5f 4e 65 78 74 2c 20 4f 50 5f 50 72 65 76  OP_Next, OP_Prev
20870 20 7d 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63   };.    static c
20880 6f 6e 73 74 20 75 38 20 61 53 74 61 72 74 5b 5d  onst u8 aStart[]
20890 20 3d 20 7b 20 4f 50 5f 52 65 77 69 6e 64 2c 20   = { OP_Rewind, 
208a0 4f 50 5f 4c 61 73 74 20 7d 3b 0a 20 20 20 20 61  OP_Last };.    a
208b0 73 73 65 72 74 28 20 62 52 65 76 3d 3d 30 20 7c  ssert( bRev==0 |
208c0 7c 20 62 52 65 76 3d 3d 31 20 29 3b 0a 20 20 20  | bRev==1 );.   
208d0 20 69 66 28 20 70 54 61 62 49 74 65 6d 2d 3e 69   if( pTabItem->i
208e0 73 52 65 63 75 72 73 69 76 65 20 29 7b 0a 20 20  sRecursive ){.  
208f0 20 20 20 20 2f 2a 20 54 61 62 6c 65 73 20 6d 61      /* Tables ma
20900 72 6b 65 64 20 69 73 52 65 63 75 72 73 69 76 65  rked isRecursive
20910 20 68 61 76 65 20 6f 6e 6c 79 20 61 20 73 69 6e   have only a sin
20920 67 6c 65 20 72 6f 77 20 74 68 61 74 20 69 73 20  gle row that is 
20930 73 74 6f 72 65 64 20 69 6e 0a 20 20 20 20 20 20  stored in.      
20940 2a 2a 20 61 20 70 73 65 75 64 6f 2d 63 75 72 73  ** a pseudo-curs
20950 6f 72 2e 20 20 4e 6f 20 6e 65 65 64 20 74 6f 20  or.  No need to 
20960 52 65 77 69 6e 64 20 6f 72 20 4e 65 78 74 20 73  Rewind or Next s
20970 75 63 68 20 63 75 72 73 6f 72 73 2e 20 2a 2f 0a  uch cursors. */.
20980 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70        pLevel->op
20990 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20   = OP_Noop;.    
209a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 65  }else{.      pLe
209b0 76 65 6c 2d 3e 6f 70 20 3d 20 61 53 74 65 70 5b  vel->op = aStep[
209c0 62 52 65 76 5d 3b 0a 20 20 20 20 20 20 70 4c 65  bRev];.      pLe
209d0 76 65 6c 2d 3e 70 31 20 3d 20 69 43 75 72 3b 0a  vel->p1 = iCur;.
209e0 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32        pLevel->p2
209f0 20 3d 20 31 20 2b 20 73 71 6c 69 74 65 33 56 64   = 1 + sqlite3Vd
20a00 62 65 41 64 64 4f 70 32 28 76 2c 20 61 53 74 61  beAddOp2(v, aSta
20a10 72 74 5b 62 52 65 76 5d 2c 20 69 43 75 72 2c 20  rt[bRev], iCur, 
20a20 61 64 64 72 42 72 6b 29 3b 0a 20 20 20 20 20 20  addrBrk);.      
20a30 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
20a40 2c 20 62 52 65 76 3d 3d 30 29 3b 0a 20 20 20 20  , bRev==0);.    
20a50 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
20a60 28 76 2c 20 62 52 65 76 21 3d 30 29 3b 0a 20 20  (v, bRev!=0);.  
20a70 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 35 20 3d      pLevel->p5 =
20a80 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54   SQLITE_STMTSTAT
20a90 55 53 5f 46 55 4c 4c 53 43 41 4e 5f 53 54 45 50  US_FULLSCAN_STEP
20aa0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
20ab0 2a 20 49 6e 73 65 72 74 20 63 6f 64 65 20 74 6f  * Insert code to
20ac0 20 74 65 73 74 20 65 76 65 72 79 20 73 75 62 65   test every sube
20ad0 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 63  xpression that c
20ae0 61 6e 20 62 65 20 63 6f 6d 70 6c 65 74 65 6c 79  an be completely
20af0 0a 20 20 2a 2a 20 63 6f 6d 70 75 74 65 64 20 75  .  ** computed u
20b00 73 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74  sing the current
20b10 20 73 65 74 20 6f 66 20 74 61 62 6c 65 73 2e 0a   set of tables..
20b20 20 20 2a 2f 0a 20 20 66 6f 72 28 70 54 65 72 6d    */.  for(pTerm
20b30 3d 70 57 43 2d 3e 61 2c 20 6a 3d 70 57 43 2d 3e  =pWC->a, j=pWC->
20b40 6e 54 65 72 6d 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c  nTerm; j>0; j--,
20b50 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 45   pTerm++){.    E
20b60 78 70 72 20 2a 70 45 3b 0a 20 20 20 20 74 65 73  xpr *pE;.    tes
20b70 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 77 74  tcase( pTerm->wt
20b80 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52  Flags & TERM_VIR
20b90 54 55 41 4c 20 29 3b 0a 20 20 20 20 74 65 73 74  TUAL );.    test
20ba0 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 77 74 46  case( pTerm->wtF
20bb0 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 44 45  lags & TERM_CODE
20bc0 44 20 29 3b 0a 20 20 20 20 69 66 28 20 70 54 65  D );.    if( pTe
20bd0 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54  rm->wtFlags & (T
20be0 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d  ERM_VIRTUAL|TERM
20bf0 5f 43 4f 44 45 44 29 20 29 20 63 6f 6e 74 69 6e  _CODED) ) contin
20c00 75 65 3b 0a 20 20 20 20 69 66 28 20 28 70 54 65  ue;.    if( (pTe
20c10 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26 20  rm->prereqAll & 
20c20 70 4c 65 76 65 6c 2d 3e 6e 6f 74 52 65 61 64 79  pLevel->notReady
20c30 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 74 65  )!=0 ){.      te
20c40 73 74 63 61 73 65 28 20 70 57 49 6e 66 6f 2d 3e  stcase( pWInfo->
20c50 75 6e 74 65 73 74 65 64 54 65 72 6d 73 3d 3d 30  untestedTerms==0
20c60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
20c70 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72  && (pWInfo->wctr
20c80 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  lFlags & WHERE_O
20c90 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 29 21 3d 30  NETABLE_ONLY)!=0
20ca0 20 29 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f   );.      pWInfo
20cb0 2d 3e 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20  ->untestedTerms 
20cc0 3d 20 31 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69  = 1;.      conti
20cd0 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  nue;.    }.    p
20ce0 45 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  E = pTerm->pExpr
20cf0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45  ;.    assert( pE
20d00 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70  !=0 );.    if( p
20d10 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e  Level->iLeftJoin
20d20 20 26 26 20 21 45 78 70 72 48 61 73 50 72 6f 70   && !ExprHasProp
20d30 65 72 74 79 28 70 45 2c 20 45 50 5f 46 72 6f 6d  erty(pE, EP_From
20d40 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20 20 20 63  Join) ){.      c
20d50 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20  ontinue;.    }. 
20d60 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
20d70 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45  False(pParse, pE
20d80 2c 20 61 64 64 72 43 6f 6e 74 2c 20 53 51 4c 49  , addrCont, SQLI
20d90 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a  TE_JUMPIFNULL);.
20da0 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61      pTerm->wtFla
20db0 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44  gs |= TERM_CODED
20dc0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 73 65  ;.  }..  /* Inse
20dd0 72 74 20 63 6f 64 65 20 74 6f 20 74 65 73 74 20  rt code to test 
20de0 66 6f 72 20 69 6d 70 6c 69 65 64 20 63 6f 6e 73  for implied cons
20df0 74 72 61 69 6e 74 73 20 62 61 73 65 64 20 6f 6e  traints based on
20e00 20 74 72 61 6e 73 69 74 69 76 69 74 79 0a 20 20   transitivity.  
20e10 2a 2a 20 6f 66 20 74 68 65 20 22 3d 3d 22 20 6f  ** of the "==" o
20e20 70 65 72 61 74 6f 72 2e 0a 20 20 2a 2a 0a 20 20  perator..  **.  
20e30 2a 2a 20 45 78 61 6d 70 6c 65 3a 20 49 66 20 74  ** Example: If t
20e40 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
20e50 63 6f 6e 74 61 69 6e 73 20 22 74 31 2e 61 3d 74  contains "t1.a=t
20e60 32 2e 62 22 20 61 6e 64 20 22 74 32 2e 62 3d 31  2.b" and "t2.b=1
20e70 32 33 22 0a 20 20 2a 2a 20 61 6e 64 20 77 65 20  23".  ** and we 
20e80 61 72 65 20 63 6f 64 69 6e 67 20 74 68 65 20 74  are coding the t
20e90 31 20 6c 6f 6f 70 20 61 6e 64 20 74 68 65 20 74  1 loop and the t
20ea0 32 20 6c 6f 6f 70 20 68 61 73 20 6e 6f 74 20 79  2 loop has not y
20eb0 65 74 20 63 6f 64 65 64 2c 0a 20 20 2a 2a 20 74  et coded,.  ** t
20ec0 68 65 6e 20 77 65 20 63 61 6e 6e 6f 74 20 75 73  hen we cannot us
20ed0 65 20 74 68 65 20 22 74 31 2e 61 3d 74 32 2e 62  e the "t1.a=t2.b
20ee0 22 20 63 6f 6e 73 74 72 61 69 6e 74 2c 20 62 75  " constraint, bu
20ef0 74 20 77 65 20 63 61 6e 20 63 6f 64 65 0a 20 20  t we can code.  
20f00 2a 2a 20 74 68 65 20 69 6d 70 6c 69 65 64 20 22  ** the implied "
20f10 74 31 2e 61 3d 31 32 33 22 20 63 6f 6e 73 74 72  t1.a=123" constr
20f20 61 69 6e 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  aint..  */.  for
20f30 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 2c 20 6a  (pTerm=pWC->a, j
20f40 3d 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 6a 3e 30  =pWC->nTerm; j>0
20f50 3b 20 6a 2d 2d 2c 20 70 54 65 72 6d 2b 2b 29 7b  ; j--, pTerm++){
20f60 0a 20 20 20 20 45 78 70 72 20 2a 70 45 2c 20 2a  .    Expr *pE, *
20f70 70 45 41 6c 74 3b 0a 20 20 20 20 57 68 65 72 65  pEAlt;.    Where
20f80 54 65 72 6d 20 2a 70 41 6c 74 3b 0a 20 20 20 20  Term *pAlt;.    
20f90 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61  if( pTerm->wtFla
20fa0 67 73 20 26 20 28 54 45 52 4d 5f 56 49 52 54 55  gs & (TERM_VIRTU
20fb0 41 4c 7c 54 45 52 4d 5f 43 4f 44 45 44 29 20 29  AL|TERM_CODED) )
20fc0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
20fd0 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  f( pTerm->eOpera
20fe0 74 6f 72 21 3d 28 57 4f 5f 45 51 55 49 56 7c 57  tor!=(WO_EQUIV|W
20ff0 4f 5f 45 51 29 20 29 20 63 6f 6e 74 69 6e 75 65  O_EQ) ) continue
21000 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  ;.    if( pTerm-
21010 3e 6c 65 66 74 43 75 72 73 6f 72 21 3d 69 43 75  >leftCursor!=iCu
21020 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  r ) continue;.  
21030 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 4c    if( pLevel->iL
21040 65 66 74 4a 6f 69 6e 20 29 20 63 6f 6e 74 69 6e  eftJoin ) contin
21050 75 65 3b 0a 20 20 20 20 70 45 20 3d 20 70 54 65  ue;.    pE = pTe
21060 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 61  rm->pExpr;.    a
21070 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
21080 72 6f 70 65 72 74 79 28 70 45 2c 20 45 50 5f 46  roperty(pE, EP_F
21090 72 6f 6d 4a 6f 69 6e 29 20 29 3b 0a 20 20 20 20  romJoin) );.    
210a0 61 73 73 65 72 74 28 20 28 70 54 65 72 6d 2d 3e  assert( (pTerm->
210b0 70 72 65 72 65 71 52 69 67 68 74 20 26 20 70 4c  prereqRight & pL
210c0 65 76 65 6c 2d 3e 6e 6f 74 52 65 61 64 79 29 21  evel->notReady)!
210d0 3d 30 20 29 3b 0a 20 20 20 20 70 41 6c 74 20 3d  =0 );.    pAlt =
210e0 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69   findTerm(pWC, i
210f0 43 75 72 2c 20 70 54 65 72 6d 2d 3e 75 2e 6c 65  Cur, pTerm->u.le
21100 66 74 43 6f 6c 75 6d 6e 2c 20 6e 6f 74 52 65 61  ftColumn, notRea
21110 64 79 2c 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 2c  dy, WO_EQ|WO_IN,
21120 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 41 6c   0);.    if( pAl
21130 74 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  t==0 ) continue;
21140 0a 20 20 20 20 69 66 28 20 70 41 6c 74 2d 3e 77  .    if( pAlt->w
21150 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 43  tFlags & (TERM_C
21160 4f 44 45 44 29 20 29 20 63 6f 6e 74 69 6e 75 65  ODED) ) continue
21170 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
21180 70 41 6c 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20  pAlt->eOperator 
21190 26 20 57 4f 5f 45 51 20 29 3b 0a 20 20 20 20 74  & WO_EQ );.    t
211a0 65 73 74 63 61 73 65 28 20 70 41 6c 74 2d 3e 65  estcase( pAlt->e
211b0 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e  Operator & WO_IN
211c0 20 29 3b 0a 20 20 20 20 56 64 62 65 4d 6f 64 75   );.    VdbeModu
211d0 6c 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 62  leComment((v, "b
211e0 65 67 69 6e 20 74 72 61 6e 73 69 74 69 76 65 20  egin transitive 
211f0 63 6f 6e 73 74 72 61 69 6e 74 22 29 29 3b 0a 20  constraint"));. 
21200 20 20 20 70 45 41 6c 74 20 3d 20 73 71 6c 69 74     pEAlt = sqlit
21210 65 33 53 74 61 63 6b 41 6c 6c 6f 63 52 61 77 28  e3StackAllocRaw(
21220 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 45 41 6c  db, sizeof(*pEAl
21230 74 29 29 3b 0a 20 20 20 20 69 66 28 20 70 45 41  t));.    if( pEA
21240 6c 74 20 29 7b 0a 20 20 20 20 20 20 2a 70 45 41  lt ){.      *pEA
21250 6c 74 20 3d 20 2a 70 41 6c 74 2d 3e 70 45 78 70  lt = *pAlt->pExp
21260 72 3b 0a 20 20 20 20 20 20 70 45 41 6c 74 2d 3e  r;.      pEAlt->
21270 70 4c 65 66 74 20 3d 20 70 45 2d 3e 70 4c 65 66  pLeft = pE->pLef
21280 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  t;.      sqlite3
21290 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
212a0 73 65 2c 20 70 45 41 6c 74 2c 20 61 64 64 72 43  se, pEAlt, addrC
212b0 6f 6e 74 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50  ont, SQLITE_JUMP
212c0 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73  IFNULL);.      s
212d0 71 6c 69 74 65 33 53 74 61 63 6b 46 72 65 65 28  qlite3StackFree(
212e0 64 62 2c 20 70 45 41 6c 74 29 3b 0a 20 20 20 20  db, pEAlt);.    
212f0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 6f 72 20  }.  }..  /* For 
21300 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49  a LEFT OUTER JOI
21310 4e 2c 20 67 65 6e 65 72 61 74 65 20 63 6f 64 65  N, generate code
21320 20 74 68 61 74 20 77 69 6c 6c 20 72 65 63 6f 72   that will recor
21330 64 20 74 68 65 20 66 61 63 74 20 74 68 61 74 0a  d the fact that.
21340 20 20 2a 2a 20 61 74 20 6c 65 61 73 74 20 6f 6e    ** at least on
21350 65 20 72 6f 77 20 6f 66 20 74 68 65 20 72 69 67  e row of the rig
21360 68 74 20 74 61 62 6c 65 20 68 61 73 20 6d 61 74  ht table has mat
21370 63 68 65 64 20 74 68 65 20 6c 65 66 74 20 74 61  ched the left ta
21380 62 6c 65 2e 20 20 0a 20 20 2a 2f 0a 20 20 69 66  ble.  .  */.  if
21390 28 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a  ( pLevel->iLeftJ
213a0 6f 69 6e 20 29 7b 0a 20 20 20 20 70 4c 65 76 65  oin ){.    pLeve
213b0 6c 2d 3e 61 64 64 72 46 69 72 73 74 20 3d 20 73  l->addrFirst = s
213c0 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
213d0 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 73 71  tAddr(v);.    sq
213e0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
213f0 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31  v, OP_Integer, 1
21400 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a  , pLevel->iLeftJ
21410 6f 69 6e 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  oin);.    VdbeCo
21420 6d 6d 65 6e 74 28 28 76 2c 20 22 72 65 63 6f 72  mment((v, "recor
21430 64 20 4c 45 46 54 20 4a 4f 49 4e 20 68 69 74 22  d LEFT JOIN hit"
21440 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  ));.    sqlite3E
21450 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50  xprCacheClear(pP
21460 61 72 73 65 29 3b 0a 20 20 20 20 66 6f 72 28 70  arse);.    for(p
21470 54 65 72 6d 3d 70 57 43 2d 3e 61 2c 20 6a 3d 30  Term=pWC->a, j=0
21480 3b 20 6a 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20  ; j<pWC->nTerm; 
21490 6a 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20  j++, pTerm++){. 
214a0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
214b0 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
214c0 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a  TERM_VIRTUAL );.
214d0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
214e0 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
214f0 20 54 45 52 4d 5f 43 4f 44 45 44 20 29 3b 0a 20   TERM_CODED );. 
21500 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e       if( pTerm->
21510 77 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f  wtFlags & (TERM_
21520 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 43 4f 44  VIRTUAL|TERM_COD
21530 45 44 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ED) ) continue;.
21540 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d        if( (pTerm
21550 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26 20 70 4c  ->prereqAll & pL
21560 65 76 65 6c 2d 3e 6e 6f 74 52 65 61 64 79 29 21  evel->notReady)!
21570 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  =0 ){.        as
21580 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 75 6e  sert( pWInfo->un
21590 74 65 73 74 65 64 54 65 72 6d 73 20 29 3b 0a 20  testedTerms );. 
215a0 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
215b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
215c0 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 70 45  ssert( pTerm->pE
215d0 78 70 72 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  xpr );.      sql
215e0 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
215f0 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2d 3e 70  pParse, pTerm->p
21600 45 78 70 72 2c 20 61 64 64 72 43 6f 6e 74 2c 20  Expr, addrCont, 
21610 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
21620 4c 29 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d  L);.      pTerm-
21630 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d  >wtFlags |= TERM
21640 5f 43 4f 44 45 44 3b 0a 20 20 20 20 7d 0a 20 20  _CODED;.    }.  
21650 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 4c 65 76  }..  return pLev
21660 65 6c 2d 3e 6e 6f 74 52 65 61 64 79 3b 0a 7d 0a  el->notReady;.}.
21670 0a 23 69 66 20 64 65 66 69 6e 65 64 28 57 48 45  .#if defined(WHE
21680 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 29  RETRACE_ENABLED)
21690 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
216a0 54 45 5f 45 4e 41 42 4c 45 5f 54 52 45 45 5f 45  TE_ENABLE_TREE_E
216b0 58 50 4c 41 49 4e 29 0a 2f 2a 0a 2a 2a 20 47 65  XPLAIN)./*.** Ge
216c0 6e 65 72 61 74 65 20 22 45 78 70 6c 61 6e 61 74  nerate "Explanat
216d0 69 6f 6e 22 20 74 65 78 74 20 66 6f 72 20 61 20  ion" text for a 
216e0 57 68 65 72 65 54 65 72 6d 2e 0a 2a 2f 0a 73 74  WhereTerm..*/.st
216f0 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 45  atic void whereE
21700 78 70 6c 61 69 6e 54 65 72 6d 28 56 64 62 65 20  xplainTerm(Vdbe 
21710 2a 76 2c 20 57 68 65 72 65 54 65 72 6d 20 2a 70  *v, WhereTerm *p
21720 54 65 72 6d 29 7b 0a 20 20 63 68 61 72 20 7a 54  Term){.  char zT
21730 79 70 65 5b 34 5d 3b 0a 20 20 6d 65 6d 63 70 79  ype[4];.  memcpy
21740 28 7a 54 79 70 65 2c 20 22 2e 2e 2e 22 2c 20 34  (zType, "...", 4
21750 29 3b 0a 20 20 69 66 28 20 70 54 65 72 6d 2d 3e  );.  if( pTerm->
21760 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
21770 49 52 54 55 41 4c 20 29 20 7a 54 79 70 65 5b 30  IRTUAL ) zType[0
21780 5d 20 3d 20 27 56 27 3b 0a 20 20 69 66 28 20 70  ] = 'V';.  if( p
21790 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
217a0 26 20 57 4f 5f 45 51 55 49 56 20 20 29 20 7a 54  & WO_EQUIV  ) zT
217b0 79 70 65 5b 31 5d 20 3d 20 27 45 27 3b 0a 20 20  ype[1] = 'E';.  
217c0 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
217d0 72 74 79 28 70 54 65 72 6d 2d 3e 70 45 78 70 72  rty(pTerm->pExpr
217e0 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29  , EP_FromJoin) )
217f0 20 7a 54 79 70 65 5b 32 5d 20 3d 20 27 4c 27 3b   zType[2] = 'L';
21800 0a 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69  .  sqlite3Explai
21810 6e 50 72 69 6e 74 66 28 76 2c 20 22 25 73 20 22  nPrintf(v, "%s "
21820 2c 20 7a 54 79 70 65 29 3b 0a 20 20 73 71 6c 69  , zType);.  sqli
21830 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72 28 76  te3ExplainExpr(v
21840 2c 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 29 3b  , pTerm->pExpr);
21850 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 57 48 45  .}.#endif /* WHE
21860 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20  RETRACE_ENABLED 
21870 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
21880 5f 54 52 45 45 5f 45 58 50 4c 41 49 4e 20 2a 2f  _TREE_EXPLAIN */
21890 0a 0a 0a 23 69 66 64 65 66 20 57 48 45 52 45 54  ...#ifdef WHERET
218a0 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 2f 2a 0a  RACE_ENABLED./*.
218b0 2a 2a 20 50 72 69 6e 74 20 61 20 57 68 65 72 65  ** Print a Where
218c0 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 66 6f 72 20  Loop object for 
218d0 64 65 62 75 67 67 69 6e 67 20 70 75 72 70 6f 73  debugging purpos
218e0 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  es.*/.static voi
218f0 64 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74  d whereLoopPrint
21900 28 57 68 65 72 65 4c 6f 6f 70 20 2a 70 2c 20 57  (WhereLoop *p, W
21910 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 29  hereClause *pWC)
21920 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  {.  WhereInfo *p
21930 57 49 6e 66 6f 20 3d 20 70 57 43 2d 3e 70 57 49  WInfo = pWC->pWI
21940 6e 66 6f 3b 0a 20 20 69 6e 74 20 6e 62 20 3d 20  nfo;.  int nb = 
21950 31 2b 28 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c  1+(pWInfo->pTabL
21960 69 73 74 2d 3e 6e 53 72 63 2b 37 29 2f 38 3b 0a  ist->nSrc+7)/8;.
21970 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
21980 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 70  _item *pItem = p
21990 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d  WInfo->pTabList-
219a0 3e 61 20 2b 20 70 2d 3e 69 54 61 62 3b 0a 20 20  >a + p->iTab;.  
219b0 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49  Table *pTab = pI
219c0 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 73 71 6c  tem->pTab;.  sql
219d0 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
219e0 22 25 63 25 32 64 2e 25 30 2a 6c 6c 78 2e 25 30  "%c%2d.%0*llx.%0
219f0 2a 6c 6c 78 22 2c 20 70 2d 3e 63 49 64 2c 0a 20  *llx", p->cId,. 
21a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21a10 20 20 20 20 70 2d 3e 69 54 61 62 2c 20 6e 62 2c      p->iTab, nb,
21a20 20 70 2d 3e 6d 61 73 6b 53 65 6c 66 2c 20 6e 62   p->maskSelf, nb
21a30 2c 20 70 2d 3e 70 72 65 72 65 71 29 3b 0a 20 20  , p->prereq);.  
21a40 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
21a50 74 66 28 22 20 25 31 32 73 22 2c 0a 20 20 20 20  tf(" %12s",.    
21a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21a70 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3f   pItem->zAlias ?
21a80 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3a   pItem->zAlias :
21a90 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
21aa0 20 69 66 28 20 28 70 2d 3e 77 73 46 6c 61 67 73   if( (p->wsFlags
21ab0 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c   & WHERE_VIRTUAL
21ac0 54 41 42 4c 45 29 3d 3d 30 20 29 7b 0a 20 20 20  TABLE)==0 ){.   
21ad0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
21ae0 61 6d 65 3b 0a 20 20 20 20 20 69 66 28 20 70 2d  ame;.     if( p-
21af0 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20  >u.btree.pIndex 
21b00 26 26 20 28 7a 4e 61 6d 65 20 3d 20 70 2d 3e 75  && (zName = p->u
21b10 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 2d 3e 7a  .btree.pIndex->z
21b20 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20  Name)!=0 ){.    
21b30 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 4e    if( strncmp(zN
21b40 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 61 75 74  ame, "sqlite_aut
21b50 6f 69 6e 64 65 78 5f 22 2c 20 31 37 29 3d 3d 30  oindex_", 17)==0
21b60 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
21b70 69 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  i = sqlite3Strle
21b80 6e 33 30 28 7a 4e 61 6d 65 29 20 2d 20 31 3b 0a  n30(zName) - 1;.
21b90 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 7a          while( z
21ba0 4e 61 6d 65 5b 69 5d 21 3d 27 5f 27 20 29 20 69  Name[i]!='_' ) i
21bb0 2d 2d 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d  --;.        zNam
21bc0 65 20 2b 3d 20 69 3b 0a 20 20 20 20 20 20 7d 0a  e += i;.      }.
21bd0 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
21be0 75 67 50 72 69 6e 74 66 28 22 2e 25 2d 31 36 73  ugPrintf(".%-16s
21bf0 20 25 32 64 22 2c 20 7a 4e 61 6d 65 2c 20 70 2d   %2d", zName, p-
21c00 3e 75 2e 62 74 72 65 65 2e 6e 45 71 29 3b 0a 20  >u.btree.nEq);. 
21c10 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
21c20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
21c30 74 66 28 22 25 32 30 73 22 2c 22 22 29 3b 0a 20  tf("%20s","");. 
21c40 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
21c50 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 69    char *z;.    i
21c60 66 28 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78  f( p->u.vtab.idx
21c70 53 74 72 20 29 7b 0a 20 20 20 20 20 20 7a 20 3d  Str ){.      z =
21c80 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
21c90 28 22 28 25 64 2c 5c 22 25 73 5c 22 2c 25 78 29  ("(%d,\"%s\",%x)
21ca0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
21cb0 20 20 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78     p->u.vtab.idx
21cc0 4e 75 6d 2c 20 70 2d 3e 75 2e 76 74 61 62 2e 69  Num, p->u.vtab.i
21cd0 64 78 53 74 72 2c 20 70 2d 3e 75 2e 76 74 61 62  dxStr, p->u.vtab
21ce0 2e 6f 6d 69 74 4d 61 73 6b 29 3b 0a 20 20 20 20  .omitMask);.    
21cf0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 20 3d  }else{.      z =
21d00 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
21d10 28 22 28 25 64 2c 25 78 29 22 2c 20 70 2d 3e 75  ("(%d,%x)", p->u
21d20 2e 76 74 61 62 2e 69 64 78 4e 75 6d 2c 20 70 2d  .vtab.idxNum, p-
21d30 3e 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b  >u.vtab.omitMask
21d40 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
21d50 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
21d60 22 20 25 2d 31 39 73 22 2c 20 7a 29 3b 0a 20 20  " %-19s", z);.  
21d70 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
21d80 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
21d90 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 66 20  DebugPrintf(" f 
21da0 25 30 35 78 20 4e 20 25 64 22 2c 20 70 2d 3e 77  %05x N %d", p->w
21db0 73 46 6c 61 67 73 2c 20 70 2d 3e 6e 4c 54 65 72  sFlags, p->nLTer
21dc0 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62  m);.  sqlite3Deb
21dd0 75 67 50 72 69 6e 74 66 28 22 20 63 6f 73 74 20  ugPrintf(" cost 
21de0 25 64 2c 25 64 2c 25 64 5c 6e 22 2c 20 70 2d 3e  %d,%d,%d\n", p->
21df0 72 53 65 74 75 70 2c 20 70 2d 3e 72 52 75 6e 2c  rSetup, p->rRun,
21e00 20 70 2d 3e 6e 4f 75 74 29 3b 0a 23 69 66 64 65   p->nOut);.#ifde
21e10 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
21e20 54 52 45 45 5f 45 58 50 4c 41 49 4e 0a 20 20 2f  TREE_EXPLAIN.  /
21e30 2a 20 49 66 20 74 68 65 20 30 78 31 30 30 20 62  * If the 0x100 b
21e40 69 74 20 6f 66 20 77 68 65 72 65 74 72 61 63 69  it of wheretraci
21e50 6e 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20  ng is set, then 
21e60 73 68 6f 77 20 61 6c 6c 20 6f 66 20 74 68 65 20  show all of the 
21e70 63 6f 6e 73 74 72 61 69 6e 74 0a 20 20 2a 2a 20  constraint.  ** 
21e80 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74  expressions in t
21e90 68 65 20 57 68 65 72 65 4c 6f 6f 70 2e 61 4c 54  he WhereLoop.aLT
21ea0 65 72 6d 5b 5d 20 61 72 72 61 79 2e 0a 20 20 2a  erm[] array..  *
21eb0 2f 0a 20 20 69 66 28 20 70 2d 3e 6e 4c 54 65 72  /.  if( p->nLTer
21ec0 6d 20 26 26 20 28 73 71 6c 69 74 65 33 57 68 65  m && (sqlite3Whe
21ed0 72 65 54 72 61 63 65 20 26 20 30 78 31 30 30 29  reTrace & 0x100)
21ee0 21 3d 30 20 29 7b 20 20 2f 2a 20 57 48 45 52 45  !=0 ){  /* WHERE
21ef0 54 52 41 43 45 20 30 78 31 30 30 20 2a 2f 0a 20  TRACE 0x100 */. 
21f00 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 56 64     int i;.    Vd
21f10 62 65 20 2a 76 20 3d 20 70 57 49 6e 66 6f 2d 3e  be *v = pWInfo->
21f20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
21f30 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
21f40 6e 42 65 67 69 6e 28 76 29 3b 0a 20 20 20 20 66  nBegin(v);.    f
21f50 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4c 54  or(i=0; i<p->nLT
21f60 65 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  erm; i++){.     
21f70 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
21f80 6d 20 3d 20 70 2d 3e 61 4c 54 65 72 6d 5b 69 5d  m = p->aLTerm[i]
21f90 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72  ;.      if( pTer
21fa0 6d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  m==0 ) continue;
21fb0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
21fc0 70 6c 61 69 6e 50 72 69 6e 74 66 28 76 2c 20 22  plainPrintf(v, "
21fd0 20 20 28 25 64 29 20 23 25 2d 32 64 20 22 2c 20    (%d) #%-2d ", 
21fe0 69 2b 31 2c 20 28 69 6e 74 29 28 70 54 65 72 6d  i+1, (int)(pTerm
21ff0 2d 70 57 43 2d 3e 61 29 29 3b 0a 20 20 20 20 20  -pWC->a));.     
22000 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
22010 75 73 68 28 76 29 3b 0a 20 20 20 20 20 20 77 68  ush(v);.      wh
22020 65 72 65 45 78 70 6c 61 69 6e 54 65 72 6d 28 76  ereExplainTerm(v
22030 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20 20 20 20  , pTerm);.      
22040 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 6f  sqlite3ExplainPo
22050 70 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  p(v);.      sqli
22060 74 65 33 45 78 70 6c 61 69 6e 4e 4c 28 76 29 3b  te3ExplainNL(v);
22070 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
22080 65 33 45 78 70 6c 61 69 6e 46 69 6e 69 73 68 28  e3ExplainFinish(
22090 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  v);.    sqlite3D
220a0 65 62 75 67 50 72 69 6e 74 66 28 22 25 73 22 2c  ebugPrintf("%s",
220b0 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 70 6c   sqlite3VdbeExpl
220c0 61 6e 61 74 69 6f 6e 28 76 29 29 3b 0a 20 20 7d  anation(v));.  }
220d0 0a 23 65 6e 64 69 66 0a 7d 0a 23 65 6e 64 69 66  .#endif.}.#endif
220e0 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20  ../*.** Convert 
220f0 62 75 6c 6b 20 6d 65 6d 6f 72 79 20 69 6e 74 6f  bulk memory into
22100 20 61 20 76 61 6c 69 64 20 57 68 65 72 65 4c 6f   a valid WhereLo
22110 6f 70 20 74 68 61 74 20 63 61 6e 20 62 65 20 70  op that can be p
22120 61 73 73 65 64 0a 2a 2a 20 74 6f 20 77 68 65 72  assed.** to wher
22130 65 4c 6f 6f 70 43 6c 65 61 72 20 68 61 72 6d 6c  eLoopClear harml
22140 65 73 73 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  essly..*/.static
22150 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 49   void whereLoopI
22160 6e 69 74 28 57 68 65 72 65 4c 6f 6f 70 20 2a 70  nit(WhereLoop *p
22170 29 7b 0a 20 20 70 2d 3e 61 4c 54 65 72 6d 20 3d  ){.  p->aLTerm =
22180 20 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 3b   p->aLTermSpace;
22190 0a 20 20 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20 30  .  p->nLTerm = 0
221a0 3b 0a 20 20 70 2d 3e 6e 4c 53 6c 6f 74 20 3d 20  ;.  p->nLSlot = 
221b0 41 72 72 61 79 53 69 7a 65 28 70 2d 3e 61 4c 54  ArraySize(p->aLT
221c0 65 72 6d 53 70 61 63 65 29 3b 0a 20 20 70 2d 3e  ermSpace);.  p->
221d0 77 73 46 6c 61 67 73 20 3d 20 30 3b 0a 7d 0a 0a  wsFlags = 0;.}..
221e0 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20  /*.** Clear the 
221f0 57 68 65 72 65 4c 6f 6f 70 2e 75 20 75 6e 69 6f  WhereLoop.u unio
22200 6e 2e 20 20 4c 65 61 76 65 20 57 68 65 72 65 4c  n.  Leave WhereL
22210 6f 6f 70 2e 70 4c 54 65 72 6d 20 69 6e 74 61 63  oop.pLTerm intac
22220 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
22230 64 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72  d whereLoopClear
22240 55 6e 69 6f 6e 28 73 71 6c 69 74 65 33 20 2a 64  Union(sqlite3 *d
22250 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29  b, WhereLoop *p)
22260 7b 0a 20 20 69 66 28 20 70 2d 3e 77 73 46 6c 61  {.  if( p->wsFla
22270 67 73 20 26 20 28 57 48 45 52 45 5f 56 49 52 54  gs & (WHERE_VIRT
22280 55 41 4c 54 41 42 4c 45 7c 57 48 45 52 45 5f 41  UALTABLE|WHERE_A
22290 55 54 4f 5f 49 4e 44 45 58 29 20 29 7b 0a 20 20  UTO_INDEX) ){.  
222a0 20 20 69 66 28 20 28 70 2d 3e 77 73 46 6c 61 67    if( (p->wsFlag
222b0 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41  s & WHERE_VIRTUA
222c0 4c 54 41 42 4c 45 29 21 3d 30 20 26 26 20 70 2d  LTABLE)!=0 && p-
222d0 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65  >u.vtab.needFree
222e0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
222f0 33 5f 66 72 65 65 28 70 2d 3e 75 2e 76 74 61 62  3_free(p->u.vtab
22300 2e 69 64 78 53 74 72 29 3b 0a 20 20 20 20 20 20  .idxStr);.      
22310 70 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72  p->u.vtab.needFr
22320 65 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d  ee = 0;.      p-
22330 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72 20 3d  >u.vtab.idxStr =
22340 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   0;.    }else if
22350 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  ( (p->wsFlags & 
22360 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58  WHERE_AUTO_INDEX
22370 29 21 3d 30 20 26 26 20 70 2d 3e 75 2e 62 74 72  )!=0 && p->u.btr
22380 65 65 2e 70 49 6e 64 65 78 21 3d 30 20 29 7b 0a  ee.pIndex!=0 ){.
22390 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
223a0 72 65 65 28 64 62 2c 20 70 2d 3e 75 2e 62 74 72  ree(db, p->u.btr
223b0 65 65 2e 70 49 6e 64 65 78 2d 3e 7a 43 6f 6c 41  ee.pIndex->zColA
223c0 66 66 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ff);.      sqlit
223d0 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28 70  e3KeyInfoUnref(p
223e0 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
223f0 2d 3e 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 20  ->pKeyInfo);.   
22400 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
22410 28 64 62 2c 20 70 2d 3e 75 2e 62 74 72 65 65 2e  (db, p->u.btree.
22420 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 70  pIndex);.      p
22430 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
22440 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
22450 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63  }../*.** Dealloc
22460 61 74 65 20 69 6e 74 65 72 6e 61 6c 20 6d 65 6d  ate internal mem
22470 6f 72 79 20 75 73 65 64 20 62 79 20 61 20 57 68  ory used by a Wh
22480 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 0a 2a  ereLoop object.*
22490 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68  /.static void wh
224a0 65 72 65 4c 6f 6f 70 43 6c 65 61 72 28 73 71 6c  ereLoopClear(sql
224b0 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c  ite3 *db, WhereL
224c0 6f 6f 70 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  oop *p){.  if( p
224d0 2d 3e 61 4c 54 65 72 6d 21 3d 70 2d 3e 61 4c 54  ->aLTerm!=p->aLT
224e0 65 72 6d 53 70 61 63 65 20 29 20 73 71 6c 69 74  ermSpace ) sqlit
224f0 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
22500 61 4c 54 65 72 6d 29 3b 0a 20 20 77 68 65 72 65  aLTerm);.  where
22510 4c 6f 6f 70 43 6c 65 61 72 55 6e 69 6f 6e 28 64  LoopClearUnion(d
22520 62 2c 20 70 29 3b 0a 20 20 77 68 65 72 65 4c 6f  b, p);.  whereLo
22530 6f 70 49 6e 69 74 28 70 29 3b 0a 7d 0a 0a 2f 2a  opInit(p);.}../*
22540 0a 2a 2a 20 49 6e 63 72 65 61 73 65 20 74 68 65  .** Increase the
22550 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
22560 6f 6e 20 66 6f 72 20 70 4c 6f 6f 70 2d 3e 61 4c  on for pLoop->aL
22570 54 65 72 6d 5b 5d 20 74 6f 20 62 65 20 61 74 20  Term[] to be at 
22580 6c 65 61 73 74 20 6e 2e 0a 2a 2f 0a 73 74 61 74  least n..*/.stat
22590 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70  ic int whereLoop
225a0 52 65 73 69 7a 65 28 73 71 6c 69 74 65 33 20 2a  Resize(sqlite3 *
225b0 64 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  db, WhereLoop *p
225c0 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 57 68 65 72  , int n){.  Wher
225d0 65 54 65 72 6d 20 2a 2a 70 61 4e 65 77 3b 0a 20  eTerm **paNew;. 
225e0 20 69 66 28 20 70 2d 3e 6e 4c 53 6c 6f 74 3e 3d   if( p->nLSlot>=
225f0 6e 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  n ) return SQLIT
22600 45 5f 4f 4b 3b 0a 20 20 6e 20 3d 20 28 6e 2b 37  E_OK;.  n = (n+7
22610 29 26 7e 37 3b 0a 20 20 70 61 4e 65 77 20 3d 20  )&~7;.  paNew = 
22620 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
22630 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 70 2d  aw(db, sizeof(p-
22640 3e 61 4c 54 65 72 6d 5b 30 5d 29 2a 6e 29 3b 0a  >aLTerm[0])*n);.
22650 20 20 69 66 28 20 70 61 4e 65 77 3d 3d 30 20 29    if( paNew==0 )
22660 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
22670 4f 4d 45 4d 3b 0a 20 20 6d 65 6d 63 70 79 28 70  OMEM;.  memcpy(p
22680 61 4e 65 77 2c 20 70 2d 3e 61 4c 54 65 72 6d 2c  aNew, p->aLTerm,
22690 20 73 69 7a 65 6f 66 28 70 2d 3e 61 4c 54 65 72   sizeof(p->aLTer
226a0 6d 5b 30 5d 29 2a 70 2d 3e 6e 4c 53 6c 6f 74 29  m[0])*p->nLSlot)
226b0 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4c 54 65 72  ;.  if( p->aLTer
226c0 6d 21 3d 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63  m!=p->aLTermSpac
226d0 65 20 29 20 73 71 6c 69 74 65 33 44 62 46 72 65  e ) sqlite3DbFre
226e0 65 28 64 62 2c 20 70 2d 3e 61 4c 54 65 72 6d 29  e(db, p->aLTerm)
226f0 3b 0a 20 20 70 2d 3e 61 4c 54 65 72 6d 20 3d 20  ;.  p->aLTerm = 
22700 70 61 4e 65 77 3b 0a 20 20 70 2d 3e 6e 4c 53 6c  paNew;.  p->nLSl
22710 6f 74 20 3d 20 6e 3b 0a 20 20 72 65 74 75 72 6e  ot = n;.  return
22720 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
22730 2a 0a 2a 2a 20 54 72 61 6e 73 66 65 72 20 63 6f  *.** Transfer co
22740 6e 74 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 73  ntent from the s
22750 65 63 6f 6e 64 20 70 4c 6f 6f 70 20 69 6e 74 6f  econd pLoop into
22760 20 74 68 65 20 66 69 72 73 74 2e 0a 2a 2f 0a 73   the first..*/.s
22770 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c  tatic int whereL
22780 6f 6f 70 58 66 65 72 28 73 71 6c 69 74 65 33 20  oopXfer(sqlite3 
22790 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a  *db, WhereLoop *
227a0 70 54 6f 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a  pTo, WhereLoop *
227b0 70 46 72 6f 6d 29 7b 0a 20 20 77 68 65 72 65 4c  pFrom){.  whereL
227c0 6f 6f 70 43 6c 65 61 72 55 6e 69 6f 6e 28 64 62  oopClearUnion(db
227d0 2c 20 70 54 6f 29 3b 0a 20 20 69 66 28 20 77 68  , pTo);.  if( wh
227e0 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62  ereLoopResize(db
227f0 2c 20 70 54 6f 2c 20 70 46 72 6f 6d 2d 3e 6e 4c  , pTo, pFrom->nL
22800 54 65 72 6d 29 20 29 7b 0a 20 20 20 20 6d 65 6d  Term) ){.    mem
22810 73 65 74 28 26 70 54 6f 2d 3e 75 2c 20 30 2c 20  set(&pTo->u, 0, 
22820 73 69 7a 65 6f 66 28 70 54 6f 2d 3e 75 29 29 3b  sizeof(pTo->u));
22830 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
22840 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  TE_NOMEM;.  }.  
22850 6d 65 6d 63 70 79 28 70 54 6f 2c 20 70 46 72 6f  memcpy(pTo, pFro
22860 6d 2c 20 57 48 45 52 45 5f 4c 4f 4f 50 5f 58 46  m, WHERE_LOOP_XF
22870 45 52 5f 53 5a 29 3b 0a 20 20 6d 65 6d 63 70 79  ER_SZ);.  memcpy
22880 28 70 54 6f 2d 3e 61 4c 54 65 72 6d 2c 20 70 46  (pTo->aLTerm, pF
22890 72 6f 6d 2d 3e 61 4c 54 65 72 6d 2c 20 70 54 6f  rom->aLTerm, pTo
228a0 2d 3e 6e 4c 54 65 72 6d 2a 73 69 7a 65 6f 66 28  ->nLTerm*sizeof(
228b0 70 54 6f 2d 3e 61 4c 54 65 72 6d 5b 30 5d 29 29  pTo->aLTerm[0]))
228c0 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 77  ;.  if( pFrom->w
228d0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56  sFlags & WHERE_V
228e0 49 52 54 55 41 4c 54 41 42 4c 45 20 29 7b 0a 20  IRTUALTABLE ){. 
228f0 20 20 20 70 46 72 6f 6d 2d 3e 75 2e 76 74 61 62     pFrom->u.vtab
22900 2e 6e 65 65 64 46 72 65 65 20 3d 20 30 3b 0a 20  .needFree = 0;. 
22910 20 7d 65 6c 73 65 20 69 66 28 20 28 70 46 72 6f   }else if( (pFro
22920 6d 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  m->wsFlags & WHE
22930 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 21 3d  RE_AUTO_INDEX)!=
22940 30 20 29 7b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e  0 ){.    pFrom->
22950 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d  u.btree.pIndex =
22960 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
22970 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
22980 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 57 68  *.** Delete a Wh
22990 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 0a 2a  ereLoop object.*
229a0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68  /.static void wh
229b0 65 72 65 4c 6f 6f 70 44 65 6c 65 74 65 28 73 71  ereLoopDelete(sq
229c0 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65  lite3 *db, Where
229d0 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20 77 68 65 72  Loop *p){.  wher
229e0 65 4c 6f 6f 70 43 6c 65 61 72 28 64 62 2c 20 70  eLoopClear(db, p
229f0 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
22a00 65 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a  ee(db, p);.}../*
22a10 0a 2a 2a 20 46 72 65 65 20 61 20 57 68 65 72 65  .** Free a Where
22a20 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 0a 2a  Info structure.*
22a30 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68  /.static void wh
22a40 65 72 65 49 6e 66 6f 46 72 65 65 28 73 71 6c 69  ereInfoFree(sqli
22a50 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 49 6e  te3 *db, WhereIn
22a60 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 69  fo *pWInfo){.  i
22a70 66 28 20 41 4c 57 41 59 53 28 70 57 49 6e 66 6f  f( ALWAYS(pWInfo
22a80 29 20 29 7b 0a 20 20 20 20 77 68 65 72 65 43 6c  ) ){.    whereCl
22a90 61 75 73 65 43 6c 65 61 72 28 26 70 57 49 6e 66  auseClear(&pWInf
22aa0 6f 2d 3e 73 57 43 29 3b 0a 20 20 20 20 77 68 69  o->sWC);.    whi
22ab0 6c 65 28 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f  le( pWInfo->pLoo
22ac0 70 73 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72  ps ){.      Wher
22ad0 65 4c 6f 6f 70 20 2a 70 20 3d 20 70 57 49 6e 66  eLoop *p = pWInf
22ae0 6f 2d 3e 70 4c 6f 6f 70 73 3b 0a 20 20 20 20 20  o->pLoops;.     
22af0 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 20   pWInfo->pLoops 
22b00 3d 20 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 3b 0a  = p->pNextLoop;.
22b10 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 44        whereLoopD
22b20 65 6c 65 74 65 28 64 62 2c 20 70 29 3b 0a 20 20  elete(db, p);.  
22b30 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44    }.    sqlite3D
22b40 62 46 72 65 65 28 64 62 2c 20 70 57 49 6e 66 6f  bFree(db, pWInfo
22b50 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
22b60 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 62  Return TRUE if b
22b70 6f 74 68 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  oth of the follo
22b80 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a  wing are true:.*
22b90 2a 0a 2a 2a 20 20 20 28 31 29 20 20 58 20 68 61  *.**   (1)  X ha
22ba0 73 20 74 68 65 20 73 61 6d 65 20 6f 72 20 6c 6f  s the same or lo
22bb0 77 65 72 20 63 6f 73 74 20 74 68 61 74 20 59 0a  wer cost that Y.
22bc0 2a 2a 20 20 20 28 32 29 20 20 58 20 69 73 20 61  **   (2)  X is a
22bd0 20 70 72 6f 70 65 72 20 73 75 62 73 65 74 20 6f   proper subset o
22be0 66 20 59 0a 2a 2a 0a 2a 2a 20 42 79 20 22 70 72  f Y.**.** By "pr
22bf0 6f 70 65 72 20 73 75 62 73 65 74 22 20 77 65 20  oper subset" we 
22c00 6d 65 61 6e 20 74 68 61 74 20 58 20 75 73 65 73  mean that X uses
22c10 20 66 65 77 65 72 20 57 48 45 52 45 20 63 6c 61   fewer WHERE cla
22c20 75 73 65 20 74 65 72 6d 73 0a 2a 2a 20 74 68 61  use terms.** tha
22c30 6e 20 59 20 61 6e 64 20 74 68 61 74 20 65 76 65  n Y and that eve
22c40 72 79 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  ry WHERE clause 
22c50 74 65 72 6d 20 75 73 65 64 20 62 79 20 58 20 69  term used by X i
22c60 73 20 61 6c 73 6f 20 75 73 65 64 0a 2a 2a 20 62  s also used.** b
22c70 79 20 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 58 20  y Y..**.** If X 
22c80 69 73 20 61 20 70 72 6f 70 65 72 20 73 75 62 73  is a proper subs
22c90 65 74 20 6f 66 20 59 20 74 68 65 6e 20 59 20 69  et of Y then Y i
22ca0 73 20 61 20 62 65 74 74 65 72 20 63 68 6f 69 63  s a better choic
22cb0 65 20 61 6e 64 20 6f 75 67 68 74 0a 2a 2a 20 74  e and ought.** t
22cc0 6f 20 68 61 76 65 20 61 20 6c 6f 77 65 72 20 63  o have a lower c
22cd0 6f 73 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ost.  This routi
22ce0 6e 65 20 72 65 74 75 72 6e 73 20 54 52 55 45 20  ne returns TRUE 
22cf0 77 68 65 6e 20 74 68 61 74 20 63 6f 73 74 20 0a  when that cost .
22d00 2a 2a 20 72 65 6c 61 74 69 6f 6e 73 68 69 70 20  ** relationship 
22d10 69 73 20 69 6e 76 65 72 74 65 64 20 61 6e 64 20  is inverted and 
22d20 6e 65 65 64 73 20 74 6f 20 62 65 20 61 64 6a 75  needs to be adju
22d30 73 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  sted..*/.static 
22d40 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 43 68 65  int whereLoopChe
22d50 61 70 65 72 50 72 6f 70 65 72 53 75 62 73 65 74  aperProperSubset
22d60 28 0a 20 20 63 6f 6e 73 74 20 57 68 65 72 65 4c  (.  const WhereL
22d70 6f 6f 70 20 2a 70 58 2c 20 20 20 20 20 20 20 2f  oop *pX,       /
22d80 2a 20 46 69 72 73 74 20 57 68 65 72 65 4c 6f 6f  * First WhereLoo
22d90 70 20 74 6f 20 63 6f 6d 70 61 72 65 20 2a 2f 0a  p to compare */.
22da0 20 20 63 6f 6e 73 74 20 57 68 65 72 65 4c 6f 6f    const WhereLoo
22db0 70 20 2a 70 59 20 20 20 20 20 20 20 20 2f 2a 20  p *pY        /* 
22dc0 43 6f 6d 70 61 72 65 20 61 67 61 69 6e 73 74 20  Compare against 
22dd0 74 68 69 73 20 57 68 65 72 65 4c 6f 6f 70 20 2a  this WhereLoop *
22de0 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  /.){.  int i, j;
22df0 0a 20 20 69 66 28 20 70 58 2d 3e 6e 4c 54 65 72  .  if( pX->nLTer
22e00 6d 20 3e 3d 20 70 59 2d 3e 6e 4c 54 65 72 6d 20  m >= pY->nLTerm 
22e10 29 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 58  ) return 0; /* X
22e20 20 69 73 20 6e 6f 74 20 61 20 73 75 62 73 65 74   is not a subset
22e30 20 6f 66 20 59 20 2a 2f 0a 20 20 69 66 28 20 70   of Y */.  if( p
22e40 58 2d 3e 72 52 75 6e 20 3e 3d 20 70 59 2d 3e 72  X->rRun >= pY->r
22e50 52 75 6e 20 29 7b 0a 20 20 20 20 69 66 28 20 70  Run ){.    if( p
22e60 58 2d 3e 72 52 75 6e 20 3e 20 70 59 2d 3e 72 52  X->rRun > pY->rR
22e70 75 6e 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  un ) return 0;  
22e80 20 20 2f 2a 20 58 20 63 6f 73 74 73 20 6d 6f 72    /* X costs mor
22e90 65 20 74 68 61 6e 20 59 20 2a 2f 0a 20 20 20 20  e than Y */.    
22ea0 69 66 28 20 70 58 2d 3e 6e 4f 75 74 20 3e 20 70  if( pX->nOut > p
22eb0 59 2d 3e 6e 4f 75 74 20 29 20 72 65 74 75 72 6e  Y->nOut ) return
22ec0 20 30 3b 20 20 20 20 2f 2a 20 58 20 63 6f 73 74   0;    /* X cost
22ed0 73 20 6d 6f 72 65 20 74 68 61 6e 20 59 20 2a 2f  s more than Y */
22ee0 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 70 58 2d  .  }.  for(i=pX-
22ef0 3e 6e 4c 54 65 72 6d 2d 31 3b 20 69 3e 3d 30 3b  >nLTerm-1; i>=0;
22f00 20 69 2d 2d 29 7b 0a 20 20 20 20 66 6f 72 28 6a   i--){.    for(j
22f10 3d 70 59 2d 3e 6e 4c 54 65 72 6d 2d 31 3b 20 6a  =pY->nLTerm-1; j
22f20 3e 3d 30 3b 20 6a 2d 2d 29 7b 0a 20 20 20 20 20  >=0; j--){.     
22f30 20 69 66 28 20 70 59 2d 3e 61 4c 54 65 72 6d 5b   if( pY->aLTerm[
22f40 6a 5d 3d 3d 70 58 2d 3e 61 4c 54 65 72 6d 5b 69  j]==pX->aLTerm[i
22f50 5d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  ] ) break;.    }
22f60 0a 20 20 20 20 69 66 28 20 6a 3c 30 20 29 20 72  .    if( j<0 ) r
22f70 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 58 20 6e  eturn 0;  /* X n
22f80 6f 74 20 61 20 73 75 62 73 65 74 20 6f 66 20 59  ot a subset of Y
22f90 20 73 69 6e 63 65 20 74 65 72 6d 20 58 5b 69 5d   since term X[i]
22fa0 20 6e 6f 74 20 75 73 65 64 20 62 79 20 59 20 2a   not used by Y *
22fb0 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31  /.  }.  return 1
22fc0 3b 20 20 2f 2a 20 41 6c 6c 20 63 6f 6e 64 69 74  ;  /* All condit
22fd0 69 6f 6e 73 20 6d 65 65 74 20 2a 2f 0a 7d 0a 0a  ions meet */.}..
22fe0 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 61 64 6a  /*.** Try to adj
22ff0 75 73 74 20 74 68 65 20 63 6f 73 74 20 6f 66 20  ust the cost of 
23000 57 68 65 72 65 4c 6f 6f 70 20 70 54 65 6d 70 6c  WhereLoop pTempl
23010 61 74 65 20 75 70 77 61 72 64 73 20 6f 72 20 64  ate upwards or d
23020 6f 77 6e 77 61 72 64 73 20 73 6f 0a 2a 2a 20 74  ownwards so.** t
23030 68 61 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29  hat:.**.**   (1)
23040 20 70 54 65 6d 70 6c 61 74 65 20 63 6f 73 74 73   pTemplate costs
23050 20 6c 65 73 73 20 74 68 61 6e 20 61 6e 79 20 6f   less than any o
23060 74 68 65 72 20 57 68 65 72 65 4c 6f 6f 70 73 20  ther WhereLoops 
23070 74 68 61 74 20 61 72 65 20 61 20 70 72 6f 70 65  that are a prope
23080 72 0a 2a 2a 20 20 20 20 20 20 20 73 75 62 73 65  r.**       subse
23090 74 20 6f 66 20 70 54 65 6d 70 6c 61 74 65 0a 2a  t of pTemplate.*
230a0 2a 0a 2a 2a 20 20 20 28 32 29 20 70 54 65 6d 70  *.**   (2) pTemp
230b0 6c 61 74 65 20 63 6f 73 74 73 20 6d 6f 72 65 20  late costs more 
230c0 74 68 61 6e 20 61 6e 79 20 6f 74 68 65 72 20 57  than any other W
230d0 68 65 72 65 4c 6f 6f 70 73 20 66 6f 72 20 77 68  hereLoops for wh
230e0 69 63 68 20 70 54 65 6d 70 6c 61 74 65 0a 2a 2a  ich pTemplate.**
230f0 20 20 20 20 20 20 20 69 73 20 61 20 70 72 6f 70         is a prop
23100 65 72 20 73 75 62 73 65 74 2e 0a 2a 2a 0a 2a 2a  er subset..**.**
23110 20 54 6f 20 73 61 79 20 22 57 68 65 72 65 4c 6f   To say "WhereLo
23120 6f 70 20 58 20 69 73 20 61 20 70 72 6f 70 65 72  op X is a proper
23130 20 73 75 62 73 65 74 20 6f 66 20 59 22 20 6d 65   subset of Y" me
23140 61 6e 73 20 74 68 61 74 20 58 20 75 73 65 73 20  ans that X uses 
23150 66 65 77 65 72 0a 2a 2a 20 57 48 45 52 45 20 63  fewer.** WHERE c
23160 6c 61 75 73 65 20 74 65 72 6d 73 20 74 68 61 6e  lause terms than
23170 20 59 20 61 6e 64 20 74 68 61 74 20 65 76 65 72   Y and that ever
23180 79 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  y WHERE clause t
23190 65 72 6d 20 75 73 65 64 20 62 79 20 58 20 69 73  erm used by X is
231a0 0a 2a 2a 20 61 6c 73 6f 20 75 73 65 64 20 62 79  .** also used by
231b0 20 59 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 61   Y..**.** This a
231c0 64 6a 75 73 74 6d 65 6e 74 20 69 73 20 6f 6d 69  djustment is omi
231d0 74 74 65 64 20 66 6f 72 20 53 4b 49 50 53 43 41  tted for SKIPSCA
231e0 4e 20 6c 6f 6f 70 73 2e 20 20 49 6e 20 61 20 53  N loops.  In a S
231f0 4b 49 50 53 43 41 4e 20 6c 6f 6f 70 2c 20 74 68  KIPSCAN loop, th
23200 65 0a 2a 2a 20 57 68 65 72 65 4c 6f 6f 70 2e 6e  e.** WhereLoop.n
23210 4c 54 65 72 6d 20 66 69 65 6c 64 20 69 73 20 6e  LTerm field is n
23220 6f 74 20 61 6e 20 61 63 63 75 72 61 74 65 20 6d  ot an accurate m
23230 65 61 73 75 72 65 20 6f 66 20 74 68 65 20 6e 75  easure of the nu
23240 6d 62 65 72 20 6f 66 20 57 48 45 52 45 0a 2a 2a  mber of WHERE.**
23250 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 63 6f   clause terms co
23260 76 65 72 65 64 2c 20 73 69 6e 63 65 20 73 6f 6d  vered, since som
23270 65 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 6e  e of the first n
23280 4c 54 65 72 6d 20 65 6e 74 72 69 65 73 20 69 6e  LTerm entries in
23290 20 61 4c 54 65 72 6d 5b 5d 0a 2a 2a 20 77 69 6c   aLTerm[].** wil
232a0 6c 20 62 65 20 4e 55 4c 4c 20 28 62 65 63 61 75  l be NULL (becau
232b0 73 65 20 74 68 65 79 20 61 72 65 20 73 6b 69 70  se they are skip
232c0 70 65 64 29 2e 20 20 54 68 61 74 20 6d 61 6b 65  ped).  That make
232d0 73 20 69 74 20 6d 6f 72 65 20 64 69 66 66 69 63  s it more diffic
232e0 75 6c 74 0a 2a 2a 20 74 6f 20 63 6f 6d 70 61 72  ult.** to compar
232f0 65 20 74 68 65 20 6c 6f 6f 70 73 2e 20 20 57 65  e the loops.  We
23300 20 63 6f 75 6c 64 20 61 64 64 20 65 78 74 72 61   could add extra
23310 20 63 6f 64 65 20 74 6f 20 64 6f 20 74 68 65 20   code to do the 
23320 63 6f 6d 70 61 72 69 73 6f 6e 2c 20 61 6e 64 0a  comparison, and.
23330 2a 2a 20 70 65 72 68 61 70 73 20 77 65 20 77 69  ** perhaps we wi
23340 6c 6c 20 73 6f 6d 65 64 61 79 2e 20 20 42 75 74  ll someday.  But
23350 20 53 4b 49 50 53 43 41 4e 20 69 73 20 73 75 66   SKIPSCAN is suf
23360 66 69 63 69 65 6e 74 6c 79 20 75 6e 63 6f 6d 6d  ficiently uncomm
23370 6f 6e 2c 20 61 6e 64 20 74 68 69 73 0a 2a 2a 20  on, and this.** 
23380 61 64 6a 75 73 74 6d 65 6e 74 20 69 73 20 73 75  adjustment is su
23390 66 66 69 63 69 65 6e 74 20 6d 69 6e 6f 72 2c 20  fficient minor, 
233a0 74 68 61 74 20 69 74 20 69 73 20 76 65 72 79 20  that it is very 
233b0 64 69 66 66 69 63 75 6c 74 20 74 6f 20 63 6f 6e  difficult to con
233c0 73 74 72 75 63 74 0a 2a 2a 20 61 20 74 65 73 74  struct.** a test
233d0 20 63 61 73 65 20 77 68 65 72 65 20 74 68 65 20   case where the 
233e0 65 78 74 72 61 20 63 6f 64 65 20 77 6f 75 6c 64  extra code would
233f0 20 69 6d 70 72 6f 76 65 20 74 68 65 20 71 75 65   improve the que
23400 72 79 20 70 6c 61 6e 2e 20 20 42 65 74 74 65 72  ry plan.  Better
23410 0a 2a 2a 20 74 6f 20 61 76 6f 69 64 20 74 68 65  .** to avoid the
23420 20 61 64 64 65 64 20 63 6f 6d 70 6c 65 78 69 74   added complexit
23430 79 20 61 6e 64 20 6a 75 73 74 20 6f 6d 69 74 20  y and just omit 
23440 63 6f 73 74 20 61 64 6a 75 73 74 6d 65 6e 74 73  cost adjustments
23450 20 74 6f 20 53 4b 49 50 53 43 41 4e 0a 2a 2a 20   to SKIPSCAN.** 
23460 6c 6f 6f 70 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  loops..*/.static
23470 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 41   void whereLoopA
23480 64 6a 75 73 74 43 6f 73 74 28 63 6f 6e 73 74 20  djustCost(const 
23490 57 68 65 72 65 4c 6f 6f 70 20 2a 70 2c 20 57 68  WhereLoop *p, Wh
234a0 65 72 65 4c 6f 6f 70 20 2a 70 54 65 6d 70 6c 61  ereLoop *pTempla
234b0 74 65 29 7b 0a 20 20 69 66 28 20 28 70 54 65 6d  te){.  if( (pTem
234c0 70 6c 61 74 65 2d 3e 77 73 46 6c 61 67 73 20 26  plate->wsFlags &
234d0 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 3d   WHERE_INDEXED)=
234e0 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
234f0 66 28 20 28 70 54 65 6d 70 6c 61 74 65 2d 3e 77  f( (pTemplate->w
23500 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 53  sFlags & WHERE_S
23510 4b 49 50 53 43 41 4e 29 21 3d 30 20 29 20 72 65  KIPSCAN)!=0 ) re
23520 74 75 72 6e 3b 0a 20 20 66 6f 72 28 3b 20 70 3b  turn;.  for(; p;
23530 20 70 3d 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 29   p=p->pNextLoop)
23540 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 54 61  {.    if( p->iTa
23550 62 21 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 69 54  b!=pTemplate->iT
23560 61 62 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ab ) continue;. 
23570 20 20 20 69 66 28 20 28 70 2d 3e 77 73 46 6c 61     if( (p->wsFla
23580 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58  gs & WHERE_INDEX
23590 45 44 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  ED)==0 ) continu
235a0 65 3b 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 77  e;.    if( (p->w
235b0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 53  sFlags & WHERE_S
235c0 4b 49 50 53 43 41 4e 29 21 3d 30 20 29 20 63 6f  KIPSCAN)!=0 ) co
235d0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
235e0 77 68 65 72 65 4c 6f 6f 70 43 68 65 61 70 65 72  whereLoopCheaper
235f0 50 72 6f 70 65 72 53 75 62 73 65 74 28 70 2c 20  ProperSubset(p, 
23600 70 54 65 6d 70 6c 61 74 65 29 20 29 7b 0a 20 20  pTemplate) ){.  
23610 20 20 20 20 2f 2a 20 41 64 6a 75 73 74 20 70 54      /* Adjust pT
23620 65 6d 70 6c 61 74 65 20 63 6f 73 74 20 64 6f 77  emplate cost dow
23630 6e 77 61 72 64 20 73 6f 20 74 68 61 74 20 69 74  nward so that it
23640 20 69 73 20 63 68 65 61 70 65 72 20 74 68 61 6e   is cheaper than
23650 20 69 74 73 20 0a 20 20 20 20 20 20 2a 2a 20 73   its .      ** s
23660 75 62 73 65 74 20 70 20 2a 2f 0a 20 20 20 20 20  ubset p */.     
23670 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e   pTemplate->rRun
23680 20 3d 20 70 2d 3e 72 52 75 6e 3b 0a 20 20 20 20   = p->rRun;.    
23690 20 20 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75    pTemplate->nOu
236a0 74 20 3d 20 70 2d 3e 6e 4f 75 74 20 2d 20 31 3b  t = p->nOut - 1;
236b0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 77  .    }else if( w
236c0 68 65 72 65 4c 6f 6f 70 43 68 65 61 70 65 72 50  hereLoopCheaperP
236d0 72 6f 70 65 72 53 75 62 73 65 74 28 70 54 65 6d  roperSubset(pTem
236e0 70 6c 61 74 65 2c 20 70 29 20 29 7b 0a 20 20 20  plate, p) ){.   
236f0 20 20 20 2f 2a 20 41 64 6a 75 73 74 20 70 54 65     /* Adjust pTe
23700 6d 70 6c 61 74 65 20 63 6f 73 74 20 75 70 77 61  mplate cost upwa
23710 72 64 20 73 6f 20 74 68 61 74 20 69 74 20 69 73  rd so that it is
23720 20 63 6f 73 74 6c 69 65 72 20 74 68 61 6e 20 70   costlier than p
23730 20 73 69 6e 63 65 0a 20 20 20 20 20 20 2a 2a 20   since.      ** 
23740 70 54 65 6d 70 6c 61 74 65 20 69 73 20 61 20 70  pTemplate is a p
23750 72 6f 70 65 72 20 73 75 62 73 65 74 20 6f 66 20  roper subset of 
23760 70 20 2a 2f 0a 20 20 20 20 20 20 70 54 65 6d 70  p */.      pTemp
23770 6c 61 74 65 2d 3e 72 52 75 6e 20 3d 20 70 2d 3e  late->rRun = p->
23780 72 52 75 6e 3b 0a 20 20 20 20 20 20 70 54 65 6d  rRun;.      pTem
23790 70 6c 61 74 65 2d 3e 6e 4f 75 74 20 3d 20 70 2d  plate->nOut = p-
237a0 3e 6e 4f 75 74 20 2b 20 31 3b 0a 20 20 20 20 7d  >nOut + 1;.    }
237b0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  .  }.}../*.** Se
237c0 61 72 63 68 20 74 68 65 20 6c 69 73 74 20 6f 66  arch the list of
237d0 20 57 68 65 72 65 4c 6f 6f 70 73 20 69 6e 20 2a   WhereLoops in *
237e0 70 70 50 72 65 76 20 6c 6f 6f 6b 69 6e 67 20 66  ppPrev looking f
237f0 6f 72 20 6f 6e 65 20 74 68 61 74 20 63 61 6e 20  or one that can 
23800 62 65 0a 2a 2a 20 73 75 70 70 6c 61 6e 74 65 64  be.** supplanted
23810 20 62 79 20 70 54 65 6d 70 6c 61 74 65 2e 0a 2a   by pTemplate..*
23820 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 4e 55 4c 4c  *.** Return NULL
23830 20 69 66 20 74 68 65 20 57 68 65 72 65 4c 6f 6f   if the WhereLoo
23840 70 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e 73 20  p list contains 
23850 61 6e 20 65 6e 74 72 79 20 74 68 61 74 20 63 61  an entry that ca
23860 6e 20 73 75 70 70 6c 61 6e 74 0a 2a 2a 20 70 54  n supplant.** pT
23870 65 6d 70 6c 61 74 65 2c 20 69 6e 20 6f 74 68 65  emplate, in othe
23880 72 20 77 6f 72 64 73 20 69 66 20 70 54 65 6d 70  r words if pTemp
23890 6c 61 74 65 20 64 6f 65 73 20 6e 6f 74 20 62 65  late does not be
238a0 6c 6f 6e 67 20 6f 6e 20 74 68 65 20 6c 69 73 74  long on the list
238b0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 58 20 69 73  ..**.** If pX is
238c0 20 61 20 57 68 65 72 65 4c 6f 6f 70 20 74 68 61   a WhereLoop tha
238d0 74 20 70 54 65 6d 70 6c 61 74 65 20 63 61 6e 20  t pTemplate can 
238e0 73 75 70 70 6c 61 6e 74 2c 20 74 68 65 6e 20 72  supplant, then r
238f0 65 74 75 72 6e 20 74 68 65 0a 2a 2a 20 6c 69 6e  eturn the.** lin
23900 6b 20 74 68 61 74 20 70 6f 69 6e 74 73 20 74 6f  k that points to
23910 20 70 58 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 54   pX..**.** If pT
23920 65 6d 70 6c 61 74 65 20 63 61 6e 6e 6f 74 20 73  emplate cannot s
23930 75 70 70 6c 61 6e 74 20 61 6e 79 20 65 78 69 73  upplant any exis
23940 74 69 6e 67 20 65 6c 65 6d 65 6e 74 20 6f 66 20  ting element of 
23950 74 68 65 20 6c 69 73 74 20 62 75 74 20 6e 65 65  the list but nee
23960 64 73 0a 2a 2a 20 74 6f 20 62 65 20 61 64 64 65  ds.** to be adde
23970 64 20 74 6f 20 74 68 65 20 6c 69 73 74 2c 20 74  d to the list, t
23980 68 65 6e 20 72 65 74 75 72 6e 20 61 20 70 6f 69  hen return a poi
23990 6e 74 65 72 20 74 6f 20 74 68 65 20 74 61 69 6c  nter to the tail
239a0 20 6f 66 20 74 68 65 20 6c 69 73 74 2e 0a 2a 2f   of the list..*/
239b0 0a 73 74 61 74 69 63 20 57 68 65 72 65 4c 6f 6f  .static WhereLoo
239c0 70 20 2a 2a 77 68 65 72 65 4c 6f 6f 70 46 69 6e  p **whereLoopFin
239d0 64 4c 65 73 73 65 72 28 0a 20 20 57 68 65 72 65  dLesser(.  Where
239e0 4c 6f 6f 70 20 2a 2a 70 70 50 72 65 76 2c 0a 20  Loop **ppPrev,. 
239f0 20 63 6f 6e 73 74 20 57 68 65 72 65 4c 6f 6f 70   const WhereLoop
23a00 20 2a 70 54 65 6d 70 6c 61 74 65 0a 29 7b 0a 20   *pTemplate.){. 
23a10 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 3b 0a 20   WhereLoop *p;. 
23a20 20 66 6f 72 28 70 3d 28 2a 70 70 50 72 65 76 29   for(p=(*ppPrev)
23a30 3b 20 70 3b 20 70 70 50 72 65 76 3d 26 70 2d 3e  ; p; ppPrev=&p->
23a40 70 4e 65 78 74 4c 6f 6f 70 2c 20 70 3d 2a 70 70  pNextLoop, p=*pp
23a50 50 72 65 76 29 7b 0a 20 20 20 20 69 66 28 20 70  Prev){.    if( p
23a60 2d 3e 69 54 61 62 21 3d 70 54 65 6d 70 6c 61 74  ->iTab!=pTemplat
23a70 65 2d 3e 69 54 61 62 20 7c 7c 20 70 2d 3e 69 53  e->iTab || p->iS
23a80 6f 72 74 49 64 78 21 3d 70 54 65 6d 70 6c 61 74  ortIdx!=pTemplat
23a90 65 2d 3e 69 53 6f 72 74 49 64 78 20 29 7b 0a 20  e->iSortIdx ){. 
23aa0 20 20 20 20 20 2f 2a 20 49 66 20 65 69 74 68 65       /* If eithe
23ab0 72 20 74 68 65 20 69 54 61 62 20 6f 72 20 69 53  r the iTab or iS
23ac0 6f 72 74 49 64 78 20 76 61 6c 75 65 73 20 66 6f  ortIdx values fo
23ad0 72 20 74 77 6f 20 57 68 65 72 65 4c 6f 6f 70 20  r two WhereLoop 
23ae0 61 72 65 20 64 69 66 66 65 72 65 6e 74 0a 20 20  are different.  
23af0 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 6f 73      ** then thos
23b00 65 20 57 68 65 72 65 4c 6f 6f 70 73 20 6e 65 65  e WhereLoops nee
23b10 64 20 74 6f 20 62 65 20 63 6f 6e 73 69 64 65 72  d to be consider
23b20 65 64 20 73 65 70 61 72 61 74 65 6c 79 2e 20 20  ed separately.  
23b30 4e 65 69 74 68 65 72 20 69 73 0a 20 20 20 20 20  Neither is.     
23b40 20 2a 2a 20 61 20 63 61 6e 64 69 64 61 74 65 20   ** a candidate 
23b50 74 6f 20 72 65 70 6c 61 63 65 20 74 68 65 20 6f  to replace the o
23b60 74 68 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 63  ther. */.      c
23b70 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20  ontinue;.    }. 
23b80 20 20 20 2f 2a 20 49 6e 20 74 68 65 20 63 75 72     /* In the cur
23b90 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74  rent implementat
23ba0 69 6f 6e 2c 20 74 68 65 20 72 53 65 74 75 70 20  ion, the rSetup 
23bb0 76 61 6c 75 65 20 69 73 20 65 69 74 68 65 72 20  value is either 
23bc0 7a 65 72 6f 0a 20 20 20 20 2a 2a 20 6f 72 20 74  zero.    ** or t
23bd0 68 65 20 63 6f 73 74 20 6f 66 20 62 75 69 6c 64  he cost of build
23be0 69 6e 67 20 61 6e 20 61 75 74 6f 6d 61 74 69 63  ing an automatic
23bf0 20 69 6e 64 65 78 20 28 4e 6c 6f 67 4e 29 20 61   index (NlogN) a
23c00 6e 64 20 74 68 65 20 4e 6c 6f 67 4e 0a 20 20 20  nd the NlogN.   
23c10 20 2a 2a 20 69 73 20 74 68 65 20 73 61 6d 65 20   ** is the same 
23c20 66 6f 72 20 63 6f 6d 70 61 74 69 62 6c 65 20 57  for compatible W
23c30 68 65 72 65 4c 6f 6f 70 73 2e 20 2a 2f 0a 20 20  hereLoops. */.  
23c40 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 53 65    assert( p->rSe
23c50 74 75 70 3d 3d 30 20 7c 7c 20 70 54 65 6d 70 6c  tup==0 || pTempl
23c60 61 74 65 2d 3e 72 53 65 74 75 70 3d 3d 30 20 0a  ate->rSetup==0 .
23c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23c80 20 7c 7c 20 70 2d 3e 72 53 65 74 75 70 3d 3d 70   || p->rSetup==p
23c90 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75 70  Template->rSetup
23ca0 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 77 68 65 72   );..    /* wher
23cb0 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 28 29 20  eLoopAddBtree() 
23cc0 61 6c 77 61 79 73 20 67 65 6e 65 72 61 74 65 73  always generates
23cd0 20 61 6e 64 20 69 6e 73 65 72 74 73 20 74 68 65   and inserts the
23ce0 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78   automatic index
23cf0 0a 20 20 20 20 2a 2a 20 63 61 73 65 20 66 69 72  .    ** case fir
23d00 73 74 2e 20 20 48 65 6e 63 65 20 63 6f 6d 70 61  st.  Hence compa
23d10 74 69 62 6c 65 20 63 61 6e 64 69 64 61 74 65 20  tible candidate 
23d20 57 68 65 72 65 4c 6f 6f 70 73 20 6e 65 76 65 72  WhereLoops never
23d30 20 68 61 76 65 20 61 20 6c 61 72 67 65 72 0a 20   have a larger. 
23d40 20 20 20 2a 2a 20 72 53 65 74 75 70 2e 20 43 61     ** rSetup. Ca
23d50 6c 6c 20 74 68 69 73 20 53 45 54 55 50 2d 49 4e  ll this SETUP-IN
23d60 56 41 52 49 41 4e 54 20 2a 2f 0a 20 20 20 20 61  VARIANT */.    a
23d70 73 73 65 72 74 28 20 70 2d 3e 72 53 65 74 75 70  ssert( p->rSetup
23d80 3e 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65  >=pTemplate->rSe
23d90 74 75 70 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  tup );..    /* I
23da0 66 20 65 78 69 73 74 69 6e 67 20 57 68 65 72 65  f existing Where
23db0 4c 6f 6f 70 20 70 20 69 73 20 62 65 74 74 65 72  Loop p is better
23dc0 20 74 68 61 6e 20 70 54 65 6d 70 6c 61 74 65 2c   than pTemplate,
23dd0 20 70 54 65 6d 70 6c 61 74 65 20 63 61 6e 20 62   pTemplate can b
23de0 65 0a 20 20 20 20 2a 2a 20 64 69 73 63 61 72 64  e.    ** discard
23df0 65 64 2e 20 20 57 68 65 72 65 4c 6f 6f 70 20 70  ed.  WhereLoop p
23e00 20 69 73 20 62 65 74 74 65 72 20 69 66 3a 0a 20   is better if:. 
23e10 20 20 20 2a 2a 20 20 20 28 31 29 20 20 70 20 68     **   (1)  p h
23e20 61 73 20 6e 6f 20 6d 6f 72 65 20 64 65 70 65 6e  as no more depen
23e30 64 65 6e 63 69 65 73 20 74 68 61 6e 20 70 54 65  dencies than pTe
23e40 6d 70 6c 61 74 65 2c 20 61 6e 64 0a 20 20 20 20  mplate, and.    
23e50 2a 2a 20 20 20 28 32 29 20 20 70 20 68 61 73 20  **   (2)  p has 
23e60 61 6e 20 65 71 75 61 6c 20 6f 72 20 6c 6f 77 65  an equal or lowe
23e70 72 20 63 6f 73 74 20 74 68 61 6e 20 70 54 65 6d  r cost than pTem
23e80 70 6c 61 74 65 0a 20 20 20 20 2a 2f 0a 20 20 20  plate.    */.   
23e90 20 69 66 28 20 28 70 2d 3e 70 72 65 72 65 71 20   if( (p->prereq 
23ea0 26 20 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65  & pTemplate->pre
23eb0 72 65 71 29 3d 3d 70 2d 3e 70 72 65 72 65 71 20  req)==p->prereq 
23ec0 20 20 20 2f 2a 20 28 31 29 20 20 2a 2f 0a 20 20     /* (1)  */.  
23ed0 20 20 20 26 26 20 70 2d 3e 72 53 65 74 75 70 3c     && p->rSetup<
23ee0 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74  =pTemplate->rSet
23ef0 75 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20  up              
23f00 20 20 20 20 2f 2a 20 28 32 61 29 20 2a 2f 0a 20      /* (2a) */. 
23f10 20 20 20 20 26 26 20 70 2d 3e 72 52 75 6e 3c 3d      && p->rRun<=
23f20 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 20  pTemplate->rRun 
23f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23f40 20 20 20 20 20 2f 2a 20 28 32 62 29 20 2a 2f 0a       /* (2b) */.
23f50 20 20 20 20 20 26 26 20 70 2d 3e 6e 4f 75 74 3c       && p->nOut<
23f60 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74  =pTemplate->nOut
23f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23f80 20 20 20 20 20 20 2f 2a 20 28 32 63 29 20 2a 2f        /* (2c) */
23f90 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65  .    ){.      re
23fa0 74 75 72 6e 20 30 3b 20 20 2f 2a 20 44 69 73 63  turn 0;  /* Disc
23fb0 61 72 64 20 70 54 65 6d 70 6c 61 74 65 20 2a 2f  ard pTemplate */
23fc0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
23fd0 66 20 70 54 65 6d 70 6c 61 74 65 20 69 73 20 61  f pTemplate is a
23fe0 6c 77 61 79 73 20 62 65 74 74 65 72 20 74 68 61  lways better tha
23ff0 6e 20 70 2c 20 74 68 65 6e 20 63 61 75 73 65 20  n p, then cause 
24000 70 20 74 6f 20 62 65 20 6f 76 65 72 77 72 69 74  p to be overwrit
24010 74 65 6e 0a 20 20 20 20 2a 2a 20 77 69 74 68 20  ten.    ** with 
24020 70 54 65 6d 70 6c 61 74 65 2e 20 20 70 54 65 6d  pTemplate.  pTem
24030 70 6c 61 74 65 20 69 73 20 62 65 74 74 65 72 20  plate is better 
24040 74 68 61 6e 20 70 20 69 66 3a 0a 20 20 20 20 2a  than p if:.    *
24050 2a 20 20 20 28 31 29 20 20 70 54 65 6d 70 6c 61  *   (1)  pTempla
24060 74 65 20 68 61 73 20 6e 6f 20 6d 6f 72 65 20 64  te has no more d
24070 65 70 65 6e 64 65 6e 63 65 73 20 74 68 61 6e 20  ependences than 
24080 70 2c 20 61 6e 64 0a 20 20 20 20 2a 2a 20 20 20  p, and.    **   
24090 28 32 29 20 20 70 54 65 6d 70 6c 61 74 65 20 68  (2)  pTemplate h
240a0 61 73 20 61 6e 20 65 71 75 61 6c 20 6f 72 20 6c  as an equal or l
240b0 6f 77 65 72 20 63 6f 73 74 20 74 68 61 6e 20 70  ower cost than p
240c0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
240d0 20 28 70 2d 3e 70 72 65 72 65 71 20 26 20 70 54   (p->prereq & pT
240e0 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65 71 29  emplate->prereq)
240f0 3d 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65  ==pTemplate->pre
24100 72 65 71 20 20 20 2f 2a 20 28 31 29 20 20 2a 2f  req   /* (1)  */
24110 0a 20 20 20 20 20 26 26 20 70 2d 3e 72 52 75 6e  .     && p->rRun
24120 3e 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75  >=pTemplate->rRu
24130 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n               
24140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24150 20 28 32 61 29 20 2a 2f 0a 20 20 20 20 20 26 26   (2a) */.     &&
24160 20 70 2d 3e 6e 4f 75 74 3e 3d 70 54 65 6d 70 6c   p->nOut>=pTempl
24170 61 74 65 2d 3e 6e 4f 75 74 20 20 20 20 20 20 20  ate->nOut       
24180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24190 20 20 20 20 20 20 2f 2a 20 28 32 62 29 20 2a 2f        /* (2b) */
241a0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 61 73  .    ){.      as
241b0 73 65 72 74 28 20 70 2d 3e 72 53 65 74 75 70 3e  sert( p->rSetup>
241c0 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74  =pTemplate->rSet
241d0 75 70 20 29 3b 20 2f 2a 20 53 45 54 55 50 2d 49  up ); /* SETUP-I
241e0 4e 56 41 52 49 41 4e 54 20 61 62 6f 76 65 20 2a  NVARIANT above *
241f0 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 20 20  /.      break;  
24200 20 2f 2a 20 43 61 75 73 65 20 70 20 74 6f 20 62   /* Cause p to b
24210 65 20 6f 76 65 72 77 72 69 74 74 65 6e 20 62 79  e overwritten by
24220 20 70 54 65 6d 70 6c 61 74 65 20 2a 2f 0a 20 20   pTemplate */.  
24230 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
24240 20 70 70 50 72 65 76 3b 0a 7d 0a 0a 2f 2a 0a 2a   ppPrev;.}../*.*
24250 2a 20 49 6e 73 65 72 74 20 6f 72 20 72 65 70 6c  * Insert or repl
24260 61 63 65 20 61 20 57 68 65 72 65 4c 6f 6f 70 20  ace a WhereLoop 
24270 65 6e 74 72 79 20 75 73 69 6e 67 20 74 68 65 20  entry using the 
24280 74 65 6d 70 6c 61 74 65 20 73 75 70 70 6c 69 65  template supplie
24290 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 69 73  d..**.** An exis
242a0 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 65  ting WhereLoop e
242b0 6e 74 72 79 20 6d 69 67 68 74 20 62 65 20 6f 76  ntry might be ov
242c0 65 72 77 72 69 74 74 65 6e 20 69 66 20 74 68 65  erwritten if the
242d0 20 6e 65 77 20 74 65 6d 70 6c 61 74 65 0a 2a 2a   new template.**
242e0 20 69 73 20 62 65 74 74 65 72 20 61 6e 64 20 68   is better and h
242f0 61 73 20 66 65 77 65 72 20 64 65 70 65 6e 64 65  as fewer depende
24300 6e 63 69 65 73 2e 20 20 4f 72 20 74 68 65 20 74  ncies.  Or the t
24310 65 6d 70 6c 61 74 65 20 77 69 6c 6c 20 62 65 20  emplate will be 
24320 69 67 6e 6f 72 65 64 0a 2a 2a 20 61 6e 64 20 6e  ignored.** and n
24330 6f 20 69 6e 73 65 72 74 20 77 69 6c 6c 20 6f 63  o insert will oc
24340 63 75 72 20 69 66 20 61 6e 20 65 78 69 73 74 69  cur if an existi
24350 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 20  ng WhereLoop is 
24360 66 61 73 74 65 72 20 61 6e 64 20 68 61 73 0a 2a  faster and has.*
24370 2a 20 66 65 77 65 72 20 64 65 70 65 6e 64 65 6e  * fewer dependen
24380 63 69 65 73 20 74 68 61 6e 20 74 68 65 20 74 65  cies than the te
24390 6d 70 6c 61 74 65 2e 20 20 4f 74 68 65 72 77 69  mplate.  Otherwi
243a0 73 65 20 61 20 6e 65 77 20 57 68 65 72 65 4c 6f  se a new WhereLo
243b0 6f 70 20 69 73 0a 2a 2a 20 61 64 64 65 64 20 62  op is.** added b
243c0 61 73 65 64 20 6f 6e 20 74 68 65 20 74 65 6d 70  ased on the temp
243d0 6c 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  late..**.** If p
243e0 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20  Builder->pOrSet 
243f0 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e  is not NULL then
24400 20 77 65 20 63 61 72 65 20 61 62 6f 75 74 20 6f   we care about o
24410 6e 6c 79 20 74 68 65 0a 2a 2a 20 70 72 65 72 65  nly the.** prere
24420 71 75 69 73 69 74 65 73 20 61 6e 64 20 72 52 75  quisites and rRu
24430 6e 20 61 6e 64 20 6e 4f 75 74 20 63 6f 73 74 73  n and nOut costs
24440 20 6f 66 20 74 68 65 20 4e 20 62 65 73 74 20 6c   of the N best l
24450 6f 6f 70 73 2e 20 20 54 68 61 74 0a 2a 2a 20 69  oops.  That.** i
24460 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 67 61  nformation is ga
24470 74 68 65 72 65 64 20 69 6e 20 74 68 65 20 70 42  thered in the pB
24480 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20 6f  uilder->pOrSet o
24490 62 6a 65 63 74 2e 20 20 54 68 69 73 20 73 70 65  bject.  This spe
244a0 63 69 61 6c 0a 2a 2a 20 70 72 6f 63 65 73 73 69  cial.** processi
244b0 6e 67 20 6d 6f 64 65 20 69 73 20 75 73 65 64 20  ng mode is used 
244c0 6f 6e 6c 79 20 66 6f 72 20 4f 52 20 63 6c 61 75  only for OR clau
244d0 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a  se processing..*
244e0 2a 0a 2a 2a 20 57 68 65 6e 20 61 63 63 75 6d 75  *.** When accumu
244f0 6c 61 74 69 6e 67 20 6d 75 6c 74 69 70 6c 65 20  lating multiple 
24500 6c 6f 6f 70 73 20 28 77 68 65 6e 20 70 42 75 69  loops (when pBui
24510 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20 69 73 20  lder->pOrSet is 
24520 4e 55 4c 4c 29 20 77 65 0a 2a 2a 20 73 74 69 6c  NULL) we.** stil
24530 6c 20 6d 69 67 68 74 20 6f 76 65 72 77 72 69 74  l might overwrit
24540 65 20 73 69 6d 69 6c 61 72 20 6c 6f 6f 70 73 20  e similar loops 
24550 77 69 74 68 20 74 68 65 20 6e 65 77 20 74 65 6d  with the new tem
24560 70 6c 61 74 65 20 69 66 20 74 68 65 0a 2a 2a 20  plate if the.** 
24570 6e 65 77 20 74 65 6d 70 6c 61 74 65 20 69 73 20  new template is 
24580 62 65 74 74 65 72 2e 20 20 4c 6f 6f 70 73 20 6d  better.  Loops m
24590 61 79 20 62 65 20 6f 76 65 72 77 72 69 74 74 65  ay be overwritte
245a0 6e 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  n if the followi
245b0 6e 67 20 0a 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e  ng .** condition
245c0 73 20 61 72 65 20 6d 65 74 3a 0a 2a 2a 0a 2a 2a  s are met:.**.**
245d0 20 20 20 20 28 31 29 20 20 54 68 65 79 20 68 61      (1)  They ha
245e0 76 65 20 74 68 65 20 73 61 6d 65 20 69 54 61 62  ve the same iTab
245f0 2e 0a 2a 2a 20 20 20 20 28 32 29 20 20 54 68 65  ..**    (2)  The
24600 79 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20  y have the same 
24610 69 53 6f 72 74 49 64 78 2e 0a 2a 2a 20 20 20 20  iSortIdx..**    
24620 28 33 29 20 20 54 68 65 20 74 65 6d 70 6c 61 74  (3)  The templat
24630 65 20 68 61 73 20 73 61 6d 65 20 6f 72 20 66 65  e has same or fe
24640 77 65 72 20 64 65 70 65 6e 64 65 6e 63 69 65 73  wer dependencies
24650 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e   than the curren
24660 74 20 6c 6f 6f 70 0a 2a 2a 20 20 20 20 28 34 29  t loop.**    (4)
24670 20 20 54 68 65 20 74 65 6d 70 6c 61 74 65 20 68    The template h
24680 61 73 20 74 68 65 20 73 61 6d 65 20 6f 72 20 6c  as the same or l
24690 6f 77 65 72 20 63 6f 73 74 20 74 68 61 6e 20 74  ower cost than t
246a0 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f 70 0a  he current loop.
246b0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68  */.static int wh
246c0 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 57 68  ereLoopInsert(Wh
246d0 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a  ereLoopBuilder *
246e0 70 42 75 69 6c 64 65 72 2c 20 57 68 65 72 65 4c  pBuilder, WhereL
246f0 6f 6f 70 20 2a 70 54 65 6d 70 6c 61 74 65 29 7b  oop *pTemplate){
24700 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a 70  .  WhereLoop **p
24710 70 50 72 65 76 2c 20 2a 70 3b 0a 20 20 57 68 65  pPrev, *p;.  Whe
24720 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d  reInfo *pWInfo =
24730 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66   pBuilder->pWInf
24740 6f 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  o;.  sqlite3 *db
24750 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73   = pWInfo->pPars
24760 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 49 66 20  e->db;..  /* If 
24770 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74  pBuilder->pOrSet
24780 20 69 73 20 64 65 66 69 6e 65 64 2c 20 74 68 65   is defined, the
24790 6e 20 6f 6e 6c 79 20 6b 65 65 70 20 74 72 61 63  n only keep trac
247a0 6b 20 6f 66 20 74 68 65 20 63 6f 73 74 73 0a 20  k of the costs. 
247b0 20 2a 2a 20 61 6e 64 20 70 72 65 72 65 71 73 2e   ** and prereqs.
247c0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 75 69  .  */.  if( pBui
247d0 6c 64 65 72 2d 3e 70 4f 72 53 65 74 21 3d 30 20  lder->pOrSet!=0 
247e0 29 7b 0a 23 69 66 20 57 48 45 52 45 54 52 41 43  ){.#if WHERETRAC
247f0 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20 75 31  E_ENABLED.    u1
24800 36 20 6e 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  6 n = pBuilder->
24810 70 4f 72 53 65 74 2d 3e 6e 3b 0a 20 20 20 20 69  pOrSet->n;.    i
24820 6e 74 20 78 20 3d 0a 23 65 6e 64 69 66 0a 20 20  nt x =.#endif.  
24830 20 20 77 68 65 72 65 4f 72 49 6e 73 65 72 74 28    whereOrInsert(
24840 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74  pBuilder->pOrSet
24850 2c 20 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65  , pTemplate->pre
24860 72 65 71 2c 20 70 54 65 6d 70 6c 61 74 65 2d 3e  req, pTemplate->
24870 72 52 75 6e 2c 0a 20 20 20 20 20 20 20 20 20 20  rRun,.          
24880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24890 20 20 20 20 20 20 20 20 20 20 70 54 65 6d 70 6c            pTempl
248a0 61 74 65 2d 3e 6e 4f 75 74 29 3b 0a 23 69 66 20  ate->nOut);.#if 
248b0 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c  WHERETRACE_ENABL
248c0 45 44 20 2f 2a 20 30 78 38 20 2a 2f 0a 20 20 20  ED /* 0x8 */.   
248d0 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72   if( sqlite3Wher
248e0 65 54 72 61 63 65 20 26 20 30 78 38 20 29 7b 0a  eTrace & 0x8 ){.
248f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
24900 75 67 50 72 69 6e 74 66 28 78 3f 22 20 20 20 6f  ugPrintf(x?"   o
24910 72 2d 25 64 3a 20 20 22 3a 22 20 20 20 6f 72 2d  r-%d:  ":"   or-
24920 58 3a 20 20 22 2c 20 6e 29 3b 0a 20 20 20 20 20  X:  ", n);.     
24930 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28   whereLoopPrint(
24940 70 54 65 6d 70 6c 61 74 65 2c 20 70 42 75 69 6c  pTemplate, pBuil
24950 64 65 72 2d 3e 70 57 43 29 3b 0a 20 20 20 20 7d  der->pWC);.    }
24960 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75  .#endif.    retu
24970 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
24980 7d 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 66 6f 72  }..  /* Look for
24990 20 61 6e 20 65 78 69 73 74 69 6e 67 20 57 68 65   an existing Whe
249a0 72 65 4c 6f 6f 70 20 74 6f 20 72 65 70 6c 61 63  reLoop to replac
249b0 65 20 77 69 74 68 20 70 54 65 6d 70 6c 61 74 65  e with pTemplate
249c0 0a 20 20 2a 2f 0a 20 20 77 68 65 72 65 4c 6f 6f  .  */.  whereLoo
249d0 70 41 64 6a 75 73 74 43 6f 73 74 28 70 57 49 6e  pAdjustCost(pWIn
249e0 66 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 70 54 65 6d  fo->pLoops, pTem
249f0 70 6c 61 74 65 29 3b 0a 20 20 70 70 50 72 65 76  plate);.  ppPrev
24a00 20 3d 20 77 68 65 72 65 4c 6f 6f 70 46 69 6e 64   = whereLoopFind
24a10 4c 65 73 73 65 72 28 26 70 57 49 6e 66 6f 2d 3e  Lesser(&pWInfo->
24a20 70 4c 6f 6f 70 73 2c 20 70 54 65 6d 70 6c 61 74  pLoops, pTemplat
24a30 65 29 3b 0a 0a 20 20 69 66 28 20 70 70 50 72 65  e);..  if( ppPre
24a40 76 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54  v==0 ){.    /* T
24a50 68 65 72 65 20 61 6c 72 65 61 64 79 20 65 78 69  here already exi
24a60 73 74 73 20 61 20 57 68 65 72 65 4c 6f 6f 70 20  sts a WhereLoop 
24a70 6f 6e 20 74 68 65 20 6c 69 73 74 20 74 68 61 74  on the list that
24a80 20 69 73 20 62 65 74 74 65 72 0a 20 20 20 20 2a   is better.    *
24a90 2a 20 74 68 61 6e 20 70 54 65 6d 70 6c 61 74 65  * than pTemplate
24aa0 2c 20 73 6f 20 6a 75 73 74 20 69 67 6e 6f 72 65  , so just ignore
24ab0 20 70 54 65 6d 70 6c 61 74 65 20 2a 2f 0a 23 69   pTemplate */.#i
24ac0 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  f WHERETRACE_ENA
24ad0 42 4c 45 44 20 2f 2a 20 30 78 38 20 2a 2f 0a 20  BLED /* 0x8 */. 
24ae0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68     if( sqlite3Wh
24af0 65 72 65 54 72 61 63 65 20 26 20 30 78 38 20 29  ereTrace & 0x8 )
24b00 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
24b10 65 62 75 67 50 72 69 6e 74 66 28 22 69 6e 73 2d  ebugPrintf("ins-
24b20 6e 6f 6f 70 3a 20 22 29 3b 0a 20 20 20 20 20 20  noop: ");.      
24b30 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70  whereLoopPrint(p
24b40 54 65 6d 70 6c 61 74 65 2c 20 70 42 75 69 6c 64  Template, pBuild
24b50 65 72 2d 3e 70 57 43 29 3b 0a 20 20 20 20 7d 0a  er->pWC);.    }.
24b60 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72  #endif.    retur
24b70 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 0a 20  n SQLITE_OK;  . 
24b80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20 3d 20   }else{.    p = 
24b90 2a 70 70 50 72 65 76 3b 0a 20 20 7d 0a 0a 20 20  *ppPrev;.  }..  
24ba0 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74  /* If we reach t
24bb0 68 69 73 20 70 6f 69 6e 74 20 69 74 20 6d 65 61  his point it mea
24bc0 6e 73 20 74 68 61 74 20 65 69 74 68 65 72 20 70  ns that either p
24bd0 5b 5d 20 73 68 6f 75 6c 64 20 62 65 20 6f 76 65  [] should be ove
24be0 72 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20 77 69  rwritten.  ** wi
24bf0 74 68 20 70 54 65 6d 70 6c 61 74 65 5b 5d 20 69  th pTemplate[] i
24c00 66 20 70 5b 5d 20 65 78 69 73 74 73 2c 20 6f 72  f p[] exists, or
24c10 20 69 66 20 70 3d 3d 4e 55 4c 4c 20 74 68 65 6e   if p==NULL then
24c20 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 0a   allocate a new.
24c30 20 20 2a 2a 20 57 68 65 72 65 4c 6f 6f 70 20 61    ** WhereLoop a
24c40 6e 64 20 69 6e 73 65 72 74 20 69 74 2e 0a 20 20  nd insert it..  
24c50 2a 2f 0a 23 69 66 20 57 48 45 52 45 54 52 41 43  */.#if WHERETRAC
24c60 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78 38  E_ENABLED /* 0x8
24c70 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65   */.  if( sqlite
24c80 33 57 68 65 72 65 54 72 61 63 65 20 26 20 30 78  3WhereTrace & 0x
24c90 38 20 29 7b 0a 20 20 20 20 69 66 28 20 70 21 3d  8 ){.    if( p!=
24ca0 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
24cb0 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 69  e3DebugPrintf("i
24cc0 6e 73 2d 64 65 6c 3a 20 20 22 29 3b 0a 20 20 20  ns-del:  ");.   
24cd0 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e     whereLoopPrin
24ce0 74 28 70 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70  t(p, pBuilder->p
24cf0 57 43 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  WC);.    }.    s
24d00 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
24d10 66 28 22 69 6e 73 2d 6e 65 77 3a 20 20 22 29 3b  f("ins-new:  ");
24d20 0a 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72  .    whereLoopPr
24d30 69 6e 74 28 70 54 65 6d 70 6c 61 74 65 2c 20 70  int(pTemplate, p
24d40 42 75 69 6c 64 65 72 2d 3e 70 57 43 29 3b 0a 20  Builder->pWC);. 
24d50 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20   }.#endif.  if( 
24d60 70 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 41  p==0 ){.    /* A
24d70 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 57 68  llocate a new Wh
24d80 65 72 65 4c 6f 6f 70 20 74 6f 20 61 64 64 20 74  ereLoop to add t
24d90 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
24da0 20 6c 69 73 74 20 2a 2f 0a 20 20 20 20 2a 70 70   list */.    *pp
24db0 50 72 65 76 20 3d 20 70 20 3d 20 73 71 6c 69 74  Prev = p = sqlit
24dc0 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62  e3DbMallocRaw(db
24dd0 2c 20 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f  , sizeof(WhereLo
24de0 6f 70 29 29 3b 0a 20 20 20 20 69 66 28 20 70 3d  op));.    if( p=
24df0 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
24e00 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 77 68  TE_NOMEM;.    wh
24e10 65 72 65 4c 6f 6f 70 49 6e 69 74 28 70 29 3b 0a  ereLoopInit(p);.
24e20 20 20 20 20 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70      p->pNextLoop
24e30 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
24e40 20 20 20 2f 2a 20 57 65 20 77 69 6c 6c 20 62 65     /* We will be
24e50 20 6f 76 65 72 77 72 69 74 69 6e 67 20 57 68 65   overwriting Whe
24e60 72 65 4c 6f 6f 70 20 70 5b 5d 2e 20 20 42 75 74  reLoop p[].  But
24e70 20 62 65 66 6f 72 65 20 77 65 20 64 6f 2c 20 66   before we do, f
24e80 69 72 73 74 0a 20 20 20 20 2a 2a 20 67 6f 20 74  irst.    ** go t
24e90 68 72 6f 75 67 68 20 74 68 65 20 72 65 73 74 20  hrough the rest 
24ea0 6f 66 20 74 68 65 20 6c 69 73 74 20 61 6e 64 20  of the list and 
24eb0 64 65 6c 65 74 65 20 61 6e 79 20 6f 74 68 65 72  delete any other
24ec0 20 65 6e 74 72 69 65 73 20 62 65 73 69 64 65 73   entries besides
24ed0 0a 20 20 20 20 2a 2a 20 70 5b 5d 20 74 68 61 74  .    ** p[] that
24ee0 20 61 72 65 20 61 6c 73 6f 20 73 75 70 70 6c 61   are also suppla
24ef0 74 65 64 20 62 79 20 70 54 65 6d 70 6c 61 74 65  ted by pTemplate
24f00 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 4c 6f 6f   */.    WhereLoo
24f10 70 20 2a 2a 70 70 54 61 69 6c 20 3d 20 26 70 2d  p **ppTail = &p-
24f20 3e 70 4e 65 78 74 4c 6f 6f 70 3b 0a 20 20 20 20  >pNextLoop;.    
24f30 57 68 65 72 65 4c 6f 6f 70 20 2a 70 54 6f 44 65  WhereLoop *pToDe
24f40 6c 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 2a 70  l;.    while( *p
24f50 70 54 61 69 6c 20 29 7b 0a 20 20 20 20 20 20 70  pTail ){.      p
24f60 70 54 61 69 6c 20 3d 20 77 68 65 72 65 4c 6f 6f  pTail = whereLoo
24f70 70 46 69 6e 64 4c 65 73 73 65 72 28 70 70 54 61  pFindLesser(ppTa
24f80 69 6c 2c 20 70 54 65 6d 70 6c 61 74 65 29 3b 0a  il, pTemplate);.
24f90 20 20 20 20 20 20 69 66 28 20 4e 45 56 45 52 28        if( NEVER(
24fa0 70 70 54 61 69 6c 3d 3d 30 29 20 29 20 62 72 65  ppTail==0) ) bre
24fb0 61 6b 3b 0a 20 20 20 20 20 20 70 54 6f 44 65 6c  ak;.      pToDel
24fc0 20 3d 20 2a 70 70 54 61 69 6c 3b 0a 20 20 20 20   = *ppTail;.    
24fd0 20 20 69 66 28 20 70 54 6f 44 65 6c 3d 3d 30 20    if( pToDel==0 
24fe0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 2a  ) break;.      *
24ff0 70 70 54 61 69 6c 20 3d 20 70 54 6f 44 65 6c 2d  ppTail = pToDel-
25000 3e 70 4e 65 78 74 4c 6f 6f 70 3b 0a 23 69 66 20  >pNextLoop;.#if 
25010 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c  WHERETRACE_ENABL
25020 45 44 20 2f 2a 20 30 78 38 20 2a 2f 0a 20 20 20  ED /* 0x8 */.   
25030 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68     if( sqlite3Wh
25040 65 72 65 54 72 61 63 65 20 26 20 30 78 38 20 29  ereTrace & 0x8 )
25050 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
25060 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 69 6e  3DebugPrintf("in
25070 73 2d 64 65 6c 3a 20 22 29 3b 0a 20 20 20 20 20  s-del: ");.     
25080 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e     whereLoopPrin
25090 74 28 70 54 6f 44 65 6c 2c 20 70 42 75 69 6c 64  t(pToDel, pBuild
250a0 65 72 2d 3e 70 57 43 29 3b 0a 20 20 20 20 20 20  er->pWC);.      
250b0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 77  }.#endif.      w
250c0 68 65 72 65 4c 6f 6f 70 44 65 6c 65 74 65 28 64  hereLoopDelete(d
250d0 62 2c 20 70 54 6f 44 65 6c 29 3b 0a 20 20 20 20  b, pToDel);.    
250e0 7d 0a 20 20 7d 0a 20 20 77 68 65 72 65 4c 6f 6f  }.  }.  whereLoo
250f0 70 58 66 65 72 28 64 62 2c 20 70 2c 20 70 54 65  pXfer(db, p, pTe
25100 6d 70 6c 61 74 65 29 3b 0a 20 20 69 66 28 20 28  mplate);.  if( (
25110 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
25120 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  RE_VIRTUALTABLE)
25130 3d 3d 30 20 29 7b 0a 20 20 20 20 49 6e 64 65 78  ==0 ){.    Index
25140 20 2a 70 49 6e 64 65 78 20 3d 20 70 2d 3e 75 2e   *pIndex = p->u.
25150 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20  btree.pIndex;.  
25160 20 20 69 66 28 20 70 49 6e 64 65 78 20 26 26 20    if( pIndex && 
25170 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 3d 3d 30 20  pIndex->tnum==0 
25180 29 7b 0a 20 20 20 20 20 20 70 2d 3e 75 2e 62 74  ){.      p->u.bt
25190 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 30 3b 0a  ree.pIndex = 0;.
251a0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
251b0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
251c0 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20 74 68  ./*.** Adjust th
251d0 65 20 57 68 65 72 65 4c 6f 6f 70 2e 6e 4f 75 74  e WhereLoop.nOut
251e0 20 76 61 6c 75 65 20 64 6f 77 6e 77 61 72 64 20   value downward 
251f0 74 6f 20 61 63 63 6f 75 6e 74 20 66 6f 72 20 74  to account for t
25200 65 72 6d 73 20 6f 66 20 74 68 65 0a 2a 2a 20 57  erms of the.** W
25210 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74  HERE clause that
25220 20 72 65 66 65 72 65 6e 63 65 20 74 68 65 20 6c   reference the l
25230 6f 6f 70 20 62 75 74 20 77 68 69 63 68 20 61 72  oop but which ar
25240 65 20 6e 6f 74 20 75 73 65 64 20 62 79 20 61 6e  e not used by an
25250 0a 2a 2a 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a  .** index..**.**
25260 20 49 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   In the current 
25270 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2c 20  implementation, 
25280 74 68 65 20 66 69 72 73 74 20 65 78 74 72 61 20  the first extra 
25290 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
252a0 6d 20 72 65 64 75 63 65 73 0a 2a 2a 20 74 68 65  m reduces.** the
252b0 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75   number of outpu
252c0 74 20 72 6f 77 73 20 62 79 20 61 20 66 61 63 74  t rows by a fact
252d0 6f 72 20 6f 66 20 31 30 20 61 6e 64 20 65 61 63  or of 10 and eac
252e0 68 20 61 64 64 69 74 69 6f 6e 61 6c 20 74 65 72  h additional ter
252f0 6d 0a 2a 2a 20 72 65 64 75 63 65 73 20 74 68 65  m.** reduces the
25300 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75   number of outpu
25310 74 20 72 6f 77 73 20 62 79 20 73 71 72 74 28 32  t rows by sqrt(2
25320 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  )..*/.static voi
25330 64 20 77 68 65 72 65 4c 6f 6f 70 4f 75 74 70 75  d whereLoopOutpu
25340 74 41 64 6a 75 73 74 28 57 68 65 72 65 43 6c 61  tAdjust(WhereCla
25350 75 73 65 20 2a 70 57 43 2c 20 57 68 65 72 65 4c  use *pWC, WhereL
25360 6f 6f 70 20 2a 70 4c 6f 6f 70 29 7b 0a 20 20 57  oop *pLoop){.  W
25370 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c  hereTerm *pTerm,
25380 20 2a 70 58 3b 0a 20 20 42 69 74 6d 61 73 6b 20   *pX;.  Bitmask 
25390 6e 6f 74 41 6c 6c 6f 77 65 64 20 3d 20 7e 28 70  notAllowed = ~(p
253a0 4c 6f 6f 70 2d 3e 70 72 65 72 65 71 7c 70 4c 6f  Loop->prereq|pLo
253b0 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 29 3b 0a 20  op->maskSelf);. 
253c0 20 69 6e 74 20 69 2c 20 6a 3b 0a 0a 20 20 69 66   int i, j;..  if
253d0 28 20 21 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45  ( !OptimizationE
253e0 6e 61 62 6c 65 64 28 70 57 43 2d 3e 70 57 49 6e  nabled(pWC->pWIn
253f0 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2c 20  fo->pParse->db, 
25400 53 51 4c 49 54 45 5f 41 64 6a 75 73 74 4f 75 74  SQLITE_AdjustOut
25410 45 73 74 29 20 29 7b 0a 20 20 20 20 72 65 74 75  Est) ){.    retu
25420 72 6e 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d  rn;.  }.  for(i=
25430 70 57 43 2d 3e 6e 54 65 72 6d 2c 20 70 54 65 72  pWC->nTerm, pTer
25440 6d 3d 70 57 43 2d 3e 61 3b 20 69 3e 30 3b 20 69  m=pWC->a; i>0; i
25450 2d 2d 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20  --, pTerm++){.  
25460 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 77 74    if( (pTerm->wt
25470 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52  Flags & TERM_VIR
25480 54 55 41 4c 29 21 3d 30 20 29 20 62 72 65 61 6b  TUAL)!=0 ) break
25490 3b 0a 20 20 20 20 69 66 28 20 28 70 54 65 72 6d  ;.    if( (pTerm
254a0 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26 20 70 4c  ->prereqAll & pL
254b0 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 29 3d 3d  oop->maskSelf)==
254c0 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
254d0 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72    if( (pTerm->pr
254e0 65 72 65 71 41 6c 6c 20 26 20 6e 6f 74 41 6c 6c  ereqAll & notAll
254f0 6f 77 65 64 29 21 3d 30 20 29 20 63 6f 6e 74 69  owed)!=0 ) conti
25500 6e 75 65 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 70  nue;.    for(j=p
25510 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 2d 31 3b 20  Loop->nLTerm-1; 
25520 6a 3e 3d 30 3b 20 6a 2d 2d 29 7b 0a 20 20 20 20  j>=0; j--){.    
25530 20 20 70 58 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c    pX = pLoop->aL
25540 54 65 72 6d 5b 6a 5d 3b 0a 20 20 20 20 20 20 69  Term[j];.      i
25550 66 28 20 70 58 3d 3d 30 20 29 20 63 6f 6e 74 69  f( pX==0 ) conti
25560 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70  nue;.      if( p
25570 58 3d 3d 70 54 65 72 6d 20 29 20 62 72 65 61 6b  X==pTerm ) break
25580 3b 0a 20 20 20 20 20 20 69 66 28 20 70 58 2d 3e  ;.      if( pX->
25590 69 50 61 72 65 6e 74 3e 3d 30 20 26 26 20 28 26  iParent>=0 && (&
255a0 70 57 43 2d 3e 61 5b 70 58 2d 3e 69 50 61 72 65  pWC->a[pX->iPare
255b0 6e 74 5d 29 3d 3d 70 54 65 72 6d 20 29 20 62 72  nt])==pTerm ) br
255c0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  eak;.    }.    i
255d0 66 28 20 6a 3c 30 20 29 7b 0a 20 20 20 20 20 20  f( j<0 ){.      
255e0 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 2b 3d 20 28  pLoop->nOut += (
255f0 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62  pTerm->truthProb
25600 3c 3d 30 20 3f 20 70 54 65 72 6d 2d 3e 74 72 75  <=0 ? pTerm->tru
25610 74 68 50 72 6f 62 20 3a 20 2d 31 29 3b 0a 20 20  thProb : -1);.  
25620 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
25630 20 57 65 20 68 61 76 65 20 73 6f 20 66 61 72 20   We have so far 
25640 6d 61 74 63 68 65 64 20 70 42 75 69 6c 64 65 72  matched pBuilder
25650 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e  ->pNew->u.btree.
25660 6e 45 71 20 74 65 72 6d 73 20 6f 66 20 74 68 65  nEq terms of the
25670 20 0a 2a 2a 20 69 6e 64 65 78 20 70 49 6e 64 65   .** index pInde
25680 78 2e 20 54 72 79 20 74 6f 20 6d 61 74 63 68 20  x. Try to match 
25690 6f 6e 65 20 6d 6f 72 65 2e 0a 2a 2a 0a 2a 2a 20  one more..**.** 
256a0 57 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  When this functi
256b0 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 70 42  on is called, pB
256c0 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 6e 4f  uilder->pNew->nO
256d0 75 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  ut contains the 
256e0 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  .** number of ro
256f0 77 73 20 65 78 70 65 63 74 65 64 20 74 6f 20 62  ws expected to b
25700 65 20 76 69 73 69 74 65 64 20 62 79 20 66 69 6c  e visited by fil
25710 74 65 72 69 6e 67 20 75 73 69 6e 67 20 74 68 65  tering using the
25720 20 6e 45 71 20 0a 2a 2a 20 74 65 72 6d 73 20 6f   nEq .** terms o
25730 6e 6c 79 2e 20 49 66 20 69 74 20 69 73 20 6d 6f  nly. If it is mo
25740 64 69 66 69 65 64 2c 20 74 68 69 73 20 76 61 6c  dified, this val
25750 75 65 20 69 73 20 72 65 73 74 6f 72 65 64 20 62  ue is restored b
25760 65 66 6f 72 65 20 74 68 69 73 20 0a 2a 2a 20 66  efore this .** f
25770 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e  unction returns.
25780 0a 2a 2a 0a 2a 2a 20 49 66 20 70 50 72 6f 62 65  .**.** If pProbe
25790 2d 3e 74 6e 75 6d 3d 3d 30 2c 20 74 68 61 74 20  ->tnum==0, that 
257a0 6d 65 61 6e 73 20 70 49 6e 64 65 78 20 69 73 20  means pIndex is 
257b0 61 20 66 61 6b 65 20 69 6e 64 65 78 20 75 73 65  a fake index use
257c0 64 20 66 6f 72 20 74 68 65 0a 2a 2a 20 49 4e 54  d for the.** INT
257d0 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
257e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
257f0 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65  whereLoopAddBtre
25800 65 49 6e 64 65 78 28 0a 20 20 57 68 65 72 65 4c  eIndex(.  WhereL
25810 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69  oopBuilder *pBui
25820 6c 64 65 72 2c 20 20 20 20 20 2f 2a 20 54 68 65  lder,     /* The
25830 20 57 68 65 72 65 4c 6f 6f 70 20 66 61 63 74 6f   WhereLoop facto
25840 72 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  ry */.  struct S
25850 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72  rcList_item *pSr
25860 63 2c 20 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20  c,      /* FROM 
25870 63 6c 61 75 73 65 20 74 65 72 6d 20 62 65 69 6e  clause term bein
25880 67 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20 20  g analyzed */.  
25890 49 6e 64 65 78 20 2a 70 50 72 6f 62 65 2c 20 20  Index *pProbe,  
258a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
258b0 2f 2a 20 41 6e 20 69 6e 64 65 78 20 6f 6e 20 70  /* An index on p
258c0 53 72 63 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20  Src */.  LogEst 
258d0 6e 49 6e 4d 75 6c 20 20 20 20 20 20 20 20 20 20  nInMul          
258e0 20 20 20 20 20 20 20 20 20 2f 2a 20 6c 6f 67 28           /* log(
258f0 4e 75 6d 62 65 72 20 6f 66 20 69 74 65 72 61 74  Number of iterat
25900 69 6f 6e 73 20 64 75 65 20 74 6f 20 49 4e 29 20  ions due to IN) 
25910 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 49 6e 66  */.){.  WhereInf
25920 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70 42 75 69  o *pWInfo = pBui
25930 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 20 20 2f  lder->pWInfo;  /
25940 2a 20 57 48 45 52 45 20 61 6e 61 6c 79 73 65 20  * WHERE analyse 
25950 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 50 61 72  context */.  Par
25960 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 49  se *pParse = pWI
25970 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 20 20 20 20  nfo->pParse;    
25980 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
25990 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73 71 6c 69  ontext */.  sqli
259a0 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
259b0 2d 3e 64 62 3b 20 20 20 20 20 20 20 2f 2a 20 44  ->db;       /* D
259c0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
259d0 6f 6e 20 6d 61 6c 6c 6f 63 20 63 6f 6e 74 65 78  on malloc contex
259e0 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70  t */.  WhereLoop
259f0 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20   *pNew;         
25a00 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6c 61         /* Templa
25a10 74 65 20 57 68 65 72 65 4c 6f 6f 70 20 75 6e 64  te WhereLoop und
25a20 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  er construction 
25a30 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  */.  WhereTerm *
25a40 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20  pTerm;          
25a50 20 20 20 20 20 2f 2a 20 41 20 57 68 65 72 65 54       /* A WhereT
25a60 65 72 6d 20 75 6e 64 65 72 20 63 6f 6e 73 69 64  erm under consid
25a70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  eration */.  int
25a80 20 6f 70 4d 61 73 6b 3b 20 20 20 20 20 20 20 20   opMask;        
25a90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25aa0 56 61 6c 69 64 20 6f 70 65 72 61 74 6f 72 73 20  Valid operators 
25ab0 66 6f 72 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  for constraints 
25ac0 2a 2f 0a 20 20 57 68 65 72 65 53 63 61 6e 20 73  */.  WhereScan s
25ad0 63 61 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  can;            
25ae0 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72       /* Iterator
25af0 20 66 6f 72 20 57 48 45 52 45 20 74 65 72 6d 73   for WHERE terms
25b00 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 73 61   */.  Bitmask sa
25b10 76 65 64 5f 70 72 65 72 65 71 3b 20 20 20 20 20  ved_prereq;     
25b20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61        /* Origina
25b30 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d  l value of pNew-
25b40 3e 70 72 65 72 65 71 20 2a 2f 0a 20 20 75 31 36  >prereq */.  u16
25b50 20 73 61 76 65 64 5f 6e 4c 54 65 72 6d 3b 20 20   saved_nLTerm;  
25b60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25b70 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f  Original value o
25b80 66 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 2a  f pNew->nLTerm *
25b90 2f 0a 20 20 75 31 36 20 73 61 76 65 64 5f 6e 45  /.  u16 saved_nE
25ba0 71 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  q;              
25bb0 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20      /* Original 
25bc0 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 75  value of pNew->u
25bd0 2e 62 74 72 65 65 2e 6e 45 71 20 2a 2f 0a 20 20  .btree.nEq */.  
25be0 75 31 36 20 73 61 76 65 64 5f 6e 53 6b 69 70 3b  u16 saved_nSkip;
25bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25c00 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75  /* Original valu
25c10 65 20 6f 66 20 70 4e 65 77 2d 3e 75 2e 62 74 72  e of pNew->u.btr
25c20 65 65 2e 6e 53 6b 69 70 20 2a 2f 0a 20 20 75 33  ee.nSkip */.  u3
25c30 32 20 73 61 76 65 64 5f 77 73 46 6c 61 67 73 3b  2 saved_wsFlags;
25c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25c50 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20   Original value 
25c60 6f 66 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73  of pNew->wsFlags
25c70 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 73 61 76   */.  LogEst sav
25c80 65 64 5f 6e 4f 75 74 3b 20 20 20 20 20 20 20 20  ed_nOut;        
25c90 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61        /* Origina
25ca0 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d  l value of pNew-
25cb0 3e 6e 4f 75 74 20 2a 2f 0a 20 20 69 6e 74 20 69  >nOut */.  int i
25cc0 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Col;            
25cd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
25ce0 64 65 78 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  dex of the colum
25cf0 6e 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 2a  n in the table *
25d00 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
25d10 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
25d20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
25d30 64 65 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 72  de */.  LogEst r
25d40 4c 6f 67 53 69 7a 65 3b 20 20 20 20 20 20 20 20  LogSize;        
25d50 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 67 61 72          /* Logar
25d60 69 74 68 6d 20 6f 66 20 74 61 62 6c 65 20 73 69  ithm of table si
25d70 7a 65 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  ze */.  WhereTer
25d80 6d 20 2a 70 54 6f 70 20 3d 20 30 2c 20 2a 70 42  m *pTop = 0, *pB
25d90 74 6d 20 3d 20 30 3b 20 2f 2a 20 54 6f 70 20 61  tm = 0; /* Top a
25da0 6e 64 20 62 6f 74 74 6f 6d 20 72 61 6e 67 65 20  nd bottom range 
25db0 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 0a  constraints */..
25dc0 20 20 70 4e 65 77 20 3d 20 70 42 75 69 6c 64 65    pNew = pBuilde
25dd0 72 2d 3e 70 4e 65 77 3b 0a 20 20 69 66 28 20 64  r->pNew;.  if( d
25de0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
25df0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
25e00 4e 4f 4d 45 4d 3b 0a 0a 20 20 61 73 73 65 72 74  NOMEM;..  assert
25e10 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73  ( (pNew->wsFlags
25e20 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c   & WHERE_VIRTUAL
25e30 54 41 42 4c 45 29 3d 3d 30 20 29 3b 0a 20 20 61  TABLE)==0 );.  a
25e40 73 73 65 72 74 28 20 28 70 4e 65 77 2d 3e 77 73  ssert( (pNew->ws
25e50 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54 4f  Flags & WHERE_TO
25e60 50 5f 4c 49 4d 49 54 29 3d 3d 30 20 29 3b 0a 20  P_LIMIT)==0 );. 
25e70 20 69 66 28 20 70 4e 65 77 2d 3e 77 73 46 6c 61   if( pNew->wsFla
25e80 67 73 20 26 20 57 48 45 52 45 5f 42 54 4d 5f 4c  gs & WHERE_BTM_L
25e90 49 4d 49 54 20 29 7b 0a 20 20 20 20 6f 70 4d 61  IMIT ){.    opMa
25ea0 73 6b 20 3d 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45  sk = WO_LT|WO_LE
25eb0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50  ;.  }else if( pP
25ec0 72 6f 62 65 2d 3e 74 6e 75 6d 3c 3d 30 20 7c 7c  robe->tnum<=0 ||
25ed0 20 28 70 53 72 63 2d 3e 6a 6f 69 6e 74 79 70 65   (pSrc->jointype
25ee0 20 26 20 4a 54 5f 4c 45 46 54 29 21 3d 30 20 29   & JT_LEFT)!=0 )
25ef0 7b 0a 20 20 20 20 6f 70 4d 61 73 6b 20 3d 20 57  {.    opMask = W
25f00 4f 5f 45 51 7c 57 4f 5f 49 4e 7c 57 4f 5f 47 54  O_EQ|WO_IN|WO_GT
25f10 7c 57 4f 5f 47 45 7c 57 4f 5f 4c 54 7c 57 4f 5f  |WO_GE|WO_LT|WO_
25f20 4c 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  LE;.  }else{.   
25f30 20 6f 70 4d 61 73 6b 20 3d 20 57 4f 5f 45 51 7c   opMask = WO_EQ|
25f40 57 4f 5f 49 4e 7c 57 4f 5f 49 53 4e 55 4c 4c 7c  WO_IN|WO_ISNULL|
25f50 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4c  WO_GT|WO_GE|WO_L
25f60 54 7c 57 4f 5f 4c 45 3b 0a 20 20 7d 0a 20 20 69  T|WO_LE;.  }.  i
25f70 66 28 20 70 50 72 6f 62 65 2d 3e 62 55 6e 6f 72  f( pProbe->bUnor
25f80 64 65 72 65 64 20 29 20 6f 70 4d 61 73 6b 20 26  dered ) opMask &
25f90 3d 20 7e 28 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c  = ~(WO_GT|WO_GE|
25fa0 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 3b 0a 0a 20  WO_LT|WO_LE);.. 
25fb0 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 75   assert( pNew->u
25fc0 2e 62 74 72 65 65 2e 6e 45 71 3c 3d 70 50 72 6f  .btree.nEq<=pPro
25fd0 62 65 2d 3e 6e 4b 65 79 43 6f 6c 20 29 3b 0a 20  be->nKeyCol );. 
25fe0 20 69 66 28 20 70 4e 65 77 2d 3e 75 2e 62 74 72   if( pNew->u.btr
25ff0 65 65 2e 6e 45 71 20 3c 20 70 50 72 6f 62 65 2d  ee.nEq < pProbe-
26000 3e 6e 4b 65 79 43 6f 6c 20 29 7b 0a 20 20 20 20  >nKeyCol ){.    
26010 69 43 6f 6c 20 3d 20 70 50 72 6f 62 65 2d 3e 61  iCol = pProbe->a
26020 69 43 6f 6c 75 6d 6e 5b 70 4e 65 77 2d 3e 75 2e  iColumn[pNew->u.
26030 62 74 72 65 65 2e 6e 45 71 5d 3b 0a 20 20 7d 65  btree.nEq];.  }e
26040 6c 73 65 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20  lse{.    iCol = 
26050 2d 31 3b 0a 20 20 7d 0a 20 20 70 54 65 72 6d 20  -1;.  }.  pTerm 
26060 3d 20 77 68 65 72 65 53 63 61 6e 49 6e 69 74 28  = whereScanInit(
26070 26 73 63 61 6e 2c 20 70 42 75 69 6c 64 65 72 2d  &scan, pBuilder-
26080 3e 70 57 43 2c 20 70 53 72 63 2d 3e 69 43 75 72  >pWC, pSrc->iCur
26090 73 6f 72 2c 20 69 43 6f 6c 2c 0a 20 20 20 20 20  sor, iCol,.     
260a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
260b0 20 20 20 6f 70 4d 61 73 6b 2c 20 70 50 72 6f 62     opMask, pProb
260c0 65 29 3b 0a 20 20 73 61 76 65 64 5f 6e 45 71 20  e);.  saved_nEq 
260d0 3d 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e  = pNew->u.btree.
260e0 6e 45 71 3b 0a 20 20 73 61 76 65 64 5f 6e 53 6b  nEq;.  saved_nSk
260f0 69 70 20 3d 20 70 4e 65 77 2d 3e 75 2e 62 74 72  ip = pNew->u.btr
26100 65 65 2e 6e 53 6b 69 70 3b 0a 20 20 73 61 76 65  ee.nSkip;.  save
26110 64 5f 6e 4c 54 65 72 6d 20 3d 20 70 4e 65 77 2d  d_nLTerm = pNew-
26120 3e 6e 4c 54 65 72 6d 3b 0a 20 20 73 61 76 65 64  >nLTerm;.  saved
26130 5f 77 73 46 6c 61 67 73 20 3d 20 70 4e 65 77 2d  _wsFlags = pNew-
26140 3e 77 73 46 6c 61 67 73 3b 0a 20 20 73 61 76 65  >wsFlags;.  save
26150 64 5f 70 72 65 72 65 71 20 3d 20 70 4e 65 77 2d  d_prereq = pNew-
26160 3e 70 72 65 72 65 71 3b 0a 20 20 73 61 76 65 64  >prereq;.  saved
26170 5f 6e 4f 75 74 20 3d 20 70 4e 65 77 2d 3e 6e 4f  _nOut = pNew->nO
26180 75 74 3b 0a 20 20 70 4e 65 77 2d 3e 72 53 65 74  ut;.  pNew->rSet
26190 75 70 20 3d 20 30 3b 0a 20 20 72 4c 6f 67 53 69  up = 0;.  rLogSi
261a0 7a 65 20 3d 20 65 73 74 4c 6f 67 28 70 50 72 6f  ze = estLog(pPro
261b0 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b  be->aiRowLogEst[
261c0 30 5d 29 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 73 69  0]);..  /* Consi
261d0 64 65 72 20 75 73 69 6e 67 20 61 20 73 6b 69 70  der using a skip
261e0 2d 73 63 61 6e 20 69 66 20 74 68 65 72 65 20 61  -scan if there a
261f0 72 65 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75  re no WHERE clau
26200 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20  se constraints. 
26210 20 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20 66 6f   ** available fo
26220 72 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20  r the left-most 
26230 74 65 72 6d 73 20 6f 66 20 74 68 65 20 69 6e 64  terms of the ind
26240 65 78 2c 20 61 6e 64 20 69 66 20 74 68 65 20 61  ex, and if the a
26250 76 65 72 61 67 65 0a 20 20 2a 2a 20 6e 75 6d 62  verage.  ** numb
26260 65 72 20 6f 66 20 72 65 70 65 61 74 73 20 69 6e  er of repeats in
26270 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 74   the left-most t
26280 65 72 6d 73 20 69 73 20 61 74 20 6c 65 61 73 74  erms is at least
26290 20 31 38 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20   18. .  **.  ** 
262a0 54 68 65 20 6d 61 67 69 63 20 6e 75 6d 62 65 72  The magic number
262b0 20 31 38 20 69 73 20 73 65 6c 65 63 74 65 64 20   18 is selected 
262c0 6f 6e 20 74 68 65 20 62 61 73 69 73 20 74 68 61  on the basis tha
262d0 74 20 73 63 61 6e 6e 69 6e 67 20 31 37 20 72 6f  t scanning 17 ro
262e0 77 73 0a 20 20 2a 2a 20 69 73 20 61 6c 6d 6f 73  ws.  ** is almos
262f0 74 20 61 6c 77 61 79 73 20 71 75 69 63 6b 65 72  t always quicker
26300 20 74 68 61 6e 20 61 6e 20 69 6e 64 65 78 20 73   than an index s
26310 65 65 6b 20 28 65 76 65 6e 20 74 68 6f 75 67 68  eek (even though
26320 20 69 66 20 74 68 65 20 69 6e 64 65 78 0a 20 20   if the index.  
26330 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 66 65 77 65  ** contains fewe
26340 72 20 74 68 61 6e 20 32 5e 31 37 20 72 6f 77 73  r than 2^17 rows
26350 20 77 65 20 61 73 73 75 6d 65 20 6f 74 68 65 72   we assume other
26360 77 69 73 65 20 69 6e 20 6f 74 68 65 72 20 70 61  wise in other pa
26370 72 74 73 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20  rts of.  ** the 
26380 63 6f 64 65 29 2e 20 41 6e 64 2c 20 65 76 65 6e  code). And, even
26390 20 69 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 69   if it is not, i
263a0 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20  t should not be 
263b0 74 6f 6f 20 6d 75 63 68 20 73 6c 6f 77 65 72 2e  too much slower.
263c0 20 0a 20 20 2a 2a 20 4f 6e 20 74 68 65 20 6f 74   .  ** On the ot
263d0 68 65 72 20 68 61 6e 64 2c 20 74 68 65 20 65 78  her hand, the ex
263e0 74 72 61 20 73 65 65 6b 73 20 63 6f 75 6c 64 20  tra seeks could 
263f0 65 6e 64 20 75 70 20 62 65 69 6e 67 20 73 69 67  end up being sig
26400 6e 69 66 69 63 61 6e 74 6c 79 0a 20 20 2a 2a 20  nificantly.  ** 
26410 6d 6f 72 65 20 65 78 70 65 6e 73 69 76 65 2e 20  more expensive. 
26420 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 34 32   */.  assert( 42
26430 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  ==sqlite3LogEst(
26440 31 38 29 20 29 3b 0a 20 20 69 66 28 20 70 54 65  18) );.  if( pTe
26450 72 6d 3d 3d 30 0a 20 20 20 26 26 20 73 61 76 65  rm==0.   && save
26460 64 5f 6e 45 71 3d 3d 73 61 76 65 64 5f 6e 53 6b  d_nEq==saved_nSk
26470 69 70 0a 20 20 20 26 26 20 73 61 76 65 64 5f 6e  ip.   && saved_n
26480 45 71 2b 31 3c 70 50 72 6f 62 65 2d 3e 6e 4b 65  Eq+1<pProbe->nKe
26490 79 43 6f 6c 0a 20 20 20 26 26 20 70 50 72 6f 62  yCol.   && pProb
264a0 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 73  e->aiRowLogEst[s
264b0 61 76 65 64 5f 6e 45 71 2b 31 5d 3e 3d 34 32 20  aved_nEq+1]>=42 
264c0 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 4d 69 6e 69   /* TUNING: Mini
264d0 6d 75 6d 20 66 6f 72 20 73 6b 69 70 2d 73 63 61  mum for skip-sca
264e0 6e 20 2a 2f 0a 20 20 20 26 26 20 28 72 63 20 3d  n */.   && (rc =
264f0 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65   whereLoopResize
26500 28 64 62 2c 20 70 4e 65 77 2c 20 70 4e 65 77 2d  (db, pNew, pNew-
26510 3e 6e 4c 54 65 72 6d 2b 31 29 29 3d 3d 53 51 4c  >nLTerm+1))==SQL
26520 49 54 45 5f 4f 4b 0a 20 20 29 7b 0a 20 20 20 20  ITE_OK.  ){.    
26530 4c 6f 67 45 73 74 20 6e 49 74 65 72 3b 0a 20 20  LogEst nIter;.  
26540 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e    pNew->u.btree.
26550 6e 45 71 2b 2b 3b 0a 20 20 20 20 70 4e 65 77 2d  nEq++;.    pNew-
26560 3e 75 2e 62 74 72 65 65 2e 6e 53 6b 69 70 2b 2b  >u.btree.nSkip++
26570 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65  ;.    pNew->aLTe
26580 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b  rm[pNew->nLTerm+
26590 2b 5d 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77  +] = 0;.    pNew
265a0 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45  ->wsFlags |= WHE
265b0 52 45 5f 53 4b 49 50 53 43 41 4e 3b 0a 20 20 20  RE_SKIPSCAN;.   
265c0 20 6e 49 74 65 72 20 3d 20 70 50 72 6f 62 65 2d   nIter = pProbe-
265d0 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 73 61 76  >aiRowLogEst[sav
265e0 65 64 5f 6e 45 71 5d 20 2d 20 70 50 72 6f 62 65  ed_nEq] - pProbe
265f0 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 73 61  ->aiRowLogEst[sa
26600 76 65 64 5f 6e 45 71 2b 31 5d 3b 0a 20 20 20 20  ved_nEq+1];.    
26610 70 4e 65 77 2d 3e 6e 4f 75 74 20 2d 3d 20 6e 49  pNew->nOut -= nI
26620 74 65 72 3b 0a 20 20 20 20 77 68 65 72 65 4c 6f  ter;.    whereLo
26630 6f 70 41 64 64 42 74 72 65 65 49 6e 64 65 78 28  opAddBtreeIndex(
26640 70 42 75 69 6c 64 65 72 2c 20 70 53 72 63 2c 20  pBuilder, pSrc, 
26650 70 50 72 6f 62 65 2c 20 6e 49 74 65 72 20 2b 20  pProbe, nIter + 
26660 6e 49 6e 4d 75 6c 29 3b 0a 20 20 20 20 70 4e 65  nInMul);.    pNe
26670 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64 5f  w->nOut = saved_
26680 6e 4f 75 74 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  nOut;.  }.  for(
26690 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
266a0 26 26 20 70 54 65 72 6d 21 3d 30 3b 20 70 54 65  && pTerm!=0; pTe
266b0 72 6d 20 3d 20 77 68 65 72 65 53 63 61 6e 4e 65  rm = whereScanNe
266c0 78 74 28 26 73 63 61 6e 29 29 7b 0a 20 20 20 20  xt(&scan)){.    
266d0 75 31 36 20 65 4f 70 20 3d 20 70 54 65 72 6d 2d  u16 eOp = pTerm-
266e0 3e 65 4f 70 65 72 61 74 6f 72 3b 20 20 20 2f 2a  >eOperator;   /*
266f0 20 53 68 6f 72 74 68 61 6e 64 20 66 6f 72 20 70   Shorthand for p
26700 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
26710 2a 2f 0a 20 20 20 20 4c 6f 67 45 73 74 20 72 43  */.    LogEst rC
26720 6f 73 74 49 64 78 3b 0a 20 20 20 20 4c 6f 67 45  ostIdx;.    LogE
26730 73 74 20 6e 4f 75 74 55 6e 61 64 6a 75 73 74 65  st nOutUnadjuste
26740 64 3b 20 20 20 20 20 20 20 20 2f 2a 20 6e 4f 75  d;        /* nOu
26750 74 20 62 65 66 6f 72 65 20 49 4e 28 29 20 61 6e  t before IN() an
26760 64 20 57 48 45 52 45 20 61 64 6a 75 73 74 6d 65  d WHERE adjustme
26770 6e 74 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  nts */.    int n
26780 49 6e 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53  In = 0;.#ifdef S
26790 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
267a0 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 20 20  T3_OR_STAT4.    
267b0 69 6e 74 20 6e 52 65 63 56 61 6c 69 64 20 3d 20  int nRecValid = 
267c0 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61  pBuilder->nRecVa
267d0 6c 69 64 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  lid;.#endif.    
267e0 69 66 28 20 28 65 4f 70 3d 3d 57 4f 5f 49 53 4e  if( (eOp==WO_ISN
267f0 55 4c 4c 20 7c 7c 20 28 70 54 65 72 6d 2d 3e 77  ULL || (pTerm->w
26800 74 46 6c 61 67 73 26 54 45 52 4d 5f 56 4e 55 4c  tFlags&TERM_VNUL
26810 4c 29 21 3d 30 29 0a 20 20 20 20 20 26 26 20 28  L)!=0).     && (
26820 69 43 6f 6c 3c 30 20 7c 7c 20 70 53 72 63 2d 3e  iCol<0 || pSrc->
26830 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
26840 2e 6e 6f 74 4e 75 6c 6c 29 0a 20 20 20 20 29 7b  .notNull).    ){
26850 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b  .      continue;
26860 20 2f 2a 20 69 67 6e 6f 72 65 20 49 53 20 5b 4e   /* ignore IS [N
26870 4f 54 5d 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61  OT] NULL constra
26880 69 6e 74 73 20 6f 6e 20 4e 4f 54 20 4e 55 4c 4c  ints on NOT NULL
26890 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20   columns */.    
268a0 7d 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  }.    if( pTerm-
268b0 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20 70  >prereqRight & p
268c0 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 20 29 20  New->maskSelf ) 
268d0 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20 70  continue;..    p
268e0 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 73  New->wsFlags = s
268f0 61 76 65 64 5f 77 73 46 6c 61 67 73 3b 0a 20 20  aved_wsFlags;.  
26900 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e    pNew->u.btree.
26910 6e 45 71 20 3d 20 73 61 76 65 64 5f 6e 45 71 3b  nEq = saved_nEq;
26920 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72  .    pNew->nLTer
26930 6d 20 3d 20 73 61 76 65 64 5f 6e 4c 54 65 72 6d  m = saved_nLTerm
26940 3b 0a 20 20 20 20 69 66 28 20 77 68 65 72 65 4c  ;.    if( whereL
26950 6f 6f 70 52 65 73 69 7a 65 28 64 62 2c 20 70 4e  oopResize(db, pN
26960 65 77 2c 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d  ew, pNew->nLTerm
26970 2b 31 29 20 29 20 62 72 65 61 6b 3b 20 2f 2a 20  +1) ) break; /* 
26980 4f 4f 4d 20 2a 2f 0a 20 20 20 20 70 4e 65 77 2d  OOM */.    pNew-
26990 3e 61 4c 54 65 72 6d 5b 70 4e 65 77 2d 3e 6e 4c  >aLTerm[pNew->nL
269a0 54 65 72 6d 2b 2b 5d 20 3d 20 70 54 65 72 6d 3b  Term++] = pTerm;
269b0 0a 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65  .    pNew->prere
269c0 71 20 3d 20 28 73 61 76 65 64 5f 70 72 65 72 65  q = (saved_prere
269d0 71 20 7c 20 70 54 65 72 6d 2d 3e 70 72 65 72 65  q | pTerm->prere
269e0 71 52 69 67 68 74 29 20 26 20 7e 70 4e 65 77 2d  qRight) & ~pNew-
269f0 3e 6d 61 73 6b 53 65 6c 66 3b 0a 0a 20 20 20 20  >maskSelf;..    
26a00 61 73 73 65 72 74 28 20 6e 49 6e 4d 75 6c 3d 3d  assert( nInMul==
26a10 30 0a 20 20 20 20 20 20 20 20 7c 7c 20 28 70 4e  0.        || (pN
26a20 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  ew->wsFlags & WH
26a30 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c 29  ERE_COLUMN_NULL)
26a40 21 3d 30 20 0a 20 20 20 20 20 20 20 20 7c 7c 20  !=0 .        || 
26a50 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26  (pNew->wsFlags &
26a60 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e   WHERE_COLUMN_IN
26a70 29 21 3d 30 20 0a 20 20 20 20 20 20 20 20 7c 7c  )!=0 .        ||
26a80 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20   (pNew->wsFlags 
26a90 26 20 57 48 45 52 45 5f 53 4b 49 50 53 43 41 4e  & WHERE_SKIPSCAN
26aa0 29 21 3d 30 20 0a 20 20 20 20 29 3b 0a 0a 20 20  )!=0 .    );..  
26ab0 20 20 69 66 28 20 65 4f 70 20 26 20 57 4f 5f 49    if( eOp & WO_I
26ac0 4e 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  N ){.      Expr 
26ad0 2a 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e  *pExpr = pTerm->
26ae0 70 45 78 70 72 3b 0a 20 20 20 20 20 20 70 4e 65  pExpr;.      pNe
26af0 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48  w->wsFlags |= WH
26b00 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 3b 0a 20  ERE_COLUMN_IN;. 
26b10 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73       if( ExprHas
26b20 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
26b30 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b  EP_xIsSelect) ){
26b40 0a 20 20 20 20 20 20 20 20 2f 2a 20 22 78 20 49  .        /* "x I
26b50 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 3a  N (SELECT ...)":
26b60 20 20 54 55 4e 49 4e 47 3a 20 74 68 65 20 53 45    TUNING: the SE
26b70 4c 45 43 54 20 72 65 74 75 72 6e 73 20 32 35 20  LECT returns 25 
26b80 72 6f 77 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  rows */.        
26b90 6e 49 6e 20 3d 20 34 36 3b 20 20 61 73 73 65 72  nIn = 46;  asser
26ba0 74 28 20 34 36 3d 3d 73 71 6c 69 74 65 33 4c 6f  t( 46==sqlite3Lo
26bb0 67 45 73 74 28 32 35 29 20 29 3b 0a 20 20 20 20  gEst(25) );.    
26bc0 20 20 7d 65 6c 73 65 20 69 66 28 20 41 4c 57 41    }else if( ALWA
26bd0 59 53 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  YS(pExpr->x.pLis
26be0 74 20 26 26 20 70 45 78 70 72 2d 3e 78 2e 70 4c  t && pExpr->x.pL
26bf0 69 73 74 2d 3e 6e 45 78 70 72 29 20 29 7b 0a 20  ist->nExpr) ){. 
26c00 20 20 20 20 20 20 20 2f 2a 20 22 78 20 49 4e 20         /* "x IN 
26c10 28 76 61 6c 75 65 2c 20 76 61 6c 75 65 2c 20 2e  (value, value, .
26c20 2e 2e 29 22 20 2a 2f 0a 20 20 20 20 20 20 20 20  ..)" */.        
26c30 6e 49 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  nIn = sqlite3Log
26c40 45 73 74 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69  Est(pExpr->x.pLi
26c50 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20  st->nExpr);.    
26c60 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
26c70 28 20 6e 49 6e 3e 30 20 29 3b 20 20 2f 2a 20 52  ( nIn>0 );  /* R
26c80 48 53 20 61 6c 77 61 79 73 20 68 61 73 20 32 20  HS always has 2 
26c90 6f 72 20 6d 6f 72 65 20 74 65 72 6d 73 2e 2e 2e  or more terms...
26ca0 20 20 54 68 65 20 70 61 72 73 65 72 0a 20 20 20    The parser.   
26cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26cc0 20 20 20 20 20 2a 2a 20 63 68 61 6e 67 65 73 20       ** changes 
26cd0 22 78 20 49 4e 20 28 3f 29 22 20 69 6e 74 6f 20  "x IN (?)" into 
26ce0 22 78 3d 3f 22 2e 20 2a 2f 0a 0a 20 20 20 20 7d  "x=?". */..    }
26cf0 65 6c 73 65 20 69 66 28 20 65 4f 70 20 26 20 28  else if( eOp & (
26d00 57 4f 5f 45 51 29 20 29 7b 0a 20 20 20 20 20 20  WO_EQ) ){.      
26d10 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d  pNew->wsFlags |=
26d20 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51   WHERE_COLUMN_EQ
26d30 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c  ;.      if( iCol
26d40 3c 30 20 7c 7c 20 28 6e 49 6e 4d 75 6c 3d 3d 30  <0 || (nInMul==0
26d50 20 26 26 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65   && pNew->u.btre
26d60 65 2e 6e 45 71 3d 3d 70 50 72 6f 62 65 2d 3e 6e  e.nEq==pProbe->n
26d70 4b 65 79 43 6f 6c 2d 31 29 20 29 7b 0a 20 20 20  KeyCol-1) ){.   
26d80 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30       if( iCol>=0
26d90 20 26 26 20 70 50 72 6f 62 65 2d 3e 6f 6e 45 72   && pProbe->onEr
26da0 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65 20 29 7b 0a  ror==OE_None ){.
26db0 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
26dc0 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45  wsFlags |= WHERE
26dd0 5f 55 4e 51 5f 57 41 4e 54 45 44 3b 0a 20 20 20  _UNQ_WANTED;.   
26de0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
26df0 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c        pNew->wsFl
26e00 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 4f 4e 45  ags |= WHERE_ONE
26e10 52 4f 57 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ROW;.        }. 
26e20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
26e30 20 69 66 28 20 65 4f 70 20 26 20 57 4f 5f 49 53   if( eOp & WO_IS
26e40 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 70 4e  NULL ){.      pN
26e50 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57  ew->wsFlags |= W
26e60 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c  HERE_COLUMN_NULL
26e70 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
26e80 65 4f 70 20 26 20 28 57 4f 5f 47 54 7c 57 4f 5f  eOp & (WO_GT|WO_
26e90 47 45 29 20 29 7b 0a 20 20 20 20 20 20 74 65 73  GE) ){.      tes
26ea0 74 63 61 73 65 28 20 65 4f 70 20 26 20 57 4f 5f  tcase( eOp & WO_
26eb0 47 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  GT );.      test
26ec0 63 61 73 65 28 20 65 4f 70 20 26 20 57 4f 5f 47  case( eOp & WO_G
26ed0 45 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  E );.      pNew-
26ee0 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52  >wsFlags |= WHER
26ef0 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c 57  E_COLUMN_RANGE|W
26f00 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 3b 0a  HERE_BTM_LIMIT;.
26f10 20 20 20 20 20 20 70 42 74 6d 20 3d 20 70 54 65        pBtm = pTe
26f20 72 6d 3b 0a 20 20 20 20 20 20 70 54 6f 70 20 3d  rm;.      pTop =
26f30 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
26f40 20 20 20 20 20 61 73 73 65 72 74 28 20 65 4f 70       assert( eOp
26f50 20 26 20 28 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29   & (WO_LT|WO_LE)
26f60 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
26f70 73 65 28 20 65 4f 70 20 26 20 57 4f 5f 4c 54 20  se( eOp & WO_LT 
26f80 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
26f90 65 28 20 65 4f 70 20 26 20 57 4f 5f 4c 45 20 29  e( eOp & WO_LE )
26fa0 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73  ;.      pNew->ws
26fb0 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43  Flags |= WHERE_C
26fc0 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c 57 48 45 52  OLUMN_RANGE|WHER
26fd0 45 5f 54 4f 50 5f 4c 49 4d 49 54 3b 0a 20 20 20  E_TOP_LIMIT;.   
26fe0 20 20 20 70 54 6f 70 20 3d 20 70 54 65 72 6d 3b     pTop = pTerm;
26ff0 0a 20 20 20 20 20 20 70 42 74 6d 20 3d 20 28 70  .      pBtm = (p
27000 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  New->wsFlags & W
27010 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 29 21  HERE_BTM_LIMIT)!
27020 3d 30 20 3f 0a 20 20 20 20 20 20 20 20 20 20 20  =0 ?.           
27030 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
27040 61 4c 54 65 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54  aLTerm[pNew->nLT
27050 65 72 6d 2d 32 5d 20 3a 20 30 3b 0a 20 20 20 20  erm-2] : 0;.    
27060 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69  }..    /* At thi
27070 73 20 70 6f 69 6e 74 20 70 4e 65 77 2d 3e 6e 4f  s point pNew->nO
27080 75 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  ut is set to the
27090 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
270a0 65 78 70 65 63 74 65 64 20 74 6f 0a 20 20 20 20  expected to.    
270b0 2a 2a 20 62 65 20 76 69 73 69 74 65 64 20 62 79  ** be visited by
270c0 20 74 68 65 20 69 6e 64 65 78 20 73 63 61 6e 20   the index scan 
270d0 62 65 66 6f 72 65 20 63 6f 6e 73 69 64 65 72 69  before consideri
270e0 6e 67 20 74 65 72 6d 20 70 54 65 72 6d 2c 20 6f  ng term pTerm, o
270f0 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 76 61 6c  r the.    ** val
27100 75 65 73 20 6f 66 20 6e 49 6e 20 61 6e 64 20 6e  ues of nIn and n
27110 49 6e 4d 75 6c 2e 20 49 6e 20 6f 74 68 65 72 20  InMul. In other 
27120 77 6f 72 64 73 2c 20 61 73 73 75 6d 69 6e 67 20  words, assuming 
27130 74 68 61 74 20 61 6c 6c 20 0a 20 20 20 20 2a 2a  that all .    **
27140 20 22 78 20 49 4e 28 2e 2e 2e 29 22 20 74 65 72   "x IN(...)" ter
27150 6d 73 20 61 72 65 20 72 65 70 6c 61 63 65 64 20  ms are replaced 
27160 77 69 74 68 20 22 78 20 3d 20 3f 22 2e 20 54 68  with "x = ?". Th
27170 69 73 20 62 6c 6f 63 6b 20 75 70 64 61 74 65 73  is block updates
27180 0a 20 20 20 20 2a 2a 20 74 68 65 20 76 61 6c 75  .    ** the valu
27190 65 20 6f 66 20 70 4e 65 77 2d 3e 6e 4f 75 74 20  e of pNew->nOut 
271a0 74 6f 20 61 63 63 6f 75 6e 74 20 66 6f 72 20 70  to account for p
271b0 54 65 72 6d 20 28 62 75 74 20 6e 6f 74 20 6e 49  Term (but not nI
271c0 6e 2f 6e 49 6e 4d 75 6c 29 2e 20 20 2a 2f 0a 20  n/nInMul).  */. 
271d0 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d     assert( pNew-
271e0 3e 6e 4f 75 74 3d 3d 73 61 76 65 64 5f 6e 4f 75  >nOut==saved_nOu
271f0 74 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65  t );.    if( pNe
27200 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  w->wsFlags & WHE
27210 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 20  RE_COLUMN_RANGE 
27220 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 64 6a 75  ){.      /* Adju
27230 73 74 20 6e 4f 75 74 20 75 73 69 6e 67 20 73 74  st nOut using st
27240 61 74 33 2f 73 74 61 74 34 20 64 61 74 61 2e 20  at3/stat4 data. 
27250 4f 72 2c 20 69 66 20 74 68 65 72 65 20 69 73 20  Or, if there is 
27260 6e 6f 20 73 74 61 74 33 2f 73 74 61 74 34 0a 20  no stat3/stat4. 
27270 20 20 20 20 20 2a 2a 20 64 61 74 61 2c 20 75 73       ** data, us
27280 69 6e 67 20 73 6f 6d 65 20 6f 74 68 65 72 20 65  ing some other e
27290 73 74 69 6d 61 74 65 2e 20 20 2a 2f 0a 20 20 20  stimate.  */.   
272a0 20 20 20 77 68 65 72 65 52 61 6e 67 65 53 63 61     whereRangeSca
272b0 6e 45 73 74 28 70 50 61 72 73 65 2c 20 70 42 75  nEst(pParse, pBu
272c0 69 6c 64 65 72 2c 20 70 42 74 6d 2c 20 70 54 6f  ilder, pBtm, pTo
272d0 70 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 7d 65  p, pNew);.    }e
272e0 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  lse{.      int n
272f0 45 71 20 3d 20 2b 2b 70 4e 65 77 2d 3e 75 2e 62  Eq = ++pNew->u.b
27300 74 72 65 65 2e 6e 45 71 3b 0a 20 20 20 20 20 20  tree.nEq;.      
27310 61 73 73 65 72 74 28 20 65 4f 70 20 26 20 28 57  assert( eOp & (W
27320 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 45 51 7c 57  O_ISNULL|WO_EQ|W
27330 4f 5f 49 4e 29 20 29 3b 0a 0a 20 20 20 20 20 20  O_IN) );..      
27340 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4f  assert( pNew->nO
27350 75 74 3d 3d 73 61 76 65 64 5f 6e 4f 75 74 20 29  ut==saved_nOut )
27360 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72  ;.      if( pTer
27370 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3c 3d 30 20  m->truthProb<=0 
27380 26 26 20 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20 20  && iCol>=0 ){.  
27390 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 65        assert( (e
273a0 4f 70 20 26 20 57 4f 5f 49 4e 29 20 7c 7c 20 6e  Op & WO_IN) || n
273b0 49 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  In==0 );.       
273c0 20 74 65 73 74 63 61 73 65 28 20 65 4f 70 20 26   testcase( eOp &
273d0 20 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 20 20   WO_IN );.      
273e0 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b 3d 20    pNew->nOut += 
273f0 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62  pTerm->truthProb
27400 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
27410 6e 4f 75 74 20 2d 3d 20 6e 49 6e 3b 0a 20 20 20  nOut -= nIn;.   
27420 20 20 20 7d 65 6c 73 65 7b 0a 23 69 66 64 65 66     }else{.#ifdef
27430 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
27440 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20  TAT3_OR_STAT4.  
27450 20 20 20 20 20 20 74 52 6f 77 63 6e 74 20 6e 4f        tRowcnt nO
27460 75 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ut = 0;.        
27470 69 66 28 20 6e 49 6e 4d 75 6c 3d 3d 30 20 0a 20  if( nInMul==0 . 
27480 20 20 20 20 20 20 20 20 26 26 20 70 50 72 6f 62          && pProb
27490 65 2d 3e 6e 53 61 6d 70 6c 65 20 0a 20 20 20 20  e->nSample .    
274a0 20 20 20 20 20 26 26 20 70 4e 65 77 2d 3e 75 2e       && pNew->u.
274b0 62 74 72 65 65 2e 6e 45 71 3c 3d 70 50 72 6f 62  btree.nEq<=pProb
274c0 65 2d 3e 6e 53 61 6d 70 6c 65 43 6f 6c 0a 20 20  e->nSampleCol.  
274d0 20 20 20 20 20 20 20 26 26 20 4f 70 74 69 6d 69         && Optimi
274e0 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62  zationEnabled(db
274f0 2c 20 53 51 4c 49 54 45 5f 53 74 61 74 33 29 20  , SQLITE_Stat3) 
27500 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 28 65  .         && ((e
27510 4f 70 20 26 20 57 4f 5f 49 4e 29 3d 3d 30 20 7c  Op & WO_IN)==0 |
27520 7c 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  | !ExprHasProper
27530 74 79 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c  ty(pTerm->pExpr,
27540 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 29 0a   EP_xIsSelect)).
27550 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
27560 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72       Expr *pExpr
27570 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b   = pTerm->pExpr;
27580 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28  .          if( (
27590 65 4f 70 20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f  eOp & (WO_EQ|WO_
275a0 49 53 4e 55 4c 4c 29 29 21 3d 30 20 29 7b 0a 20  ISNULL))!=0 ){. 
275b0 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63             testc
275c0 61 73 65 28 20 65 4f 70 20 26 20 57 4f 5f 45 51  ase( eOp & WO_EQ
275d0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
275e0 74 65 73 74 63 61 73 65 28 20 65 4f 70 20 26 20  testcase( eOp & 
275f0 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20  WO_ISNULL );.   
27600 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 68           rc = wh
27610 65 72 65 45 71 75 61 6c 53 63 61 6e 45 73 74 28  ereEqualScanEst(
27620 70 50 61 72 73 65 2c 20 70 42 75 69 6c 64 65 72  pParse, pBuilder
27630 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
27640 20 26 6e 4f 75 74 29 3b 0a 20 20 20 20 20 20 20   &nOut);.       
27650 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
27660 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65        rc = where
27670 49 6e 53 63 61 6e 45 73 74 28 70 50 61 72 73 65  InScanEst(pParse
27680 2c 20 70 42 75 69 6c 64 65 72 2c 20 70 45 78 70  , pBuilder, pExp
27690 72 2d 3e 78 2e 70 4c 69 73 74 2c 20 26 6e 4f 75  r->x.pList, &nOu
276a0 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  t);.          }.
276b0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
276c0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
276d0 7c 7c 20 6e 4f 75 74 3e 30 20 29 3b 0a 20 20 20  || nOut>0 );.   
276e0 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
276f0 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 29  QLITE_NOTFOUND )
27700 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
27710 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
27720 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 62  c!=SQLITE_OK ) b
27730 72 65 61 6b 3b 20 20 20 20 20 20 20 20 20 20 2f  reak;          /
27740 2a 20 4a 75 6d 70 20 6f 75 74 20 6f 66 20 74 68  * Jump out of th
27750 65 20 70 54 65 72 6d 20 6c 6f 6f 70 20 2a 2f 0a  e pTerm loop */.
27760 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 4f            if( nO
27770 75 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ut ){.          
27780 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73    pNew->nOut = s
27790 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 6e 4f 75  qlite3LogEst(nOu
277a0 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  t);.            
277b0 69 66 28 20 70 4e 65 77 2d 3e 6e 4f 75 74 3e 73  if( pNew->nOut>s
277c0 61 76 65 64 5f 6e 4f 75 74 20 29 20 70 4e 65 77  aved_nOut ) pNew
277d0 2d 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e  ->nOut = saved_n
277e0 4f 75 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Out;.           
277f0 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2d 3d 20 6e   pNew->nOut -= n
27800 49 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  In;.          }.
27810 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
27820 20 20 69 66 28 20 6e 4f 75 74 3d 3d 30 20 29 0a    if( nOut==0 ).
27830 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7b  #endif.        {
27840 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d  .          pNew-
27850 3e 6e 4f 75 74 20 2b 3d 20 28 70 50 72 6f 62 65  >nOut += (pProbe
27860 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 6e 45  ->aiRowLogEst[nE
27870 71 5d 20 2d 20 70 50 72 6f 62 65 2d 3e 61 69 52  q] - pProbe->aiR
27880 6f 77 4c 6f 67 45 73 74 5b 6e 45 71 2d 31 5d 29  owLogEst[nEq-1])
27890 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
278a0 65 4f 70 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20  eOp & WO_ISNULL 
278b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ){.            /
278c0 2a 20 54 55 4e 49 4e 47 3a 20 49 66 20 74 68 65  * TUNING: If the
278d0 72 65 20 69 73 20 6e 6f 20 6c 69 6b 65 6c 69 68  re is no likelih
278e0 6f 6f 64 28 29 20 76 61 6c 75 65 2c 20 61 73 73  ood() value, ass
278f0 75 6d 65 20 74 68 61 74 20 61 20 0a 20 20 20 20  ume that a .    
27900 20 20 20 20 20 20 20 20 2a 2a 20 22 63 6f 6c 20          ** "col 
27910 49 53 20 4e 55 4c 4c 22 20 65 78 70 72 65 73 73  IS NULL" express
27920 69 6f 6e 20 6d 61 74 63 68 65 73 20 74 77 69 63  ion matches twic
27930 65 20 61 73 20 6d 61 6e 79 20 72 6f 77 73 20 0a  e as many rows .
27940 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61              ** a
27950 73 20 28 63 6f 6c 3d 3f 29 2e 20 2a 2f 0a 20 20  s (col=?). */.  
27960 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
27970 6e 4f 75 74 20 2b 3d 20 31 30 3b 0a 20 20 20 20  nOut += 10;.    
27980 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
27990 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
279a0 0a 20 20 20 20 2f 2a 20 53 65 74 20 72 43 6f 73  .    /* Set rCos
279b0 74 49 64 78 20 74 6f 20 74 68 65 20 63 6f 73 74  tIdx to the cost
279c0 20 6f 66 20 76 69 73 69 74 69 6e 67 20 73 65 6c   of visiting sel
279d0 65 63 74 65 64 20 72 6f 77 73 20 69 6e 20 69 6e  ected rows in in
279e0 64 65 78 2e 20 41 64 64 0a 20 20 20 20 2a 2a 20  dex. Add.    ** 
279f0 69 74 20 74 6f 20 70 4e 65 77 2d 3e 72 52 75 6e  it to pNew->rRun
27a00 2c 20 77 68 69 63 68 20 69 73 20 63 75 72 72 65  , which is curre
27a10 6e 74 6c 79 20 73 65 74 20 74 6f 20 74 68 65 20  ntly set to the 
27a20 63 6f 73 74 20 6f 66 20 74 68 65 20 69 6e 64 65  cost of the inde
27a30 78 0a 20 20 20 20 2a 2a 20 73 65 65 6b 20 6f 6e  x.    ** seek on
27a40 6c 79 2e 20 54 68 65 6e 2c 20 69 66 20 74 68 69  ly. Then, if thi
27a50 73 20 69 73 20 61 20 6e 6f 6e 2d 63 6f 76 65 72  s is a non-cover
27a60 69 6e 67 20 69 6e 64 65 78 2c 20 61 64 64 20 74  ing index, add t
27a70 68 65 20 63 6f 73 74 20 6f 66 0a 20 20 20 20 2a  he cost of.    *
27a80 2a 20 76 69 73 69 74 69 6e 67 20 74 68 65 20 72  * visiting the r
27a90 6f 77 73 20 69 6e 20 74 68 65 20 6d 61 69 6e 20  ows in the main 
27aa0 74 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 72  table.  */.    r
27ab0 43 6f 73 74 49 64 78 20 3d 20 70 4e 65 77 2d 3e  CostIdx = pNew->
27ac0 6e 4f 75 74 20 2b 20 31 20 2b 20 28 31 35 2a 70  nOut + 1 + (15*p
27ad0 50 72 6f 62 65 2d 3e 73 7a 49 64 78 52 6f 77 29  Probe->szIdxRow)
27ae0 2f 70 53 72 63 2d 3e 70 54 61 62 2d 3e 73 7a 54  /pSrc->pTab->szT
27af0 61 62 52 6f 77 3b 0a 20 20 20 20 70 4e 65 77 2d  abRow;.    pNew-
27b00 3e 72 52 75 6e 20 3d 20 73 71 6c 69 74 65 33 4c  >rRun = sqlite3L
27b10 6f 67 45 73 74 41 64 64 28 72 4c 6f 67 53 69 7a  ogEstAdd(rLogSiz
27b20 65 2c 20 72 43 6f 73 74 49 64 78 29 3b 0a 20 20  e, rCostIdx);.  
27b30 20 20 69 66 28 20 28 70 4e 65 77 2d 3e 77 73 46    if( (pNew->wsF
27b40 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 49 44  lags & (WHERE_ID
27b50 58 5f 4f 4e 4c 59 7c 57 48 45 52 45 5f 49 50 4b  X_ONLY|WHERE_IPK
27b60 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  ))==0 ){.      p
27b70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 73 71 6c 69  New->rRun = sqli
27b80 74 65 33 4c 6f 67 45 73 74 41 64 64 28 70 4e 65  te3LogEstAdd(pNe
27b90 77 2d 3e 72 52 75 6e 2c 20 70 4e 65 77 2d 3e 6e  w->rRun, pNew->n
27ba0 4f 75 74 20 2b 20 31 36 29 3b 0a 20 20 20 20 7d  Out + 16);.    }
27bb0 0a 0a 20 20 20 20 6e 4f 75 74 55 6e 61 64 6a 75  ..    nOutUnadju
27bc0 73 74 65 64 20 3d 20 70 4e 65 77 2d 3e 6e 4f 75  sted = pNew->nOu
27bd0 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 72 52 75  t;.    pNew->rRu
27be0 6e 20 2b 3d 20 6e 49 6e 4d 75 6c 20 2b 20 6e 49  n += nInMul + nI
27bf0 6e 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75  n;.    pNew->nOu
27c00 74 20 2b 3d 20 6e 49 6e 4d 75 6c 20 2b 20 6e 49  t += nInMul + nI
27c10 6e 3b 0a 20 20 20 20 77 68 65 72 65 4c 6f 6f 70  n;.    whereLoop
27c20 4f 75 74 70 75 74 41 64 6a 75 73 74 28 70 42 75  OutputAdjust(pBu
27c30 69 6c 64 65 72 2d 3e 70 57 43 2c 20 70 4e 65 77  ilder->pWC, pNew
27c40 29 3b 0a 20 20 20 20 72 63 20 3d 20 77 68 65 72  );.    rc = wher
27c50 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69  eLoopInsert(pBui
27c60 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 0a 20 20  lder, pNew);..  
27c70 20 20 69 66 28 20 70 4e 65 77 2d 3e 77 73 46 6c    if( pNew->wsFl
27c80 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55  ags & WHERE_COLU
27c90 4d 4e 5f 52 41 4e 47 45 20 29 7b 0a 20 20 20 20  MN_RANGE ){.    
27ca0 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73    pNew->nOut = s
27cb0 61 76 65 64 5f 6e 4f 75 74 3b 0a 20 20 20 20 7d  aved_nOut;.    }
27cc0 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4e 65 77  else{.      pNew
27cd0 2d 3e 6e 4f 75 74 20 3d 20 6e 4f 75 74 55 6e 61  ->nOut = nOutUna
27ce0 64 6a 75 73 74 65 64 3b 0a 20 20 20 20 7d 0a 0a  djusted;.    }..
27cf0 20 20 20 20 69 66 28 20 28 70 4e 65 77 2d 3e 77      if( (pNew->w
27d00 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54  sFlags & WHERE_T
27d10 4f 50 5f 4c 49 4d 49 54 29 3d 3d 30 0a 20 20 20  OP_LIMIT)==0.   
27d20 20 20 26 26 20 70 4e 65 77 2d 3e 75 2e 62 74 72    && pNew->u.btr
27d30 65 65 2e 6e 45 71 3c 28 70 50 72 6f 62 65 2d 3e  ee.nEq<(pProbe->
27d40 6e 4b 65 79 43 6f 6c 20 2b 20 28 70 50 72 6f 62  nKeyCol + (pProb
27d50 65 2d 3e 7a 4e 61 6d 65 21 3d 30 29 29 0a 20 20  e->zName!=0)).  
27d60 20 20 29 7b 0a 20 20 20 20 20 20 77 68 65 72 65    ){.      where
27d70 4c 6f 6f 70 41 64 64 42 74 72 65 65 49 6e 64 65  LoopAddBtreeInde
27d80 78 28 70 42 75 69 6c 64 65 72 2c 20 70 53 72 63  x(pBuilder, pSrc
27d90 2c 20 70 50 72 6f 62 65 2c 20 6e 49 6e 4d 75 6c  , pProbe, nInMul
27da0 2b 6e 49 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20  +nIn);.    }.   
27db0 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 61   pNew->nOut = sa
27dc0 76 65 64 5f 6e 4f 75 74 3b 0a 23 69 66 64 65 66  ved_nOut;.#ifdef
27dd0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
27de0 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20  TAT3_OR_STAT4.  
27df0 20 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63    pBuilder->nRec
27e00 56 61 6c 69 64 20 3d 20 6e 52 65 63 56 61 6c 69  Valid = nRecVali
27e10 64 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20  d;.#endif.  }.  
27e20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 73  pNew->prereq = s
27e30 61 76 65 64 5f 70 72 65 72 65 71 3b 0a 20 20 70  aved_prereq;.  p
27e40 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
27e50 20 3d 20 73 61 76 65 64 5f 6e 45 71 3b 0a 20 20   = saved_nEq;.  
27e60 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 53  pNew->u.btree.nS
27e70 6b 69 70 20 3d 20 73 61 76 65 64 5f 6e 53 6b 69  kip = saved_nSki
27e80 70 3b 0a 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61  p;.  pNew->wsFla
27e90 67 73 20 3d 20 73 61 76 65 64 5f 77 73 46 6c 61  gs = saved_wsFla
27ea0 67 73 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4f 75 74  gs;.  pNew->nOut
27eb0 20 3d 20 73 61 76 65 64 5f 6e 4f 75 74 3b 0a 20   = saved_nOut;. 
27ec0 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20   pNew->nLTerm = 
27ed0 73 61 76 65 64 5f 6e 4c 54 65 72 6d 3b 0a 20 20  saved_nLTerm;.  
27ee0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
27ef0 0a 2a 2a 20 52 65 74 75 72 6e 20 54 72 75 65 20  .** Return True 
27f00 69 66 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c  if it is possibl
27f10 65 20 74 68 61 74 20 70 49 6e 64 65 78 20 6d 69  e that pIndex mi
27f20 67 68 74 20 62 65 20 75 73 65 66 75 6c 20 69 6e  ght be useful in
27f30 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67  .** implementing
27f40 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
27f50 61 75 73 65 20 69 6e 20 70 42 75 69 6c 64 65 72  ause in pBuilder
27f60 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 46  ..**.** Return F
27f70 61 6c 73 65 20 69 66 20 70 42 75 69 6c 64 65 72  alse if pBuilder
27f80 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69   does not contai
27f90 6e 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  n an ORDER BY cl
27fa0 61 75 73 65 20 6f 72 0a 2a 2a 20 69 66 20 74 68  ause or.** if th
27fb0 65 72 65 20 69 73 20 6e 6f 20 77 61 79 20 66 6f  ere is no way fo
27fc0 72 20 70 49 6e 64 65 78 20 74 6f 20 62 65 20 75  r pIndex to be u
27fd0 73 65 66 75 6c 20 69 6e 20 69 6d 70 6c 65 6d 65  seful in impleme
27fe0 6e 74 69 6e 67 20 74 68 61 74 0a 2a 2a 20 4f 52  nting that.** OR
27ff0 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 0a 2a  DER BY clause..*
28000 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 64  /.static int ind
28010 65 78 4d 69 67 68 74 48 65 6c 70 57 69 74 68 4f  exMightHelpWithO
28020 72 64 65 72 42 79 28 0a 20 20 57 68 65 72 65 4c  rderBy(.  WhereL
28030 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69  oopBuilder *pBui
28040 6c 64 65 72 2c 0a 20 20 49 6e 64 65 78 20 2a 70  lder,.  Index *p
28050 49 6e 64 65 78 2c 0a 20 20 69 6e 74 20 69 43 75  Index,.  int iCu
28060 72 73 6f 72 0a 29 7b 0a 20 20 45 78 70 72 4c 69  rsor.){.  ExprLi
28070 73 74 20 2a 70 4f 42 3b 0a 20 20 69 6e 74 20 69  st *pOB;.  int i
28080 69 2c 20 6a 6a 3b 0a 0a 20 20 69 66 28 20 70 49  i, jj;..  if( pI
28090 6e 64 65 78 2d 3e 62 55 6e 6f 72 64 65 72 65 64  ndex->bUnordered
280a0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
280b0 66 28 20 28 70 4f 42 20 3d 20 70 42 75 69 6c 64  f( (pOB = pBuild
280c0 65 72 2d 3e 70 57 49 6e 66 6f 2d 3e 70 4f 72 64  er->pWInfo->pOrd
280d0 65 72 42 79 29 3d 3d 30 20 29 20 72 65 74 75 72  erBy)==0 ) retur
280e0 6e 20 30 3b 0a 20 20 66 6f 72 28 69 69 3d 30 3b  n 0;.  for(ii=0;
280f0 20 69 69 3c 70 4f 42 2d 3e 6e 45 78 70 72 3b 20   ii<pOB->nExpr; 
28100 69 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20  ii++){.    Expr 
28110 2a 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  *pExpr = sqlite3
28120 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28  ExprSkipCollate(
28130 70 4f 42 2d 3e 61 5b 69 69 5d 2e 70 45 78 70 72  pOB->a[ii].pExpr
28140 29 3b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72  );.    if( pExpr
28150 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op!=TK_COLUMN 
28160 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
28170 69 66 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  if( pExpr->iTabl
28180 65 3d 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20 20  e==iCursor ){.  
28190 20 20 20 20 66 6f 72 28 6a 6a 3d 30 3b 20 6a 6a      for(jj=0; jj
281a0 3c 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c  <pIndex->nKeyCol
281b0 3b 20 6a 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  ; jj++){.       
281c0 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c   if( pExpr->iCol
281d0 75 6d 6e 3d 3d 70 49 6e 64 65 78 2d 3e 61 69 43  umn==pIndex->aiC
281e0 6f 6c 75 6d 6e 5b 6a 6a 5d 20 29 20 72 65 74 75  olumn[jj] ) retu
281f0 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 1;.      }.  
28200 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
28210 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74   0;.}../*.** Ret
28220 75 72 6e 20 61 20 62 69 74 6d 61 73 6b 20 77 68  urn a bitmask wh
28230 65 72 65 20 31 73 20 69 6e 64 69 63 61 74 65 20  ere 1s indicate 
28240 74 68 61 74 20 74 68 65 20 63 6f 72 72 65 73 70  that the corresp
28250 6f 6e 64 69 6e 67 20 63 6f 6c 75 6d 6e 20 6f 66  onding column of
28260 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 69 73  .** the table is
28270 20 75 73 65 64 20 62 79 20 61 6e 20 69 6e 64 65   used by an inde
28280 78 2e 20 20 4f 6e 6c 79 20 74 68 65 20 66 69 72  x.  Only the fir
28290 73 74 20 36 33 20 63 6f 6c 75 6d 6e 73 20 61 72  st 63 columns ar
282a0 65 20 63 6f 6e 73 69 64 65 72 65 64 2e 0a 2a 2f  e considered..*/
282b0 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20  .static Bitmask 
282c0 63 6f 6c 75 6d 6e 73 49 6e 49 6e 64 65 78 28 49  columnsInIndex(I
282d0 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 42  ndex *pIdx){.  B
282e0 69 74 6d 61 73 6b 20 6d 20 3d 20 30 3b 0a 20 20  itmask m = 0;.  
282f0 69 6e 74 20 6a 3b 0a 20 20 66 6f 72 28 6a 3d 70  int j;.  for(j=p
28300 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 2d 31 3b 20  Idx->nColumn-1; 
28310 6a 3e 3d 30 3b 20 6a 2d 2d 29 7b 0a 20 20 20 20  j>=0; j--){.    
28320 69 6e 74 20 78 20 3d 20 70 49 64 78 2d 3e 61 69  int x = pIdx->ai
28330 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 69  Column[j];.    i
28340 66 28 20 78 3e 3d 30 20 29 7b 0a 20 20 20 20 20  f( x>=0 ){.     
28350 20 74 65 73 74 63 61 73 65 28 20 78 3d 3d 42 4d   testcase( x==BM
28360 53 2d 31 20 29 3b 0a 20 20 20 20 20 20 74 65 73  S-1 );.      tes
28370 74 63 61 73 65 28 20 78 3d 3d 42 4d 53 2d 32 20  tcase( x==BMS-2 
28380 29 3b 0a 20 20 20 20 20 20 69 66 28 20 78 3c 42  );.      if( x<B
28390 4d 53 2d 31 20 29 20 6d 20 7c 3d 20 4d 41 53 4b  MS-1 ) m |= MASK
283a0 42 49 54 28 78 29 3b 0a 20 20 20 20 7d 0a 20 20  BIT(x);.    }.  
283b0 7d 0a 20 20 72 65 74 75 72 6e 20 6d 3b 0a 7d 0a  }.  return m;.}.
283c0 0a 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65  ./* Check to see
283d0 20 69 66 20 61 20 70 61 72 74 69 61 6c 20 69 6e   if a partial in
283e0 64 65 78 20 77 69 74 68 20 70 50 61 72 74 49 6e  dex with pPartIn
283f0 64 65 78 57 68 65 72 65 20 63 61 6e 20 62 65 20  dexWhere can be 
28400 75 73 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 63  used.** in the c
28410 75 72 72 65 6e 74 20 71 75 65 72 79 2e 20 20 52  urrent query.  R
28420 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 69 74  eturn true if it
28430 20 63 61 6e 20 62 65 20 61 6e 64 20 66 61 6c 73   can be and fals
28440 65 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 61  e if not..*/.sta
28450 74 69 63 20 69 6e 74 20 77 68 65 72 65 55 73 61  tic int whereUsa
28460 62 6c 65 50 61 72 74 69 61 6c 49 6e 64 65 78 28  blePartialIndex(
28470 69 6e 74 20 69 54 61 62 2c 20 57 68 65 72 65 43  int iTab, WhereC
28480 6c 61 75 73 65 20 2a 70 57 43 2c 20 45 78 70 72  lause *pWC, Expr
28490 20 2a 70 57 68 65 72 65 29 7b 0a 20 20 69 6e 74   *pWhere){.  int
284a0 20 69 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20   i;.  WhereTerm 
284b0 2a 70 54 65 72 6d 3b 0a 20 20 66 6f 72 28 69 3d  *pTerm;.  for(i=
284c0 30 2c 20 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b  0, pTerm=pWC->a;
284d0 20 69 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69   i<pWC->nTerm; i
284e0 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20  ++, pTerm++){.  
284f0 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
28500 72 49 6d 70 6c 69 65 73 45 78 70 72 28 70 54 65  rImpliesExpr(pTe
28510 72 6d 2d 3e 70 45 78 70 72 2c 20 70 57 68 65 72  rm->pExpr, pWher
28520 65 2c 20 69 54 61 62 29 20 29 20 72 65 74 75 72  e, iTab) ) retur
28530 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 1;.  }.  retur
28540 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  n 0;.}../*.** Ad
28550 64 20 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 20  d all WhereLoop 
28560 6f 62 6a 65 63 74 73 20 66 6f 72 20 61 20 73 69  objects for a si
28570 6e 67 6c 65 20 74 61 62 6c 65 20 6f 66 20 74 68  ngle table of th
28580 65 20 6a 6f 69 6e 20 77 68 65 72 65 20 74 68 65  e join where the
28590 20 74 61 62 6c 65 0a 2a 2a 20 69 73 20 69 64 65   table.** is ide
285a0 6e 66 69 65 64 20 62 79 20 70 42 75 69 6c 64 65  nfied by pBuilde
285b0 72 2d 3e 70 4e 65 77 2d 3e 69 54 61 62 2e 20 20  r->pNew->iTab.  
285c0 54 68 61 74 20 74 61 62 6c 65 20 69 73 20 67 75  That table is gu
285d0 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 0a 2a  aranteed to be.*
285e0 2a 20 61 20 62 2d 74 72 65 65 20 74 61 62 6c 65  * a b-tree table
285f0 2c 20 6e 6f 74 20 61 20 76 69 72 74 75 61 6c 20  , not a virtual 
28600 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  table..**.** The
28610 20 63 6f 73 74 73 20 28 57 68 65 72 65 4c 6f 6f   costs (WhereLoo
28620 70 2e 72 52 75 6e 29 20 6f 66 20 74 68 65 20 62  p.rRun) of the b
28630 2d 74 72 65 65 20 6c 6f 6f 70 73 20 61 64 64 65  -tree loops adde
28640 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  d by this functi
28650 6f 6e 0a 2a 2a 20 61 72 65 20 63 61 6c 63 75 6c  on.** are calcul
28660 61 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  ated as follows:
28670 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 66 75 6c  .**.** For a ful
28680 6c 20 73 63 61 6e 2c 20 61 73 73 75 6d 69 6e 67  l scan, assuming
28690 20 74 68 65 20 74 61 62 6c 65 20 28 6f 72 20 69   the table (or i
286a0 6e 64 65 78 29 20 63 6f 6e 74 61 69 6e 73 20 6e  ndex) contains n
286b0 52 6f 77 20 72 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20  Row rows:.**.** 
286c0 20 20 20 20 63 6f 73 74 20 3d 20 6e 52 6f 77 20      cost = nRow 
286d0 2a 20 33 2e 30 20 20 20 20 20 20 20 20 20 20 20  * 3.0           
286e0 20 20 20 20 20 20 20 20 20 2f 2f 20 66 75 6c 6c           // full
286f0 2d 74 61 62 6c 65 20 73 63 61 6e 0a 2a 2a 20 20  -table scan.**  
28700 20 20 20 63 6f 73 74 20 3d 20 6e 52 6f 77 20 2a     cost = nRow *
28710 20 4b 20 20 20 20 20 20 20 20 20 20 20 20 20 20   K              
28720 20 20 20 20 20 20 20 20 2f 2f 20 73 63 61 6e 20          // scan 
28730 6f 66 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65  of covering inde
28740 78 0a 2a 2a 20 20 20 20 20 63 6f 73 74 20 3d 20  x.**     cost = 
28750 6e 52 6f 77 20 2a 20 28 4b 2b 33 2e 30 29 20 20  nRow * (K+3.0)  
28760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f                //
28770 20 73 63 61 6e 20 6f 66 20 6e 6f 6e 2d 63 6f 76   scan of non-cov
28780 65 72 69 6e 67 20 69 6e 64 65 78 0a 2a 2a 0a 2a  ering index.**.*
28790 2a 20 77 68 65 72 65 20 4b 20 69 73 20 61 20 76  * where K is a v
287a0 61 6c 75 65 20 62 65 74 77 65 65 6e 20 31 2e 31  alue between 1.1
287b0 20 61 6e 64 20 33 2e 30 20 73 65 74 20 62 61 73   and 3.0 set bas
287c0 65 64 20 6f 6e 20 74 68 65 20 72 65 6c 61 74 69  ed on the relati
287d0 76 65 20 0a 2a 2a 20 65 73 74 69 6d 61 74 65 64  ve .** estimated
287e0 20 61 76 65 72 61 67 65 20 73 69 7a 65 20 6f 66   average size of
287f0 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20 74   the index and t
28800 61 62 6c 65 20 72 65 63 6f 72 64 73 2e 0a 2a 2a  able records..**
28810 0a 2a 2a 20 46 6f 72 20 61 6e 20 69 6e 64 65 78  .** For an index
28820 20 73 63 61 6e 2c 20 77 68 65 72 65 20 6e 56 69   scan, where nVi
28830 73 69 74 20 69 73 20 74 68 65 20 6e 75 6d 62 65  sit is the numbe
28840 72 20 6f 66 20 69 6e 64 65 78 20 72 6f 77 73 20  r of index rows 
28850 76 69 73 69 74 65 64 0a 2a 2a 20 62 79 20 74 68  visited.** by th
28860 65 20 73 63 61 6e 2c 20 61 6e 64 20 6e 53 65 65  e scan, and nSee
28870 6b 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  k is the number 
28880 6f 66 20 73 65 65 6b 20 6f 70 65 72 61 74 69 6f  of seek operatio
28890 6e 73 20 72 65 71 75 69 72 65 64 20 6f 6e 20 0a  ns required on .
288a0 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 62 2d 74  ** the index b-t
288b0 72 65 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 63  ree:.**.**     c
288c0 6f 73 74 20 3d 20 6e 53 65 65 6b 20 2a 20 28 6c  ost = nSeek * (l
288d0 6f 67 28 6e 52 6f 77 29 20 2b 20 4b 20 2a 20 6e  og(nRow) + K * n
288e0 56 69 73 69 74 29 20 20 20 20 20 20 20 20 20 20  Visit)          
288f0 2f 2f 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65  // covering inde
28900 78 0a 2a 2a 20 20 20 20 20 63 6f 73 74 20 3d 20  x.**     cost = 
28910 6e 53 65 65 6b 20 2a 20 28 6c 6f 67 28 6e 52 6f  nSeek * (log(nRo
28920 77 29 20 2b 20 28 4b 2b 33 2e 30 29 20 2a 20 6e  w) + (K+3.0) * n
28930 56 69 73 69 74 29 20 20 20 20 2f 2f 20 6e 6f 6e  Visit)    // non
28940 2d 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 0a  -covering index.
28950 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20  **.** Normally, 
28960 6e 53 65 65 6b 20 69 73 20 31 2e 20 6e 53 65 65  nSeek is 1. nSee
28970 6b 20 76 61 6c 75 65 73 20 67 72 65 61 74 65 72  k values greater
28980 20 74 68 61 6e 20 31 20 63 6f 6d 65 20 61 62 6f   than 1 come abo
28990 75 74 20 69 66 20 74 68 65 20 0a 2a 2a 20 57 48  ut if the .** WH
289a0 45 52 45 20 63 6c 61 75 73 65 20 69 6e 63 6c 75  ERE clause inclu
289b0 64 65 73 20 22 78 20 49 4e 20 28 2e 2e 2e 2e 29  des "x IN (....)
289c0 22 20 74 65 72 6d 73 20 75 73 65 64 20 69 6e 20  " terms used in 
289d0 70 6c 61 63 65 20 6f 66 20 22 78 3d 3f 22 2e 20  place of "x=?". 
289e0 4f 72 20 77 68 65 6e 20 0a 2a 2a 20 69 6d 70 6c  Or when .** impl
289f0 69 63 69 74 20 22 78 20 49 4e 20 28 53 45 4c 45  icit "x IN (SELE
28a00 43 54 20 78 20 46 52 4f 4d 20 74 62 6c 29 22 20  CT x FROM tbl)" 
28a10 74 65 72 6d 73 20 61 72 65 20 61 64 64 65 64 20  terms are added 
28a20 66 6f 72 20 73 6b 69 70 2d 73 63 61 6e 73 2e 0a  for skip-scans..
28a30 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68  */.static int wh
28a40 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 28  ereLoopAddBtree(
28a50 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c  .  WhereLoopBuil
28a60 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 20 2f  der *pBuilder, /
28a70 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69  * WHERE clause i
28a80 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20  nformation */.  
28a90 42 69 74 6d 61 73 6b 20 6d 45 78 74 72 61 20 20  Bitmask mExtra  
28aa0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
28ab0 78 74 72 61 20 70 72 65 72 65 71 75 65 73 69 74  xtra prerequesit
28ac0 65 73 20 66 6f 72 20 75 73 69 6e 67 20 74 68 69  es for using thi
28ad0 73 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20  s table */.){.  
28ae0 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
28af0 6f 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  o;          /* W
28b00 48 45 52 45 20 61 6e 61 6c 79 73 69 73 20 63 6f  HERE analysis co
28b10 6e 74 65 78 74 20 2a 2f 0a 20 20 49 6e 64 65 78  ntext */.  Index
28b20 20 2a 70 50 72 6f 62 65 3b 20 20 20 20 20 20 20   *pProbe;       
28b30 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64         /* An ind
28b40 65 78 20 77 65 20 61 72 65 20 65 76 61 6c 75 61  ex we are evalua
28b50 74 69 6e 67 20 2a 2f 0a 20 20 49 6e 64 65 78 20  ting */.  Index 
28b60 73 50 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  sPk;            
28b70 20 20 20 20 20 20 2f 2a 20 41 20 66 61 6b 65 20        /* A fake 
28b80 69 6e 64 65 78 20 6f 62 6a 65 63 74 20 66 6f 72  index object for
28b90 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79   the primary key
28ba0 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 61 69 52   */.  LogEst aiR
28bb0 6f 77 45 73 74 50 6b 5b 32 5d 3b 20 20 20 20 20  owEstPk[2];     
28bc0 20 20 2f 2a 20 54 68 65 20 61 69 52 6f 77 4c 6f    /* The aiRowLo
28bd0 67 45 73 74 5b 5d 20 76 61 6c 75 65 20 66 6f 72  gEst[] value for
28be0 20 74 68 65 20 73 50 6b 20 69 6e 64 65 78 20 2a   the sPk index *
28bf0 2f 0a 20 20 69 31 36 20 61 69 43 6f 6c 75 6d 6e  /.  i16 aiColumn
28c00 50 6b 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20  Pk = -1;        
28c10 2f 2a 20 54 68 65 20 61 43 6f 6c 75 6d 6e 5b 5d  /* The aColumn[]
28c20 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 73   value for the s
28c30 50 6b 20 69 6e 64 65 78 20 2a 2f 0a 20 20 53 72  Pk index */.  Sr
28c40 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b  cList *pTabList;
28c50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
28c60 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a   FROM clause */.
28c70 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
28c80 5f 69 74 65 6d 20 2a 70 53 72 63 3b 20 20 2f 2a  _item *pSrc;  /*
28c90 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   The FROM clause
28ca0 20 62 74 72 65 65 20 74 65 72 6d 20 74 6f 20 61   btree term to a
28cb0 64 64 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f  dd */.  WhereLoo
28cc0 70 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20  p *pNew;        
28cd0 20 20 20 20 2f 2a 20 54 65 6d 70 6c 61 74 65 20      /* Template 
28ce0 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
28cf0 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
28d00 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
28d10 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
28d20 20 2a 2f 0a 20 20 69 6e 74 20 69 53 6f 72 74 49   */.  int iSortI
28d30 64 78 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20  dx = 1;         
28d40 20 20 2f 2a 20 49 6e 64 65 78 20 6e 75 6d 62 65    /* Index numbe
28d50 72 20 2a 2f 0a 20 20 69 6e 74 20 62 3b 20 20 20  r */.  int b;   
28d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28d70 20 20 20 2f 2a 20 41 20 62 6f 6f 6c 65 61 6e 20     /* A boolean 
28d80 76 61 6c 75 65 20 2a 2f 0a 20 20 4c 6f 67 45 73  value */.  LogEs
28d90 74 20 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20  t rSize;        
28da0 20 20 20 20 20 20 20 2f 2a 20 6e 75 6d 62 65 72         /* number
28db0 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20   of rows in the 
28dc0 74 61 62 6c 65 20 2a 2f 0a 20 20 4c 6f 67 45 73  table */.  LogEs
28dd0 74 20 72 4c 6f 67 53 69 7a 65 3b 20 20 20 20 20  t rLogSize;     
28de0 20 20 20 20 20 20 20 2f 2a 20 4c 6f 67 61 72 69         /* Logari
28df0 74 68 6d 20 6f 66 20 74 68 65 20 6e 75 6d 62 65  thm of the numbe
28e00 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65  r of rows in the
28e10 20 74 61 62 6c 65 20 2a 2f 0a 20 20 57 68 65 72   table */.  Wher
28e20 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 20 20 20  eClause *pWC;   
28e30 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
28e40 61 72 73 65 64 20 57 48 45 52 45 20 63 6c 61 75  arsed WHERE clau
28e50 73 65 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70  se */.  Table *p
28e60 54 61 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  Tab;            
28e70 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 62 65 69      /* Table bei
28e80 6e 67 20 71 75 65 72 69 65 64 20 2a 2f 0a 20 20  ng queried */.  
28e90 0a 20 20 70 4e 65 77 20 3d 20 70 42 75 69 6c 64  .  pNew = pBuild
28ea0 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 70 57 49 6e  er->pNew;.  pWIn
28eb0 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  fo = pBuilder->p
28ec0 57 49 6e 66 6f 3b 0a 20 20 70 54 61 62 4c 69 73  WInfo;.  pTabLis
28ed0 74 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62  t = pWInfo->pTab
28ee0 4c 69 73 74 3b 0a 20 20 70 53 72 63 20 3d 20 70  List;.  pSrc = p
28ef0 54 61 62 4c 69 73 74 2d 3e 61 20 2b 20 70 4e 65  TabList->a + pNe
28f00 77 2d 3e 69 54 61 62 3b 0a 20 20 70 54 61 62 20  w->iTab;.  pTab 
28f10 3d 20 70 53 72 63 2d 3e 70 54 61 62 3b 0a 20 20  = pSrc->pTab;.  
28f20 70 57 43 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  pWC = pBuilder->
28f30 70 57 43 3b 0a 20 20 61 73 73 65 72 74 28 20 21  pWC;.  assert( !
28f40 49 73 56 69 72 74 75 61 6c 28 70 53 72 63 2d 3e  IsVirtual(pSrc->
28f50 70 54 61 62 29 20 29 3b 0a 0a 20 20 69 66 28 20  pTab) );..  if( 
28f60 70 53 72 63 2d 3e 70 49 6e 64 65 78 20 29 7b 0a  pSrc->pIndex ){.
28f70 20 20 20 20 2f 2a 20 41 6e 20 49 4e 44 45 58 45      /* An INDEXE
28f80 44 20 42 59 20 63 6c 61 75 73 65 20 73 70 65 63  D BY clause spec
28f90 69 66 69 65 73 20 61 20 70 61 72 74 69 63 75 6c  ifies a particul
28fa0 61 72 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20  ar index to use 
28fb0 2a 2f 0a 20 20 20 20 70 50 72 6f 62 65 20 3d 20  */.    pProbe = 
28fc0 70 53 72 63 2d 3e 70 49 6e 64 65 78 3b 0a 20 20  pSrc->pIndex;.  
28fd0 7d 65 6c 73 65 20 69 66 28 20 21 48 61 73 52 6f  }else if( !HasRo
28fe0 77 69 64 28 70 54 61 62 29 20 29 7b 0a 20 20 20  wid(pTab) ){.   
28ff0 20 70 50 72 6f 62 65 20 3d 20 70 54 61 62 2d 3e   pProbe = pTab->
29000 70 49 6e 64 65 78 3b 0a 20 20 7d 65 6c 73 65 7b  pIndex;.  }else{
29010 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20 69 73  .    /* There is
29020 20 6e 6f 20 49 4e 44 45 58 45 44 20 42 59 20 63   no INDEXED BY c
29030 6c 61 75 73 65 2e 20 20 43 72 65 61 74 65 20 61  lause.  Create a
29040 20 66 61 6b 65 20 49 6e 64 65 78 20 6f 62 6a 65   fake Index obje
29050 63 74 20 69 6e 20 6c 6f 63 61 6c 0a 20 20 20 20  ct in local.    
29060 2a 2a 20 76 61 72 69 61 62 6c 65 20 73 50 6b 20  ** variable sPk 
29070 74 6f 20 72 65 70 72 65 73 65 6e 74 20 74 68 65  to represent the
29080 20 72 6f 77 69 64 20 70 72 69 6d 61 72 79 20 6b   rowid primary k
29090 65 79 20 69 6e 64 65 78 2e 20 20 4d 61 6b 65 20  ey index.  Make 
290a0 74 68 69 73 0a 20 20 20 20 2a 2a 20 66 61 6b 65  this.    ** fake
290b0 20 69 6e 64 65 78 20 74 68 65 20 66 69 72 73 74   index the first
290c0 20 69 6e 20 61 20 63 68 61 69 6e 20 6f 66 20 49   in a chain of I
290d0 6e 64 65 78 20 6f 62 6a 65 63 74 73 20 77 69 74  ndex objects wit
290e0 68 20 61 6c 6c 20 6f 66 20 74 68 65 20 72 65 61  h all of the rea
290f0 6c 0a 20 20 20 20 2a 2a 20 69 6e 64 69 63 65 73  l.    ** indices
29100 20 74 6f 20 66 6f 6c 6c 6f 77 20 2a 2f 0a 20 20   to follow */.  
29110 20 20 49 6e 64 65 78 20 2a 70 46 69 72 73 74 3b    Index *pFirst;
29120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29130 20 20 2f 2a 20 46 69 72 73 74 20 6f 66 20 72 65    /* First of re
29140 61 6c 20 69 6e 64 69 63 65 73 20 6f 6e 20 74 68  al indices on th
29150 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 6d  e table */.    m
29160 65 6d 73 65 74 28 26 73 50 6b 2c 20 30 2c 20 73  emset(&sPk, 0, s
29170 69 7a 65 6f 66 28 49 6e 64 65 78 29 29 3b 0a 20  izeof(Index));. 
29180 20 20 20 73 50 6b 2e 6e 4b 65 79 43 6f 6c 20 3d     sPk.nKeyCol =
29190 20 31 3b 0a 20 20 20 20 73 50 6b 2e 61 69 43 6f   1;.    sPk.aiCo
291a0 6c 75 6d 6e 20 3d 20 26 61 69 43 6f 6c 75 6d 6e  lumn = &aiColumn
291b0 50 6b 3b 0a 20 20 20 20 73 50 6b 2e 61 69 52 6f  Pk;.    sPk.aiRo
291c0 77 4c 6f 67 45 73 74 20 3d 20 61 69 52 6f 77 45  wLogEst = aiRowE
291d0 73 74 50 6b 3b 0a 20 20 20 20 73 50 6b 2e 6f 6e  stPk;.    sPk.on
291e0 45 72 72 6f 72 20 3d 20 4f 45 5f 52 65 70 6c 61  Error = OE_Repla
291f0 63 65 3b 0a 20 20 20 20 73 50 6b 2e 70 54 61 62  ce;.    sPk.pTab
29200 6c 65 20 3d 20 70 54 61 62 3b 0a 20 20 20 20 73  le = pTab;.    s
29210 50 6b 2e 73 7a 49 64 78 52 6f 77 20 3d 20 70 54  Pk.szIdxRow = pT
29220 61 62 2d 3e 73 7a 54 61 62 52 6f 77 3b 0a 20 20  ab->szTabRow;.  
29230 20 20 61 69 52 6f 77 45 73 74 50 6b 5b 30 5d 20    aiRowEstPk[0] 
29240 3d 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45  = pTab->nRowLogE
29250 73 74 3b 0a 20 20 20 20 61 69 52 6f 77 45 73 74  st;.    aiRowEst
29260 50 6b 5b 31 5d 20 3d 20 30 3b 0a 20 20 20 20 70  Pk[1] = 0;.    p
29270 46 69 72 73 74 20 3d 20 70 53 72 63 2d 3e 70 54  First = pSrc->pT
29280 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20  ab->pIndex;.    
29290 69 66 28 20 70 53 72 63 2d 3e 6e 6f 74 49 6e 64  if( pSrc->notInd
292a0 65 78 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20  exed==0 ){.     
292b0 20 2f 2a 20 54 68 65 20 72 65 61 6c 20 69 6e 64   /* The real ind
292c0 69 63 65 73 20 6f 66 20 74 68 65 20 74 61 62 6c  ices of the tabl
292d0 65 20 61 72 65 20 6f 6e 6c 79 20 63 6f 6e 73 69  e are only consi
292e0 64 65 72 65 64 20 69 66 20 74 68 65 0a 20 20 20  dered if the.   
292f0 20 20 20 2a 2a 20 4e 4f 54 20 49 4e 44 45 58 45     ** NOT INDEXE
29300 44 20 71 75 61 6c 69 66 69 65 72 20 69 73 20 6f  D qualifier is o
29310 6d 69 74 74 65 64 20 66 72 6f 6d 20 74 68 65 20  mitted from the 
29320 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20  FROM clause */. 
29330 20 20 20 20 20 73 50 6b 2e 70 4e 65 78 74 20 3d       sPk.pNext =
29340 20 70 46 69 72 73 74 3b 0a 20 20 20 20 7d 0a 20   pFirst;.    }. 
29350 20 20 20 70 50 72 6f 62 65 20 3d 20 26 73 50 6b     pProbe = &sPk
29360 3b 0a 20 20 7d 0a 20 20 72 53 69 7a 65 20 3d 20  ;.  }.  rSize = 
29370 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74  pTab->nRowLogEst
29380 3b 0a 20 20 72 4c 6f 67 53 69 7a 65 20 3d 20 65  ;.  rLogSize = e
29390 73 74 4c 6f 67 28 72 53 69 7a 65 29 3b 0a 0a 23  stLog(rSize);..#
293a0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
293b0 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44  IT_AUTOMATIC_IND
293c0 45 58 0a 20 20 2f 2a 20 41 75 74 6f 6d 61 74 69  EX.  /* Automati
293d0 63 20 69 6e 64 65 78 65 73 20 2a 2f 0a 20 20 69  c indexes */.  i
293e0 66 28 20 21 70 42 75 69 6c 64 65 72 2d 3e 70 4f  f( !pBuilder->pO
293f0 72 53 65 74 0a 20 20 20 26 26 20 28 70 57 49 6e  rSet.   && (pWIn
29400 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2d 3e  fo->pParse->db->
29410 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 41  flags & SQLITE_A
29420 75 74 6f 49 6e 64 65 78 29 21 3d 30 0a 20 20 20  utoIndex)!=0.   
29430 26 26 20 70 53 72 63 2d 3e 70 49 6e 64 65 78 3d  && pSrc->pIndex=
29440 3d 30 0a 20 20 20 26 26 20 21 70 53 72 63 2d 3e  =0.   && !pSrc->
29450 76 69 61 43 6f 72 6f 75 74 69 6e 65 0a 20 20 20  viaCoroutine.   
29460 26 26 20 21 70 53 72 63 2d 3e 6e 6f 74 49 6e 64  && !pSrc->notInd
29470 65 78 65 64 0a 20 20 20 26 26 20 48 61 73 52 6f  exed.   && HasRo
29480 77 69 64 28 70 54 61 62 29 0a 20 20 20 26 26 20  wid(pTab).   && 
29490 21 70 53 72 63 2d 3e 69 73 43 6f 72 72 65 6c 61  !pSrc->isCorrela
294a0 74 65 64 0a 20 20 20 26 26 20 21 70 53 72 63 2d  ted.   && !pSrc-
294b0 3e 69 73 52 65 63 75 72 73 69 76 65 0a 20 20 29  >isRecursive.  )
294c0 7b 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74  {.    /* Generat
294d0 65 20 61 75 74 6f 2d 69 6e 64 65 78 20 57 68 65  e auto-index Whe
294e0 72 65 4c 6f 6f 70 73 20 2a 2f 0a 20 20 20 20 57  reLoops */.    W
294f0 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b  hereTerm *pTerm;
29500 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a  .    WhereTerm *
29510 70 57 43 45 6e 64 20 3d 20 70 57 43 2d 3e 61 20  pWCEnd = pWC->a 
29520 2b 20 70 57 43 2d 3e 6e 54 65 72 6d 3b 0a 20 20  + pWC->nTerm;.  
29530 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d    for(pTerm=pWC-
29540 3e 61 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  >a; rc==SQLITE_O
29550 4b 20 26 26 20 70 54 65 72 6d 3c 70 57 43 45 6e  K && pTerm<pWCEn
29560 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  d; pTerm++){.   
29570 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 70 72     if( pTerm->pr
29580 65 72 65 71 52 69 67 68 74 20 26 20 70 4e 65 77  ereqRight & pNew
29590 2d 3e 6d 61 73 6b 53 65 6c 66 20 29 20 63 6f 6e  ->maskSelf ) con
295a0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28  tinue;.      if(
295b0 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
295c0 6e 73 74 61 6e 74 28 70 54 65 72 6d 2d 3e 70 45  nstant(pTerm->pE
295d0 78 70 72 2d 3e 70 52 69 67 68 74 29 20 29 20 63  xpr->pRight) ) c
295e0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69  ontinue;.      i
295f0 66 28 20 74 65 72 6d 43 61 6e 44 72 69 76 65 49  f( termCanDriveI
29600 6e 64 65 78 28 70 54 65 72 6d 2c 20 70 53 72 63  ndex(pTerm, pSrc
29610 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  , 0) ){.        
29620 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  pNew->u.btree.nE
29630 71 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70  q = 1;.        p
29640 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 53 6b  New->u.btree.nSk
29650 69 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ip = 0;.        
29660 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 70 49  pNew->u.btree.pI
29670 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20 20 20 20  ndex = 0;.      
29680 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d    pNew->nLTerm =
29690 20 31 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77   1;.        pNew
296a0 2d 3e 61 4c 54 65 72 6d 5b 30 5d 20 3d 20 70 54  ->aLTerm[0] = pT
296b0 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  erm;.        /* 
296c0 54 55 4e 49 4e 47 3a 20 4f 6e 65 2d 74 69 6d 65  TUNING: One-time
296d0 20 63 6f 73 74 20 66 6f 72 20 63 6f 6d 70 75 74   cost for comput
296e0 69 6e 67 20 74 68 65 20 61 75 74 6f 6d 61 74 69  ing the automati
296f0 63 20 69 6e 64 65 78 20 69 73 0a 20 20 20 20 20  c index is.     
29700 20 20 20 2a 2a 20 61 70 70 72 6f 78 69 6d 61 74     ** approximat
29710 65 6c 79 20 37 2a 4e 2a 6c 6f 67 32 28 4e 29 20  ely 7*N*log2(N) 
29720 77 68 65 72 65 20 4e 20 69 73 20 74 68 65 20 6e  where N is the n
29730 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e  umber of rows in
29740 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
29750 74 61 62 6c 65 20 62 65 69 6e 67 20 69 6e 64 65  table being inde
29760 78 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  xed. */.        
29770 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 72  pNew->rSetup = r
29780 4c 6f 67 53 69 7a 65 20 2b 20 72 53 69 7a 65 20  LogSize + rSize 
29790 2b 20 32 38 3b 20 20 61 73 73 65 72 74 28 20 32  + 28;  assert( 2
297a0 38 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  8==sqlite3LogEst
297b0 28 37 29 20 29 3b 0a 20 20 20 20 20 20 20 20 2f  (7) );.        /
297c0 2a 20 54 55 4e 49 4e 47 3a 20 45 61 63 68 20 69  * TUNING: Each i
297d0 6e 64 65 78 20 6c 6f 6f 6b 75 70 20 79 69 65 6c  ndex lookup yiel
297e0 64 73 20 32 30 20 72 6f 77 73 20 69 6e 20 74 68  ds 20 rows in th
297f0 65 20 74 61 62 6c 65 2e 20 20 54 68 69 73 0a 20  e table.  This. 
29800 20 20 20 20 20 20 20 2a 2a 20 69 73 20 6d 6f 72         ** is mor
29810 65 20 74 68 61 6e 20 74 68 65 20 75 73 75 61 6c  e than the usual
29820 20 67 75 65 73 73 20 6f 66 20 31 30 20 72 6f 77   guess of 10 row
29830 73 2c 20 73 69 6e 63 65 20 77 65 20 68 61 76 65  s, since we have
29840 20 6e 6f 20 77 61 79 0a 20 20 20 20 20 20 20 20   no way.        
29850 2a 2a 20 6f 66 20 6b 6e 6f 77 6e 69 6e 67 20 68  ** of knowning h
29860 6f 77 20 73 65 6c 65 63 74 69 76 65 20 74 68 65  ow selective the
29870 20 69 6e 64 65 78 20 77 69 6c 6c 20 75 6c 74 69   index will ulti
29880 6d 61 74 65 6c 79 20 62 65 2e 20 20 49 74 20 77  mately be.  It w
29890 6f 75 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a 20  ould.        ** 
298a0 6e 6f 74 20 62 65 20 75 6e 72 65 61 73 6f 6e 61  not be unreasona
298b0 62 6c 65 20 74 6f 20 6d 61 6b 65 20 74 68 69 73  ble to make this
298c0 20 76 61 6c 75 65 20 6d 75 63 68 20 6c 61 72 67   value much larg
298d0 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70  er. */.        p
298e0 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 34 33 3b 20  New->nOut = 43; 
298f0 20 61 73 73 65 72 74 28 20 34 33 3d 3d 73 71 6c   assert( 43==sql
29900 69 74 65 33 4c 6f 67 45 73 74 28 32 30 29 20 29  ite3LogEst(20) )
29910 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
29920 72 52 75 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f  rRun = sqlite3Lo
29930 67 45 73 74 41 64 64 28 72 4c 6f 67 53 69 7a 65  gEstAdd(rLogSize
29940 2c 70 4e 65 77 2d 3e 6e 4f 75 74 29 3b 0a 20 20  ,pNew->nOut);.  
29950 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c        pNew->wsFl
29960 61 67 73 20 3d 20 57 48 45 52 45 5f 41 55 54 4f  ags = WHERE_AUTO
29970 5f 49 4e 44 45 58 3b 0a 20 20 20 20 20 20 20 20  _INDEX;.        
29980 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 6d  pNew->prereq = m
29990 45 78 74 72 61 20 7c 20 70 54 65 72 6d 2d 3e 70  Extra | pTerm->p
299a0 72 65 72 65 71 52 69 67 68 74 3b 0a 20 20 20 20  rereqRight;.    
299b0 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f      rc = whereLo
299c0 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65  opInsert(pBuilde
299d0 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20  r, pNew);.      
299e0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  }.    }.  }.#end
299f0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
29a00 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45  T_AUTOMATIC_INDE
29a10 58 20 2a 2f 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20  X */..  /* Loop 
29a20 6f 76 65 72 20 61 6c 6c 20 69 6e 64 69 63 65 73  over all indices
29a30 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 3b 20 72 63  .  */.  for(; rc
29a40 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
29a50 50 72 6f 62 65 3b 20 70 50 72 6f 62 65 3d 70 50  Probe; pProbe=pP
29a60 72 6f 62 65 2d 3e 70 4e 65 78 74 2c 20 69 53 6f  robe->pNext, iSo
29a70 72 74 49 64 78 2b 2b 29 7b 0a 20 20 20 20 69 66  rtIdx++){.    if
29a80 28 20 70 50 72 6f 62 65 2d 3e 70 50 61 72 74 49  ( pProbe->pPartI
29a90 64 78 57 68 65 72 65 21 3d 30 0a 20 20 20 20 20  dxWhere!=0.     
29aa0 26 26 20 21 77 68 65 72 65 55 73 61 62 6c 65 50  && !whereUsableP
29ab0 61 72 74 69 61 6c 49 6e 64 65 78 28 70 4e 65 77  artialIndex(pNew
29ac0 2d 3e 69 54 61 62 2c 20 70 57 43 2c 20 70 50 72  ->iTab, pWC, pPr
29ad0 6f 62 65 2d 3e 70 50 61 72 74 49 64 78 57 68 65  obe->pPartIdxWhe
29ae0 72 65 29 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e  re) ){.      con
29af0 74 69 6e 75 65 3b 20 20 2f 2a 20 50 61 72 74 69  tinue;  /* Parti
29b00 61 6c 20 69 6e 64 65 78 20 69 6e 61 70 70 72 6f  al index inappro
29b10 70 72 69 61 74 65 20 66 6f 72 20 74 68 69 73 20  priate for this 
29b20 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 7d 0a 20  query */.    }. 
29b30 20 20 20 72 53 69 7a 65 20 3d 20 70 50 72 6f 62     rSize = pProb
29b40 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 30  e->aiRowLogEst[0
29b50 5d 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62  ];.    pNew->u.b
29b60 74 72 65 65 2e 6e 45 71 20 3d 20 30 3b 0a 20 20  tree.nEq = 0;.  
29b70 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e    pNew->u.btree.
29b80 6e 53 6b 69 70 20 3d 20 30 3b 0a 20 20 20 20 70  nSkip = 0;.    p
29b90 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 30 3b  New->nLTerm = 0;
29ba0 0a 20 20 20 20 70 4e 65 77 2d 3e 69 53 6f 72 74  .    pNew->iSort
29bb0 49 64 78 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65  Idx = 0;.    pNe
29bc0 77 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a 20  w->rSetup = 0;. 
29bd0 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20     pNew->prereq 
29be0 3d 20 6d 45 78 74 72 61 3b 0a 20 20 20 20 70 4e  = mExtra;.    pN
29bf0 65 77 2d 3e 6e 4f 75 74 20 3d 20 72 53 69 7a 65  ew->nOut = rSize
29c00 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74  ;.    pNew->u.bt
29c10 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 70 50 72  ree.pIndex = pPr
29c20 6f 62 65 3b 0a 20 20 20 20 62 20 3d 20 69 6e 64  obe;.    b = ind
29c30 65 78 4d 69 67 68 74 48 65 6c 70 57 69 74 68 4f  exMightHelpWithO
29c40 72 64 65 72 42 79 28 70 42 75 69 6c 64 65 72 2c  rderBy(pBuilder,
29c50 20 70 50 72 6f 62 65 2c 20 70 53 72 63 2d 3e 69   pProbe, pSrc->i
29c60 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 2f 2a 20  Cursor);.    /* 
29c70 54 68 65 20 4f 4e 45 50 41 53 53 5f 44 45 53 49  The ONEPASS_DESI
29c80 52 45 44 20 66 6c 61 67 73 20 6e 65 76 65 72 20  RED flags never 
29c90 6f 63 63 75 72 73 20 74 6f 67 65 74 68 65 72 20  occurs together 
29ca0 77 69 74 68 20 4f 52 44 45 52 20 42 59 20 2a 2f  with ORDER BY */
29cb0 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 57  .    assert( (pW
29cc0 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
29cd0 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53   & WHERE_ONEPASS
29ce0 5f 44 45 53 49 52 45 44 29 3d 3d 30 20 7c 7c 20  _DESIRED)==0 || 
29cf0 62 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  b==0 );.    if( 
29d00 70 50 72 6f 62 65 2d 3e 74 6e 75 6d 3c 3d 30 20  pProbe->tnum<=0 
29d10 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 74 65  ){.      /* Inte
29d20 67 65 72 20 70 72 69 6d 61 72 79 20 6b 65 79 20  ger primary key 
29d30 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 70  index */.      p
29d40 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57  New->wsFlags = W
29d50 48 45 52 45 5f 49 50 4b 3b 0a 0a 20 20 20 20 20  HERE_IPK;..     
29d60 20 2f 2a 20 46 75 6c 6c 20 74 61 62 6c 65 20 73   /* Full table s
29d70 63 61 6e 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65  can */.      pNe
29d80 77 2d 3e 69 53 6f 72 74 49 64 78 20 3d 20 62 20  w->iSortIdx = b 
29d90 3f 20 69 53 6f 72 74 49 64 78 20 3a 20 30 3b 0a  ? iSortIdx : 0;.
29da0 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a        /* TUNING:
29db0 20 43 6f 73 74 20 6f 66 20 66 75 6c 6c 20 74 61   Cost of full ta
29dc0 62 6c 65 20 73 63 61 6e 20 69 73 20 28 4e 2a 33  ble scan is (N*3
29dd0 2e 30 29 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4e  .0). */.      pN
29de0 65 77 2d 3e 72 52 75 6e 20 3d 20 72 53 69 7a 65  ew->rRun = rSize
29df0 20 2b 20 31 36 3b 0a 20 20 20 20 20 20 77 68 65   + 16;.      whe
29e00 72 65 4c 6f 6f 70 4f 75 74 70 75 74 41 64 6a 75  reLoopOutputAdju
29e10 73 74 28 70 57 43 2c 20 70 4e 65 77 29 3b 0a 20  st(pWC, pNew);. 
29e20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c       rc = whereL
29e30 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64  oopInsert(pBuild
29e40 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20  er, pNew);.     
29e50 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 72 53   pNew->nOut = rS
29e60 69 7a 65 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ize;.      if( r
29e70 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  c ) break;.    }
29e80 65 6c 73 65 7b 0a 20 20 20 20 20 20 42 69 74 6d  else{.      Bitm
29e90 61 73 6b 20 6d 3b 0a 20 20 20 20 20 20 69 66 28  ask m;.      if(
29ea0 20 70 50 72 6f 62 65 2d 3e 69 73 43 6f 76 65 72   pProbe->isCover
29eb0 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ing ){.        p
29ec0 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57  New->wsFlags = W
29ed0 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20 7c 20  HERE_IDX_ONLY | 
29ee0 57 48 45 52 45 5f 49 4e 44 45 58 45 44 3b 0a 20  WHERE_INDEXED;. 
29ef0 20 20 20 20 20 20 20 6d 20 3d 20 30 3b 0a 20 20         m = 0;.  
29f00 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
29f10 20 20 20 6d 20 3d 20 70 53 72 63 2d 3e 63 6f 6c     m = pSrc->col
29f20 55 73 65 64 20 26 20 7e 63 6f 6c 75 6d 6e 73 49  Used & ~columnsI
29f30 6e 49 6e 64 65 78 28 70 50 72 6f 62 65 29 3b 0a  nIndex(pProbe);.
29f40 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73          pNew->ws
29f50 46 6c 61 67 73 20 3d 20 28 6d 3d 3d 30 29 20 3f  Flags = (m==0) ?
29f60 20 28 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59   (WHERE_IDX_ONLY
29f70 7c 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 20  |WHERE_INDEXED) 
29f80 3a 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 3b  : WHERE_INDEXED;
29f90 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
29fa0 2f 2a 20 46 75 6c 6c 20 73 63 61 6e 20 76 69 61  /* Full scan via
29fb0 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20   index */.      
29fc0 69 66 28 20 62 0a 20 20 20 20 20 20 20 7c 7c 20  if( b.       || 
29fd0 21 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 0a  !HasRowid(pTab).
29fe0 20 20 20 20 20 20 20 7c 7c 20 28 20 6d 3d 3d 30         || ( m==0
29ff0 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 50 72  .         && pPr
2a000 6f 62 65 2d 3e 62 55 6e 6f 72 64 65 72 65 64 3d  obe->bUnordered=
2a010 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  =0.         && (
2a020 70 50 72 6f 62 65 2d 3e 73 7a 49 64 78 52 6f 77  pProbe->szIdxRow
2a030 3c 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 29  <pTab->szTabRow)
2a040 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 70 57  .         && (pW
2a050 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
2a060 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53   & WHERE_ONEPASS
2a070 5f 44 45 53 49 52 45 44 29 3d 3d 30 0a 20 20 20  _DESIRED)==0.   
2a080 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
2a090 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 55 73  GlobalConfig.bUs
2a0a0 65 43 69 73 0a 20 20 20 20 20 20 20 20 20 26 26  eCis.         &&
2a0b0 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61   OptimizationEna
2a0c0 62 6c 65 64 28 70 57 49 6e 66 6f 2d 3e 70 50 61  bled(pWInfo->pPa
2a0d0 72 73 65 2d 3e 64 62 2c 20 53 51 4c 49 54 45 5f  rse->db, SQLITE_
2a0e0 43 6f 76 65 72 49 64 78 53 63 61 6e 29 0a 20 20  CoverIdxScan).  
2a0f0 20 20 20 20 20 20 20 20 29 0a 20 20 20 20 20 20          ).      
2a100 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  ){.        pNew-
2a110 3e 69 53 6f 72 74 49 64 78 20 3d 20 62 20 3f 20  >iSortIdx = b ? 
2a120 69 53 6f 72 74 49 64 78 20 3a 20 30 3b 0a 0a 20  iSortIdx : 0;.. 
2a130 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f         /* The co
2a140 73 74 20 6f 66 20 76 69 73 69 74 69 6e 67 20 74  st of visiting t
2a150 68 65 20 69 6e 64 65 78 20 72 6f 77 73 20 69 73  he index rows is
2a160 20 4e 2a 4b 2c 20 77 68 65 72 65 20 4b 20 69 73   N*K, where K is
2a170 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 65 74 77  .        ** betw
2a180 65 65 6e 20 31 2e 31 20 61 6e 64 20 33 2e 30 2c  een 1.1 and 3.0,
2a190 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68   depending on th
2a1a0 65 20 72 65 6c 61 74 69 76 65 20 73 69 7a 65 73  e relative sizes
2a1b0 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20 20   of the.        
2a1c0 2a 2a 20 69 6e 64 65 78 20 61 6e 64 20 74 61 62  ** index and tab
2a1d0 6c 65 20 72 6f 77 73 2e 20 49 66 20 74 68 69 73  le rows. If this
2a1e0 20 69 73 20 61 20 6e 6f 6e 2d 63 6f 76 65 72 69   is a non-coveri
2a1f0 6e 67 20 69 6e 64 65 78 20 73 63 61 6e 2c 0a 20  ng index scan,. 
2a200 20 20 20 20 20 20 20 2a 2a 20 61 6c 73 6f 20 61         ** also a
2a210 64 64 20 74 68 65 20 63 6f 73 74 20 6f 66 20 76  dd the cost of v
2a220 69 73 69 74 69 6e 67 20 74 61 62 6c 65 20 72 6f  isiting table ro
2a230 77 73 20 28 4e 2a 33 2e 30 29 2e 20 20 2a 2f 0a  ws (N*3.0).  */.
2a240 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52          pNew->rR
2a250 75 6e 20 3d 20 72 53 69 7a 65 20 2b 20 31 20 2b  un = rSize + 1 +
2a260 20 28 31 35 2a 70 50 72 6f 62 65 2d 3e 73 7a 49   (15*pProbe->szI
2a270 64 78 52 6f 77 29 2f 70 54 61 62 2d 3e 73 7a 54  dxRow)/pTab->szT
2a280 61 62 52 6f 77 3b 0a 20 20 20 20 20 20 20 20 69  abRow;.        i
2a290 66 28 20 6d 21 3d 30 20 29 7b 0a 20 20 20 20 20  f( m!=0 ){.     
2a2a0 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20       pNew->rRun 
2a2b0 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41  = sqlite3LogEstA
2a2c0 64 64 28 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 72  dd(pNew->rRun, r
2a2d0 53 69 7a 65 2b 31 36 29 3b 0a 20 20 20 20 20 20  Size+16);.      
2a2e0 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 77 68 65    }..        whe
2a2f0 72 65 4c 6f 6f 70 4f 75 74 70 75 74 41 64 6a 75  reLoopOutputAdju
2a300 73 74 28 70 57 43 2c 20 70 4e 65 77 29 3b 0a 20  st(pWC, pNew);. 
2a310 20 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72         rc = wher
2a320 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69  eLoopInsert(pBui
2a330 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20  lder, pNew);.   
2a340 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20       pNew->nOut 
2a350 3d 20 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20  = rSize;.       
2a360 20 69 66 28 20 72 63 20 29 20 62 72 65 61 6b 3b   if( rc ) break;
2a370 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
2a380 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f      rc = whereLo
2a390 6f 70 41 64 64 42 74 72 65 65 49 6e 64 65 78 28  opAddBtreeIndex(
2a3a0 70 42 75 69 6c 64 65 72 2c 20 70 53 72 63 2c 20  pBuilder, pSrc, 
2a3b0 70 50 72 6f 62 65 2c 20 30 29 3b 0a 23 69 66 64  pProbe, 0);.#ifd
2a3c0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
2a3d0 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a  _STAT3_OR_STAT4.
2a3e0 20 20 20 20 73 71 6c 69 74 65 33 53 74 61 74 34      sqlite3Stat4
2a3f0 50 72 6f 62 65 46 72 65 65 28 70 42 75 69 6c 64  ProbeFree(pBuild
2a400 65 72 2d 3e 70 52 65 63 29 3b 0a 20 20 20 20 70  er->pRec);.    p
2a410 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c  Builder->nRecVal
2a420 69 64 20 3d 20 30 3b 0a 20 20 20 20 70 42 75 69  id = 0;.    pBui
2a430 6c 64 65 72 2d 3e 70 52 65 63 20 3d 20 30 3b 0a  lder->pRec = 0;.
2a440 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49  #endif..    /* I
2a450 66 20 74 68 65 72 65 20 77 61 73 20 61 6e 20 49  f there was an I
2a460 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65  NDEXED BY clause
2a470 2c 20 74 68 65 6e 20 6f 6e 6c 79 20 74 68 61 74  , then only that
2a480 20 6f 6e 65 20 69 6e 64 65 78 20 69 73 0a 20 20   one index is.  
2a490 20 20 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 2e    ** considered.
2a4a0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 72 63   */.    if( pSrc
2a4b0 2d 3e 70 49 6e 64 65 78 20 29 20 62 72 65 61 6b  ->pIndex ) break
2a4c0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
2a4d0 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  c;.}..#ifndef SQ
2a4e0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
2a4f0 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 41 64 64  LTABLE./*.** Add
2a500 20 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 20 6f   all WhereLoop o
2a510 62 6a 65 63 74 73 20 66 6f 72 20 61 20 74 61 62  bjects for a tab
2a520 6c 65 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 69  le of the join i
2a530 64 65 6e 74 69 66 69 65 64 20 62 79 0a 2a 2a 20  dentified by.** 
2a540 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e  pBuilder->pNew->
2a550 69 54 61 62 2e 20 20 54 68 61 74 20 74 61 62 6c  iTab.  That tabl
2a560 65 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  e is guaranteed 
2a570 74 6f 20 62 65 20 61 20 76 69 72 74 75 61 6c 20  to be a virtual 
2a580 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  table..*/.static
2a590 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64   int whereLoopAd
2a5a0 64 56 69 72 74 75 61 6c 28 0a 20 20 57 68 65 72  dVirtual(.  Wher
2a5b0 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42  eLoopBuilder *pB
2a5c0 75 69 6c 64 65 72 2c 20 20 2f 2a 20 57 48 45 52  uilder,  /* WHER
2a5d0 45 20 63 6c 61 75 73 65 20 69 6e 66 6f 72 6d 61  E clause informa
2a5e0 74 69 6f 6e 20 2a 2f 0a 20 20 42 69 74 6d 61 73  tion */.  Bitmas
2a5f0 6b 20 6d 45 78 74 72 61 0a 29 7b 0a 20 20 57 68  k mExtra.){.  Wh
2a600 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b  ereInfo *pWInfo;
2a610 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 48             /* WH
2a620 45 52 45 20 61 6e 61 6c 79 73 69 73 20 63 6f 6e  ERE analysis con
2a630 74 65 78 74 20 2a 2f 0a 20 20 50 61 72 73 65 20  text */.  Parse 
2a640 2a 70 50 61 72 73 65 3b 20 20 20 20 20 20 20 20  *pParse;        
2a650 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
2a660 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
2a670 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
2a680 70 57 43 3b 20 20 20 20 20 20 20 20 20 20 20 20  pWC;            
2a690 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
2a6a0 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  use */.  struct 
2a6b0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53  SrcList_item *pS
2a6c0 72 63 3b 20 20 20 2f 2a 20 54 68 65 20 46 52 4f  rc;   /* The FRO
2a6d0 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74 6f  M clause term to
2a6e0 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 54 61 62   search */.  Tab
2a6f0 6c 65 20 2a 70 54 61 62 3b 0a 20 20 73 71 6c 69  le *pTab;.  sqli
2a700 74 65 33 20 2a 64 62 3b 0a 20 20 73 71 6c 69 74  te3 *db;.  sqlit
2a710 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70  e3_index_info *p
2a720 49 64 78 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63  IdxInfo;.  struc
2a730 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  t sqlite3_index_
2a740 63 6f 6e 73 74 72 61 69 6e 74 20 2a 70 49 64 78  constraint *pIdx
2a750 43 6f 6e 73 3b 0a 20 20 73 74 72 75 63 74 20 73  Cons;.  struct s
2a760 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e  qlite3_index_con
2a770 73 74 72 61 69 6e 74 5f 75 73 61 67 65 20 2a 70  straint_usage *p
2a780 55 73 61 67 65 3b 0a 20 20 57 68 65 72 65 54 65  Usage;.  WhereTe
2a790 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 69 6e 74  rm *pTerm;.  int
2a7a0 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 69 54 65   i, j;.  int iTe
2a7b0 72 6d 2c 20 6d 78 54 65 72 6d 3b 0a 20 20 69 6e  rm, mxTerm;.  in
2a7c0 74 20 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20  t nConstraint;. 
2a7d0 20 69 6e 74 20 73 65 65 6e 49 6e 20 3d 20 30 3b   int seenIn = 0;
2a7e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2a7f0 20 54 72 75 65 20 69 66 20 61 6e 20 49 4e 20 6f   True if an IN o
2a800 70 65 72 61 74 6f 72 20 69 73 20 73 65 65 6e 20  perator is seen 
2a810 2a 2f 0a 20 20 69 6e 74 20 73 65 65 6e 56 61 72  */.  int seenVar
2a820 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
2a830 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 6e    /* True if a n
2a840 6f 6e 2d 63 6f 6e 73 74 61 6e 74 20 63 6f 6e 73  on-constant cons
2a850 74 72 61 69 6e 74 20 69 73 20 73 65 65 6e 20 2a  traint is seen *
2a860 2f 0a 20 20 69 6e 74 20 69 50 68 61 73 65 3b 20  /.  int iPhase; 
2a870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a880 20 2f 2a 20 30 3a 20 63 6f 6e 73 74 20 77 2f 6f   /* 0: const w/o
2a890 20 49 4e 2c 20 31 3a 20 63 6f 6e 73 74 2c 20 32   IN, 1: const, 2
2a8a0 3a 20 6e 6f 20 49 4e 2c 20 20 32 3a 20 49 4e 20  : no IN,  2: IN 
2a8b0 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  */.  WhereLoop *
2a8c0 70 4e 65 77 3b 0a 20 20 69 6e 74 20 72 63 20 3d  pNew;.  int rc =
2a8d0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 70   SQLITE_OK;..  p
2a8e0 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72  WInfo = pBuilder
2a8f0 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 70 50 61 72  ->pWInfo;.  pPar
2a900 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61  se = pWInfo->pPa
2a910 72 73 65 3b 0a 20 20 64 62 20 3d 20 70 50 61 72  rse;.  db = pPar
2a920 73 65 2d 3e 64 62 3b 0a 20 20 70 57 43 20 3d 20  se->db;.  pWC = 
2a930 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 3b 0a 20  pBuilder->pWC;. 
2a940 20 70 4e 65 77 20 3d 20 70 42 75 69 6c 64 65 72   pNew = pBuilder
2a950 2d 3e 70 4e 65 77 3b 0a 20 20 70 53 72 63 20 3d  ->pNew;.  pSrc =
2a960 20 26 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69   &pWInfo->pTabLi
2a970 73 74 2d 3e 61 5b 70 4e 65 77 2d 3e 69 54 61 62  st->a[pNew->iTab
2a980 5d 3b 0a 20 20 70 54 61 62 20 3d 20 70 53 72 63  ];.  pTab = pSrc
2a990 2d 3e 70 54 61 62 3b 0a 20 20 61 73 73 65 72 74  ->pTab;.  assert
2a9a0 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  ( IsVirtual(pTab
2a9b0 29 20 29 3b 0a 20 20 70 49 64 78 49 6e 66 6f 20  ) );.  pIdxInfo 
2a9c0 3d 20 61 6c 6c 6f 63 61 74 65 49 6e 64 65 78 49  = allocateIndexI
2a9d0 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 57 43 2c  nfo(pParse, pWC,
2a9e0 20 70 53 72 63 2c 20 70 42 75 69 6c 64 65 72 2d   pSrc, pBuilder-
2a9f0 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 69 66  >pOrderBy);.  if
2aa00 28 20 70 49 64 78 49 6e 66 6f 3d 3d 30 20 29 20  ( pIdxInfo==0 ) 
2aa10 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
2aa20 4d 45 4d 3b 0a 20 20 70 4e 65 77 2d 3e 70 72 65  MEM;.  pNew->pre
2aa30 72 65 71 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d  req = 0;.  pNew-
2aa40 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a 20 20 70  >rSetup = 0;.  p
2aa50 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57  New->wsFlags = W
2aa60 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c  HERE_VIRTUALTABL
2aa70 45 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72  E;.  pNew->nLTer
2aa80 6d 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 75  m = 0;.  pNew->u
2aa90 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3d  .vtab.needFree =
2aaa0 20 30 3b 0a 20 20 70 55 73 61 67 65 20 3d 20 70   0;.  pUsage = p
2aab0 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72  IdxInfo->aConstr
2aac0 61 69 6e 74 55 73 61 67 65 3b 0a 20 20 6e 43 6f  aintUsage;.  nCo
2aad0 6e 73 74 72 61 69 6e 74 20 3d 20 70 49 64 78 49  nstraint = pIdxI
2aae0 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74  nfo->nConstraint
2aaf0 3b 0a 20 20 69 66 28 20 77 68 65 72 65 4c 6f 6f  ;.  if( whereLoo
2ab00 70 52 65 73 69 7a 65 28 64 62 2c 20 70 4e 65 77  pResize(db, pNew
2ab10 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74 29 20 29  , nConstraint) )
2ab20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  {.    sqlite3DbF
2ab30 72 65 65 28 64 62 2c 20 70 49 64 78 49 6e 66 6f  ree(db, pIdxInfo
2ab40 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
2ab50 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
2ab60 0a 20 20 66 6f 72 28 69 50 68 61 73 65 3d 30 3b  .  for(iPhase=0;
2ab70 20 69 50 68 61 73 65 3c 3d 33 3b 20 69 50 68 61   iPhase<=3; iPha
2ab80 73 65 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 21  se++){.    if( !
2ab90 73 65 65 6e 49 6e 20 26 26 20 28 69 50 68 61 73  seenIn && (iPhas
2aba0 65 26 31 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  e&1)!=0 ){.     
2abb0 20 69 50 68 61 73 65 2b 2b 3b 0a 20 20 20 20 20   iPhase++;.     
2abc0 20 69 66 28 20 69 50 68 61 73 65 3e 33 20 29 20   if( iPhase>3 ) 
2abd0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
2abe0 20 69 66 28 20 21 73 65 65 6e 56 61 72 20 26 26   if( !seenVar &&
2abf0 20 69 50 68 61 73 65 3e 31 20 29 20 62 72 65 61   iPhase>1 ) brea
2ac00 6b 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 20  k;.    pIdxCons 
2ac10 3d 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74  = *(struct sqlit
2ac20 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61  e3_index_constra
2ac30 69 6e 74 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d  int**)&pIdxInfo-
2ac40 3e 61 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20  >aConstraint;.  
2ac50 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64    for(i=0; i<pId
2ac60 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69  xInfo->nConstrai
2ac70 6e 74 3b 20 69 2b 2b 2c 20 70 49 64 78 43 6f 6e  nt; i++, pIdxCon
2ac80 73 2b 2b 29 7b 0a 20 20 20 20 20 20 6a 20 3d 20  s++){.      j = 
2ac90 70 49 64 78 43 6f 6e 73 2d 3e 69 54 65 72 6d 4f  pIdxCons->iTermO
2aca0 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70 54 65  ffset;.      pTe
2acb0 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 6a 5d 3b  rm = &pWC->a[j];
2acc0 0a 20 20 20 20 20 20 73 77 69 74 63 68 28 20 69  .      switch( i
2acd0 50 68 61 73 65 20 29 7b 0a 20 20 20 20 20 20 20  Phase ){.       
2ace0 20 63 61 73 65 20 30 3a 20 20 20 20 2f 2a 20 43   case 0:    /* C
2acf0 6f 6e 73 74 61 6e 74 73 20 77 69 74 68 6f 75 74  onstants without
2ad00 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a   IN operator */.
2ad10 20 20 20 20 20 20 20 20 20 20 70 49 64 78 43 6f            pIdxCo
2ad20 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20 30 3b 0a  ns->usable = 0;.
2ad30 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70            if( (p
2ad40 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
2ad50 26 20 57 4f 5f 49 4e 29 21 3d 30 20 29 7b 0a 20  & WO_IN)!=0 ){. 
2ad60 20 20 20 20 20 20 20 20 20 20 20 73 65 65 6e 49             seenI
2ad70 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  n = 1;.         
2ad80 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
2ad90 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69   pTerm->prereqRi
2ada0 67 68 74 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ght!=0 ){.      
2adb0 20 20 20 20 20 20 73 65 65 6e 56 61 72 20 3d 20        seenVar = 
2adc0 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  1;.          }el
2add0 73 65 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65  se if( (pTerm->e
2ade0 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e  Operator & WO_IN
2adf0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
2ae00 20 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73      pIdxCons->us
2ae10 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  able = 1;.      
2ae20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2ae30 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63  break;.        c
2ae40 61 73 65 20 31 3a 20 20 20 20 2f 2a 20 43 6f 6e  ase 1:    /* Con
2ae50 73 74 61 6e 74 73 20 77 69 74 68 20 49 4e 20 6f  stants with IN o
2ae60 70 65 72 61 74 6f 72 73 20 2a 2f 0a 20 20 20 20  perators */.    
2ae70 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 65        assert( se
2ae80 65 6e 49 6e 20 29 3b 0a 20 20 20 20 20 20 20 20  enIn );.        
2ae90 20 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62    pIdxCons->usab
2aea0 6c 65 20 3d 20 28 70 54 65 72 6d 2d 3e 70 72 65  le = (pTerm->pre
2aeb0 72 65 71 52 69 67 68 74 3d 3d 30 29 3b 0a 20 20  reqRight==0);.  
2aec0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
2aed0 20 20 20 20 20 20 20 63 61 73 65 20 32 3a 20 20         case 2:  
2aee0 20 20 2f 2a 20 56 61 72 69 61 62 6c 65 73 20 77    /* Variables w
2aef0 69 74 68 6f 75 74 20 49 4e 20 2a 2f 0a 20 20 20  ithout IN */.   
2af00 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73         assert( s
2af10 65 65 6e 56 61 72 20 29 3b 0a 20 20 20 20 20 20  eenVar );.      
2af20 20 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73      pIdxCons->us
2af30 61 62 6c 65 20 3d 20 28 70 54 65 72 6d 2d 3e 65  able = (pTerm->e
2af40 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e  Operator & WO_IN
2af50 29 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20 20 20  )==0;.          
2af60 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 64  break;.        d
2af70 65 66 61 75 6c 74 3a 20 20 20 2f 2a 20 56 61 72  efault:   /* Var
2af80 69 61 62 6c 65 73 20 77 69 74 68 20 49 4e 20 2a  iables with IN *
2af90 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  /.          asse
2afa0 72 74 28 20 73 65 65 6e 56 61 72 20 26 26 20 73  rt( seenVar && s
2afb0 65 65 6e 49 6e 20 29 3b 0a 20 20 20 20 20 20 20  eenIn );.       
2afc0 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61     pIdxCons->usa
2afd0 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ble = 1;.       
2afe0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
2aff0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73  }.    }.    mems
2b000 65 74 28 70 55 73 61 67 65 2c 20 30 2c 20 73 69  et(pUsage, 0, si
2b010 7a 65 6f 66 28 70 55 73 61 67 65 5b 30 5d 29 2a  zeof(pUsage[0])*
2b020 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74  pIdxInfo->nConst
2b030 72 61 69 6e 74 29 3b 0a 20 20 20 20 69 66 28 20  raint);.    if( 
2b040 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f  pIdxInfo->needTo
2b050 46 72 65 65 49 64 78 53 74 72 20 29 20 73 71 6c  FreeIdxStr ) sql
2b060 69 74 65 33 5f 66 72 65 65 28 70 49 64 78 49 6e  ite3_free(pIdxIn
2b070 66 6f 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20 20  fo->idxStr);.   
2b080 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74   pIdxInfo->idxSt
2b090 72 20 3d 20 30 3b 0a 20 20 20 20 70 49 64 78 49  r = 0;.    pIdxI
2b0a0 6e 66 6f 2d 3e 69 64 78 4e 75 6d 20 3d 20 30 3b  nfo->idxNum = 0;
2b0b0 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6e  .    pIdxInfo->n
2b0c0 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 20  eedToFreeIdxStr 
2b0d0 3d 20 30 3b 0a 20 20 20 20 70 49 64 78 49 6e 66  = 0;.    pIdxInf
2b0e0 6f 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d  o->orderByConsum
2b0f0 65 64 20 3d 20 30 3b 0a 20 20 20 20 70 49 64 78  ed = 0;.    pIdx
2b100 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43  Info->estimatedC
2b110 6f 73 74 20 3d 20 53 51 4c 49 54 45 5f 42 49 47  ost = SQLITE_BIG
2b120 5f 44 42 4c 20 2f 20 28 64 6f 75 62 6c 65 29 32  _DBL / (double)2
2b130 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e  ;.    pIdxInfo->
2b140 65 73 74 69 6d 61 74 65 64 52 6f 77 73 20 3d 20  estimatedRows = 
2b150 32 35 3b 0a 20 20 20 20 72 63 20 3d 20 76 74 61  25;.    rc = vta
2b160 62 42 65 73 74 49 6e 64 65 78 28 70 50 61 72 73  bBestIndex(pPars
2b170 65 2c 20 70 54 61 62 2c 20 70 49 64 78 49 6e 66  e, pTab, pIdxInf
2b180 6f 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  o);.    if( rc )
2b190 20 67 6f 74 6f 20 77 68 65 72 65 4c 6f 6f 70 41   goto whereLoopA
2b1a0 64 64 56 74 61 62 5f 65 78 69 74 3b 0a 20 20 20  ddVtab_exit;.   
2b1b0 20 70 49 64 78 43 6f 6e 73 20 3d 20 2a 28 73 74   pIdxCons = *(st
2b1c0 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
2b1d0 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 2a 29  ex_constraint**)
2b1e0 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73  &pIdxInfo->aCons
2b1f0 74 72 61 69 6e 74 3b 0a 20 20 20 20 70 4e 65 77  traint;.    pNew
2b200 2d 3e 70 72 65 72 65 71 20 3d 20 6d 45 78 74 72  ->prereq = mExtr
2b210 61 3b 0a 20 20 20 20 6d 78 54 65 72 6d 20 3d 20  a;.    mxTerm = 
2b220 2d 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  -1;.    assert( 
2b230 70 4e 65 77 2d 3e 6e 4c 53 6c 6f 74 3e 3d 6e 43  pNew->nLSlot>=nC
2b240 6f 6e 73 74 72 61 69 6e 74 20 29 3b 0a 20 20 20  onstraint );.   
2b250 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6e   for(i=0; i<nCon
2b260 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29 20 70 4e  straint; i++) pN
2b270 65 77 2d 3e 61 4c 54 65 72 6d 5b 69 5d 20 3d 20  ew->aLTerm[i] = 
2b280 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76  0;.    pNew->u.v
2b290 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 20 3d 20 30  tab.omitMask = 0
2b2a0 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
2b2b0 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b  <nConstraint; i+
2b2c0 2b 2c 20 70 49 64 78 43 6f 6e 73 2b 2b 29 7b 0a  +, pIdxCons++){.
2b2d0 20 20 20 20 20 20 69 66 28 20 28 69 54 65 72 6d        if( (iTerm
2b2e0 20 3d 20 70 55 73 61 67 65 5b 69 5d 2e 61 72 67   = pUsage[i].arg
2b2f0 76 49 6e 64 65 78 20 2d 20 31 29 3e 3d 30 20 29  vIndex - 1)>=0 )
2b300 7b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 70 49  {.        j = pI
2b310 64 78 43 6f 6e 73 2d 3e 69 54 65 72 6d 4f 66 66  dxCons->iTermOff
2b320 73 65 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28  set;.        if(
2b330 20 69 54 65 72 6d 3e 3d 6e 43 6f 6e 73 74 72 61   iTerm>=nConstra
2b340 69 6e 74 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  int.         || 
2b350 6a 3c 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  j<0.         || 
2b360 6a 3e 3d 70 57 43 2d 3e 6e 54 65 72 6d 0a 20 20  j>=pWC->nTerm.  
2b370 20 20 20 20 20 20 20 7c 7c 20 70 4e 65 77 2d 3e         || pNew->
2b380 61 4c 54 65 72 6d 5b 69 54 65 72 6d 5d 21 3d 30  aLTerm[iTerm]!=0
2b390 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
2b3a0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2b3b0 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20  E_ERROR;.       
2b3c0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
2b3d0 73 67 28 70 50 61 72 73 65 2c 20 22 25 73 2e 78  sg(pParse, "%s.x
2b3e0 42 65 73 74 49 6e 64 65 78 28 29 20 6d 61 6c 66  BestIndex() malf
2b3f0 75 6e 63 74 69 6f 6e 22 2c 20 70 54 61 62 2d 3e  unction", pTab->
2b400 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
2b410 20 20 67 6f 74 6f 20 77 68 65 72 65 4c 6f 6f 70    goto whereLoop
2b420 41 64 64 56 74 61 62 5f 65 78 69 74 3b 0a 20 20  AddVtab_exit;.  
2b430 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2b440 74 65 73 74 63 61 73 65 28 20 69 54 65 72 6d 3d  testcase( iTerm=
2b450 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 2d 31 20 29  =nConstraint-1 )
2b460 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
2b470 73 65 28 20 6a 3d 3d 30 20 29 3b 0a 20 20 20 20  se( j==0 );.    
2b480 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 3d      testcase( j=
2b490 3d 70 57 43 2d 3e 6e 54 65 72 6d 2d 31 20 29 3b  =pWC->nTerm-1 );
2b4a0 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 20 3d  .        pTerm =
2b4b0 20 26 70 57 43 2d 3e 61 5b 6a 5d 3b 0a 20 20 20   &pWC->a[j];.   
2b4c0 20 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65       pNew->prere
2b4d0 71 20 7c 3d 20 70 54 65 72 6d 2d 3e 70 72 65 72  q |= pTerm->prer
2b4e0 65 71 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20  eqRight;.       
2b4f0 20 61 73 73 65 72 74 28 20 69 54 65 72 6d 3c 70   assert( iTerm<p
2b500 4e 65 77 2d 3e 6e 4c 53 6c 6f 74 20 29 3b 0a 20  New->nLSlot );. 
2b510 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54         pNew->aLT
2b520 65 72 6d 5b 69 54 65 72 6d 5d 20 3d 20 70 54 65  erm[iTerm] = pTe
2b530 72 6d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  rm;.        if( 
2b540 69 54 65 72 6d 3e 6d 78 54 65 72 6d 20 29 20 6d  iTerm>mxTerm ) m
2b550 78 54 65 72 6d 20 3d 20 69 54 65 72 6d 3b 0a 20  xTerm = iTerm;. 
2b560 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
2b570 20 69 54 65 72 6d 3d 3d 31 35 20 29 3b 0a 20 20   iTerm==15 );.  
2b580 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2b590 69 54 65 72 6d 3d 3d 31 36 20 29 3b 0a 20 20 20  iTerm==16 );.   
2b5a0 20 20 20 20 20 69 66 28 20 69 54 65 72 6d 3c 31       if( iTerm<1
2b5b0 36 20 26 26 20 70 55 73 61 67 65 5b 69 5d 2e 6f  6 && pUsage[i].o
2b5c0 6d 69 74 20 29 20 70 4e 65 77 2d 3e 75 2e 76 74  mit ) pNew->u.vt
2b5d0 61 62 2e 6f 6d 69 74 4d 61 73 6b 20 7c 3d 20 31  ab.omitMask |= 1
2b5e0 3c 3c 69 54 65 72 6d 3b 0a 20 20 20 20 20 20 20  <<iTerm;.       
2b5f0 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70   if( (pTerm->eOp
2b600 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 29 21  erator & WO_IN)!
2b610 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
2b620 69 66 28 20 70 55 73 61 67 65 5b 69 5d 2e 6f 6d  if( pUsage[i].om
2b630 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  it==0 ){.       
2b640 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61       /* Do not a
2b650 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20 61 6e  ttempt to use an
2b660 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 20 69   IN constraint i
2b670 66 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61  f the virtual ta
2b680 62 6c 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  ble.            
2b690 2a 2a 20 73 61 79 73 20 74 68 61 74 20 74 68 65  ** says that the
2b6a0 20 65 71 75 69 76 61 6c 65 6e 74 20 45 51 20 63   equivalent EQ c
2b6b0 6f 6e 73 74 72 61 69 6e 74 20 63 61 6e 6e 6f 74  onstraint cannot
2b6c0 20 62 65 20 73 61 66 65 6c 79 20 6f 6d 69 74 74   be safely omitt
2b6d0 65 64 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  ed..            
2b6e0 2a 2a 20 49 66 20 77 65 20 64 6f 20 61 74 74 65  ** If we do atte
2b6f0 6d 70 74 20 74 6f 20 75 73 65 20 73 75 63 68 20  mpt to use such 
2b700 61 20 63 6f 6e 73 74 72 61 69 6e 74 2c 20 73 6f  a constraint, so
2b710 6d 65 20 72 6f 77 73 20 6d 69 67 68 74 20 62 65  me rows might be
2b720 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
2b730 72 65 70 65 61 74 65 64 20 69 6e 20 74 68 65 20  repeated in the 
2b740 6f 75 74 70 75 74 2e 20 2a 2f 0a 20 20 20 20 20  output. */.     
2b750 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
2b760 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2b770 20 20 20 20 2f 2a 20 41 20 76 69 72 74 75 61 6c      /* A virtual
2b780 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 63   table that is c
2b790 6f 6e 73 74 72 61 69 6e 65 64 20 62 79 20 61 6e  onstrained by an
2b7a0 20 49 4e 20 63 6c 61 75 73 65 20 6d 61 79 20 6e   IN clause may n
2b7b0 6f 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ot.          ** 
2b7c0 63 6f 6e 73 75 6d 65 20 74 68 65 20 4f 52 44 45  consume the ORDE
2b7d0 52 20 42 59 20 63 6c 61 75 73 65 20 62 65 63 61  R BY clause beca
2b7e0 75 73 65 20 28 31 29 20 74 68 65 20 6f 72 64 65  use (1) the orde
2b7f0 72 20 6f 66 20 49 4e 20 74 65 72 6d 73 0a 20 20  r of IN terms.  
2b800 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 6e 6f          ** is no
2b810 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 72 65  t necessarily re
2b820 6c 61 74 65 64 20 74 6f 20 74 68 65 20 6f 72 64  lated to the ord
2b830 65 72 20 6f 66 20 6f 75 74 70 75 74 20 74 65 72  er of output ter
2b840 6d 73 20 61 6e 64 0a 20 20 20 20 20 20 20 20 20  ms and.         
2b850 20 2a 2a 20 28 32 29 20 4d 75 6c 74 69 70 6c 65   ** (2) Multiple
2b860 20 6f 75 74 70 75 74 73 20 66 72 6f 6d 20 61 20   outputs from a 
2b870 73 69 6e 67 6c 65 20 49 4e 20 76 61 6c 75 65 20  single IN value 
2b880 77 69 6c 6c 20 6e 6f 74 20 6d 65 72 67 65 0a 20  will not merge. 
2b890 20 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 67 65           ** toge
2b8a0 74 68 65 72 2e 20 20 2a 2f 0a 20 20 20 20 20 20  ther.  */.      
2b8b0 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6f 72      pIdxInfo->or
2b8c0 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 20 3d 20  derByConsumed = 
2b8d0 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
2b8e0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
2b8f0 66 28 20 69 3e 3d 6e 43 6f 6e 73 74 72 61 69 6e  f( i>=nConstrain
2b900 74 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d  t ){.      pNew-
2b910 3e 6e 4c 54 65 72 6d 20 3d 20 6d 78 54 65 72 6d  >nLTerm = mxTerm
2b920 2b 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  +1;.      assert
2b930 28 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 3c 3d  ( pNew->nLTerm<=
2b940 70 4e 65 77 2d 3e 6e 4c 53 6c 6f 74 20 29 3b 0a  pNew->nLSlot );.
2b950 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74        pNew->u.vt
2b960 61 62 2e 69 64 78 4e 75 6d 20 3d 20 70 49 64 78  ab.idxNum = pIdx
2b970 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d 3b 0a 20 20  Info->idxNum;.  
2b980 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62      pNew->u.vtab
2b990 2e 6e 65 65 64 46 72 65 65 20 3d 20 70 49 64 78  .needFree = pIdx
2b9a0 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65  Info->needToFree
2b9b0 49 64 78 53 74 72 3b 0a 20 20 20 20 20 20 70 49  IdxStr;.      pI
2b9c0 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72  dxInfo->needToFr
2b9d0 65 65 49 64 78 53 74 72 20 3d 20 30 3b 0a 20 20  eeIdxStr = 0;.  
2b9e0 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62      pNew->u.vtab
2b9f0 2e 69 64 78 53 74 72 20 3d 20 70 49 64 78 49 6e  .idxStr = pIdxIn
2ba00 66 6f 2d 3e 69 64 78 53 74 72 3b 0a 20 20 20 20  fo->idxStr;.    
2ba10 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69    pNew->u.vtab.i
2ba20 73 4f 72 64 65 72 65 64 20 3d 20 28 69 38 29 28  sOrdered = (i8)(
2ba30 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42  pIdxInfo->orderB
2ba40 79 43 6f 6e 73 75 6d 65 64 20 3f 0a 20 20 20 20  yConsumed ?.    
2ba50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ba60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ba70 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64    pIdxInfo->nOrd
2ba80 65 72 42 79 20 3a 20 30 29 3b 0a 20 20 20 20 20  erBy : 0);.     
2ba90 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20   pNew->rSetup = 
2baa0 30 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 72  0;.      pNew->r
2bab0 52 75 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  Run = sqlite3Log
2bac0 45 73 74 46 72 6f 6d 44 6f 75 62 6c 65 28 70 49  EstFromDouble(pI
2bad0 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65  dxInfo->estimate
2bae0 64 43 6f 73 74 29 3b 0a 20 20 20 20 20 20 70 4e  dCost);.      pN
2baf0 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 71 6c 69 74  ew->nOut = sqlit
2bb00 65 33 4c 6f 67 45 73 74 28 70 49 64 78 49 6e 66  e3LogEst(pIdxInf
2bb10 6f 2d 3e 65 73 74 69 6d 61 74 65 64 52 6f 77 73  o->estimatedRows
2bb20 29 3b 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f  );.      whereLo
2bb30 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65  opInsert(pBuilde
2bb40 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20  r, pNew);.      
2bb50 69 66 28 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62  if( pNew->u.vtab
2bb60 2e 6e 65 65 64 46 72 65 65 20 29 7b 0a 20 20 20  .needFree ){.   
2bb70 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
2bb80 65 28 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69  e(pNew->u.vtab.i
2bb90 64 78 53 74 72 29 3b 0a 20 20 20 20 20 20 20 20  dxStr);.        
2bba0 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65  pNew->u.vtab.nee
2bbb0 64 46 72 65 65 20 3d 20 30 3b 0a 20 20 20 20 20  dFree = 0;.     
2bbc0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20 20 0a 0a   }.    }.  }  ..
2bbd0 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 74 61 62  whereLoopAddVtab
2bbe0 5f 65 78 69 74 3a 0a 20 20 69 66 28 20 70 49 64  _exit:.  if( pId
2bbf0 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65  xInfo->needToFre
2bc00 65 49 64 78 53 74 72 20 29 20 73 71 6c 69 74 65  eIdxStr ) sqlite
2bc10 33 5f 66 72 65 65 28 70 49 64 78 49 6e 66 6f 2d  3_free(pIdxInfo-
2bc20 3e 69 64 78 53 74 72 29 3b 0a 20 20 73 71 6c 69  >idxStr);.  sqli
2bc30 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49  te3DbFree(db, pI
2bc40 64 78 49 6e 66 6f 29 3b 0a 20 20 72 65 74 75 72  dxInfo);.  retur
2bc50 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  n rc;.}.#endif /
2bc60 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  * SQLITE_OMIT_VI
2bc70 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 2f  RTUALTABLE */../
2bc80 2a 0a 2a 2a 20 41 64 64 20 57 68 65 72 65 4c 6f  *.** Add WhereLo
2bc90 6f 70 20 65 6e 74 72 69 65 73 20 74 6f 20 68 61  op entries to ha
2bca0 6e 64 6c 65 20 4f 52 20 74 65 72 6d 73 2e 20 20  ndle OR terms.  
2bcb0 54 68 69 73 20 77 6f 72 6b 73 20 66 6f 72 20 65  This works for e
2bcc0 69 74 68 65 72 0a 2a 2a 20 62 74 72 65 65 73 20  ither.** btrees 
2bcd0 6f 72 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  or virtual table
2bce0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
2bcf0 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 4f 72 28   whereLoopAddOr(
2bd00 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72  WhereLoopBuilder
2bd10 20 2a 70 42 75 69 6c 64 65 72 2c 20 42 69 74 6d   *pBuilder, Bitm
2bd20 61 73 6b 20 6d 45 78 74 72 61 29 7b 0a 20 20 57  ask mExtra){.  W
2bd30 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
2bd40 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49   = pBuilder->pWI
2bd50 6e 66 6f 3b 0a 20 20 57 68 65 72 65 43 6c 61 75  nfo;.  WhereClau
2bd60 73 65 20 2a 70 57 43 3b 0a 20 20 57 68 65 72 65  se *pWC;.  Where
2bd70 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a 20 20 57 68  Loop *pNew;.  Wh
2bd80 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20  ereTerm *pTerm, 
2bd90 2a 70 57 43 45 6e 64 3b 0a 20 20 69 6e 74 20 72  *pWCEnd;.  int r
2bda0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
2bdb0 20 69 6e 74 20 69 43 75 72 3b 0a 20 20 57 68 65   int iCur;.  Whe
2bdc0 72 65 43 6c 61 75 73 65 20 74 65 6d 70 57 43 3b  reClause tempWC;
2bdd0 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c  .  WhereLoopBuil
2bde0 64 65 72 20 73 53 75 62 42 75 69 6c 64 3b 0a 20  der sSubBuild;. 
2bdf0 20 57 68 65 72 65 4f 72 53 65 74 20 73 53 75 6d   WhereOrSet sSum
2be00 2c 20 73 43 75 72 3b 0a 20 20 73 74 72 75 63 74  , sCur;.  struct
2be10 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
2be20 49 74 65 6d 3b 0a 20 20 0a 20 20 70 57 43 20 3d  Item;.  .  pWC =
2be30 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 3b 0a   pBuilder->pWC;.
2be40 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 77 63    if( pWInfo->wc
2be50 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
2be60 5f 41 4e 44 5f 4f 4e 4c 59 20 29 20 72 65 74 75  _AND_ONLY ) retu
2be70 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
2be80 70 57 43 45 6e 64 20 3d 20 70 57 43 2d 3e 61 20  pWCEnd = pWC->a 
2be90 2b 20 70 57 43 2d 3e 6e 54 65 72 6d 3b 0a 20 20  + pWC->nTerm;.  
2bea0 70 4e 65 77 20 3d 20 70 42 75 69 6c 64 65 72 2d  pNew = pBuilder-
2beb0 3e 70 4e 65 77 3b 0a 20 20 6d 65 6d 73 65 74 28  >pNew;.  memset(
2bec0 26 73 53 75 6d 2c 20 30 2c 20 73 69 7a 65 6f 66  &sSum, 0, sizeof
2bed0 28 73 53 75 6d 29 29 3b 0a 20 20 70 49 74 65 6d  (sSum));.  pItem
2bee0 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c   = pWInfo->pTabL
2bef0 69 73 74 2d 3e 61 20 2b 20 70 4e 65 77 2d 3e 69  ist->a + pNew->i
2bf00 54 61 62 3b 0a 20 20 69 43 75 72 20 3d 20 70 49  Tab;.  iCur = pI
2bf10 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 0a 20  tem->iCursor;.. 
2bf20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e   for(pTerm=pWC->
2bf30 61 3b 20 70 54 65 72 6d 3c 70 57 43 45 6e 64 20  a; pTerm<pWCEnd 
2bf40 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
2bf50 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  ; pTerm++){.    
2bf60 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65  if( (pTerm->eOpe
2bf70 72 61 74 6f 72 20 26 20 57 4f 5f 4f 52 29 21 3d  rator & WO_OR)!=
2bf80 30 0a 20 20 20 20 20 26 26 20 28 70 54 65 72 6d  0.     && (pTerm
2bf90 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 69 6e 64  ->u.pOrInfo->ind
2bfa0 65 78 61 62 6c 65 20 26 20 70 4e 65 77 2d 3e 6d  exable & pNew->m
2bfb0 61 73 6b 53 65 6c 66 29 21 3d 30 20 0a 20 20 20  askSelf)!=0 .   
2bfc0 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 43   ){.      WhereC
2bfd0 6c 61 75 73 65 20 2a 20 63 6f 6e 73 74 20 70 4f  lause * const pO
2bfe0 72 57 43 20 3d 20 26 70 54 65 72 6d 2d 3e 75 2e  rWC = &pTerm->u.
2bff0 70 4f 72 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20  pOrInfo->wc;.   
2c000 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 20 63     WhereTerm * c
2c010 6f 6e 73 74 20 70 4f 72 57 43 45 6e 64 20 3d 20  onst pOrWCEnd = 
2c020 26 70 4f 72 57 43 2d 3e 61 5b 70 4f 72 57 43 2d  &pOrWC->a[pOrWC-
2c030 3e 6e 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 57  >nTerm];.      W
2c040 68 65 72 65 54 65 72 6d 20 2a 70 4f 72 54 65 72  hereTerm *pOrTer
2c050 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20 6f 6e 63  m;.      int onc
2c060 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 6e 74  e = 1;.      int
2c070 20 69 2c 20 6a 3b 0a 20 20 20 20 0a 20 20 20 20   i, j;.    .    
2c080 20 20 73 53 75 62 42 75 69 6c 64 20 3d 20 2a 70    sSubBuild = *p
2c090 42 75 69 6c 64 65 72 3b 0a 20 20 20 20 20 20 73  Builder;.      s
2c0a0 53 75 62 42 75 69 6c 64 2e 70 4f 72 64 65 72 42  SubBuild.pOrderB
2c0b0 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 53 75  y = 0;.      sSu
2c0c0 62 42 75 69 6c 64 2e 70 4f 72 53 65 74 20 3d 20  bBuild.pOrSet = 
2c0d0 26 73 43 75 72 3b 0a 0a 20 20 20 20 20 20 66 6f  &sCur;..      fo
2c0e0 72 28 70 4f 72 54 65 72 6d 3d 70 4f 72 57 43 2d  r(pOrTerm=pOrWC-
2c0f0 3e 61 3b 20 70 4f 72 54 65 72 6d 3c 70 4f 72 57  >a; pOrTerm<pOrW
2c100 43 45 6e 64 3b 20 70 4f 72 54 65 72 6d 2b 2b 29  CEnd; pOrTerm++)
2c110 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70  {.        if( (p
2c120 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  OrTerm->eOperato
2c130 72 20 26 20 57 4f 5f 41 4e 44 29 21 3d 30 20 29  r & WO_AND)!=0 )
2c140 7b 0a 20 20 20 20 20 20 20 20 20 20 73 53 75 62  {.          sSub
2c150 42 75 69 6c 64 2e 70 57 43 20 3d 20 26 70 4f 72  Build.pWC = &pOr
2c160 54 65 72 6d 2d 3e 75 2e 70 41 6e 64 49 6e 66 6f  Term->u.pAndInfo
2c170 2d 3e 77 63 3b 0a 20 20 20 20 20 20 20 20 7d 65  ->wc;.        }e
2c180 6c 73 65 20 69 66 28 20 70 4f 72 54 65 72 6d 2d  lse if( pOrTerm-
2c190 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75  >leftCursor==iCu
2c1a0 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74  r ){.          t
2c1b0 65 6d 70 57 43 2e 70 57 49 6e 66 6f 20 3d 20 70  empWC.pWInfo = p
2c1c0 57 43 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 20 20  WC->pWInfo;.    
2c1d0 20 20 20 20 20 20 74 65 6d 70 57 43 2e 70 4f 75        tempWC.pOu
2c1e0 74 65 72 20 3d 20 70 57 43 3b 0a 20 20 20 20 20  ter = pWC;.     
2c1f0 20 20 20 20 20 74 65 6d 70 57 43 2e 6f 70 20 3d       tempWC.op =
2c200 20 54 4b 5f 41 4e 44 3b 0a 20 20 20 20 20 20 20   TK_AND;.       
2c210 20 20 20 74 65 6d 70 57 43 2e 6e 54 65 72 6d 20     tempWC.nTerm 
2c220 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 74  = 1;.          t
2c230 65 6d 70 57 43 2e 61 20 3d 20 70 4f 72 54 65 72  empWC.a = pOrTer
2c240 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 73 53 75  m;.          sSu
2c250 62 42 75 69 6c 64 2e 70 57 43 20 3d 20 26 74 65  bBuild.pWC = &te
2c260 6d 70 57 43 3b 0a 20 20 20 20 20 20 20 20 7d 65  mpWC;.        }e
2c270 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 63  lse{.          c
2c280 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
2c290 20 7d 0a 20 20 20 20 20 20 20 20 73 43 75 72 2e   }.        sCur.
2c2a0 6e 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53  n = 0;.#ifndef S
2c2b0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
2c2c0 41 4c 54 41 42 4c 45 0a 20 20 20 20 20 20 20 20  ALTABLE.        
2c2d0 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 49  if( IsVirtual(pI
2c2e0 74 65 6d 2d 3e 70 54 61 62 29 20 29 7b 0a 20 20  tem->pTab) ){.  
2c2f0 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 68 65          rc = whe
2c300 72 65 4c 6f 6f 70 41 64 64 56 69 72 74 75 61 6c  reLoopAddVirtual
2c310 28 26 73 53 75 62 42 75 69 6c 64 2c 20 6d 45 78  (&sSubBuild, mEx
2c320 74 72 61 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  tra);.        }e
2c330 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  lse.#endif.     
2c340 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 72     {.          r
2c350 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  c = whereLoopAdd
2c360 42 74 72 65 65 28 26 73 53 75 62 42 75 69 6c 64  Btree(&sSubBuild
2c370 2c 20 6d 45 78 74 72 61 29 3b 0a 20 20 20 20 20  , mExtra);.     
2c380 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73     }.        ass
2c390 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
2c3a0 4f 4b 20 7c 7c 20 73 43 75 72 2e 6e 3d 3d 30 20  OK || sCur.n==0 
2c3b0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  );.        if( s
2c3c0 43 75 72 2e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  Cur.n==0 ){.    
2c3d0 20 20 20 20 20 20 73 53 75 6d 2e 6e 20 3d 20 30        sSum.n = 0
2c3e0 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
2c3f0 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  k;.        }else
2c400 20 69 66 28 20 6f 6e 63 65 20 29 7b 0a 20 20 20   if( once ){.   
2c410 20 20 20 20 20 20 20 77 68 65 72 65 4f 72 4d 6f         whereOrMo
2c420 76 65 28 26 73 53 75 6d 2c 20 26 73 43 75 72 29  ve(&sSum, &sCur)
2c430 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 6e 63 65  ;.          once
2c440 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65   = 0;.        }e
2c450 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 57  lse{.          W
2c460 68 65 72 65 4f 72 53 65 74 20 73 50 72 65 76 3b  hereOrSet sPrev;
2c470 0a 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65  .          where
2c480 4f 72 4d 6f 76 65 28 26 73 50 72 65 76 2c 20 26  OrMove(&sPrev, &
2c490 73 53 75 6d 29 3b 0a 20 20 20 20 20 20 20 20 20  sSum);.         
2c4a0 20 73 53 75 6d 2e 6e 20 3d 20 30 3b 0a 20 20 20   sSum.n = 0;.   
2c4b0 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
2c4c0 69 3c 73 50 72 65 76 2e 6e 3b 20 69 2b 2b 29 7b  i<sPrev.n; i++){
2c4d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72  .            for
2c4e0 28 6a 3d 30 3b 20 6a 3c 73 43 75 72 2e 6e 3b 20  (j=0; j<sCur.n; 
2c4f0 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j++){.          
2c500 20 20 20 20 77 68 65 72 65 4f 72 49 6e 73 65 72      whereOrInser
2c510 74 28 26 73 53 75 6d 2c 20 73 50 72 65 76 2e 61  t(&sSum, sPrev.a
2c520 5b 69 5d 2e 70 72 65 72 65 71 20 7c 20 73 43 75  [i].prereq | sCu
2c530 72 2e 61 5b 6a 5d 2e 70 72 65 72 65 71 2c 0a 20  r.a[j].prereq,. 
2c540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c550 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
2c560 65 33 4c 6f 67 45 73 74 41 64 64 28 73 50 72 65  e3LogEstAdd(sPre
2c570 76 2e 61 5b 69 5d 2e 72 52 75 6e 2c 20 73 43 75  v.a[i].rRun, sCu
2c580 72 2e 61 5b 6a 5d 2e 72 52 75 6e 29 2c 0a 20 20  r.a[j].rRun),.  
2c590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c5a0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2c5b0 33 4c 6f 67 45 73 74 41 64 64 28 73 50 72 65 76  3LogEstAdd(sPrev
2c5c0 2e 61 5b 69 5d 2e 6e 4f 75 74 2c 20 73 43 75 72  .a[i].nOut, sCur
2c5d0 2e 61 5b 6a 5d 2e 6e 4f 75 74 29 29 3b 0a 20 20  .a[j].nOut));.  
2c5e0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2c5f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2c600 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
2c610 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 31  pNew->nLTerm = 1
2c620 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 4c  ;.      pNew->aL
2c630 54 65 72 6d 5b 30 5d 20 3d 20 70 54 65 72 6d 3b  Term[0] = pTerm;
2c640 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46  .      pNew->wsF
2c650 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 4d 55 4c  lags = WHERE_MUL
2c660 54 49 5f 4f 52 3b 0a 20 20 20 20 20 20 70 4e 65  TI_OR;.      pNe
2c670 77 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a 20  w->rSetup = 0;. 
2c680 20 20 20 20 20 70 4e 65 77 2d 3e 69 53 6f 72 74       pNew->iSort
2c690 49 64 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 6d  Idx = 0;.      m
2c6a0 65 6d 73 65 74 28 26 70 4e 65 77 2d 3e 75 2c 20  emset(&pNew->u, 
2c6b0 30 2c 20 73 69 7a 65 6f 66 28 70 4e 65 77 2d 3e  0, sizeof(pNew->
2c6c0 75 29 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  u));.      for(i
2c6d0 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  =0; rc==SQLITE_O
2c6e0 4b 20 26 26 20 69 3c 73 53 75 6d 2e 6e 3b 20 69  K && i<sSum.n; i
2c6f0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ++){.        /* 
2c700 54 55 4e 49 4e 47 3a 20 43 75 72 72 65 6e 74 6c  TUNING: Currentl
2c710 79 20 73 53 75 6d 2e 61 5b 69 5d 2e 72 52 75 6e  y sSum.a[i].rRun
2c720 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 73   is set to the s
2c730 75 6d 20 6f 66 20 74 68 65 20 63 6f 73 74 73 0a  um of the costs.
2c740 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 61 6c          ** of al
2c750 6c 20 73 75 62 2d 73 63 61 6e 73 20 72 65 71 75  l sub-scans requ
2c760 69 72 65 64 20 62 79 20 74 68 65 20 4f 52 2d 73  ired by the OR-s
2c770 63 61 6e 2e 20 48 6f 77 65 76 65 72 2c 20 64 75  can. However, du
2c780 65 20 74 6f 20 72 6f 75 6e 64 69 6e 67 0a 20 20  e to rounding.  
2c790 20 20 20 20 20 20 2a 2a 20 65 72 72 6f 72 73 2c        ** errors,
2c7a0 20 69 74 20 6d 61 79 20 62 65 20 74 68 61 74 20   it may be that 
2c7b0 74 68 65 20 63 6f 73 74 20 6f 66 20 74 68 65 20  the cost of the 
2c7c0 4f 52 2d 73 63 61 6e 20 69 73 20 65 71 75 61 6c  OR-scan is equal
2c7d0 20 74 6f 20 69 74 73 0a 20 20 20 20 20 20 20 20   to its.        
2c7e0 2a 2a 20 6d 6f 73 74 20 65 78 70 65 6e 73 69 76  ** most expensiv
2c7f0 65 20 73 75 62 2d 73 63 61 6e 2e 20 41 64 64 20  e sub-scan. Add 
2c800 74 68 65 20 73 6d 61 6c 6c 65 73 74 20 70 6f 73  the smallest pos
2c810 73 69 62 6c 65 20 70 65 6e 61 6c 74 79 20 0a 20  sible penalty . 
2c820 20 20 20 20 20 20 20 2a 2a 20 28 65 71 75 69 76         ** (equiv
2c830 61 6c 65 6e 74 20 74 6f 20 6d 75 6c 74 69 70 6c  alent to multipl
2c840 79 69 6e 67 20 74 68 65 20 63 6f 73 74 20 62 79  ying the cost by
2c850 20 31 2e 30 37 29 20 74 6f 20 65 6e 73 75 72 65   1.07) to ensure
2c860 20 74 68 61 74 20 0a 20 20 20 20 20 20 20 20 2a   that .        *
2c870 2a 20 74 68 69 73 20 64 6f 65 73 20 6e 6f 74 20  * this does not 
2c880 68 61 70 70 65 6e 2e 20 4f 74 68 65 72 77 69 73  happen. Otherwis
2c890 65 2c 20 66 6f 72 20 57 48 45 52 45 20 63 6c 61  e, for WHERE cla
2c8a0 75 73 65 73 20 73 75 63 68 20 61 73 20 74 68 65  uses such as the
2c8b0 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 6f 6c 6c  .        ** foll
2c8c0 6f 77 69 6e 67 20 77 68 65 72 65 20 74 68 65 72  owing where ther
2c8d0 65 20 69 73 20 61 6e 20 69 6e 64 65 78 20 6f 6e  e is an index on
2c8e0 20 22 79 22 3a 0a 20 20 20 20 20 20 20 20 2a 2a   "y":.        **
2c8f0 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20  .        **     
2c900 57 48 45 52 45 20 6c 69 6b 65 6c 69 68 6f 6f 64  WHERE likelihood
2c910 28 78 3d 3f 2c 20 30 2e 39 39 29 20 4f 52 20 79  (x=?, 0.99) OR y
2c920 3d 3f 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  =?.        **.  
2c930 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70 6c 61        ** the pla
2c940 6e 6e 65 72 20 6d 61 79 20 65 6c 65 63 74 20 74  nner may elect t
2c950 6f 20 22 4f 52 22 20 74 6f 67 65 74 68 65 72 20  o "OR" together 
2c960 61 20 66 75 6c 6c 2d 74 61 62 6c 65 20 73 63 61  a full-table sca
2c970 6e 20 61 6e 64 20 61 6e 0a 20 20 20 20 20 20 20  n and an.       
2c980 20 2a 2a 20 69 6e 64 65 78 20 6c 6f 6f 6b 75 70   ** index lookup
2c990 2e 20 41 6e 64 20 6f 74 68 65 72 20 73 69 6d 69  . And other simi
2c9a0 6c 61 72 6c 79 20 6f 64 64 20 72 65 73 75 6c 74  larly odd result
2c9b0 73 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70  s.  */.        p
2c9c0 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 73 53 75 6d  New->rRun = sSum
2c9d0 2e 61 5b 69 5d 2e 72 52 75 6e 20 2b 20 31 3b 0a  .a[i].rRun + 1;.
2c9e0 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f          pNew->nO
2c9f0 75 74 20 3d 20 73 53 75 6d 2e 61 5b 69 5d 2e 6e  ut = sSum.a[i].n
2ca00 4f 75 74 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  Out;.        pNe
2ca10 77 2d 3e 70 72 65 72 65 71 20 3d 20 73 53 75 6d  w->prereq = sSum
2ca20 2e 61 5b 69 5d 2e 70 72 65 72 65 71 3b 0a 20 20  .a[i].prereq;.  
2ca30 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65        rc = where
2ca40 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c  LoopInsert(pBuil
2ca50 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20  der, pNew);.    
2ca60 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
2ca70 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2ca80 0a 2a 2a 20 41 64 64 20 61 6c 6c 20 57 68 65 72  .** Add all Wher
2ca90 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 66 6f  eLoop objects fo
2caa0 72 20 61 6c 6c 20 74 61 62 6c 65 73 20 0a 2a 2f  r all tables .*/
2cab0 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
2cac0 65 4c 6f 6f 70 41 64 64 41 6c 6c 28 57 68 65 72  eLoopAddAll(Wher
2cad0 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42  eLoopBuilder *pB
2cae0 75 69 6c 64 65 72 29 7b 0a 20 20 57 68 65 72 65  uilder){.  Where
2caf0 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70  Info *pWInfo = p
2cb00 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b  Builder->pWInfo;
2cb10 0a 20 20 42 69 74 6d 61 73 6b 20 6d 45 78 74 72  .  Bitmask mExtr
2cb20 61 20 3d 20 30 3b 0a 20 20 42 69 74 6d 61 73 6b  a = 0;.  Bitmask
2cb30 20 6d 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 69   mPrior = 0;.  i
2cb40 6e 74 20 69 54 61 62 3b 0a 20 20 53 72 63 4c 69  nt iTab;.  SrcLi
2cb50 73 74 20 2a 70 54 61 62 4c 69 73 74 20 3d 20 70  st *pTabList = p
2cb60 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 3b  WInfo->pTabList;
2cb70 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
2cb80 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
2cb90 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
2cba0 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64  WInfo->pParse->d
2cbb0 62 3b 0a 20 20 69 6e 74 20 6e 54 61 62 4c 69 73  b;.  int nTabLis
2cbc0 74 20 3d 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76  t = pWInfo->nLev
2cbd0 65 6c 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  el;.  int rc = S
2cbe0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 38 20 70  QLITE_OK;.  u8 p
2cbf0 72 69 6f 72 4a 6f 69 6e 54 79 70 65 20 3d 20 30  riorJoinType = 0
2cc00 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  ;.  WhereLoop *p
2cc10 4e 65 77 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20  New;..  /* Loop 
2cc20 6f 76 65 72 20 74 68 65 20 74 61 62 6c 65 73 20  over the tables 
2cc30 69 6e 20 74 68 65 20 6a 6f 69 6e 2c 20 66 72 6f  in the join, fro
2cc40 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74 20  m left to right 
2cc50 2a 2f 0a 20 20 70 4e 65 77 20 3d 20 70 42 75 69  */.  pNew = pBui
2cc60 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 77 68  lder->pNew;.  wh
2cc70 65 72 65 4c 6f 6f 70 49 6e 69 74 28 70 4e 65 77  ereLoopInit(pNew
2cc80 29 3b 0a 20 20 66 6f 72 28 69 54 61 62 3d 30 2c  );.  for(iTab=0,
2cc90 20 70 49 74 65 6d 3d 70 54 61 62 4c 69 73 74 2d   pItem=pTabList-
2cca0 3e 61 3b 20 69 54 61 62 3c 6e 54 61 62 4c 69 73  >a; iTab<nTabLis
2ccb0 74 3b 20 69 54 61 62 2b 2b 2c 20 70 49 74 65 6d  t; iTab++, pItem
2ccc0 2b 2b 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 69  ++){.    pNew->i
2ccd0 54 61 62 20 3d 20 69 54 61 62 3b 0a 20 20 20 20  Tab = iTab;.    
2cce0 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 20 3d  pNew->maskSelf =
2ccf0 20 67 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f   getMask(&pWInfo
2cd00 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 70 49 74 65  ->sMaskSet, pIte
2cd10 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20  m->iCursor);.   
2cd20 20 69 66 28 20 28 28 70 49 74 65 6d 2d 3e 6a 6f   if( ((pItem->jo
2cd30 69 6e 74 79 70 65 7c 70 72 69 6f 72 4a 6f 69 6e  intype|priorJoin
2cd40 54 79 70 65 29 20 26 20 28 4a 54 5f 4c 45 46 54  Type) & (JT_LEFT
2cd50 7c 4a 54 5f 43 52 4f 53 53 29 29 21 3d 30 20 29  |JT_CROSS))!=0 )
2cd60 7b 0a 20 20 20 20 20 20 6d 45 78 74 72 61 20 3d  {.      mExtra =
2cd70 20 6d 50 72 69 6f 72 3b 0a 20 20 20 20 7d 0a 20   mPrior;.    }. 
2cd80 20 20 20 70 72 69 6f 72 4a 6f 69 6e 54 79 70 65     priorJoinType
2cd90 20 3d 20 70 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79   = pItem->jointy
2cda0 70 65 3b 0a 20 20 20 20 69 66 28 20 49 73 56 69  pe;.    if( IsVi
2cdb0 72 74 75 61 6c 28 70 49 74 65 6d 2d 3e 70 54 61  rtual(pItem->pTa
2cdc0 62 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  b) ){.      rc =
2cdd0 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 69 72   whereLoopAddVir
2cde0 74 75 61 6c 28 70 42 75 69 6c 64 65 72 2c 20 6d  tual(pBuilder, m
2cdf0 45 78 74 72 61 29 3b 0a 20 20 20 20 7d 65 6c 73  Extra);.    }els
2ce00 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68  e{.      rc = wh
2ce10 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 28  ereLoopAddBtree(
2ce20 70 42 75 69 6c 64 65 72 2c 20 6d 45 78 74 72 61  pBuilder, mExtra
2ce30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
2ce40 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2ce50 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68 65  {.      rc = whe
2ce60 72 65 4c 6f 6f 70 41 64 64 4f 72 28 70 42 75 69  reLoopAddOr(pBui
2ce70 6c 64 65 72 2c 20 6d 45 78 74 72 61 29 3b 0a 20  lder, mExtra);. 
2ce80 20 20 20 7d 0a 20 20 20 20 6d 50 72 69 6f 72 20     }.    mPrior 
2ce90 7c 3d 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c  |= pNew->maskSel
2cea0 66 3b 0a 20 20 20 20 69 66 28 20 72 63 20 7c 7c  f;.    if( rc ||
2ceb0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
2cec0 64 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20  d ) break;.  }. 
2ced0 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 28   whereLoopClear(
2cee0 64 62 2c 20 70 4e 65 77 29 3b 0a 20 20 72 65 74  db, pNew);.  ret
2cef0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2cf00 20 45 78 61 6d 69 6e 65 20 61 20 57 68 65 72 65   Examine a Where
2cf10 50 61 74 68 20 28 77 69 74 68 20 74 68 65 20 61  Path (with the a
2cf20 64 64 69 74 69 6f 6e 20 6f 66 20 74 68 65 20 65  ddition of the e
2cf30 78 74 72 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f  xtra WhereLoop o
2cf40 66 20 74 68 65 20 35 74 68 0a 2a 2a 20 70 61 72  f the 5th.** par
2cf50 61 6d 65 74 65 72 73 29 20 74 6f 20 73 65 65 20  ameters) to see 
2cf60 69 66 20 69 74 20 6f 75 74 70 75 74 73 20 72 6f  if it outputs ro
2cf70 77 73 20 69 6e 20 74 68 65 20 72 65 71 75 65 73  ws in the reques
2cf80 74 65 64 20 4f 52 44 45 52 20 42 59 0a 2a 2a 20  ted ORDER BY.** 
2cf90 28 6f 72 20 47 52 4f 55 50 20 42 59 29 20 77 69  (or GROUP BY) wi
2cfa0 74 68 6f 75 74 20 72 65 71 75 69 72 69 6e 67 20  thout requiring 
2cfb0 61 20 73 65 70 61 72 61 74 65 20 73 6f 72 74 20  a separate sort 
2cfc0 6f 70 65 72 61 74 69 6f 6e 2e 20 20 52 65 74 75  operation.  Retu
2cfd0 72 6e 20 4e 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 4e  rn N:.** .**   N
2cfe0 3e 30 3a 20 20 20 4e 20 74 65 72 6d 73 20 6f 66  >0:   N terms of
2cff0 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
2d000 61 75 73 65 20 61 72 65 20 73 61 74 69 73 66 69  ause are satisfi
2d010 65 64 0a 2a 2a 20 20 20 4e 3d 3d 30 3a 20 20 4e  ed.**   N==0:  N
2d020 6f 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 4f  o terms of the O
2d030 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61  RDER BY clause a
2d040 72 65 20 73 61 74 69 73 66 69 65 64 0a 2a 2a 20  re satisfied.** 
2d050 20 20 4e 3c 30 3a 20 20 20 55 6e 6b 6e 6f 77 6e    N<0:   Unknown
2d060 20 79 65 74 20 68 6f 77 20 6d 61 6e 79 20 74 65   yet how many te
2d070 72 6d 73 20 6f 66 20 4f 52 44 45 52 20 42 59 20  rms of ORDER BY 
2d080 6d 69 67 68 74 20 62 65 20 73 61 74 69 73 66 69  might be satisfi
2d090 65 64 2e 20 20 20 0a 2a 2a 0a 2a 2a 20 4e 6f 74  ed.   .**.** Not
2d0a0 65 20 74 68 61 74 20 70 72 6f 63 65 73 73 69 6e  e that processin
2d0b0 67 20 66 6f 72 20 57 48 45 52 45 5f 47 52 4f 55  g for WHERE_GROU
2d0c0 50 42 59 20 61 6e 64 20 57 48 45 52 45 5f 44 49  PBY and WHERE_DI
2d0d0 53 54 49 4e 43 54 42 59 20 69 73 20 6e 6f 74 20  STINCTBY is not 
2d0e0 61 73 0a 2a 2a 20 73 74 72 69 63 74 2e 20 20 57  as.** strict.  W
2d0f0 69 74 68 20 47 52 4f 55 50 20 42 59 20 61 6e 64  ith GROUP BY and
2d100 20 44 49 53 54 49 4e 43 54 20 74 68 65 20 6f 6e   DISTINCT the on
2d110 6c 79 20 72 65 71 75 69 72 65 6d 65 6e 74 20 69  ly requirement i
2d120 73 20 74 68 61 74 0a 2a 2a 20 65 71 75 69 76 61  s that.** equiva
2d130 6c 65 6e 74 20 72 6f 77 73 20 61 70 70 65 61 72  lent rows appear
2d140 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 64 6a   immediately adj
2d150 61 63 65 6e 74 20 74 6f 20 6f 6e 65 20 61 6e 6f  acent to one ano
2d160 74 68 65 72 2e 20 20 47 52 4f 55 50 20 42 59 0a  ther.  GROUP BY.
2d170 2a 2a 20 61 6e 64 20 44 49 53 54 49 4e 43 54 20  ** and DISTINCT 
2d180 64 6f 20 6e 6f 74 20 72 65 71 75 69 72 65 20 72  do not require r
2d190 6f 77 73 20 74 6f 20 61 70 70 65 61 72 20 69 6e  ows to appear in
2d1a0 20 61 6e 79 20 70 61 72 74 69 63 75 6c 61 72 20   any particular 
2d1b0 6f 72 64 65 72 20 61 73 20 6c 6f 6e 67 0a 2a 2a  order as long.**
2d1c0 20 61 73 20 65 71 75 69 76 65 6c 65 6e 74 20 72   as equivelent r
2d1d0 6f 77 73 20 61 72 65 20 67 72 6f 75 70 65 64 20  ows are grouped 
2d1e0 74 6f 67 65 74 68 65 72 2e 20 20 54 68 75 73 20  together.  Thus 
2d1f0 66 6f 72 20 47 52 4f 55 50 20 42 59 20 61 6e 64  for GROUP BY and
2d200 20 44 49 53 54 49 4e 43 54 0a 2a 2a 20 74 68 65   DISTINCT.** the
2d210 20 70 4f 72 64 65 72 42 79 20 74 65 72 6d 73 20   pOrderBy terms 
2d220 63 61 6e 20 62 65 20 6d 61 74 63 68 65 64 20 69  can be matched i
2d230 6e 20 61 6e 79 20 6f 72 64 65 72 2e 20 20 57 69  n any order.  Wi
2d240 74 68 20 4f 52 44 45 52 20 42 59 2c 20 74 68 65  th ORDER BY, the
2d250 20 0a 2a 2a 20 70 4f 72 64 65 72 42 79 20 74 65   .** pOrderBy te
2d260 72 6d 73 20 6d 75 73 74 20 62 65 20 6d 61 74 63  rms must be matc
2d270 68 65 64 20 69 6e 20 73 74 72 69 63 74 20 6c 65  hed in strict le
2d280 66 74 2d 74 6f 2d 72 69 67 68 74 20 6f 72 64 65  ft-to-right orde
2d290 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 38 20  r..*/.static i8 
2d2a0 77 68 65 72 65 50 61 74 68 53 61 74 69 73 66 69  wherePathSatisfi
2d2b0 65 73 4f 72 64 65 72 42 79 28 0a 20 20 57 68 65  esOrderBy(.  Whe
2d2c0 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 20  reInfo *pWInfo, 
2d2d0 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
2d2e0 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72  clause */.  Expr
2d2f0 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20  List *pOrderBy, 
2d300 20 20 2f 2a 20 4f 52 44 45 52 20 42 59 20 6f 72    /* ORDER BY or
2d310 20 47 52 4f 55 50 20 42 59 20 6f 72 20 44 49 53   GROUP BY or DIS
2d320 54 49 4e 43 54 20 63 6c 61 75 73 65 20 74 6f 20  TINCT clause to 
2d330 63 68 65 63 6b 20 2a 2f 0a 20 20 57 68 65 72 65  check */.  Where
2d340 50 61 74 68 20 2a 70 50 61 74 68 2c 20 20 20 20  Path *pPath,    
2d350 20 2f 2a 20 54 68 65 20 57 68 65 72 65 50 61 74   /* The WherePat
2d360 68 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20  h to check */.  
2d370 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73 2c 20  u16 wctrlFlags, 
2d380 20 20 20 20 20 20 2f 2a 20 4d 69 67 68 74 20 63        /* Might c
2d390 6f 6e 74 61 69 6e 20 57 48 45 52 45 5f 47 52 4f  ontain WHERE_GRO
2d3a0 55 50 42 59 20 6f 72 20 57 48 45 52 45 5f 44 49  UPBY or WHERE_DI
2d3b0 53 54 49 4e 43 54 42 59 20 2a 2f 0a 20 20 75 31  STINCTBY */.  u1
2d3c0 36 20 6e 4c 6f 6f 70 2c 20 20 20 20 20 20 20 20  6 nLoop,        
2d3d0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2d3e0 20 65 6e 74 72 69 65 73 20 69 6e 20 70 50 61 74   entries in pPat
2d3f0 68 2d 3e 61 4c 6f 6f 70 5b 5d 20 2a 2f 0a 20 20  h->aLoop[] */.  
2d400 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 61 73 74  WhereLoop *pLast
2d410 2c 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 69  ,     /* Add thi
2d420 73 20 57 68 65 72 65 4c 6f 6f 70 20 74 6f 20 74  s WhereLoop to t
2d430 68 65 20 65 6e 64 20 6f 66 20 70 50 61 74 68 2d  he end of pPath-
2d440 3e 61 4c 6f 6f 70 5b 5d 20 2a 2f 0a 20 20 42 69  >aLoop[] */.  Bi
2d450 74 6d 61 73 6b 20 2a 70 52 65 76 4d 61 73 6b 20  tmask *pRevMask 
2d460 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 61 73 6b      /* OUT: Mask
2d470 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70 73 20 74   of WhereLoops t
2d480 6f 20 72 75 6e 20 69 6e 20 72 65 76 65 72 73 65  o run in reverse
2d490 20 6f 72 64 65 72 20 2a 2f 0a 29 7b 0a 20 20 75   order */.){.  u
2d4a0 38 20 72 65 76 53 65 74 3b 20 20 20 20 20 20 20  8 revSet;       
2d4b0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
2d4c0 72 65 76 20 69 73 20 6b 6e 6f 77 6e 20 2a 2f 0a  rev is known */.
2d4d0 20 20 75 38 20 72 65 76 3b 20 20 20 20 20 20 20    u8 rev;       
2d4e0 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 6f          /* Compo
2d4f0 73 69 74 65 20 73 6f 72 74 20 6f 72 64 65 72 20  site sort order 
2d500 2a 2f 0a 20 20 75 38 20 72 65 76 49 64 78 3b 20  */.  u8 revIdx; 
2d510 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
2d520 64 65 78 20 73 6f 72 74 20 6f 72 64 65 72 20 2a  dex sort order *
2d530 2f 0a 20 20 75 38 20 69 73 4f 72 64 65 72 44 69  /.  u8 isOrderDi
2d540 73 74 69 6e 63 74 3b 20 20 20 2f 2a 20 41 6c 6c  stinct;   /* All
2d550 20 70 72 69 6f 72 20 57 68 65 72 65 4c 6f 6f 70   prior WhereLoop
2d560 73 20 61 72 65 20 6f 72 64 65 72 2d 64 69 73 74  s are order-dist
2d570 69 6e 63 74 20 2a 2f 0a 20 20 75 38 20 64 69 73  inct */.  u8 dis
2d580 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 3b 20 20 20  tinctColumns;   
2d590 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 6c  /* True if the l
2d5a0 6f 6f 70 20 68 61 73 20 55 4e 49 51 55 45 20 4e  oop has UNIQUE N
2d5b0 4f 54 20 4e 55 4c 4c 20 63 6f 6c 75 6d 6e 73 20  OT NULL columns 
2d5c0 2a 2f 0a 20 20 75 38 20 69 73 4d 61 74 63 68 3b  */.  u8 isMatch;
2d5d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 43             /* iC
2d5e0 6f 6c 75 6d 6e 20 6d 61 74 63 68 65 73 20 61 20  olumn matches a 
2d5f0 74 65 72 6d 20 6f 66 20 74 68 65 20 4f 52 44 45  term of the ORDE
2d600 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20  R BY clause */. 
2d610 20 75 31 36 20 6e 4b 65 79 43 6f 6c 3b 20 20 20   u16 nKeyCol;   
2d620 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2d630 20 6f 66 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 20   of key columns 
2d640 69 6e 20 70 49 6e 64 65 78 20 2a 2f 0a 20 20 75  in pIndex */.  u
2d650 31 36 20 6e 43 6f 6c 75 6d 6e 3b 20 20 20 20 20  16 nColumn;     
2d660 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75       /* Total nu
2d670 6d 62 65 72 20 6f 66 20 6f 72 64 65 72 65 64 20  mber of ordered 
2d680 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 69  columns in the i
2d690 6e 64 65 78 20 2a 2f 0a 20 20 75 31 36 20 6e 4f  ndex */.  u16 nO
2d6a0 72 64 65 72 42 79 3b 20 20 20 20 20 20 20 20 20  rderBy;         
2d6b0 2f 2a 20 4e 75 6d 62 65 72 20 74 65 72 6d 73 20  /* Number terms 
2d6c0 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  in the ORDER BY 
2d6d0 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20  clause */.  int 
2d6e0 69 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20  iLoop;          
2d6f0 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 57 68    /* Index of Wh
2d700 65 72 65 4c 6f 6f 70 20 69 6e 20 70 50 61 74 68  ereLoop in pPath
2d710 20 62 65 69 6e 67 20 70 72 6f 63 65 73 73 65 64   being processed
2d720 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20   */.  int i, j; 
2d730 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
2d740 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a  oop counters */.
2d750 20 20 69 6e 74 20 69 43 75 72 3b 20 20 20 20 20    int iCur;     
2d760 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f          /* Curso
2d770 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 63 75 72  r number for cur
2d780 72 65 6e 74 20 57 68 65 72 65 4c 6f 6f 70 20 2a  rent WhereLoop *
2d790 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 3b  /.  int iColumn;
2d7a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 63            /* A c
2d7b0 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 77 69 74  olumn number wit
2d7c0 68 69 6e 20 74 61 62 6c 65 20 69 43 75 72 20 2a  hin table iCur *
2d7d0 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  /.  WhereLoop *p
2d7e0 4c 6f 6f 70 20 3d 20 30 3b 20 2f 2a 20 43 75 72  Loop = 0; /* Cur
2d7f0 72 65 6e 74 20 57 68 65 72 65 4c 6f 6f 70 20 62  rent WhereLoop b
2d800 65 69 6e 67 20 70 72 6f 63 65 73 73 65 64 2e 20  eing processed. 
2d810 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  */.  WhereTerm *
2d820 70 54 65 72 6d 3b 20 20 20 20 20 2f 2a 20 41 20  pTerm;     /* A 
2d830 73 69 6e 67 6c 65 20 74 65 72 6d 20 6f 66 20 74  single term of t
2d840 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
2d850 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4f 42 45 78  */.  Expr *pOBEx
2d860 70 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 6e  pr;        /* An
2d870 20 65 78 70 72 65 73 73 69 6f 6e 20 66 72 6f 6d   expression from
2d880 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
2d890 61 75 73 65 20 2a 2f 0a 20 20 43 6f 6c 6c 53 65  ause */.  CollSe
2d8a0 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20  q *pColl;       
2d8b0 2f 2a 20 43 4f 4c 4c 41 54 45 20 66 75 6e 63 74  /* COLLATE funct
2d8c0 69 6f 6e 20 66 72 6f 6d 20 61 6e 20 4f 52 44 45  ion from an ORDE
2d8d0 52 20 42 59 20 63 6c 61 75 73 65 20 74 65 72 6d  R BY clause term
2d8e0 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e   */.  Index *pIn
2d8f0 64 65 78 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  dex;        /* T
2d900 68 65 20 69 6e 64 65 78 20 61 73 73 6f 63 69 61  he index associa
2d910 74 65 64 20 77 69 74 68 20 70 4c 6f 6f 70 20 2a  ted with pLoop *
2d920 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
2d930 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65  = pWInfo->pParse
2d940 2d 3e 64 62 3b 20 20 2f 2a 20 44 61 74 61 62 61  ->db;  /* Databa
2d950 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
2d960 0a 20 20 42 69 74 6d 61 73 6b 20 6f 62 53 61 74  .  Bitmask obSat
2d970 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4d 61 73 6b   = 0;    /* Mask
2d980 20 6f 66 20 4f 52 44 45 52 20 42 59 20 74 65 72   of ORDER BY ter
2d990 6d 73 20 73 61 74 69 73 66 69 65 64 20 73 6f 20  ms satisfied so 
2d9a0 66 61 72 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  far */.  Bitmask
2d9b0 20 6f 62 44 6f 6e 65 3b 20 20 20 20 20 20 20 2f   obDone;       /
2d9c0 2a 20 4d 61 73 6b 20 6f 66 20 61 6c 6c 20 4f 52  * Mask of all OR
2d9d0 44 45 52 20 42 59 20 74 65 72 6d 73 20 2a 2f 0a  DER BY terms */.
2d9e0 20 20 42 69 74 6d 61 73 6b 20 6f 72 64 65 72 44    Bitmask orderD
2d9f0 69 73 74 69 6e 63 74 4d 61 73 6b 3b 20 20 2f 2a  istinctMask;  /*
2da00 20 4d 61 73 6b 20 6f 66 20 61 6c 6c 20 77 65 6c   Mask of all wel
2da10 6c 2d 6f 72 64 65 72 65 64 20 6c 6f 6f 70 73 20  l-ordered loops 
2da20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 72 65 61  */.  Bitmask rea
2da30 64 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dy;             
2da40 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 69 6e 6e 65   /* Mask of inne
2da50 72 20 6c 6f 6f 70 73 20 2a 2f 0a 0a 20 20 2f 2a  r loops */..  /*
2da60 0a 20 20 2a 2a 20 57 65 20 73 61 79 20 74 68 65  .  ** We say the
2da70 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 20 22 6f   WhereLoop is "o
2da80 6e 65 2d 72 6f 77 22 20 69 66 20 69 74 20 67 65  ne-row" if it ge
2da90 6e 65 72 61 74 65 73 20 6e 6f 20 6d 6f 72 65 20  nerates no more 
2daa0 74 68 61 6e 20 6f 6e 65 0a 20 20 2a 2a 20 72 6f  than one.  ** ro
2dab0 77 20 6f 66 20 6f 75 74 70 75 74 2e 20 20 41 20  w of output.  A 
2dac0 57 68 65 72 65 4c 6f 6f 70 20 69 73 20 6f 6e 65  WhereLoop is one
2dad0 2d 72 6f 77 20 69 66 20 61 6c 6c 20 6f 66 20 74  -row if all of t
2dae0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65  he following are
2daf0 20 74 72 75 65 3a 0a 20 20 2a 2a 20 20 28 61 29   true:.  **  (a)
2db00 20 41 6c 6c 20 69 6e 64 65 78 20 63 6f 6c 75 6d   All index colum
2db10 6e 73 20 6d 61 74 63 68 20 77 69 74 68 20 57 48  ns match with WH
2db20 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 2e 0a 20  ERE_COLUMN_EQ.. 
2db30 20 2a 2a 20 20 28 62 29 20 54 68 65 20 69 6e 64   **  (b) The ind
2db40 65 78 20 69 73 20 75 6e 69 71 75 65 0a 20 20 2a  ex is unique.  *
2db50 2a 20 41 6e 79 20 57 68 65 72 65 4c 6f 6f 70 20  * Any WhereLoop 
2db60 77 69 74 68 20 61 6e 20 57 48 45 52 45 5f 43 4f  with an WHERE_CO
2db70 4c 55 4d 4e 5f 45 51 20 63 6f 6e 73 74 72 61 69  LUMN_EQ constrai
2db80 6e 74 20 6f 6e 20 74 68 65 20 72 6f 77 69 64 20  nt on the rowid 
2db90 69 73 20 6f 6e 65 2d 72 6f 77 2e 0a 20 20 2a 2a  is one-row..  **
2dba0 20 45 76 65 72 79 20 6f 6e 65 2d 72 6f 77 20 57   Every one-row W
2dbb0 68 65 72 65 4c 6f 6f 70 20 77 69 6c 6c 20 68 61  hereLoop will ha
2dbc0 76 65 20 74 68 65 20 57 48 45 52 45 5f 4f 4e 45  ve the WHERE_ONE
2dbd0 52 4f 57 20 62 69 74 20 73 65 74 20 69 6e 20 77  ROW bit set in w
2dbe0 73 46 6c 61 67 73 2e 0a 20 20 2a 2a 0a 20 20 2a  sFlags..  **.  *
2dbf0 2a 20 57 65 20 73 61 79 20 74 68 65 20 57 68 65  * We say the Whe
2dc00 72 65 4c 6f 6f 70 20 69 73 20 22 6f 72 64 65 72  reLoop is "order
2dc10 2d 64 69 73 74 69 6e 63 74 22 20 69 66 20 74 68  -distinct" if th
2dc20 65 20 73 65 74 20 6f 66 20 63 6f 6c 75 6d 6e 73  e set of columns
2dc30 20 66 72 6f 6d 0a 20 20 2a 2a 20 74 68 61 74 20   from.  ** that 
2dc40 57 68 65 72 65 4c 6f 6f 70 20 74 68 61 74 20 61  WhereLoop that a
2dc50 72 65 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20  re in the ORDER 
2dc60 42 59 20 63 6c 61 75 73 65 20 61 72 65 20 64 69  BY clause are di
2dc70 66 66 65 72 65 6e 74 20 66 6f 72 20 65 76 65 72  fferent for ever
2dc80 79 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20 74 68  y.  ** row of th
2dc90 65 20 57 68 65 72 65 4c 6f 6f 70 2e 20 20 45 76  e WhereLoop.  Ev
2dca0 65 72 79 20 6f 6e 65 2d 72 6f 77 20 57 68 65 72  ery one-row Wher
2dcb0 65 4c 6f 6f 70 20 69 73 20 61 75 74 6f 6d 61 74  eLoop is automat
2dcc0 69 63 61 6c 6c 79 0a 20 20 2a 2a 20 6f 72 64 65  ically.  ** orde
2dcd0 72 2d 64 69 73 74 69 6e 63 74 2e 20 20 20 41 20  r-distinct.   A 
2dce0 57 68 65 72 65 4c 6f 6f 70 20 74 68 61 74 20 68  WhereLoop that h
2dcf0 61 73 20 6e 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e  as no columns in
2dd00 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
2dd10 61 75 73 65 0a 20 20 2a 2a 20 69 73 20 6e 6f 74  ause.  ** is not
2dd20 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74 2e   order-distinct.
2dd30 20 54 6f 20 62 65 20 6f 72 64 65 72 2d 64 69 73   To be order-dis
2dd40 74 69 6e 63 74 20 69 73 20 6e 6f 74 20 71 75 69  tinct is not qui
2dd50 74 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 62  te the same as b
2dd60 65 69 6e 67 0a 20 20 2a 2a 20 55 4e 49 51 55 45  eing.  ** UNIQUE
2dd70 20 73 69 6e 63 65 20 61 20 55 4e 49 51 55 45 20   since a UNIQUE 
2dd80 63 6f 6c 75 6d 6e 20 6f 72 20 69 6e 64 65 78 20  column or index 
2dd90 63 61 6e 20 68 61 76 65 20 6d 75 6c 74 69 70 6c  can have multipl
2dda0 65 20 72 6f 77 73 20 74 68 61 74 20 0a 20 20 2a  e rows that .  *
2ddb0 2a 20 61 72 65 20 4e 55 4c 4c 20 61 6e 64 20 4e  * are NULL and N
2ddc0 55 4c 4c 20 76 61 6c 75 65 73 20 61 72 65 20 65  ULL values are e
2ddd0 71 75 69 76 61 6c 65 6e 74 20 66 6f 72 20 74 68  quivalent for th
2dde0 65 20 70 75 72 70 6f 73 65 20 6f 66 20 6f 72 64  e purpose of ord
2ddf0 65 72 2d 64 69 73 74 69 6e 63 74 2e 0a 20 20 2a  er-distinct..  *
2de00 2a 20 54 6f 20 62 65 20 6f 72 64 65 72 2d 64 69  * To be order-di
2de10 73 74 69 6e 63 74 2c 20 74 68 65 20 63 6f 6c 75  stinct, the colu
2de20 6d 6e 73 20 6d 75 73 74 20 62 65 20 55 4e 49 51  mns must be UNIQ
2de30 55 45 20 61 6e 64 20 4e 4f 54 20 4e 55 4c 4c 2e  UE and NOT NULL.
2de40 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 72  .  **.  ** The r
2de50 6f 77 69 64 20 66 6f 72 20 61 20 74 61 62 6c 65  owid for a table
2de60 20 69 73 20 61 6c 77 61 79 73 20 55 4e 49 51 55   is always UNIQU
2de70 45 20 61 6e 64 20 4e 4f 54 20 4e 55 4c 4c 20 73  E and NOT NULL s
2de80 6f 20 77 68 65 6e 65 76 65 72 20 74 68 65 0a 20  o whenever the. 
2de90 20 2a 2a 20 72 6f 77 69 64 20 61 70 70 65 61 72   ** rowid appear
2dea0 73 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42  s in the ORDER B
2deb0 59 20 63 6c 61 75 73 65 2c 20 74 68 65 20 63 6f  Y clause, the co
2dec0 72 72 65 73 70 6f 6e 64 69 6e 67 20 57 68 65 72  rresponding Wher
2ded0 65 4c 6f 6f 70 20 69 73 0a 20 20 2a 2a 20 61 75  eLoop is.  ** au
2dee0 74 6f 6d 61 74 69 63 61 6c 6c 79 20 6f 72 64 65  tomatically orde
2def0 72 2d 64 69 73 74 69 6e 63 74 2e 0a 20 20 2a 2f  r-distinct..  */
2df00 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f 72 64  ..  assert( pOrd
2df10 65 72 42 79 21 3d 30 20 29 3b 0a 20 20 69 66 28  erBy!=0 );.  if(
2df20 20 6e 4c 6f 6f 70 20 26 26 20 4f 70 74 69 6d 69   nLoop && Optimi
2df30 7a 61 74 69 6f 6e 44 69 73 61 62 6c 65 64 28 64  zationDisabled(d
2df40 62 2c 20 53 51 4c 49 54 45 5f 4f 72 64 65 72 42  b, SQLITE_OrderB
2df50 79 49 64 78 4a 6f 69 6e 29 20 29 20 72 65 74 75  yIdxJoin) ) retu
2df60 72 6e 20 30 3b 0a 0a 20 20 6e 4f 72 64 65 72 42  rn 0;..  nOrderB
2df70 79 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45  y = pOrderBy->nE
2df80 78 70 72 3b 0a 20 20 74 65 73 74 63 61 73 65 28  xpr;.  testcase(
2df90 20 6e 4f 72 64 65 72 42 79 3d 3d 42 4d 53 2d 31   nOrderBy==BMS-1
2dfa0 20 29 3b 0a 20 20 69 66 28 20 6e 4f 72 64 65 72   );.  if( nOrder
2dfb0 42 79 3e 42 4d 53 2d 31 20 29 20 72 65 74 75 72  By>BMS-1 ) retur
2dfc0 6e 20 30 3b 20 20 2f 2a 20 43 61 6e 6e 6f 74 20  n 0;  /* Cannot 
2dfd0 6f 70 74 69 6d 69 7a 65 20 6f 76 65 72 6c 79 20  optimize overly 
2dfe0 6c 61 72 67 65 20 4f 52 44 45 52 20 42 59 73 20  large ORDER BYs 
2dff0 2a 2f 0a 20 20 69 73 4f 72 64 65 72 44 69 73 74  */.  isOrderDist
2e000 69 6e 63 74 20 3d 20 31 3b 0a 20 20 6f 62 44 6f  inct = 1;.  obDo
2e010 6e 65 20 3d 20 4d 41 53 4b 42 49 54 28 6e 4f 72  ne = MASKBIT(nOr
2e020 64 65 72 42 79 29 2d 31 3b 0a 20 20 6f 72 64 65  derBy)-1;.  orde
2e030 72 44 69 73 74 69 6e 63 74 4d 61 73 6b 20 3d 20  rDistinctMask = 
2e040 30 3b 0a 20 20 72 65 61 64 79 20 3d 20 30 3b 0a  0;.  ready = 0;.
2e050 20 20 66 6f 72 28 69 4c 6f 6f 70 3d 30 3b 20 69    for(iLoop=0; i
2e060 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 26  sOrderDistinct &
2e070 26 20 6f 62 53 61 74 3c 6f 62 44 6f 6e 65 20 26  & obSat<obDone &
2e080 26 20 69 4c 6f 6f 70 3c 3d 6e 4c 6f 6f 70 3b 20  & iLoop<=nLoop; 
2e090 69 4c 6f 6f 70 2b 2b 29 7b 0a 20 20 20 20 69 66  iLoop++){.    if
2e0a0 28 20 69 4c 6f 6f 70 3e 30 20 29 20 72 65 61 64  ( iLoop>0 ) read
2e0b0 79 20 7c 3d 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b  y |= pLoop->mask
2e0c0 53 65 6c 66 3b 0a 20 20 20 20 70 4c 6f 6f 70 20  Self;.    pLoop 
2e0d0 3d 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70 20 3f 20  = iLoop<nLoop ? 
2e0e0 70 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b 69 4c 6f  pPath->aLoop[iLo
2e0f0 6f 70 5d 20 3a 20 70 4c 61 73 74 3b 0a 20 20 20  op] : pLast;.   
2e100 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c   if( pLoop->wsFl
2e110 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54  ags & WHERE_VIRT
2e120 55 41 4c 54 41 42 4c 45 20 29 7b 0a 20 20 20 20  UALTABLE ){.    
2e130 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 75 2e 76    if( pLoop->u.v
2e140 74 61 62 2e 69 73 4f 72 64 65 72 65 64 20 29 20  tab.isOrdered ) 
2e150 6f 62 53 61 74 20 3d 20 6f 62 44 6f 6e 65 3b 0a  obSat = obDone;.
2e160 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2e170 20 7d 0a 20 20 20 20 69 43 75 72 20 3d 20 70 57   }.    iCur = pW
2e180 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e  Info->pTabList->
2e190 61 5b 70 4c 6f 6f 70 2d 3e 69 54 61 62 5d 2e 69  a[pLoop->iTab].i
2e1a0 43 75 72 73 6f 72 3b 0a 0a 20 20 20 20 2f 2a 20  Cursor;..    /* 
2e1b0 4d 61 72 6b 20 6f 66 66 20 61 6e 79 20 4f 52 44  Mark off any ORD
2e1c0 45 52 20 42 59 20 74 65 72 6d 20 58 20 74 68 61  ER BY term X tha
2e1d0 74 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 69 6e  t is a column in
2e1e0 20 74 68 65 20 74 61 62 6c 65 20 6f 66 0a 20 20   the table of.  
2e1f0 20 20 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74    ** the current
2e200 20 6c 6f 6f 70 20 66 6f 72 20 77 68 69 63 68 20   loop for which 
2e210 74 68 65 72 65 20 69 73 20 74 65 72 6d 20 69 6e  there is term in
2e220 20 74 68 65 20 57 48 45 52 45 0a 20 20 20 20 2a   the WHERE.    *
2e230 2a 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  * clause of the 
2e240 66 6f 72 6d 20 58 20 49 53 20 4e 55 4c 4c 20 6f  form X IS NULL o
2e250 72 20 58 3d 3f 20 74 68 61 74 20 72 65 66 65 72  r X=? that refer
2e260 65 6e 63 65 20 6f 6e 6c 79 20 6f 75 74 65 72 0a  ence only outer.
2e270 20 20 20 20 2a 2a 20 6c 6f 6f 70 73 2e 0a 20 20      ** loops..  
2e280 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30    */.    for(i=0
2e290 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b  ; i<nOrderBy; i+
2e2a0 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 4d 41  +){.      if( MA
2e2b0 53 4b 42 49 54 28 69 29 20 26 20 6f 62 53 61 74  SKBIT(i) & obSat
2e2c0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
2e2d0 20 20 20 70 4f 42 45 78 70 72 20 3d 20 73 71 6c     pOBExpr = sql
2e2e0 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c  ite3ExprSkipColl
2e2f0 61 74 65 28 70 4f 72 64 65 72 42 79 2d 3e 61 5b  ate(pOrderBy->a[
2e300 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  i].pExpr);.     
2e310 20 69 66 28 20 70 4f 42 45 78 70 72 2d 3e 6f 70   if( pOBExpr->op
2e320 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 63 6f  !=TK_COLUMN ) co
2e330 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66  ntinue;.      if
2e340 28 20 70 4f 42 45 78 70 72 2d 3e 69 54 61 62 6c  ( pOBExpr->iTabl
2e350 65 21 3d 69 43 75 72 20 29 20 63 6f 6e 74 69 6e  e!=iCur ) contin
2e360 75 65 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20  ue;.      pTerm 
2e370 3d 20 66 69 6e 64 54 65 72 6d 28 26 70 57 49 6e  = findTerm(&pWIn
2e380 66 6f 2d 3e 73 57 43 2c 20 69 43 75 72 2c 20 70  fo->sWC, iCur, p
2e390 4f 42 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c  OBExpr->iColumn,
2e3a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2e3b0 20 20 20 20 20 20 20 20 7e 72 65 61 64 79 2c 20          ~ready, 
2e3c0 57 4f 5f 45 51 7c 57 4f 5f 49 53 4e 55 4c 4c 2c  WO_EQ|WO_ISNULL,
2e3d0 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70   0);.      if( p
2e3e0 54 65 72 6d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  Term==0 ) contin
2e3f0 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70  ue;.      if( (p
2e400 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 26  Term->eOperator&
2e410 57 4f 5f 45 51 29 21 3d 30 20 26 26 20 70 4f 42  WO_EQ)!=0 && pOB
2e420 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30  Expr->iColumn>=0
2e430 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73   ){.        cons
2e440 74 20 63 68 61 72 20 2a 7a 31 2c 20 2a 7a 32 3b  t char *z1, *z2;
2e450 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d  .        pColl =
2e460 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
2e470 53 65 71 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72  Seq(pWInfo->pPar
2e480 73 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  se, pOrderBy->a[
2e490 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  i].pExpr);.     
2e4a0 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 20     if( !pColl ) 
2e4b0 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c  pColl = db->pDfl
2e4c0 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 7a  tColl;.        z
2e4d0 31 20 3d 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  1 = pColl->zName
2e4e0 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20  ;.        pColl 
2e4f0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
2e500 6c 53 65 71 28 70 57 49 6e 66 6f 2d 3e 70 50 61  lSeq(pWInfo->pPa
2e510 72 73 65 2c 20 70 54 65 72 6d 2d 3e 70 45 78 70  rse, pTerm->pExp
2e520 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  r);.        if( 
2e530 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d  !pColl ) pColl =
2e540 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a   db->pDfltColl;.
2e550 20 20 20 20 20 20 20 20 7a 32 20 3d 20 70 43 6f          z2 = pCo
2e560 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  ll->zName;.     
2e570 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
2e580 72 49 43 6d 70 28 7a 31 2c 20 7a 32 29 21 3d 30  rICmp(z1, z2)!=0
2e590 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
2e5a0 20 20 20 7d 0a 20 20 20 20 20 20 6f 62 53 61 74     }.      obSat
2e5b0 20 7c 3d 20 4d 41 53 4b 42 49 54 28 69 29 3b 0a   |= MASKBIT(i);.
2e5c0 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 28      }..    if( (
2e5d0 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
2e5e0 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 29 3d 3d   WHERE_ONEROW)==
2e5f0 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  0 ){.      if( p
2e600 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
2e610 57 48 45 52 45 5f 49 50 4b 20 29 7b 0a 20 20 20  WHERE_IPK ){.   
2e620 20 20 20 20 20 70 49 6e 64 65 78 20 3d 20 30 3b       pIndex = 0;
2e630 0a 20 20 20 20 20 20 20 20 6e 4b 65 79 43 6f 6c  .        nKeyCol
2e640 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 6e 43   = 0;.        nC
2e650 6f 6c 75 6d 6e 20 3d 20 31 3b 0a 20 20 20 20 20  olumn = 1;.     
2e660 20 7d 65 6c 73 65 20 69 66 28 20 28 70 49 6e 64   }else if( (pInd
2e670 65 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  ex = pLoop->u.bt
2e680 72 65 65 2e 70 49 6e 64 65 78 29 3d 3d 30 20 7c  ree.pIndex)==0 |
2e690 7c 20 70 49 6e 64 65 78 2d 3e 62 55 6e 6f 72 64  | pIndex->bUnord
2e6a0 65 72 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20  ered ){.        
2e6b0 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
2e6c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6e  }else{.        n
2e6d0 4b 65 79 43 6f 6c 20 3d 20 70 49 6e 64 65 78 2d  KeyCol = pIndex-
2e6e0 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20 20 20 20 20  >nKeyCol;.      
2e6f0 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 70 49 6e 64    nColumn = pInd
2e700 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20  ex->nColumn;.   
2e710 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f       assert( nCo
2e720 6c 75 6d 6e 3d 3d 6e 4b 65 79 43 6f 6c 2b 31 20  lumn==nKeyCol+1 
2e730 7c 7c 20 21 48 61 73 52 6f 77 69 64 28 70 49 6e  || !HasRowid(pIn
2e740 64 65 78 2d 3e 70 54 61 62 6c 65 29 20 29 3b 0a  dex->pTable) );.
2e750 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2e760 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e  pIndex->aiColumn
2e770 5b 6e 43 6f 6c 75 6d 6e 2d 31 5d 3d 3d 28 2d 31  [nColumn-1]==(-1
2e780 29 20 7c 7c 20 21 48 61 73 52 6f 77 69 64 28 70  ) || !HasRowid(p
2e790 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 29 29 3b  Index->pTable));
2e7a0 0a 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72  .        isOrder
2e7b0 44 69 73 74 69 6e 63 74 20 3d 20 70 49 6e 64 65  Distinct = pInde
2e7c0 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e  x->onError!=OE_N
2e7d0 6f 6e 65 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  one;.      }..  
2e7e0 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f      /* Loop thro
2e7f0 75 67 68 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20  ugh all columns 
2e800 6f 66 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64  of the index and
2e810 20 64 65 61 6c 20 77 69 74 68 20 74 68 65 20 6f   deal with the o
2e820 6e 65 73 0a 20 20 20 20 20 20 2a 2a 20 74 68 61  nes.      ** tha
2e830 74 20 61 72 65 20 6e 6f 74 20 63 6f 6e 73 74 72  t are not constr
2e840 61 69 6e 65 64 20 62 79 20 3d 3d 20 6f 72 20 49  ained by == or I
2e850 4e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  N..      */.    
2e860 20 20 72 65 76 20 3d 20 72 65 76 53 65 74 20 3d    rev = revSet =
2e870 20 30 3b 0a 20 20 20 20 20 20 64 69 73 74 69 6e   0;.      distin
2e880 63 74 43 6f 6c 75 6d 6e 73 20 3d 20 30 3b 0a 20  ctColumns = 0;. 
2e890 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
2e8a0 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20  nColumn; j++){. 
2e8b0 20 20 20 20 20 20 20 75 38 20 62 4f 6e 63 65 3b         u8 bOnce;
2e8c0 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 72 75     /* True to ru
2e8d0 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 73  n the ORDER BY s
2e8e0 65 61 72 63 68 20 6c 6f 6f 70 20 2a 2f 0a 0a 20  earch loop */.. 
2e8f0 20 20 20 20 20 20 20 2f 2a 20 53 6b 69 70 20 6f         /* Skip o
2e900 76 65 72 20 3d 3d 20 61 6e 64 20 49 53 20 4e 55  ver == and IS NU
2e910 4c 4c 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20  LL terms */.    
2e920 20 20 20 20 69 66 28 20 6a 3c 70 4c 6f 6f 70 2d      if( j<pLoop-
2e930 3e 75 2e 62 74 72 65 65 2e 6e 45 71 0a 20 20 20  >u.btree.nEq.   
2e940 20 20 20 20 20 20 26 26 20 70 4c 6f 6f 70 2d 3e        && pLoop->
2e950 75 2e 62 74 72 65 65 2e 6e 53 6b 69 70 3d 3d 30  u.btree.nSkip==0
2e960 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 28 69  .         && ((i
2e970 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d   = pLoop->aLTerm
2e980 5b 6a 5d 2d 3e 65 4f 70 65 72 61 74 6f 72 29 20  [j]->eOperator) 
2e990 26 20 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 4e 55  & (WO_EQ|WO_ISNU
2e9a0 4c 4c 29 29 21 3d 30 0a 20 20 20 20 20 20 20 20  LL))!=0.        
2e9b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
2e9c0 20 69 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29   i & WO_ISNULL )
2e9d0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65  {.            te
2e9e0 73 74 63 61 73 65 28 20 69 73 4f 72 64 65 72 44  stcase( isOrderD
2e9f0 69 73 74 69 6e 63 74 20 29 3b 0a 20 20 20 20 20  istinct );.     
2ea00 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 44 69         isOrderDi
2ea10 73 74 69 6e 63 74 20 3d 20 30 3b 0a 20 20 20 20  stinct = 0;.    
2ea20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2ea30 20 20 63 6f 6e 74 69 6e 75 65 3b 20 20 0a 20 20    continue;  .  
2ea40 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
2ea50 20 2f 2a 20 47 65 74 20 74 68 65 20 63 6f 6c 75   /* Get the colu
2ea60 6d 6e 20 6e 75 6d 62 65 72 20 69 6e 20 74 68 65  mn number in the
2ea70 20 74 61 62 6c 65 20 28 69 43 6f 6c 75 6d 6e 29   table (iColumn)
2ea80 20 61 6e 64 20 73 6f 72 74 20 6f 72 64 65 72 0a   and sort order.
2ea90 20 20 20 20 20 20 20 20 2a 2a 20 28 72 65 76 49          ** (revI
2eaa0 64 78 29 20 66 6f 72 20 74 68 65 20 6a 2d 74 68  dx) for the j-th
2eab0 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69   column of the i
2eac0 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ndex..        */
2ead0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49 6e  .        if( pIn
2eae0 64 65 78 20 29 7b 0a 20 20 20 20 20 20 20 20 20  dex ){.         
2eaf0 20 69 43 6f 6c 75 6d 6e 20 3d 20 70 49 6e 64 65   iColumn = pInde
2eb00 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a  x->aiColumn[j];.
2eb10 20 20 20 20 20 20 20 20 20 20 72 65 76 49 64 78            revIdx
2eb20 20 3d 20 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74   = pIndex->aSort
2eb30 4f 72 64 65 72 5b 6a 5d 3b 0a 20 20 20 20 20 20  Order[j];.      
2eb40 20 20 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3d      if( iColumn=
2eb50 3d 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d  =pIndex->pTable-
2eb60 3e 69 50 4b 65 79 20 29 20 69 43 6f 6c 75 6d 6e  >iPKey ) iColumn
2eb70 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d   = -1;.        }
2eb80 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
2eb90 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20  iColumn = -1;.  
2eba0 20 20 20 20 20 20 20 20 72 65 76 49 64 78 20 3d          revIdx =
2ebb0 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20   0;.        }.. 
2ebc0 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 75 6e 63         /* An unc
2ebd0 6f 6e 73 74 72 61 69 6e 65 64 20 63 6f 6c 75 6d  onstrained colum
2ebe0 6e 20 74 68 61 74 20 6d 69 67 68 74 20 62 65 20  n that might be 
2ebf0 4e 55 4c 4c 20 6d 65 61 6e 73 20 74 68 61 74 20  NULL means that 
2ec00 74 68 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  this.        ** 
2ec10 57 68 65 72 65 4c 6f 6f 70 20 69 73 20 6e 6f 74  WhereLoop is not
2ec20 20 77 65 6c 6c 2d 6f 72 64 65 72 65 64 0a 20 20   well-ordered.  
2ec30 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
2ec40 20 69 66 28 20 69 73 4f 72 64 65 72 44 69 73 74   if( isOrderDist
2ec50 69 6e 63 74 0a 20 20 20 20 20 20 20 20 20 26 26  inct.         &&
2ec60 20 69 43 6f 6c 75 6d 6e 3e 3d 30 0a 20 20 20 20   iColumn>=0.    
2ec70 20 20 20 20 20 26 26 20 6a 3e 3d 70 4c 6f 6f 70       && j>=pLoop
2ec80 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 0a 20 20  ->u.btree.nEq.  
2ec90 20 20 20 20 20 20 20 26 26 20 70 49 6e 64 65 78         && pIndex
2eca0 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69  ->pTable->aCol[i
2ecb0 43 6f 6c 75 6d 6e 5d 2e 6e 6f 74 4e 75 6c 6c 3d  Column].notNull=
2ecc0 3d 30 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  =0.        ){.  
2ecd0 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 44          isOrderD
2ece0 69 73 74 69 6e 63 74 20 3d 20 30 3b 0a 20 20 20  istinct = 0;.   
2ecf0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
2ed00 2f 2a 20 46 69 6e 64 20 74 68 65 20 4f 52 44 45  /* Find the ORDE
2ed10 52 20 42 59 20 74 65 72 6d 20 74 68 61 74 20 63  R BY term that c
2ed20 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 74 68  orresponds to th
2ed30 65 20 6a 2d 74 68 20 63 6f 6c 75 6d 6e 0a 20 20  e j-th column.  
2ed40 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20        ** of the 
2ed50 69 6e 64 65 78 20 61 6e 64 20 6d 61 72 6b 20 74  index and mark t
2ed60 68 61 74 20 4f 52 44 45 52 20 42 59 20 74 65 72  hat ORDER BY ter
2ed70 6d 20 6f 66 66 20 0a 20 20 20 20 20 20 20 20 2a  m off .        *
2ed80 2f 0a 20 20 20 20 20 20 20 20 62 4f 6e 63 65 20  /.        bOnce 
2ed90 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 69 73 4d  = 1;.        isM
2eda0 61 74 63 68 20 3d 20 30 3b 0a 20 20 20 20 20 20  atch = 0;.      
2edb0 20 20 66 6f 72 28 69 3d 30 3b 20 62 4f 6e 63 65    for(i=0; bOnce
2edc0 20 26 26 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20   && i<nOrderBy; 
2edd0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
2ede0 69 66 28 20 4d 41 53 4b 42 49 54 28 69 29 20 26  if( MASKBIT(i) &
2edf0 20 6f 62 53 61 74 20 29 20 63 6f 6e 74 69 6e 75   obSat ) continu
2ee00 65 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 42  e;.          pOB
2ee10 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78  Expr = sqlite3Ex
2ee20 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4f  prSkipCollate(pO
2ee30 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78  rderBy->a[i].pEx
2ee40 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 74  pr);.          t
2ee50 65 73 74 63 61 73 65 28 20 77 63 74 72 6c 46 6c  estcase( wctrlFl
2ee60 61 67 73 20 26 20 57 48 45 52 45 5f 47 52 4f 55  ags & WHERE_GROU
2ee70 50 42 59 20 29 3b 0a 20 20 20 20 20 20 20 20 20  PBY );.         
2ee80 20 74 65 73 74 63 61 73 65 28 20 77 63 74 72 6c   testcase( wctrl
2ee90 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 44 49  Flags & WHERE_DI
2eea0 53 54 49 4e 43 54 42 59 20 29 3b 0a 20 20 20 20  STINCTBY );.    
2eeb0 20 20 20 20 20 20 69 66 28 20 28 77 63 74 72 6c        if( (wctrl
2eec0 46 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 47  Flags & (WHERE_G
2eed0 52 4f 55 50 42 59 7c 57 48 45 52 45 5f 44 49 53  ROUPBY|WHERE_DIS
2eee0 54 49 4e 43 54 42 59 29 29 3d 3d 30 20 29 20 62  TINCTBY))==0 ) b
2eef0 4f 6e 63 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Once = 0;.      
2ef00 20 20 20 20 69 66 28 20 70 4f 42 45 78 70 72 2d      if( pOBExpr-
2ef10 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op!=TK_COLUMN )
2ef20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
2ef30 20 20 20 20 20 69 66 28 20 70 4f 42 45 78 70 72       if( pOBExpr
2ef40 2d 3e 69 54 61 62 6c 65 21 3d 69 43 75 72 20 29  ->iTable!=iCur )
2ef50 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
2ef60 20 20 20 20 20 69 66 28 20 70 4f 42 45 78 70 72       if( pOBExpr
2ef70 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 75  ->iColumn!=iColu
2ef80 6d 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  mn ) continue;. 
2ef90 20 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f           if( iCo
2efa0 6c 75 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20 20 20  lumn>=0 ){.     
2efb0 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73         pColl = s
2efc0 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
2efd0 71 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65  q(pWInfo->pParse
2efe0 2c 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  , pOrderBy->a[i]
2eff0 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20  .pExpr);.       
2f000 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20       if( !pColl 
2f010 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44  ) pColl = db->pD
2f020 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20  fltColl;.       
2f030 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
2f040 53 74 72 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a  StrICmp(pColl->z
2f050 4e 61 6d 65 2c 20 70 49 6e 64 65 78 2d 3e 61 7a  Name, pIndex->az
2f060 43 6f 6c 6c 5b 6a 5d 29 21 3d 30 20 29 20 63 6f  Coll[j])!=0 ) co
2f070 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
2f080 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 73    }.          is
2f090 4d 61 74 63 68 20 3d 20 31 3b 0a 20 20 20 20 20  Match = 1;.     
2f0a0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2f0b0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
2f0c0 28 20 69 73 4d 61 74 63 68 20 26 26 20 28 70 57  ( isMatch && (pW
2f0d0 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
2f0e0 20 26 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59   & WHERE_GROUPBY
2f0f0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
2f100 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
2f110 68 65 20 73 6f 72 74 20 6f 72 64 65 72 20 69 73  he sort order is
2f120 20 63 6f 6d 70 61 74 69 62 6c 65 20 69 6e 20 61   compatible in a
2f130 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
2f140 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  e..          ** 
2f150 53 6f 72 74 20 6f 72 64 65 72 20 69 73 20 69 72  Sort order is ir
2f160 72 65 6c 65 76 61 6e 74 20 66 6f 72 20 61 20 47  relevant for a G
2f170 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e 20  ROUP BY clause. 
2f180 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
2f190 20 72 65 76 53 65 74 20 29 7b 0a 20 20 20 20 20   revSet ){.     
2f1a0 20 20 20 20 20 20 20 69 66 28 20 28 72 65 76 20         if( (rev 
2f1b0 5e 20 72 65 76 49 64 78 29 21 3d 70 4f 72 64 65  ^ revIdx)!=pOrde
2f1c0 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72  rBy->a[i].sortOr
2f1d0 64 65 72 20 29 20 69 73 4d 61 74 63 68 20 3d 20  der ) isMatch = 
2f1e0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  0;.          }el
2f1f0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
2f200 72 65 76 20 3d 20 72 65 76 49 64 78 20 5e 20 70  rev = revIdx ^ p
2f210 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f  OrderBy->a[i].so
2f220 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 20 20 20  rtOrder;.       
2f230 20 20 20 20 20 69 66 28 20 72 65 76 20 29 20 2a       if( rev ) *
2f240 70 52 65 76 4d 61 73 6b 20 7c 3d 20 4d 41 53 4b  pRevMask |= MASK
2f250 42 49 54 28 69 4c 6f 6f 70 29 3b 0a 20 20 20 20  BIT(iLoop);.    
2f260 20 20 20 20 20 20 20 20 72 65 76 53 65 74 20 3d          revSet =
2f270 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   1;.          }.
2f280 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2f290 20 20 69 66 28 20 69 73 4d 61 74 63 68 20 29 7b    if( isMatch ){
2f2a0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
2f2b0 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20  Column<0 ){.    
2f2c0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
2f2d0 28 20 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e  ( distinctColumn
2f2e0 73 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  s==0 );.        
2f2f0 20 20 20 20 64 69 73 74 69 6e 63 74 43 6f 6c 75      distinctColu
2f300 6d 6e 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  mns = 1;.       
2f310 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6f     }.          o
2f320 62 53 61 74 20 7c 3d 20 4d 41 53 4b 42 49 54 28  bSat |= MASKBIT(
2f330 69 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  i);.        }els
2f340 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e{.          /* 
2f350 4e 6f 20 6d 61 74 63 68 20 66 6f 75 6e 64 20 2a  No match found *
2f360 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
2f370 6a 3d 3d 30 20 7c 7c 20 6a 3c 6e 4b 65 79 43 6f  j==0 || j<nKeyCo
2f380 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  l ){.           
2f390 20 74 65 73 74 63 61 73 65 28 20 69 73 4f 72 64   testcase( isOrd
2f3a0 65 72 44 69 73 74 69 6e 63 74 21 3d 30 20 29 3b  erDistinct!=0 );
2f3b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f  .            isO
2f3c0 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20 30  rderDistinct = 0
2f3d0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2f3e0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
2f3f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
2f400 20 2f 2a 20 65 6e 64 20 4c 6f 6f 70 20 6f 76 65   /* end Loop ove
2f410 72 20 61 6c 6c 20 69 6e 64 65 78 20 63 6f 6c 75  r all index colu
2f420 6d 6e 73 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  mns */.      if(
2f430 20 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73   distinctColumns
2f440 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74   ){.        test
2f450 63 61 73 65 28 20 69 73 4f 72 64 65 72 44 69 73  case( isOrderDis
2f460 74 69 6e 63 74 3d 3d 30 20 29 3b 0a 20 20 20 20  tinct==0 );.    
2f470 20 20 20 20 69 73 4f 72 64 65 72 44 69 73 74 69      isOrderDisti
2f480 6e 63 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  nct = 1;.      }
2f490 0a 20 20 20 20 7d 20 2f 2a 20 65 6e 64 2d 69 66  .    } /* end-if
2f4a0 20 6e 6f 74 20 6f 6e 65 2d 72 6f 77 20 2a 2f 0a   not one-row */.
2f4b0 0a 20 20 20 20 2f 2a 20 4d 61 72 6b 20 6f 66 66  .    /* Mark off
2f4c0 20 61 6e 79 20 6f 74 68 65 72 20 4f 52 44 45 52   any other ORDER
2f4d0 20 42 59 20 74 65 72 6d 73 20 74 68 61 74 20 72   BY terms that r
2f4e0 65 66 65 72 65 6e 63 65 20 70 4c 6f 6f 70 20 2a  eference pLoop *
2f4f0 2f 0a 20 20 20 20 69 66 28 20 69 73 4f 72 64 65  /.    if( isOrde
2f500 72 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20  rDistinct ){.   
2f510 20 20 20 6f 72 64 65 72 44 69 73 74 69 6e 63 74     orderDistinct
2f520 4d 61 73 6b 20 7c 3d 20 70 4c 6f 6f 70 2d 3e 6d  Mask |= pLoop->m
2f530 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20 20 20 66  askSelf;.      f
2f540 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72  or(i=0; i<nOrder
2f550 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  By; i++){.      
2f560 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 20 20 20    Expr *p;.     
2f570 20 20 20 42 69 74 6d 61 73 6b 20 6d 54 65 72 6d     Bitmask mTerm
2f580 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 4d 41  ;.        if( MA
2f590 53 4b 42 49 54 28 69 29 20 26 20 6f 62 53 61 74  SKBIT(i) & obSat
2f5a0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
2f5b0 20 20 20 20 20 70 20 3d 20 70 4f 72 64 65 72 42       p = pOrderB
2f5c0 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  y->a[i].pExpr;. 
2f5d0 20 20 20 20 20 20 20 6d 54 65 72 6d 20 3d 20 65         mTerm = e
2f5e0 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 26 70  xprTableUsage(&p
2f5f0 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c  WInfo->sMaskSet,
2f600 70 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  p);.        if( 
2f610 6d 54 65 72 6d 3d 3d 30 20 26 26 20 21 73 71 6c  mTerm==0 && !sql
2f620 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
2f630 6e 74 28 70 29 20 29 20 63 6f 6e 74 69 6e 75 65  nt(p) ) continue
2f640 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 6d  ;.        if( (m
2f650 54 65 72 6d 26 7e 6f 72 64 65 72 44 69 73 74 69  Term&~orderDisti
2f660 6e 63 74 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20  nctMask)==0 ){. 
2f670 20 20 20 20 20 20 20 20 20 6f 62 53 61 74 20 7c           obSat |
2f680 3d 20 4d 41 53 4b 42 49 54 28 69 29 3b 0a 20 20  = MASKBIT(i);.  
2f690 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
2f6a0 20 20 20 20 7d 0a 20 20 7d 20 2f 2a 20 45 6e 64      }.  } /* End
2f6b0 20 74 68 65 20 6c 6f 6f 70 20 6f 76 65 72 20 61   the loop over a
2f6c0 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 73 20 66 72  ll WhereLoops fr
2f6d0 6f 6d 20 6f 75 74 65 72 2d 6d 6f 73 74 20 64 6f  om outer-most do
2f6e0 77 6e 20 74 6f 20 69 6e 6e 65 72 2d 6d 6f 73 74  wn to inner-most
2f6f0 20 2a 2f 0a 20 20 69 66 28 20 6f 62 53 61 74 3d   */.  if( obSat=
2f700 3d 6f 62 44 6f 6e 65 20 29 20 72 65 74 75 72 6e  =obDone ) return
2f710 20 28 69 38 29 6e 4f 72 64 65 72 42 79 3b 0a 20   (i8)nOrderBy;. 
2f720 20 69 66 28 20 21 69 73 4f 72 64 65 72 44 69 73   if( !isOrderDis
2f730 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 66 6f 72  tinct ){.    for
2f740 28 69 3d 6e 4f 72 64 65 72 42 79 2d 31 3b 20 69  (i=nOrderBy-1; i
2f750 3e 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20  >0; i--){.      
2f760 42 69 74 6d 61 73 6b 20 6d 20 3d 20 4d 41 53 4b  Bitmask m = MASK
2f770 42 49 54 28 69 29 20 2d 20 31 3b 0a 20 20 20 20  BIT(i) - 1;.    
2f780 20 20 69 66 28 20 28 6f 62 53 61 74 26 6d 29 3d    if( (obSat&m)=
2f790 3d 6d 20 29 20 72 65 74 75 72 6e 20 69 3b 0a 20  =m ) return i;. 
2f7a0 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
2f7b0 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
2f7c0 2d 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66  -1;.}.../*.** If
2f7d0 20 74 68 65 20 57 48 45 52 45 5f 47 52 4f 55 50   the WHERE_GROUP
2f7e0 42 59 20 66 6c 61 67 20 69 73 20 73 65 74 20 69  BY flag is set i
2f7f0 6e 20 74 68 65 20 6d 61 73 6b 20 70 61 73 73 65  n the mask passe
2f800 64 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72  d to sqlite3Wher
2f810 65 42 65 67 69 6e 28 29 2c 0a 2a 2a 20 74 68 65  eBegin(),.** the
2f820 20 70 6c 61 6e 6e 65 72 20 61 73 73 75 6d 65 73   planner assumes
2f830 20 74 68 61 74 20 74 68 65 20 73 70 65 63 69 66   that the specif
2f840 69 65 64 20 70 4f 72 64 65 72 42 79 20 6c 69 73  ied pOrderBy lis
2f850 74 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61 20  t is actually a 
2f860 47 52 4f 55 50 0a 2a 2a 20 42 59 20 63 6c 61 75  GROUP.** BY clau
2f870 73 65 20 2d 20 61 6e 64 20 73 6f 20 61 6e 79 20  se - and so any 
2f880 6f 72 64 65 72 20 74 68 61 74 20 67 72 6f 75 70  order that group
2f890 73 20 72 6f 77 73 20 61 73 20 72 65 71 75 69 72  s rows as requir
2f8a0 65 64 20 73 61 74 69 73 66 69 65 73 20 74 68 65  ed satisfies the
2f8b0 0a 2a 2a 20 72 65 71 75 65 73 74 2e 0a 2a 2a 0a  .** request..**.
2f8c0 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 6e 20  ** Normally, in 
2f8d0 74 68 69 73 20 63 61 73 65 20 69 74 20 69 73 20  this case it is 
2f8e0 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72  not possible for
2f8f0 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 64   the caller to d
2f900 65 74 65 72 6d 69 6e 65 0a 2a 2a 20 77 68 65 74  etermine.** whet
2f910 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 72  her or not the r
2f920 6f 77 73 20 61 72 65 20 72 65 61 6c 6c 79 20 62  ows are really b
2f930 65 69 6e 67 20 64 65 6c 69 76 65 72 65 64 20 69  eing delivered i
2f940 6e 20 73 6f 72 74 65 64 20 6f 72 64 65 72 2c 20  n sorted order, 
2f950 6f 72 0a 2a 2a 20 6a 75 73 74 20 69 6e 20 73 6f  or.** just in so
2f960 6d 65 20 6f 74 68 65 72 20 6f 72 64 65 72 20 74  me other order t
2f970 68 61 74 20 70 72 6f 76 69 64 65 73 20 74 68 65  hat provides the
2f980 20 72 65 71 75 69 72 65 64 20 67 72 6f 75 70 69   required groupi
2f990 6e 67 2e 20 48 6f 77 65 76 65 72 2c 0a 2a 2a 20  ng. However,.** 
2f9a0 69 66 20 74 68 65 20 57 48 45 52 45 5f 53 4f 52  if the WHERE_SOR
2f9b0 54 42 59 47 52 4f 55 50 20 66 6c 61 67 20 69 73  TBYGROUP flag is
2f9c0 20 61 6c 73 6f 20 70 61 73 73 65 64 20 74 6f 20   also passed to 
2f9d0 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
2f9e0 6e 28 29 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69  n(), then.** thi
2f9f0 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62  s function may b
2fa00 65 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20  e called on the 
2fa10 72 65 74 75 72 6e 65 64 20 57 68 65 72 65 49 6e  returned WhereIn
2fa20 66 6f 20 6f 62 6a 65 63 74 2e 20 49 74 20 72 65  fo object. It re
2fa30 74 75 72 6e 73 0a 2a 2a 20 74 72 75 65 20 69 66  turns.** true if
2fa40 20 74 68 65 20 72 6f 77 73 20 72 65 61 6c 6c 79   the rows really
2fa50 20 77 69 6c 6c 20 62 65 20 73 6f 72 74 65 64 20   will be sorted 
2fa60 69 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64  in the specified
2fa70 20 6f 72 64 65 72 2c 20 6f 72 20 66 61 6c 73 65   order, or false
2fa80 0a 2a 2a 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a  .** otherwise..*
2fa90 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65  *.** For example
2faa0 2c 20 61 73 73 75 6d 69 6e 67 3a 0a 2a 2a 0a 2a  , assuming:.**.*
2fab0 2a 20 20 20 43 52 45 41 54 45 20 49 4e 44 45 58  *   CREATE INDEX
2fac0 20 69 31 20 4f 4e 20 74 31 28 78 2c 20 59 29 3b   i1 ON t1(x, Y);
2fad0 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 0a 2a 2a 0a 2a  .**.** then.**.*
2fae0 2a 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  *   SELECT * FRO
2faf0 4d 20 74 31 20 47 52 4f 55 50 20 42 59 20 78 2c  M t1 GROUP BY x,
2fb00 79 20 4f 52 44 45 52 20 42 59 20 78 2c 79 3b 20  y ORDER BY x,y; 
2fb10 20 20 2d 2d 20 49 73 53 6f 72 74 65 64 28 29 3d    -- IsSorted()=
2fb20 3d 31 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a  =1.**   SELECT *
2fb30 20 46 52 4f 4d 20 74 31 20 47 52 4f 55 50 20 42   FROM t1 GROUP B
2fb40 59 20 79 2c 78 20 4f 52 44 45 52 20 42 59 20 79  Y y,x ORDER BY y
2fb50 2c 78 3b 20 20 20 2d 2d 20 49 73 53 6f 72 74 65  ,x;   -- IsSorte
2fb60 64 28 29 3d 3d 30 0a 2a 2f 0a 69 6e 74 20 73 71  d()==0.*/.int sq
2fb70 6c 69 74 65 33 57 68 65 72 65 49 73 53 6f 72 74  lite3WhereIsSort
2fb80 65 64 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  ed(WhereInfo *pW
2fb90 49 6e 66 6f 29 7b 0a 20 20 61 73 73 65 72 74 28  Info){.  assert(
2fba0 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c   pWInfo->wctrlFl
2fbb0 61 67 73 20 26 20 57 48 45 52 45 5f 47 52 4f 55  ags & WHERE_GROU
2fbc0 50 42 59 20 29 3b 0a 20 20 61 73 73 65 72 74 28  PBY );.  assert(
2fbd0 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c   pWInfo->wctrlFl
2fbe0 61 67 73 20 26 20 57 48 45 52 45 5f 53 4f 52 54  ags & WHERE_SORT
2fbf0 42 59 47 52 4f 55 50 20 29 3b 0a 20 20 72 65 74  BYGROUP );.  ret
2fc00 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 73 6f 72 74  urn pWInfo->sort
2fc10 65 64 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 57 48  ed;.}..#ifdef WH
2fc20 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
2fc30 0a 2f 2a 20 46 6f 72 20 64 65 62 75 67 67 69 6e  ./* For debuggin
2fc40 67 20 75 73 65 20 6f 6e 6c 79 3a 20 2a 2f 0a 73  g use only: */.s
2fc50 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
2fc60 20 2a 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28   *wherePathName(
2fc70 57 68 65 72 65 50 61 74 68 20 2a 70 50 61 74 68  WherePath *pPath
2fc80 2c 20 69 6e 74 20 6e 4c 6f 6f 70 2c 20 57 68 65  , int nLoop, Whe
2fc90 72 65 4c 6f 6f 70 20 2a 70 4c 61 73 74 29 7b 0a  reLoop *pLast){.
2fca0 20 20 73 74 61 74 69 63 20 63 68 61 72 20 7a 4e    static char zN
2fcb0 61 6d 65 5b 36 35 5d 3b 0a 20 20 69 6e 74 20 69  ame[65];.  int i
2fcc0 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
2fcd0 4c 6f 6f 70 3b 20 69 2b 2b 29 7b 20 7a 4e 61 6d  Loop; i++){ zNam
2fce0 65 5b 69 5d 20 3d 20 70 50 61 74 68 2d 3e 61 4c  e[i] = pPath->aL
2fcf0 6f 6f 70 5b 69 5d 2d 3e 63 49 64 3b 20 7d 0a 20  oop[i]->cId; }. 
2fd00 20 69 66 28 20 70 4c 61 73 74 20 29 20 7a 4e 61   if( pLast ) zNa
2fd10 6d 65 5b 69 2b 2b 5d 20 3d 20 70 4c 61 73 74 2d  me[i++] = pLast-
2fd20 3e 63 49 64 3b 0a 20 20 7a 4e 61 6d 65 5b 69 5d  >cId;.  zName[i]
2fd30 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 7a   = 0;.  return z
2fd40 4e 61 6d 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  Name;.}.#endif..
2fd50 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20  /*.** Given the 
2fd60 6c 69 73 74 20 6f 66 20 57 68 65 72 65 4c 6f 6f  list of WhereLoo
2fd70 70 20 6f 62 6a 65 63 74 73 20 61 74 20 70 57 49  p objects at pWI
2fd80 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 74 68 69  nfo->pLoops, thi
2fd90 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 74 74  s routine.** att
2fda0 65 6d 70 74 73 20 74 6f 20 66 69 6e 64 20 74 68  empts to find th
2fdb0 65 20 6c 6f 77 65 73 74 20 63 6f 73 74 20 70 61  e lowest cost pa
2fdc0 74 68 20 74 68 61 74 20 76 69 73 69 74 73 20 65  th that visits e
2fdd0 61 63 68 20 57 68 65 72 65 4c 6f 6f 70 0a 2a 2a  ach WhereLoop.**
2fde0 20 6f 6e 63 65 2e 20 20 54 68 69 73 20 70 61 74   once.  This pat
2fdf0 68 20 69 73 20 74 68 65 6e 20 6c 6f 61 64 65 64  h is then loaded
2fe00 20 69 6e 74 6f 20 74 68 65 20 70 57 49 6e 66 6f   into the pWInfo
2fe10 2d 3e 61 5b 5d 2e 70 57 4c 6f 6f 70 20 66 69 65  ->a[].pWLoop fie
2fe20 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 41 73 73 75 6d  lds..**.** Assum
2fe30 65 20 74 68 61 74 20 74 68 65 20 74 6f 74 61 6c  e that the total
2fe40 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75   number of outpu
2fe50 74 20 72 6f 77 73 20 74 68 61 74 20 77 69 6c 6c  t rows that will
2fe60 20 6e 65 65 64 20 74 6f 20 62 65 20 73 6f 72 74   need to be sort
2fe70 65 64 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 6e 52  ed.** will be nR
2fe80 6f 77 45 73 74 20 28 69 6e 20 74 68 65 20 31 30  owEst (in the 10
2fe90 2a 6c 6f 67 32 20 72 65 70 72 65 73 65 6e 74 61  *log2 representa
2fea0 74 69 6f 6e 29 2e 20 20 4f 72 2c 20 69 67 6e 6f  tion).  Or, igno
2feb0 72 65 20 73 6f 72 74 69 6e 67 0a 2a 2a 20 63 6f  re sorting.** co
2fec0 73 74 73 20 69 66 20 6e 52 6f 77 45 73 74 3d 3d  sts if nRowEst==
2fed0 30 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  0..**.** Return 
2fee0 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
2fef0 63 65 73 73 20 6f 72 20 53 51 4c 49 54 45 5f 4e  cess or SQLITE_N
2ff00 4f 4d 45 4d 20 6f 66 20 61 20 6d 65 6d 6f 72 79  OMEM of a memory
2ff10 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 65   allocation.** e
2ff20 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a  rror occurs..*/.
2ff30 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
2ff40 50 61 74 68 53 6f 6c 76 65 72 28 57 68 65 72 65  PathSolver(Where
2ff50 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 20 4c 6f  Info *pWInfo, Lo
2ff60 67 45 73 74 20 6e 52 6f 77 45 73 74 29 7b 0a 20  gEst nRowEst){. 
2ff70 20 69 6e 74 20 6d 78 43 68 6f 69 63 65 3b 20 20   int mxChoice;  
2ff80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
2ff90 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20  ximum number of 
2ffa0 73 69 6d 75 6c 74 61 6e 65 6f 75 73 20 70 61 74  simultaneous pat
2ffb0 68 73 20 74 72 61 63 6b 65 64 20 2a 2f 0a 20 20  hs tracked */.  
2ffc0 69 6e 74 20 6e 4c 6f 6f 70 3b 20 20 20 20 20 20  int nLoop;      
2ffd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
2ffe0 62 65 72 20 6f 66 20 74 65 72 6d 73 20 69 6e 20  ber of terms in 
2fff0 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20 50 61  the join */.  Pa
30000 72 73 65 20 2a 70 50 61 72 73 65 3b 20 20 20 20  rse *pParse;    
30010 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
30020 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
30030 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20  sqlite3 *db;    
30040 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
30050 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
30060 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 4c  tion */.  int iL
30070 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  oop;            
30080 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
30090 74 65 72 20 6f 76 65 72 20 74 68 65 20 74 65 72  ter over the ter
300a0 6d 73 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 2a  ms of the join *
300b0 2f 0a 20 20 69 6e 74 20 69 69 2c 20 6a 6a 3b 20  /.  int ii, jj; 
300c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
300d0 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a   Loop counters *
300e0 2f 0a 20 20 69 6e 74 20 6d 78 49 20 3d 20 30 3b  /.  int mxI = 0;
300f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
30100 20 49 6e 64 65 78 20 6f 66 20 6e 65 78 74 20 65   Index of next e
30110 6e 74 72 79 20 74 6f 20 72 65 70 6c 61 63 65 20  ntry to replace 
30120 2a 2f 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72 42  */.  int nOrderB
30130 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  y;             /
30140 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4f 52 44 45  * Number of ORDE
30150 52 20 42 59 20 63 6c 61 75 73 65 20 74 65 72 6d  R BY clause term
30160 73 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 72 43  s */.  LogEst rC
30170 6f 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ost;            
30180 20 2f 2a 20 43 6f 73 74 20 6f 66 20 61 20 70 61   /* Cost of a pa
30190 74 68 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 6e  th */.  LogEst n
301a0 4f 75 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  Out;            
301b0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f    /* Number of o
301c0 75 74 70 75 74 73 20 2a 2f 0a 20 20 4c 6f 67 45  utputs */.  LogE
301d0 73 74 20 6d 78 43 6f 73 74 20 3d 20 30 3b 20 20  st mxCost = 0;  
301e0 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d        /* Maximum
301f0 20 63 6f 73 74 20 6f 66 20 61 20 73 65 74 20 6f   cost of a set o
30200 66 20 70 61 74 68 73 20 2a 2f 0a 20 20 4c 6f 67  f paths */.  Log
30210 45 73 74 20 6d 78 4f 75 74 20 3d 20 30 3b 20 20  Est mxOut = 0;  
30220 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75         /* Maximu
30230 6d 20 6e 4f 75 74 20 76 61 6c 75 65 20 6f 6e 20  m nOut value on 
30240 74 68 65 20 73 65 74 20 6f 66 20 70 61 74 68 73  the set of paths
30250 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 6f 2c 20 6e   */.  int nTo, n
30260 46 72 6f 6d 3b 20 20 20 20 20 20 20 20 20 20 20  From;           
30270 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 76 61 6c  /* Number of val
30280 69 64 20 65 6e 74 72 69 65 73 20 69 6e 20 61 54  id entries in aT
30290 6f 5b 5d 20 61 6e 64 20 61 46 72 6f 6d 5b 5d 20  o[] and aFrom[] 
302a0 2a 2f 0a 20 20 57 68 65 72 65 50 61 74 68 20 2a  */.  WherePath *
302b0 61 46 72 6f 6d 3b 20 20 20 20 20 20 20 20 20 2f  aFrom;         /
302c0 2a 20 41 6c 6c 20 6e 46 72 6f 6d 20 70 61 74 68  * All nFrom path
302d0 73 20 61 74 20 74 68 65 20 70 72 65 76 69 6f 75  s at the previou
302e0 73 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 57 68 65  s level */.  Whe
302f0 72 65 50 61 74 68 20 2a 61 54 6f 3b 20 20 20 20  rePath *aTo;    
30300 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 54         /* The nT
30310 6f 20 62 65 73 74 20 70 61 74 68 73 20 61 74 20  o best paths at 
30320 74 68 65 20 63 75 72 72 65 6e 74 20 6c 65 76 65  the current leve
30330 6c 20 2a 2f 0a 20 20 57 68 65 72 65 50 61 74 68  l */.  WherePath
30340 20 2a 70 46 72 6f 6d 3b 20 20 20 20 20 20 20 20   *pFrom;        
30350 20 2f 2a 20 41 6e 20 65 6c 65 6d 65 6e 74 20 6f   /* An element o
30360 66 20 61 46 72 6f 6d 5b 5d 20 74 68 61 74 20 77  f aFrom[] that w
30370 65 20 61 72 65 20 77 6f 72 6b 69 6e 67 20 6f 6e  e are working on
30380 20 2a 2f 0a 20 20 57 68 65 72 65 50 61 74 68 20   */.  WherePath 
30390 2a 70 54 6f 3b 20 20 20 20 20 20 20 20 20 20 20  *pTo;           
303a0 2f 2a 20 41 6e 20 65 6c 65 6d 65 6e 74 20 6f 66  /* An element of
303b0 20 61 54 6f 5b 5d 20 74 68 61 74 20 77 65 20 61   aTo[] that we a
303c0 72 65 20 77 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f  re working on */
303d0 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 57  .  WhereLoop *pW
303e0 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 2f 2a 20  Loop;        /* 
303f0 4f 6e 65 20 6f 66 20 74 68 65 20 57 68 65 72 65  One of the Where
30400 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 2a 2f 0a  Loop objects */.
30410 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a 70 58    WhereLoop **pX
30420 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55  ;           /* U
30430 73 65 64 20 74 6f 20 64 69 76 79 20 75 70 20 74  sed to divy up t
30440 68 65 20 70 53 70 61 63 65 20 6d 65 6d 6f 72 79  he pSpace memory
30450 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70 53 70 61   */.  char *pSpa
30460 63 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ce;             
30470 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 6d 65 6d  /* Temporary mem
30480 6f 72 79 20 75 73 65 64 20 62 79 20 74 68 69 73  ory used by this
30490 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 0a 20 20 70   routine */..  p
304a0 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e  Parse = pWInfo->
304b0 70 50 61 72 73 65 3b 0a 20 20 64 62 20 3d 20 70  pParse;.  db = p
304c0 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 6e 4c 6f  Parse->db;.  nLo
304d0 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65  op = pWInfo->nLe
304e0 76 65 6c 3b 0a 20 20 2f 2a 20 54 55 4e 49 4e 47  vel;.  /* TUNING
304f0 3a 20 46 6f 72 20 73 69 6d 70 6c 65 20 71 75 65  : For simple que
30500 72 69 65 73 2c 20 6f 6e 6c 79 20 74 68 65 20 62  ries, only the b
30510 65 73 74 20 70 61 74 68 20 69 73 20 74 72 61 63  est path is trac
30520 6b 65 64 2e 0a 20 20 2a 2a 20 46 6f 72 20 32 2d  ked..  ** For 2-
30530 77 61 79 20 6a 6f 69 6e 73 2c 20 74 68 65 20 35  way joins, the 5
30540 20 62 65 73 74 20 70 61 74 68 73 20 61 72 65 20   best paths are 
30550 66 6f 6c 6c 6f 77 65 64 2e 0a 20 20 2a 2a 20 46  followed..  ** F
30560 6f 72 20 6a 6f 69 6e 73 20 6f 66 20 33 20 6f 72  or joins of 3 or
30570 20 6d 6f 72 65 20 74 61 62 6c 65 73 2c 20 74 72   more tables, tr
30580 61 63 6b 20 74 68 65 20 31 30 20 62 65 73 74 20  ack the 10 best 
30590 70 61 74 68 73 20 2a 2f 0a 20 20 6d 78 43 68 6f  paths */.  mxCho
305a0 69 63 65 20 3d 20 28 6e 4c 6f 6f 70 3c 3d 31 29  ice = (nLoop<=1)
305b0 20 3f 20 31 20 3a 20 28 6e 4c 6f 6f 70 3d 3d 32   ? 1 : (nLoop==2
305c0 20 3f 20 35 20 3a 20 31 30 29 3b 0a 20 20 61 73   ? 5 : 10);.  as
305d0 73 65 72 74 28 20 6e 4c 6f 6f 70 3c 3d 70 57 49  sert( nLoop<=pWI
305e0 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 6e  nfo->pTabList->n
305f0 53 72 63 20 29 3b 0a 20 20 57 48 45 52 45 54 52  Src );.  WHERETR
30600 41 43 45 28 30 78 30 30 32 2c 20 28 22 2d 2d 2d  ACE(0x002, ("---
30610 2d 20 62 65 67 69 6e 20 73 6f 6c 76 65 72 5c 6e  - begin solver\n
30620 22 29 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  "));..  /* Alloc
30630 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  ate and initiali
30640 7a 65 20 73 70 61 63 65 20 66 6f 72 20 61 54 6f  ze space for aTo
30650 20 61 6e 64 20 61 46 72 6f 6d 20 2a 2f 0a 20 20   and aFrom */.  
30660 69 69 20 3d 20 28 73 69 7a 65 6f 66 28 57 68 65  ii = (sizeof(Whe
30670 72 65 50 61 74 68 29 2b 73 69 7a 65 6f 66 28 57  rePath)+sizeof(W
30680 68 65 72 65 4c 6f 6f 70 2a 29 2a 6e 4c 6f 6f 70  hereLoop*)*nLoop
30690 29 2a 6d 78 43 68 6f 69 63 65 2a 32 3b 0a 20 20  )*mxChoice*2;.  
306a0 70 53 70 61 63 65 20 3d 20 73 71 6c 69 74 65 33  pSpace = sqlite3
306b0 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20  DbMallocRaw(db, 
306c0 69 69 29 3b 0a 20 20 69 66 28 20 70 53 70 61 63  ii);.  if( pSpac
306d0 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  e==0 ) return SQ
306e0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 61 54  LITE_NOMEM;.  aT
306f0 6f 20 3d 20 28 57 68 65 72 65 50 61 74 68 2a 29  o = (WherePath*)
30700 70 53 70 61 63 65 3b 0a 20 20 61 46 72 6f 6d 20  pSpace;.  aFrom 
30710 3d 20 61 54 6f 2b 6d 78 43 68 6f 69 63 65 3b 0a  = aTo+mxChoice;.
30720 20 20 6d 65 6d 73 65 74 28 61 46 72 6f 6d 2c 20    memset(aFrom, 
30730 30 2c 20 73 69 7a 65 6f 66 28 61 46 72 6f 6d 5b  0, sizeof(aFrom[
30740 30 5d 29 29 3b 0a 20 20 70 58 20 3d 20 28 57 68  0]));.  pX = (Wh
30750 65 72 65 4c 6f 6f 70 2a 2a 29 28 61 46 72 6f 6d  ereLoop**)(aFrom
30760 2b 6d 78 43 68 6f 69 63 65 29 3b 0a 20 20 66 6f  +mxChoice);.  fo
30770 72 28 69 69 3d 6d 78 43 68 6f 69 63 65 2a 32 2c  r(ii=mxChoice*2,
30780 20 70 46 72 6f 6d 3d 61 54 6f 3b 20 69 69 3e 30   pFrom=aTo; ii>0
30790 3b 20 69 69 2d 2d 2c 20 70 46 72 6f 6d 2b 2b 2c  ; ii--, pFrom++,
307a0 20 70 58 20 2b 3d 20 6e 4c 6f 6f 70 29 7b 0a 20   pX += nLoop){. 
307b0 20 20 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 20     pFrom->aLoop 
307c0 3d 20 70 58 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  = pX;.  }..  /* 
307d0 53 65 65 64 20 74 68 65 20 73 65 61 72 63 68 20  Seed the search 
307e0 77 69 74 68 20 61 20 73 69 6e 67 6c 65 20 57 68  with a single Wh
307f0 65 72 65 50 61 74 68 20 63 6f 6e 74 61 69 6e 69  erePath containi
30800 6e 67 20 7a 65 72 6f 20 57 68 65 72 65 4c 6f 6f  ng zero WhereLoo
30810 70 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 55  ps..  **.  ** TU
30820 4e 49 4e 47 3a 20 44 6f 20 6e 6f 74 20 6c 65 74  NING: Do not let
30830 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 69   the number of i
30840 74 65 72 61 74 69 6f 6e 73 20 67 6f 20 61 62 6f  terations go abo
30850 76 65 20 32 35 2e 20 20 49 66 20 74 68 65 20 63  ve 25.  If the c
30860 6f 73 74 0a 20 20 2a 2a 20 6f 66 20 63 6f 6d 70  ost.  ** of comp
30870 75 74 69 6e 67 20 61 6e 20 61 75 74 6f 6d 61 74  uting an automat
30880 69 63 20 69 6e 64 65 78 20 69 73 20 6e 6f 74 20  ic index is not 
30890 70 61 69 64 20 62 61 63 6b 20 77 69 74 68 69 6e  paid back within
308a0 20 74 68 65 20 66 69 72 73 74 20 32 35 0a 20 20   the first 25.  
308b0 2a 2a 20 72 6f 77 73 2c 20 74 68 65 6e 20 64 6f  ** rows, then do
308c0 20 6e 6f 74 20 75 73 65 20 74 68 65 20 61 75 74   not use the aut
308d0 6f 6d 61 74 69 63 20 69 6e 64 65 78 2e 20 2a 2f  omatic index. */
308e0 0a 20 20 61 46 72 6f 6d 5b 30 5d 2e 6e 52 6f 77  .  aFrom[0].nRow
308f0 20 3d 20 4d 49 4e 28 70 50 61 72 73 65 2d 3e 6e   = MIN(pParse->n
30900 51 75 65 72 79 4c 6f 6f 70 2c 20 34 36 29 3b 20  QueryLoop, 46); 
30910 20 61 73 73 65 72 74 28 20 34 36 3d 3d 73 71 6c   assert( 46==sql
30920 69 74 65 33 4c 6f 67 45 73 74 28 32 35 29 20 29  ite3LogEst(25) )
30930 3b 0a 20 20 6e 46 72 6f 6d 20 3d 20 31 3b 0a 0a  ;.  nFrom = 1;..
30940 20 20 2f 2a 20 50 72 65 63 6f 6d 70 75 74 65 20    /* Precompute 
30950 74 68 65 20 63 6f 73 74 20 6f 66 20 73 6f 72 74  the cost of sort
30960 69 6e 67 20 74 68 65 20 66 69 6e 61 6c 20 72 65  ing the final re
30970 73 75 6c 74 20 73 65 74 2c 20 69 66 20 74 68 65  sult set, if the
30980 20 63 61 6c 6c 65 72 0a 20 20 2a 2a 20 74 6f 20   caller.  ** to 
30990 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
309a0 6e 28 29 20 77 61 73 20 63 6f 6e 63 65 72 6e 65  n() was concerne
309b0 64 20 61 62 6f 75 74 20 73 6f 72 74 69 6e 67 20  d about sorting 
309c0 2a 2f 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 2d  */.  if( pWInfo-
309d0 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20  >pOrderBy==0 || 
309e0 6e 52 6f 77 45 73 74 3d 3d 30 20 29 7b 0a 20 20  nRowEst==0 ){.  
309f0 20 20 61 46 72 6f 6d 5b 30 5d 2e 69 73 4f 72 64    aFrom[0].isOrd
30a00 65 72 65 64 20 3d 20 30 3b 0a 20 20 20 20 6e 4f  ered = 0;.    nO
30a10 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 7d 65  rderBy = 0;.  }e
30a20 6c 73 65 7b 0a 20 20 20 20 61 46 72 6f 6d 5b 30  lse{.    aFrom[0
30a30 5d 2e 69 73 4f 72 64 65 72 65 64 20 3d 20 6e 4c  ].isOrdered = nL
30a40 6f 6f 70 3e 30 20 3f 20 2d 31 20 3a 20 31 3b 0a  oop>0 ? -1 : 1;.
30a50 20 20 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 70      nOrderBy = p
30a60 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2d  WInfo->pOrderBy-
30a70 3e 6e 45 78 70 72 3b 0a 20 20 7d 0a 0a 20 20 2f  >nExpr;.  }..  /
30a80 2a 20 43 6f 6d 70 75 74 65 20 73 75 63 63 65 73  * Compute succes
30a90 73 69 76 65 6c 79 20 6c 6f 6e 67 65 72 20 57 68  sively longer Wh
30aa0 65 72 65 50 61 74 68 73 20 75 73 69 6e 67 20 74  erePaths using t
30ab0 68 65 20 70 72 65 76 69 6f 75 73 20 67 65 6e 65  he previous gene
30ac0 72 61 74 69 6f 6e 0a 20 20 2a 2a 20 6f 66 20 57  ration.  ** of W
30ad0 68 65 72 65 50 61 74 68 73 20 61 73 20 74 68 65  herePaths as the
30ae0 20 62 61 73 69 73 20 66 6f 72 20 74 68 65 20 6e   basis for the n
30af0 65 78 74 2e 20 20 4b 65 65 70 20 74 72 61 63 6b  ext.  Keep track
30b00 20 6f 66 20 74 68 65 20 6d 78 43 68 6f 69 63 65   of the mxChoice
30b10 0a 20 20 2a 2a 20 62 65 73 74 20 70 61 74 68 73  .  ** best paths
30b20 20 61 74 20 65 61 63 68 20 67 65 6e 65 72 61 74   at each generat
30b30 69 6f 6e 20 2a 2f 0a 20 20 66 6f 72 28 69 4c 6f  ion */.  for(iLo
30b40 6f 70 3d 30 3b 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f  op=0; iLoop<nLoo
30b50 70 3b 20 69 4c 6f 6f 70 2b 2b 29 7b 0a 20 20 20  p; iLoop++){.   
30b60 20 6e 54 6f 20 3d 20 30 3b 0a 20 20 20 20 66 6f   nTo = 0;.    fo
30b70 72 28 69 69 3d 30 2c 20 70 46 72 6f 6d 3d 61 46  r(ii=0, pFrom=aF
30b80 72 6f 6d 3b 20 69 69 3c 6e 46 72 6f 6d 3b 20 69  rom; ii<nFrom; i
30b90 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20  i++, pFrom++){. 
30ba0 20 20 20 20 20 66 6f 72 28 70 57 4c 6f 6f 70 3d       for(pWLoop=
30bb0 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 3b 20  pWInfo->pLoops; 
30bc0 70 57 4c 6f 6f 70 3b 20 70 57 4c 6f 6f 70 3d 70  pWLoop; pWLoop=p
30bd0 57 4c 6f 6f 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70  WLoop->pNextLoop
30be0 29 7b 0a 20 20 20 20 20 20 20 20 42 69 74 6d 61  ){.        Bitma
30bf0 73 6b 20 6d 61 73 6b 4e 65 77 3b 0a 20 20 20 20  sk maskNew;.    
30c00 20 20 20 20 42 69 74 6d 61 73 6b 20 72 65 76 4d      Bitmask revM
30c10 61 73 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ask = 0;.       
30c20 20 69 38 20 69 73 4f 72 64 65 72 65 64 20 3d 20   i8 isOrdered = 
30c30 70 46 72 6f 6d 2d 3e 69 73 4f 72 64 65 72 65 64  pFrom->isOrdered
30c40 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70  ;.        if( (p
30c50 57 4c 6f 6f 70 2d 3e 70 72 65 72 65 71 20 26 20  WLoop->prereq & 
30c60 7e 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70  ~pFrom->maskLoop
30c70 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  )!=0 ) continue;
30c80 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70 57  .        if( (pW
30c90 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 20 26  Loop->maskSelf &
30ca0 20 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70   pFrom->maskLoop
30cb0 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  )!=0 ) continue;
30cc0 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 74 20 74  .        /* At t
30cd0 68 69 73 20 70 6f 69 6e 74 2c 20 70 57 4c 6f 6f  his point, pWLoo
30ce0 70 20 69 73 20 61 20 63 61 6e 64 69 64 61 74 65  p is a candidate
30cf0 20 74 6f 20 62 65 20 74 68 65 20 6e 65 78 74 20   to be the next 
30d00 6c 6f 6f 70 2e 20 0a 20 20 20 20 20 20 20 20 2a  loop. .        *
30d10 2a 20 43 6f 6d 70 75 74 65 20 69 74 73 20 63 6f  * Compute its co
30d20 73 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 43  st */.        rC
30d30 6f 73 74 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  ost = sqlite3Log
30d40 45 73 74 41 64 64 28 70 57 4c 6f 6f 70 2d 3e 72  EstAdd(pWLoop->r
30d50 53 65 74 75 70 2c 70 57 4c 6f 6f 70 2d 3e 72 52  Setup,pWLoop->rR
30d60 75 6e 20 2b 20 70 46 72 6f 6d 2d 3e 6e 52 6f 77  un + pFrom->nRow
30d70 29 3b 0a 20 20 20 20 20 20 20 20 72 43 6f 73 74  );.        rCost
30d80 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
30d90 41 64 64 28 72 43 6f 73 74 2c 20 70 46 72 6f 6d  Add(rCost, pFrom
30da0 2d 3e 72 43 6f 73 74 29 3b 0a 20 20 20 20 20 20  ->rCost);.      
30db0 20 20 6e 4f 75 74 20 3d 20 70 46 72 6f 6d 2d 3e    nOut = pFrom->
30dc0 6e 52 6f 77 20 2b 20 70 57 4c 6f 6f 70 2d 3e 6e  nRow + pWLoop->n
30dd0 4f 75 74 3b 0a 20 20 20 20 20 20 20 20 6d 61 73  Out;.        mas
30de0 6b 4e 65 77 20 3d 20 70 46 72 6f 6d 2d 3e 6d 61  kNew = pFrom->ma
30df0 73 6b 4c 6f 6f 70 20 7c 20 70 57 4c 6f 6f 70 2d  skLoop | pWLoop-
30e00 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20 20  >maskSelf;.     
30e10 20 20 20 69 66 28 20 69 73 4f 72 64 65 72 65 64     if( isOrdered
30e20 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <0 ){.          
30e30 69 73 4f 72 64 65 72 65 64 20 3d 20 77 68 65 72  isOrdered = wher
30e40 65 50 61 74 68 53 61 74 69 73 66 69 65 73 4f 72  ePathSatisfiesOr
30e50 64 65 72 42 79 28 70 57 49 6e 66 6f 2c 0a 20 20  derBy(pWInfo,.  
30e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30e70 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 70 4f 72       pWInfo->pOr
30e80 64 65 72 42 79 2c 20 70 46 72 6f 6d 2c 20 70 57  derBy, pFrom, pW
30e90 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
30ea0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
30eb0 20 20 20 20 20 20 20 20 20 69 4c 6f 6f 70 2c 20           iLoop, 
30ec0 70 57 4c 6f 6f 70 2c 20 26 72 65 76 4d 61 73 6b  pWLoop, &revMask
30ed0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
30ee0 20 69 73 4f 72 64 65 72 65 64 3e 3d 30 20 26 26   isOrdered>=0 &&
30ef0 20 69 73 4f 72 64 65 72 65 64 3c 6e 4f 72 64 65   isOrdered<nOrde
30f00 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20  rBy ){.         
30f10 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 45 73     /* TUNING: Es
30f20 74 69 6d 61 74 65 64 20 63 6f 73 74 20 6f 66 20  timated cost of 
30f30 61 20 66 75 6c 6c 20 65 78 74 65 72 6e 61 6c 20  a full external 
30f40 73 6f 72 74 2c 20 77 68 65 72 65 20 4e 20 69 73  sort, where N is
30f50 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a   .            **
30f60 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
30f70 6f 77 73 20 74 6f 20 73 6f 72 74 20 69 73 3a 0a  ows to sort is:.
30f80 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 0a 20              **. 
30f90 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 20 20             **   
30fa0 63 6f 73 74 20 3d 20 28 33 2e 30 20 2a 20 4e 20  cost = (3.0 * N 
30fb0 2a 20 6c 6f 67 28 4e 29 29 2e 0a 20 20 20 20 20  * log(N))..     
30fc0 20 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20         ** .     
30fd0 20 20 20 20 20 20 20 2a 2a 20 4f 72 2c 20 69 66         ** Or, if
30fe0 20 74 68 65 20 6f 72 64 65 72 2d 62 79 20 63 6c   the order-by cl
30ff0 61 75 73 65 20 68 61 73 20 58 20 74 65 72 6d 73  ause has X terms
31000 20 62 75 74 20 6f 6e 6c 79 20 74 68 65 20 6c 61   but only the la
31010 73 74 20 59 20 0a 20 20 20 20 20 20 20 20 20 20  st Y .          
31020 20 20 2a 2a 20 74 65 72 6d 73 20 61 72 65 20 6f    ** terms are o
31030 75 74 20 6f 66 20 6f 72 64 65 72 2c 20 74 68 65  ut of order, the
31040 6e 20 62 6c 6f 63 6b 2d 73 6f 72 74 69 6e 67 20  n block-sorting 
31050 77 69 6c 6c 20 72 65 64 75 63 65 20 74 68 65 20  will reduce the 
31060 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
31070 73 6f 72 74 69 6e 67 20 63 6f 73 74 20 74 6f 3a  sorting cost to:
31080 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 0a  .            **.
31090 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 20              **  
310a0 20 63 6f 73 74 20 3d 20 28 33 2e 30 20 2a 20 4e   cost = (3.0 * N
310b0 20 2a 20 6c 6f 67 28 4e 29 29 20 2a 20 28 59 2f   * log(N)) * (Y/
310c0 58 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  X).            *
310d0 2a 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  *.            **
310e0 20 54 68 65 20 28 59 2f 58 29 20 74 65 72 6d 20   The (Y/X) term 
310f0 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 75  is implemented u
31100 73 69 6e 67 20 73 74 61 63 6b 20 76 61 72 69 61  sing stack varia
31110 62 6c 65 20 72 53 63 61 6c 65 0a 20 20 20 20 20  ble rScale.     
31120 20 20 20 20 20 20 20 2a 2a 20 62 65 6c 6f 77 2e         ** below.
31130 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20    */.           
31140 20 4c 6f 67 45 73 74 20 72 53 63 61 6c 65 2c 20   LogEst rScale, 
31150 72 53 6f 72 74 43 6f 73 74 3b 0a 20 20 20 20 20  rSortCost;.     
31160 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e         assert( n
31170 4f 72 64 65 72 42 79 3e 30 20 26 26 20 36 36 3d  OrderBy>0 && 66=
31180 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31  =sqlite3LogEst(1
31190 30 30 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20  00) );.         
311a0 20 20 20 72 53 63 61 6c 65 20 3d 20 73 71 6c 69     rScale = sqli
311b0 74 65 33 4c 6f 67 45 73 74 28 28 6e 4f 72 64 65  te3LogEst((nOrde
311c0 72 42 79 2d 69 73 4f 72 64 65 72 65 64 29 2a 31  rBy-isOrdered)*1
311d0 30 30 2f 6e 4f 72 64 65 72 42 79 29 20 2d 20 36  00/nOrderBy) - 6
311e0 36 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  6;.            r
311f0 53 6f 72 74 43 6f 73 74 20 3d 20 6e 52 6f 77 45  SortCost = nRowE
31200 73 74 20 2b 20 65 73 74 4c 6f 67 28 6e 52 6f 77  st + estLog(nRow
31210 45 73 74 29 20 2b 20 72 53 63 61 6c 65 20 2b 20  Est) + rScale + 
31220 31 36 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20  16;..           
31230 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 54 68 65 20   /* TUNING: The 
31240 63 6f 73 74 20 6f 66 20 69 6d 70 6c 65 6d 65 6e  cost of implemen
31250 74 69 6e 67 20 44 49 53 54 49 4e 43 54 20 75 73  ting DISTINCT us
31260 69 6e 67 20 61 20 42 2d 54 52 45 45 20 69 73 0a  ing a B-TREE is.
31270 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73              ** s
31280 69 6d 69 6c 61 72 20 62 75 74 20 77 69 74 68 20  imilar but with 
31290 61 20 6c 61 72 67 65 72 20 63 6f 6e 73 74 61 6e  a larger constan
312a0 74 20 6f 66 20 70 72 6f 70 6f 72 74 69 6f 6e 61  t of proportiona
312b0 6c 69 74 79 2e 20 0a 20 20 20 20 20 20 20 20 20  lity. .         
312c0 20 20 20 2a 2a 20 4d 75 6c 74 69 70 6c 79 20 62     ** Multiply b
312d0 79 20 61 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20  y an additional 
312e0 66 61 63 74 6f 72 20 6f 66 20 33 2e 30 2e 20 20  factor of 3.0.  
312f0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  */.            i
31300 66 28 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  f( pWInfo->wctrl
31310 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 57 41  Flags & WHERE_WA
31320 4e 54 5f 44 49 53 54 49 4e 43 54 20 29 7b 0a 20  NT_DISTINCT ){. 
31330 20 20 20 20 20 20 20 20 20 20 20 20 20 72 53 6f               rSo
31340 72 74 43 6f 73 74 20 2b 3d 20 31 36 3b 0a 20 20  rtCost += 16;.  
31350 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
31360 20 20 20 20 20 20 20 20 57 48 45 52 45 54 52 41          WHERETRA
31370 43 45 28 30 78 30 30 32 2c 0a 20 20 20 20 20 20  CE(0x002,.      
31380 20 20 20 20 20 20 20 20 20 28 22 2d 2d 2d 2d 20           ("---- 
31390 73 6f 72 74 20 63 6f 73 74 3d 25 2d 33 64 20 28  sort cost=%-3d (
313a0 25 64 2f 25 64 29 20 69 6e 63 72 65 61 73 65 73  %d/%d) increases
313b0 20 63 6f 73 74 20 25 33 64 20 74 6f 20 25 2d 33   cost %3d to %-3
313c0 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
313d0 20 20 20 20 20 20 72 53 6f 72 74 43 6f 73 74 2c        rSortCost,
313e0 20 28 6e 4f 72 64 65 72 42 79 2d 69 73 4f 72 64   (nOrderBy-isOrd
313f0 65 72 65 64 29 2c 20 6e 4f 72 64 65 72 42 79 2c  ered), nOrderBy,
31400 20 72 43 6f 73 74 2c 0a 20 20 20 20 20 20 20 20   rCost,.        
31410 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4c          sqlite3L
31420 6f 67 45 73 74 41 64 64 28 72 43 6f 73 74 2c 72  ogEstAdd(rCost,r
31430 53 6f 72 74 43 6f 73 74 29 29 29 3b 0a 20 20 20  SortCost)));.   
31440 20 20 20 20 20 20 20 20 20 72 43 6f 73 74 20 3d           rCost =
31450 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64   sqlite3LogEstAd
31460 64 28 72 43 6f 73 74 2c 20 72 53 6f 72 74 43 6f  d(rCost, rSortCo
31470 73 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  st);.          }
31480 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
31490 20 20 20 20 20 20 20 20 20 20 72 65 76 4d 61 73            revMas
314a0 6b 20 3d 20 70 46 72 6f 6d 2d 3e 72 65 76 4c 6f  k = pFrom->revLo
314b0 6f 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  op;.        }.  
314c0 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74        /* Check t
314d0 6f 20 73 65 65 20 69 66 20 70 57 4c 6f 6f 70 20  o see if pWLoop 
314e0 73 68 6f 75 6c 64 20 62 65 20 61 64 64 65 64 20  should be added 
314f0 74 6f 20 74 68 65 20 6d 78 43 68 6f 69 63 65 20  to the mxChoice 
31500 62 65 73 74 20 73 6f 20 66 61 72 20 2a 2f 0a 20  best so far */. 
31510 20 20 20 20 20 20 20 66 6f 72 28 6a 6a 3d 30 2c         for(jj=0,
31520 20 70 54 6f 3d 61 54 6f 3b 20 6a 6a 3c 6e 54 6f   pTo=aTo; jj<nTo
31530 3b 20 6a 6a 2b 2b 2c 20 70 54 6f 2b 2b 29 7b 0a  ; jj++, pTo++){.
31540 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 54            if( pT
31550 6f 2d 3e 6d 61 73 6b 4c 6f 6f 70 3d 3d 6d 61 73  o->maskLoop==mas
31560 6b 4e 65 77 0a 20 20 20 20 20 20 20 20 20 20 20  kNew.           
31570 26 26 20 28 28 70 54 6f 2d 3e 69 73 4f 72 64 65  && ((pTo->isOrde
31580 72 65 64 5e 69 73 4f 72 64 65 72 65 64 29 26 38  red^isOrdered)&8
31590 30 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20  0)==0.          
315a0 20 26 26 20 28 28 70 54 6f 2d 3e 72 43 6f 73 74   && ((pTo->rCost
315b0 3c 3d 72 43 6f 73 74 20 26 26 20 70 54 6f 2d 3e  <=rCost && pTo->
315c0 6e 52 6f 77 3c 3d 6e 4f 75 74 29 20 7c 7c 0a 20  nRow<=nOut) ||. 
315d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
315e0 70 54 6f 2d 3e 72 43 6f 73 74 3e 3d 72 43 6f 73  pTo->rCost>=rCos
315f0 74 20 26 26 20 70 54 6f 2d 3e 6e 52 6f 77 3e 3d  t && pTo->nRow>=
31600 6e 4f 75 74 29 29 0a 20 20 20 20 20 20 20 20 20  nOut)).         
31610 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
31620 74 65 73 74 63 61 73 65 28 20 6a 6a 3d 3d 6e 54  testcase( jj==nT
31630 6f 2d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20  o-1 );.         
31640 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
31650 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
31660 20 20 20 20 20 20 20 20 69 66 28 20 6a 6a 3e 3d          if( jj>=
31670 6e 54 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20  nTo ){.         
31680 20 69 66 28 20 6e 54 6f 3e 3d 6d 78 43 68 6f 69   if( nTo>=mxChoi
31690 63 65 20 26 26 20 72 43 6f 73 74 3e 3d 6d 78 43  ce && rCost>=mxC
316a0 6f 73 74 20 29 7b 0a 23 69 66 64 65 66 20 57 48  ost ){.#ifdef WH
316b0 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
316c0 20 2f 2a 20 30 78 34 20 2a 2f 0a 20 20 20 20 20   /* 0x4 */.     
316d0 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
316e0 65 33 57 68 65 72 65 54 72 61 63 65 26 30 78 34  e3WhereTrace&0x4
316f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
31700 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
31710 69 6e 74 66 28 22 53 6b 69 70 20 20 20 25 73 20  intf("Skip   %s 
31720 63 6f 73 74 3d 25 2d 33 64 2c 25 33 64 20 6f 72  cost=%-3d,%3d or
31730 64 65 72 3d 25 63 5c 6e 22 2c 0a 20 20 20 20 20  der=%c\n",.     
31740 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65               whe
31750 72 65 50 61 74 68 4e 61 6d 65 28 70 46 72 6f 6d  rePathName(pFrom
31760 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29  , iLoop, pWLoop)
31770 2c 20 72 43 6f 73 74 2c 20 6e 4f 75 74 2c 0a 20  , rCost, nOut,. 
31780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31790 20 69 73 4f 72 64 65 72 65 64 3e 3d 30 20 3f 20   isOrdered>=0 ? 
317a0 69 73 4f 72 64 65 72 65 64 2b 27 30 27 20 3a 20  isOrdered+'0' : 
317b0 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20  '?');.          
317c0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
317d0 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
317e0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
317f0 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 61 20         /* Add a 
31800 6e 65 77 20 50 61 74 68 20 74 6f 20 74 68 65 20  new Path to the 
31810 61 54 6f 5b 5d 20 73 65 74 20 2a 2f 0a 20 20 20  aTo[] set */.   
31820 20 20 20 20 20 20 20 69 66 28 20 6e 54 6f 3c 6d         if( nTo<m
31830 78 43 68 6f 69 63 65 20 29 7b 0a 20 20 20 20 20  xChoice ){.     
31840 20 20 20 20 20 20 20 2f 2a 20 49 6e 63 72 65 61         /* Increa
31850 73 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  se the size of t
31860 68 65 20 61 54 6f 20 73 65 74 20 62 79 20 6f 6e  he aTo set by on
31870 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  e */.           
31880 20 6a 6a 20 3d 20 6e 54 6f 2b 2b 3b 0a 20 20 20   jj = nTo++;.   
31890 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
318a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77            /* New
318b0 20 70 61 74 68 20 72 65 70 6c 61 63 65 73 20 74   path replaces t
318c0 68 65 20 70 72 69 6f 72 20 77 6f 72 73 74 20 74  he prior worst t
318d0 6f 20 6b 65 65 70 20 63 6f 75 6e 74 20 62 65 6c  o keep count bel
318e0 6f 77 20 6d 78 43 68 6f 69 63 65 20 2a 2f 0a 20  ow mxChoice */. 
318f0 20 20 20 20 20 20 20 20 20 20 20 6a 6a 20 3d 20             jj = 
31900 6d 78 49 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  mxI;.          }
31910 0a 20 20 20 20 20 20 20 20 20 20 70 54 6f 20 3d  .          pTo =
31920 20 26 61 54 6f 5b 6a 6a 5d 3b 0a 23 69 66 64 65   &aTo[jj];.#ifde
31930 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  f WHERETRACE_ENA
31940 42 4c 45 44 20 2f 2a 20 30 78 34 20 2a 2f 0a 20  BLED /* 0x4 */. 
31950 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
31960 69 74 65 33 57 68 65 72 65 54 72 61 63 65 26 30  ite3WhereTrace&0
31970 78 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  x4 ){.          
31980 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
31990 69 6e 74 66 28 22 4e 65 77 20 20 20 20 25 73 20  intf("New    %s 
319a0 63 6f 73 74 3d 25 2d 33 64 2c 25 33 64 20 6f 72  cost=%-3d,%3d or
319b0 64 65 72 3d 25 63 5c 6e 22 2c 0a 20 20 20 20 20  der=%c\n",.     
319c0 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65             where
319d0 50 61 74 68 4e 61 6d 65 28 70 46 72 6f 6d 2c 20  PathName(pFrom, 
319e0 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c 20  iLoop, pWLoop), 
319f0 72 43 6f 73 74 2c 20 6e 4f 75 74 2c 0a 20 20 20  rCost, nOut,.   
31a00 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f               isO
31a10 72 64 65 72 65 64 3e 3d 30 20 3f 20 69 73 4f 72  rdered>=0 ? isOr
31a20 64 65 72 65 64 2b 27 30 27 20 3a 20 27 3f 27 29  dered+'0' : '?')
31a30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 23 65  ;.          }.#e
31a40 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7d 65 6c  ndif.        }el
31a50 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  se{.          if
31a60 28 20 70 54 6f 2d 3e 72 43 6f 73 74 3c 3d 72 43  ( pTo->rCost<=rC
31a70 6f 73 74 20 26 26 20 70 54 6f 2d 3e 6e 52 6f 77  ost && pTo->nRow
31a80 3c 3d 6e 4f 75 74 20 29 7b 0a 23 69 66 64 65 66  <=nOut ){.#ifdef
31a90 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42   WHERETRACE_ENAB
31aa0 4c 45 44 20 2f 2a 20 30 78 34 20 2a 2f 0a 20 20  LED /* 0x4 */.  
31ab0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
31ac0 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65 26  lite3WhereTrace&
31ad0 30 78 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20  0x4 ){.         
31ae0 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
31af0 67 50 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20  gPrintf(.       
31b00 20 20 20 20 20 20 20 20 20 20 20 22 53 6b 69 70             "Skip
31b10 20 20 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c     %s cost=%-3d,
31b20 25 33 64 20 6f 72 64 65 72 3d 25 63 22 2c 0a 20  %3d order=%c",. 
31b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31b40 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70   wherePathName(p
31b50 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c  From, iLoop, pWL
31b60 6f 6f 70 29 2c 20 72 43 6f 73 74 2c 20 6e 4f 75  oop), rCost, nOu
31b70 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
31b80 20 20 20 20 20 69 73 4f 72 64 65 72 65 64 3e 3d       isOrdered>=
31b90 30 20 3f 20 69 73 4f 72 64 65 72 65 64 2b 27 30  0 ? isOrdered+'0
31ba0 27 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20  ' : '?');.      
31bb0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
31bc0 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 20 76  ebugPrintf("   v
31bd0 73 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25  s %s cost=%-3d,%
31be0 64 20 6f 72 64 65 72 3d 25 63 5c 6e 22 2c 0a 20  d order=%c\n",. 
31bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31c00 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70   wherePathName(p
31c10 54 6f 2c 20 69 4c 6f 6f 70 2b 31 2c 20 30 29 2c  To, iLoop+1, 0),
31c20 20 70 54 6f 2d 3e 72 43 6f 73 74 2c 20 70 54 6f   pTo->rCost, pTo
31c30 2d 3e 6e 52 6f 77 2c 0a 20 20 20 20 20 20 20 20  ->nRow,.        
31c40 20 20 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 69            pTo->i
31c50 73 4f 72 64 65 72 65 64 3e 3d 30 20 3f 20 70 54  sOrdered>=0 ? pT
31c60 6f 2d 3e 69 73 4f 72 64 65 72 65 64 2b 27 30 27  o->isOrdered+'0'
31c70 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20   : '?');.       
31c80 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
31c90 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
31ca0 73 65 28 20 70 54 6f 2d 3e 72 43 6f 73 74 3d 3d  se( pTo->rCost==
31cb0 72 43 6f 73 74 20 29 3b 0a 20 20 20 20 20 20 20  rCost );.       
31cc0 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
31cd0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
31ce0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
31cf0 54 6f 2d 3e 72 43 6f 73 74 3d 3d 72 43 6f 73 74  To->rCost==rCost
31d00 2b 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  +1 );.          
31d10 2f 2a 20 41 20 6e 65 77 20 61 6e 64 20 62 65 74  /* A new and bet
31d20 74 65 72 20 73 63 6f 72 65 20 66 6f 72 20 61 20  ter score for a 
31d30 70 72 65 76 69 6f 75 73 6c 79 20 63 72 65 61 74  previously creat
31d40 65 64 20 65 71 75 69 76 61 6c 65 6e 74 20 70 61  ed equivalent pa
31d50 74 68 20 2a 2f 0a 23 69 66 64 65 66 20 57 48 45  th */.#ifdef WHE
31d60 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20  RETRACE_ENABLED 
31d70 2f 2a 20 30 78 34 20 2a 2f 0a 20 20 20 20 20 20  /* 0x4 */.      
31d80 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57      if( sqlite3W
31d90 68 65 72 65 54 72 61 63 65 26 30 78 34 20 29 7b  hereTrace&0x4 ){
31da0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
31db0 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
31dc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
31dd0 20 22 55 70 64 61 74 65 20 25 73 20 63 6f 73 74   "Update %s cost
31de0 3d 25 2d 33 64 2c 25 33 64 20 6f 72 64 65 72 3d  =%-3d,%3d order=
31df0 25 63 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %c",.           
31e00 20 20 20 20 20 77 68 65 72 65 50 61 74 68 4e 61       wherePathNa
31e10 6d 65 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c  me(pFrom, iLoop,
31e20 20 70 57 4c 6f 6f 70 29 2c 20 72 43 6f 73 74 2c   pWLoop), rCost,
31e30 20 6e 4f 75 74 2c 0a 20 20 20 20 20 20 20 20 20   nOut,.         
31e40 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 65 64         isOrdered
31e50 3e 3d 30 20 3f 20 69 73 4f 72 64 65 72 65 64 2b  >=0 ? isOrdered+
31e60 27 30 27 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20  '0' : '?');.    
31e70 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
31e80 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 77 61  ebugPrintf("  wa
31e90 73 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25  s %s cost=%-3d,%
31ea0 33 64 20 6f 72 64 65 72 3d 25 63 5c 6e 22 2c 0a  3d order=%c\n",.
31eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31ec0 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70 54  wherePathName(pT
31ed0 6f 2c 20 69 4c 6f 6f 70 2b 31 2c 20 30 29 2c 20  o, iLoop+1, 0), 
31ee0 70 54 6f 2d 3e 72 43 6f 73 74 2c 20 70 54 6f 2d  pTo->rCost, pTo-
31ef0 3e 6e 52 6f 77 2c 0a 20 20 20 20 20 20 20 20 20  >nRow,.         
31f00 20 20 20 20 20 20 20 70 54 6f 2d 3e 69 73 4f 72         pTo->isOr
31f10 64 65 72 65 64 3e 3d 30 20 3f 20 70 54 6f 2d 3e  dered>=0 ? pTo->
31f20 69 73 4f 72 64 65 72 65 64 2b 27 30 27 20 3a 20  isOrdered+'0' : 
31f30 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20  '?');.          
31f40 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20  }.#endif.       
31f50 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20 70 57   }.        /* pW
31f60 4c 6f 6f 70 20 69 73 20 61 20 77 69 6e 6e 65 72  Loop is a winner
31f70 2e 20 20 41 64 64 20 69 74 20 74 6f 20 74 68 65  .  Add it to the
31f80 20 73 65 74 20 6f 66 20 62 65 73 74 20 73 6f 20   set of best so 
31f90 66 61 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 70  far */.        p
31fa0 54 6f 2d 3e 6d 61 73 6b 4c 6f 6f 70 20 3d 20 70  To->maskLoop = p
31fb0 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 20 7c  From->maskLoop |
31fc0 20 70 57 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c   pWLoop->maskSel
31fd0 66 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e  f;.        pTo->
31fe0 72 65 76 4c 6f 6f 70 20 3d 20 72 65 76 4d 61 73  revLoop = revMas
31ff0 6b 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e  k;.        pTo->
32000 6e 52 6f 77 20 3d 20 6e 4f 75 74 3b 0a 20 20 20  nRow = nOut;.   
32010 20 20 20 20 20 70 54 6f 2d 3e 72 43 6f 73 74 20       pTo->rCost 
32020 3d 20 72 43 6f 73 74 3b 0a 20 20 20 20 20 20 20  = rCost;.       
32030 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 20   pTo->isOrdered 
32040 3d 20 69 73 4f 72 64 65 72 65 64 3b 0a 20 20 20  = isOrdered;.   
32050 20 20 20 20 20 6d 65 6d 63 70 79 28 70 54 6f 2d       memcpy(pTo-
32060 3e 61 4c 6f 6f 70 2c 20 70 46 72 6f 6d 2d 3e 61  >aLoop, pFrom->a
32070 4c 6f 6f 70 2c 20 73 69 7a 65 6f 66 28 57 68 65  Loop, sizeof(Whe
32080 72 65 4c 6f 6f 70 2a 29 2a 69 4c 6f 6f 70 29 3b  reLoop*)*iLoop);
32090 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 61 4c  .        pTo->aL
320a0 6f 6f 70 5b 69 4c 6f 6f 70 5d 20 3d 20 70 57 4c  oop[iLoop] = pWL
320b0 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20 69 66 28  oop;.        if(
320c0 20 6e 54 6f 3e 3d 6d 78 43 68 6f 69 63 65 20 29   nTo>=mxChoice )
320d0 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 78 49 20  {.          mxI 
320e0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 6d  = 0;.          m
320f0 78 43 6f 73 74 20 3d 20 61 54 6f 5b 30 5d 2e 72  xCost = aTo[0].r
32100 43 6f 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20  Cost;.          
32110 6d 78 4f 75 74 20 3d 20 61 54 6f 5b 30 5d 2e 6e  mxOut = aTo[0].n
32120 52 6f 77 3b 0a 20 20 20 20 20 20 20 20 20 20 66  Row;.          f
32130 6f 72 28 6a 6a 3d 31 2c 20 70 54 6f 3d 26 61 54  or(jj=1, pTo=&aT
32140 6f 5b 31 5d 3b 20 6a 6a 3c 6d 78 43 68 6f 69 63  o[1]; jj<mxChoic
32150 65 3b 20 6a 6a 2b 2b 2c 20 70 54 6f 2b 2b 29 7b  e; jj++, pTo++){
32160 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
32170 20 70 54 6f 2d 3e 72 43 6f 73 74 3e 6d 78 43 6f   pTo->rCost>mxCo
32180 73 74 20 7c 7c 20 28 70 54 6f 2d 3e 72 43 6f 73  st || (pTo->rCos
32190 74 3d 3d 6d 78 43 6f 73 74 20 26 26 20 70 54 6f  t==mxCost && pTo
321a0 2d 3e 6e 52 6f 77 3e 6d 78 4f 75 74 29 20 29 7b  ->nRow>mxOut) ){
321b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d  .              m
321c0 78 43 6f 73 74 20 3d 20 70 54 6f 2d 3e 72 43 6f  xCost = pTo->rCo
321d0 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  st;.            
321e0 20 20 6d 78 4f 75 74 20 3d 20 70 54 6f 2d 3e 6e    mxOut = pTo->n
321f0 52 6f 77 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Row;.           
32200 20 20 20 6d 78 49 20 3d 20 6a 6a 3b 0a 20 20 20     mxI = jj;.   
32210 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
32220 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
32230 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
32240 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41 43  #ifdef WHERETRAC
32250 45 5f 45 4e 41 42 4c 45 44 20 20 2f 2a 20 3e 3d  E_ENABLED  /* >=
32260 32 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c  2 */.    if( sql
32270 69 74 65 33 57 68 65 72 65 54 72 61 63 65 3e 3d  ite3WhereTrace>=
32280 32 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  2 ){.      sqlit
32290 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 2d  e3DebugPrintf("-
322a0 2d 2d 2d 20 61 66 74 65 72 20 72 6f 75 6e 64 20  --- after round 
322b0 25 64 20 2d 2d 2d 2d 5c 6e 22 2c 20 69 4c 6f 6f  %d ----\n", iLoo
322c0 70 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 69  p);.      for(ii
322d0 3d 30 2c 20 70 54 6f 3d 61 54 6f 3b 20 69 69 3c  =0, pTo=aTo; ii<
322e0 6e 54 6f 3b 20 69 69 2b 2b 2c 20 70 54 6f 2b 2b  nTo; ii++, pTo++
322f0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
32300 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
32310 25 73 20 63 6f 73 74 3d 25 2d 33 64 20 6e 72 6f  %s cost=%-3d nro
32320 77 3d 25 2d 33 64 20 6f 72 64 65 72 3d 25 63 22  w=%-3d order=%c"
32330 2c 0a 20 20 20 20 20 20 20 20 20 20 20 77 68 65  ,.           whe
32340 72 65 50 61 74 68 4e 61 6d 65 28 70 54 6f 2c 20  rePathName(pTo, 
32350 69 4c 6f 6f 70 2b 31 2c 20 30 29 2c 20 70 54 6f  iLoop+1, 0), pTo
32360 2d 3e 72 43 6f 73 74 2c 20 70 54 6f 2d 3e 6e 52  ->rCost, pTo->nR
32370 6f 77 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  ow,.           p
32380 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 3e 3d 30  To->isOrdered>=0
32390 20 3f 20 28 70 54 6f 2d 3e 69 73 4f 72 64 65 72   ? (pTo->isOrder
323a0 65 64 2b 27 30 27 29 20 3a 20 27 3f 27 29 3b 0a  ed+'0') : '?');.
323b0 20 20 20 20 20 20 20 20 69 66 28 20 70 54 6f 2d          if( pTo-
323c0 3e 69 73 4f 72 64 65 72 65 64 3e 30 20 29 7b 0a  >isOrdered>0 ){.
323d0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
323e0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 72  3DebugPrintf(" r
323f0 65 76 3d 30 78 25 6c 6c 78 5c 6e 22 2c 20 70 54  ev=0x%llx\n", pT
32400 6f 2d 3e 72 65 76 4c 6f 6f 70 29 3b 0a 20 20 20  o->revLoop);.   
32410 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
32420 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
32430 75 67 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a  ugPrintf("\n");.
32440 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
32450 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  }.    }.#endif..
32460 20 20 20 20 2f 2a 20 53 77 61 70 20 74 68 65 20      /* Swap the 
32470 72 6f 6c 65 73 20 6f 66 20 61 46 72 6f 6d 20 61  roles of aFrom a
32480 6e 64 20 61 54 6f 20 66 6f 72 20 74 68 65 20 6e  nd aTo for the n
32490 65 78 74 20 67 65 6e 65 72 61 74 69 6f 6e 20 2a  ext generation *
324a0 2f 0a 20 20 20 20 70 46 72 6f 6d 20 3d 20 61 54  /.    pFrom = aT
324b0 6f 3b 0a 20 20 20 20 61 54 6f 20 3d 20 61 46 72  o;.    aTo = aFr
324c0 6f 6d 3b 0a 20 20 20 20 61 46 72 6f 6d 20 3d 20  om;.    aFrom = 
324d0 70 46 72 6f 6d 3b 0a 20 20 20 20 6e 46 72 6f 6d  pFrom;.    nFrom
324e0 20 3d 20 6e 54 6f 3b 0a 20 20 7d 0a 0a 20 20 69   = nTo;.  }..  i
324f0 66 28 20 6e 46 72 6f 6d 3d 3d 30 20 29 7b 0a 20  f( nFrom==0 ){. 
32500 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
32510 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 71  sg(pParse, "no q
32520 75 65 72 79 20 73 6f 6c 75 74 69 6f 6e 22 29 3b  uery solution");
32530 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
32540 65 65 28 64 62 2c 20 70 53 70 61 63 65 29 3b 0a  ee(db, pSpace);.
32550 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
32560 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 0a  E_ERROR;.  }.  .
32570 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 6c 6f    /* Find the lo
32580 77 65 73 74 20 63 6f 73 74 20 70 61 74 68 2e 20  west cost path. 
32590 20 70 46 72 6f 6d 20 77 69 6c 6c 20 62 65 20 6c   pFrom will be l
325a0 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  eft pointing to 
325b0 74 68 61 74 20 70 61 74 68 20 2a 2f 0a 20 20 70  that path */.  p
325c0 46 72 6f 6d 20 3d 20 61 46 72 6f 6d 3b 0a 20 20  From = aFrom;.  
325d0 66 6f 72 28 69 69 3d 31 3b 20 69 69 3c 6e 46 72  for(ii=1; ii<nFr
325e0 6f 6d 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 69  om; ii++){.    i
325f0 66 28 20 70 46 72 6f 6d 2d 3e 72 43 6f 73 74 3e  f( pFrom->rCost>
32600 61 46 72 6f 6d 5b 69 69 5d 2e 72 43 6f 73 74 20  aFrom[ii].rCost 
32610 29 20 70 46 72 6f 6d 20 3d 20 26 61 46 72 6f 6d  ) pFrom = &aFrom
32620 5b 69 69 5d 3b 0a 20 20 7d 0a 20 20 61 73 73 65  [ii];.  }.  asse
32630 72 74 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76  rt( pWInfo->nLev
32640 65 6c 3d 3d 6e 4c 6f 6f 70 20 29 3b 0a 20 20 2f  el==nLoop );.  /
32650 2a 20 4c 6f 61 64 20 74 68 65 20 6c 6f 77 65 73  * Load the lowes
32660 74 20 63 6f 73 74 20 70 61 74 68 20 69 6e 74 6f  t cost path into
32670 20 70 57 49 6e 66 6f 20 2a 2f 0a 20 20 66 6f 72   pWInfo */.  for
32680 28 69 4c 6f 6f 70 3d 30 3b 20 69 4c 6f 6f 70 3c  (iLoop=0; iLoop<
32690 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f 70 2b 2b 29 7b  nLoop; iLoop++){
326a0 0a 20 20 20 20 57 68 65 72 65 4c 65 76 65 6c 20  .    WhereLevel 
326b0 2a 70 4c 65 76 65 6c 20 3d 20 70 57 49 6e 66 6f  *pLevel = pWInfo
326c0 2d 3e 61 20 2b 20 69 4c 6f 6f 70 3b 0a 20 20 20  ->a + iLoop;.   
326d0 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 20   pLevel->pWLoop 
326e0 3d 20 70 57 4c 6f 6f 70 20 3d 20 70 46 72 6f 6d  = pWLoop = pFrom
326f0 2d 3e 61 4c 6f 6f 70 5b 69 4c 6f 6f 70 5d 3b 0a  ->aLoop[iLoop];.
32700 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f      pLevel->iFro
32710 6d 20 3d 20 70 57 4c 6f 6f 70 2d 3e 69 54 61 62  m = pWLoop->iTab
32720 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 54  ;.    pLevel->iT
32730 61 62 43 75 72 20 3d 20 70 57 49 6e 66 6f 2d 3e  abCur = pWInfo->
32740 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76  pTabList->a[pLev
32750 65 6c 2d 3e 69 46 72 6f 6d 5d 2e 69 43 75 72 73  el->iFrom].iCurs
32760 6f 72 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 70  or;.  }.  if( (p
32770 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67  WInfo->wctrlFlag
32780 73 20 26 20 57 48 45 52 45 5f 57 41 4e 54 5f 44  s & WHERE_WANT_D
32790 49 53 54 49 4e 43 54 29 21 3d 30 0a 20 20 20 26  ISTINCT)!=0.   &
327a0 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  & (pWInfo->wctrl
327b0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 44 49  Flags & WHERE_DI
327c0 53 54 49 4e 43 54 42 59 29 3d 3d 30 0a 20 20 20  STINCTBY)==0.   
327d0 26 26 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74  && pWInfo->eDist
327e0 69 6e 63 74 3d 3d 57 48 45 52 45 5f 44 49 53 54  inct==WHERE_DIST
327f0 49 4e 43 54 5f 4e 4f 4f 50 0a 20 20 20 26 26 20  INCT_NOOP.   && 
32800 6e 52 6f 77 45 73 74 0a 20 20 29 7b 0a 20 20 20  nRowEst.  ){.   
32810 20 42 69 74 6d 61 73 6b 20 6e 6f 74 55 73 65 64   Bitmask notUsed
32820 3b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 77  ;.    int rc = w
32830 68 65 72 65 50 61 74 68 53 61 74 69 73 66 69 65  herePathSatisfie
32840 73 4f 72 64 65 72 42 79 28 70 57 49 6e 66 6f 2c  sOrderBy(pWInfo,
32850 20 70 57 49 6e 66 6f 2d 3e 70 52 65 73 75 6c 74   pWInfo->pResult
32860 53 65 74 2c 20 70 46 72 6f 6d 2c 0a 20 20 20 20  Set, pFrom,.    
32870 20 20 20 20 20 20 20 20 20 20 20 20 20 57 48 45               WHE
32880 52 45 5f 44 49 53 54 49 4e 43 54 42 59 2c 20 6e  RE_DISTINCTBY, n
32890 4c 6f 6f 70 2d 31 2c 20 70 46 72 6f 6d 2d 3e 61  Loop-1, pFrom->a
328a0 4c 6f 6f 70 5b 6e 4c 6f 6f 70 2d 31 5d 2c 20 26  Loop[nLoop-1], &
328b0 6e 6f 74 55 73 65 64 29 3b 0a 20 20 20 20 69 66  notUsed);.    if
328c0 28 20 72 63 3d 3d 70 57 49 6e 66 6f 2d 3e 70 52  ( rc==pWInfo->pR
328d0 65 73 75 6c 74 53 65 74 2d 3e 6e 45 78 70 72 20  esultSet->nExpr 
328e0 29 7b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d  ){.      pWInfo-
328f0 3e 65 44 69 73 74 69 6e 63 74 20 3d 20 57 48 45  >eDistinct = WHE
32900 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44 45  RE_DISTINCT_ORDE
32910 52 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  RED;.    }.  }. 
32920 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72   if( pWInfo->pOr
32930 64 65 72 42 79 20 29 7b 0a 20 20 20 20 69 66 28  derBy ){.    if(
32940 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c   pWInfo->wctrlFl
32950 61 67 73 20 26 20 57 48 45 52 45 5f 44 49 53 54  ags & WHERE_DIST
32960 49 4e 43 54 42 59 20 29 7b 0a 20 20 20 20 20 20  INCTBY ){.      
32970 69 66 28 20 70 46 72 6f 6d 2d 3e 69 73 4f 72 64  if( pFrom->isOrd
32980 65 72 65 64 3d 3d 70 57 49 6e 66 6f 2d 3e 70 4f  ered==pWInfo->pO
32990 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 29 7b  rderBy->nExpr ){
329a0 0a 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d  .        pWInfo-
329b0 3e 65 44 69 73 74 69 6e 63 74 20 3d 20 57 48 45  >eDistinct = WHE
329c0 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44 45  RE_DISTINCT_ORDE
329d0 52 45 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  RED;.      }.   
329e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 57   }else{.      pW
329f0 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 20 3d 20 70  Info->nOBSat = p
32a00 46 72 6f 6d 2d 3e 69 73 4f 72 64 65 72 65 64 3b  From->isOrdered;
32a10 0a 20 20 20 20 20 20 69 66 28 20 70 57 49 6e 66  .      if( pWInf
32a20 6f 2d 3e 6e 4f 42 53 61 74 3c 30 20 29 20 70 57  o->nOBSat<0 ) pW
32a30 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 20 3d 20 30  Info->nOBSat = 0
32a40 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e  ;.      pWInfo->
32a50 72 65 76 4d 61 73 6b 20 3d 20 70 46 72 6f 6d 2d  revMask = pFrom-
32a60 3e 72 65 76 4c 6f 6f 70 3b 0a 20 20 20 20 7d 0a  >revLoop;.    }.
32a70 20 20 20 20 69 66 28 20 28 70 57 49 6e 66 6f 2d      if( (pWInfo-
32a80 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  >wctrlFlags & WH
32a90 45 52 45 5f 53 4f 52 54 42 59 47 52 4f 55 50 29  ERE_SORTBYGROUP)
32aa0 0a 20 20 20 20 20 20 20 20 26 26 20 70 57 49 6e  .        && pWIn
32ab0 66 6f 2d 3e 6e 4f 42 53 61 74 3d 3d 70 57 49 6e  fo->nOBSat==pWIn
32ac0 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45  fo->pOrderBy->nE
32ad0 78 70 72 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  xpr.    ){.     
32ae0 20 42 69 74 6d 61 73 6b 20 6e 6f 74 55 73 65 64   Bitmask notUsed
32af0 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20   = 0;.      int 
32b00 6e 4f 72 64 65 72 20 3d 20 77 68 65 72 65 50 61  nOrder = wherePa
32b10 74 68 53 61 74 69 73 66 69 65 73 4f 72 64 65 72  thSatisfiesOrder
32b20 42 79 28 70 57 49 6e 66 6f 2c 20 70 57 49 6e 66  By(pWInfo, pWInf
32b30 6f 2d 3e 70 4f 72 64 65 72 42 79 2c 20 0a 20 20  o->pOrderBy, .  
32b40 20 20 20 20 20 20 20 20 70 46 72 6f 6d 2c 20 30          pFrom, 0
32b50 2c 20 6e 4c 6f 6f 70 2d 31 2c 20 70 46 72 6f 6d  , nLoop-1, pFrom
32b60 2d 3e 61 4c 6f 6f 70 5b 6e 4c 6f 6f 70 2d 31 5d  ->aLoop[nLoop-1]
32b70 2c 20 26 6e 6f 74 55 73 65 64 0a 20 20 20 20 20  , &notUsed.     
32b80 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
32b90 28 20 70 57 49 6e 66 6f 2d 3e 73 6f 72 74 65 64  ( pWInfo->sorted
32ba0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 57 49  ==0 );.      pWI
32bb0 6e 66 6f 2d 3e 73 6f 72 74 65 64 20 3d 20 28 6e  nfo->sorted = (n
32bc0 4f 72 64 65 72 3d 3d 70 57 49 6e 66 6f 2d 3e 70  Order==pWInfo->p
32bd0 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 29 3b  OrderBy->nExpr);
32be0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20 70  .    }.  }...  p
32bf0 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 20 3d  WInfo->nRowOut =
32c00 20 70 46 72 6f 6d 2d 3e 6e 52 6f 77 3b 0a 0a 20   pFrom->nRow;.. 
32c10 20 2f 2a 20 46 72 65 65 20 74 65 6d 70 6f 72 61   /* Free tempora
32c20 72 79 20 6d 65 6d 6f 72 79 20 61 6e 64 20 72 65  ry memory and re
32c30 74 75 72 6e 20 73 75 63 63 65 73 73 20 2a 2f 0a  turn success */.
32c40 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
32c50 64 62 2c 20 70 53 70 61 63 65 29 3b 0a 20 20 72  db, pSpace);.  r
32c60 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
32c70 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 73 74 20 71  .}../*.** Most q
32c80 75 65 72 69 65 73 20 75 73 65 20 6f 6e 6c 79 20  ueries use only 
32c90 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 28  a single table (
32ca0 74 68 65 79 20 61 72 65 20 6e 6f 74 20 6a 6f 69  they are not joi
32cb0 6e 73 29 20 61 6e 64 20 68 61 76 65 0a 2a 2a 20  ns) and have.** 
32cc0 73 69 6d 70 6c 65 20 3d 3d 20 63 6f 6e 73 74 72  simple == constr
32cd0 61 69 6e 74 73 20 61 67 61 69 6e 73 74 20 69 6e  aints against in
32ce0 64 65 78 65 64 20 66 69 65 6c 64 73 2e 20 20 54  dexed fields.  T
32cf0 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65  his routine atte
32d00 6d 70 74 73 0a 2a 2a 20 74 6f 20 70 6c 61 6e 20  mpts.** to plan 
32d10 74 68 6f 73 65 20 73 69 6d 70 6c 65 20 63 61 73  those simple cas
32d20 65 73 20 75 73 69 6e 67 20 6d 75 63 68 20 6c 65  es using much le
32d30 73 73 20 63 65 72 65 6d 6f 6e 79 20 74 68 61 6e  ss ceremony than
32d40 20 74 68 65 0a 2a 2a 20 67 65 6e 65 72 61 6c 2d   the.** general-
32d50 70 75 72 70 6f 73 65 20 71 75 65 72 79 20 70 6c  purpose query pl
32d60 61 6e 6e 65 72 2c 20 61 6e 64 20 74 68 65 72 65  anner, and there
32d70 62 79 20 79 69 65 6c 64 20 66 61 73 74 65 72 20  by yield faster 
32d80 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28  sqlite3_prepare(
32d90 29 0a 2a 2a 20 74 69 6d 65 73 20 66 6f 72 20 74  ).** times for t
32da0 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e 0a  he common case..
32db0 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 6e 6f 6e  **.** Return non
32dc0 2d 7a 65 72 6f 20 6f 6e 20 73 75 63 63 65 73 73  -zero on success
32dd0 2c 20 69 66 20 74 68 69 73 20 71 75 65 72 79 20  , if this query 
32de0 63 61 6e 20 62 65 20 68 61 6e 64 6c 65 64 20 62  can be handled b
32df0 79 20 74 68 69 73 0a 2a 2a 20 6e 6f 2d 66 72 69  y this.** no-fri
32e00 6c 6c 73 20 71 75 65 72 79 20 70 6c 61 6e 6e 65  lls query planne
32e10 72 2e 20 20 52 65 74 75 72 6e 20 7a 65 72 6f 20  r.  Return zero 
32e20 69 66 20 74 68 69 73 20 71 75 65 72 79 20 6e 65  if this query ne
32e30 65 64 73 20 74 68 65 20 0a 2a 2a 20 67 65 6e 65  eds the .** gene
32e40 72 61 6c 2d 70 75 72 70 6f 73 65 20 71 75 65 72  ral-purpose quer
32e50 79 20 70 6c 61 6e 6e 65 72 2e 0a 2a 2f 0a 73 74  y planner..*/.st
32e60 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 53 68  atic int whereSh
32e70 6f 72 74 43 75 74 28 57 68 65 72 65 4c 6f 6f 70  ortCut(WhereLoop
32e80 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65  Builder *pBuilde
32e90 72 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20  r){.  WhereInfo 
32ea0 2a 70 57 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63  *pWInfo;.  struc
32eb0 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
32ec0 70 49 74 65 6d 3b 0a 20 20 57 68 65 72 65 43 6c  pItem;.  WhereCl
32ed0 61 75 73 65 20 2a 70 57 43 3b 0a 20 20 57 68 65  ause *pWC;.  Whe
32ee0 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20  reTerm *pTerm;. 
32ef0 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f   WhereLoop *pLoo
32f00 70 3b 0a 20 20 69 6e 74 20 69 43 75 72 3b 0a 20  p;.  int iCur;. 
32f10 20 69 6e 74 20 6a 3b 0a 20 20 54 61 62 6c 65 20   int j;.  Table 
32f20 2a 70 54 61 62 3b 0a 20 20 49 6e 64 65 78 20 2a  *pTab;.  Index *
32f30 70 49 64 78 3b 0a 20 20 0a 20 20 70 57 49 6e 66  pIdx;.  .  pWInf
32f40 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57  o = pBuilder->pW
32f50 49 6e 66 6f 3b 0a 20 20 69 66 28 20 70 57 49 6e  Info;.  if( pWIn
32f60 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26  fo->wctrlFlags &
32f70 20 57 48 45 52 45 5f 46 4f 52 43 45 5f 54 41 42   WHERE_FORCE_TAB
32f80 4c 45 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  LE ) return 0;. 
32f90 20 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d   assert( pWInfo-
32fa0 3e 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e  >pTabList->nSrc>
32fb0 3d 31 20 29 3b 0a 20 20 70 49 74 65 6d 20 3d 20  =1 );.  pItem = 
32fc0 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
32fd0 2d 3e 61 3b 0a 20 20 70 54 61 62 20 3d 20 70 49  ->a;.  pTab = pI
32fe0 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 69 66 28  tem->pTab;.  if(
32ff0 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29   IsVirtual(pTab)
33000 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
33010 66 28 20 70 49 74 65 6d 2d 3e 7a 49 6e 64 65 78  f( pItem->zIndex
33020 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
33030 43 75 72 20 3d 20 70 49 74 65 6d 2d 3e 69 43 75  Cur = pItem->iCu
33040 72 73 6f 72 3b 0a 20 20 70 57 43 20 3d 20 26 70  rsor;.  pWC = &p
33050 57 49 6e 66 6f 2d 3e 73 57 43 3b 0a 20 20 70 4c  WInfo->sWC;.  pL
33060 6f 6f 70 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  oop = pBuilder->
33070 70 4e 65 77 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 77  pNew;.  pLoop->w
33080 73 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 70 4c  sFlags = 0;.  pL
33090 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 53 6b  oop->u.btree.nSk
330a0 69 70 20 3d 20 30 3b 0a 20 20 70 54 65 72 6d 20  ip = 0;.  pTerm 
330b0 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20  = findTerm(pWC, 
330c0 69 43 75 72 2c 20 2d 31 2c 20 30 2c 20 57 4f 5f  iCur, -1, 0, WO_
330d0 45 51 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 54  EQ, 0);.  if( pT
330e0 65 72 6d 20 29 7b 0a 20 20 20 20 70 4c 6f 6f 70  erm ){.    pLoop
330f0 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52  ->wsFlags = WHER
33100 45 5f 43 4f 4c 55 4d 4e 5f 45 51 7c 57 48 45 52  E_COLUMN_EQ|WHER
33110 45 5f 49 50 4b 7c 57 48 45 52 45 5f 4f 4e 45 52  E_IPK|WHERE_ONER
33120 4f 57 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 61  OW;.    pLoop->a
33130 4c 54 65 72 6d 5b 30 5d 20 3d 20 70 54 65 72 6d  LTerm[0] = pTerm
33140 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4c 54  ;.    pLoop->nLT
33150 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 70 4c 6f  erm = 1;.    pLo
33160 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20  op->u.btree.nEq 
33170 3d 20 31 3b 0a 20 20 20 20 2f 2a 20 54 55 4e 49  = 1;.    /* TUNI
33180 4e 47 3a 20 43 6f 73 74 20 6f 66 20 61 20 72 6f  NG: Cost of a ro
33190 77 69 64 20 6c 6f 6f 6b 75 70 20 69 73 20 31 30  wid lookup is 10
331a0 20 2a 2f 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 72   */.    pLoop->r
331b0 52 75 6e 20 3d 20 33 33 3b 20 20 2f 2a 20 33 33  Run = 33;  /* 33
331c0 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  ==sqlite3LogEst(
331d0 31 30 29 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a  10) */.  }else{.
331e0 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61      for(pIdx=pTa
331f0 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b  b->pIndex; pIdx;
33200 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
33210 74 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  t){.      assert
33220 28 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 53  ( pLoop->aLTermS
33230 70 61 63 65 3d 3d 70 4c 6f 6f 70 2d 3e 61 4c 54  pace==pLoop->aLT
33240 65 72 6d 20 29 3b 0a 20 20 20 20 20 20 61 73 73  erm );.      ass
33250 65 72 74 28 20 41 72 72 61 79 53 69 7a 65 28 70  ert( ArraySize(p
33260 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63  Loop->aLTermSpac
33270 65 29 3d 3d 34 20 29 3b 0a 20 20 20 20 20 20 69  e)==4 );.      i
33280 66 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72  f( pIdx->onError
33290 3d 3d 4f 45 5f 4e 6f 6e 65 20 0a 20 20 20 20 20  ==OE_None .     
332a0 20 20 7c 7c 20 70 49 64 78 2d 3e 70 50 61 72 74    || pIdx->pPart
332b0 49 64 78 57 68 65 72 65 21 3d 30 20 0a 20 20 20  IdxWhere!=0 .   
332c0 20 20 20 20 7c 7c 20 70 49 64 78 2d 3e 6e 4b 65      || pIdx->nKe
332d0 79 43 6f 6c 3e 41 72 72 61 79 53 69 7a 65 28 70  yCol>ArraySize(p
332e0 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63  Loop->aLTermSpac
332f0 65 29 20 0a 20 20 20 20 20 20 29 20 63 6f 6e 74  e) .      ) cont
33300 69 6e 75 65 3b 0a 20 20 20 20 20 20 66 6f 72 28  inue;.      for(
33310 6a 3d 30 3b 20 6a 3c 70 49 64 78 2d 3e 6e 4b 65  j=0; j<pIdx->nKe
33320 79 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  yCol; j++){.    
33330 20 20 20 20 70 54 65 72 6d 20 3d 20 66 69 6e 64      pTerm = find
33340 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20  Term(pWC, iCur, 
33350 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a  pIdx->aiColumn[j
33360 5d 2c 20 30 2c 20 57 4f 5f 45 51 2c 20 70 49 64  ], 0, WO_EQ, pId
33370 78 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  x);.        if( 
33380 70 54 65 72 6d 3d 3d 30 20 29 20 62 72 65 61 6b  pTerm==0 ) break
33390 3b 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d  ;.        pLoop-
333a0 3e 61 4c 54 65 72 6d 5b 6a 5d 20 3d 20 70 54 65  >aLTerm[j] = pTe
333b0 72 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rm;.      }.    
333c0 20 20 69 66 28 20 6a 21 3d 70 49 64 78 2d 3e 6e    if( j!=pIdx->n
333d0 4b 65 79 43 6f 6c 20 29 20 63 6f 6e 74 69 6e 75  KeyCol ) continu
333e0 65 3b 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e  e;.      pLoop->
333f0 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f  wsFlags = WHERE_
33400 43 4f 4c 55 4d 4e 5f 45 51 7c 57 48 45 52 45 5f  COLUMN_EQ|WHERE_
33410 4f 4e 45 52 4f 57 7c 57 48 45 52 45 5f 49 4e 44  ONEROW|WHERE_IND
33420 45 58 45 44 3b 0a 20 20 20 20 20 20 69 66 28 20  EXED;.      if( 
33430 70 49 64 78 2d 3e 69 73 43 6f 76 65 72 69 6e 67  pIdx->isCovering
33440 20 7c 7c 20 28 70 49 74 65 6d 2d 3e 63 6f 6c 55   || (pItem->colU
33450 73 65 64 20 26 20 7e 63 6f 6c 75 6d 6e 73 49 6e  sed & ~columnsIn
33460 49 6e 64 65 78 28 70 49 64 78 29 29 3d 3d 30 20  Index(pIdx))==0 
33470 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f 70  ){.        pLoop
33480 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45  ->wsFlags |= WHE
33490 52 45 5f 49 44 58 5f 4f 4e 4c 59 3b 0a 20 20 20  RE_IDX_ONLY;.   
334a0 20 20 20 7d 0a 20 20 20 20 20 20 70 4c 6f 6f 70     }.      pLoop
334b0 2d 3e 6e 4c 54 65 72 6d 20 3d 20 6a 3b 0a 20 20  ->nLTerm = j;.  
334c0 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72      pLoop->u.btr
334d0 65 65 2e 6e 45 71 20 3d 20 6a 3b 0a 20 20 20 20  ee.nEq = j;.    
334e0 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65    pLoop->u.btree
334f0 2e 70 49 6e 64 65 78 20 3d 20 70 49 64 78 3b 0a  .pIndex = pIdx;.
33500 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a        /* TUNING:
33510 20 43 6f 73 74 20 6f 66 20 61 20 75 6e 69 71 75   Cost of a uniqu
33520 65 20 69 6e 64 65 78 20 6c 6f 6f 6b 75 70 20 69  e index lookup i
33530 73 20 31 35 20 2a 2f 0a 20 20 20 20 20 20 70 4c  s 15 */.      pL
33540 6f 6f 70 2d 3e 72 52 75 6e 20 3d 20 33 39 3b 20  oop->rRun = 39; 
33550 20 2f 2a 20 33 39 3d 3d 73 71 6c 69 74 65 33 4c   /* 39==sqlite3L
33560 6f 67 45 73 74 28 31 35 29 20 2a 2f 0a 20 20 20  ogEst(15) */.   
33570 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
33580 20 20 7d 0a 20 20 69 66 28 20 70 4c 6f 6f 70 2d    }.  if( pLoop-
33590 3e 77 73 46 6c 61 67 73 20 29 7b 0a 20 20 20 20  >wsFlags ){.    
335a0 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 3d 20 28 4c  pLoop->nOut = (L
335b0 6f 67 45 73 74 29 31 3b 0a 20 20 20 20 70 57 49  ogEst)1;.    pWI
335c0 6e 66 6f 2d 3e 61 5b 30 5d 2e 70 57 4c 6f 6f 70  nfo->a[0].pWLoop
335d0 20 3d 20 70 4c 6f 6f 70 3b 0a 20 20 20 20 70 4c   = pLoop;.    pL
335e0 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 20 3d 20  oop->maskSelf = 
335f0 67 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d  getMask(&pWInfo-
33600 3e 73 4d 61 73 6b 53 65 74 2c 20 69 43 75 72 29  >sMaskSet, iCur)
33610 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b  ;.    pWInfo->a[
33620 30 5d 2e 69 54 61 62 43 75 72 20 3d 20 69 43 75  0].iTabCur = iCu
33630 72 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 6e  r;.    pWInfo->n
33640 52 6f 77 4f 75 74 20 3d 20 31 3b 0a 20 20 20 20  RowOut = 1;.    
33650 69 66 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64  if( pWInfo->pOrd
33660 65 72 42 79 20 29 20 70 57 49 6e 66 6f 2d 3e 6e  erBy ) pWInfo->n
33670 4f 42 53 61 74 20 3d 20 20 70 57 49 6e 66 6f 2d  OBSat =  pWInfo-
33680 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  >pOrderBy->nExpr
33690 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f  ;.    if( pWInfo
336a0 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ->wctrlFlags & W
336b0 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e  HERE_WANT_DISTIN
336c0 43 54 20 29 7b 0a 20 20 20 20 20 20 70 57 49 6e  CT ){.      pWIn
336d0 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d 20  fo->eDistinct = 
336e0 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55  WHERE_DISTINCT_U
336f0 4e 49 51 55 45 3b 0a 20 20 20 20 7d 0a 23 69 66  NIQUE;.    }.#if
33700 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
33710 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 63 49 64 20  .    pLoop->cId 
33720 3d 20 27 30 27 3b 0a 23 65 6e 64 69 66 0a 20 20  = '0';.#endif.  
33730 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
33740 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
33750 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 74 68  *.** Generate th
33760 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
33770 68 65 20 6c 6f 6f 70 20 75 73 65 64 20 66 6f 72  he loop used for
33780 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 70 72   WHERE clause pr
33790 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 20 54 68 65  ocessing..** The
337a0 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73   return value is
337b0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
337c0 20 6f 70 61 71 75 65 20 73 74 72 75 63 74 75 72   opaque structur
337d0 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 0a  e that contains.
337e0 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6e  ** information n
337f0 65 65 64 65 64 20 74 6f 20 74 65 72 6d 69 6e 61  eeded to termina
33800 74 65 20 74 68 65 20 6c 6f 6f 70 2e 20 20 4c 61  te the loop.  La
33810 74 65 72 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67  ter, the calling
33820 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 73 68 6f 75   routine.** shou
33830 6c 64 20 69 6e 76 6f 6b 65 20 73 71 6c 69 74 65  ld invoke sqlite
33840 33 57 68 65 72 65 45 6e 64 28 29 20 77 69 74 68  3WhereEnd() with
33850 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
33860 65 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  e of this functi
33870 6f 6e 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74  on.** in order t
33880 6f 20 63 6f 6d 70 6c 65 74 65 20 74 68 65 20 57  o complete the W
33890 48 45 52 45 20 63 6c 61 75 73 65 20 70 72 6f 63  HERE clause proc
338a0 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66  essing..**.** If
338b0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
338c0 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  , this routine r
338d0 65 74 75 72 6e 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a  eturns NULL..**.
338e0 2a 2a 20 54 68 65 20 62 61 73 69 63 20 69 64 65  ** The basic ide
338f0 61 20 69 73 20 74 6f 20 64 6f 20 61 20 6e 65 73  a is to do a nes
33900 74 65 64 20 6c 6f 6f 70 2c 20 6f 6e 65 20 6c 6f  ted loop, one lo
33910 6f 70 20 66 6f 72 20 65 61 63 68 20 74 61 62 6c  op for each tabl
33920 65 20 69 6e 0a 2a 2a 20 74 68 65 20 46 52 4f 4d  e in.** the FROM
33930 20 63 6c 61 75 73 65 20 6f 66 20 61 20 73 65 6c   clause of a sel
33940 65 63 74 2e 20 20 28 49 4e 53 45 52 54 20 61 6e  ect.  (INSERT an
33950 64 20 55 50 44 41 54 45 20 73 74 61 74 65 6d 65  d UPDATE stateme
33960 6e 74 73 20 61 72 65 20 74 68 65 0a 2a 2a 20 73  nts are the.** s
33970 61 6d 65 20 61 73 20 61 20 53 45 4c 45 43 54 20  ame as a SELECT 
33980 77 69 74 68 20 6f 6e 6c 79 20 61 20 73 69 6e 67  with only a sing
33990 6c 65 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20  le table in the 
339a0 46 52 4f 4d 20 63 6c 61 75 73 65 2e 29 20 20 46  FROM clause.)  F
339b0 6f 72 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 69  or.** example, i
339c0 66 20 74 68 65 20 53 51 4c 20 69 73 20 74 68 69  f the SQL is thi
339d0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 53  s:.**.**       S
339e0 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 2c  ELECT * FROM t1,
339f0 20 74 32 2c 20 74 33 20 57 48 45 52 45 20 2e 2e   t2, t3 WHERE ..
33a00 2e 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 74 68  .;.**.** Then th
33a10 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64  e code generated
33a20 20 69 73 20 63 6f 6e 63 65 70 74 75 61 6c 6c 79   is conceptually
33a30 20 6c 69 6b 65 20 74 68 65 20 66 6f 6c 6c 6f 77   like the follow
33a40 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  ing:.**.**      
33a50 66 6f 72 65 61 63 68 20 72 6f 77 31 20 69 6e 20  foreach row1 in 
33a60 74 31 20 64 6f 20 20 20 20 20 20 20 5c 20 20 20  t1 do       \   
33a70 20 43 6f 64 65 20 67 65 6e 65 72 61 74 65 64 0a   Code generated.
33a80 2a 2a 20 20 20 20 20 20 20 20 66 6f 72 65 61 63  **        foreac
33a90 68 20 72 6f 77 32 20 69 6e 20 74 32 20 64 6f 20  h row2 in t2 do 
33aa0 20 20 20 20 20 7c 2d 2d 20 62 79 20 73 71 6c 69       |-- by sqli
33ab0 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 0a  te3WhereBegin().
33ac0 2a 2a 20 20 20 20 20 20 20 20 20 20 66 6f 72 65  **          fore
33ad0 61 63 68 20 72 6f 77 33 20 69 6e 20 74 33 20 64  ach row3 in t3 d
33ae0 6f 20 20 20 2f 0a 2a 2a 20 20 20 20 20 20 20 20  o   /.**        
33af0 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20      ....**      
33b00 20 20 20 20 65 6e 64 20 20 20 20 20 20 20 20 20      end         
33b10 20 20 20 20 20 20 20 20 20 20 20 20 5c 20 20 20              \   
33b20 20 43 6f 64 65 20 67 65 6e 65 72 61 74 65 64 0a   Code generated.
33b30 2a 2a 20 20 20 20 20 20 20 20 65 6e 64 20 20 20  **        end   
33b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33b50 20 20 20 20 20 7c 2d 2d 20 62 79 20 73 71 6c 69       |-- by sqli
33b60 74 65 33 57 68 65 72 65 45 6e 64 28 29 0a 2a 2a  te3WhereEnd().**
33b70 20 20 20 20 20 20 65 6e 64 20 20 20 20 20 20 20        end       
33b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33b90 20 20 2f 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74    /.**.** Note t
33ba0 68 61 74 20 74 68 65 20 6c 6f 6f 70 73 20 6d 69  hat the loops mi
33bb0 67 68 74 20 6e 6f 74 20 62 65 20 6e 65 73 74 65  ght not be neste
33bc0 64 20 69 6e 20 74 68 65 20 6f 72 64 65 72 20 69  d in the order i
33bd0 6e 20 77 68 69 63 68 20 74 68 65 79 0a 2a 2a 20  n which they.** 
33be0 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 46 52  appear in the FR
33bf0 4f 4d 20 63 6c 61 75 73 65 20 69 66 20 61 20 64  OM clause if a d
33c00 69 66 66 65 72 65 6e 74 20 6f 72 64 65 72 20 69  ifferent order i
33c10 73 20 62 65 74 74 65 72 20 61 62 6c 65 20 74 6f  s better able to
33c20 20 6d 61 6b 65 0a 2a 2a 20 75 73 65 20 6f 66 20   make.** use of 
33c30 69 6e 64 69 63 65 73 2e 20 20 4e 6f 74 65 20 61  indices.  Note a
33c40 6c 73 6f 20 74 68 61 74 20 77 68 65 6e 20 74 68  lso that when th
33c50 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 61 70  e IN operator ap
33c60 70 65 61 72 73 20 69 6e 0a 2a 2a 20 74 68 65 20  pears in.** the 
33c70 57 48 45 52 45 20 63 6c 61 75 73 65 2c 20 69 74  WHERE clause, it
33c80 20 6d 69 67 68 74 20 72 65 73 75 6c 74 20 69 6e   might result in
33c90 20 61 64 64 69 74 69 6f 6e 61 6c 20 6e 65 73 74   additional nest
33ca0 65 64 20 6c 6f 6f 70 73 20 66 6f 72 0a 2a 2a 20  ed loops for.** 
33cb0 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67 68  scanning through
33cc0 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f 6e 20 74   all values on t
33cd0 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69  he right-hand si
33ce0 64 65 20 6f 66 20 74 68 65 20 49 4e 2e 0a 2a 2a  de of the IN..**
33cf0 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 20 42 74  .** There are Bt
33d00 72 65 65 20 63 75 72 73 6f 72 73 20 61 73 73 6f  ree cursors asso
33d10 63 69 61 74 65 64 20 77 69 74 68 20 65 61 63 68  ciated with each
33d20 20 74 61 62 6c 65 2e 20 20 74 31 20 75 73 65 73   table.  t1 uses
33d30 20 63 75 72 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65   cursor.** numbe
33d40 72 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d  r pTabList->a[0]
33d50 2e 69 43 75 72 73 6f 72 2e 20 20 74 32 20 75 73  .iCursor.  t2 us
33d60 65 73 20 74 68 65 20 63 75 72 73 6f 72 20 70 54  es the cursor pT
33d70 61 62 4c 69 73 74 2d 3e 61 5b 31 5d 2e 69 43 75  abList->a[1].iCu
33d80 72 73 6f 72 2e 0a 2a 2a 20 41 6e 64 20 73 6f 20  rsor..** And so 
33d90 66 6f 72 74 68 2e 20 20 54 68 69 73 20 72 6f 75  forth.  This rou
33da0 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 63  tine generates c
33db0 6f 64 65 20 74 6f 20 6f 70 65 6e 20 74 68 6f 73  ode to open thos
33dc0 65 20 56 44 42 45 20 63 75 72 73 6f 72 73 0a 2a  e VDBE cursors.*
33dd0 2a 20 61 6e 64 20 73 71 6c 69 74 65 33 57 68 65  * and sqlite3Whe
33de0 72 65 45 6e 64 28 29 20 67 65 6e 65 72 61 74 65  reEnd() generate
33df0 73 20 74 68 65 20 63 6f 64 65 20 74 6f 20 63 6c  s the code to cl
33e00 6f 73 65 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a 20  ose them..**.** 
33e10 54 68 65 20 63 6f 64 65 20 74 68 61 74 20 73 71  The code that sq
33e20 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
33e30 29 20 67 65 6e 65 72 61 74 65 73 20 6c 65 61 76  ) generates leav
33e40 65 73 20 74 68 65 20 63 75 72 73 6f 72 73 20 6e  es the cursors n
33e50 61 6d 65 64 0a 2a 2a 20 69 6e 20 70 54 61 62 4c  amed.** in pTabL
33e60 69 73 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  ist pointing at 
33e70 74 68 65 69 72 20 61 70 70 72 6f 70 72 69 61 74  their appropriat
33e80 65 20 65 6e 74 72 69 65 73 2e 20 20 54 68 65 20  e entries.  The 
33e90 5b 2e 2e 2e 5d 20 63 6f 64 65 0a 2a 2a 20 63 61  [...] code.** ca
33ea0 6e 20 75 73 65 20 4f 50 5f 43 6f 6c 75 6d 6e 20  n use OP_Column 
33eb0 61 6e 64 20 4f 50 5f 52 6f 77 69 64 20 6f 70 63  and OP_Rowid opc
33ec0 6f 64 65 73 20 6f 6e 20 74 68 65 73 65 20 63 75  odes on these cu
33ed0 72 73 6f 72 73 20 74 6f 20 65 78 74 72 61 63 74  rsors to extract
33ee0 0a 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20 74 68  .** data from th
33ef0 65 20 76 61 72 69 6f 75 73 20 74 61 62 6c 65 73  e various tables
33f00 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a   of the loop..**
33f10 0a 2a 2a 20 49 66 20 74 68 65 20 57 48 45 52 45  .** If the WHERE
33f20 20 63 6c 61 75 73 65 20 69 73 20 65 6d 70 74 79   clause is empty
33f30 2c 20 74 68 65 20 66 6f 72 65 61 63 68 20 6c 6f  , the foreach lo
33f40 6f 70 73 20 6d 75 73 74 20 65 61 63 68 20 73 63  ops must each sc
33f50 61 6e 20 74 68 65 69 72 0a 2a 2a 20 65 6e 74 69  an their.** enti
33f60 72 65 20 74 61 62 6c 65 73 2e 20 20 54 68 75 73  re tables.  Thus
33f70 20 61 20 74 68 72 65 65 2d 77 61 79 20 6a 6f 69   a three-way joi
33f80 6e 20 69 73 20 61 6e 20 4f 28 4e 5e 33 29 20 6f  n is an O(N^3) o
33f90 70 65 72 61 74 69 6f 6e 2e 20 20 42 75 74 20 69  peration.  But i
33fa0 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 73 20  f.** the tables 
33fb0 68 61 76 65 20 69 6e 64 69 63 65 73 20 61 6e 64  have indices and
33fc0 20 74 68 65 72 65 20 61 72 65 20 74 65 72 6d 73   there are terms
33fd0 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c   in the WHERE cl
33fe0 61 75 73 65 20 74 68 61 74 0a 2a 2a 20 72 65 66  ause that.** ref
33ff0 65 72 20 74 6f 20 74 68 6f 73 65 20 69 6e 64 69  er to those indi
34000 63 65 73 2c 20 61 20 63 6f 6d 70 6c 65 74 65 20  ces, a complete 
34010 74 61 62 6c 65 20 73 63 61 6e 20 63 61 6e 20 62  table scan can b
34020 65 20 61 76 6f 69 64 65 64 20 61 6e 64 20 74 68  e avoided and th
34030 65 0a 2a 2a 20 63 6f 64 65 20 77 69 6c 6c 20 72  e.** code will r
34040 75 6e 20 6d 75 63 68 20 66 61 73 74 65 72 2e 20  un much faster. 
34050 20 4d 6f 73 74 20 6f 66 20 74 68 65 20 77 6f 72   Most of the wor
34060 6b 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e  k of this routin
34070 65 20 69 73 20 63 68 65 63 6b 69 6e 67 0a 2a 2a  e is checking.**
34080 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 72 65   to see if there
34090 20 61 72 65 20 69 6e 64 69 63 65 73 20 74 68 61   are indices tha
340a0 74 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f  t can be used to
340b0 20 73 70 65 65 64 20 75 70 20 74 68 65 20 6c 6f   speed up the lo
340c0 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 65 72 6d 73 20  op..**.** Terms 
340d0 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
340e0 75 73 65 20 61 72 65 20 61 6c 73 6f 20 75 73 65  use are also use
340f0 64 20 74 6f 20 6c 69 6d 69 74 20 77 68 69 63 68  d to limit which
34100 20 72 6f 77 73 20 61 63 74 75 61 6c 6c 79 0a 2a   rows actually.*
34110 2a 20 6d 61 6b 65 20 69 74 20 74 6f 20 74 68 65  * make it to the
34120 20 22 2e 2e 2e 22 20 69 6e 20 74 68 65 20 6d 69   "..." in the mi
34130 64 64 6c 65 20 6f 66 20 74 68 65 20 6c 6f 6f 70  ddle of the loop
34140 2e 20 20 41 66 74 65 72 20 65 61 63 68 20 22 66  .  After each "f
34150 6f 72 65 61 63 68 22 2c 0a 2a 2a 20 74 65 72 6d  oreach",.** term
34160 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  s of the WHERE c
34170 6c 61 75 73 65 20 74 68 61 74 20 75 73 65 20 6f  lause that use o
34180 6e 6c 79 20 74 65 72 6d 73 20 69 6e 20 74 68 61  nly terms in tha
34190 74 20 6c 6f 6f 70 20 61 6e 64 20 6f 75 74 65 72  t loop and outer
341a0 0a 2a 2a 20 6c 6f 6f 70 73 20 61 72 65 20 65 76  .** loops are ev
341b0 61 6c 75 61 74 65 64 20 61 6e 64 20 69 66 20 66  aluated and if f
341c0 61 6c 73 65 20 61 20 6a 75 6d 70 20 69 73 20 6d  alse a jump is m
341d0 61 64 65 20 61 72 6f 75 6e 64 20 61 6c 6c 20 73  ade around all s
341e0 75 62 73 65 71 75 65 6e 74 0a 2a 2a 20 69 6e 6e  ubsequent.** inn
341f0 65 72 20 6c 6f 6f 70 73 20 28 6f 72 20 61 72 6f  er loops (or aro
34200 75 6e 64 20 74 68 65 20 22 2e 2e 2e 22 20 69 66  und the "..." if
34210 20 74 68 65 20 74 65 73 74 20 6f 63 63 75 72 73   the test occurs
34220 20 77 69 74 68 69 6e 20 74 68 65 20 69 6e 6e 65   within the inne
34230 72 2d 0a 2a 2a 20 6d 6f 73 74 20 6c 6f 6f 70 29  r-.** most loop)
34240 0a 2a 2a 0a 2a 2a 20 4f 55 54 45 52 20 4a 4f 49  .**.** OUTER JOI
34250 4e 53 0a 2a 2a 0a 2a 2a 20 41 6e 20 6f 75 74 65  NS.**.** An oute
34260 72 20 6a 6f 69 6e 20 6f 66 20 74 61 62 6c 65 73  r join of tables
34270 20 74 31 20 61 6e 64 20 74 32 20 69 73 20 63 6f   t1 and t2 is co
34280 6e 63 65 70 74 61 6c 6c 79 20 63 6f 64 65 64 20  nceptally coded 
34290 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
342a0 2a 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77  *    foreach row
342b0 31 20 69 6e 20 74 31 20 64 6f 0a 2a 2a 20 20 20  1 in t1 do.**   
342c0 20 20 20 66 6c 61 67 20 3d 20 30 0a 2a 2a 20 20     flag = 0.**  
342d0 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 32      foreach row2
342e0 20 69 6e 20 74 32 20 64 6f 0a 2a 2a 20 20 20 20   in t2 do.**    
342f0 20 20 20 20 73 74 61 72 74 3a 0a 2a 2a 20 20 20      start:.**   
34300 20 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20         ....**   
34310 20 20 20 20 20 20 20 66 6c 61 67 20 3d 20 31 0a         flag = 1.
34320 2a 2a 20 20 20 20 20 20 65 6e 64 0a 2a 2a 20 20  **      end.**  
34330 20 20 20 20 69 66 20 66 6c 61 67 3d 3d 30 20 74      if flag==0 t
34340 68 65 6e 0a 2a 2a 20 20 20 20 20 20 20 20 6d 6f  hen.**        mo
34350 76 65 20 74 68 65 20 72 6f 77 32 20 63 75 72 73  ve the row2 curs
34360 6f 72 20 74 6f 20 61 20 6e 75 6c 6c 20 72 6f 77  or to a null row
34370 0a 2a 2a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .**        goto 
34380 73 74 61 72 74 0a 2a 2a 20 20 20 20 20 20 66 69  start.**      fi
34390 0a 2a 2a 20 20 20 20 65 6e 64 0a 2a 2a 0a 2a 2a  .**    end.**.**
343a0 20 4f 52 44 45 52 20 42 59 20 43 4c 41 55 53 45   ORDER BY CLAUSE
343b0 20 50 52 4f 43 45 53 53 49 4e 47 0a 2a 2a 0a 2a   PROCESSING.**.*
343c0 2a 20 70 4f 72 64 65 72 42 79 20 69 73 20 61 20  * pOrderBy is a 
343d0 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 4f  pointer to the O
343e0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 28  RDER BY clause (
343f0 6f 72 20 74 68 65 20 47 52 4f 55 50 20 42 59 20  or the GROUP BY 
34400 63 6c 61 75 73 65 0a 2a 2a 20 69 66 20 74 68 65  clause.** if the
34410 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20 66   WHERE_GROUPBY f
34420 6c 61 67 20 69 73 20 73 65 74 20 69 6e 20 77 63  lag is set in wc
34430 74 72 6c 46 6c 61 67 73 29 20 6f 66 20 61 20 53  trlFlags) of a S
34440 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a  ELECT statement.
34450 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73 20 6f  ** if there is o
34460 6e 65 2e 20 20 49 66 20 74 68 65 72 65 20 69 73  ne.  If there is
34470 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 63 6c 61   no ORDER BY cla
34480 75 73 65 20 6f 72 20 69 66 20 74 68 69 73 20 72  use or if this r
34490 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c  outine.** is cal
344a0 6c 65 64 20 66 72 6f 6d 20 61 6e 20 55 50 44 41  led from an UPDA
344b0 54 45 20 6f 72 20 44 45 4c 45 54 45 20 73 74 61  TE or DELETE sta
344c0 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20 70 4f 72  tement, then pOr
344d0 64 65 72 42 79 20 69 73 20 4e 55 4c 4c 2e 0a 2a  derBy is NULL..*
344e0 2a 0a 2a 2a 20 54 68 65 20 69 49 64 78 43 75 72  *.** The iIdxCur
344f0 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68   parameter is th
34500 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  e cursor number 
34510 6f 66 20 61 6e 20 69 6e 64 65 78 2e 20 20 49 66  of an index.  If
34520 20 0a 2a 2a 20 57 48 45 52 45 5f 4f 4e 45 54 41   .** WHERE_ONETA
34530 42 4c 45 5f 4f 4e 4c 59 20 69 73 20 73 65 74 2c  BLE_ONLY is set,
34540 20 69 49 64 78 43 75 72 20 69 73 20 74 68 65 20   iIdxCur is the 
34550 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66  cursor number of
34560 20 61 6e 20 69 6e 64 65 78 0a 2a 2a 20 74 6f 20   an index.** to 
34570 75 73 65 20 66 6f 72 20 4f 52 20 63 6c 61 75 73  use for OR claus
34580 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 54  e processing.  T
34590 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
345a0 73 68 6f 75 6c 64 20 75 73 65 20 74 68 69 73 0a  should use this.
345b0 2a 2a 20 73 70 65 63 69 66 69 63 20 63 75 72 73  ** specific curs
345c0 6f 72 2e 20 20 49 66 20 57 48 45 52 45 5f 4f 4e  or.  If WHERE_ON
345d0 45 50 41 53 53 5f 44 45 53 49 52 45 44 20 69 73  EPASS_DESIRED is
345e0 20 73 65 74 2c 20 74 68 65 6e 20 69 49 64 78 43   set, then iIdxC
345f0 75 72 20 69 73 0a 2a 2a 20 74 68 65 20 66 69 72  ur is.** the fir
34600 73 74 20 63 75 72 73 6f 72 20 69 6e 20 61 6e 20  st cursor in an 
34610 61 72 72 61 79 20 6f 66 20 63 75 72 73 6f 72 73  array of cursors
34620 20 66 6f 72 20 61 6c 6c 20 69 6e 64 69 63 65 73   for all indices
34630 2e 20 20 69 49 64 78 43 75 72 20 73 68 6f 75 6c  .  iIdxCur shoul
34640 64 0a 2a 2a 20 62 65 20 75 73 65 64 20 74 6f 20  d.** be used to 
34650 63 6f 6d 70 75 74 65 20 74 68 65 20 61 70 70 72  compute the appr
34660 6f 70 72 69 61 74 65 20 63 75 72 73 6f 72 20 64  opriate cursor d
34670 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 69 63  epending on whic
34680 68 20 69 6e 64 65 78 20 69 73 0a 2a 2a 20 75 73  h index is.** us
34690 65 64 2e 0a 2a 2f 0a 57 68 65 72 65 49 6e 66 6f  ed..*/.WhereInfo
346a0 20 2a 73 71 6c 69 74 65 33 57 68 65 72 65 42 65   *sqlite3WhereBe
346b0 67 69 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50  gin(.  Parse *pP
346c0 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  arse,        /* 
346d0 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65  The parser conte
346e0 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  xt */.  SrcList 
346f0 2a 70 54 61 62 4c 69 73 74 2c 20 20 20 20 2f 2a  *pTabList,    /*
34700 20 46 52 4f 4d 20 63 6c 61 75 73 65 3a 20 41 20   FROM clause: A 
34710 6c 69 73 74 20 6f 66 20 61 6c 6c 20 74 61 62 6c  list of all tabl
34720 65 73 20 74 6f 20 62 65 20 73 63 61 6e 6e 65 64  es to be scanned
34730 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65   */.  Expr *pWhe
34740 72 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54  re,         /* T
34750 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
34760 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
34770 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a 20 41 6e  OrderBy,   /* An
34780 20 4f 52 44 45 52 20 42 59 20 28 6f 72 20 47 52   ORDER BY (or GR
34790 4f 55 50 20 42 59 29 20 63 6c 61 75 73 65 2c 20  OUP BY) clause, 
347a0 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70  or NULL */.  Exp
347b0 72 4c 69 73 74 20 2a 70 52 65 73 75 6c 74 53 65  rList *pResultSe
347c0 74 2c 20 2f 2a 20 52 65 73 75 6c 74 20 73 65 74  t, /* Result set
347d0 20 6f 66 20 74 68 65 20 71 75 65 72 79 20 2a 2f   of the query */
347e0 0a 20 20 75 31 36 20 77 63 74 72 6c 46 6c 61 67  .  u16 wctrlFlag
347f0 73 2c 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20  s,       /* One 
34800 6f 66 20 74 68 65 20 57 48 45 52 45 5f 2a 20 66  of the WHERE_* f
34810 6c 61 67 73 20 64 65 66 69 6e 65 64 20 69 6e 20  lags defined in 
34820 73 71 6c 69 74 65 49 6e 74 2e 68 20 2a 2f 0a 20  sqliteInt.h */. 
34830 20 69 6e 74 20 69 49 64 78 43 75 72 20 20 20 20   int iIdxCur    
34840 20 20 20 20 20 20 20 2f 2a 20 49 66 20 57 48 45         /* If WHE
34850 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59  RE_ONETABLE_ONLY
34860 20 69 73 20 73 65 74 2c 20 69 6e 64 65 78 20 63   is set, index c
34870 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 2a 2f 0a  ursor number */.
34880 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 57 49  ){.  int nByteWI
34890 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20  nfo;            
348a0 2f 2a 20 4e 75 6d 2e 20 62 79 74 65 73 20 61 6c  /* Num. bytes al
348b0 6c 6f 63 61 74 65 64 20 66 6f 72 20 57 68 65 72  located for Wher
348c0 65 49 6e 66 6f 20 73 74 72 75 63 74 20 2a 2f 0a  eInfo struct */.
348d0 20 20 69 6e 74 20 6e 54 61 62 4c 69 73 74 3b 20    int nTabList; 
348e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
348f0 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e  Number of elemen
34900 74 73 20 69 6e 20 70 54 61 62 4c 69 73 74 20 2a  ts in pTabList *
34910 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  /.  WhereInfo *p
34920 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 2f  WInfo;         /
34930 2a 20 57 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68  * Will become th
34940 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f  e return value o
34950 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  f this function 
34960 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  */.  Vdbe *v = p
34970 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20  Parse->pVdbe;   
34980 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20 64  /* The virtual d
34990 61 74 61 62 61 73 65 20 65 6e 67 69 6e 65 20 2a  atabase engine *
349a0 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52  /.  Bitmask notR
349b0 65 61 64 79 3b 20 20 20 20 20 20 20 20 20 20 2f  eady;          /
349c0 2a 20 43 75 72 73 6f 72 73 20 74 68 61 74 20 61  * Cursors that a
349d0 72 65 20 6e 6f 74 20 79 65 74 20 70 6f 73 69 74  re not yet posit
349e0 69 6f 6e 65 64 20 2a 2f 0a 20 20 57 68 65 72 65  ioned */.  Where
349f0 4c 6f 6f 70 42 75 69 6c 64 65 72 20 73 57 4c 42  LoopBuilder sWLB
34a00 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 57 68 65  ;     /* The Whe
34a10 72 65 4c 6f 6f 70 20 62 75 69 6c 64 65 72 20 2a  reLoop builder *
34a20 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b 53 65 74  /.  WhereMaskSet
34a30 20 2a 70 4d 61 73 6b 53 65 74 3b 20 20 20 20 2f   *pMaskSet;    /
34a40 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * The expression
34a50 20 6d 61 73 6b 20 73 65 74 20 2a 2f 0a 20 20 57   mask set */.  W
34a60 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65  hereLevel *pLeve
34a70 6c 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73  l;        /* A s
34a80 69 6e 67 6c 65 20 6c 65 76 65 6c 20 69 6e 20 70  ingle level in p
34a90 57 49 6e 66 6f 2d 3e 61 5b 5d 20 2a 2f 0a 20 20  WInfo->a[] */.  
34aa0 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70  WhereLoop *pLoop
34ab0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f  ;          /* Po
34ac0 69 6e 74 65 72 20 74 6f 20 61 20 73 69 6e 67 6c  inter to a singl
34ad0 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65  e WhereLoop obje
34ae0 63 74 20 2a 2f 0a 20 20 69 6e 74 20 69 69 3b 20  ct */.  int ii; 
34af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34b00 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
34b10 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  er */.  sqlite3 
34b20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  *db;            
34b30 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63     /* Database c
34b40 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69  onnection */.  i
34b50 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
34b60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
34b70 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 0a 20 20  urn code */...  
34b80 2f 2a 20 56 61 72 69 61 62 6c 65 20 69 6e 69 74  /* Variable init
34b90 69 61 6c 69 7a 61 74 69 6f 6e 20 2a 2f 0a 20 20  ialization */.  
34ba0 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
34bb0 0a 20 20 6d 65 6d 73 65 74 28 26 73 57 4c 42 2c  .  memset(&sWLB,
34bc0 20 30 2c 20 73 69 7a 65 6f 66 28 73 57 4c 42 29   0, sizeof(sWLB)
34bd0 29 3b 0a 0a 20 20 2f 2a 20 41 6e 20 4f 52 44 45  );..  /* An ORDE
34be0 52 2f 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  R/GROUP BY claus
34bf0 65 20 6f 66 20 6d 6f 72 65 20 74 68 61 6e 20 36  e of more than 6
34c00 33 20 74 65 72 6d 73 20 63 61 6e 6e 6f 74 20 62  3 terms cannot b
34c10 65 20 6f 70 74 69 6d 69 7a 65 64 20 2a 2f 0a 20  e optimized */. 
34c20 20 74 65 73 74 63 61 73 65 28 20 70 4f 72 64 65   testcase( pOrde
34c30 72 42 79 20 26 26 20 70 4f 72 64 65 72 42 79 2d  rBy && pOrderBy-
34c40 3e 6e 45 78 70 72 3d 3d 42 4d 53 2d 31 20 29 3b  >nExpr==BMS-1 );
34c50 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20  .  if( pOrderBy 
34c60 26 26 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  && pOrderBy->nEx
34c70 70 72 3e 3d 42 4d 53 20 29 20 70 4f 72 64 65 72  pr>=BMS ) pOrder
34c80 42 79 20 3d 20 30 3b 0a 20 20 73 57 4c 42 2e 70  By = 0;.  sWLB.p
34c90 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72  OrderBy = pOrder
34ca0 42 79 3b 0a 0a 20 20 2f 2a 20 44 69 73 61 62 6c  By;..  /* Disabl
34cb0 65 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6f  e the DISTINCT o
34cc0 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 66 20 53  ptimization if S
34cd0 51 4c 49 54 45 5f 44 69 73 74 69 6e 63 74 4f 70  QLITE_DistinctOp
34ce0 74 20 69 73 20 73 65 74 20 76 69 61 0a 20 20 2a  t is set via.  *
34cf0 2a 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63  * sqlite3_test_c
34d00 74 72 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  trl(SQLITE_TESTC
34d10 54 52 4c 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e  TRL_OPTIMIZATION
34d20 53 2c 2e 2e 2e 29 20 2a 2f 0a 20 20 69 66 28 20  S,...) */.  if( 
34d30 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 44 69 73 61  OptimizationDisa
34d40 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f  bled(db, SQLITE_
34d50 44 69 73 74 69 6e 63 74 4f 70 74 29 20 29 7b 0a  DistinctOpt) ){.
34d60 20 20 20 20 77 63 74 72 6c 46 6c 61 67 73 20 26      wctrlFlags &
34d70 3d 20 7e 57 48 45 52 45 5f 57 41 4e 54 5f 44 49  = ~WHERE_WANT_DI
34d80 53 54 49 4e 43 54 3b 0a 20 20 7d 0a 0a 20 20 2f  STINCT;.  }..  /
34d90 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * The number of 
34da0 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52  tables in the FR
34db0 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 6c 69 6d  OM clause is lim
34dc0 69 74 65 64 20 62 79 20 74 68 65 20 6e 75 6d 62  ited by the numb
34dd0 65 72 20 6f 66 0a 20 20 2a 2a 20 62 69 74 73 20  er of.  ** bits 
34de0 69 6e 20 61 20 42 69 74 6d 61 73 6b 20 0a 20 20  in a Bitmask .  
34df0 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  */.  testcase( p
34e00 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3d 3d 42  TabList->nSrc==B
34e10 4d 53 20 29 3b 0a 20 20 69 66 28 20 70 54 61 62  MS );.  if( pTab
34e20 4c 69 73 74 2d 3e 6e 53 72 63 3e 42 4d 53 20 29  List->nSrc>BMS )
34e30 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
34e40 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61  orMsg(pParse, "a
34e50 74 20 6d 6f 73 74 20 25 64 20 74 61 62 6c 65 73  t most %d tables
34e60 20 69 6e 20 61 20 6a 6f 69 6e 22 2c 20 42 4d 53   in a join", BMS
34e70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
34e80 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 69 73 20  .  }..  /* This 
34e90 66 75 6e 63 74 69 6f 6e 20 6e 6f 72 6d 61 6c 6c  function normall
34ea0 79 20 67 65 6e 65 72 61 74 65 73 20 61 20 6e 65  y generates a ne
34eb0 73 74 65 64 20 6c 6f 6f 70 20 66 6f 72 20 61 6c  sted loop for al
34ec0 6c 20 74 61 62 6c 65 73 20 69 6e 20 0a 20 20 2a  l tables in .  *
34ed0 2a 20 70 54 61 62 4c 69 73 74 2e 20 20 42 75 74  * pTabList.  But
34ee0 20 69 66 20 74 68 65 20 57 48 45 52 45 5f 4f 4e   if the WHERE_ON
34ef0 45 54 41 42 4c 45 5f 4f 4e 4c 59 20 66 6c 61 67  ETABLE_ONLY flag
34f00 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 77 65   is set, then we
34f10 20 73 68 6f 75 6c 64 0a 20 20 2a 2a 20 6f 6e 6c   should.  ** onl
34f20 79 20 67 65 6e 65 72 61 74 65 20 63 6f 64 65 20  y generate code 
34f30 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 74 61  for the first ta
34f40 62 6c 65 20 69 6e 20 70 54 61 62 4c 69 73 74 20  ble in pTabList 
34f50 61 6e 64 20 61 73 73 75 6d 65 20 74 68 61 74 0a  and assume that.
34f60 20 20 2a 2a 20 61 6e 79 20 63 75 72 73 6f 72 73    ** any cursors
34f70 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
34f80 20 73 75 62 73 65 71 75 65 6e 74 20 74 61 62 6c   subsequent tabl
34f90 65 73 20 61 72 65 20 75 6e 69 6e 69 74 69 61 6c  es are uninitial
34fa0 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 6e 54 61  ized..  */.  nTa
34fb0 62 4c 69 73 74 20 3d 20 28 77 63 74 72 6c 46 6c  bList = (wctrlFl
34fc0 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 54  ags & WHERE_ONET
34fd0 41 42 4c 45 5f 4f 4e 4c 59 29 20 3f 20 31 20 3a  ABLE_ONLY) ? 1 :
34fe0 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b   pTabList->nSrc;
34ff0 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
35000 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 74  and initialize t
35010 68 65 20 57 68 65 72 65 49 6e 66 6f 20 73 74 72  he WhereInfo str
35020 75 63 74 75 72 65 20 74 68 61 74 20 77 69 6c 6c  ucture that will
35030 20 62 65 63 6f 6d 65 20 74 68 65 0a 20 20 2a 2a   become the.  **
35040 20 72 65 74 75 72 6e 20 76 61 6c 75 65 2e 20 41   return value. A
35050 20 73 69 6e 67 6c 65 20 61 6c 6c 6f 63 61 74 69   single allocati
35060 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 73 74  on is used to st
35070 6f 72 65 20 74 68 65 20 57 68 65 72 65 49 6e 66  ore the WhereInf
35080 6f 0a 20 20 2a 2a 20 73 74 72 75 63 74 2c 20 74  o.  ** struct, t
35090 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 57  he contents of W
350a0 68 65 72 65 49 6e 66 6f 2e 61 5b 5d 2c 20 74 68  hereInfo.a[], th
350b0 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 73 74  e WhereClause st
350c0 72 75 63 74 75 72 65 0a 20 20 2a 2a 20 61 6e 64  ructure.  ** and
350d0 20 74 68 65 20 57 68 65 72 65 4d 61 73 6b 53 65   the WhereMaskSe
350e0 74 20 73 74 72 75 63 74 75 72 65 2e 20 53 69 6e  t structure. Sin
350f0 63 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 63  ce WhereClause c
35100 6f 6e 74 61 69 6e 73 20 61 6e 20 38 2d 62 79 74  ontains an 8-byt
35110 65 0a 20 20 2a 2a 20 66 69 65 6c 64 20 28 74 79  e.  ** field (ty
35120 70 65 20 42 69 74 6d 61 73 6b 29 20 69 74 20 6d  pe Bitmask) it m
35130 75 73 74 20 62 65 20 61 6c 69 67 6e 65 64 20 6f  ust be aligned o
35140 6e 20 61 6e 20 38 2d 62 79 74 65 20 62 6f 75 6e  n an 8-byte boun
35150 64 61 72 79 20 6f 6e 0a 20 20 2a 2a 20 73 6f 6d  dary on.  ** som
35160 65 20 61 72 63 68 69 74 65 63 74 75 72 65 73 2e  e architectures.
35170 20 48 65 6e 63 65 20 74 68 65 20 52 4f 55 4e 44   Hence the ROUND
35180 38 28 29 20 62 65 6c 6f 77 2e 0a 20 20 2a 2f 0a  8() below..  */.
35190 20 20 6e 42 79 74 65 57 49 6e 66 6f 20 3d 20 52    nByteWInfo = R
351a0 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 57 68 65  OUND8(sizeof(Whe
351b0 72 65 49 6e 66 6f 29 2b 28 6e 54 61 62 4c 69 73  reInfo)+(nTabLis
351c0 74 2d 31 29 2a 73 69 7a 65 6f 66 28 57 68 65 72  t-1)*sizeof(Wher
351d0 65 4c 65 76 65 6c 29 29 3b 0a 20 20 70 57 49 6e  eLevel));.  pWIn
351e0 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  fo = sqlite3DbMa
351f0 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79  llocZero(db, nBy
35200 74 65 57 49 6e 66 6f 20 2b 20 73 69 7a 65 6f 66  teWInfo + sizeof
35210 28 57 68 65 72 65 4c 6f 6f 70 29 29 3b 0a 20 20  (WhereLoop));.  
35220 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
35230 69 6c 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69  iled ){.    sqli
35240 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 57  te3DbFree(db, pW
35250 49 6e 66 6f 29 3b 0a 20 20 20 20 70 57 49 6e 66  Info);.    pWInf
35260 6f 20 3d 20 30 3b 0a 20 20 20 20 67 6f 74 6f 20  o = 0;.    goto 
35270 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b  whereBeginError;
35280 0a 20 20 7d 0a 20 20 70 57 49 6e 66 6f 2d 3e 61  .  }.  pWInfo->a
35290 69 43 75 72 4f 6e 65 50 61 73 73 5b 30 5d 20 3d  iCurOnePass[0] =
352a0 20 70 57 49 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e   pWInfo->aiCurOn
352b0 65 50 61 73 73 5b 31 5d 20 3d 20 2d 31 3b 0a 20  ePass[1] = -1;. 
352c0 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 20   pWInfo->nLevel 
352d0 3d 20 6e 54 61 62 4c 69 73 74 3b 0a 20 20 70 57  = nTabList;.  pW
352e0 49 6e 66 6f 2d 3e 70 50 61 72 73 65 20 3d 20 70  Info->pParse = p
352f0 50 61 72 73 65 3b 0a 20 20 70 57 49 6e 66 6f 2d  Parse;.  pWInfo-
35300 3e 70 54 61 62 4c 69 73 74 20 3d 20 70 54 61 62  >pTabList = pTab
35310 4c 69 73 74 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e  List;.  pWInfo->
35320 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65  pOrderBy = pOrde
35330 72 42 79 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70  rBy;.  pWInfo->p
35340 52 65 73 75 6c 74 53 65 74 20 3d 20 70 52 65 73  ResultSet = pRes
35350 75 6c 74 53 65 74 3b 0a 20 20 70 57 49 6e 66 6f  ultSet;.  pWInfo
35360 2d 3e 69 42 72 65 61 6b 20 3d 20 70 57 49 6e 66  ->iBreak = pWInf
35370 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 20 3d 20 73  o->iContinue = s
35380 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
35390 62 65 6c 28 76 29 3b 0a 20 20 70 57 49 6e 66 6f  bel(v);.  pWInfo
353a0 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 3d 20 77  ->wctrlFlags = w
353b0 63 74 72 6c 46 6c 61 67 73 3b 0a 20 20 70 57 49  ctrlFlags;.  pWI
353c0 6e 66 6f 2d 3e 73 61 76 65 64 4e 51 75 65 72 79  nfo->savedNQuery
353d0 4c 6f 6f 70 20 3d 20 70 50 61 72 73 65 2d 3e 6e  Loop = pParse->n
353e0 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 70 4d 61  QueryLoop;.  pMa
353f0 73 6b 53 65 74 20 3d 20 26 70 57 49 6e 66 6f 2d  skSet = &pWInfo-
35400 3e 73 4d 61 73 6b 53 65 74 3b 0a 20 20 73 57 4c  >sMaskSet;.  sWL
35410 42 2e 70 57 49 6e 66 6f 20 3d 20 70 57 49 6e 66  B.pWInfo = pWInf
35420 6f 3b 0a 20 20 73 57 4c 42 2e 70 57 43 20 3d 20  o;.  sWLB.pWC = 
35430 26 70 57 49 6e 66 6f 2d 3e 73 57 43 3b 0a 20 20  &pWInfo->sWC;.  
35440 73 57 4c 42 2e 70 4e 65 77 20 3d 20 28 57 68 65  sWLB.pNew = (Whe
35450 72 65 4c 6f 6f 70 2a 29 28 28 28 63 68 61 72 2a  reLoop*)(((char*
35460 29 70 57 49 6e 66 6f 29 2b 6e 42 79 74 65 57 49  )pWInfo)+nByteWI
35470 6e 66 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20  nfo);.  assert( 
35480 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e  EIGHT_BYTE_ALIGN
35490 4d 45 4e 54 28 73 57 4c 42 2e 70 4e 65 77 29 20  MENT(sWLB.pNew) 
354a0 29 3b 0a 20 20 77 68 65 72 65 4c 6f 6f 70 49 6e  );.  whereLoopIn
354b0 69 74 28 73 57 4c 42 2e 70 4e 65 77 29 3b 0a 23  it(sWLB.pNew);.#
354c0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
354d0 55 47 0a 20 20 73 57 4c 42 2e 70 4e 65 77 2d 3e  UG.  sWLB.pNew->
354e0 63 49 64 20 3d 20 27 2a 27 3b 0a 23 65 6e 64 69  cId = '*';.#endi
354f0 66 0a 0a 20 20 2f 2a 20 53 70 6c 69 74 20 74 68  f..  /* Split th
35500 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69  e WHERE clause i
35510 6e 74 6f 20 73 65 70 61 72 61 74 65 20 73 75 62  nto separate sub
35520 65 78 70 72 65 73 73 69 6f 6e 73 20 77 68 65 72  expressions wher
35530 65 20 65 61 63 68 0a 20 20 2a 2a 20 73 75 62 65  e each.  ** sube
35540 78 70 72 65 73 73 69 6f 6e 20 69 73 20 73 65 70  xpression is sep
35550 61 72 61 74 65 64 20 62 79 20 61 6e 20 41 4e 44  arated by an AND
35560 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 2a 2f 0a   operator..  */.
35570 20 20 69 6e 69 74 4d 61 73 6b 53 65 74 28 70 4d    initMaskSet(pM
35580 61 73 6b 53 65 74 29 3b 0a 20 20 77 68 65 72 65  askSet);.  where
35590 43 6c 61 75 73 65 49 6e 69 74 28 26 70 57 49 6e  ClauseInit(&pWIn
355a0 66 6f 2d 3e 73 57 43 2c 20 70 57 49 6e 66 6f 29  fo->sWC, pWInfo)
355b0 3b 0a 20 20 77 68 65 72 65 53 70 6c 69 74 28 26  ;.  whereSplit(&
355c0 70 57 49 6e 66 6f 2d 3e 73 57 43 2c 20 70 57 68  pWInfo->sWC, pWh
355d0 65 72 65 2c 20 54 4b 5f 41 4e 44 29 3b 0a 20 20  ere, TK_AND);.  
355e0 20 20 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c 20    .  /* Special 
355f0 63 61 73 65 3a 20 61 20 57 48 45 52 45 20 63 6c  case: a WHERE cl
35600 61 75 73 65 20 74 68 61 74 20 69 73 20 63 6f 6e  ause that is con
35610 73 74 61 6e 74 2e 20 20 45 76 61 6c 75 61 74 65  stant.  Evaluate
35620 20 74 68 65 0a 20 20 2a 2a 20 65 78 70 72 65 73   the.  ** expres
35630 73 69 6f 6e 20 61 6e 64 20 65 69 74 68 65 72 20  sion and either 
35640 6a 75 6d 70 20 6f 76 65 72 20 61 6c 6c 20 6f 66  jump over all of
35650 20 74 68 65 20 63 6f 64 65 20 6f 72 20 66 61 6c   the code or fal
35660 6c 20 74 68 72 75 2e 0a 20 20 2a 2f 0a 20 20 66  l thru..  */.  f
35670 6f 72 28 69 69 3d 30 3b 20 69 69 3c 73 57 4c 42  or(ii=0; ii<sWLB
35680 2e 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 69 2b  .pWC->nTerm; ii+
35690 2b 29 7b 0a 20 20 20 20 69 66 28 20 6e 54 61 62  +){.    if( nTab
356a0 4c 69 73 74 3d 3d 30 20 7c 7c 20 73 71 6c 69 74  List==0 || sqlit
356b0 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
356c0 4e 6f 74 4a 6f 69 6e 28 73 57 4c 42 2e 70 57 43  NotJoin(sWLB.pWC
356d0 2d 3e 61 5b 69 69 5d 2e 70 45 78 70 72 29 20 29  ->a[ii].pExpr) )
356e0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
356f0 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
35700 65 2c 20 73 57 4c 42 2e 70 57 43 2d 3e 61 5b 69  e, sWLB.pWC->a[i
35710 69 5d 2e 70 45 78 70 72 2c 20 70 57 49 6e 66 6f  i].pExpr, pWInfo
35720 2d 3e 69 42 72 65 61 6b 2c 0a 20 20 20 20 20 20  ->iBreak,.      
35730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35740 20 20 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46     SQLITE_JUMPIF
35750 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 57 4c  NULL);.      sWL
35760 42 2e 70 57 43 2d 3e 61 5b 69 69 5d 2e 77 74 46  B.pWC->a[ii].wtF
35770 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44  lags |= TERM_COD
35780 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ED;.    }.  }.. 
35790 20 2f 2a 20 53 70 65 63 69 61 6c 20 63 61 73 65   /* Special case
357a0 3a 20 4e 6f 20 46 52 4f 4d 20 63 6c 61 75 73 65  : No FROM clause
357b0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 54 61 62  .  */.  if( nTab
357c0 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69  List==0 ){.    i
357d0 66 28 20 70 4f 72 64 65 72 42 79 20 29 20 70 57  f( pOrderBy ) pW
357e0 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 20 3d 20 70  Info->nOBSat = p
357f0 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a  OrderBy->nExpr;.
35800 20 20 20 20 69 66 28 20 77 63 74 72 6c 46 6c 61      if( wctrlFla
35810 67 73 20 26 20 57 48 45 52 45 5f 57 41 4e 54 5f  gs & WHERE_WANT_
35820 44 49 53 54 49 4e 43 54 20 29 7b 0a 20 20 20 20  DISTINCT ){.    
35830 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69    pWInfo->eDisti
35840 6e 63 74 20 3d 20 57 48 45 52 45 5f 44 49 53 54  nct = WHERE_DIST
35850 49 4e 43 54 5f 55 4e 49 51 55 45 3b 0a 20 20 20  INCT_UNIQUE;.   
35860 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 73 73   }.  }..  /* Ass
35870 69 67 6e 20 61 20 62 69 74 20 66 72 6f 6d 20 74  ign a bit from t
35880 68 65 20 62 69 74 6d 61 73 6b 20 74 6f 20 65 76  he bitmask to ev
35890 65 72 79 20 74 65 72 6d 20 69 6e 20 74 68 65 20  ery term in the 
358a0 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 20 20 2a  FROM clause..  *
358b0 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 61 73 73 69  *.  ** When assi
358c0 67 6e 69 6e 67 20 62 69 74 6d 61 73 6b 20 76 61  gning bitmask va
358d0 6c 75 65 73 20 74 6f 20 46 52 4f 4d 20 63 6c 61  lues to FROM cla
358e0 75 73 65 20 63 75 72 73 6f 72 73 2c 20 69 74 20  use cursors, it 
358f0 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20 74 68 65  must be.  ** the
35900 20 63 61 73 65 20 74 68 61 74 20 69 66 20 58 20   case that if X 
35910 69 73 20 74 68 65 20 62 69 74 6d 61 73 6b 20 66  is the bitmask f
35920 6f 72 20 74 68 65 20 4e 2d 74 68 20 46 52 4f 4d  or the N-th FROM
35930 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74 68 65   clause term the
35940 6e 0a 20 20 2a 2a 20 74 68 65 20 62 69 74 6d 61  n.  ** the bitma
35950 73 6b 20 66 6f 72 20 61 6c 6c 20 46 52 4f 4d 20  sk for all FROM 
35960 63 6c 61 75 73 65 20 74 65 72 6d 73 20 74 6f 20  clause terms to 
35970 74 68 65 20 6c 65 66 74 20 6f 66 20 74 68 65 20  the left of the 
35980 4e 2d 74 68 20 74 65 72 6d 0a 20 20 2a 2a 20 69  N-th term.  ** i
35990 73 20 28 58 2d 31 29 2e 20 20 20 41 6e 20 65 78  s (X-1).   An ex
359a0 70 72 65 73 73 69 6f 6e 20 66 72 6f 6d 20 74 68  pression from th
359b0 65 20 4f 4e 20 63 6c 61 75 73 65 20 6f 66 20 61  e ON clause of a
359c0 20 4c 45 46 54 20 4a 4f 49 4e 20 63 61 6e 20 75   LEFT JOIN can u
359d0 73 65 0a 20 20 2a 2a 20 69 74 73 20 45 78 70 72  se.  ** its Expr
359e0 2e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65  .iRightJoinTable
359f0 20 76 61 6c 75 65 20 74 6f 20 66 69 6e 64 20 74   value to find t
35a00 68 65 20 62 69 74 6d 61 73 6b 20 6f 66 20 74 68  he bitmask of th
35a10 65 20 72 69 67 68 74 20 74 61 62 6c 65 0a 20 20  e right table.  
35a20 2a 2a 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20  ** of the join. 
35a30 20 53 75 62 74 72 61 63 74 69 6e 67 20 6f 6e 65   Subtracting one
35a40 20 66 72 6f 6d 20 74 68 65 20 72 69 67 68 74 20   from the right 
35a50 74 61 62 6c 65 20 62 69 74 6d 61 73 6b 20 67 69  table bitmask gi
35a60 76 65 73 20 61 0a 20 20 2a 2a 20 62 69 74 6d 61  ves a.  ** bitma
35a70 73 6b 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65  sk for all table
35a80 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66  s to the left of
35a90 20 74 68 65 20 6a 6f 69 6e 2e 20 20 4b 6e 6f 77   the join.  Know
35aa0 69 6e 67 20 74 68 65 20 62 69 74 6d 61 73 6b 0a  ing the bitmask.
35ab0 20 20 2a 2a 20 66 6f 72 20 61 6c 6c 20 74 61 62    ** for all tab
35ac0 6c 65 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20  les to the left 
35ad0 6f 66 20 61 20 6c 65 66 74 20 6a 6f 69 6e 20 69  of a left join i
35ae0 73 20 69 6d 70 6f 72 74 61 6e 74 2e 20 20 54 69  s important.  Ti
35af0 63 6b 65 74 20 23 33 30 31 35 2e 0a 20 20 2a 2a  cket #3015..  **
35b00 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  .  ** Note that 
35b10 62 69 74 6d 61 73 6b 73 20 61 72 65 20 63 72 65  bitmasks are cre
35b20 61 74 65 64 20 66 6f 72 20 61 6c 6c 20 70 54 61  ated for all pTa
35b30 62 4c 69 73 74 2d 3e 6e 53 72 63 20 74 61 62 6c  bList->nSrc tabl
35b40 65 73 20 69 6e 0a 20 20 2a 2a 20 70 54 61 62 4c  es in.  ** pTabL
35b50 69 73 74 2c 20 6e 6f 74 20 6a 75 73 74 20 74 68  ist, not just th
35b60 65 20 66 69 72 73 74 20 6e 54 61 62 4c 69 73 74  e first nTabList
35b70 20 74 61 62 6c 65 73 2e 20 20 6e 54 61 62 4c 69   tables.  nTabLi
35b80 73 74 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 0a 20  st is normally. 
35b90 20 2a 2a 20 65 71 75 61 6c 20 74 6f 20 70 54 61   ** equal to pTa
35ba0 62 4c 69 73 74 2d 3e 6e 53 72 63 20 62 75 74 20  bList->nSrc but 
35bb0 6d 69 67 68 74 20 62 65 20 73 68 6f 72 74 65 6e  might be shorten
35bc0 65 64 20 74 6f 20 31 20 69 66 20 74 68 65 0a 20  ed to 1 if the. 
35bd0 20 2a 2a 20 57 48 45 52 45 5f 4f 4e 45 54 41 42   ** WHERE_ONETAB
35be0 4c 45 5f 4f 4e 4c 59 20 66 6c 61 67 20 69 73 20  LE_ONLY flag is 
35bf0 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  set..  */.  for(
35c00 69 69 3d 30 3b 20 69 69 3c 70 54 61 62 4c 69 73  ii=0; ii<pTabLis
35c10 74 2d 3e 6e 53 72 63 3b 20 69 69 2b 2b 29 7b 0a  t->nSrc; ii++){.
35c20 20 20 20 20 63 72 65 61 74 65 4d 61 73 6b 28 70      createMask(p
35c30 4d 61 73 6b 53 65 74 2c 20 70 54 61 62 4c 69 73  MaskSet, pTabLis
35c40 74 2d 3e 61 5b 69 69 5d 2e 69 43 75 72 73 6f 72  t->a[ii].iCursor
35c50 29 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 4e  );.  }.#ifndef N
35c60 44 45 42 55 47 0a 20 20 7b 0a 20 20 20 20 42 69  DEBUG.  {.    Bi
35c70 74 6d 61 73 6b 20 74 6f 54 68 65 4c 65 66 74 20  tmask toTheLeft 
35c80 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d  = 0;.    for(ii=
35c90 30 3b 20 69 69 3c 70 54 61 62 4c 69 73 74 2d 3e  0; ii<pTabList->
35ca0 6e 53 72 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  nSrc; ii++){.   
35cb0 20 20 20 42 69 74 6d 61 73 6b 20 6d 20 3d 20 67     Bitmask m = g
35cc0 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c  etMask(pMaskSet,
35cd0 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 69 5d   pTabList->a[ii]
35ce0 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20  .iCursor);.     
35cf0 20 61 73 73 65 72 74 28 20 28 6d 2d 31 29 3d 3d   assert( (m-1)==
35d00 74 6f 54 68 65 4c 65 66 74 20 29 3b 0a 20 20 20  toTheLeft );.   
35d10 20 20 20 74 6f 54 68 65 4c 65 66 74 20 7c 3d 20     toTheLeft |= 
35d20 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  m;.    }.  }.#en
35d30 64 69 66 0a 0a 20 20 2f 2a 20 41 6e 61 6c 79 7a  dif..  /* Analyz
35d40 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 73 75 62  e all of the sub
35d50 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 20 4e 6f  expressions.  No
35d60 74 65 20 74 68 61 74 20 65 78 70 72 41 6e 61 6c  te that exprAnal
35d70 79 7a 65 28 29 20 6d 69 67 68 74 0a 20 20 2a 2a  yze() might.  **
35d80 20 61 64 64 20 6e 65 77 20 76 69 72 74 75 61 6c   add new virtual
35d90 20 74 65 72 6d 73 20 6f 6e 74 6f 20 74 68 65 20   terms onto the 
35da0 65 6e 64 20 6f 66 20 74 68 65 20 57 48 45 52 45  end of the WHERE
35db0 20 63 6c 61 75 73 65 2e 20 20 57 65 20 64 6f 20   clause.  We do 
35dc0 6e 6f 74 0a 20 20 2a 2a 20 77 61 6e 74 20 74 6f  not.  ** want to
35dd0 20 61 6e 61 6c 79 7a 65 20 74 68 65 73 65 20 76   analyze these v
35de0 69 72 74 75 61 6c 20 74 65 72 6d 73 2c 20 73 6f  irtual terms, so
35df0 20 73 74 61 72 74 20 61 6e 61 6c 79 7a 69 6e 67   start analyzing
35e00 20 61 74 20 74 68 65 20 65 6e 64 0a 20 20 2a 2a   at the end.  **
35e10 20 61 6e 64 20 77 6f 72 6b 20 66 6f 72 77 61 72   and work forwar
35e20 64 20 73 6f 20 74 68 61 74 20 74 68 65 20 61 64  d so that the ad
35e30 64 65 64 20 76 69 72 74 75 61 6c 20 74 65 72 6d  ded virtual term
35e40 73 20 61 72 65 20 6e 65 76 65 72 20 70 72 6f 63  s are never proc
35e50 65 73 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 65 78  essed..  */.  ex
35e60 70 72 41 6e 61 6c 79 7a 65 41 6c 6c 28 70 54 61  prAnalyzeAll(pTa
35e70 62 4c 69 73 74 2c 20 26 70 57 49 6e 66 6f 2d 3e  bList, &pWInfo->
35e80 73 57 43 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  sWC);.  if( db->
35e90 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
35ea0 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65 42 65      goto whereBe
35eb0 67 69 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a 0a 20  ginError;.  }.. 
35ec0 20 69 66 28 20 77 63 74 72 6c 46 6c 61 67 73 20   if( wctrlFlags 
35ed0 26 20 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53  & WHERE_WANT_DIS
35ee0 54 49 4e 43 54 20 29 7b 0a 20 20 20 20 69 66 28  TINCT ){.    if(
35ef0 20 69 73 44 69 73 74 69 6e 63 74 52 65 64 75 6e   isDistinctRedun
35f00 64 61 6e 74 28 70 50 61 72 73 65 2c 20 70 54 61  dant(pParse, pTa
35f10 62 4c 69 73 74 2c 20 26 70 57 49 6e 66 6f 2d 3e  bList, &pWInfo->
35f20 73 57 43 2c 20 70 52 65 73 75 6c 74 53 65 74 29  sWC, pResultSet)
35f30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65   ){.      /* The
35f40 20 44 49 53 54 49 4e 43 54 20 6d 61 72 6b 69 6e   DISTINCT markin
35f50 67 20 69 73 20 70 6f 69 6e 74 6c 65 73 73 2e 20  g is pointless. 
35f60 20 49 67 6e 6f 72 65 20 69 74 2e 20 2a 2f 0a 20   Ignore it. */. 
35f70 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69       pWInfo->eDi
35f80 73 74 69 6e 63 74 20 3d 20 57 48 45 52 45 5f 44  stinct = WHERE_D
35f90 49 53 54 49 4e 43 54 5f 55 4e 49 51 55 45 3b 0a  ISTINCT_UNIQUE;.
35fa0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f      }else if( pO
35fb0 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20  rderBy==0 ){.   
35fc0 20 20 20 2f 2a 20 54 72 79 20 74 6f 20 4f 52 44     /* Try to ORD
35fd0 45 52 20 42 59 20 74 68 65 20 72 65 73 75 6c 74  ER BY the result
35fe0 20 73 65 74 20 74 6f 20 6d 61 6b 65 20 64 69 73   set to make dis
35ff0 74 69 6e 63 74 20 70 72 6f 63 65 73 73 69 6e 67  tinct processing
36000 20 65 61 73 69 65 72 20 2a 2f 0a 20 20 20 20 20   easier */.     
36010 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c   pWInfo->wctrlFl
36020 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 44 49 53  ags |= WHERE_DIS
36030 54 49 4e 43 54 42 59 3b 0a 20 20 20 20 20 20 70  TINCTBY;.      p
36040 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20  WInfo->pOrderBy 
36050 3d 20 70 52 65 73 75 6c 74 53 65 74 3b 0a 20 20  = pResultSet;.  
36060 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f    }.  }..  /* Co
36070 6e 73 74 72 75 63 74 20 74 68 65 20 57 68 65 72  nstruct the Wher
36080 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 2a 2f  eLoop objects */
36090 0a 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78  .  WHERETRACE(0x
360a0 66 66 66 66 2c 28 22 2a 2a 2a 20 4f 70 74 69 6d  ffff,("*** Optim
360b0 69 7a 65 72 20 53 74 61 72 74 20 2a 2a 2a 5c 6e  izer Start ***\n
360c0 22 29 29 3b 0a 20 20 2f 2a 20 44 69 73 70 6c 61  "));.  /* Displa
360d0 79 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74  y all terms of t
360e0 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
360f0 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 57  */.#if defined(W
36100 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
36110 44 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  D) && defined(SQ
36120 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 54 52 45 45  LITE_ENABLE_TREE
36130 5f 45 58 50 4c 41 49 4e 29 0a 20 20 69 66 28 20  _EXPLAIN).  if( 
36140 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63  sqlite3WhereTrac
36150 65 20 26 20 30 78 31 30 30 20 29 7b 0a 20 20 20  e & 0x100 ){.   
36160 20 69 6e 74 20 69 3b 0a 20 20 20 20 56 64 62 65   int i;.    Vdbe
36170 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
36180 64 62 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  dbe;.    sqlite3
36190 45 78 70 6c 61 69 6e 42 65 67 69 6e 28 76 29 3b  ExplainBegin(v);
361a0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
361b0 73 57 4c 42 2e 70 57 43 2d 3e 6e 54 65 72 6d 3b  sWLB.pWC->nTerm;
361c0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c   i++){.      sql
361d0 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74  ite3ExplainPrint
361e0 66 28 76 2c 20 22 23 25 2d 32 64 20 22 2c 20 69  f(v, "#%-2d ", i
361f0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
36200 45 78 70 6c 61 69 6e 50 75 73 68 28 76 29 3b 0a  ExplainPush(v);.
36210 20 20 20 20 20 20 77 68 65 72 65 45 78 70 6c 61        whereExpla
36220 69 6e 54 65 72 6d 28 76 2c 20 26 73 57 4c 42 2e  inTerm(v, &sWLB.
36230 70 57 43 2d 3e 61 5b 69 5d 29 3b 0a 20 20 20 20  pWC->a[i]);.    
36240 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
36250 50 6f 70 28 76 29 3b 0a 20 20 20 20 20 20 73 71  Pop(v);.      sq
36260 6c 69 74 65 33 45 78 70 6c 61 69 6e 4e 4c 28 76  lite3ExplainNL(v
36270 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
36280 69 74 65 33 45 78 70 6c 61 69 6e 46 69 6e 69 73  ite3ExplainFinis
36290 68 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  h(v);.    sqlite
362a0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 25 73  3DebugPrintf("%s
362b0 22 2c 20 73 71 6c 69 74 65 33 56 64 62 65 45 78  ", sqlite3VdbeEx
362c0 70 6c 61 6e 61 74 69 6f 6e 28 76 29 29 3b 0a 20  planation(v));. 
362d0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20   }.#endif.  if( 
362e0 6e 54 61 62 4c 69 73 74 21 3d 31 20 7c 7c 20 77  nTabList!=1 || w
362f0 68 65 72 65 53 68 6f 72 74 43 75 74 28 26 73 57  hereShortCut(&sW
36300 4c 42 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63  LB)==0 ){.    rc
36310 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 41   = whereLoopAddA
36320 6c 6c 28 26 73 57 4c 42 29 3b 0a 20 20 20 20 69  ll(&sWLB);.    i
36330 66 28 20 72 63 20 29 20 67 6f 74 6f 20 77 68 65  f( rc ) goto whe
36340 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20  reBeginError;.  
36350 0a 20 20 20 20 2f 2a 20 44 69 73 70 6c 61 79 20  .    /* Display 
36360 61 6c 6c 20 6f 66 20 74 68 65 20 57 68 65 72 65  all of the Where
36370 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 69 66 20  Loop objects if 
36380 77 68 65 72 65 74 72 61 63 65 20 69 73 20 65 6e  wheretrace is en
36390 61 62 6c 65 64 20 2a 2f 0a 23 69 66 64 65 66 20  abled */.#ifdef 
363a0 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c  WHERETRACE_ENABL
363b0 45 44 20 2f 2a 20 21 3d 30 20 2a 2f 0a 20 20 20  ED /* !=0 */.   
363c0 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72   if( sqlite3Wher
363d0 65 54 72 61 63 65 20 29 7b 0a 20 20 20 20 20 20  eTrace ){.      
363e0 57 68 65 72 65 4c 6f 6f 70 20 2a 70 3b 0a 20 20  WhereLoop *p;.  
363f0 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
36400 20 73 74 61 74 69 63 20 63 68 61 72 20 7a 4c 61   static char zLa
36410 62 65 6c 5b 5d 20 3d 20 22 30 31 32 33 34 35 36  bel[] = "0123456
36420 37 38 39 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d  789abcdefghijklm
36430 6e 6f 70 71 72 73 74 75 76 77 79 78 7a 22 0a 20  nopqrstuvwyxz". 
36440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36460 20 20 20 20 20 20 22 41 42 43 44 45 46 47 48 49        "ABCDEFGHI
36470 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 59 58  JKLMNOPQRSTUVWYX
36480 5a 22 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 3d  Z";.      for(p=
36490 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 2c 20  pWInfo->pLoops, 
364a0 69 3d 30 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  i=0; p; p=p->pNe
364b0 78 74 4c 6f 6f 70 2c 20 69 2b 2b 29 7b 0a 20 20  xtLoop, i++){.  
364c0 20 20 20 20 20 20 70 2d 3e 63 49 64 20 3d 20 7a        p->cId = z
364d0 4c 61 62 65 6c 5b 69 25 73 69 7a 65 6f 66 28 7a  Label[i%sizeof(z
364e0 4c 61 62 65 6c 29 5d 3b 0a 20 20 20 20 20 20 20  Label)];.       
364f0 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28   whereLoopPrint(
36500 70 2c 20 73 57 4c 42 2e 70 57 43 29 3b 0a 20 20  p, sWLB.pWC);.  
36510 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64      }.    }.#end
36520 69 66 0a 20 20 0a 20 20 20 20 77 68 65 72 65 50  if.  .    whereP
36530 61 74 68 53 6f 6c 76 65 72 28 70 57 49 6e 66 6f  athSolver(pWInfo
36540 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 64 62  , 0);.    if( db
36550 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
36560 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e   goto whereBegin
36570 45 72 72 6f 72 3b 0a 20 20 20 20 69 66 28 20 70  Error;.    if( p
36580 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20  WInfo->pOrderBy 
36590 29 7b 0a 20 20 20 20 20 20 20 77 68 65 72 65 50  ){.       whereP
365a0 61 74 68 53 6f 6c 76 65 72 28 70 57 49 6e 66 6f  athSolver(pWInfo
365b0 2c 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75  , pWInfo->nRowOu
365c0 74 2b 31 29 3b 0a 20 20 20 20 20 20 20 69 66 28  t+1);.       if(
365d0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
365e0 64 20 29 20 67 6f 74 6f 20 77 68 65 72 65 42 65  d ) goto whereBe
365f0 67 69 6e 45 72 72 6f 72 3b 0a 20 20 20 20 7d 0a  ginError;.    }.
36600 20 20 7d 0a 20 20 69 66 28 20 70 57 49 6e 66 6f    }.  if( pWInfo
36610 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 26 26  ->pOrderBy==0 &&
36620 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51   (db->flags & SQ
36630 4c 49 54 45 5f 52 65 76 65 72 73 65 4f 72 64 65  LITE_ReverseOrde
36640 72 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 70 57  r)!=0 ){.     pW
36650 49 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b 20 3d 20  Info->revMask = 
36660 28 42 69 74 6d 61 73 6b 29 28 2d 31 29 3b 0a 20  (Bitmask)(-1);. 
36670 20 7d 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d   }.  if( pParse-
36680 3e 6e 45 72 72 20 7c 7c 20 4e 45 56 45 52 28 64  >nErr || NEVER(d
36690 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 29  b->mallocFailed)
366a0 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 77 68 65   ){.    goto whe
366b0 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20  reBeginError;.  
366c0 7d 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52  }.#ifdef WHERETR
366d0 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 21  ACE_ENABLED /* !
366e0 3d 30 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69  =0 */.  if( sqli
366f0 74 65 33 57 68 65 72 65 54 72 61 63 65 20 29 7b  te3WhereTrace ){
36700 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20  .    int ii;.   
36710 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
36720 6e 74 66 28 22 2d 2d 2d 2d 20 53 6f 6c 75 74 69  ntf("---- Soluti
36730 6f 6e 20 6e 52 6f 77 3d 25 64 22 2c 20 70 57 49  on nRow=%d", pWI
36740 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 29 3b 0a 20  nfo->nRowOut);. 
36750 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6e     if( pWInfo->n
36760 4f 42 53 61 74 3e 30 20 29 7b 0a 20 20 20 20 20  OBSat>0 ){.     
36770 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
36780 6e 74 66 28 22 20 4f 52 44 45 52 42 59 3d 25 64  ntf(" ORDERBY=%d
36790 2c 30 78 25 6c 6c 78 22 2c 20 70 57 49 6e 66 6f  ,0x%llx", pWInfo
367a0 2d 3e 6e 4f 42 53 61 74 2c 20 70 57 49 6e 66 6f  ->nOBSat, pWInfo
367b0 2d 3e 72 65 76 4d 61 73 6b 29 3b 0a 20 20 20 20  ->revMask);.    
367c0 7d 0a 20 20 20 20 73 77 69 74 63 68 28 20 70 57  }.    switch( pW
367d0 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20  Info->eDistinct 
367e0 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 57 48  ){.      case WH
367f0 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49  ERE_DISTINCT_UNI
36800 51 55 45 3a 20 7b 0a 20 20 20 20 20 20 20 20 73  QUE: {.        s
36810 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
36820 66 28 22 20 20 44 49 53 54 49 4e 43 54 3d 75 6e  f("  DISTINCT=un
36830 69 71 75 65 22 29 3b 0a 20 20 20 20 20 20 20 20  ique");.        
36840 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
36850 20 20 20 20 20 63 61 73 65 20 57 48 45 52 45 5f       case WHERE_
36860 44 49 53 54 49 4e 43 54 5f 4f 52 44 45 52 45 44  DISTINCT_ORDERED
36870 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  : {.        sqli
36880 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
36890 20 20 44 49 53 54 49 4e 43 54 3d 6f 72 64 65 72    DISTINCT=order
368a0 65 64 22 29 3b 0a 20 20 20 20 20 20 20 20 62 72  ed");.        br
368b0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
368c0 20 20 20 63 61 73 65 20 57 48 45 52 45 5f 44 49     case WHERE_DI
368d0 53 54 49 4e 43 54 5f 55 4e 4f 52 44 45 52 45 44  STINCT_UNORDERED
368e0 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  : {.        sqli
368f0 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
36900 20 20 44 49 53 54 49 4e 43 54 3d 75 6e 6f 72 64    DISTINCT=unord
36910 65 72 65 64 22 29 3b 0a 20 20 20 20 20 20 20 20  ered");.        
36920 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
36930 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
36940 44 65 62 75 67 50 72 69 6e 74 66 28 22 5c 6e 22  DebugPrintf("\n"
36950 29 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b  );.    for(ii=0;
36960 20 69 69 3c 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76   ii<pWInfo->nLev
36970 65 6c 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  el; ii++){.     
36980 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28   whereLoopPrint(
36990 70 57 49 6e 66 6f 2d 3e 61 5b 69 69 5d 2e 70 57  pWInfo->a[ii].pW
369a0 4c 6f 6f 70 2c 20 73 57 4c 42 2e 70 57 43 29 3b  Loop, sWLB.pWC);
369b0 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
369c0 66 0a 20 20 2f 2a 20 41 74 74 65 6d 70 74 20 74  f.  /* Attempt t
369d0 6f 20 6f 6d 69 74 20 74 61 62 6c 65 73 20 66 72  o omit tables fr
369e0 6f 6d 20 74 68 65 20 6a 6f 69 6e 20 74 68 61 74  om the join that
369f0 20 64 6f 20 6e 6f 74 20 65 66 66 65 63 74 20 74   do not effect t
36a00 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 69  he result */.  i
36a10 66 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65  f( pWInfo->nLeve
36a20 6c 3e 3d 32 0a 20 20 20 26 26 20 70 52 65 73 75  l>=2.   && pResu
36a30 6c 74 53 65 74 21 3d 30 0a 20 20 20 26 26 20 4f  ltSet!=0.   && O
36a40 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c  ptimizationEnabl
36a50 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 6d  ed(db, SQLITE_Om
36a60 69 74 4e 6f 6f 70 4a 6f 69 6e 29 0a 20 20 29 7b  itNoopJoin).  ){
36a70 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 74 61 62  .    Bitmask tab
36a80 55 73 65 64 20 3d 20 65 78 70 72 4c 69 73 74 54  Used = exprListT
36a90 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
36aa0 65 74 2c 20 70 52 65 73 75 6c 74 53 65 74 29 3b  et, pResultSet);
36ab0 0a 20 20 20 20 69 66 28 20 73 57 4c 42 2e 70 4f  .    if( sWLB.pO
36ac0 72 64 65 72 42 79 20 29 20 74 61 62 55 73 65 64  rderBy ) tabUsed
36ad0 20 7c 3d 20 65 78 70 72 4c 69 73 74 54 61 62 6c   |= exprListTabl
36ae0 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
36af0 20 73 57 4c 42 2e 70 4f 72 64 65 72 42 79 29 3b   sWLB.pOrderBy);
36b00 0a 20 20 20 20 77 68 69 6c 65 28 20 70 57 49 6e  .    while( pWIn
36b10 66 6f 2d 3e 6e 4c 65 76 65 6c 3e 3d 32 20 29 7b  fo->nLevel>=2 ){
36b20 0a 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d  .      WhereTerm
36b30 20 2a 70 54 65 72 6d 2c 20 2a 70 45 6e 64 3b 0a   *pTerm, *pEnd;.
36b40 20 20 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70 57        pLoop = pW
36b50 49 6e 66 6f 2d 3e 61 5b 70 57 49 6e 66 6f 2d 3e  Info->a[pWInfo->
36b60 6e 4c 65 76 65 6c 2d 31 5d 2e 70 57 4c 6f 6f 70  nLevel-1].pWLoop
36b70 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 57 49  ;.      if( (pWI
36b80 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61  nfo->pTabList->a
36b90 5b 70 4c 6f 6f 70 2d 3e 69 54 61 62 5d 2e 6a 6f  [pLoop->iTab].jo
36ba0 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45 46 54  intype & JT_LEFT
36bb0 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  )==0 ) break;.  
36bc0 20 20 20 20 69 66 28 20 28 77 63 74 72 6c 46 6c      if( (wctrlFl
36bd0 61 67 73 20 26 20 57 48 45 52 45 5f 57 41 4e 54  ags & WHERE_WANT
36be0 5f 44 49 53 54 49 4e 43 54 29 3d 3d 30 0a 20 20  _DISTINCT)==0.  
36bf0 20 20 20 20 20 26 26 20 28 70 4c 6f 6f 70 2d 3e       && (pLoop->
36c00 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
36c10 4f 4e 45 52 4f 57 29 3d 3d 30 0a 20 20 20 20 20  ONEROW)==0.     
36c20 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61   ){.        brea
36c30 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
36c40 20 69 66 28 20 28 74 61 62 55 73 65 64 20 26 20   if( (tabUsed & 
36c50 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 29  pLoop->maskSelf)
36c60 21 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  !=0 ) break;.   
36c70 20 20 20 70 45 6e 64 20 3d 20 73 57 4c 42 2e 70     pEnd = sWLB.p
36c80 57 43 2d 3e 61 20 2b 20 73 57 4c 42 2e 70 57 43  WC->a + sWLB.pWC
36c90 2d 3e 6e 54 65 72 6d 3b 0a 20 20 20 20 20 20 66  ->nTerm;.      f
36ca0 6f 72 28 70 54 65 72 6d 3d 73 57 4c 42 2e 70 57  or(pTerm=sWLB.pW
36cb0 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 45 6e 64  C->a; pTerm<pEnd
36cc0 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  ; pTerm++){.    
36cd0 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e      if( (pTerm->
36ce0 70 72 65 72 65 71 41 6c 6c 20 26 20 70 4c 6f 6f  prereqAll & pLoo
36cf0 70 2d 3e 6d 61 73 6b 53 65 6c 66 29 21 3d 30 0a  p->maskSelf)!=0.
36d00 20 20 20 20 20 20 20 20 20 26 26 20 21 45 78 70           && !Exp
36d10 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 54 65  rHasProperty(pTe
36d20 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f 46 72  rm->pExpr, EP_Fr
36d30 6f 6d 4a 6f 69 6e 29 0a 20 20 20 20 20 20 20 20  omJoin).        
36d40 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  ){.          bre
36d50 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
36d60 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
36d70 70 54 65 72 6d 3c 70 45 6e 64 20 29 20 62 72 65  pTerm<pEnd ) bre
36d80 61 6b 3b 0a 20 20 20 20 20 20 57 48 45 52 45 54  ak;.      WHERET
36d90 52 41 43 45 28 30 78 66 66 66 66 2c 20 28 22 2d  RACE(0xffff, ("-
36da0 3e 20 64 72 6f 70 20 6c 6f 6f 70 20 25 63 20 6e  > drop loop %c n
36db0 6f 74 20 75 73 65 64 5c 6e 22 2c 20 70 4c 6f 6f  ot used\n", pLoo
36dc0 70 2d 3e 63 49 64 29 29 3b 0a 20 20 20 20 20 20  p->cId));.      
36dd0 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 2d 2d  pWInfo->nLevel--
36de0 3b 0a 20 20 20 20 20 20 6e 54 61 62 4c 69 73 74  ;.      nTabList
36df0 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  --;.    }.  }.  
36e00 57 48 45 52 45 54 52 41 43 45 28 30 78 66 66 66  WHERETRACE(0xfff
36e10 66 2c 28 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65  f,("*** Optimize
36e20 72 20 46 69 6e 69 73 68 65 64 20 2a 2a 2a 5c 6e  r Finished ***\n
36e30 22 29 29 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70  "));.  pWInfo->p
36e40 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f  Parse->nQueryLoo
36e50 70 20 2b 3d 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f  p += pWInfo->nRo
36e60 77 4f 75 74 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  wOut;..  /* If t
36e70 68 65 20 63 61 6c 6c 65 72 20 69 73 20 61 6e 20  he caller is an 
36e80 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45  UPDATE or DELETE
36e90 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20   statement that 
36ea0 69 73 20 72 65 71 75 65 73 74 69 6e 67 0a 20 20  is requesting.  
36eb0 2a 2a 20 74 6f 20 75 73 65 20 61 20 6f 6e 65 2d  ** to use a one-
36ec0 70 61 73 73 20 61 6c 67 6f 72 69 74 68 6d 2c 20  pass algorithm, 
36ed0 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 69  determine if thi
36ee0 73 20 69 73 20 61 70 70 72 6f 70 72 69 61 74 65  s is appropriate
36ef0 2e 0a 20 20 2a 2a 20 54 68 65 20 6f 6e 65 2d 70  ..  ** The one-p
36f00 61 73 73 20 61 6c 67 6f 72 69 74 68 6d 20 6f 6e  ass algorithm on
36f10 6c 79 20 77 6f 72 6b 73 20 69 66 20 74 68 65 20  ly works if the 
36f20 57 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e  WHERE clause con
36f30 73 74 72 61 69 6e 73 0a 20 20 2a 2a 20 74 68 65  strains.  ** the
36f40 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 75 70   statement to up
36f50 64 61 74 65 20 61 20 73 69 6e 67 6c 65 20 72 6f  date a single ro
36f60 77 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  w..  */.  assert
36f70 28 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20  ( (wctrlFlags & 
36f80 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45  WHERE_ONEPASS_DE
36f90 53 49 52 45 44 29 3d 3d 30 20 7c 7c 20 70 57 49  SIRED)==0 || pWI
36fa0 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d 31 20 29  nfo->nLevel==1 )
36fb0 3b 0a 20 20 69 66 28 20 28 77 63 74 72 6c 46 6c  ;.  if( (wctrlFl
36fc0 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50  ags & WHERE_ONEP
36fd0 41 53 53 5f 44 45 53 49 52 45 44 29 21 3d 30 20  ASS_DESIRED)!=0 
36fe0 0a 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e  .   && (pWInfo->
36ff0 61 5b 30 5d 2e 70 57 4c 6f 6f 70 2d 3e 77 73 46  a[0].pWLoop->wsF
37000 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45  lags & WHERE_ONE
37010 52 4f 57 29 21 3d 30 20 29 7b 0a 20 20 20 20 70  ROW)!=0 ){.    p
37020 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73  WInfo->okOnePass
37030 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 48 61   = 1;.    if( Ha
37040 73 52 6f 77 69 64 28 70 54 61 62 4c 69 73 74 2d  sRowid(pTabList-
37050 3e 61 5b 30 5d 2e 70 54 61 62 29 20 29 7b 0a 20  >a[0].pTab) ){. 
37060 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 30       pWInfo->a[0
37070 5d 2e 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  ].pWLoop->wsFlag
37080 73 20 26 3d 20 7e 57 48 45 52 45 5f 49 44 58 5f  s &= ~WHERE_IDX_
37090 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ONLY;.    }.  }.
370a0 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 6c 6c 20 74  .  /* Open all t
370b0 61 62 6c 65 73 20 69 6e 20 74 68 65 20 70 54 61  ables in the pTa
370c0 62 4c 69 73 74 20 61 6e 64 20 61 6e 79 20 69 6e  bList and any in
370d0 64 69 63 65 73 20 73 65 6c 65 63 74 65 64 20 66  dices selected f
370e0 6f 72 0a 20 20 2a 2a 20 73 65 61 72 63 68 69 6e  or.  ** searchin
370f0 67 20 74 68 6f 73 65 20 74 61 62 6c 65 73 2e 0a  g those tables..
37100 20 20 2a 2f 0a 20 20 6e 6f 74 52 65 61 64 79 20    */.  notReady 
37110 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b 0a 20  = ~(Bitmask)0;. 
37120 20 66 6f 72 28 69 69 3d 30 2c 20 70 4c 65 76 65   for(ii=0, pLeve
37130 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20 69 69 3c  l=pWInfo->a; ii<
37140 6e 54 61 62 4c 69 73 74 3b 20 69 69 2b 2b 2c 20  nTabList; ii++, 
37150 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 54  pLevel++){.    T
37160 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20  able *pTab;     
37170 2f 2a 20 54 61 62 6c 65 20 74 6f 20 6f 70 65 6e  /* Table to open
37180 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 44 62 3b   */.    int iDb;
37190 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
371a0 78 20 6f 66 20 64 61 74 61 62 61 73 65 20 63 6f  x of database co
371b0 6e 74 61 69 6e 69 6e 67 20 74 61 62 6c 65 2f 69  ntaining table/i
371c0 6e 64 65 78 20 2a 2f 0a 20 20 20 20 73 74 72 75  ndex */.    stru
371d0 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
371e0 2a 70 54 61 62 49 74 65 6d 3b 0a 0a 20 20 20 20  *pTabItem;..    
371f0 70 54 61 62 49 74 65 6d 20 3d 20 26 70 54 61 62  pTabItem = &pTab
37200 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e  List->a[pLevel->
37210 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 70 54 61 62  iFrom];.    pTab
37220 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61   = pTabItem->pTa
37230 62 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c  b;.    iDb = sql
37240 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
37250 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68  x(db, pTab->pSch
37260 65 6d 61 29 3b 0a 20 20 20 20 70 4c 6f 6f 70 20  ema);.    pLoop 
37270 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70  = pLevel->pWLoop
37280 3b 0a 20 20 20 20 69 66 28 20 28 70 54 61 62 2d  ;.    if( (pTab-
37290 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 45  >tabFlags & TF_E
372a0 70 68 65 6d 65 72 61 6c 29 21 3d 30 20 7c 7c 20  phemeral)!=0 || 
372b0 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b  pTab->pSelect ){
372c0 0a 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74  .      /* Do not
372d0 68 69 6e 67 20 2a 2f 0a 20 20 20 20 7d 65 6c 73  hing */.    }els
372e0 65 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  e.#ifndef SQLITE
372f0 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
37300 4c 45 0a 20 20 20 20 69 66 28 20 28 70 4c 6f 6f  LE.    if( (pLoo
37310 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
37320 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  RE_VIRTUALTABLE)
37330 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e  !=0 ){.      con
37340 73 74 20 63 68 61 72 20 2a 70 56 54 61 62 20 3d  st char *pVTab =
37350 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 73   (const char *)s
37360 71 6c 69 74 65 33 47 65 74 56 54 61 62 6c 65 28  qlite3GetVTable(
37370 64 62 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 20  db, pTab);.     
37380 20 69 6e 74 20 69 43 75 72 20 3d 20 70 54 61 62   int iCur = pTab
37390 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20  Item->iCursor;. 
373a0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
373b0 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 56 4f 70  AddOp4(v, OP_VOp
373c0 65 6e 2c 20 69 43 75 72 2c 20 30 2c 20 30 2c 20  en, iCur, 0, 0, 
373d0 70 56 54 61 62 2c 20 50 34 5f 56 54 41 42 29 3b  pVTab, P4_VTAB);
373e0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 49  .    }else if( I
373f0 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29  sVirtual(pTab) )
37400 7b 0a 20 20 20 20 20 20 2f 2a 20 6e 6f 6f 70 20  {.      /* noop 
37410 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e  */.    }else.#en
37420 64 69 66 0a 20 20 20 20 69 66 28 20 28 70 4c 6f  dif.    if( (pLo
37430 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
37440 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30  ERE_IDX_ONLY)==0
37450 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 77 63  .         && (wc
37460 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
37470 5f 4f 4d 49 54 5f 4f 50 45 4e 5f 43 4c 4f 53 45  _OMIT_OPEN_CLOSE
37480 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  )==0 ){.      in
37490 74 20 6f 70 20 3d 20 4f 50 5f 4f 70 65 6e 52 65  t op = OP_OpenRe
374a0 61 64 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57  ad;.      if( pW
374b0 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20  Info->okOnePass 
374c0 29 7b 0a 20 20 20 20 20 20 20 20 6f 70 20 3d 20  ){.        op = 
374d0 4f 50 5f 4f 70 65 6e 57 72 69 74 65 3b 0a 20 20  OP_OpenWrite;.  
374e0 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61 69        pWInfo->ai
374f0 43 75 72 4f 6e 65 50 61 73 73 5b 30 5d 20 3d 20  CurOnePass[0] = 
37500 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f  pTabItem->iCurso
37510 72 3b 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20  r;.      };.    
37520 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62    sqlite3OpenTab
37530 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 49  le(pParse, pTabI
37540 74 65 6d 2d 3e 69 43 75 72 73 6f 72 2c 20 69 44  tem->iCursor, iD
37550 62 2c 20 70 54 61 62 2c 20 6f 70 29 3b 0a 20 20  b, pTab, op);.  
37560 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62      assert( pTab
37570 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3d 3d 70  Item->iCursor==p
37580 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 20 29  Level->iTabCur )
37590 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
375a0 28 20 21 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65  ( !pWInfo->okOne
375b0 50 61 73 73 20 26 26 20 70 54 61 62 2d 3e 6e 43  Pass && pTab->nC
375c0 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20  ol==BMS-1 );.   
375d0 20 20 20 74 65 73 74 63 61 73 65 28 20 21 70 57     testcase( !pW
375e0 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20  Info->okOnePass 
375f0 26 26 20 70 54 61 62 2d 3e 6e 43 6f 6c 3d 3d 42  && pTab->nCol==B
37600 4d 53 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  MS );.      if( 
37610 21 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61  !pWInfo->okOnePa
37620 73 73 20 26 26 20 70 54 61 62 2d 3e 6e 43 6f 6c  ss && pTab->nCol
37630 3c 42 4d 53 20 26 26 20 48 61 73 52 6f 77 69 64  <BMS && HasRowid
37640 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20  (pTab) ){.      
37650 20 20 42 69 74 6d 61 73 6b 20 62 20 3d 20 70 54    Bitmask b = pT
37660 61 62 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 3b  abItem->colUsed;
37670 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 20 3d  .        int n =
37680 20 30 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28   0;.        for(
37690 3b 20 62 3b 20 62 3d 62 3e 3e 31 2c 20 6e 2b 2b  ; b; b=b>>1, n++
376a0 29 7b 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69  ){}.        sqli
376b0 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28  te3VdbeChangeP4(
376c0 76 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75  v, sqlite3VdbeCu
376d0 72 72 65 6e 74 41 64 64 72 28 76 29 2d 31 2c 20  rrentAddr(v)-1, 
376e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
376f0 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
37700 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 6e  ITE_INT_TO_PTR(n
37710 29 2c 20 50 34 5f 49 4e 54 33 32 29 3b 0a 20 20  ), P4_INT32);.  
37720 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 3c        assert( n<
37730 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20  =pTab->nCol );. 
37740 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
37750 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54  {.      sqlite3T
37760 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c  ableLock(pParse,
37770 20 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d   iDb, pTab->tnum
37780 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  , 0, pTab->zName
37790 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
377a0 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20   pLoop->wsFlags 
377b0 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 20  & WHERE_INDEXED 
377c0 29 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a  ){.      Index *
377d0 70 49 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62  pIx = pLoop->u.b
377e0 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 20  tree.pIndex;.   
377f0 20 20 20 69 6e 74 20 69 49 6e 64 65 78 43 75 72     int iIndexCur
37800 3b 0a 20 20 20 20 20 20 69 6e 74 20 6f 70 20 3d  ;.      int op =
37810 20 4f 50 5f 4f 70 65 6e 52 65 61 64 3b 0a 20 20   OP_OpenRead;.  
37820 20 20 20 20 2f 2a 20 69 49 64 78 43 75 72 20 69      /* iIdxCur i
37830 73 20 61 6c 77 61 79 73 20 73 65 74 20 69 66 20  s always set if 
37840 74 6f 20 61 20 70 6f 73 69 74 69 76 65 20 76 61  to a positive va
37850 6c 75 65 20 69 66 20 4f 4e 45 50 41 53 53 20 69  lue if ONEPASS i
37860 73 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 20 20  s possible */.  
37870 20 20 20 20 61 73 73 65 72 74 28 20 69 49 64 78      assert( iIdx
37880 43 75 72 21 3d 30 20 7c 7c 20 28 70 57 49 6e 66  Cur!=0 || (pWInf
37890 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20  o->wctrlFlags & 
378a0 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45  WHERE_ONEPASS_DE
378b0 53 49 52 45 44 29 3d 3d 30 20 29 3b 0a 20 20 20  SIRED)==0 );.   
378c0 20 20 20 69 66 28 20 21 48 61 73 52 6f 77 69 64     if( !HasRowid
378d0 28 70 54 61 62 29 20 26 26 20 49 73 50 72 69 6d  (pTab) && IsPrim
378e0 61 72 79 4b 65 79 49 6e 64 65 78 28 70 49 78 29  aryKeyIndex(pIx)
378f0 0a 20 20 20 20 20 20 20 26 26 20 28 77 63 74 72  .       && (wctr
37900 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  lFlags & WHERE_O
37910 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 29 21 3d 30  NETABLE_ONLY)!=0
37920 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
37930 20 20 2f 2a 20 54 68 69 73 20 69 73 20 6f 6e 65    /* This is one
37940 20 74 65 72 6d 20 6f 66 20 61 6e 20 4f 52 2d 6f   term of an OR-o
37950 70 74 69 6d 69 7a 61 74 69 6f 6e 20 75 73 69 6e  ptimization usin
37960 67 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  g the PRIMARY KE
37970 59 20 6f 66 20 61 0a 20 20 20 20 20 20 20 20 2a  Y of a.        *
37980 2a 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20  * WITHOUT ROWID 
37990 74 61 62 6c 65 2e 20 20 4e 6f 20 6e 65 65 64 20  table.  No need 
379a0 66 6f 72 20 61 20 73 65 70 61 72 61 74 65 20 69  for a separate i
379b0 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 20 20  ndex */.        
379c0 69 49 6e 64 65 78 43 75 72 20 3d 20 70 4c 65 76  iIndexCur = pLev
379d0 65 6c 2d 3e 69 54 61 62 43 75 72 3b 0a 20 20 20  el->iTabCur;.   
379e0 20 20 20 20 20 6f 70 20 3d 20 30 3b 0a 20 20 20       op = 0;.   
379f0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 57 49     }else if( pWI
37a00 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 29  nfo->okOnePass )
37a10 7b 0a 20 20 20 20 20 20 20 20 49 6e 64 65 78 20  {.        Index 
37a20 2a 70 4a 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e  *pJ = pTabItem->
37a30 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20  pTab->pIndex;.  
37a40 20 20 20 20 20 20 69 49 6e 64 65 78 43 75 72 20        iIndexCur 
37a50 3d 20 69 49 64 78 43 75 72 3b 0a 20 20 20 20 20  = iIdxCur;.     
37a60 20 20 20 61 73 73 65 72 74 28 20 77 63 74 72 6c     assert( wctrl
37a70 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e  Flags & WHERE_ON
37a80 45 50 41 53 53 5f 44 45 53 49 52 45 44 20 29 3b  EPASS_DESIRED );
37a90 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20  .        while( 
37aa0 41 4c 57 41 59 53 28 70 4a 29 20 26 26 20 70 4a  ALWAYS(pJ) && pJ
37ab0 21 3d 70 49 78 20 29 7b 0a 20 20 20 20 20 20 20  !=pIx ){.       
37ac0 20 20 20 69 49 6e 64 65 78 43 75 72 2b 2b 3b 0a     iIndexCur++;.
37ad0 20 20 20 20 20 20 20 20 20 20 70 4a 20 3d 20 70            pJ = p
37ae0 4a 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  J->pNext;.      
37af0 20 20 7d 0a 20 20 20 20 20 20 20 20 6f 70 20 3d    }.        op =
37b00 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 3b 0a 20   OP_OpenWrite;. 
37b10 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61         pWInfo->a
37b20 69 43 75 72 4f 6e 65 50 61 73 73 5b 31 5d 20 3d  iCurOnePass[1] =
37b30 20 69 49 6e 64 65 78 43 75 72 3b 0a 20 20 20 20   iIndexCur;.    
37b40 20 20 7d 65 6c 73 65 20 69 66 28 20 69 49 64 78    }else if( iIdx
37b50 43 75 72 20 26 26 20 28 77 63 74 72 6c 46 6c 61  Cur && (wctrlFla
37b60 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 54 41  gs & WHERE_ONETA
37b70 42 4c 45 5f 4f 4e 4c 59 29 21 3d 30 20 29 7b 0a  BLE_ONLY)!=0 ){.
37b80 20 20 20 20 20 20 20 20 69 49 6e 64 65 78 43 75          iIndexCu
37b90 72 20 3d 20 69 49 64 78 43 75 72 3b 0a 20 20 20  r = iIdxCur;.   
37ba0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
37bb0 20 20 69 49 6e 64 65 78 43 75 72 20 3d 20 70 50    iIndexCur = pP
37bc0 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
37bd0 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4c 65 76      }.      pLev
37be0 65 6c 2d 3e 69 49 64 78 43 75 72 20 3d 20 69 49  el->iIdxCur = iI
37bf0 6e 64 65 78 43 75 72 3b 0a 20 20 20 20 20 20 61  ndexCur;.      a
37c00 73 73 65 72 74 28 20 70 49 78 2d 3e 70 53 63 68  ssert( pIx->pSch
37c10 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65  ema==pTab->pSche
37c20 6d 61 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ma );.      asse
37c30 72 74 28 20 69 49 6e 64 65 78 43 75 72 3e 3d 30  rt( iIndexCur>=0
37c40 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 70   );.      if( op
37c50 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
37c60 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
37c70 20 6f 70 2c 20 69 49 6e 64 65 78 43 75 72 2c 20   op, iIndexCur, 
37c80 70 49 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b  pIx->tnum, iDb);
37c90 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
37ca0 56 64 62 65 53 65 74 50 34 4b 65 79 49 6e 66 6f  VdbeSetP4KeyInfo
37cb0 28 70 50 61 72 73 65 2c 20 70 49 78 29 3b 0a 20  (pParse, pIx);. 
37cc0 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65         VdbeComme
37cd0 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70 49 78  nt((v, "%s", pIx
37ce0 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20  ->zName));.     
37cf0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
37d00 20 69 44 62 3e 3d 30 20 29 20 73 71 6c 69 74 65   iDb>=0 ) sqlite
37d10 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d  3CodeVerifySchem
37d20 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a  a(pParse, iDb);.
37d30 20 20 20 20 6e 6f 74 52 65 61 64 79 20 26 3d 20      notReady &= 
37d40 7e 67 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f  ~getMask(&pWInfo
37d50 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 70 54 61 62  ->sMaskSet, pTab
37d60 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a  Item->iCursor);.
37d70 20 20 7d 0a 20 20 70 57 49 6e 66 6f 2d 3e 69 54    }.  pWInfo->iT
37d80 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  op = sqlite3Vdbe
37d90 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
37da0 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
37db0 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 77 68  Failed ) goto wh
37dc0 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 0a  ereBeginError;..
37dd0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68    /* Generate th
37de0 65 20 63 6f 64 65 20 74 6f 20 64 6f 20 74 68 65  e code to do the
37df0 20 73 65 61 72 63 68 2e 20 20 45 61 63 68 20 69   search.  Each i
37e00 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  teration of the 
37e10 66 6f 72 0a 20 20 2a 2a 20 6c 6f 6f 70 20 62 65  for.  ** loop be
37e20 6c 6f 77 20 67 65 6e 65 72 61 74 65 73 20 63 6f  low generates co
37e30 64 65 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20  de for a single 
37e40 6e 65 73 74 65 64 20 6c 6f 6f 70 20 6f 66 20 74  nested loop of t
37e50 68 65 20 56 4d 0a 20 20 2a 2a 20 70 72 6f 67 72  he VM.  ** progr
37e60 61 6d 2e 0a 20 20 2a 2f 0a 20 20 6e 6f 74 52 65  am..  */.  notRe
37e70 61 64 79 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29  ady = ~(Bitmask)
37e80 30 3b 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  0;.  for(ii=0; i
37e90 69 3c 6e 54 61 62 4c 69 73 74 3b 20 69 69 2b 2b  i<nTabList; ii++
37ea0 29 7b 0a 20 20 20 20 70 4c 65 76 65 6c 20 3d 20  ){.    pLevel = 
37eb0 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 69 5d 3b 0a  &pWInfo->a[ii];.
37ec0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
37ed0 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e  MIT_AUTOMATIC_IN
37ee0 44 45 58 0a 20 20 20 20 69 66 28 20 28 70 4c 65  DEX.    if( (pLe
37ef0 76 65 6c 2d 3e 70 57 4c 6f 6f 70 2d 3e 77 73 46  vel->pWLoop->wsF
37f00 6c 61 67 73 20 26 20 57 48 45 52 45 5f 41 55 54  lags & WHERE_AUT
37f10 4f 5f 49 4e 44 45 58 29 21 3d 30 20 29 7b 0a 20  O_INDEX)!=0 ){. 
37f20 20 20 20 20 20 63 6f 6e 73 74 72 75 63 74 41 75       constructAu
37f30 74 6f 6d 61 74 69 63 49 6e 64 65 78 28 70 50 61  tomaticIndex(pPa
37f40 72 73 65 2c 20 26 70 57 49 6e 66 6f 2d 3e 73 57  rse, &pWInfo->sW
37f50 43 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  C,.             
37f60 20 20 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b     &pTabList->a[
37f70 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 2c 20  pLevel->iFrom], 
37f80 6e 6f 74 52 65 61 64 79 2c 20 70 4c 65 76 65 6c  notReady, pLevel
37f90 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d  );.      if( db-
37fa0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
37fb0 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45  goto whereBeginE
37fc0 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  rror;.    }.#end
37fd0 69 66 0a 20 20 20 20 65 78 70 6c 61 69 6e 4f 6e  if.    explainOn
37fe0 65 53 63 61 6e 28 70 50 61 72 73 65 2c 20 70 54  eScan(pParse, pT
37ff0 61 62 4c 69 73 74 2c 20 70 4c 65 76 65 6c 2c 20  abList, pLevel, 
38000 69 69 2c 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f  ii, pLevel->iFro
38010 6d 2c 20 77 63 74 72 6c 46 6c 61 67 73 29 3b 0a  m, wctrlFlags);.
38020 20 20 20 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72      pLevel->addr
38030 42 6f 64 79 20 3d 20 73 71 6c 69 74 65 33 56 64  Body = sqlite3Vd
38040 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
38050 3b 0a 20 20 20 20 6e 6f 74 52 65 61 64 79 20 3d  ;.    notReady =
38060 20 63 6f 64 65 4f 6e 65 4c 6f 6f 70 53 74 61 72   codeOneLoopStar
38070 74 28 70 57 49 6e 66 6f 2c 20 69 69 2c 20 6e 6f  t(pWInfo, ii, no
38080 74 52 65 61 64 79 29 3b 0a 20 20 20 20 70 57 49  tReady);.    pWI
38090 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 20 3d  nfo->iContinue =
380a0 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 43 6f 6e   pLevel