/ Hex Artifact Content
Login

Artifact 32fe265e3dc74ef3b27deb9e6eb5fc3c71409612:


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 31 36 20 77 74 46 6c 61 67 73   *p, u16 wtFlags
1970: 29 7b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  ){.  WhereTerm *
1980: 70 54 65 72 6d 3b 0a 20 20 69 6e 74 20 69 64 78  pTerm;.  int idx
1990: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 77 74  ;.  testcase( wt
19a0: 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52  Flags & TERM_VIR
19b0: 54 55 41 4c 20 29 3b 0a 20 20 69 66 28 20 70 57  TUAL );.  if( pW
19c0: 43 2d 3e 6e 54 65 72 6d 3e 3d 70 57 43 2d 3e 6e  C->nTerm>=pWC->n
19d0: 53 6c 6f 74 20 29 7b 0a 20 20 20 20 57 68 65 72  Slot ){.    Wher
19e0: 65 54 65 72 6d 20 2a 70 4f 6c 64 20 3d 20 70 57  eTerm *pOld = pW
19f0: 43 2d 3e 61 3b 0a 20 20 20 20 73 71 6c 69 74 65  C->a;.    sqlite
1a00: 33 20 2a 64 62 20 3d 20 70 57 43 2d 3e 70 57 49  3 *db = pWC->pWI
1a10: 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b  nfo->pParse->db;
1a20: 0a 20 20 20 20 70 57 43 2d 3e 61 20 3d 20 73 71  .    pWC->a = sq
1a30: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
1a40: 28 64 62 2c 20 73 69 7a 65 6f 66 28 70 57 43 2d  (db, sizeof(pWC-
1a50: 3e 61 5b 30 5d 29 2a 70 57 43 2d 3e 6e 53 6c 6f  >a[0])*pWC->nSlo
1a60: 74 2a 32 20 29 3b 0a 20 20 20 20 69 66 28 20 70  t*2 );.    if( p
1a70: 57 43 2d 3e 61 3d 3d 30 20 29 7b 0a 20 20 20 20  WC->a==0 ){.    
1a80: 20 20 69 66 28 20 77 74 46 6c 61 67 73 20 26 20    if( wtFlags & 
1a90: 54 45 52 4d 5f 44 59 4e 41 4d 49 43 20 29 7b 0a  TERM_DYNAMIC ){.
1aa0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1ab0: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 29  xprDelete(db, p)
1ac0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1ad0: 70 57 43 2d 3e 61 20 3d 20 70 4f 6c 64 3b 0a 20  pWC->a = pOld;. 
1ae0: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
1af0: 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28     }.    memcpy(
1b00: 70 57 43 2d 3e 61 2c 20 70 4f 6c 64 2c 20 73 69  pWC->a, pOld, si
1b10: 7a 65 6f 66 28 70 57 43 2d 3e 61 5b 30 5d 29 2a  zeof(pWC->a[0])*
1b20: 70 57 43 2d 3e 6e 54 65 72 6d 29 3b 0a 20 20 20  pWC->nTerm);.   
1b30: 20 69 66 28 20 70 4f 6c 64 21 3d 70 57 43 2d 3e   if( pOld!=pWC->
1b40: 61 53 74 61 74 69 63 20 29 7b 0a 20 20 20 20 20  aStatic ){.     
1b50: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
1b60: 62 2c 20 70 4f 6c 64 29 3b 0a 20 20 20 20 7d 0a  b, pOld);.    }.
1b70: 20 20 20 20 70 57 43 2d 3e 6e 53 6c 6f 74 20 3d      pWC->nSlot =
1b80: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
1b90: 53 69 7a 65 28 64 62 2c 20 70 57 43 2d 3e 61 29  Size(db, pWC->a)
1ba0: 2f 73 69 7a 65 6f 66 28 70 57 43 2d 3e 61 5b 30  /sizeof(pWC->a[0
1bb0: 5d 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26  ]);.    memset(&
1bc0: 70 57 43 2d 3e 61 5b 70 57 43 2d 3e 6e 54 65 72  pWC->a[pWC->nTer
1bd0: 6d 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 57  m], 0, sizeof(pW
1be0: 43 2d 3e 61 5b 30 5d 29 2a 28 70 57 43 2d 3e 6e  C->a[0])*(pWC->n
1bf0: 53 6c 6f 74 2d 70 57 43 2d 3e 6e 54 65 72 6d 29  Slot-pWC->nTerm)
1c00: 29 3b 0a 20 20 7d 0a 20 20 70 54 65 72 6d 20 3d  );.  }.  pTerm =
1c10: 20 26 70 57 43 2d 3e 61 5b 69 64 78 20 3d 20 70   &pWC->a[idx = p
1c20: 57 43 2d 3e 6e 54 65 72 6d 2b 2b 5d 3b 0a 20 20  WC->nTerm++];.  
1c30: 69 66 28 20 70 20 26 26 20 45 78 70 72 48 61 73  if( p && ExprHas
1c40: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 55  Property(p, EP_U
1c50: 6e 6c 69 6b 65 6c 79 29 20 29 7b 0a 20 20 20 20  nlikely) ){.    
1c60: 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62  pTerm->truthProb
1c70: 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
1c80: 28 70 2d 3e 69 54 61 62 6c 65 29 20 2d 20 32 37  (p->iTable) - 27
1c90: 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
1ca0: 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62  pTerm->truthProb
1cb0: 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 70 54 65 72   = 1;.  }.  pTer
1cc0: 6d 2d 3e 70 45 78 70 72 20 3d 20 73 71 6c 69 74  m->pExpr = sqlit
1cd0: 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74  e3ExprSkipCollat
1ce0: 65 28 70 29 3b 0a 20 20 70 54 65 72 6d 2d 3e 77  e(p);.  pTerm->w
1cf0: 74 46 6c 61 67 73 20 3d 20 77 74 46 6c 61 67 73  tFlags = wtFlags
1d00: 3b 0a 20 20 70 54 65 72 6d 2d 3e 70 57 43 20 3d  ;.  pTerm->pWC =
1d10: 20 70 57 43 3b 0a 20 20 70 54 65 72 6d 2d 3e 69   pWC;.  pTerm->i
1d20: 50 61 72 65 6e 74 20 3d 20 2d 31 3b 0a 20 20 72  Parent = -1;.  r
1d30: 65 74 75 72 6e 20 69 64 78 3b 0a 7d 0a 0a 2f 2a  eturn idx;.}../*
1d40: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1d50: 20 69 64 65 6e 74 69 66 69 65 73 20 73 75 62 65   identifies sube
1d60: 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68  xpressions in th
1d70: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 77  e WHERE clause w
1d80: 68 65 72 65 0a 2a 2a 20 65 61 63 68 20 73 75 62  here.** each sub
1d90: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 73 65  expression is se
1da0: 70 61 72 61 74 65 64 20 62 79 20 74 68 65 20 41  parated by the A
1db0: 4e 44 20 6f 70 65 72 61 74 6f 72 20 6f 72 20 73  ND operator or s
1dc0: 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 6f 70 65  ome other.** ope
1dd0: 72 61 74 6f 72 20 73 70 65 63 69 66 69 65 64 20  rator specified 
1de0: 69 6e 20 74 68 65 20 6f 70 20 70 61 72 61 6d 65  in the op parame
1df0: 74 65 72 2e 20 20 54 68 65 20 57 68 65 72 65 43  ter.  The WhereC
1e00: 6c 61 75 73 65 20 73 74 72 75 63 74 75 72 65 0a  lause structure.
1e10: 2a 2a 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74  ** is filled wit
1e20: 68 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 73 75  h pointers to su
1e30: 62 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 20 46  bexpressions.  F
1e40: 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a  or example:.**.*
1e50: 2a 20 20 20 20 57 48 45 52 45 20 20 61 3d 3d 27  *    WHERE  a=='
1e60: 68 65 6c 6c 6f 27 20 41 4e 44 20 63 6f 61 6c 65  hello' AND coale
1e70: 73 63 65 28 62 2c 31 31 29 3c 31 30 20 41 4e 44  sce(b,11)<10 AND
1e80: 20 28 63 2b 31 32 21 3d 64 20 4f 52 20 63 3d 3d   (c+12!=d OR c==
1e90: 32 32 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  22).**          
1ea0: 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20   \________/     
1eb0: 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  \_______________
1ec0: 2f 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f  /     \_________
1ed0: 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 20 20 20 20 20  _______/.**     
1ee0: 20 20 20 20 20 20 20 73 6c 6f 74 5b 30 5d 20 20         slot[0]  
1ef0: 20 20 20 20 20 20 20 20 20 20 73 6c 6f 74 5b 31            slot[1
1f00: 5d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ]               
1f10: 73 6c 6f 74 5b 32 5d 0a 2a 2a 0a 2a 2a 20 54 68  slot[2].**.** Th
1f20: 65 20 6f 72 69 67 69 6e 61 6c 20 57 48 45 52 45  e original WHERE
1f30: 20 63 6c 61 75 73 65 20 69 6e 20 70 45 78 70 72   clause in pExpr
1f40: 20 69 73 20 75 6e 61 6c 74 65 72 65 64 2e 20 20   is unaltered.  
1f50: 41 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  All this routine
1f60: 0a 2a 2a 20 64 6f 65 73 20 69 73 20 6d 61 6b 65  .** does is make
1f70: 20 73 6c 6f 74 5b 5d 20 65 6e 74 72 69 65 73 20   slot[] entries 
1f80: 70 6f 69 6e 74 20 74 6f 20 73 75 62 73 74 72 75  point to substru
1f90: 63 74 75 72 65 20 77 69 74 68 69 6e 20 70 45 78  cture within pEx
1fa0: 70 72 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65  pr..**.** In the
1fb0: 20 70 72 65 76 69 6f 75 73 20 73 65 6e 74 65 6e   previous senten
1fc0: 63 65 20 61 6e 64 20 69 6e 20 74 68 65 20 64 69  ce and in the di
1fd0: 61 67 72 61 6d 2c 20 22 73 6c 6f 74 5b 5d 22 20  agram, "slot[]" 
1fe0: 72 65 66 65 72 73 20 74 6f 0a 2a 2a 20 74 68 65  refers to.** the
1ff0: 20 57 68 65 72 65 43 6c 61 75 73 65 2e 61 5b 5d   WhereClause.a[]
2000: 20 61 72 72 61 79 2e 20 20 54 68 65 20 73 6c 6f   array.  The slo
2010: 74 5b 5d 20 61 72 72 61 79 20 67 72 6f 77 73 20  t[] array grows 
2020: 61 73 20 6e 65 65 64 65 64 20 74 6f 20 63 6f 6e  as needed to con
2030: 74 61 69 6e 0a 2a 2a 20 61 6c 6c 20 74 65 72 6d  tain.** all term
2040: 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  s of the WHERE c
2050: 6c 61 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  lause..*/.static
2060: 20 76 6f 69 64 20 77 68 65 72 65 53 70 6c 69 74   void whereSplit
2070: 28 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57  (WhereClause *pW
2080: 43 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  C, Expr *pExpr, 
2090: 75 38 20 6f 70 29 7b 0a 20 20 45 78 70 72 20 2a  u8 op){.  Expr *
20a0: 70 45 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70  pE2 = sqlite3Exp
20b0: 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 45 78  rSkipCollate(pEx
20c0: 70 72 29 3b 0a 20 20 70 57 43 2d 3e 6f 70 20 3d  pr);.  pWC->op =
20d0: 20 6f 70 3b 0a 20 20 69 66 28 20 70 45 32 3d 3d   op;.  if( pE2==
20e0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
20f0: 28 20 70 45 32 2d 3e 6f 70 21 3d 6f 70 20 29 7b  ( pE2->op!=op ){
2100: 0a 20 20 20 20 77 68 65 72 65 43 6c 61 75 73 65  .    whereClause
2110: 49 6e 73 65 72 74 28 70 57 43 2c 20 70 45 78 70  Insert(pWC, pExp
2120: 72 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  r, 0);.  }else{.
2130: 20 20 20 20 77 68 65 72 65 53 70 6c 69 74 28 70      whereSplit(p
2140: 57 43 2c 20 70 45 32 2d 3e 70 4c 65 66 74 2c 20  WC, pE2->pLeft, 
2150: 6f 70 29 3b 0a 20 20 20 20 77 68 65 72 65 53 70  op);.    whereSp
2160: 6c 69 74 28 70 57 43 2c 20 70 45 32 2d 3e 70 52  lit(pWC, pE2->pR
2170: 69 67 68 74 2c 20 6f 70 29 3b 0a 20 20 7d 0a 7d  ight, op);.  }.}
2180: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69  ../*.** Initiali
2190: 7a 65 20 61 20 57 68 65 72 65 4d 61 73 6b 53 65  ze a WhereMaskSe
21a0: 74 20 6f 62 6a 65 63 74 0a 2a 2f 0a 23 64 65 66  t object.*/.#def
21b0: 69 6e 65 20 69 6e 69 74 4d 61 73 6b 53 65 74 28  ine initMaskSet(
21c0: 50 29 20 20 28 50 29 2d 3e 6e 3d 30 0a 0a 2f 2a  P)  (P)->n=0../*
21d0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 62  .** Return the b
21e0: 69 74 6d 61 73 6b 20 66 6f 72 20 74 68 65 20 67  itmask for the g
21f0: 69 76 65 6e 20 63 75 72 73 6f 72 20 6e 75 6d 62  iven cursor numb
2200: 65 72 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66  er.  Return 0 if
2210: 0a 2a 2a 20 69 43 75 72 73 6f 72 20 69 73 20 6e  .** iCursor is n
2220: 6f 74 20 69 6e 20 74 68 65 20 73 65 74 2e 0a 2a  ot in the set..*
2230: 2f 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b  /.static Bitmask
2240: 20 67 65 74 4d 61 73 6b 28 57 68 65 72 65 4d 61   getMask(WhereMa
2250: 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c  skSet *pMaskSet,
2260: 20 69 6e 74 20 69 43 75 72 73 6f 72 29 7b 0a 20   int iCursor){. 
2270: 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74   int i;.  assert
2280: 28 20 70 4d 61 73 6b 53 65 74 2d 3e 6e 3c 3d 28  ( pMaskSet->n<=(
2290: 69 6e 74 29 73 69 7a 65 6f 66 28 42 69 74 6d 61  int)sizeof(Bitma
22a0: 73 6b 29 2a 38 20 29 3b 0a 20 20 66 6f 72 28 69  sk)*8 );.  for(i
22b0: 3d 30 3b 20 69 3c 70 4d 61 73 6b 53 65 74 2d 3e  =0; i<pMaskSet->
22c0: 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  n; i++){.    if(
22d0: 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 69 5d   pMaskSet->ix[i]
22e0: 3d 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20 20 20  ==iCursor ){.   
22f0: 20 20 20 72 65 74 75 72 6e 20 4d 41 53 4b 42 49     return MASKBI
2300: 54 28 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  T(i);.    }.  }.
2310: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
2320: 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65  *.** Create a ne
2330: 77 20 6d 61 73 6b 20 66 6f 72 20 63 75 72 73 6f  w mask for curso
2340: 72 20 69 43 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a  r iCursor..**.**
2350: 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20 63 75   There is one cu
2360: 72 73 6f 72 20 70 65 72 20 74 61 62 6c 65 20 69  rsor per table i
2370: 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
2380: 65 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20 6f  e.  The number o
2390: 66 0a 2a 2a 20 74 61 62 6c 65 73 20 69 6e 20 74  f.** tables in t
23a0: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69  he FROM clause i
23b0: 73 20 6c 69 6d 69 74 65 64 20 62 79 20 61 20 74  s limited by a t
23c0: 65 73 74 20 65 61 72 6c 79 20 69 6e 20 74 68 65  est early in the
23d0: 0a 2a 2a 20 73 71 6c 69 74 65 33 57 68 65 72 65  .** sqlite3Where
23e0: 42 65 67 69 6e 28 29 20 72 6f 75 74 69 6e 65 2e  Begin() routine.
23f0: 20 20 53 6f 20 77 65 20 6b 6e 6f 77 20 74 68 61    So we know tha
2400: 74 20 74 68 65 20 70 4d 61 73 6b 53 65 74 2d 3e  t the pMaskSet->
2410: 69 78 5b 5d 0a 2a 2a 20 61 72 72 61 79 20 77 69  ix[].** array wi
2420: 6c 6c 20 6e 65 76 65 72 20 6f 76 65 72 66 6c 6f  ll never overflo
2430: 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  w..*/.static voi
2440: 64 20 63 72 65 61 74 65 4d 61 73 6b 28 57 68 65  d createMask(Whe
2450: 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b  reMaskSet *pMask
2460: 53 65 74 2c 20 69 6e 74 20 69 43 75 72 73 6f 72  Set, int iCursor
2470: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 4d 61  ){.  assert( pMa
2480: 73 6b 53 65 74 2d 3e 6e 20 3c 20 41 72 72 61 79  skSet->n < Array
2490: 53 69 7a 65 28 70 4d 61 73 6b 53 65 74 2d 3e 69  Size(pMaskSet->i
24a0: 78 29 20 29 3b 0a 20 20 70 4d 61 73 6b 53 65 74  x) );.  pMaskSet
24b0: 2d 3e 69 78 5b 70 4d 61 73 6b 53 65 74 2d 3e 6e  ->ix[pMaskSet->n
24c0: 2b 2b 5d 20 3d 20 69 43 75 72 73 6f 72 3b 0a 7d  ++] = iCursor;.}
24d0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f  ../*.** These ro
24e0: 75 74 69 6e 65 73 20 77 61 6c 6b 20 28 72 65 63  utines walk (rec
24f0: 75 72 73 69 76 65 6c 79 29 20 61 6e 20 65 78 70  ursively) an exp
2500: 72 65 73 73 69 6f 6e 20 74 72 65 65 20 61 6e 64  ression tree and
2510: 20 67 65 6e 65 72 61 74 65 0a 2a 2a 20 61 20 62   generate.** a b
2520: 69 74 6d 61 73 6b 20 69 6e 64 69 63 61 74 69 6e  itmask indicatin
2530: 67 20 77 68 69 63 68 20 74 61 62 6c 65 73 20 61  g which tables a
2540: 72 65 20 75 73 65 64 20 69 6e 20 74 68 61 74 20  re used in that 
2550: 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 74 72  expression.** tr
2560: 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42 69  ee..*/.static Bi
2570: 74 6d 61 73 6b 20 65 78 70 72 4c 69 73 74 54 61  tmask exprListTa
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 2a 2c 20 45 78 70 72 4c 69 73 74  skSet*, ExprList
25a0: 2a 29 3b 0a 73 74 61 74 69 63 20 42 69 74 6d 61  *);.static Bitma
25b0: 73 6b 20 65 78 70 72 53 65 6c 65 63 74 54 61 62  sk exprSelectTab
25c0: 6c 65 55 73 61 67 65 28 57 68 65 72 65 4d 61 73  leUsage(WhereMas
25d0: 6b 53 65 74 2a 2c 20 53 65 6c 65 63 74 2a 29 3b  kSet*, Select*);
25e0: 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20  .static Bitmask 
25f0: 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 57  exprTableUsage(W
2600: 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61  hereMaskSet *pMa
2610: 73 6b 53 65 74 2c 20 45 78 70 72 20 2a 70 29 7b  skSet, Expr *p){
2620: 0a 20 20 42 69 74 6d 61 73 6b 20 6d 61 73 6b 20  .  Bitmask mask 
2630: 3d 20 30 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  = 0;.  if( p==0 
2640: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
2650: 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  ( p->op==TK_COLU
2660: 4d 4e 20 29 7b 0a 20 20 20 20 6d 61 73 6b 20 3d  MN ){.    mask =
2670: 20 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65   getMask(pMaskSe
2680: 74 2c 20 70 2d 3e 69 54 61 62 6c 65 29 3b 0a 20  t, p->iTable);. 
2690: 20 20 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b 0a     return mask;.
26a0: 20 20 7d 0a 20 20 6d 61 73 6b 20 3d 20 65 78 70    }.  mask = exp
26b0: 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  rTableUsage(pMas
26c0: 6b 53 65 74 2c 20 70 2d 3e 70 52 69 67 68 74 29  kSet, p->pRight)
26d0: 3b 0a 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72  ;.  mask |= expr
26e0: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
26f0: 53 65 74 2c 20 70 2d 3e 70 4c 65 66 74 29 3b 0a  Set, p->pLeft);.
2700: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
2710: 70 65 72 74 79 28 70 2c 20 45 50 5f 78 49 73 53  perty(p, EP_xIsS
2720: 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 6d 61  elect) ){.    ma
2730: 73 6b 20 7c 3d 20 65 78 70 72 53 65 6c 65 63 74  sk |= exprSelect
2740: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
2750: 53 65 74 2c 20 70 2d 3e 78 2e 70 53 65 6c 65 63  Set, p->x.pSelec
2760: 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  t);.  }else{.   
2770: 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69 73   mask |= exprLis
2780: 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  tTableUsage(pMas
2790: 6b 53 65 74 2c 20 70 2d 3e 78 2e 70 4c 69 73 74  kSet, p->x.pList
27a0: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
27b0: 6d 61 73 6b 3b 0a 7d 0a 73 74 61 74 69 63 20 42  mask;.}.static B
27c0: 69 74 6d 61 73 6b 20 65 78 70 72 4c 69 73 74 54  itmask exprListT
27d0: 61 62 6c 65 55 73 61 67 65 28 57 68 65 72 65 4d  ableUsage(WhereM
27e0: 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74  askSet *pMaskSet
27f0: 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73  , ExprList *pLis
2800: 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 42  t){.  int i;.  B
2810: 69 74 6d 61 73 6b 20 6d 61 73 6b 20 3d 20 30 3b  itmask mask = 0;
2820: 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a  .  if( pList ){.
2830: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
2840: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
2850: 29 7b 0a 20 20 20 20 20 20 6d 61 73 6b 20 7c 3d  ){.      mask |=
2860: 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28   exprTableUsage(
2870: 70 4d 61 73 6b 53 65 74 2c 20 70 4c 69 73 74 2d  pMaskSet, pList-
2880: 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[i].pExpr);.  
2890: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
28a0: 20 6d 61 73 6b 3b 0a 7d 0a 73 74 61 74 69 63 20   mask;.}.static 
28b0: 42 69 74 6d 61 73 6b 20 65 78 70 72 53 65 6c 65  Bitmask exprSele
28c0: 63 74 54 61 62 6c 65 55 73 61 67 65 28 57 68 65  ctTableUsage(Whe
28d0: 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b  reMaskSet *pMask
28e0: 53 65 74 2c 20 53 65 6c 65 63 74 20 2a 70 53 29  Set, Select *pS)
28f0: 7b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 61 73 6b  {.  Bitmask mask
2900: 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 70   = 0;.  while( p
2910: 53 20 29 7b 0a 20 20 20 20 53 72 63 4c 69 73 74  S ){.    SrcList
2920: 20 2a 70 53 72 63 20 3d 20 70 53 2d 3e 70 53 72   *pSrc = pS->pSr
2930: 63 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65  c;.    mask |= e
2940: 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67  xprListTableUsag
2950: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e  e(pMaskSet, pS->
2960: 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 6d 61 73  pEList);.    mas
2970: 6b 20 7c 3d 20 65 78 70 72 4c 69 73 74 54 61 62  k |= exprListTab
2980: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
2990: 2c 20 70 53 2d 3e 70 47 72 6f 75 70 42 79 29 3b  , pS->pGroupBy);
29a0: 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70  .    mask |= exp
29b0: 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65 28  rListTableUsage(
29c0: 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70 4f  pMaskSet, pS->pO
29d0: 72 64 65 72 42 79 29 3b 0a 20 20 20 20 6d 61 73  rderBy);.    mas
29e0: 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c 65 55 73  k |= exprTableUs
29f0: 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53  age(pMaskSet, pS
2a00: 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20 6d  ->pWhere);.    m
2a10: 61 73 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c 65  ask |= exprTable
2a20: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
2a30: 70 53 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20  pS->pHaving);.  
2a40: 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 53 72    if( ALWAYS(pSr
2a50: 63 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 69  c!=0) ){.      i
2a60: 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28  nt i;.      for(
2a70: 69 3d 30 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72  i=0; i<pSrc->nSr
2a80: 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  c; i++){.       
2a90: 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 53 65 6c   mask |= exprSel
2aa0: 65 63 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d  ectTableUsage(pM
2ab0: 61 73 6b 53 65 74 2c 20 70 53 72 63 2d 3e 61 5b  askSet, pSrc->a[
2ac0: 69 5d 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  i].pSelect);.   
2ad0: 20 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70       mask |= exp
2ae0: 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  rTableUsage(pMas
2af0: 6b 53 65 74 2c 20 70 53 72 63 2d 3e 61 5b 69 5d  kSet, pSrc->a[i]
2b00: 2e 70 4f 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20  .pOn);.      }. 
2b10: 20 20 20 7d 0a 20 20 20 20 70 53 20 3d 20 70 53     }.    pS = pS
2b20: 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 7d 0a 20 20  ->pPrior;.  }.  
2b30: 72 65 74 75 72 6e 20 6d 61 73 6b 3b 0a 7d 0a 0a  return mask;.}..
2b40: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
2b50: 45 20 69 66 20 74 68 65 20 67 69 76 65 6e 20 6f  E if the given o
2b60: 70 65 72 61 74 6f 72 20 69 73 20 6f 6e 65 20 6f  perator is one o
2b70: 66 20 74 68 65 20 6f 70 65 72 61 74 6f 72 73 20  f the operators 
2b80: 74 68 61 74 20 69 73 0a 2a 2a 20 61 6c 6c 6f 77  that is.** allow
2b90: 65 64 20 66 6f 72 20 61 6e 20 69 6e 64 65 78 61  ed for an indexa
2ba0: 62 6c 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  ble WHERE clause
2bb0: 20 74 65 72 6d 2e 20 20 54 68 65 20 61 6c 6c 6f   term.  The allo
2bc0: 77 65 64 20 6f 70 65 72 61 74 6f 72 73 20 61 72  wed operators ar
2bd0: 65 0a 2a 2a 20 22 3d 22 2c 20 22 3c 22 2c 20 22  e.** "=", "<", "
2be0: 3e 22 2c 20 22 3c 3d 22 2c 20 22 3e 3d 22 2c 20  >", "<=", ">=", 
2bf0: 22 49 4e 22 2c 20 61 6e 64 20 22 49 53 20 4e 55  "IN", and "IS NU
2c00: 4c 4c 22 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  LL".*/.static in
2c10: 74 20 61 6c 6c 6f 77 65 64 4f 70 28 69 6e 74 20  t allowedOp(int 
2c20: 6f 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 54  op){.  assert( T
2c30: 4b 5f 47 54 3e 54 4b 5f 45 51 20 26 26 20 54 4b  K_GT>TK_EQ && TK
2c40: 5f 47 54 3c 54 4b 5f 47 45 20 29 3b 0a 20 20 61  _GT<TK_GE );.  a
2c50: 73 73 65 72 74 28 20 54 4b 5f 4c 54 3e 54 4b 5f  ssert( TK_LT>TK_
2c60: 45 51 20 26 26 20 54 4b 5f 4c 54 3c 54 4b 5f 47  EQ && TK_LT<TK_G
2c70: 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 54  E );.  assert( T
2c80: 4b 5f 4c 45 3e 54 4b 5f 45 51 20 26 26 20 54 4b  K_LE>TK_EQ && TK
2c90: 5f 4c 45 3c 54 4b 5f 47 45 20 29 3b 0a 20 20 61  _LE<TK_GE );.  a
2ca0: 73 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d 54 4b  ssert( TK_GE==TK
2cb0: 5f 45 51 2b 34 20 29 3b 0a 20 20 72 65 74 75 72  _EQ+4 );.  retur
2cc0: 6e 20 6f 70 3d 3d 54 4b 5f 49 4e 20 7c 7c 20 28  n op==TK_IN || (
2cd0: 6f 70 3e 3d 54 4b 5f 45 51 20 26 26 20 6f 70 3c  op>=TK_EQ && op<
2ce0: 3d 54 4b 5f 47 45 29 20 7c 7c 20 6f 70 3d 3d 54  =TK_GE) || op==T
2cf0: 4b 5f 49 53 4e 55 4c 4c 3b 0a 7d 0a 0a 2f 2a 0a  K_ISNULL;.}../*.
2d00: 2a 2a 20 43 6f 6d 6d 75 74 65 20 61 20 63 6f 6d  ** Commute a com
2d10: 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72  parison operator
2d20: 2e 20 20 45 78 70 72 65 73 73 69 6f 6e 73 20 6f  .  Expressions o
2d30: 66 20 74 68 65 20 66 6f 72 6d 20 22 58 20 6f 70  f the form "X op
2d40: 20 59 22 0a 2a 2a 20 61 72 65 20 63 6f 6e 76 65   Y".** are conve
2d50: 72 74 65 64 20 69 6e 74 6f 20 22 59 20 6f 70 20  rted into "Y op 
2d60: 58 22 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6c 65 66  X"..**.** If lef
2d70: 74 2f 72 69 67 68 74 20 70 72 65 63 65 64 65 6e  t/right preceden
2d80: 63 65 20 72 75 6c 65 73 20 63 6f 6d 65 20 69 6e  ce rules come in
2d90: 74 6f 20 70 6c 61 79 20 77 68 65 6e 20 64 65 74  to play when det
2da0: 65 72 6d 69 6e 69 6e 67 20 74 68 65 0a 2a 2a 20  ermining the.** 
2db0: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
2dc0: 63 65 2c 20 74 68 65 6e 20 43 4f 4c 4c 41 54 45  ce, then COLLATE
2dd0: 20 6f 70 65 72 61 74 6f 72 73 20 61 72 65 20 61   operators are a
2de0: 64 6a 75 73 74 65 64 20 74 6f 20 65 6e 73 75 72  djusted to ensur
2df0: 65 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 63 6f  e.** that the co
2e00: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
2e10: 20 64 6f 65 73 20 6e 6f 74 20 63 68 61 6e 67 65   does not change
2e20: 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a  .  For example:.
2e30: 2a 2a 20 22 59 20 63 6f 6c 6c 61 74 65 20 4e 4f  ** "Y collate NO
2e40: 43 41 53 45 20 6f 70 20 58 22 20 62 65 63 6f 6d  CASE op X" becom
2e50: 65 73 20 22 58 20 6f 70 20 59 22 20 62 65 63 61  es "X op Y" beca
2e60: 75 73 65 20 61 6e 79 20 63 6f 6c 6c 61 74 69 6f  use any collatio
2e70: 6e 20 73 65 71 75 65 6e 63 65 20 6f 6e 0a 2a 2a  n sequence on.**
2e80: 20 74 68 65 20 6c 65 66 74 20 68 61 6e 64 20 73   the left hand s
2e90: 69 64 65 20 6f 66 20 61 20 63 6f 6d 70 61 72 69  ide of a compari
2ea0: 73 6f 6e 20 6f 76 65 72 72 69 64 65 73 20 61 6e  son overrides an
2eb0: 79 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  y collation sequ
2ec0: 65 6e 63 65 20 0a 2a 2a 20 61 74 74 61 63 68 65  ence .** attache
2ed0: 64 20 74 6f 20 74 68 65 20 72 69 67 68 74 2e 20  d to the right. 
2ee0: 46 6f 72 20 74 68 65 20 73 61 6d 65 20 72 65 61  For the same rea
2ef0: 73 6f 6e 20 74 68 65 20 45 50 5f 43 6f 6c 6c 61  son the EP_Colla
2f00: 74 65 20 66 6c 61 67 0a 2a 2a 20 69 73 20 6e 6f  te flag.** is no
2f10: 74 20 63 6f 6d 6d 75 74 65 64 2e 0a 2a 2f 0a 73  t commuted..*/.s
2f20: 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 72 43  tatic void exprC
2f30: 6f 6d 6d 75 74 65 28 50 61 72 73 65 20 2a 70 50  ommute(Parse *pP
2f40: 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
2f50: 72 29 7b 0a 20 20 75 31 36 20 65 78 70 52 69 67  r){.  u16 expRig
2f60: 68 74 20 3d 20 28 70 45 78 70 72 2d 3e 70 52 69  ht = (pExpr->pRi
2f70: 67 68 74 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  ght->flags & EP_
2f80: 43 6f 6c 6c 61 74 65 29 3b 0a 20 20 75 31 36 20  Collate);.  u16 
2f90: 65 78 70 4c 65 66 74 20 3d 20 28 70 45 78 70 72  expLeft = (pExpr
2fa0: 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20 26  ->pLeft->flags &
2fb0: 20 45 50 5f 43 6f 6c 6c 61 74 65 29 3b 0a 20 20   EP_Collate);.  
2fc0: 61 73 73 65 72 74 28 20 61 6c 6c 6f 77 65 64 4f  assert( allowedO
2fd0: 70 28 70 45 78 70 72 2d 3e 6f 70 29 20 26 26 20  p(pExpr->op) && 
2fe0: 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 49 4e  pExpr->op!=TK_IN
2ff0: 20 29 3b 0a 20 20 69 66 28 20 65 78 70 52 69 67   );.  if( expRig
3000: 68 74 3d 3d 65 78 70 4c 65 66 74 20 29 7b 0a 20  ht==expLeft ){. 
3010: 20 20 20 2f 2a 20 45 69 74 68 65 72 20 58 20 61     /* Either X a
3020: 6e 64 20 59 20 62 6f 74 68 20 68 61 76 65 20 43  nd Y both have C
3030: 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 20  OLLATE operator 
3040: 6f 72 20 6e 65 69 74 68 65 72 20 64 6f 20 2a 2f  or neither do */
3050: 0a 20 20 20 20 69 66 28 20 65 78 70 52 69 67 68  .    if( expRigh
3060: 74 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 42 6f  t ){.      /* Bo
3070: 74 68 20 58 20 61 6e 64 20 59 20 68 61 76 65 20  th X and Y have 
3080: 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72  COLLATE operator
3090: 73 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 58 20  s.  Make sure X 
30a0: 69 73 20 61 6c 77 61 79 73 0a 20 20 20 20 20 20  is always.      
30b0: 2a 2a 20 75 73 65 64 20 62 79 20 63 6c 65 61 72  ** used by clear
30c0: 69 6e 67 20 74 68 65 20 45 50 5f 43 6f 6c 6c 61  ing the EP_Colla
30d0: 74 65 20 66 6c 61 67 20 66 72 6f 6d 20 59 2e 20  te flag from Y. 
30e0: 2a 2f 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  */.      pExpr->
30f0: 70 52 69 67 68 74 2d 3e 66 6c 61 67 73 20 26 3d  pRight->flags &=
3100: 20 7e 45 50 5f 43 6f 6c 6c 61 74 65 3b 0a 20 20   ~EP_Collate;.  
3110: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69    }else if( sqli
3120: 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
3130: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
3140: 65 66 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  eft)!=0 ){.     
3150: 20 2f 2a 20 4e 65 69 74 68 65 72 20 58 20 6e 6f   /* Neither X no
3160: 72 20 59 20 68 61 76 65 20 43 4f 4c 4c 41 54 45  r Y have COLLATE
3170: 20 6f 70 65 72 61 74 6f 72 73 2c 20 62 75 74 20   operators, but 
3180: 58 20 68 61 73 20 61 20 6e 6f 6e 2d 64 65 66 61  X has a non-defa
3190: 75 6c 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6c  ult.      ** col
31a0: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e  lating sequence.
31b0: 20 20 53 6f 20 61 64 64 20 74 68 65 20 45 50 5f    So add the EP_
31c0: 43 6f 6c 6c 61 74 65 20 6d 61 72 6b 65 72 20 6f  Collate marker o
31d0: 6e 20 58 20 74 6f 20 63 61 75 73 65 0a 20 20 20  n X to cause.   
31e0: 20 20 20 2a 2a 20 69 74 20 74 6f 20 62 65 20 73     ** it to be s
31f0: 65 61 72 63 68 65 64 20 66 69 72 73 74 2e 20 2a  earched first. *
3200: 2f 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70  /.      pExpr->p
3210: 4c 65 66 74 2d 3e 66 6c 61 67 73 20 7c 3d 20 45  Left->flags |= E
3220: 50 5f 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 7d  P_Collate;.    }
3230: 0a 20 20 7d 0a 20 20 53 57 41 50 28 45 78 70 72  .  }.  SWAP(Expr
3240: 2a 2c 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  *,pExpr->pRight,
3250: 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
3260: 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3e 3d   if( pExpr->op>=
3270: 54 4b 5f 47 54 20 29 7b 0a 20 20 20 20 61 73 73  TK_GT ){.    ass
3280: 65 72 74 28 20 54 4b 5f 4c 54 3d 3d 54 4b 5f 47  ert( TK_LT==TK_G
3290: 54 2b 32 20 29 3b 0a 20 20 20 20 61 73 73 65 72  T+2 );.    asser
32a0: 74 28 20 54 4b 5f 47 45 3d 3d 54 4b 5f 4c 45 2b  t( TK_GE==TK_LE+
32b0: 32 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  2 );.    assert(
32c0: 20 54 4b 5f 47 54 3e 54 4b 5f 45 51 20 29 3b 0a   TK_GT>TK_EQ );.
32d0: 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47      assert( TK_G
32e0: 54 3c 54 4b 5f 4c 45 20 29 3b 0a 20 20 20 20 61  T<TK_LE );.    a
32f0: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
3300: 3e 3d 54 4b 5f 47 54 20 26 26 20 70 45 78 70 72  >=TK_GT && pExpr
3310: 2d 3e 6f 70 3c 3d 54 4b 5f 47 45 20 29 3b 0a 20  ->op<=TK_GE );. 
3320: 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 28     pExpr->op = (
3330: 28 70 45 78 70 72 2d 3e 6f 70 2d 54 4b 5f 47 54  (pExpr->op-TK_GT
3340: 29 5e 32 29 2b 54 4b 5f 47 54 3b 0a 20 20 7d 0a  )^2)+TK_GT;.  }.
3350: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 6c 61  }../*.** Transla
3360: 74 65 20 66 72 6f 6d 20 54 4b 5f 78 78 20 6f 70  te from TK_xx op
3370: 65 72 61 74 6f 72 20 74 6f 20 57 4f 5f 78 78 20  erator to WO_xx 
3380: 62 69 74 6d 61 73 6b 2e 0a 2a 2f 0a 73 74 61 74  bitmask..*/.stat
3390: 69 63 20 75 31 36 20 6f 70 65 72 61 74 6f 72 4d  ic u16 operatorM
33a0: 61 73 6b 28 69 6e 74 20 6f 70 29 7b 0a 20 20 75  ask(int op){.  u
33b0: 31 36 20 63 3b 0a 20 20 61 73 73 65 72 74 28 20  16 c;.  assert( 
33c0: 61 6c 6c 6f 77 65 64 4f 70 28 6f 70 29 20 29 3b  allowedOp(op) );
33d0: 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e  .  if( op==TK_IN
33e0: 20 29 7b 0a 20 20 20 20 63 20 3d 20 57 4f 5f 49   ){.    c = WO_I
33f0: 4e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  N;.  }else if( o
3400: 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b 0a  p==TK_ISNULL ){.
3410: 20 20 20 20 63 20 3d 20 57 4f 5f 49 53 4e 55 4c      c = WO_ISNUL
3420: 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  L;.  }else{.    
3430: 61 73 73 65 72 74 28 20 28 57 4f 5f 45 51 3c 3c  assert( (WO_EQ<<
3440: 28 6f 70 2d 54 4b 5f 45 51 29 29 20 3c 20 30 78  (op-TK_EQ)) < 0x
3450: 37 66 66 66 20 29 3b 0a 20 20 20 20 63 20 3d 20  7fff );.    c = 
3460: 28 75 31 36 29 28 57 4f 5f 45 51 3c 3c 28 6f 70  (u16)(WO_EQ<<(op
3470: 2d 54 4b 5f 45 51 29 29 3b 0a 20 20 7d 0a 20 20  -TK_EQ));.  }.  
3480: 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 49  assert( op!=TK_I
3490: 53 4e 55 4c 4c 20 7c 7c 20 63 3d 3d 57 4f 5f 49  SNULL || c==WO_I
34a0: 53 4e 55 4c 4c 20 29 3b 0a 20 20 61 73 73 65 72  SNULL );.  asser
34b0: 74 28 20 6f 70 21 3d 54 4b 5f 49 4e 20 7c 7c 20  t( op!=TK_IN || 
34c0: 63 3d 3d 57 4f 5f 49 4e 20 29 3b 0a 20 20 61 73  c==WO_IN );.  as
34d0: 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 45 51 20  sert( op!=TK_EQ 
34e0: 7c 7c 20 63 3d 3d 57 4f 5f 45 51 20 29 3b 0a 20  || c==WO_EQ );. 
34f0: 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f   assert( op!=TK_
3500: 4c 54 20 7c 7c 20 63 3d 3d 57 4f 5f 4c 54 20 29  LT || c==WO_LT )
3510: 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d  ;.  assert( op!=
3520: 54 4b 5f 4c 45 20 7c 7c 20 63 3d 3d 57 4f 5f 4c  TK_LE || c==WO_L
3530: 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f  E );.  assert( o
3540: 70 21 3d 54 4b 5f 47 54 20 7c 7c 20 63 3d 3d 57  p!=TK_GT || c==W
3550: 4f 5f 47 54 20 29 3b 0a 20 20 61 73 73 65 72 74  O_GT );.  assert
3560: 28 20 6f 70 21 3d 54 4b 5f 47 45 20 7c 7c 20 63  ( op!=TK_GE || c
3570: 3d 3d 57 4f 5f 47 45 20 29 3b 0a 20 20 72 65 74  ==WO_GE );.  ret
3580: 75 72 6e 20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn c;.}../*.** 
3590: 41 64 76 61 6e 63 65 20 74 6f 20 74 68 65 20 6e  Advance to the n
35a0: 65 78 74 20 57 68 65 72 65 54 65 72 6d 20 74 68  ext WhereTerm th
35b0: 61 74 20 6d 61 74 63 68 65 73 20 61 63 63 6f 72  at matches accor
35c0: 64 69 6e 67 20 74 6f 20 74 68 65 20 63 72 69 74  ding to the crit
35d0: 65 72 69 61 0a 2a 2a 20 65 73 74 61 62 6c 69 73  eria.** establis
35e0: 68 65 64 20 77 68 65 6e 20 74 68 65 20 70 53 63  hed when the pSc
35f0: 61 6e 20 6f 62 6a 65 63 74 20 77 61 73 20 69 6e  an object was in
3600: 69 74 69 61 6c 69 7a 65 64 20 62 79 20 77 68 65  itialized by whe
3610: 72 65 53 63 61 6e 49 6e 69 74 28 29 2e 0a 2a 2a  reScanInit()..**
3620: 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20   Return NULL if 
3630: 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72  there are no mor
3640: 65 20 6d 61 74 63 68 69 6e 67 20 57 68 65 72 65  e matching Where
3650: 54 65 72 6d 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  Terms..*/.static
3660: 20 57 68 65 72 65 54 65 72 6d 20 2a 77 68 65 72   WhereTerm *wher
3670: 65 53 63 61 6e 4e 65 78 74 28 57 68 65 72 65 53  eScanNext(WhereS
3680: 63 61 6e 20 2a 70 53 63 61 6e 29 7b 0a 20 20 69  can *pScan){.  i
3690: 6e 74 20 69 43 75 72 3b 20 20 20 20 20 20 20 20  nt iCur;        
36a0: 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f      /* The curso
36b0: 72 20 6f 6e 20 74 68 65 20 4c 48 53 20 6f 66 20  r on the LHS of 
36c0: 74 68 65 20 74 65 72 6d 20 2a 2f 0a 20 20 69 6e  the term */.  in
36d0: 74 20 69 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20  t iColumn;      
36e0: 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c 75 6d 6e     /* The column
36f0: 20 6f 6e 20 74 68 65 20 4c 48 53 20 6f 66 20 74   on the LHS of t
3700: 68 65 20 74 65 72 6d 2e 20 20 2d 31 20 66 6f 72  he term.  -1 for
3710: 20 49 50 4b 20 2a 2f 0a 20 20 45 78 70 72 20 2a   IPK */.  Expr *
3720: 70 58 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  pX;            /
3730: 2a 20 41 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  * An expression 
3740: 62 65 69 6e 67 20 74 65 73 74 65 64 20 2a 2f 0a  being tested */.
3750: 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
3760: 57 43 3b 20 20 20 20 2f 2a 20 53 68 6f 72 74 68  WC;    /* Shorth
3770: 61 6e 64 20 66 6f 72 20 70 53 63 61 6e 2d 3e 70  and for pScan->p
3780: 57 43 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  WC */.  WhereTer
3790: 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 2f 2a 20  m *pTerm;    /* 
37a0: 54 68 65 20 74 65 72 6d 20 62 65 69 6e 67 20 74  The term being t
37b0: 65 73 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6b  ested */.  int k
37c0: 20 3d 20 70 53 63 61 6e 2d 3e 6b 3b 20 20 20 20   = pScan->k;    
37d0: 2f 2a 20 57 68 65 72 65 20 74 6f 20 73 74 61 72  /* Where to star
37e0: 74 20 73 63 61 6e 6e 69 6e 67 20 2a 2f 0a 0a 20  t scanning */.. 
37f0: 20 77 68 69 6c 65 28 20 70 53 63 61 6e 2d 3e 69   while( pScan->i
3800: 45 71 75 69 76 3c 3d 70 53 63 61 6e 2d 3e 6e 45  Equiv<=pScan->nE
3810: 71 75 69 76 20 29 7b 0a 20 20 20 20 69 43 75 72  quiv ){.    iCur
3820: 20 3d 20 70 53 63 61 6e 2d 3e 61 45 71 75 69 76   = pScan->aEquiv
3830: 5b 70 53 63 61 6e 2d 3e 69 45 71 75 69 76 2d 32  [pScan->iEquiv-2
3840: 5d 3b 0a 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d  ];.    iColumn =
3850: 20 70 53 63 61 6e 2d 3e 61 45 71 75 69 76 5b 70   pScan->aEquiv[p
3860: 53 63 61 6e 2d 3e 69 45 71 75 69 76 2d 31 5d 3b  Scan->iEquiv-1];
3870: 0a 20 20 20 20 77 68 69 6c 65 28 20 28 70 57 43  .    while( (pWC
3880: 20 3d 20 70 53 63 61 6e 2d 3e 70 57 43 29 21 3d   = pScan->pWC)!=
3890: 30 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 70  0 ){.      for(p
38a0: 54 65 72 6d 3d 70 57 43 2d 3e 61 2b 6b 3b 20 6b  Term=pWC->a+k; k
38b0: 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 6b 2b 2b  <pWC->nTerm; k++
38c0: 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  , pTerm++){.    
38d0: 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c      if( pTerm->l
38e0: 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 0a  eftCursor==iCur.
38f0: 20 20 20 20 20 20 20 20 20 26 26 20 70 54 65 72           && pTer
3900: 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3d  m->u.leftColumn=
3910: 3d 69 43 6f 6c 75 6d 6e 0a 20 20 20 20 20 20 20  =iColumn.       
3920: 20 20 26 26 20 28 70 53 63 61 6e 2d 3e 69 45 71    && (pScan->iEq
3930: 75 69 76 3c 3d 32 20 7c 7c 20 21 45 78 70 72 48  uiv<=2 || !ExprH
3940: 61 73 50 72 6f 70 65 72 74 79 28 70 54 65 72 6d  asProperty(pTerm
3950: 2d 3e 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d  ->pExpr, EP_From
3960: 4a 6f 69 6e 29 29 0a 20 20 20 20 20 20 20 20 29  Join)).        )
3970: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
3980: 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  (pTerm->eOperato
3990: 72 20 26 20 57 4f 5f 45 51 55 49 56 29 21 3d 30  r & WO_EQUIV)!=0
39a0: 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20 70  .           && p
39b0: 53 63 61 6e 2d 3e 6e 45 71 75 69 76 3c 41 72 72  Scan->nEquiv<Arr
39c0: 61 79 53 69 7a 65 28 70 53 63 61 6e 2d 3e 61 45  aySize(pScan->aE
39d0: 71 75 69 76 29 0a 20 20 20 20 20 20 20 20 20 20  quiv).          
39e0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
39f0: 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20  nt j;.          
3a00: 20 20 70 58 20 3d 20 73 71 6c 69 74 65 33 45 78    pX = sqlite3Ex
3a10: 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 54  prSkipCollate(pT
3a20: 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67  erm->pExpr->pRig
3a30: 68 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ht);.           
3a40: 20 61 73 73 65 72 74 28 20 70 58 2d 3e 6f 70 3d   assert( pX->op=
3a50: 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20  =TK_COLUMN );.  
3a60: 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d            for(j=
3a70: 30 3b 20 6a 3c 70 53 63 61 6e 2d 3e 6e 45 71 75  0; j<pScan->nEqu
3a80: 69 76 3b 20 6a 2b 3d 32 29 7b 0a 20 20 20 20 20  iv; j+=2){.     
3a90: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 53 63           if( pSc
3aa0: 61 6e 2d 3e 61 45 71 75 69 76 5b 6a 5d 3d 3d 70  an->aEquiv[j]==p
3ab0: 58 2d 3e 69 54 61 62 6c 65 0a 20 20 20 20 20 20  X->iTable.      
3ac0: 20 20 20 20 20 20 20 20 20 26 26 20 70 53 63 61           && pSca
3ad0: 6e 2d 3e 61 45 71 75 69 76 5b 6a 2b 31 5d 3d 3d  n->aEquiv[j+1]==
3ae0: 70 58 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20  pX->iColumn ){. 
3af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3b00: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
3b10: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
3b20: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
3b30: 20 20 69 66 28 20 6a 3d 3d 70 53 63 61 6e 2d 3e    if( j==pScan->
3b40: 6e 45 71 75 69 76 20 29 7b 0a 20 20 20 20 20 20  nEquiv ){.      
3b50: 20 20 20 20 20 20 20 20 70 53 63 61 6e 2d 3e 61          pScan->a
3b60: 45 71 75 69 76 5b 6a 5d 20 3d 20 70 58 2d 3e 69  Equiv[j] = pX->i
3b70: 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 20  Table;.         
3b80: 20 20 20 20 20 70 53 63 61 6e 2d 3e 61 45 71 75       pScan->aEqu
3b90: 69 76 5b 6a 2b 31 5d 20 3d 20 70 58 2d 3e 69 43  iv[j+1] = pX->iC
3ba0: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 20  olumn;.         
3bb0: 20 20 20 20 20 70 53 63 61 6e 2d 3e 6e 45 71 75       pScan->nEqu
3bc0: 69 76 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 20  iv += 2;.       
3bd0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
3be0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
3bf0: 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74   (pTerm->eOperat
3c00: 6f 72 20 26 20 70 53 63 61 6e 2d 3e 6f 70 4d 61  or & pScan->opMa
3c10: 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  sk)!=0 ){.      
3c20: 20 20 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20        /* Verify 
3c30: 74 68 65 20 61 66 66 69 6e 69 74 79 20 61 6e 64  the affinity and
3c40: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
3c50: 6e 63 65 20 6d 61 74 63 68 20 2a 2f 0a 20 20 20  nce match */.   
3c60: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 53 63           if( pSc
3c70: 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65 20 26 26  an->zCollName &&
3c80: 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74   (pTerm->eOperat
3c90: 6f 72 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 29 3d  or & WO_ISNULL)=
3ca0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
3cb0: 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
3cc0: 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ll;.            
3cd0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20    Parse *pParse 
3ce0: 3d 20 70 57 43 2d 3e 70 57 49 6e 66 6f 2d 3e 70  = pWC->pWInfo->p
3cf0: 50 61 72 73 65 3b 0a 20 20 20 20 20 20 20 20 20  Parse;.         
3d00: 20 20 20 20 20 70 58 20 3d 20 70 54 65 72 6d 2d       pX = pTerm-
3d10: 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  >pExpr;.        
3d20: 20 20 20 20 20 20 69 66 28 20 21 73 71 6c 69 74        if( !sqlit
3d30: 65 33 49 6e 64 65 78 41 66 66 69 6e 69 74 79 4f  e3IndexAffinityO
3d40: 6b 28 70 58 2c 20 70 53 63 61 6e 2d 3e 69 64 78  k(pX, pScan->idx
3d50: 61 66 66 29 20 29 7b 0a 20 20 20 20 20 20 20 20  aff) ){.        
3d60: 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
3d70: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
3d80: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
3d90: 61 73 73 65 72 74 28 70 58 2d 3e 70 4c 65 66 74  assert(pX->pLeft
3da0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
3db0: 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
3dc0: 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c  BinaryCompareCol
3dd0: 6c 53 65 71 28 70 50 61 72 73 65 2c 0a 20 20 20  lSeq(pParse,.   
3de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
3e10: 58 2d 3e 70 4c 65 66 74 2c 20 70 58 2d 3e 70 52  X->pLeft, pX->pR
3e20: 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20 20  ight);.         
3e30: 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 3d 3d       if( pColl==
3e40: 30 20 29 20 70 43 6f 6c 6c 20 3d 20 70 50 61 72  0 ) pColl = pPar
3e50: 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c  se->db->pDfltCol
3e60: 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  l;.             
3e70: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
3e80: 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  Cmp(pColl->zName
3e90: 2c 20 70 53 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61  , pScan->zCollNa
3ea0: 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  me) ){.         
3eb0: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
3ec0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
3ed0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
3ee0: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28             if( (
3ef0: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
3f00: 20 26 20 57 4f 5f 45 51 29 21 3d 30 0a 20 20 20   & WO_EQ)!=0.   
3f10: 20 20 20 20 20 20 20 20 20 20 26 26 20 28 70 58            && (pX
3f20: 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d   = pTerm->pExpr-
3f30: 3e 70 52 69 67 68 74 29 2d 3e 6f 70 3d 3d 54 4b  >pRight)->op==TK
3f40: 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20 20 20 20 20  _COLUMN.        
3f50: 20 20 20 20 20 26 26 20 70 58 2d 3e 69 54 61 62       && pX->iTab
3f60: 6c 65 3d 3d 70 53 63 61 6e 2d 3e 61 45 71 75 69  le==pScan->aEqui
3f70: 76 5b 30 5d 0a 20 20 20 20 20 20 20 20 20 20 20  v[0].           
3f80: 20 20 26 26 20 70 58 2d 3e 69 43 6f 6c 75 6d 6e    && pX->iColumn
3f90: 3d 3d 70 53 63 61 6e 2d 3e 61 45 71 75 69 76 5b  ==pScan->aEquiv[
3fa0: 31 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 29  1].            )
3fb0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
3fc0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
3fd0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
3fe0: 20 20 20 20 70 53 63 61 6e 2d 3e 6b 20 3d 20 6b      pScan->k = k
3ff0: 2b 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +1;.            
4000: 72 65 74 75 72 6e 20 70 54 65 72 6d 3b 0a 20 20  return pTerm;.  
4010: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
4020: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
4030: 20 20 70 53 63 61 6e 2d 3e 70 57 43 20 3d 20 70    pScan->pWC = p
4040: 53 63 61 6e 2d 3e 70 57 43 2d 3e 70 4f 75 74 65  Scan->pWC->pOute
4050: 72 3b 0a 20 20 20 20 20 20 6b 20 3d 20 30 3b 0a  r;.      k = 0;.
4060: 20 20 20 20 7d 0a 20 20 20 20 70 53 63 61 6e 2d      }.    pScan-
4070: 3e 70 57 43 20 3d 20 70 53 63 61 6e 2d 3e 70 4f  >pWC = pScan->pO
4080: 72 69 67 57 43 3b 0a 20 20 20 20 6b 20 3d 20 30  rigWC;.    k = 0
4090: 3b 0a 20 20 20 20 70 53 63 61 6e 2d 3e 69 45 71  ;.    pScan->iEq
40a0: 75 69 76 20 2b 3d 20 32 3b 0a 20 20 7d 0a 20 20  uiv += 2;.  }.  
40b0: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
40c0: 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 20  ** Initialize a 
40d0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 73 63 61  WHERE clause sca
40e0: 6e 6e 65 72 20 6f 62 6a 65 63 74 2e 20 20 52 65  nner object.  Re
40f0: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
4100: 6f 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 6d  o the.** first m
4110: 61 74 63 68 2e 20 20 52 65 74 75 72 6e 20 4e 55  atch.  Return NU
4120: 4c 4c 20 69 66 20 74 68 65 72 65 20 61 72 65 20  LL if there are 
4130: 6e 6f 20 6d 61 74 63 68 65 73 2e 0a 2a 2a 0a 2a  no matches..**.*
4140: 2a 20 54 68 65 20 73 63 61 6e 6e 65 72 20 77 69  * The scanner wi
4150: 6c 6c 20 62 65 20 73 65 61 72 63 68 69 6e 67 20  ll be searching 
4160: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
4170: 20 70 57 43 2e 20 20 49 74 20 77 69 6c 6c 20 6c   pWC.  It will l
4180: 6f 6f 6b 0a 2a 2a 20 66 6f 72 20 74 65 72 6d 73  ook.** for terms
4190: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 58 20   of the form "X 
41a0: 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 20 77 68 65  <op> <expr>" whe
41b0: 72 65 20 58 20 69 73 20 63 6f 6c 75 6d 6e 20 69  re X is column i
41c0: 43 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65 0a  Column of table.
41d0: 2a 2a 20 69 43 75 72 2e 20 20 54 68 65 20 3c 6f  ** iCur.  The <o
41e0: 70 3e 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f  p> must be one o
41f0: 66 20 74 68 65 20 6f 70 65 72 61 74 6f 72 73 20  f the operators 
4200: 64 65 73 63 72 69 62 65 64 20 62 79 20 6f 70 4d  described by opM
4210: 61 73 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ask..**.** If th
4220: 65 20 73 65 61 72 63 68 20 69 73 20 66 6f 72 20  e search is for 
4230: 58 20 61 6e 64 20 74 68 65 20 57 48 45 52 45 20  X and the WHERE 
4240: 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20  clause contains 
4250: 74 65 72 6d 73 20 6f 66 20 74 68 65 0a 2a 2a 20  terms of the.** 
4260: 66 6f 72 6d 20 58 3d 59 20 74 68 65 6e 20 74 68  form X=Y then th
4270: 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74  is routine might
4280: 20 61 6c 73 6f 20 72 65 74 75 72 6e 20 74 65 72   also return ter
4290: 6d 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a 2a  ms of the form.*
42a0: 2a 20 22 59 20 3c 6f 70 3e 20 3c 65 78 70 72 3e  * "Y <op> <expr>
42b0: 22 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20 6f  ".  The number o
42c0: 66 20 6c 65 76 65 6c 73 20 6f 66 20 74 72 61 6e  f levels of tran
42d0: 73 69 74 69 76 69 74 79 20 69 73 20 6c 69 6d 69  sitivity is limi
42e0: 74 65 64 2c 0a 2a 2a 20 62 75 74 20 69 73 20 65  ted,.** but is e
42f0: 6e 6f 75 67 68 20 74 6f 20 68 61 6e 64 6c 65 20  nough to handle 
4300: 6d 6f 73 74 20 63 6f 6d 6d 6f 6e 6c 79 20 6f 63  most commonly oc
4310: 63 75 72 72 69 6e 67 20 53 51 4c 20 73 74 61 74  curring SQL stat
4320: 65 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  ements..**.** If
4330: 20 58 20 69 73 20 6e 6f 74 20 74 68 65 20 49 4e   X is not the IN
4340: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
4350: 59 20 74 68 65 6e 20 58 20 6d 75 73 74 20 62 65  Y then X must be
4360: 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68   compatible with
4370: 0a 2a 2a 20 69 6e 64 65 78 20 70 49 64 78 2e 0a  .** index pIdx..
4380: 2a 2f 0a 73 74 61 74 69 63 20 57 68 65 72 65 54  */.static WhereT
4390: 65 72 6d 20 2a 77 68 65 72 65 53 63 61 6e 49 6e  erm *whereScanIn
43a0: 69 74 28 0a 20 20 57 68 65 72 65 53 63 61 6e 20  it(.  WhereScan 
43b0: 2a 70 53 63 61 6e 2c 20 20 20 20 20 20 20 2f 2a  *pScan,       /*
43c0: 20 54 68 65 20 57 68 65 72 65 53 63 61 6e 20 6f   The WhereScan o
43d0: 62 6a 65 63 74 20 62 65 69 6e 67 20 69 6e 69 74  bject being init
43e0: 69 61 6c 69 7a 65 64 20 2a 2f 0a 20 20 57 68 65  ialized */.  Whe
43f0: 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20  reClause *pWC,  
4400: 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
4410: 45 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20 73  E clause to be s
4420: 63 61 6e 6e 65 64 20 2a 2f 0a 20 20 69 6e 74 20  canned */.  int 
4430: 69 43 75 72 2c 20 20 20 20 20 20 20 20 20 20 20  iCur,           
4440: 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 74 6f      /* Cursor to
4450: 20 73 63 61 6e 20 66 6f 72 20 2a 2f 0a 20 20 69   scan for */.  i
4460: 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20  nt iColumn,     
4470: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e         /* Column
4480: 20 74 6f 20 73 63 61 6e 20 66 6f 72 20 2a 2f 0a   to scan for */.
4490: 20 20 75 33 32 20 6f 70 4d 61 73 6b 2c 20 20 20    u32 opMask,   
44a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65            /* Ope
44b0: 72 61 74 6f 72 28 73 29 20 74 6f 20 73 63 61 6e  rator(s) to scan
44c0: 20 66 6f 72 20 2a 2f 0a 20 20 49 6e 64 65 78 20   for */.  Index 
44d0: 2a 70 49 64 78 20 20 20 20 20 20 20 20 20 20 20  *pIdx           
44e0: 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 63 6f 6d    /* Must be com
44f0: 70 61 74 69 62 6c 65 20 77 69 74 68 20 74 68 69  patible with thi
4500: 73 20 69 6e 64 65 78 20 2a 2f 0a 29 7b 0a 20 20  s index */.){.  
4510: 69 6e 74 20 6a 3b 0a 0a 20 20 2f 2a 20 6d 65 6d  int j;..  /* mem
4520: 73 65 74 28 70 53 63 61 6e 2c 20 30 2c 20 73 69  set(pScan, 0, si
4530: 7a 65 6f 66 28 2a 70 53 63 61 6e 29 29 3b 20 2a  zeof(*pScan)); *
4540: 2f 0a 20 20 70 53 63 61 6e 2d 3e 70 4f 72 69 67  /.  pScan->pOrig
4550: 57 43 20 3d 20 70 57 43 3b 0a 20 20 70 53 63 61  WC = pWC;.  pSca
4560: 6e 2d 3e 70 57 43 20 3d 20 70 57 43 3b 0a 20 20  n->pWC = pWC;.  
4570: 69 66 28 20 70 49 64 78 20 26 26 20 69 43 6f 6c  if( pIdx && iCol
4580: 75 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20 20 70 53  umn>=0 ){.    pS
4590: 63 61 6e 2d 3e 69 64 78 61 66 66 20 3d 20 70 49  can->idxaff = pI
45a0: 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c  dx->pTable->aCol
45b0: 5b 69 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69  [iColumn].affini
45c0: 74 79 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ty;.    for(j=0;
45d0: 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
45e0: 6a 5d 21 3d 69 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b  j]!=iColumn; j++
45f0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 4e 45 56  ){.      if( NEV
4600: 45 52 28 6a 3e 70 49 64 78 2d 3e 6e 43 6f 6c 75  ER(j>pIdx->nColu
4610: 6d 6e 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  mn) ) return 0;.
4620: 20 20 20 20 7d 0a 20 20 20 20 70 53 63 61 6e 2d      }.    pScan-
4630: 3e 7a 43 6f 6c 6c 4e 61 6d 65 20 3d 20 70 49 64  >zCollName = pId
4640: 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20  x->azColl[j];.  
4650: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 53 63 61 6e  }else{.    pScan
4660: 2d 3e 69 64 78 61 66 66 20 3d 20 30 3b 0a 20 20  ->idxaff = 0;.  
4670: 20 20 70 53 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61    pScan->zCollNa
4680: 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 53  me = 0;.  }.  pS
4690: 63 61 6e 2d 3e 6f 70 4d 61 73 6b 20 3d 20 6f 70  can->opMask = op
46a0: 4d 61 73 6b 3b 0a 20 20 70 53 63 61 6e 2d 3e 6b  Mask;.  pScan->k
46b0: 20 3d 20 30 3b 0a 20 20 70 53 63 61 6e 2d 3e 61   = 0;.  pScan->a
46c0: 45 71 75 69 76 5b 30 5d 20 3d 20 69 43 75 72 3b  Equiv[0] = iCur;
46d0: 0a 20 20 70 53 63 61 6e 2d 3e 61 45 71 75 69 76  .  pScan->aEquiv
46e0: 5b 31 5d 20 3d 20 69 43 6f 6c 75 6d 6e 3b 0a 20  [1] = iColumn;. 
46f0: 20 70 53 63 61 6e 2d 3e 6e 45 71 75 69 76 20 3d   pScan->nEquiv =
4700: 20 32 3b 0a 20 20 70 53 63 61 6e 2d 3e 69 45 71   2;.  pScan->iEq
4710: 75 69 76 20 3d 20 32 3b 0a 20 20 72 65 74 75 72  uiv = 2;.  retur
4720: 6e 20 77 68 65 72 65 53 63 61 6e 4e 65 78 74 28  n whereScanNext(
4730: 70 53 63 61 6e 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pScan);.}../*.**
4740: 20 53 65 61 72 63 68 20 66 6f 72 20 61 20 74 65   Search for a te
4750: 72 6d 20 69 6e 20 74 68 65 20 57 48 45 52 45 20  rm in the WHERE 
4760: 63 6c 61 75 73 65 20 74 68 61 74 20 69 73 20 6f  clause that is o
4770: 66 20 74 68 65 20 66 6f 72 6d 20 22 58 20 3c 6f  f the form "X <o
4780: 70 3e 20 3c 65 78 70 72 3e 22 0a 2a 2a 20 77 68  p> <expr>".** wh
4790: 65 72 65 20 58 20 69 73 20 61 20 72 65 66 65 72  ere X is a refer
47a0: 65 6e 63 65 20 74 6f 20 74 68 65 20 69 43 6f 6c  ence to the iCol
47b0: 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20 69 43 75  umn of table iCu
47c0: 72 20 61 6e 64 20 3c 6f 70 3e 20 69 73 20 6f 6e  r and <op> is on
47d0: 65 20 6f 66 0a 2a 2a 20 74 68 65 20 57 4f 5f 78  e of.** the WO_x
47e0: 78 20 6f 70 65 72 61 74 6f 72 20 63 6f 64 65 73  x operator codes
47f0: 20 73 70 65 63 69 66 69 65 64 20 62 79 20 74 68   specified by th
4800: 65 20 6f 70 20 70 61 72 61 6d 65 74 65 72 2e 0a  e op parameter..
4810: 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
4820: 74 65 72 20 74 6f 20 74 68 65 20 74 65 72 6d 2e  ter to the term.
4830: 20 20 52 65 74 75 72 6e 20 30 20 69 66 20 6e 6f    Return 0 if no
4840: 74 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 54  t found..**.** T
4850: 68 65 20 74 65 72 6d 20 72 65 74 75 72 6e 65 64  he term returned
4860: 20 6d 69 67 68 74 20 62 79 20 59 3d 3c 65 78 70   might by Y=<exp
4870: 72 3e 20 69 66 20 74 68 65 72 65 20 69 73 20 61  r> if there is a
4880: 6e 6f 74 68 65 72 20 63 6f 6e 73 74 72 61 69 6e  nother constrain
4890: 74 20 69 6e 0a 2a 2a 20 74 68 65 20 57 48 45 52  t in.** the WHER
48a0: 45 20 63 6c 61 75 73 65 20 74 68 61 74 20 73 70  E clause that sp
48b0: 65 63 69 66 69 65 73 20 74 68 61 74 20 58 3d 59  ecifies that X=Y
48c0: 2e 20 20 41 6e 79 20 73 75 63 68 20 63 6f 6e 73  .  Any such cons
48d0: 74 72 61 69 6e 74 73 20 77 69 6c 6c 20 62 65 0a  traints will be.
48e0: 2a 2a 20 69 64 65 6e 74 69 66 69 65 64 20 62 79  ** identified by
48f0: 20 74 68 65 20 57 4f 5f 45 51 55 49 56 20 62 69   the WO_EQUIV bi
4900: 74 20 69 6e 20 74 68 65 20 70 54 65 72 6d 2d 3e  t in the pTerm->
4910: 65 4f 70 65 72 61 74 6f 72 20 66 69 65 6c 64 2e  eOperator field.
4920: 20 20 54 68 65 0a 2a 2a 20 61 45 71 75 69 76 5b    The.** aEquiv[
4930: 5d 20 61 72 72 61 79 20 68 6f 6c 64 73 20 58 20  ] array holds X 
4940: 61 6e 64 20 61 6c 6c 20 69 74 73 20 65 71 75 69  and all its equi
4950: 76 61 6c 65 6e 74 73 2c 20 77 69 74 68 20 65 61  valents, with ea
4960: 63 68 20 53 51 4c 20 76 61 72 69 61 62 6c 65 0a  ch SQL variable.
4970: 2a 2a 20 74 61 6b 69 6e 67 20 75 70 20 74 77 6f  ** taking up two
4980: 20 73 6c 6f 74 73 20 69 6e 20 61 45 71 75 69 76   slots in aEquiv
4990: 5b 5d 2e 20 20 54 68 65 20 66 69 72 73 74 20 73  [].  The first s
49a0: 6c 6f 74 20 69 73 20 66 6f 72 20 74 68 65 20 63  lot is for the c
49b0: 75 72 73 6f 72 20 6e 75 6d 62 65 72 0a 2a 2a 20  ursor number.** 
49c0: 61 6e 64 20 74 68 65 20 73 65 63 6f 6e 64 20 69  and the second i
49d0: 73 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e  s for the column
49e0: 20 6e 75 6d 62 65 72 2e 20 20 54 68 65 72 65 20   number.  There 
49f0: 61 72 65 20 32 32 20 73 6c 6f 74 73 20 69 6e 20  are 22 slots in 
4a00: 61 45 71 75 69 76 5b 5d 0a 2a 2a 20 73 6f 20 74  aEquiv[].** so t
4a10: 68 61 74 20 6d 65 61 6e 73 20 77 65 20 63 61 6e  hat means we can
4a20: 20 6c 6f 6f 6b 20 66 6f 72 20 58 20 70 6c 75 73   look for X plus
4a30: 20 75 70 20 74 6f 20 31 30 20 6f 74 68 65 72 20   up to 10 other 
4a40: 65 71 75 69 76 61 6c 65 6e 74 20 76 61 6c 75 65  equivalent value
4a50: 73 2e 0a 2a 2a 20 48 65 6e 63 65 20 61 20 73 65  s..** Hence a se
4a60: 61 72 63 68 20 66 6f 72 20 58 20 77 69 6c 6c 20  arch for X will 
4a70: 72 65 74 75 72 6e 20 3c 65 78 70 72 3e 20 69 66  return <expr> if
4a80: 20 58 3d 41 31 20 61 6e 64 20 41 31 3d 41 32 20   X=A1 and A1=A2 
4a90: 61 6e 64 20 41 32 3d 41 33 0a 2a 2a 20 61 6e 64  and A2=A3.** and
4aa0: 20 2e 2e 2e 20 61 6e 64 20 41 39 3d 41 31 30 20   ... and A9=A10 
4ab0: 61 6e 64 20 41 31 30 3d 3c 65 78 70 72 3e 2e 0a  and A10=<expr>..
4ac0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61  **.** If there a
4ad0: 72 65 20 6d 75 6c 74 69 70 6c 65 20 74 65 72 6d  re multiple term
4ae0: 73 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63  s in the WHERE c
4af0: 6c 61 75 73 65 20 6f 66 20 74 68 65 20 66 6f 72  lause of the for
4b00: 6d 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e  m "X <op> <expr>
4b10: 22 0a 2a 2a 20 74 68 65 6e 20 74 72 79 20 66 6f  ".** then try fo
4b20: 72 20 74 68 65 20 6f 6e 65 20 77 69 74 68 20 6e  r the one with n
4b30: 6f 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20 6f  o dependencies o
4b40: 6e 20 3c 65 78 70 72 3e 20 2d 20 69 6e 20 6f 74  n <expr> - in ot
4b50: 68 65 72 20 77 6f 72 64 73 20 77 68 65 72 65 0a  her words where.
4b60: 2a 2a 20 3c 65 78 70 72 3e 20 69 73 20 61 20 63  ** <expr> is a c
4b70: 6f 6e 73 74 61 6e 74 20 65 78 70 72 65 73 73 69  onstant expressi
4b80: 6f 6e 20 6f 66 20 73 6f 6d 65 20 6b 69 6e 64 2e  on of some kind.
4b90: 20 20 4f 6e 6c 79 20 72 65 74 75 72 6e 20 65 6e    Only return en
4ba0: 74 72 69 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20  tries of.** the 
4bb0: 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 59 22 20  form "X <op> Y" 
4bc0: 77 68 65 72 65 20 59 20 69 73 20 61 20 63 6f 6c  where Y is a col
4bd0: 75 6d 6e 20 69 6e 20 61 6e 6f 74 68 65 72 20 74  umn in another t
4be0: 61 62 6c 65 20 69 66 20 6e 6f 20 74 65 72 6d 73  able if no terms
4bf0: 20 6f 66 0a 2a 2a 20 74 68 65 20 66 6f 72 6d 20   of.** the form 
4c00: 22 58 20 3c 6f 70 3e 20 3c 63 6f 6e 73 74 2d 65  "X <op> <const-e
4c10: 78 70 72 3e 22 20 65 78 69 73 74 2e 20 20 20 49  xpr>" exist.   I
4c20: 66 20 6e 6f 20 74 65 72 6d 73 20 77 69 74 68 20  f no terms with 
4c30: 61 20 63 6f 6e 73 74 61 6e 74 20 52 48 53 0a 2a  a constant RHS.*
4c40: 2a 20 65 78 69 73 74 2c 20 74 72 79 20 74 6f 20  * exist, try to 
4c50: 72 65 74 75 72 6e 20 61 20 74 65 72 6d 20 74 68  return a term th
4c60: 61 74 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  at does not use 
4c70: 57 4f 5f 45 51 55 49 56 2e 0a 2a 2f 0a 73 74 61  WO_EQUIV..*/.sta
4c80: 74 69 63 20 57 68 65 72 65 54 65 72 6d 20 2a 66  tic WhereTerm *f
4c90: 69 6e 64 54 65 72 6d 28 0a 20 20 57 68 65 72 65  indTerm(.  Where
4ca0: 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20  Clause *pWC,    
4cb0: 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c   /* The WHERE cl
4cc0: 61 75 73 65 20 74 6f 20 62 65 20 73 65 61 72 63  ause to be searc
4cd0: 68 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75  hed */.  int iCu
4ce0: 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  r,             /
4cf0: 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  * Cursor number 
4d00: 6f 66 20 4c 48 53 20 2a 2f 0a 20 20 69 6e 74 20  of LHS */.  int 
4d10: 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 20 20  iColumn,        
4d20: 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62    /* Column numb
4d30: 65 72 20 6f 66 20 4c 48 53 20 2a 2f 0a 20 20 42  er of LHS */.  B
4d40: 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c  itmask notReady,
4d50: 20 20 20 20 20 2f 2a 20 52 48 53 20 6d 75 73 74       /* RHS must
4d60: 20 6e 6f 74 20 6f 76 65 72 6c 61 70 20 77 69 74   not overlap wit
4d70: 68 20 74 68 69 73 20 6d 61 73 6b 20 2a 2f 0a 20  h this mask */. 
4d80: 20 75 33 32 20 6f 70 2c 20 20 20 20 20 20 20 20   u32 op,        
4d90: 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
4da0: 66 20 57 4f 5f 78 78 20 76 61 6c 75 65 73 20 64  f WO_xx values d
4db0: 65 73 63 72 69 62 69 6e 67 20 6f 70 65 72 61 74  escribing operat
4dc0: 6f 72 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  or */.  Index *p
4dd0: 49 64 78 20 20 20 20 20 20 20 20 20 20 20 2f 2a  Idx           /*
4de0: 20 4d 75 73 74 20 62 65 20 63 6f 6d 70 61 74 69   Must be compati
4df0: 62 6c 65 20 77 69 74 68 20 74 68 69 73 20 69 6e  ble with this in
4e00: 64 65 78 2c 20 69 66 20 6e 6f 74 20 4e 55 4c 4c  dex, if not NULL
4e10: 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 54 65   */.){.  WhereTe
4e20: 72 6d 20 2a 70 52 65 73 75 6c 74 20 3d 20 30 3b  rm *pResult = 0;
4e30: 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 3b  .  WhereTerm *p;
4e40: 0a 20 20 57 68 65 72 65 53 63 61 6e 20 73 63 61  .  WhereScan sca
4e50: 6e 3b 0a 0a 20 20 70 20 3d 20 77 68 65 72 65 53  n;..  p = whereS
4e60: 63 61 6e 49 6e 69 74 28 26 73 63 61 6e 2c 20 70  canInit(&scan, p
4e70: 57 43 2c 20 69 43 75 72 2c 20 69 43 6f 6c 75 6d  WC, iCur, iColum
4e80: 6e 2c 20 6f 70 2c 20 70 49 64 78 29 3b 0a 20 20  n, op, pIdx);.  
4e90: 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20  while( p ){.    
4ea0: 69 66 28 20 28 70 2d 3e 70 72 65 72 65 71 52 69  if( (p->prereqRi
4eb0: 67 68 74 20 26 20 6e 6f 74 52 65 61 64 79 29 3d  ght & notReady)=
4ec0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
4ed0: 70 2d 3e 70 72 65 72 65 71 52 69 67 68 74 3d 3d  p->prereqRight==
4ee0: 30 20 26 26 20 28 70 2d 3e 65 4f 70 65 72 61 74  0 && (p->eOperat
4ef0: 6f 72 26 57 4f 5f 45 51 29 21 3d 30 20 29 7b 0a  or&WO_EQ)!=0 ){.
4f00: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70          return p
4f10: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
4f20: 69 66 28 20 70 52 65 73 75 6c 74 3d 3d 30 20 29  if( pResult==0 )
4f30: 20 70 52 65 73 75 6c 74 20 3d 20 70 3b 0a 20 20   pResult = p;.  
4f40: 20 20 7d 0a 20 20 20 20 70 20 3d 20 77 68 65 72    }.    p = wher
4f50: 65 53 63 61 6e 4e 65 78 74 28 26 73 63 61 6e 29  eScanNext(&scan)
4f60: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
4f70: 52 65 73 75 6c 74 3b 0a 7d 0a 0a 2f 2a 20 46 6f  Result;.}../* Fo
4f80: 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20  rward reference 
4f90: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
4fa0: 78 70 72 41 6e 61 6c 79 7a 65 28 53 72 63 4c 69  xprAnalyze(SrcLi
4fb0: 73 74 2a 2c 20 57 68 65 72 65 43 6c 61 75 73 65  st*, WhereClause
4fc0: 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20  *, int);../*.** 
4fd0: 43 61 6c 6c 20 65 78 70 72 41 6e 61 6c 79 7a 65  Call exprAnalyze
4fe0: 20 6f 6e 20 61 6c 6c 20 74 65 72 6d 73 20 69 6e   on all terms in
4ff0: 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e   a WHERE clause.
5000: 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69    .*/.static voi
5010: 64 20 65 78 70 72 41 6e 61 6c 79 7a 65 41 6c 6c  d exprAnalyzeAll
5020: 28 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  (.  SrcList *pTa
5030: 62 4c 69 73 74 2c 20 20 20 20 20 20 20 2f 2a 20  bList,       /* 
5040: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
5050: 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  */.  WhereClause
5060: 20 2a 70 57 43 20 20 20 20 20 20 20 20 20 2f 2a   *pWC         /*
5070: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
5080: 65 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64  e to be analyzed
5090: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   */.){.  int i;.
50a0: 20 20 66 6f 72 28 69 3d 70 57 43 2d 3e 6e 54 65    for(i=pWC->nTe
50b0: 72 6d 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29  rm-1; i>=0; i--)
50c0: 7b 0a 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a  {.    exprAnalyz
50d0: 65 28 70 54 61 62 4c 69 73 74 2c 20 70 57 43 2c  e(pTabList, pWC,
50e0: 20 69 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e   i);.  }.}..#ifn
50f0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
5100: 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  LIKE_OPTIMIZATIO
5110: 4e 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f  N./*.** Check to
5120: 20 73 65 65 20 69 66 20 74 68 65 20 67 69 76 65   see if the give
5130: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  n expression is 
5140: 61 20 4c 49 4b 45 20 6f 72 20 47 4c 4f 42 20 6f  a LIKE or GLOB o
5150: 70 65 72 61 74 6f 72 20 74 68 61 74 0a 2a 2a 20  perator that.** 
5160: 63 61 6e 20 62 65 20 6f 70 74 69 6d 69 7a 65 64  can be optimized
5170: 20 75 73 69 6e 67 20 69 6e 65 71 75 61 6c 69 74   using inequalit
5180: 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 20 20  y constraints.  
5190: 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 69  Return TRUE if i
51a0: 74 20 69 73 0a 2a 2a 20 73 6f 20 61 6e 64 20 66  t is.** so and f
51b0: 61 6c 73 65 20 69 66 20 6e 6f 74 2e 0a 2a 2a 0a  alse if not..**.
51c0: 2a 2a 20 49 6e 20 6f 72 64 65 72 20 66 6f 72 20  ** In order for 
51d0: 74 68 65 20 6f 70 65 72 61 74 6f 72 20 74 6f 20  the operator to 
51e0: 62 65 20 6f 70 74 69 6d 69 7a 69 62 6c 65 2c 20  be optimizible, 
51f0: 74 68 65 20 52 48 53 20 6d 75 73 74 20 62 65 20  the RHS must be 
5200: 61 20 73 74 72 69 6e 67 0a 2a 2a 20 6c 69 74 65  a string.** lite
5210: 72 61 6c 20 74 68 61 74 20 64 6f 65 73 20 6e 6f  ral that does no
5220: 74 20 62 65 67 69 6e 20 77 69 74 68 20 61 20 77  t begin with a w
5230: 69 6c 64 63 61 72 64 2e 20 20 54 68 65 20 4c 48  ildcard.  The LH
5240: 53 20 6d 75 73 74 20 62 65 20 61 20 63 6f 6c 75  S must be a colu
5250: 6d 6e 0a 2a 2a 20 74 68 61 74 20 6d 61 79 20 6f  mn.** that may o
5260: 6e 6c 79 20 62 65 20 4e 55 4c 4c 2c 20 61 20 73  nly be NULL, a s
5270: 74 72 69 6e 67 2c 20 6f 72 20 61 20 42 4c 4f 42  tring, or a BLOB
5280: 2c 20 6e 65 76 65 72 20 61 20 6e 75 6d 62 65 72  , never a number
5290: 2e 20 28 54 68 69 73 20 6d 65 61 6e 73 0a 2a 2a  . (This means.**
52a0: 20 74 68 61 74 20 76 69 72 74 75 61 6c 20 74 61   that virtual ta
52b0: 62 6c 65 73 20 63 61 6e 6e 6f 74 20 70 61 72 74  bles cannot part
52c0: 69 63 69 70 61 74 65 20 69 6e 20 74 68 65 20 4c  icipate in the L
52d0: 49 4b 45 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  IKE optimization
52e0: 2e 29 20 20 49 66 20 74 68 65 0a 2a 2a 20 63 6f  .)  If the.** co
52f0: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
5300: 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20   for the column 
5310: 6f 6e 20 74 68 65 20 4c 48 53 20 6d 75 73 74 20  on the LHS must 
5320: 62 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 66  be appropriate f
5330: 6f 72 0a 2a 2a 20 74 68 65 20 6f 70 65 72 61 74  or.** the operat
5340: 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  or..*/.static in
5350: 74 20 69 73 4c 69 6b 65 4f 72 47 6c 6f 62 28 0a  t isLikeOrGlob(.
5360: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
5370: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61      /* Parsing a
5380: 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69  nd code generati
5390: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
53a0: 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20  Expr *pExpr,    
53b0: 20 20 2f 2a 20 54 65 73 74 20 74 68 69 73 20 65    /* Test this e
53c0: 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 45  xpression */.  E
53d0: 78 70 72 20 2a 2a 70 70 50 72 65 66 69 78 2c 20  xpr **ppPrefix, 
53e0: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 54   /* Pointer to T
53f0: 4b 5f 53 54 52 49 4e 47 20 65 78 70 72 65 73 73  K_STRING express
5400: 69 6f 6e 20 77 69 74 68 20 70 61 74 74 65 72 6e  ion with pattern
5410: 20 70 72 65 66 69 78 20 2a 2f 0a 20 20 69 6e 74   prefix */.  int
5420: 20 2a 70 69 73 43 6f 6d 70 6c 65 74 65 2c 20 2f   *pisComplete, /
5430: 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 6f 6e  * True if the on
5440: 6c 79 20 77 69 6c 64 63 61 72 64 20 69 73 20 25  ly wildcard is %
5450: 20 69 6e 20 74 68 65 20 6c 61 73 74 20 63 68 61   in the last cha
5460: 72 61 63 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  racter */.  int 
5470: 2a 70 6e 6f 43 61 73 65 20 20 20 20 20 20 2f 2a  *pnoCase      /*
5480: 20 54 72 75 65 20 69 66 20 75 70 70 65 72 63 61   True if upperca
5490: 73 65 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74  se is equivalent
54a0: 20 74 6f 20 6c 6f 77 65 72 63 61 73 65 20 2a 2f   to lowercase */
54b0: 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  .){.  const char
54c0: 20 2a 7a 20 3d 20 30 3b 20 20 20 20 20 20 20 20   *z = 0;        
54d0: 20 2f 2a 20 53 74 72 69 6e 67 20 6f 6e 20 52 48   /* String on RH
54e0: 53 20 6f 66 20 4c 49 4b 45 20 6f 70 65 72 61 74  S of LIKE operat
54f0: 6f 72 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 52  or */.  Expr *pR
5500: 69 67 68 74 2c 20 2a 70 4c 65 66 74 3b 20 20 20  ight, *pLeft;   
5510: 20 20 20 2f 2a 20 52 69 67 68 74 20 61 6e 64 20     /* Right and 
5520: 6c 65 66 74 20 73 69 7a 65 20 6f 66 20 4c 49 4b  left size of LIK
5530: 45 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  E operator */.  
5540: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b  ExprList *pList;
5550: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69             /* Li
5560: 73 74 20 6f 66 20 6f 70 65 72 61 6e 64 73 20 74  st of operands t
5570: 6f 20 74 68 65 20 4c 49 4b 45 20 6f 70 65 72 61  o the LIKE opera
5580: 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 63 3b 20  tor */.  int c; 
5590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
55a0: 20 20 20 20 2f 2a 20 4f 6e 65 20 63 68 61 72 61      /* One chara
55b0: 63 74 65 72 20 69 6e 20 7a 5b 5d 20 2a 2f 0a 20  cter in z[] */. 
55c0: 20 69 6e 74 20 63 6e 74 3b 20 20 20 20 20 20 20   int cnt;       
55d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
55e0: 75 6d 62 65 72 20 6f 66 20 6e 6f 6e 2d 77 69 6c  umber of non-wil
55f0: 64 63 61 72 64 20 70 72 65 66 69 78 20 63 68 61  dcard prefix cha
5600: 72 61 63 74 65 72 73 20 2a 2f 0a 20 20 63 68 61  racters */.  cha
5610: 72 20 77 63 5b 33 5d 3b 20 20 20 20 20 20 20 20  r wc[3];        
5620: 20 20 20 20 20 20 20 20 2f 2a 20 57 69 6c 64 63          /* Wildc
5630: 61 72 64 20 63 68 61 72 61 63 74 65 72 73 20 2a  ard characters *
5640: 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
5650: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 2f  = pParse->db;  /
5660: 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
5670: 63 74 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74  ction */.  sqlit
5680: 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 20 3d  e3_value *pVal =
5690: 20 30 3b 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20   0;.  int op;   
56a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
56b0: 20 2f 2a 20 4f 70 63 6f 64 65 20 6f 66 20 70 52   /* Opcode of pR
56c0: 69 67 68 74 20 2a 2f 0a 0a 20 20 69 66 28 20 21  ight */..  if( !
56d0: 73 71 6c 69 74 65 33 49 73 4c 69 6b 65 46 75 6e  sqlite3IsLikeFun
56e0: 63 74 69 6f 6e 28 64 62 2c 20 70 45 78 70 72 2c  ction(db, pExpr,
56f0: 20 70 6e 6f 43 61 73 65 2c 20 77 63 29 20 29 7b   pnoCase, wc) ){
5700: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
5710: 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
5720: 5f 45 42 43 44 49 43 0a 20 20 69 66 28 20 2a 70  _EBCDIC.  if( *p
5730: 6e 6f 43 61 73 65 20 29 20 72 65 74 75 72 6e 20  noCase ) return 
5740: 30 3b 0a 23 65 6e 64 69 66 0a 20 20 70 4c 69 73  0;.#endif.  pLis
5750: 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  t = pExpr->x.pLi
5760: 73 74 3b 0a 20 20 70 4c 65 66 74 20 3d 20 70 4c  st;.  pLeft = pL
5770: 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b  ist->a[1].pExpr;
5780: 0a 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70  .  if( pLeft->op
5790: 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 0a 20 20 20  !=TK_COLUMN .   
57a0: 7c 7c 20 73 71 6c 69 74 65 33 45 78 70 72 41 66  || sqlite3ExprAf
57b0: 66 69 6e 69 74 79 28 70 4c 65 66 74 29 21 3d 53  finity(pLeft)!=S
57c0: 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20 0a  QLITE_AFF_TEXT .
57d0: 20 20 20 7c 7c 20 49 73 56 69 72 74 75 61 6c 28     || IsVirtual(
57e0: 70 4c 65 66 74 2d 3e 70 54 61 62 29 20 20 2f 2a  pLeft->pTab)  /*
57f0: 20 56 61 6c 75 65 20 6d 69 67 68 74 20 62 65 20   Value might be 
5800: 6e 75 6d 65 72 69 63 20 2a 2f 0a 20 20 29 7b 0a  numeric */.  ){.
5810: 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 30 32      /* IMP: R-02
5820: 30 36 35 2d 34 39 34 36 35 20 54 68 65 20 6c 65  065-49465 The le
5830: 66 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20  ft-hand side of 
5840: 74 68 65 20 4c 49 4b 45 20 6f 72 20 47 4c 4f 42  the LIKE or GLOB
5850: 20 6f 70 65 72 61 74 6f 72 20 6d 75 73 74 0a 20   operator must. 
5860: 20 20 20 2a 2a 20 62 65 20 74 68 65 20 6e 61 6d     ** be the nam
5870: 65 20 6f 66 20 61 6e 20 69 6e 64 65 78 65 64 20  e of an indexed 
5880: 63 6f 6c 75 6d 6e 20 77 69 74 68 20 54 45 58 54  column with TEXT
5890: 20 61 66 66 69 6e 69 74 79 2e 20 2a 2f 0a 20 20   affinity. */.  
58a0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
58b0: 20 20 61 73 73 65 72 74 28 20 70 4c 65 66 74 2d    assert( pLeft-
58c0: 3e 69 43 6f 6c 75 6d 6e 21 3d 28 2d 31 29 20 29  >iColumn!=(-1) )
58d0: 3b 20 2f 2a 20 42 65 63 61 75 73 65 20 49 50 4b  ; /* Because IPK
58e0: 20 6e 65 76 65 72 20 68 61 73 20 41 46 46 5f 54   never has AFF_T
58f0: 45 58 54 20 2a 2f 0a 0a 20 20 70 52 69 67 68 74  EXT */..  pRight
5900: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b   = sqlite3ExprSk
5910: 69 70 43 6f 6c 6c 61 74 65 28 70 4c 69 73 74 2d  ipCollate(pList-
5920: 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[0].pExpr);.  
5930: 6f 70 20 3d 20 70 52 69 67 68 74 2d 3e 6f 70 3b  op = pRight->op;
5940: 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 56 41  .  if( op==TK_VA
5950: 52 49 41 42 4c 45 20 29 7b 0a 20 20 20 20 56 64  RIABLE ){.    Vd
5960: 62 65 20 2a 70 52 65 70 72 65 70 61 72 65 20 3d  be *pReprepare =
5970: 20 70 50 61 72 73 65 2d 3e 70 52 65 70 72 65 70   pParse->pReprep
5980: 61 72 65 3b 0a 20 20 20 20 69 6e 74 20 69 43 6f  are;.    int iCo
5990: 6c 20 3d 20 70 52 69 67 68 74 2d 3e 69 43 6f 6c  l = pRight->iCol
59a0: 75 6d 6e 3b 0a 20 20 20 20 70 56 61 6c 20 3d 20  umn;.    pVal = 
59b0: 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 42 6f  sqlite3VdbeGetBo
59c0: 75 6e 64 56 61 6c 75 65 28 70 52 65 70 72 65 70  undValue(pReprep
59d0: 61 72 65 2c 20 69 43 6f 6c 2c 20 53 51 4c 49 54  are, iCol, SQLIT
59e0: 45 5f 41 46 46 5f 4e 4f 4e 45 29 3b 0a 20 20 20  E_AFF_NONE);.   
59f0: 20 69 66 28 20 70 56 61 6c 20 26 26 20 73 71 6c   if( pVal && sql
5a00: 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28  ite3_value_type(
5a10: 70 56 61 6c 29 3d 3d 53 51 4c 49 54 45 5f 54 45  pVal)==SQLITE_TE
5a20: 58 54 20 29 7b 0a 20 20 20 20 20 20 7a 20 3d 20  XT ){.      z = 
5a30: 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f  (char *)sqlite3_
5a40: 76 61 6c 75 65 5f 74 65 78 74 28 70 56 61 6c 29  value_text(pVal)
5a50: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
5a60: 74 65 33 56 64 62 65 53 65 74 56 61 72 6d 61 73  te3VdbeSetVarmas
5a70: 6b 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c  k(pParse->pVdbe,
5a80: 20 69 43 6f 6c 29 3b 0a 20 20 20 20 61 73 73 65   iCol);.    asse
5a90: 72 74 28 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d  rt( pRight->op==
5aa0: 54 4b 5f 56 41 52 49 41 42 4c 45 20 7c 7c 20 70  TK_VARIABLE || p
5ab0: 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 52 45  Right->op==TK_RE
5ac0: 47 49 53 54 45 52 20 29 3b 0a 20 20 7d 65 6c 73  GISTER );.  }els
5ad0: 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 53 54 52  e if( op==TK_STR
5ae0: 49 4e 47 20 29 7b 0a 20 20 20 20 7a 20 3d 20 70  ING ){.    z = p
5af0: 52 69 67 68 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b  Right->u.zToken;
5b00: 0a 20 20 7d 0a 20 20 69 66 28 20 7a 20 29 7b 0a  .  }.  if( z ){.
5b10: 20 20 20 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20      cnt = 0;.   
5b20: 20 77 68 69 6c 65 28 20 28 63 3d 7a 5b 63 6e 74   while( (c=z[cnt
5b30: 5d 29 21 3d 30 20 26 26 20 63 21 3d 77 63 5b 30  ])!=0 && c!=wc[0
5b40: 5d 20 26 26 20 63 21 3d 77 63 5b 31 5d 20 26 26  ] && c!=wc[1] &&
5b50: 20 63 21 3d 77 63 5b 32 5d 20 29 7b 0a 20 20 20   c!=wc[2] ){.   
5b60: 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 7d 0a     cnt++;.    }.
5b70: 20 20 20 20 69 66 28 20 63 6e 74 21 3d 30 20 26      if( cnt!=0 &
5b80: 26 20 32 35 35 21 3d 28 75 38 29 7a 5b 63 6e 74  & 255!=(u8)z[cnt
5b90: 2d 31 5d 20 29 7b 0a 20 20 20 20 20 20 45 78 70  -1] ){.      Exp
5ba0: 72 20 2a 70 50 72 65 66 69 78 3b 0a 20 20 20 20  r *pPrefix;.    
5bb0: 20 20 2a 70 69 73 43 6f 6d 70 6c 65 74 65 20 3d    *pisComplete =
5bc0: 20 63 3d 3d 77 63 5b 30 5d 20 26 26 20 7a 5b 63   c==wc[0] && z[c
5bd0: 6e 74 2b 31 5d 3d 3d 30 3b 0a 20 20 20 20 20 20  nt+1]==0;.      
5be0: 70 50 72 65 66 69 78 20 3d 20 73 71 6c 69 74 65  pPrefix = sqlite
5bf0: 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 53 54 52  3Expr(db, TK_STR
5c00: 49 4e 47 2c 20 7a 29 3b 0a 20 20 20 20 20 20 69  ING, z);.      i
5c10: 66 28 20 70 50 72 65 66 69 78 20 29 20 70 50 72  f( pPrefix ) pPr
5c20: 65 66 69 78 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 63  efix->u.zToken[c
5c30: 6e 74 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 2a  nt] = 0;.      *
5c40: 70 70 50 72 65 66 69 78 20 3d 20 70 50 72 65 66  ppPrefix = pPref
5c50: 69 78 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 70  ix;.      if( op
5c60: 3d 3d 54 4b 5f 56 41 52 49 41 42 4c 45 20 29 7b  ==TK_VARIABLE ){
5c70: 0a 20 20 20 20 20 20 20 20 56 64 62 65 20 2a 76  .        Vdbe *v
5c80: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
5c90: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
5ca0: 33 56 64 62 65 53 65 74 56 61 72 6d 61 73 6b 28  3VdbeSetVarmask(
5cb0: 76 2c 20 70 52 69 67 68 74 2d 3e 69 43 6f 6c 75  v, pRight->iColu
5cc0: 6d 6e 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  mn);.        if(
5cd0: 20 2a 70 69 73 43 6f 6d 70 6c 65 74 65 20 26 26   *pisComplete &&
5ce0: 20 70 52 69 67 68 74 2d 3e 75 2e 7a 54 6f 6b 65   pRight->u.zToke
5cf0: 6e 5b 31 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  n[1] ){.        
5d00: 20 20 2f 2a 20 49 66 20 74 68 65 20 72 68 73 20    /* If the rhs 
5d10: 6f 66 20 74 68 65 20 4c 49 4b 45 20 65 78 70 72  of the LIKE expr
5d20: 65 73 73 69 6f 6e 20 69 73 20 61 20 76 61 72 69  ession is a vari
5d30: 61 62 6c 65 2c 20 61 6e 64 20 74 68 65 20 63 75  able, and the cu
5d40: 72 72 65 6e 74 0a 20 20 20 20 20 20 20 20 20 20  rrent.          
5d50: 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  ** value of the 
5d60: 76 61 72 69 61 62 6c 65 20 6d 65 61 6e 73 20 74  variable means t
5d70: 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20  here is no need 
5d80: 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20 4c 49  to invoke the LI
5d90: 4b 45 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  KE.          ** 
5da0: 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65 6e 20 6e  function, then n
5db0: 6f 20 4f 50 5f 56 61 72 69 61 62 6c 65 20 77 69  o OP_Variable wi
5dc0: 6c 6c 20 62 65 20 61 64 64 65 64 20 74 6f 20 74  ll be added to t
5dd0: 68 65 20 70 72 6f 67 72 61 6d 2e 0a 20 20 20 20  he program..    
5de0: 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 63 61        ** This ca
5df0: 75 73 65 73 20 70 72 6f 62 6c 65 6d 73 20 66 6f  uses problems fo
5e00: 72 20 74 68 65 20 73 71 6c 69 74 65 33 5f 62 69  r the sqlite3_bi
5e10: 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d  nd_parameter_nam
5e20: 65 28 29 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  e().          **
5e30: 20 41 50 49 2e 20 54 6f 20 77 6f 72 6b 20 61 72   API. To work ar
5e40: 6f 75 6e 64 20 74 68 65 6d 2c 20 61 64 64 20 61  ound them, add a
5e50: 20 64 75 6d 6d 79 20 4f 50 5f 56 61 72 69 61 62   dummy OP_Variab
5e60: 6c 65 20 68 65 72 65 2e 0a 20 20 20 20 20 20 20  le here..       
5e70: 20 20 20 2a 2f 20 0a 20 20 20 20 20 20 20 20 20     */ .         
5e80: 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65   int r1 = sqlite
5e90: 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
5ea0: 73 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  se);.          s
5eb0: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61  qlite3ExprCodeTa
5ec0: 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 52 69  rget(pParse, pRi
5ed0: 67 68 74 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  ght, r1);.      
5ee0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
5ef0: 68 61 6e 67 65 50 33 28 76 2c 20 73 71 6c 69 74  hangeP3(v, sqlit
5f00: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
5f10: 72 28 76 29 2d 31 2c 20 30 29 3b 0a 20 20 20 20  r(v)-1, 0);.    
5f20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
5f30: 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
5f40: 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20  se, r1);.       
5f50: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
5f60: 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 20 3d 20  else{.      z = 
5f70: 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  0;.    }.  }..  
5f80: 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65  sqlite3ValueFree
5f90: 28 70 56 61 6c 29 3b 0a 20 20 72 65 74 75 72 6e  (pVal);.  return
5fa0: 20 28 7a 21 3d 30 29 3b 0a 7d 0a 23 65 6e 64 69   (z!=0);.}.#endi
5fb0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
5fc0: 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a 41 54 49  _LIKE_OPTIMIZATI
5fd0: 4f 4e 20 2a 2f 0a 0a 0a 23 69 66 6e 64 65 66 20  ON */...#ifndef 
5fe0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
5ff0: 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 43  UALTABLE./*.** C
6000: 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74  heck to see if t
6010: 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73  he given express
6020: 69 6f 6e 20 69 73 20 6f 66 20 74 68 65 20 66 6f  ion is of the fo
6030: 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  rm.**.**        
6040: 20 63 6f 6c 75 6d 6e 20 4d 41 54 43 48 20 65 78   column MATCH ex
6050: 70 72 0a 2a 2a 0a 2a 2a 20 49 66 20 69 74 20 69  pr.**.** If it i
6060: 73 20 74 68 65 6e 20 72 65 74 75 72 6e 20 54 52  s then return TR
6070: 55 45 2e 20 20 49 66 20 6e 6f 74 2c 20 72 65 74  UE.  If not, ret
6080: 75 72 6e 20 46 41 4c 53 45 2e 0a 2a 2f 0a 73 74  urn FALSE..*/.st
6090: 61 74 69 63 20 69 6e 74 20 69 73 4d 61 74 63 68  atic int isMatch
60a0: 4f 66 43 6f 6c 75 6d 6e 28 0a 20 20 45 78 70 72  OfColumn(.  Expr
60b0: 20 2a 70 45 78 70 72 20 20 20 20 20 20 2f 2a 20   *pExpr      /* 
60c0: 54 65 73 74 20 74 68 69 73 20 65 78 70 72 65 73  Test this expres
60d0: 73 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 45 78 70  sion */.){.  Exp
60e0: 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b 0a 0a 20  rList *pList;.. 
60f0: 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d   if( pExpr->op!=
6100: 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 29 7b 0a 20  TK_FUNCTION ){. 
6110: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
6120: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74  .  if( sqlite3St
6130: 72 49 43 6d 70 28 70 45 78 70 72 2d 3e 75 2e 7a  rICmp(pExpr->u.z
6140: 54 6f 6b 65 6e 2c 22 6d 61 74 63 68 22 29 21 3d  Token,"match")!=
6150: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
6160: 30 3b 0a 20 20 7d 0a 20 20 70 4c 69 73 74 20 3d  0;.  }.  pList =
6170: 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b   pExpr->x.pList;
6180: 0a 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e 45  .  if( pList->nE
6190: 78 70 72 21 3d 32 20 29 7b 0a 20 20 20 20 72 65  xpr!=2 ){.    re
61a0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66  turn 0;.  }.  if
61b0: 28 20 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45  ( pList->a[1].pE
61c0: 78 70 72 2d 3e 6f 70 20 21 3d 20 54 4b 5f 43 4f  xpr->op != TK_CO
61d0: 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 72 65 74 75  LUMN ){.    retu
61e0: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 0;.  }.  retu
61f0: 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  rn 1;.}.#endif /
6200: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  * SQLITE_OMIT_VI
6210: 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 2f  RTUALTABLE */../
6220: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 42 61 73  *.** If the pBas
6230: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 72 69  e expression ori
6240: 67 69 6e 61 74 65 64 20 69 6e 20 74 68 65 20 4f  ginated in the O
6250: 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73  N or USING claus
6260: 65 20 6f 66 0a 2a 2a 20 61 20 6a 6f 69 6e 2c 20  e of.** a join, 
6270: 74 68 65 6e 20 74 72 61 6e 73 66 65 72 20 74 68  then transfer th
6280: 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 6d 61  e appropriate ma
6290: 72 6b 69 6e 67 73 20 6f 76 65 72 20 74 6f 20 64  rkings over to d
62a0: 65 72 69 76 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  erived..*/.stati
62b0: 63 20 76 6f 69 64 20 74 72 61 6e 73 66 65 72 4a  c void transferJ
62c0: 6f 69 6e 4d 61 72 6b 69 6e 67 73 28 45 78 70 72  oinMarkings(Expr
62d0: 20 2a 70 44 65 72 69 76 65 64 2c 20 45 78 70 72   *pDerived, Expr
62e0: 20 2a 70 42 61 73 65 29 7b 0a 20 20 69 66 28 20   *pBase){.  if( 
62f0: 70 44 65 72 69 76 65 64 20 29 7b 0a 20 20 20 20  pDerived ){.    
6300: 70 44 65 72 69 76 65 64 2d 3e 66 6c 61 67 73 20  pDerived->flags 
6310: 7c 3d 20 70 42 61 73 65 2d 3e 66 6c 61 67 73 20  |= pBase->flags 
6320: 26 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 3b 0a 20  & EP_FromJoin;. 
6330: 20 20 20 70 44 65 72 69 76 65 64 2d 3e 69 52 69     pDerived->iRi
6340: 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 70  ghtJoinTable = p
6350: 42 61 73 65 2d 3e 69 52 69 67 68 74 4a 6f 69 6e  Base->iRightJoin
6360: 54 61 62 6c 65 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  Table;.  }.}../*
6370: 0a 2a 2a 20 4d 61 72 6b 20 74 65 72 6d 20 69 43  .** Mark term iC
6380: 68 69 6c 64 20 61 73 20 62 65 69 6e 67 20 61 20  hild as being a 
6390: 63 68 69 6c 64 20 6f 66 20 74 65 72 6d 20 69 50  child of term iP
63a0: 61 72 65 6e 74 0a 2a 2f 0a 73 74 61 74 69 63 20  arent.*/.static 
63b0: 76 6f 69 64 20 6d 61 72 6b 54 65 72 6d 41 73 43  void markTermAsC
63c0: 68 69 6c 64 28 57 68 65 72 65 43 6c 61 75 73 65  hild(WhereClause
63d0: 20 2a 70 57 43 2c 20 69 6e 74 20 69 43 68 69 6c   *pWC, int iChil
63e0: 64 2c 20 69 6e 74 20 69 50 61 72 65 6e 74 29 7b  d, int iParent){
63f0: 0a 20 20 70 57 43 2d 3e 61 5b 69 43 68 69 6c 64  .  pWC->a[iChild
6400: 5d 2e 69 50 61 72 65 6e 74 20 3d 20 69 50 61 72  ].iParent = iPar
6410: 65 6e 74 3b 0a 20 20 70 57 43 2d 3e 61 5b 69 43  ent;.  pWC->a[iC
6420: 68 69 6c 64 5d 2e 74 72 75 74 68 50 72 6f 62 20  hild].truthProb 
6430: 3d 20 70 57 43 2d 3e 61 5b 69 50 61 72 65 6e 74  = pWC->a[iParent
6440: 5d 2e 74 72 75 74 68 50 72 6f 62 3b 0a 20 20 70  ].truthProb;.  p
6450: 57 43 2d 3e 61 5b 69 50 61 72 65 6e 74 5d 2e 6e  WC->a[iParent].n
6460: 43 68 69 6c 64 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a  Child++;.}../*.*
6470: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 4e 2d 74  * Return the N-t
6480: 68 20 41 4e 44 2d 63 6f 6e 6e 65 63 74 65 64 20  h AND-connected 
6490: 73 75 62 74 65 72 6d 20 6f 66 20 70 54 65 72 6d  subterm of pTerm
64a0: 2e 20 20 4f 72 20 69 66 20 70 54 65 72 6d 20 69  .  Or if pTerm i
64b0: 73 20 6e 6f 74 0a 2a 2a 20 61 20 63 6f 6e 6a 75  s not.** a conju
64c0: 6e 63 74 69 6f 6e 2c 20 74 68 65 6e 20 72 65 74  nction, then ret
64d0: 75 72 6e 20 6a 75 73 74 20 70 54 65 72 6d 20 77  urn just pTerm w
64e0: 68 65 6e 20 4e 3d 3d 30 2e 20 20 49 66 20 4e 20  hen N==0.  If N 
64f0: 69 73 20 65 78 63 65 65 64 73 0a 2a 2a 20 74 68  is exceeds.** th
6500: 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69  e number of avai
6510: 6c 61 62 6c 65 20 73 75 62 74 65 72 6d 73 2c 20  lable subterms, 
6520: 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a  return NULL..*/.
6530: 73 74 61 74 69 63 20 57 68 65 72 65 54 65 72 6d  static WhereTerm
6540: 20 2a 77 68 65 72 65 4e 74 68 53 75 62 74 65 72   *whereNthSubter
6550: 6d 28 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65  m(WhereTerm *pTe
6560: 72 6d 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 69 66  rm, int N){.  if
6570: 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
6580: 6f 72 21 3d 57 4f 5f 41 4e 44 20 29 7b 0a 20 20  or!=WO_AND ){.  
6590: 20 20 72 65 74 75 72 6e 20 4e 3d 3d 30 20 3f 20    return N==0 ? 
65a0: 70 54 65 72 6d 20 3a 20 30 3b 0a 20 20 7d 0a 20  pTerm : 0;.  }. 
65b0: 20 69 66 28 20 4e 3c 70 54 65 72 6d 2d 3e 75 2e   if( N<pTerm->u.
65c0: 70 41 6e 64 49 6e 66 6f 2d 3e 77 63 2e 6e 54 65  pAndInfo->wc.nTe
65d0: 72 6d 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  rm ){.    return
65e0: 20 26 70 54 65 72 6d 2d 3e 75 2e 70 41 6e 64 49   &pTerm->u.pAndI
65f0: 6e 66 6f 2d 3e 77 63 2e 61 5b 4e 5d 3b 0a 20 20  nfo->wc.a[N];.  
6600: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
6610: 0a 2f 2a 0a 2a 2a 20 53 75 62 74 65 72 6d 73 20  ./*.** Subterms 
6620: 70 4f 6e 65 20 61 6e 64 20 70 54 77 6f 20 61 72  pOne and pTwo ar
6630: 65 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68  e contained with
6640: 69 6e 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  in WHERE clause 
6650: 70 57 43 2e 20 20 54 68 65 0a 2a 2a 20 74 77 6f  pWC.  The.** two
6660: 20 73 75 62 74 65 72 6d 73 20 61 72 65 20 69 6e   subterms are in
6670: 20 64 69 73 6a 75 6e 63 74 69 6f 6e 20 2d 20 74   disjunction - t
6680: 68 65 79 20 61 72 65 20 4f 52 2d 65 64 20 74 6f  hey are OR-ed to
6690: 67 65 74 68 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66  gether..**.** If
66a0: 20 74 68 65 73 65 20 74 77 6f 20 74 65 72 6d 73   these two terms
66b0: 20 61 72 65 20 62 6f 74 68 20 6f 66 20 74 68 65   are both of the
66c0: 20 66 6f 72 6d 3a 20 20 22 41 20 6f 70 20 42 22   form:  "A op B"
66d0: 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 0a 2a   with the same.*
66e0: 2a 20 41 20 61 6e 64 20 42 20 76 61 6c 75 65 73  * A and B values
66f0: 20 62 75 74 20 64 69 66 66 65 72 65 6e 74 20 6f   but different o
6700: 70 65 72 61 74 6f 72 73 20 61 6e 64 20 69 66 20  perators and if 
6710: 74 68 65 20 6f 70 65 72 61 74 6f 72 73 20 61 72  the operators ar
6720: 65 0a 2a 2a 20 63 6f 6d 70 61 74 69 62 6c 65 20  e.** compatible 
6730: 28 69 66 20 6f 6e 65 20 69 73 20 3d 20 61 6e 64  (if one is = and
6740: 20 74 68 65 20 6f 74 68 65 72 20 69 73 20 3c 2c   the other is <,
6750: 20 66 6f 72 20 65 78 61 6d 70 6c 65 29 20 74 68   for example) th
6760: 65 6e 0a 2a 2a 20 61 64 64 20 61 20 6e 65 77 20  en.** add a new 
6770: 76 69 72 74 75 61 6c 20 41 4e 44 20 74 65 72 6d  virtual AND term
6780: 20 74 6f 20 70 57 43 20 74 68 61 74 20 69 73 20   to pWC that is 
6790: 74 68 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20  the combination 
67a0: 6f 66 20 74 68 65 0a 2a 2a 20 74 77 6f 2e 0a 2a  of the.** two..*
67b0: 2a 0a 2a 2a 20 53 6f 6d 65 20 65 78 61 6d 70 6c  *.** Some exampl
67c0: 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 78 3c 79  es:.**.**    x<y
67d0: 20 4f 52 20 78 3d 79 20 20 20 20 2d 2d 3e 20 20   OR x=y    -->  
67e0: 20 20 20 78 3c 3d 79 0a 2a 2a 20 20 20 20 78 3d     x<=y.**    x=
67f0: 79 20 4f 52 20 78 3d 79 20 20 20 20 2d 2d 3e 20  y OR x=y    --> 
6800: 20 20 20 20 78 3d 79 0a 2a 2a 20 20 20 20 78 3c      x=y.**    x<
6810: 3d 79 20 4f 52 20 78 3c 79 20 20 20 2d 2d 3e 20  =y OR x<y   --> 
6820: 20 20 20 20 78 3c 3d 79 0a 2a 2a 0a 2a 2a 20 54      x<=y.**.** T
6830: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20  he following is 
6840: 4e 4f 54 20 67 65 6e 65 72 61 74 65 64 3a 0a 2a  NOT generated:.*
6850: 2a 0a 2a 2a 20 20 20 20 78 3c 79 20 4f 52 20 78  *.**    x<y OR x
6860: 3e 79 20 20 20 20 2d 2d 3e 20 20 20 20 20 78 21  >y    -->     x!
6870: 3d 79 20 20 20 20 20 0a 2a 2f 0a 73 74 61 74 69  =y     .*/.stati
6880: 63 20 76 6f 69 64 20 77 68 65 72 65 43 6f 6d 62  c void whereComb
6890: 69 6e 65 44 69 73 6a 75 6e 63 74 73 28 0a 20 20  ineDisjuncts(.  
68a0: 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20  SrcList *pSrc,  
68b0: 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20 46 52         /* the FR
68c0: 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57  OM clause */.  W
68d0: 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c  hereClause *pWC,
68e0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d        /* The com
68f0: 70 6c 65 74 65 20 57 48 45 52 45 20 63 6c 61 75  plete WHERE clau
6900: 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  se */.  WhereTer
6910: 6d 20 2a 70 4f 6e 65 2c 20 20 20 20 20 20 20 2f  m *pOne,       /
6920: 2a 20 46 69 72 73 74 20 64 69 73 6a 75 6e 63 74  * First disjunct
6930: 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
6940: 2a 70 54 77 6f 20 20 20 20 20 20 20 20 2f 2a 20  *pTwo        /* 
6950: 53 65 63 6f 6e 64 20 64 69 73 6a 75 6e 63 74 20  Second disjunct 
6960: 2a 2f 0a 29 7b 0a 20 20 75 31 36 20 65 4f 70 20  */.){.  u16 eOp 
6970: 3d 20 70 4f 6e 65 2d 3e 65 4f 70 65 72 61 74 6f  = pOne->eOperato
6980: 72 20 7c 20 70 54 77 6f 2d 3e 65 4f 70 65 72 61  r | pTwo->eOpera
6990: 74 6f 72 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  tor;.  sqlite3 *
69a0: 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  db;           /*
69b0: 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
69c0: 74 69 6f 6e 20 28 66 6f 72 20 6d 61 6c 6c 6f 63  tion (for malloc
69d0: 29 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4e 65  ) */.  Expr *pNe
69e0: 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  w;            /*
69f0: 20 4e 65 77 20 76 69 72 74 75 61 6c 20 65 78 70   New virtual exp
6a00: 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  ression */.  int
6a10: 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   op;            
6a20: 20 20 20 20 2f 2a 20 4f 70 65 72 61 74 6f 72 20      /* Operator 
6a30: 66 6f 72 20 74 68 65 20 63 6f 6d 62 69 6e 65 64  for the combined
6a40: 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20   expression */. 
6a50: 20 69 6e 74 20 69 64 78 4e 65 77 3b 20 20 20 20   int idxNew;    
6a60: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
6a70: 20 69 6e 20 70 57 43 20 6f 66 20 74 68 65 20 6e   in pWC of the n
6a80: 65 78 74 20 76 69 72 74 75 61 6c 20 74 65 72 6d  ext virtual term
6a90: 20 2a 2f 0a 0a 20 20 69 66 28 20 28 70 4f 6e 65   */..  if( (pOne
6aa0: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57  ->eOperator & (W
6ab0: 4f 5f 45 51 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45  O_EQ|WO_LT|WO_LE
6ac0: 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 29 29 3d 3d  |WO_GT|WO_GE))==
6ad0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
6ae0: 28 20 28 70 54 77 6f 2d 3e 65 4f 70 65 72 61 74  ( (pTwo->eOperat
6af0: 6f 72 20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f 4c  or & (WO_EQ|WO_L
6b00: 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c 57 4f  T|WO_LE|WO_GT|WO
6b10: 5f 47 45 29 29 3d 3d 30 20 29 20 72 65 74 75 72  _GE))==0 ) retur
6b20: 6e 3b 0a 20 20 69 66 28 20 28 65 4f 70 20 26 20  n;.  if( (eOp & 
6b30: 28 57 4f 5f 45 51 7c 57 4f 5f 4c 54 7c 57 4f 5f  (WO_EQ|WO_LT|WO_
6b40: 4c 45 29 29 21 3d 65 4f 70 0a 20 20 20 26 26 20  LE))!=eOp.   && 
6b50: 28 65 4f 70 20 26 20 28 57 4f 5f 45 51 7c 57 4f  (eOp & (WO_EQ|WO
6b60: 5f 47 54 7c 57 4f 5f 47 45 29 29 21 3d 65 4f 70  _GT|WO_GE))!=eOp
6b70: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73   ) return;.  ass
6b80: 65 72 74 28 20 70 4f 6e 65 2d 3e 70 45 78 70 72  ert( pOne->pExpr
6b90: 2d 3e 70 4c 65 66 74 21 3d 30 20 26 26 20 70 4f  ->pLeft!=0 && pO
6ba0: 6e 65 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68  ne->pExpr->pRigh
6bb0: 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  t!=0 );.  assert
6bc0: 28 20 70 54 77 6f 2d 3e 70 45 78 70 72 2d 3e 70  ( pTwo->pExpr->p
6bd0: 4c 65 66 74 21 3d 30 20 26 26 20 70 54 77 6f 2d  Left!=0 && pTwo-
6be0: 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 21 3d  >pExpr->pRight!=
6bf0: 30 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  0 );.  if( sqlit
6c00: 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 4f  e3ExprCompare(pO
6c10: 6e 65 2d 3e 70 45 78 70 72 2d 3e 70 4c 65 66 74  ne->pExpr->pLeft
6c20: 2c 20 70 54 77 6f 2d 3e 70 45 78 70 72 2d 3e 70  , pTwo->pExpr->p
6c30: 4c 65 66 74 2c 20 2d 31 29 20 29 20 72 65 74 75  Left, -1) ) retu
6c40: 72 6e 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  rn;.  if( sqlite
6c50: 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 4f 6e  3ExprCompare(pOn
6c60: 65 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74  e->pExpr->pRight
6c70: 2c 20 70 54 77 6f 2d 3e 70 45 78 70 72 2d 3e 70  , pTwo->pExpr->p
6c80: 52 69 67 68 74 2c 20 2d 31 29 20 29 72 65 74 75  Right, -1) )retu
6c90: 72 6e 3b 0a 20 20 2f 2a 20 49 66 20 77 65 20 72  rn;.  /* If we r
6ca0: 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c  each this point,
6cb0: 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20 74 77   it means the tw
6cc0: 6f 20 73 75 62 74 65 72 6d 73 20 63 61 6e 20 62  o subterms can b
6cd0: 65 20 63 6f 6d 62 69 6e 65 64 20 2a 2f 0a 20 20  e combined */.  
6ce0: 69 66 28 20 28 65 4f 70 20 26 20 28 65 4f 70 2d  if( (eOp & (eOp-
6cf0: 31 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 66  1))!=0 ){.    if
6d00: 28 20 65 4f 70 20 26 20 28 57 4f 5f 4c 54 7c 57  ( eOp & (WO_LT|W
6d10: 4f 5f 4c 45 29 20 29 7b 0a 20 20 20 20 20 20 65  O_LE) ){.      e
6d20: 4f 70 20 3d 20 57 4f 5f 4c 45 3b 0a 20 20 20 20  Op = WO_LE;.    
6d30: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
6d40: 65 72 74 28 20 65 4f 70 20 26 20 28 57 4f 5f 47  ert( eOp & (WO_G
6d50: 54 7c 57 4f 5f 47 45 29 20 29 3b 0a 20 20 20 20  T|WO_GE) );.    
6d60: 20 20 65 4f 70 20 3d 20 57 4f 5f 47 45 3b 0a 20    eOp = WO_GE;. 
6d70: 20 20 20 7d 0a 20 20 7d 0a 20 20 64 62 20 3d 20     }.  }.  db = 
6d80: 70 57 43 2d 3e 70 57 49 6e 66 6f 2d 3e 70 50 61  pWC->pWInfo->pPa
6d90: 72 73 65 2d 3e 64 62 3b 0a 20 20 70 4e 65 77 20  rse->db;.  pNew 
6da0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
6db0: 28 64 62 2c 20 70 4f 6e 65 2d 3e 70 45 78 70 72  (db, pOne->pExpr
6dc0: 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  , 0);.  if( pNew
6dd0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
6de0: 66 6f 72 28 6f 70 3d 54 4b 5f 45 51 3b 20 65 4f  for(op=TK_EQ; eO
6df0: 70 21 3d 28 57 4f 5f 45 51 3c 3c 28 6f 70 2d 54  p!=(WO_EQ<<(op-T
6e00: 4b 5f 45 51 29 29 3b 20 6f 70 2b 2b 29 7b 20 61  K_EQ)); op++){ a
6e10: 73 73 65 72 74 28 20 6f 70 3c 54 4b 5f 47 45 20  ssert( op<TK_GE 
6e20: 29 3b 20 7d 0a 20 20 70 4e 65 77 2d 3e 6f 70 20  ); }.  pNew->op 
6e30: 3d 20 6f 70 3b 0a 20 20 69 64 78 4e 65 77 20 3d  = op;.  idxNew =
6e40: 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65   whereClauseInse
6e50: 72 74 28 70 57 43 2c 20 70 4e 65 77 2c 20 54 45  rt(pWC, pNew, TE
6e60: 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f  RM_VIRTUAL|TERM_
6e70: 44 59 4e 41 4d 49 43 29 3b 0a 20 20 65 78 70 72  DYNAMIC);.  expr
6e80: 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20 70 57  Analyze(pSrc, pW
6e90: 43 2c 20 69 64 78 4e 65 77 29 3b 0a 7d 0a 0a 23  C, idxNew);.}..#
6ea0: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
6eb0: 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d  TE_OMIT_OR_OPTIM
6ec0: 49 5a 41 54 49 4f 4e 29 20 26 26 20 21 64 65 66  IZATION) && !def
6ed0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
6ee0: 5f 53 55 42 51 55 45 52 59 29 0a 2f 2a 0a 2a 2a  _SUBQUERY)./*.**
6ef0: 20 41 6e 61 6c 79 7a 65 20 61 20 74 65 72 6d 20   Analyze a term 
6f00: 74 68 61 74 20 63 6f 6e 73 69 73 74 73 20 6f 66  that consists of
6f10: 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 4f 52 2d   two or more OR-
6f20: 63 6f 6e 6e 65 63 74 65 64 0a 2a 2a 20 73 75 62  connected.** sub
6f30: 74 65 72 6d 73 2e 20 20 53 6f 20 69 6e 3a 0a 2a  terms.  So in:.*
6f40: 2a 0a 2a 2a 20 20 20 20 20 2e 2e 2e 20 57 48 45  *.**     ... WHE
6f50: 52 45 20 20 28 61 3d 35 29 20 41 4e 44 20 28 62  RE  (a=5) AND (b
6f60: 3d 37 20 4f 52 20 63 3d 39 20 4f 52 20 64 3d 31  =7 OR c=9 OR d=1
6f70: 33 29 20 41 4e 44 20 28 64 3d 31 33 29 0a 2a 2a  3) AND (d=13).**
6f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6f90: 20 20 20 20 20 20 20 20 20 20 5e 5e 5e 5e 5e 5e            ^^^^^^
6fa0: 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 0a 2a  ^^^^^^^^^^^^^^.*
6fb0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
6fc0: 65 20 61 6e 61 6c 79 7a 65 73 20 74 65 72 6d 73  e analyzes terms
6fd0: 20 73 75 63 68 20 61 73 20 74 68 65 20 6d 69 64   such as the mid
6fe0: 64 6c 65 20 74 65 72 6d 20 69 6e 20 74 68 65 20  dle term in the 
6ff0: 61 62 6f 76 65 20 65 78 61 6d 70 6c 65 2e 0a 2a  above example..*
7000: 2a 20 41 20 57 68 65 72 65 4f 72 54 65 72 6d 20  * A WhereOrTerm 
7010: 6f 62 6a 65 63 74 20 69 73 20 63 6f 6d 70 75 74  object is comput
7020: 65 64 20 61 6e 64 20 61 74 74 61 63 68 65 64 20  ed and attached 
7030: 74 6f 20 74 68 65 20 74 65 72 6d 20 75 6e 64 65  to the term unde
7040: 72 0a 2a 2a 20 61 6e 61 6c 79 73 69 73 2c 20 72  r.** analysis, r
7050: 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65  egardless of the
7060: 20 6f 75 74 63 6f 6d 65 20 6f 66 20 74 68 65 20   outcome of the 
7070: 61 6e 61 6c 79 73 69 73 2e 20 20 48 65 6e 63 65  analysis.  Hence
7080: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 57 68 65 72  :.**.**     Wher
7090: 65 54 65 72 6d 2e 77 74 46 6c 61 67 73 20 20 20  eTerm.wtFlags   
70a0: 7c 3d 20 20 54 45 52 4d 5f 4f 52 49 4e 46 4f 0a  |=  TERM_ORINFO.
70b0: 2a 2a 20 20 20 20 20 57 68 65 72 65 54 65 72 6d  **     WhereTerm
70c0: 2e 75 2e 70 4f 72 49 6e 66 6f 20 20 3d 20 20 61  .u.pOrInfo  =  a
70d0: 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c   dynamically all
70e0: 6f 63 61 74 65 64 20 57 68 65 72 65 4f 72 54 65  ocated WhereOrTe
70f0: 72 6d 20 6f 62 6a 65 63 74 0a 2a 2a 0a 2a 2a 20  rm object.**.** 
7100: 54 68 65 20 74 65 72 6d 20 62 65 69 6e 67 20 61  The term being a
7110: 6e 61 6c 79 7a 65 64 20 6d 75 73 74 20 68 61 76  nalyzed must hav
7120: 65 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 6f 66  e two or more of
7130: 20 4f 52 2d 63 6f 6e 6e 65 63 74 65 64 20 73 75   OR-connected su
7140: 62 74 65 72 6d 73 2e 0a 2a 2a 20 41 20 73 69 6e  bterms..** A sin
7150: 67 6c 65 20 73 75 62 74 65 72 6d 20 6d 69 67 68  gle subterm migh
7160: 74 20 62 65 20 61 20 73 65 74 20 6f 66 20 41 4e  t be a set of AN
7170: 44 2d 63 6f 6e 6e 65 63 74 65 64 20 73 75 62 2d  D-connected sub-
7180: 73 75 62 74 65 72 6d 73 2e 0a 2a 2a 20 45 78 61  subterms..** Exa
7190: 6d 70 6c 65 73 20 6f 66 20 74 65 72 6d 73 20 75  mples of terms u
71a0: 6e 64 65 72 20 61 6e 61 6c 79 73 69 73 3a 0a 2a  nder analysis:.*
71b0: 2a 0a 2a 2a 20 20 20 20 20 28 41 29 20 20 20 20  *.**     (A)    
71c0: 20 74 31 2e 78 3d 74 32 2e 79 20 4f 52 20 74 31   t1.x=t2.y OR t1
71d0: 2e 78 3d 74 32 2e 7a 20 4f 52 20 74 31 2e 79 3d  .x=t2.z OR t1.y=
71e0: 31 35 20 4f 52 20 74 31 2e 7a 3d 74 33 2e 61 2b  15 OR t1.z=t3.a+
71f0: 35 0a 2a 2a 20 20 20 20 20 28 42 29 20 20 20 20  5.**     (B)    
7200: 20 78 3d 65 78 70 72 31 20 4f 52 20 65 78 70 72   x=expr1 OR expr
7210: 32 3d 78 20 4f 52 20 78 3d 65 78 70 72 33 0a 2a  2=x OR x=expr3.*
7220: 2a 20 20 20 20 20 28 43 29 20 20 20 20 20 74 31  *     (C)     t1
7230: 2e 78 3d 74 32 2e 79 20 4f 52 20 28 74 31 2e 78  .x=t2.y OR (t1.x
7240: 3d 74 32 2e 7a 20 41 4e 44 20 74 31 2e 79 3d 31  =t2.z AND t1.y=1
7250: 35 29 0a 2a 2a 20 20 20 20 20 28 44 29 20 20 20  5).**     (D)   
7260: 20 20 78 3d 65 78 70 72 31 20 4f 52 20 28 79 3e    x=expr1 OR (y>
7270: 31 31 20 41 4e 44 20 79 3c 32 32 20 41 4e 44 20  11 AND y<22 AND 
7280: 7a 20 4c 49 4b 45 20 27 2a 68 65 6c 6c 6f 2a 27  z LIKE '*hello*'
7290: 29 0a 2a 2a 20 20 20 20 20 28 45 29 20 20 20 20  ).**     (E)    
72a0: 20 28 70 2e 61 3d 31 20 41 4e 44 20 71 2e 62 3d   (p.a=1 AND q.b=
72b0: 32 20 41 4e 44 20 72 2e 63 3d 33 29 20 4f 52 20  2 AND r.c=3) OR 
72c0: 28 70 2e 78 3d 34 20 41 4e 44 20 71 2e 79 3d 35  (p.x=4 AND q.y=5
72d0: 20 41 4e 44 20 72 2e 7a 3d 36 29 0a 2a 2a 20 20   AND r.z=6).**  
72e0: 20 20 20 28 46 29 20 20 20 20 20 78 3e 41 20 4f     (F)     x>A O
72f0: 52 20 28 78 3d 41 20 41 4e 44 20 79 3e 3d 42 29  R (x=A AND y>=B)
7300: 0a 2a 2a 0a 2a 2a 20 43 41 53 45 20 31 3a 0a 2a  .**.** CASE 1:.*
7310: 2a 0a 2a 2a 20 49 66 20 61 6c 6c 20 73 75 62 74  *.** If all subt
7320: 65 72 6d 73 20 61 72 65 20 6f 66 20 74 68 65 20  erms are of the 
7330: 66 6f 72 6d 20 54 2e 43 3d 65 78 70 72 20 66 6f  form T.C=expr fo
7340: 72 20 73 6f 6d 65 20 73 69 6e 67 6c 65 20 63 6f  r some single co
7350: 6c 75 6d 6e 20 6f 66 20 43 20 61 6e 64 0a 2a 2a  lumn of C and.**
7360: 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20   a single table 
7370: 54 20 28 61 73 20 73 68 6f 77 6e 20 69 6e 20 65  T (as shown in e
7380: 78 61 6d 70 6c 65 20 42 20 61 62 6f 76 65 29 20  xample B above) 
7390: 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 6e 65  then create a ne
73a0: 77 20 76 69 72 74 75 61 6c 0a 2a 2a 20 74 65 72  w virtual.** ter
73b0: 6d 20 74 68 61 74 20 69 73 20 61 6e 20 65 71 75  m that is an equ
73c0: 69 76 61 6c 65 6e 74 20 49 4e 20 65 78 70 72 65  ivalent IN expre
73d0: 73 73 69 6f 6e 2e 20 20 49 6e 20 6f 74 68 65 72  ssion.  In other
73e0: 20 77 6f 72 64 73 2c 20 69 66 20 74 68 65 20 74   words, if the t
73f0: 65 72 6d 0a 2a 2a 20 62 65 69 6e 67 20 61 6e 61  erm.** being ana
7400: 6c 79 7a 65 64 20 69 73 3a 0a 2a 2a 0a 2a 2a 20  lyzed is:.**.** 
7410: 20 20 20 20 20 78 20 3d 20 65 78 70 72 31 20 20       x = expr1  
7420: 4f 52 20 20 65 78 70 72 32 20 3d 20 78 20 20 4f  OR  expr2 = x  O
7430: 52 20 20 78 20 3d 20 65 78 70 72 33 0a 2a 2a 0a  R  x = expr3.**.
7440: 2a 2a 20 74 68 65 6e 20 63 72 65 61 74 65 20 61  ** then create a
7450: 20 6e 65 77 20 76 69 72 74 75 61 6c 20 74 65 72   new virtual ter
7460: 6d 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a  m like this:.**.
7470: 2a 2a 20 20 20 20 20 20 78 20 49 4e 20 28 65 78  **      x IN (ex
7480: 70 72 31 2c 65 78 70 72 32 2c 65 78 70 72 33 29  pr1,expr2,expr3)
7490: 0a 2a 2a 0a 2a 2a 20 43 41 53 45 20 32 3a 0a 2a  .**.** CASE 2:.*
74a0: 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72  *.** If there ar
74b0: 65 20 65 78 61 63 74 6c 79 20 74 77 6f 20 64 69  e exactly two di
74c0: 73 6a 75 6e 63 74 73 20 6f 6e 65 20 73 69 64 65  sjuncts one side
74d0: 20 68 61 73 20 78 3e 41 20 61 6e 64 20 74 68 65   has x>A and the
74e0: 20 6f 74 68 65 72 20 73 69 64 65 0a 2a 2a 20 68   other side.** h
74f0: 61 73 20 78 3d 41 20 28 66 6f 72 20 74 68 65 20  as x=A (for the 
7500: 73 61 6d 65 20 78 20 61 6e 64 20 41 29 20 74 68  same x and A) th
7510: 65 6e 20 61 64 64 20 61 20 6e 65 77 20 76 69 72  en add a new vir
7520: 74 75 61 6c 20 63 6f 6e 6a 75 6e 63 74 20 74 65  tual conjunct te
7530: 72 6d 20 74 6f 20 74 68 65 0a 2a 2a 20 57 48 45  rm to the.** WHE
7540: 52 45 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  RE clause of the
7550: 20 66 6f 72 6d 20 22 78 3e 3d 41 22 2e 20 20 45   form "x>=A".  E
7560: 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  xample:.**.**   
7570: 20 20 20 78 3e 41 20 4f 52 20 28 78 3d 41 20 41     x>A OR (x=A A
7580: 4e 44 20 79 3e 42 29 20 20 20 20 61 64 64 73 3a  ND y>B)    adds:
7590: 20 20 20 20 78 3e 3d 41 0a 2a 2a 0a 2a 2a 20 54      x>=A.**.** T
75a0: 68 65 20 61 64 64 65 64 20 63 6f 6e 6a 75 6e 63  he added conjunc
75b0: 74 20 63 61 6e 20 73 6f 6d 65 74 69 6d 65 73 20  t can sometimes 
75c0: 62 65 20 68 65 6c 70 66 75 6c 20 69 6e 20 71 75  be helpful in qu
75d0: 65 72 79 20 70 6c 61 6e 6e 69 6e 67 2e 0a 2a 2a  ery planning..**
75e0: 0a 2a 2a 20 43 41 53 45 20 33 3a 0a 2a 2a 0a 2a  .** CASE 3:.**.*
75f0: 2a 20 49 66 20 61 6c 6c 20 73 75 62 74 65 72 6d  * If all subterm
7600: 73 20 61 72 65 20 69 6e 64 65 78 61 62 6c 65 20  s are indexable 
7610: 62 79 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c  by a single tabl
7620: 65 20 54 2c 20 74 68 65 6e 20 73 65 74 0a 2a 2a  e T, then set.**
7630: 0a 2a 2a 20 20 20 20 20 57 68 65 72 65 54 65 72  .**     WhereTer
7640: 6d 2e 65 4f 70 65 72 61 74 6f 72 20 20 20 20 20  m.eOperator     
7650: 20 20 20 20 20 20 20 20 20 3d 20 20 57 4f 5f 4f           =  WO_O
7660: 52 0a 2a 2a 20 20 20 20 20 57 68 65 72 65 54 65  R.**     WhereTe
7670: 72 6d 2e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 69 6e  rm.u.pOrInfo->in
7680: 64 65 78 61 62 6c 65 20 20 7c 3d 20 20 74 68 65  dexable  |=  the
7690: 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66   cursor number f
76a0: 6f 72 20 74 61 62 6c 65 20 54 0a 2a 2a 0a 2a 2a  or table T.**.**
76b0: 20 41 20 73 75 62 74 65 72 6d 20 69 73 20 22 69   A subterm is "i
76c0: 6e 64 65 78 61 62 6c 65 22 20 69 66 20 69 74 20  ndexable" if it 
76d0: 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a 2a  is of the form.*
76e0: 2a 20 22 54 2e 43 20 3c 6f 70 3e 20 3c 65 78 70  * "T.C <op> <exp
76f0: 72 3e 22 20 77 68 65 72 65 20 43 20 69 73 20 61  r>" where C is a
7700: 6e 79 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 61 62  ny column of tab
7710: 6c 65 20 54 20 61 6e 64 20 0a 2a 2a 20 3c 6f 70  le T and .** <op
7720: 3e 20 69 73 20 6f 6e 65 20 6f 66 20 22 3d 22 2c  > is one of "=",
7730: 20 22 3c 22 2c 20 22 3c 3d 22 2c 20 22 3e 22 2c   "<", "<=", ">",
7740: 20 22 3e 3d 22 2c 20 22 49 53 20 4e 55 4c 4c 22   ">=", "IS NULL"
7750: 2c 20 6f 72 20 22 49 4e 22 2e 0a 2a 2a 20 41 20  , or "IN"..** A 
7760: 73 75 62 74 65 72 6d 20 69 73 20 61 6c 73 6f 20  subterm is also 
7770: 69 6e 64 65 78 61 62 6c 65 20 69 66 20 69 74 20  indexable if it 
7780: 69 73 20 61 6e 20 41 4e 44 20 6f 66 20 74 77 6f  is an AND of two
7790: 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 73 75 62 73   or more.** subs
77a0: 75 62 74 65 72 6d 73 20 61 74 20 6c 65 61 73 74  ubterms at least
77b0: 20 6f 6e 65 20 6f 66 20 77 68 69 63 68 20 69 73   one of which is
77c0: 20 69 6e 64 65 78 61 62 6c 65 2e 20 20 49 6e 64   indexable.  Ind
77d0: 65 78 61 62 6c 65 20 41 4e 44 20 0a 2a 2a 20 73  exable AND .** s
77e0: 75 62 74 65 72 6d 73 20 68 61 76 65 20 74 68 65  ubterms have the
77f0: 69 72 20 65 4f 70 65 72 61 74 6f 72 20 73 65 74  ir eOperator set
7800: 20 74 6f 20 57 4f 5f 41 4e 44 20 61 6e 64 20 74   to WO_AND and t
7810: 68 65 79 20 68 61 76 65 0a 2a 2a 20 75 2e 70 41  hey have.** u.pA
7820: 6e 64 49 6e 66 6f 20 73 65 74 20 74 6f 20 61 20  ndInfo set to a 
7830: 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f  dynamically allo
7840: 63 61 74 65 64 20 57 68 65 72 65 41 6e 64 54 65  cated WhereAndTe
7850: 72 6d 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a  rm object..**.**
7860: 20 46 72 6f 6d 20 61 6e 6f 74 68 65 72 20 70 6f   From another po
7870: 69 6e 74 20 6f 66 20 76 69 65 77 2c 20 22 69 6e  int of view, "in
7880: 64 65 78 61 62 6c 65 22 20 6d 65 61 6e 73 20 74  dexable" means t
7890: 68 61 74 20 74 68 65 20 73 75 62 74 65 72 6d 20  hat the subterm 
78a0: 63 6f 75 6c 64 0a 2a 2a 20 70 6f 74 65 6e 74 69  could.** potenti
78b0: 61 6c 6c 79 20 62 65 20 75 73 65 64 20 77 69 74  ally be used wit
78c0: 68 20 61 6e 20 69 6e 64 65 78 20 69 66 20 61 6e  h an index if an
78d0: 20 61 70 70 72 6f 70 72 69 61 74 65 20 69 6e 64   appropriate ind
78e0: 65 78 20 65 78 69 73 74 73 2e 0a 2a 2a 20 54 68  ex exists..** Th
78f0: 69 73 20 61 6e 61 6c 79 73 69 73 20 64 6f 65 73  is analysis does
7900: 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72 20 77 68   not consider wh
7910: 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65  ether or not the
7920: 20 69 6e 64 65 78 20 65 78 69 73 74 73 3b 20 74   index exists; t
7930: 68 61 74 0a 2a 2a 20 69 73 20 64 65 63 69 64 65  hat.** is decide
7940: 64 20 65 6c 73 65 77 68 65 72 65 2e 20 20 54 68  d elsewhere.  Th
7950: 69 73 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79  is analysis only
7960: 20 6c 6f 6f 6b 73 20 61 74 20 77 68 65 74 68 65   looks at whethe
7970: 72 20 73 75 62 74 65 72 6d 73 0a 2a 2a 20 61 70  r subterms.** ap
7980: 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 69 6e  propriate for in
7990: 64 65 78 69 6e 67 20 65 78 69 73 74 2e 0a 2a 2a  dexing exist..**
79a0: 0a 2a 2a 20 41 6c 6c 20 65 78 61 6d 70 6c 65 73  .** All examples
79b0: 20 41 20 74 68 72 6f 75 67 68 20 45 20 61 62 6f   A through E abo
79c0: 76 65 20 73 61 74 69 73 66 79 20 63 61 73 65 20  ve satisfy case 
79d0: 32 2e 20 20 42 75 74 20 69 66 20 61 20 74 65 72  2.  But if a ter
79e0: 6d 0a 2a 2a 20 61 6c 73 6f 20 73 61 74 69 73 66  m.** also satisf
79f0: 69 65 73 20 63 61 73 65 20 31 20 28 73 75 63 68  ies case 1 (such
7a00: 20 61 73 20 42 29 20 77 65 20 6b 6e 6f 77 20 74   as B) we know t
7a10: 68 61 74 20 74 68 65 20 6f 70 74 69 6d 69 7a 65  hat the optimize
7a20: 72 20 77 69 6c 6c 0a 2a 2a 20 61 6c 77 61 79 73  r will.** always
7a30: 20 70 72 65 66 65 72 20 63 61 73 65 20 31 2c 20   prefer case 1, 
7a40: 73 6f 20 69 6e 20 74 68 61 74 20 63 61 73 65 20  so in that case 
7a50: 77 65 20 70 72 65 74 65 6e 64 20 74 68 61 74 20  we pretend that 
7a60: 63 61 73 65 20 32 20 69 73 20 6e 6f 74 0a 2a 2a  case 2 is not.**
7a70: 20 73 61 74 69 73 66 69 65 64 2e 0a 2a 2a 0a 2a   satisfied..**.*
7a80: 2a 20 49 74 20 6d 69 67 68 74 20 62 65 20 74 68  * It might be th
7a90: 65 20 63 61 73 65 20 74 68 61 74 20 6d 75 6c 74  e case that mult
7aa0: 69 70 6c 65 20 74 61 62 6c 65 73 20 61 72 65 20  iple tables are 
7ab0: 69 6e 64 65 78 61 62 6c 65 2e 20 20 46 6f 72 20  indexable.  For 
7ac0: 65 78 61 6d 70 6c 65 2c 0a 2a 2a 20 28 45 29 20  example,.** (E) 
7ad0: 61 62 6f 76 65 20 69 73 20 69 6e 64 65 78 61 62  above is indexab
7ae0: 6c 65 20 6f 6e 20 74 61 62 6c 65 73 20 50 2c 20  le on tables P, 
7af0: 51 2c 20 61 6e 64 20 52 2e 0a 2a 2a 0a 2a 2a 20  Q, and R..**.** 
7b00: 54 65 72 6d 73 20 74 68 61 74 20 73 61 74 69 73  Terms that satis
7b10: 66 79 20 63 61 73 65 20 32 20 61 72 65 20 63 61  fy case 2 are ca
7b20: 6e 64 69 64 61 74 65 73 20 66 6f 72 20 6c 6f 6f  ndidates for loo
7b30: 6b 75 70 20 62 79 20 75 73 69 6e 67 0a 2a 2a 20  kup by using.** 
7b40: 73 65 70 61 72 61 74 65 20 69 6e 64 69 63 65 73  separate indices
7b50: 20 74 6f 20 66 69 6e 64 20 72 6f 77 69 64 73 20   to find rowids 
7b60: 66 6f 72 20 65 61 63 68 20 73 75 62 74 65 72 6d  for each subterm
7b70: 20 61 6e 64 20 63 6f 6d 70 6f 73 69 6e 67 0a 2a   and composing.*
7b80: 2a 20 74 68 65 20 75 6e 69 6f 6e 20 6f 66 20 61  * the union of a
7b90: 6c 6c 20 72 6f 77 69 64 73 20 75 73 69 6e 67 20  ll rowids using 
7ba0: 61 20 52 6f 77 53 65 74 20 6f 62 6a 65 63 74 2e  a RowSet object.
7bb0: 20 20 54 68 69 73 20 69 73 20 73 69 6d 69 6c 61    This is simila
7bc0: 72 0a 2a 2a 20 74 6f 20 22 62 69 74 6d 61 70 20  r.** to "bitmap 
7bd0: 69 6e 64 69 63 65 73 22 20 69 6e 20 6f 74 68 65  indices" in othe
7be0: 72 20 64 61 74 61 62 61 73 65 20 65 6e 67 69 6e  r database engin
7bf0: 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 54 48 45 52 57  es..**.** OTHERW
7c00: 49 53 45 3a 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 65  ISE:.**.** If ne
7c10: 69 74 68 65 72 20 63 61 73 65 20 31 20 6e 6f 72  ither case 1 nor
7c20: 20 63 61 73 65 20 32 20 61 70 70 6c 79 2c 20 74   case 2 apply, t
7c30: 68 65 6e 20 6c 65 61 76 65 20 74 68 65 20 65 4f  hen leave the eO
7c40: 70 65 72 61 74 6f 72 20 73 65 74 20 74 6f 0a 2a  perator set to.*
7c50: 2a 20 7a 65 72 6f 2e 20 20 54 68 69 73 20 74 65  * zero.  This te
7c60: 72 6d 20 69 73 20 6e 6f 74 20 75 73 65 66 75 6c  rm is not useful
7c70: 20 66 6f 72 20 73 65 61 72 63 68 2e 0a 2a 2f 0a   for search..*/.
7c80: 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 72  static void expr
7c90: 41 6e 61 6c 79 7a 65 4f 72 54 65 72 6d 28 0a 20  AnalyzeOrTerm(. 
7ca0: 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20   SrcList *pSrc, 
7cb0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68             /* th
7cc0: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f  e FROM clause */
7cd0: 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
7ce0: 70 57 43 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  pWC,         /* 
7cf0: 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 57 48 45  the complete WHE
7d00: 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69  RE clause */.  i
7d10: 6e 74 20 69 64 78 54 65 72 6d 20 20 20 20 20 20  nt idxTerm      
7d20: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
7d30: 78 20 6f 66 20 74 68 65 20 4f 52 2d 74 65 72 6d  x of the OR-term
7d40: 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 20   to be analyzed 
7d50: 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 49 6e 66  */.){.  WhereInf
7d60: 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70 57 43 2d  o *pWInfo = pWC-
7d70: 3e 70 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20  >pWInfo;        
7d80: 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  /* WHERE clause 
7d90: 70 72 6f 63 65 73 73 69 6e 67 20 63 6f 6e 74 65  processing conte
7da0: 78 74 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70  xt */.  Parse *p
7db0: 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e  Parse = pWInfo->
7dc0: 70 50 61 72 73 65 3b 20 20 20 20 20 20 20 20 20  pParse;         
7dd0: 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78  /* Parser contex
7de0: 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  t */.  sqlite3 *
7df0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
7e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7e10: 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
7e20: 63 74 69 6f 6e 20 2a 2f 0a 20 20 57 68 65 72 65  ction */.  Where
7e30: 54 65 72 6d 20 2a 70 54 65 72 6d 20 3d 20 26 70  Term *pTerm = &p
7e40: 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 20  WC->a[idxTerm]; 
7e50: 20 20 20 2f 2a 20 54 68 65 20 74 65 72 6d 20 74     /* The term t
7e60: 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f  o be analyzed */
7e70: 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d  .  Expr *pExpr =
7e80: 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 20 20   pTerm->pExpr;  
7e90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
7ea0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 66 20  e expression of 
7eb0: 74 68 65 20 74 65 72 6d 20 2a 2f 0a 20 20 69 6e  the term */.  in
7ec0: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
7ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ee0: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
7ef0: 75 6e 74 65 72 73 20 2a 2f 0a 20 20 57 68 65 72  unters */.  Wher
7f00: 65 43 6c 61 75 73 65 20 2a 70 4f 72 57 63 3b 20  eClause *pOrWc; 
7f10: 20 20 20 20 20 20 2f 2a 20 42 72 65 61 6b 75 70        /* Breakup
7f20: 20 6f 66 20 70 54 65 72 6d 20 69 6e 74 6f 20 73   of pTerm into s
7f30: 75 62 74 65 72 6d 73 20 2a 2f 0a 20 20 57 68 65  ubterms */.  Whe
7f40: 72 65 54 65 72 6d 20 2a 70 4f 72 54 65 72 6d 3b  reTerm *pOrTerm;
7f50: 20 20 20 20 20 20 20 2f 2a 20 41 20 53 75 62 2d         /* A Sub-
7f60: 74 65 72 6d 20 77 69 74 68 69 6e 20 74 68 65 20  term within the 
7f70: 70 4f 72 57 63 20 2a 2f 0a 20 20 57 68 65 72 65  pOrWc */.  Where
7f80: 4f 72 49 6e 66 6f 20 2a 70 4f 72 49 6e 66 6f 3b  OrInfo *pOrInfo;
7f90: 20 20 20 20 20 2f 2a 20 41 64 64 69 74 69 6f 6e       /* Addition
7fa0: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  al information a
7fb0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70  ssociated with p
7fc0: 54 65 72 6d 20 2a 2f 0a 20 20 42 69 74 6d 61 73  Term */.  Bitmas
7fd0: 6b 20 63 68 6e 67 54 6f 49 4e 3b 20 20 20 20 20  k chngToIN;     
7fe0: 20 20 20 20 2f 2a 20 54 61 62 6c 65 73 20 74 68      /* Tables th
7ff0: 61 74 20 6d 69 67 68 74 20 73 61 74 69 73 66 79  at might satisfy
8000: 20 63 61 73 65 20 31 20 2a 2f 0a 20 20 42 69 74   case 1 */.  Bit
8010: 6d 61 73 6b 20 69 6e 64 65 78 61 62 6c 65 3b 20  mask indexable; 
8020: 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 73         /* Tables
8030: 20 74 68 61 74 20 61 72 65 20 69 6e 64 65 78 61   that are indexa
8040: 62 6c 65 2c 20 73 61 74 69 73 66 79 69 6e 67 20  ble, satisfying 
8050: 63 61 73 65 20 32 20 2a 2f 0a 0a 20 20 2f 2a 0a  case 2 */..  /*.
8060: 20 20 2a 2a 20 42 72 65 61 6b 20 74 68 65 20 4f    ** Break the O
8070: 52 20 63 6c 61 75 73 65 20 69 6e 74 6f 20 69 74  R clause into it
8080: 73 20 73 65 70 61 72 61 74 65 20 73 75 62 74 65  s separate subte
8090: 72 6d 73 2e 20 20 54 68 65 20 73 75 62 74 65 72  rms.  The subter
80a0: 6d 73 20 61 72 65 0a 20 20 2a 2a 20 73 74 6f 72  ms are.  ** stor
80b0: 65 64 20 69 6e 20 61 20 57 68 65 72 65 43 6c 61  ed in a WhereCla
80c0: 75 73 65 20 73 74 72 75 63 74 75 72 65 20 63 6f  use structure co
80d0: 6e 74 61 69 6e 69 6e 67 20 77 69 74 68 69 6e 20  ntaining within 
80e0: 74 68 65 20 57 68 65 72 65 4f 72 49 6e 66 6f 0a  the WhereOrInfo.
80f0: 20 20 2a 2a 20 6f 62 6a 65 63 74 20 74 68 61 74    ** object that
8100: 20 69 73 20 61 74 74 61 63 68 65 64 20 74 6f 20   is attached to 
8110: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 4f 52 20  the original OR 
8120: 63 6c 61 75 73 65 20 74 65 72 6d 2e 0a 20 20 2a  clause term..  *
8130: 2f 0a 20 20 61 73 73 65 72 74 28 20 28 70 54 65  /.  assert( (pTe
8140: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54  rm->wtFlags & (T
8150: 45 52 4d 5f 44 59 4e 41 4d 49 43 7c 54 45 52 4d  ERM_DYNAMIC|TERM
8160: 5f 4f 52 49 4e 46 4f 7c 54 45 52 4d 5f 41 4e 44  _ORINFO|TERM_AND
8170: 49 4e 46 4f 29 29 3d 3d 30 20 29 3b 0a 20 20 61  INFO))==0 );.  a
8180: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
8190: 3d 3d 54 4b 5f 4f 52 20 29 3b 0a 20 20 70 54 65  ==TK_OR );.  pTe
81a0: 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 20 3d 20  rm->u.pOrInfo = 
81b0: 70 4f 72 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65  pOrInfo = sqlite
81c0: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
81d0: 2c 20 73 69 7a 65 6f 66 28 2a 70 4f 72 49 6e 66  , sizeof(*pOrInf
81e0: 6f 29 29 3b 0a 20 20 69 66 28 20 70 4f 72 49 6e  o));.  if( pOrIn
81f0: 66 6f 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  fo==0 ) return;.
8200: 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73    pTerm->wtFlags
8210: 20 7c 3d 20 54 45 52 4d 5f 4f 52 49 4e 46 4f 3b   |= TERM_ORINFO;
8220: 0a 20 20 70 4f 72 57 63 20 3d 20 26 70 4f 72 49  .  pOrWc = &pOrI
8230: 6e 66 6f 2d 3e 77 63 3b 0a 20 20 77 68 65 72 65  nfo->wc;.  where
8240: 43 6c 61 75 73 65 49 6e 69 74 28 70 4f 72 57 63  ClauseInit(pOrWc
8250: 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 77 68 65  , pWInfo);.  whe
8260: 72 65 53 70 6c 69 74 28 70 4f 72 57 63 2c 20 70  reSplit(pOrWc, p
8270: 45 78 70 72 2c 20 54 4b 5f 4f 52 29 3b 0a 20 20  Expr, TK_OR);.  
8280: 65 78 70 72 41 6e 61 6c 79 7a 65 41 6c 6c 28 70  exprAnalyzeAll(p
8290: 53 72 63 2c 20 70 4f 72 57 63 29 3b 0a 20 20 69  Src, pOrWc);.  i
82a0: 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
82b0: 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  led ) return;.  
82c0: 61 73 73 65 72 74 28 20 70 4f 72 57 63 2d 3e 6e  assert( pOrWc->n
82d0: 54 65 72 6d 3e 3d 32 20 29 3b 0a 0a 20 20 2f 2a  Term>=2 );..  /*
82e0: 0a 20 20 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68  .  ** Compute th
82f0: 65 20 73 65 74 20 6f 66 20 74 61 62 6c 65 73 20  e set of tables 
8300: 74 68 61 74 20 6d 69 67 68 74 20 73 61 74 69 73  that might satis
8310: 66 79 20 63 61 73 65 73 20 31 20 6f 72 20 32 2e  fy cases 1 or 2.
8320: 0a 20 20 2a 2f 0a 20 20 69 6e 64 65 78 61 62 6c  .  */.  indexabl
8330: 65 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b  e = ~(Bitmask)0;
8340: 0a 20 20 63 68 6e 67 54 6f 49 4e 20 3d 20 7e 28  .  chngToIN = ~(
8350: 42 69 74 6d 61 73 6b 29 30 3b 0a 20 20 66 6f 72  Bitmask)0;.  for
8360: 28 69 3d 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d  (i=pOrWc->nTerm-
8370: 31 2c 20 70 4f 72 54 65 72 6d 3d 70 4f 72 57 63  1, pOrTerm=pOrWc
8380: 2d 3e 61 3b 20 69 3e 3d 30 20 26 26 20 69 6e 64  ->a; i>=0 && ind
8390: 65 78 61 62 6c 65 3b 20 69 2d 2d 2c 20 70 4f 72  exable; i--, pOr
83a0: 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28  Term++){.    if(
83b0: 20 28 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72   (pOrTerm->eOper
83c0: 61 74 6f 72 20 26 20 57 4f 5f 53 49 4e 47 4c 45  ator & WO_SINGLE
83d0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 57 68  )==0 ){.      Wh
83e0: 65 72 65 41 6e 64 49 6e 66 6f 20 2a 70 41 6e 64  ereAndInfo *pAnd
83f0: 49 6e 66 6f 3b 0a 20 20 20 20 20 20 61 73 73 65  Info;.      asse
8400: 72 74 28 20 28 70 4f 72 54 65 72 6d 2d 3e 77 74  rt( (pOrTerm->wt
8410: 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 41 4e  Flags & (TERM_AN
8420: 44 49 4e 46 4f 7c 54 45 52 4d 5f 4f 52 49 4e 46  DINFO|TERM_ORINF
8430: 4f 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  O))==0 );.      
8440: 63 68 6e 67 54 6f 49 4e 20 3d 20 30 3b 0a 20 20  chngToIN = 0;.  
8450: 20 20 20 20 70 41 6e 64 49 6e 66 6f 20 3d 20 73      pAndInfo = s
8460: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
8470: 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 41  w(db, sizeof(*pA
8480: 6e 64 49 6e 66 6f 29 29 3b 0a 20 20 20 20 20 20  ndInfo));.      
8490: 69 66 28 20 70 41 6e 64 49 6e 66 6f 20 29 7b 0a  if( pAndInfo ){.
84a0: 20 20 20 20 20 20 20 20 57 68 65 72 65 43 6c 61          WhereCla
84b0: 75 73 65 20 2a 70 41 6e 64 57 43 3b 0a 20 20 20  use *pAndWC;.   
84c0: 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a       WhereTerm *
84d0: 70 41 6e 64 54 65 72 6d 3b 0a 20 20 20 20 20 20  pAndTerm;.      
84e0: 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20    int j;.       
84f0: 20 42 69 74 6d 61 73 6b 20 62 20 3d 20 30 3b 0a   Bitmask b = 0;.
8500: 20 20 20 20 20 20 20 20 70 4f 72 54 65 72 6d 2d          pOrTerm-
8510: 3e 75 2e 70 41 6e 64 49 6e 66 6f 20 3d 20 70 41  >u.pAndInfo = pA
8520: 6e 64 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20  ndInfo;.        
8530: 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  pOrTerm->wtFlags
8540: 20 7c 3d 20 54 45 52 4d 5f 41 4e 44 49 4e 46 4f   |= TERM_ANDINFO
8550: 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 54 65 72  ;.        pOrTer
8560: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 57  m->eOperator = W
8570: 4f 5f 41 4e 44 3b 0a 20 20 20 20 20 20 20 20 70  O_AND;.        p
8580: 41 6e 64 57 43 20 3d 20 26 70 41 6e 64 49 6e 66  AndWC = &pAndInf
8590: 6f 2d 3e 77 63 3b 0a 20 20 20 20 20 20 20 20 77  o->wc;.        w
85a0: 68 65 72 65 43 6c 61 75 73 65 49 6e 69 74 28 70  hereClauseInit(p
85b0: 41 6e 64 57 43 2c 20 70 57 43 2d 3e 70 57 49 6e  AndWC, pWC->pWIn
85c0: 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 77 68 65  fo);.        whe
85d0: 72 65 53 70 6c 69 74 28 70 41 6e 64 57 43 2c 20  reSplit(pAndWC, 
85e0: 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20  pOrTerm->pExpr, 
85f0: 54 4b 5f 41 4e 44 29 3b 0a 20 20 20 20 20 20 20  TK_AND);.       
8600: 20 65 78 70 72 41 6e 61 6c 79 7a 65 41 6c 6c 28   exprAnalyzeAll(
8610: 70 53 72 63 2c 20 70 41 6e 64 57 43 29 3b 0a 20  pSrc, pAndWC);. 
8620: 20 20 20 20 20 20 20 70 41 6e 64 57 43 2d 3e 70         pAndWC->p
8630: 4f 75 74 65 72 20 3d 20 70 57 43 3b 0a 20 20 20  Outer = pWC;.   
8640: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 64       testcase( d
8650: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
8660: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  );.        if( !
8670: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
8680: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6f   ){.          fo
8690: 72 28 6a 3d 30 2c 20 70 41 6e 64 54 65 72 6d 3d  r(j=0, pAndTerm=
86a0: 70 41 6e 64 57 43 2d 3e 61 3b 20 6a 3c 70 41 6e  pAndWC->a; j<pAn
86b0: 64 57 43 2d 3e 6e 54 65 72 6d 3b 20 6a 2b 2b 2c  dWC->nTerm; j++,
86c0: 20 70 41 6e 64 54 65 72 6d 2b 2b 29 7b 0a 20 20   pAndTerm++){.  
86d0: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
86e0: 28 20 70 41 6e 64 54 65 72 6d 2d 3e 70 45 78 70  ( pAndTerm->pExp
86f0: 72 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  r );.           
8700: 20 69 66 28 20 61 6c 6c 6f 77 65 64 4f 70 28 70   if( allowedOp(p
8710: 41 6e 64 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e  AndTerm->pExpr->
8720: 6f 70 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  op) ){.         
8730: 20 20 20 20 20 62 20 7c 3d 20 67 65 74 4d 61 73       b |= getMas
8740: 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b  k(&pWInfo->sMask
8750: 53 65 74 2c 20 70 41 6e 64 54 65 72 6d 2d 3e 6c  Set, pAndTerm->l
8760: 65 66 74 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  eftCursor);.    
8770: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
8780: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
8790: 20 20 20 20 20 20 20 20 69 6e 64 65 78 61 62 6c          indexabl
87a0: 65 20 26 3d 20 62 3b 0a 20 20 20 20 20 20 7d 0a  e &= b;.      }.
87b0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f      }else if( pO
87c0: 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  rTerm->wtFlags &
87d0: 20 54 45 52 4d 5f 43 4f 50 49 45 44 20 29 7b 0a   TERM_COPIED ){.
87e0: 20 20 20 20 20 20 2f 2a 20 53 6b 69 70 20 74 68        /* Skip th
87f0: 69 73 20 74 65 72 6d 20 66 6f 72 20 6e 6f 77 2e  is term for now.
8800: 20 20 57 65 20 72 65 76 69 73 69 74 20 69 74 20    We revisit it 
8810: 77 68 65 6e 20 77 65 20 70 72 6f 63 65 73 73 20  when we process 
8820: 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f 72  the.      ** cor
8830: 72 65 73 70 6f 6e 64 69 6e 67 20 54 45 52 4d 5f  responding TERM_
8840: 56 49 52 54 55 41 4c 20 74 65 72 6d 20 2a 2f 0a  VIRTUAL term */.
8850: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
8860: 20 42 69 74 6d 61 73 6b 20 62 3b 0a 20 20 20 20   Bitmask b;.    
8870: 20 20 62 20 3d 20 67 65 74 4d 61 73 6b 28 26 70    b = getMask(&p
8880: 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c  WInfo->sMaskSet,
8890: 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75   pOrTerm->leftCu
88a0: 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 69 66 28  rsor);.      if(
88b0: 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67   pOrTerm->wtFlag
88c0: 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  s & TERM_VIRTUAL
88d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 57 68 65 72   ){.        Wher
88e0: 65 54 65 72 6d 20 2a 70 4f 74 68 65 72 20 3d 20  eTerm *pOther = 
88f0: 26 70 4f 72 57 63 2d 3e 61 5b 70 4f 72 54 65 72  &pOrWc->a[pOrTer
8900: 6d 2d 3e 69 50 61 72 65 6e 74 5d 3b 0a 20 20 20  m->iParent];.   
8910: 20 20 20 20 20 62 20 7c 3d 20 67 65 74 4d 61 73       b |= getMas
8920: 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b  k(&pWInfo->sMask
8930: 53 65 74 2c 20 70 4f 74 68 65 72 2d 3e 6c 65 66  Set, pOther->lef
8940: 74 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20  tCursor);.      
8950: 7d 0a 20 20 20 20 20 20 69 6e 64 65 78 61 62 6c  }.      indexabl
8960: 65 20 26 3d 20 62 3b 0a 20 20 20 20 20 20 69 66  e &= b;.      if
8970: 28 20 28 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65  ( (pOrTerm->eOpe
8980: 72 61 74 6f 72 20 26 20 57 4f 5f 45 51 29 3d 3d  rator & WO_EQ)==
8990: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 6e  0 ){.        chn
89a0: 67 54 6f 49 4e 20 3d 20 30 3b 0a 20 20 20 20 20  gToIN = 0;.     
89b0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
89c0: 63 68 6e 67 54 6f 49 4e 20 26 3d 20 62 3b 0a 20  chngToIN &= b;. 
89d0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
89e0: 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 52 65 63 6f  ..  /*.  ** Reco
89f0: 72 64 20 74 68 65 20 73 65 74 20 6f 66 20 74 61  rd the set of ta
8a00: 62 6c 65 73 20 74 68 61 74 20 73 61 74 69 73 66  bles that satisf
8a10: 79 20 63 61 73 65 20 33 2e 20 20 54 68 65 20 73  y case 3.  The s
8a20: 65 74 20 6d 69 67 68 74 20 62 65 0a 20 20 2a 2a  et might be.  **
8a30: 20 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20 20 70   empty..  */.  p
8a40: 4f 72 49 6e 66 6f 2d 3e 69 6e 64 65 78 61 62 6c  OrInfo->indexabl
8a50: 65 20 3d 20 69 6e 64 65 78 61 62 6c 65 3b 0a 20  e = indexable;. 
8a60: 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
8a70: 72 20 3d 20 69 6e 64 65 78 61 62 6c 65 3d 3d 30  r = indexable==0
8a80: 20 3f 20 30 20 3a 20 57 4f 5f 4f 52 3b 0a 0a 20   ? 0 : WO_OR;.. 
8a90: 20 2f 2a 20 46 6f 72 20 61 20 74 77 6f 2d 77 61   /* For a two-wa
8aa0: 79 20 4f 52 2c 20 61 74 74 65 6d 70 74 20 74 6f  y OR, attempt to
8ab0: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
8ac0: 63 61 73 65 20 32 2e 0a 20 20 2a 2f 0a 20 20 69  case 2..  */.  i
8ad0: 66 28 20 69 6e 64 65 78 61 62 6c 65 20 26 26 20  f( indexable && 
8ae0: 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 3d 3d 32 20  pOrWc->nTerm==2 
8af0: 29 7b 0a 20 20 20 20 69 6e 74 20 69 4f 6e 65 20  ){.    int iOne 
8b00: 3d 20 30 3b 0a 20 20 20 20 57 68 65 72 65 54 65  = 0;.    WhereTe
8b10: 72 6d 20 2a 70 4f 6e 65 3b 0a 20 20 20 20 77 68  rm *pOne;.    wh
8b20: 69 6c 65 28 20 28 70 4f 6e 65 20 3d 20 77 68 65  ile( (pOne = whe
8b30: 72 65 4e 74 68 53 75 62 74 65 72 6d 28 26 70 4f  reNthSubterm(&pO
8b40: 72 57 63 2d 3e 61 5b 30 5d 2c 69 4f 6e 65 2b 2b  rWc->a[0],iOne++
8b50: 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ))!=0 ){.      i
8b60: 6e 74 20 69 54 77 6f 20 3d 20 30 3b 0a 20 20 20  nt iTwo = 0;.   
8b70: 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54     WhereTerm *pT
8b80: 77 6f 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  wo;.      while(
8b90: 20 28 70 54 77 6f 20 3d 20 77 68 65 72 65 4e 74   (pTwo = whereNt
8ba0: 68 53 75 62 74 65 72 6d 28 26 70 4f 72 57 63 2d  hSubterm(&pOrWc-
8bb0: 3e 61 5b 31 5d 2c 69 54 77 6f 2b 2b 29 29 21 3d  >a[1],iTwo++))!=
8bc0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68 65  0 ){.        whe
8bd0: 72 65 43 6f 6d 62 69 6e 65 44 69 73 6a 75 6e 63  reCombineDisjunc
8be0: 74 73 28 70 53 72 63 2c 20 70 57 43 2c 20 70 4f  ts(pSrc, pWC, pO
8bf0: 6e 65 2c 20 70 54 77 6f 29 3b 0a 20 20 20 20 20  ne, pTwo);.     
8c00: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
8c10: 2f 2a 0a 20 20 2a 2a 20 63 68 6e 67 54 6f 49 4e  /*.  ** chngToIN
8c20: 20 68 6f 6c 64 73 20 61 20 73 65 74 20 6f 66 20   holds a set of 
8c30: 74 61 62 6c 65 73 20 74 68 61 74 20 2a 6d 69 67  tables that *mig
8c40: 68 74 2a 20 73 61 74 69 73 66 79 20 63 61 73 65  ht* satisfy case
8c50: 20 31 2e 20 20 42 75 74 0a 20 20 2a 2a 20 77 65   1.  But.  ** we
8c60: 20 68 61 76 65 20 74 6f 20 64 6f 20 73 6f 6d 65   have to do some
8c70: 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 68 65 63   additional chec
8c80: 6b 69 6e 67 20 74 6f 20 73 65 65 20 69 66 20 63  king to see if c
8c90: 61 73 65 20 31 20 72 65 61 6c 6c 79 0a 20 20 2a  ase 1 really.  *
8ca0: 2a 20 69 73 20 73 61 74 69 73 66 69 65 64 2e 0a  * is satisfied..
8cb0: 20 20 2a 2a 0a 20 20 2a 2a 20 63 68 6e 67 54 6f    **.  ** chngTo
8cc0: 49 4e 20 77 69 6c 6c 20 68 6f 6c 64 20 65 69 74  IN will hold eit
8cd0: 68 65 72 20 30 2c 20 31 2c 20 6f 72 20 32 20 62  her 0, 1, or 2 b
8ce0: 69 74 73 2e 20 20 54 68 65 20 30 2d 62 69 74 20  its.  The 0-bit 
8cf0: 63 61 73 65 20 6d 65 61 6e 73 0a 20 20 2a 2a 20  case means.  ** 
8d00: 74 68 61 74 20 74 68 65 72 65 20 69 73 20 6e 6f  that there is no
8d10: 20 70 6f 73 73 69 62 69 6c 69 74 79 20 6f 66 20   possibility of 
8d20: 74 72 61 6e 73 66 6f 72 6d 69 6e 67 20 74 68 65  transforming the
8d30: 20 4f 52 20 63 6c 61 75 73 65 20 69 6e 74 6f 20   OR clause into 
8d40: 61 6e 0a 20 20 2a 2a 20 49 4e 20 6f 70 65 72 61  an.  ** IN opera
8d50: 74 6f 72 20 62 65 63 61 75 73 65 20 6f 6e 65 20  tor because one 
8d60: 6f 72 20 6d 6f 72 65 20 74 65 72 6d 73 20 69 6e  or more terms in
8d70: 20 74 68 65 20 4f 52 20 63 6c 61 75 73 65 20 63   the OR clause c
8d80: 6f 6e 74 61 69 6e 0a 20 20 2a 2a 20 73 6f 6d 65  ontain.  ** some
8d90: 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e  thing other than
8da0: 20 3d 3d 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20   == on a column 
8db0: 69 6e 20 74 68 65 20 73 69 6e 67 6c 65 20 74 61  in the single ta
8dc0: 62 6c 65 2e 20 20 54 68 65 20 31 2d 62 69 74 0a  ble.  The 1-bit.
8dd0: 20 20 2a 2a 20 63 61 73 65 20 6d 65 61 6e 73 20    ** case means 
8de0: 74 68 61 74 20 65 76 65 72 79 20 74 65 72 6d 20  that every term 
8df0: 6f 66 20 74 68 65 20 4f 52 20 63 6c 61 75 73 65  of the OR clause
8e00: 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a   is of the form.
8e10: 20 20 2a 2a 20 22 74 61 62 6c 65 2e 63 6f 6c 75    ** "table.colu
8e20: 6d 6e 3d 65 78 70 72 22 20 66 6f 72 20 73 6f 6d  mn=expr" for som
8e30: 65 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 2e 20  e single table. 
8e40: 20 54 68 65 20 6f 6e 65 20 62 69 74 20 74 68 61   The one bit tha
8e50: 74 20 69 73 20 73 65 74 0a 20 20 2a 2a 20 77 69  t is set.  ** wi
8e60: 6c 6c 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f  ll correspond to
8e70: 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 74 61 62 6c   the common tabl
8e80: 65 2e 20 20 57 65 20 73 74 69 6c 6c 20 6e 65 65  e.  We still nee
8e90: 64 20 74 6f 20 63 68 65 63 6b 20 74 6f 20 6d 61  d to check to ma
8ea0: 6b 65 0a 20 20 2a 2a 20 73 75 72 65 20 74 68 65  ke.  ** sure the
8eb0: 20 73 61 6d 65 20 63 6f 6c 75 6d 6e 20 69 73 20   same column is 
8ec0: 75 73 65 64 20 6f 6e 20 61 6c 6c 20 74 65 72 6d  used on all term
8ed0: 73 2e 20 20 54 68 65 20 32 2d 62 69 74 20 63 61  s.  The 2-bit ca
8ee0: 73 65 20 69 73 20 77 68 65 6e 0a 20 20 2a 2a 20  se is when.  ** 
8ef0: 74 68 65 20 61 6c 6c 20 74 65 72 6d 73 20 61 72  the all terms ar
8f00: 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 74  e of the form "t
8f10: 61 62 6c 65 31 2e 63 6f 6c 75 6d 6e 3d 74 61 62  able1.column=tab
8f20: 6c 65 32 2e 63 6f 6c 75 6d 6e 22 2e 20 20 49 74  le2.column".  It
8f30: 0a 20 20 2a 2a 20 6d 69 67 68 74 20 62 65 20 70  .  ** might be p
8f40: 6f 73 73 69 62 6c 65 20 74 6f 20 66 6f 72 6d 20  ossible to form 
8f50: 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 77  an IN operator w
8f60: 69 74 68 20 65 69 74 68 65 72 20 74 61 62 6c 65  ith either table
8f70: 31 2e 63 6f 6c 75 6d 6e 0a 20 20 2a 2a 20 6f 72  1.column.  ** or
8f80: 20 74 61 62 6c 65 32 2e 63 6f 6c 75 6d 6e 20 61   table2.column a
8f90: 73 20 74 68 65 20 4c 48 53 20 69 66 20 65 69 74  s the LHS if eit
8fa0: 68 65 72 20 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f  her is common to
8fb0: 20 65 76 65 72 79 20 74 65 72 6d 20 6f 66 0a 20   every term of. 
8fc0: 20 2a 2a 20 74 68 65 20 4f 52 20 63 6c 61 75 73   ** the OR claus
8fd0: 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74  e..  **.  ** Not
8fe0: 65 20 74 68 61 74 20 74 65 72 6d 73 20 6f 66 20  e that terms of 
8ff0: 74 68 65 20 66 6f 72 6d 20 22 74 61 62 6c 65 2e  the form "table.
9000: 63 6f 6c 75 6d 6e 31 3d 74 61 62 6c 65 2e 63 6f  column1=table.co
9010: 6c 75 6d 6e 32 22 20 28 74 68 65 0a 20 20 2a 2a  lumn2" (the.  **
9020: 20 73 61 6d 65 20 74 61 62 6c 65 20 6f 6e 20 62   same table on b
9030: 6f 74 68 20 73 69 7a 65 73 20 6f 66 20 74 68 65  oth sizes of the
9040: 20 3d 3d 29 20 63 61 6e 6e 6f 74 20 62 65 20 6f   ==) cannot be o
9050: 70 74 69 6d 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20  ptimized..  */. 
9060: 20 69 66 28 20 63 68 6e 67 54 6f 49 4e 20 29 7b   if( chngToIN ){
9070: 0a 20 20 20 20 69 6e 74 20 6f 6b 54 6f 43 68 6e  .    int okToChn
9080: 67 54 6f 49 4e 20 3d 20 30 3b 20 20 20 20 20 2f  gToIN = 0;     /
9090: 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 63 6f  * True if the co
90a0: 6e 76 65 72 73 69 6f 6e 20 74 6f 20 49 4e 20 69  nversion to IN i
90b0: 73 20 76 61 6c 69 64 20 2a 2f 0a 20 20 20 20 69  s valid */.    i
90c0: 6e 74 20 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b  nt iColumn = -1;
90d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75           /* Colu
90e0: 6d 6e 20 69 6e 64 65 78 20 6f 6e 20 6c 68 73 20  mn index on lhs 
90f0: 6f 66 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a  of IN operator *
9100: 2f 0a 20 20 20 20 69 6e 74 20 69 43 75 72 73 6f  /.    int iCurso
9110: 72 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20  r = -1;         
9120: 2f 2a 20 54 61 62 6c 65 20 63 75 72 73 6f 72 20  /* Table cursor 
9130: 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 74 65  common to all te
9140: 72 6d 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6a  rms */.    int j
9150: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
9160: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
9170: 6e 74 65 72 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  nter */..    /* 
9180: 53 65 61 72 63 68 20 66 6f 72 20 61 20 74 61 62  Search for a tab
9190: 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 74 68  le and column th
91a0: 61 74 20 61 70 70 65 61 72 73 20 6f 6e 20 6f 6e  at appears on on
91b0: 65 20 73 69 64 65 20 6f 72 20 74 68 65 0a 20 20  e side or the.  
91c0: 20 20 2a 2a 20 6f 74 68 65 72 20 6f 66 20 74 68    ** other of th
91d0: 65 20 3d 3d 20 6f 70 65 72 61 74 6f 72 20 69 6e  e == operator in
91e0: 20 65 76 65 72 79 20 73 75 62 74 65 72 6d 2e 20   every subterm. 
91f0: 20 54 68 61 74 20 74 61 62 6c 65 20 61 6e 64 20   That table and 
9200: 63 6f 6c 75 6d 6e 0a 20 20 20 20 2a 2a 20 77 69  column.    ** wi
9210: 6c 6c 20 62 65 20 72 65 63 6f 72 64 65 64 20 69  ll be recorded i
9220: 6e 20 69 43 75 72 73 6f 72 20 61 6e 64 20 69 43  n iCursor and iC
9230: 6f 6c 75 6d 6e 2e 20 20 54 68 65 72 65 20 6d 69  olumn.  There mi
9240: 67 68 74 20 6e 6f 74 20 62 65 20 61 6e 79 0a 20  ght not be any. 
9250: 20 20 20 2a 2a 20 73 75 63 68 20 74 61 62 6c 65     ** such table
9260: 20 61 6e 64 20 63 6f 6c 75 6d 6e 2e 20 20 53 65   and column.  Se
9270: 74 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 69  t okToChngToIN i
9280: 66 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65  f an appropriate
9290: 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20 61 6e   table.    ** an
92a0: 64 20 63 6f 6c 75 6d 6e 20 69 73 20 66 6f 75 6e  d column is foun
92b0: 64 20 62 75 74 20 6c 65 61 76 65 20 6f 6b 54 6f  d but leave okTo
92c0: 43 68 6e 67 54 6f 49 4e 20 66 61 6c 73 65 20 69  ChngToIN false i
92d0: 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20 20 20  f not found..   
92e0: 20 2a 2f 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b   */.    for(j=0;
92f0: 20 6a 3c 32 20 26 26 20 21 6f 6b 54 6f 43 68 6e   j<2 && !okToChn
9300: 67 54 6f 49 4e 3b 20 6a 2b 2b 29 7b 0a 20 20 20  gToIN; j++){.   
9310: 20 20 20 70 4f 72 54 65 72 6d 20 3d 20 70 4f 72     pOrTerm = pOr
9320: 57 63 2d 3e 61 3b 0a 20 20 20 20 20 20 66 6f 72  Wc->a;.      for
9330: 28 69 3d 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d  (i=pOrWc->nTerm-
9340: 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 4f  1; i>=0; i--, pO
9350: 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  rTerm++){.      
9360: 20 20 61 73 73 65 72 74 28 20 70 4f 72 54 65 72    assert( pOrTer
9370: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
9380: 4f 5f 45 51 20 29 3b 0a 20 20 20 20 20 20 20 20  O_EQ );.        
9390: 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  pOrTerm->wtFlags
93a0: 20 26 3d 20 7e 54 45 52 4d 5f 4f 52 5f 4f 4b 3b   &= ~TERM_OR_OK;
93b0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 72  .        if( pOr
93c0: 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
93d0: 3d 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20 20 20  ==iCursor ){.   
93e0: 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 69         /* This i
93f0: 73 20 74 68 65 20 32 2d 62 69 74 20 63 61 73 65  s the 2-bit case
9400: 20 61 6e 64 20 77 65 20 61 72 65 20 6f 6e 20 74   and we are on t
9410: 68 65 20 73 65 63 6f 6e 64 20 69 74 65 72 61 74  he second iterat
9420: 69 6f 6e 20 61 6e 64 0a 20 20 20 20 20 20 20 20  ion and.        
9430: 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 74 65 72    ** current ter
9440: 6d 20 69 73 20 66 72 6f 6d 20 74 68 65 20 66 69  m is from the fi
9450: 72 73 74 20 69 74 65 72 61 74 69 6f 6e 2e 20 20  rst iteration.  
9460: 53 6f 20 73 6b 69 70 20 74 68 69 73 20 74 65 72  So skip this ter
9470: 6d 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  m. */.          
9480: 61 73 73 65 72 74 28 20 6a 3d 3d 31 20 29 3b 0a  assert( j==1 );.
9490: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
94a0: 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ue;.        }.  
94b0: 20 20 20 20 20 20 69 66 28 20 28 63 68 6e 67 54        if( (chngT
94c0: 6f 49 4e 20 26 20 67 65 74 4d 61 73 6b 28 26 70  oIN & getMask(&p
94d0: 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c  WInfo->sMaskSet,
94e0: 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75   pOrTerm->leftCu
94f0: 72 73 6f 72 29 29 3d 3d 30 20 29 7b 0a 20 20 20  rsor))==0 ){.   
9500: 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 74         /* This t
9510: 65 72 6d 20 6d 75 73 74 20 62 65 20 6f 66 20 74  erm must be of t
9520: 68 65 20 66 6f 72 6d 20 74 31 2e 61 3d 3d 74 32  he form t1.a==t2
9530: 2e 62 20 77 68 65 72 65 20 74 32 20 69 73 20 69  .b where t2 is i
9540: 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20  n the.          
9550: 2a 2a 20 63 68 6e 67 54 6f 49 4e 20 73 65 74 20  ** chngToIN set 
9560: 62 75 74 20 74 31 20 69 73 20 6e 6f 74 2e 20 20  but t1 is not.  
9570: 54 68 69 73 20 74 65 72 6d 20 77 69 6c 6c 20 62  This term will b
9580: 65 20 65 69 74 68 65 72 20 70 72 65 63 65 64 65  e either precede
9590: 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f  d.          ** o
95a0: 72 20 66 6f 6c 6c 77 65 64 20 62 79 20 61 6e 20  r follwed by an 
95b0: 69 6e 76 65 72 74 65 64 20 63 6f 70 79 20 28 74  inverted copy (t
95c0: 32 2e 62 3d 3d 74 31 2e 61 29 2e 20 20 53 6b 69  2.b==t1.a).  Ski
95d0: 70 20 74 68 69 73 20 74 65 72 6d 20 0a 20 20 20  p this term .   
95e0: 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 75 73         ** and us
95f0: 65 20 69 74 73 20 69 6e 76 65 72 73 69 6f 6e 2e  e its inversion.
9600: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65   */.          te
9610: 73 74 63 61 73 65 28 20 70 4f 72 54 65 72 6d 2d  stcase( pOrTerm-
9620: 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
9630: 43 4f 50 49 45 44 20 29 3b 0a 20 20 20 20 20 20  COPIED );.      
9640: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4f      testcase( pO
9650: 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  rTerm->wtFlags &
9660: 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b   TERM_VIRTUAL );
9670: 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
9680: 74 28 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c  t( pOrTerm->wtFl
9690: 61 67 73 20 26 20 28 54 45 52 4d 5f 43 4f 50 49  ags & (TERM_COPI
96a0: 45 44 7c 54 45 52 4d 5f 56 49 52 54 55 41 4c 29  ED|TERM_VIRTUAL)
96b0: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f   );.          co
96c0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
96d0: 7d 0a 20 20 20 20 20 20 20 20 69 43 6f 6c 75 6d  }.        iColum
96e0: 6e 20 3d 20 70 4f 72 54 65 72 6d 2d 3e 75 2e 6c  n = pOrTerm->u.l
96f0: 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  eftColumn;.     
9700: 20 20 20 69 43 75 72 73 6f 72 20 3d 20 70 4f 72     iCursor = pOr
9710: 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
9720: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
9730: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
9740: 66 28 20 69 3c 30 20 29 7b 0a 20 20 20 20 20 20  f( i<0 ){.      
9750: 20 20 2f 2a 20 4e 6f 20 63 61 6e 64 69 64 61 74    /* No candidat
9760: 65 20 74 61 62 6c 65 2b 63 6f 6c 75 6d 6e 20 77  e table+column w
9770: 61 73 20 66 6f 75 6e 64 2e 20 20 54 68 69 73 20  as found.  This 
9780: 63 61 6e 20 6f 6e 6c 79 20 6f 63 63 75 72 0a 20  can only occur. 
9790: 20 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65         ** on the
97a0: 20 73 65 63 6f 6e 64 20 69 74 65 72 61 74 69 6f   second iteratio
97b0: 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73  n */.        ass
97c0: 65 72 74 28 20 6a 3d 3d 31 20 29 3b 0a 20 20 20  ert( j==1 );.   
97d0: 20 20 20 20 20 61 73 73 65 72 74 28 20 49 73 50       assert( IsP
97e0: 6f 77 65 72 4f 66 54 77 6f 28 63 68 6e 67 54 6f  owerOfTwo(chngTo
97f0: 49 4e 29 20 29 3b 0a 20 20 20 20 20 20 20 20 61  IN) );.        a
9800: 73 73 65 72 74 28 20 63 68 6e 67 54 6f 49 4e 3d  ssert( chngToIN=
9810: 3d 67 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f  =getMask(&pWInfo
9820: 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 69 43 75 72  ->sMaskSet, iCur
9830: 73 6f 72 29 20 29 3b 0a 20 20 20 20 20 20 20 20  sor) );.        
9840: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
9850: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
9860: 3d 3d 31 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  ==1 );..      /*
9870: 20 57 65 20 68 61 76 65 20 66 6f 75 6e 64 20 61   We have found a
9880: 20 63 61 6e 64 69 64 61 74 65 20 74 61 62 6c 65   candidate table
9890: 20 61 6e 64 20 63 6f 6c 75 6d 6e 2e 20 20 43 68   and column.  Ch
98a0: 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68  eck to see if th
98b0: 61 74 0a 20 20 20 20 20 20 2a 2a 20 74 61 62 6c  at.      ** tabl
98c0: 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 69 73 20  e and column is 
98d0: 63 6f 6d 6d 6f 6e 20 74 6f 20 65 76 65 72 79 20  common to every 
98e0: 74 65 72 6d 20 69 6e 20 74 68 65 20 4f 52 20 63  term in the OR c
98f0: 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 6f  lause */.      o
9900: 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 3d 20 31 3b  kToChngToIN = 1;
9910: 0a 20 20 20 20 20 20 66 6f 72 28 3b 20 69 3e 3d  .      for(; i>=
9920: 30 20 26 26 20 6f 6b 54 6f 43 68 6e 67 54 6f 49  0 && okToChngToI
9930: 4e 3b 20 69 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b  N; i--, pOrTerm+
9940: 2b 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  +){.        asse
9950: 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70  rt( pOrTerm->eOp
9960: 65 72 61 74 6f 72 20 26 20 57 4f 5f 45 51 20 29  erator & WO_EQ )
9970: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f  ;.        if( pO
9980: 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  rTerm->leftCurso
9990: 72 21 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20 20  r!=iCursor ){.  
99a0: 20 20 20 20 20 20 20 20 70 4f 72 54 65 72 6d 2d          pOrTerm-
99b0: 3e 77 74 46 6c 61 67 73 20 26 3d 20 7e 54 45 52  >wtFlags &= ~TER
99c0: 4d 5f 4f 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  M_OR_OK;.       
99d0: 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 72 54 65   }else if( pOrTe
99e0: 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e  rm->u.leftColumn
99f0: 21 3d 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20  !=iColumn ){.   
9a00: 20 20 20 20 20 20 20 6f 6b 54 6f 43 68 6e 67 54         okToChngT
9a10: 6f 49 4e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  oIN = 0;.       
9a20: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
9a30: 20 20 69 6e 74 20 61 66 66 4c 65 66 74 2c 20 61    int affLeft, a
9a40: 66 66 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20  ffRight;.       
9a50: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 72 69 67     /* If the rig
9a60: 68 74 2d 68 61 6e 64 20 73 69 64 65 20 69 73 20  ht-hand side is 
9a70: 61 6c 73 6f 20 61 20 63 6f 6c 75 6d 6e 2c 20 74  also a column, t
9a80: 68 65 6e 20 74 68 65 20 61 66 66 69 6e 69 74 69  hen the affiniti
9a90: 65 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  es.          ** 
9aa0: 6f 66 20 62 6f 74 68 20 72 69 67 68 74 20 61 6e  of both right an
9ab0: 64 20 6c 65 66 74 20 73 69 64 65 73 20 6d 75 73  d left sides mus
9ac0: 74 20 62 65 20 73 75 63 68 20 74 68 61 74 20 6e  t be such that n
9ad0: 6f 20 74 79 70 65 0a 20 20 20 20 20 20 20 20 20  o type.         
9ae0: 20 2a 2a 20 63 6f 6e 76 65 72 73 69 6f 6e 73 20   ** conversions 
9af0: 61 72 65 20 72 65 71 75 69 72 65 64 20 6f 6e 20  are required on 
9b00: 74 68 65 20 72 69 67 68 74 2e 20 20 28 54 69 63  the right.  (Tic
9b10: 6b 65 74 20 23 32 32 34 39 29 0a 20 20 20 20 20  ket #2249).     
9b20: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
9b30: 20 20 61 66 66 52 69 67 68 74 20 3d 20 73 71 6c    affRight = sql
9b40: 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79  ite3ExprAffinity
9b50: 28 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72 2d  (pOrTerm->pExpr-
9b60: 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20  >pRight);.      
9b70: 20 20 20 20 61 66 66 4c 65 66 74 20 3d 20 73 71      affLeft = sq
9b80: 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74  lite3ExprAffinit
9b90: 79 28 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72  y(pOrTerm->pExpr
9ba0: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20  ->pLeft);.      
9bb0: 20 20 20 20 69 66 28 20 61 66 66 52 69 67 68 74      if( affRight
9bc0: 21 3d 30 20 26 26 20 61 66 66 52 69 67 68 74 21  !=0 && affRight!
9bd0: 3d 61 66 66 4c 65 66 74 20 29 7b 0a 20 20 20 20  =affLeft ){.    
9be0: 20 20 20 20 20 20 20 20 6f 6b 54 6f 43 68 6e 67          okToChng
9bf0: 54 6f 49 4e 20 3d 20 30 3b 0a 20 20 20 20 20 20  ToIN = 0;.      
9c00: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
9c10: 20 20 20 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e         pOrTerm->
9c20: 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f  wtFlags |= TERM_
9c30: 4f 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20  OR_OK;.         
9c40: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
9c50: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
9c60: 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  /* At this point
9c70: 2c 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 69  , okToChngToIN i
9c80: 73 20 74 72 75 65 20 69 66 20 6f 72 69 67 69 6e  s true if origin
9c90: 61 6c 20 70 54 65 72 6d 20 73 61 74 69 73 66 69  al pTerm satisfi
9ca0: 65 73 0a 20 20 20 20 2a 2a 20 63 61 73 65 20 31  es.    ** case 1
9cb0: 2e 20 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c  .  In that case,
9cc0: 20 63 6f 6e 73 74 72 75 63 74 20 61 20 6e 65 77   construct a new
9cd0: 20 76 69 72 74 75 61 6c 20 74 65 72 6d 20 74 68   virtual term th
9ce0: 61 74 20 69 73 20 0a 20 20 20 20 2a 2a 20 70 54  at is .    ** pT
9cf0: 65 72 6d 20 63 6f 6e 76 65 72 74 65 64 20 69 6e  erm converted in
9d00: 74 6f 20 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f  to an IN operato
9d10: 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  r..    */.    if
9d20: 28 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 29  ( okToChngToIN )
9d30: 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 44  {.      Expr *pD
9d40: 75 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  up;            /
9d50: 2a 20 41 20 74 72 61 6e 73 69 65 6e 74 20 64 75  * A transient du
9d60: 70 6c 69 63 61 74 65 20 65 78 70 72 65 73 73 69  plicate expressi
9d70: 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72  on */.      Expr
9d80: 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 30 3b  List *pList = 0;
9d90: 20 20 20 2f 2a 20 54 68 65 20 52 48 53 20 6f 66     /* The RHS of
9da0: 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
9db0: 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a   */.      Expr *
9dc0: 70 4c 65 66 74 20 3d 20 30 3b 20 20 20 20 20 20  pLeft = 0;      
9dd0: 20 2f 2a 20 54 68 65 20 4c 48 53 20 6f 66 20 74   /* The LHS of t
9de0: 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a  he IN operator *
9df0: 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e  /.      Expr *pN
9e00: 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ew;            /
9e10: 2a 20 54 68 65 20 63 6f 6d 70 6c 65 74 65 20 49  * The complete I
9e20: 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 0a 20  N operator */.. 
9e30: 20 20 20 20 20 66 6f 72 28 69 3d 70 4f 72 57 63       for(i=pOrWc
9e40: 2d 3e 6e 54 65 72 6d 2d 31 2c 20 70 4f 72 54 65  ->nTerm-1, pOrTe
9e50: 72 6d 3d 70 4f 72 57 63 2d 3e 61 3b 20 69 3e 3d  rm=pOrWc->a; i>=
9e60: 30 3b 20 69 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b  0; i--, pOrTerm+
9e70: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
9e80: 28 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67  (pOrTerm->wtFlag
9e90: 73 20 26 20 54 45 52 4d 5f 4f 52 5f 4f 4b 29 3d  s & TERM_OR_OK)=
9ea0: 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
9eb0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
9ec0: 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  OrTerm->eOperato
9ed0: 72 20 26 20 57 4f 5f 45 51 20 29 3b 0a 20 20 20  r & WO_EQ );.   
9ee0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 72       assert( pOr
9ef0: 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
9f00: 3d 3d 69 43 75 72 73 6f 72 20 29 3b 0a 20 20 20  ==iCursor );.   
9f10: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 72       assert( pOr
9f20: 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75  Term->u.leftColu
9f30: 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e 20 29 3b 0a 20  mn==iColumn );. 
9f40: 20 20 20 20 20 20 20 70 44 75 70 20 3d 20 73 71         pDup = sq
9f50: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
9f60: 20 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72 2d   pOrTerm->pExpr-
9f70: 3e 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 20  >pRight, 0);.   
9f80: 20 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c       pList = sql
9f90: 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
9fa0: 6e 64 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73  nd(pWInfo->pPars
9fb0: 65 2c 20 70 4c 69 73 74 2c 20 70 44 75 70 29 3b  e, pList, pDup);
9fc0: 0a 20 20 20 20 20 20 20 20 70 4c 65 66 74 20 3d  .        pLeft =
9fd0: 20 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72 2d   pOrTerm->pExpr-
9fe0: 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 7d 0a  >pLeft;.      }.
9ff0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c        assert( pL
a000: 65 66 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  eft!=0 );.      
a010: 70 44 75 70 20 3d 20 73 71 6c 69 74 65 33 45 78  pDup = sqlite3Ex
a020: 70 72 44 75 70 28 64 62 2c 20 70 4c 65 66 74 2c  prDup(db, pLeft,
a030: 20 30 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 20   0);.      pNew 
a040: 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
a050: 50 61 72 73 65 2c 20 54 4b 5f 49 4e 2c 20 70 44  Parse, TK_IN, pD
a060: 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  up, 0, 0);.     
a070: 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20   if( pNew ){.   
a080: 20 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77 3b       int idxNew;
a090: 0a 20 20 20 20 20 20 20 20 74 72 61 6e 73 66 65  .        transfe
a0a0: 72 4a 6f 69 6e 4d 61 72 6b 69 6e 67 73 28 70 4e  rJoinMarkings(pN
a0b0: 65 77 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20  ew, pExpr);.    
a0c0: 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
a0d0: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 4e 65  rHasProperty(pNe
a0e0: 77 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  w, EP_xIsSelect)
a0f0: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77   );.        pNew
a100: 2d 3e 78 2e 70 4c 69 73 74 20 3d 20 70 4c 69 73  ->x.pList = pLis
a110: 74 3b 0a 20 20 20 20 20 20 20 20 69 64 78 4e 65  t;.        idxNe
a120: 77 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49  w = whereClauseI
a130: 6e 73 65 72 74 28 70 57 43 2c 20 70 4e 65 77 2c  nsert(pWC, pNew,
a140: 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45   TERM_VIRTUAL|TE
a150: 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20  RM_DYNAMIC);.   
a160: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
a170: 64 78 4e 65 77 3d 3d 30 20 29 3b 0a 20 20 20 20  dxNew==0 );.    
a180: 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 28      exprAnalyze(
a190: 70 53 72 63 2c 20 70 57 43 2c 20 69 64 78 4e 65  pSrc, pWC, idxNe
a1a0: 77 29 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72  w);.        pTer
a1b0: 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54  m = &pWC->a[idxT
a1c0: 65 72 6d 5d 3b 0a 20 20 20 20 20 20 20 20 6d 61  erm];.        ma
a1d0: 72 6b 54 65 72 6d 41 73 43 68 69 6c 64 28 70 57  rkTermAsChild(pW
a1e0: 43 2c 20 69 64 78 4e 65 77 2c 20 69 64 78 54 65  C, idxNew, idxTe
a1f0: 72 6d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  rm);.      }else
a200: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
a210: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
a220: 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 20 20  db, pList);.    
a230: 20 20 7d 0a 20 20 20 20 20 20 70 54 65 72 6d 2d    }.      pTerm-
a240: 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 57 4f 5f  >eOperator = WO_
a250: 4e 4f 4f 50 3b 20 20 2f 2a 20 63 61 73 65 20 31  NOOP;  /* case 1
a260: 20 74 72 75 6d 70 73 20 63 61 73 65 20 33 20 2a   trumps case 3 *
a270: 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65  /.    }.  }.}.#e
a280: 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f  ndif /* !SQLITE_
a290: 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41  OMIT_OR_OPTIMIZA
a2a0: 54 49 4f 4e 20 26 26 20 21 53 51 4c 49 54 45 5f  TION && !SQLITE_
a2b0: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f  OMIT_SUBQUERY */
a2c0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 6e 70 75  ../*.** The inpu
a2d0: 74 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  t to this routin
a2e0: 65 20 69 73 20 61 6e 20 57 68 65 72 65 54 65 72  e is an WhereTer
a2f0: 6d 20 73 74 72 75 63 74 75 72 65 20 77 69 74 68  m structure with
a300: 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 22 70 45   only the.** "pE
a310: 78 70 72 22 20 66 69 65 6c 64 20 66 69 6c 6c 65  xpr" field fille
a320: 64 20 69 6e 2e 20 20 54 68 65 20 6a 6f 62 20 6f  d in.  The job o
a330: 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  f this routine i
a340: 73 20 74 6f 20 61 6e 61 6c 79 7a 65 20 74 68 65  s to analyze the
a350: 0a 2a 2a 20 73 75 62 65 78 70 72 65 73 73 69 6f  .** subexpressio
a360: 6e 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 20 61  n and populate a
a370: 6c 6c 20 74 68 65 20 6f 74 68 65 72 20 66 69 65  ll the other fie
a380: 6c 64 73 20 6f 66 20 74 68 65 20 57 68 65 72 65  lds of the Where
a390: 54 65 72 6d 0a 2a 2a 20 73 74 72 75 63 74 75 72  Term.** structur
a3a0: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
a3b0: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6f 66  expression is of
a3c0: 20 74 68 65 20 66 6f 72 6d 20 22 3c 65 78 70 72   the form "<expr
a3d0: 3e 20 3c 6f 70 3e 20 58 22 20 69 74 20 67 65 74  > <op> X" it get
a3e0: 73 20 63 6f 6d 6d 75 74 65 64 0a 2a 2a 20 74 6f  s commuted.** to
a3f0: 20 74 68 65 20 73 74 61 6e 64 61 72 64 20 66 6f   the standard fo
a400: 72 6d 20 6f 66 20 22 58 20 3c 6f 70 3e 20 3c 65  rm of "X <op> <e
a410: 78 70 72 3e 22 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  xpr>"..**.** If 
a420: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
a430: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 58  s of the form "X
a440: 20 3c 6f 70 3e 20 59 22 20 77 68 65 72 65 20 62   <op> Y" where b
a450: 6f 74 68 20 58 20 61 6e 64 20 59 20 61 72 65 0a  oth X and Y are.
a460: 2a 2a 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e  ** columns, then
a470: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 65 78   the original ex
a480: 70 72 65 73 73 69 6f 6e 20 69 73 20 75 6e 63 68  pression is unch
a490: 61 6e 67 65 64 20 61 6e 64 20 61 20 6e 65 77 20  anged and a new 
a4a0: 76 69 72 74 75 61 6c 0a 2a 2a 20 74 65 72 6d 20  virtual.** term 
a4b0: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 59 20 3c  of the form "Y <
a4c0: 6f 70 3e 20 58 22 20 69 73 20 61 64 64 65 64 20  op> X" is added 
a4d0: 74 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  to the WHERE cla
a4e0: 75 73 65 20 61 6e 64 0a 2a 2a 20 61 6e 61 6c 79  use and.** analy
a4f0: 7a 65 64 20 73 65 70 61 72 61 74 65 6c 79 2e 20  zed separately. 
a500: 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 74 65   The original te
a510: 72 6d 20 69 73 20 6d 61 72 6b 65 64 20 77 69 74  rm is marked wit
a520: 68 20 54 45 52 4d 5f 43 4f 50 49 45 44 0a 2a 2a  h TERM_COPIED.**
a530: 20 61 6e 64 20 74 68 65 20 6e 65 77 20 74 65 72   and the new ter
a540: 6d 20 69 73 20 6d 61 72 6b 65 64 20 77 69 74 68  m is marked with
a550: 20 54 45 52 4d 5f 44 59 4e 41 4d 49 43 20 28 62   TERM_DYNAMIC (b
a560: 65 63 61 75 73 65 20 69 74 27 73 20 70 45 78 70  ecause it's pExp
a570: 72 0a 2a 2a 20 6e 65 65 64 73 20 74 6f 20 62 65  r.** needs to be
a580: 20 66 72 65 65 64 20 77 69 74 68 20 74 68 65 20   freed with the 
a590: 57 68 65 72 65 43 6c 61 75 73 65 29 20 61 6e 64  WhereClause) and
a5a0: 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 28 62   TERM_VIRTUAL (b
a5b0: 65 63 61 75 73 65 20 69 74 0a 2a 2a 20 69 73 20  ecause it.** is 
a5c0: 61 20 63 6f 6d 6d 75 74 65 64 20 63 6f 70 79 20  a commuted copy 
a5d0: 6f 66 20 61 20 70 72 69 6f 72 20 74 65 72 6d 2e  of a prior term.
a5e0: 29 20 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20  )  The original 
a5f0: 74 65 72 6d 20 68 61 73 20 6e 43 68 69 6c 64 3d  term has nChild=
a600: 31 0a 2a 2a 20 61 6e 64 20 74 68 65 20 63 6f 70  1.** and the cop
a610: 79 20 68 61 73 20 69 64 78 50 61 72 65 6e 74 20  y has idxParent 
a620: 73 65 74 20 74 6f 20 74 68 65 20 69 6e 64 65 78  set to the index
a630: 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   of the original
a640: 20 74 65 72 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63   term..*/.static
a650: 20 76 6f 69 64 20 65 78 70 72 41 6e 61 6c 79 7a   void exprAnalyz
a660: 65 28 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  e(.  SrcList *pS
a670: 72 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  rc,            /
a680: 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * the FROM claus
a690: 65 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75  e */.  WhereClau
a6a0: 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20  se *pWC,        
a6b0: 20 2f 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c   /* the WHERE cl
a6c0: 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 64  ause */.  int id
a6d0: 78 54 65 72 6d 20 20 20 20 20 20 20 20 20 20 20  xTerm           
a6e0: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
a6f0: 74 68 65 20 74 65 72 6d 20 74 6f 20 62 65 20 61  the term to be a
a700: 6e 61 6c 79 7a 65 64 20 2a 2f 0a 29 7b 0a 20 20  nalyzed */.){.  
a710: 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
a720: 6f 20 3d 20 70 57 43 2d 3e 70 57 49 6e 66 6f 3b  o = pWC->pWInfo;
a730: 20 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65   /* WHERE clause
a740: 20 70 72 6f 63 65 73 73 69 6e 67 20 63 6f 6e 74   processing cont
a750: 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  ext */.  WhereTe
a760: 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20  rm *pTerm;      
a770: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
a780: 20 74 65 72 6d 20 74 6f 20 62 65 20 61 6e 61 6c   term to be anal
a790: 79 7a 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 4d  yzed */.  WhereM
a7a0: 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74  askSet *pMaskSet
a7b0: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65  ;          /* Se
a7c0: 74 20 6f 66 20 74 61 62 6c 65 20 69 6e 64 65 78  t of table index
a7d0: 20 6d 61 73 6b 73 20 2a 2f 0a 20 20 45 78 70 72   masks */.  Expr
a7e0: 20 2a 70 45 78 70 72 3b 20 20 20 20 20 20 20 20   *pExpr;        
a7f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a800: 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74  The expression t
a810: 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f  o be analyzed */
a820: 0a 20 20 42 69 74 6d 61 73 6b 20 70 72 65 72 65  .  Bitmask prere
a830: 71 4c 65 66 74 3b 20 20 20 20 20 20 20 20 20 20  qLeft;          
a840: 20 20 20 20 2f 2a 20 50 72 65 72 65 71 75 65 73      /* Prereques
a850: 69 74 65 73 20 6f 66 20 74 68 65 20 70 45 78 70  ites of the pExp
a860: 72 2d 3e 70 4c 65 66 74 20 2a 2f 0a 20 20 42 69  r->pLeft */.  Bi
a870: 74 6d 61 73 6b 20 70 72 65 72 65 71 41 6c 6c 3b  tmask prereqAll;
a880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a890: 2a 20 50 72 65 72 65 71 75 65 73 69 74 65 73 20  * Prerequesites 
a8a0: 6f 66 20 70 45 78 70 72 20 2a 2f 0a 20 20 42 69  of pExpr */.  Bi
a8b0: 74 6d 61 73 6b 20 65 78 74 72 61 52 69 67 68 74  tmask extraRight
a8c0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f   = 0;          /
a8d0: 2a 20 45 78 74 72 61 20 64 65 70 65 6e 64 65 6e  * Extra dependen
a8e0: 63 69 65 73 20 6f 6e 20 4c 45 46 54 20 4a 4f 49  cies on LEFT JOI
a8f0: 4e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 53 74  N */.  Expr *pSt
a900: 72 31 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  r1 = 0;         
a910: 20 20 20 20 20 20 20 20 2f 2a 20 52 48 53 20 6f          /* RHS o
a920: 66 20 4c 49 4b 45 2f 47 4c 4f 42 20 6f 70 65 72  f LIKE/GLOB oper
a930: 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 73  ator */.  int is
a940: 43 6f 6d 70 6c 65 74 65 20 3d 20 30 3b 20 20 20  Complete = 0;   
a950: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 48             /* RH
a960: 53 20 6f 66 20 4c 49 4b 45 2f 47 4c 4f 42 20 65  S of LIKE/GLOB e
a970: 6e 64 73 20 77 69 74 68 20 77 69 6c 64 63 61 72  nds with wildcar
a980: 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43 61 73  d */.  int noCas
a990: 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  e = 0;          
a9a0: 20 20 20 20 20 20 20 20 2f 2a 20 75 70 70 65 72          /* upper
a9b0: 63 61 73 65 20 65 71 75 69 76 61 6c 65 6e 74 20  case equivalent 
a9c0: 74 6f 20 6c 6f 77 65 72 63 61 73 65 20 2a 2f 0a  to lowercase */.
a9d0: 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20    int op;       
a9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a9f0: 20 20 20 2f 2a 20 54 6f 70 2d 6c 65 76 65 6c 20     /* Top-level 
aa00: 6f 70 65 72 61 74 6f 72 2e 20 20 70 45 78 70 72  operator.  pExpr
aa10: 2d 3e 6f 70 20 2a 2f 0a 20 20 50 61 72 73 65 20  ->op */.  Parse 
aa20: 2a 70 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f  *pParse = pWInfo
aa30: 2d 3e 70 50 61 72 73 65 3b 20 20 2f 2a 20 50 61  ->pParse;  /* Pa
aa40: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
aa50: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
aa60: 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20   pParse->db;    
aa70: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
aa80: 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a 20  connection */.. 
aa90: 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
aaa0: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74  ailed ){.    ret
aab0: 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 54 65 72 6d  urn;.  }.  pTerm
aac0: 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65   = &pWC->a[idxTe
aad0: 72 6d 5d 3b 0a 20 20 70 4d 61 73 6b 53 65 74 20  rm];.  pMaskSet 
aae0: 3d 20 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b  = &pWInfo->sMask
aaf0: 53 65 74 3b 0a 20 20 70 45 78 70 72 20 3d 20 70  Set;.  pExpr = p
ab00: 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 61  Term->pExpr;.  a
ab10: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
ab20: 21 3d 54 4b 5f 41 53 20 26 26 20 70 45 78 70 72  !=TK_AS && pExpr
ab30: 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 4c 41 54 45  ->op!=TK_COLLATE
ab40: 20 29 3b 0a 20 20 70 72 65 72 65 71 4c 65 66 74   );.  prereqLeft
ab50: 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67   = exprTableUsag
ab60: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70  e(pMaskSet, pExp
ab70: 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 6f 70 20  r->pLeft);.  op 
ab80: 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 69  = pExpr->op;.  i
ab90: 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e 20 29 7b 0a  f( op==TK_IN ){.
aba0: 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
abb0: 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a  r->pRight==0 );.
abc0: 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50      if( ExprHasP
abd0: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
abe0: 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a  P_xIsSelect) ){.
abf0: 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 70 72 65        pTerm->pre
ac00: 72 65 71 52 69 67 68 74 20 3d 20 65 78 70 72 53  reqRight = exprS
ac10: 65 6c 65 63 74 54 61 62 6c 65 55 73 61 67 65 28  electTableUsage(
ac20: 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d  pMaskSet, pExpr-
ac30: 3e 78 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  >x.pSelect);.   
ac40: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 54   }else{.      pT
ac50: 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
ac60: 20 3d 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65   = exprListTable
ac70: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
ac80: 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 29 3b  pExpr->x.pList);
ac90: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
aca0: 66 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c  f( op==TK_ISNULL
acb0: 20 29 7b 0a 20 20 20 20 70 54 65 72 6d 2d 3e 70   ){.    pTerm->p
acc0: 72 65 72 65 71 52 69 67 68 74 20 3d 20 30 3b 0a  rereqRight = 0;.
acd0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 54 65    }else{.    pTe
ace0: 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20  rm->prereqRight 
acf0: 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65  = exprTableUsage
ad00: 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72  (pMaskSet, pExpr
ad10: 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 7d 0a 20  ->pRight);.  }. 
ad20: 20 70 72 65 72 65 71 41 6c 6c 20 3d 20 65 78 70   prereqAll = exp
ad30: 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  rTableUsage(pMas
ad40: 6b 53 65 74 2c 20 70 45 78 70 72 29 3b 0a 20 20  kSet, pExpr);.  
ad50: 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
ad60: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46 72  rty(pExpr, EP_Fr
ad70: 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20 42  omJoin) ){.    B
ad80: 69 74 6d 61 73 6b 20 78 20 3d 20 67 65 74 4d 61  itmask x = getMa
ad90: 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78  sk(pMaskSet, pEx
ada0: 70 72 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61  pr->iRightJoinTa
adb0: 62 6c 65 29 3b 0a 20 20 20 20 70 72 65 72 65 71  ble);.    prereq
adc0: 41 6c 6c 20 7c 3d 20 78 3b 0a 20 20 20 20 65 78  All |= x;.    ex
add0: 74 72 61 52 69 67 68 74 20 3d 20 78 2d 31 3b 20  traRight = x-1; 
ade0: 20 2f 2a 20 4f 4e 20 63 6c 61 75 73 65 20 74 65   /* ON clause te
adf0: 72 6d 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 75  rms may not be u
ae00: 73 65 64 20 77 69 74 68 20 61 6e 20 69 6e 64 65  sed with an inde
ae10: 78 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x.              
ae20: 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 20 6c           ** on l
ae30: 65 66 74 20 74 61 62 6c 65 20 6f 66 20 61 20 4c  eft table of a L
ae40: 45 46 54 20 4a 4f 49 4e 2e 20 20 54 69 63 6b 65  EFT JOIN.  Ticke
ae50: 74 20 23 33 30 31 35 20 2a 2f 0a 20 20 7d 0a 20  t #3015 */.  }. 
ae60: 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c   pTerm->prereqAl
ae70: 6c 20 3d 20 70 72 65 72 65 71 41 6c 6c 3b 0a 20  l = prereqAll;. 
ae80: 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73   pTerm->leftCurs
ae90: 6f 72 20 3d 20 2d 31 3b 0a 20 20 70 54 65 72 6d  or = -1;.  pTerm
aea0: 2d 3e 69 50 61 72 65 6e 74 20 3d 20 2d 31 3b 0a  ->iParent = -1;.
aeb0: 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74    pTerm->eOperat
aec0: 6f 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 61 6c  or = 0;.  if( al
aed0: 6c 6f 77 65 64 4f 70 28 6f 70 29 20 29 7b 0a 20  lowedOp(op) ){. 
aee0: 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d     Expr *pLeft =
aef0: 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70   sqlite3ExprSkip
af00: 43 6f 6c 6c 61 74 65 28 70 45 78 70 72 2d 3e 70  Collate(pExpr->p
af10: 4c 65 66 74 29 3b 0a 20 20 20 20 45 78 70 72 20  Left);.    Expr 
af20: 2a 70 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65  *pRight = sqlite
af30: 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65  3ExprSkipCollate
af40: 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b  (pExpr->pRight);
af50: 0a 20 20 20 20 75 31 36 20 6f 70 4d 61 73 6b 20  .    u16 opMask 
af60: 3d 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71  = (pTerm->prereq
af70: 52 69 67 68 74 20 26 20 70 72 65 72 65 71 4c 65  Right & prereqLe
af80: 66 74 29 3d 3d 30 20 3f 20 57 4f 5f 41 4c 4c 20  ft)==0 ? WO_ALL 
af90: 3a 20 57 4f 5f 45 51 55 49 56 3b 0a 20 20 20 20  : WO_EQUIV;.    
afa0: 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54  if( pLeft->op==T
afb0: 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20  K_COLUMN ){.    
afc0: 20 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72    pTerm->leftCur
afd0: 73 6f 72 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61  sor = pLeft->iTa
afe0: 62 6c 65 3b 0a 20 20 20 20 20 20 70 54 65 72 6d  ble;.      pTerm
aff0: 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d  ->u.leftColumn =
b000: 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b   pLeft->iColumn;
b010: 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 65 4f  .      pTerm->eO
b020: 70 65 72 61 74 6f 72 20 3d 20 6f 70 65 72 61 74  perator = operat
b030: 6f 72 4d 61 73 6b 28 6f 70 29 20 26 20 6f 70 4d  orMask(op) & opM
b040: 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ask;.    }.    i
b050: 66 28 20 70 52 69 67 68 74 20 26 26 20 70 52 69  f( pRight && pRi
b060: 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  ght->op==TK_COLU
b070: 4d 4e 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72  MN ){.      Wher
b080: 65 54 65 72 6d 20 2a 70 4e 65 77 3b 0a 20 20 20  eTerm *pNew;.   
b090: 20 20 20 45 78 70 72 20 2a 70 44 75 70 3b 0a 20     Expr *pDup;. 
b0a0: 20 20 20 20 20 75 31 36 20 65 45 78 74 72 61 4f       u16 eExtraO
b0b0: 70 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a  p = 0;        /*
b0c0: 20 45 78 74 72 61 20 62 69 74 73 20 66 6f 72 20   Extra bits for 
b0d0: 70 4e 65 77 2d 3e 65 4f 70 65 72 61 74 6f 72 20  pNew->eOperator 
b0e0: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 54 65  */.      if( pTe
b0f0: 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3e 3d  rm->leftCursor>=
b100: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  0 ){.        int
b110: 20 69 64 78 4e 65 77 3b 0a 20 20 20 20 20 20 20   idxNew;.       
b120: 20 70 44 75 70 20 3d 20 73 71 6c 69 74 65 33 45   pDup = sqlite3E
b130: 78 70 72 44 75 70 28 64 62 2c 20 70 45 78 70 72  xprDup(db, pExpr
b140: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 0);.        if
b150: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
b160: 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ed ){.          
b170: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
b180: 65 28 64 62 2c 20 70 44 75 70 29 3b 0a 20 20 20  e(db, pDup);.   
b190: 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20         return;. 
b1a0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
b1b0: 20 69 64 78 4e 65 77 20 3d 20 77 68 65 72 65 43   idxNew = whereC
b1c0: 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c  lauseInsert(pWC,
b1d0: 20 70 44 75 70 2c 20 54 45 52 4d 5f 56 49 52 54   pDup, TERM_VIRT
b1e0: 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43  UAL|TERM_DYNAMIC
b1f0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  );.        if( i
b200: 64 78 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72  dxNew==0 ) retur
b210: 6e 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20  n;.        pNew 
b220: 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77  = &pWC->a[idxNew
b230: 5d 3b 0a 20 20 20 20 20 20 20 20 6d 61 72 6b 54  ];.        markT
b240: 65 72 6d 41 73 43 68 69 6c 64 28 70 57 43 2c 20  ermAsChild(pWC, 
b250: 69 64 78 4e 65 77 2c 20 69 64 78 54 65 72 6d 29  idxNew, idxTerm)
b260: 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 20  ;.        pTerm 
b270: 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72  = &pWC->a[idxTer
b280: 6d 5d 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72  m];.        pTer
b290: 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45  m->wtFlags |= TE
b2a0: 52 4d 5f 43 4f 50 49 45 44 3b 0a 20 20 20 20 20  RM_COPIED;.     
b2b0: 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70     if( pExpr->op
b2c0: 3d 3d 54 4b 5f 45 51 0a 20 20 20 20 20 20 20 20  ==TK_EQ.        
b2d0: 20 26 26 20 21 45 78 70 72 48 61 73 50 72 6f 70   && !ExprHasProp
b2e0: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46  erty(pExpr, EP_F
b2f0: 72 6f 6d 4a 6f 69 6e 29 0a 20 20 20 20 20 20 20  romJoin).       
b300: 20 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f    && Optimizatio
b310: 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20 53 51 4c  nEnabled(db, SQL
b320: 49 54 45 5f 54 72 61 6e 73 69 74 69 76 65 29 0a  ITE_Transitive).
b330: 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
b340: 20 20 20 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65       pTerm->eOpe
b350: 72 61 74 6f 72 20 7c 3d 20 57 4f 5f 45 51 55 49  rator |= WO_EQUI
b360: 56 3b 0a 20 20 20 20 20 20 20 20 20 20 65 45 78  V;.          eEx
b370: 74 72 61 4f 70 20 3d 20 57 4f 5f 45 51 55 49 56  traOp = WO_EQUIV
b380: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
b390: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
b3a0: 20 70 44 75 70 20 3d 20 70 45 78 70 72 3b 0a 20   pDup = pExpr;. 
b3b0: 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 70 54         pNew = pT
b3c0: 65 72 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  erm;.      }.   
b3d0: 20 20 20 65 78 70 72 43 6f 6d 6d 75 74 65 28 70     exprCommute(p
b3e0: 50 61 72 73 65 2c 20 70 44 75 70 29 3b 0a 20 20  Parse, pDup);.  
b3f0: 20 20 20 20 70 4c 65 66 74 20 3d 20 73 71 6c 69      pLeft = sqli
b400: 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61  te3ExprSkipColla
b410: 74 65 28 70 44 75 70 2d 3e 70 4c 65 66 74 29 3b  te(pDup->pLeft);
b420: 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6c 65 66  .      pNew->lef
b430: 74 43 75 72 73 6f 72 20 3d 20 70 4c 65 66 74 2d  tCursor = pLeft-
b440: 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 70  >iTable;.      p
b450: 4e 65 77 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d  New->u.leftColum
b460: 6e 20 3d 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75  n = pLeft->iColu
b470: 6d 6e 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  mn;.      testca
b480: 73 65 28 20 28 70 72 65 72 65 71 4c 65 66 74 20  se( (prereqLeft 
b490: 7c 20 65 78 74 72 61 52 69 67 68 74 29 20 21 3d  | extraRight) !=
b4a0: 20 70 72 65 72 65 71 4c 65 66 74 20 29 3b 0a 20   prereqLeft );. 
b4b0: 20 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65       pNew->prere
b4c0: 71 52 69 67 68 74 20 3d 20 70 72 65 72 65 71 4c  qRight = prereqL
b4d0: 65 66 74 20 7c 20 65 78 74 72 61 52 69 67 68 74  eft | extraRight
b4e0: 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 72  ;.      pNew->pr
b4f0: 65 72 65 71 41 6c 6c 20 3d 20 70 72 65 72 65 71  ereqAll = prereq
b500: 41 6c 6c 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  All;.      pNew-
b510: 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 28 6f 70  >eOperator = (op
b520: 65 72 61 74 6f 72 4d 61 73 6b 28 70 44 75 70 2d  eratorMask(pDup-
b530: 3e 6f 70 29 20 2b 20 65 45 78 74 72 61 4f 70 29  >op) + eExtraOp)
b540: 20 26 20 6f 70 4d 61 73 6b 3b 0a 20 20 20 20 7d   & opMask;.    }
b550: 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  .  }..#ifndef SQ
b560: 4c 49 54 45 5f 4f 4d 49 54 5f 42 45 54 57 45 45  LITE_OMIT_BETWEE
b570: 4e 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 20  N_OPTIMIZATION. 
b580: 20 2f 2a 20 49 66 20 61 20 74 65 72 6d 20 69 73   /* If a term is
b590: 20 74 68 65 20 42 45 54 57 45 45 4e 20 6f 70 65   the BETWEEN ope
b5a0: 72 61 74 6f 72 2c 20 63 72 65 61 74 65 20 74 77  rator, create tw
b5b0: 6f 20 6e 65 77 20 76 69 72 74 75 61 6c 20 74 65  o new virtual te
b5c0: 72 6d 73 0a 20 20 2a 2a 20 74 68 61 74 20 64 65  rms.  ** that de
b5d0: 66 69 6e 65 20 74 68 65 20 72 61 6e 67 65 20 74  fine the range t
b5e0: 68 61 74 20 74 68 65 20 42 45 54 57 45 45 4e 20  hat the BETWEEN 
b5f0: 69 6d 70 6c 65 6d 65 6e 74 73 2e 20 20 46 6f 72  implements.  For
b600: 20 65 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20   example:.  **. 
b610: 20 2a 2a 20 20 20 20 20 20 61 20 42 45 54 57 45   **      a BETWE
b620: 45 4e 20 62 20 41 4e 44 20 63 0a 20 20 2a 2a 0a  EN b AND c.  **.
b630: 20 20 2a 2a 20 69 73 20 63 6f 6e 76 65 72 74 65    ** is converte
b640: 64 20 69 6e 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a  d into:.  **.  *
b650: 2a 20 20 20 20 20 20 28 61 20 42 45 54 57 45 45  *      (a BETWEE
b660: 4e 20 62 20 41 4e 44 20 63 29 20 41 4e 44 20 28  N b AND c) AND (
b670: 61 3e 3d 62 29 20 41 4e 44 20 28 61 3c 3d 63 29  a>=b) AND (a<=c)
b680: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 74  .  **.  ** The t
b690: 77 6f 20 6e 65 77 20 74 65 72 6d 73 20 61 72 65  wo new terms are
b6a0: 20 61 64 64 65 64 20 6f 6e 74 6f 20 74 68 65 20   added onto the 
b6b0: 65 6e 64 20 6f 66 20 74 68 65 20 57 68 65 72 65  end of the Where
b6c0: 43 6c 61 75 73 65 20 6f 62 6a 65 63 74 2e 0a 20  Clause object.. 
b6d0: 20 2a 2a 20 54 68 65 20 6e 65 77 20 74 65 72 6d   ** The new term
b6e0: 73 20 61 72 65 20 22 64 79 6e 61 6d 69 63 22 20  s are "dynamic" 
b6f0: 61 6e 64 20 61 72 65 20 63 68 69 6c 64 72 65 6e  and are children
b700: 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   of the original
b710: 20 42 45 54 57 45 45 4e 0a 20 20 2a 2a 20 74 65   BETWEEN.  ** te
b720: 72 6d 2e 20 20 54 68 61 74 20 6d 65 61 6e 73 20  rm.  That means 
b730: 74 68 61 74 20 69 66 20 74 68 65 20 42 45 54 57  that if the BETW
b740: 45 45 4e 20 74 65 72 6d 20 69 73 20 63 6f 64 65  EEN term is code
b750: 64 2c 20 74 68 65 20 63 68 69 6c 64 72 65 6e 20  d, the children 
b760: 61 72 65 0a 20 20 2a 2a 20 73 6b 69 70 70 65 64  are.  ** skipped
b770: 2e 20 20 4f 72 2c 20 69 66 20 74 68 65 20 63 68  .  Or, if the ch
b780: 69 6c 64 72 65 6e 20 61 72 65 20 73 61 74 69 73  ildren are satis
b790: 66 69 65 64 20 62 79 20 61 6e 20 69 6e 64 65 78  fied by an index
b7a0: 2c 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 20  , the original. 
b7b0: 20 2a 2a 20 42 45 54 57 45 45 4e 20 74 65 72 6d   ** BETWEEN term
b7c0: 20 69 73 20 73 6b 69 70 70 65 64 2e 0a 20 20 2a   is skipped..  *
b7d0: 2f 0a 20 20 65 6c 73 65 20 69 66 28 20 70 45 78  /.  else if( pEx
b7e0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 42 45 54 57 45  pr->op==TK_BETWE
b7f0: 45 4e 20 26 26 20 70 57 43 2d 3e 6f 70 3d 3d 54  EN && pWC->op==T
b800: 4b 5f 41 4e 44 20 29 7b 0a 20 20 20 20 45 78 70  K_AND ){.    Exp
b810: 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70  rList *pList = p
b820: 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20  Expr->x.pList;. 
b830: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 73 74     int i;.    st
b840: 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 6f 70  atic const u8 op
b850: 73 5b 5d 20 3d 20 7b 54 4b 5f 47 45 2c 20 54 4b  s[] = {TK_GE, TK
b860: 5f 4c 45 7d 3b 0a 20 20 20 20 61 73 73 65 72 74  _LE};.    assert
b870: 28 20 70 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20  ( pList!=0 );.  
b880: 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d    assert( pList-
b890: 3e 6e 45 78 70 72 3d 3d 32 20 29 3b 0a 20 20 20  >nExpr==2 );.   
b8a0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 32 3b 20 69   for(i=0; i<2; i
b8b0: 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  ++){.      Expr 
b8c0: 2a 70 4e 65 77 45 78 70 72 3b 0a 20 20 20 20 20  *pNewExpr;.     
b8d0: 20 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20 20   int idxNew;.   
b8e0: 20 20 20 70 4e 65 77 45 78 70 72 20 3d 20 73 71     pNewExpr = sq
b8f0: 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
b900: 65 2c 20 6f 70 73 5b 69 5d 2c 20 0a 20 20 20 20  e, ops[i], .    
b910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b920: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
b930: 45 78 70 72 44 75 70 28 64 62 2c 20 70 45 78 70  ExprDup(db, pExp
b940: 72 2d 3e 70 4c 65 66 74 2c 20 30 29 2c 0a 20 20  r->pLeft, 0),.  
b950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b960: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
b970: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4c  e3ExprDup(db, pL
b980: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c  ist->a[i].pExpr,
b990: 20 30 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 74   0), 0);.      t
b9a0: 72 61 6e 73 66 65 72 4a 6f 69 6e 4d 61 72 6b 69  ransferJoinMarki
b9b0: 6e 67 73 28 70 4e 65 77 45 78 70 72 2c 20 70 45  ngs(pNewExpr, pE
b9c0: 78 70 72 29 3b 0a 20 20 20 20 20 20 69 64 78 4e  xpr);.      idxN
b9d0: 65 77 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65  ew = whereClause
b9e0: 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e 65 77  Insert(pWC, pNew
b9f0: 45 78 70 72 2c 20 54 45 52 4d 5f 56 49 52 54 55  Expr, TERM_VIRTU
ba00: 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29  AL|TERM_DYNAMIC)
ba10: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
ba20: 28 20 69 64 78 4e 65 77 3d 3d 30 20 29 3b 0a 20  ( idxNew==0 );. 
ba30: 20 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65       exprAnalyze
ba40: 28 70 53 72 63 2c 20 70 57 43 2c 20 69 64 78 4e  (pSrc, pWC, idxN
ba50: 65 77 29 3b 0a 20 20 20 20 20 20 70 54 65 72 6d  ew);.      pTerm
ba60: 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65   = &pWC->a[idxTe
ba70: 72 6d 5d 3b 0a 20 20 20 20 20 20 6d 61 72 6b 54  rm];.      markT
ba80: 65 72 6d 41 73 43 68 69 6c 64 28 70 57 43 2c 20  ermAsChild(pWC, 
ba90: 69 64 78 4e 65 77 2c 20 69 64 78 54 65 72 6d 29  idxNew, idxTerm)
baa0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
bab0: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
bac0: 54 5f 42 45 54 57 45 45 4e 5f 4f 50 54 49 4d 49  T_BETWEEN_OPTIMI
bad0: 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66 20 21  ZATION */..#if !
bae0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
baf0: 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54  MIT_OR_OPTIMIZAT
bb00: 49 4f 4e 29 20 26 26 20 21 64 65 66 69 6e 65 64  ION) && !defined
bb10: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42  (SQLITE_OMIT_SUB
bb20: 51 55 45 52 59 29 0a 20 20 2f 2a 20 41 6e 61 6c  QUERY).  /* Anal
bb30: 79 7a 65 20 61 20 74 65 72 6d 20 74 68 61 74 20  yze a term that 
bb40: 69 73 20 63 6f 6d 70 6f 73 65 64 20 6f 66 20 74  is composed of t
bb50: 77 6f 20 6f 72 20 6d 6f 72 65 20 73 75 62 74 65  wo or more subte
bb60: 72 6d 73 20 63 6f 6e 6e 65 63 74 65 64 20 62 79  rms connected by
bb70: 0a 20 20 2a 2a 20 61 6e 20 4f 52 20 6f 70 65 72  .  ** an OR oper
bb80: 61 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73  ator..  */.  els
bb90: 65 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d  e if( pExpr->op=
bba0: 3d 54 4b 5f 4f 52 20 29 7b 0a 20 20 20 20 61 73  =TK_OR ){.    as
bbb0: 73 65 72 74 28 20 70 57 43 2d 3e 6f 70 3d 3d 54  sert( pWC->op==T
bbc0: 4b 5f 41 4e 44 20 29 3b 0a 20 20 20 20 65 78 70  K_AND );.    exp
bbd0: 72 41 6e 61 6c 79 7a 65 4f 72 54 65 72 6d 28 70  rAnalyzeOrTerm(p
bbe0: 53 72 63 2c 20 70 57 43 2c 20 69 64 78 54 65 72  Src, pWC, idxTer
bbf0: 6d 29 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d 20  m);.    pTerm = 
bc00: 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d  &pWC->a[idxTerm]
bc10: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ;.  }.#endif /* 
bc20: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f  SQLITE_OMIT_OR_O
bc30: 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a  PTIMIZATION */..
bc40: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
bc50: 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a  MIT_LIKE_OPTIMIZ
bc60: 41 54 49 4f 4e 0a 20 20 2f 2a 20 41 64 64 20 63  ATION.  /* Add c
bc70: 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f 20 72 65  onstraints to re
bc80: 64 75 63 65 20 74 68 65 20 73 65 61 72 63 68 20  duce the search 
bc90: 73 70 61 63 65 20 6f 6e 20 61 20 4c 49 4b 45 20  space on a LIKE 
bca0: 6f 72 20 47 4c 4f 42 0a 20 20 2a 2a 20 6f 70 65  or GLOB.  ** ope
bcb0: 72 61 74 6f 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  rator..  **.  **
bcc0: 20 41 20 6c 69 6b 65 20 70 61 74 74 65 72 6e 20   A like pattern 
bcd0: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 78 20 4c  of the form "x L
bce0: 49 4b 45 20 27 61 42 63 25 27 22 20 69 73 20 63  IKE 'aBc%'" is c
bcf0: 68 61 6e 67 65 64 20 69 6e 74 6f 20 63 6f 6e 73  hanged into cons
bd00: 74 72 61 69 6e 74 73 0a 20 20 2a 2a 0a 20 20 2a  traints.  **.  *
bd10: 2a 20 20 20 20 20 20 20 20 20 20 78 3e 3d 27 41  *          x>='A
bd20: 42 43 27 20 41 4e 44 20 78 3c 27 61 62 64 27 20  BC' AND x<'abd' 
bd30: 41 4e 44 20 78 20 4c 49 4b 45 20 27 61 42 63 25  AND x LIKE 'aBc%
bd40: 27 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  '.  **.  ** The 
bd50: 6c 61 73 74 20 63 68 61 72 61 63 74 65 72 20 6f  last character o
bd60: 66 20 74 68 65 20 70 72 65 66 69 78 20 22 61 62  f the prefix "ab
bd70: 63 22 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65  c" is incremente
bd80: 64 20 74 6f 20 66 6f 72 6d 20 74 68 65 0a 20 20  d to form the.  
bd90: 2a 2a 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20 63  ** termination c
bda0: 6f 6e 64 69 74 69 6f 6e 20 22 61 62 64 22 2e 20  ondition "abd". 
bdb0: 20 49 66 20 63 61 73 65 20 69 73 20 6e 6f 74 20   If case is not 
bdc0: 73 69 67 6e 69 66 69 63 61 6e 74 20 28 74 68 65  significant (the
bdd0: 20 64 65 66 61 75 6c 74 0a 20 20 2a 2a 20 66 6f   default.  ** fo
bde0: 72 20 4c 49 4b 45 29 20 74 68 65 6e 20 74 68 65  r LIKE) then the
bdf0: 20 6c 6f 77 65 72 2d 62 6f 75 6e 64 20 69 73 20   lower-bound is 
be00: 6d 61 64 65 20 61 6c 6c 20 75 70 70 65 72 63 61  made all upperca
be10: 73 65 20 61 6e 64 20 74 68 65 20 75 70 70 65 72  se and the upper
be20: 2d 0a 20 20 2a 2a 20 62 6f 75 6e 64 20 69 73 20  -.  ** bound is 
be30: 6d 61 64 65 20 61 6c 6c 20 6c 6f 77 65 72 63 61  made all lowerca
be40: 73 65 20 73 6f 20 74 68 61 74 20 74 68 65 20 62  se so that the b
be50: 6f 75 6e 64 73 20 61 6c 73 6f 20 77 6f 72 6b 20  ounds also work 
be60: 77 68 65 6e 20 63 6f 6d 70 61 72 69 6e 67 0a 20  when comparing. 
be70: 20 2a 2a 20 42 4c 4f 42 73 2e 0a 20 20 2a 2f 0a   ** BLOBs..  */.
be80: 20 20 69 66 28 20 70 57 43 2d 3e 6f 70 3d 3d 54    if( pWC->op==T
be90: 4b 5f 41 4e 44 20 0a 20 20 20 26 26 20 69 73 4c  K_AND .   && isL
bea0: 69 6b 65 4f 72 47 6c 6f 62 28 70 50 61 72 73 65  ikeOrGlob(pParse
beb0: 2c 20 70 45 78 70 72 2c 20 26 70 53 74 72 31 2c  , pExpr, &pStr1,
bec0: 20 26 69 73 43 6f 6d 70 6c 65 74 65 2c 20 26 6e   &isComplete, &n
bed0: 6f 43 61 73 65 29 0a 20 20 29 7b 0a 20 20 20 20  oCase).  ){.    
bee0: 45 78 70 72 20 2a 70 4c 65 66 74 3b 20 20 20 20  Expr *pLeft;    
bef0: 20 20 20 2f 2a 20 4c 48 53 20 6f 66 20 4c 49 4b     /* LHS of LIK
bf00: 45 2f 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72 20  E/GLOB operator 
bf10: 2a 2f 0a 20 20 20 20 45 78 70 72 20 2a 70 53 74  */.    Expr *pSt
bf20: 72 32 3b 20 20 20 20 20 20 20 2f 2a 20 43 6f 70  r2;       /* Cop
bf30: 79 20 6f 66 20 70 53 74 72 31 20 2d 20 52 48 53  y of pStr1 - RHS
bf40: 20 6f 66 20 4c 49 4b 45 2f 47 4c 4f 42 20 6f 70   of LIKE/GLOB op
bf50: 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 45 78  erator */.    Ex
bf60: 70 72 20 2a 70 4e 65 77 45 78 70 72 31 3b 0a 20  pr *pNewExpr1;. 
bf70: 20 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70     Expr *pNewExp
bf80: 72 32 3b 0a 20 20 20 20 69 6e 74 20 69 64 78 4e  r2;.    int idxN
bf90: 65 77 31 3b 0a 20 20 20 20 69 6e 74 20 69 64 78  ew1;.    int idx
bfa0: 4e 65 77 32 3b 0a 20 20 20 20 63 6f 6e 73 74 20  New2;.    const 
bfb0: 63 68 61 72 20 2a 7a 43 6f 6c 6c 53 65 71 4e 61  char *zCollSeqNa
bfc0: 6d 65 3b 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20  me;     /* Name 
bfd0: 6f 66 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  of collating seq
bfe0: 75 65 6e 63 65 20 2a 2f 0a 20 20 20 20 63 6f 6e  uence */.    con
bff0: 73 74 20 75 31 36 20 77 74 46 6c 61 67 73 20 3d  st u16 wtFlags =
c000: 20 54 45 52 4d 5f 4c 49 4b 45 4f 50 54 20 7c 20   TERM_LIKEOPT | 
c010: 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 7c 20 54  TERM_VIRTUAL | T
c020: 45 52 4d 5f 44 59 4e 41 4d 49 43 3b 0a 0a 20 20  ERM_DYNAMIC;..  
c030: 20 20 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d    pLeft = pExpr-
c040: 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70  >x.pList->a[1].p
c050: 45 78 70 72 3b 0a 20 20 20 20 70 53 74 72 32 20  Expr;.    pStr2 
c060: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
c070: 28 64 62 2c 20 70 53 74 72 31 2c 20 30 29 3b 0a  (db, pStr1, 0);.
c080: 0a 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20  .    /* Convert 
c090: 74 68 65 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20  the lower bound 
c0a0: 74 6f 20 75 70 70 65 72 2d 63 61 73 65 20 61 6e  to upper-case an
c0b0: 64 20 74 68 65 20 75 70 70 65 72 20 62 6f 75 6e  d the upper boun
c0c0: 64 20 74 6f 0a 20 20 20 20 2a 2a 20 6c 6f 77 65  d to.    ** lowe
c0d0: 72 2d 63 61 73 65 20 28 75 70 70 65 72 2d 63 61  r-case (upper-ca
c0e0: 73 65 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  se is less than 
c0f0: 6c 6f 77 65 72 2d 63 61 73 65 20 69 6e 20 41 53  lower-case in AS
c100: 43 49 49 29 20 73 6f 20 74 68 61 74 0a 20 20 20  CII) so that.   
c110: 20 2a 2a 20 74 68 65 20 72 61 6e 67 65 20 63 6f   ** the range co
c120: 6e 73 74 72 61 69 6e 74 73 20 61 6c 73 6f 20 77  nstraints also w
c130: 6f 72 6b 20 66 6f 72 20 42 4c 4f 42 73 0a 20 20  ork for BLOBs.  
c140: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 6f 43    */.    if( noC
c150: 61 73 65 20 26 26 20 21 70 50 61 72 73 65 2d 3e  ase && !pParse->
c160: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
c170: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   ){.      int i;
c180: 0a 20 20 20 20 20 20 63 68 61 72 20 63 3b 0a 20  .      char c;. 
c190: 20 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c       pTerm->wtFl
c1a0: 61 67 73 20 7c 3d 20 54 45 52 4d 5f 4c 49 4b 45  ags |= TERM_LIKE
c1b0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
c1c0: 20 28 63 20 3d 20 70 53 74 72 31 2d 3e 75 2e 7a   (c = pStr1->u.z
c1d0: 54 6f 6b 65 6e 5b 69 5d 29 21 3d 30 3b 20 69 2b  Token[i])!=0; i+
c1e0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 53 74 72  +){.        pStr
c1f0: 31 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 69 5d 20 3d  1->u.zToken[i] =
c200: 20 73 71 6c 69 74 65 33 54 6f 75 70 70 65 72 28   sqlite3Toupper(
c210: 63 29 3b 0a 20 20 20 20 20 20 20 20 70 53 74 72  c);.        pStr
c220: 32 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 69 5d 20 3d  2->u.zToken[i] =
c230: 20 73 71 6c 69 74 65 33 54 6f 6c 6f 77 65 72 28   sqlite3Tolower(
c240: 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  c);.      }.    
c250: 7d 0a 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e  }..    if( !db->
c260: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
c270: 20 20 20 20 20 20 75 38 20 63 2c 20 2a 70 43 3b        u8 c, *pC;
c280: 20 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 63         /* Last c
c290: 68 61 72 61 63 74 65 72 20 62 65 66 6f 72 65 20  haracter before 
c2a0: 74 68 65 20 66 69 72 73 74 20 77 69 6c 64 63 61  the first wildca
c2b0: 72 64 20 2a 2f 0a 20 20 20 20 20 20 70 43 20 3d  rd */.      pC =
c2c0: 20 28 75 38 2a 29 26 70 53 74 72 32 2d 3e 75 2e   (u8*)&pStr2->u.
c2d0: 7a 54 6f 6b 65 6e 5b 73 71 6c 69 74 65 33 53 74  zToken[sqlite3St
c2e0: 72 6c 65 6e 33 30 28 70 53 74 72 32 2d 3e 75 2e  rlen30(pStr2->u.
c2f0: 7a 54 6f 6b 65 6e 29 2d 31 5d 3b 0a 20 20 20 20  zToken)-1];.    
c300: 20 20 63 20 3d 20 2a 70 43 3b 0a 20 20 20 20 20    c = *pC;.     
c310: 20 69 66 28 20 6e 6f 43 61 73 65 20 29 7b 0a 20   if( noCase ){. 
c320: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f         /* The po
c330: 69 6e 74 20 69 73 20 74 6f 20 69 6e 63 72 65 6d  int is to increm
c340: 65 6e 74 20 74 68 65 20 6c 61 73 74 20 63 68 61  ent the last cha
c350: 72 61 63 74 65 72 20 62 65 66 6f 72 65 20 74 68  racter before th
c360: 65 20 66 69 72 73 74 0a 20 20 20 20 20 20 20 20  e first.        
c370: 2a 2a 20 77 69 6c 64 63 61 72 64 2e 20 20 42 75  ** wildcard.  Bu
c380: 74 20 69 66 20 77 65 20 69 6e 63 72 65 6d 65 6e  t if we incremen
c390: 74 20 27 40 27 2c 20 74 68 61 74 20 77 69 6c 6c  t '@', that will
c3a0: 20 70 75 73 68 20 69 74 20 69 6e 74 6f 20 74 68   push it into th
c3b0: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 70  e.        ** alp
c3c0: 68 61 62 65 74 69 63 20 72 61 6e 67 65 20 77 68  habetic range wh
c3d0: 65 72 65 20 63 61 73 65 20 63 6f 6e 76 65 72 73  ere case convers
c3e0: 69 6f 6e 73 20 77 69 6c 6c 20 6d 65 73 73 20 75  ions will mess u
c3f0: 70 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a  p the .        *
c400: 2a 20 69 6e 65 71 75 61 6c 69 74 79 2e 20 20 54  * inequality.  T
c410: 6f 20 61 76 6f 69 64 20 74 68 69 73 2c 20 6d 61  o avoid this, ma
c420: 6b 65 20 73 75 72 65 20 74 6f 20 61 6c 73 6f 20  ke sure to also 
c430: 72 75 6e 20 74 68 65 20 66 75 6c 6c 0a 20 20 20  run the full.   
c440: 20 20 20 20 20 2a 2a 20 4c 49 4b 45 20 6f 6e 20       ** LIKE on 
c450: 61 6c 6c 20 63 61 6e 64 69 64 61 74 65 20 65 78  all candidate ex
c460: 70 72 65 73 73 69 6f 6e 73 20 62 79 20 63 6c 65  pressions by cle
c470: 61 72 69 6e 67 20 74 68 65 20 69 73 43 6f 6d 70  aring the isComp
c480: 6c 65 74 65 20 66 6c 61 67 0a 20 20 20 20 20 20  lete flag.      
c490: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
c4a0: 20 63 3d 3d 27 41 27 2d 31 20 29 20 69 73 43 6f   c=='A'-1 ) isCo
c4b0: 6d 70 6c 65 74 65 20 3d 20 30 3b 0a 20 20 20 20  mplete = 0;.    
c4c0: 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33 55      c = sqlite3U
c4d0: 70 70 65 72 54 6f 4c 6f 77 65 72 5b 63 5d 3b 0a  pperToLower[c];.
c4e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 70        }.      *p
c4f0: 43 20 3d 20 63 20 2b 20 31 3b 0a 20 20 20 20 7d  C = c + 1;.    }
c500: 0a 20 20 20 20 7a 43 6f 6c 6c 53 65 71 4e 61 6d  .    zCollSeqNam
c510: 65 20 3d 20 6e 6f 43 61 73 65 20 3f 20 22 4e 4f  e = noCase ? "NO
c520: 43 41 53 45 22 20 3a 20 22 42 49 4e 41 52 59 22  CASE" : "BINARY"
c530: 3b 0a 20 20 20 20 70 4e 65 77 45 78 70 72 31 20  ;.    pNewExpr1 
c540: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
c550: 28 64 62 2c 20 70 4c 65 66 74 2c 20 30 29 3b 0a  (db, pLeft, 0);.
c560: 20 20 20 20 70 4e 65 77 45 78 70 72 31 20 3d 20      pNewExpr1 = 
c570: 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61  sqlite3PExpr(pPa
c580: 72 73 65 2c 20 54 4b 5f 47 45 2c 0a 20 20 20 20  rse, TK_GE,.    
c590: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
c5a0: 70 72 41 64 64 43 6f 6c 6c 61 74 65 53 74 72 69  prAddCollateStri
c5b0: 6e 67 28 70 50 61 72 73 65 2c 70 4e 65 77 45 78  ng(pParse,pNewEx
c5c0: 70 72 31 2c 7a 43 6f 6c 6c 53 65 71 4e 61 6d 65  pr1,zCollSeqName
c5d0: 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 53  ),.           pS
c5e0: 74 72 31 2c 20 30 29 3b 0a 20 20 20 20 74 72 61  tr1, 0);.    tra
c5f0: 6e 73 66 65 72 4a 6f 69 6e 4d 61 72 6b 69 6e 67  nsferJoinMarking
c600: 73 28 70 4e 65 77 45 78 70 72 31 2c 20 70 45 78  s(pNewExpr1, pEx
c610: 70 72 29 3b 0a 20 20 20 20 69 64 78 4e 65 77 31  pr);.    idxNew1
c620: 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e   = whereClauseIn
c630: 73 65 72 74 28 70 57 43 2c 20 70 4e 65 77 45 78  sert(pWC, pNewEx
c640: 70 72 31 2c 20 77 74 46 6c 61 67 73 29 3b 0a 20  pr1, wtFlags);. 
c650: 20 20 20 74 65 73 74 63 61 73 65 28 20 69 64 78     testcase( idx
c660: 4e 65 77 31 3d 3d 30 20 29 3b 0a 20 20 20 20 65  New1==0 );.    e
c670: 78 70 72 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c  xprAnalyze(pSrc,
c680: 20 70 57 43 2c 20 69 64 78 4e 65 77 31 29 3b 0a   pWC, idxNew1);.
c690: 20 20 20 20 70 4e 65 77 45 78 70 72 32 20 3d 20      pNewExpr2 = 
c6a0: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
c6b0: 62 2c 20 70 4c 65 66 74 2c 20 30 29 3b 0a 20 20  b, pLeft, 0);.  
c6c0: 20 20 70 4e 65 77 45 78 70 72 32 20 3d 20 73 71    pNewExpr2 = sq
c6d0: 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
c6e0: 65 2c 20 54 4b 5f 4c 54 2c 0a 20 20 20 20 20 20  e, TK_LT,.      
c6f0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
c700: 41 64 64 43 6f 6c 6c 61 74 65 53 74 72 69 6e 67  AddCollateString
c710: 28 70 50 61 72 73 65 2c 70 4e 65 77 45 78 70 72  (pParse,pNewExpr
c720: 32 2c 7a 43 6f 6c 6c 53 65 71 4e 61 6d 65 29 2c  2,zCollSeqName),
c730: 0a 20 20 20 20 20 20 20 20 20 20 20 70 53 74 72  .           pStr
c740: 32 2c 20 30 29 3b 0a 20 20 20 20 74 72 61 6e 73  2, 0);.    trans
c750: 66 65 72 4a 6f 69 6e 4d 61 72 6b 69 6e 67 73 28  ferJoinMarkings(
c760: 70 4e 65 77 45 78 70 72 32 2c 20 70 45 78 70 72  pNewExpr2, pExpr
c770: 29 3b 0a 20 20 20 20 69 64 78 4e 65 77 32 20 3d  );.    idxNew2 =
c780: 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65   whereClauseInse
c790: 72 74 28 70 57 43 2c 20 70 4e 65 77 45 78 70 72  rt(pWC, pNewExpr
c7a0: 32 2c 20 77 74 46 6c 61 67 73 29 3b 0a 20 20 20  2, wtFlags);.   
c7b0: 20 74 65 73 74 63 61 73 65 28 20 69 64 78 4e 65   testcase( idxNe
c7c0: 77 32 3d 3d 30 20 29 3b 0a 20 20 20 20 65 78 70  w2==0 );.    exp
c7d0: 72 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20 70  rAnalyze(pSrc, p
c7e0: 57 43 2c 20 69 64 78 4e 65 77 32 29 3b 0a 20 20  WC, idxNew2);.  
c7f0: 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e    pTerm = &pWC->
c800: 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20  a[idxTerm];.    
c810: 69 66 28 20 69 73 43 6f 6d 70 6c 65 74 65 20 29  if( isComplete )
c820: 7b 0a 20 20 20 20 20 20 6d 61 72 6b 54 65 72 6d  {.      markTerm
c830: 41 73 43 68 69 6c 64 28 70 57 43 2c 20 69 64 78  AsChild(pWC, idx
c840: 4e 65 77 31 2c 20 69 64 78 54 65 72 6d 29 3b 0a  New1, idxTerm);.
c850: 20 20 20 20 20 20 6d 61 72 6b 54 65 72 6d 41 73        markTermAs
c860: 43 68 69 6c 64 28 70 57 43 2c 20 69 64 78 4e 65  Child(pWC, idxNe
c870: 77 32 2c 20 69 64 78 54 65 72 6d 29 3b 0a 20 20  w2, idxTerm);.  
c880: 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f    }.  }.#endif /
c890: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49  * SQLITE_OMIT_LI
c8a0: 4b 45 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20  KE_OPTIMIZATION 
c8b0: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
c8c0: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
c8d0: 41 42 4c 45 0a 20 20 2f 2a 20 41 64 64 20 61 20  ABLE.  /* Add a 
c8e0: 57 4f 5f 4d 41 54 43 48 20 61 75 78 69 6c 69 61  WO_MATCH auxilia
c8f0: 72 79 20 74 65 72 6d 20 74 6f 20 74 68 65 20 63  ry term to the c
c900: 6f 6e 73 74 72 61 69 6e 74 20 73 65 74 20 69 66  onstraint set if
c910: 20 74 68 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e   the.  ** curren
c920: 74 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  t expression is 
c930: 6f 66 20 74 68 65 20 66 6f 72 6d 3a 20 20 63 6f  of the form:  co
c940: 6c 75 6d 6e 20 4d 41 54 43 48 20 65 78 70 72 2e  lumn MATCH expr.
c950: 0a 20 20 2a 2a 20 54 68 69 73 20 69 6e 66 6f 72  .  ** This infor
c960: 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 62  mation is used b
c970: 79 20 74 68 65 20 78 42 65 73 74 49 6e 64 65 78  y the xBestIndex
c980: 20 6d 65 74 68 6f 64 73 20 6f 66 0a 20 20 2a 2a   methods of.  **
c990: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 2e   virtual tables.
c9a0: 20 20 54 68 65 20 6e 61 74 69 76 65 20 71 75 65    The native que
c9b0: 72 79 20 6f 70 74 69 6d 69 7a 65 72 20 64 6f 65  ry optimizer doe
c9c0: 73 20 6e 6f 74 20 61 74 74 65 6d 70 74 0a 20 20  s not attempt.  
c9d0: 2a 2a 20 74 6f 20 64 6f 20 61 6e 79 74 68 69 6e  ** to do anythin
c9e0: 67 20 77 69 74 68 20 4d 41 54 43 48 20 66 75 6e  g with MATCH fun
c9f0: 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69  ctions..  */.  i
ca00: 66 28 20 69 73 4d 61 74 63 68 4f 66 43 6f 6c 75  f( isMatchOfColu
ca10: 6d 6e 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20  mn(pExpr) ){.   
ca20: 20 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20 20   int idxNew;.   
ca30: 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c 20 2a   Expr *pRight, *
ca40: 70 4c 65 66 74 3b 0a 20 20 20 20 57 68 65 72 65  pLeft;.    Where
ca50: 54 65 72 6d 20 2a 70 4e 65 77 54 65 72 6d 3b 0a  Term *pNewTerm;.
ca60: 20 20 20 20 42 69 74 6d 61 73 6b 20 70 72 65 72      Bitmask prer
ca70: 65 71 43 6f 6c 75 6d 6e 2c 20 70 72 65 72 65 71  eqColumn, prereq
ca80: 45 78 70 72 3b 0a 0a 20 20 20 20 70 52 69 67 68  Expr;..    pRigh
ca90: 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  t = pExpr->x.pLi
caa0: 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a  st->a[0].pExpr;.
cab0: 20 20 20 20 70 4c 65 66 74 20 3d 20 70 45 78 70      pLeft = pExp
cac0: 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 31 5d  r->x.pList->a[1]
cad0: 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 72 65 72  .pExpr;.    prer
cae0: 65 71 45 78 70 72 20 3d 20 65 78 70 72 54 61 62  eqExpr = exprTab
caf0: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
cb00: 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20 70  , pRight);.    p
cb10: 72 65 72 65 71 43 6f 6c 75 6d 6e 20 3d 20 65 78  rereqColumn = ex
cb20: 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  prTableUsage(pMa
cb30: 73 6b 53 65 74 2c 20 70 4c 65 66 74 29 3b 0a 20  skSet, pLeft);. 
cb40: 20 20 20 69 66 28 20 28 70 72 65 72 65 71 45 78     if( (prereqEx
cb50: 70 72 20 26 20 70 72 65 72 65 71 43 6f 6c 75 6d  pr & prereqColum
cb60: 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 45  n)==0 ){.      E
cb70: 78 70 72 20 2a 70 4e 65 77 45 78 70 72 3b 0a 20  xpr *pNewExpr;. 
cb80: 20 20 20 20 20 70 4e 65 77 45 78 70 72 20 3d 20       pNewExpr = 
cb90: 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61  sqlite3PExpr(pPa
cba0: 72 73 65 2c 20 54 4b 5f 4d 41 54 43 48 2c 20 0a  rse, TK_MATCH, .
cbb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cbc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c                0,
cbd0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
cbe0: 64 62 2c 20 70 52 69 67 68 74 2c 20 30 29 2c 20  db, pRight, 0), 
cbf0: 30 29 3b 0a 20 20 20 20 20 20 69 64 78 4e 65 77  0);.      idxNew
cc00: 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e   = whereClauseIn
cc10: 73 65 72 74 28 70 57 43 2c 20 70 4e 65 77 45 78  sert(pWC, pNewEx
cc20: 70 72 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  pr, TERM_VIRTUAL
cc30: 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a  |TERM_DYNAMIC);.
cc40: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
cc50: 69 64 78 4e 65 77 3d 3d 30 20 29 3b 0a 20 20 20  idxNew==0 );.   
cc60: 20 20 20 70 4e 65 77 54 65 72 6d 20 3d 20 26 70     pNewTerm = &p
cc70: 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 3b 0a 20  WC->a[idxNew];. 
cc80: 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 70       pNewTerm->p
cc90: 72 65 72 65 71 52 69 67 68 74 20 3d 20 70 72 65  rereqRight = pre
cca0: 72 65 71 45 78 70 72 3b 0a 20 20 20 20 20 20 70  reqExpr;.      p
ccb0: 4e 65 77 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72  NewTerm->leftCur
ccc0: 73 6f 72 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61  sor = pLeft->iTa
ccd0: 62 6c 65 3b 0a 20 20 20 20 20 20 70 4e 65 77 54  ble;.      pNewT
cce0: 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d  erm->u.leftColum
ccf0: 6e 20 3d 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75  n = pLeft->iColu
cd00: 6d 6e 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65  mn;.      pNewTe
cd10: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20  rm->eOperator = 
cd20: 57 4f 5f 4d 41 54 43 48 3b 0a 20 20 20 20 20 20  WO_MATCH;.      
cd30: 6d 61 72 6b 54 65 72 6d 41 73 43 68 69 6c 64 28  markTermAsChild(
cd40: 70 57 43 2c 20 69 64 78 4e 65 77 2c 20 69 64 78  pWC, idxNew, idx
cd50: 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 70 54 65  Term);.      pTe
cd60: 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78  rm = &pWC->a[idx
cd70: 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 70 54 65  Term];.      pTe
cd80: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54  rm->wtFlags |= T
cd90: 45 52 4d 5f 43 4f 50 49 45 44 3b 0a 20 20 20 20  ERM_COPIED;.    
cda0: 20 20 70 4e 65 77 54 65 72 6d 2d 3e 70 72 65 72    pNewTerm->prer
cdb0: 65 71 41 6c 6c 20 3d 20 70 54 65 72 6d 2d 3e 70  eqAll = pTerm->p
cdc0: 72 65 72 65 71 41 6c 6c 3b 0a 20 20 20 20 7d 0a  rereqAll;.    }.
cdd0: 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
cde0: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
cdf0: 4c 54 41 42 4c 45 20 2a 2f 0a 0a 23 69 66 64 65  LTABLE */..#ifde
ce00: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
ce10: 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20  STAT3_OR_STAT4. 
ce20: 20 2f 2a 20 57 68 65 6e 20 73 71 6c 69 74 65 5f   /* When sqlite_
ce30: 73 74 61 74 33 20 68 69 73 74 6f 67 72 61 6d 20  stat3 histogram 
ce40: 64 61 74 61 20 69 73 20 61 76 61 69 6c 61 62 6c  data is availabl
ce50: 65 20 61 6e 20 6f 70 65 72 61 74 6f 72 20 6f 66  e an operator of
ce60: 20 74 68 65 0a 20 20 2a 2a 20 66 6f 72 6d 20 22   the.  ** form "
ce70: 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 22 20 63  x IS NOT NULL" c
ce80: 61 6e 20 73 6f 6d 65 74 69 6d 65 73 20 62 65 20  an sometimes be 
ce90: 65 76 61 6c 75 61 74 65 64 20 6d 6f 72 65 20 65  evaluated more e
cea0: 66 66 69 63 69 65 6e 74 6c 79 0a 20 20 2a 2a 20  fficiently.  ** 
ceb0: 61 73 20 22 78 3e 4e 55 4c 4c 22 20 69 66 20 78  as "x>NULL" if x
cec0: 20 69 73 20 6e 6f 74 20 61 6e 20 49 4e 54 45 47   is not an INTEG
ced0: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 20  ER PRIMARY KEY. 
cee0: 20 53 6f 20 63 6f 6e 73 74 72 75 63 74 20 61 0a   So construct a.
cef0: 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 74 65 72    ** virtual ter
cf00: 6d 20 6f 66 20 74 68 61 74 20 66 6f 72 6d 2e 0a  m of that form..
cf10: 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65 20 74    **.  ** Note t
cf20: 68 61 74 20 74 68 65 20 76 69 72 74 75 61 6c 20  hat the virtual 
cf30: 74 65 72 6d 20 6d 75 73 74 20 62 65 20 74 61 67  term must be tag
cf40: 67 65 64 20 77 69 74 68 20 54 45 52 4d 5f 56 4e  ged with TERM_VN
cf50: 55 4c 4c 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20  ULL.  This.  ** 
cf60: 54 45 52 4d 5f 56 4e 55 4c 4c 20 74 61 67 20 77  TERM_VNULL tag w
cf70: 69 6c 6c 20 73 75 70 70 72 65 73 73 20 74 68 65  ill suppress the
cf80: 20 6e 6f 74 2d 6e 75 6c 6c 20 63 68 65 63 6b 20   not-null check 
cf90: 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  at the beginning
cfa0: 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 6c 6f 6f  .  ** of the loo
cfb0: 70 2e 20 20 57 69 74 68 6f 75 74 20 74 68 65 20  p.  Without the 
cfc0: 54 45 52 4d 5f 56 4e 55 4c 4c 20 66 6c 61 67 2c  TERM_VNULL flag,
cfd0: 20 74 68 65 20 6e 6f 74 2d 6e 75 6c 6c 20 63 68   the not-null ch
cfe0: 65 63 6b 20 61 74 0a 20 20 2a 2a 20 74 68 65 20  eck at.  ** the 
cff0: 73 74 61 72 74 20 6f 66 20 74 68 65 20 6c 6f 6f  start of the loo
d000: 70 20 77 69 6c 6c 20 70 72 65 76 65 6e 74 20 61  p will prevent a
d010: 6e 79 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20  ny results from 
d020: 62 65 69 6e 67 20 72 65 74 75 72 6e 65 64 2e 0a  being returned..
d030: 20 20 2a 2f 0a 20 20 69 66 28 20 70 45 78 70 72    */.  if( pExpr
d040: 2d 3e 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c  ->op==TK_NOTNULL
d050: 0a 20 20 20 26 26 20 70 45 78 70 72 2d 3e 70 4c  .   && pExpr->pL
d060: 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  eft->op==TK_COLU
d070: 4d 4e 0a 20 20 20 26 26 20 70 45 78 70 72 2d 3e  MN.   && pExpr->
d080: 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d  pLeft->iColumn>=
d090: 30 0a 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61  0.   && Optimiza
d0a0: 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20  tionEnabled(db, 
d0b0: 53 51 4c 49 54 45 5f 53 74 61 74 33 34 29 0a 20  SQLITE_Stat34). 
d0c0: 20 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 4e   ){.    Expr *pN
d0d0: 65 77 45 78 70 72 3b 0a 20 20 20 20 45 78 70 72  ewExpr;.    Expr
d0e0: 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d   *pLeft = pExpr-
d0f0: 3e 70 4c 65 66 74 3b 0a 20 20 20 20 69 6e 74 20  >pLeft;.    int 
d100: 69 64 78 4e 65 77 3b 0a 20 20 20 20 57 68 65 72  idxNew;.    Wher
d110: 65 54 65 72 6d 20 2a 70 4e 65 77 54 65 72 6d 3b  eTerm *pNewTerm;
d120: 0a 0a 20 20 20 20 70 4e 65 77 45 78 70 72 20 3d  ..    pNewExpr =
d130: 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
d140: 61 72 73 65 2c 20 54 4b 5f 47 54 2c 0a 20 20 20  arse, TK_GT,.   
d150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d160: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
d170: 45 78 70 72 44 75 70 28 64 62 2c 20 70 4c 65 66  ExprDup(db, pLef
d180: 74 2c 20 30 29 2c 0a 20 20 20 20 20 20 20 20 20  t, 0),.         
d190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d1a0: 20 20 20 73 71 6c 69 74 65 33 50 45 78 70 72 28     sqlite3PExpr(
d1b0: 70 50 61 72 73 65 2c 20 54 4b 5f 4e 55 4c 4c 2c  pParse, TK_NULL,
d1c0: 20 30 2c 20 30 2c 20 30 29 2c 20 30 29 3b 0a 0a   0, 0, 0), 0);..
d1d0: 20 20 20 20 69 64 78 4e 65 77 20 3d 20 77 68 65      idxNew = whe
d1e0: 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70  reClauseInsert(p
d1f0: 57 43 2c 20 70 4e 65 77 45 78 70 72 2c 0a 20 20  WC, pNewExpr,.  
d200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d210: 20 20 20 20 20 20 20 20 20 20 20 20 54 45 52 4d              TERM
d220: 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59  _VIRTUAL|TERM_DY
d230: 4e 41 4d 49 43 7c 54 45 52 4d 5f 56 4e 55 4c 4c  NAMIC|TERM_VNULL
d240: 29 3b 0a 20 20 20 20 69 66 28 20 69 64 78 4e 65  );.    if( idxNe
d250: 77 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 54  w ){.      pNewT
d260: 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64  erm = &pWC->a[id
d270: 78 4e 65 77 5d 3b 0a 20 20 20 20 20 20 70 4e 65  xNew];.      pNe
d280: 77 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  wTerm->prereqRig
d290: 68 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4e  ht = 0;.      pN
d2a0: 65 77 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73  ewTerm->leftCurs
d2b0: 6f 72 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62  or = pLeft->iTab
d2c0: 6c 65 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65  le;.      pNewTe
d2d0: 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e  rm->u.leftColumn
d2e0: 20 3d 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d   = pLeft->iColum
d2f0: 6e 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72  n;.      pNewTer
d300: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 57  m->eOperator = W
d310: 4f 5f 47 54 3b 0a 20 20 20 20 20 20 6d 61 72 6b  O_GT;.      mark
d320: 54 65 72 6d 41 73 43 68 69 6c 64 28 70 57 43 2c  TermAsChild(pWC,
d330: 20 69 64 78 4e 65 77 2c 20 69 64 78 54 65 72 6d   idxNew, idxTerm
d340: 29 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d  );.      pTerm =
d350: 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d   &pWC->a[idxTerm
d360: 5d 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e  ];.      pTerm->
d370: 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f  wtFlags |= TERM_
d380: 43 4f 50 49 45 44 3b 0a 20 20 20 20 20 20 70 4e  COPIED;.      pN
d390: 65 77 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c  ewTerm->prereqAl
d3a0: 6c 20 3d 20 70 54 65 72 6d 2d 3e 70 72 65 72 65  l = pTerm->prere
d3b0: 71 41 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  qAll;.    }.  }.
d3c0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
d3d0: 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52  _ENABLE_STAT3_OR
d3e0: 5f 53 54 41 54 34 20 2a 2f 0a 0a 20 20 2f 2a 20  _STAT4 */..  /* 
d3f0: 50 72 65 76 65 6e 74 20 4f 4e 20 63 6c 61 75 73  Prevent ON claus
d400: 65 20 74 65 72 6d 73 20 6f 66 20 61 20 4c 45 46  e terms of a LEF
d410: 54 20 4a 4f 49 4e 20 66 72 6f 6d 20 62 65 69 6e  T JOIN from bein
d420: 67 20 75 73 65 64 20 74 6f 20 64 72 69 76 65 0a  g used to drive.
d430: 20 20 2a 2a 20 61 6e 20 69 6e 64 65 78 20 66 6f    ** an index fo
d440: 72 20 74 61 62 6c 65 73 20 74 6f 20 74 68 65 20  r tables to the 
d450: 6c 65 66 74 20 6f 66 20 74 68 65 20 6a 6f 69 6e  left of the join
d460: 2e 0a 20 20 2a 2f 0a 20 20 70 54 65 72 6d 2d 3e  ..  */.  pTerm->
d470: 70 72 65 72 65 71 52 69 67 68 74 20 7c 3d 20 65  prereqRight |= e
d480: 78 74 72 61 52 69 67 68 74 3b 0a 7d 0a 0a 2f 2a  xtraRight;.}../*
d490: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
d4a0: 6e 20 73 65 61 72 63 68 65 73 20 70 4c 69 73 74  n searches pList
d4b0: 20 66 6f 72 20 61 6e 20 65 6e 74 72 79 20 74 68   for an entry th
d4c0: 61 74 20 6d 61 74 63 68 65 73 20 74 68 65 20 69  at matches the i
d4d0: 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 0a 2a 2a  Col-th column.**
d4e0: 20 6f 66 20 69 6e 64 65 78 20 70 49 64 78 2e 0a   of index pIdx..
d4f0: 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 68 20 61 6e  **.** If such an
d500: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66   expression is f
d510: 6f 75 6e 64 2c 20 69 74 73 20 69 6e 64 65 78 20  ound, its index 
d520: 69 6e 20 70 4c 69 73 74 2d 3e 61 5b 5d 20 69 73  in pList->a[] is
d530: 20 72 65 74 75 72 6e 65 64 2e 20 49 66 0a 2a 2a   returned. If.**
d540: 20 6e 6f 20 65 78 70 72 65 73 73 69 6f 6e 20 69   no expression i
d550: 73 20 66 6f 75 6e 64 2c 20 2d 31 20 69 73 20 72  s found, -1 is r
d560: 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
d570: 69 63 20 69 6e 74 20 66 69 6e 64 49 6e 64 65 78  ic int findIndex
d580: 43 6f 6c 28 0a 20 20 50 61 72 73 65 20 2a 70 50  Col(.  Parse *pP
d590: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  arse,           
d5a0: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20         /* Parse 
d5b0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
d5c0: 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20  rList *pList,   
d5d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d5e0: 45 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20  Expression list 
d5f0: 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 69  to search */.  i
d600: 6e 74 20 69 42 61 73 65 2c 20 20 20 20 20 20 20  nt iBase,       
d610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d620: 2a 20 43 75 72 73 6f 72 20 66 6f 72 20 74 61 62  * Cursor for tab
d630: 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  le associated wi
d640: 74 68 20 70 49 64 78 20 2a 2f 0a 20 20 49 6e 64  th pIdx */.  Ind
d650: 65 78 20 2a 70 49 64 78 2c 20 20 20 20 20 20 20  ex *pIdx,       
d660: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d670: 49 6e 64 65 78 20 74 6f 20 6d 61 74 63 68 20 63  Index to match c
d680: 6f 6c 75 6d 6e 20 6f 66 20 2a 2f 0a 20 20 69 6e  olumn of */.  in
d690: 74 20 69 43 6f 6c 20 20 20 20 20 20 20 20 20 20  t iCol          
d6a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d6b0: 20 43 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78   Column of index
d6c0: 20 74 6f 20 6d 61 74 63 68 20 2a 2f 0a 29 7b 0a   to match */.){.
d6d0: 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74    int i;.  const
d6e0: 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70   char *zColl = p
d6f0: 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 43 6f 6c  Idx->azColl[iCol
d700: 5d 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  ];..  for(i=0; i
d710: 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  <pList->nExpr; i
d720: 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
d730: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b   = sqlite3ExprSk
d740: 69 70 43 6f 6c 6c 61 74 65 28 70 4c 69 73 74 2d  ipCollate(pList-
d750: 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[i].pExpr);.  
d760: 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f    if( p->op==TK_
d770: 43 4f 4c 55 4d 4e 0a 20 20 20 20 20 26 26 20 70  COLUMN.     && p
d780: 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 49 64 78 2d  ->iColumn==pIdx-
d790: 3e 61 69 43 6f 6c 75 6d 6e 5b 69 43 6f 6c 5d 0a  >aiColumn[iCol].
d7a0: 20 20 20 20 20 26 26 20 70 2d 3e 69 54 61 62 6c       && p->iTabl
d7b0: 65 3d 3d 69 42 61 73 65 0a 20 20 20 20 29 7b 0a  e==iBase.    ){.
d7c0: 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
d7d0: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
d7e0: 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
d7f0: 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  , pList->a[i].pE
d800: 78 70 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  xpr);.      if( 
d810: 70 43 6f 6c 6c 20 26 26 20 30 3d 3d 73 71 6c 69  pColl && 0==sqli
d820: 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 6c  te3StrICmp(pColl
d830: 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 6c 29 20  ->zName, zColl) 
d840: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
d850: 6e 20 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n i;.      }.   
d860: 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
d870: 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   -1;.}../*.** Re
d880: 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65  turn true if the
d890: 20 44 49 53 54 49 4e 43 54 20 65 78 70 72 65 73   DISTINCT expres
d8a0: 73 69 6f 6e 2d 6c 69 73 74 20 70 61 73 73 65 64  sion-list passed
d8b0: 20 61 73 20 74 68 65 20 74 68 69 72 64 20 61 72   as the third ar
d8c0: 67 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 72 65 64  gument.** is red
d8d0: 75 6e 64 61 6e 74 2e 0a 2a 2a 0a 2a 2a 20 41 20  undant..**.** A 
d8e0: 44 49 53 54 49 4e 43 54 20 6c 69 73 74 20 69 73  DISTINCT list is
d8f0: 20 72 65 64 75 6e 64 61 6e 74 20 69 66 20 74 68   redundant if th
d900: 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61  e database conta
d910: 69 6e 73 20 73 6f 6d 65 20 73 75 62 73 65 74 20  ins some subset 
d920: 6f 66 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 20 74 68  of.** columns th
d930: 61 74 20 61 72 65 20 75 6e 69 71 75 65 20 61 6e  at are unique an
d940: 64 20 6e 6f 6e 2d 6e 75 6c 6c 2e 0a 2a 2f 0a 73  d non-null..*/.s
d950: 74 61 74 69 63 20 69 6e 74 20 69 73 44 69 73 74  tatic int isDist
d960: 69 6e 63 74 52 65 64 75 6e 64 61 6e 74 28 0a 20  inctRedundant(. 
d970: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
d980: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
d990: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
d9a0: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62  .  SrcList *pTab
d9b0: 4c 69 73 74 2c 20 20 20 20 20 20 20 20 2f 2a 20  List,        /* 
d9c0: 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  The FROM clause 
d9d0: 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  */.  WhereClause
d9e0: 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20 2f   *pWC,         /
d9f0: 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
da00: 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  se */.  ExprList
da10: 20 2a 70 44 69 73 74 69 6e 63 74 20 20 20 20 20   *pDistinct     
da20: 20 20 2f 2a 20 54 68 65 20 72 65 73 75 6c 74 20    /* The result 
da30: 73 65 74 20 74 68 61 74 20 6e 65 65 64 73 20 74  set that needs t
da40: 6f 20 62 65 20 44 49 53 54 49 4e 43 54 20 2a 2f  o be DISTINCT */
da50: 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  .){.  Table *pTa
da60: 62 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  b;.  Index *pIdx
da70: 3b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  ;.  int i;      
da80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da90: 20 20 20 20 0a 20 20 69 6e 74 20 69 42 61 73 65      .  int iBase
daa0: 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  ;..  /* If there
dab0: 20 69 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e   is more than on
dac0: 65 20 74 61 62 6c 65 20 6f 72 20 73 75 62 2d 73  e table or sub-s
dad0: 65 6c 65 63 74 20 69 6e 20 74 68 65 20 46 52 4f  elect in the FRO
dae0: 4d 20 63 6c 61 75 73 65 20 6f 66 0a 20 20 2a 2a  M clause of.  **
daf0: 20 74 68 69 73 20 71 75 65 72 79 2c 20 74 68 65   this query, the
db00: 6e 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65  n it will not be
db10: 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 73 68 6f   possible to sho
db20: 77 20 74 68 61 74 20 74 68 65 20 44 49 53 54 49  w that the DISTI
db30: 4e 43 54 20 0a 20 20 2a 2a 20 63 6c 61 75 73 65  NCT .  ** clause
db40: 20 69 73 20 72 65 64 75 6e 64 61 6e 74 2e 20 2a   is redundant. *
db50: 2f 0a 20 20 69 66 28 20 70 54 61 62 4c 69 73 74  /.  if( pTabList
db60: 2d 3e 6e 53 72 63 21 3d 31 20 29 20 72 65 74 75  ->nSrc!=1 ) retu
db70: 72 6e 20 30 3b 0a 20 20 69 42 61 73 65 20 3d 20  rn 0;.  iBase = 
db80: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e 69  pTabList->a[0].i
db90: 43 75 72 73 6f 72 3b 0a 20 20 70 54 61 62 20 3d  Cursor;.  pTab =
dba0: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e   pTabList->a[0].
dbb0: 70 54 61 62 3b 0a 0a 20 20 2f 2a 20 49 66 20 61  pTab;..  /* If a
dbc0: 6e 79 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  ny of the expres
dbd0: 73 69 6f 6e 73 20 69 73 20 61 6e 20 49 50 4b 20  sions is an IPK 
dbe0: 63 6f 6c 75 6d 6e 20 6f 6e 20 74 61 62 6c 65 20  column on table 
dbf0: 69 42 61 73 65 2c 20 74 68 65 6e 20 72 65 74 75  iBase, then retu
dc00: 72 6e 20 0a 20 20 2a 2a 20 74 72 75 65 2e 20 4e  rn .  ** true. N
dc10: 6f 74 65 3a 20 54 68 65 20 28 70 2d 3e 69 54 61  ote: The (p->iTa
dc20: 62 6c 65 3d 3d 69 42 61 73 65 29 20 70 61 72 74  ble==iBase) part
dc30: 20 6f 66 20 74 68 69 73 20 74 65 73 74 20 6d 61   of this test ma
dc40: 79 20 62 65 20 66 61 6c 73 65 20 69 66 20 74 68  y be false if th
dc50: 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 53  e.  ** current S
dc60: 45 4c 45 43 54 20 69 73 20 61 20 63 6f 72 72 65  ELECT is a corre
dc70: 6c 61 74 65 64 20 73 75 62 2d 71 75 65 72 79 2e  lated sub-query.
dc80: 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  .  */.  for(i=0;
dc90: 20 69 3c 70 44 69 73 74 69 6e 63 74 2d 3e 6e 45   i<pDistinct->nE
dca0: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45  xpr; i++){.    E
dcb0: 78 70 72 20 2a 70 20 3d 20 73 71 6c 69 74 65 33  xpr *p = sqlite3
dcc0: 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28  ExprSkipCollate(
dcd0: 70 44 69 73 74 69 6e 63 74 2d 3e 61 5b 69 5d 2e  pDistinct->a[i].
dce0: 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20  pExpr);.    if( 
dcf0: 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  p->op==TK_COLUMN
dd00: 20 26 26 20 70 2d 3e 69 54 61 62 6c 65 3d 3d 69   && p->iTable==i
dd10: 42 61 73 65 20 26 26 20 70 2d 3e 69 43 6f 6c 75  Base && p->iColu
dd20: 6d 6e 3c 30 20 29 20 72 65 74 75 72 6e 20 31 3b  mn<0 ) return 1;
dd30: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20  .  }..  /* Loop 
dd40: 74 68 72 6f 75 67 68 20 61 6c 6c 20 69 6e 64 69  through all indi
dd50: 63 65 73 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  ces on the table
dd60: 2c 20 63 68 65 63 6b 69 6e 67 20 65 61 63 68 20  , checking each 
dd70: 74 6f 20 73 65 65 20 69 66 20 69 74 20 6d 61 6b  to see if it mak
dd80: 65 73 0a 20 20 2a 2a 20 74 68 65 20 44 49 53 54  es.  ** the DIST
dd90: 49 4e 43 54 20 71 75 61 6c 69 66 69 65 72 20 72  INCT qualifier r
dda0: 65 64 75 6e 64 61 6e 74 2e 20 49 74 20 64 6f 65  edundant. It doe
ddb0: 73 20 73 6f 20 69 66 3a 0a 20 20 2a 2a 0a 20 20  s so if:.  **.  
ddc0: 2a 2a 20 20 20 31 2e 20 54 68 65 20 69 6e 64 65  **   1. The inde
ddd0: 78 20 69 73 20 69 74 73 65 6c 66 20 55 4e 49 51  x is itself UNIQ
dde0: 55 45 2c 20 61 6e 64 0a 20 20 2a 2a 0a 20 20 2a  UE, and.  **.  *
ddf0: 2a 20 20 20 32 2e 20 41 6c 6c 20 6f 66 20 74 68  *   2. All of th
de00: 65 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  e columns in the
de10: 20 69 6e 64 65 78 20 61 72 65 20 65 69 74 68 65   index are eithe
de20: 72 20 70 61 72 74 20 6f 66 20 74 68 65 20 70 44  r part of the pD
de30: 69 73 74 69 6e 63 74 0a 20 20 2a 2a 20 20 20 20  istinct.  **    
de40: 20 20 6c 69 73 74 2c 20 6f 72 20 65 6c 73 65 20    list, or else 
de50: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
de60: 20 63 6f 6e 74 61 69 6e 73 20 61 20 74 65 72 6d   contains a term
de70: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 63 6f   of the form "co
de80: 6c 3d 58 22 2c 0a 20 20 2a 2a 20 20 20 20 20 20  l=X",.  **      
de90: 77 68 65 72 65 20 58 20 69 73 20 61 20 63 6f 6e  where X is a con
dea0: 73 74 61 6e 74 20 76 61 6c 75 65 2e 20 54 68 65  stant value. The
deb0: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
dec0: 6e 63 65 73 20 6f 66 20 74 68 65 0a 20 20 2a 2a  nces of the.  **
ded0: 20 20 20 20 20 20 63 6f 6d 70 61 72 69 73 6f 6e        comparison
dee0: 20 61 6e 64 20 73 65 6c 65 63 74 2d 6c 69 73 74   and select-list
def0: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6d 75 73   expressions mus
df00: 74 20 6d 61 74 63 68 20 74 68 6f 73 65 20 6f 66  t match those of
df10: 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 2a 2a   the index..  **
df20: 0a 20 20 2a 2a 20 20 20 33 2e 20 41 6c 6c 20 6f  .  **   3. All o
df30: 66 20 74 68 6f 73 65 20 69 6e 64 65 78 20 63 6f  f those index co
df40: 6c 75 6d 6e 73 20 66 6f 72 20 77 68 69 63 68 20  lumns for which 
df50: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
df60: 20 64 6f 65 73 20 6e 6f 74 0a 20 20 2a 2a 20 20   does not.  **  
df70: 20 20 20 20 63 6f 6e 74 61 69 6e 20 61 20 22 63      contain a "c
df80: 6f 6c 3d 58 22 20 74 65 72 6d 20 61 72 65 20 73  ol=X" term are s
df90: 75 62 6a 65 63 74 20 74 6f 20 61 20 4e 4f 54 20  ubject to a NOT 
dfa0: 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74 2e  NULL constraint.
dfb0: 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 49 64 78  .  */.  for(pIdx
dfc0: 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70  =pTab->pIndex; p
dfd0: 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  Idx; pIdx=pIdx->
dfe0: 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  pNext){.    if( 
dff0: 21 49 73 55 6e 69 71 75 65 49 6e 64 65 78 28 70  !IsUniqueIndex(p
e000: 49 64 78 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  Idx) ) continue;
e010: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
e020: 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 69  pIdx->nKeyCol; i
e030: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 31 36 20 69  ++){.      i16 i
e040: 43 6f 6c 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f  Col = pIdx->aiCo
e050: 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20 20 69  lumn[i];.      i
e060: 66 28 20 30 3d 3d 66 69 6e 64 54 65 72 6d 28 70  f( 0==findTerm(p
e070: 57 43 2c 20 69 42 61 73 65 2c 20 69 43 6f 6c 2c  WC, iBase, iCol,
e080: 20 7e 28 42 69 74 6d 61 73 6b 29 30 2c 20 57 4f   ~(Bitmask)0, WO
e090: 5f 45 51 2c 20 70 49 64 78 29 20 29 7b 0a 20 20  _EQ, pIdx) ){.  
e0a0: 20 20 20 20 20 20 69 6e 74 20 69 49 64 78 43 6f        int iIdxCo
e0b0: 6c 20 3d 20 66 69 6e 64 49 6e 64 65 78 43 6f 6c  l = findIndexCol
e0c0: 28 70 50 61 72 73 65 2c 20 70 44 69 73 74 69 6e  (pParse, pDistin
e0d0: 63 74 2c 20 69 42 61 73 65 2c 20 70 49 64 78 2c  ct, iBase, pIdx,
e0e0: 20 69 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   i);.        if(
e0f0: 20 69 49 64 78 43 6f 6c 3c 30 20 7c 7c 20 70 54   iIdxCol<0 || pT
e100: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 6e  ab->aCol[iCol].n
e110: 6f 74 4e 75 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20  otNull==0 ){.   
e120: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
e130: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
e140: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3d      }.    if( i=
e150: 3d 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 20 29  =pIdx->nKeyCol )
e160: 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  {.      /* This 
e170: 69 6e 64 65 78 20 69 6d 70 6c 69 65 73 20 74 68  index implies th
e180: 61 74 20 74 68 65 20 44 49 53 54 49 4e 43 54 20  at the DISTINCT 
e190: 71 75 61 6c 69 66 69 65 72 20 69 73 20 72 65 64  qualifier is red
e1a0: 75 6e 64 61 6e 74 2e 20 2a 2f 0a 20 20 20 20 20  undant. */.     
e1b0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
e1c0: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 30  .  }..  return 0
e1d0: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45 73 74 69  ;.}.../*.** Esti
e1e0: 6d 61 74 65 20 74 68 65 20 6c 6f 67 61 72 69 74  mate the logarit
e1f0: 68 6d 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20  hm of the input 
e200: 76 61 6c 75 65 20 74 6f 20 62 61 73 65 20 32 2e  value to base 2.
e210: 0a 2a 2f 0a 73 74 61 74 69 63 20 4c 6f 67 45 73  .*/.static LogEs
e220: 74 20 65 73 74 4c 6f 67 28 4c 6f 67 45 73 74 20  t estLog(LogEst 
e230: 4e 29 7b 0a 20 20 72 65 74 75 72 6e 20 4e 3c 3d  N){.  return N<=
e240: 31 30 20 3f 20 30 20 3a 20 73 71 6c 69 74 65 33  10 ? 0 : sqlite3
e250: 4c 6f 67 45 73 74 28 4e 29 20 2d 20 33 33 3b 0a  LogEst(N) - 33;.
e260: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 77 6f 20 72 6f 75  }../*.** Two rou
e270: 74 69 6e 65 73 20 66 6f 72 20 70 72 69 6e 74 69  tines for printi
e280: 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  ng the content o
e290: 66 20 61 6e 20 73 71 6c 69 74 65 33 5f 69 6e 64  f an sqlite3_ind
e2a0: 65 78 5f 69 6e 66 6f 0a 2a 2a 20 73 74 72 75 63  ex_info.** struc
e2b0: 74 75 72 65 2e 20 20 55 73 65 64 20 66 6f 72 20  ture.  Used for 
e2c0: 74 65 73 74 69 6e 67 20 61 6e 64 20 64 65 62 75  testing and debu
e2d0: 67 67 69 6e 67 20 6f 6e 6c 79 2e 20 20 49 66 20  gging only.  If 
e2e0: 6e 65 69 74 68 65 72 0a 2a 2a 20 53 51 4c 49 54  neither.** SQLIT
e2f0: 45 5f 54 45 53 54 20 6f 72 20 53 51 4c 49 54 45  E_TEST or SQLITE
e300: 5f 44 45 42 55 47 20 61 72 65 20 64 65 66 69 6e  _DEBUG are defin
e310: 65 64 2c 20 74 68 65 6e 20 74 68 65 73 65 20 72  ed, then these r
e320: 6f 75 74 69 6e 65 73 0a 2a 2a 20 61 72 65 20 6e  outines.** are n
e330: 6f 2d 6f 70 73 2e 0a 2a 2f 0a 23 69 66 20 21 64  o-ops..*/.#if !d
e340: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
e350: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  IT_VIRTUALTABLE)
e360: 20 26 26 20 64 65 66 69 6e 65 64 28 57 48 45 52   && defined(WHER
e370: 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 29 0a  ETRACE_ENABLED).
e380: 73 74 61 74 69 63 20 76 6f 69 64 20 54 52 41 43  static void TRAC
e390: 45 5f 49 44 58 5f 49 4e 50 55 54 53 28 73 71 6c  E_IDX_INPUTS(sql
e3a0: 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
e3b0: 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  *p){.  int i;.  
e3c0: 69 66 28 20 21 73 71 6c 69 74 65 33 57 68 65 72  if( !sqlite3Wher
e3d0: 65 54 72 61 63 65 20 29 20 72 65 74 75 72 6e 3b  eTrace ) return;
e3e0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
e3f0: 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b  >nConstraint; i+
e400: 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  +){.    sqlite3D
e410: 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 63 6f  ebugPrintf("  co
e420: 6e 73 74 72 61 69 6e 74 5b 25 64 5d 3a 20 63 6f  nstraint[%d]: co
e430: 6c 3d 25 64 20 74 65 72 6d 69 64 3d 25 64 20 6f  l=%d termid=%d o
e440: 70 3d 25 64 20 75 73 61 62 6c 65 64 3d 25 64 5c  p=%d usabled=%d\
e450: 6e 22 2c 0a 20 20 20 20 20 20 20 69 2c 0a 20 20  n",.       i,.  
e460: 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61       p->aConstra
e470: 69 6e 74 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 2c 0a  int[i].iColumn,.
e480: 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74         p->aConst
e490: 72 61 69 6e 74 5b 69 5d 2e 69 54 65 72 6d 4f 66  raint[i].iTermOf
e4a0: 66 73 65 74 2c 0a 20 20 20 20 20 20 20 70 2d 3e  fset,.       p->
e4b0: 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 6f  aConstraint[i].o
e4c0: 70 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f  p,.       p->aCo
e4d0: 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 75 73 61 62  nstraint[i].usab
e4e0: 6c 65 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  le);.  }.  for(i
e4f0: 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 72 64 65 72 42  =0; i<p->nOrderB
e500: 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  y; i++){.    sql
e510: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
e520: 22 20 20 6f 72 64 65 72 62 79 5b 25 64 5d 3a 20  "  orderby[%d]: 
e530: 63 6f 6c 3d 25 64 20 64 65 73 63 3d 25 64 5c 6e  col=%d desc=%d\n
e540: 22 2c 0a 20 20 20 20 20 20 20 69 2c 0a 20 20 20  ",.       i,.   
e550: 20 20 20 20 70 2d 3e 61 4f 72 64 65 72 42 79 5b      p->aOrderBy[
e560: 69 5d 2e 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20  i].iColumn,.    
e570: 20 20 20 70 2d 3e 61 4f 72 64 65 72 42 79 5b 69     p->aOrderBy[i
e580: 5d 2e 64 65 73 63 29 3b 0a 20 20 7d 0a 7d 0a 73  ].desc);.  }.}.s
e590: 74 61 74 69 63 20 76 6f 69 64 20 54 52 41 43 45  tatic void TRACE
e5a0: 5f 49 44 58 5f 4f 55 54 50 55 54 53 28 73 71 6c  _IDX_OUTPUTS(sql
e5b0: 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
e5c0: 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  *p){.  int i;.  
e5d0: 69 66 28 20 21 73 71 6c 69 74 65 33 57 68 65 72  if( !sqlite3Wher
e5e0: 65 54 72 61 63 65 20 29 20 72 65 74 75 72 6e 3b  eTrace ) return;
e5f0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
e600: 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b  >nConstraint; i+
e610: 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  +){.    sqlite3D
e620: 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 75 73  ebugPrintf("  us
e630: 61 67 65 5b 25 64 5d 3a 20 61 72 67 76 49 64 78  age[%d]: argvIdx
e640: 3d 25 64 20 6f 6d 69 74 3d 25 64 5c 6e 22 2c 0a  =%d omit=%d\n",.
e650: 20 20 20 20 20 20 20 69 2c 0a 20 20 20 20 20 20         i,.      
e660: 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55   p->aConstraintU
e670: 73 61 67 65 5b 69 5d 2e 61 72 67 76 49 6e 64 65  sage[i].argvInde
e680: 78 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f  x,.       p->aCo
e690: 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69 5d  nstraintUsage[i]
e6a0: 2e 6f 6d 69 74 29 3b 0a 20 20 7d 0a 20 20 73 71  .omit);.  }.  sq
e6b0: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
e6c0: 28 22 20 20 69 64 78 4e 75 6d 3d 25 64 5c 6e 22  ("  idxNum=%d\n"
e6d0: 2c 20 70 2d 3e 69 64 78 4e 75 6d 29 3b 0a 20 20  , p->idxNum);.  
e6e0: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
e6f0: 74 66 28 22 20 20 69 64 78 53 74 72 3d 25 73 5c  tf("  idxStr=%s\
e700: 6e 22 2c 20 70 2d 3e 69 64 78 53 74 72 29 3b 0a  n", p->idxStr);.
e710: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
e720: 69 6e 74 66 28 22 20 20 6f 72 64 65 72 42 79 43  intf("  orderByC
e730: 6f 6e 73 75 6d 65 64 3d 25 64 5c 6e 22 2c 20 70  onsumed=%d\n", p
e740: 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65  ->orderByConsume
e750: 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62  d);.  sqlite3Deb
e760: 75 67 50 72 69 6e 74 66 28 22 20 20 65 73 74 69  ugPrintf("  esti
e770: 6d 61 74 65 64 43 6f 73 74 3d 25 67 5c 6e 22 2c  matedCost=%g\n",
e780: 20 70 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73   p->estimatedCos
e790: 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62  t);.  sqlite3Deb
e7a0: 75 67 50 72 69 6e 74 66 28 22 20 20 65 73 74 69  ugPrintf("  esti
e7b0: 6d 61 74 65 64 52 6f 77 73 3d 25 6c 6c 64 5c 6e  matedRows=%lld\n
e7c0: 22 2c 20 70 2d 3e 65 73 74 69 6d 61 74 65 64 52  ", p->estimatedR
e7d0: 6f 77 73 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64  ows);.}.#else.#d
e7e0: 65 66 69 6e 65 20 54 52 41 43 45 5f 49 44 58 5f  efine TRACE_IDX_
e7f0: 49 4e 50 55 54 53 28 41 29 0a 23 64 65 66 69 6e  INPUTS(A).#defin
e800: 65 20 54 52 41 43 45 5f 49 44 58 5f 4f 55 54 50  e TRACE_IDX_OUTP
e810: 55 54 53 28 41 29 0a 23 65 6e 64 69 66 0a 0a 23  UTS(A).#endif..#
e820: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
e830: 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44  IT_AUTOMATIC_IND
e840: 45 58 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  EX./*.** Return 
e850: 54 52 55 45 20 69 66 20 74 68 65 20 57 48 45 52  TRUE if the WHER
e860: 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20 70 54  E clause term pT
e870: 65 72 6d 20 69 73 20 6f 66 20 61 20 66 6f 72 6d  erm is of a form
e880: 20 77 68 65 72 65 20 69 74 0a 2a 2a 20 63 6f 75   where it.** cou
e890: 6c 64 20 62 65 20 75 73 65 64 20 77 69 74 68 20  ld be used with 
e8a0: 61 6e 20 69 6e 64 65 78 20 74 6f 20 61 63 63 65  an index to acce
e8b0: 73 73 20 70 53 72 63 2c 20 61 73 73 75 6d 69 6e  ss pSrc, assumin
e8c0: 67 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65  g an appropriate
e8d0: 0a 2a 2a 20 69 6e 64 65 78 20 65 78 69 73 74 65  .** index existe
e8e0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
e8f0: 20 74 65 72 6d 43 61 6e 44 72 69 76 65 49 6e 64   termCanDriveInd
e900: 65 78 28 0a 20 20 57 68 65 72 65 54 65 72 6d 20  ex(.  WhereTerm 
e910: 2a 70 54 65 72 6d 2c 20 20 20 20 20 20 20 20 20  *pTerm,         
e920: 20 20 20 20 20 2f 2a 20 57 48 45 52 45 20 63 6c       /* WHERE cl
e930: 61 75 73 65 20 74 65 72 6d 20 74 6f 20 63 68 65  ause term to che
e940: 63 6b 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  ck */.  struct S
e950: 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72  rcList_item *pSr
e960: 63 2c 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20  c,     /* Table 
e970: 77 65 20 61 72 65 20 74 72 79 69 6e 67 20 74 6f  we are trying to
e980: 20 61 63 63 65 73 73 20 2a 2f 0a 20 20 42 69 74   access */.  Bit
e990: 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 20 20 20  mask notReady   
e9a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
e9b0: 61 62 6c 65 73 20 69 6e 20 6f 75 74 65 72 20 6c  ables in outer l
e9c0: 6f 6f 70 73 20 6f 66 20 74 68 65 20 6a 6f 69 6e  oops of the join
e9d0: 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 61 66   */.){.  char af
e9e0: 66 3b 0a 20 20 69 66 28 20 70 54 65 72 6d 2d 3e  f;.  if( pTerm->
e9f0: 6c 65 66 74 43 75 72 73 6f 72 21 3d 70 53 72 63  leftCursor!=pSrc
ea00: 2d 3e 69 43 75 72 73 6f 72 20 29 20 72 65 74 75  ->iCursor ) retu
ea10: 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 70 54 65  rn 0;.  if( (pTe
ea20: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
ea30: 57 4f 5f 45 51 29 3d 3d 30 20 29 20 72 65 74 75  WO_EQ)==0 ) retu
ea40: 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 70 54 65  rn 0;.  if( (pTe
ea50: 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20  rm->prereqRight 
ea60: 26 20 6e 6f 74 52 65 61 64 79 29 21 3d 30 20 29  & notReady)!=0 )
ea70: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
ea80: 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f   pTerm->u.leftCo
ea90: 6c 75 6d 6e 3c 30 20 29 20 72 65 74 75 72 6e 20  lumn<0 ) return 
eaa0: 30 3b 0a 20 20 61 66 66 20 3d 20 70 53 72 63 2d  0;.  aff = pSrc-
eab0: 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 65 72  >pTab->aCol[pTer
eac0: 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 5d  m->u.leftColumn]
ead0: 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 69 66 28  .affinity;.  if(
eae0: 20 21 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66   !sqlite3IndexAf
eaf0: 66 69 6e 69 74 79 4f 6b 28 70 54 65 72 6d 2d 3e  finityOk(pTerm->
eb00: 70 45 78 70 72 2c 20 61 66 66 29 20 29 20 72 65  pExpr, aff) ) re
eb10: 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e  turn 0;.  return
eb20: 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23   1;.}.#endif...#
eb30: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
eb40: 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44  IT_AUTOMATIC_IND
eb50: 45 58 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  EX./*.** Generat
eb60: 65 20 63 6f 64 65 20 74 6f 20 63 6f 6e 73 74 72  e code to constr
eb70: 75 63 74 20 74 68 65 20 49 6e 64 65 78 20 6f 62  uct the Index ob
eb80: 6a 65 63 74 20 66 6f 72 20 61 6e 20 61 75 74 6f  ject for an auto
eb90: 6d 61 74 69 63 20 69 6e 64 65 78 0a 2a 2a 20 61  matic index.** a
eba0: 6e 64 20 74 6f 20 73 65 74 20 75 70 20 74 68 65  nd to set up the
ebb0: 20 57 68 65 72 65 4c 65 76 65 6c 20 6f 62 6a 65   WhereLevel obje
ebc0: 63 74 20 70 4c 65 76 65 6c 20 73 6f 20 74 68 61  ct pLevel so tha
ebd0: 74 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72  t the code gener
ebe0: 61 74 6f 72 0a 2a 2a 20 6d 61 6b 65 73 20 75 73  ator.** makes us
ebf0: 65 20 6f 66 20 74 68 65 20 61 75 74 6f 6d 61 74  e of the automat
ec00: 69 63 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61  ic index..*/.sta
ec10: 74 69 63 20 76 6f 69 64 20 63 6f 6e 73 74 72 75  tic void constru
ec20: 63 74 41 75 74 6f 6d 61 74 69 63 49 6e 64 65 78  ctAutomaticIndex
ec30: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
ec40: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
ec50: 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63  /* The parsing c
ec60: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72  ontext */.  Wher
ec70: 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20  eClause *pWC,   
ec80: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57          /* The W
ec90: 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
eca0: 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
ecb0: 69 74 65 6d 20 2a 70 53 72 63 2c 20 20 2f 2a 20  item *pSrc,  /* 
ecc0: 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  The FROM clause 
ecd0: 74 65 72 6d 20 74 6f 20 67 65 74 20 74 68 65 20  term to get the 
ece0: 6e 65 78 74 20 69 6e 64 65 78 20 2a 2f 0a 20 20  next index */.  
ecf0: 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79  Bitmask notReady
ed00: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d  ,           /* M
ed10: 61 73 6b 20 6f 66 20 63 75 72 73 6f 72 73 20 74  ask of cursors t
ed20: 68 61 74 20 61 72 65 20 6e 6f 74 20 61 76 61 69  hat are not avai
ed30: 6c 61 62 6c 65 20 2a 2f 0a 20 20 57 68 65 72 65  lable */.  Where
ed40: 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 20 20 20  Level *pLevel   
ed50: 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
ed60: 6e 65 77 20 69 6e 64 65 78 20 68 65 72 65 20 2a  new index here *
ed70: 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 4b 65 79 43  /.){.  int nKeyC
ed80: 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ol;             
ed90: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
eda0: 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 63  columns in the c
edb0: 6f 6e 73 74 72 75 63 74 65 64 20 69 6e 64 65 78  onstructed index
edc0: 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
edd0: 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20  *pTerm;         
ede0: 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 74 65    /* A single te
edf0: 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  rm of the WHERE 
ee00: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72  clause */.  Wher
ee10: 65 54 65 72 6d 20 2a 70 57 43 45 6e 64 3b 20 20  eTerm *pWCEnd;  
ee20: 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f          /* End o
ee30: 66 20 70 57 43 2d 3e 61 5b 5d 20 2a 2f 0a 20 20  f pWC->a[] */.  
ee40: 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20  Index *pIdx;    
ee50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
ee60: 62 6a 65 63 74 20 64 65 73 63 72 69 62 69 6e 67  bject describing
ee70: 20 74 68 65 20 74 72 61 6e 73 69 65 6e 74 20 69   the transient i
ee80: 6e 64 65 78 20 2a 2f 0a 20 20 56 64 62 65 20 2a  ndex */.  Vdbe *
ee90: 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
eea0: 20 20 20 20 20 20 2f 2a 20 50 72 65 70 61 72 65        /* Prepare
eeb0: 64 20 73 74 61 74 65 6d 65 6e 74 20 75 6e 64 65  d statement unde
eec0: 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a  r construction *
eed0: 2f 0a 20 20 69 6e 74 20 61 64 64 72 49 6e 69 74  /.  int addrInit
eee0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
eef0: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
ef00: 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  e initialization
ef10: 20 62 79 70 61 73 73 20 6a 75 6d 70 20 2a 2f 0a   bypass jump */.
ef20: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 3b    Table *pTable;
ef30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ef40: 20 54 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67   The table being
ef50: 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e   indexed */.  in
ef60: 74 20 61 64 64 72 54 6f 70 3b 20 20 20 20 20 20  t addrTop;      
ef70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 70            /* Top
ef80: 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 66 69   of the index fi
ef90: 6c 6c 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74  ll loop */.  int
efa0: 20 72 65 67 52 65 63 6f 72 64 3b 20 20 20 20 20   regRecord;     
efb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69           /* Regi
efc0: 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 61 6e 20  ster holding an 
efd0: 69 6e 64 65 78 20 72 65 63 6f 72 64 20 2a 2f 0a  index record */.
efe0: 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20    int n;        
eff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f000: 20 43 6f 6c 75 6d 6e 20 63 6f 75 6e 74 65 72 20   Column counter 
f010: 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  */.  int i;     
f020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f030: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
f040: 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 42 69 74 43   */.  int mxBitC
f050: 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ol;             
f060: 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 63 6f 6c    /* Maximum col
f070: 75 6d 6e 20 69 6e 20 70 53 72 63 2d 3e 63 6f 6c  umn in pSrc->col
f080: 55 73 65 64 20 2a 2f 0a 20 20 43 6f 6c 6c 53 65  Used */.  CollSe
f090: 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20  q *pColl;       
f0a0: 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69        /* Collati
f0b0: 6e 67 20 73 65 71 75 65 6e 63 65 20 74 6f 20 6f  ng sequence to o
f0c0: 6e 20 61 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20  n a column */.  
f0d0: 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70  WhereLoop *pLoop
f0e0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ;           /* T
f0f0: 68 65 20 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 2a  he Loop object *
f100: 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 6f 74 55 73  /.  char *zNotUs
f110: 65 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ed;             
f120: 2f 2a 20 45 78 74 72 61 20 73 70 61 63 65 20 6f  /* Extra space o
f130: 6e 20 74 68 65 20 65 6e 64 20 6f 66 20 70 49 64  n the end of pId
f140: 78 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 69  x */.  Bitmask i
f150: 64 78 43 6f 6c 73 3b 20 20 20 20 20 20 20 20 20  dxCols;         
f160: 20 20 20 2f 2a 20 42 69 74 6d 61 70 20 6f 66 20     /* Bitmap of 
f170: 63 6f 6c 75 6d 6e 73 20 75 73 65 64 20 66 6f 72  columns used for
f180: 20 69 6e 64 65 78 69 6e 67 20 2a 2f 0a 20 20 42   indexing */.  B
f190: 69 74 6d 61 73 6b 20 65 78 74 72 61 43 6f 6c 73  itmask extraCols
f1a0: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69  ;          /* Bi
f1b0: 74 6d 61 70 20 6f 66 20 61 64 64 69 74 69 6f 6e  tmap of addition
f1c0: 61 6c 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20  al columns */.  
f1d0: 75 38 20 73 65 6e 74 57 61 72 6e 69 6e 67 20 3d  u8 sentWarning =
f1e0: 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54   0;         /* T
f1f0: 72 75 65 20 69 66 20 61 20 77 61 72 6e 6e 69 6e  rue if a warnnin
f200: 67 20 68 61 73 20 62 65 65 6e 20 69 73 73 75 65  g has been issue
f210: 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 50 61  d */.  Expr *pPa
f220: 72 74 69 61 6c 20 3d 20 30 3b 20 20 20 20 20 20  rtial = 0;      
f230: 20 20 20 2f 2a 20 50 61 72 74 69 61 6c 20 49 6e     /* Partial In
f240: 64 65 78 20 45 78 70 72 65 73 73 69 6f 6e 20 2a  dex Expression *
f250: 2f 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75  /.  int iContinu
f260: 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  e = 0;          
f270: 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20  /* Jump here to 
f280: 73 6b 69 70 20 65 78 63 6c 75 64 65 64 20 72 6f  skip excluded ro
f290: 77 73 20 2a 2f 0a 0a 20 20 2f 2a 20 47 65 6e 65  ws */..  /* Gene
f2a0: 72 61 74 65 20 63 6f 64 65 20 74 6f 20 73 6b 69  rate code to ski
f2b0: 70 20 6f 76 65 72 20 74 68 65 20 63 72 65 61 74  p over the creat
f2c0: 69 6f 6e 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  ion and initiali
f2d0: 7a 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a 20 20  zation of the.  
f2e0: 2a 2a 20 74 72 61 6e 73 69 65 6e 74 20 69 6e 64  ** transient ind
f2f0: 65 78 20 6f 6e 20 32 6e 64 20 61 6e 64 20 73 75  ex on 2nd and su
f300: 62 73 65 71 75 65 6e 74 20 69 74 65 72 61 74 69  bsequent iterati
f310: 6f 6e 73 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e  ons of the loop.
f320: 20 2a 2f 0a 20 20 76 20 3d 20 70 50 61 72 73 65   */.  v = pParse
f330: 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72  ->pVdbe;.  asser
f340: 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 61 64 64  t( v!=0 );.  add
f350: 72 49 6e 69 74 20 3d 20 73 71 6c 69 74 65 33 43  rInit = sqlite3C
f360: 6f 64 65 4f 6e 63 65 28 70 50 61 72 73 65 29 3b  odeOnce(pParse);
f370: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
f380: 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 74 68  ;..  /* Count th
f390: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  e number of colu
f3a0: 6d 6e 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65  mns that will be
f3b0: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 69 6e   added to the in
f3c0: 64 65 78 0a 20 20 2a 2a 20 61 6e 64 20 75 73 65  dex.  ** and use
f3d0: 64 20 74 6f 20 6d 61 74 63 68 20 57 48 45 52 45  d to match WHERE
f3e0: 20 63 6c 61 75 73 65 20 63 6f 6e 73 74 72 61 69   clause constrai
f3f0: 6e 74 73 20 2a 2f 0a 20 20 6e 4b 65 79 43 6f 6c  nts */.  nKeyCol
f400: 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65 20 3d   = 0;.  pTable =
f410: 20 70 53 72 63 2d 3e 70 54 61 62 3b 0a 20 20 70   pSrc->pTab;.  p
f420: 57 43 45 6e 64 20 3d 20 26 70 57 43 2d 3e 61 5b  WCEnd = &pWC->a[
f430: 70 57 43 2d 3e 6e 54 65 72 6d 5d 3b 0a 20 20 70  pWC->nTerm];.  p
f440: 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70  Loop = pLevel->p
f450: 57 4c 6f 6f 70 3b 0a 20 20 69 64 78 43 6f 6c 73  WLoop;.  idxCols
f460: 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 54 65 72   = 0;.  for(pTer
f470: 6d 3d 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c  m=pWC->a; pTerm<
f480: 70 57 43 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29  pWCEnd; pTerm++)
f490: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70  {.    Expr *pExp
f4a0: 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  r = pTerm->pExpr
f4b0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45  ;.    assert( !E
f4c0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
f4d0: 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69  Expr, EP_FromJoi
f4e0: 6e 29 20 20 20 20 2f 2a 20 70 72 65 72 65 71 20  n)    /* prereq 
f4f0: 61 6c 77 61 79 73 20 6e 6f 6e 2d 7a 65 72 6f 20  always non-zero 
f500: 2a 2f 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70  */.         || p
f510: 45 78 70 72 2d 3e 69 52 69 67 68 74 4a 6f 69 6e  Expr->iRightJoin
f520: 54 61 62 6c 65 21 3d 70 53 72 63 2d 3e 69 43 75  Table!=pSrc->iCu
f530: 72 73 6f 72 20 20 20 2f 2a 20 20 20 66 6f 72 20  rsor   /*   for 
f540: 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 20  the right-hand  
f550: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 7c 7c 20   */.         || 
f560: 70 4c 6f 6f 70 2d 3e 70 72 65 72 65 71 21 3d 30  pLoop->prereq!=0
f570: 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   );             
f580: 20 20 20 20 20 20 20 20 2f 2a 20 20 20 74 61 62          /*   tab
f590: 6c 65 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49  le of a LEFT JOI
f5a0: 4e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 6f  N */.    if( pLo
f5b0: 6f 70 2d 3e 70 72 65 72 65 71 3d 3d 30 0a 20 20  op->prereq==0.  
f5c0: 20 20 20 26 26 20 28 70 54 65 72 6d 2d 3e 77 74     && (pTerm->wt
f5d0: 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52  Flags & TERM_VIR
f5e0: 54 55 41 4c 29 3d 3d 30 0a 20 20 20 20 20 26 26  TUAL)==0.     &&
f5f0: 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
f600: 79 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d  y(pExpr, EP_From
f610: 4a 6f 69 6e 29 0a 20 20 20 20 20 26 26 20 73 71  Join).     && sq
f620: 6c 69 74 65 33 45 78 70 72 49 73 54 61 62 6c 65  lite3ExprIsTable
f630: 43 6f 6e 73 74 61 6e 74 28 70 45 78 70 72 2c 20  Constant(pExpr, 
f640: 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 29 20 29  pSrc->iCursor) )
f650: 7b 0a 20 20 20 20 20 20 70 50 61 72 74 69 61 6c  {.      pPartial
f660: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e   = sqlite3ExprAn
f670: 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 50  d(pParse->db, pP
f680: 61 72 74 69 61 6c 2c 0a 20 20 20 20 20 20 20 20  artial,.        
f690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f6a0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
f6b0: 78 70 72 44 75 70 28 70 50 61 72 73 65 2d 3e 64  xprDup(pParse->d
f6c0: 62 2c 20 70 45 78 70 72 2c 20 30 29 29 3b 0a 20  b, pExpr, 0));. 
f6d0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 74 65 72     }.    if( ter
f6e0: 6d 43 61 6e 44 72 69 76 65 49 6e 64 65 78 28 70  mCanDriveIndex(p
f6f0: 54 65 72 6d 2c 20 70 53 72 63 2c 20 6e 6f 74 52  Term, pSrc, notR
f700: 65 61 64 79 29 20 29 7b 0a 20 20 20 20 20 20 69  eady) ){.      i
f710: 6e 74 20 69 43 6f 6c 20 3d 20 70 54 65 72 6d 2d  nt iCol = pTerm-
f720: 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20  >u.leftColumn;. 
f730: 20 20 20 20 20 42 69 74 6d 61 73 6b 20 63 4d 61       Bitmask cMa
f740: 73 6b 20 3d 20 69 43 6f 6c 3e 3d 42 4d 53 20 3f  sk = iCol>=BMS ?
f750: 20 4d 41 53 4b 42 49 54 28 42 4d 53 2d 31 29 20   MASKBIT(BMS-1) 
f760: 3a 20 4d 41 53 4b 42 49 54 28 69 43 6f 6c 29 3b  : MASKBIT(iCol);
f770: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
f780: 20 69 43 6f 6c 3d 3d 42 4d 53 20 29 3b 0a 20 20   iCol==BMS );.  
f790: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 43      testcase( iC
f7a0: 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20  ol==BMS-1 );.   
f7b0: 20 20 20 69 66 28 20 21 73 65 6e 74 57 61 72 6e     if( !sentWarn
f7c0: 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ing ){.        s
f7d0: 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54  qlite3_log(SQLIT
f7e0: 45 5f 57 41 52 4e 49 4e 47 5f 41 55 54 4f 49 4e  E_WARNING_AUTOIN
f7f0: 44 45 58 2c 0a 20 20 20 20 20 20 20 20 20 20 20  DEX,.           
f800: 20 22 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65   "automatic inde
f810: 78 20 6f 6e 20 25 73 28 25 73 29 22 2c 20 70 54  x on %s(%s)", pT
f820: 61 62 6c 65 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20  able->zName,.   
f830: 20 20 20 20 20 20 20 20 20 70 54 61 62 6c 65 2d           pTable-
f840: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d  >aCol[iCol].zNam
f850: 65 29 3b 0a 20 20 20 20 20 20 20 20 73 65 6e 74  e);.        sent
f860: 57 61 72 6e 69 6e 67 20 3d 20 31 3b 0a 20 20 20  Warning = 1;.   
f870: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28     }.      if( (
f880: 69 64 78 43 6f 6c 73 20 26 20 63 4d 61 73 6b 29  idxCols & cMask)
f890: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ==0 ){.        i
f8a0: 66 28 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69  f( whereLoopResi
f8b0: 7a 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  ze(pParse->db, p
f8c0: 4c 6f 6f 70 2c 20 6e 4b 65 79 43 6f 6c 2b 31 29  Loop, nKeyCol+1)
f8d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
f8e0: 74 6f 20 65 6e 64 5f 61 75 74 6f 5f 69 6e 64 65  to end_auto_inde
f8f0: 78 5f 63 72 65 61 74 65 3b 0a 20 20 20 20 20 20  x_create;.      
f900: 20 20 7d 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f    }.        pLoo
f910: 70 2d 3e 61 4c 54 65 72 6d 5b 6e 4b 65 79 43 6f  p->aLTerm[nKeyCo
f920: 6c 2b 2b 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20  l++] = pTerm;.  
f930: 20 20 20 20 20 20 69 64 78 43 6f 6c 73 20 7c 3d        idxCols |=
f940: 20 63 4d 61 73 6b 3b 0a 20 20 20 20 20 20 7d 0a   cMask;.      }.
f950: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65      }.  }.  asse
f960: 72 74 28 20 6e 4b 65 79 43 6f 6c 3e 30 20 29 3b  rt( nKeyCol>0 );
f970: 0a 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65  .  pLoop->u.btre
f980: 65 2e 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e 6e  e.nEq = pLoop->n
f990: 4c 54 65 72 6d 20 3d 20 6e 4b 65 79 43 6f 6c 3b  LTerm = nKeyCol;
f9a0: 0a 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  .  pLoop->wsFlag
f9b0: 73 20 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  s = WHERE_COLUMN
f9c0: 5f 45 51 20 7c 20 57 48 45 52 45 5f 49 44 58 5f  _EQ | WHERE_IDX_
f9d0: 4f 4e 4c 59 20 7c 20 57 48 45 52 45 5f 49 4e 44  ONLY | WHERE_IND
f9e0: 45 58 45 44 0a 20 20 20 20 20 20 20 20 20 20 20  EXED.           
f9f0: 20 20 20 20 20 20 20 20 20 20 7c 20 57 48 45 52            | WHER
fa00: 45 5f 41 55 54 4f 5f 49 4e 44 45 58 3b 0a 0a 20  E_AUTO_INDEX;.. 
fa10: 20 2f 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75   /* Count the nu
fa20: 6d 62 65 72 20 6f 66 20 61 64 64 69 74 69 6f 6e  mber of addition
fa30: 61 6c 20 63 6f 6c 75 6d 6e 73 20 6e 65 65 64 65  al columns neede
fa40: 64 20 74 6f 20 63 72 65 61 74 65 20 61 0a 20 20  d to create a.  
fa50: 2a 2a 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65  ** covering inde
fa60: 78 2e 20 20 41 20 22 63 6f 76 65 72 69 6e 67 20  x.  A "covering 
fa70: 69 6e 64 65 78 22 20 69 73 20 61 6e 20 69 6e 64  index" is an ind
fa80: 65 78 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ex that contains
fa90: 20 61 6c 6c 0a 20 20 2a 2a 20 63 6f 6c 75 6d 6e   all.  ** column
faa0: 73 20 74 68 61 74 20 61 72 65 20 6e 65 65 64 65  s that are neede
fab0: 64 20 62 79 20 74 68 65 20 71 75 65 72 79 2e 20  d by the query. 
fac0: 20 57 69 74 68 20 61 20 63 6f 76 65 72 69 6e 67   With a covering
fad0: 20 69 6e 64 65 78 2c 20 74 68 65 0a 20 20 2a 2a   index, the.  **
fae0: 20 6f 72 69 67 69 6e 61 6c 20 74 61 62 6c 65 20   original table 
faf0: 6e 65 76 65 72 20 6e 65 65 64 73 20 74 6f 20 62  never needs to b
fb00: 65 20 61 63 63 65 73 73 65 64 2e 20 20 41 75 74  e accessed.  Aut
fb10: 6f 6d 61 74 69 63 20 69 6e 64 69 63 65 73 20 6d  omatic indices m
fb20: 75 73 74 0a 20 20 2a 2a 20 62 65 20 61 20 63 6f  ust.  ** be a co
fb30: 76 65 72 69 6e 67 20 69 6e 64 65 78 20 62 65 63  vering index bec
fb40: 61 75 73 65 20 74 68 65 20 69 6e 64 65 78 20 77  ause the index w
fb50: 69 6c 6c 20 6e 6f 74 20 62 65 20 75 70 64 61 74  ill not be updat
fb60: 65 64 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 6f  ed if the.  ** o
fb70: 72 69 67 69 6e 61 6c 20 74 61 62 6c 65 20 63 68  riginal table ch
fb80: 61 6e 67 65 73 20 61 6e 64 20 74 68 65 20 69 6e  anges and the in
fb90: 64 65 78 20 61 6e 64 20 74 61 62 6c 65 20 63 61  dex and table ca
fba0: 6e 6e 6f 74 20 62 6f 74 68 20 62 65 20 75 73 65  nnot both be use
fbb0: 64 0a 20 20 2a 2a 20 69 66 20 74 68 65 79 20 67  d.  ** if they g
fbc0: 6f 20 6f 75 74 20 6f 66 20 73 79 6e 63 2e 0a 20  o out of sync.. 
fbd0: 20 2a 2f 0a 20 20 65 78 74 72 61 43 6f 6c 73 20   */.  extraCols 
fbe0: 3d 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20  = pSrc->colUsed 
fbf0: 26 20 28 7e 69 64 78 43 6f 6c 73 20 7c 20 4d 41  & (~idxCols | MA
fc00: 53 4b 42 49 54 28 42 4d 53 2d 31 29 29 3b 0a 20  SKBIT(BMS-1));. 
fc10: 20 6d 78 42 69 74 43 6f 6c 20 3d 20 4d 49 4e 28   mxBitCol = MIN(
fc20: 42 4d 53 2d 31 2c 70 54 61 62 6c 65 2d 3e 6e 43  BMS-1,pTable->nC
fc30: 6f 6c 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  ol);.  testcase(
fc40: 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3d 3d 42   pTable->nCol==B
fc50: 4d 53 2d 31 20 29 3b 0a 20 20 74 65 73 74 63 61  MS-1 );.  testca
fc60: 73 65 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c  se( pTable->nCol
fc70: 3d 3d 42 4d 53 2d 32 20 29 3b 0a 20 20 66 6f 72  ==BMS-2 );.  for
fc80: 28 69 3d 30 3b 20 69 3c 6d 78 42 69 74 43 6f 6c  (i=0; i<mxBitCol
fc90: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
fca0: 65 78 74 72 61 43 6f 6c 73 20 26 20 4d 41 53 4b  extraCols & MASK
fcb0: 42 49 54 28 69 29 20 29 20 6e 4b 65 79 43 6f 6c  BIT(i) ) nKeyCol
fcc0: 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53  ++;.  }.  if( pS
fcd0: 72 63 2d 3e 63 6f 6c 55 73 65 64 20 26 20 4d 41  rc->colUsed & MA
fce0: 53 4b 42 49 54 28 42 4d 53 2d 31 29 20 29 7b 0a  SKBIT(BMS-1) ){.
fcf0: 20 20 20 20 6e 4b 65 79 43 6f 6c 20 2b 3d 20 70      nKeyCol += p
fd00: 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 2d 20 42 4d  Table->nCol - BM
fd10: 53 20 2b 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  S + 1;.  }..  /*
fd20: 20 43 6f 6e 73 74 72 75 63 74 20 74 68 65 20 49   Construct the I
fd30: 6e 64 65 78 20 6f 62 6a 65 63 74 20 74 6f 20 64  ndex object to d
fd40: 65 73 63 72 69 62 65 20 74 68 69 73 20 69 6e 64  escribe this ind
fd50: 65 78 20 2a 2f 0a 20 20 70 49 64 78 20 3d 20 73  ex */.  pIdx = s
fd60: 71 6c 69 74 65 33 41 6c 6c 6f 63 61 74 65 49 6e  qlite3AllocateIn
fd70: 64 65 78 4f 62 6a 65 63 74 28 70 50 61 72 73 65  dexObject(pParse
fd80: 2d 3e 64 62 2c 20 6e 4b 65 79 43 6f 6c 2b 31 2c  ->db, nKeyCol+1,
fd90: 20 30 2c 20 26 7a 4e 6f 74 55 73 65 64 29 3b 0a   0, &zNotUsed);.
fda0: 20 20 69 66 28 20 70 49 64 78 3d 3d 30 20 29 20    if( pIdx==0 ) 
fdb0: 67 6f 74 6f 20 65 6e 64 5f 61 75 74 6f 5f 69 6e  goto end_auto_in
fdc0: 64 65 78 5f 63 72 65 61 74 65 3b 0a 20 20 70 4c  dex_create;.  pL
fdd0: 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  oop->u.btree.pIn
fde0: 64 65 78 20 3d 20 70 49 64 78 3b 0a 20 20 70 49  dex = pIdx;.  pI
fdf0: 64 78 2d 3e 7a 4e 61 6d 65 20 3d 20 22 61 75 74  dx->zName = "aut
fe00: 6f 2d 69 6e 64 65 78 22 3b 0a 20 20 70 49 64 78  o-index";.  pIdx
fe10: 2d 3e 70 54 61 62 6c 65 20 3d 20 70 54 61 62 6c  ->pTable = pTabl
fe20: 65 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 69 64  e;.  n = 0;.  id
fe30: 78 43 6f 6c 73 20 3d 20 30 3b 0a 20 20 66 6f 72  xCols = 0;.  for
fe40: 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 70  (pTerm=pWC->a; p
fe50: 54 65 72 6d 3c 70 57 43 45 6e 64 3b 20 70 54 65  Term<pWCEnd; pTe
fe60: 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 74  rm++){.    if( t
fe70: 65 72 6d 43 61 6e 44 72 69 76 65 49 6e 64 65 78  ermCanDriveIndex
fe80: 28 70 54 65 72 6d 2c 20 70 53 72 63 2c 20 6e 6f  (pTerm, pSrc, no
fe90: 74 52 65 61 64 79 29 20 29 7b 0a 20 20 20 20 20  tReady) ){.     
fea0: 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 54 65 72   int iCol = pTer
feb0: 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b  m->u.leftColumn;
fec0: 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 63  .      Bitmask c
fed0: 4d 61 73 6b 20 3d 20 69 43 6f 6c 3e 3d 42 4d 53  Mask = iCol>=BMS
fee0: 20 3f 20 4d 41 53 4b 42 49 54 28 42 4d 53 2d 31   ? MASKBIT(BMS-1
fef0: 29 20 3a 20 4d 41 53 4b 42 49 54 28 69 43 6f 6c  ) : MASKBIT(iCol
ff00: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
ff10: 65 28 20 69 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29  e( iCol==BMS-1 )
ff20: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
ff30: 28 20 69 43 6f 6c 3d 3d 42 4d 53 20 29 3b 0a 20  ( iCol==BMS );. 
ff40: 20 20 20 20 20 69 66 28 20 28 69 64 78 43 6f 6c       if( (idxCol
ff50: 73 20 26 20 63 4d 61 73 6b 29 3d 3d 30 20 29 7b  s & cMask)==0 ){
ff60: 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70  .        Expr *p
ff70: 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  X = pTerm->pExpr
ff80: 3b 0a 20 20 20 20 20 20 20 20 69 64 78 43 6f 6c  ;.        idxCol
ff90: 73 20 7c 3d 20 63 4d 61 73 6b 3b 0a 20 20 20 20  s |= cMask;.    
ffa0: 20 20 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75      pIdx->aiColu
ffb0: 6d 6e 5b 6e 5d 20 3d 20 70 54 65 72 6d 2d 3e 75  mn[n] = pTerm->u
ffc0: 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20  .leftColumn;.   
ffd0: 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c       pColl = sql
ffe0: 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72  ite3BinaryCompar
fff0: 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  eCollSeq(pParse,
10000 20 70 58 2d 3e 70 4c 65 66 74 2c 20 70 58 2d 3e   pX->pLeft, pX->
10010 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20  pRight);.       
10020 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d   pIdx->azColl[n]
10030 20 3d 20 70 43 6f 6c 6c 20 3f 20 70 43 6f 6c 6c   = pColl ? pColl
10040 2d 3e 7a 4e 61 6d 65 20 3a 20 22 42 49 4e 41 52  ->zName : "BINAR
10050 59 22 3b 0a 20 20 20 20 20 20 20 20 6e 2b 2b 3b  Y";.        n++;
10060 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
10070 20 7d 0a 20 20 61 73 73 65 72 74 28 20 28 75 33   }.  assert( (u3
10080 32 29 6e 3d 3d 70 4c 6f 6f 70 2d 3e 75 2e 62 74  2)n==pLoop->u.bt
10090 72 65 65 2e 6e 45 71 20 29 3b 0a 0a 20 20 2f 2a  ree.nEq );..  /*
100a0 20 41 64 64 20 61 64 64 69 74 69 6f 6e 61 6c 20   Add additional 
100b0 63 6f 6c 75 6d 6e 73 20 6e 65 65 64 65 64 20 74  columns needed t
100c0 6f 20 6d 61 6b 65 20 74 68 65 20 61 75 74 6f 6d  o make the autom
100d0 61 74 69 63 20 69 6e 64 65 78 20 69 6e 74 6f 0a  atic index into.
100e0 20 20 2a 2a 20 61 20 63 6f 76 65 72 69 6e 67 20    ** a covering 
100f0 69 6e 64 65 78 20 2a 2f 0a 20 20 66 6f 72 28 69  index */.  for(i
10100 3d 30 3b 20 69 3c 6d 78 42 69 74 43 6f 6c 3b 20  =0; i<mxBitCol; 
10110 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 65 78  i++){.    if( ex
10120 74 72 61 43 6f 6c 73 20 26 20 4d 41 53 4b 42 49  traCols & MASKBI
10130 54 28 69 29 20 29 7b 0a 20 20 20 20 20 20 70 49  T(i) ){.      pI
10140 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20  dx->aiColumn[n] 
10150 3d 20 69 3b 0a 20 20 20 20 20 20 70 49 64 78 2d  = i;.      pIdx-
10160 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 22 42 49  >azColl[n] = "BI
10170 4e 41 52 59 22 3b 0a 20 20 20 20 20 20 6e 2b 2b  NARY";.      n++
10180 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
10190 28 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20  ( pSrc->colUsed 
101a0 26 20 4d 41 53 4b 42 49 54 28 42 4d 53 2d 31 29  & MASKBIT(BMS-1)
101b0 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 42 4d   ){.    for(i=BM
101c0 53 2d 31 3b 20 69 3c 70 54 61 62 6c 65 2d 3e 6e  S-1; i<pTable->n
101d0 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
101e0 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
101f0 6e 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20 70 49  n] = i;.      pI
10200 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20  dx->azColl[n] = 
10210 22 42 49 4e 41 52 59 22 3b 0a 20 20 20 20 20 20  "BINARY";.      
10220 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n++;.    }.  }. 
10230 20 61 73 73 65 72 74 28 20 6e 3d 3d 6e 4b 65 79   assert( n==nKey
10240 43 6f 6c 20 29 3b 0a 20 20 70 49 64 78 2d 3e 61  Col );.  pIdx->a
10250 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 2d 31 3b  iColumn[n] = -1;
10260 0a 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b  .  pIdx->azColl[
10270 6e 5d 20 3d 20 22 42 49 4e 41 52 59 22 3b 0a 0a  n] = "BINARY";..
10280 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20    /* Create the 
10290 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20  automatic index 
102a0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 4c 65  */.  assert( pLe
102b0 76 65 6c 2d 3e 69 49 64 78 43 75 72 3e 3d 30 20  vel->iIdxCur>=0 
102c0 29 3b 0a 20 20 70 4c 65 76 65 6c 2d 3e 69 49 64  );.  pLevel->iId
102d0 78 43 75 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e  xCur = pParse->n
102e0 54 61 62 2b 2b 3b 0a 20 20 73 71 6c 69 74 65 33  Tab++;.  sqlite3
102f0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
10300 5f 4f 70 65 6e 41 75 74 6f 69 6e 64 65 78 2c 20  _OpenAutoindex, 
10310 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 2c  pLevel->iIdxCur,
10320 20 6e 4b 65 79 43 6f 6c 2b 31 29 3b 0a 20 20 73   nKeyCol+1);.  s
10330 71 6c 69 74 65 33 56 64 62 65 53 65 74 50 34 4b  qlite3VdbeSetP4K
10340 65 79 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70  eyInfo(pParse, p
10350 49 64 78 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d  Idx);.  VdbeComm
10360 65 6e 74 28 28 76 2c 20 22 66 6f 72 20 25 73 22  ent((v, "for %s"
10370 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29  , pTable->zName)
10380 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 74 68  );..  /* Fill th
10390 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65  e automatic inde
103a0 78 20 77 69 74 68 20 63 6f 6e 74 65 6e 74 20 2a  x with content *
103b0 2f 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43  /.  sqlite3ExprC
103c0 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29  achePush(pParse)
103d0 3b 0a 20 20 61 64 64 72 54 6f 70 20 3d 20 73 71  ;.  addrTop = sq
103e0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
103f0 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 70 4c  v, OP_Rewind, pL
10400 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 29 3b 20  evel->iTabCur); 
10410 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
10420 0a 20 20 69 66 28 20 70 50 61 72 74 69 61 6c 20  .  if( pPartial 
10430 29 7b 0a 20 20 20 20 69 43 6f 6e 74 69 6e 75 65  ){.    iContinue
10440 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
10450 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
10460 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
10470 73 65 28 70 50 61 72 73 65 2c 20 70 50 61 72 74  se(pParse, pPart
10480 69 61 6c 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20  ial, iContinue, 
10490 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
104a0 4c 29 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 77  L);.    pLoop->w
104b0 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f  sFlags |= WHERE_
104c0 50 41 52 54 49 41 4c 49 44 58 3b 0a 20 20 7d 0a  PARTIALIDX;.  }.
104d0 20 20 72 65 67 52 65 63 6f 72 64 20 3d 20 73 71    regRecord = sq
104e0 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
104f0 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74  pParse);.  sqlit
10500 65 33 47 65 6e 65 72 61 74 65 49 6e 64 65 78 4b  e3GenerateIndexK
10510 65 79 28 70 50 61 72 73 65 2c 20 70 49 64 78 2c  ey(pParse, pIdx,
10520 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72   pLevel->iTabCur
10530 2c 20 72 65 67 52 65 63 6f 72 64 2c 20 30 2c 20  , regRecord, 0, 
10540 30 2c 20 30 2c 20 30 29 3b 0a 20 20 73 71 6c 69  0, 0, 0);.  sqli
10550 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
10560 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 70   OP_IdxInsert, p
10570 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 2c 20  Level->iIdxCur, 
10580 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 73 71  regRecord);.  sq
10590 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
105a0 35 28 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45 53  5(v, OPFLAG_USES
105b0 45 45 4b 52 45 53 55 4c 54 29 3b 0a 20 20 69 66  EEKRESULT);.  if
105c0 28 20 70 50 61 72 74 69 61 6c 20 29 20 73 71 6c  ( pPartial ) sql
105d0 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
105e0 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 69 6e 75  abel(v, iContinu
105f0 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  e);.  sqlite3Vdb
10600 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
10610 78 74 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62  xt, pLevel->iTab
10620 43 75 72 2c 20 61 64 64 72 54 6f 70 2b 31 29 3b  Cur, addrTop+1);
10630 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
10640 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  ;.  sqlite3VdbeC
10650 68 61 6e 67 65 50 35 28 76 2c 20 53 51 4c 49 54  hangeP5(v, SQLIT
10660 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 41 55 54  E_STMTSTATUS_AUT
10670 4f 49 4e 44 45 58 29 3b 0a 20 20 73 71 6c 69 74  OINDEX);.  sqlit
10680 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
10690 2c 20 61 64 64 72 54 6f 70 29 3b 0a 20 20 73 71  , addrTop);.  sq
106a0 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
106b0 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 52  Reg(pParse, regR
106c0 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65  ecord);.  sqlite
106d0 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50  3ExprCachePop(pP
106e0 61 72 73 65 29 3b 0a 20 20 0a 20 20 2f 2a 20 4a  arse);.  .  /* J
106f0 75 6d 70 20 68 65 72 65 20 77 68 65 6e 20 73 6b  ump here when sk
10700 69 70 70 69 6e 67 20 74 68 65 20 69 6e 69 74 69  ipping the initi
10710 61 6c 69 7a 61 74 69 6f 6e 20 2a 2f 0a 20 20 73  alization */.  s
10720 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
10730 72 65 28 76 2c 20 61 64 64 72 49 6e 69 74 29 3b  re(v, addrInit);
10740 0a 0a 65 6e 64 5f 61 75 74 6f 5f 69 6e 64 65 78  ..end_auto_index
10750 5f 63 72 65 61 74 65 3a 0a 20 20 73 71 6c 69 74  _create:.  sqlit
10760 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 50 61  e3ExprDelete(pPa
10770 72 73 65 2d 3e 64 62 2c 20 70 50 61 72 74 69 61  rse->db, pPartia
10780 6c 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  l);.}.#endif /* 
10790 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
107a0 4d 41 54 49 43 5f 49 4e 44 45 58 20 2a 2f 0a 0a  MATIC_INDEX */..
107b0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
107c0 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
107d0 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
107e0 61 6e 64 20 70 6f 70 75 6c 61 74 65 20 61 6e 20  and populate an 
107f0 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
10800 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20 49 74  fo structure. It
10810 20 69 73 20 74 68 65 20 0a 2a 2a 20 72 65 73 70   is the .** resp
10820 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68  onsibility of th
10830 65 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e  e caller to even
10840 74 75 61 6c 6c 79 20 72 65 6c 65 61 73 65 20 74  tually release t
10850 68 65 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20  he structure.** 
10860 62 79 20 70 61 73 73 69 6e 67 20 74 68 65 20 70  by passing the p
10870 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20  ointer returned 
10880 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
10890 20 74 6f 20 73 71 6c 69 74 65 33 5f 66 72 65 65   to sqlite3_free
108a0 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71  ()..*/.static sq
108b0 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
108c0 20 2a 61 6c 6c 6f 63 61 74 65 49 6e 64 65 78 49   *allocateIndexI
108d0 6e 66 6f 28 0a 20 20 50 61 72 73 65 20 2a 70 50  nfo(.  Parse *pP
108e0 61 72 73 65 2c 0a 20 20 57 68 65 72 65 43 6c 61  arse,.  WhereCla
108f0 75 73 65 20 2a 70 57 43 2c 0a 20 20 73 74 72 75  use *pWC,.  stru
10900 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
10910 2a 70 53 72 63 2c 0a 20 20 45 78 70 72 4c 69 73  *pSrc,.  ExprLis
10920 74 20 2a 70 4f 72 64 65 72 42 79 0a 29 7b 0a 20  t *pOrderBy.){. 
10930 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74   int i, j;.  int
10940 20 6e 54 65 72 6d 3b 0a 20 20 73 74 72 75 63 74   nTerm;.  struct
10950 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63   sqlite3_index_c
10960 6f 6e 73 74 72 61 69 6e 74 20 2a 70 49 64 78 43  onstraint *pIdxC
10970 6f 6e 73 3b 0a 20 20 73 74 72 75 63 74 20 73 71  ons;.  struct sq
10980 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65  lite3_index_orde
10990 72 62 79 20 2a 70 49 64 78 4f 72 64 65 72 42 79  rby *pIdxOrderBy
109a0 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69 74  ;.  struct sqlit
109b0 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61  e3_index_constra
109c0 69 6e 74 5f 75 73 61 67 65 20 2a 70 55 73 61 67  int_usage *pUsag
109d0 65 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  e;.  WhereTerm *
109e0 70 54 65 72 6d 3b 0a 20 20 69 6e 74 20 6e 4f 72  pTerm;.  int nOr
109f0 64 65 72 42 79 3b 0a 20 20 73 71 6c 69 74 65 33  derBy;.  sqlite3
10a00 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49 64  _index_info *pId
10a10 78 49 6e 66 6f 3b 0a 0a 20 20 2f 2a 20 43 6f 75  xInfo;..  /* Cou
10a20 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  nt the number of
10a30 20 70 6f 73 73 69 62 6c 65 20 57 48 45 52 45 20   possible WHERE 
10a40 63 6c 61 75 73 65 20 63 6f 6e 73 74 72 61 69 6e  clause constrain
10a50 74 73 20 72 65 66 65 72 72 69 6e 67 0a 20 20 2a  ts referring.  *
10a60 2a 20 74 6f 20 74 68 69 73 20 76 69 72 74 75 61  * to this virtua
10a70 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 66 6f 72  l table */.  for
10a80 28 69 3d 6e 54 65 72 6d 3d 30 2c 20 70 54 65 72  (i=nTerm=0, pTer
10a90 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c 70 57 43 2d  m=pWC->a; i<pWC-
10aa0 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c 20 70 54 65  >nTerm; i++, pTe
10ab0 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70  rm++){.    if( p
10ac0 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
10ad0 20 21 3d 20 70 53 72 63 2d 3e 69 43 75 72 73 6f   != pSrc->iCurso
10ae0 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  r ) continue;.  
10af0 20 20 61 73 73 65 72 74 28 20 49 73 50 6f 77 65    assert( IsPowe
10b00 72 4f 66 54 77 6f 28 70 54 65 72 6d 2d 3e 65 4f  rOfTwo(pTerm->eO
10b10 70 65 72 61 74 6f 72 20 26 20 7e 57 4f 5f 45 51  perator & ~WO_EQ
10b20 55 49 56 29 20 29 3b 0a 20 20 20 20 74 65 73 74  UIV) );.    test
10b30 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70  case( pTerm->eOp
10b40 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29  erator & WO_IN )
10b50 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
10b60 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
10b70 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a   & WO_ISNULL );.
10b80 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
10b90 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
10ba0 20 57 4f 5f 41 4c 4c 20 29 3b 0a 20 20 20 20 69   WO_ALL );.    i
10bb0 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  f( (pTerm->eOper
10bc0 61 74 6f 72 20 26 20 7e 28 57 4f 5f 49 53 4e 55  ator & ~(WO_ISNU
10bd0 4c 4c 7c 57 4f 5f 45 51 55 49 56 29 29 3d 3d 30  LL|WO_EQUIV))==0
10be0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
10bf0 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c   if( pTerm->wtFl
10c00 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c  ags & TERM_VNULL
10c10 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
10c20 20 6e 54 65 72 6d 2b 2b 3b 0a 20 20 7d 0a 0a 20   nTerm++;.  }.. 
10c30 20 2f 2a 20 49 66 20 74 68 65 20 4f 52 44 45 52   /* If the ORDER
10c40 20 42 59 20 63 6c 61 75 73 65 20 63 6f 6e 74 61   BY clause conta
10c50 69 6e 73 20 6f 6e 6c 79 20 63 6f 6c 75 6d 6e 73  ins only columns
10c60 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   in the current 
10c70 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 74 61  .  ** virtual ta
10c80 62 6c 65 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74  ble then allocat
10c90 65 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 20  e space for the 
10ca0 61 4f 72 64 65 72 42 79 20 70 61 72 74 20 6f 66  aOrderBy part of
10cb0 0a 20 20 2a 2a 20 74 68 65 20 73 71 6c 69 74 65  .  ** the sqlite
10cc0 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72  3_index_info str
10cd0 75 63 74 75 72 65 2e 0a 20 20 2a 2f 0a 20 20 6e  ucture..  */.  n
10ce0 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 69  OrderBy = 0;.  i
10cf0 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  f( pOrderBy ){. 
10d00 20 20 20 69 6e 74 20 6e 20 3d 20 70 4f 72 64 65     int n = pOrde
10d10 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  rBy->nExpr;.    
10d20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b  for(i=0; i<n; i+
10d30 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  +){.      Expr *
10d40 70 45 78 70 72 20 3d 20 70 4f 72 64 65 72 42 79  pExpr = pOrderBy
10d50 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
10d60 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f      if( pExpr->o
10d70 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20  p!=TK_COLUMN || 
10d80 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d 70  pExpr->iTable!=p
10d90 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 20 62  Src->iCursor ) b
10da0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
10db0 69 66 28 20 69 3d 3d 6e 29 7b 0a 20 20 20 20 20  if( i==n){.     
10dc0 20 6e 4f 72 64 65 72 42 79 20 3d 20 6e 3b 0a 20   nOrderBy = n;. 
10dd0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41     }.  }..  /* A
10de0 6c 6c 6f 63 61 74 65 20 74 68 65 20 73 71 6c 69  llocate the sqli
10df0 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73  te3_index_info s
10e00 74 72 75 63 74 75 72 65 0a 20 20 2a 2f 0a 20 20  tructure.  */.  
10e10 70 49 64 78 49 6e 66 6f 20 3d 20 73 71 6c 69 74  pIdxInfo = sqlit
10e20 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70  e3DbMallocZero(p
10e30 50 61 72 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f  Parse->db, sizeo
10e40 66 28 2a 70 49 64 78 49 6e 66 6f 29 0a 20 20 20  f(*pIdxInfo).   
10e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e60 20 20 20 20 20 20 20 20 2b 20 28 73 69 7a 65 6f          + (sizeo
10e70 66 28 2a 70 49 64 78 43 6f 6e 73 29 20 2b 20 73  f(*pIdxCons) + s
10e80 69 7a 65 6f 66 28 2a 70 55 73 61 67 65 29 29 2a  izeof(*pUsage))*
10e90 6e 54 65 72 6d 0a 20 20 20 20 20 20 20 20 20 20  nTerm.          
10ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10eb0 20 2b 20 73 69 7a 65 6f 66 28 2a 70 49 64 78 4f   + sizeof(*pIdxO
10ec0 72 64 65 72 42 79 29 2a 6e 4f 72 64 65 72 42 79  rderBy)*nOrderBy
10ed0 20 29 3b 0a 20 20 69 66 28 20 70 49 64 78 49 6e   );.  if( pIdxIn
10ee0 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  fo==0 ){.    sql
10ef0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
10f00 72 73 65 2c 20 22 6f 75 74 20 6f 66 20 6d 65 6d  rse, "out of mem
10f10 6f 72 79 22 29 3b 0a 20 20 20 20 72 65 74 75 72  ory");.    retur
10f20 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  n 0;.  }..  /* I
10f30 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 73 74  nitialize the st
10f40 72 75 63 74 75 72 65 2e 20 20 54 68 65 20 73 71  ructure.  The sq
10f50 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
10f60 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61   structure conta
10f70 69 6e 73 0a 20 20 2a 2a 20 6d 61 6e 79 20 66 69  ins.  ** many fi
10f80 65 6c 64 73 20 74 68 61 74 20 61 72 65 20 64 65  elds that are de
10f90 63 6c 61 72 65 64 20 22 63 6f 6e 73 74 22 20 74  clared "const" t
10fa0 6f 20 70 72 65 76 65 6e 74 20 78 42 65 73 74 49  o prevent xBestI
10fb0 6e 64 65 78 20 66 72 6f 6d 0a 20 20 2a 2a 20 63  ndex from.  ** c
10fc0 68 61 6e 67 69 6e 67 20 74 68 65 6d 2e 20 20 57  hanging them.  W
10fd0 65 20 68 61 76 65 20 74 6f 20 64 6f 20 73 6f 6d  e have to do som
10fe0 65 20 66 75 6e 6b 79 20 63 61 73 74 69 6e 67 20  e funky casting 
10ff0 69 6e 20 6f 72 64 65 72 20 74 6f 0a 20 20 2a 2a  in order to.  **
11000 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 6f 73   initialize thos
11010 65 20 66 69 65 6c 64 73 2e 0a 20 20 2a 2f 0a 20  e fields..  */. 
11020 20 70 49 64 78 43 6f 6e 73 20 3d 20 28 73 74 72   pIdxCons = (str
11030 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
11040 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 29 26 70  x_constraint*)&p
11050 49 64 78 49 6e 66 6f 5b 31 5d 3b 0a 20 20 70 49  IdxInfo[1];.  pI
11060 64 78 4f 72 64 65 72 42 79 20 3d 20 28 73 74 72  dxOrderBy = (str
11070 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
11080 78 5f 6f 72 64 65 72 62 79 2a 29 26 70 49 64 78  x_orderby*)&pIdx
11090 43 6f 6e 73 5b 6e 54 65 72 6d 5d 3b 0a 20 20 70  Cons[nTerm];.  p
110a0 55 73 61 67 65 20 3d 20 28 73 74 72 75 63 74 20  Usage = (struct 
110b0 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f  sqlite3_index_co
110c0 6e 73 74 72 61 69 6e 74 5f 75 73 61 67 65 2a 29  nstraint_usage*)
110d0 26 70 49 64 78 4f 72 64 65 72 42 79 5b 6e 4f 72  &pIdxOrderBy[nOr
110e0 64 65 72 42 79 5d 3b 0a 20 20 2a 28 69 6e 74 2a  derBy];.  *(int*
110f0 29 26 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e  )&pIdxInfo->nCon
11100 73 74 72 61 69 6e 74 20 3d 20 6e 54 65 72 6d 3b  straint = nTerm;
11110 0a 20 20 2a 28 69 6e 74 2a 29 26 70 49 64 78 49  .  *(int*)&pIdxI
11120 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 20 3d 20  nfo->nOrderBy = 
11130 6e 4f 72 64 65 72 42 79 3b 0a 20 20 2a 28 73 74  nOrderBy;.  *(st
11140 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
11150 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 2a 29  ex_constraint**)
11160 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73  &pIdxInfo->aCons
11170 74 72 61 69 6e 74 20 3d 20 70 49 64 78 43 6f 6e  traint = pIdxCon
11180 73 3b 0a 20 20 2a 28 73 74 72 75 63 74 20 73 71  s;.  *(struct sq
11190 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65  lite3_index_orde
111a0 72 62 79 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d  rby**)&pIdxInfo-
111b0 3e 61 4f 72 64 65 72 42 79 20 3d 20 70 49 64 78  >aOrderBy = pIdx
111c0 4f 72 64 65 72 42 79 3b 0a 20 20 2a 28 73 74 72  OrderBy;.  *(str
111d0 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
111e0 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61  x_constraint_usa
111f0 67 65 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e  ge**)&pIdxInfo->
11200 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65  aConstraintUsage
11210 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   =.             
11220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11250 20 20 20 20 20 20 70 55 73 61 67 65 3b 0a 0a 20        pUsage;.. 
11260 20 66 6f 72 28 69 3d 6a 3d 30 2c 20 70 54 65 72   for(i=j=0, pTer
11270 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c 70 57 43 2d  m=pWC->a; i<pWC-
11280 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c 20 70 54 65  >nTerm; i++, pTe
11290 72 6d 2b 2b 29 7b 0a 20 20 20 20 75 38 20 6f 70  rm++){.    u8 op
112a0 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  ;.    if( pTerm-
112b0 3e 6c 65 66 74 43 75 72 73 6f 72 20 21 3d 20 70  >leftCursor != p
112c0 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 20 63  Src->iCursor ) c
112d0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73  ontinue;.    ass
112e0 65 72 74 28 20 49 73 50 6f 77 65 72 4f 66 54 77  ert( IsPowerOfTw
112f0 6f 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  o(pTerm->eOperat
11300 6f 72 20 26 20 7e 57 4f 5f 45 51 55 49 56 29 20  or & ~WO_EQUIV) 
11310 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
11320 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
11330 72 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20 20 20  r & WO_IN );.   
11340 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
11350 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
11360 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 74  _ISNULL );.    t
11370 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
11380 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 41  eOperator & WO_A
11390 4c 4c 20 29 3b 0a 20 20 20 20 69 66 28 20 28 70  LL );.    if( (p
113a0 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
113b0 26 20 7e 28 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f  & ~(WO_ISNULL|WO
113c0 5f 45 51 55 49 56 29 29 3d 3d 30 20 29 20 63 6f  _EQUIV))==0 ) co
113d0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
113e0 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
113f0 20 54 45 52 4d 5f 56 4e 55 4c 4c 20 29 20 63 6f   TERM_VNULL ) co
11400 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70 49 64 78  ntinue;.    pIdx
11410 43 6f 6e 73 5b 6a 5d 2e 69 43 6f 6c 75 6d 6e 20  Cons[j].iColumn 
11420 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43  = pTerm->u.leftC
11430 6f 6c 75 6d 6e 3b 0a 20 20 20 20 70 49 64 78 43  olumn;.    pIdxC
11440 6f 6e 73 5b 6a 5d 2e 69 54 65 72 6d 4f 66 66 73  ons[j].iTermOffs
11450 65 74 20 3d 20 69 3b 0a 20 20 20 20 6f 70 20 3d  et = i;.    op =
11460 20 28 75 38 29 70 54 65 72 6d 2d 3e 65 4f 70 65   (u8)pTerm->eOpe
11470 72 61 74 6f 72 20 26 20 57 4f 5f 41 4c 4c 3b 0a  rator & WO_ALL;.
11480 20 20 20 20 69 66 28 20 6f 70 3d 3d 57 4f 5f 49      if( op==WO_I
11490 4e 20 29 20 6f 70 20 3d 20 57 4f 5f 45 51 3b 0a  N ) op = WO_EQ;.
114a0 20 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e      pIdxCons[j].
114b0 6f 70 20 3d 20 6f 70 3b 0a 20 20 20 20 2f 2a 20  op = op;.    /* 
114c0 54 68 65 20 64 69 72 65 63 74 20 61 73 73 69 67  The direct assig
114d0 6e 6d 65 6e 74 20 69 6e 20 74 68 65 20 70 72 65  nment in the pre
114e0 76 69 6f 75 73 20 6c 69 6e 65 20 69 73 20 70 6f  vious line is po
114f0 73 73 69 62 6c 65 20 6f 6e 6c 79 20 62 65 63 61  ssible only beca
11500 75 73 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 57  use.    ** the W
11510 4f 5f 20 61 6e 64 20 53 51 4c 49 54 45 5f 49 4e  O_ and SQLITE_IN
11520 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 20  DEX_CONSTRAINT_ 
11530 63 6f 64 65 73 20 61 72 65 20 69 64 65 6e 74 69  codes are identi
11540 63 61 6c 2e 20 20 54 68 65 0a 20 20 20 20 2a 2a  cal.  The.    **
11550 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72   following asser
11560 74 73 20 76 65 72 69 66 79 20 74 68 69 73 20 66  ts verify this f
11570 61 63 74 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65  act. */.    asse
11580 72 74 28 20 57 4f 5f 45 51 3d 3d 53 51 4c 49 54  rt( WO_EQ==SQLIT
11590 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49  E_INDEX_CONSTRAI
115a0 4e 54 5f 45 51 20 29 3b 0a 20 20 20 20 61 73 73  NT_EQ );.    ass
115b0 65 72 74 28 20 57 4f 5f 4c 54 3d 3d 53 51 4c 49  ert( WO_LT==SQLI
115c0 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41  TE_INDEX_CONSTRA
115d0 49 4e 54 5f 4c 54 20 29 3b 0a 20 20 20 20 61 73  INT_LT );.    as
115e0 73 65 72 74 28 20 57 4f 5f 4c 45 3d 3d 53 51 4c  sert( WO_LE==SQL
115f0 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52  ITE_INDEX_CONSTR
11600 41 49 4e 54 5f 4c 45 20 29 3b 0a 20 20 20 20 61  AINT_LE );.    a
11610 73 73 65 72 74 28 20 57 4f 5f 47 54 3d 3d 53 51  ssert( WO_GT==SQ
11620 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54  LITE_INDEX_CONST
11630 52 41 49 4e 54 5f 47 54 20 29 3b 0a 20 20 20 20  RAINT_GT );.    
11640 61 73 73 65 72 74 28 20 57 4f 5f 47 45 3d 3d 53  assert( WO_GE==S
11650 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53  QLITE_INDEX_CONS
11660 54 52 41 49 4e 54 5f 47 45 20 29 3b 0a 20 20 20  TRAINT_GE );.   
11670 20 61 73 73 65 72 74 28 20 57 4f 5f 4d 41 54 43   assert( WO_MATC
11680 48 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f  H==SQLITE_INDEX_
11690 43 4f 4e 53 54 52 41 49 4e 54 5f 4d 41 54 43 48  CONSTRAINT_MATCH
116a0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
116b0 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
116c0 20 26 20 28 57 4f 5f 49 4e 7c 57 4f 5f 45 51 7c   & (WO_IN|WO_EQ|
116d0 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 47  WO_LT|WO_LE|WO_G
116e0 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4d 41 54 43 48  T|WO_GE|WO_MATCH
116f0 29 20 29 3b 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20  ) );.    j++;.  
11700 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  }.  for(i=0; i<n
11710 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20  OrderBy; i++){. 
11720 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d     Expr *pExpr =
11730 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
11740 70 45 78 70 72 3b 0a 20 20 20 20 70 49 64 78 4f  pExpr;.    pIdxO
11750 72 64 65 72 42 79 5b 69 5d 2e 69 43 6f 6c 75 6d  rderBy[i].iColum
11760 6e 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  n = pExpr->iColu
11770 6d 6e 3b 0a 20 20 20 20 70 49 64 78 4f 72 64 65  mn;.    pIdxOrde
11780 72 42 79 5b 69 5d 2e 64 65 73 63 20 3d 20 70 4f  rBy[i].desc = pO
11790 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72  rderBy->a[i].sor
117a0 74 4f 72 64 65 72 3b 0a 20 20 7d 0a 0a 20 20 72  tOrder;.  }..  r
117b0 65 74 75 72 6e 20 70 49 64 78 49 6e 66 6f 3b 0a  eturn pIdxInfo;.
117c0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74 61 62  }../*.** The tab
117d0 6c 65 20 6f 62 6a 65 63 74 20 72 65 66 65 72 65  le object refere
117e0 6e 63 65 20 70 61 73 73 65 64 20 61 73 20 74 68  nce passed as th
117f0 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
11800 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  t to this functi
11810 6f 6e 0a 2a 2a 20 6d 75 73 74 20 72 65 70 72 65  on.** must repre
11820 73 65 6e 74 20 61 20 76 69 72 74 75 61 6c 20 74  sent a virtual t
11830 61 62 6c 65 2e 20 54 68 69 73 20 66 75 6e 63 74  able. This funct
11840 69 6f 6e 20 69 6e 76 6f 6b 65 73 20 74 68 65 20  ion invokes the 
11850 78 42 65 73 74 49 6e 64 65 78 28 29 0a 2a 2a 20  xBestIndex().** 
11860 6d 65 74 68 6f 64 20 6f 66 20 74 68 65 20 76 69  method of the vi
11870 72 74 75 61 6c 20 74 61 62 6c 65 20 77 69 74 68  rtual table with
11880 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64   the sqlite3_ind
11890 65 78 5f 69 6e 66 6f 20 6f 62 6a 65 63 74 20 74  ex_info object t
118a0 68 61 74 0a 2a 2a 20 63 6f 6d 65 73 20 69 6e 20  hat.** comes in 
118b0 61 73 20 74 68 65 20 33 72 64 20 61 72 67 75 6d  as the 3rd argum
118c0 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63  ent to this func
118d0 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  tion..**.** If a
118e0 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
118f0 70 50 61 72 73 65 20 69 73 20 70 6f 70 75 6c 61  pParse is popula
11900 74 65 64 20 77 69 74 68 20 61 6e 20 65 72 72 6f  ted with an erro
11910 72 20 6d 65 73 73 61 67 65 20 61 6e 64 20 61 0a  r message and a.
11920 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75  ** non-zero valu
11930 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  e is returned. O
11940 74 68 65 72 77 69 73 65 2c 20 30 20 69 73 20 72  therwise, 0 is r
11950 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20  eturned and the 
11960 6f 75 74 70 75 74 0a 2a 2a 20 70 61 72 74 20 6f  output.** part o
11970 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e  f the sqlite3_in
11980 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75  dex_info structu
11990 72 65 20 69 73 20 6c 65 66 74 20 70 6f 70 75 6c  re is left popul
119a0 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 74  ated..**.** Whet
119b0 68 65 72 20 6f 72 20 6e 6f 74 20 61 6e 20 65 72  her or not an er
119c0 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 2c  ror is returned,
119d0 20 69 74 20 69 73 20 74 68 65 20 72 65 73 70 6f   it is the respo
119e0 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65  nsibility of the
119f0 0a 2a 2a 20 63 61 6c 6c 65 72 20 74 6f 20 65 76  .** caller to ev
11a00 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 20 70 2d  entually free p-
11a10 3e 69 64 78 53 74 72 20 69 66 20 70 2d 3e 6e 65  >idxStr if p->ne
11a20 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 20 69  edToFreeIdxStr i
11a30 6e 64 69 63 61 74 65 73 0a 2a 2a 20 74 68 61 74  ndicates.** that
11a40 20 74 68 69 73 20 69 73 20 72 65 71 75 69 72 65   this is require
11a50 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
11a60 20 76 74 61 62 42 65 73 74 49 6e 64 65 78 28 50   vtabBestIndex(P
11a70 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61  arse *pParse, Ta
11a80 62 6c 65 20 2a 70 54 61 62 2c 20 73 71 6c 69 74  ble *pTab, sqlit
11a90 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70  e3_index_info *p
11aa0 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61  ){.  sqlite3_vta
11ab0 62 20 2a 70 56 74 61 62 20 3d 20 73 71 6c 69 74  b *pVtab = sqlit
11ac0 65 33 47 65 74 56 54 61 62 6c 65 28 70 50 61 72  e3GetVTable(pPar
11ad0 73 65 2d 3e 64 62 2c 20 70 54 61 62 29 2d 3e 70  se->db, pTab)->p
11ae0 56 74 61 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Vtab;.  int i;. 
11af0 20 69 6e 74 20 72 63 3b 0a 0a 20 20 54 52 41 43   int rc;..  TRAC
11b00 45 5f 49 44 58 5f 49 4e 50 55 54 53 28 70 29 3b  E_IDX_INPUTS(p);
11b10 0a 20 20 72 63 20 3d 20 70 56 74 61 62 2d 3e 70  .  rc = pVtab->p
11b20 4d 6f 64 75 6c 65 2d 3e 78 42 65 73 74 49 6e 64  Module->xBestInd
11b30 65 78 28 70 56 74 61 62 2c 20 70 29 3b 0a 20 20  ex(pVtab, p);.  
11b40 54 52 41 43 45 5f 49 44 58 5f 4f 55 54 50 55 54  TRACE_IDX_OUTPUT
11b50 53 28 70 29 3b 0a 0a 20 20 69 66 28 20 72 63 21  S(p);..  if( rc!
11b60 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
11b70 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
11b80 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 20 20  _NOMEM ){.      
11b90 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
11ba0 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20  ocFailed = 1;.  
11bb0 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70 56 74    }else if( !pVt
11bc0 61 62 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20  ab->zErrMsg ){. 
11bd0 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
11be0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25 73  rMsg(pParse, "%s
11bf0 22 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74 72  ", sqlite3ErrStr
11c00 28 72 63 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65  (rc));.    }else
11c10 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
11c20 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
11c30 22 25 73 22 2c 20 70 56 74 61 62 2d 3e 7a 45 72  "%s", pVtab->zEr
11c40 72 4d 73 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  rMsg);.    }.  }
11c50 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
11c60 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b  pVtab->zErrMsg);
11c70 0a 20 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73  .  pVtab->zErrMs
11c80 67 20 3d 20 30 3b 0a 0a 20 20 66 6f 72 28 69 3d  g = 0;..  for(i=
11c90 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61  0; i<p->nConstra
11ca0 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  int; i++){.    i
11cb0 66 28 20 21 70 2d 3e 61 43 6f 6e 73 74 72 61 69  f( !p->aConstrai
11cc0 6e 74 5b 69 5d 2e 75 73 61 62 6c 65 20 26 26 20  nt[i].usable && 
11cd0 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73  p->aConstraintUs
11ce0 61 67 65 5b 69 5d 2e 61 72 67 76 49 6e 64 65 78  age[i].argvIndex
11cf0 3e 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  >0 ){.      sqli
11d00 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
11d10 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22  se, .          "
11d20 74 61 62 6c 65 20 25 73 3a 20 78 42 65 73 74 49  table %s: xBestI
11d30 6e 64 65 78 20 72 65 74 75 72 6e 65 64 20 61 6e  ndex returned an
11d40 20 69 6e 76 61 6c 69 64 20 70 6c 61 6e 22 2c 20   invalid plan", 
11d50 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
11d60 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
11d70 6e 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3b 0a  n pParse->nErr;.
11d80 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  }.#endif /* !def
11d90 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
11da0 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 20 2a  _VIRTUALTABLE) *
11db0 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  /..#ifdef SQLITE
11dc0 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52  _ENABLE_STAT3_OR
11dd0 5f 53 54 41 54 34 0a 2f 2a 0a 2a 2a 20 45 73 74  _STAT4./*.** Est
11de0 69 6d 61 74 65 20 74 68 65 20 6c 6f 63 61 74 69  imate the locati
11df0 6f 6e 20 6f 66 20 61 20 70 61 72 74 69 63 75 6c  on of a particul
11e00 61 72 20 6b 65 79 20 61 6d 6f 6e 67 20 61 6c 6c  ar key among all
11e10 20 6b 65 79 73 20 69 6e 20 61 6e 0a 2a 2a 20 69   keys in an.** i
11e20 6e 64 65 78 2e 20 20 53 74 6f 72 65 20 74 68 65  ndex.  Store the
11e30 20 72 65 73 75 6c 74 73 20 69 6e 20 61 53 74 61   results in aSta
11e40 74 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  t as follows:.**
11e50 0a 2a 2a 20 20 20 20 61 53 74 61 74 5b 30 5d 20  .**    aStat[0] 
11e60 20 20 20 20 20 45 73 74 2e 20 6e 75 6d 62 65 72       Est. number
11e70 20 6f 66 20 72 6f 77 73 20 6c 65 73 73 20 74 68   of rows less th
11e80 61 6e 20 70 52 65 63 0a 2a 2a 20 20 20 20 61 53  an pRec.**    aS
11e90 74 61 74 5b 31 5d 20 20 20 20 20 20 45 73 74 2e  tat[1]      Est.
11ea0 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
11eb0 65 71 75 61 6c 20 74 6f 20 70 52 65 63 0a 2a 2a  equal to pRec.**
11ec0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 69  .** Return the i
11ed0 6e 64 65 78 20 6f 66 20 74 68 65 20 73 61 6d 70  ndex of the samp
11ee0 6c 65 20 74 68 61 74 20 69 73 20 74 68 65 20 73  le that is the s
11ef0 6d 61 6c 6c 65 73 74 20 73 61 6d 70 6c 65 20 74  mallest sample t
11f00 68 61 74 0a 2a 2a 20 69 73 20 67 72 65 61 74 65  hat.** is greate
11f10 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  r than or equal 
11f20 74 6f 20 70 52 65 63 2e 20 4e 6f 74 65 20 74 68  to pRec. Note th
11f30 61 74 20 74 68 69 73 20 69 6e 64 65 78 20 69 73  at this index is
11f40 20 6e 6f 74 20 61 6e 20 69 6e 64 65 78 0a 2a 2a   not an index.**
11f50 20 69 6e 74 6f 20 74 68 65 20 61 53 61 6d 70 6c   into the aSampl
11f60 65 5b 5d 20 61 72 72 61 79 20 2d 20 69 74 20 69  e[] array - it i
11f70 73 20 61 6e 20 69 6e 64 65 78 20 69 6e 74 6f 20  s an index into 
11f80 61 20 76 69 72 74 75 61 6c 20 73 65 74 20 6f 66  a virtual set of
11f90 20 73 61 6d 70 6c 65 73 0a 2a 2a 20 62 61 73 65   samples.** base
11fa0 64 20 6f 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74  d on the content
11fb0 73 20 6f 66 20 61 53 61 6d 70 6c 65 5b 5d 20 61  s of aSample[] a
11fc0 6e 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  nd the number of
11fd0 20 66 69 65 6c 64 73 20 69 6e 20 72 65 63 6f 72   fields in recor
11fe0 64 20 0a 2a 2a 20 70 52 65 63 2e 20 0a 2a 2f 0a  d .** pRec. .*/.
11ff0 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
12000 4b 65 79 53 74 61 74 73 28 0a 20 20 50 61 72 73  KeyStats(.  Pars
12010 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
12020 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
12030 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
12040 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 2c  /.  Index *pIdx,
12050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12060 2f 2a 20 49 6e 64 65 78 20 74 6f 20 63 6f 6e 73  /* Index to cons
12070 69 64 65 72 20 64 6f 6d 61 69 6e 20 6f 66 20 2a  ider domain of *
12080 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  /.  UnpackedReco
12090 72 64 20 2a 70 52 65 63 2c 20 20 20 20 20 20 20  rd *pRec,       
120a0 2f 2a 20 56 65 63 74 6f 72 20 6f 66 20 76 61 6c  /* Vector of val
120b0 75 65 73 20 74 6f 20 63 6f 6e 73 69 64 65 72 20  ues to consider 
120c0 2a 2f 0a 20 20 69 6e 74 20 72 6f 75 6e 64 55 70  */.  int roundUp
120d0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
120e0 20 2f 2a 20 52 6f 75 6e 64 20 75 70 20 69 66 20   /* Round up if 
120f0 74 72 75 65 2e 20 20 52 6f 75 6e 64 20 64 6f 77  true.  Round dow
12100 6e 20 69 66 20 66 61 6c 73 65 20 2a 2f 0a 20 20  n if false */.  
12110 74 52 6f 77 63 6e 74 20 2a 61 53 74 61 74 20 20  tRowcnt *aStat  
12120 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
12130 55 54 3a 20 73 74 61 74 73 20 77 72 69 74 74 65  UT: stats writte
12140 6e 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 49  n here */.){.  I
12150 6e 64 65 78 53 61 6d 70 6c 65 20 2a 61 53 61 6d  ndexSample *aSam
12160 70 6c 65 20 3d 20 70 49 64 78 2d 3e 61 53 61 6d  ple = pIdx->aSam
12170 70 6c 65 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 3b  ple;.  int iCol;
12180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12190 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 72     /* Index of r
121a0 65 71 75 69 72 65 64 20 73 74 61 74 73 20 69 6e  equired stats in
121b0 20 61 6e 45 71 5b 5d 20 65 74 63 2e 20 2a 2f 0a   anEq[] etc. */.
121c0 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
121d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
121e0 20 49 6e 64 65 78 20 6f 66 20 66 69 72 73 74 20   Index of first 
121f0 73 61 6d 70 6c 65 20 3e 3d 20 70 52 65 63 20 2a  sample >= pRec *
12200 2f 0a 20 20 69 6e 74 20 69 53 61 6d 70 6c 65 3b  /.  int iSample;
12210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12220 2f 2a 20 53 6d 61 6c 6c 65 73 74 20 73 61 6d 70  /* Smallest samp
12230 6c 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20 6f  le larger than o
12240 72 20 65 71 75 61 6c 20 74 6f 20 70 52 65 63 20  r equal to pRec 
12250 2a 2f 0a 20 20 69 6e 74 20 69 4d 69 6e 20 3d 20  */.  int iMin = 
12260 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
12270 20 2f 2a 20 53 6d 61 6c 6c 65 73 74 20 73 61 6d   /* Smallest sam
12280 70 6c 65 20 6e 6f 74 20 79 65 74 20 74 65 73 74  ple not yet test
12290 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 54 65 73  ed */.  int iTes
122a0 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
122b0 20 20 20 20 2f 2a 20 4e 65 78 74 20 73 61 6d 70      /* Next samp
122c0 6c 65 20 74 6f 20 74 65 73 74 20 2a 2f 0a 20 20  le to test */.  
122d0 69 6e 74 20 72 65 73 3b 20 20 20 20 20 20 20 20  int res;        
122e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
122f0 65 73 75 6c 74 20 6f 66 20 63 6f 6d 70 61 72 69  esult of compari
12300 73 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f  son operation */
12310 0a 20 20 69 6e 74 20 6e 46 69 65 6c 64 3b 20 20  .  int nField;  
12320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12330 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 69 65 6c  * Number of fiel
12340 64 73 20 69 6e 20 70 52 65 63 20 2a 2f 0a 20 20  ds in pRec */.  
12350 74 52 6f 77 63 6e 74 20 69 4c 6f 77 65 72 20 3d  tRowcnt iLower =
12360 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 61   0;         /* a
12370 6e 4c 74 5b 5d 20 2b 20 61 6e 45 71 5b 5d 20 6f  nLt[] + anEq[] o
12380 66 20 6c 61 72 67 65 73 74 20 73 61 6d 70 6c 65  f largest sample
12390 20 70 52 65 63 20 69 73 20 3e 20 2a 2f 0a 0a 23   pRec is > */..#
123a0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 45  ifndef SQLITE_DE
123b0 42 55 47 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  BUG.  UNUSED_PAR
123c0 41 4d 45 54 45 52 28 20 70 50 61 72 73 65 20 29  AMETER( pParse )
123d0 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72  ;.#endif.  asser
123e0 74 28 20 70 52 65 63 21 3d 30 20 29 3b 0a 20 20  t( pRec!=0 );.  
123f0 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6e 53  assert( pIdx->nS
12400 61 6d 70 6c 65 3e 30 20 29 3b 0a 20 20 61 73 73  ample>0 );.  ass
12410 65 72 74 28 20 70 52 65 63 2d 3e 6e 46 69 65 6c  ert( pRec->nFiel
12420 64 3e 30 20 26 26 20 70 52 65 63 2d 3e 6e 46 69  d>0 && pRec->nFi
12430 65 6c 64 3c 3d 70 49 64 78 2d 3e 6e 53 61 6d 70  eld<=pIdx->nSamp
12440 6c 65 43 6f 6c 20 29 3b 0a 0a 20 20 2f 2a 20 44  leCol );..  /* D
12450 6f 20 61 20 62 69 6e 61 72 79 20 73 65 61 72 63  o a binary searc
12460 68 20 74 6f 20 66 69 6e 64 20 74 68 65 20 66 69  h to find the fi
12470 72 73 74 20 73 61 6d 70 6c 65 20 67 72 65 61 74  rst sample great
12480 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  er than or equal
12490 0a 20 20 2a 2a 20 74 6f 20 70 52 65 63 2e 20 49  .  ** to pRec. I
124a0 66 20 70 52 65 63 20 63 6f 6e 74 61 69 6e 73 20  f pRec contains 
124b0 61 20 73 69 6e 67 6c 65 20 66 69 65 6c 64 2c 20  a single field, 
124c0 74 68 65 20 73 65 74 20 6f 66 20 73 61 6d 70 6c  the set of sampl
124d0 65 73 20 74 6f 20 73 65 61 72 63 68 0a 20 20 2a  es to search.  *
124e0 2a 20 69 73 20 73 69 6d 70 6c 79 20 74 68 65 20  * is simply the 
124f0 61 53 61 6d 70 6c 65 5b 5d 20 61 72 72 61 79 2e  aSample[] array.
12500 20 49 66 20 74 68 65 20 73 61 6d 70 6c 65 73 20   If the samples 
12510 69 6e 20 61 53 61 6d 70 6c 65 5b 5d 20 63 6f 6e  in aSample[] con
12520 74 61 69 6e 20 6d 6f 72 65 0a 20 20 2a 2a 20 74  tain more.  ** t
12530 68 61 6e 20 6f 6e 65 20 66 69 65 6c 64 73 2c 20  han one fields, 
12540 61 6c 6c 20 66 69 65 6c 64 73 20 66 6f 6c 6c 6f  all fields follo
12550 77 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 61  wing the first a
12560 72 65 20 69 67 6e 6f 72 65 64 2e 0a 20 20 2a 2a  re ignored..  **
12570 0a 20 20 2a 2a 20 49 66 20 70 52 65 63 20 63 6f  .  ** If pRec co
12580 6e 74 61 69 6e 73 20 4e 20 66 69 65 6c 64 73 2c  ntains N fields,
12590 20 77 68 65 72 65 20 4e 20 69 73 20 6d 6f 72 65   where N is more
125a0 20 74 68 61 6e 20 6f 6e 65 2c 20 74 68 65 6e 20   than one, then 
125b0 61 73 20 77 65 6c 6c 20 61 73 20 74 68 65 0a 20  as well as the. 
125c0 20 2a 2a 20 73 61 6d 70 6c 65 73 20 69 6e 20 61   ** samples in a
125d0 53 61 6d 70 6c 65 5b 5d 20 28 74 72 75 6e 63 61  Sample[] (trunca
125e0 74 65 64 20 74 6f 20 4e 20 66 69 65 6c 64 73 29  ted to N fields)
125f0 2c 20 74 68 65 20 73 65 61 72 63 68 20 61 6c 73  , the search als
12600 6f 20 68 61 73 20 74 6f 0a 20 20 2a 2a 20 63 6f  o has to.  ** co
12610 6e 73 69 64 65 72 20 70 72 65 66 69 78 65 73 20  nsider prefixes 
12620 6f 66 20 74 68 6f 73 65 20 73 61 6d 70 6c 65 73  of those samples
12630 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69  . For example, i
12640 66 20 74 68 65 20 73 65 74 20 6f 66 20 73 61 6d  f the set of sam
12650 70 6c 65 73 0a 20 20 2a 2a 20 69 6e 20 61 53 61  ples.  ** in aSa
12660 6d 70 6c 65 20 69 73 3a 0a 20 20 2a 2a 0a 20 20  mple is:.  **.  
12670 2a 2a 20 20 20 20 20 61 53 61 6d 70 6c 65 5b 30  **     aSample[0
12680 5d 20 3d 20 28 61 2c 20 35 29 20 0a 20 20 2a 2a  ] = (a, 5) .  **
12690 20 20 20 20 20 61 53 61 6d 70 6c 65 5b 31 5d 20       aSample[1] 
126a0 3d 20 28 61 2c 20 31 30 29 20 0a 20 20 2a 2a 20  = (a, 10) .  ** 
126b0 20 20 20 20 61 53 61 6d 70 6c 65 5b 32 5d 20 3d      aSample[2] =
126c0 20 28 62 2c 20 35 29 20 0a 20 20 2a 2a 20 20 20   (b, 5) .  **   
126d0 20 20 61 53 61 6d 70 6c 65 5b 33 5d 20 3d 20 28    aSample[3] = (
126e0 63 2c 20 31 30 30 29 20 0a 20 20 2a 2a 20 20 20  c, 100) .  **   
126f0 20 20 61 53 61 6d 70 6c 65 5b 34 5d 20 3d 20 28    aSample[4] = (
12700 63 2c 20 31 30 35 29 0a 20 20 2a 2a 0a 20 20 2a  c, 105).  **.  *
12710 2a 20 54 68 65 6e 20 74 68 65 20 73 65 61 72 63  * Then the searc
12720 68 20 73 70 61 63 65 20 73 68 6f 75 6c 64 20 69  h space should i
12730 64 65 61 6c 6c 79 20 62 65 20 74 68 65 20 73 61  deally be the sa
12740 6d 70 6c 65 73 20 61 62 6f 76 65 20 61 6e 64 20  mples above and 
12750 74 68 65 20 0a 20 20 2a 2a 20 75 6e 69 71 75 65  the .  ** unique
12760 20 70 72 65 66 69 78 65 73 20 5b 61 5d 2c 20 5b   prefixes [a], [
12770 62 5d 20 61 6e 64 20 5b 63 5d 2e 20 42 75 74 20  b] and [c]. But 
12780 73 69 6e 63 65 20 74 68 61 74 20 69 73 20 68 61  since that is ha
12790 72 64 20 74 6f 20 6f 72 67 61 6e 69 7a 65 2c 20  rd to organize, 
127a0 0a 20 20 2a 2a 20 74 68 65 20 63 6f 64 65 20 61  .  ** the code a
127b0 63 74 75 61 6c 6c 79 20 73 65 61 72 63 68 65 73  ctually searches
127c0 20 74 68 69 73 20 73 65 74 3a 0a 20 20 2a 2a 0a   this set:.  **.
127d0 20 20 2a 2a 20 20 20 20 20 30 3a 20 28 61 29 20    **     0: (a) 
127e0 0a 20 20 2a 2a 20 20 20 20 20 31 3a 20 28 61 2c  .  **     1: (a,
127f0 20 35 29 20 0a 20 20 2a 2a 20 20 20 20 20 32 3a   5) .  **     2:
12800 20 28 61 2c 20 31 30 29 20 0a 20 20 2a 2a 20 20   (a, 10) .  **  
12810 20 20 20 33 3a 20 28 61 2c 20 31 30 29 20 0a 20     3: (a, 10) . 
12820 20 2a 2a 20 20 20 20 20 34 3a 20 28 62 29 20 0a   **     4: (b) .
12830 20 20 2a 2a 20 20 20 20 20 35 3a 20 28 62 2c 20    **     5: (b, 
12840 35 29 20 0a 20 20 2a 2a 20 20 20 20 20 36 3a 20  5) .  **     6: 
12850 28 63 29 20 0a 20 20 2a 2a 20 20 20 20 20 37 3a  (c) .  **     7:
12860 20 28 63 2c 20 31 30 30 29 20 0a 20 20 2a 2a 20   (c, 100) .  ** 
12870 20 20 20 20 38 3a 20 28 63 2c 20 31 30 35 29 0a      8: (c, 105).
12880 20 20 2a 2a 20 20 20 20 20 39 3a 20 28 63 2c 20    **     9: (c, 
12890 31 30 35 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46  105).  **.  ** F
128a0 6f 72 20 65 61 63 68 20 73 61 6d 70 6c 65 20 69  or each sample i
128b0 6e 20 74 68 65 20 61 53 61 6d 70 6c 65 5b 5d 20  n the aSample[] 
128c0 61 72 72 61 79 2c 20 4e 20 73 61 6d 70 6c 65 73  array, N samples
128d0 20 61 72 65 20 70 72 65 73 65 6e 74 20 69 6e 20   are present in 
128e0 74 68 65 0a 20 20 2a 2a 20 65 66 66 65 63 74 69  the.  ** effecti
128f0 76 65 20 73 61 6d 70 6c 65 20 61 72 72 61 79 2e  ve sample array.
12900 20 49 6e 20 74 68 65 20 61 62 6f 76 65 2c 20 73   In the above, s
12910 61 6d 70 6c 65 73 20 30 20 61 6e 64 20 31 20 61  amples 0 and 1 a
12920 72 65 20 62 61 73 65 64 20 6f 6e 20 0a 20 20 2a  re based on .  *
12930 2a 20 73 61 6d 70 6c 65 20 61 53 61 6d 70 6c 65  * sample aSample
12940 5b 30 5d 2e 20 53 61 6d 70 6c 65 73 20 32 20 61  [0]. Samples 2 a
12950 6e 64 20 33 20 6f 6e 20 61 53 61 6d 70 6c 65 5b  nd 3 on aSample[
12960 31 5d 20 65 74 63 2e 0a 20 20 2a 2a 0a 20 20 2a  1] etc..  **.  *
12970 2a 20 4f 66 74 65 6e 2c 20 73 61 6d 70 6c 65 20  * Often, sample 
12980 69 20 6f 66 20 65 61 63 68 20 62 6c 6f 63 6b 20  i of each block 
12990 6f 66 20 4e 20 65 66 66 65 63 74 69 76 65 20 73  of N effective s
129a0 61 6d 70 6c 65 73 20 68 61 73 20 28 69 2b 31 29  amples has (i+1)
129b0 20 66 69 65 6c 64 73 2e 0a 20 20 2a 2a 20 45 78   fields..  ** Ex
129c0 63 65 70 74 2c 20 65 61 63 68 20 73 61 6d 70 6c  cept, each sampl
129d0 65 20 6d 61 79 20 62 65 20 65 78 74 65 6e 64 65  e may be extende
129e0 64 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74  d to ensure that
129f0 20 69 74 20 69 73 20 67 72 65 61 74 65 72 20 74   it is greater t
12a00 68 61 6e 20 6f 72 0a 20 20 2a 2a 20 65 71 75 61  han or.  ** equa
12a10 6c 20 74 6f 20 74 68 65 20 70 72 65 76 69 6f 75  l to the previou
12a20 73 20 73 61 6d 70 6c 65 20 69 6e 20 74 68 65 20  s sample in the 
12a30 61 72 72 61 79 2e 20 46 6f 72 20 65 78 61 6d 70  array. For examp
12a40 6c 65 2c 20 69 6e 20 74 68 65 20 61 62 6f 76 65  le, in the above
12a50 2c 20 0a 20 20 2a 2a 20 73 61 6d 70 6c 65 20 32  , .  ** sample 2
12a60 20 69 73 20 74 68 65 20 66 69 72 73 74 20 73 61   is the first sa
12a70 6d 70 6c 65 20 6f 66 20 61 20 62 6c 6f 63 6b 20  mple of a block 
12a80 6f 66 20 4e 20 73 61 6d 70 6c 65 73 2c 20 73 6f  of N samples, so
12a90 20 61 74 20 66 69 72 73 74 20 69 74 20 0a 20 20   at first it .  
12aa0 2a 2a 20 61 70 70 65 61 72 73 20 74 68 61 74 20  ** appears that 
12ab0 69 74 20 73 68 6f 75 6c 64 20 62 65 20 31 20 66  it should be 1 f
12ac0 69 65 6c 64 20 69 6e 20 73 69 7a 65 2e 20 48 6f  ield in size. Ho
12ad0 77 65 76 65 72 2c 20 74 68 61 74 20 77 6f 75 6c  wever, that woul
12ae0 64 20 6d 61 6b 65 20 69 74 20 0a 20 20 2a 2a 20  d make it .  ** 
12af0 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 73 61 6d  smaller than sam
12b00 70 6c 65 20 31 2c 20 73 6f 20 74 68 65 20 62 69  ple 1, so the bi
12b10 6e 61 72 79 20 73 65 61 72 63 68 20 77 6f 75 6c  nary search woul
12b20 64 20 6e 6f 74 20 77 6f 72 6b 2e 20 41 73 20 61  d not work. As a
12b30 20 72 65 73 75 6c 74 2c 20 0a 20 20 2a 2a 20 69   result, .  ** i
12b40 74 20 69 73 20 65 78 74 65 6e 64 65 64 20 74 6f  t is extended to
12b50 20 74 77 6f 20 66 69 65 6c 64 73 2e 20 54 68 65   two fields. The
12b60 20 64 75 70 6c 69 63 61 74 65 73 20 74 68 61 74   duplicates that
12b70 20 74 68 69 73 20 63 72 65 61 74 65 73 20 64 6f   this creates do
12b80 20 6e 6f 74 20 0a 20 20 2a 2a 20 63 61 75 73 65   not .  ** cause
12b90 20 61 6e 79 20 70 72 6f 62 6c 65 6d 73 2e 0a 20   any problems.. 
12ba0 20 2a 2f 0a 20 20 6e 46 69 65 6c 64 20 3d 20 70   */.  nField = p
12bb0 52 65 63 2d 3e 6e 46 69 65 6c 64 3b 0a 20 20 69  Rec->nField;.  i
12bc0 43 6f 6c 20 3d 20 30 3b 0a 20 20 69 53 61 6d 70  Col = 0;.  iSamp
12bd0 6c 65 20 3d 20 70 49 64 78 2d 3e 6e 53 61 6d 70  le = pIdx->nSamp
12be0 6c 65 20 2a 20 6e 46 69 65 6c 64 3b 0a 20 20 64  le * nField;.  d
12bf0 6f 7b 0a 20 20 20 20 69 6e 74 20 69 53 61 6d 70  o{.    int iSamp
12c00 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
12c10 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e       /* Index in
12c20 20 61 53 61 6d 70 6c 65 5b 5d 20 6f 66 20 74 65   aSample[] of te
12c30 73 74 20 73 61 6d 70 6c 65 20 2a 2f 0a 20 20 20  st sample */.   
12c40 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20   int n;         
12c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12c60 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 69 65 6c  * Number of fiel
12c70 64 73 20 69 6e 20 74 65 73 74 20 73 61 6d 70 6c  ds in test sampl
12c80 65 20 2a 2f 0a 0a 20 20 20 20 69 54 65 73 74 20  e */..    iTest 
12c90 3d 20 28 69 4d 69 6e 2b 69 53 61 6d 70 6c 65 29  = (iMin+iSample)
12ca0 2f 32 3b 0a 20 20 20 20 69 53 61 6d 70 20 3d 20  /2;.    iSamp = 
12cb0 69 54 65 73 74 20 2f 20 6e 46 69 65 6c 64 3b 0a  iTest / nField;.
12cc0 20 20 20 20 69 66 28 20 69 53 61 6d 70 3e 30 20      if( iSamp>0 
12cd0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ){.      /* The 
12ce0 70 72 6f 70 6f 73 65 64 20 65 66 66 65 63 74 69  proposed effecti
12cf0 76 65 20 73 61 6d 70 6c 65 20 69 73 20 61 20 70  ve sample is a p
12d00 72 65 66 69 78 20 6f 66 20 73 61 6d 70 6c 65 20  refix of sample 
12d10 61 53 61 6d 70 6c 65 5b 69 53 61 6d 70 5d 2e 0a  aSample[iSamp]..
12d20 20 20 20 20 20 20 2a 2a 20 53 70 65 63 69 66 69        ** Specifi
12d30 63 61 6c 6c 79 2c 20 74 68 65 20 73 68 6f 72 74  cally, the short
12d40 65 73 74 20 70 72 65 66 69 78 20 6f 66 20 61 74  est prefix of at
12d50 20 6c 65 61 73 74 20 28 31 20 2b 20 69 54 65 73   least (1 + iTes
12d60 74 25 6e 46 69 65 6c 64 29 20 0a 20 20 20 20 20  t%nField) .     
12d70 20 2a 2a 20 66 69 65 6c 64 73 20 74 68 61 74 20   ** fields that 
12d80 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
12d90 74 68 65 20 70 72 65 76 69 6f 75 73 20 65 66 66  the previous eff
12da0 65 63 74 69 76 65 20 73 61 6d 70 6c 65 2e 20 20  ective sample.  
12db0 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 6e 3d 28  */.      for(n=(
12dc0 69 54 65 73 74 20 25 20 6e 46 69 65 6c 64 29 20  iTest % nField) 
12dd0 2b 20 31 3b 20 6e 3c 6e 46 69 65 6c 64 3b 20 6e  + 1; n<nField; n
12de0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
12df0 20 61 53 61 6d 70 6c 65 5b 69 53 61 6d 70 2d 31   aSample[iSamp-1
12e00 5d 2e 61 6e 4c 74 5b 6e 2d 31 5d 21 3d 61 53 61  ].anLt[n-1]!=aSa
12e10 6d 70 6c 65 5b 69 53 61 6d 70 5d 2e 61 6e 4c 74  mple[iSamp].anLt
12e20 5b 6e 2d 31 5d 20 29 20 62 72 65 61 6b 3b 0a 20  [n-1] ) break;. 
12e30 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
12e40 7b 0a 20 20 20 20 20 20 6e 20 3d 20 69 54 65 73  {.      n = iTes
12e50 74 20 2b 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20  t + 1;.    }..  
12e60 20 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 20 3d    pRec->nField =
12e70 20 6e 3b 0a 20 20 20 20 72 65 73 20 3d 20 73 71   n;.    res = sq
12e80 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
12e90 6f 6d 70 61 72 65 28 61 53 61 6d 70 6c 65 5b 69  ompare(aSample[i
12ea0 53 61 6d 70 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65  Samp].n, aSample
12eb0 5b 69 53 61 6d 70 5d 2e 70 2c 20 70 52 65 63 29  [iSamp].p, pRec)
12ec0 3b 0a 20 20 20 20 69 66 28 20 72 65 73 3c 30 20  ;.    if( res<0 
12ed0 29 7b 0a 20 20 20 20 20 20 69 4c 6f 77 65 72 20  ){.      iLower 
12ee0 3d 20 61 53 61 6d 70 6c 65 5b 69 53 61 6d 70 5d  = aSample[iSamp]
12ef0 2e 61 6e 4c 74 5b 6e 2d 31 5d 20 2b 20 61 53 61  .anLt[n-1] + aSa
12f00 6d 70 6c 65 5b 69 53 61 6d 70 5d 2e 61 6e 45 71  mple[iSamp].anEq
12f10 5b 6e 2d 31 5d 3b 0a 20 20 20 20 20 20 69 4d 69  [n-1];.      iMi
12f20 6e 20 3d 20 69 54 65 73 74 2b 31 3b 0a 20 20 20  n = iTest+1;.   
12f30 20 7d 65 6c 73 65 20 69 66 28 20 72 65 73 3d 3d   }else if( res==
12f40 30 20 26 26 20 6e 3c 6e 46 69 65 6c 64 20 29 7b  0 && n<nField ){
12f50 0a 20 20 20 20 20 20 69 4c 6f 77 65 72 20 3d 20  .      iLower = 
12f60 61 53 61 6d 70 6c 65 5b 69 53 61 6d 70 5d 2e 61  aSample[iSamp].a
12f70 6e 4c 74 5b 6e 2d 31 5d 3b 0a 20 20 20 20 20 20  nLt[n-1];.      
12f80 69 4d 69 6e 20 3d 20 69 54 65 73 74 2b 31 3b 0a  iMin = iTest+1;.
12f90 20 20 20 20 20 20 72 65 73 20 3d 20 2d 31 3b 0a        res = -1;.
12fa0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
12fb0 20 69 53 61 6d 70 6c 65 20 3d 20 69 54 65 73 74   iSample = iTest
12fc0 3b 0a 20 20 20 20 20 20 69 43 6f 6c 20 3d 20 6e  ;.      iCol = n
12fd0 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69  -1;.    }.  }whi
12fe0 6c 65 28 20 72 65 73 20 26 26 20 69 4d 69 6e 3c  le( res && iMin<
12ff0 69 53 61 6d 70 6c 65 20 29 3b 0a 20 20 69 20 3d  iSample );.  i =
13000 20 69 53 61 6d 70 6c 65 20 2f 20 6e 46 69 65 6c   iSample / nFiel
13010 64 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  d;..#ifdef SQLIT
13020 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 54 68 65  E_DEBUG.  /* The
13030 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72   following asser
13040 74 20 73 74 61 74 65 6d 65 6e 74 73 20 63 68 65  t statements che
13050 63 6b 20 74 68 61 74 20 74 68 65 20 62 69 6e 61  ck that the bina
13060 72 79 20 73 65 61 72 63 68 20 63 6f 64 65 0a 20  ry search code. 
13070 20 2a 2a 20 61 62 6f 76 65 20 66 6f 75 6e 64 20   ** above found 
13080 74 68 65 20 72 69 67 68 74 20 61 6e 73 77 65 72  the right answer
13090 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20 73 65 72  . This block ser
130a0 76 65 73 20 6e 6f 20 70 75 72 70 6f 73 65 20 6f  ves no purpose o
130b0 74 68 65 72 0a 20 20 2a 2a 20 74 68 61 6e 20 74  ther.  ** than t
130c0 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20 61 73 73  o invoke the ass
130d0 65 72 74 73 2e 20 20 2a 2f 0a 20 20 69 66 28 20  erts.  */.  if( 
130e0 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
130f0 6f 63 46 61 69 6c 65 64 3d 3d 30 20 29 7b 0a 20  ocFailed==0 ){. 
13100 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b     if( res==0 ){
13110 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 28 72 65  .      /* If (re
13120 73 3d 3d 30 29 20 69 73 20 74 72 75 65 2c 20 74  s==0) is true, t
13130 68 65 6e 20 70 52 65 63 20 6d 75 73 74 20 62 65  hen pRec must be
13140 20 65 71 75 61 6c 20 74 6f 20 73 61 6d 70 6c 65   equal to sample
13150 20 69 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73   i. */.      ass
13160 65 72 74 28 20 69 3c 70 49 64 78 2d 3e 6e 53 61  ert( i<pIdx->nSa
13170 6d 70 6c 65 20 29 3b 0a 20 20 20 20 20 20 61 73  mple );.      as
13180 73 65 72 74 28 20 69 43 6f 6c 3d 3d 6e 46 69 65  sert( iCol==nFie
13190 6c 64 2d 31 20 29 3b 0a 20 20 20 20 20 20 70 52  ld-1 );.      pR
131a0 65 63 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 46 69  ec->nField = nFi
131b0 65 6c 64 3b 0a 20 20 20 20 20 20 61 73 73 65 72  eld;.      asser
131c0 74 28 20 30 3d 3d 73 71 6c 69 74 65 33 56 64 62  t( 0==sqlite3Vdb
131d0 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 61  eRecordCompare(a
131e0 53 61 6d 70 6c 65 5b 69 5d 2e 6e 2c 20 61 53 61  Sample[i].n, aSa
131f0 6d 70 6c 65 5b 69 5d 2e 70 2c 20 70 52 65 63 29  mple[i].p, pRec)
13200 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20   .           || 
13210 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
13220 6f 63 46 61 69 6c 65 64 20 0a 20 20 20 20 20 20  ocFailed .      
13230 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
13240 20 20 20 20 2f 2a 20 55 6e 6c 65 73 73 20 69 3d      /* Unless i=
13250 3d 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 2c 20  =pIdx->nSample, 
13260 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74 20  indicating that 
13270 70 52 65 63 20 69 73 20 6c 61 72 67 65 72 20 74  pRec is larger t
13280 68 61 6e 0a 20 20 20 20 20 20 2a 2a 20 61 6c 6c  han.      ** all
13290 20 73 61 6d 70 6c 65 73 20 69 6e 20 74 68 65 20   samples in the 
132a0 61 53 61 6d 70 6c 65 5b 5d 20 61 72 72 61 79 2c  aSample[] array,
132b0 20 70 52 65 63 20 6d 75 73 74 20 62 65 20 73 6d   pRec must be sm
132c0 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 0a 20  aller than the. 
132d0 20 20 20 20 20 2a 2a 20 28 69 43 6f 6c 2b 31 29       ** (iCol+1)
132e0 20 66 69 65 6c 64 20 70 72 65 66 69 78 20 6f 66   field prefix of
132f0 20 73 61 6d 70 6c 65 20 69 2e 20 20 2a 2f 0a 20   sample i.  */. 
13300 20 20 20 20 20 61 73 73 65 72 74 28 20 69 3c 3d       assert( i<=
13310 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 26 26  pIdx->nSample &&
13320 20 69 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 70   i>=0 );.      p
13330 52 65 63 2d 3e 6e 46 69 65 6c 64 20 3d 20 69 43  Rec->nField = iC
13340 6f 6c 2b 31 3b 0a 20 20 20 20 20 20 61 73 73 65  ol+1;.      asse
13350 72 74 28 20 69 3d 3d 70 49 64 78 2d 3e 6e 53 61  rt( i==pIdx->nSa
13360 6d 70 6c 65 20 0a 20 20 20 20 20 20 20 20 20 20  mple .          
13370 20 7c 7c 20 73 71 6c 69 74 65 33 56 64 62 65 52   || sqlite3VdbeR
13380 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 61 53 61  ecordCompare(aSa
13390 6d 70 6c 65 5b 69 5d 2e 6e 2c 20 61 53 61 6d 70  mple[i].n, aSamp
133a0 6c 65 5b 69 5d 2e 70 2c 20 70 52 65 63 29 3e 30  le[i].p, pRec)>0
133b0 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70  .           || p
133c0 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
133d0 63 46 61 69 6c 65 64 20 29 3b 0a 0a 20 20 20 20  cFailed );..    
133e0 20 20 2f 2a 20 69 66 20 69 3d 3d 30 20 61 6e 64    /* if i==0 and
133f0 20 69 43 6f 6c 3d 3d 30 2c 20 74 68 65 6e 20 72   iCol==0, then r
13400 65 63 6f 72 64 20 70 52 65 63 20 69 73 20 73 6d  ecord pRec is sm
13410 61 6c 6c 65 72 20 74 68 61 6e 20 61 6c 6c 20 73  aller than all s
13420 61 6d 70 6c 65 73 0a 20 20 20 20 20 20 2a 2a 20  amples.      ** 
13430 69 6e 20 74 68 65 20 61 53 61 6d 70 6c 65 5b 5d  in the aSample[]
13440 20 61 72 72 61 79 2e 20 4f 74 68 65 72 77 69 73   array. Otherwis
13450 65 2c 20 69 66 20 28 69 43 6f 6c 3e 30 29 20 74  e, if (iCol>0) t
13460 68 65 6e 20 70 52 65 63 20 6d 75 73 74 0a 20 20  hen pRec must.  
13470 20 20 20 20 2a 2a 20 62 65 20 67 72 65 61 74 65      ** be greate
13480 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  r than or equal 
13490 74 6f 20 74 68 65 20 28 69 43 6f 6c 29 20 66 69  to the (iCol) fi
134a0 65 6c 64 20 70 72 65 66 69 78 20 6f 66 20 73 61  eld prefix of sa
134b0 6d 70 6c 65 20 69 2e 0a 20 20 20 20 20 20 2a 2a  mple i..      **
134c0 20 49 66 20 28 69 3e 30 29 2c 20 74 68 65 6e 20   If (i>0), then 
134d0 70 52 65 63 20 6d 75 73 74 20 61 6c 73 6f 20 62  pRec must also b
134e0 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 73  e greater than s
134f0 61 6d 70 6c 65 20 28 69 2d 31 29 2e 20 20 2a 2f  ample (i-1).  */
13500 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3e  .      if( iCol>
13510 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 52 65  0 ){.        pRe
13520 63 2d 3e 6e 46 69 65 6c 64 20 3d 20 69 43 6f 6c  c->nField = iCol
13530 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
13540 28 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  ( sqlite3VdbeRec
13550 6f 72 64 43 6f 6d 70 61 72 65 28 61 53 61 6d 70  ordCompare(aSamp
13560 6c 65 5b 69 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65  le[i].n, aSample
13570 5b 69 5d 2e 70 2c 20 70 52 65 63 29 3c 3d 30 0a  [i].p, pRec)<=0.
13580 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
13590 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
135a0 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
135b0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 3e    }.      if( i>
135c0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 52 65  0 ){.        pRe
135d0 63 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 46 69 65  c->nField = nFie
135e0 6c 64 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ld;.        asse
135f0 72 74 28 20 73 71 6c 69 74 65 33 56 64 62 65 52  rt( sqlite3VdbeR
13600 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 61 53 61  ecordCompare(aSa
13610 6d 70 6c 65 5b 69 2d 31 5d 2e 6e 2c 20 61 53 61  mple[i-1].n, aSa
13620 6d 70 6c 65 5b 69 2d 31 5d 2e 70 2c 20 70 52 65  mple[i-1].p, pRe
13630 63 29 3c 30 0a 20 20 20 20 20 20 20 20 20 20 20  c)<0.           
13640 20 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d    || pParse->db-
13650 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
13660 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
13670 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 69 66 64   }.#endif /* ifd
13680 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  ef SQLITE_DEBUG 
13690 2a 2f 0a 0a 20 20 69 66 28 20 72 65 73 3d 3d 30  */..  if( res==0
136a0 20 29 7b 0a 20 20 20 20 2f 2a 20 52 65 63 6f 72   ){.    /* Recor
136b0 64 20 70 52 65 63 20 69 73 20 65 71 75 61 6c 20  d pRec is equal 
136c0 74 6f 20 73 61 6d 70 6c 65 20 69 20 2a 2f 0a 20  to sample i */. 
136d0 20 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3d     assert( iCol=
136e0 3d 6e 46 69 65 6c 64 2d 31 20 29 3b 0a 20 20 20  =nField-1 );.   
136f0 20 61 53 74 61 74 5b 30 5d 20 3d 20 61 53 61 6d   aStat[0] = aSam
13700 70 6c 65 5b 69 5d 2e 61 6e 4c 74 5b 69 43 6f 6c  ple[i].anLt[iCol
13710 5d 3b 0a 20 20 20 20 61 53 74 61 74 5b 31 5d 20  ];.    aStat[1] 
13720 3d 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 61 6e 45  = aSample[i].anE
13730 71 5b 69 43 6f 6c 5d 3b 0a 20 20 7d 65 6c 73 65  q[iCol];.  }else
13740 7b 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73  {.    /* At this
13750 20 70 6f 69 6e 74 2c 20 74 68 65 20 28 69 43 6f   point, the (iCo
13760 6c 2b 31 29 20 66 69 65 6c 64 20 70 72 65 66 69  l+1) field prefi
13770 78 20 6f 66 20 61 53 61 6d 70 6c 65 5b 69 5d 20  x of aSample[i] 
13780 69 73 20 74 68 65 20 66 69 72 73 74 20 0a 20 20  is the first .  
13790 20 20 2a 2a 20 73 61 6d 70 6c 65 20 74 68 61 74    ** sample that
137a0 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
137b0 20 70 52 65 63 2e 20 4f 72 2c 20 69 66 20 69 3d   pRec. Or, if i=
137c0 3d 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 74  =pIdx->nSample t
137d0 68 65 6e 20 70 52 65 63 0a 20 20 20 20 2a 2a 20  hen pRec.    ** 
137e0 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 61  is larger than a
137f0 6c 6c 20 73 61 6d 70 6c 65 73 20 69 6e 20 74 68  ll samples in th
13800 65 20 61 72 72 61 79 2e 20 2a 2f 0a 20 20 20 20  e array. */.    
13810 74 52 6f 77 63 6e 74 20 69 55 70 70 65 72 2c 20  tRowcnt iUpper, 
13820 69 47 61 70 3b 0a 20 20 20 20 69 66 28 20 69 3e  iGap;.    if( i>
13830 3d 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 29  =pIdx->nSample )
13840 7b 0a 20 20 20 20 20 20 69 55 70 70 65 72 20 3d  {.      iUpper =
13850 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 54 6f   sqlite3LogEstTo
13860 49 6e 74 28 70 49 64 78 2d 3e 61 69 52 6f 77 4c  Int(pIdx->aiRowL
13870 6f 67 45 73 74 5b 30 5d 29 3b 0a 20 20 20 20 7d  ogEst[0]);.    }
13880 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 55 70 70  else{.      iUpp
13890 65 72 20 3d 20 61 53 61 6d 70 6c 65 5b 69 5d 2e  er = aSample[i].
138a0 61 6e 4c 74 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20  anLt[iCol];.    
138b0 7d 0a 0a 20 20 20 20 69 66 28 20 69 4c 6f 77 65  }..    if( iLowe
138c0 72 3e 3d 69 55 70 70 65 72 20 29 7b 0a 20 20 20  r>=iUpper ){.   
138d0 20 20 20 69 47 61 70 20 3d 20 30 3b 0a 20 20 20     iGap = 0;.   
138e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 47   }else{.      iG
138f0 61 70 20 3d 20 69 55 70 70 65 72 20 2d 20 69 4c  ap = iUpper - iL
13900 6f 77 65 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ower;.    }.    
13910 69 66 28 20 72 6f 75 6e 64 55 70 20 29 7b 0a 20  if( roundUp ){. 
13920 20 20 20 20 20 69 47 61 70 20 3d 20 28 69 47 61       iGap = (iGa
13930 70 2a 32 29 2f 33 3b 0a 20 20 20 20 7d 65 6c 73  p*2)/3;.    }els
13940 65 7b 0a 20 20 20 20 20 20 69 47 61 70 20 3d 20  e{.      iGap = 
13950 69 47 61 70 2f 33 3b 0a 20 20 20 20 7d 0a 20 20  iGap/3;.    }.  
13960 20 20 61 53 74 61 74 5b 30 5d 20 3d 20 69 4c 6f    aStat[0] = iLo
13970 77 65 72 20 2b 20 69 47 61 70 3b 0a 20 20 20 20  wer + iGap;.    
13980 61 53 74 61 74 5b 31 5d 20 3d 20 70 49 64 78 2d  aStat[1] = pIdx-
13990 3e 61 41 76 67 45 71 5b 69 43 6f 6c 5d 3b 0a 20  >aAvgEq[iCol];. 
139a0 20 7d 0a 0a 20 20 2f 2a 20 52 65 73 74 6f 72 65   }..  /* Restore
139b0 20 74 68 65 20 70 52 65 63 2d 3e 6e 46 69 65 6c   the pRec->nFiel
139c0 64 20 76 61 6c 75 65 20 62 65 66 6f 72 65 20 72  d value before r
139d0 65 74 75 72 6e 69 6e 67 2e 20 20 2a 2f 0a 20 20  eturning.  */.  
139e0 70 52 65 63 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e  pRec->nField = n
139f0 46 69 65 6c 64 3b 0a 20 20 72 65 74 75 72 6e 20  Field;.  return 
13a00 69 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  i;.}.#endif /* S
13a10 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
13a20 54 33 5f 4f 52 5f 53 54 41 54 34 20 2a 2f 0a 0a  T3_OR_STAT4 */..
13a30 2f 2a 0a 2a 2a 20 49 66 20 69 74 20 69 73 20 6e  /*.** If it is n
13a40 6f 74 20 4e 55 4c 4c 2c 20 70 54 65 72 6d 20 69  ot NULL, pTerm i
13a50 73 20 61 20 74 65 72 6d 20 74 68 61 74 20 70 72  s a term that pr
13a60 6f 76 69 64 65 73 20 61 6e 20 75 70 70 65 72 20  ovides an upper 
13a70 6f 72 20 6c 6f 77 65 72 0a 2a 2a 20 62 6f 75 6e  or lower.** boun
13a80 64 20 6f 6e 20 61 20 72 61 6e 67 65 20 73 63 61  d on a range sca
13a90 6e 2e 20 57 69 74 68 6f 75 74 20 63 6f 6e 73 69  n. Without consi
13aa0 64 65 72 69 6e 67 20 70 54 65 72 6d 2c 20 69 74  dering pTerm, it
13ab0 20 69 73 20 65 73 74 69 6d 61 74 65 64 20 0a 2a   is estimated .*
13ac0 2a 20 74 68 61 74 20 74 68 65 20 73 63 61 6e 20  * that the scan 
13ad0 77 69 6c 6c 20 76 69 73 69 74 20 6e 4e 65 77 20  will visit nNew 
13ae0 72 6f 77 73 2e 20 54 68 69 73 20 66 75 6e 63 74  rows. This funct
13af0 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20  ion returns the 
13b00 6e 75 6d 62 65 72 0a 2a 2a 20 65 73 74 69 6d 61  number.** estima
13b10 74 65 64 20 74 6f 20 62 65 20 76 69 73 69 74 65  ted to be visite
13b20 64 20 61 66 74 65 72 20 74 61 6b 69 6e 67 20 70  d after taking p
13b30 54 65 72 6d 20 69 6e 74 6f 20 61 63 63 6f 75 6e  Term into accoun
13b40 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  t..**.** If the 
13b50 75 73 65 72 20 65 78 70 6c 69 63 69 74 6c 79 20  user explicitly 
13b60 73 70 65 63 69 66 69 65 64 20 61 20 6c 69 6b 65  specified a like
13b70 6c 69 68 6f 6f 64 28 29 20 76 61 6c 75 65 20 66  lihood() value f
13b80 6f 72 20 74 68 69 73 20 74 65 72 6d 2c 0a 2a 2a  or this term,.**
13b90 20 74 68 65 6e 20 74 68 65 20 72 65 74 75 72 6e   then the return
13ba0 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 6c 69   value is the li
13bb0 6b 65 6c 69 68 6f 6f 64 20 6d 75 6c 74 69 70 6c  kelihood multipl
13bc0 69 65 64 20 62 79 20 74 68 65 20 6e 75 6d 62 65  ied by the numbe
13bd0 72 20 6f 66 0a 2a 2a 20 69 6e 70 75 74 20 72 6f  r of.** input ro
13be0 77 73 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74  ws. Otherwise, t
13bf0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 73 73  his function ass
13c00 75 6d 65 73 20 74 68 61 74 20 61 6e 20 22 49 53  umes that an "IS
13c10 20 4e 4f 54 20 4e 55 4c 4c 22 20 74 65 72 6d 0a   NOT NULL" term.
13c20 2a 2a 20 68 61 73 20 61 20 6c 69 6b 65 6c 69 68  ** has a likelih
13c30 6f 6f 64 20 6f 66 20 30 2e 35 30 2c 20 61 6e 64  ood of 0.50, and
13c40 20 61 6e 79 20 6f 74 68 65 72 20 74 65 72 6d 20   any other term 
13c50 61 20 6c 69 6b 65 6c 69 68 6f 6f 64 20 6f 66 20  a likelihood of 
13c60 30 2e 32 35 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  0.25..*/.static 
13c70 4c 6f 67 45 73 74 20 77 68 65 72 65 52 61 6e 67  LogEst whereRang
13c80 65 41 64 6a 75 73 74 28 57 68 65 72 65 54 65 72  eAdjust(WhereTer
13c90 6d 20 2a 70 54 65 72 6d 2c 20 4c 6f 67 45 73 74  m *pTerm, LogEst
13ca0 20 6e 4e 65 77 29 7b 0a 20 20 4c 6f 67 45 73 74   nNew){.  LogEst
13cb0 20 6e 52 65 74 20 3d 20 6e 4e 65 77 3b 0a 20 20   nRet = nNew;.  
13cc0 69 66 28 20 70 54 65 72 6d 20 29 7b 0a 20 20 20  if( pTerm ){.   
13cd0 20 69 66 28 20 70 54 65 72 6d 2d 3e 74 72 75 74   if( pTerm->trut
13ce0 68 50 72 6f 62 3c 3d 30 20 29 7b 0a 20 20 20 20  hProb<=0 ){.    
13cf0 20 20 6e 52 65 74 20 2b 3d 20 70 54 65 72 6d 2d    nRet += pTerm-
13d00 3e 74 72 75 74 68 50 72 6f 62 3b 0a 20 20 20 20  >truthProb;.    
13d10 7d 65 6c 73 65 20 69 66 28 20 28 70 54 65 72 6d  }else if( (pTerm
13d20 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
13d30 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29 7b 0a 20 20  _VNULL)==0 ){.  
13d40 20 20 20 20 6e 52 65 74 20 2d 3d 20 32 30 3b 20      nRet -= 20; 
13d50 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 32         assert( 2
13d60 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  0==sqlite3LogEst
13d70 28 34 29 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  (4) );.    }.  }
13d80 0a 20 20 72 65 74 75 72 6e 20 6e 52 65 74 3b 0a  .  return nRet;.
13d90 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
13da0 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52  _ENABLE_STAT3_OR
13db0 5f 53 54 41 54 34 0a 2f 2a 20 0a 2a 2a 20 54 68  _STAT4./* .** Th
13dc0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
13dd0 61 6c 6c 65 64 20 74 6f 20 65 73 74 69 6d 61 74  alled to estimat
13de0 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
13df0 72 6f 77 73 20 76 69 73 69 74 65 64 20 62 79 20  rows visited by 
13e00 61 0a 2a 2a 20 72 61 6e 67 65 2d 73 63 61 6e 20  a.** range-scan 
13e10 6f 6e 20 61 20 73 6b 69 70 2d 73 63 61 6e 20 69  on a skip-scan i
13e20 6e 64 65 78 2e 20 46 6f 72 20 65 78 61 6d 70 6c  ndex. For exampl
13e30 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 43 52 45 41 54  e:.**.**   CREAT
13e40 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31  E INDEX i1 ON t1
13e50 28 61 2c 20 62 2c 20 63 29 3b 0a 2a 2a 20 20 20  (a, b, c);.**   
13e60 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
13e70 20 57 48 45 52 45 20 61 3d 3f 20 41 4e 44 20 63   WHERE a=? AND c
13e80 20 42 45 54 57 45 45 4e 20 3f 20 41 4e 44 20 3f   BETWEEN ? AND ?
13e90 3b 0a 2a 2a 0a 2a 2a 20 56 61 6c 75 65 20 70 4c  ;.**.** Value pL
13ea0 6f 6f 70 2d 3e 6e 4f 75 74 20 69 73 20 63 75 72  oop->nOut is cur
13eb0 72 65 6e 74 6c 79 20 73 65 74 20 74 6f 20 74 68  rently set to th
13ec0 65 20 65 73 74 69 6d 61 74 65 64 20 6e 75 6d 62  e estimated numb
13ed0 65 72 20 6f 66 20 72 6f 77 73 20 0a 2a 2a 20 76  er of rows .** v
13ee0 69 73 69 74 65 64 20 66 6f 72 20 73 63 61 6e 6e  isited for scann
13ef0 69 6e 67 20 28 61 3d 3f 20 41 4e 44 20 62 3d 3f  ing (a=? AND b=?
13f00 29 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ). This function
13f10 20 72 65 64 75 63 65 73 20 74 68 61 74 20 65 73   reduces that es
13f20 74 69 6d 61 74 65 20 0a 2a 2a 20 62 79 20 73 6f  timate .** by so
13f30 6d 65 20 66 61 63 74 6f 72 20 74 6f 20 61 63 63  me factor to acc
13f40 6f 75 6e 74 20 66 6f 72 20 74 68 65 20 28 63 20  ount for the (c 
13f50 42 45 54 57 45 45 4e 20 3f 20 41 4e 44 20 3f 29  BETWEEN ? AND ?)
13f60 20 65 78 70 72 65 73 73 69 6f 6e 20 62 61 73 65   expression base
13f70 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 74 61 74  d.** on the stat
13f80 34 20 64 61 74 61 20 66 6f 72 20 74 68 65 20 69  4 data for the i
13f90 6e 64 65 78 2e 20 74 68 69 73 20 73 63 61 6e 20  ndex. this scan 
13fa0 77 69 6c 6c 20 62 65 20 70 65 66 6f 72 6d 65 64  will be peformed
13fb0 20 6d 75 6c 74 69 70 6c 65 20 0a 2a 2a 20 74 69   multiple .** ti
13fc0 6d 65 73 20 28 6f 6e 63 65 20 66 6f 72 20 65 61  mes (once for ea
13fd0 63 68 20 28 61 2c 62 29 20 63 6f 6d 62 69 6e 61  ch (a,b) combina
13fe0 74 69 6f 6e 20 74 68 61 74 20 6d 61 74 63 68 65  tion that matche
13ff0 73 20 61 3d 3f 29 20 69 73 20 64 65 61 6c 74 20  s a=?) is dealt 
14000 77 69 74 68 20 0a 2a 2a 20 62 79 20 74 68 65 20  with .** by the 
14010 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 74  caller..**.** It
14020 20 64 6f 65 73 20 74 68 69 73 20 62 79 20 73 63   does this by sc
14030 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67 68 20 61  anning through a
14040 6c 6c 20 73 74 61 74 34 20 73 61 6d 70 6c 65 73  ll stat4 samples
14050 2c 20 63 6f 6d 70 61 72 69 6e 67 20 76 61 6c 75  , comparing valu
14060 65 73 0a 2a 2a 20 65 78 74 72 61 63 74 65 64 20  es.** extracted 
14070 66 72 6f 6d 20 70 4c 6f 77 65 72 20 61 6e 64 20  from pLower and 
14080 70 55 70 70 65 72 20 77 69 74 68 20 74 68 65 20  pUpper with the 
14090 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 63 6f  corresponding co
140a0 6c 75 6d 6e 20 69 6e 20 65 61 63 68 0a 2a 2a 20  lumn in each.** 
140b0 73 61 6d 70 6c 65 2e 20 49 66 20 4c 20 61 6e 64  sample. If L and
140c0 20 55 20 61 72 65 20 74 68 65 20 6e 75 6d 62 65   U are the numbe
140d0 72 20 6f 66 20 73 61 6d 70 6c 65 73 20 66 6f 75  r of samples fou
140e0 6e 64 20 74 6f 20 62 65 20 6c 65 73 73 20 74 68  nd to be less th
140f0 61 6e 20 6f 72 0a 2a 2a 20 65 71 75 61 6c 20 74  an or.** equal t
14100 6f 20 74 68 65 20 76 61 6c 75 65 73 20 65 78 74  o the values ext
14110 72 61 63 74 65 64 20 66 72 6f 6d 20 70 4c 6f 77  racted from pLow
14120 65 72 20 61 6e 64 20 70 55 70 70 65 72 20 72 65  er and pUpper re
14130 73 70 65 63 74 69 76 65 6c 79 2c 20 61 6e 64 0a  spectively, and.
14140 2a 2a 20 4e 20 69 73 20 74 68 65 20 74 6f 74 61  ** N is the tota
14150 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73 61 6d 70  l number of samp
14160 6c 65 73 2c 20 74 68 65 20 70 4c 6f 6f 70 2d 3e  les, the pLoop->
14170 6e 4f 75 74 20 76 61 6c 75 65 20 69 73 20 61 64  nOut value is ad
14180 6a 75 73 74 65 64 0a 2a 2a 20 61 73 20 66 6f 6c  justed.** as fol
14190 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 6e 4f  lows:.**.**   nO
141a0 75 74 20 3d 20 6e 4f 75 74 20 2a 20 28 20 6d 69  ut = nOut * ( mi
141b0 6e 28 55 20 2d 20 4c 2c 20 31 29 20 2f 20 4e 20  n(U - L, 1) / N 
141c0 29 0a 2a 2a 0a 2a 2a 20 49 66 20 70 4c 6f 77 65  ).**.** If pLowe
141d0 72 20 69 73 20 4e 55 4c 4c 2c 20 6f 72 20 61 20  r is NULL, or a 
141e0 76 61 6c 75 65 20 63 61 6e 6e 6f 74 20 62 65 20  value cannot be 
141f0 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74  extracted from t
14200 68 65 20 74 65 72 6d 2c 20 4c 20 69 73 0a 2a 2a  he term, L is.**
14210 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 49 66   set to zero. If
14220 20 70 55 70 70 65 72 20 69 73 20 4e 55 4c 4c 2c   pUpper is NULL,
14230 20 6f 72 20 61 20 76 61 6c 75 65 20 63 61 6e 6e   or a value cann
14240 6f 74 20 62 65 20 65 78 74 72 61 63 74 65 64 20  ot be extracted 
14250 66 72 6f 6d 20 69 74 2c 0a 2a 2a 20 55 20 69 73  from it,.** U is
14260 20 73 65 74 20 74 6f 20 4e 2e 0a 2a 2a 0a 2a 2a   set to N..**.**
14270 20 4e 6f 72 6d 61 6c 6c 79 2c 20 74 68 69 73 20   Normally, this 
14280 66 75 6e 63 74 69 6f 6e 20 73 65 74 73 20 2a 70  function sets *p
14290 62 44 6f 6e 65 20 74 6f 20 31 20 62 65 66 6f 72  bDone to 1 befor
142a0 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 48 6f 77  e returning. How
142b0 65 76 65 72 2c 0a 2a 2a 20 69 66 20 6e 6f 20 76  ever,.** if no v
142c0 61 6c 75 65 20 63 61 6e 20 62 65 20 65 78 74 72  alue can be extr
142d0 61 63 74 65 64 20 66 72 6f 6d 20 65 69 74 68 65  acted from eithe
142e0 72 20 70 4c 6f 77 65 72 20 6f 72 20 70 55 70 70  r pLower or pUpp
142f0 65 72 20 28 61 6e 64 20 73 6f 20 74 68 65 0a 2a  er (and so the.*
14300 2a 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68  * estimate of th
14310 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
14320 20 64 65 6c 69 76 65 72 65 64 20 72 65 6d 61 69   delivered remai
14330 6e 73 20 75 6e 63 68 61 6e 67 65 64 29 2c 20 2a  ns unchanged), *
14340 70 62 44 6f 6e 65 0a 2a 2a 20 69 73 20 6c 65 66  pbDone.** is lef
14350 74 20 61 73 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 49  t as is..**.** I
14360 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
14370 73 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  s, an SQLite err
14380 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
14390 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ned. Otherwise, 
143a0 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  .** SQLITE_OK..*
143b0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  /.static int whe
143c0 72 65 52 61 6e 67 65 53 6b 69 70 53 63 61 6e 45  reRangeSkipScanE
143d0 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  st(.  Parse *pPa
143e0 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61  rse,       /* Pa
143f0 72 73 69 6e 67 20 26 20 63 6f 64 65 20 67 65 6e  rsing & code gen
14400 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20  erating context 
14410 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  */.  WhereTerm *
14420 70 4c 6f 77 65 72 2c 20 20 20 2f 2a 20 4c 6f 77  pLower,   /* Low
14430 65 72 20 62 6f 75 6e 64 20 6f 6e 20 74 68 65 20  er bound on the 
14440 72 61 6e 67 65 2e 20 65 78 3a 20 22 78 3e 31 32  range. ex: "x>12
14450 33 22 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c  3" Might be NULL
14460 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
14470 2a 70 55 70 70 65 72 2c 20 20 20 2f 2a 20 55 70  *pUpper,   /* Up
14480 70 65 72 20 62 6f 75 6e 64 20 6f 6e 20 74 68 65  per bound on the
14490 20 72 61 6e 67 65 2e 20 65 78 3a 20 22 78 3c 34   range. ex: "x<4
144a0 35 35 22 20 4d 69 67 68 74 20 62 65 20 4e 55 4c  55" Might be NUL
144b0 4c 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70  L */.  WhereLoop
144c0 20 2a 70 4c 6f 6f 70 2c 20 20 20 20 2f 2a 20 55   *pLoop,    /* U
144d0 70 64 61 74 65 20 74 68 65 20 2e 6e 4f 75 74 20  pdate the .nOut 
144e0 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20 6c 6f  value of this lo
144f0 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 62 44  op */.  int *pbD
14500 6f 6e 65 20 20 20 20 20 20 20 20 20 20 2f 2a 20  one          /* 
14510 53 65 74 20 74 6f 20 74 72 75 65 20 69 66 20 61  Set to true if a
14520 74 20 6c 65 61 73 74 20 6f 6e 65 20 65 78 70 72  t least one expr
14530 2e 20 76 61 6c 75 65 20 65 78 74 72 61 63 74 65  . value extracte
14540 64 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 20  d */.){.  Index 
14550 2a 70 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  *p = pLoop->u.bt
14560 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 69 6e  ree.pIndex;.  in
14570 74 20 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e 75  t nEq = pLoop->u
14580 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20 73 71  .btree.nEq;.  sq
14590 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
145a0 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 6e 4c  se->db;.  int nL
145b0 6f 77 65 72 20 3d 20 2d 31 3b 0a 20 20 69 6e 74  ower = -1;.  int
145c0 20 6e 55 70 70 65 72 20 3d 20 70 2d 3e 6e 53 61   nUpper = p->nSa
145d0 6d 70 6c 65 2b 31 3b 0a 20 20 69 6e 74 20 72 63  mple+1;.  int rc
145e0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
145f0 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 61 69  int iCol = p->ai
14600 43 6f 6c 75 6d 6e 5b 6e 45 71 5d 3b 0a 20 20 75  Column[nEq];.  u
14610 38 20 61 66 66 20 3d 20 69 43 6f 6c 3e 3d 30 20  8 aff = iCol>=0 
14620 3f 20 70 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f  ? p->pTable->aCo
14630 6c 5b 69 43 6f 6c 5d 2e 61 66 66 69 6e 69 74 79  l[iCol].affinity
14640 20 3a 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e   : SQLITE_AFF_IN
14650 54 45 47 45 52 3b 0a 20 20 43 6f 6c 6c 53 65 71  TEGER;.  CollSeq
14660 20 2a 70 43 6f 6c 6c 3b 0a 20 20 0a 20 20 73 71   *pColl;.  .  sq
14670 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 31 20  lite3_value *p1 
14680 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  = 0;          /*
14690 20 56 61 6c 75 65 20 65 78 74 72 61 63 74 65 64   Value extracted
146a0 20 66 72 6f 6d 20 70 4c 6f 77 65 72 20 2a 2f 0a   from pLower */.
146b0 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
146c0 2a 70 32 20 3d 20 30 3b 20 20 20 20 20 20 20 20  *p2 = 0;        
146d0 20 20 2f 2a 20 56 61 6c 75 65 20 65 78 74 72 61    /* Value extra
146e0 63 74 65 64 20 66 72 6f 6d 20 70 55 70 70 65 72  cted from pUpper
146f0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61   */.  sqlite3_va
14700 6c 75 65 20 2a 70 56 61 6c 20 3d 20 30 3b 20 20  lue *pVal = 0;  
14710 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 65        /* Value e
14720 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 72 65  xtracted from re
14730 63 6f 72 64 20 2a 2f 0a 0a 20 20 70 43 6f 6c 6c  cord */..  pColl
14740 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65   = sqlite3Locate
14750 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
14760 70 2d 3e 61 7a 43 6f 6c 6c 5b 6e 45 71 5d 29 3b  p->azColl[nEq]);
14770 0a 20 20 69 66 28 20 70 4c 6f 77 65 72 20 29 7b  .  if( pLower ){
14780 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
14790 33 53 74 61 74 34 56 61 6c 75 65 46 72 6f 6d 45  3Stat4ValueFromE
147a0 78 70 72 28 70 50 61 72 73 65 2c 20 70 4c 6f 77  xpr(pParse, pLow
147b0 65 72 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68  er->pExpr->pRigh
147c0 74 2c 20 61 66 66 2c 20 26 70 31 29 3b 0a 20 20  t, aff, &p1);.  
147d0 20 20 6e 4c 6f 77 65 72 20 3d 20 30 3b 0a 20 20    nLower = 0;.  
147e0 7d 0a 20 20 69 66 28 20 70 55 70 70 65 72 20 26  }.  if( pUpper &
147f0 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
14800 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
14810 74 65 33 53 74 61 74 34 56 61 6c 75 65 46 72 6f  te3Stat4ValueFro
14820 6d 45 78 70 72 28 70 50 61 72 73 65 2c 20 70 55  mExpr(pParse, pU
14830 70 70 65 72 2d 3e 70 45 78 70 72 2d 3e 70 52 69  pper->pExpr->pRi
14840 67 68 74 2c 20 61 66 66 2c 20 26 70 32 29 3b 0a  ght, aff, &p2);.
14850 20 20 20 20 6e 55 70 70 65 72 20 3d 20 70 32 20      nUpper = p2 
14860 3f 20 30 20 3a 20 70 2d 3e 6e 53 61 6d 70 6c 65  ? 0 : p->nSample
14870 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 31 20  ;.  }..  if( p1 
14880 7c 7c 20 70 32 20 29 7b 0a 20 20 20 20 69 6e 74  || p2 ){.    int
14890 20 69 3b 0a 20 20 20 20 69 6e 74 20 6e 44 69 66   i;.    int nDif
148a0 66 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  f;.    for(i=0; 
148b0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
148c0 20 69 3c 70 2d 3e 6e 53 61 6d 70 6c 65 3b 20 69   i<p->nSample; i
148d0 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ++){.      rc = 
148e0 73 71 6c 69 74 65 33 53 74 61 74 34 43 6f 6c 75  sqlite3Stat4Colu
148f0 6d 6e 28 64 62 2c 20 70 2d 3e 61 53 61 6d 70 6c  mn(db, p->aSampl
14900 65 5b 69 5d 2e 70 2c 20 70 2d 3e 61 53 61 6d 70  e[i].p, p->aSamp
14910 6c 65 5b 69 5d 2e 6e 2c 20 6e 45 71 2c 20 26 70  le[i].n, nEq, &p
14920 56 61 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Val);.      if( 
14930 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
14940 20 70 31 20 29 7b 0a 20 20 20 20 20 20 20 20 69   p1 ){.        i
14950 6e 74 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33  nt res = sqlite3
14960 4d 65 6d 43 6f 6d 70 61 72 65 28 70 31 2c 20 70  MemCompare(p1, p
14970 56 61 6c 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20 20  Val, pColl);.   
14980 20 20 20 20 20 69 66 28 20 72 65 73 3e 3d 30 20       if( res>=0 
14990 29 20 6e 4c 6f 77 65 72 2b 2b 3b 0a 20 20 20 20  ) nLower++;.    
149a0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
149b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
149c0 32 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  2 ){.        int
149d0 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33 4d 65   res = sqlite3Me
149e0 6d 43 6f 6d 70 61 72 65 28 70 32 2c 20 70 56 61  mCompare(p2, pVa
149f0 6c 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20 20 20 20  l, pColl);.     
14a00 20 20 20 69 66 28 20 72 65 73 3e 3d 30 20 29 20     if( res>=0 ) 
14a10 6e 55 70 70 65 72 2b 2b 3b 0a 20 20 20 20 20 20  nUpper++;.      
14a20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6e 44 69 66  }.    }.    nDif
14a30 66 20 3d 20 28 6e 55 70 70 65 72 20 2d 20 6e 4c  f = (nUpper - nL
14a40 6f 77 65 72 29 3b 0a 20 20 20 20 69 66 28 20 6e  ower);.    if( n
14a50 44 69 66 66 3c 3d 30 20 29 20 6e 44 69 66 66 20  Diff<=0 ) nDiff 
14a60 3d 20 31 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  = 1;..    /* If 
14a70 74 68 65 72 65 20 69 73 20 62 6f 74 68 20 61 6e  there is both an
14a80 20 75 70 70 65 72 20 61 6e 64 20 6c 6f 77 65 72   upper and lower
14a90 20 62 6f 75 6e 64 20 73 70 65 63 69 66 69 65 64   bound specified
14aa0 2c 20 61 6e 64 20 74 68 65 20 0a 20 20 20 20 2a  , and the .    *
14ab0 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 73 20 69 6e  * comparisons in
14ac0 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65 79  dicate that they
14ad0 20 61 72 65 20 63 6c 6f 73 65 20 74 6f 67 65 74   are close toget
14ae0 68 65 72 2c 20 75 73 65 20 74 68 65 20 66 61 6c  her, use the fal
14af0 6c 62 61 63 6b 0a 20 20 20 20 2a 2a 20 6d 65 74  lback.    ** met
14b00 68 6f 64 20 28 61 73 73 75 6d 65 20 74 68 61 74  hod (assume that
14b10 20 74 68 65 20 73 63 61 6e 20 76 69 73 69 74 73   the scan visits
14b20 20 31 2f 36 34 20 6f 66 20 74 68 65 20 72 6f 77   1/64 of the row
14b30 73 29 20 66 6f 72 20 65 73 74 69 6d 61 74 69 6e  s) for estimatin
14b40 67 0a 20 20 20 20 2a 2a 20 74 68 65 20 6e 75 6d  g.    ** the num
14b50 62 65 72 20 6f 66 20 72 6f 77 73 20 76 69 73 69  ber of rows visi
14b60 74 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ted. Otherwise, 
14b70 65 73 74 69 6d 61 74 65 20 74 68 65 20 6e 75 6d  estimate the num
14b80 62 65 72 20 6f 66 20 72 6f 77 73 0a 20 20 20 20  ber of rows.    
14b90 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 6d 65 74  ** using the met
14ba0 68 6f 64 20 64 65 73 63 72 69 62 65 64 20 69 6e  hod described in
14bb0 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d   the header comm
14bc0 65 6e 74 20 66 6f 72 20 74 68 69 73 20 66 75 6e  ent for this fun
14bd0 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69 66  ction. */.    if
14be0 28 20 6e 44 69 66 66 21 3d 31 20 7c 7c 20 70 55  ( nDiff!=1 || pU
14bf0 70 70 65 72 3d 3d 30 20 7c 7c 20 70 4c 6f 77 65  pper==0 || pLowe
14c00 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  r==0 ){.      in
14c10 74 20 6e 41 64 6a 75 73 74 20 3d 20 28 73 71 6c  t nAdjust = (sql
14c20 69 74 65 33 4c 6f 67 45 73 74 28 70 2d 3e 6e 53  ite3LogEst(p->nS
14c30 61 6d 70 6c 65 29 20 2d 20 73 71 6c 69 74 65 33  ample) - sqlite3
14c40 4c 6f 67 45 73 74 28 6e 44 69 66 66 29 29 3b 0a  LogEst(nDiff));.
14c50 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75        pLoop->nOu
14c60 74 20 2d 3d 20 6e 41 64 6a 75 73 74 3b 0a 20 20  t -= nAdjust;.  
14c70 20 20 20 20 2a 70 62 44 6f 6e 65 20 3d 20 31 3b      *pbDone = 1;
14c80 0a 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43  .      WHERETRAC
14c90 45 28 30 78 31 30 2c 20 28 22 72 61 6e 67 65 20  E(0x10, ("range 
14ca0 73 6b 69 70 2d 73 63 61 6e 20 72 65 67 69 6f 6e  skip-scan region
14cb0 73 3a 20 25 75 2e 2e 25 75 20 20 61 64 6a 75 73  s: %u..%u  adjus
14cc0 74 3d 25 64 20 65 73 74 3d 25 64 5c 6e 22 2c 0a  t=%d est=%d\n",.
14cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ce0 20 20 20 20 20 20 20 20 20 20 20 6e 4c 6f 77 65             nLowe
14cf0 72 2c 20 6e 55 70 70 65 72 2c 20 6e 41 64 6a 75  r, nUpper, nAdju
14d00 73 74 2a 2d 31 2c 20 70 4c 6f 6f 70 2d 3e 6e 4f  st*-1, pLoop->nO
14d10 75 74 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d  ut));.    }..  }
14d20 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
14d30 28 20 2a 70 62 44 6f 6e 65 3d 3d 30 20 29 3b 0a  ( *pbDone==0 );.
14d40 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 56 61    }..  sqlite3Va
14d50 6c 75 65 46 72 65 65 28 70 31 29 3b 0a 20 20 73  lueFree(p1);.  s
14d60 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28  qlite3ValueFree(
14d70 70 32 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 61  p2);.  sqlite3Va
14d80 6c 75 65 46 72 65 65 28 70 56 61 6c 29 3b 0a 0a  lueFree(pVal);..
14d90 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
14da0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
14db0 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f  ENABLE_STAT3_OR_
14dc0 53 54 41 54 34 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  STAT4 */../*.** 
14dd0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
14de0 20 75 73 65 64 20 74 6f 20 65 73 74 69 6d 61 74   used to estimat
14df0 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
14e00 72 6f 77 73 20 74 68 61 74 20 77 69 6c 6c 20 62  rows that will b
14e10 65 20 76 69 73 69 74 65 64 0a 2a 2a 20 62 79 20  e visited.** by 
14e20 73 63 61 6e 6e 69 6e 67 20 61 6e 20 69 6e 64 65  scanning an inde
14e30 78 20 66 6f 72 20 61 20 72 61 6e 67 65 20 6f 66  x for a range of
14e40 20 76 61 6c 75 65 73 2e 20 54 68 65 20 72 61 6e   values. The ran
14e50 67 65 20 6d 61 79 20 68 61 76 65 20 61 6e 20 75  ge may have an u
14e60 70 70 65 72 0a 2a 2a 20 62 6f 75 6e 64 2c 20 61  pper.** bound, a
14e70 20 6c 6f 77 65 72 20 62 6f 75 6e 64 2c 20 6f 72   lower bound, or
14e80 20 62 6f 74 68 2e 20 54 68 65 20 57 48 45 52 45   both. The WHERE
14e90 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 74 68   clause terms th
14ea0 61 74 20 73 65 74 20 74 68 65 20 75 70 70 65 72  at set the upper
14eb0 0a 2a 2a 20 61 6e 64 20 6c 6f 77 65 72 20 62 6f  .** and lower bo
14ec0 75 6e 64 73 20 61 72 65 20 72 65 70 72 65 73 65  unds are represe
14ed0 6e 74 65 64 20 62 79 20 70 4c 6f 77 65 72 20 61  nted by pLower a
14ee0 6e 64 20 70 55 70 70 65 72 20 72 65 73 70 65 63  nd pUpper respec
14ef0 74 69 76 65 6c 79 2e 20 46 6f 72 0a 2a 2a 20 65  tively. For.** e
14f00 78 61 6d 70 6c 65 2c 20 61 73 73 75 6d 69 6e 67  xample, assuming
14f10 20 74 68 61 74 20 69 6e 64 65 78 20 70 20 69 73   that index p is
14f20 20 6f 6e 20 74 31 28 61 29 3a 0a 2a 2a 0a 2a 2a   on t1(a):.**.**
14f30 20 20 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 57     ... FROM t1 W
14f40 48 45 52 45 20 61 20 3e 20 3f 20 41 4e 44 20 61  HERE a > ? AND a
14f50 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20   < ? ....**     
14f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
14f70 5f 5f 5f 5f 5f 7c 20 20 20 7c 5f 5f 5f 5f 5f 7c  _____|   |_____|
14f80 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
14f90 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20            |     
14fa0 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20      |.**        
14fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 6f               pLo
14fc0 77 65 72 20 20 20 20 70 55 70 70 65 72 0a 2a 2a  wer    pUpper.**
14fd0 0a 2a 2a 20 49 66 20 65 69 74 68 65 72 20 6f 66  .** If either of
14fe0 20 74 68 65 20 75 70 70 65 72 20 6f 72 20 6c 6f   the upper or lo
14ff0 77 65 72 20 62 6f 75 6e 64 20 69 73 20 6e 6f 74  wer bound is not
15000 20 70 72 65 73 65 6e 74 2c 20 74 68 65 6e 20 4e   present, then N
15010 55 4c 4c 20 69 73 20 70 61 73 73 65 64 20 69 6e  ULL is passed in
15020 0a 2a 2a 20 70 6c 61 63 65 20 6f 66 20 74 68 65  .** place of the
15030 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 57   corresponding W
15040 68 65 72 65 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20  hereTerm..**.** 
15050 54 68 65 20 76 61 6c 75 65 20 69 6e 20 28 70 42  The value in (pB
15060 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e  uilder->pNew->u.
15070 62 74 72 65 65 2e 6e 45 71 29 20 69 73 20 74 68  btree.nEq) is th
15080 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
15090 69 6e 64 65 78 0a 2a 2a 20 63 6f 6c 75 6d 6e 20  index.** column 
150a0 73 75 62 6a 65 63 74 20 74 6f 20 74 68 65 20 72  subject to the r
150b0 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 2e  ange constraint.
150c0 20 4f 72 2c 20 65 71 75 69 76 61 6c 65 6e 74 6c   Or, equivalentl
150d0 79 2c 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  y, the number of
150e0 0a 2a 2a 20 65 71 75 61 6c 69 74 79 20 63 6f 6e  .** equality con
150f0 73 74 72 61 69 6e 74 73 20 6f 70 74 69 6d 69 7a  straints optimiz
15100 65 64 20 62 79 20 74 68 65 20 70 72 6f 70 6f 73  ed by the propos
15110 65 64 20 69 6e 64 65 78 20 73 63 61 6e 2e 20 46  ed index scan. F
15120 6f 72 20 65 78 61 6d 70 6c 65 2c 0a 2a 2a 20 61  or example,.** a
15130 73 73 75 6d 69 6e 67 20 69 6e 64 65 78 20 70 20  ssuming index p 
15140 69 73 20 6f 6e 20 74 31 28 61 2c 20 62 29 2c 20  is on t1(a, b), 
15150 61 6e 64 20 74 68 65 20 53 51 4c 20 71 75 65 72  and the SQL quer
15160 79 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e  y is:.**.**   ..
15170 2e 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  . FROM t1 WHERE 
15180 61 20 3d 20 3f 20 41 4e 44 20 62 20 3e 20 3f 20  a = ? AND b > ? 
15190 41 4e 44 20 62 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a  AND b < ? ....**
151a0 0a 2a 2a 20 74 68 65 6e 20 6e 45 71 20 69 73 20  .** then nEq is 
151b0 73 65 74 20 74 6f 20 31 20 28 61 73 20 74 68 65  set to 1 (as the
151c0 20 72 61 6e 67 65 20 72 65 73 74 72 69 63 74 65   range restricte
151d0 64 20 63 6f 6c 75 6d 6e 2c 20 62 2c 20 69 73 20  d column, b, is 
151e0 74 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a 20 6c  the second .** l
151f0 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20  eft-most column 
15200 6f 66 20 74 68 65 20 69 6e 64 65 78 29 2e 20 4f  of the index). O
15210 72 2c 20 69 66 20 74 68 65 20 71 75 65 72 79 20  r, if the query 
15220 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20  is:.**.**   ... 
15230 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 20  FROM t1 WHERE a 
15240 3e 20 3f 20 41 4e 44 20 61 20 3c 20 3f 20 2e 2e  > ? AND a < ? ..
15250 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 6e 45 71  ..**.** then nEq
15260 20 69 73 20 73 65 74 20 74 6f 20 30 2e 0a 2a 2a   is set to 0..**
15270 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 66 75  .** When this fu
15280 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
15290 2c 20 2a 70 6e 4f 75 74 20 69 73 20 73 65 74 20  , *pnOut is set 
152a0 74 6f 20 74 68 65 20 73 71 6c 69 74 65 33 4c 6f  to the sqlite3Lo
152b0 67 45 73 74 28 29 20 6f 66 20 74 68 65 0a 2a 2a  gEst() of the.**
152c0 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
152d0 74 68 61 74 20 74 68 65 20 69 6e 64 65 78 20 73  that the index s
152e0 63 61 6e 20 69 73 20 65 78 70 65 63 74 65 64 20  can is expected 
152f0 74 6f 20 76 69 73 69 74 20 77 69 74 68 6f 75 74  to visit without
15300 20 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 69 6e 67   .** considering
15310 20 74 68 65 20 72 61 6e 67 65 20 63 6f 6e 73 74   the range const
15320 72 61 69 6e 74 73 2e 20 49 66 20 6e 45 71 20 69  raints. If nEq i
15330 73 20 30 2c 20 74 68 65 6e 20 2a 70 6e 4f 75 74  s 0, then *pnOut
15340 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
15350 66 20 0a 2a 2a 20 72 6f 77 73 20 69 6e 20 74 68  f .** rows in th
15360 65 20 69 6e 64 65 78 2e 20 41 73 73 75 6d 69 6e  e index. Assumin
15370 67 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72  g no error occur
15380 73 2c 20 2a 70 6e 4f 75 74 20 69 73 20 61 64 6a  s, *pnOut is adj
15390 75 73 74 65 64 20 28 72 65 64 75 63 65 64 29 0a  usted (reduced).
153a0 2a 2a 20 74 6f 20 61 63 63 6f 75 6e 74 20 66 6f  ** to account fo
153b0 72 20 74 68 65 20 72 61 6e 67 65 20 63 6f 6e 73  r the range cons
153c0 74 72 61 69 6e 74 73 20 70 4c 6f 77 65 72 20 61  traints pLower a
153d0 6e 64 20 70 55 70 70 65 72 2e 0a 2a 2a 20 0a 2a  nd pUpper..** .*
153e0 2a 20 49 6e 20 74 68 65 20 61 62 73 65 6e 63 65  * In the absence
153f0 20 6f 66 20 73 71 6c 69 74 65 5f 73 74 61 74 34   of sqlite_stat4
15400 20 41 4e 41 4c 59 5a 45 20 64 61 74 61 2c 20 6f   ANALYZE data, o
15410 72 20 69 66 20 73 75 63 68 20 64 61 74 61 20 63  r if such data c
15420 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 75 73 65 64  annot be.** used
15430 2c 20 61 20 73 69 6e 67 6c 65 20 72 61 6e 67 65  , a single range
15440 20 69 6e 65 71 75 61 6c 69 74 79 20 72 65 64 75   inequality redu
15450 63 65 73 20 74 68 65 20 73 65 61 72 63 68 20 73  ces the search s
15460 70 61 63 65 20 62 79 20 61 20 66 61 63 74 6f 72  pace by a factor
15470 20 6f 66 20 34 2e 20 0a 2a 2a 20 61 6e 64 20 61   of 4. .** and a
15480 20 70 61 69 72 20 6f 66 20 63 6f 6e 73 74 72 61   pair of constra
15490 69 6e 74 73 20 28 78 3e 3f 20 41 4e 44 20 78 3c  ints (x>? AND x<
154a0 3f 29 20 72 65 64 75 63 65 73 20 74 68 65 20 65  ?) reduces the e
154b0 78 70 65 63 74 65 64 20 6e 75 6d 62 65 72 20 6f  xpected number o
154c0 66 0a 2a 2a 20 72 6f 77 73 20 76 69 73 69 74 65  f.** rows visite
154d0 64 20 62 79 20 61 20 66 61 63 74 6f 72 20 6f 66  d by a factor of
154e0 20 36 34 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69   64..*/.static i
154f0 6e 74 20 77 68 65 72 65 52 61 6e 67 65 53 63 61  nt whereRangeSca
15500 6e 45 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70  nEst(.  Parse *p
15510 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20  Parse,       /* 
15520 50 61 72 73 69 6e 67 20 26 20 63 6f 64 65 20 67  Parsing & code g
15530 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78  enerating contex
15540 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70  t */.  WhereLoop
15550 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65  Builder *pBuilde
15560 72 2c 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  r,.  WhereTerm *
15570 70 4c 6f 77 65 72 2c 20 20 20 2f 2a 20 4c 6f 77  pLower,   /* Low
15580 65 72 20 62 6f 75 6e 64 20 6f 6e 20 74 68 65 20  er bound on the 
15590 72 61 6e 67 65 2e 20 65 78 3a 20 22 78 3e 31 32  range. ex: "x>12
155a0 33 22 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c  3" Might be NULL
155b0 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
155c0 2a 70 55 70 70 65 72 2c 20 20 20 2f 2a 20 55 70  *pUpper,   /* Up
155d0 70 65 72 20 62 6f 75 6e 64 20 6f 6e 20 74 68 65  per bound on the
155e0 20 72 61 6e 67 65 2e 20 65 78 3a 20 22 78 3c 34   range. ex: "x<4
155f0 35 35 22 20 4d 69 67 68 74 20 62 65 20 4e 55 4c  55" Might be NUL
15600 4c 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70  L */.  WhereLoop
15610 20 2a 70 4c 6f 6f 70 20 20 20 20 20 2f 2a 20 4d   *pLoop     /* M
15620 6f 64 69 66 79 20 74 68 65 20 2e 6e 4f 75 74 20  odify the .nOut 
15630 61 6e 64 20 6d 61 79 62 65 20 2e 72 52 75 6e 20  and maybe .rRun 
15640 66 69 65 6c 64 73 20 2a 2f 0a 29 7b 0a 20 20 69  fields */.){.  i
15650 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
15660 4b 3b 0a 20 20 69 6e 74 20 6e 4f 75 74 20 3d 20  K;.  int nOut = 
15670 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 3b 0a 20 20 4c  pLoop->nOut;.  L
15680 6f 67 45 73 74 20 6e 4e 65 77 3b 0a 0a 23 69 66  ogEst nNew;..#if
15690 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
156a0 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34  E_STAT3_OR_STAT4
156b0 0a 20 20 49 6e 64 65 78 20 2a 70 20 3d 20 70 4c  .  Index *p = pL
156c0 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  oop->u.btree.pIn
156d0 64 65 78 3b 0a 20 20 69 6e 74 20 6e 45 71 20 3d  dex;.  int nEq =
156e0 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
156f0 6e 45 71 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 6e  nEq;..  if( p->n
15700 53 61 6d 70 6c 65 3e 30 20 26 26 20 6e 45 71 3c  Sample>0 && nEq<
15710 70 2d 3e 6e 53 61 6d 70 6c 65 43 6f 6c 20 29 7b  p->nSampleCol ){
15720 0a 20 20 20 20 69 66 28 20 6e 45 71 3d 3d 70 42  .    if( nEq==pB
15730 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69  uilder->nRecVali
15740 64 20 29 7b 0a 20 20 20 20 20 20 55 6e 70 61 63  d ){.      Unpac
15750 6b 65 64 52 65 63 6f 72 64 20 2a 70 52 65 63 20  kedRecord *pRec 
15760 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 52 65 63  = pBuilder->pRec
15770 3b 0a 20 20 20 20 20 20 74 52 6f 77 63 6e 74 20  ;.      tRowcnt 
15780 61 5b 32 5d 3b 0a 20 20 20 20 20 20 75 38 20 61  a[2];.      u8 a
15790 66 66 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 56 61  ff;..      /* Va
157a0 72 69 61 62 6c 65 20 69 4c 6f 77 65 72 20 77 69  riable iLower wi
157b0 6c 6c 20 62 65 20 73 65 74 20 74 6f 20 74 68 65  ll be set to the
157c0 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65   estimate of the
157d0 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
157e0 69 6e 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  in .      ** the
157f0 20 69 6e 64 65 78 20 74 68 61 74 20 61 72 65 20   index that are 
15800 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20 6c 6f  less than the lo
15810 77 65 72 20 62 6f 75 6e 64 20 6f 66 20 74 68 65  wer bound of the
15820 20 72 61 6e 67 65 20 71 75 65 72 79 2e 20 54 68   range query. Th
15830 65 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 77 65 72  e.      ** lower
15840 20 62 6f 75 6e 64 20 62 65 69 6e 67 20 74 68 65   bound being the
15850 20 63 6f 6e 63 61 74 65 6e 61 74 69 6f 6e 20 6f   concatenation o
15860 66 20 24 50 20 61 6e 64 20 24 4c 2c 20 77 68 65  f $P and $L, whe
15870 72 65 20 24 50 20 69 73 20 74 68 65 0a 20 20 20  re $P is the.   
15880 20 20 20 2a 2a 20 6b 65 79 2d 70 72 65 66 69 78     ** key-prefix
15890 20 66 6f 72 6d 65 64 20 62 79 20 74 68 65 20 6e   formed by the n
158a0 45 71 20 76 61 6c 75 65 73 20 6d 61 74 63 68 65  Eq values matche
158b0 64 20 61 67 61 69 6e 73 74 20 74 68 65 20 6e 45  d against the nE
158c0 71 20 6c 65 66 74 2d 6d 6f 73 74 0a 20 20 20 20  q left-most.    
158d0 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20 6f 66 20    ** columns of 
158e0 74 68 65 20 69 6e 64 65 78 2c 20 61 6e 64 20 24  the index, and $
158f0 4c 20 69 73 20 74 68 65 20 76 61 6c 75 65 20 69  L is the value i
15900 6e 20 70 4c 6f 77 65 72 2e 0a 20 20 20 20 20 20  n pLower..      
15910 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4f 72 2c 20  **.      ** Or, 
15920 69 66 20 70 4c 6f 77 65 72 20 69 73 20 4e 55 4c  if pLower is NUL
15930 4c 20 6f 72 20 24 4c 20 63 61 6e 6e 6f 74 20 62  L or $L cannot b
15940 65 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  e extracted from
15950 20 69 74 20 28 62 65 63 61 75 73 65 20 69 74 0a   it (because it.
15960 20 20 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20        ** is not 
15970 61 20 73 69 6d 70 6c 65 20 76 61 72 69 61 62 6c  a simple variabl
15980 65 20 6f 72 20 6c 69 74 65 72 61 6c 20 76 61 6c  e or literal val
15990 75 65 29 2c 20 74 68 65 20 6c 6f 77 65 72 20 62  ue), the lower b
159a0 6f 75 6e 64 20 6f 66 20 74 68 65 0a 20 20 20 20  ound of the.    
159b0 20 20 2a 2a 20 72 61 6e 67 65 20 69 73 20 24 50    ** range is $P
159c0 2e 20 44 75 65 20 74 6f 20 61 20 71 75 69 72 6b  . Due to a quirk
159d0 20 69 6e 20 74 68 65 20 77 61 79 20 77 68 65 72   in the way wher
159e0 65 4b 65 79 53 74 61 74 73 28 29 20 77 6f 72 6b  eKeyStats() work
159f0 73 2c 20 65 76 65 6e 0a 20 20 20 20 20 20 2a 2a  s, even.      **
15a00 20 69 66 20 24 4c 20 69 73 20 61 76 61 69 6c 61   if $L is availa
15a10 62 6c 65 2c 20 77 68 65 72 65 4b 65 79 53 74 61  ble, whereKeySta
15a20 74 73 28 29 20 69 73 20 63 61 6c 6c 65 64 20 66  ts() is called f
15a30 6f 72 20 62 6f 74 68 20 28 24 50 29 20 61 6e 64  or both ($P) and
15a40 20 0a 20 20 20 20 20 20 2a 2a 20 28 24 50 3a 24   .      ** ($P:$
15a50 4c 29 20 61 6e 64 20 74 68 65 20 6c 61 72 67 65  L) and the large
15a60 72 20 6f 66 20 74 68 65 20 74 77 6f 20 72 65 74  r of the two ret
15a70 75 72 6e 65 64 20 76 61 6c 75 65 73 20 69 73 20  urned values is 
15a80 75 73 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  used..      **. 
15a90 20 20 20 20 20 2a 2a 20 53 69 6d 69 6c 61 72 6c       ** Similarl
15aa0 79 2c 20 69 55 70 70 65 72 20 69 73 20 74 6f 20  y, iUpper is to 
15ab0 62 65 20 73 65 74 20 74 6f 20 74 68 65 20 65 73  be set to the es
15ac0 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20 6e 75  timate of the nu
15ad0 6d 62 65 72 20 6f 66 20 72 6f 77 73 0a 20 20 20  mber of rows.   
15ae0 20 20 20 2a 2a 20 6c 65 73 73 20 74 68 61 6e 20     ** less than 
15af0 74 68 65 20 75 70 70 65 72 20 62 6f 75 6e 64 20  the upper bound 
15b00 6f 66 20 74 68 65 20 72 61 6e 67 65 20 71 75 65  of the range que
15b10 72 79 2e 20 57 68 65 72 65 20 74 68 65 20 75 70  ry. Where the up
15b20 70 65 72 20 62 6f 75 6e 64 0a 20 20 20 20 20 20  per bound.      
15b30 2a 2a 20 69 73 20 65 69 74 68 65 72 20 28 24 50  ** is either ($P
15b40 29 20 6f 72 20 28 24 50 3a 24 55 29 2e 20 41 67  ) or ($P:$U). Ag
15b50 61 69 6e 2c 20 65 76 65 6e 20 69 66 20 24 55 20  ain, even if $U 
15b60 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 62 6f  is available, bo
15b70 74 68 20 76 61 6c 75 65 73 0a 20 20 20 20 20 20  th values.      
15b80 2a 2a 20 6f 66 20 69 55 70 70 65 72 20 61 72 65  ** of iUpper are
15b90 20 72 65 71 75 65 73 74 65 64 20 6f 66 20 77 68   requested of wh
15ba0 65 72 65 4b 65 79 53 74 61 74 73 28 29 20 61 6e  ereKeyStats() an
15bb0 64 20 74 68 65 20 73 6d 61 6c 6c 65 72 20 75 73  d the smaller us
15bc0 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  ed..      **.   
15bd0 20 20 20 2a 2a 20 54 68 65 20 6e 75 6d 62 65 72     ** The number
15be0 20 6f 66 20 72 6f 77 73 20 62 65 74 77 65 65 6e   of rows between
15bf0 20 74 68 65 20 74 77 6f 20 62 6f 75 6e 64 73 20   the two bounds 
15c00 69 73 20 74 68 65 6e 20 6a 75 73 74 20 69 55 70  is then just iUp
15c10 70 65 72 2d 69 4c 6f 77 65 72 2e 0a 20 20 20 20  per-iLower..    
15c20 20 20 2a 2f 0a 20 20 20 20 20 20 74 52 6f 77 63    */.      tRowc
15c30 6e 74 20 69 4c 6f 77 65 72 3b 20 20 20 20 20 2f  nt iLower;     /
15c40 2a 20 52 6f 77 73 20 6c 65 73 73 20 74 68 61 6e  * Rows less than
15c50 20 74 68 65 20 6c 6f 77 65 72 20 62 6f 75 6e 64   the lower bound
15c60 20 2a 2f 0a 20 20 20 20 20 20 74 52 6f 77 63 6e   */.      tRowcn
15c70 74 20 69 55 70 70 65 72 3b 20 20 20 20 20 2f 2a  t iUpper;     /*
15c80 20 52 6f 77 73 20 6c 65 73 73 20 74 68 61 6e 20   Rows less than 
15c90 74 68 65 20 75 70 70 65 72 20 62 6f 75 6e 64 20  the upper bound 
15ca0 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 4c 77  */.      int iLw
15cb0 72 49 64 78 20 3d 20 2d 32 3b 20 20 20 2f 2a 20  rIdx = -2;   /* 
15cc0 61 53 61 6d 70 6c 65 5b 5d 20 66 6f 72 20 74 68  aSample[] for th
15cd0 65 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20 2a 2f  e lower bound */
15ce0 0a 20 20 20 20 20 20 69 6e 74 20 69 55 70 72 49  .      int iUprI
15cf0 64 78 20 3d 20 2d 31 3b 20 20 20 2f 2a 20 61 53  dx = -1;   /* aS
15d00 61 6d 70 6c 65 5b 5d 20 66 6f 72 20 74 68 65 20  ample[] for the 
15d10 75 70 70 65 72 20 62 6f 75 6e 64 20 2a 2f 0a 0a  upper bound */..
15d20 20 20 20 20 20 20 69 66 28 20 70 52 65 63 20 29        if( pRec )
15d30 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  {.        testca
15d40 73 65 28 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64  se( pRec->nField
15d50 21 3d 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63  !=pBuilder->nRec
15d60 56 61 6c 69 64 20 29 3b 0a 20 20 20 20 20 20 20  Valid );.       
15d70 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 20 3d 20   pRec->nField = 
15d80 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61  pBuilder->nRecVa
15d90 6c 69 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  lid;.      }.   
15da0 20 20 20 69 66 28 20 6e 45 71 3d 3d 70 2d 3e 6e     if( nEq==p->n
15db0 4b 65 79 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20  KeyCol ){.      
15dc0 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41    aff = SQLITE_A
15dd0 46 46 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20  FF_INTEGER;.    
15de0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
15df0 20 61 66 66 20 3d 20 70 2d 3e 70 54 61 62 6c 65   aff = p->pTable
15e00 2d 3e 61 43 6f 6c 5b 70 2d 3e 61 69 43 6f 6c 75  ->aCol[p->aiColu
15e10 6d 6e 5b 6e 45 71 5d 5d 2e 61 66 66 69 6e 69 74  mn[nEq]].affinit
15e20 79 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  y;.      }.     
15e30 20 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 69 4c   /* Determine iL
15e40 6f 77 65 72 20 61 6e 64 20 69 55 70 70 65 72 20  ower and iUpper 
15e50 75 73 69 6e 67 20 28 24 50 29 20 6f 6e 6c 79 2e  using ($P) only.
15e60 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6e 45   */.      if( nE
15e70 71 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  q==0 ){.        
15e80 69 4c 6f 77 65 72 20 3d 20 30 3b 0a 20 20 20 20  iLower = 0;.    
15e90 20 20 20 20 69 55 70 70 65 72 20 3d 20 70 2d 3e      iUpper = p->
15ea0 6e 52 6f 77 45 73 74 30 3b 0a 20 20 20 20 20 20  nRowEst0;.      
15eb0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
15ec0 2a 20 4e 6f 74 65 3a 20 74 68 69 73 20 63 61 6c  * Note: this cal
15ed0 6c 20 63 6f 75 6c 64 20 62 65 20 6f 70 74 69 6d  l could be optim
15ee0 69 7a 65 64 20 61 77 61 79 20 2d 20 73 69 6e 63  ized away - sinc
15ef0 65 20 74 68 65 20 73 61 6d 65 20 76 61 6c 75 65  e the same value
15f00 73 20 6d 75 73 74 20 0a 20 20 20 20 20 20 20 20  s must .        
15f10 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 72 65 71  ** have been req
15f20 75 65 73 74 65 64 20 77 68 65 6e 20 74 65 73 74  uested when test
15f30 69 6e 67 20 6b 65 79 20 24 50 20 69 6e 20 77 68  ing key $P in wh
15f40 65 72 65 45 71 75 61 6c 53 63 61 6e 45 73 74 28  ereEqualScanEst(
15f50 29 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 77  ).  */.        w
15f60 68 65 72 65 4b 65 79 53 74 61 74 73 28 70 50 61  hereKeyStats(pPa
15f70 72 73 65 2c 20 70 2c 20 70 52 65 63 2c 20 30 2c  rse, p, pRec, 0,
15f80 20 61 29 3b 0a 20 20 20 20 20 20 20 20 69 4c 6f   a);.        iLo
15f90 77 65 72 20 3d 20 61 5b 30 5d 3b 0a 20 20 20 20  wer = a[0];.    
15fa0 20 20 20 20 69 55 70 70 65 72 20 3d 20 61 5b 30      iUpper = a[0
15fb0 5d 20 2b 20 61 5b 31 5d 3b 0a 20 20 20 20 20 20  ] + a[1];.      
15fc0 7d 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  }..      assert(
15fd0 20 70 4c 6f 77 65 72 3d 3d 30 20 7c 7c 20 28 70   pLower==0 || (p
15fe0 4c 6f 77 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72  Lower->eOperator
15ff0 20 26 20 28 57 4f 5f 47 54 7c 57 4f 5f 47 45 29   & (WO_GT|WO_GE)
16000 29 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73  )!=0 );.      as
16010 73 65 72 74 28 20 70 55 70 70 65 72 3d 3d 30 20  sert( pUpper==0 
16020 7c 7c 20 28 70 55 70 70 65 72 2d 3e 65 4f 70 65  || (pUpper->eOpe
16030 72 61 74 6f 72 20 26 20 28 57 4f 5f 4c 54 7c 57  rator & (WO_LT|W
16040 4f 5f 4c 45 29 29 21 3d 30 20 29 3b 0a 20 20 20  O_LE))!=0 );.   
16050 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 53     assert( p->aS
16060 6f 72 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20  ortOrder!=0 );. 
16070 20 20 20 20 20 69 66 28 20 70 2d 3e 61 53 6f 72       if( p->aSor
16080 74 4f 72 64 65 72 5b 6e 45 71 5d 20 29 7b 0a 20  tOrder[nEq] ){. 
16090 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 6f         /* The ro
160a0 6c 65 73 20 6f 66 20 70 4c 6f 77 65 72 20 61 6e  les of pLower an
160b0 64 20 70 55 70 70 65 72 20 61 72 65 20 73 77 61  d pUpper are swa
160c0 70 70 65 64 20 66 6f 72 20 61 20 44 45 53 43 20  pped for a DESC 
160d0 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 20  index */.       
160e0 20 53 57 41 50 28 57 68 65 72 65 54 65 72 6d 2a   SWAP(WhereTerm*
160f0 2c 20 70 4c 6f 77 65 72 2c 20 70 55 70 70 65 72  , pLower, pUpper
16100 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
16110 20 20 2f 2a 20 49 66 20 70 6f 73 73 69 62 6c 65    /* If possible
16120 2c 20 69 6d 70 72 6f 76 65 20 6f 6e 20 74 68 65  , improve on the
16130 20 69 4c 6f 77 65 72 20 65 73 74 69 6d 61 74 65   iLower estimate
16140 20 75 73 69 6e 67 20 28 24 50 3a 24 4c 29 2e 20   using ($P:$L). 
16150 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 4c 6f  */.      if( pLo
16160 77 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 69  wer ){.        i
16170 6e 74 20 62 4f 6b 3b 20 20 20 20 20 20 20 20 20  nt bOk;         
16180 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
16190 75 65 20 69 66 20 76 61 6c 75 65 20 69 73 20 65  ue if value is e
161a0 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 70 45  xtracted from pE
161b0 78 70 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 45  xpr */.        E
161c0 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4c 6f  xpr *pExpr = pLo
161d0 77 65 72 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67  wer->pExpr->pRig
161e0 68 74 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ht;.        rc =
161f0 20 73 71 6c 69 74 65 33 53 74 61 74 34 50 72 6f   sqlite3Stat4Pro
16200 62 65 53 65 74 56 61 6c 75 65 28 70 50 61 72 73  beSetValue(pPars
16210 65 2c 20 70 2c 20 26 70 52 65 63 2c 20 70 45 78  e, p, &pRec, pEx
16220 70 72 2c 20 61 66 66 2c 20 6e 45 71 2c 20 26 62  pr, aff, nEq, &b
16230 4f 6b 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  Ok);.        if(
16240 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
16250 26 20 62 4f 6b 20 29 7b 0a 20 20 20 20 20 20 20  & bOk ){.       
16260 20 20 20 74 52 6f 77 63 6e 74 20 69 4e 65 77 3b     tRowcnt iNew;
16270 0a 20 20 20 20 20 20 20 20 20 20 69 4c 77 72 49  .          iLwrI
16280 64 78 20 3d 20 77 68 65 72 65 4b 65 79 53 74 61  dx = whereKeySta
16290 74 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70 52  ts(pParse, p, pR
162a0 65 63 2c 20 30 2c 20 61 29 3b 0a 20 20 20 20 20  ec, 0, a);.     
162b0 20 20 20 20 20 69 4e 65 77 20 3d 20 61 5b 30 5d       iNew = a[0]
162c0 20 2b 20 28 28 70 4c 6f 77 65 72 2d 3e 65 4f 70   + ((pLower->eOp
162d0 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 47 54 7c  erator & (WO_GT|
162e0 57 4f 5f 4c 45 29 29 20 3f 20 61 5b 31 5d 20 3a  WO_LE)) ? a[1] :
162f0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69   0);.          i
16300 66 28 20 69 4e 65 77 3e 69 4c 6f 77 65 72 20 29  f( iNew>iLower )
16310 20 69 4c 6f 77 65 72 20 3d 20 69 4e 65 77 3b 0a   iLower = iNew;.
16320 20 20 20 20 20 20 20 20 20 20 6e 4f 75 74 2d 2d            nOut--
16330 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4c 6f 77  ;.          pLow
16340 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  er = 0;.        
16350 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  }.      }..     
16360 20 2f 2a 20 49 66 20 70 6f 73 73 69 62 6c 65 2c   /* If possible,
16370 20 69 6d 70 72 6f 76 65 20 6f 6e 20 74 68 65 20   improve on the 
16380 69 55 70 70 65 72 20 65 73 74 69 6d 61 74 65 20  iUpper estimate 
16390 75 73 69 6e 67 20 28 24 50 3a 24 55 29 2e 20 2a  using ($P:$U). *
163a0 2f 0a 20 20 20 20 20 20 69 66 28 20 70 55 70 70  /.      if( pUpp
163b0 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  er ){.        in
163c0 74 20 62 4f 6b 3b 20 20 20 20 20 20 20 20 20 20  t bOk;          
163d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
163e0 65 20 69 66 20 76 61 6c 75 65 20 69 73 20 65 78  e if value is ex
163f0 74 72 61 63 74 65 64 20 66 72 6f 6d 20 70 45 78  tracted from pEx
16400 70 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 45 78  pr */.        Ex
16410 70 72 20 2a 70 45 78 70 72 20 3d 20 70 55 70 70  pr *pExpr = pUpp
16420 65 72 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68  er->pExpr->pRigh
16430 74 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  t;.        rc = 
16440 73 71 6c 69 74 65 33 53 74 61 74 34 50 72 6f 62  sqlite3Stat4Prob
16450 65 53 65 74 56 61 6c 75 65 28 70 50 61 72 73 65  eSetValue(pParse
16460 2c 20 70 2c 20 26 70 52 65 63 2c 20 70 45 78 70  , p, &pRec, pExp
16470 72 2c 20 61 66 66 2c 20 6e 45 71 2c 20 26 62 4f  r, aff, nEq, &bO
16480 6b 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  k);.        if( 
16490 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
164a0 20 62 4f 6b 20 29 7b 0a 20 20 20 20 20 20 20 20   bOk ){.        
164b0 20 20 74 52 6f 77 63 6e 74 20 69 4e 65 77 3b 0a    tRowcnt iNew;.
164c0 20 20 20 20 20 20 20 20 20 20 69 55 70 72 49 64            iUprId
164d0 78 20 3d 20 77 68 65 72 65 4b 65 79 53 74 61 74  x = whereKeyStat
164e0 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70 52 65  s(pParse, p, pRe
164f0 63 2c 20 31 2c 20 61 29 3b 0a 20 20 20 20 20 20  c, 1, a);.      
16500 20 20 20 20 69 4e 65 77 20 3d 20 61 5b 30 5d 20      iNew = a[0] 
16510 2b 20 28 28 70 55 70 70 65 72 2d 3e 65 4f 70 65  + ((pUpper->eOpe
16520 72 61 74 6f 72 20 26 20 28 57 4f 5f 47 54 7c 57  rator & (WO_GT|W
16530 4f 5f 4c 45 29 29 20 3f 20 61 5b 31 5d 20 3a 20  O_LE)) ? a[1] : 
16540 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  0);.          if
16550 28 20 69 4e 65 77 3c 69 55 70 70 65 72 20 29 20  ( iNew<iUpper ) 
16560 69 55 70 70 65 72 20 3d 20 69 4e 65 77 3b 0a 20  iUpper = iNew;. 
16570 20 20 20 20 20 20 20 20 20 6e 4f 75 74 2d 2d 3b           nOut--;
16580 0a 20 20 20 20 20 20 20 20 20 20 70 55 70 70 65  .          pUppe
16590 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  r = 0;.        }
165a0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
165b0 70 42 75 69 6c 64 65 72 2d 3e 70 52 65 63 20 3d  pBuilder->pRec =
165c0 20 70 52 65 63 3b 0a 20 20 20 20 20 20 69 66 28   pRec;.      if(
165d0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
165e0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 55  {.        if( iU
165f0 70 70 65 72 3e 69 4c 6f 77 65 72 20 29 7b 0a 20  pper>iLower ){. 
16600 20 20 20 20 20 20 20 20 20 6e 4e 65 77 20 3d 20           nNew = 
16610 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 69 55  sqlite3LogEst(iU
16620 70 70 65 72 20 2d 20 69 4c 6f 77 65 72 29 3b 0a  pper - iLower);.
16630 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 55 4e            /* TUN
16640 49 4e 47 3a 20 20 49 66 20 62 6f 74 68 20 69 55  ING:  If both iU
16650 70 70 65 72 20 61 6e 64 20 69 4c 6f 77 65 72 20  pper and iLower 
16660 61 72 65 20 64 65 72 69 76 65 64 20 66 72 6f 6d  are derived from
16670 20 74 68 65 20 73 61 6d 65 0a 20 20 20 20 20 20   the same.      
16680 20 20 20 20 2a 2a 20 73 61 6d 70 6c 65 2c 20 74      ** sample, t
16690 68 65 6e 20 61 73 73 75 6d 65 20 74 68 65 79 20  hen assume they 
166a0 61 72 65 20 34 78 20 6d 6f 72 65 20 73 65 6c 65  are 4x more sele
166b0 63 74 69 76 65 2e 20 20 54 68 69 73 20 62 72 69  ctive.  This bri
166c0 6e 67 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ngs.          **
166d0 20 74 68 65 20 65 73 74 69 6d 61 74 65 64 20 73   the estimated s
166e0 65 6c 65 63 74 69 76 69 74 79 20 6d 6f 72 65 20  electivity more 
166f0 69 6e 20 6c 69 6e 65 20 77 69 74 68 20 77 68 61  in line with wha
16700 74 20 69 74 20 77 6f 75 6c 64 20 62 65 0a 20 20  t it would be.  
16710 20 20 20 20 20 20 20 20 2a 2a 20 69 66 20 65 73          ** if es
16720 74 69 6d 61 74 65 64 20 77 69 74 68 6f 75 74 20  timated without 
16730 74 68 65 20 75 73 65 20 6f 66 20 53 54 41 54 33  the use of STAT3
16740 2f 34 20 74 61 62 6c 65 73 2e 20 2a 2f 0a 20 20  /4 tables. */.  
16750 20 20 20 20 20 20 20 20 69 66 28 20 69 4c 77 72          if( iLwr
16760 49 64 78 3d 3d 69 55 70 72 49 64 78 20 29 20 6e  Idx==iUprIdx ) n
16770 4e 65 77 20 2d 3d 20 32 30 3b 20 20 61 73 73 65  New -= 20;  asse
16780 72 74 28 20 32 30 3d 3d 73 71 6c 69 74 65 33 4c  rt( 20==sqlite3L
16790 6f 67 45 73 74 28 34 29 20 29 3b 0a 20 20 20 20  ogEst(4) );.    
167a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
167b0 20 20 20 20 20 6e 4e 65 77 20 3d 20 31 30 3b 20       nNew = 10; 
167c0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 31         assert( 1
167d0 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  0==sqlite3LogEst
167e0 28 32 29 20 29 3b 0a 20 20 20 20 20 20 20 20 7d  (2) );.        }
167f0 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 4e 65  .        if( nNe
16800 77 3c 6e 4f 75 74 20 29 7b 0a 20 20 20 20 20 20  w<nOut ){.      
16810 20 20 20 20 6e 4f 75 74 20 3d 20 6e 4e 65 77 3b      nOut = nNew;
16820 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
16830 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78     WHERETRACE(0x
16840 31 30 2c 20 28 22 53 54 41 54 34 20 72 61 6e 67  10, ("STAT4 rang
16850 65 20 73 63 61 6e 3a 20 25 75 2e 2e 25 75 20 20  e scan: %u..%u  
16860 65 73 74 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  est=%d\n",.     
16870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16880 20 20 20 20 20 20 28 75 33 32 29 69 4c 6f 77 65        (u32)iLowe
16890 72 2c 20 28 75 33 32 29 69 55 70 70 65 72 2c 20  r, (u32)iUpper, 
168a0 6e 4f 75 74 29 29 3b 0a 20 20 20 20 20 20 7d 0a  nOut));.      }.
168b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
168c0 20 69 6e 74 20 62 44 6f 6e 65 20 3d 20 30 3b 0a   int bDone = 0;.
168d0 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65        rc = where
168e0 52 61 6e 67 65 53 6b 69 70 53 63 61 6e 45 73 74  RangeSkipScanEst
168f0 28 70 50 61 72 73 65 2c 20 70 4c 6f 77 65 72 2c  (pParse, pLower,
16900 20 70 55 70 70 65 72 2c 20 70 4c 6f 6f 70 2c 20   pUpper, pLoop, 
16910 26 62 44 6f 6e 65 29 3b 0a 20 20 20 20 20 20 69  &bDone);.      i
16920 66 28 20 62 44 6f 6e 65 20 29 20 72 65 74 75 72  f( bDone ) retur
16930 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  n rc;.    }.  }.
16940 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50  #else.  UNUSED_P
16950 41 52 41 4d 45 54 45 52 28 70 50 61 72 73 65 29  ARAMETER(pParse)
16960 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
16970 45 54 45 52 28 70 42 75 69 6c 64 65 72 29 3b 0a  ETER(pBuilder);.
16980 20 20 61 73 73 65 72 74 28 20 70 4c 6f 77 65 72    assert( pLower
16990 20 7c 7c 20 70 55 70 70 65 72 20 29 3b 0a 23 65   || pUpper );.#e
169a0 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 70  ndif.  assert( p
169b0 55 70 70 65 72 3d 3d 30 20 7c 7c 20 28 70 55 70  Upper==0 || (pUp
169c0 70 65 72 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  per->wtFlags & T
169d0 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29 3b  ERM_VNULL)==0 );
169e0 0a 20 20 6e 4e 65 77 20 3d 20 77 68 65 72 65 52  .  nNew = whereR
169f0 61 6e 67 65 41 64 6a 75 73 74 28 70 4c 6f 77 65  angeAdjust(pLowe
16a00 72 2c 20 6e 4f 75 74 29 3b 0a 20 20 6e 4e 65 77  r, nOut);.  nNew
16a10 20 3d 20 77 68 65 72 65 52 61 6e 67 65 41 64 6a   = whereRangeAdj
16a20 75 73 74 28 70 55 70 70 65 72 2c 20 6e 4e 65 77  ust(pUpper, nNew
16a30 29 3b 0a 0a 20 20 2f 2a 20 54 55 4e 49 4e 47 3a  );..  /* TUNING:
16a40 20 49 66 20 74 68 65 72 65 20 69 73 20 62 6f 74   If there is bot
16a50 68 20 61 6e 20 75 70 70 65 72 20 61 6e 64 20 6c  h an upper and l
16a60 6f 77 65 72 20 6c 69 6d 69 74 20 61 6e 64 20 6e  ower limit and n
16a70 65 69 74 68 65 72 20 6c 69 6d 69 74 0a 20 20 2a  either limit.  *
16a80 2a 20 68 61 73 20 61 6e 20 61 70 70 6c 69 63 61  * has an applica
16a90 74 69 6f 6e 2d 64 65 66 69 6e 65 64 20 6c 69 6b  tion-defined lik
16aa0 65 6c 69 68 6f 6f 64 28 29 2c 20 61 73 73 75 6d  elihood(), assum
16ab0 65 20 74 68 65 20 72 61 6e 67 65 20 69 73 0a 20  e the range is. 
16ac0 20 2a 2a 20 72 65 64 75 63 65 64 20 62 79 20 61   ** reduced by a
16ad0 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20 37 35 25  n additional 75%
16ae0 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61  . This means tha
16af0 74 2c 20 62 79 20 64 65 66 61 75 6c 74 2c 20 61  t, by default, a
16b00 6e 20 6f 70 65 6e 2d 65 6e 64 65 64 0a 20 20 2a  n open-ended.  *
16b10 2a 20 72 61 6e 67 65 20 71 75 65 72 79 20 28 65  * range query (e
16b20 2e 67 2e 20 63 6f 6c 20 3e 20 3f 29 20 69 73 20  .g. col > ?) is 
16b30 61 73 73 75 6d 65 64 20 74 6f 20 6d 61 74 63 68  assumed to match
16b40 20 31 2f 34 20 6f 66 20 74 68 65 20 72 6f 77 73   1/4 of the rows
16b50 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 69 6e 64   in the.  ** ind
16b60 65 78 2e 20 57 68 69 6c 65 20 61 20 63 6c 6f 73  ex. While a clos
16b70 65 64 20 72 61 6e 67 65 20 28 65 2e 67 2e 20 63  ed range (e.g. c
16b80 6f 6c 20 42 45 54 57 45 45 4e 20 3f 20 41 4e 44  ol BETWEEN ? AND
16b90 20 3f 29 20 69 73 20 65 73 74 69 6d 61 74 65 64   ?) is estimated
16ba0 20 74 6f 0a 20 20 2a 2a 20 6d 61 74 63 68 20 31   to.  ** match 1
16bb0 2f 36 34 20 6f 66 20 74 68 65 20 69 6e 64 65 78  /64 of the index
16bc0 2e 20 2a 2f 20 0a 20 20 69 66 28 20 70 4c 6f 77  . */ .  if( pLow
16bd0 65 72 20 26 26 20 70 4c 6f 77 65 72 2d 3e 74 72  er && pLower->tr
16be0 75 74 68 50 72 6f 62 3e 30 20 26 26 20 70 55 70  uthProb>0 && pUp
16bf0 70 65 72 20 26 26 20 70 55 70 70 65 72 2d 3e 74  per && pUpper->t
16c00 72 75 74 68 50 72 6f 62 3e 30 20 29 7b 0a 20 20  ruthProb>0 ){.  
16c10 20 20 6e 4e 65 77 20 2d 3d 20 32 30 3b 0a 20 20    nNew -= 20;.  
16c20 7d 0a 0a 20 20 6e 4f 75 74 20 2d 3d 20 28 70 4c  }..  nOut -= (pL
16c30 6f 77 65 72 21 3d 30 29 20 2b 20 28 70 55 70 70  ower!=0) + (pUpp
16c40 65 72 21 3d 30 29 3b 0a 20 20 69 66 28 20 6e 4e  er!=0);.  if( nN
16c50 65 77 3c 31 30 20 29 20 6e 4e 65 77 20 3d 20 31  ew<10 ) nNew = 1
16c60 30 3b 0a 20 20 69 66 28 20 6e 4e 65 77 3c 6e 4f  0;.  if( nNew<nO
16c70 75 74 20 29 20 6e 4f 75 74 20 3d 20 6e 4e 65 77  ut ) nOut = nNew
16c80 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 57 48  ;.#if defined(WH
16c90 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
16ca0 29 0a 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 6e  ).  if( pLoop->n
16cb0 4f 75 74 3e 6e 4f 75 74 20 29 7b 0a 20 20 20 20  Out>nOut ){.    
16cc0 57 48 45 52 45 54 52 41 43 45 28 30 78 31 30 2c  WHERETRACE(0x10,
16cd0 28 22 52 61 6e 67 65 20 73 63 61 6e 20 6c 6f 77  ("Range scan low
16ce0 65 72 73 20 6e 4f 75 74 20 66 72 6f 6d 20 25 64  ers nOut from %d
16cf0 20 74 6f 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20   to %d\n",.     
16d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
16d10 4c 6f 6f 70 2d 3e 6e 4f 75 74 2c 20 6e 4f 75 74  Loop->nOut, nOut
16d20 29 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ));.  }.#endif. 
16d30 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 3d 20 28   pLoop->nOut = (
16d40 4c 6f 67 45 73 74 29 6e 4f 75 74 3b 0a 20 20 72  LogEst)nOut;.  r
16d50 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
16d60 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
16d70 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34  E_STAT3_OR_STAT4
16d80 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20  ./*.** Estimate 
16d90 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
16da0 77 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  ws that will be 
16db0 72 65 74 75 72 6e 65 64 20 62 61 73 65 64 20 6f  returned based o
16dc0 6e 0a 2a 2a 20 61 6e 20 65 71 75 61 6c 69 74 79  n.** an equality
16dd0 20 63 6f 6e 73 74 72 61 69 6e 74 20 78 3d 56 41   constraint x=VA
16de0 4c 55 45 20 61 6e 64 20 77 68 65 72 65 20 74 68  LUE and where th
16df0 61 74 20 56 41 4c 55 45 20 6f 63 63 75 72 73 20  at VALUE occurs 
16e00 69 6e 0a 2a 2a 20 74 68 65 20 68 69 73 74 6f 67  in.** the histog
16e10 72 61 6d 20 64 61 74 61 2e 20 20 54 68 69 73 20  ram data.  This 
16e20 6f 6e 6c 79 20 77 6f 72 6b 73 20 77 68 65 6e 20  only works when 
16e30 78 20 69 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f  x is the left-mo
16e40 73 74 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 6f 66 20  st.** column of 
16e50 61 6e 20 69 6e 64 65 78 20 61 6e 64 20 73 71 6c  an index and sql
16e60 69 74 65 5f 73 74 61 74 33 20 68 69 73 74 6f 67  ite_stat3 histog
16e70 72 61 6d 20 64 61 74 61 20 69 73 20 61 76 61 69  ram data is avai
16e80 6c 61 62 6c 65 0a 2a 2a 20 66 6f 72 20 74 68 61  lable.** for tha
16e90 74 20 69 6e 64 65 78 2e 20 20 57 68 65 6e 20 70  t index.  When p
16ea0 45 78 70 72 3d 3d 4e 55 4c 4c 20 74 68 61 74 20  Expr==NULL that 
16eb0 6d 65 61 6e 73 20 74 68 65 20 63 6f 6e 73 74 72  means the constr
16ec0 61 69 6e 74 20 69 73 0a 2a 2a 20 22 78 20 49 53  aint is.** "x IS
16ed0 20 4e 55 4c 4c 22 20 69 6e 73 74 65 61 64 20 6f   NULL" instead o
16ee0 66 20 22 78 3d 56 41 4c 55 45 22 2e 0a 2a 2a 0a  f "x=VALUE"..**.
16ef0 2a 2a 20 57 72 69 74 65 20 74 68 65 20 65 73 74  ** Write the est
16f00 69 6d 61 74 65 64 20 72 6f 77 20 63 6f 75 6e 74  imated row count
16f10 20 69 6e 74 6f 20 2a 70 6e 52 6f 77 20 61 6e 64   into *pnRow and
16f20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
16f30 4b 2e 20 0a 2a 2a 20 49 66 20 75 6e 61 62 6c 65  K. .** If unable
16f40 20 74 6f 20 6d 61 6b 65 20 61 6e 20 65 73 74 69   to make an esti
16f50 6d 61 74 65 2c 20 6c 65 61 76 65 20 2a 70 6e 52  mate, leave *pnR
16f60 6f 77 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64  ow unchanged and
16f70 20 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a   return.** non-z
16f80 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ero..**.** This 
16f90 72 6f 75 74 69 6e 65 20 63 61 6e 20 66 61 69 6c  routine can fail
16fa0 20 69 66 20 69 74 20 69 73 20 75 6e 61 62 6c 65   if it is unable
16fb0 20 74 6f 20 6c 6f 61 64 20 61 20 63 6f 6c 6c 61   to load a colla
16fc0 74 69 6e 67 20 73 65 71 75 65 6e 63 65 0a 2a 2a  ting sequence.**
16fd0 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 73 74   required for st
16fe0 72 69 6e 67 20 63 6f 6d 70 61 72 69 73 6f 6e 2c  ring comparison,
16ff0 20 6f 72 20 69 66 20 75 6e 61 62 6c 65 20 74 6f   or if unable to
17000 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79   allocate memory
17010 0a 2a 2a 20 66 6f 72 20 61 20 55 54 46 20 63 6f  .** for a UTF co
17020 6e 76 65 72 73 69 6f 6e 20 72 65 71 75 69 72 65  nversion require
17030 64 20 66 6f 72 20 63 6f 6d 70 61 72 69 73 6f 6e  d for comparison
17040 2e 20 20 54 68 65 20 65 72 72 6f 72 20 69 73 20  .  The error is 
17050 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 74 68 65  stored.** in the
17060 20 70 50 61 72 73 65 20 73 74 72 75 63 74 75 72   pParse structur
17070 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
17080 20 77 68 65 72 65 45 71 75 61 6c 53 63 61 6e 45   whereEqualScanE
17090 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  st(.  Parse *pPa
170a0 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61  rse,       /* Pa
170b0 72 73 69 6e 67 20 26 20 63 6f 64 65 20 67 65 6e  rsing & code gen
170c0 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20  erating context 
170d0 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75  */.  WhereLoopBu
170e0 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c  ilder *pBuilder,
170f0 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  .  Expr *pExpr, 
17100 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65          /* Expre
17110 73 73 69 6f 6e 20 66 6f 72 20 56 41 4c 55 45 20  ssion for VALUE 
17120 69 6e 20 74 68 65 20 78 3d 56 41 4c 55 45 20 63  in the x=VALUE c
17130 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 74  onstraint */.  t
17140 52 6f 77 63 6e 74 20 2a 70 6e 52 6f 77 20 20 20  Rowcnt *pnRow   
17150 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
17160 20 72 65 76 69 73 65 64 20 72 6f 77 20 65 73 74   revised row est
17170 69 6d 61 74 65 20 68 65 72 65 20 2a 2f 0a 29 7b  imate here */.){
17180 0a 20 20 49 6e 64 65 78 20 2a 70 20 3d 20 70 42  .  Index *p = pB
17190 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e  uilder->pNew->u.
171a0 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20  btree.pIndex;.  
171b0 69 6e 74 20 6e 45 71 20 3d 20 70 42 75 69 6c 64  int nEq = pBuild
171c0 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74 72 65  er->pNew->u.btre
171d0 65 2e 6e 45 71 3b 0a 20 20 55 6e 70 61 63 6b 65  e.nEq;.  Unpacke
171e0 64 52 65 63 6f 72 64 20 2a 70 52 65 63 20 3d 20  dRecord *pRec = 
171f0 70 42 75 69 6c 64 65 72 2d 3e 70 52 65 63 3b 0a  pBuilder->pRec;.
17200 20 20 75 38 20 61 66 66 3b 20 20 20 20 20 20 20    u8 aff;       
17210 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
17220 6f 6c 75 6d 6e 20 61 66 66 69 6e 69 74 79 20 2a  olumn affinity *
17230 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
17240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17250 20 53 75 62 66 75 6e 63 74 69 6f 6e 20 72 65 74   Subfunction ret
17260 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 74 52  urn code */.  tR
17270 6f 77 63 6e 74 20 61 5b 32 5d 3b 20 20 20 20 20  owcnt a[2];     
17280 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74 69          /* Stati
17290 73 74 69 63 73 20 2a 2f 0a 20 20 69 6e 74 20 62  stics */.  int b
172a0 4f 6b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6e  Ok;..  assert( n
172b0 45 71 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65 72  Eq>=1 );.  asser
172c0 74 28 20 6e 45 71 3c 3d 70 2d 3e 6e 43 6f 6c 75  t( nEq<=p->nColu
172d0 6d 6e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  mn );.  assert( 
172e0 70 2d 3e 61 53 61 6d 70 6c 65 21 3d 30 20 29 3b  p->aSample!=0 );
172f0 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 53  .  assert( p->nS
17300 61 6d 70 6c 65 3e 30 20 29 3b 0a 20 20 61 73 73  ample>0 );.  ass
17310 65 72 74 28 20 70 42 75 69 6c 64 65 72 2d 3e 6e  ert( pBuilder->n
17320 52 65 63 56 61 6c 69 64 3c 6e 45 71 20 29 3b 0a  RecValid<nEq );.
17330 0a 20 20 2f 2a 20 49 66 20 76 61 6c 75 65 73 20  .  /* If values 
17340 61 72 65 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c  are not availabl
17350 65 20 66 6f 72 20 61 6c 6c 20 66 69 65 6c 64 73  e for all fields
17360 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 74 6f   of the index to
17370 20 74 68 65 20 6c 65 66 74 0a 20 20 2a 2a 20 6f   the left.  ** o
17380 66 20 74 68 69 73 20 6f 6e 65 2c 20 6e 6f 20 65  f this one, no e
17390 73 74 69 6d 61 74 65 20 63 61 6e 20 62 65 20 6d  stimate can be m
173a0 61 64 65 2e 20 52 65 74 75 72 6e 20 53 51 4c 49  ade. Return SQLI
173b0 54 45 5f 4e 4f 54 46 4f 55 4e 44 2e 20 2a 2f 0a  TE_NOTFOUND. */.
173c0 20 20 69 66 28 20 70 42 75 69 6c 64 65 72 2d 3e    if( pBuilder->
173d0 6e 52 65 63 56 61 6c 69 64 3c 28 6e 45 71 2d 31  nRecValid<(nEq-1
173e0 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
173f0 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b  SQLITE_NOTFOUND;
17400 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 69 73 20  .  }..  /* This 
17410 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69  is an optimizati
17420 6f 6e 20 6f 6e 6c 79 2e 20 54 68 65 20 63 61 6c  on only. The cal
17430 6c 20 74 6f 20 73 71 6c 69 74 65 33 53 74 61 74  l to sqlite3Stat
17440 34 50 72 6f 62 65 53 65 74 56 61 6c 75 65 28 29  4ProbeSetValue()
17450 0a 20 20 2a 2a 20 62 65 6c 6f 77 20 77 6f 75 6c  .  ** below woul
17460 64 20 72 65 74 75 72 6e 20 74 68 65 20 73 61 6d  d return the sam
17470 65 20 76 61 6c 75 65 2e 20 20 2a 2f 0a 20 20 69  e value.  */.  i
17480 66 28 20 6e 45 71 3e 3d 70 2d 3e 6e 43 6f 6c 75  f( nEq>=p->nColu
17490 6d 6e 20 29 7b 0a 20 20 20 20 2a 70 6e 52 6f 77  mn ){.    *pnRow
174a0 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 1;.    return
174b0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
174c0 0a 20 20 61 66 66 20 3d 20 70 2d 3e 70 54 61 62  .  aff = p->pTab
174d0 6c 65 2d 3e 61 43 6f 6c 5b 70 2d 3e 61 69 43 6f  le->aCol[p->aiCo
174e0 6c 75 6d 6e 5b 6e 45 71 2d 31 5d 5d 2e 61 66 66  lumn[nEq-1]].aff
174f0 69 6e 69 74 79 3b 0a 20 20 72 63 20 3d 20 73 71  inity;.  rc = sq
17500 6c 69 74 65 33 53 74 61 74 34 50 72 6f 62 65 53  lite3Stat4ProbeS
17510 65 74 56 61 6c 75 65 28 70 50 61 72 73 65 2c 20  etValue(pParse, 
17520 70 2c 20 26 70 52 65 63 2c 20 70 45 78 70 72 2c  p, &pRec, pExpr,
17530 20 61 66 66 2c 20 6e 45 71 2d 31 2c 20 26 62 4f   aff, nEq-1, &bO
17540 6b 29 3b 0a 20 20 70 42 75 69 6c 64 65 72 2d 3e  k);.  pBuilder->
17550 70 52 65 63 20 3d 20 70 52 65 63 3b 0a 20 20 69  pRec = pRec;.  i
17560 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
17570 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
17580 69 66 28 20 62 4f 6b 3d 3d 30 20 29 20 72 65 74  if( bOk==0 ) ret
17590 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f  urn SQLITE_NOTFO
175a0 55 4e 44 3b 0a 20 20 70 42 75 69 6c 64 65 72 2d  UND;.  pBuilder-
175b0 3e 6e 52 65 63 56 61 6c 69 64 20 3d 20 6e 45 71  >nRecValid = nEq
175c0 3b 0a 0a 20 20 77 68 65 72 65 4b 65 79 53 74 61  ;..  whereKeySta
175d0 74 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70 52  ts(pParse, p, pR
175e0 65 63 2c 20 30 2c 20 61 29 3b 0a 20 20 57 48 45  ec, 0, a);.  WHE
175f0 52 45 54 52 41 43 45 28 30 78 31 30 2c 28 22 65  RETRACE(0x10,("e
17600 71 75 61 6c 69 74 79 20 73 63 61 6e 20 72 65 67  quality scan reg
17610 69 6f 6e 73 3a 20 25 64 5c 6e 22 2c 20 28 69 6e  ions: %d\n", (in
17620 74 29 61 5b 31 5d 29 29 3b 0a 20 20 2a 70 6e 52  t)a[1]));.  *pnR
17630 6f 77 20 3d 20 61 5b 31 5d 3b 0a 20 20 0a 20 20  ow = a[1];.  .  
17640 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
17650 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e  dif /* SQLITE_EN
17660 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54  ABLE_STAT3_OR_ST
17670 41 54 34 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53  AT4 */..#ifdef S
17680 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
17690 54 33 5f 4f 52 5f 53 54 41 54 34 0a 2f 2a 0a 2a  T3_OR_STAT4./*.*
176a0 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65 20 6e  * Estimate the n
176b0 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68  umber of rows th
176c0 61 74 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72  at will be retur
176d0 6e 65 64 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20  ned based on.** 
176e0 61 6e 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74  an IN constraint
176f0 20 77 68 65 72 65 20 74 68 65 20 72 69 67 68 74   where the right
17700 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68  -hand side of th
17710 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 0a 2a 2a  e IN operator.**
17720 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20 76 61   is a list of va
17730 6c 75 65 73 2e 20 20 45 78 61 6d 70 6c 65 3a 0a  lues.  Example:.
17740 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 57 48 45  **.**        WHE
17750 52 45 20 78 20 49 4e 20 28 31 2c 32 2c 33 2c 34  RE x IN (1,2,3,4
17760 29 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68  ).**.** Write th
17770 65 20 65 73 74 69 6d 61 74 65 64 20 72 6f 77 20  e estimated row 
17780 63 6f 75 6e 74 20 69 6e 74 6f 20 2a 70 6e 52 6f  count into *pnRo
17790 77 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c  w and return SQL
177a0 49 54 45 5f 4f 4b 2e 20 0a 2a 2a 20 49 66 20 75  ITE_OK. .** If u
177b0 6e 61 62 6c 65 20 74 6f 20 6d 61 6b 65 20 61 6e  nable to make an
177c0 20 65 73 74 69 6d 61 74 65 2c 20 6c 65 61 76 65   estimate, leave
177d0 20 2a 70 6e 52 6f 77 20 75 6e 63 68 61 6e 67 65   *pnRow unchange
177e0 64 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20  d and return.** 
177f0 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20  non-zero..**.** 
17800 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e  This routine can
17810 20 66 61 69 6c 20 69 66 20 69 74 20 69 73 20 75   fail if it is u
17820 6e 61 62 6c 65 20 74 6f 20 6c 6f 61 64 20 61 20  nable to load a 
17830 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
17840 63 65 0a 2a 2a 20 72 65 71 75 69 72 65 64 20 66  ce.** required f
17850 6f 72 20 73 74 72 69 6e 67 20 63 6f 6d 70 61 72  or string compar
17860 69 73 6f 6e 2c 20 6f 72 20 69 66 20 75 6e 61 62  ison, or if unab
17870 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d  le to allocate m
17880 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20 61 20 55  emory.** for a U
17890 54 46 20 63 6f 6e 76 65 72 73 69 6f 6e 20 72 65  TF conversion re
178a0 71 75 69 72 65 64 20 66 6f 72 20 63 6f 6d 70 61  quired for compa
178b0 72 69 73 6f 6e 2e 20 20 54 68 65 20 65 72 72 6f  rison.  The erro
178c0 72 20 69 73 20 73 74 6f 72 65 64 0a 2a 2a 20 69  r is stored.** i
178d0 6e 20 74 68 65 20 70 50 61 72 73 65 20 73 74 72  n the pParse str
178e0 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69  ucture..*/.stati
178f0 63 20 69 6e 74 20 77 68 65 72 65 49 6e 53 63 61  c int whereInSca
17900 6e 45 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70  nEst(.  Parse *p
17910 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20  Parse,       /* 
17920 50 61 72 73 69 6e 67 20 26 20 63 6f 64 65 20 67  Parsing & code g
17930 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78  enerating contex
17940 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70  t */.  WhereLoop
17950 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65  Builder *pBuilde
17960 72 2c 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  r,.  ExprList *p
17970 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 54 68 65  List,     /* The
17980 20 76 61 6c 75 65 20 6c 69 73 74 20 6f 6e 20 74   value list on t
17990 68 65 20 52 48 53 20 6f 66 20 22 78 20 49 4e 20  he RHS of "x IN 
179a0 28 76 31 2c 76 32 2c 76 33 2c 2e 2e 2e 29 22 20  (v1,v2,v3,...)" 
179b0 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 2a 70 6e  */.  tRowcnt *pn
179c0 52 6f 77 20 20 20 20 20 20 20 2f 2a 20 57 72 69  Row       /* Wri
179d0 74 65 20 74 68 65 20 72 65 76 69 73 65 64 20 72  te the revised r
179e0 6f 77 20 65 73 74 69 6d 61 74 65 20 68 65 72 65  ow estimate here
179f0 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 20 2a   */.){.  Index *
17a00 70 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e  p = pBuilder->pN
17a10 65 77 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  ew->u.btree.pInd
17a20 65 78 3b 0a 20 20 69 36 34 20 6e 52 6f 77 30 20  ex;.  i64 nRow0 
17a30 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 54  = sqlite3LogEstT
17a40 6f 49 6e 74 28 70 2d 3e 61 69 52 6f 77 4c 6f 67  oInt(p->aiRowLog
17a50 45 73 74 5b 30 5d 29 3b 0a 20 20 69 6e 74 20 6e  Est[0]);.  int n
17a60 52 65 63 56 61 6c 69 64 20 3d 20 70 42 75 69 6c  RecValid = pBuil
17a70 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3b 0a  der->nRecValid;.
17a80 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
17a90 45 5f 4f 4b 3b 20 20 20 20 20 2f 2a 20 53 75 62  E_OK;     /* Sub
17aa0 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 20  function return 
17ab0 63 6f 64 65 20 2a 2f 0a 20 20 74 52 6f 77 63 6e  code */.  tRowcn
17ac0 74 20 6e 45 73 74 3b 20 20 20 20 20 20 20 20 20  t nEst;         
17ad0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
17ae0 6f 77 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65  ows for a single
17af0 20 74 65 72 6d 20 2a 2f 0a 20 20 74 52 6f 77 63   term */.  tRowc
17b00 6e 74 20 6e 52 6f 77 45 73 74 20 3d 20 30 3b 20  nt nRowEst = 0; 
17b10 20 20 20 2f 2a 20 4e 65 77 20 65 73 74 69 6d 61     /* New estima
17b20 74 65 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72  te of the number
17b30 20 6f 66 20 72 6f 77 73 20 2a 2f 0a 20 20 69 6e   of rows */.  in
17b40 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
17b50 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
17b60 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65  unter */..  asse
17b70 72 74 28 20 70 2d 3e 61 53 61 6d 70 6c 65 21 3d  rt( p->aSample!=
17b80 30 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  0 );.  for(i=0; 
17b90 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
17ba0 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   i<pList->nExpr;
17bb0 20 69 2b 2b 29 7b 0a 20 20 20 20 6e 45 73 74 20   i++){.    nEst 
17bc0 3d 20 6e 52 6f 77 30 3b 0a 20 20 20 20 72 63 20  = nRow0;.    rc 
17bd0 3d 20 77 68 65 72 65 45 71 75 61 6c 53 63 61 6e  = whereEqualScan
17be0 45 73 74 28 70 50 61 72 73 65 2c 20 70 42 75 69  Est(pParse, pBui
17bf0 6c 64 65 72 2c 20 70 4c 69 73 74 2d 3e 61 5b 69  lder, pList->a[i
17c00 5d 2e 70 45 78 70 72 2c 20 26 6e 45 73 74 29 3b  ].pExpr, &nEst);
17c10 0a 20 20 20 20 6e 52 6f 77 45 73 74 20 2b 3d 20  .    nRowEst += 
17c20 6e 45 73 74 3b 0a 20 20 20 20 70 42 75 69 6c 64  nEst;.    pBuild
17c30 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20 3d 20  er->nRecValid = 
17c40 6e 52 65 63 56 61 6c 69 64 3b 0a 20 20 7d 0a 0a  nRecValid;.  }..
17c50 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
17c60 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 6e  _OK ){.    if( n
17c70 52 6f 77 45 73 74 20 3e 20 6e 52 6f 77 30 20 29  RowEst > nRow0 )
17c80 20 6e 52 6f 77 45 73 74 20 3d 20 6e 52 6f 77 30   nRowEst = nRow0
17c90 3b 0a 20 20 20 20 2a 70 6e 52 6f 77 20 3d 20 6e  ;.    *pnRow = n
17ca0 52 6f 77 45 73 74 3b 0a 20 20 20 20 57 48 45 52  RowEst;.    WHER
17cb0 45 54 52 41 43 45 28 30 78 31 30 2c 28 22 49 4e  ETRACE(0x10,("IN
17cc0 20 72 6f 77 20 65 73 74 69 6d 61 74 65 3a 20 65   row estimate: e
17cd0 73 74 3d 25 64 5c 6e 22 2c 20 6e 52 6f 77 45 73  st=%d\n", nRowEs
17ce0 74 29 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  t));.  }.  asser
17cf0 74 28 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65  t( pBuilder->nRe
17d00 63 56 61 6c 69 64 3d 3d 6e 52 65 63 56 61 6c 69  cValid==nRecVali
17d10 64 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  d );.  return rc
17d20 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
17d30 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
17d40 33 5f 4f 52 5f 53 54 41 54 34 20 2a 2f 0a 0a 2f  3_OR_STAT4 */../
17d50 2a 0a 2a 2a 20 44 69 73 61 62 6c 65 20 61 20 74  *.** Disable a t
17d60 65 72 6d 20 69 6e 20 74 68 65 20 57 48 45 52 45  erm in the WHERE
17d70 20 63 6c 61 75 73 65 2e 20 20 45 78 63 65 70 74   clause.  Except
17d80 2c 20 64 6f 20 6e 6f 74 20 64 69 73 61 62 6c 65  , do not disable
17d90 20 74 68 65 20 74 65 72 6d 0a 2a 2a 20 69 66 20   the term.** if 
17da0 69 74 20 63 6f 6e 74 72 6f 6c 73 20 61 20 4c 45  it controls a LE
17db0 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 61 6e  FT OUTER JOIN an
17dc0 64 20 69 74 20 64 69 64 20 6e 6f 74 20 6f 72 69  d it did not ori
17dd0 67 69 6e 61 74 65 20 69 6e 20 74 68 65 20 4f 4e  ginate in the ON
17de0 0a 2a 2a 20 6f 72 20 55 53 49 4e 47 20 63 6c 61  .** or USING cla
17df0 75 73 65 20 6f 66 20 74 68 61 74 20 6a 6f 69 6e  use of that join
17e00 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e 73 69 64 65 72  ..**.** Consider
17e10 20 74 68 65 20 74 65 72 6d 20 74 32 2e 7a 3d 27   the term t2.z='
17e20 6f 6b 27 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f  ok' in the follo
17e30 77 69 6e 67 20 71 75 65 72 69 65 73 3a 0a 2a 2a  wing queries:.**
17e40 0a 2a 2a 20 20 20 28 31 29 20 20 53 45 4c 45 43  .**   (1)  SELEC
17e50 54 20 2a 20 46 52 4f 4d 20 74 31 20 4c 45 46 54  T * FROM t1 LEFT
17e60 20 4a 4f 49 4e 20 74 32 20 4f 4e 20 74 31 2e 61   JOIN t2 ON t1.a
17e70 3d 74 32 2e 78 20 57 48 45 52 45 20 74 32 2e 7a  =t2.x WHERE t2.z
17e80 3d 27 6f 6b 27 0a 2a 2a 20 20 20 28 32 29 20 20  ='ok'.**   (2)  
17e90 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
17ea0 20 4c 45 46 54 20 4a 4f 49 4e 20 74 32 20 4f 4e   LEFT JOIN t2 ON
17eb0 20 74 31 2e 61 3d 74 32 2e 78 20 41 4e 44 20 74   t1.a=t2.x AND t
17ec0 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 20 20 20 28 33  2.z='ok'.**   (3
17ed0 29 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  )  SELECT * FROM
17ee0 20 74 31 2c 20 74 32 20 57 48 45 52 45 20 74 31   t1, t2 WHERE t1
17ef0 2e 61 3d 74 32 2e 78 20 41 4e 44 20 74 32 2e 7a  .a=t2.x AND t2.z
17f00 3d 27 6f 6b 27 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ='ok'.**.** The 
17f10 74 32 2e 7a 3d 27 6f 6b 27 20 69 73 20 64 69 73  t2.z='ok' is dis
17f20 61 62 6c 65 64 20 69 6e 20 74 68 65 20 69 6e 20  abled in the in 
17f30 28 32 29 20 62 65 63 61 75 73 65 20 69 74 20 6f  (2) because it o
17f40 72 69 67 69 6e 61 74 65 73 0a 2a 2a 20 69 6e 20  riginates.** in 
17f50 74 68 65 20 4f 4e 20 63 6c 61 75 73 65 2e 20 20  the ON clause.  
17f60 54 68 65 20 74 65 72 6d 20 69 73 20 64 69 73 61  The term is disa
17f70 62 6c 65 64 20 69 6e 20 28 33 29 20 62 65 63 61  bled in (3) beca
17f80 75 73 65 20 69 74 20 69 73 20 6e 6f 74 20 70 61  use it is not pa
17f90 72 74 0a 2a 2a 20 6f 66 20 61 20 4c 45 46 54 20  rt.** of a LEFT 
17fa0 4f 55 54 45 52 20 4a 4f 49 4e 2e 20 20 49 6e 20  OUTER JOIN.  In 
17fb0 28 31 29 2c 20 74 68 65 20 74 65 72 6d 20 69 73  (1), the term is
17fc0 20 6e 6f 74 20 64 69 73 61 62 6c 65 64 2e 0a 2a   not disabled..*
17fd0 2a 0a 2a 2a 20 44 69 73 61 62 6c 69 6e 67 20 61  *.** Disabling a
17fe0 20 74 65 72 6d 20 63 61 75 73 65 73 20 74 68 61   term causes tha
17ff0 74 20 74 65 72 6d 20 74 6f 20 6e 6f 74 20 62 65  t term to not be
18000 20 74 65 73 74 65 64 20 69 6e 20 74 68 65 20 69   tested in the i
18010 6e 6e 65 72 20 6c 6f 6f 70 0a 2a 2a 20 6f 66 20  nner loop.** of 
18020 74 68 65 20 6a 6f 69 6e 2e 20 20 44 69 73 61 62  the join.  Disab
18030 6c 69 6e 67 20 69 73 20 61 6e 20 6f 70 74 69 6d  ling is an optim
18040 69 7a 61 74 69 6f 6e 2e 20 20 57 68 65 6e 20 74  ization.  When t
18050 65 72 6d 73 20 61 72 65 20 73 61 74 69 73 66 69  erms are satisfi
18060 65 64 0a 2a 2a 20 62 79 20 69 6e 64 69 63 65 73  ed.** by indices
18070 2c 20 77 65 20 64 69 73 61 62 6c 65 20 74 68 65  , we disable the
18080 6d 20 74 6f 20 70 72 65 76 65 6e 74 20 72 65 64  m to prevent red
18090 75 6e 64 61 6e 74 20 74 65 73 74 73 20 69 6e 20  undant tests in 
180a0 74 68 65 20 69 6e 6e 65 72 0a 2a 2a 20 6c 6f 6f  the inner.** loo
180b0 70 2e 20 20 57 65 20 77 6f 75 6c 64 20 67 65 74  p.  We would get
180c0 20 74 68 65 20 63 6f 72 72 65 63 74 20 72 65 73   the correct res
180d0 75 6c 74 73 20 69 66 20 6e 6f 74 68 69 6e 67 20  ults if nothing 
180e0 77 65 72 65 20 65 76 65 72 20 64 69 73 61 62 6c  were ever disabl
180f0 65 64 2c 0a 2a 2a 20 62 75 74 20 6a 6f 69 6e 73  ed,.** but joins
18100 20 6d 69 67 68 74 20 72 75 6e 20 61 20 6c 69 74   might run a lit
18110 74 6c 65 20 73 6c 6f 77 65 72 2e 20 20 54 68 65  tle slower.  The
18120 20 74 72 69 63 6b 20 69 73 20 74 6f 20 64 69 73   trick is to dis
18130 61 62 6c 65 20 61 73 20 6d 75 63 68 0a 2a 2a 20  able as much.** 
18140 61 73 20 77 65 20 63 61 6e 20 77 69 74 68 6f 75  as we can withou
18150 74 20 64 69 73 61 62 6c 69 6e 67 20 74 6f 6f 20  t disabling too 
18160 6d 75 63 68 2e 20 20 49 66 20 77 65 20 64 69 73  much.  If we dis
18170 61 62 6c 65 64 20 69 6e 20 28 31 29 2c 20 77 65  abled in (1), we
18180 27 64 20 67 65 74 0a 2a 2a 20 74 68 65 20 77 72  'd get.** the wr
18190 6f 6e 67 20 61 6e 73 77 65 72 2e 20 20 53 65 65  ong answer.  See
181a0 20 74 69 63 6b 65 74 20 23 38 31 33 2e 0a 2a 2a   ticket #813..**
181b0 0a 2a 2a 20 49 66 20 61 6c 6c 20 74 68 65 20 63  .** If all the c
181c0 68 69 6c 64 72 65 6e 20 6f 66 20 61 20 74 65 72  hildren of a ter
181d0 6d 20 61 72 65 20 64 69 73 61 62 6c 65 64 2c 20  m are disabled, 
181e0 74 68 65 6e 20 74 68 61 74 20 74 65 72 6d 20 69  then that term i
181f0 73 20 61 6c 73 6f 0a 2a 2a 20 61 75 74 6f 6d 61  s also.** automa
18200 74 69 63 61 6c 6c 79 20 64 69 73 61 62 6c 65 64  tically disabled
18210 2e 20 20 49 6e 20 74 68 69 73 20 77 61 79 2c 20  .  In this way, 
18220 74 65 72 6d 73 20 67 65 74 20 64 69 73 61 62 6c  terms get disabl
18230 65 64 20 69 66 20 64 65 72 69 76 65 64 0a 2a 2a  ed if derived.**
18240 20 76 69 72 74 75 61 6c 20 74 65 72 6d 73 20 61   virtual terms a
18250 72 65 20 74 65 73 74 65 64 20 66 69 72 73 74 2e  re tested first.
18260 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a    For example:.*
18270 2a 0a 2a 2a 20 20 20 20 20 20 78 20 47 4c 4f 42  *.**      x GLOB
18280 20 27 61 62 63 2a 27 20 41 4e 44 20 78 3e 3d 27   'abc*' AND x>='
18290 61 62 63 27 20 41 4e 44 20 78 3c 27 61 63 64 27  abc' AND x<'acd'
182a0 0a 2a 2a 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f  .**      \______
182b0 5f 5f 5f 5f 5f 2f 20 20 20 20 20 5c 5f 5f 5f 5f  _____/     \____
182c0 5f 5f 2f 20 20 20 20 20 5c 5f 5f 5f 5f 5f 2f 0a  __/     \_____/.
182d0 2a 2a 20 20 20 20 20 20 20 20 20 70 61 72 65 6e  **         paren
182e0 74 20 20 20 20 20 20 20 20 20 20 63 68 69 6c 64  t          child
182f0 31 20 20 20 20 20 20 20 63 68 69 6c 64 32 0a 2a  1       child2.*
18300 2a 0a 2a 2a 20 4f 6e 6c 79 20 74 68 65 20 70 61  *.** Only the pa
18310 72 65 6e 74 20 74 65 72 6d 20 77 61 73 20 69 6e  rent term was in
18320 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 57 48   the original WH
18330 45 52 45 20 63 6c 61 75 73 65 2e 20 20 54 68 65  ERE clause.  The
18340 20 63 68 69 6c 64 31 0a 2a 2a 20 61 6e 64 20 63   child1.** and c
18350 68 69 6c 64 32 20 74 65 72 6d 73 20 77 65 72 65  hild2 terms were
18360 20 61 64 64 65 64 20 62 79 20 74 68 65 20 4c 49   added by the LI
18370 4b 45 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e  KE optimization.
18380 20 20 49 66 20 62 6f 74 68 20 6f 66 0a 2a 2a 20    If both of.** 
18390 74 68 65 20 76 69 72 74 75 61 6c 20 63 68 69 6c  the virtual chil
183a0 64 20 74 65 72 6d 73 20 61 72 65 20 76 61 6c 69  d terms are vali
183b0 64 2c 20 74 68 65 6e 20 74 65 73 74 69 6e 67 20  d, then testing 
183c0 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20 63 61  of the parent ca
183d0 6e 20 62 65 20 0a 2a 2a 20 73 6b 69 70 70 65 64  n be .** skipped
183e0 2e 0a 2a 2a 0a 2a 2a 20 55 73 75 61 6c 6c 79 20  ..**.** Usually 
183f0 74 68 65 20 70 61 72 65 6e 74 20 74 65 72 6d 20  the parent term 
18400 69 73 20 6d 61 72 6b 65 64 20 61 73 20 54 45 52  is marked as TER
18410 4d 5f 43 4f 44 45 44 2e 20 20 42 75 74 20 69 66  M_CODED.  But if
18420 20 74 68 65 20 70 61 72 65 6e 74 0a 2a 2a 20 74   the parent.** t
18430 65 72 6d 20 77 61 73 20 6f 72 69 67 69 6e 61 6c  erm was original
18440 6c 79 20 54 45 52 4d 5f 4c 49 4b 45 2c 20 74 68  ly TERM_LIKE, th
18450 65 6e 20 74 68 65 20 70 61 72 65 6e 74 20 67 65  en the parent ge
18460 74 73 20 54 45 52 4d 5f 4c 49 4b 45 43 4f 4e 44  ts TERM_LIKECOND
18470 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 20 54 68 65   instead..** The
18480 20 54 45 52 4d 5f 4c 49 4b 45 43 4f 4e 44 20 6d   TERM_LIKECOND m
18490 61 72 6b 69 6e 67 20 69 6e 64 69 63 61 74 65 73  arking indicates
184a0 20 74 68 61 74 20 74 68 65 20 74 65 72 6d 20 73   that the term s
184b0 68 6f 75 6c 64 20 62 65 20 63 6f 64 65 64 20 69  hould be coded i
184c0 6e 73 69 64 65 0a 2a 2a 20 61 20 63 6f 6e 64 69  nside.** a condi
184d0 74 69 6f 6e 61 6c 20 73 75 63 68 20 74 68 61 74  tional such that
184e0 20 69 73 20 6f 6e 6c 79 20 65 76 61 6c 75 61 74   is only evaluat
184f0 65 64 20 6f 6e 20 74 68 65 20 73 65 63 6f 6e 64  ed on the second
18500 20 70 61 73 73 20 6f 66 20 61 0a 2a 2a 20 4c 49   pass of a.** LI
18510 4b 45 2d 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  KE-optimization 
18520 6c 6f 6f 70 2c 20 77 68 65 6e 20 73 63 61 6e 6e  loop, when scann
18530 69 6e 67 20 42 4c 4f 42 73 20 69 6e 73 74 65 61  ing BLOBs instea
18540 64 20 6f 66 20 73 74 72 69 6e 67 73 2e 0a 2a 2f  d of strings..*/
18550 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 69 73  .static void dis
18560 61 62 6c 65 54 65 72 6d 28 57 68 65 72 65 4c 65  ableTerm(WhereLe
18570 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 57 68 65  vel *pLevel, Whe
18580 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 29 7b 0a  reTerm *pTerm){.
18590 20 20 69 6e 74 20 6e 4c 6f 6f 70 20 3d 20 30 3b    int nLoop = 0;
185a0 0a 20 20 77 68 69 6c 65 28 20 70 54 65 72 6d 0a  .  while( pTerm.
185b0 20 20 20 20 20 20 26 26 20 28 70 54 65 72 6d 2d        && (pTerm-
185c0 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
185d0 43 4f 44 45 44 29 3d 3d 30 0a 20 20 20 20 20 20  CODED)==0.      
185e0 26 26 20 28 70 4c 65 76 65 6c 2d 3e 69 4c 65 66  && (pLevel->iLef
185f0 74 4a 6f 69 6e 3d 3d 30 20 7c 7c 20 45 78 70 72  tJoin==0 || Expr
18600 48 61 73 50 72 6f 70 65 72 74 79 28 70 54 65 72  HasProperty(pTer
18610 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f 46 72 6f  m->pExpr, EP_Fro
18620 6d 4a 6f 69 6e 29 29 0a 20 20 20 20 20 20 26 26  mJoin)).      &&
18630 20 28 70 4c 65 76 65 6c 2d 3e 6e 6f 74 52 65 61   (pLevel->notRea
18640 64 79 20 26 20 70 54 65 72 6d 2d 3e 70 72 65 72  dy & pTerm->prer
18650 65 71 41 6c 6c 29 3d 3d 30 0a 20 20 29 7b 0a 20  eqAll)==0.  ){. 
18660 20 20 20 69 66 28 20 6e 4c 6f 6f 70 20 26 26 20     if( nLoop && 
18670 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20  (pTerm->wtFlags 
18680 26 20 54 45 52 4d 5f 4c 49 4b 45 29 21 3d 30 20  & TERM_LIKE)!=0 
18690 29 7b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e  ){.      pTerm->
186a0 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f  wtFlags |= TERM_
186b0 4c 49 4b 45 43 4f 4e 44 3b 0a 20 20 20 20 7d 65  LIKECOND;.    }e
186c0 6c 73 65 7b 0a 20 20 20 20 20 20 70 54 65 72 6d  lse{.      pTerm
186d0 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52  ->wtFlags |= TER
186e0 4d 5f 43 4f 44 45 44 3b 0a 20 20 20 20 7d 0a 20  M_CODED;.    }. 
186f0 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 69 50     if( pTerm->iP
18700 61 72 65 6e 74 3c 30 20 29 20 62 72 65 61 6b 3b  arent<0 ) break;
18710 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70 54  .    pTerm = &pT
18720 65 72 6d 2d 3e 70 57 43 2d 3e 61 5b 70 54 65 72  erm->pWC->a[pTer
18730 6d 2d 3e 69 50 61 72 65 6e 74 5d 3b 0a 20 20 20  m->iParent];.   
18740 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 2d 2d   pTerm->nChild--
18750 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  ;.    if( pTerm-
18760 3e 6e 43 68 69 6c 64 21 3d 30 20 29 20 62 72 65  >nChild!=0 ) bre
18770 61 6b 3b 0a 20 20 20 20 6e 4c 6f 6f 70 2b 2b 3b  ak;.    nLoop++;
18780 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  .  }.}../*.** Co
18790 64 65 20 61 6e 20 4f 50 5f 41 66 66 69 6e 69 74  de an OP_Affinit
187a0 79 20 6f 70 63 6f 64 65 20 74 6f 20 61 70 70 6c  y opcode to appl
187b0 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61 66 66  y the column aff
187c0 69 6e 69 74 79 20 73 74 72 69 6e 67 20 7a 41 66  inity string zAf
187d0 66 0a 2a 2a 20 74 6f 20 74 68 65 20 6e 20 72 65  f.** to the n re
187e0 67 69 73 74 65 72 73 20 73 74 61 72 74 69 6e 67  gisters starting
187f0 20 61 74 20 62 61 73 65 2e 20 0a 2a 2a 0a 2a 2a   at base. .**.**
18800 20 41 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74   As an optimizat
18810 69 6f 6e 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f  ion, SQLITE_AFF_
18820 4e 4f 4e 45 20 65 6e 74 72 69 65 73 20 28 77 68  NONE entries (wh
18830 69 63 68 20 61 72 65 20 6e 6f 2d 6f 70 73 29 20  ich are no-ops) 
18840 61 74 20 74 68 65 0a 2a 2a 20 62 65 67 69 6e 6e  at the.** beginn
18850 69 6e 67 20 61 6e 64 20 65 6e 64 20 6f 66 20 7a  ing and end of z
18860 41 66 66 20 61 72 65 20 69 67 6e 6f 72 65 64 2e  Aff are ignored.
18870 20 20 49 66 20 61 6c 6c 20 65 6e 74 72 69 65 73    If all entries
18880 20 69 6e 20 7a 41 66 66 20 61 72 65 0a 2a 2a 20   in zAff are.** 
18890 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 2c  SQLITE_AFF_NONE,
188a0 20 74 68 65 6e 20 6e 6f 20 63 6f 64 65 20 67 65   then no code ge
188b0 74 73 20 67 65 6e 65 72 61 74 65 64 2e 0a 2a 2a  ts generated..**
188c0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
188d0 20 6d 61 6b 65 73 20 69 74 73 20 6f 77 6e 20 63   makes its own c
188e0 6f 70 79 20 6f 66 20 7a 41 66 66 20 73 6f 20 74  opy of zAff so t
188f0 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20 69  hat the caller i
18900 73 20 66 72 65 65 0a 2a 2a 20 74 6f 20 6d 6f 64  s free.** to mod
18910 69 66 79 20 7a 41 66 66 20 61 66 74 65 72 20 74  ify zAff after t
18920 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
18930 72 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  rns..*/.static v
18940 6f 69 64 20 63 6f 64 65 41 70 70 6c 79 41 66 66  oid codeApplyAff
18950 69 6e 69 74 79 28 50 61 72 73 65 20 2a 70 50 61  inity(Parse *pPa
18960 72 73 65 2c 20 69 6e 74 20 62 61 73 65 2c 20 69  rse, int base, i
18970 6e 74 20 6e 2c 20 63 68 61 72 20 2a 7a 41 66 66  nt n, char *zAff
18980 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
18990 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
189a0 69 66 28 20 7a 41 66 66 3d 3d 30 20 29 7b 0a 20  if( zAff==0 ){. 
189b0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73     assert( pPars
189c0 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
189d0 6c 65 64 20 29 3b 0a 20 20 20 20 72 65 74 75 72  led );.    retur
189e0 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  n;.  }.  assert(
189f0 20 76 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 41   v!=0 );..  /* A
18a00 64 6a 75 73 74 20 62 61 73 65 20 61 6e 64 20 6e  djust base and n
18a10 20 74 6f 20 73 6b 69 70 20 6f 76 65 72 20 53 51   to skip over SQ
18a20 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 65 6e  LITE_AFF_NONE en
18a30 74 72 69 65 73 20 61 74 20 74 68 65 20 62 65 67  tries at the beg
18a40 69 6e 6e 69 6e 67 0a 20 20 2a 2a 20 61 6e 64 20  inning.  ** and 
18a50 65 6e 64 20 6f 66 20 74 68 65 20 61 66 66 69 6e  end of the affin
18a60 69 74 79 20 73 74 72 69 6e 67 2e 0a 20 20 2a 2f  ity string..  */
18a70 0a 20 20 77 68 69 6c 65 28 20 6e 3e 30 20 26 26  .  while( n>0 &&
18a80 20 7a 41 66 66 5b 30 5d 3d 3d 53 51 4c 49 54 45   zAff[0]==SQLITE
18a90 5f 41 46 46 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20  _AFF_NONE ){.   
18aa0 20 6e 2d 2d 3b 0a 20 20 20 20 62 61 73 65 2b 2b   n--;.    base++
18ab0 3b 0a 20 20 20 20 7a 41 66 66 2b 2b 3b 0a 20 20  ;.    zAff++;.  
18ac0 7d 0a 20 20 77 68 69 6c 65 28 20 6e 3e 31 20 26  }.  while( n>1 &
18ad0 26 20 7a 41 66 66 5b 6e 2d 31 5d 3d 3d 53 51 4c  & zAff[n-1]==SQL
18ae0 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 29 7b 0a  ITE_AFF_NONE ){.
18af0 20 20 20 20 6e 2d 2d 3b 0a 20 20 7d 0a 0a 20 20      n--;.  }..  
18b00 2f 2a 20 43 6f 64 65 20 74 68 65 20 4f 50 5f 41  /* Code the OP_A
18b10 66 66 69 6e 69 74 79 20 6f 70 63 6f 64 65 20 69  ffinity opcode i
18b20 66 20 74 68 65 72 65 20 69 73 20 61 6e 79 74 68  f there is anyth
18b30 69 6e 67 20 6c 65 66 74 20 74 6f 20 64 6f 2e 20  ing left to do. 
18b40 2a 2f 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a  */.  if( n>0 ){.
18b50 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
18b60 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 66 66 69  ddOp2(v, OP_Affi
18b70 6e 69 74 79 2c 20 62 61 73 65 2c 20 6e 29 3b 0a  nity, base, n);.
18b80 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
18b90 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 7a  hangeP4(v, -1, z
18ba0 41 66 66 2c 20 6e 29 3b 0a 20 20 20 20 73 71 6c  Aff, n);.    sql
18bb0 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66  ite3ExprCacheAff
18bc0 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72  inityChange(pPar
18bd0 73 65 2c 20 62 61 73 65 2c 20 6e 29 3b 0a 20 20  se, base, n);.  
18be0 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  }.}.../*.** Gene
18bf0 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20  rate code for a 
18c00 73 69 6e 67 6c 65 20 65 71 75 61 6c 69 74 79 20  single equality 
18c10 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52  term of the WHER
18c20 45 20 63 6c 61 75 73 65 2e 20 20 41 6e 20 65 71  E clause.  An eq
18c30 75 61 6c 69 74 79 0a 2a 2a 20 74 65 72 6d 20 63  uality.** term c
18c40 61 6e 20 62 65 20 65 69 74 68 65 72 20 58 3d 65  an be either X=e
18c50 78 70 72 20 6f 72 20 58 20 49 4e 20 28 2e 2e 2e  xpr or X IN (...
18c60 29 2e 20 20 20 70 54 65 72 6d 20 69 73 20 74 68  ).   pTerm is th
18c70 65 20 74 65 72 6d 20 74 6f 20 62 65 20 0a 2a 2a  e term to be .**
18c80 20 63 6f 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68   coded..**.** Th
18c90 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20  e current value 
18ca0 66 6f 72 20 74 68 65 20 63 6f 6e 73 74 72 61 69  for the constrai
18cb0 6e 74 20 69 73 20 6c 65 66 74 20 69 6e 20 72 65  nt is left in re
18cc0 67 69 73 74 65 72 20 69 52 65 67 2e 0a 2a 2a 0a  gister iReg..**.
18cd0 2a 2a 20 46 6f 72 20 61 20 63 6f 6e 73 74 72 61  ** For a constra
18ce0 69 6e 74 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  int of the form 
18cf0 58 3d 65 78 70 72 2c 20 74 68 65 20 65 78 70 72  X=expr, the expr
18d00 65 73 73 69 6f 6e 20 69 73 20 65 76 61 6c 75 61  ession is evalua
18d10 74 65 64 20 61 6e 64 20 69 74 73 0a 2a 2a 20 72  ted and its.** r
18d20 65 73 75 6c 74 20 69 73 20 6c 65 66 74 20 6f 6e  esult is left on
18d30 20 74 68 65 20 73 74 61 63 6b 2e 20 20 46 6f 72   the stack.  For
18d40 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 66 20   constraints of 
18d50 74 68 65 20 66 6f 72 6d 20 58 20 49 4e 20 28 2e  the form X IN (.
18d60 2e 2e 29 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  ..).** this rout
18d70 69 6e 65 20 73 65 74 73 20 75 70 20 61 20 6c 6f  ine sets up a lo
18d80 6f 70 20 74 68 61 74 20 77 69 6c 6c 20 69 74 65  op that will ite
18d90 72 61 74 65 20 6f 76 65 72 20 61 6c 6c 20 76 61  rate over all va
18da0 6c 75 65 73 20 6f 66 20 58 2e 0a 2a 2f 0a 73 74  lues of X..*/.st
18db0 61 74 69 63 20 69 6e 74 20 63 6f 64 65 45 71 75  atic int codeEqu
18dc0 61 6c 69 74 79 54 65 72 6d 28 0a 20 20 50 61 72  alityTerm(.  Par
18dd0 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
18de0 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20   /* The parsing 
18df0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65  context */.  Whe
18e00 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 20  reTerm *pTerm,  
18e10 20 2f 2a 20 54 68 65 20 74 65 72 6d 20 6f 66 20   /* The term of 
18e20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
18e30 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a   to be coded */.
18e40 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c    WhereLevel *pL
18e50 65 76 65 6c 2c 20 2f 2a 20 54 68 65 20 6c 65 76  evel, /* The lev
18e60 65 6c 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63  el of the FROM c
18e70 6c 61 75 73 65 20 77 65 20 61 72 65 20 77 6f 72  lause we are wor
18e80 6b 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20 69 6e 74  king on */.  int
18e90 20 69 45 71 2c 20 20 20 20 20 20 20 20 20 20 20   iEq,           
18ea0 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65   /* Index of the
18eb0 20 65 71 75 61 6c 69 74 79 20 74 65 72 6d 20 77   equality term w
18ec0 69 74 68 69 6e 20 74 68 69 73 20 6c 65 76 65 6c  ithin this level
18ed0 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65 76 2c 20   */.  int bRev, 
18ee0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
18ef0 65 20 66 6f 72 20 72 65 76 65 72 73 65 2d 6f 72  e for reverse-or
18f00 64 65 72 20 49 4e 20 6f 70 65 72 61 74 69 6f 6e  der IN operation
18f10 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 72 67  s */.  int iTarg
18f20 65 74 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74  et         /* At
18f30 74 65 6d 70 74 20 74 6f 20 6c 65 61 76 65 20 72  tempt to leave r
18f40 65 73 75 6c 74 73 20 69 6e 20 74 68 69 73 20 72  esults in this r
18f50 65 67 69 73 74 65 72 20 2a 2f 0a 29 7b 0a 20 20  egister */.){.  
18f60 45 78 70 72 20 2a 70 58 20 3d 20 70 54 65 72 6d  Expr *pX = pTerm
18f70 2d 3e 70 45 78 70 72 3b 0a 20 20 56 64 62 65 20  ->pExpr;.  Vdbe 
18f80 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
18f90 62 65 3b 0a 20 20 69 6e 74 20 69 52 65 67 3b 20  be;.  int iReg; 
18fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18fb0 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c   /* Register hol
18fc0 64 69 6e 67 20 72 65 73 75 6c 74 73 20 2a 2f 0a  ding results */.
18fd0 0a 20 20 61 73 73 65 72 74 28 20 69 54 61 72 67  .  assert( iTarg
18fe0 65 74 3e 30 20 29 3b 0a 20 20 69 66 28 20 70 58  et>0 );.  if( pX
18ff0 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20 29 7b 0a 20  ->op==TK_EQ ){. 
19000 20 20 20 69 52 65 67 20 3d 20 73 71 6c 69 74 65     iReg = sqlite
19010 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28  3ExprCodeTarget(
19020 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 52 69 67  pParse, pX->pRig
19030 68 74 2c 20 69 54 61 72 67 65 74 29 3b 0a 20 20  ht, iTarget);.  
19040 7d 65 6c 73 65 20 69 66 28 20 70 58 2d 3e 6f 70  }else if( pX->op
19050 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20  ==TK_ISNULL ){. 
19060 20 20 20 69 52 65 67 20 3d 20 69 54 61 72 67 65     iReg = iTarge
19070 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  t;.    sqlite3Vd
19080 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
19090 75 6c 6c 2c 20 30 2c 20 69 52 65 67 29 3b 0a 23  ull, 0, iReg);.#
190a0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
190b0 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 7d 65  IT_SUBQUERY.  }e
190c0 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 65 54 79  lse{.    int eTy
190d0 70 65 3b 0a 20 20 20 20 69 6e 74 20 69 54 61 62  pe;.    int iTab
190e0 3b 0a 20 20 20 20 73 74 72 75 63 74 20 49 6e 4c  ;.    struct InL
190f0 6f 6f 70 20 2a 70 49 6e 3b 0a 20 20 20 20 57 68  oop *pIn;.    Wh
19100 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 20 3d  ereLoop *pLoop =
19110 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b   pLevel->pWLoop;
19120 0a 0a 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70  ..    if( (pLoop
19130 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
19140 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 3d  E_VIRTUALTABLE)=
19150 3d 30 0a 20 20 20 20 20 20 26 26 20 70 4c 6f 6f  =0.      && pLoo
19160 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
19170 78 21 3d 30 0a 20 20 20 20 20 20 26 26 20 70 4c  x!=0.      && pL
19180 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  oop->u.btree.pIn
19190 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  dex->aSortOrder[
191a0 69 45 71 5d 0a 20 20 20 20 29 7b 0a 20 20 20 20  iEq].    ){.    
191b0 20 20 74 65 73 74 63 61 73 65 28 20 69 45 71 3d    testcase( iEq=
191c0 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  =0 );.      test
191d0 63 61 73 65 28 20 62 52 65 76 20 29 3b 0a 20 20  case( bRev );.  
191e0 20 20 20 20 62 52 65 76 20 3d 20 21 62 52 65 76      bRev = !bRev
191f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
19200 72 74 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49  rt( pX->op==TK_I
19210 4e 20 29 3b 0a 20 20 20 20 69 52 65 67 20 3d 20  N );.    iReg = 
19220 69 54 61 72 67 65 74 3b 0a 20 20 20 20 65 54 79  iTarget;.    eTy
19230 70 65 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  pe = sqlite3Find
19240 49 6e 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  InIndex(pParse, 
19250 70 58 2c 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f  pX, IN_INDEX_LOO
19260 50 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 65  P, 0);.    if( e
19270 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 49  Type==IN_INDEX_I
19280 4e 44 45 58 5f 44 45 53 43 20 29 7b 0a 20 20 20  NDEX_DESC ){.   
19290 20 20 20 74 65 73 74 63 61 73 65 28 20 62 52 65     testcase( bRe
192a0 76 20 29 3b 0a 20 20 20 20 20 20 62 52 65 76 20  v );.      bRev 
192b0 3d 20 21 62 52 65 76 3b 0a 20 20 20 20 7d 0a 20  = !bRev;.    }. 
192c0 20 20 20 69 54 61 62 20 3d 20 70 58 2d 3e 69 54     iTab = pX->iT
192d0 61 62 6c 65 3b 0a 20 20 20 20 73 71 6c 69 74 65  able;.    sqlite
192e0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 62  3VdbeAddOp2(v, b
192f0 52 65 76 20 3f 20 4f 50 5f 4c 61 73 74 20 3a 20  Rev ? OP_Last : 
19300 4f 50 5f 52 65 77 69 6e 64 2c 20 69 54 61 62 2c  OP_Rewind, iTab,
19310 20 30 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76   0);.    VdbeCov
19320 65 72 61 67 65 49 66 28 76 2c 20 62 52 65 76 29  erageIf(v, bRev)
19330 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61  ;.    VdbeCovera
19340 67 65 49 66 28 76 2c 20 21 62 52 65 76 29 3b 0a  geIf(v, !bRev);.
19350 20 20 20 20 61 73 73 65 72 74 28 20 28 70 4c 6f      assert( (pLo
19360 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
19370 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 29 3d 3d 30  ERE_MULTI_OR)==0
19380 20 29 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 77   );.    pLoop->w
19390 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f  sFlags |= WHERE_
193a0 49 4e 5f 41 42 4c 45 3b 0a 20 20 20 20 69 66 28  IN_ABLE;.    if(
193b0 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49   pLevel->u.in.nI
193c0 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 4c  n==0 ){.      pL
193d0 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 20 3d 20  evel->addrNxt = 
193e0 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
193f0 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 7d 0a 20  abel(v);.    }. 
19400 20 20 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e     pLevel->u.in.
19410 6e 49 6e 2b 2b 3b 0a 20 20 20 20 70 4c 65 76 65  nIn++;.    pLeve
19420 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 20  l->u.in.aInLoop 
19430 3d 0a 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  =.       sqlite3
19440 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28  DbReallocOrFree(
19450 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c 65 76  pParse->db, pLev
19460 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70  el->u.in.aInLoop
19470 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
19480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19490 73 69 7a 65 6f 66 28 70 4c 65 76 65 6c 2d 3e 75  sizeof(pLevel->u
194a0 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 5b 30 5d 29 2a  .in.aInLoop[0])*
194b0 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e  pLevel->u.in.nIn
194c0 29 3b 0a 20 20 20 20 70 49 6e 20 3d 20 70 4c 65  );.    pIn = pLe
194d0 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f  vel->u.in.aInLoo
194e0 70 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 20 29  p;.    if( pIn )
194f0 7b 0a 20 20 20 20 20 20 70 49 6e 20 2b 3d 20 70  {.      pIn += p
19500 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 20  Level->u.in.nIn 
19510 2d 20 31 3b 0a 20 20 20 20 20 20 70 49 6e 2d 3e  - 1;.      pIn->
19520 69 43 75 72 20 3d 20 69 54 61 62 3b 0a 20 20 20  iCur = iTab;.   
19530 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 49 4e     if( eType==IN
19540 5f 49 4e 44 45 58 5f 52 4f 57 49 44 20 29 7b 0a  _INDEX_ROWID ){.
19550 20 20 20 20 20 20 20 20 70 49 6e 2d 3e 61 64 64          pIn->add
19560 72 49 6e 54 6f 70 20 3d 20 73 71 6c 69 74 65 33  rInTop = sqlite3
19570 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
19580 5f 52 6f 77 69 64 2c 20 69 54 61 62 2c 20 69 52  _Rowid, iTab, iR
19590 65 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  eg);.      }else
195a0 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 2d 3e 61  {.        pIn->a
195b0 64 64 72 49 6e 54 6f 70 20 3d 20 73 71 6c 69 74  ddrInTop = sqlit
195c0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
195d0 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 54 61 62 2c  OP_Column, iTab,
195e0 20 30 2c 20 69 52 65 67 29 3b 0a 20 20 20 20 20   0, iReg);.     
195f0 20 7d 0a 20 20 20 20 20 20 70 49 6e 2d 3e 65 45   }.      pIn->eE
19600 6e 64 4c 6f 6f 70 4f 70 20 3d 20 62 52 65 76 20  ndLoopOp = bRev 
19610 3f 20 4f 50 5f 50 72 65 76 49 66 4f 70 65 6e 20  ? OP_PrevIfOpen 
19620 3a 20 4f 50 5f 4e 65 78 74 49 66 4f 70 65 6e 3b  : OP_NextIfOpen;
19630 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
19640 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49  beAddOp1(v, OP_I
19650 73 4e 75 6c 6c 2c 20 69 52 65 67 29 3b 20 56 64  sNull, iReg); Vd
19660 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
19670 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
19680 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e  pLevel->u.in.nIn
19690 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 23 65 6e 64   = 0;.    }.#end
196a0 69 66 0a 20 20 7d 0a 20 20 64 69 73 61 62 6c 65  if.  }.  disable
196b0 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 54 65  Term(pLevel, pTe
196c0 72 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 52  rm);.  return iR
196d0 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  eg;.}../*.** Gen
196e0 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
196f0 77 69 6c 6c 20 65 76 61 6c 75 61 74 65 20 61 6c  will evaluate al
19700 6c 20 3d 3d 20 61 6e 64 20 49 4e 20 63 6f 6e 73  l == and IN cons
19710 74 72 61 69 6e 74 73 20 66 6f 72 20 61 6e 0a 2a  traints for an.*
19720 2a 20 69 6e 64 65 78 20 73 63 61 6e 2e 0a 2a 2a  * index scan..**
19730 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  .** For example,
19740 20 63 6f 6e 73 69 64 65 72 20 74 61 62 6c 65 20   consider table 
19750 74 31 28 61 2c 62 2c 63 2c 64 2c 65 2c 66 29 20  t1(a,b,c,d,e,f) 
19760 77 69 74 68 20 69 6e 64 65 78 20 69 31 28 61 2c  with index i1(a,
19770 62 2c 63 29 2e 0a 2a 2a 20 53 75 70 70 6f 73 65  b,c)..** Suppose
19780 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
19790 65 20 69 73 20 74 68 69 73 3a 20 20 61 3d 3d 35  e is this:  a==5
197a0 20 41 4e 44 20 62 20 49 4e 20 28 31 2c 32 2c 33   AND b IN (1,2,3
197b0 29 20 41 4e 44 20 63 3e 35 20 41 4e 44 20 63 3c  ) AND c>5 AND c<
197c0 31 30 0a 2a 2a 20 54 68 65 20 69 6e 64 65 78 20  10.** The index 
197d0 68 61 73 20 61 73 20 6d 61 6e 79 20 61 73 20 74  has as many as t
197e0 68 72 65 65 20 65 71 75 61 6c 69 74 79 20 63 6f  hree equality co
197f0 6e 73 74 72 61 69 6e 74 73 2c 20 62 75 74 20 69  nstraints, but i
19800 6e 20 74 68 69 73 0a 2a 2a 20 65 78 61 6d 70 6c  n this.** exampl
19810 65 2c 20 74 68 65 20 74 68 69 72 64 20 22 63 22  e, the third "c"
19820 20 76 61 6c 75 65 20 69 73 20 61 6e 20 69 6e 65   value is an ine
19830 71 75 61 6c 69 74 79 2e 20 20 53 6f 20 6f 6e 6c  quality.  So onl
19840 79 20 74 77 6f 20 0a 2a 2a 20 63 6f 6e 73 74 72  y two .** constr
19850 61 69 6e 74 73 20 61 72 65 20 63 6f 64 65 64 2e  aints are coded.
19860 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77    This routine w
19870 69 6c 6c 20 67 65 6e 65 72 61 74 65 20 63 6f 64  ill generate cod
19880 65 20 74 6f 20 65 76 61 6c 75 61 74 65 0a 2a 2a  e to evaluate.**
19890 20 61 3d 3d 35 20 61 6e 64 20 62 20 49 4e 20 28   a==5 and b IN (
198a0 31 2c 32 2c 33 29 2e 20 20 54 68 65 20 63 75 72  1,2,3).  The cur
198b0 72 65 6e 74 20 76 61 6c 75 65 73 20 66 6f 72 20  rent values for 
198c0 61 20 61 6e 64 20 62 20 77 69 6c 6c 20 62 65 20  a and b will be 
198d0 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 63 6f 6e  stored.** in con
198e0 73 65 63 75 74 69 76 65 20 72 65 67 69 73 74 65  secutive registe
198f0 72 73 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78  rs and the index
19900 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 72 65   of the first re
19910 67 69 73 74 65 72 20 69 73 20 72 65 74 75 72 6e  gister is return
19920 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65  ed..**.** In the
19930 20 65 78 61 6d 70 6c 65 20 61 62 6f 76 65 20 6e   example above n
19940 45 71 3d 3d 32 2e 20 20 42 75 74 20 74 68 69 73  Eq==2.  But this
19950 20 73 75 62 72 6f 75 74 69 6e 65 20 77 6f 72 6b   subroutine work
19960 73 20 66 6f 72 20 61 6e 79 20 76 61 6c 75 65 0a  s for any value.
19970 2a 2a 20 6f 66 20 6e 45 71 20 69 6e 63 6c 75 64  ** of nEq includ
19980 69 6e 67 20 30 2e 20 20 49 66 20 6e 45 71 3d 3d  ing 0.  If nEq==
19990 30 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  0, this routine 
199a0 69 73 20 6e 65 61 72 6c 79 20 61 20 6e 6f 2d 6f  is nearly a no-o
199b0 70 2e 0a 2a 2a 20 54 68 65 20 6f 6e 6c 79 20 74  p..** The only t
199c0 68 69 6e 67 20 69 74 20 64 6f 65 73 20 69 73 20  hing it does is 
199d0 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 70 4c 65  allocate the pLe
199e0 76 65 6c 2d 3e 69 4d 65 6d 20 6d 65 6d 6f 72 79  vel->iMem memory
199f0 20 63 65 6c 6c 20 61 6e 64 0a 2a 2a 20 63 6f 6d   cell and.** com
19a00 70 75 74 65 20 74 68 65 20 61 66 66 69 6e 69 74  pute the affinit
19a10 79 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  y string..**.** 
19a20 54 68 65 20 6e 45 78 74 72 61 52 65 67 20 70 61  The nExtraReg pa
19a30 72 61 6d 65 74 65 72 20 69 73 20 30 20 6f 72 20  rameter is 0 or 
19a40 31 2e 20 20 49 74 20 69 73 20 30 20 69 66 20 61  1.  It is 0 if a
19a50 6c 6c 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  ll WHERE clause 
19a60 63 6f 6e 73 74 72 61 69 6e 74 73 0a 2a 2a 20 61  constraints.** a
19a70 72 65 20 3d 3d 20 6f 72 20 49 4e 20 61 6e 64 20  re == or IN and 
19a80 61 72 65 20 63 6f 76 65 72 65 64 20 62 79 20 74  are covered by t
19a90 68 65 20 6e 45 71 2e 20 20 6e 45 78 74 72 61 52  he nEq.  nExtraR
19aa0 65 67 20 69 73 20 31 20 69 66 20 74 68 65 72 65  eg is 1 if there
19ab0 20 69 73 0a 2a 2a 20 61 6e 20 69 6e 65 71 75 61   is.** an inequa
19ac0 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20  lity constraint 
19ad0 28 73 75 63 68 20 61 73 20 74 68 65 20 22 63 3e  (such as the "c>
19ae0 3d 35 20 41 4e 44 20 63 3c 31 30 22 20 69 6e 20  =5 AND c<10" in 
19af0 74 68 65 20 65 78 61 6d 70 6c 65 29 20 74 68 61  the example) tha
19b00 74 0a 2a 2a 20 6f 63 63 75 72 73 20 61 66 74 65  t.** occurs afte
19b10 72 20 74 68 65 20 6e 45 71 20 71 75 61 6c 69 74  r the nEq qualit
19b20 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 0a 2a  y constraints..*
19b30 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
19b40 65 20 61 6c 6c 6f 63 61 74 65 73 20 61 20 72 61  e allocates a ra
19b50 6e 67 65 20 6f 66 20 6e 45 71 2b 6e 45 78 74 72  nge of nEq+nExtr
19b60 61 52 65 67 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  aReg memory cell
19b70 73 20 61 6e 64 20 72 65 74 75 72 6e 73 0a 2a 2a  s and returns.**
19b80 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   the index of th
19b90 65 20 66 69 72 73 74 20 6d 65 6d 6f 72 79 20 63  e first memory c
19ba0 65 6c 6c 20 69 6e 20 74 68 61 74 20 72 61 6e 67  ell in that rang
19bb0 65 2e 20 54 68 65 20 63 6f 64 65 20 74 68 61 74  e. The code that
19bc0 0a 2a 2a 20 63 61 6c 6c 73 20 74 68 69 73 20 72  .** calls this r
19bd0 6f 75 74 69 6e 65 20 77 69 6c 6c 20 75 73 65 20  outine will use 
19be0 74 68 61 74 20 6d 65 6d 6f 72 79 20 72 61 6e 67  that memory rang
19bf0 65 20 74 6f 20 73 74 6f 72 65 20 6b 65 79 73 20  e to store keys 
19c00 66 6f 72 0a 2a 2a 20 73 74 61 72 74 20 61 6e 64  for.** start and
19c10 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20 63 6f 6e   termination con
19c20 64 69 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 6c  ditions of the l
19c30 6f 6f 70 2e 0a 2a 2a 20 6b 65 79 20 76 61 6c 75  oop..** key valu
19c40 65 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20 20  e of the loop.  
19c50 49 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 49  If one or more I
19c60 4e 20 6f 70 65 72 61 74 6f 72 73 20 61 70 70 65  N operators appe
19c70 61 72 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73  ar, then.** this
19c80 20 72 6f 75 74 69 6e 65 20 61 6c 6c 6f 63 61 74   routine allocat
19c90 65 73 20 61 6e 20 61 64 64 69 74 69 6f 6e 61 6c  es an additional
19ca0 20 6e 45 71 20 6d 65 6d 6f 72 79 20 63 65 6c 6c   nEq memory cell
19cb0 73 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c 0a 2a  s for internal.*
19cc0 2a 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 42 65 66  * use..**.** Bef
19cd0 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 2a  ore returning, *
19ce0 70 7a 41 66 66 20 69 73 20 73 65 74 20 74 6f 20  pzAff is set to 
19cf0 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65  point to a buffe
19d00 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 0a 2a  r containing a.*
19d10 2a 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63 6f  * copy of the co
19d20 6c 75 6d 6e 20 61 66 66 69 6e 69 74 79 20 73 74  lumn affinity st
19d30 72 69 6e 67 20 6f 66 20 74 68 65 20 69 6e 64 65  ring of the inde
19d40 78 20 61 6c 6c 6f 63 61 74 65 64 20 75 73 69 6e  x allocated usin
19d50 67 0a 2a 2a 20 73 71 6c 69 74 65 33 44 62 4d 61  g.** sqlite3DbMa
19d60 6c 6c 6f 63 28 29 2e 20 45 78 63 65 70 74 2c 20  lloc(). Except, 
19d70 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 63  entries in the c
19d80 6f 70 79 20 6f 66 20 74 68 65 20 73 74 72 69 6e  opy of the strin
19d90 67 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20  g associated.** 
19da0 77 69 74 68 20 65 71 75 61 6c 69 74 79 20 63 6f  with equality co
19db0 6e 73 74 72 61 69 6e 74 73 20 74 68 61 74 20 75  nstraints that u
19dc0 73 65 20 4e 4f 4e 45 20 61 66 66 69 6e 69 74 79  se NONE affinity
19dd0 20 61 72 65 20 73 65 74 20 74 6f 0a 2a 2a 20 53   are set to.** S
19de0 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 2e 20  QLITE_AFF_NONE. 
19df0 54 68 69 73 20 69 73 20 74 6f 20 64 65 61 6c 20  This is to deal 
19e00 77 69 74 68 20 53 51 4c 20 73 75 63 68 20 61 73  with SQL such as
19e10 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a   the following:.
19e20 2a 2a 0a 2a 2a 20 20 20 43 52 45 41 54 45 20 54  **.**   CREATE T
19e30 41 42 4c 45 20 74 31 28 61 20 54 45 58 54 20 50  ABLE t1(a TEXT P
19e40 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 29 3b 0a  RIMARY KEY, b);.
19e50 2a 2a 20 20 20 53 45 4c 45 43 54 20 2e 2e 2e 20  **   SELECT ... 
19e60 46 52 4f 4d 20 74 31 20 41 53 20 74 32 2c 20 74  FROM t1 AS t2, t
19e70 31 20 57 48 45 52 45 20 74 31 2e 61 20 3d 20 74  1 WHERE t1.a = t
19e80 32 2e 62 3b 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68  2.b;.**.** In th
19e90 65 20 65 78 61 6d 70 6c 65 20 61 62 6f 76 65 2c  e example above,
19ea0 20 74 68 65 20 69 6e 64 65 78 20 6f 6e 20 74 31   the index on t1
19eb0 28 61 29 20 68 61 73 20 54 45 58 54 20 61 66 66  (a) has TEXT aff
19ec0 69 6e 69 74 79 2e 20 42 75 74 20 73 69 6e 63 65  inity. But since
19ed0 0a 2a 2a 20 74 68 65 20 72 69 67 68 74 20 68 61  .** the right ha
19ee0 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65 20 65  nd side of the e
19ef0 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
19f00 6e 74 20 28 74 32 2e 62 29 20 68 61 73 20 4e 4f  nt (t2.b) has NO
19f10 4e 45 20 61 66 66 69 6e 69 74 79 2c 0a 2a 2a 20  NE affinity,.** 
19f20 6e 6f 20 63 6f 6e 76 65 72 73 69 6f 6e 20 73 68  no conversion sh
19f30 6f 75 6c 64 20 62 65 20 61 74 74 65 6d 70 74 65  ould be attempte
19f40 64 20 62 65 66 6f 72 65 20 75 73 69 6e 67 20 61  d before using a
19f50 20 74 32 2e 62 20 76 61 6c 75 65 20 61 73 20 70   t2.b value as p
19f60 61 72 74 20 6f 66 0a 2a 2a 20 61 20 6b 65 79 20  art of.** a key 
19f70 74 6f 20 73 65 61 72 63 68 20 74 68 65 20 69 6e  to search the in
19f80 64 65 78 2e 20 48 65 6e 63 65 20 74 68 65 20 66  dex. Hence the f
19f90 69 72 73 74 20 62 79 74 65 20 69 6e 20 74 68 65  irst byte in the
19fa0 20 72 65 74 75 72 6e 65 64 20 61 66 66 69 6e 69   returned affini
19fb0 74 79 0a 2a 2a 20 73 74 72 69 6e 67 20 69 6e 20  ty.** string in 
19fc0 74 68 69 73 20 65 78 61 6d 70 6c 65 20 77 6f 75  this example wou
19fd0 6c 64 20 62 65 20 73 65 74 20 74 6f 20 53 51 4c  ld be set to SQL
19fe0 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 2e 0a 2a 2f  ITE_AFF_NONE..*/
19ff0 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 64 65  .static int code
1a000 41 6c 6c 45 71 75 61 6c 69 74 79 54 65 72 6d 73  AllEqualityTerms
1a010 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
1a020 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72  e,        /* Par
1a030 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
1a040 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c    WhereLevel *pL
1a050 65 76 65 6c 2c 20 20 20 2f 2a 20 57 68 69 63 68  evel,   /* Which
1a060 20 6e 65 73 74 65 64 20 6c 6f 6f 70 20 6f 66 20   nested loop of 
1a070 74 68 65 20 46 52 4f 4d 20 77 65 20 61 72 65 20  the FROM we are 
1a080 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20  coding */.  int 
1a090 62 52 65 76 2c 20 20 20 20 20 20 20 20 20 20 20  bRev,           
1a0a0 20 20 2f 2a 20 52 65 76 65 72 73 65 20 74 68 65    /* Reverse the
1a0b0 20 6f 72 64 65 72 20 6f 66 20 49 4e 20 6f 70 65   order of IN ope
1a0c0 72 61 74 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20  rators */.  int 
1a0d0 6e 45 78 74 72 61 52 65 67 2c 20 20 20 20 20 20  nExtraReg,      
1a0e0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
1a0f0 78 74 72 61 20 72 65 67 69 73 74 65 72 73 20 74  xtra registers t
1a100 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20  o allocate */.  
1a110 63 68 61 72 20 2a 2a 70 7a 41 66 66 20 20 20 20  char **pzAff    
1a120 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 65        /* OUT: Se
1a130 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 66  t to point to af
1a140 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20 2a 2f  finity string */
1a150 0a 29 7b 0a 20 20 75 31 36 20 6e 45 71 3b 20 20  .){.  u16 nEq;  
1a160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a170 20 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65      /* The numbe
1a180 72 20 6f 66 20 3d 3d 20 6f 72 20 49 4e 20 63 6f  r of == or IN co
1a190 6e 73 74 72 61 69 6e 74 73 20 74 6f 20 63 6f 64  nstraints to cod
1a1a0 65 20 2a 2f 0a 20 20 75 31 36 20 6e 53 6b 69 70  e */.  u16 nSkip
1a1b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1a1c0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1a1d0 66 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75  f left-most colu
1a1e0 6d 6e 73 20 74 6f 20 73 6b 69 70 20 2a 2f 0a 20  mns to skip */. 
1a1f0 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
1a200 65 2d 3e 70 56 64 62 65 3b 20 20 20 20 20 20 2f  e->pVdbe;      /
1a210 2a 20 54 68 65 20 76 6d 20 75 6e 64 65 72 20 63  * The vm under c
1a220 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20  onstruction */. 
1a230 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20   Index *pIdx;   
1a240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1a250 2a 20 54 68 65 20 69 6e 64 65 78 20 62 65 69 6e  * The index bein
1a260 67 20 75 73 65 64 20 66 6f 72 20 74 68 69 73 20  g used for this 
1a270 6c 6f 6f 70 20 2a 2f 0a 20 20 57 68 65 72 65 54  loop */.  WhereT
1a280 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20  erm *pTerm;     
1a290 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e          /* A sin
1a2a0 67 6c 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 74  gle constraint t
1a2b0 65 72 6d 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f  erm */.  WhereLo
1a2c0 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20  op *pLoop;      
1a2d0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 68         /* The Wh
1a2e0 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 2a  ereLoop object *
1a2f0 2f 0a 20 20 69 6e 74 20 6a 3b 20 20 20 20 20 20  /.  int j;      
1a300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a310 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
1a320 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 42 61  r */.  int regBa
1a330 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  se;             
1a340 20 20 20 20 20 2f 2a 20 42 61 73 65 20 72 65 67       /* Base reg
1a350 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e  ister */.  int n
1a360 52 65 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  Reg;            
1a370 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1a380 65 72 20 6f 66 20 72 65 67 69 73 74 65 72 73 20  er of registers 
1a390 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20  to allocate */. 
1a3a0 20 63 68 61 72 20 2a 7a 41 66 66 3b 20 20 20 20   char *zAff;    
1a3b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1a3c0 2a 20 41 66 66 69 6e 69 74 79 20 73 74 72 69 6e  * Affinity strin
1a3d0 67 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 0a  g to return */..
1a3e0 20 20 2f 2a 20 54 68 69 73 20 6d 6f 64 75 6c 65    /* This module
1a3f0 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20   is only called 
1a400 6f 6e 20 71 75 65 72 79 20 70 6c 61 6e 73 20 74  on query plans t
1a410 68 61 74 20 75 73 65 20 61 6e 20 69 6e 64 65 78  hat use an index
1a420 2e 20 2a 2f 0a 20 20 70 4c 6f 6f 70 20 3d 20 70  . */.  pLoop = p
1a430 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20  Level->pWLoop;. 
1a440 20 61 73 73 65 72 74 28 20 28 70 4c 6f 6f 70 2d   assert( (pLoop-
1a450 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
1a460 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d  _VIRTUALTABLE)==
1a470 30 20 29 3b 0a 20 20 6e 45 71 20 3d 20 70 4c 6f  0 );.  nEq = pLo
1a480 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b  op->u.btree.nEq;
1a490 0a 20 20 6e 53 6b 69 70 20 3d 20 70 4c 6f 6f 70  .  nSkip = pLoop
1a4a0 2d 3e 6e 53 6b 69 70 3b 0a 20 20 70 49 64 78 20  ->nSkip;.  pIdx 
1a4b0 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  = pLoop->u.btree
1a4c0 2e 70 49 6e 64 65 78 3b 0a 20 20 61 73 73 65 72  .pIndex;.  asser
1a4d0 74 28 20 70 49 64 78 21 3d 30 20 29 3b 0a 0a 20  t( pIdx!=0 );.. 
1a4e0 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68   /* Figure out h
1a4f0 6f 77 20 6d 61 6e 79 20 6d 65 6d 6f 72 79 20 63  ow many memory c
1a500 65 6c 6c 73 20 77 65 20 77 69 6c 6c 20 6e 65 65  ells we will nee
1a510 64 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65 20  d then allocate 
1a520 74 68 65 6d 2e 0a 20 20 2a 2f 0a 20 20 72 65 67  them..  */.  reg
1a530 42 61 73 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e  Base = pParse->n
1a540 4d 65 6d 20 2b 20 31 3b 0a 20 20 6e 52 65 67 20  Mem + 1;.  nReg 
1a550 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  = pLoop->u.btree
1a560 2e 6e 45 71 20 2b 20 6e 45 78 74 72 61 52 65 67  .nEq + nExtraReg
1a570 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  ;.  pParse->nMem
1a580 20 2b 3d 20 6e 52 65 67 3b 0a 0a 20 20 7a 41 66   += nReg;..  zAf
1a590 66 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  f = sqlite3DbStr
1a5a0 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  Dup(pParse->db, 
1a5b0 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69  sqlite3IndexAffi
1a5c0 6e 69 74 79 53 74 72 28 76 2c 20 70 49 64 78 29  nityStr(v, pIdx)
1a5d0 29 3b 0a 20 20 69 66 28 20 21 7a 41 66 66 20 29  );.  if( !zAff )
1a5e0 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 64 62  {.    pParse->db
1a5f0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d  ->mallocFailed =
1a600 20 31 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6e   1;.  }..  if( n
1a610 53 6b 69 70 20 29 7b 0a 20 20 20 20 69 6e 74 20  Skip ){.    int 
1a620 69 49 64 78 43 75 72 20 3d 20 70 4c 65 76 65 6c  iIdxCur = pLevel
1a630 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20 20 20 73  ->iIdxCur;.    s
1a640 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
1a650 28 76 2c 20 28 62 52 65 76 3f 4f 50 5f 4c 61 73  (v, (bRev?OP_Las
1a660 74 3a 4f 50 5f 52 65 77 69 6e 64 29 2c 20 69 49  t:OP_Rewind), iI
1a670 64 78 43 75 72 29 3b 0a 20 20 20 20 56 64 62 65  dxCur);.    Vdbe
1a680 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 62 52  CoverageIf(v, bR
1a690 65 76 3d 3d 30 29 3b 0a 20 20 20 20 56 64 62 65  ev==0);.    Vdbe
1a6a0 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 62 52  CoverageIf(v, bR
1a6b0 65 76 21 3d 30 29 3b 0a 20 20 20 20 56 64 62 65  ev!=0);.    Vdbe
1a6c0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 62 65 67  Comment((v, "beg
1a6d0 69 6e 20 73 6b 69 70 2d 73 63 61 6e 20 6f 6e 20  in skip-scan on 
1a6e0 25 73 22 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65  %s", pIdx->zName
1a6f0 29 29 3b 0a 20 20 20 20 6a 20 3d 20 73 71 6c 69  ));.    j = sqli
1a700 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c  te3VdbeAddOp0(v,
1a710 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20 20 20 70   OP_Goto);.    p
1a720 4c 65 76 65 6c 2d 3e 61 64 64 72 53 6b 69 70 20  Level->addrSkip 
1a730 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
1a740 4f 70 34 49 6e 74 28 76 2c 20 28 62 52 65 76 3f  Op4Int(v, (bRev?
1a750 4f 50 5f 53 65 65 6b 4c 54 3a 4f 50 5f 53 65 65  OP_SeekLT:OP_See
1a760 6b 47 54 29 2c 0a 20 20 20 20 20 20 20 20 20 20  kGT),.          
1a770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a780 20 20 69 49 64 78 43 75 72 2c 20 30 2c 20 72 65    iIdxCur, 0, re
1a790 67 42 61 73 65 2c 20 6e 53 6b 69 70 29 3b 0a 20  gBase, nSkip);. 
1a7a0 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
1a7b0 66 28 76 2c 20 62 52 65 76 3d 3d 30 29 3b 0a 20  f(v, bRev==0);. 
1a7c0 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
1a7d0 66 28 76 2c 20 62 52 65 76 21 3d 30 29 3b 0a 20  f(v, bRev!=0);. 
1a7e0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
1a7f0 6d 70 48 65 72 65 28 76 2c 20 6a 29 3b 0a 20 20  mpHere(v, j);.  
1a800 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 53 6b    for(j=0; j<nSk
1a810 69 70 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ip; j++){.      
1a820 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1a830 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  3(v, OP_Column, 
1a840 69 49 64 78 43 75 72 2c 20 6a 2c 20 72 65 67 42  iIdxCur, j, regB
1a850 61 73 65 2b 6a 29 3b 0a 20 20 20 20 20 20 61 73  ase+j);.      as
1a860 73 65 72 74 28 20 70 49 64 78 2d 3e 61 69 43 6f  sert( pIdx->aiCo
1a870 6c 75 6d 6e 5b 6a 5d 3e 3d 30 20 29 3b 0a 20 20  lumn[j]>=0 );.  
1a880 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
1a890 28 76 2c 20 22 25 73 22 2c 20 70 49 64 78 2d 3e  (v, "%s", pIdx->
1a8a0 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 70 49 64  pTable->aCol[pId
1a8b0 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 5d 2e  x->aiColumn[j]].
1a8c0 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 7d 0a 20  zName));.    }. 
1a8d0 20 7d 20 20 20 20 0a 0a 20 20 2f 2a 20 45 76 61   }    ..  /* Eva
1a8e0 6c 75 61 74 65 20 74 68 65 20 65 71 75 61 6c 69  luate the equali
1a8f0 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20  ty constraints. 
1a900 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 7a 41   */.  assert( zA
1a910 66 66 3d 3d 30 20 7c 7c 20 28 69 6e 74 29 73 74  ff==0 || (int)st
1a920 72 6c 65 6e 28 7a 41 66 66 29 3e 3d 6e 45 71 20  rlen(zAff)>=nEq 
1a930 29 3b 0a 20 20 66 6f 72 28 6a 3d 6e 53 6b 69 70  );.  for(j=nSkip
1a940 3b 20 6a 3c 6e 45 71 3b 20 6a 2b 2b 29 7b 0a 20  ; j<nEq; j++){. 
1a950 20 20 20 69 6e 74 20 72 31 3b 0a 20 20 20 20 70     int r1;.    p
1a960 54 65 72 6d 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c  Term = pLoop->aL
1a970 54 65 72 6d 5b 6a 5d 3b 0a 20 20 20 20 61 73 73  Term[j];.    ass
1a980 65 72 74 28 20 70 54 65 72 6d 21 3d 30 20 29 3b  ert( pTerm!=0 );
1a990 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  .    /* The foll
1a9a0 6f 77 69 6e 67 20 74 65 73 74 63 61 73 65 20 69  owing testcase i
1a9b0 73 20 74 72 75 65 20 66 6f 72 20 69 6e 64 69 63  s true for indic
1a9c0 65 73 20 77 69 74 68 20 72 65 64 75 6e 64 61 6e  es with redundan
1a9d0 74 20 63 6f 6c 75 6d 6e 73 2e 20 0a 20 20 20 20  t columns. .    
1a9e0 2a 2a 20 45 78 3a 20 43 52 45 41 54 45 20 49 4e  ** Ex: CREATE IN
1a9f0 44 45 58 20 69 31 20 4f 4e 20 74 31 28 61 2c 62  DEX i1 ON t1(a,b
1aa00 2c 61 29 3b 20 53 45 4c 45 43 54 20 2a 20 46 52  ,a); SELECT * FR
1aa10 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3d 30 20  OM t1 WHERE a=0 
1aa20 41 4e 44 20 62 3d 30 3b 20 2a 2f 0a 20 20 20 20  AND b=0; */.    
1aa30 74 65 73 74 63 61 73 65 28 20 28 70 54 65 72 6d  testcase( (pTerm
1aa40 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
1aa50 5f 43 4f 44 45 44 29 21 3d 30 20 29 3b 0a 20 20  _CODED)!=0 );.  
1aa60 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
1aa70 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
1aa80 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20 20 20  M_VIRTUAL );.   
1aa90 20 72 31 20 3d 20 63 6f 64 65 45 71 75 61 6c 69   r1 = codeEquali
1aaa0 74 79 54 65 72 6d 28 70 50 61 72 73 65 2c 20 70  tyTerm(pParse, p
1aab0 54 65 72 6d 2c 20 70 4c 65 76 65 6c 2c 20 6a 2c  Term, pLevel, j,
1aac0 20 62 52 65 76 2c 20 72 65 67 42 61 73 65 2b 6a   bRev, regBase+j
1aad0 29 3b 0a 20 20 20 20 69 66 28 20 72 31 21 3d 72  );.    if( r1!=r
1aae0 65 67 42 61 73 65 2b 6a 20 29 7b 0a 20 20 20 20  egBase+j ){.    
1aaf0 20 20 69 66 28 20 6e 52 65 67 3d 3d 31 20 29 7b    if( nReg==1 ){
1ab00 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1ab10 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
1ab20 50 61 72 73 65 2c 20 72 65 67 42 61 73 65 29 3b  Parse, regBase);
1ab30 0a 20 20 20 20 20 20 20 20 72 65 67 42 61 73 65  .        regBase
1ab40 20 3d 20 72 31 3b 0a 20 20 20 20 20 20 7d 65 6c   = r1;.      }el
1ab50 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
1ab60 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1ab70 20 4f 50 5f 53 43 6f 70 79 2c 20 72 31 2c 20 72   OP_SCopy, r1, r
1ab80 65 67 42 61 73 65 2b 6a 29 3b 0a 20 20 20 20 20  egBase+j);.     
1ab90 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 74 65 73   }.    }.    tes
1aba0 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f  tcase( pTerm->eO
1abb0 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 4e  perator & WO_ISN
1abc0 55 4c 4c 20 29 3b 0a 20 20 20 20 74 65 73 74 63  ULL );.    testc
1abd0 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65  ase( pTerm->eOpe
1abe0 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29 3b  rator & WO_IN );
1abf0 0a 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d  .    if( (pTerm-
1ac00 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f  >eOperator & (WO
1ac10 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 49 4e 29 29 3d  _ISNULL|WO_IN))=
1ac20 3d 30 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72  =0 ){.      Expr
1ac30 20 2a 70 52 69 67 68 74 20 3d 20 70 54 65 72 6d   *pRight = pTerm
1ac40 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b  ->pExpr->pRight;
1ac50 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
1ac60 65 33 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28  e3ExprCanBeNull(
1ac70 70 52 69 67 68 74 29 20 29 7b 0a 20 20 20 20 20  pRight) ){.     
1ac80 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1ac90 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c  dOp2(v, OP_IsNul
1aca0 6c 2c 20 72 65 67 42 61 73 65 2b 6a 2c 20 70 4c  l, regBase+j, pL
1acb0 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b 29 3b 0a  evel->addrBrk);.
1acc0 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
1acd0 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 7d  rage(v);.      }
1ace0 0a 20 20 20 20 20 20 69 66 28 20 7a 41 66 66 20  .      if( zAff 
1acf0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  ){.        if( s
1ad00 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66  qlite3CompareAff
1ad10 69 6e 69 74 79 28 70 52 69 67 68 74 2c 20 7a 41  inity(pRight, zA
1ad20 66 66 5b 6a 5d 29 3d 3d 53 51 4c 49 54 45 5f 41  ff[j])==SQLITE_A
1ad30 46 46 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20  FF_NONE ){.     
1ad40 20 20 20 20 20 7a 41 66 66 5b 6a 5d 20 3d 20 53       zAff[j] = S
1ad50 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a  QLITE_AFF_NONE;.
1ad60 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1ad70 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
1ad80 72 4e 65 65 64 73 4e 6f 41 66 66 69 6e 69 74 79  rNeedsNoAffinity
1ad90 43 68 61 6e 67 65 28 70 52 69 67 68 74 2c 20 7a  Change(pRight, z
1ada0 41 66 66 5b 6a 5d 29 20 29 7b 0a 20 20 20 20 20  Aff[j]) ){.     
1adb0 20 20 20 20 20 7a 41 66 66 5b 6a 5d 20 3d 20 53       zAff[j] = S
1adc0 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a  QLITE_AFF_NONE;.
1add0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1ade0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70  }.    }.  }.  *p
1adf0 7a 41 66 66 20 3d 20 7a 41 66 66 3b 0a 20 20 72  zAff = zAff;.  r
1ae00 65 74 75 72 6e 20 72 65 67 42 61 73 65 3b 0a 7d  eturn regBase;.}
1ae10 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
1ae20 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a  _OMIT_EXPLAIN./*
1ae30 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1ae40 20 69 73 20 61 20 68 65 6c 70 65 72 20 66 6f 72   is a helper for
1ae50 20 65 78 70 6c 61 69 6e 49 6e 64 65 78 52 61 6e   explainIndexRan
1ae60 67 65 28 29 20 62 65 6c 6f 77 0a 2a 2a 0a 2a 2a  ge() below.**.**
1ae70 20 70 53 74 72 20 68 6f 6c 64 73 20 74 68 65 20   pStr holds the 
1ae80 74 65 78 74 20 6f 66 20 61 6e 20 65 78 70 72 65  text of an expre
1ae90 73 73 69 6f 6e 20 74 68 61 74 20 77 65 20 61 72  ssion that we ar
1aea0 65 20 62 75 69 6c 64 69 6e 67 20 75 70 20 6f 6e  e building up on
1aeb0 65 20 74 65 72 6d 0a 2a 2a 20 61 74 20 61 20 74  e term.** at a t
1aec0 69 6d 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ime.  This routi
1aed0 6e 65 20 61 64 64 73 20 61 20 6e 65 77 20 74 65  ne adds a new te
1aee0 72 6d 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  rm to the end of
1aef0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2e   the expression.
1af00 0a 2a 2a 20 54 65 72 6d 73 20 61 72 65 20 73 65  .** Terms are se
1af10 70 61 72 61 74 65 64 20 62 79 20 41 4e 44 20 73  parated by AND s
1af20 6f 20 61 64 64 20 74 68 65 20 22 41 4e 44 22 20  o add the "AND" 
1af30 74 65 78 74 20 66 6f 72 20 73 65 63 6f 6e 64 20  text for second 
1af40 61 6e 64 20 73 75 62 73 65 71 75 65 6e 74 0a 2a  and subsequent.*
1af50 2a 20 74 65 72 6d 73 20 6f 6e 6c 79 2e 0a 2a 2f  * terms only..*/
1af60 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
1af70 6c 61 69 6e 41 70 70 65 6e 64 54 65 72 6d 28 0a  lainAppendTerm(.
1af80 20 20 53 74 72 41 63 63 75 6d 20 2a 70 53 74 72    StrAccum *pStr
1af90 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
1afa0 20 54 68 65 20 74 65 78 74 20 65 78 70 72 65 73   The text expres
1afb0 73 69 6f 6e 20 62 65 69 6e 67 20 62 75 69 6c 74  sion being built
1afc0 20 2a 2f 0a 20 20 69 6e 74 20 69 54 65 72 6d 2c   */.  int iTerm,
1afd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1afe0 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68    /* Index of th
1aff0 69 73 20 74 65 72 6d 2e 20 20 46 69 72 73 74 20  is term.  First 
1b000 69 73 20 7a 65 72 6f 20 2a 2f 0a 20 20 63 6f 6e  is zero */.  con
1b010 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 75 6d 6e  st char *zColumn
1b020 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65  ,        /* Name
1b030 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 2a   of the column *
1b040 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
1b050 7a 4f 70 20 20 20 20 20 20 20 20 20 20 20 20 20  zOp             
1b060 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f  /* Name of the o
1b070 70 65 72 61 74 6f 72 20 2a 2f 0a 29 7b 0a 20 20  perator */.){.  
1b080 69 66 28 20 69 54 65 72 6d 20 29 20 73 71 6c 69  if( iTerm ) sqli
1b090 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e  te3StrAccumAppen
1b0a0 64 28 70 53 74 72 2c 20 22 20 41 4e 44 20 22 2c  d(pStr, " AND ",
1b0b0 20 35 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 74   5);.  sqlite3St
1b0c0 72 41 63 63 75 6d 41 70 70 65 6e 64 41 6c 6c 28  rAccumAppendAll(
1b0d0 70 53 74 72 2c 20 7a 43 6f 6c 75 6d 6e 29 3b 0a  pStr, zColumn);.
1b0e0 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75    sqlite3StrAccu
1b0f0 6d 41 70 70 65 6e 64 28 70 53 74 72 2c 20 7a 4f  mAppend(pStr, zO
1b100 70 2c 20 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  p, 1);.  sqlite3
1b110 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 70  StrAccumAppend(p
1b120 53 74 72 2c 20 22 3f 22 2c 20 31 29 3b 0a 7d 0a  Str, "?", 1);.}.
1b130 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20  ./*.** Argument 
1b140 70 4c 65 76 65 6c 20 64 65 73 63 72 69 62 65 73  pLevel describes
1b150 20 61 20 73 74 72 61 74 65 67 79 20 66 6f 72 20   a strategy for 
1b160 73 63 61 6e 6e 69 6e 67 20 74 61 62 6c 65 20 70  scanning table p
1b170 54 61 62 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75  Tab. This .** fu
1b180 6e 63 74 69 6f 6e 20 61 70 70 65 6e 64 73 20 74  nction appends t
1b190 65 78 74 20 74 6f 20 70 53 74 72 20 74 68 61 74  ext to pStr that
1b1a0 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20 73   describes the s
1b1b0 75 62 73 65 74 20 6f 66 20 74 61 62 6c 65 0a 2a  ubset of table.*
1b1c0 2a 20 72 6f 77 73 20 73 63 61 6e 6e 65 64 20 62  * rows scanned b
1b1d0 79 20 74 68 65 20 73 74 72 61 74 65 67 79 20 69  y the strategy i
1b1e0 6e 20 74 68 65 20 66 6f 72 6d 20 6f 66 20 61 6e  n the form of an
1b1f0 20 53 51 4c 20 65 78 70 72 65 73 73 69 6f 6e 2e   SQL expression.
1b200 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70  .**.** For examp
1b210 6c 65 2c 20 69 66 20 74 68 65 20 71 75 65 72 79  le, if the query
1b220 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54  :.**.**   SELECT
1b230 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45   * FROM t1 WHERE
1b240 20 61 3d 31 20 41 4e 44 20 62 3e 32 3b 0a 2a 2a   a=1 AND b>2;.**
1b250 0a 2a 2a 20 69 73 20 72 75 6e 20 61 6e 64 20 74  .** is run and t
1b260 68 65 72 65 20 69 73 20 61 6e 20 69 6e 64 65 78  here is an index
1b270 20 6f 6e 20 28 61 2c 20 62 29 2c 20 74 68 65 6e   on (a, b), then
1b280 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
1b290 65 74 75 72 6e 73 20 61 0a 2a 2a 20 73 74 72 69  eturns a.** stri
1b2a0 6e 67 20 73 69 6d 69 6c 61 72 20 74 6f 3a 0a 2a  ng similar to:.*
1b2b0 2a 0a 2a 2a 20 20 20 22 61 3d 3f 20 41 4e 44 20  *.**   "a=? AND 
1b2c0 62 3e 3f 22 0a 2a 2f 0a 73 74 61 74 69 63 20 76  b>?".*/.static v
1b2d0 6f 69 64 20 65 78 70 6c 61 69 6e 49 6e 64 65 78  oid explainIndex
1b2e0 52 61 6e 67 65 28 53 74 72 41 63 63 75 6d 20 2a  Range(StrAccum *
1b2f0 70 53 74 72 2c 20 57 68 65 72 65 4c 6f 6f 70 20  pStr, WhereLoop 
1b300 2a 70 4c 6f 6f 70 2c 20 54 61 62 6c 65 20 2a 70  *pLoop, Table *p
1b310 54 61 62 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70  Tab){.  Index *p
1b320 49 6e 64 65 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75  Index = pLoop->u
1b330 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20  .btree.pIndex;. 
1b340 20 75 31 36 20 6e 45 71 20 3d 20 70 4c 6f 6f 70   u16 nEq = pLoop
1b350 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20  ->u.btree.nEq;. 
1b360 20 75 31 36 20 6e 53 6b 69 70 20 3d 20 70 4c 6f   u16 nSkip = pLo
1b370 6f 70 2d 3e 6e 53 6b 69 70 3b 0a 20 20 69 6e 74  op->nSkip;.  int
1b380 20 69 2c 20 6a 3b 0a 20 20 43 6f 6c 75 6d 6e 20   i, j;.  Column 
1b390 2a 61 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43  *aCol = pTab->aC
1b3a0 6f 6c 3b 0a 20 20 69 31 36 20 2a 61 69 43 6f 6c  ol;.  i16 *aiCol
1b3b0 75 6d 6e 20 3d 20 70 49 6e 64 65 78 2d 3e 61 69  umn = pIndex->ai
1b3c0 43 6f 6c 75 6d 6e 3b 0a 0a 20 20 69 66 28 20 6e  Column;..  if( n
1b3d0 45 71 3d 3d 30 20 26 26 20 28 70 4c 6f 6f 70 2d  Eq==0 && (pLoop-
1b3e0 3e 77 73 46 6c 61 67 73 26 28 57 48 45 52 45 5f  >wsFlags&(WHERE_
1b3f0 42 54 4d 5f 4c 49 4d 49 54 7c 57 48 45 52 45 5f  BTM_LIMIT|WHERE_
1b400 54 4f 50 5f 4c 49 4d 49 54 29 29 3d 3d 30 20 29  TOP_LIMIT))==0 )
1b410 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74   return;.  sqlit
1b420 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64  e3StrAccumAppend
1b430 28 70 53 74 72 2c 20 22 20 28 22 2c 20 32 29 3b  (pStr, " (", 2);
1b440 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45  .  for(i=0; i<nE
1b450 71 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61  q; i++){.    cha
1b460 72 20 2a 7a 20 3d 20 61 69 43 6f 6c 75 6d 6e 5b  r *z = aiColumn[
1b470 69 5d 20 3c 20 30 20 3f 20 22 72 6f 77 69 64 22  i] < 0 ? "rowid"
1b480 20 3a 20 61 43 6f 6c 5b 61 69 43 6f 6c 75 6d 6e   : aCol[aiColumn
1b490 5b 69 5d 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  [i]].zName;.    
1b4a0 69 66 28 20 69 3e 3d 6e 53 6b 69 70 20 29 7b 0a  if( i>=nSkip ){.
1b4b0 20 20 20 20 20 20 65 78 70 6c 61 69 6e 41 70 70        explainApp
1b4c0 65 6e 64 54 65 72 6d 28 70 53 74 72 2c 20 69 2c  endTerm(pStr, i,
1b4d0 20 7a 2c 20 22 3d 22 29 3b 0a 20 20 20 20 7d 65   z, "=");.    }e
1b4e0 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 69  lse{.      if( i
1b4f0 20 29 20 73 71 6c 69 74 65 33 53 74 72 41 63 63   ) sqlite3StrAcc
1b500 75 6d 41 70 70 65 6e 64 28 70 53 74 72 2c 20 22  umAppend(pStr, "
1b510 20 41 4e 44 20 22 2c 20 35 29 3b 0a 20 20 20 20   AND ", 5);.    
1b520 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66    sqlite3XPrintf
1b530 28 70 53 74 72 2c 20 30 2c 20 22 41 4e 59 28 25  (pStr, 0, "ANY(%
1b540 73 29 22 2c 20 7a 29 3b 0a 20 20 20 20 7d 0a 20  s)", z);.    }. 
1b550 20 7d 0a 0a 20 20 6a 20 3d 20 69 3b 0a 20 20 69   }..  j = i;.  i
1b560 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  f( pLoop->wsFlag
1b570 73 26 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49  s&WHERE_BTM_LIMI
1b580 54 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  T ){.    char *z
1b590 20 3d 20 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 20 3c   = aiColumn[j] <
1b5a0 20 30 20 3f 20 22 72 6f 77 69 64 22 20 3a 20 61   0 ? "rowid" : a
1b5b0 43 6f 6c 5b 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 5d  Col[aiColumn[j]]
1b5c0 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 65 78 70 6c  .zName;.    expl
1b5d0 61 69 6e 41 70 70 65 6e 64 54 65 72 6d 28 70 53  ainAppendTerm(pS
1b5e0 74 72 2c 20 69 2b 2b 2c 20 7a 2c 20 22 3e 22 29  tr, i++, z, ">")
1b5f0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 6f 6f  ;.  }.  if( pLoo
1b600 70 2d 3e 77 73 46 6c 61 67 73 26 57 48 45 52 45  p->wsFlags&WHERE
1b610 5f 54 4f 50 5f 4c 49 4d 49 54 20 29 7b 0a 20 20  _TOP_LIMIT ){.  
1b620 20 20 63 68 61 72 20 2a 7a 20 3d 20 61 69 43 6f    char *z = aiCo
1b630 6c 75 6d 6e 5b 6a 5d 20 3c 20 30 20 3f 20 22 72  lumn[j] < 0 ? "r
1b640 6f 77 69 64 22 20 3a 20 61 43 6f 6c 5b 61 69 43  owid" : aCol[aiC
1b650 6f 6c 75 6d 6e 5b 6a 5d 5d 2e 7a 4e 61 6d 65 3b  olumn[j]].zName;
1b660 0a 20 20 20 20 65 78 70 6c 61 69 6e 41 70 70 65  .    explainAppe
1b670 6e 64 54 65 72 6d 28 70 53 74 72 2c 20 69 2c 20  ndTerm(pStr, i, 
1b680 7a 2c 20 22 3c 22 29 3b 0a 20 20 7d 0a 20 20 73  z, "<");.  }.  s
1b690 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70  qlite3StrAccumAp
1b6a0 70 65 6e 64 28 70 53 74 72 2c 20 22 29 22 2c 20  pend(pStr, ")", 
1b6b0 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  1);.}../*.** Thi
1b6c0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
1b6d0 6e 6f 2d 6f 70 20 75 6e 6c 65 73 73 20 63 75 72  no-op unless cur
1b6e0 72 65 6e 74 6c 79 20 70 72 6f 63 65 73 73 69 6e  rently processin
1b6f0 67 20 61 6e 20 45 58 50 4c 41 49 4e 20 51 55 45  g an EXPLAIN QUE
1b700 52 59 20 50 4c 41 4e 0a 2a 2a 20 63 6f 6d 6d 61  RY PLAN.** comma
1b710 6e 64 2c 20 6f 72 20 69 66 20 65 69 74 68 65 72  nd, or if either
1b720 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 6f 72   SQLITE_DEBUG or
1b730 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
1b740 54 4d 54 5f 53 43 41 4e 53 54 41 54 55 53 20 77  TMT_SCANSTATUS w
1b750 61 73 0a 2a 2a 20 64 65 66 69 6e 65 64 20 61 74  as.** defined at
1b760 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 2e 20 49   compile-time. I
1b770 66 20 69 74 20 69 73 20 6e 6f 74 20 61 20 6e 6f  f it is not a no
1b780 2d 6f 70 2c 20 61 20 73 69 6e 67 6c 65 20 4f 50  -op, a single OP
1b790 5f 45 78 70 6c 61 69 6e 20 6f 70 63 6f 64 65 20  _Explain opcode 
1b7a0 0a 2a 2a 20 69 73 20 61 64 64 65 64 20 74 6f 20  .** is added to 
1b7b0 74 68 65 20 6f 75 74 70 75 74 20 74 6f 20 64 65  the output to de
1b7c0 73 63 72 69 62 65 20 74 68 65 20 74 61 62 6c 65  scribe the table
1b7d0 20 73 63 61 6e 20 73 74 72 61 74 65 67 79 20 69   scan strategy i
1b7e0 6e 20 70 4c 65 76 65 6c 2e 0a 2a 2a 0a 2a 2a 20  n pLevel..**.** 
1b7f0 49 66 20 61 6e 20 4f 50 5f 45 78 70 6c 61 69 6e  If an OP_Explain
1b800 20 6f 70 63 6f 64 65 20 69 73 20 61 64 64 65 64   opcode is added
1b810 20 74 6f 20 74 68 65 20 56 4d 2c 20 69 74 73 20   to the VM, its 
1b820 61 64 64 72 65 73 73 20 69 73 20 72 65 74 75 72  address is retur
1b830 6e 65 64 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ned..** Otherwis
1b840 65 2c 20 69 66 20 6e 6f 20 4f 50 5f 45 78 70 6c  e, if no OP_Expl
1b850 61 69 6e 20 69 73 20 63 6f 64 65 64 2c 20 7a 65  ain is coded, ze
1b860 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  ro is returned..
1b870 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78  */.static int ex
1b880 70 6c 61 69 6e 4f 6e 65 53 63 61 6e 28 0a 20 20  plainOneScan(.  
1b890 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
1b8a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b8b0 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74  /* Parse context
1b8c0 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
1b8d0 54 61 62 4c 69 73 74 2c 20 20 20 20 20 20 20 20  TabList,        
1b8e0 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 6c        /* Table l
1b8f0 69 73 74 20 74 68 69 73 20 6c 6f 6f 70 20 72 65  ist this loop re
1b900 66 65 72 73 20 74 6f 20 2a 2f 0a 20 20 57 68 65  fers to */.  Whe
1b910 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c  reLevel *pLevel,
1b920 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b930 53 63 61 6e 20 74 6f 20 77 72 69 74 65 20 4f 50  Scan to write OP
1b940 5f 45 78 70 6c 61 69 6e 20 6f 70 63 6f 64 65 20  _Explain opcode 
1b950 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65  for */.  int iLe
1b960 76 65 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  vel,            
1b970 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75           /* Valu
1b980 65 20 66 6f 72 20 22 6c 65 76 65 6c 22 20 63 6f  e for "level" co
1b990 6c 75 6d 6e 20 6f 66 20 6f 75 74 70 75 74 20 2a  lumn of output *
1b9a0 2f 0a 20 20 69 6e 74 20 69 46 72 6f 6d 2c 20 20  /.  int iFrom,  
1b9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b9c0 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 66 6f 72      /* Value for
1b9d0 20 22 66 72 6f 6d 22 20 63 6f 6c 75 6d 6e 20 6f   "from" column o
1b9e0 66 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 75 31  f output */.  u1
1b9f0 36 20 77 63 74 72 6c 46 6c 61 67 73 20 20 20 20  6 wctrlFlags    
1ba00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ba10 20 46 6c 61 67 73 20 70 61 73 73 65 64 20 74 6f   Flags passed to
1ba20 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
1ba30 69 6e 28 29 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  in() */.){.  int
1ba40 20 72 65 74 20 3d 20 30 3b 0a 23 69 66 20 21 64   ret = 0;.#if !d
1ba50 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
1ba60 42 55 47 29 20 26 26 20 21 64 65 66 69 6e 65 64  BUG) && !defined
1ba70 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53  (SQLITE_ENABLE_S
1ba80 54 4d 54 5f 53 43 41 4e 53 54 41 54 55 53 29 0a  TMT_SCANSTATUS).
1ba90 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78    if( pParse->ex
1baa0 70 6c 61 69 6e 3d 3d 32 20 29 0a 23 65 6e 64 69  plain==2 ).#endi
1bab0 66 0a 20 20 7b 0a 20 20 20 20 73 74 72 75 63 74  f.  {.    struct
1bac0 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
1bad0 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74  Item = &pTabList
1bae0 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f  ->a[pLevel->iFro
1baf0 6d 5d 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 20  m];.    Vdbe *v 
1bb00 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
1bb10 20 20 20 20 20 20 2f 2a 20 56 4d 20 62 65 69 6e        /* VM bein
1bb20 67 20 63 6f 6e 73 74 72 75 63 74 65 64 20 2a 2f  g constructed */
1bb30 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62  .    sqlite3 *db
1bb40 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20   = pParse->db;  
1bb50 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68     /* Database h
1bb60 61 6e 64 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74  andle */.    int
1bb70 20 69 49 64 20 3d 20 70 50 61 72 73 65 2d 3e 69   iId = pParse->i
1bb80 53 65 6c 65 63 74 49 64 3b 20 20 2f 2a 20 53 65  SelectId;  /* Se
1bb90 6c 65 63 74 20 69 64 20 28 6c 65 66 74 2d 6d 6f  lect id (left-mo
1bba0 73 74 20 6f 75 74 70 75 74 20 63 6f 6c 75 6d 6e  st output column
1bbb0 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 73 53  ) */.    int isS
1bbc0 65 61 72 63 68 3b 20 20 20 20 20 20 20 20 20 20  earch;          
1bbd0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66         /* True f
1bbe0 6f 72 20 61 20 53 45 41 52 43 48 2e 20 46 61 6c  or a SEARCH. Fal
1bbf0 73 65 20 66 6f 72 20 53 43 41 4e 2e 20 2a 2f 0a  se for SCAN. */.
1bc00 20 20 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70      WhereLoop *p
1bc10 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  Loop;           
1bc20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 74 72 6f 6c    /* The control
1bc30 6c 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 6f  ling WhereLoop o
1bc40 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20 75 33 32  bject */.    u32
1bc50 20 66 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20   flags;         
1bc60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c             /* Fl
1bc70 61 67 73 20 74 68 61 74 20 64 65 73 63 72 69 62  ags that describ
1bc80 65 20 74 68 69 73 20 6c 6f 6f 70 20 2a 2f 0a 20  e this loop */. 
1bc90 20 20 20 63 68 61 72 20 2a 7a 4d 73 67 3b 20 20     char *zMsg;  
1bca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bcb0 20 2f 2a 20 54 65 78 74 20 74 6f 20 61 64 64 20   /* Text to add 
1bcc0 74 6f 20 45 51 50 20 6f 75 74 70 75 74 20 2a 2f  to EQP output */
1bcd0 0a 20 20 20 20 53 74 72 41 63 63 75 6d 20 73 74  .    StrAccum st
1bce0 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
1bcf0 20 20 20 2f 2a 20 45 51 50 20 6f 75 74 70 75 74     /* EQP output
1bd00 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 20 20 63   string */.    c
1bd10 68 61 72 20 7a 42 75 66 5b 31 30 30 5d 3b 20 20  har zBuf[100];  
1bd20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1bd30 49 6e 69 74 69 61 6c 20 73 70 61 63 65 20 66 6f  Initial space fo
1bd40 72 20 45 51 50 20 6f 75 74 70 75 74 20 73 74 72  r EQP output str
1bd50 69 6e 67 20 2a 2f 0a 0a 20 20 20 20 70 4c 6f 6f  ing */..    pLoo
1bd60 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f  p = pLevel->pWLo
1bd70 6f 70 3b 0a 20 20 20 20 66 6c 61 67 73 20 3d 20  op;.    flags = 
1bd80 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 3b 0a  pLoop->wsFlags;.
1bd90 20 20 20 20 69 66 28 20 28 66 6c 61 67 73 26 57      if( (flags&W
1bda0 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 29 20 7c  HERE_MULTI_OR) |
1bdb0 7c 20 28 77 63 74 72 6c 46 6c 61 67 73 26 57 48  | (wctrlFlags&WH
1bdc0 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c  ERE_ONETABLE_ONL
1bdd0 59 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a  Y) ) return 0;..
1bde0 20 20 20 20 69 73 53 65 61 72 63 68 20 3d 20 28      isSearch = (
1bdf0 66 6c 61 67 73 26 28 57 48 45 52 45 5f 42 54 4d  flags&(WHERE_BTM
1be00 5f 4c 49 4d 49 54 7c 57 48 45 52 45 5f 54 4f 50  _LIMIT|WHERE_TOP
1be10 5f 4c 49 4d 49 54 29 29 21 3d 30 0a 20 20 20 20  _LIMIT))!=0.    
1be20 20 20 20 20 20 20 20 20 7c 7c 20 28 28 66 6c 61          || ((fla
1be30 67 73 26 57 48 45 52 45 5f 56 49 52 54 55 41 4c  gs&WHERE_VIRTUAL
1be40 54 41 42 4c 45 29 3d 3d 30 20 26 26 20 28 70 4c  TABLE)==0 && (pL
1be50 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  oop->u.btree.nEq
1be60 3e 30 29 29 0a 20 20 20 20 20 20 20 20 20 20 20  >0)).           
1be70 20 7c 7c 20 28 77 63 74 72 6c 46 6c 61 67 73 26   || (wctrlFlags&
1be80 28 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d  (WHERE_ORDERBY_M
1be90 49 4e 7c 57 48 45 52 45 5f 4f 52 44 45 52 42 59  IN|WHERE_ORDERBY
1bea0 5f 4d 41 58 29 29 3b 0a 0a 20 20 20 20 73 71 6c  _MAX));..    sql
1beb0 69 74 65 33 53 74 72 41 63 63 75 6d 49 6e 69 74  ite3StrAccumInit
1bec0 28 26 73 74 72 2c 20 7a 42 75 66 2c 20 73 69 7a  (&str, zBuf, siz
1bed0 65 6f 66 28 7a 42 75 66 29 2c 20 53 51 4c 49 54  eof(zBuf), SQLIT
1bee0 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 29 3b 0a 20  E_MAX_LENGTH);. 
1bef0 20 20 20 73 74 72 2e 64 62 20 3d 20 64 62 3b 0a     str.db = db;.
1bf00 20 20 20 20 73 71 6c 69 74 65 33 53 74 72 41 63      sqlite3StrAc
1bf10 63 75 6d 41 70 70 65 6e 64 41 6c 6c 28 26 73 74  cumAppendAll(&st
1bf20 72 2c 20 69 73 53 65 61 72 63 68 20 3f 20 22 53  r, isSearch ? "S
1bf30 45 41 52 43 48 22 20 3a 20 22 53 43 41 4e 22 29  EARCH" : "SCAN")
1bf40 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d  ;.    if( pItem-
1bf50 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
1bf60 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66    sqlite3XPrintf
1bf70 28 26 73 74 72 2c 20 30 2c 20 22 20 53 55 42 51  (&str, 0, " SUBQ
1bf80 55 45 52 59 20 25 64 22 2c 20 70 49 74 65 6d 2d  UERY %d", pItem-
1bf90 3e 69 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20  >iSelectId);.   
1bfa0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
1bfb0 6c 69 74 65 33 58 50 72 69 6e 74 66 28 26 73 74  lite3XPrintf(&st
1bfc0 72 2c 20 30 2c 20 22 20 54 41 42 4c 45 20 25 73  r, 0, " TABLE %s
1bfd0 22 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29  ", pItem->zName)
1bfe0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
1bff0 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 29   pItem->zAlias )
1c000 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 58  {.      sqlite3X
1c010 50 72 69 6e 74 66 28 26 73 74 72 2c 20 30 2c 20  Printf(&str, 0, 
1c020 22 20 41 53 20 25 73 22 2c 20 70 49 74 65 6d 2d  " AS %s", pItem-
1c030 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 7d 0a  >zAlias);.    }.
1c040 20 20 20 20 69 66 28 20 28 66 6c 61 67 73 20 26      if( (flags &
1c050 20 28 57 48 45 52 45 5f 49 50 4b 7c 57 48 45 52   (WHERE_IPK|WHER
1c060 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 29  E_VIRTUALTABLE))
1c070 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e  ==0 ){.      con
1c080 73 74 20 63 68 61 72 20 2a 7a 46 6d 74 20 3d 20  st char *zFmt = 
1c090 30 3b 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a  0;.      Index *
1c0a0 70 49 64 78 3b 0a 0a 20 20 20 20 20 20 61 73 73  pIdx;..      ass
1c0b0 65 72 74 28 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  ert( pLoop->u.bt
1c0c0 72 65 65 2e 70 49 6e 64 65 78 21 3d 30 20 29 3b  ree.pIndex!=0 );
1c0d0 0a 20 20 20 20 20 20 70 49 64 78 20 3d 20 70 4c  .      pIdx = pL
1c0e0 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  oop->u.btree.pIn
1c0f0 64 65 78 3b 0a 20 20 20 20 20 20 61 73 73 65 72  dex;.      asser
1c100 74 28 20 21 28 66 6c 61 67 73 26 57 48 45 52 45  t( !(flags&WHERE
1c110 5f 41 55 54 4f 5f 49 4e 44 45 58 29 20 7c 7c 20  _AUTO_INDEX) || 
1c120 28 66 6c 61 67 73 26 57 48 45 52 45 5f 49 44 58  (flags&WHERE_IDX
1c130 5f 4f 4e 4c 59 29 20 29 3b 0a 20 20 20 20 20 20  _ONLY) );.      
1c140 69 66 28 20 21 48 61 73 52 6f 77 69 64 28 70 49  if( !HasRowid(pI
1c150 74 65 6d 2d 3e 70 54 61 62 29 20 26 26 20 49 73  tem->pTab) && Is
1c160 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28  PrimaryKeyIndex(
1c170 70 49 64 78 29 20 29 7b 0a 20 20 20 20 20 20 20  pIdx) ){.       
1c180 20 69 66 28 20 69 73 53 65 61 72 63 68 20 29 7b   if( isSearch ){
1c190 0a 20 20 20 20 20 20 20 20 20 20 7a 46 6d 74 20  .          zFmt 
1c1a0 3d 20 22 50 52 49 4d 41 52 59 20 4b 45 59 22 3b  = "PRIMARY KEY";
1c1b0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1c1c0 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73   }else if( flags
1c1d0 20 26 20 57 48 45 52 45 5f 50 41 52 54 49 41 4c   & WHERE_PARTIAL
1c1e0 49 44 58 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  IDX ){.        z
1c1f0 46 6d 74 20 3d 20 22 41 55 54 4f 4d 41 54 49 43  Fmt = "AUTOMATIC
1c200 20 50 41 52 54 49 41 4c 20 43 4f 56 45 52 49 4e   PARTIAL COVERIN
1c210 47 20 49 4e 44 45 58 22 3b 0a 20 20 20 20 20 20  G INDEX";.      
1c220 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20  }else if( flags 
1c230 26 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44  & WHERE_AUTO_IND
1c240 45 58 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 46  EX ){.        zF
1c250 6d 74 20 3d 20 22 41 55 54 4f 4d 41 54 49 43 20  mt = "AUTOMATIC 
1c260 43 4f 56 45 52 49 4e 47 20 49 4e 44 45 58 22 3b  COVERING INDEX";
1c270 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
1c280 20 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49   flags & WHERE_I
1c290 44 58 5f 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20  DX_ONLY ){.     
1c2a0 20 20 20 7a 46 6d 74 20 3d 20 22 43 4f 56 45 52     zFmt = "COVER
1c2b0 49 4e 47 20 49 4e 44 45 58 20 25 73 22 3b 0a 20  ING INDEX %s";. 
1c2c0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1c2d0 20 20 20 20 7a 46 6d 74 20 3d 20 22 49 4e 44 45      zFmt = "INDE
1c2e0 58 20 25 73 22 3b 0a 20 20 20 20 20 20 7d 0a 20  X %s";.      }. 
1c2f0 20 20 20 20 20 69 66 28 20 7a 46 6d 74 20 29 7b       if( zFmt ){
1c300 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1c310 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 26  StrAccumAppend(&
1c320 73 74 72 2c 20 22 20 55 53 49 4e 47 20 22 2c 20  str, " USING ", 
1c330 37 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  7);.        sqli
1c340 74 65 33 58 50 72 69 6e 74 66 28 26 73 74 72 2c  te3XPrintf(&str,
1c350 20 30 2c 20 7a 46 6d 74 2c 20 70 49 64 78 2d 3e   0, zFmt, pIdx->
1c360 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
1c370 65 78 70 6c 61 69 6e 49 6e 64 65 78 52 61 6e 67  explainIndexRang
1c380 65 28 26 73 74 72 2c 20 70 4c 6f 6f 70 2c 20 70  e(&str, pLoop, p
1c390 49 74 65 6d 2d 3e 70 54 61 62 29 3b 0a 20 20 20  Item->pTab);.   
1c3a0 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69     }.    }else i
1c3b0 66 28 20 28 66 6c 61 67 73 20 26 20 57 48 45 52  f( (flags & WHER
1c3c0 45 5f 49 50 4b 29 21 3d 30 20 26 26 20 28 66 6c  E_IPK)!=0 && (fl
1c3d0 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4e 53  ags & WHERE_CONS
1c3e0 54 52 41 49 4e 54 29 21 3d 30 20 29 7b 0a 20 20  TRAINT)!=0 ){.  
1c3f0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
1c400 7a 52 61 6e 67 65 3b 0a 20 20 20 20 20 20 69 66  zRange;.      if
1c410 28 20 66 6c 61 67 73 26 28 57 48 45 52 45 5f 43  ( flags&(WHERE_C
1c420 4f 4c 55 4d 4e 5f 45 51 7c 57 48 45 52 45 5f 43  OLUMN_EQ|WHERE_C
1c430 4f 4c 55 4d 4e 5f 49 4e 29 20 29 7b 0a 20 20 20  OLUMN_IN) ){.   
1c440 20 20 20 20 20 7a 52 61 6e 67 65 20 3d 20 22 28       zRange = "(
1c450 72 6f 77 69 64 3d 3f 29 22 3b 0a 20 20 20 20 20  rowid=?)";.     
1c460 20 7d 65 6c 73 65 20 69 66 28 20 28 66 6c 61 67   }else if( (flag
1c470 73 26 57 48 45 52 45 5f 42 4f 54 48 5f 4c 49 4d  s&WHERE_BOTH_LIM
1c480 49 54 29 3d 3d 57 48 45 52 45 5f 42 4f 54 48 5f  IT)==WHERE_BOTH_
1c490 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 20 20 20  LIMIT ){.       
1c4a0 20 7a 52 61 6e 67 65 20 3d 20 22 28 72 6f 77 69   zRange = "(rowi
1c4b0 64 3e 3f 20 41 4e 44 20 72 6f 77 69 64 3c 3f 29  d>? AND rowid<?)
1c4c0 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  ";.      }else i
1c4d0 66 28 20 66 6c 61 67 73 26 57 48 45 52 45 5f 42  f( flags&WHERE_B
1c4e0 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20  TM_LIMIT ){.    
1c4f0 20 20 20 20 7a 52 61 6e 67 65 20 3d 20 22 28 72      zRange = "(r
1c500 6f 77 69 64 3e 3f 29 22 3b 0a 20 20 20 20 20 20  owid>?)";.      
1c510 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61  }else{.        a
1c520 73 73 65 72 74 28 20 66 6c 61 67 73 26 57 48 45  ssert( flags&WHE
1c530 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 3b 0a 20  RE_TOP_LIMIT);. 
1c540 20 20 20 20 20 20 20 7a 52 61 6e 67 65 20 3d 20         zRange = 
1c550 22 28 72 6f 77 69 64 3c 3f 29 22 3b 0a 20 20 20  "(rowid<?)";.   
1c560 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
1c570 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64  e3StrAccumAppend
1c580 41 6c 6c 28 26 73 74 72 2c 20 22 20 55 53 49 4e  All(&str, " USIN
1c590 47 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  G INTEGER PRIMAR
1c5a0 59 20 4b 45 59 20 22 29 3b 0a 20 20 20 20 20 20  Y KEY ");.      
1c5b0 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41  sqlite3StrAccumA
1c5c0 70 70 65 6e 64 41 6c 6c 28 26 73 74 72 2c 20 7a  ppendAll(&str, z
1c5d0 52 61 6e 67 65 29 3b 0a 20 20 20 20 7d 0a 23 69  Range);.    }.#i
1c5e0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1c5f0 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
1c600 20 20 20 65 6c 73 65 20 69 66 28 20 28 66 6c 61     else if( (fla
1c610 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55  gs & WHERE_VIRTU
1c620 41 4c 54 41 42 4c 45 29 21 3d 30 20 29 7b 0a 20  ALTABLE)!=0 ){. 
1c630 20 20 20 20 20 73 71 6c 69 74 65 33 58 50 72 69       sqlite3XPri
1c640 6e 74 66 28 26 73 74 72 2c 20 30 2c 20 22 20 56  ntf(&str, 0, " V
1c650 49 52 54 55 41 4c 20 54 41 42 4c 45 20 49 4e 44  IRTUAL TABLE IND
1c660 45 58 20 25 64 3a 25 73 22 2c 0a 20 20 20 20 20  EX %d:%s",.     
1c670 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 6f               pLo
1c680 6f 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 4e 75  op->u.vtab.idxNu
1c690 6d 2c 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62  m, pLoop->u.vtab
1c6a0 2e 69 64 78 53 74 72 29 3b 0a 20 20 20 20 7d 0a  .idxStr);.    }.
1c6b0 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51  #endif.#ifdef SQ
1c6c0 4c 49 54 45 5f 45 58 50 4c 41 49 4e 5f 45 53 54  LITE_EXPLAIN_EST
1c6d0 49 4d 41 54 45 44 5f 52 4f 57 53 0a 20 20 20 20  IMATED_ROWS.    
1c6e0 69 66 28 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 3e  if( pLoop->nOut>
1c6f0 3d 31 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  =10 ){.      sql
1c700 69 74 65 33 58 50 72 69 6e 74 66 28 26 73 74 72  ite3XPrintf(&str
1c710 2c 20 30 2c 20 22 20 28 7e 25 6c 6c 75 20 72 6f  , 0, " (~%llu ro
1c720 77 73 29 22 2c 20 73 71 6c 69 74 65 33 4c 6f 67  ws)", sqlite3Log
1c730 45 73 74 54 6f 49 6e 74 28 70 4c 6f 6f 70 2d 3e  EstToInt(pLoop->
1c740 6e 4f 75 74 29 29 3b 0a 20 20 20 20 7d 65 6c 73  nOut));.    }els
1c750 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
1c760 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 26  StrAccumAppend(&
1c770 73 74 72 2c 20 22 20 28 7e 31 20 72 6f 77 29 22  str, " (~1 row)"
1c780 2c 20 39 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  , 9);.    }.#end
1c790 69 66 0a 20 20 20 20 7a 4d 73 67 20 3d 20 73 71  if.    zMsg = sq
1c7a0 6c 69 74 65 33 53 74 72 41 63 63 75 6d 46 69 6e  lite3StrAccumFin
1c7b0 69 73 68 28 26 73 74 72 29 3b 0a 20 20 20 20 72  ish(&str);.    r
1c7c0 65 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  et = sqlite3Vdbe
1c7d0 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45 78 70  AddOp4(v, OP_Exp
1c7e0 6c 61 69 6e 2c 20 69 49 64 2c 20 69 4c 65 76 65  lain, iId, iLeve
1c7f0 6c 2c 20 69 46 72 6f 6d 2c 20 7a 4d 73 67 2c 50  l, iFrom, zMsg,P
1c800 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a  4_DYNAMIC);.  }.
1c810 20 20 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a    return ret;.}.
1c820 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 65  #else.# define e
1c830 78 70 6c 61 69 6e 4f 6e 65 53 63 61 6e 28 75 2c  xplainOneScan(u,
1c840 76 2c 77 2c 78 2c 79 2c 7a 29 20 30 0a 23 65 6e  v,w,x,y,z) 0.#en
1c850 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
1c860 49 54 5f 45 58 50 4c 41 49 4e 20 2a 2f 0a 0a 23  IT_EXPLAIN */..#
1c870 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
1c880 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41  BLE_STMT_SCANSTA
1c890 54 55 53 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67  TUS./*.** Config
1c8a0 75 72 65 20 74 68 65 20 56 4d 20 70 61 73 73 65  ure the VM passe
1c8b0 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61  d as the first a
1c8c0 72 67 75 6d 65 6e 74 20 77 69 74 68 20 61 6e 0a  rgument with an.
1c8d0 2a 2a 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f  ** sqlite3_stmt_
1c8e0 73 63 61 6e 73 74 61 74 75 73 28 29 20 65 6e 74  scanstatus() ent
1c8f0 72 79 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  ry corresponding
1c900 20 74 6f 20 74 68 65 20 73 63 61 6e 20 75 73 65   to the scan use
1c910 64 20 74 6f 20 0a 2a 2a 20 69 6d 70 6c 65 6d 65  d to .** impleme
1c920 6e 74 20 6c 65 76 65 6c 20 70 4c 76 6c 2e 20 41  nt level pLvl. A
1c930 72 67 75 6d 65 6e 74 20 70 53 72 63 6c 69 73 74  rgument pSrclist
1c940 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
1c950 20 74 68 65 20 46 52 4f 4d 20 0a 2a 2a 20 63 6c   the FROM .** cl
1c960 61 75 73 65 20 74 68 61 74 20 74 68 65 20 73 63  ause that the sc
1c970 61 6e 20 72 65 61 64 73 20 64 61 74 61 20 66 72  an reads data fr
1c980 6f 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72 67  om..**.** If arg
1c990 75 6d 65 6e 74 20 61 64 64 72 45 78 70 6c 61 69  ument addrExplai
1c9a0 6e 20 69 73 20 6e 6f 74 20 30 2c 20 69 74 20 6d  n is not 0, it m
1c9b0 75 73 74 20 62 65 20 74 68 65 20 61 64 64 72 65  ust be the addre
1c9c0 73 73 20 6f 66 20 61 6e 20 0a 2a 2a 20 4f 50 5f  ss of an .** OP_
1c9d0 45 78 70 6c 61 69 6e 20 69 6e 73 74 72 75 63 74  Explain instruct
1c9e0 69 6f 6e 20 74 68 61 74 20 64 65 73 63 72 69 62  ion that describ
1c9f0 65 73 20 74 68 65 20 73 61 6d 65 20 6c 6f 6f 70  es the same loop
1ca00 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1ca10 20 61 64 64 53 63 61 6e 53 74 61 74 75 73 28 0a   addScanStatus(.
1ca20 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20 20    Vdbe *v,      
1ca30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ca40 20 20 2f 2a 20 56 64 62 65 20 74 6f 20 61 64 64    /* Vdbe to add
1ca50 20 73 63 61 6e 73 74 61 74 75 73 20 65 6e 74 72   scanstatus entr
1ca60 79 20 74 6f 20 2a 2f 0a 20 20 53 72 63 4c 69 73  y to */.  SrcLis
1ca70 74 20 2a 70 53 72 63 6c 69 73 74 2c 20 20 20 20  t *pSrclist,    
1ca80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 52 4f            /* FRO
1ca90 4d 20 63 6c 61 75 73 65 20 70 4c 76 6c 20 72 65  M clause pLvl re
1caa0 61 64 73 20 64 61 74 61 20 66 72 6f 6d 20 2a 2f  ads data from */
1cab0 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70  .  WhereLevel *p
1cac0 4c 76 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  Lvl,            
1cad0 20 20 20 2f 2a 20 4c 65 76 65 6c 20 74 6f 20 61     /* Level to a
1cae0 64 64 20 73 63 61 6e 73 74 61 74 75 73 28 29 20  dd scanstatus() 
1caf0 65 6e 74 72 79 20 66 6f 72 20 2a 2f 0a 20 20 69  entry for */.  i
1cb00 6e 74 20 61 64 64 72 45 78 70 6c 61 69 6e 20 20  nt addrExplain  
1cb10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1cb20 2a 20 41 64 64 72 65 73 73 20 6f 66 20 4f 50 5f  * Address of OP_
1cb30 45 78 70 6c 61 69 6e 20 28 6f 72 20 30 29 20 2a  Explain (or 0) *
1cb40 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  /.){.  const cha
1cb50 72 20 2a 7a 4f 62 6a 20 3d 20 30 3b 0a 20 20 57  r *zObj = 0;.  W
1cb60 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 20  hereLoop *pLoop 
1cb70 3d 20 70 4c 76 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a  = pLvl->pWLoop;.
1cb80 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73    if( (pLoop->ws
1cb90 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49  Flags & WHERE_VI
1cba0 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30 20 20  RTUALTABLE)==0  
1cbb0 26 26 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72  &&  pLoop->u.btr
1cbc0 65 65 2e 70 49 6e 64 65 78 21 3d 30 20 29 7b 0a  ee.pIndex!=0 ){.
1cbd0 20 20 20 20 7a 4f 62 6a 20 3d 20 70 4c 6f 6f 70      zObj = pLoop
1cbe0 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
1cbf0 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 7d 65 6c 73 65  ->zName;.  }else
1cc00 7b 0a 20 20 20 20 7a 4f 62 6a 20 3d 20 70 53 72  {.    zObj = pSr
1cc10 63 6c 69 73 74 2d 3e 61 5b 70 4c 76 6c 2d 3e 69  clist->a[pLvl->i
1cc20 46 72 6f 6d 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 7d  From].zName;.  }
1cc30 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 63  .  sqlite3VdbeSc
1cc40 61 6e 53 74 61 74 75 73 28 0a 20 20 20 20 20 20  anStatus(.      
1cc50 76 2c 20 61 64 64 72 45 78 70 6c 61 69 6e 2c 20  v, addrExplain, 
1cc60 70 4c 76 6c 2d 3e 61 64 64 72 42 6f 64 79 2c 20  pLvl->addrBody, 
1cc70 70 4c 76 6c 2d 3e 61 64 64 72 56 69 73 69 74 2c  pLvl->addrVisit,
1cc80 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 2c 20 7a 4f   pLoop->nOut, zO
1cc90 62 6a 0a 20 20 29 3b 0a 7d 0a 23 65 6c 73 65 0a  bj.  );.}.#else.
1cca0 23 20 64 65 66 69 6e 65 20 61 64 64 53 63 61 6e  # define addScan
1ccb0 53 74 61 74 75 73 28 61 2c 20 62 2c 20 63 2c 20  Status(a, b, c, 
1ccc0 64 29 20 28 28 76 6f 69 64 29 64 29 0a 23 65 6e  d) ((void)d).#en
1ccd0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  dif../*.** If th
1cce0 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  e most recently 
1ccf0 63 6f 64 65 64 20 69 6e 73 74 72 75 63 74 69 6f  coded instructio
1cd00 6e 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74 20  n is a constant 
1cd10 72 61 6e 67 65 20 63 6f 6e 74 72 61 69 6e 74 0a  range contraint.
1cd20 2a 2a 20 74 68 61 74 20 6f 72 69 67 69 6e 61 74  ** that originat
1cd30 65 64 20 66 72 6f 6d 20 74 68 65 20 4c 49 4b 45  ed from the LIKE
1cd40 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 74   optimization, t
1cd50 68 65 6e 20 63 68 61 6e 67 65 20 74 68 65 20 50  hen change the P
1cd60 33 20 74 6f 20 62 65 0a 2a 2a 20 70 4c 6f 6f 70  3 to be.** pLoop
1cd70 2d 3e 69 4c 69 6b 65 52 65 70 43 6e 74 72 20 61  ->iLikeRepCntr a
1cd80 6e 64 20 73 65 74 20 50 35 2e 0a 2a 2a 0a 2a 2a  nd set P5..**.**
1cd90 20 54 68 65 20 4c 49 4b 45 20 6f 70 74 69 6d 69   The LIKE optimi
1cda0 7a 61 74 69 6f 6e 20 74 72 79 73 20 74 6f 20 65  zation trys to e
1cdb0 76 61 6c 75 61 74 65 20 22 78 20 4c 49 4b 45 20  valuate "x LIKE 
1cdc0 27 61 62 63 25 27 22 20 61 73 20 61 20 72 61 6e  'abc%'" as a ran
1cdd0 67 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  ge.** expression
1cde0 3a 20 22 78 3e 3d 27 41 42 43 27 20 41 4e 44 20  : "x>='ABC' AND 
1cdf0 78 3c 27 61 62 64 27 22 2e 20 20 42 75 74 20 74  x<'abd'".  But t
1ce00 68 69 73 20 72 65 71 75 69 72 65 73 20 74 68 61  his requires tha
1ce10 74 20 74 68 65 20 72 61 6e 67 65 0a 2a 2a 20 73  t the range.** s
1ce20 63 61 6e 20 6c 6f 6f 70 20 72 75 6e 20 74 77 69  can loop run twi
1ce30 63 65 2c 20 6f 6e 63 65 20 66 6f 72 20 73 74 72  ce, once for str
1ce40 69 6e 67 73 20 61 6e 64 20 61 20 73 65 63 6f 6e  ings and a secon
1ce50 64 20 74 69 6d 65 20 66 6f 72 20 42 4c 4f 42 73  d time for BLOBs
1ce60 2e 0a 2a 2a 20 54 68 65 20 4f 50 5f 53 74 72 69  ..** The OP_Stri
1ce70 6e 67 20 6f 70 63 6f 64 65 73 20 6f 6e 20 74 68  ng opcodes on th
1ce80 65 20 73 65 63 6f 6e 64 20 70 61 73 73 20 63 6f  e second pass co
1ce90 6e 76 65 72 74 20 74 68 65 20 75 70 70 65 72 20  nvert the upper 
1cea0 61 6e 64 20 6c 6f 77 65 72 0a 2a 2a 20 62 6f 75  and lower.** bou
1ceb0 6e 64 20 73 74 72 69 6e 67 20 63 6f 6e 74 61 6e  nd string contan
1cec0 74 73 20 74 6f 20 62 6c 6f 62 73 2e 20 20 54 68  ts to blobs.  Th
1ced0 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 6b 65 73  is routine makes
1cee0 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20 63   the necessary c
1cef0 68 61 6e 67 65 73 0a 2a 2a 20 74 6f 20 74 68 65  hanges.** to the
1cf00 20 4f 50 5f 53 74 72 69 6e 67 20 6f 70 63 6f 64   OP_String opcod
1cf10 65 73 20 66 6f 72 20 74 68 61 74 20 74 6f 20 68  es for that to h
1cf20 61 70 70 65 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  appen..*/.static
1cf30 20 76 6f 69 64 20 77 68 65 72 65 4c 69 6b 65 4f   void whereLikeO
1cf40 70 74 69 6d 69 7a 61 74 69 6f 6e 53 74 72 69 6e  ptimizationStrin
1cf50 67 46 69 78 75 70 28 0a 20 20 56 64 62 65 20 2a  gFixup(.  Vdbe *
1cf60 76 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v,              
1cf70 20 20 2f 2a 20 70 72 65 70 61 72 65 64 20 73 74    /* prepared st
1cf80 61 74 65 6d 65 6e 74 20 75 6e 64 65 72 20 63 6f  atement under co
1cf90 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20  nstruction */.  
1cfa0 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76  WhereLevel *pLev
1cfb0 65 6c 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 6c  el,     /* The l
1cfc0 6f 6f 70 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  oop that contain
1cfd0 73 20 74 68 65 20 4c 49 4b 45 20 6f 70 65 72 61  s the LIKE opera
1cfe0 74 6f 72 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  tor */.  WhereTe
1cff0 72 6d 20 2a 70 54 65 72 6d 20 20 20 20 20 20 20  rm *pTerm       
1d000 20 2f 2a 20 54 68 65 20 75 70 70 65 72 20 6f 72   /* The upper or
1d010 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20 6a 75 73   lower bound jus
1d020 74 20 63 6f 64 65 64 20 2a 2f 0a 29 7b 0a 20 20  t coded */.){.  
1d030 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61  if( pTerm->wtFla
1d040 67 73 20 26 20 54 45 52 4d 5f 4c 49 4b 45 4f 50  gs & TERM_LIKEOP
1d050 54 20 29 7b 0a 20 20 20 20 56 64 62 65 4f 70 20  T ){.    VdbeOp 
1d060 2a 70 4f 70 3b 0a 20 20 20 20 61 73 73 65 72 74  *pOp;.    assert
1d070 28 20 70 4c 65 76 65 6c 2d 3e 69 4c 69 6b 65 52  ( pLevel->iLikeR
1d080 65 70 43 6e 74 72 3e 30 20 29 3b 0a 20 20 20 20  epCntr>0 );.    
1d090 70 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  pOp = sqlite3Vdb
1d0a0 65 47 65 74 4f 70 28 76 2c 20 2d 31 29 3b 0a 20  eGetOp(v, -1);. 
1d0b0 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 21 3d     assert( pOp!=
1d0c0 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
1d0d0 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50   pOp->opcode==OP
1d0e0 5f 53 74 72 69 6e 67 38 20 0a 20 20 20 20 20 20  _String8 .      
1d0f0 20 20 20 20 20 20 7c 7c 20 70 54 65 72 6d 2d 3e        || pTerm->
1d100 70 57 43 2d 3e 70 57 49 6e 66 6f 2d 3e 70 50 61  pWC->pWInfo->pPa
1d110 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
1d120 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 70 4f 70  ailed );.    pOp
1d130 2d 3e 70 33 20 3d 20 70 4c 65 76 65 6c 2d 3e 69  ->p3 = pLevel->i
1d140 4c 69 6b 65 52 65 70 43 6e 74 72 3b 0a 20 20 20  LikeRepCntr;.   
1d150 20 70 4f 70 2d 3e 70 35 20 3d 20 31 3b 0a 20 20   pOp->p5 = 1;.  
1d160 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  }.}../*.** Gener
1d170 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65  ate code for the
1d180 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 69 4c   start of the iL
1d190 65 76 65 6c 2d 74 68 20 6c 6f 6f 70 20 69 6e 20  evel-th loop in 
1d1a0 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
1d1b0 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  .** implementati
1d1c0 6f 6e 20 64 65 73 63 72 69 62 65 64 20 62 79 20  on described by 
1d1d0 70 57 49 6e 66 6f 2e 0a 2a 2f 0a 73 74 61 74 69  pWInfo..*/.stati
1d1e0 63 20 42 69 74 6d 61 73 6b 20 63 6f 64 65 4f 6e  c Bitmask codeOn
1d1f0 65 4c 6f 6f 70 53 74 61 72 74 28 0a 20 20 57 68  eLoopStart(.  Wh
1d200 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c  ereInfo *pWInfo,
1d210 20 20 20 2f 2a 20 43 6f 6d 70 6c 65 74 65 20 69     /* Complete i
1d220 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
1d230 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
1d240 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 76 65  e */.  int iLeve
1d250 6c 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  l,          /* W
1d260 68 69 63 68 20 6c 65 76 65 6c 20 6f 66 20 70 57  hich level of pW
1d270 49 6e 66 6f 2d 3e 61 5b 5d 20 73 68 6f 75 6c 64  Info->a[] should
1d280 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 42   be coded */.  B
1d290 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 20  itmask notReady 
1d2a0 20 20 20 20 2f 2a 20 57 68 69 63 68 20 74 61 62      /* Which tab
1d2b0 6c 65 73 20 61 72 65 20 63 75 72 72 65 6e 74 6c  les are currentl
1d2c0 79 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 29  y available */.)
1d2d0 7b 0a 20 20 69 6e 74 20 6a 2c 20 6b 3b 20 20 20  {.  int j, k;   
1d2e0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
1d2f0 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69   counters */.  i
1d300 6e 74 20 69 43 75 72 3b 20 20 20 20 20 20 20 20  nt iCur;        
1d310 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20      /* The VDBE 
1d320 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20 74  cursor for the t
1d330 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  able */.  int ad
1d340 64 72 4e 78 74 3b 20 20 20 20 20 20 20 20 20 2f  drNxt;         /
1d350 2a 20 57 68 65 72 65 20 74 6f 20 6a 75 6d 70 20  * Where to jump 
1d360 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68  to continue with
1d370 20 74 68 65 20 6e 65 78 74 20 49 4e 20 63 61 73   the next IN cas
1d380 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 6d 69 74 54  e */.  int omitT
1d390 61 62 6c 65 3b 20 20 20 20 20 20 20 2f 2a 20 54  able;       /* T
1d3a0 72 75 65 20 69 66 20 77 65 20 75 73 65 20 74 68  rue if we use th
1d3b0 65 20 69 6e 64 65 78 20 6f 6e 6c 79 20 2a 2f 0a  e index only */.
1d3c0 20 20 69 6e 74 20 62 52 65 76 3b 20 20 20 20 20    int bRev;     
1d3d0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
1d3e0 66 20 77 65 20 6e 65 65 64 20 74 6f 20 73 63 61  f we need to sca
1d3f0 6e 20 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64  n in reverse ord
1d400 65 72 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76  er */.  WhereLev
1d410 65 6c 20 2a 70 4c 65 76 65 6c 3b 20 20 2f 2a 20  el *pLevel;  /* 
1d420 54 68 65 20 77 68 65 72 65 20 6c 65 76 65 6c 20  The where level 
1d430 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20  to be coded */. 
1d440 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f   WhereLoop *pLoo
1d450 70 3b 20 20 20 20 2f 2a 20 54 68 65 20 57 68 65  p;    /* The Whe
1d460 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 62 65  reLoop object be
1d470 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 57  ing coded */.  W
1d480 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b  hereClause *pWC;
1d490 20 20 20 20 2f 2a 20 44 65 63 6f 6d 70 6f 73 69      /* Decomposi
1d4a0 74 69 6f 6e 20 6f 66 20 74 68 65 20 65 6e 74 69  tion of the enti
1d4b0 72 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  re WHERE clause 
1d4c0 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  */.  WhereTerm *
1d4d0 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20  pTerm;          
1d4e0 20 20 20 20 20 2f 2a 20 41 20 57 48 45 52 45 20       /* A WHERE 
1d4f0 63 6c 61 75 73 65 20 74 65 72 6d 20 2a 2f 0a 20  clause term */. 
1d500 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20   Parse *pParse; 
1d510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d520 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
1d530 65 78 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ext */.  sqlite3
1d540 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20   *db;           
1d550 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
1d560 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
1d570 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20  */.  Vdbe *v;   
1d580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d590 20 20 20 20 20 2f 2a 20 54 68 65 20 70 72 65 70       /* The prep
1d5a0 61 72 65 64 20 73 74 6d 74 20 75 6e 64 65 72 20  ared stmt under 
1d5b0 63 6f 6e 73 74 72 75 63 74 69 6f 6e 73 20 2a 2f  constructions */
1d5c0 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
1d5d0 74 5f 69 74 65 6d 20 2a 70 54 61 62 49 74 65 6d  t_item *pTabItem
1d5e0 3b 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73  ;  /* FROM claus
1d5f0 65 20 74 65 72 6d 20 62 65 69 6e 67 20 63 6f 64  e term being cod
1d600 65 64 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ed */.  int addr
1d610 42 72 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  Brk;            
1d620 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
1d630 68 65 72 65 20 74 6f 20 62 72 65 61 6b 20 6f 75  here to break ou
1d640 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 2a 2f  t of the loop */
1d650 0a 20 20 69 6e 74 20 61 64 64 72 43 6f 6e 74 3b  .  int addrCont;
1d660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d670 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
1d680 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68  to continue with
1d690 20 6e 65 78 74 20 63 79 63 6c 65 20 2a 2f 0a 20   next cycle */. 
1d6a0 20 69 6e 74 20 69 52 6f 77 69 64 52 65 67 20 3d   int iRowidReg =
1d6b0 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 52 6f   0;        /* Ro
1d6c0 77 69 64 20 69 73 20 73 74 6f 72 65 64 20 69 6e  wid is stored in
1d6d0 20 74 68 69 73 20 72 65 67 69 73 74 65 72 2c 20   this register, 
1d6e0 69 66 20 6e 6f 74 20 7a 65 72 6f 20 2a 2f 0a 20  if not zero */. 
1d6f0 20 69 6e 74 20 69 52 65 6c 65 61 73 65 52 65 67   int iReleaseReg
1d700 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 54 65   = 0;      /* Te
1d710 6d 70 20 72 65 67 69 73 74 65 72 20 74 6f 20 66  mp register to f
1d720 72 65 65 20 62 65 66 6f 72 65 20 72 65 74 75 72  ree before retur
1d730 6e 69 6e 67 20 2a 2f 0a 0a 20 20 70 50 61 72 73  ning */..  pPars
1d740 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72  e = pWInfo->pPar
1d750 73 65 3b 0a 20 20 76 20 3d 20 70 50 61 72 73 65  se;.  v = pParse
1d760 2d 3e 70 56 64 62 65 3b 0a 20 20 70 57 43 20 3d  ->pVdbe;.  pWC =
1d770 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43 3b 0a 20   &pWInfo->sWC;. 
1d780 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   db = pParse->db
1d790 3b 0a 20 20 70 4c 65 76 65 6c 20 3d 20 26 70 57  ;.  pLevel = &pW
1d7a0 49 6e 66 6f 2d 3e 61 5b 69 4c 65 76 65 6c 5d 3b  Info->a[iLevel];
1d7b0 0a 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65  .  pLoop = pLeve
1d7c0 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 70 54 61  l->pWLoop;.  pTa
1d7d0 62 49 74 65 6d 20 3d 20 26 70 57 49 6e 66 6f 2d  bItem = &pWInfo-
1d7e0 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65  >pTabList->a[pLe
1d7f0 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 69  vel->iFrom];.  i
1d800 43 75 72 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e  Cur = pTabItem->
1d810 69 43 75 72 73 6f 72 3b 0a 20 20 70 4c 65 76 65  iCursor;.  pLeve
1d820 6c 2d 3e 6e 6f 74 52 65 61 64 79 20 3d 20 6e 6f  l->notReady = no
1d830 74 52 65 61 64 79 20 26 20 7e 67 65 74 4d 61 73  tReady & ~getMas
1d840 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b  k(&pWInfo->sMask
1d850 53 65 74 2c 20 69 43 75 72 29 3b 0a 20 20 62 52  Set, iCur);.  bR
1d860 65 76 20 3d 20 28 70 57 49 6e 66 6f 2d 3e 72 65  ev = (pWInfo->re
1d870 76 4d 61 73 6b 3e 3e 69 4c 65 76 65 6c 29 26 31  vMask>>iLevel)&1
1d880 3b 0a 20 20 6f 6d 69 74 54 61 62 6c 65 20 3d 20  ;.  omitTable = 
1d890 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  (pLoop->wsFlags 
1d8a0 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59  & WHERE_IDX_ONLY
1d8b0 29 21 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20  )!=0 .          
1d8c0 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74   && (pWInfo->wct
1d8d0 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
1d8e0 46 4f 52 43 45 5f 54 41 42 4c 45 29 3d 3d 30 3b  FORCE_TABLE)==0;
1d8f0 0a 20 20 56 64 62 65 4d 6f 64 75 6c 65 43 6f 6d  .  VdbeModuleCom
1d900 6d 65 6e 74 28 28 76 2c 20 22 42 65 67 69 6e 20  ment((v, "Begin 
1d910 57 48 45 52 45 2d 6c 6f 6f 70 25 64 3a 20 25 73  WHERE-loop%d: %s
1d920 22 2c 69 4c 65 76 65 6c 2c 70 54 61 62 49 74 65  ",iLevel,pTabIte
1d930 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29  m->pTab->zName))
1d940 3b 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 20 6c  ;..  /* Create l
1d950 61 62 65 6c 73 20 66 6f 72 20 74 68 65 20 22 62  abels for the "b
1d960 72 65 61 6b 22 20 61 6e 64 20 22 63 6f 6e 74 69  reak" and "conti
1d970 6e 75 65 22 20 69 6e 73 74 72 75 63 74 69 6f 6e  nue" instruction
1d980 73 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 63  s.  ** for the c
1d990 75 72 72 65 6e 74 20 6c 6f 6f 70 2e 20 20 4a 75  urrent loop.  Ju
1d9a0 6d 70 20 74 6f 20 61 64 64 72 42 72 6b 20 74 6f  mp to addrBrk to
1d9b0 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 61 20   break out of a 
1d9c0 6c 6f 6f 70 2e 0a 20 20 2a 2a 20 4a 75 6d 70 20  loop..  ** Jump 
1d9d0 74 6f 20 63 6f 6e 74 20 74 6f 20 67 6f 20 69 6d  to cont to go im
1d9e0 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 74 68 65  mediately to the
1d9f0 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e 20   next iteration 
1da00 6f 66 20 74 68 65 0a 20 20 2a 2a 20 6c 6f 6f 70  of the.  ** loop
1da10 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e  ..  **.  ** When
1da20 20 74 68 65 72 65 20 69 73 20 61 6e 20 49 4e 20   there is an IN 
1da30 6f 70 65 72 61 74 6f 72 2c 20 77 65 20 61 6c 73  operator, we als
1da40 6f 20 68 61 76 65 20 61 20 22 61 64 64 72 4e 78  o have a "addrNx
1da50 74 22 20 6c 61 62 65 6c 20 74 68 61 74 0a 20 20  t" label that.  
1da60 2a 2a 20 6d 65 61 6e 73 20 74 6f 20 63 6f 6e 74  ** means to cont
1da70 69 6e 75 65 20 77 69 74 68 20 74 68 65 20 6e 65  inue with the ne
1da80 78 74 20 49 4e 20 76 61 6c 75 65 20 63 6f 6d 62  xt IN value comb
1da90 69 6e 61 74 69 6f 6e 2e 20 20 57 68 65 6e 0a 20  ination.  When. 
1daa0 20 2a 2a 20 74 68 65 72 65 20 61 72 65 20 6e 6f   ** there are no
1dab0 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 20 69 6e   IN operators in
1dac0 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 73   the constraints
1dad0 2c 20 74 68 65 20 22 61 64 64 72 4e 78 74 22 20  , the "addrNxt" 
1dae0 6c 61 62 65 6c 0a 20 20 2a 2a 20 69 73 20 74 68  label.  ** is th
1daf0 65 20 73 61 6d 65 20 61 73 20 22 61 64 64 72 42  e same as "addrB
1db00 72 6b 22 2e 0a 20 20 2a 2f 0a 20 20 61 64 64 72  rk"..  */.  addr
1db10 42 72 6b 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64  Brk = pLevel->ad
1db20 64 72 42 72 6b 20 3d 20 70 4c 65 76 65 6c 2d 3e  drBrk = pLevel->
1db30 61 64 64 72 4e 78 74 20 3d 20 73 71 6c 69 74 65  addrNxt = sqlite
1db40 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
1db50 29 3b 0a 20 20 61 64 64 72 43 6f 6e 74 20 3d 20  );.  addrCont = 
1db60 70 4c 65 76 65 6c 2d 3e 61 64 64 72 43 6f 6e 74  pLevel->addrCont
1db70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
1db80 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 2f  keLabel(v);..  /
1db90 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  * If this is the
1dba0 20 72 69 67 68 74 20 74 61 62 6c 65 20 6f 66 20   right table of 
1dbb0 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49  a LEFT OUTER JOI
1dbc0 4e 2c 20 61 6c 6c 6f 63 61 74 65 20 61 6e 64 0a  N, allocate and.
1dbd0 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 20    ** initialize 
1dbe0 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 68  a memory cell th
1dbf0 61 74 20 72 65 63 6f 72 64 73 20 69 66 20 74 68  at records if th
1dc00 69 73 20 74 61 62 6c 65 20 6d 61 74 63 68 65 73  is table matches
1dc10 20 61 6e 79 0a 20 20 2a 2a 20 72 6f 77 20 6f 66   any.  ** row of
1dc20 20 74 68 65 20 6c 65 66 74 20 74 61 62 6c 65 20   the left table 
1dc30 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 0a 20 20 2a  of the join..  *
1dc40 2f 0a 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e  /.  if( pLevel->
1dc50 69 46 72 6f 6d 3e 30 20 26 26 20 28 70 54 61 62  iFrom>0 && (pTab
1dc60 49 74 65 6d 5b 30 5d 2e 6a 6f 69 6e 74 79 70 65  Item[0].jointype
1dc70 20 26 20 4a 54 5f 4c 45 46 54 29 21 3d 30 20 29   & JT_LEFT)!=0 )
1dc80 7b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 4c  {.    pLevel->iL
1dc90 65 66 74 4a 6f 69 6e 20 3d 20 2b 2b 70 50 61 72  eftJoin = ++pPar
1dca0 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71  se->nMem;.    sq
1dcb0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1dcc0 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
1dcd0 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a  , pLevel->iLeftJ
1dce0 6f 69 6e 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  oin);.    VdbeCo
1dcf0 6d 6d 65 6e 74 28 28 76 2c 20 22 69 6e 69 74 20  mment((v, "init 
1dd00 4c 45 46 54 20 4a 4f 49 4e 20 6e 6f 2d 6d 61 74  LEFT JOIN no-mat
1dd10 63 68 20 66 6c 61 67 22 29 29 3b 0a 20 20 7d 0a  ch flag"));.  }.
1dd20 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c 20 63 61  .  /* Special ca
1dd30 73 65 20 6f 66 20 61 20 46 52 4f 4d 20 63 6c 61  se of a FROM cla
1dd40 75 73 65 20 73 75 62 71 75 65 72 79 20 69 6d 70  use subquery imp
1dd50 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 20 63 6f  lemented as a co
1dd60 2d 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 66  -routine */.  if
1dd70 28 20 70 54 61 62 49 74 65 6d 2d 3e 76 69 61 43  ( pTabItem->viaC
1dd80 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20  oroutine ){.    
1dd90 69 6e 74 20 72 65 67 59 69 65 6c 64 20 3d 20 70  int regYield = p
1dda0 54 61 62 49 74 65 6d 2d 3e 72 65 67 52 65 74 75  TabItem->regRetu
1ddb0 72 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  rn;.    sqlite3V
1ddc0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
1ddd0 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 2c 20 72  InitCoroutine, r
1dde0 65 67 59 69 65 6c 64 2c 20 30 2c 20 70 54 61 62  egYield, 0, pTab
1ddf0 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75  Item->addrFillSu
1de00 62 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  b);.    pLevel->
1de10 70 32 20 3d 20 20 73 71 6c 69 74 65 33 56 64 62  p2 =  sqlite3Vdb
1de20 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69  eAddOp2(v, OP_Yi
1de30 65 6c 64 2c 20 72 65 67 59 69 65 6c 64 2c 20 61  eld, regYield, a
1de40 64 64 72 42 72 6b 29 3b 0a 20 20 20 20 56 64 62  ddrBrk);.    Vdb
1de50 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
1de60 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
1de70 2c 20 22 6e 65 78 74 20 72 6f 77 20 6f 66 20 5c  , "next row of \
1de80 22 25 73 5c 22 22 2c 20 70 54 61 62 49 74 65 6d  "%s\"", pTabItem
1de90 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b  ->pTab->zName));
1dea0 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20  .    pLevel->op 
1deb0 3d 20 4f 50 5f 47 6f 74 6f 3b 0a 20 20 7d 65 6c  = OP_Goto;.  }el
1dec0 73 65 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  se..#ifndef SQLI
1ded0 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
1dee0 41 42 4c 45 0a 20 20 69 66 28 20 20 28 70 4c 6f  ABLE.  if(  (pLo
1def0 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
1df00 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  ERE_VIRTUALTABLE
1df10 29 21 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 43  )!=0 ){.    /* C
1df20 61 73 65 20 31 3a 20 20 54 68 65 20 74 61 62 6c  ase 1:  The tabl
1df30 65 20 69 73 20 61 20 76 69 72 74 75 61 6c 2d 74  e is a virtual-t
1df40 61 62 6c 65 2e 20 20 55 73 65 20 74 68 65 20 56  able.  Use the V
1df50 46 69 6c 74 65 72 20 61 6e 64 20 56 4e 65 78 74  Filter and VNext
1df60 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
1df70 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 64   to access the d
1df80 61 74 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ata..    */.    
1df90 69 6e 74 20 69 52 65 67 3b 20 20 20 2f 2a 20 50  int iReg;   /* P
1dfa0 33 20 56 61 6c 75 65 20 66 6f 72 20 4f 50 5f 56  3 Value for OP_V
1dfb0 46 69 6c 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e  Filter */.    in
1dfc0 74 20 61 64 64 72 4e 6f 74 46 6f 75 6e 64 3b 0a  t addrNotFound;.
1dfd0 20 20 20 20 69 6e 74 20 6e 43 6f 6e 73 74 72 61      int nConstra
1dfe0 69 6e 74 20 3d 20 70 4c 6f 6f 70 2d 3e 6e 4c 54  int = pLoop->nLT
1dff0 65 72 6d 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65  erm;..    sqlite
1e000 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70  3ExprCachePush(p
1e010 50 61 72 73 65 29 3b 0a 20 20 20 20 69 52 65 67  Parse);.    iReg
1e020 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
1e030 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e  pRange(pParse, n
1e040 43 6f 6e 73 74 72 61 69 6e 74 2b 32 29 3b 0a 20  Constraint+2);. 
1e050 20 20 20 61 64 64 72 4e 6f 74 46 6f 75 6e 64 20     addrNotFound 
1e060 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72  = pLevel->addrBr
1e070 6b 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  k;.    for(j=0; 
1e080 6a 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 6a  j<nConstraint; j
1e090 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  ++){.      int i
1e0a0 54 61 72 67 65 74 20 3d 20 69 52 65 67 2b 6a 2b  Target = iReg+j+
1e0b0 32 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d  2;.      pTerm =
1e0c0 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a   pLoop->aLTerm[j
1e0d0 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65  ];.      if( pTe
1e0e0 72 6d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  rm==0 ) continue
1e0f0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72  ;.      if( pTer
1e100 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
1e110 4f 5f 49 4e 20 29 7b 0a 20 20 20 20 20 20 20 20  O_IN ){.        
1e120 63 6f 64 65 45 71 75 61 6c 69 74 79 54 65 72 6d  codeEqualityTerm
1e130 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2c 20  (pParse, pTerm, 
1e140 70 4c 65 76 65 6c 2c 20 6a 2c 20 62 52 65 76 2c  pLevel, j, bRev,
1e150 20 69 54 61 72 67 65 74 29 3b 0a 20 20 20 20 20   iTarget);.     
1e160 20 20 20 61 64 64 72 4e 6f 74 46 6f 75 6e 64 20     addrNotFound 
1e170 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78  = pLevel->addrNx
1e180 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  t;.      }else{.
1e190 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1e1a0 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
1e1b0 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52  pTerm->pExpr->pR
1e1c0 69 67 68 74 2c 20 69 54 61 72 67 65 74 29 3b 0a  ight, iTarget);.
1e1d0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1e1e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1e1f0 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
1e200 72 2c 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62  r, pLoop->u.vtab
1e210 2e 69 64 78 4e 75 6d 2c 20 69 52 65 67 29 3b 0a  .idxNum, iReg);.
1e220 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1e230 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
1e240 67 65 72 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74  ger, nConstraint
1e250 2c 20 69 52 65 67 2b 31 29 3b 0a 20 20 20 20 73  , iReg+1);.    s
1e260 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
1e270 28 76 2c 20 4f 50 5f 56 46 69 6c 74 65 72 2c 20  (v, OP_VFilter, 
1e280 69 43 75 72 2c 20 61 64 64 72 4e 6f 74 46 6f 75  iCur, addrNotFou
1e290 6e 64 2c 20 69 52 65 67 2c 0a 20 20 20 20 20 20  nd, iReg,.      
1e2a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e2b0 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 69 64  pLoop->u.vtab.id
1e2c0 78 53 74 72 2c 0a 20 20 20 20 20 20 20 20 20 20  xStr,.          
1e2d0 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 6f 6f              pLoo
1e2e0 70 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72  p->u.vtab.needFr
1e2f0 65 65 20 3f 20 50 34 5f 4d 50 52 49 4e 54 46 20  ee ? P4_MPRINTF 
1e300 3a 20 50 34 5f 53 54 41 54 49 43 29 3b 0a 20 20  : P4_STATIC);.  
1e310 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
1e320 29 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e  );.    pLoop->u.
1e330 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3d 20  vtab.needFree = 
1e340 30 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  0;.    for(j=0; 
1e350 6a 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 20 26 26  j<nConstraint &&
1e360 20 6a 3c 31 36 3b 20 6a 2b 2b 29 7b 0a 20 20 20   j<16; j++){.   
1e370 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 75     if( (pLoop->u
1e380 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 3e 3e  .vtab.omitMask>>
1e390 6a 29 26 31 20 29 7b 0a 20 20 20 20 20 20 20 20  j)&1 ){.        
1e3a0 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76  disableTerm(pLev
1e3b0 65 6c 2c 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72  el, pLoop->aLTer
1e3c0 6d 5b 6a 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  m[j]);.      }. 
1e3d0 20 20 20 7d 0a 20 20 20 20 70 4c 65 76 65 6c 2d     }.    pLevel-
1e3e0 3e 6f 70 20 3d 20 4f 50 5f 56 4e 65 78 74 3b 0a  >op = OP_VNext;.
1e3f0 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d      pLevel->p1 =
1e400 20 69 43 75 72 3b 0a 20 20 20 20 70 4c 65 76 65   iCur;.    pLeve
1e410 6c 2d 3e 70 32 20 3d 20 73 71 6c 69 74 65 33 56  l->p2 = sqlite3V
1e420 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
1e430 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  );.    sqlite3Re
1e440 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70  leaseTempRange(p
1e450 50 61 72 73 65 2c 20 69 52 65 67 2c 20 6e 43 6f  Parse, iReg, nCo
1e460 6e 73 74 72 61 69 6e 74 2b 32 29 3b 0a 20 20 20  nstraint+2);.   
1e470 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
1e480 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20  ePop(pParse);.  
1e490 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20  }else.#endif /* 
1e4a0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
1e4b0 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 20 20 69  UALTABLE */..  i
1e4c0 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  f( (pLoop->wsFla
1e4d0 67 73 20 26 20 57 48 45 52 45 5f 49 50 4b 29 21  gs & WHERE_IPK)!
1e4e0 3d 30 0a 20 20 20 26 26 20 28 70 4c 6f 6f 70 2d  =0.   && (pLoop-
1e4f0 3e 77 73 46 6c 61 67 73 20 26 20 28 57 48 45 52  >wsFlags & (WHER
1e500 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 7c 57 48 45 52  E_COLUMN_IN|WHER
1e510 45 5f 43 4f 4c 55 4d 4e 5f 45 51 29 29 21 3d 30  E_COLUMN_EQ))!=0
1e520 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73  .  ){.    /* Cas
1e530 65 20 32 3a 20 20 57 65 20 63 61 6e 20 64 69 72  e 2:  We can dir
1e540 65 63 74 6c 79 20 72 65 66 65 72 65 6e 63 65 20  ectly reference 
1e550 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 75 73 69  a single row usi
1e560 6e 67 20 61 6e 0a 20 20 20 20 2a 2a 20 20 20 20  ng an.    **    
1e570 20 20 20 20 20 20 65 71 75 61 6c 69 74 79 20 63        equality c
1e580 6f 6d 70 61 72 69 73 6f 6e 20 61 67 61 69 6e 73  omparison agains
1e590 74 20 74 68 65 20 52 4f 57 49 44 20 66 69 65 6c  t the ROWID fiel
1e5a0 64 2e 20 20 4f 72 0a 20 20 20 20 2a 2a 20 20 20  d.  Or.    **   
1e5b0 20 20 20 20 20 20 20 77 65 20 72 65 66 65 72 65         we refere
1e5c0 6e 63 65 20 6d 75 6c 74 69 70 6c 65 20 72 6f 77  nce multiple row
1e5d0 73 20 75 73 69 6e 67 20 61 20 22 72 6f 77 69 64  s using a "rowid
1e5e0 20 49 4e 20 28 2e 2e 2e 29 22 0a 20 20 20 20 2a   IN (...)".    *
1e5f0 2a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74  *          const
1e600 72 75 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ruct..    */.   
1e610 20 61 73 73 65 72 74 28 20 70 4c 6f 6f 70 2d 3e   assert( pLoop->
1e620 75 2e 62 74 72 65 65 2e 6e 45 71 3d 3d 31 20 29  u.btree.nEq==1 )
1e630 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 70 4c  ;.    pTerm = pL
1e640 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d 3b 0a  oop->aLTerm[0];.
1e650 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72      assert( pTer
1e660 6d 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  m!=0 );.    asse
1e670 72 74 28 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  rt( pTerm->pExpr
1e680 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  !=0 );.    asser
1e690 74 28 20 6f 6d 69 74 54 61 62 6c 65 3d 3d 30 20  t( omitTable==0 
1e6a0 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
1e6b0 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
1e6c0 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29  & TERM_VIRTUAL )
1e6d0 3b 0a 20 20 20 20 69 52 65 6c 65 61 73 65 52 65  ;.    iReleaseRe
1e6e0 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  g = ++pParse->nM
1e6f0 65 6d 3b 0a 20 20 20 20 69 52 6f 77 69 64 52 65  em;.    iRowidRe
1e700 67 20 3d 20 63 6f 64 65 45 71 75 61 6c 69 74 79  g = codeEquality
1e710 54 65 72 6d 28 70 50 61 72 73 65 2c 20 70 54 65  Term(pParse, pTe
1e720 72 6d 2c 20 70 4c 65 76 65 6c 2c 20 30 2c 20 62  rm, pLevel, 0, b
1e730 52 65 76 2c 20 69 52 65 6c 65 61 73 65 52 65 67  Rev, iReleaseReg
1e740 29 3b 0a 20 20 20 20 69 66 28 20 69 52 6f 77 69  );.    if( iRowi
1e750 64 52 65 67 21 3d 69 52 65 6c 65 61 73 65 52 65  dReg!=iReleaseRe
1e760 67 20 29 20 73 71 6c 69 74 65 33 52 65 6c 65 61  g ) sqlite3Relea
1e770 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
1e780 2c 20 69 52 65 6c 65 61 73 65 52 65 67 29 3b 0a  , iReleaseReg);.
1e790 20 20 20 20 61 64 64 72 4e 78 74 20 3d 20 70 4c      addrNxt = pL
1e7a0 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 3b 0a 20  evel->addrNxt;. 
1e7b0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1e7c0 64 4f 70 32 28 76 2c 20 4f 50 5f 4d 75 73 74 42  dOp2(v, OP_MustB
1e7d0 65 49 6e 74 2c 20 69 52 6f 77 69 64 52 65 67 2c  eInt, iRowidReg,
1e7e0 20 61 64 64 72 4e 78 74 29 3b 20 56 64 62 65 43   addrNxt); VdbeC
1e7f0 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
1e800 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1e810 33 28 76 2c 20 4f 50 5f 4e 6f 74 45 78 69 73 74  3(v, OP_NotExist
1e820 73 2c 20 69 43 75 72 2c 20 61 64 64 72 4e 78 74  s, iCur, addrNxt
1e830 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20  , iRowidReg);.  
1e840 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
1e850 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
1e860 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43  prCacheAffinityC
1e870 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 69 52  hange(pParse, iR
1e880 6f 77 69 64 52 65 67 2c 20 31 29 3b 0a 20 20 20  owidReg, 1);.   
1e890 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
1e8a0 65 53 74 6f 72 65 28 70 50 61 72 73 65 2c 20 69  eStore(pParse, i
1e8b0 43 75 72 2c 20 2d 31 2c 20 69 52 6f 77 69 64 52  Cur, -1, iRowidR
1e8c0 65 67 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d  eg);.    VdbeCom
1e8d0 6d 65 6e 74 28 28 76 2c 20 22 70 6b 22 29 29 3b  ment((v, "pk"));
1e8e0 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20  .    pLevel->op 
1e8f0 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 7d 65 6c  = OP_Noop;.  }el
1e900 73 65 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77  se if( (pLoop->w
1e910 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
1e920 50 4b 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20  PK)!=0.         
1e930 26 26 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  && (pLoop->wsFla
1e940 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d  gs & WHERE_COLUM
1e950 4e 5f 52 41 4e 47 45 29 21 3d 30 0a 20 20 29 7b  N_RANGE)!=0.  ){
1e960 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 33 3a 20  .    /* Case 3: 
1e970 20 57 65 20 68 61 76 65 20 61 6e 20 69 6e 65 71   We have an ineq
1e980 75 61 6c 69 74 79 20 63 6f 6d 70 61 72 69 73 6f  uality compariso
1e990 6e 20 61 67 61 69 6e 73 74 20 74 68 65 20 52 4f  n against the RO
1e9a0 57 49 44 20 66 69 65 6c 64 2e 0a 20 20 20 20 2a  WID field..    *
1e9b0 2f 0a 20 20 20 20 69 6e 74 20 74 65 73 74 4f 70  /.    int testOp
1e9c0 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20   = OP_Noop;.    
1e9d0 69 6e 74 20 73 74 61 72 74 3b 0a 20 20 20 20 69  int start;.    i
1e9e0 6e 74 20 6d 65 6d 45 6e 64 56 61 6c 75 65 20 3d  nt memEndValue =
1e9f0 20 30 3b 0a 20 20 20 20 57 68 65 72 65 54 65 72   0;.    WhereTer
1ea00 6d 20 2a 70 53 74 61 72 74 2c 20 2a 70 45 6e 64  m *pStart, *pEnd
1ea10 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f  ;..    assert( o
1ea20 6d 69 74 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20  mitTable==0 );. 
1ea30 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20 70 53     j = 0;.    pS
1ea40 74 61 72 74 20 3d 20 70 45 6e 64 20 3d 20 30 3b  tart = pEnd = 0;
1ea50 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e  .    if( pLoop->
1ea60 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
1ea70 42 54 4d 5f 4c 49 4d 49 54 20 29 20 70 53 74 61  BTM_LIMIT ) pSta
1ea80 72 74 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65  rt = pLoop->aLTe
1ea90 72 6d 5b 6a 2b 2b 5d 3b 0a 20 20 20 20 69 66 28  rm[j++];.    if(
1eaa0 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20   pLoop->wsFlags 
1eab0 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49  & WHERE_TOP_LIMI
1eac0 54 20 29 20 70 45 6e 64 20 3d 20 70 4c 6f 6f 70  T ) pEnd = pLoop
1ead0 2d 3e 61 4c 54 65 72 6d 5b 6a 2b 2b 5d 3b 0a 20  ->aLTerm[j++];. 
1eae0 20 20 20 61 73 73 65 72 74 28 20 70 53 74 61 72     assert( pStar
1eaf0 74 21 3d 30 20 7c 7c 20 70 45 6e 64 21 3d 30 20  t!=0 || pEnd!=0 
1eb00 29 3b 0a 20 20 20 20 69 66 28 20 62 52 65 76 20  );.    if( bRev 
1eb10 29 7b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d  ){.      pTerm =
1eb20 20 70 53 74 61 72 74 3b 0a 20 20 20 20 20 20 70   pStart;.      p
1eb30 53 74 61 72 74 20 3d 20 70 45 6e 64 3b 0a 20 20  Start = pEnd;.  
1eb40 20 20 20 20 70 45 6e 64 20 3d 20 70 54 65 72 6d      pEnd = pTerm
1eb50 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1eb60 70 53 74 61 72 74 20 29 7b 0a 20 20 20 20 20 20  pStart ){.      
1eb70 45 78 70 72 20 2a 70 58 3b 20 20 20 20 20 20 20  Expr *pX;       
1eb80 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70        /* The exp
1eb90 72 65 73 73 69 6f 6e 20 74 68 61 74 20 64 65 66  ression that def
1eba0 69 6e 65 73 20 74 68 65 20 73 74 61 72 74 20 62  ines the start b
1ebb0 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ound */.      in
1ebc0 74 20 72 31 2c 20 72 54 65 6d 70 3b 20 20 20 20  t r1, rTemp;    
1ebd0 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 73      /* Registers
1ebe0 20 66 6f 72 20 68 6f 6c 64 69 6e 67 20 74 68 65   for holding the
1ebf0 20 73 74 61 72 74 20 62 6f 75 6e 64 61 72 79 20   start boundary 
1ec00 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  */..      /* The
1ec10 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6e 73 74   following const
1ec20 61 6e 74 20 6d 61 70 73 20 54 4b 5f 78 78 20 63  ant maps TK_xx c
1ec30 6f 64 65 73 20 69 6e 74 6f 20 63 6f 72 72 65 73  odes into corres
1ec40 70 6f 6e 64 69 6e 67 20 0a 20 20 20 20 20 20 2a  ponding .      *
1ec50 2a 20 73 65 65 6b 20 6f 70 63 6f 64 65 73 2e 20  * seek opcodes. 
1ec60 20 49 74 20 64 65 70 65 6e 64 73 20 6f 6e 20 61   It depends on a
1ec70 20 70 61 72 74 69 63 75 6c 61 72 20 6f 72 64 65   particular orde
1ec80 72 69 6e 67 20 6f 66 20 54 4b 5f 78 78 0a 20 20  ring of TK_xx.  
1ec90 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e      */.      con
1eca0 73 74 20 75 38 20 61 4d 6f 76 65 4f 70 5b 5d 20  st u8 aMoveOp[] 
1ecb0 3d 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 2f  = {.           /
1ecc0 2a 20 54 4b 5f 47 54 20 2a 2f 20 20 4f 50 5f 53  * TK_GT */  OP_S
1ecd0 65 65 6b 47 54 2c 0a 20 20 20 20 20 20 20 20 20  eekGT,.         
1ece0 20 20 2f 2a 20 54 4b 5f 4c 45 20 2a 2f 20 20 4f    /* TK_LE */  O
1ecf0 50 5f 53 65 65 6b 4c 45 2c 0a 20 20 20 20 20 20  P_SeekLE,.      
1ed00 20 20 20 20 20 2f 2a 20 54 4b 5f 4c 54 20 2a 2f       /* TK_LT */
1ed10 20 20 4f 50 5f 53 65 65 6b 4c 54 2c 0a 20 20 20    OP_SeekLT,.   
1ed20 20 20 20 20 20 20 20 20 2f 2a 20 54 4b 5f 47 45          /* TK_GE
1ed30 20 2a 2f 20 20 4f 50 5f 53 65 65 6b 47 45 0a 20   */  OP_SeekGE. 
1ed40 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 61 73       };.      as
1ed50 73 65 72 74 28 20 54 4b 5f 4c 45 3d 3d 54 4b 5f  sert( TK_LE==TK_
1ed60 47 54 2b 31 20 29 3b 20 20 20 20 20 20 2f 2a 20  GT+1 );      /* 
1ed70 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6f 72  Make sure the or
1ed80 64 65 72 69 6e 67 2e 2e 20 2a 2f 0a 20 20 20 20  dering.. */.    
1ed90 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 54 3d    assert( TK_LT=
1eda0 3d 54 4b 5f 47 54 2b 32 20 29 3b 20 20 20 20 20  =TK_GT+2 );     
1edb0 20 2f 2a 20 20 2e 2e 2e 20 6f 66 20 74 68 65 20   /*  ... of the 
1edc0 54 4b 5f 78 78 20 76 61 6c 75 65 73 2e 2e 2e 20  TK_xx values... 
1edd0 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
1ede0 20 54 4b 5f 47 45 3d 3d 54 4b 5f 47 54 2b 33 20   TK_GE==TK_GT+3 
1edf0 29 3b 20 20 20 20 20 20 2f 2a 20 20 2e 2e 2e 20  );      /*  ... 
1ee00 69 73 20 63 6f 72 72 65 63 63 74 2e 20 2a 2f 0a  is correcct. */.
1ee10 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28  .      assert( (
1ee20 70 53 74 61 72 74 2d 3e 77 74 46 6c 61 67 73 20  pStart->wtFlags 
1ee30 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30  & TERM_VNULL)==0
1ee40 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
1ee50 73 65 28 20 70 53 74 61 72 74 2d 3e 77 74 46 6c  se( pStart->wtFl
1ee60 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55  ags & TERM_VIRTU
1ee70 41 4c 20 29 3b 0a 20 20 20 20 20 20 70 58 20 3d  AL );.      pX =
1ee80 20 70 53 74 61 72 74 2d 3e 70 45 78 70 72 3b 0a   pStart->pExpr;.
1ee90 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 58        assert( pX
1eea0 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73  !=0 );.      tes
1eeb0 74 63 61 73 65 28 20 70 53 74 61 72 74 2d 3e 6c  tcase( pStart->l
1eec0 65 66 74 43 75 72 73 6f 72 21 3d 69 43 75 72 20  eftCursor!=iCur 
1eed0 29 3b 20 2f 2a 20 74 72 61 6e 73 69 74 69 76 65  ); /* transitive
1eee0 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a   constraints */.
1eef0 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
1ef00 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
1ef10 50 61 72 73 65 2c 20 70 58 2d 3e 70 52 69 67 68  Parse, pX->pRigh
1ef20 74 2c 20 26 72 54 65 6d 70 29 3b 0a 20 20 20 20  t, &rTemp);.    
1ef30 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1ef40 4f 70 33 28 76 2c 20 61 4d 6f 76 65 4f 70 5b 70  Op3(v, aMoveOp[p
1ef50 58 2d 3e 6f 70 2d 54 4b 5f 47 54 5d 2c 20 69 43  X->op-TK_GT], iC
1ef60 75 72 2c 20 61 64 64 72 42 72 6b 2c 20 72 31 29  ur, addrBrk, r1)
1ef70 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
1ef80 65 6e 74 28 28 76 2c 20 22 70 6b 22 29 29 3b 0a  ent((v, "pk"));.
1ef90 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
1efa0 67 65 49 66 28 76 2c 20 70 58 2d 3e 6f 70 3d 3d  geIf(v, pX->op==
1efb0 54 4b 5f 47 54 29 3b 0a 20 20 20 20 20 20 56 64  TK_GT);.      Vd
1efc0 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
1efd0 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45 29 3b 0a  pX->op==TK_LE);.
1efe0 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
1eff0 67 65 49 66 28 76 2c 20 70 58 2d 3e 6f 70 3d 3d  geIf(v, pX->op==
1f000 54 4b 5f 4c 54 29 3b 0a 20 20 20 20 20 20 56 64  TK_LT);.      Vd
1f010 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
1f020 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 47 45 29 3b 0a  pX->op==TK_GE);.
1f030 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1f040 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68  rCacheAffinityCh
1f050 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 31 2c  ange(pParse, r1,
1f060 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   1);.      sqlit
1f070 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
1f080 28 70 50 61 72 73 65 2c 20 72 54 65 6d 70 29 3b  (pParse, rTemp);
1f090 0a 20 20 20 20 20 20 64 69 73 61 62 6c 65 54 65  .      disableTe
1f0a0 72 6d 28 70 4c 65 76 65 6c 2c 20 70 53 74 61 72  rm(pLevel, pStar
1f0b0 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  t);.    }else{. 
1f0c0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1f0d0 41 64 64 4f 70 32 28 76 2c 20 62 52 65 76 20 3f  AddOp2(v, bRev ?
1f0e0 20 4f 50 5f 4c 61 73 74 20 3a 20 4f 50 5f 52 65   OP_Last : OP_Re
1f0f0 77 69 6e 64 2c 20 69 43 75 72 2c 20 61 64 64 72  wind, iCur, addr
1f100 42 72 6b 29 3b 0a 20 20 20 20 20 20 56 64 62 65  Brk);.      Vdbe
1f110 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 62 52  CoverageIf(v, bR
1f120 65 76 3d 3d 30 29 3b 0a 20 20 20 20 20 20 56 64  ev==0);.      Vd
1f130 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
1f140 62 52 65 76 21 3d 30 29 3b 0a 20 20 20 20 7d 0a  bRev!=0);.    }.
1f150 20 20 20 20 69 66 28 20 70 45 6e 64 20 29 7b 0a      if( pEnd ){.
1f160 20 20 20 20 20 20 45 78 70 72 20 2a 70 58 3b 0a        Expr *pX;.
1f170 20 20 20 20 20 20 70 58 20 3d 20 70 45 6e 64 2d        pX = pEnd-
1f180 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73  >pExpr;.      as
1f190 73 65 72 74 28 20 70 58 21 3d 30 20 29 3b 0a 20  sert( pX!=0 );. 
1f1a0 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 45       assert( (pE
1f1b0 6e 64 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  nd->wtFlags & TE
1f1c0 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29 3b 0a  RM_VNULL)==0 );.
1f1d0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1f1e0 70 45 6e 64 2d 3e 6c 65 66 74 43 75 72 73 6f 72  pEnd->leftCursor
1f1f0 21 3d 69 43 75 72 20 29 3b 20 2f 2a 20 54 72 61  !=iCur ); /* Tra
1f200 6e 73 69 74 69 76 65 20 63 6f 6e 73 74 72 61 69  nsitive constrai
1f210 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 74 65 73  nts */.      tes
1f220 74 63 61 73 65 28 20 70 45 6e 64 2d 3e 77 74 46  tcase( pEnd->wtF
1f230 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54  lags & TERM_VIRT
1f240 55 41 4c 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d  UAL );.      mem
1f250 45 6e 64 56 61 6c 75 65 20 3d 20 2b 2b 70 50 61  EndValue = ++pPa
1f260 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
1f270 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1f280 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 52 69  (pParse, pX->pRi
1f290 67 68 74 2c 20 6d 65 6d 45 6e 64 56 61 6c 75 65  ght, memEndValue
1f2a0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 58 2d  );.      if( pX-
1f2b0 3e 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 20 70 58  >op==TK_LT || pX
1f2c0 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20 29 7b 0a 20  ->op==TK_GT ){. 
1f2d0 20 20 20 20 20 20 20 74 65 73 74 4f 70 20 3d 20         testOp = 
1f2e0 62 52 65 76 20 3f 20 4f 50 5f 4c 65 20 3a 20 4f  bRev ? OP_Le : O
1f2f0 50 5f 47 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73  P_Ge;.      }els
1f300 65 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74 4f  e{.        testO
1f310 70 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f 4c 74  p = bRev ? OP_Lt
1f320 20 3a 20 4f 50 5f 47 74 3b 0a 20 20 20 20 20 20   : OP_Gt;.      
1f330 7d 0a 20 20 20 20 20 20 64 69 73 61 62 6c 65 54  }.      disableT
1f340 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 45 6e 64  erm(pLevel, pEnd
1f350 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 74 61  );.    }.    sta
1f360 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rt = sqlite3Vdbe
1f370 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
1f380 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d      pLevel->op =
1f390 20 62 52 65 76 20 3f 20 4f 50 5f 50 72 65 76 20   bRev ? OP_Prev 
1f3a0 3a 20 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20 70  : OP_Next;.    p
1f3b0 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69 43 75 72  Level->p1 = iCur
1f3c0 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32  ;.    pLevel->p2
1f3d0 20 3d 20 73 74 61 72 74 3b 0a 20 20 20 20 61 73   = start;.    as
1f3e0 73 65 72 74 28 20 70 4c 65 76 65 6c 2d 3e 70 35  sert( pLevel->p5
1f3f0 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 74  ==0 );.    if( t
1f400 65 73 74 4f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29  estOp!=OP_Noop )
1f410 7b 0a 20 20 20 20 20 20 69 52 6f 77 69 64 52 65  {.      iRowidRe
1f420 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  g = ++pParse->nM
1f430 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  em;.      sqlite
1f440 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1f450 50 5f 52 6f 77 69 64 2c 20 69 43 75 72 2c 20 69  P_Rowid, iCur, i
1f460 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20 20  RowidReg);.     
1f470 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
1f480 65 53 74 6f 72 65 28 70 50 61 72 73 65 2c 20 69  eStore(pParse, i
1f490 43 75 72 2c 20 2d 31 2c 20 69 52 6f 77 69 64 52  Cur, -1, iRowidR
1f4a0 65 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  eg);.      sqlit
1f4b0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
1f4c0 74 65 73 74 4f 70 2c 20 6d 65 6d 45 6e 64 56 61  testOp, memEndVa
1f4d0 6c 75 65 2c 20 61 64 64 72 42 72 6b 2c 20 69 52  lue, addrBrk, iR
1f4e0 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20 20 20  owidReg);.      
1f4f0 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
1f500 2c 20 74 65 73 74 4f 70 3d 3d 4f 50 5f 4c 65 29  , testOp==OP_Le)
1f510 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
1f520 72 61 67 65 49 66 28 76 2c 20 74 65 73 74 4f 70  rageIf(v, testOp
1f530 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20 20 20 20 20  ==OP_Lt);.      
1f540 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
1f550 2c 20 74 65 73 74 4f 70 3d 3d 4f 50 5f 47 65 29  , testOp==OP_Ge)
1f560 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
1f570 72 61 67 65 49 66 28 76 2c 20 74 65 73 74 4f 70  rageIf(v, testOp
1f580 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20 20 20 20 20  ==OP_Gt);.      
1f590 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
1f5a0 65 50 35 28 76 2c 20 53 51 4c 49 54 45 5f 41 46  eP5(v, SQLITE_AF
1f5b0 46 5f 4e 55 4d 45 52 49 43 20 7c 20 53 51 4c 49  F_NUMERIC | SQLI
1f5c0 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a  TE_JUMPIFNULL);.
1f5d0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
1f5e0 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  ( pLoop->wsFlags
1f5f0 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44   & WHERE_INDEXED
1f600 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20   ){.    /* Case 
1f610 34 3a 20 41 20 73 63 61 6e 20 75 73 69 6e 67 20  4: A scan using 
1f620 61 6e 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2a  an index..    **
1f630 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
1f640 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
1f650 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 7a 65 72   may contain zer
1f660 6f 20 6f 72 20 6d 6f 72 65 20 65 71 75 61 6c 69  o or more equali
1f670 74 79 20 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  ty .    **      
1f680 20 20 20 74 65 72 6d 73 20 28 22 3d 3d 22 20 6f     terms ("==" o
1f690 72 20 22 49 4e 22 20 6f 70 65 72 61 74 6f 72 73  r "IN" operators
1f6a0 29 20 74 68 61 74 20 72 65 66 65 72 20 74 6f 20  ) that refer to 
1f6b0 74 68 65 20 4e 0a 20 20 20 20 2a 2a 20 20 20 20  the N.    **    
1f6c0 20 20 20 20 20 6c 65 66 74 2d 6d 6f 73 74 20 63       left-most c
1f6d0 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 69 6e  olumns of the in
1f6e0 64 65 78 2e 20 49 74 20 6d 61 79 20 61 6c 73 6f  dex. It may also
1f6f0 20 63 6f 6e 74 61 69 6e 0a 20 20 20 20 2a 2a 20   contain.    ** 
1f700 20 20 20 20 20 20 20 20 69 6e 65 71 75 61 6c 69          inequali
1f710 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 28  ty constraints (
1f720 3e 2c 20 3c 2c 20 3e 3d 20 6f 72 20 3c 3d 29 20  >, <, >= or <=) 
1f730 6f 6e 20 74 68 65 20 69 6e 64 65 78 65 64 0a 20  on the indexed. 
1f740 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 63 6f     **         co
1f750 6c 75 6d 6e 20 74 68 61 74 20 69 6d 6d 65 64 69  lumn that immedi
1f760 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 73 20 74 68  ately follows th
1f770 65 20 4e 20 65 71 75 61 6c 69 74 69 65 73 2e 20  e N equalities. 
1f780 4f 6e 6c 79 20 0a 20 20 20 20 2a 2a 20 20 20 20  Only .    **    
1f790 20 20 20 20 20 74 68 65 20 72 69 67 68 74 2d 6d       the right-m
1f7a0 6f 73 74 20 63 6f 6c 75 6d 6e 20 63 61 6e 20 62  ost column can b
1f7b0 65 20 61 6e 20 69 6e 65 71 75 61 6c 69 74 79 20  e an inequality 
1f7c0 2d 20 74 68 65 20 72 65 73 74 20 6d 75 73 74 0a  - the rest must.
1f7d0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 75      **         u
1f7e0 73 65 20 74 68 65 20 22 3d 3d 22 20 61 6e 64 20  se the "==" and 
1f7f0 22 49 4e 22 20 6f 70 65 72 61 74 6f 72 73 2e 20  "IN" operators. 
1f800 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20  For example, if 
1f810 74 68 65 20 0a 20 20 20 20 2a 2a 20 20 20 20 20  the .    **     
1f820 20 20 20 20 69 6e 64 65 78 20 69 73 20 6f 6e 20      index is on 
1f830 28 78 2c 79 2c 7a 29 2c 20 74 68 65 6e 20 74 68  (x,y,z), then th
1f840 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6c 61 75  e following clau
1f850 73 65 73 20 61 72 65 20 61 6c 6c 20 0a 20 20 20  ses are all .   
1f860 20 2a 2a 20 20 20 20 20 20 20 20 20 6f 70 74 69   **         opti
1f870 6d 69 7a 65 64 3a 0a 20 20 20 20 2a 2a 0a 20 20  mized:.    **.  
1f880 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20    **            
1f890 78 3d 35 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  x=5.    **      
1f8a0 20 20 20 20 20 20 78 3d 35 20 41 4e 44 20 79 3d        x=5 AND y=
1f8b0 31 30 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  10.    **       
1f8c0 20 20 20 20 20 78 3d 35 20 41 4e 44 20 79 3c 31       x=5 AND y<1
1f8d0 30 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  0.    **        
1f8e0 20 20 20 20 78 3d 35 20 41 4e 44 20 79 3e 35 20      x=5 AND y>5 
1f8f0 41 4e 44 20 79 3c 31 30 0a 20 20 20 20 2a 2a 20  AND y<10.    ** 
1f900 20 20 20 20 20 20 20 20 20 20 20 78 3d 35 20 41             x=5 A
1f910 4e 44 20 79 3d 35 20 41 4e 44 20 7a 3c 3d 31 30  ND y=5 AND z<=10
1f920 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
1f930 20 20 20 20 20 20 20 54 68 65 20 7a 3c 31 30 20         The z<10 
1f940 74 65 72 6d 20 6f 66 20 74 68 65 20 66 6f 6c 6c  term of the foll
1f950 6f 77 69 6e 67 20 63 61 6e 6e 6f 74 20 62 65 20  owing cannot be 
1f960 75 73 65 64 2c 20 6f 6e 6c 79 0a 20 20 20 20 2a  used, only.    *
1f970 2a 20 20 20 20 20 20 20 20 20 74 68 65 20 78 3d  *         the x=
1f980 35 20 74 65 72 6d 3a 0a 20 20 20 20 2a 2a 0a 20  5 term:.    **. 
1f990 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20     **           
1f9a0 20 78 3d 35 20 41 4e 44 20 7a 3c 31 30 0a 20 20   x=5 AND z<10.  
1f9b0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20    **.    **     
1f9c0 20 20 20 20 4e 20 6d 61 79 20 62 65 20 7a 65 72      N may be zer
1f9d0 6f 20 69 66 20 74 68 65 72 65 20 61 72 65 20 69  o if there are i
1f9e0 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72  nequality constr
1f9f0 61 69 6e 74 73 2e 0a 20 20 20 20 2a 2a 20 20 20  aints..    **   
1fa00 20 20 20 20 20 20 49 66 20 74 68 65 72 65 20 61        If there a
1fa10 72 65 20 6e 6f 20 69 6e 65 71 75 61 6c 69 74 79  re no inequality
1fa20 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20 74 68   constraints, th
1fa30 65 6e 20 4e 20 69 73 20 61 74 0a 20 20 20 20 2a  en N is at.    *
1fa40 2a 20 20 20 20 20 20 20 20 20 6c 65 61 73 74 20  *         least 
1fa50 6f 6e 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  one..    **.    
1fa60 2a 2a 20 20 20 20 20 20 20 20 20 54 68 69 73 20  **         This 
1fa70 63 61 73 65 20 69 73 20 61 6c 73 6f 20 75 73 65  case is also use
1fa80 64 20 77 68 65 6e 20 74 68 65 72 65 20 61 72 65  d when there are
1fa90 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65   no WHERE clause
1faa0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
1fab0 63 6f 6e 73 74 72 61 69 6e 74 73 20 62 75 74 20  constraints but 
1fac0 61 6e 20 69 6e 64 65 78 20 69 73 20 73 65 6c 65  an index is sele
1fad0 63 74 65 64 20 61 6e 79 77 61 79 2c 20 69 6e 20  cted anyway, in 
1fae0 6f 72 64 65 72 0a 20 20 20 20 2a 2a 20 20 20 20  order.    **    
1faf0 20 20 20 20 20 74 6f 20 66 6f 72 63 65 20 74 68       to force th
1fb00 65 20 6f 75 74 70 75 74 20 6f 72 64 65 72 20 74  e output order t
1fb10 6f 20 63 6f 6e 66 6f 72 6d 20 74 6f 20 61 6e 20  o conform to an 
1fb20 4f 52 44 45 52 20 42 59 2e 0a 20 20 20 20 2a 2f  ORDER BY..    */
1fb30 20 20 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f    .    static co
1fb40 6e 73 74 20 75 38 20 61 53 74 61 72 74 4f 70 5b  nst u8 aStartOp[
1fb50 5d 20 3d 20 7b 0a 20 20 20 20 20 20 30 2c 0a 20  ] = {.      0,. 
1fb60 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20 4f 50       0,.      OP
1fb70 5f 52 65 77 69 6e 64 2c 20 20 20 20 20 20 20 20  _Rewind,        
1fb80 20 20 20 2f 2a 20 32 3a 20 28 21 73 74 61 72 74     /* 2: (!start
1fb90 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 26 26 20  _constraints && 
1fba0 73 74 61 72 74 45 71 20 26 26 20 20 21 62 52 65  startEq &&  !bRe
1fbb0 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 4c  v) */.      OP_L
1fbc0 61 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  ast,            
1fbd0 20 2f 2a 20 33 3a 20 28 21 73 74 61 72 74 5f 63   /* 3: (!start_c
1fbe0 6f 6e 73 74 72 61 69 6e 74 73 20 26 26 20 73 74  onstraints && st
1fbf0 61 72 74 45 71 20 26 26 20 20 20 62 52 65 76 29  artEq &&   bRev)
1fc00 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 53 65 65   */.      OP_See
1fc10 6b 47 54 2c 20 20 20 20 20 20 20 20 20 20 20 2f  kGT,           /
1fc20 2a 20 34 3a 20 28 73 74 61 72 74 5f 63 6f 6e 73  * 4: (start_cons
1fc30 74 72 61 69 6e 74 73 20 20 26 26 20 21 73 74 61  traints  && !sta
1fc40 72 74 45 71 20 26 26 20 21 62 52 65 76 29 20 2a  rtEq && !bRev) *
1fc50 2f 0a 20 20 20 20 20 20 4f 50 5f 53 65 65 6b 4c  /.      OP_SeekL
1fc60 54 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  T,           /* 
1fc70 35 3a 20 28 73 74 61 72 74 5f 63 6f 6e 73 74 72  5: (start_constr
1fc80 61 69 6e 74 73 20 20 26 26 20 21 73 74 61 72 74  aints  && !start
1fc90 45 71 20 26 26 20 20 62 52 65 76 29 20 2a 2f 0a  Eq &&  bRev) */.
1fca0 20 20 20 20 20 20 4f 50 5f 53 65 65 6b 47 45 2c        OP_SeekGE,
1fcb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 36 3a             /* 6:
1fcc0 20 28 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69   (start_constrai
1fcd0 6e 74 73 20 20 26 26 20 20 73 74 61 72 74 45 71  nts  &&  startEq
1fce0 20 26 26 20 21 62 52 65 76 29 20 2a 2f 0a 20 20   && !bRev) */.  
1fcf0 20 20 20 20 4f 50 5f 53 65 65 6b 4c 45 20 20 20      OP_SeekLE   
1fd00 20 20 20 20 20 20 20 20 20 2f 2a 20 37 3a 20 28           /* 7: (
1fd10 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74  start_constraint
1fd20 73 20 20 26 26 20 20 73 74 61 72 74 45 71 20 26  s  &&  startEq &
1fd30 26 20 20 62 52 65 76 29 20 2a 2f 0a 20 20 20 20  &  bRev) */.    
1fd40 7d 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f  };.    static co
1fd50 6e 73 74 20 75 38 20 61 45 6e 64 4f 70 5b 5d 20  nst u8 aEndOp[] 
1fd60 3d 20 7b 0a 20 20 20 20 20 20 4f 50 5f 49 64 78  = {.      OP_Idx
1fd70 47 45 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  GE,            /
1fd80 2a 20 30 3a 20 28 65 6e 64 5f 63 6f 6e 73 74 72  * 0: (end_constr
1fd90 61 69 6e 74 73 20 26 26 20 21 62 52 65 76 20 26  aints && !bRev &
1fda0 26 20 21 65 6e 64 45 71 29 20 2a 2f 0a 20 20 20  & !endEq) */.   
1fdb0 20 20 20 4f 50 5f 49 64 78 47 54 2c 20 20 20 20     OP_IdxGT,    
1fdc0 20 20 20 20 20 20 20 20 2f 2a 20 31 3a 20 28 65          /* 1: (e
1fdd0 6e 64 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 26  nd_constraints &
1fde0 26 20 21 62 52 65 76 20 26 26 20 20 65 6e 64 45  & !bRev &&  endE
1fdf0 71 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 49  q) */.      OP_I
1fe00 64 78 4c 45 2c 20 20 20 20 20 20 20 20 20 20 20  dxLE,           
1fe10 20 2f 2a 20 32 3a 20 28 65 6e 64 5f 63 6f 6e 73   /* 2: (end_cons
1fe20 74 72 61 69 6e 74 73 20 26 26 20 20 62 52 65 76  traints &&  bRev
1fe30 20 26 26 20 21 65 6e 64 45 71 29 20 2a 2f 0a 20   && !endEq) */. 
1fe40 20 20 20 20 20 4f 50 5f 49 64 78 4c 54 2c 20 20       OP_IdxLT,  
1fe50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 33 3a 20            /* 3: 
1fe60 28 65 6e 64 5f 63 6f 6e 73 74 72 61 69 6e 74 73  (end_constraints
1fe70 20 26 26 20 20 62 52 65 76 20 26 26 20 20 65 6e   &&  bRev &&  en
1fe80 64 45 71 29 20 2a 2f 0a 20 20 20 20 7d 3b 0a 20  dEq) */.    };. 
1fe90 20 20 20 75 31 36 20 6e 45 71 20 3d 20 70 4c 6f     u16 nEq = pLo
1fea0 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b  op->u.btree.nEq;
1feb0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1fec0 66 20 3d 3d 20 6f 72 20 49 4e 20 74 65 72 6d 73  f == or IN terms
1fed0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65 67 42   */.    int regB
1fee0 61 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ase;            
1fef0 20 20 20 20 20 2f 2a 20 42 61 73 65 20 72 65 67       /* Base reg
1ff00 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 63 6f  ister holding co
1ff10 6e 73 74 72 61 69 6e 74 20 76 61 6c 75 65 73 20  nstraint values 
1ff20 2a 2f 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d  */.    WhereTerm
1ff30 20 2a 70 52 61 6e 67 65 53 74 61 72 74 20 3d 20   *pRangeStart = 
1ff40 30 3b 20 20 2f 2a 20 49 6e 65 71 75 61 6c 69 74  0;  /* Inequalit
1ff50 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 74 20  y constraint at 
1ff60 72 61 6e 67 65 20 73 74 61 72 74 20 2a 2f 0a 20  range start */. 
1ff70 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 52     WhereTerm *pR
1ff80 61 6e 67 65 45 6e 64 20 3d 20 30 3b 20 20 20 20  angeEnd = 0;    
1ff90 2f 2a 20 49 6e 65 71 75 61 6c 69 74 79 20 63 6f  /* Inequality co
1ffa0 6e 73 74 72 61 69 6e 74 20 61 74 20 72 61 6e 67  nstraint at rang
1ffb0 65 20 65 6e 64 20 2a 2f 0a 20 20 20 20 69 6e 74  e end */.    int
1ffc0 20 73 74 61 72 74 45 71 3b 20 20 20 20 20 20 20   startEq;       
1ffd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
1ffe0 65 20 69 66 20 72 61 6e 67 65 20 73 74 61 72 74  e if range start
1fff0 20 75 73 65 73 20 3d 3d 2c 20 3e 3d 20 6f 72 20   uses ==, >= or 
20000 3c 3d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 65 6e  <= */.    int en
20010 64 45 71 3b 20 20 20 20 20 20 20 20 20 20 20 20  dEq;            
20020 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
20030 66 20 72 61 6e 67 65 20 65 6e 64 20 75 73 65 73  f range end uses
20040 20 3d 3d 2c 20 3e 3d 20 6f 72 20 3c 3d 20 2a 2f   ==, >= or <= */
20050 0a 20 20 20 20 69 6e 74 20 73 74 61 72 74 5f 63  .    int start_c
20060 6f 6e 73 74 72 61 69 6e 74 73 3b 20 20 20 20 20  onstraints;     
20070 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 72 61    /* Start of ra
20080 6e 67 65 20 69 73 20 63 6f 6e 73 74 72 61 69 6e  nge is constrain
20090 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 43  ed */.    int nC
200a0 6f 6e 73 74 72 61 69 6e 74 3b 20 20 20 20 20 20  onstraint;      
200b0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
200c0 20 6f 66 20 63 6f 6e 73 74 72 61 69 6e 74 20 74   of constraint t
200d0 65 72 6d 73 20 2a 2f 0a 20 20 20 20 49 6e 64 65  erms */.    Inde
200e0 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20  x *pIdx;        
200f0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
20100 69 6e 64 65 78 20 77 65 20 77 69 6c 6c 20 62 65  index we will be
20110 20 75 73 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e   using */.    in
20120 74 20 69 49 64 78 43 75 72 3b 20 20 20 20 20 20  t iIdxCur;      
20130 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
20140 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 66 6f  e VDBE cursor fo
20150 72 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20  r the index */. 
20160 20 20 20 69 6e 74 20 6e 45 78 74 72 61 52 65 67     int nExtraReg
20170 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
20180 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 78 74  /* Number of ext
20190 72 61 20 72 65 67 69 73 74 65 72 73 20 6e 65 65  ra registers nee
201a0 64 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6f  ded */.    int o
201b0 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
201c0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 73 74 72          /* Instr
201d0 75 63 74 69 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f  uction opcode */
201e0 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 74 61 72  .    char *zStar
201f0 74 41 66 66 3b 20 20 20 20 20 20 20 20 20 20 20  tAff;           
20200 20 20 2f 2a 20 41 66 66 69 6e 69 74 79 20 66 6f    /* Affinity fo
20210 72 20 73 74 61 72 74 20 6f 66 20 72 61 6e 67 65  r start of range
20220 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20   constraint */. 
20230 20 20 20 63 68 61 72 20 63 45 6e 64 41 66 66 20     char cEndAff 
20240 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
20250 2f 2a 20 41 66 66 69 6e 69 74 79 20 66 6f 72 20  /* Affinity for 
20260 65 6e 64 20 6f 66 20 72 61 6e 67 65 20 63 6f 6e  end of range con
20270 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20 20 75  straint */.    u
20280 38 20 62 53 65 65 6b 50 61 73 74 4e 75 6c 6c 20  8 bSeekPastNull 
20290 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  = 0;        /* T
202a0 72 75 65 20 74 6f 20 73 65 65 6b 20 70 61 73 74  rue to seek past
202b0 20 69 6e 69 74 69 61 6c 20 6e 75 6c 6c 73 20 2a   initial nulls *
202c0 2f 0a 20 20 20 20 75 38 20 62 53 74 6f 70 41 74  /.    u8 bStopAt
202d0 4e 75 6c 6c 20 3d 20 30 3b 20 20 20 20 20 20 20  Null = 0;       
202e0 20 20 20 2f 2a 20 41 64 64 20 63 6f 6e 64 69 74     /* Add condit
202f0 69 6f 6e 20 74 6f 20 74 65 72 6d 69 6e 61 74 65  ion to terminate
20300 20 61 74 20 4e 55 4c 4c 73 20 2a 2f 0a 0a 20 20   at NULLs */..  
20310 20 20 70 49 64 78 20 3d 20 70 4c 6f 6f 70 2d 3e    pIdx = pLoop->
20320 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a  u.btree.pIndex;.
20330 20 20 20 20 69 49 64 78 43 75 72 20 3d 20 70 4c      iIdxCur = pL
20340 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20  evel->iIdxCur;. 
20350 20 20 20 61 73 73 65 72 74 28 20 6e 45 71 3e 3d     assert( nEq>=
20360 70 4c 6f 6f 70 2d 3e 6e 53 6b 69 70 20 29 3b 0a  pLoop->nSkip );.
20370 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
20380 6c 6f 6f 70 20 73 61 74 69 73 66 69 65 73 20 61  loop satisfies a
20390 20 73 6f 72 74 20 6f 72 64 65 72 20 28 70 4f 72   sort order (pOr
203a0 64 65 72 42 79 29 20 72 65 71 75 65 73 74 20 74  derBy) request t
203b0 68 61 74 20 0a 20 20 20 20 2a 2a 20 77 61 73 20  hat .    ** was 
203c0 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 66  passed to this f
203d0 75 6e 63 74 69 6f 6e 20 74 6f 20 69 6d 70 6c 65  unction to imple
203e0 6d 65 6e 74 20 61 20 22 53 45 4c 45 43 54 20 6d  ment a "SELECT m
203f0 69 6e 28 78 29 20 2e 2e 2e 22 20 0a 20 20 20 20  in(x) ..." .    
20400 2a 2a 20 71 75 65 72 79 2c 20 74 68 65 6e 20 74  ** query, then t
20410 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6f  he caller will o
20420 6e 6c 79 20 61 6c 6c 6f 77 20 74 68 65 20 6c 6f  nly allow the lo
20430 6f 70 20 74 6f 20 72 75 6e 20 66 6f 72 0a 20 20  op to run for.  
20440 20 20 2a 2a 20 61 20 73 69 6e 67 6c 65 20 69 74    ** a single it
20450 65 72 61 74 69 6f 6e 2e 20 54 68 69 73 20 6d 65  eration. This me
20460 61 6e 73 20 74 68 61 74 20 74 68 65 20 66 69 72  ans that the fir
20470 73 74 20 72 6f 77 20 72 65 74 75 72 6e 65 64 0a  st row returned.
20480 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20 6e 6f      ** should no
20490 74 20 68 61 76 65 20 61 20 4e 55 4c 4c 20 76 61  t have a NULL va
204a0 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20 27 78  lue stored in 'x
204b0 27 2e 20 49 66 20 63 6f 6c 75 6d 6e 20 27 78 27  '. If column 'x'
204c0 20 69 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 66   is.    ** the f
204d0 69 72 73 74 20 6f 6e 65 20 61 66 74 65 72 20 74  irst one after t
204e0 68 65 20 6e 45 71 20 65 71 75 61 6c 69 74 79 20  he nEq equality 
204f0 63 6f 6e 73 74 72 61 69 6e 74 73 20 69 6e 20 74  constraints in t
20500 68 65 20 69 6e 64 65 78 2c 0a 20 20 20 20 2a 2a  he index,.    **
20510 20 74 68 69 73 20 72 65 71 75 69 72 65 73 20 73   this requires s
20520 6f 6d 65 20 73 70 65 63 69 61 6c 20 68 61 6e 64  ome special hand
20530 6c 69 6e 67 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ling..    */.   
20540 20 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d   assert( pWInfo-
20550 3e 70 4f 72 64 65 72 42 79 3d 3d 30 0a 20 20 20  >pOrderBy==0.   
20560 20 20 20 20 20 20 7c 7c 20 70 57 49 6e 66 6f 2d        || pWInfo-
20570 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  >pOrderBy->nExpr
20580 3d 3d 31 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  ==1.         || 
20590 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c  (pWInfo->wctrlFl
205a0 61 67 73 26 57 48 45 52 45 5f 4f 52 44 45 52 42  ags&WHERE_ORDERB
205b0 59 5f 4d 49 4e 29 3d 3d 30 20 29 3b 0a 20 20 20  Y_MIN)==0 );.   
205c0 20 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63   if( (pWInfo->wc
205d0 74 72 6c 46 6c 61 67 73 26 57 48 45 52 45 5f 4f  trlFlags&WHERE_O
205e0 52 44 45 52 42 59 5f 4d 49 4e 29 21 3d 30 0a 20  RDERBY_MIN)!=0. 
205f0 20 20 20 20 26 26 20 70 57 49 6e 66 6f 2d 3e 6e      && pWInfo->n
20600 4f 42 53 61 74 3e 30 0a 20 20 20 20 20 26 26 20  OBSat>0.     && 
20610 28 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3e 6e  (pIdx->nKeyCol>n
20620 45 71 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  Eq).    ){.     
20630 20 61 73 73 65 72 74 28 20 70 4c 6f 6f 70 2d 3e   assert( pLoop->
20640 6e 53 6b 69 70 3d 3d 30 20 29 3b 0a 20 20 20 20  nSkip==0 );.    
20650 20 20 62 53 65 65 6b 50 61 73 74 4e 75 6c 6c 20    bSeekPastNull 
20660 3d 20 31 3b 0a 20 20 20 20 20 20 6e 45 78 74 72  = 1;.      nExtr
20670 61 52 65 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  aReg = 1;.    }.
20680 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20 61 6e 79  .    /* Find any
20690 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73   inequality cons
206a0 74 72 61 69 6e 74 20 74 65 72 6d 73 20 66 6f 72  traint terms for
206b0 20 74 68 65 20 73 74 61 72 74 20 61 6e 64 20 65   the start and e
206c0 6e 64 20 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68  nd .    ** of th
206d0 65 20 72 61 6e 67 65 2e 20 0a 20 20 20 20 2a 2f  e range. .    */
206e0 0a 20 20 20 20 6a 20 3d 20 6e 45 71 3b 0a 20 20  .    j = nEq;.  
206f0 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46    if( pLoop->wsF
20700 6c 61 67 73 20 26 20 57 48 45 52 45 5f 42 54 4d  lags & WHERE_BTM
20710 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 20 20  _LIMIT ){.      
20720 70 52 61 6e 67 65 53 74 61 72 74 20 3d 20 70 4c  pRangeStart = pL
20730 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 2b 2b 5d  oop->aLTerm[j++]
20740 3b 0a 20 20 20 20 20 20 6e 45 78 74 72 61 52 65  ;.      nExtraRe
20750 67 20 3d 20 31 3b 0a 20 20 20 20 20 20 2f 2a 20  g = 1;.      /* 
20760 4c 69 6b 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f  Like optimizatio
20770 6e 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69  n range constrai
20780 6e 74 73 20 61 6c 77 61 79 73 20 6f 63 63 75 72  nts always occur
20790 20 69 6e 20 70 61 69 72 73 20 2a 2f 0a 20 20 20   in pairs */.   
207a0 20 20 20 61 73 73 65 72 74 28 20 28 70 52 61 6e     assert( (pRan
207b0 67 65 53 74 61 72 74 2d 3e 77 74 46 6c 61 67 73  geStart->wtFlags
207c0 20 26 20 54 45 52 4d 5f 4c 49 4b 45 4f 50 54 29   & TERM_LIKEOPT)
207d0 3d 3d 30 20 7c 7c 20 0a 20 20 20 20 20 20 20 20  ==0 || .        
207e0 20 20 20 20 20 20 28 70 4c 6f 6f 70 2d 3e 77 73        (pLoop->ws
207f0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54 4f  Flags & WHERE_TO
20800 50 5f 4c 49 4d 49 54 29 21 3d 30 20 29 3b 0a 20  P_LIMIT)!=0 );. 
20810 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 6f     }.    if( pLo
20820 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
20830 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20 29 7b  ERE_TOP_LIMIT ){
20840 0a 20 20 20 20 20 20 70 52 61 6e 67 65 45 6e 64  .      pRangeEnd
20850 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d   = pLoop->aLTerm
20860 5b 6a 2b 2b 5d 3b 0a 20 20 20 20 20 20 6e 45 78  [j++];.      nEx
20870 74 72 61 52 65 67 20 3d 20 31 3b 0a 20 20 20 20  traReg = 1;.    
20880 20 20 69 66 28 20 28 70 52 61 6e 67 65 45 6e 64    if( (pRangeEnd
20890 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
208a0 5f 4c 49 4b 45 4f 50 54 29 21 3d 30 20 29 7b 0a  _LIKEOPT)!=0 ){.
208b0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
208c0 70 52 61 6e 67 65 53 74 61 72 74 21 3d 30 20 29  pRangeStart!=0 )
208d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
208e0 20 20 20 20 20 20 2f 2a 20 4c 49 4b 45 20 6f 70        /* LIKE op
208f0 74 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f  t constraints */
20900 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
20910 20 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 77 74   pRangeStart->wt
20920 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 4c 49 4b  Flags & TERM_LIK
20930 45 4f 50 54 20 29 3b 20 20 20 2f 2a 20 6f 63 63  EOPT );   /* occ
20940 75 72 20 69 6e 20 70 61 69 72 73 20 2a 2f 0a 20  ur in pairs */. 
20950 20 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69         pLevel->i
20960 4c 69 6b 65 52 65 70 43 6e 74 72 20 3d 20 2b 2b  LikeRepCntr = ++
20970 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
20980 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
20990 62 52 65 76 20 29 3b 0a 20 20 20 20 20 20 20 20  bRev );.        
209a0 74 65 73 74 63 61 73 65 28 20 70 49 64 78 2d 3e  testcase( pIdx->
209b0 61 53 6f 72 74 4f 72 64 65 72 5b 6e 45 71 5d 3d  aSortOrder[nEq]=
209c0 3d 53 51 4c 49 54 45 5f 53 4f 5f 44 45 53 43 20  =SQLITE_SO_DESC 
209d0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
209e0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
209f0 4f 50 5f 49 6e 74 65 67 65 72 2c 0a 20 20 20 20  OP_Integer,.    
20a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20a10 20 20 20 20 20 20 62 52 65 76 20 5e 20 28 70 49        bRev ^ (pI
20a20 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6e  dx->aSortOrder[n
20a30 45 71 5d 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 44  Eq]==SQLITE_SO_D
20a40 45 53 43 29 2c 0a 20 20 20 20 20 20 20 20 20 20  ESC),.          
20a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20a60 70 4c 65 76 65 6c 2d 3e 69 4c 69 6b 65 52 65 70  pLevel->iLikeRep
20a70 43 6e 74 72 29 3b 0a 20 20 20 20 20 20 20 20 56  Cntr);.        V
20a80 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
20a90 4c 49 4b 45 20 6c 6f 6f 70 20 63 6f 75 6e 74 65  LIKE loop counte
20aa0 72 22 29 29 3b 0a 20 20 20 20 20 20 20 20 70 4c  r"));.        pL
20ab0 65 76 65 6c 2d 3e 61 64 64 72 4c 69 6b 65 52 65  evel->addrLikeRe
20ac0 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  p = sqlite3VdbeC
20ad0 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
20ae0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
20af0 20 70 52 61 6e 67 65 53 74 61 72 74 3d 3d 30 0a   pRangeStart==0.
20b00 20 20 20 20 20 20 20 26 26 20 28 6a 20 3d 20 70         && (j = p
20b10 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 45  Idx->aiColumn[nE
20b20 71 5d 29 3e 3d 30 20 0a 20 20 20 20 20 20 20 26  q])>=0 .       &
20b30 26 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e  & pIdx->pTable->
20b40 61 43 6f 6c 5b 6a 5d 2e 6e 6f 74 4e 75 6c 6c 3d  aCol[j].notNull=
20b50 3d 30 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  =0.      ){.    
20b60 20 20 20 20 62 53 65 65 6b 50 61 73 74 4e 75 6c      bSeekPastNul
20b70 6c 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  l = 1;.      }. 
20b80 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
20b90 20 70 52 61 6e 67 65 45 6e 64 3d 3d 30 20 7c 7c   pRangeEnd==0 ||
20ba0 20 28 70 52 61 6e 67 65 45 6e 64 2d 3e 77 74 46   (pRangeEnd->wtF
20bb0 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c  lags & TERM_VNUL
20bc0 4c 29 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 2f 2a  L)==0 );..    /*
20bd0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
20be0 6f 20 65 76 61 6c 75 61 74 65 20 61 6c 6c 20 63  o evaluate all c
20bf0 6f 6e 73 74 72 61 69 6e 74 20 74 65 72 6d 73 20  onstraint terms 
20c00 75 73 69 6e 67 20 3d 3d 20 6f 72 20 49 4e 0a 20  using == or IN. 
20c10 20 20 20 2a 2a 20 61 6e 64 20 73 74 6f 72 65 20     ** and store 
20c20 74 68 65 20 76 61 6c 75 65 73 20 6f 66 20 74 68  the values of th
20c30 6f 73 65 20 74 65 72 6d 73 20 69 6e 20 61 6e 20  ose terms in an 
20c40 61 72 72 61 79 20 6f 66 20 72 65 67 69 73 74 65  array of registe
20c50 72 73 0a 20 20 20 20 2a 2a 20 73 74 61 72 74 69  rs.    ** starti
20c60 6e 67 20 61 74 20 72 65 67 42 61 73 65 2e 0a 20  ng at regBase.. 
20c70 20 20 20 2a 2f 0a 20 20 20 20 72 65 67 42 61 73     */.    regBas
20c80 65 20 3d 20 63 6f 64 65 41 6c 6c 45 71 75 61 6c  e = codeAllEqual
20c90 69 74 79 54 65 72 6d 73 28 70 50 61 72 73 65 2c  ityTerms(pParse,
20ca0 70 4c 65 76 65 6c 2c 62 52 65 76 2c 6e 45 78 74  pLevel,bRev,nExt
20cb0 72 61 52 65 67 2c 26 7a 53 74 61 72 74 41 66 66  raReg,&zStartAff
20cc0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 7a  );.    assert( z
20cd0 53 74 61 72 74 41 66 66 3d 3d 30 20 7c 7c 20 73  StartAff==0 || s
20ce0 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
20cf0 53 74 61 72 74 41 66 66 29 3e 3d 6e 45 71 20 29  StartAff)>=nEq )
20d00 3b 0a 20 20 20 20 69 66 28 20 7a 53 74 61 72 74  ;.    if( zStart
20d10 41 66 66 20 29 20 63 45 6e 64 41 66 66 20 3d 20  Aff ) cEndAff = 
20d20 7a 53 74 61 72 74 41 66 66 5b 6e 45 71 5d 3b 0a  zStartAff[nEq];.
20d30 20 20 20 20 61 64 64 72 4e 78 74 20 3d 20 70 4c      addrNxt = pL
20d40 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 3b 0a 0a  evel->addrNxt;..
20d50 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65      /* If we are
20d60 20 64 6f 69 6e 67 20 61 20 72 65 76 65 72 73 65   doing a reverse
20d70 20 6f 72 64 65 72 20 73 63 61 6e 20 6f 6e 20 61   order scan on a
20d80 6e 20 61 73 63 65 6e 64 69 6e 67 20 69 6e 64 65  n ascending inde
20d90 78 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 61 20 66  x, or.    ** a f
20da0 6f 72 77 61 72 64 20 6f 72 64 65 72 20 73 63 61  orward order sca
20db0 6e 20 6f 6e 20 61 20 64 65 73 63 65 6e 64 69 6e  n on a descendin
20dc0 67 20 69 6e 64 65 78 2c 20 69 6e 74 65 72 63 68  g index, interch
20dd0 61 6e 67 65 20 74 68 65 20 0a 20 20 20 20 2a 2a  ange the .    **
20de0 20 73 74 61 72 74 20 61 6e 64 20 65 6e 64 20 74   start and end t
20df0 65 72 6d 73 20 28 70 52 61 6e 67 65 53 74 61 72  erms (pRangeStar
20e00 74 20 61 6e 64 20 70 52 61 6e 67 65 45 6e 64 29  t and pRangeEnd)
20e10 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
20e20 20 28 6e 45 71 3c 70 49 64 78 2d 3e 6e 4b 65 79   (nEq<pIdx->nKey
20e30 43 6f 6c 20 26 26 20 62 52 65 76 3d 3d 28 70 49  Col && bRev==(pI
20e40 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6e  dx->aSortOrder[n
20e50 45 71 5d 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 41  Eq]==SQLITE_SO_A
20e60 53 43 29 29 0a 20 20 20 20 20 7c 7c 20 28 62 52  SC)).     || (bR
20e70 65 76 20 26 26 20 70 49 64 78 2d 3e 6e 4b 65 79  ev && pIdx->nKey
20e80 43 6f 6c 3d 3d 6e 45 71 29 0a 20 20 20 20 29 7b  Col==nEq).    ){
20e90 0a 20 20 20 20 20 20 53 57 41 50 28 57 68 65 72  .      SWAP(Wher
20ea0 65 54 65 72 6d 20 2a 2c 20 70 52 61 6e 67 65 45  eTerm *, pRangeE
20eb0 6e 64 2c 20 70 52 61 6e 67 65 53 74 61 72 74 29  nd, pRangeStart)
20ec0 3b 0a 20 20 20 20 20 20 53 57 41 50 28 75 38 2c  ;.      SWAP(u8,
20ed0 20 62 53 65 65 6b 50 61 73 74 4e 75 6c 6c 2c 20   bSeekPastNull, 
20ee0 62 53 74 6f 70 41 74 4e 75 6c 6c 29 3b 0a 20 20  bStopAtNull);.  
20ef0 20 20 7d 0a 0a 20 20 20 20 74 65 73 74 63 61 73    }..    testcas
20f00 65 28 20 70 52 61 6e 67 65 53 74 61 72 74 20 26  e( pRangeStart &
20f10 26 20 28 70 52 61 6e 67 65 53 74 61 72 74 2d 3e  & (pRangeStart->
20f20 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 4c  eOperator & WO_L
20f30 45 29 21 3d 30 20 29 3b 0a 20 20 20 20 74 65 73  E)!=0 );.    tes
20f40 74 63 61 73 65 28 20 70 52 61 6e 67 65 53 74 61  tcase( pRangeSta
20f50 72 74 20 26 26 20 28 70 52 61 6e 67 65 53 74 61  rt && (pRangeSta
20f60 72 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rt->eOperator & 
20f70 57 4f 5f 47 45 29 21 3d 30 20 29 3b 0a 20 20 20  WO_GE)!=0 );.   
20f80 20 74 65 73 74 63 61 73 65 28 20 70 52 61 6e 67   testcase( pRang
20f90 65 45 6e 64 20 26 26 20 28 70 52 61 6e 67 65 45  eEnd && (pRangeE
20fa0 6e 64 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  nd->eOperator & 
20fb0 57 4f 5f 4c 45 29 21 3d 30 20 29 3b 0a 20 20 20  WO_LE)!=0 );.   
20fc0 20 74 65 73 74 63 61 73 65 28 20 70 52 61 6e 67   testcase( pRang
20fd0 65 45 6e 64 20 26 26 20 28 70 52 61 6e 67 65 45  eEnd && (pRangeE
20fe0 6e 64 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  nd->eOperator & 
20ff0 57 4f 5f 47 45 29 21 3d 30 20 29 3b 0a 20 20 20  WO_GE)!=0 );.   
21000 20 73 74 61 72 74 45 71 20 3d 20 21 70 52 61 6e   startEq = !pRan
21010 67 65 53 74 61 72 74 20 7c 7c 20 70 52 61 6e 67  geStart || pRang
21020 65 53 74 61 72 74 2d 3e 65 4f 70 65 72 61 74 6f  eStart->eOperato
21030 72 20 26 20 28 57 4f 5f 4c 45 7c 57 4f 5f 47 45  r & (WO_LE|WO_GE
21040 29 3b 0a 20 20 20 20 65 6e 64 45 71 20 3d 20 20  );.    endEq =  
21050 20 21 70 52 61 6e 67 65 45 6e 64 20 7c 7c 20 70   !pRangeEnd || p
21060 52 61 6e 67 65 45 6e 64 2d 3e 65 4f 70 65 72 61  RangeEnd->eOpera
21070 74 6f 72 20 26 20 28 57 4f 5f 4c 45 7c 57 4f 5f  tor & (WO_LE|WO_
21080 47 45 29 3b 0a 20 20 20 20 73 74 61 72 74 5f 63  GE);.    start_c
21090 6f 6e 73 74 72 61 69 6e 74 73 20 3d 20 70 52 61  onstraints = pRa
210a0 6e 67 65 53 74 61 72 74 20 7c 7c 20 6e 45 71 3e  ngeStart || nEq>
210b0 30 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 65 6b 20  0;..    /* Seek 
210c0 74 68 65 20 69 6e 64 65 78 20 63 75 72 73 6f 72  the index cursor
210d0 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66   to the start of
210e0 20 74 68 65 20 72 61 6e 67 65 2e 20 2a 2f 0a 20   the range. */. 
210f0 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d     nConstraint =
21100 20 6e 45 71 3b 0a 20 20 20 20 69 66 28 20 70 52   nEq;.    if( pR
21110 61 6e 67 65 53 74 61 72 74 20 29 7b 0a 20 20 20  angeStart ){.   
21120 20 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 20     Expr *pRight 
21130 3d 20 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 70  = pRangeStart->p
21140 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20  Expr->pRight;.  
21150 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
21160 6f 64 65 28 70 50 61 72 73 65 2c 20 70 52 69 67  ode(pParse, pRig
21170 68 74 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 29  ht, regBase+nEq)
21180 3b 0a 20 20 20 20 20 20 77 68 65 72 65 4c 69 6b  ;.      whereLik
21190 65 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 53 74 72  eOptimizationStr
211a0 69 6e 67 46 69 78 75 70 28 76 2c 20 70 4c 65 76  ingFixup(v, pLev
211b0 65 6c 2c 20 70 52 61 6e 67 65 53 74 61 72 74 29  el, pRangeStart)
211c0 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 52 61  ;.      if( (pRa
211d0 6e 67 65 53 74 61 72 74 2d 3e 77 74 46 6c 61 67  ngeStart->wtFlag
211e0 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d  s & TERM_VNULL)=
211f0 3d 30 0a 20 20 20 20 20 20 20 26 26 20 73 71 6c  =0.       && sql
21200 69 74 65 33 45 78 70 72 43 61 6e 42 65 4e 75 6c  ite3ExprCanBeNul
21210 6c 28 70 52 69 67 68 74 29 0a 20 20 20 20 20 20  l(pRight).      
21220 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
21230 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
21240 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 65 67 42 61  OP_IsNull, regBa
21250 73 65 2b 6e 45 71 2c 20 61 64 64 72 4e 78 74 29  se+nEq, addrNxt)
21260 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
21270 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
21280 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 53 74   }.      if( zSt
21290 61 72 74 41 66 66 20 29 7b 0a 20 20 20 20 20 20  artAff ){.      
212a0 20 20 69 66 28 20 73 71 6c 69 74 65 33 43 6f 6d    if( sqlite3Com
212b0 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 52 69  pareAffinity(pRi
212c0 67 68 74 2c 20 7a 53 74 61 72 74 41 66 66 5b 6e  ght, zStartAff[n
212d0 45 71 5d 29 3d 3d 53 51 4c 49 54 45 5f 41 46 46  Eq])==SQLITE_AFF
212e0 5f 4e 4f 4e 45 29 7b 0a 20 20 20 20 20 20 20 20  _NONE){.        
212f0 20 20 2f 2a 20 53 69 6e 63 65 20 74 68 65 20 63    /* Since the c
21300 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 74 6f 20  omparison is to 
21310 62 65 20 70 65 72 66 6f 72 6d 65 64 20 77 69 74  be performed wit
21320 68 20 6e 6f 20 63 6f 6e 76 65 72 73 69 6f 6e 73  h no conversions
21330 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 70  .          ** ap
21340 70 6c 69 65 64 20 74 6f 20 74 68 65 20 6f 70 65  plied to the ope
21350 72 61 6e 64 73 2c 20 73 65 74 20 74 68 65 20 61  rands, set the a
21360 66 66 69 6e 69 74 79 20 74 6f 20 61 70 70 6c 79  ffinity to apply
21370 20 74 6f 20 70 52 69 67 68 74 20 74 6f 20 0a 20   to pRight to . 
21380 20 20 20 20 20 20 20 20 20 2a 2a 20 53 51 4c 49           ** SQLI
21390 54 45 5f 41 46 46 5f 4e 4f 4e 45 2e 20 20 2a 2f  TE_AFF_NONE.  */
213a0 0a 20 20 20 20 20 20 20 20 20 20 7a 53 74 61 72  .          zStar
213b0 74 41 66 66 5b 6e 45 71 5d 20 3d 20 53 51 4c 49  tAff[nEq] = SQLI
213c0 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20  TE_AFF_NONE;.   
213d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
213e0 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 4e 65  f( sqlite3ExprNe
213f0 65 64 73 4e 6f 41 66 66 69 6e 69 74 79 43 68 61  edsNoAffinityCha
21400 6e 67 65 28 70 52 69 67 68 74 2c 20 7a 53 74 61  nge(pRight, zSta
21410 72 74 41 66 66 5b 6e 45 71 5d 29 20 29 7b 0a 20  rtAff[nEq]) ){. 
21420 20 20 20 20 20 20 20 20 20 7a 53 74 61 72 74 41           zStartA
21430 66 66 5b 6e 45 71 5d 20 3d 20 53 51 4c 49 54 45  ff[nEq] = SQLITE
21440 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20  _AFF_NONE;.     
21450 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 20 0a 20     }.      }  . 
21460 20 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74       nConstraint
21470 2b 2b 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  ++;.      testca
21480 73 65 28 20 70 52 61 6e 67 65 53 74 61 72 74 2d  se( pRangeStart-
21490 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
214a0 56 49 52 54 55 41 4c 20 29 3b 0a 20 20 20 20 7d  VIRTUAL );.    }
214b0 65 6c 73 65 20 69 66 28 20 62 53 65 65 6b 50 61  else if( bSeekPa
214c0 73 74 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20  stNull ){.      
214d0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
214e0 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  2(v, OP_Null, 0,
214f0 20 72 65 67 42 61 73 65 2b 6e 45 71 29 3b 0a 20   regBase+nEq);. 
21500 20 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74       nConstraint
21510 2b 2b 3b 0a 20 20 20 20 20 20 73 74 61 72 74 45  ++;.      startE
21520 71 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 74 61  q = 0;.      sta
21530 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 3d  rt_constraints =
21540 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 6f   1;.    }.    co
21550 64 65 41 70 70 6c 79 41 66 66 69 6e 69 74 79 28  deApplyAffinity(
21560 70 50 61 72 73 65 2c 20 72 65 67 42 61 73 65 2c  pParse, regBase,
21570 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20 2d 20 62   nConstraint - b
21580 53 65 65 6b 50 61 73 74 4e 75 6c 6c 2c 20 7a 53  SeekPastNull, zS
21590 74 61 72 74 41 66 66 29 3b 0a 20 20 20 20 6f 70  tartAff);.    op
215a0 20 3d 20 61 53 74 61 72 74 4f 70 5b 28 73 74 61   = aStartOp[(sta
215b0 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 3c 3c  rt_constraints<<
215c0 32 29 20 2b 20 28 73 74 61 72 74 45 71 3c 3c 31  2) + (startEq<<1
215d0 29 20 2b 20 62 52 65 76 5d 3b 0a 20 20 20 20 61  ) + bRev];.    a
215e0 73 73 65 72 74 28 20 6f 70 21 3d 30 20 29 3b 0a  ssert( op!=0 );.
215f0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
21600 64 64 4f 70 34 49 6e 74 28 76 2c 20 6f 70 2c 20  ddOp4Int(v, op, 
21610 69 49 64 78 43 75 72 2c 20 61 64 64 72 4e 78 74  iIdxCur, addrNxt
21620 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f 6e 73  , regBase, nCons
21630 74 72 61 69 6e 74 29 3b 0a 20 20 20 20 56 64 62  traint);.    Vdb
21640 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
21650 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
21660 28 76 2c 20 6f 70 3d 3d 4f 50 5f 52 65 77 69 6e  (v, op==OP_Rewin
21670 64 29 3b 20 20 74 65 73 74 63 61 73 65 28 20 6f  d);  testcase( o
21680 70 3d 3d 4f 50 5f 52 65 77 69 6e 64 20 29 3b 0a  p==OP_Rewind );.
21690 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
216a0 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 4c 61 73  If(v, op==OP_Las
216b0 74 29 3b 20 20 20 20 74 65 73 74 63 61 73 65 28  t);    testcase(
216c0 20 6f 70 3d 3d 4f 50 5f 4c 61 73 74 20 29 3b 0a   op==OP_Last );.
216d0 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
216e0 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 53 65 65  If(v, op==OP_See
216f0 6b 47 54 29 3b 20 20 74 65 73 74 63 61 73 65 28  kGT);  testcase(
21700 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 47 54 20 29   op==OP_SeekGT )
21710 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61  ;.    VdbeCovera
21720 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 53  geIf(v, op==OP_S
21730 65 65 6b 47 45 29 3b 20 20 74 65 73 74 63 61 73  eekGE);  testcas
21740 65 28 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 47 45  e( op==OP_SeekGE
21750 20 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65   );.    VdbeCove
21760 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50  rageIf(v, op==OP
21770 5f 53 65 65 6b 4c 45 29 3b 20 20 74 65 73 74 63  _SeekLE);  testc
21780 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b  ase( op==OP_Seek
21790 4c 45 20 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  LE );.    VdbeCo
217a0 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
217b0 4f 50 5f 53 65 65 6b 4c 54 29 3b 20 20 74 65 73  OP_SeekLT);  tes
217c0 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 53 65  tcase( op==OP_Se
217d0 65 6b 4c 54 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  ekLT );..    /* 
217e0 4c 6f 61 64 20 74 68 65 20 76 61 6c 75 65 20 66  Load the value f
217f0 6f 72 20 74 68 65 20 69 6e 65 71 75 61 6c 69 74  or the inequalit
21800 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 74 20  y constraint at 
21810 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 20  the end of the. 
21820 20 20 20 2a 2a 20 72 61 6e 67 65 20 28 69 66 20     ** range (if 
21830 61 6e 79 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  any)..    */.   
21840 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 6e   nConstraint = n
21850 45 71 3b 0a 20 20 20 20 69 66 28 20 70 52 61 6e  Eq;.    if( pRan
21860 67 65 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 45  geEnd ){.      E
21870 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70 52  xpr *pRight = pR
21880 61 6e 67 65 45 6e 64 2d 3e 70 45 78 70 72 2d 3e  angeEnd->pExpr->
21890 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 73 71  pRight;.      sq
218a0 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 52 65  lite3ExprCacheRe
218b0 6d 6f 76 65 28 70 50 61 72 73 65 2c 20 72 65 67  move(pParse, reg
218c0 42 61 73 65 2b 6e 45 71 2c 20 31 29 3b 0a 20 20  Base+nEq, 1);.  
218d0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
218e0 6f 64 65 28 70 50 61 72 73 65 2c 20 70 52 69 67  ode(pParse, pRig
218f0 68 74 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 29  ht, regBase+nEq)
21900 3b 0a 20 20 20 20 20 20 77 68 65 72 65 4c 69 6b  ;.      whereLik
21910 65 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 53 74 72  eOptimizationStr
21920 69 6e 67 46 69 78 75 70 28 76 2c 20 70 4c 65 76  ingFixup(v, pLev
21930 65 6c 2c 20 70 52 61 6e 67 65 45 6e 64 29 3b 0a  el, pRangeEnd);.
21940 20 20 20 20 20 20 69 66 28 20 28 70 52 61 6e 67        if( (pRang
21950 65 45 6e 64 2d 3e 77 74 46 6c 61 67 73 20 26 20  eEnd->wtFlags & 
21960 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 0a 20  TERM_VNULL)==0. 
21970 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
21980 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28 70 52  ExprCanBeNull(pR
21990 69 67 68 74 29 0a 20 20 20 20 20 20 29 7b 0a 20  ight).      ){. 
219a0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
219b0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
219c0 73 4e 75 6c 6c 2c 20 72 65 67 42 61 73 65 2b 6e  sNull, regBase+n
219d0 45 71 2c 20 61 64 64 72 4e 78 74 29 3b 0a 20 20  Eq, addrNxt);.  
219e0 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
219f0 67 65 28 76 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ge(v);.      }. 
21a00 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
21a10 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28  CompareAffinity(
21a20 70 52 69 67 68 74 2c 20 63 45 6e 64 41 66 66 29  pRight, cEndAff)
21a30 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  !=SQLITE_AFF_NON
21a40 45 0a 20 20 20 20 20 20 20 26 26 20 21 73 71 6c  E.       && !sql
21a50 69 74 65 33 45 78 70 72 4e 65 65 64 73 4e 6f 41  ite3ExprNeedsNoA
21a60 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 52  ffinityChange(pR
21a70 69 67 68 74 2c 20 63 45 6e 64 41 66 66 29 0a 20  ight, cEndAff). 
21a80 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
21a90 63 6f 64 65 41 70 70 6c 79 41 66 66 69 6e 69 74  codeApplyAffinit
21aa0 79 28 70 50 61 72 73 65 2c 20 72 65 67 42 61 73  y(pParse, regBas
21ab0 65 2b 6e 45 71 2c 20 31 2c 20 26 63 45 6e 64 41  e+nEq, 1, &cEndA
21ac0 66 66 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ff);.      }.   
21ad0 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 2b     nConstraint++
21ae0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
21af0 28 20 70 52 61 6e 67 65 45 6e 64 2d 3e 77 74 46  ( pRangeEnd->wtF
21b00 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54  lags & TERM_VIRT
21b10 55 41 4c 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65  UAL );.    }else
21b20 20 69 66 28 20 62 53 74 6f 70 41 74 4e 75 6c 6c   if( bStopAtNull
21b30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
21b40 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
21b50 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65 67 42 61  P_Null, 0, regBa
21b60 73 65 2b 6e 45 71 29 3b 0a 20 20 20 20 20 20 65  se+nEq);.      e
21b70 6e 64 45 71 20 3d 20 30 3b 0a 20 20 20 20 20 20  ndEq = 0;.      
21b80 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b 0a 20  nConstraint++;. 
21b90 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
21ba0 44 62 46 72 65 65 28 64 62 2c 20 7a 53 74 61 72  DbFree(db, zStar
21bb0 74 41 66 66 29 3b 0a 0a 20 20 20 20 2f 2a 20 54  tAff);..    /* T
21bc0 6f 70 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 62  op of the loop b
21bd0 6f 64 79 20 2a 2f 0a 20 20 20 20 70 4c 65 76 65  ody */.    pLeve
21be0 6c 2d 3e 70 32 20 3d 20 73 71 6c 69 74 65 33 56  l->p2 = sqlite3V
21bf0 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
21c00 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b  );..    /* Check
21c10 20 69 66 20 74 68 65 20 69 6e 64 65 78 20 63 75   if the index cu
21c20 72 73 6f 72 20 69 73 20 70 61 73 74 20 74 68 65  rsor is past the
21c30 20 65 6e 64 20 6f 66 20 74 68 65 20 72 61 6e 67   end of the rang
21c40 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 43  e. */.    if( nC
21c50 6f 6e 73 74 72 61 69 6e 74 20 29 7b 0a 20 20 20  onstraint ){.   
21c60 20 20 20 6f 70 20 3d 20 61 45 6e 64 4f 70 5b 62     op = aEndOp[b
21c70 52 65 76 2a 32 20 2b 20 65 6e 64 45 71 5d 3b 0a  Rev*2 + endEq];.
21c80 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
21c90 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 6f 70  eAddOp4Int(v, op
21ca0 2c 20 69 49 64 78 43 75 72 2c 20 61 64 64 72 4e  , iIdxCur, addrN
21cb0 78 74 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f  xt, regBase, nCo
21cc0 6e 73 74 72 61 69 6e 74 29 3b 0a 20 20 20 20 20  nstraint);.     
21cd0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f   testcase( op==O
21ce0 50 5f 49 64 78 47 54 20 29 3b 20 20 56 64 62 65  P_IdxGT );  Vdbe
21cf0 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70  CoverageIf(v, op
21d00 3d 3d 4f 50 5f 49 64 78 47 54 20 29 3b 0a 20 20  ==OP_IdxGT );.  
21d10 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
21d20 3d 3d 4f 50 5f 49 64 78 47 45 20 29 3b 20 20 56  ==OP_IdxGE );  V
21d30 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
21d40 20 6f 70 3d 3d 4f 50 5f 49 64 78 47 45 20 29 3b   op==OP_IdxGE );
21d50 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
21d60 20 6f 70 3d 3d 4f 50 5f 49 64 78 4c 54 20 29 3b   op==OP_IdxLT );
21d70 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
21d80 28 76 2c 20 6f 70 3d 3d 4f 50 5f 49 64 78 4c 54  (v, op==OP_IdxLT
21d90 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
21da0 73 65 28 20 6f 70 3d 3d 4f 50 5f 49 64 78 4c 45  se( op==OP_IdxLE
21db0 20 29 3b 20 20 56 64 62 65 43 6f 76 65 72 61 67   );  VdbeCoverag
21dc0 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 49 64  eIf(v, op==OP_Id
21dd0 78 4c 45 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  xLE );.    }..  
21de0 20 20 2f 2a 20 53 65 65 6b 20 74 68 65 20 74 61    /* Seek the ta
21df0 62 6c 65 20 63 75 72 73 6f 72 2c 20 69 66 20 72  ble cursor, if r
21e00 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 20 20 64  equired */.    d
21e10 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65  isableTerm(pLeve
21e20 6c 2c 20 70 52 61 6e 67 65 53 74 61 72 74 29 3b  l, pRangeStart);
21e30 0a 20 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d  .    disableTerm
21e40 28 70 4c 65 76 65 6c 2c 20 70 52 61 6e 67 65 45  (pLevel, pRangeE
21e50 6e 64 29 3b 0a 20 20 20 20 69 66 28 20 6f 6d 69  nd);.    if( omi
21e60 74 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20  tTable ){.      
21e70 2f 2a 20 70 49 64 78 20 69 73 20 61 20 63 6f 76  /* pIdx is a cov
21e80 65 72 69 6e 67 20 69 6e 64 65 78 2e 20 20 4e 6f  ering index.  No
21e90 20 6e 65 65 64 20 74 6f 20 61 63 63 65 73 73 20   need to access 
21ea0 74 68 65 20 6d 61 69 6e 20 74 61 62 6c 65 2e 20  the main table. 
21eb0 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  */.    }else if(
21ec0 20 48 61 73 52 6f 77 69 64 28 70 49 64 78 2d 3e   HasRowid(pIdx->
21ed0 70 54 61 62 6c 65 29 20 29 7b 0a 20 20 20 20 20  pTable) ){.     
21ee0 20 69 52 6f 77 69 64 52 65 67 20 3d 20 2b 2b 70   iRowidReg = ++p
21ef0 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
21f00 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
21f10 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 52 6f  dOp2(v, OP_IdxRo
21f20 77 69 64 2c 20 69 49 64 78 43 75 72 2c 20 69 52  wid, iIdxCur, iR
21f30 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20 20 20  owidReg);.      
21f40 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
21f50 53 74 6f 72 65 28 70 50 61 72 73 65 2c 20 69 43  Store(pParse, iC
21f60 75 72 2c 20 2d 31 2c 20 69 52 6f 77 69 64 52 65  ur, -1, iRowidRe
21f70 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  g);.      sqlite
21f80 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
21f90 50 5f 53 65 65 6b 2c 20 69 43 75 72 2c 20 69 52  P_Seek, iCur, iR
21fa0 6f 77 69 64 52 65 67 29 3b 20 20 2f 2a 20 44 65  owidReg);  /* De
21fb0 66 65 72 72 65 64 20 73 65 65 6b 20 2a 2f 0a 20  ferred seek */. 
21fc0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 43 75     }else if( iCu
21fd0 72 21 3d 69 49 64 78 43 75 72 20 29 7b 0a 20 20  r!=iIdxCur ){.  
21fe0 20 20 20 20 49 6e 64 65 78 20 2a 70 50 6b 20 3d      Index *pPk =
21ff0 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b   sqlite3PrimaryK
22000 65 79 49 6e 64 65 78 28 70 49 64 78 2d 3e 70 54  eyIndex(pIdx->pT
22010 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 69 52 6f  able);.      iRo
22020 77 69 64 52 65 67 20 3d 20 73 71 6c 69 74 65 33  widReg = sqlite3
22030 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61  GetTempRange(pPa
22040 72 73 65 2c 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f  rse, pPk->nKeyCo
22050 6c 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d  l);.      for(j=
22060 30 3b 20 6a 3c 70 50 6b 2d 3e 6e 4b 65 79 43 6f  0; j<pPk->nKeyCo
22070 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; j++){.       
22080 20 6b 20 3d 20 73 71 6c 69 74 65 33 43 6f 6c 75   k = sqlite3Colu
22090 6d 6e 4f 66 49 6e 64 65 78 28 70 49 64 78 2c 20  mnOfIndex(pIdx, 
220a0 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d  pPk->aiColumn[j]
220b0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
220c0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
220d0 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 49 64 78 43  OP_Column, iIdxC
220e0 75 72 2c 20 6b 2c 20 69 52 6f 77 69 64 52 65 67  ur, k, iRowidReg
220f0 2b 6a 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  +j);.      }.   
22100 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
22110 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 4e 6f  dOp4Int(v, OP_No
22120 74 46 6f 75 6e 64 2c 20 69 43 75 72 2c 20 61 64  tFound, iCur, ad
22130 64 72 43 6f 6e 74 2c 0a 20 20 20 20 20 20 20 20  drCont,.        
22140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22150 20 20 20 69 52 6f 77 69 64 52 65 67 2c 20 70 50     iRowidReg, pP
22160 6b 2d 3e 6e 4b 65 79 43 6f 6c 29 3b 20 56 64 62  k->nKeyCol); Vdb
22170 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
22180 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 63 6f    }..    /* Reco
22190 72 64 20 74 68 65 20 69 6e 73 74 72 75 63 74 69  rd the instructi
221a0 6f 6e 20 75 73 65 64 20 74 6f 20 74 65 72 6d 69  on used to termi
221b0 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 2e 20 44  nate the loop. D
221c0 69 73 61 62 6c 65 20 0a 20 20 20 20 2a 2a 20 57  isable .    ** W
221d0 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d  HERE clause term
221e0 73 20 6d 61 64 65 20 72 65 64 75 6e 64 61 6e 74  s made redundant
221f0 20 62 79 20 74 68 65 20 69 6e 64 65 78 20 72 61   by the index ra
22200 6e 67 65 20 73 63 61 6e 2e 0a 20 20 20 20 2a 2f  nge scan..    */
22210 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e  .    if( pLoop->
22220 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
22230 4f 4e 45 52 4f 57 20 29 7b 0a 20 20 20 20 20 20  ONEROW ){.      
22240 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f  pLevel->op = OP_
22250 4e 6f 6f 70 3b 0a 20 20 20 20 7d 65 6c 73 65 20  Noop;.    }else 
22260 69 66 28 20 62 52 65 76 20 29 7b 0a 20 20 20 20  if( bRev ){.    
22270 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f    pLevel->op = O
22280 50 5f 50 72 65 76 3b 0a 20 20 20 20 7d 65 6c 73  P_Prev;.    }els
22290 65 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d  e{.      pLevel-
222a0 3e 6f 70 20 3d 20 4f 50 5f 4e 65 78 74 3b 0a 20  >op = OP_Next;. 
222b0 20 20 20 7d 0a 20 20 20 20 70 4c 65 76 65 6c 2d     }.    pLevel-
222c0 3e 70 31 20 3d 20 69 49 64 78 43 75 72 3b 0a 20  >p1 = iIdxCur;. 
222d0 20 20 20 70 4c 65 76 65 6c 2d 3e 70 33 20 3d 20     pLevel->p3 = 
222e0 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 26  (pLoop->wsFlags&
222f0 57 48 45 52 45 5f 55 4e 51 5f 57 41 4e 54 45 44  WHERE_UNQ_WANTED
22300 29 21 3d 30 20 3f 20 31 3a 30 3b 0a 20 20 20 20  )!=0 ? 1:0;.    
22310 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c  if( (pLoop->wsFl
22320 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4e 53  ags & WHERE_CONS
22330 54 52 41 49 4e 54 29 3d 3d 30 20 29 7b 0a 20 20  TRAINT)==0 ){.  
22340 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 35 20 3d      pLevel->p5 =
22350 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54   SQLITE_STMTSTAT
22360 55 53 5f 46 55 4c 4c 53 43 41 4e 5f 53 54 45 50  US_FULLSCAN_STEP
22370 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
22380 20 20 20 61 73 73 65 72 74 28 20 70 4c 65 76 65     assert( pLeve
22390 6c 2d 3e 70 35 3d 3d 30 20 29 3b 0a 20 20 20 20  l->p5==0 );.    
223a0 7d 0a 20 20 7d 65 6c 73 65 0a 0a 23 69 66 6e 64  }.  }else..#ifnd
223b0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f  ef SQLITE_OMIT_O
223c0 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 20  R_OPTIMIZATION. 
223d0 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c   if( pLoop->wsFl
223e0 61 67 73 20 26 20 57 48 45 52 45 5f 4d 55 4c 54  ags & WHERE_MULT
223f0 49 5f 4f 52 20 29 7b 0a 20 20 20 20 2f 2a 20 43  I_OR ){.    /* C
22400 61 73 65 20 35 3a 20 20 54 77 6f 20 6f 72 20 6d  ase 5:  Two or m
22410 6f 72 65 20 73 65 70 61 72 61 74 65 6c 79 20 69  ore separately i
22420 6e 64 65 78 65 64 20 74 65 72 6d 73 20 63 6f 6e  ndexed terms con
22430 6e 65 63 74 65 64 20 62 79 20 4f 52 0a 20 20 20  nected by OR.   
22440 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 78 61 6d 70   **.    ** Examp
22450 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  le:.    **.    *
22460 2a 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45  *   CREATE TABLE
22470 20 74 31 28 61 2c 62 2c 63 2c 64 29 3b 0a 20 20   t1(a,b,c,d);.  
22480 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20 49 4e    **   CREATE IN
22490 44 45 58 20 69 31 20 4f 4e 20 74 31 28 61 29 3b  DEX i1 ON t1(a);
224a0 0a 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45  .    **   CREATE
224b0 20 49 4e 44 45 58 20 69 32 20 4f 4e 20 74 31 28   INDEX i2 ON t1(
224c0 62 29 3b 0a 20 20 20 20 2a 2a 20 20 20 43 52 45  b);.    **   CRE
224d0 41 54 45 20 49 4e 44 45 58 20 69 33 20 4f 4e 20  ATE INDEX i3 ON 
224e0 74 31 28 63 29 3b 0a 20 20 20 20 2a 2a 0a 20 20  t1(c);.    **.  
224f0 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a 20    **   SELECT * 
22500 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3d  FROM t1 WHERE a=
22510 35 20 4f 52 20 62 3d 37 20 4f 52 20 28 63 3d 31  5 OR b=7 OR (c=1
22520 31 20 41 4e 44 20 64 3d 31 33 29 0a 20 20 20 20  1 AND d=13).    
22530 2a 2a 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68 65  **.    ** In the
22540 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 72 65 20   example, there 
22550 61 72 65 20 74 68 72 65 65 20 69 6e 64 65 78 65  are three indexe
22560 64 20 74 65 72 6d 73 20 63 6f 6e 6e 65 63 74 65  d terms connecte
22570 64 20 62 79 20 4f 52 2e 0a 20 20 20 20 2a 2a 20  d by OR..    ** 
22580 54 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 6c  The top of the l
22590 6f 6f 70 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 74  oop looks like t
225a0 68 69 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  his:.    **.    
225b0 2a 2a 20 20 20 20 20 20 20 20 20 20 4e 75 6c 6c  **          Null
225c0 20 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20         1        
225d0 20 20 20 20 20 20 20 20 23 20 5a 65 72 6f 20 74          # Zero t
225e0 68 65 20 72 6f 77 73 65 74 20 69 6e 20 72 65 67  he rowset in reg
225f0 20 31 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a   1.    **.    **
22600 20 54 68 65 6e 2c 20 66 6f 72 20 65 61 63 68 20   Then, for each 
22610 69 6e 64 65 78 65 64 20 74 65 72 6d 2c 20 74 68  indexed term, th
22620 65 20 66 6f 6c 6c 6f 77 69 6e 67 2e 20 54 68 65  e following. The
22630 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 0a 20 20   arguments to.  
22640 20 20 2a 2a 20 52 6f 77 53 65 74 54 65 73 74 20    ** RowSetTest 
22650 61 72 65 20 73 75 63 68 20 74 68 61 74 20 74 68  are such that th
22660 65 20 72 6f 77 69 64 20 6f 66 20 74 68 65 20 63  e rowid of the c
22670 75 72 72 65 6e 74 20 72 6f 77 20 69 73 20 69 6e  urrent row is in
22680 73 65 72 74 65 64 0a 20 20 20 20 2a 2a 20 69 6e  serted.    ** in
22690 74 6f 20 74 68 65 20 52 6f 77 53 65 74 2e 20 49  to the RowSet. I
226a0 66 20 69 74 20 69 73 20 61 6c 72 65 61 64 79 20  f it is already 
226b0 70 72 65 73 65 6e 74 2c 20 63 6f 6e 74 72 6f 6c  present, control
226c0 20 73 6b 69 70 73 20 74 68 65 0a 20 20 20 20 2a   skips the.    *
226d0 2a 20 47 6f 73 75 62 20 6f 70 63 6f 64 65 20 61  * Gosub opcode a
226e0 6e 64 20 6a 75 6d 70 73 20 73 74 72 61 69 67 68  nd jumps straigh
226f0 74 20 74 6f 20 74 68 65 20 63 6f 64 65 20 67 65  t to the code ge
22700 6e 65 72 61 74 65 64 20 62 79 20 57 68 65 72 65  nerated by Where
22710 45 6e 64 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20  End()..    **.  
22720 20 20 2a 2a 20 20 20 20 20 20 20 20 73 71 6c 69    **        sqli
22730 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 3c 74  te3WhereBegin(<t
22740 65 72 6d 3e 29 0a 20 20 20 20 2a 2a 20 20 20 20  erm>).    **    
22750 20 20 20 20 20 20 52 6f 77 53 65 74 54 65 73 74        RowSetTest
22760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22770 20 20 23 20 49 6e 73 65 72 74 20 72 6f 77 69 64    # Insert rowid
22780 20 69 6e 74 6f 20 72 6f 77 73 65 74 0a 20 20 20   into rowset.   
22790 20 2a 2a 20 20 20 20 20 20 20 20 20 20 47 6f 73   **          Gos
227a0 75 62 20 20 20 20 20 20 32 20 41 0a 20 20 20 20  ub      2 A.    
227b0 2a 2a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  **        sqlite
227c0 33 57 68 65 72 65 45 6e 64 28 29 0a 20 20 20 20  3WhereEnd().    
227d0 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 6c 6c 6f 77  **.    ** Follow
227e0 69 6e 67 20 74 68 65 20 61 62 6f 76 65 2c 20 63  ing the above, c
227f0 6f 64 65 20 74 6f 20 74 65 72 6d 69 6e 61 74 65  ode to terminate
22800 20 74 68 65 20 6c 6f 6f 70 2e 20 4c 61 62 65 6c   the loop. Label
22810 20 41 2c 20 74 68 65 20 74 61 72 67 65 74 0a 20   A, the target. 
22820 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 47 6f 73     ** of the Gos
22830 75 62 20 61 62 6f 76 65 2c 20 6a 75 6d 70 73 20  ub above, jumps 
22840 74 6f 20 74 68 65 20 69 6e 73 74 72 75 63 74 69  to the instructi
22850 6f 6e 20 72 69 67 68 74 20 61 66 74 65 72 20 74  on right after t
22860 68 65 20 47 6f 74 6f 2e 0a 20 20 20 20 2a 2a 0a  he Goto..    **.
22870 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
22880 4e 75 6c 6c 20 20 20 20 20 20 20 31 20 20 20 20  Null       1    
22890 20 20 20 20 20 20 20 20 20 20 20 20 23 20 5a 65              # Ze
228a0 72 6f 20 74 68 65 20 72 6f 77 73 65 74 20 69 6e  ro the rowset in
228b0 20 72 65 67 20 31 0a 20 20 20 20 2a 2a 20 20 20   reg 1.    **   
228c0 20 20 20 20 20 20 20 47 6f 74 6f 20 20 20 20 20         Goto     
228d0 20 20 42 20 20 20 20 20 20 20 20 20 20 20 20 20    B             
228e0 20 20 20 23 20 54 68 65 20 6c 6f 6f 70 20 69 73     # The loop is
228f0 20 66 69 6e 69 73 68 65 64 2e 0a 20 20 20 20 2a   finished..    *
22900 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 41  *.    **       A
22910 3a 20 3c 6c 6f 6f 70 20 62 6f 64 79 3e 20 20 20  : <loop body>   
22920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
22930 52 65 74 75 72 6e 20 64 61 74 61 2c 20 77 68 61  Return data, wha
22940 74 65 76 65 72 2e 0a 20 20 20 20 2a 2a 0a 20 20  tever..    **.  
22950 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 52 65    **          Re
22960 74 75 72 6e 20 20 20 20 20 32 20 20 20 20 20 20  turn     2      
22970 20 20 20 20 20 20 20 20 20 20 23 20 4a 75 6d 70            # Jump
22980 20 62 61 63 6b 20 74 6f 20 74 68 65 20 47 6f 73   back to the Gos
22990 75 62 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  ub.    **.    **
229a0 20 20 20 20 20 20 20 42 3a 20 3c 61 66 74 65 72         B: <after
229b0 20 74 68 65 20 6c 6f 6f 70 3e 0a 20 20 20 20 2a   the loop>.    *
229c0 2a 0a 20 20 20 20 2a 2a 20 41 64 64 65 64 20 32  *.    ** Added 2
229d0 30 31 34 2d 30 35 2d 32 36 3a 20 49 66 20 74 68  014-05-26: If th
229e0 65 20 74 61 62 6c 65 20 69 73 20 61 20 57 49 54  e table is a WIT
229f0 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65  HOUT ROWID table
22a00 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 75 73  , then.    ** us
22a10 65 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 69  e an ephemeral i
22a20 6e 64 65 78 20 69 6e 73 74 65 61 64 20 6f 66 20  ndex instead of 
22a30 61 20 52 6f 77 53 65 74 20 74 6f 20 72 65 63 6f  a RowSet to reco
22a40 72 64 20 74 68 65 20 70 72 69 6d 61 72 79 0a 20  rd the primary. 
22a50 20 20 20 2a 2a 20 6b 65 79 73 20 6f 66 20 74 68     ** keys of th
22a60 65 20 72 6f 77 73 20 77 65 20 68 61 76 65 20 61  e rows we have a
22a70 6c 72 65 61 64 79 20 73 65 65 6e 2e 0a 20 20 20  lready seen..   
22a80 20 2a 2a 0a 20 20 20 20 2a 2f 0a 20 20 20 20 57   **.    */.    W
22a90 68 65 72 65 43 6c 61 75 73 65 20 2a 70 4f 72 57  hereClause *pOrW
22aa0 63 3b 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 2d  c;    /* The OR-
22ab0 63 6c 61 75 73 65 20 62 72 6f 6b 65 6e 20 6f 75  clause broken ou
22ac0 74 20 69 6e 74 6f 20 73 75 62 74 65 72 6d 73 20  t into subterms 
22ad0 2a 2f 0a 20 20 20 20 53 72 63 4c 69 73 74 20 2a  */.    SrcList *
22ae0 70 4f 72 54 61 62 3b 20 20 20 20 20 20 20 2f 2a  pOrTab;       /*
22af0 20 53 68 6f 72 74 65 6e 65 64 20 74 61 62 6c 65   Shortened table
22b00 20 6c 69 73 74 20 6f 72 20 4f 52 2d 63 6c 61 75   list or OR-clau
22b10 73 65 20 67 65 6e 65 72 61 74 69 6f 6e 20 2a 2f  se generation */
22b20 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 43 6f 76  .    Index *pCov
22b30 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
22b40 20 20 2f 2a 20 50 6f 74 65 6e 74 69 61 6c 20 63    /* Potential c
22b50 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20 28 6f  overing index (o
22b60 72 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 20 20 69  r NULL) */.    i
22b70 6e 74 20 69 43 6f 76 43 75 72 20 3d 20 70 50 61  nt iCovCur = pPa
22b80 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 2f 2a  rse->nTab++;  /*
22b90 20 43 75 72 73 6f 72 20 75 73 65 64 20 66 6f 72   Cursor used for
22ba0 20 69 6e 64 65 78 20 73 63 61 6e 73 20 28 69 66   index scans (if
22bb0 20 61 6e 79 29 20 2a 2f 0a 0a 20 20 20 20 69 6e   any) */..    in
22bc0 74 20 72 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b  t regReturn = ++
22bd0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 20 20 20  pParse->nMem;   
22be0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73          /* Regis
22bf0 74 65 72 20 75 73 65 64 20 77 69 74 68 20 4f 50  ter used with OP
22c00 5f 47 6f 73 75 62 20 2a 2f 0a 20 20 20 20 69 6e  _Gosub */.    in
22c10 74 20 72 65 67 52 6f 77 73 65 74 20 3d 20 30 3b  t regRowset = 0;
22c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22c30 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73          /* Regis
22c40 74 65 72 20 66 6f 72 20 52 6f 77 53 65 74 20 6f  ter for RowSet o
22c50 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20 69 6e 74  bject */.    int
22c60 20 72 65 67 52 6f 77 69 64 20 3d 20 30 3b 20 20   regRowid = 0;  
22c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22c80 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74         /* Regist
22c90 65 72 20 68 6f 6c 64 69 6e 67 20 72 6f 77 69 64  er holding rowid
22ca0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 4c 6f 6f   */.    int iLoo
22cb0 70 42 6f 64 79 20 3d 20 73 71 6c 69 74 65 33 56  pBody = sqlite3V
22cc0 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
22cd0 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 6c 6f    /* Start of lo
22ce0 6f 70 20 62 6f 64 79 20 2a 2f 0a 20 20 20 20 69  op body */.    i
22cf0 6e 74 20 69 52 65 74 49 6e 69 74 3b 20 20 20 20  nt iRetInit;    
22d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22d10 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
22d20 65 73 73 20 6f 66 20 72 65 67 52 65 74 75 72 6e  ess of regReturn
22d30 20 69 6e 69 74 20 2a 2f 0a 20 20 20 20 69 6e 74   init */.    int
22d40 20 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20 3d   untestedTerms =
22d50 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
22d60 2f 2a 20 53 6f 6d 65 20 74 65 72 6d 73 20 6e 6f  /* Some terms no
22d70 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 74 65 73  t completely tes
22d80 74 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  ted */.    int i
22d90 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
22da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22db0 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
22dc0 0a 20 20 20 20 75 31 36 20 77 63 74 72 6c 46 6c  .    u16 wctrlFl
22dd0 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
22de0 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73          /* Flags
22df0 20 66 6f 72 20 73 75 62 2d 57 48 45 52 45 20 63   for sub-WHERE c
22e00 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 45 78 70  lause */.    Exp
22e10 72 20 2a 70 41 6e 64 45 78 70 72 20 3d 20 30 3b  r *pAndExpr = 0;
22e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22e30 2f 2a 20 41 6e 20 22 2e 2e 20 41 4e 44 20 28 2e  /* An ".. AND (.
22e40 2e 2e 29 22 20 65 78 70 72 65 73 73 69 6f 6e 20  ..)" expression 
22e50 2a 2f 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  */.    Table *pT
22e60 61 62 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70  ab = pTabItem->p
22e70 54 61 62 3b 0a 20 20 20 0a 20 20 20 20 70 54 65  Tab;.   .    pTe
22e80 72 6d 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65  rm = pLoop->aLTe
22e90 72 6d 5b 30 5d 3b 0a 20 20 20 20 61 73 73 65 72  rm[0];.    asser
22ea0 74 28 20 70 54 65 72 6d 21 3d 30 20 29 3b 0a 20  t( pTerm!=0 );. 
22eb0 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d     assert( pTerm
22ec0 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
22ed0 5f 4f 52 20 29 3b 0a 20 20 20 20 61 73 73 65 72  _OR );.    asser
22ee0 74 28 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61  t( (pTerm->wtFla
22ef0 67 73 20 26 20 54 45 52 4d 5f 4f 52 49 4e 46 4f  gs & TERM_ORINFO
22f00 29 21 3d 30 20 29 3b 0a 20 20 20 20 70 4f 72 57  )!=0 );.    pOrW
22f10 63 20 3d 20 26 70 54 65 72 6d 2d 3e 75 2e 70 4f  c = &pTerm->u.pO
22f20 72 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20 20 70  rInfo->wc;.    p
22f30 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 52  Level->op = OP_R
22f40 65 74 75 72 6e 3b 0a 20 20 20 20 70 4c 65 76 65  eturn;.    pLeve
22f50 6c 2d 3e 70 31 20 3d 20 72 65 67 52 65 74 75 72  l->p1 = regRetur
22f60 6e 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 75  n;..    /* Set u
22f70 70 20 61 20 6e 65 77 20 53 72 63 4c 69 73 74 20  p a new SrcList 
22f80 69 6e 20 70 4f 72 54 61 62 20 63 6f 6e 74 61 69  in pOrTab contai
22f90 6e 69 6e 67 20 74 68 65 20 74 61 62 6c 65 20 62  ning the table b
22fa0 65 69 6e 67 20 73 63 61 6e 6e 65 64 0a 20 20 20  eing scanned.   
22fb0 20 2a 2a 20 62 79 20 74 68 69 73 20 6c 6f 6f 70   ** by this loop
22fc0 20 69 6e 20 74 68 65 20 61 5b 30 5d 20 73 6c 6f   in the a[0] slo
22fd0 74 20 61 6e 64 20 61 6c 6c 20 6e 6f 74 52 65 61  t and all notRea
22fe0 64 79 20 74 61 62 6c 65 73 20 69 6e 20 61 5b 31  dy tables in a[1
22ff0 2e 2e 5d 20 73 6c 6f 74 73 2e 0a 20 20 20 20 2a  ..] slots..    *
23000 2a 20 54 68 69 73 20 62 65 63 6f 6d 65 73 20 74  * This becomes t
23010 68 65 20 53 72 63 4c 69 73 74 20 69 6e 20 74 68  he SrcList in th
23020 65 20 72 65 63 75 72 73 69 76 65 20 63 61 6c 6c  e recursive call
23030 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65   to sqlite3Where
23040 42 65 67 69 6e 28 29 2e 0a 20 20 20 20 2a 2f 0a  Begin()..    */.
23050 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e      if( pWInfo->
23060 6e 4c 65 76 65 6c 3e 31 20 29 7b 0a 20 20 20 20  nLevel>1 ){.    
23070 20 20 69 6e 74 20 6e 4e 6f 74 52 65 61 64 79 3b    int nNotReady;
23080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23090 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f   /* The number o
230a0 66 20 6e 6f 74 52 65 61 64 79 20 74 61 62 6c 65  f notReady table
230b0 73 20 2a 2f 0a 20 20 20 20 20 20 73 74 72 75 63  s */.      struc
230c0 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
230d0 6f 72 69 67 53 72 63 3b 20 20 20 20 20 2f 2a 20  origSrc;     /* 
230e0 4f 72 69 67 69 6e 61 6c 20 6c 69 73 74 20 6f 66  Original list of
230f0 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 20 20 20   tables */.     
23100 20 6e 4e 6f 74 52 65 61 64 79 20 3d 20 70 57 49   nNotReady = pWI
23110 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 20 2d 20 69 4c  nfo->nLevel - iL
23120 65 76 65 6c 20 2d 20 31 3b 0a 20 20 20 20 20 20  evel - 1;.      
23130 70 4f 72 54 61 62 20 3d 20 73 71 6c 69 74 65 33  pOrTab = sqlite3
23140 53 74 61 63 6b 41 6c 6c 6f 63 52 61 77 28 64 62  StackAllocRaw(db
23150 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
23160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69                si
23170 7a 65 6f 66 28 2a 70 4f 72 54 61 62 29 2b 20 6e  zeof(*pOrTab)+ n
23180 4e 6f 74 52 65 61 64 79 2a 73 69 7a 65 6f 66 28  NotReady*sizeof(
23190 70 4f 72 54 61 62 2d 3e 61 5b 30 5d 29 29 3b 0a  pOrTab->a[0]));.
231a0 20 20 20 20 20 20 69 66 28 20 70 4f 72 54 61 62        if( pOrTab
231b0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 6e 6f 74  ==0 ) return not
231c0 52 65 61 64 79 3b 0a 20 20 20 20 20 20 70 4f 72  Ready;.      pOr
231d0 54 61 62 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 28 75  Tab->nAlloc = (u
231e0 38 29 28 6e 4e 6f 74 52 65 61 64 79 20 2b 20 31  8)(nNotReady + 1
231f0 29 3b 0a 20 20 20 20 20 20 70 4f 72 54 61 62 2d  );.      pOrTab-
23200 3e 6e 53 72 63 20 3d 20 70 4f 72 54 61 62 2d 3e  >nSrc = pOrTab->
23210 6e 41 6c 6c 6f 63 3b 0a 20 20 20 20 20 20 6d 65  nAlloc;.      me
23220 6d 63 70 79 28 70 4f 72 54 61 62 2d 3e 61 2c 20  mcpy(pOrTab->a, 
23230 70 54 61 62 49 74 65 6d 2c 20 73 69 7a 65 6f 66  pTabItem, sizeof
23240 28 2a 70 54 61 62 49 74 65 6d 29 29 3b 0a 20 20  (*pTabItem));.  
23250 20 20 20 20 6f 72 69 67 53 72 63 20 3d 20 70 57      origSrc = pW
23260 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e  Info->pTabList->
23270 61 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 31  a;.      for(k=1
23280 3b 20 6b 3c 3d 6e 4e 6f 74 52 65 61 64 79 3b 20  ; k<=nNotReady; 
23290 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 6d 65  k++){.        me
232a0 6d 63 70 79 28 26 70 4f 72 54 61 62 2d 3e 61 5b  mcpy(&pOrTab->a[
232b0 6b 5d 2c 20 26 6f 72 69 67 53 72 63 5b 70 4c 65  k], &origSrc[pLe
232c0 76 65 6c 5b 6b 5d 2e 69 46 72 6f 6d 5d 2c 20 73  vel[k].iFrom], s
232d0 69 7a 65 6f 66 28 70 4f 72 54 61 62 2d 3e 61 5b  izeof(pOrTab->a[
232e0 6b 5d 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  k]));.      }.  
232f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
23300 4f 72 54 61 62 20 3d 20 70 57 49 6e 66 6f 2d 3e  OrTab = pWInfo->
23310 70 54 61 62 4c 69 73 74 3b 0a 20 20 20 20 7d 0a  pTabList;.    }.
23320 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69  .    /* Initiali
23330 7a 65 20 74 68 65 20 72 6f 77 73 65 74 20 72 65  ze the rowset re
23340 67 69 73 74 65 72 20 74 6f 20 63 6f 6e 74 61 69  gister to contai
23350 6e 20 4e 55 4c 4c 2e 20 41 6e 20 53 51 4c 20 4e  n NULL. An SQL N
23360 55 4c 4c 20 69 73 20 0a 20 20 20 20 2a 2a 20 65  ULL is .    ** e
23370 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 61 6e 20  quivalent to an 
23380 65 6d 70 74 79 20 72 6f 77 73 65 74 2e 20 20 4f  empty rowset.  O
23390 72 2c 20 63 72 65 61 74 65 20 61 6e 20 65 70 68  r, create an eph
233a0 65 6d 65 72 61 6c 20 69 6e 64 65 78 0a 20 20 20  emeral index.   
233b0 20 2a 2a 20 63 61 70 61 62 6c 65 20 6f 66 20 68   ** capable of h
233c0 6f 6c 64 69 6e 67 20 70 72 69 6d 61 72 79 20 6b  olding primary k
233d0 65 79 73 20 69 6e 20 74 68 65 20 63 61 73 65 20  eys in the case 
233e0 6f 66 20 61 20 57 49 54 48 4f 55 54 20 52 4f 57  of a WITHOUT ROW
233f0 49 44 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ID..    **.    *
23400 2a 20 41 6c 73 6f 20 69 6e 69 74 69 61 6c 69 7a  * Also initializ
23410 65 20 72 65 67 52 65 74 75 72 6e 20 74 6f 20 63  e regReturn to c
23420 6f 6e 74 61 69 6e 20 74 68 65 20 61 64 64 72 65  ontain the addre
23430 73 73 20 6f 66 20 74 68 65 20 69 6e 73 74 72 75  ss of the instru
23440 63 74 69 6f 6e 20 0a 20 20 20 20 2a 2a 20 69 6d  ction .    ** im
23450 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77  mediately follow
23460 69 6e 67 20 74 68 65 20 4f 50 5f 52 65 74 75 72  ing the OP_Retur
23470 6e 20 61 74 20 74 68 65 20 62 6f 74 74 6f 6d 20  n at the bottom 
23480 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20 54 68 69  of the loop. Thi
23490 73 0a 20 20 20 20 2a 2a 20 69 73 20 72 65 71 75  s.    ** is requ
234a0 69 72 65 64 20 69 6e 20 61 20 66 65 77 20 6f 62  ired in a few ob
234b0 73 63 75 72 65 20 4c 45 46 54 20 4a 4f 49 4e 20  scure LEFT JOIN 
234c0 63 61 73 65 73 20 77 68 65 72 65 20 63 6f 6e 74  cases where cont
234d0 72 6f 6c 20 6a 75 6d 70 73 0a 20 20 20 20 2a 2a  rol jumps.    **
234e0 20 6f 76 65 72 20 74 68 65 20 74 6f 70 20 6f 66   over the top of
234f0 20 74 68 65 20 6c 6f 6f 70 20 69 6e 74 6f 20 74   the loop into t
23500 68 65 20 62 6f 64 79 20 6f 66 20 69 74 2e 20 49  he body of it. I
23510 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20  n this case the 
23520 0a 20 20 20 20 2a 2a 20 63 6f 72 72 65 63 74 20  .    ** correct 
23530 72 65 73 70 6f 6e 73 65 20 66 6f 72 20 74 68 65  response for the
23540 20 65 6e 64 2d 6f 66 2d 6c 6f 6f 70 20 63 6f 64   end-of-loop cod
23550 65 20 28 74 68 65 20 4f 50 5f 52 65 74 75 72 6e  e (the OP_Return
23560 29 20 69 73 20 74 6f 20 0a 20 20 20 20 2a 2a 20  ) is to .    ** 
23570 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 74 6f 20  fall through to 
23580 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63  the next instruc
23590 74 69 6f 6e 2c 20 6a 75 73 74 20 61 73 20 61 6e  tion, just as an
235a0 20 4f 50 5f 4e 65 78 74 20 64 6f 65 73 20 69 66   OP_Next does if
235b0 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 65 64 20 6f  .    ** called o
235c0 6e 20 61 6e 20 75 6e 69 6e 69 74 69 61 6c 69 7a  n an uninitializ
235d0 65 64 20 63 75 72 73 6f 72 2e 0a 20 20 20 20 2a  ed cursor..    *
235e0 2f 0a 20 20 20 20 69 66 28 20 28 70 57 49 6e 66  /.    if( (pWInf
235f0 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20  o->wctrlFlags & 
23600 57 48 45 52 45 5f 44 55 50 4c 49 43 41 54 45 53  WHERE_DUPLICATES
23610 5f 4f 4b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  _OK)==0 ){.     
23620 20 69 66 28 20 48 61 73 52 6f 77 69 64 28 70 54   if( HasRowid(pT
23630 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ab) ){.        r
23640 65 67 52 6f 77 73 65 74 20 3d 20 2b 2b 70 50 61  egRowset = ++pPa
23650 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
23660 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
23670 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c  dOp2(v, OP_Null,
23680 20 30 2c 20 72 65 67 52 6f 77 73 65 74 29 3b 0a   0, regRowset);.
23690 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
236a0 20 20 20 20 20 49 6e 64 65 78 20 2a 70 50 6b 20       Index *pPk 
236b0 3d 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79  = sqlite3Primary
236c0 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29 3b 0a  KeyIndex(pTab);.
236d0 20 20 20 20 20 20 20 20 72 65 67 52 6f 77 73 65          regRowse
236e0 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  t = pParse->nTab
236f0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  ++;.        sqli
23700 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
23710 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
23720 6c 2c 20 72 65 67 52 6f 77 73 65 74 2c 20 70 50  l, regRowset, pP
23730 6b 2d 3e 6e 4b 65 79 43 6f 6c 29 3b 0a 20 20 20  k->nKeyCol);.   
23740 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
23750 53 65 74 50 34 4b 65 79 49 6e 66 6f 28 70 50 61  SetP4KeyInfo(pPa
23760 72 73 65 2c 20 70 50 6b 29 3b 0a 20 20 20 20 20  rse, pPk);.     
23770 20 7d 0a 20 20 20 20 20 20 72 65 67 52 6f 77 69   }.      regRowi
23780 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  d = ++pParse->nM
23790 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 52  em;.    }.    iR
237a0 65 74 49 6e 69 74 20 3d 20 73 71 6c 69 74 65 33  etInit = sqlite3
237b0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
237c0 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67  _Integer, 0, reg
237d0 52 65 74 75 72 6e 29 3b 0a 0a 20 20 20 20 2f 2a  Return);..    /*
237e0 20 49 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   If the original
237f0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 73   WHERE clause is
23800 20 7a 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 20   z of the form: 
23810 20 28 78 31 20 4f 52 20 78 32 20 4f 52 20 2e 2e   (x1 OR x2 OR ..
23820 2e 29 20 41 4e 44 20 79 0a 20 20 20 20 2a 2a 20  .) AND y.    ** 
23830 54 68 65 6e 20 66 6f 72 20 65 76 65 72 79 20 74  Then for every t
23840 65 72 6d 20 78 4e 2c 20 65 76 61 6c 75 61 74 65  erm xN, evaluate
23850 20 61 73 20 74 68 65 20 73 75 62 65 78 70 72 65   as the subexpre
23860 73 73 69 6f 6e 3a 20 78 4e 20 41 4e 44 20 7a 0a  ssion: xN AND z.
23870 20 20 20 20 2a 2a 20 54 68 61 74 20 77 61 79 2c      ** That way,
23880 20 74 65 72 6d 73 20 69 6e 20 79 20 74 68 61 74   terms in y that
23890 20 61 72 65 20 66 61 63 74 6f 72 65 64 20 69 6e   are factored in
238a0 74 6f 20 74 68 65 20 64 69 73 6a 75 6e 63 74 69  to the disjuncti
238b0 6f 6e 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62  on will.    ** b
238c0 65 20 70 69 63 6b 65 64 20 75 70 20 62 79 20 74  e picked up by t
238d0 68 65 20 72 65 63 75 72 73 69 76 65 20 63 61 6c  he recursive cal
238e0 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65  ls to sqlite3Whe
238f0 72 65 42 65 67 69 6e 28 29 20 62 65 6c 6f 77 2e  reBegin() below.
23900 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41  .    **.    ** A
23910 63 74 75 61 6c 6c 79 2c 20 65 61 63 68 20 73 75  ctually, each su
23920 62 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63  bexpression is c
23930 6f 6e 76 65 72 74 65 64 20 74 6f 20 22 78 4e 20  onverted to "xN 
23940 41 4e 44 20 77 22 20 77 68 65 72 65 20 77 20 69  AND w" where w i
23950 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 22 69 6e  s.    ** the "in
23960 74 65 72 65 73 74 69 6e 67 22 20 74 65 72 6d 73  teresting" terms
23970 20 6f 66 20 7a 20 2d 20 74 65 72 6d 73 20 74 68   of z - terms th
23980 61 74 20 64 69 64 20 6e 6f 74 20 6f 72 69 67 69  at did not origi
23990 6e 61 74 65 20 69 6e 20 74 68 65 0a 20 20 20 20  nate in the.    
239a0 2a 2a 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63  ** ON or USING c
239b0 6c 61 75 73 65 20 6f 66 20 61 20 4c 45 46 54 20  lause of a LEFT 
239c0 4a 4f 49 4e 2c 20 61 6e 64 20 74 65 72 6d 73 20  JOIN, and terms 
239d0 74 68 61 74 20 61 72 65 20 75 73 61 62 6c 65 20  that are usable 
239e0 61 73 20 0a 20 20 20 20 2a 2a 20 69 6e 64 69 63  as .    ** indic
239f0 65 73 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  es..    **.    *
23a00 2a 20 54 68 69 73 20 6f 70 74 69 6d 69 7a 61 74  * This optimizat
23a10 69 6f 6e 20 61 6c 73 6f 20 6f 6e 6c 79 20 61 70  ion also only ap
23a20 70 6c 69 65 73 20 69 66 20 74 68 65 20 28 78 31  plies if the (x1
23a30 20 4f 52 20 78 32 20 4f 52 20 2e 2e 2e 29 20 74   OR x2 OR ...) t
23a40 65 72 6d 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f  erm.    ** is no
23a50 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74  t contained in t
23a60 68 65 20 4f 4e 20 63 6c 61 75 73 65 20 6f 66 20  he ON clause of 
23a70 61 20 4c 45 46 54 20 4a 4f 49 4e 2e 0a 20 20 20  a LEFT JOIN..   
23a80 20 2a 2a 20 53 65 65 20 74 69 63 6b 65 74 20 68   ** See ticket h
23a90 74 74 70 3a 2f 2f 77 77 77 2e 73 71 6c 69 74 65  ttp://www.sqlite
23aa0 2e 6f 72 67 2f 73 72 63 2f 69 6e 66 6f 2f 66 32  .org/src/info/f2
23ab0 33 36 39 33 30 34 65 34 0a 20 20 20 20 2a 2f 0a  369304e4.    */.
23ac0 20 20 20 20 69 66 28 20 70 57 43 2d 3e 6e 54 65      if( pWC->nTe
23ad0 72 6d 3e 31 20 29 7b 0a 20 20 20 20 20 20 69 6e  rm>1 ){.      in
23ae0 74 20 69 54 65 72 6d 3b 0a 20 20 20 20 20 20 66  t iTerm;.      f
23af0 6f 72 28 69 54 65 72 6d 3d 30 3b 20 69 54 65 72  or(iTerm=0; iTer
23b00 6d 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 54  m<pWC->nTerm; iT
23b10 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  erm++){.        
23b20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 57  Expr *pExpr = pW
23b30 43 2d 3e 61 5b 69 54 65 72 6d 5d 2e 70 45 78 70  C->a[iTerm].pExp
23b40 72 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 26  r;.        if( &
23b50 70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d 20 3d 3d  pWC->a[iTerm] ==
23b60 20 70 54 65 72 6d 20 29 20 63 6f 6e 74 69 6e 75   pTerm ) continu
23b70 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 45  e;.        if( E
23b80 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
23b90 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69  Expr, EP_FromJoi
23ba0 6e 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  n) ) continue;. 
23bb0 20 20 20 20 20 20 20 69 66 28 20 28 70 57 43 2d         if( (pWC-
23bc0 3e 61 5b 69 54 65 72 6d 5d 2e 77 74 46 6c 61 67  >a[iTerm].wtFlag
23bd0 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  s & TERM_VIRTUAL
23be0 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  )!=0 ) continue;
23bf0 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70 57  .        if( (pW
23c00 43 2d 3e 61 5b 69 54 65 72 6d 5d 2e 65 4f 70 65  C->a[iTerm].eOpe
23c10 72 61 74 6f 72 20 26 20 57 4f 5f 41 4c 4c 29 3d  rator & WO_ALL)=
23c20 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
23c30 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
23c40 20 70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d 2e 77   pWC->a[iTerm].w
23c50 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 4f 52  tFlags & TERM_OR
23c60 49 4e 46 4f 20 29 3b 0a 20 20 20 20 20 20 20 20  INFO );.        
23c70 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45  pExpr = sqlite3E
23c80 78 70 72 44 75 70 28 64 62 2c 20 70 45 78 70 72  xprDup(db, pExpr
23c90 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 41  , 0);.        pA
23ca0 6e 64 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  ndExpr = sqlite3
23cb0 45 78 70 72 41 6e 64 28 64 62 2c 20 70 41 6e 64  ExprAnd(db, pAnd
23cc0 45 78 70 72 2c 20 70 45 78 70 72 29 3b 0a 20 20  Expr, pExpr);.  
23cd0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
23ce0 70 41 6e 64 45 78 70 72 20 29 7b 0a 20 20 20 20  pAndExpr ){.    
23cf0 20 20 20 20 70 41 6e 64 45 78 70 72 20 3d 20 73      pAndExpr = s
23d00 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
23d10 73 65 2c 20 54 4b 5f 41 4e 44 2c 20 30 2c 20 70  se, TK_AND, 0, p
23d20 41 6e 64 45 78 70 72 2c 20 30 29 3b 0a 20 20 20  AndExpr, 0);.   
23d30 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
23d40 2f 2a 20 52 75 6e 20 61 20 73 65 70 61 72 61 74  /* Run a separat
23d50 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 66  e WHERE clause f
23d60 6f 72 20 65 61 63 68 20 74 65 72 6d 20 6f 66 20  or each term of 
23d70 74 68 65 20 4f 52 20 63 6c 61 75 73 65 2e 20 20  the OR clause.  
23d80 41 66 74 65 72 0a 20 20 20 20 2a 2a 20 65 6c 69  After.    ** eli
23d90 6d 69 6e 61 74 69 6e 67 20 64 75 70 6c 69 63 61  minating duplica
23da0 74 65 73 20 66 72 6f 6d 20 6f 74 68 65 72 20 57  tes from other W
23db0 48 45 52 45 20 63 6c 61 75 73 65 73 2c 20 74 68  HERE clauses, th
23dc0 65 20 61 63 74 69 6f 6e 20 66 6f 72 20 65 61 63  e action for eac
23dd0 68 0a 20 20 20 20 2a 2a 20 73 75 62 2d 57 48 45  h.    ** sub-WHE
23de0 52 45 20 63 6c 61 75 73 65 20 69 73 20 74 6f 20  RE clause is to 
23df0 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20 6d 61  to invoke the ma
23e00 69 6e 20 6c 6f 6f 70 20 62 6f 64 79 20 61 73 20  in loop body as 
23e10 61 20 73 75 62 72 6f 75 74 69 6e 65 2e 0a 20 20  a subroutine..  
23e20 20 20 2a 2f 0a 20 20 20 20 77 63 74 72 6c 46 6c    */.    wctrlFl
23e30 61 67 73 20 3d 20 20 57 48 45 52 45 5f 4f 4d 49  ags =  WHERE_OMI
23e40 54 5f 4f 50 45 4e 5f 43 4c 4f 53 45 0a 20 20 20  T_OPEN_CLOSE.   
23e50 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 57               | W
23e60 48 45 52 45 5f 46 4f 52 43 45 5f 54 41 42 4c 45  HERE_FORCE_TABLE
23e70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
23e80 20 7c 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c   | WHERE_ONETABL
23e90 45 5f 4f 4e 4c 59 0a 20 20 20 20 20 20 20 20 20  E_ONLY.         
23ea0 20 20 20 20 20 20 20 7c 20 57 48 45 52 45 5f 4e         | WHERE_N
23eb0 4f 5f 41 55 54 4f 49 4e 44 45 58 3b 0a 20 20 20  O_AUTOINDEX;.   
23ec0 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 4f   for(ii=0; ii<pO
23ed0 72 57 63 2d 3e 6e 54 65 72 6d 3b 20 69 69 2b 2b  rWc->nTerm; ii++
23ee0 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 54 65  ){.      WhereTe
23ef0 72 6d 20 2a 70 4f 72 54 65 72 6d 20 3d 20 26 70  rm *pOrTerm = &p
23f00 4f 72 57 63 2d 3e 61 5b 69 69 5d 3b 0a 20 20 20  OrWc->a[ii];.   
23f10 20 20 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e     if( pOrTerm->
23f20 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72  leftCursor==iCur
23f30 20 7c 7c 20 28 70 4f 72 54 65 72 6d 2d 3e 65 4f   || (pOrTerm->eO
23f40 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 41 4e 44  perator & WO_AND
23f50 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
23f60 57 68 65 72 65 49 6e 66 6f 20 2a 70 53 75 62 57  WhereInfo *pSubW
23f70 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20 20  Info;           
23f80 2f 2a 20 49 6e 66 6f 20 66 6f 72 20 73 69 6e 67  /* Info for sing
23f90 6c 65 20 4f 52 2d 74 65 72 6d 20 73 63 61 6e 20  le OR-term scan 
23fa0 2a 2f 0a 20 20 20 20 20 20 20 20 45 78 70 72 20  */.        Expr 
23fb0 2a 70 4f 72 45 78 70 72 20 3d 20 70 4f 72 54 65  *pOrExpr = pOrTe
23fc0 72 6d 2d 3e 70 45 78 70 72 3b 20 2f 2a 20 43 75  rm->pExpr; /* Cu
23fd0 72 72 65 6e 74 20 4f 52 20 63 6c 61 75 73 65 20  rrent OR clause 
23fe0 74 65 72 6d 20 2a 2f 0a 20 20 20 20 20 20 20 20  term */.        
23ff0 69 6e 74 20 6a 31 20 3d 20 30 3b 20 20 20 20 20  int j1 = 0;     
24000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24010 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 6a 75  /* Address of ju
24020 6d 70 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a  mp operation */.
24030 20 20 20 20 20 20 20 20 69 66 28 20 70 41 6e 64          if( pAnd
24040 45 78 70 72 20 26 26 20 21 45 78 70 72 48 61 73  Expr && !ExprHas
24050 50 72 6f 70 65 72 74 79 28 70 4f 72 45 78 70 72  Property(pOrExpr
24060 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29  , EP_FromJoin) )
24070 7b 0a 20 20 20 20 20 20 20 20 20 20 70 41 6e 64  {.          pAnd
24080 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20 70 4f  Expr->pLeft = pO
24090 72 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20  rExpr;.         
240a0 20 70 4f 72 45 78 70 72 20 3d 20 70 41 6e 64 45   pOrExpr = pAndE
240b0 78 70 72 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  xpr;.        }. 
240c0 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74         /* Loop t
240d0 68 72 6f 75 67 68 20 74 61 62 6c 65 20 65 6e 74  hrough table ent
240e0 72 69 65 73 20 74 68 61 74 20 6d 61 74 63 68 20  ries that match 
240f0 74 65 72 6d 20 70 4f 72 54 65 72 6d 2e 20 2a 2f  term pOrTerm. */
24100 0a 20 20 20 20 20 20 20 20 57 48 45 52 45 54 52  .        WHERETR
24110 41 43 45 28 30 78 66 66 66 66 2c 20 28 22 53 75  ACE(0xffff, ("Su
24120 62 70 6c 61 6e 20 66 6f 72 20 4f 52 2d 63 6c 61  bplan for OR-cla
24130 75 73 65 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 20  use:\n"));.     
24140 20 20 20 70 53 75 62 57 49 6e 66 6f 20 3d 20 73     pSubWInfo = s
24150 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
24160 28 70 50 61 72 73 65 2c 20 70 4f 72 54 61 62 2c  (pParse, pOrTab,
24170 20 70 4f 72 45 78 70 72 2c 20 30 2c 20 30 2c 0a   pOrExpr, 0, 0,.
24180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
241a0 20 20 20 20 20 20 77 63 74 72 6c 46 6c 61 67 73        wctrlFlags
241b0 2c 20 69 43 6f 76 43 75 72 29 3b 0a 20 20 20 20  , iCovCur);.    
241c0 20 20 20 20 61 73 73 65 72 74 28 20 70 53 75 62      assert( pSub
241d0 57 49 6e 66 6f 20 7c 7c 20 70 50 61 72 73 65 2d  WInfo || pParse-
241e0 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c  >nErr || db->mal
241f0 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
24200 20 20 20 20 20 69 66 28 20 70 53 75 62 57 49 6e       if( pSubWIn
24210 66 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  fo ){.          
24220 57 68 65 72 65 4c 6f 6f 70 20 2a 70 53 75 62 4c  WhereLoop *pSubL
24230 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20 20 20 69  oop;.          i
24240 6e 74 20 61 64 64 72 45 78 70 6c 61 69 6e 20 3d  nt addrExplain =
24250 20 65 78 70 6c 61 69 6e 4f 6e 65 53 63 61 6e 28   explainOneScan(
24260 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
24270 50 61 72 73 65 2c 20 70 4f 72 54 61 62 2c 20 26  Parse, pOrTab, &
24280 70 53 75 62 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2c  pSubWInfo->a[0],
24290 20 69 4c 65 76 65 6c 2c 20 70 4c 65 76 65 6c 2d   iLevel, pLevel-
242a0 3e 69 46 72 6f 6d 2c 20 30 0a 20 20 20 20 20 20  >iFrom, 0.      
242b0 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 20      );.         
242c0 20 61 64 64 53 63 61 6e 53 74 61 74 75 73 28 76   addScanStatus(v
242d0 2c 20 70 4f 72 54 61 62 2c 20 26 70 53 75 62 57  , pOrTab, &pSubW
242e0 49 6e 66 6f 2d 3e 61 5b 30 5d 2c 20 61 64 64 72  Info->a[0], addr
242f0 45 78 70 6c 61 69 6e 29 3b 0a 0a 20 20 20 20 20  Explain);..     
24300 20 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20       /* This is 
24310 74 68 65 20 73 75 62 2d 57 48 45 52 45 20 63 6c  the sub-WHERE cl
24320 61 75 73 65 20 62 6f 64 79 2e 20 20 46 69 72 73  ause body.  Firs
24330 74 20 73 6b 69 70 20 6f 76 65 72 0a 20 20 20 20  t skip over.    
24340 20 20 20 20 20 20 2a 2a 20 64 75 70 6c 69 63 61        ** duplica
24350 74 65 20 72 6f 77 73 20 66 72 6f 6d 20 70 72 69  te rows from pri
24360 6f 72 20 73 75 62 2d 57 48 45 52 45 20 63 6c 61  or sub-WHERE cla
24370 75 73 65 73 2c 20 61 6e 64 20 72 65 63 6f 72 64  uses, and record
24380 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a   the.          *
24390 2a 20 72 6f 77 69 64 20 28 6f 72 20 50 52 49 4d  * rowid (or PRIM
243a0 41 52 59 20 4b 45 59 29 20 66 6f 72 20 74 68 65  ARY KEY) for the
243b0 20 63 75 72 72 65 6e 74 20 72 6f 77 20 73 6f 20   current row so 
243c0 74 68 61 74 20 74 68 65 20 73 61 6d 65 0a 20 20  that the same.  
243d0 20 20 20 20 20 20 20 20 2a 2a 20 72 6f 77 20 77          ** row w
243e0 69 6c 6c 20 62 65 20 73 6b 69 70 70 65 64 20 69  ill be skipped i
243f0 6e 20 73 75 62 73 65 71 75 65 6e 74 20 73 75 62  n subsequent sub
24400 2d 57 48 45 52 45 20 63 6c 61 75 73 65 73 2e 0a  -WHERE clauses..
24410 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
24420 20 20 20 20 20 20 20 69 66 28 20 28 70 57 49 6e         if( (pWIn
24430 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26  fo->wctrlFlags &
24440 20 57 48 45 52 45 5f 44 55 50 4c 49 43 41 54 45   WHERE_DUPLICATE
24450 53 5f 4f 4b 29 3d 3d 30 20 29 7b 0a 20 20 20 20  S_OK)==0 ){.    
24460 20 20 20 20 20 20 20 20 69 6e 74 20 72 3b 0a 20          int r;. 
24470 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69             int i
24480 53 65 74 20 3d 20 28 28 69 69 3d 3d 70 4f 72 57  Set = ((ii==pOrW
24490 63 2d 3e 6e 54 65 72 6d 2d 31 29 3f 2d 31 3a 69  c->nTerm-1)?-1:i
244a0 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  i);.            
244b0 69 66 28 20 48 61 73 52 6f 77 69 64 28 70 54 61  if( HasRowid(pTa
244c0 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  b) ){.          
244d0 20 20 20 20 72 20 3d 20 73 71 6c 69 74 65 33 45      r = sqlite3E
244e0 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e  xprCodeGetColumn
244f0 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 2d  (pParse, pTab, -
24500 31 2c 20 69 43 75 72 2c 20 72 65 67 52 6f 77 69  1, iCur, regRowi
24510 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  d, 0);.         
24520 20 20 20 20 20 6a 31 20 3d 20 73 71 6c 69 74 65       j1 = sqlite
24530 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
24540 2c 20 4f 50 5f 52 6f 77 53 65 74 54 65 73 74 2c  , OP_RowSetTest,
24550 20 72 65 67 52 6f 77 73 65 74 2c 20 30 2c 20 72   regRowset, 0, r
24560 2c 69 53 65 74 29 3b 0a 20 20 20 20 20 20 20 20  ,iSet);.        
24570 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
24580 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20  ge(v);.         
24590 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
245a0 20 20 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70          Index *p
245b0 50 6b 20 3d 20 73 71 6c 69 74 65 33 50 72 69 6d  Pk = sqlite3Prim
245c0 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62  aryKeyIndex(pTab
245d0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
245e0 20 69 6e 74 20 6e 50 6b 20 3d 20 70 50 6b 2d 3e   int nPk = pPk->
245f0 6e 4b 65 79 43 6f 6c 3b 0a 20 20 20 20 20 20 20  nKeyCol;.       
24600 20 20 20 20 20 20 20 69 6e 74 20 69 50 6b 3b 0a         int iPk;.
24610 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  .              /
24620 2a 20 52 65 61 64 20 74 68 65 20 50 4b 20 69 6e  * Read the PK in
24630 74 6f 20 61 6e 20 61 72 72 61 79 20 6f 66 20 74  to an array of t
24640 65 6d 70 20 72 65 67 69 73 74 65 72 73 2e 20 2a  emp registers. *
24650 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
24660 72 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  r = sqlite3GetTe
24670 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
24680 6e 50 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  nPk);.          
24690 20 20 20 20 66 6f 72 28 69 50 6b 3d 30 3b 20 69      for(iPk=0; i
246a0 50 6b 3c 6e 50 6b 3b 20 69 50 6b 2b 2b 29 7b 0a  Pk<nPk; iPk++){.
246b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
246c0 69 6e 74 20 69 43 6f 6c 20 3d 20 70 50 6b 2d 3e  int iCol = pPk->
246d0 61 69 43 6f 6c 75 6d 6e 5b 69 50 6b 5d 3b 0a 20  aiColumn[iPk];. 
246e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
246f0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65  qlite3ExprCodeGe
24700 74 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20  tColumn(pParse, 
24710 70 54 61 62 2c 20 69 43 6f 6c 2c 20 69 43 75 72  pTab, iCol, iCur
24720 2c 20 72 2b 69 50 6b 2c 20 30 29 3b 0a 20 20 20  , r+iPk, 0);.   
24730 20 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20             }..  
24740 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
24750 68 65 63 6b 20 69 66 20 74 68 65 20 74 65 6d 70  heck if the temp
24760 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20 63   table already c
24770 6f 6e 74 61 69 6e 73 20 74 68 69 73 20 6b 65 79  ontains this key
24780 2e 20 49 66 20 73 6f 2c 0a 20 20 20 20 20 20 20  . If so,.       
24790 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 72 6f         ** the ro
247a0 77 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  w has already be
247b0 65 6e 20 69 6e 63 6c 75 64 65 64 20 69 6e 20 74  en included in t
247c0 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 61 6e  he result set an
247d0 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d.              
247e0 2a 2a 20 63 61 6e 20 62 65 20 69 67 6e 6f 72 65  ** can be ignore
247f0 64 20 28 62 79 20 6a 75 6d 70 69 6e 67 20 70 61  d (by jumping pa
24800 73 74 20 74 68 65 20 47 6f 73 75 62 20 62 65 6c  st the Gosub bel
24810 6f 77 29 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a  ow). Otherwise,.
24820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
24830 20 69 6e 73 65 72 74 20 74 68 65 20 6b 65 79 20   insert the key 
24840 69 6e 74 6f 20 74 68 65 20 74 65 6d 70 20 74 61  into the temp ta
24850 62 6c 65 20 61 6e 64 20 70 72 6f 63 65 65 64 20  ble and proceed 
24860 77 69 74 68 20 70 72 6f 63 65 73 73 69 6e 67 0a  with processing.
24870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
24880 20 74 68 65 20 72 6f 77 2e 0a 20 20 20 20 20 20   the row..      
24890 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
248a0 20 20 20 20 20 20 20 20 20 2a 2a 20 55 73 65 20           ** Use 
248b0 73 6f 6d 65 20 6f 66 20 74 68 65 20 73 61 6d 65  some of the same
248c0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 61   optimizations a
248d0 73 20 4f 50 5f 52 6f 77 53 65 74 54 65 73 74 3a  s OP_RowSetTest:
248e0 20 49 66 20 69 53 65 74 0a 20 20 20 20 20 20 20   If iSet.       
248f0 20 20 20 20 20 20 20 2a 2a 20 69 73 20 7a 65 72         ** is zer
24900 6f 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20 74  o, assume that t
24910 68 65 20 6b 65 79 20 63 61 6e 6e 6f 74 20 61 6c  he key cannot al
24920 72 65 61 64 79 20 62 65 20 70 72 65 73 65 6e 74  ready be present
24930 20 69 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20   in.            
24940 20 20 2a 2a 20 74 68 65 20 74 65 6d 70 20 74 61    ** the temp ta
24950 62 6c 65 2e 20 41 6e 64 20 69 66 20 69 53 65 74  ble. And if iSet
24960 20 69 73 20 2d 31 2c 20 61 73 73 75 6d 65 20 74   is -1, assume t
24970 68 61 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20  hat there is no 
24980 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a  .              *
24990 2a 20 6e 65 65 64 20 74 6f 20 69 6e 73 65 72 74  * need to insert
249a0 20 74 68 65 20 6b 65 79 20 69 6e 74 6f 20 74 68   the key into th
249b0 65 20 74 65 6d 70 20 74 61 62 6c 65 2c 20 61 73  e temp table, as
249c0 20 69 74 20 77 69 6c 6c 20 6e 65 76 65 72 20 0a   it will never .
249d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
249e0 20 62 65 20 74 65 73 74 65 64 20 66 6f 72 2e 20   be tested for. 
249f0 20 2a 2f 20 0a 20 20 20 20 20 20 20 20 20 20 20   */ .           
24a00 20 20 20 69 66 28 20 69 53 65 74 20 29 7b 0a 20     if( iSet ){. 
24a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6a                 j
24a20 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  1 = sqlite3VdbeA
24a30 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46  ddOp4Int(v, OP_F
24a40 6f 75 6e 64 2c 20 72 65 67 52 6f 77 73 65 74 2c  ound, regRowset,
24a50 20 30 2c 20 72 2c 20 6e 50 6b 29 3b 0a 20 20 20   0, r, nPk);.   
24a60 20 20 20 20 20 20 20 20 20 20 20 20 20 56 64 62               Vdb
24a70 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
24a80 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
24a90 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
24aa0 69 53 65 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20  iSet>=0 ){.     
24ab0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
24ac0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
24ad0 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72  OP_MakeRecord, r
24ae0 2c 20 6e 50 6b 2c 20 72 65 67 52 6f 77 69 64 29  , nPk, regRowid)
24af0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
24b00 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
24b10 4f 70 33 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  Op3(v, OP_IdxIns
24b20 65 72 74 2c 20 72 65 67 52 6f 77 73 65 74 2c 20  ert, regRowset, 
24b30 72 65 67 52 6f 77 69 64 2c 20 30 29 3b 0a 20 20  regRowid, 0);.  
24b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
24b50 28 20 69 53 65 74 20 29 20 73 71 6c 69 74 65 33  ( iSet ) sqlite3
24b60 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
24b70 4f 50 46 4c 41 47 5f 55 53 45 53 45 45 4b 52 45  OPFLAG_USESEEKRE
24b80 53 55 4c 54 29 3b 0a 20 20 20 20 20 20 20 20 20  SULT);.         
24b90 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
24ba0 20 20 20 20 20 20 2f 2a 20 52 65 6c 65 61 73 65        /* Release
24bb0 20 74 68 65 20 61 72 72 61 79 20 6f 66 20 74 65   the array of te
24bc0 6d 70 20 72 65 67 69 73 74 65 72 73 20 2a 2f 0a  mp registers */.
24bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
24be0 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
24bf0 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 2c  Range(pParse, r,
24c00 20 6e 50 6b 29 3b 0a 20 20 20 20 20 20 20 20 20   nPk);.         
24c10 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
24c20 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ..          /* I
24c30 6e 76 6f 6b 65 20 74 68 65 20 6d 61 69 6e 20 6c  nvoke the main l
24c40 6f 6f 70 20 62 6f 64 79 20 61 73 20 61 20 73 75  oop body as a su
24c50 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 20 20  broutine */.    
24c60 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
24c70 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
24c80 73 75 62 2c 20 72 65 67 52 65 74 75 72 6e 2c 20  sub, regReturn, 
24c90 69 4c 6f 6f 70 42 6f 64 79 29 3b 0a 0a 20 20 20  iLoopBody);..   
24ca0 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68         /* Jump h
24cb0 65 72 65 20 28 73 6b 69 70 70 69 6e 67 20 74 68  ere (skipping th
24cc0 65 20 6d 61 69 6e 20 6c 6f 6f 70 20 62 6f 64 79  e main loop body
24cd0 20 73 75 62 72 6f 75 74 69 6e 65 29 20 69 66 20   subroutine) if 
24ce0 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  the.          **
24cf0 20 63 75 72 72 65 6e 74 20 73 75 62 2d 57 48 45   current sub-WHE
24d00 52 45 20 72 6f 77 20 69 73 20 61 20 64 75 70 6c  RE row is a dupl
24d10 69 63 61 74 65 20 66 72 6f 6d 20 70 72 69 6f 72  icate from prior
24d20 20 73 75 62 2d 57 48 45 52 45 73 2e 20 2a 2f 0a   sub-WHEREs. */.
24d30 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6a 31            if( j1
24d40 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75   ) sqlite3VdbeJu
24d50 6d 70 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a 0a  mpHere(v, j1);..
24d60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
24d70 20 70 53 75 62 57 49 6e 66 6f 2d 3e 75 6e 74 65   pSubWInfo->unte
24d80 73 74 65 64 54 65 72 6d 73 20 66 6c 61 67 20 6d  stedTerms flag m
24d90 65 61 6e 73 20 74 68 61 74 20 74 68 69 73 20 4f  eans that this O
24da0 52 20 74 65 72 6d 0a 20 20 20 20 20 20 20 20 20  R term.         
24db0 20 2a 2a 20 63 6f 6e 74 61 69 6e 65 64 20 6f 6e   ** contained on
24dc0 65 20 6f 72 20 6d 6f 72 65 20 41 4e 44 20 74 65  e or more AND te
24dd0 72 6d 20 66 72 6f 6d 20 61 20 6e 6f 74 52 65 61  rm from a notRea
24de0 64 79 20 74 61 62 6c 65 2e 20 20 54 68 65 0a 20  dy table.  The. 
24df0 20 20 20 20 20 20 20 20 20 2a 2a 20 74 65 72 6d           ** term
24e00 73 20 66 72 6f 6d 20 74 68 65 20 6e 6f 74 52 65  s from the notRe
24e10 61 64 79 20 74 61 62 6c 65 20 63 6f 75 6c 64 20  ady table could 
24e20 6e 6f 74 20 62 65 20 74 65 73 74 65 64 20 61 6e  not be tested an
24e30 64 20 77 69 6c 6c 0a 20 20 20 20 20 20 20 20 20  d will.         
24e40 20 2a 2a 20 6e 65 65 64 20 74 6f 20 62 65 20 74   ** need to be t
24e50 65 73 74 65 64 20 6c 61 74 65 72 2e 0a 20 20 20  ested later..   
24e60 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
24e70 20 20 20 20 69 66 28 20 70 53 75 62 57 49 6e 66      if( pSubWInf
24e80 6f 2d 3e 75 6e 74 65 73 74 65 64 54 65 72 6d 73  o->untestedTerms
24e90 20 29 20 75 6e 74 65 73 74 65 64 54 65 72 6d 73   ) untestedTerms
24ea0 20 3d 20 31 3b 0a 0a 20 20 20 20 20 20 20 20 20   = 1;..         
24eb0 20 2f 2a 20 49 66 20 61 6c 6c 20 6f 66 20 74 68   /* If all of th
24ec0 65 20 4f 52 2d 63 6f 6e 6e 65 63 74 65 64 20 74  e OR-connected t
24ed0 65 72 6d 73 20 61 72 65 20 6f 70 74 69 6d 69 7a  erms are optimiz
24ee0 65 64 20 75 73 69 6e 67 20 74 68 65 20 73 61 6d  ed using the sam
24ef0 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69  e.          ** i
24f00 6e 64 65 78 2c 20 61 6e 64 20 74 68 65 20 69 6e  ndex, and the in
24f10 64 65 78 20 69 73 20 6f 70 65 6e 65 64 20 75 73  dex is opened us
24f20 69 6e 67 20 74 68 65 20 73 61 6d 65 20 63 75 72  ing the same cur
24f30 73 6f 72 20 6e 75 6d 62 65 72 0a 20 20 20 20 20  sor number.     
24f40 20 20 20 20 20 2a 2a 20 62 79 20 65 61 63 68 20       ** by each 
24f50 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 57  call to sqlite3W
24f60 68 65 72 65 42 65 67 69 6e 28 29 20 6d 61 64 65  hereBegin() made
24f70 20 62 79 20 74 68 69 73 20 6c 6f 6f 70 2c 20 69   by this loop, i
24f80 74 20 6d 61 79 0a 20 20 20 20 20 20 20 20 20 20  t may.          
24f90 2a 2a 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74  ** be possible t
24fa0 6f 20 75 73 65 20 74 68 61 74 20 69 6e 64 65 78  o use that index
24fb0 20 61 73 20 61 20 63 6f 76 65 72 69 6e 67 20 69   as a covering i
24fc0 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20 20 20  ndex..          
24fd0 2a 2a 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  **.          ** 
24fe0 49 66 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 73  If the call to s
24ff0 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
25000 28 29 20 61 62 6f 76 65 20 72 65 73 75 6c 74 65  () above resulte
25010 64 20 69 6e 20 61 20 73 63 61 6e 20 74 68 61 74  d in a scan that
25020 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75 73  .          ** us
25030 65 73 20 61 6e 20 69 6e 64 65 78 2c 20 61 6e 64  es an index, and
25040 20 74 68 69 73 20 69 73 20 65 69 74 68 65 72 20   this is either 
25050 74 68 65 20 66 69 72 73 74 20 4f 52 2d 63 6f 6e  the first OR-con
25060 6e 65 63 74 65 64 20 74 65 72 6d 0a 20 20 20 20  nected term.    
25070 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73        ** process
25080 65 64 20 6f 72 20 74 68 65 20 69 6e 64 65 78 20  ed or the index 
25090 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 74  is the same as t
250a0 68 61 74 20 75 73 65 64 20 62 79 20 61 6c 6c 20  hat used by all 
250b0 70 72 65 76 69 6f 75 73 0a 20 20 20 20 20 20 20  previous.       
250c0 20 20 20 2a 2a 20 74 65 72 6d 73 2c 20 73 65 74     ** terms, set
250d0 20 70 43 6f 76 20 74 6f 20 74 68 65 20 63 61 6e   pCov to the can
250e0 64 69 64 61 74 65 20 63 6f 76 65 72 69 6e 67 20  didate covering 
250f0 69 6e 64 65 78 2e 20 4f 74 68 65 72 77 69 73 65  index. Otherwise
25100 2c 20 73 65 74 20 0a 20 20 20 20 20 20 20 20 20  , set .         
25110 20 2a 2a 20 70 43 6f 76 20 74 6f 20 4e 55 4c 4c   ** pCov to NULL
25120 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61   to indicate tha
25130 74 20 6e 6f 20 63 61 6e 64 69 64 61 74 65 20 63  t no candidate c
25140 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20 77 69  overing index wi
25150 6c 6c 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ll .          **
25160 20 62 65 20 61 76 61 69 6c 61 62 6c 65 2e 0a 20   be available.. 
25170 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
25180 20 20 20 20 20 20 70 53 75 62 4c 6f 6f 70 20 3d        pSubLoop =
25190 20 70 53 75 62 57 49 6e 66 6f 2d 3e 61 5b 30 5d   pSubWInfo->a[0]
251a0 2e 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 20  .pWLoop;.       
251b0 20 20 20 61 73 73 65 72 74 28 20 28 70 53 75 62     assert( (pSub
251c0 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
251d0 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58  WHERE_AUTO_INDEX
251e0 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  )==0 );.        
251f0 20 20 69 66 28 20 28 70 53 75 62 4c 6f 6f 70 2d    if( (pSubLoop-
25200 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
25210 5f 49 4e 44 45 58 45 44 29 21 3d 30 0a 20 20 20  _INDEXED)!=0.   
25220 20 20 20 20 20 20 20 20 26 26 20 28 69 69 3d 3d          && (ii==
25230 30 20 7c 7c 20 70 53 75 62 4c 6f 6f 70 2d 3e 75  0 || pSubLoop->u
25240 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3d 3d 70  .btree.pIndex==p
25250 43 6f 76 29 0a 20 20 20 20 20 20 20 20 20 20 20  Cov).           
25260 26 26 20 28 48 61 73 52 6f 77 69 64 28 70 54 61  && (HasRowid(pTa
25270 62 29 20 7c 7c 20 21 49 73 50 72 69 6d 61 72 79  b) || !IsPrimary
25280 4b 65 79 49 6e 64 65 78 28 70 53 75 62 4c 6f 6f  KeyIndex(pSubLoo
25290 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
252a0 78 29 29 0a 20 20 20 20 20 20 20 20 20 20 29 7b  x)).          ){
252b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73  .            ass
252c0 65 72 74 28 20 70 53 75 62 57 49 6e 66 6f 2d 3e  ert( pSubWInfo->
252d0 61 5b 30 5d 2e 69 49 64 78 43 75 72 3d 3d 69 43  a[0].iIdxCur==iC
252e0 6f 76 43 75 72 20 29 3b 0a 20 20 20 20 20 20 20  ovCur );.       
252f0 20 20 20 20 20 70 43 6f 76 20 3d 20 70 53 75 62       pCov = pSub
25300 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49  Loop->u.btree.pI
25310 6e 64 65 78 3b 0a 20 20 20 20 20 20 20 20 20 20  ndex;.          
25320 20 20 77 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20    wctrlFlags |= 
25330 57 48 45 52 45 5f 52 45 4f 50 45 4e 5f 49 44 58  WHERE_REOPEN_IDX
25340 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
25350 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  e{.            p
25360 43 6f 76 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Cov = 0;.       
25370 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20     }..          
25380 2f 2a 20 46 69 6e 69 73 68 20 74 68 65 20 6c 6f  /* Finish the lo
25390 6f 70 20 74 68 72 6f 75 67 68 20 74 61 62 6c 65  op through table
253a0 20 65 6e 74 72 69 65 73 20 74 68 61 74 20 6d 61   entries that ma
253b0 74 63 68 20 74 65 72 6d 20 70 4f 72 54 65 72 6d  tch term pOrTerm
253c0 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73  . */.          s
253d0 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70  qlite3WhereEnd(p
253e0 53 75 62 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20  SubWInfo);.     
253f0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
25400 20 7d 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 75   }.    pLevel->u
25410 2e 70 43 6f 76 69 64 78 20 3d 20 70 43 6f 76 3b  .pCovidx = pCov;
25420 0a 20 20 20 20 69 66 28 20 70 43 6f 76 20 29 20  .    if( pCov ) 
25430 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 20  pLevel->iIdxCur 
25440 3d 20 69 43 6f 76 43 75 72 3b 0a 20 20 20 20 69  = iCovCur;.    i
25450 66 28 20 70 41 6e 64 45 78 70 72 20 29 7b 0a 20  f( pAndExpr ){. 
25460 20 20 20 20 20 70 41 6e 64 45 78 70 72 2d 3e 70       pAndExpr->p
25470 4c 65 66 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Left = 0;.      
25480 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
25490 65 28 64 62 2c 20 70 41 6e 64 45 78 70 72 29 3b  e(db, pAndExpr);
254a0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
254b0 65 33 56 64 62 65 43 68 61 6e 67 65 50 31 28 76  e3VdbeChangeP1(v
254c0 2c 20 69 52 65 74 49 6e 69 74 2c 20 73 71 6c 69  , iRetInit, sqli
254d0 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
254e0 64 72 28 76 29 29 3b 0a 20 20 20 20 73 71 6c 69  dr(v));.    sqli
254f0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
25500 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70 4c 65   OP_Goto, 0, pLe
25510 76 65 6c 2d 3e 61 64 64 72 42 72 6b 29 3b 0a 20  vel->addrBrk);. 
25520 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
25530 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 4c  solveLabel(v, iL
25540 6f 6f 70 42 6f 64 79 29 3b 0a 0a 20 20 20 20 69  oopBody);..    i
25550 66 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65  f( pWInfo->nLeve
25560 6c 3e 31 20 29 20 73 71 6c 69 74 65 33 53 74 61  l>1 ) sqlite3Sta
25570 63 6b 46 72 65 65 28 64 62 2c 20 70 4f 72 54 61  ckFree(db, pOrTa
25580 62 29 3b 0a 20 20 20 20 69 66 28 20 21 75 6e 74  b);.    if( !unt
25590 65 73 74 65 64 54 65 72 6d 73 20 29 20 64 69 73  estedTerms ) dis
255a0 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c  ableTerm(pLevel,
255b0 20 70 54 65 72 6d 29 3b 0a 20 20 7d 65 6c 73 65   pTerm);.  }else
255c0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
255d0 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49  E_OMIT_OR_OPTIMI
255e0 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 20 20 7b 0a 20  ZATION */..  {. 
255f0 20 20 20 2f 2a 20 43 61 73 65 20 36 3a 20 20 54     /* Case 6:  T
25600 68 65 72 65 20 69 73 20 6e 6f 20 75 73 61 62 6c  here is no usabl
25610 65 20 69 6e 64 65 78 2e 20 20 57 65 20 6d 75 73  e index.  We mus
25620 74 20 64 6f 20 61 20 63 6f 6d 70 6c 65 74 65 0a  t do a complete.
25630 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
25640 73 63 61 6e 20 6f 66 20 74 68 65 20 65 6e 74 69  scan of the enti
25650 72 65 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f  re table..    */
25660 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73  .    static cons
25670 74 20 75 38 20 61 53 74 65 70 5b 5d 20 3d 20 7b  t u8 aStep[] = {
25680 20 4f 50 5f 4e 65 78 74 2c 20 4f 50 5f 50 72 65   OP_Next, OP_Pre
25690 76 20 7d 3b 0a 20 20 20 20 73 74 61 74 69 63 20  v };.    static 
256a0 63 6f 6e 73 74 20 75 38 20 61 53 74 61 72 74 5b  const u8 aStart[
256b0 5d 20 3d 20 7b 20 4f 50 5f 52 65 77 69 6e 64 2c  ] = { OP_Rewind,
256c0 20 4f 50 5f 4c 61 73 74 20 7d 3b 0a 20 20 20 20   OP_Last };.    
256d0 61 73 73 65 72 74 28 20 62 52 65 76 3d 3d 30 20  assert( bRev==0 
256e0 7c 7c 20 62 52 65 76 3d 3d 31 20 29 3b 0a 20 20  || bRev==1 );.  
256f0 20 20 69 66 28 20 70 54 61 62 49 74 65 6d 2d 3e    if( pTabItem->
25700 69 73 52 65 63 75 72 73 69 76 65 20 29 7b 0a 20  isRecursive ){. 
25710 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 73 20 6d       /* Tables m
25720 61 72 6b 65 64 20 69 73 52 65 63 75 72 73 69 76  arked isRecursiv
25730 65 20 68 61 76 65 20 6f 6e 6c 79 20 61 20 73 69  e have only a si
25740 6e 67 6c 65 20 72 6f 77 20 74 68 61 74 20 69 73  ngle row that is
25750 20 73 74 6f 72 65 64 20 69 6e 0a 20 20 20 20 20   stored in.     
25760 20 2a 2a 20 61 20 70 73 65 75 64 6f 2d 63 75 72   ** a pseudo-cur
25770 73 6f 72 2e 20 20 4e 6f 20 6e 65 65 64 20 74 6f  sor.  No need to
25780 20 52 65 77 69 6e 64 20 6f 72 20 4e 65 78 74 20   Rewind or Next 
25790 73 75 63 68 20 63 75 72 73 6f 72 73 2e 20 2a 2f  such cursors. */
257a0 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f  .      pLevel->o
257b0 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20  p = OP_Noop;.   
257c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c   }else{.      pL
257d0 65 76 65 6c 2d 3e 6f 70 20 3d 20 61 53 74 65 70  evel->op = aStep
257e0 5b 62 52 65 76 5d 3b 0a 20 20 20 20 20 20 70 4c  [bRev];.      pL
257f0 65 76 65 6c 2d 3e 70 31 20 3d 20 69 43 75 72 3b  evel->p1 = iCur;
25800 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  .      pLevel->p
25810 32 20 3d 20 31 20 2b 20 73 71 6c 69 74 65 33 56  2 = 1 + sqlite3V
25820 64 62 65 41 64 64 4f 70 32 28 76 2c 20 61 53 74  dbeAddOp2(v, aSt
25830 61 72 74 5b 62 52 65 76 5d 2c 20 69 43 75 72 2c  art[bRev], iCur,
25840 20 61 64 64 72 42 72 6b 29 3b 0a 20 20 20 20 20   addrBrk);.     
25850 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
25860 76 2c 20 62 52 65 76 3d 3d 30 29 3b 0a 20 20 20  v, bRev==0);.   
25870 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
25880 66 28 76 2c 20 62 52 65 76 21 3d 30 29 3b 0a 20  f(v, bRev!=0);. 
25890 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 35 20       pLevel->p5 
258a0 3d 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41  = SQLITE_STMTSTA
258b0 54 55 53 5f 46 55 4c 4c 53 43 41 4e 5f 53 54 45  TUS_FULLSCAN_STE
258c0 50 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69  P;.    }.  }..#i
258d0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
258e0 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41 54  LE_STMT_SCANSTAT
258f0 55 53 0a 20 20 70 4c 65 76 65 6c 2d 3e 61 64 64  US.  pLevel->add
25900 72 56 69 73 69 74 20 3d 20 73 71 6c 69 74 65 33  rVisit = sqlite3
25910 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
25920 76 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a  v);.#endif..  /*
25930 20 49 6e 73 65 72 74 20 63 6f 64 65 20 74 6f 20   Insert code to 
25940 74 65 73 74 20 65 76 65 72 79 20 73 75 62 65 78  test every subex
25950 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 63 61  pression that ca
25960 6e 20 62 65 20 63 6f 6d 70 6c 65 74 65 6c 79 0a  n be completely.
25970 20 20 2a 2a 20 63 6f 6d 70 75 74 65 64 20 75 73    ** computed us
25980 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20  ing the current 
25990 73 65 74 20 6f 66 20 74 61 62 6c 65 73 2e 0a 20  set of tables.. 
259a0 20 2a 2f 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d   */.  for(pTerm=
259b0 70 57 43 2d 3e 61 2c 20 6a 3d 70 57 43 2d 3e 6e  pWC->a, j=pWC->n
259c0 54 65 72 6d 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c 20  Term; j>0; j--, 
259d0 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 45 78  pTerm++){.    Ex
259e0 70 72 20 2a 70 45 3b 0a 20 20 20 20 69 6e 74 20  pr *pE;.    int 
259f0 73 6b 69 70 4c 69 6b 65 41 64 64 72 20 3d 20 30  skipLikeAddr = 0
25a00 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
25a10 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
25a20 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b   TERM_VIRTUAL );
25a30 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
25a40 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
25a50 54 45 52 4d 5f 43 4f 44 45 44 20 29 3b 0a 20 20  TERM_CODED );.  
25a60 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46    if( pTerm->wtF
25a70 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 56 49 52  lags & (TERM_VIR
25a80 54 55 41 4c 7c 54 45 52 4d 5f 43 4f 44 45 44 29  TUAL|TERM_CODED)
25a90 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
25aa0 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65   if( (pTerm->pre
25ab0 72 65 71 41 6c 6c 20 26 20 70 4c 65 76 65 6c 2d  reqAll & pLevel-
25ac0 3e 6e 6f 74 52 65 61 64 79 29 21 3d 30 20 29 7b  >notReady)!=0 ){
25ad0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
25ae0 20 70 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65   pWInfo->unteste
25af0 64 54 65 72 6d 73 3d 3d 30 0a 20 20 20 20 20 20  dTerms==0.      
25b00 20 20 20 20 20 20 20 20 20 26 26 20 28 70 57 49           && (pWI
25b10 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
25b20 26 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45  & WHERE_ONETABLE
25b30 5f 4f 4e 4c 59 29 21 3d 30 20 29 3b 0a 20 20 20  _ONLY)!=0 );.   
25b40 20 20 20 70 57 49 6e 66 6f 2d 3e 75 6e 74 65 73     pWInfo->untes
25b50 74 65 64 54 65 72 6d 73 20 3d 20 31 3b 0a 20 20  tedTerms = 1;.  
25b60 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
25b70 20 20 7d 0a 20 20 20 20 70 45 20 3d 20 70 54 65    }.    pE = pTe
25b80 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 61  rm->pExpr;.    a
25b90 73 73 65 72 74 28 20 70 45 21 3d 30 20 29 3b 0a  ssert( pE!=0 );.
25ba0 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e      if( pLevel->
25bb0 69 4c 65 66 74 4a 6f 69 6e 20 26 26 20 21 45 78  iLeftJoin && !Ex
25bc0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
25bd0 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29  , EP_FromJoin) )
25be0 7b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  {.      continue
25bf0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
25c00 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
25c10 20 54 45 52 4d 5f 4c 49 4b 45 43 4f 4e 44 20 29   TERM_LIKECOND )
25c20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
25c30 70 4c 65 76 65 6c 2d 3e 69 4c 69 6b 65 52 65 70  pLevel->iLikeRep
25c40 43 6e 74 72 3e 30 20 29 3b 0a 20 20 20 20 20 20  Cntr>0 );.      
25c50 73 6b 69 70 4c 69 6b 65 41 64 64 72 20 3d 20 73  skipLikeAddr = s
25c60 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
25c70 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 70 4c  (v, OP_IfNot, pL
25c80 65 76 65 6c 2d 3e 69 4c 69 6b 65 52 65 70 43 6e  evel->iLikeRepCn
25c90 74 72 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  tr);.      VdbeC
25ca0 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
25cb0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  }.    sqlite3Exp
25cc0 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
25cd0 20 70 45 2c 20 61 64 64 72 43 6f 6e 74 2c 20 53   pE, addrCont, S
25ce0 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
25cf0 29 3b 0a 20 20 20 20 69 66 28 20 73 6b 69 70 4c  );.    if( skipL
25d00 69 6b 65 41 64 64 72 20 29 20 73 71 6c 69 74 65  ikeAddr ) sqlite
25d10 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
25d20 20 73 6b 69 70 4c 69 6b 65 41 64 64 72 29 3b 0a   skipLikeAddr);.
25d30 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61      pTerm->wtFla
25d40 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44  gs |= TERM_CODED
25d50 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 73 65  ;.  }..  /* Inse
25d60 72 74 20 63 6f 64 65 20 74 6f 20 74 65 73 74 20  rt code to test 
25d70 66 6f 72 20 69 6d 70 6c 69 65 64 20 63 6f 6e 73  for implied cons
25d80 74 72 61 69 6e 74 73 20 62 61 73 65 64 20 6f 6e  traints based on
25d90 20 74 72 61 6e 73 69 74 69 76 69 74 79 0a 20 20   transitivity.  
25da0 2a 2a 20 6f 66 20 74 68 65 20 22 3d 3d 22 20 6f  ** of the "==" o
25db0 70 65 72 61 74 6f 72 2e 0a 20 20 2a 2a 0a 20 20  perator..  **.  
25dc0 2a 2a 20 45 78 61 6d 70 6c 65 3a 20 49 66 20 74  ** Example: If t
25dd0 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
25de0 63 6f 6e 74 61 69 6e 73 20 22 74 31 2e 61 3d 74  contains "t1.a=t
25df0 32 2e 62 22 20 61 6e 64 20 22 74 32 2e 62 3d 31  2.b" and "t2.b=1
25e00 32 33 22 0a 20 20 2a 2a 20 61 6e 64 20 77 65 20  23".  ** and we 
25e10 61 72 65 20 63 6f 64 69 6e 67 20 74 68 65 20 74  are coding the t
25e20 31 20 6c 6f 6f 70 20 61 6e 64 20 74 68 65 20 74  1 loop and the t
25e30 32 20 6c 6f 6f 70 20 68 61 73 20 6e 6f 74 20 79  2 loop has not y
25e40 65 74 20 63 6f 64 65 64 2c 0a 20 20 2a 2a 20 74  et coded,.  ** t
25e50 68 65 6e 20 77 65 20 63 61 6e 6e 6f 74 20 75 73  hen we cannot us
25e60 65 20 74 68 65 20 22 74 31 2e 61 3d 74 32 2e 62  e the "t1.a=t2.b
25e70 22 20 63 6f 6e 73 74 72 61 69 6e 74 2c 20 62 75  " constraint, bu
25e80 74 20 77 65 20 63 61 6e 20 63 6f 64 65 0a 20 20  t we can code.  
25e90 2a 2a 20 74 68 65 20 69 6d 70 6c 69 65 64 20 22  ** the implied "
25ea0 74 31 2e 61 3d 31 32 33 22 20 63 6f 6e 73 74 72  t1.a=123" constr
25eb0 61 69 6e 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  aint..  */.  for
25ec0 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 2c 20 6a  (pTerm=pWC->a, j
25ed0 3d 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 6a 3e 30  =pWC->nTerm; j>0
25ee0 3b 20 6a 2d 2d 2c 20 70 54 65 72 6d 2b 2b 29 7b  ; j--, pTerm++){
25ef0 0a 20 20 20 20 45 78 70 72 20 2a 70 45 2c 20 2a  .    Expr *pE, *
25f00 70 45 41 6c 74 3b 0a 20 20 20 20 57 68 65 72 65  pEAlt;.    Where
25f10 54 65 72 6d 20 2a 70 41 6c 74 3b 0a 20 20 20 20  Term *pAlt;.    
25f20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61  if( pTerm->wtFla
25f30 67 73 20 26 20 28 54 45 52 4d 5f 56 49 52 54 55  gs & (TERM_VIRTU
25f40 41 4c 7c 54 45 52 4d 5f 43 4f 44 45 44 29 20 29  AL|TERM_CODED) )
25f50 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
25f60 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  f( pTerm->eOpera
25f70 74 6f 72 21 3d 28 57 4f 5f 45 51 55 49 56 7c 57  tor!=(WO_EQUIV|W
25f80 4f 5f 45 51 29 20 29 20 63 6f 6e 74 69 6e 75 65  O_EQ) ) continue
25f90 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  ;.    if( pTerm-
25fa0 3e 6c 65 66 74 43 75 72 73 6f 72 21 3d 69 43 75  >leftCursor!=iCu
25fb0 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  r ) continue;.  
25fc0 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 4c    if( pLevel->iL
25fd0 65 66 74 4a 6f 69 6e 20 29 20 63 6f 6e 74 69 6e  eftJoin ) contin
25fe0 75 65 3b 0a 20 20 20 20 70 45 20 3d 20 70 54 65  ue;.    pE = pTe
25ff0 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 61  rm->pExpr;.    a
26000 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
26010 72 6f 70 65 72 74 79 28 70 45 2c 20 45 50 5f 46  roperty(pE, EP_F
26020 72 6f 6d 4a 6f 69 6e 29 20 29 3b 0a 20 20 20 20  romJoin) );.    
26030 61 73 73 65 72 74 28 20 28 70 54 65 72 6d 2d 3e  assert( (pTerm->
26040 70 72 65 72 65 71 52 69 67 68 74 20 26 20 70 4c  prereqRight & pL
26050 65 76 65 6c 2d 3e 6e 6f 74 52 65 61 64 79 29 21  evel->notReady)!
26060 3d 30 20 29 3b 0a 20 20 20 20 70 41 6c 74 20 3d  =0 );.    pAlt =
26070 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69   findTerm(pWC, i
26080 43 75 72 2c 20 70 54 65 72 6d 2d 3e 75 2e 6c 65  Cur, pTerm->u.le
26090 66 74 43 6f 6c 75 6d 6e 2c 20 6e 6f 74 52 65 61  ftColumn, notRea
260a0 64 79 2c 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 2c  dy, WO_EQ|WO_IN,
260b0 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 41 6c   0);.    if( pAl
260c0 74 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  t==0 ) continue;
260d0 0a 20 20 20 20 69 66 28 20 70 41 6c 74 2d 3e 77  .    if( pAlt->w
260e0 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 43  tFlags & (TERM_C
260f0 4f 44 45 44 29 20 29 20 63 6f 6e 74 69 6e 75 65  ODED) ) continue
26100 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
26110 70 41 6c 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20  pAlt->eOperator 
26120 26 20 57 4f 5f 45 51 20 29 3b 0a 20 20 20 20 74  & WO_EQ );.    t
26130 65 73 74 63 61 73 65 28 20 70 41 6c 74 2d 3e 65  estcase( pAlt->e
26140 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e  Operator & WO_IN
26150 20 29 3b 0a 20 20 20 20 56 64 62 65 4d 6f 64 75   );.    VdbeModu
26160 6c 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 62  leComment((v, "b
26170 65 67 69 6e 20 74 72 61 6e 73 69 74 69 76 65 20  egin transitive 
26180 63 6f 6e 73 74 72 61 69 6e 74 22 29 29 3b 0a 20  constraint"));. 
26190 20 20 20 70 45 41 6c 74 20 3d 20 73 71 6c 69 74     pEAlt = sqlit
261a0 65 33 53 74 61 63 6b 41 6c 6c 6f 63 52 61 77 28  e3StackAllocRaw(
261b0 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 45 41 6c  db, sizeof(*pEAl
261c0 74 29 29 3b 0a 20 20 20 20 69 66 28 20 70 45 41  t));.    if( pEA
261d0 6c 74 20 29 7b 0a 20 20 20 20 20 20 2a 70 45 41  lt ){.      *pEA
261e0 6c 74 20 3d 20 2a 70 41 6c 74 2d 3e 70 45 78 70  lt = *pAlt->pExp
261f0 72 3b 0a 20 20 20 20 20 20 70 45 41 6c 74 2d 3e  r;.      pEAlt->
26200 70 4c 65 66 74 20 3d 20 70 45 2d 3e 70 4c 65 66  pLeft = pE->pLef
26210 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  t;.      sqlite3
26220 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
26230 73 65 2c 20 70 45 41 6c 74 2c 20 61 64 64 72 43  se, pEAlt, addrC
26240 6f 6e 74 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50  ont, SQLITE_JUMP
26250 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73  IFNULL);.      s
26260 71 6c 69 74 65 33 53 74 61 63 6b 46 72 65 65 28  qlite3StackFree(
26270 64 62 2c 20 70 45 41 6c 74 29 3b 0a 20 20 20 20  db, pEAlt);.    
26280 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 6f 72 20  }.  }..  /* For 
26290 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49  a LEFT OUTER JOI
262a0 4e 2c 20 67 65 6e 65 72 61 74 65 20 63 6f 64 65  N, generate code
262b0 20 74 68 61 74 20 77 69 6c 6c 20 72 65 63 6f 72   that will recor
262c0 64 20 74 68 65 20 66 61 63 74 20 74 68 61 74 0a  d the fact that.
262d0 20 20 2a 2a 20 61 74 20 6c 65 61 73 74 20 6f 6e    ** at least on
262e0 65 20 72 6f 77 20 6f 66 20 74 68 65 20 72 69 67  e row of the rig
262f0 68 74 20 74 61 62 6c 65 20 68 61 73 20 6d 61 74  ht table has mat
26300 63 68 65 64 20 74 68 65 20 6c 65 66 74 20 74 61  ched the left ta
26310 62 6c 65 2e 20 20 0a 20 20 2a 2f 0a 20 20 69 66  ble.  .  */.  if
26320 28 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a  ( pLevel->iLeftJ
26330 6f 69 6e 20 29 7b 0a 20 20 20 20 70 4c 65 76 65  oin ){.    pLeve
26340 6c 2d 3e 61 64 64 72 46 69 72 73 74 20 3d 20 73  l->addrFirst = s
26350 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
26360 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 73 71  tAddr(v);.    sq
26370 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
26380 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31  v, OP_Integer, 1
26390 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a  , pLevel->iLeftJ
263a0 6f 69 6e 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  oin);.    VdbeCo
263b0 6d 6d 65 6e 74 28 28 76 2c 20 22 72 65 63 6f 72  mment((v, "recor
263c0 64 20 4c 45 46 54 20 4a 4f 49 4e 20 68 69 74 22  d LEFT JOIN hit"
263d0 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  ));.    sqlite3E
263e0 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50  xprCacheClear(pP
263f0 61 72 73 65 29 3b 0a 20 20 20 20 66 6f 72 28 70  arse);.    for(p
26400 54 65 72 6d 3d 70 57 43 2d 3e 61 2c 20 6a 3d 30  Term=pWC->a, j=0
26410 3b 20 6a 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20  ; j<pWC->nTerm; 
26420 6a 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20  j++, pTerm++){. 
26430 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
26440 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
26450 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a  TERM_VIRTUAL );.
26460 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
26470 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
26480 20 54 45 52 4d 5f 43 4f 44 45 44 20 29 3b 0a 20   TERM_CODED );. 
26490 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e       if( pTerm->
264a0 77 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f  wtFlags & (TERM_
264b0 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 43 4f 44  VIRTUAL|TERM_COD
264c0 45 44 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ED) ) continue;.
264d0 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d        if( (pTerm
264e0 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26 20 70 4c  ->prereqAll & pL
264f0 65 76 65 6c 2d 3e 6e 6f 74 52 65 61 64 79 29 21  evel->notReady)!
26500 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  =0 ){.        as
26510 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 75 6e  sert( pWInfo->un
26520 74 65 73 74 65 64 54 65 72 6d 73 20 29 3b 0a 20  testedTerms );. 
26530 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
26540 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
26550 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 70 45  ssert( pTerm->pE
26560 78 70 72 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  xpr );.      sql
26570 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
26580 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2d 3e 70  pParse, pTerm->p
26590 45 78 70 72 2c 20 61 64 64 72 43 6f 6e 74 2c 20  Expr, addrCont, 
265a0 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
265b0 4c 29 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d  L);.      pTerm-
265c0 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d  >wtFlags |= TERM
265d0 5f 43 4f 44 45 44 3b 0a 20 20 20 20 7d 0a 20 20  _CODED;.    }.  
265e0 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 4c 65 76  }..  return pLev
265f0 65 6c 2d 3e 6e 6f 74 52 65 61 64 79 3b 0a 7d 0a  el->notReady;.}.
26600 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41  .#ifdef WHERETRA
26610 43 45 5f 45 4e 41 42 4c 45 44 0a 2f 2a 0a 2a 2a  CE_ENABLED./*.**
26620 20 50 72 69 6e 74 20 74 68 65 20 63 6f 6e 74 65   Print the conte
26630 6e 74 20 6f 66 20 61 20 57 68 65 72 65 54 65 72  nt of a WhereTer
26640 6d 20 6f 62 6a 65 63 74 0a 2a 2f 0a 73 74 61 74  m object.*/.stat
26650 69 63 20 76 6f 69 64 20 77 68 65 72 65 54 65 72  ic void whereTer
26660 6d 50 72 69 6e 74 28 57 68 65 72 65 54 65 72 6d  mPrint(WhereTerm
26670 20 2a 70 54 65 72 6d 2c 20 69 6e 74 20 69 54 65   *pTerm, int iTe
26680 72 6d 29 7b 0a 20 20 69 66 28 20 70 54 65 72 6d  rm){.  if( pTerm
26690 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
266a0 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 54  e3DebugPrintf("T
266b0 45 52 4d 2d 25 2d 33 64 20 4e 55 4c 4c 5c 6e 22  ERM-%-3d NULL\n"
266c0 2c 20 69 54 65 72 6d 29 3b 0a 20 20 7d 65 6c 73  , iTerm);.  }els
266d0 65 7b 0a 20 20 20 20 63 68 61 72 20 7a 54 79 70  e{.    char zTyp
266e0 65 5b 34 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79  e[4];.    memcpy
266f0 28 7a 54 79 70 65 2c 20 22 2e 2e 2e 22 2c 20 34  (zType, "...", 4
26700 29 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d  );.    if( pTerm
26710 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
26720 5f 56 49 52 54 55 41 4c 20 29 20 7a 54 79 70 65  _VIRTUAL ) zType
26730 5b 30 5d 20 3d 20 27 56 27 3b 0a 20 20 20 20 69  [0] = 'V';.    i
26740 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  f( pTerm->eOpera
26750 74 6f 72 20 26 20 57 4f 5f 45 51 55 49 56 20 20  tor & WO_EQUIV  
26760 29 20 7a 54 79 70 65 5b 31 5d 20 3d 20 27 45 27  ) zType[1] = 'E'
26770 3b 0a 20 20 20 20 69 66 28 20 45 78 70 72 48 61  ;.    if( ExprHa
26780 73 50 72 6f 70 65 72 74 79 28 70 54 65 72 6d 2d  sProperty(pTerm-
26790 3e 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a  >pExpr, EP_FromJ
267a0 6f 69 6e 29 20 29 20 7a 54 79 70 65 5b 32 5d 20  oin) ) zType[2] 
267b0 3d 20 27 4c 27 3b 0a 20 20 20 20 73 71 6c 69 74  = 'L';.    sqlit
267c0 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 54  e3DebugPrintf("T
267d0 45 52 4d 2d 25 2d 33 64 20 25 70 20 25 73 20 63  ERM-%-3d %p %s c
267e0 75 72 73 6f 72 3d 25 2d 33 64 20 70 72 6f 62 3d  ursor=%-3d prob=
267f0 25 2d 33 64 20 6f 70 3d 30 78 25 30 33 78 5c 6e  %-3d op=0x%03x\n
26800 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
26810 20 20 20 20 20 20 20 20 20 20 69 54 65 72 6d 2c            iTerm,
26820 20 70 54 65 72 6d 2c 20 7a 54 79 70 65 2c 20 70   pTerm, zType, p
26830 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
26840 2c 20 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72  , pTerm->truthPr
26850 6f 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ob,.            
26860 20 20 20 20 20 20 20 20 20 20 20 70 54 65 72 6d             pTerm
26870 2d 3e 65 4f 70 65 72 61 74 6f 72 29 3b 0a 20 20  ->eOperator);.  
26880 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65    sqlite3TreeVie
26890 77 45 78 70 72 28 30 2c 20 70 54 65 72 6d 2d 3e  wExpr(0, pTerm->
268a0 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 7d 0a 7d  pExpr, 0);.  }.}
268b0 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20  .#endif..#ifdef 
268c0 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c  WHERETRACE_ENABL
268d0 45 44 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61  ED./*.** Print a
268e0 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63   WhereLoop objec
268f0 74 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67 20  t for debugging 
26900 70 75 72 70 6f 73 65 73 0a 2a 2f 0a 73 74 61 74  purposes.*/.stat
26910 69 63 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f  ic void whereLoo
26920 70 50 72 69 6e 74 28 57 68 65 72 65 4c 6f 6f 70  pPrint(WhereLoop
26930 20 2a 70 2c 20 57 68 65 72 65 43 6c 61 75 73 65   *p, WhereClause
26940 20 2a 70 57 43 29 7b 0a 20 20 57 68 65 72 65 49   *pWC){.  WhereI
26950 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70 57  nfo *pWInfo = pW
26960 43 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 69 6e 74  C->pWInfo;.  int
26970 20 6e 62 20 3d 20 31 2b 28 70 57 49 6e 66 6f 2d   nb = 1+(pWInfo-
26980 3e 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 2b  >pTabList->nSrc+
26990 37 29 2f 38 3b 0a 20 20 73 74 72 75 63 74 20 53  7)/8;.  struct S
269a0 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
269b0 65 6d 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61  em = pWInfo->pTa
269c0 62 4c 69 73 74 2d 3e 61 20 2b 20 70 2d 3e 69 54  bList->a + p->iT
269d0 61 62 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  ab;.  Table *pTa
269e0 62 20 3d 20 70 49 74 65 6d 2d 3e 70 54 61 62 3b  b = pItem->pTab;
269f0 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50  .  sqlite3DebugP
26a00 72 69 6e 74 66 28 22 25 63 25 32 64 2e 25 30 2a  rintf("%c%2d.%0*
26a10 6c 6c 78 2e 25 30 2a 6c 6c 78 22 2c 20 70 2d 3e  llx.%0*llx", p->
26a20 63 49 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20  cId,.           
26a30 20 20 20 20 20 20 20 20 20 20 70 2d 3e 69 54 61            p->iTa
26a40 62 2c 20 6e 62 2c 20 70 2d 3e 6d 61 73 6b 53 65  b, nb, p->maskSe
26a50 6c 66 2c 20 6e 62 2c 20 70 2d 3e 70 72 65 72 65  lf, nb, p->prere
26a60 71 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62  q);.  sqlite3Deb
26a70 75 67 50 72 69 6e 74 66 28 22 20 25 31 32 73 22  ugPrintf(" %12s"
26a80 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
26a90 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 7a 41         pItem->zA
26aa0 6c 69 61 73 20 3f 20 70 49 74 65 6d 2d 3e 7a 41  lias ? pItem->zA
26ab0 6c 69 61 73 20 3a 20 70 54 61 62 2d 3e 7a 4e 61  lias : pTab->zNa
26ac0 6d 65 29 3b 0a 20 20 69 66 28 20 28 70 2d 3e 77  me);.  if( (p->w
26ad0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56  sFlags & WHERE_V
26ae0 49 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30 20  IRTUALTABLE)==0 
26af0 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ){.    const cha
26b00 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66  r *zName;.    if
26b10 28 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  ( p->u.btree.pIn
26b20 64 65 78 20 26 26 20 28 7a 4e 61 6d 65 20 3d 20  dex && (zName = 
26b30 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
26b40 78 2d 3e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a  x->zName)!=0 ){.
26b50 20 20 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d        if( strncm
26b60 70 28 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65  p(zName, "sqlite
26b70 5f 61 75 74 6f 69 6e 64 65 78 5f 22 2c 20 31 37  _autoindex_", 17
26b80 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
26b90 69 6e 74 20 69 20 3d 20 73 71 6c 69 74 65 33 53  int i = sqlite3S
26ba0 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 20 2d  trlen30(zName) -
26bb0 20 31 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c   1;.        whil
26bc0 65 28 20 7a 4e 61 6d 65 5b 69 5d 21 3d 27 5f 27  e( zName[i]!='_'
26bd0 20 29 20 69 2d 2d 3b 0a 20 20 20 20 20 20 20 20   ) i--;.        
26be0 7a 4e 61 6d 65 20 2b 3d 20 69 3b 0a 20 20 20 20  zName += i;.    
26bf0 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
26c00 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 2e 25  3DebugPrintf(".%
26c10 2d 31 36 73 20 25 32 64 22 2c 20 7a 4e 61 6d 65  -16s %2d", zName
26c20 2c 20 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  , p->u.btree.nEq
26c30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
26c40 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
26c50 50 72 69 6e 74 66 28 22 25 32 30 73 22 2c 22 22  Printf("%20s",""
26c60 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
26c70 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 3b 0a 20  {.    char *z;. 
26c80 20 20 20 69 66 28 20 70 2d 3e 75 2e 76 74 61 62     if( p->u.vtab
26c90 2e 69 64 78 53 74 72 20 29 7b 0a 20 20 20 20 20  .idxStr ){.     
26ca0 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72   z = sqlite3_mpr
26cb0 69 6e 74 66 28 22 28 25 64 2c 5c 22 25 73 5c 22  intf("(%d,\"%s\"
26cc0 2c 25 78 29 22 2c 0a 20 20 20 20 20 20 20 20 20  ,%x)",.         
26cd0 20 20 20 20 20 20 20 70 2d 3e 75 2e 76 74 61 62         p->u.vtab
26ce0 2e 69 64 78 4e 75 6d 2c 20 70 2d 3e 75 2e 76 74  .idxNum, p->u.vt
26cf0 61 62 2e 69 64 78 53 74 72 2c 20 70 2d 3e 75 2e  ab.idxStr, p->u.
26d00 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 29 3b 0a  vtab.omitMask);.
26d10 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
26d20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72   z = sqlite3_mpr
26d30 69 6e 74 66 28 22 28 25 64 2c 25 78 29 22 2c 20  intf("(%d,%x)", 
26d40 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 4e 75 6d  p->u.vtab.idxNum
26d50 2c 20 70 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69 74  , p->u.vtab.omit
26d60 4d 61 73 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Mask);.    }.   
26d70 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
26d80 6e 74 66 28 22 20 25 2d 31 39 73 22 2c 20 7a 29  ntf(" %-19s", z)
26d90 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
26da0 65 65 28 7a 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ee(z);.  }.  if(
26db0 20 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48   p->wsFlags & WH
26dc0 45 52 45 5f 53 4b 49 50 53 43 41 4e 20 29 7b 0a  ERE_SKIPSCAN ){.
26dd0 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
26de0 50 72 69 6e 74 66 28 22 20 66 20 25 30 35 78 20  Printf(" f %05x 
26df0 25 64 2d 25 64 22 2c 20 70 2d 3e 77 73 46 6c 61  %d-%d", p->wsFla
26e00 67 73 2c 20 70 2d 3e 6e 4c 54 65 72 6d 2c 70 2d  gs, p->nLTerm,p-
26e10 3e 6e 53 6b 69 70 29 3b 0a 20 20 7d 65 6c 73 65  >nSkip);.  }else
26e20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  {.    sqlite3Deb
26e30 75 67 50 72 69 6e 74 66 28 22 20 66 20 25 30 35  ugPrintf(" f %05
26e40 78 20 4e 20 25 64 22 2c 20 70 2d 3e 77 73 46 6c  x N %d", p->wsFl
26e50 61 67 73 2c 20 70 2d 3e 6e 4c 54 65 72 6d 29 3b  ags, p->nLTerm);
26e60 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 65  .  }.  sqlite3De
26e70 62 75 67 50 72 69 6e 74 66 28 22 20 63 6f 73 74  bugPrintf(" cost
26e80 20 25 64 2c 25 64 2c 25 64 5c 6e 22 2c 20 70 2d   %d,%d,%d\n", p-
26e90 3e 72 53 65 74 75 70 2c 20 70 2d 3e 72 52 75 6e  >rSetup, p->rRun
26ea0 2c 20 70 2d 3e 6e 4f 75 74 29 3b 0a 20 20 69 66  , p->nOut);.  if
26eb0 28 20 70 2d 3e 6e 4c 54 65 72 6d 20 26 26 20 28  ( p->nLTerm && (
26ec0 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63  sqlite3WhereTrac
26ed0 65 20 26 20 30 78 31 30 30 29 21 3d 30 20 29 7b  e & 0x100)!=0 ){
26ee0 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
26ef0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4c  for(i=0; i<p->nL
26f00 54 65 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Term; i++){.    
26f10 20 20 77 68 65 72 65 54 65 72 6d 50 72 69 6e 74    whereTermPrint
26f20 28 70 2d 3e 61 4c 54 65 72 6d 5b 69 5d 2c 20 69  (p->aLTerm[i], i
26f30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23  );.    }.  }.}.#
26f40 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  endif../*.** Con
26f50 76 65 72 74 20 62 75 6c 6b 20 6d 65 6d 6f 72 79  vert bulk memory
26f60 20 69 6e 74 6f 20 61 20 76 61 6c 69 64 20 57 68   into a valid Wh
26f70 65 72 65 4c 6f 6f 70 20 74 68 61 74 20 63 61 6e  ereLoop that can
26f80 20 62 65 20 70 61 73 73 65 64 0a 2a 2a 20 74 6f   be passed.** to
26f90 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 20   whereLoopClear 
26fa0 68 61 72 6d 6c 65 73 73 6c 79 2e 0a 2a 2f 0a 73  harmlessly..*/.s
26fb0 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65  tatic void where
26fc0 4c 6f 6f 70 49 6e 69 74 28 57 68 65 72 65 4c 6f  LoopInit(WhereLo
26fd0 6f 70 20 2a 70 29 7b 0a 20 20 70 2d 3e 61 4c 54  op *p){.  p->aLT
26fe0 65 72 6d 20 3d 20 70 2d 3e 61 4c 54 65 72 6d 53  erm = p->aLTermS
26ff0 70 61 63 65 3b 0a 20 20 70 2d 3e 6e 4c 54 65 72  pace;.  p->nLTer
27000 6d 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e 4c 53 6c  m = 0;.  p->nLSl
27010 6f 74 20 3d 20 41 72 72 61 79 53 69 7a 65 28 70  ot = ArraySize(p
27020 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 29 3b 0a  ->aLTermSpace);.
27030 20 20 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20 30    p->wsFlags = 0
27040 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72  ;.}../*.** Clear
27050 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 2e 75   the WhereLoop.u
27060 20 75 6e 69 6f 6e 2e 20 20 4c 65 61 76 65 20 57   union.  Leave W
27070 68 65 72 65 4c 6f 6f 70 2e 70 4c 54 65 72 6d 20  hereLoop.pLTerm 
27080 69 6e 74 61 63 74 2e 0a 2a 2f 0a 73 74 61 74 69  intact..*/.stati
27090 63 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70  c void whereLoop
270a0 43 6c 65 61 72 55 6e 69 6f 6e 28 73 71 6c 69 74  ClearUnion(sqlit
270b0 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f  e3 *db, WhereLoo
270c0 70 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e  p *p){.  if( p->
270d0 77 73 46 6c 61 67 73 20 26 20 28 57 48 45 52 45  wsFlags & (WHERE
270e0 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 7c 57 48  _VIRTUALTABLE|WH
270f0 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 20  ERE_AUTO_INDEX) 
27100 29 7b 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 77  ){.    if( (p->w
27110 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56  sFlags & WHERE_V
27120 49 52 54 55 41 4c 54 41 42 4c 45 29 21 3d 30 20  IRTUALTABLE)!=0 
27130 26 26 20 70 2d 3e 75 2e 76 74 61 62 2e 6e 65 65  && p->u.vtab.nee
27140 64 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20 73  dFree ){.      s
27150 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 75  qlite3_free(p->u
27160 2e 76 74 61 62 2e 69 64 78 53 74 72 29 3b 0a 20  .vtab.idxStr);. 
27170 20 20 20 20 20 70 2d 3e 75 2e 76 74 61 62 2e 6e       p->u.vtab.n
27180 65 65 64 46 72 65 65 20 3d 20 30 3b 0a 20 20 20  eedFree = 0;.   
27190 20 20 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78     p->u.vtab.idx
271a0 53 74 72 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  Str = 0;.    }el
271b0 73 65 20 69 66 28 20 28 70 2d 3e 77 73 46 6c 61  se if( (p->wsFla
271c0 67 73 20 26 20 57 48 45 52 45 5f 41 55 54 4f 5f  gs & WHERE_AUTO_
271d0 49 4e 44 45 58 29 21 3d 30 20 26 26 20 70 2d 3e  INDEX)!=0 && p->
271e0 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 21 3d  u.btree.pIndex!=
271f0 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
27200 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
27210 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 2d 3e  u.btree.pIndex->
27220 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 20 20 20 20  zColAff);.      
27230 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
27240 2c 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  , p->u.btree.pIn
27250 64 65 78 29 3b 0a 20 20 20 20 20 20 70 2d 3e 75  dex);.      p->u
27260 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20  .btree.pIndex = 
27270 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  0;.    }.  }.}..
27280 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65  /*.** Deallocate
27290 20 69 6e 74 65 72 6e 61 6c 20 6d 65 6d 6f 72 79   internal memory
272a0 20 75 73 65 64 20 62 79 20 61 20 57 68 65 72 65   used by a Where
272b0 4c 6f 6f 70 20 6f 62 6a 65 63 74 0a 2a 2f 0a 73  Loop object.*/.s
272c0 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65  tatic void where
272d0 4c 6f 6f 70 43 6c 65 61 72 28 73 71 6c 69 74 65  LoopClear(sqlite
272e0 33 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f 70  3 *db, WhereLoop
272f0 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 61   *p){.  if( p->a
27300 4c 54 65 72 6d 21 3d 70 2d 3e 61 4c 54 65 72 6d  LTerm!=p->aLTerm
27310 53 70 61 63 65 20 29 20 73 71 6c 69 74 65 33 44  Space ) sqlite3D
27320 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 4c 54  bFree(db, p->aLT
27330 65 72 6d 29 3b 0a 20 20 77 68 65 72 65 4c 6f 6f  erm);.  whereLoo
27340 70 43 6c 65 61 72 55 6e 69 6f 6e 28 64 62 2c 20  pClearUnion(db, 
27350 70 29 3b 0a 20 20 77 68 65 72 65 4c 6f 6f 70 49  p);.  whereLoopI
27360 6e 69 74 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  nit(p);.}../*.**
27370 20 49 6e 63 72 65 61 73 65 20 74 68 65 20 6d 65   Increase the me
27380 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
27390 66 6f 72 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72  for pLoop->aLTer
273a0 6d 5b 5d 20 74 6f 20 62 65 20 61 74 20 6c 65 61  m[] to be at lea
273b0 73 74 20 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  st n..*/.static 
273c0 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 52 65 73  int whereLoopRes
273d0 69 7a 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ize(sqlite3 *db,
273e0 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 2c 20 69   WhereLoop *p, i
273f0 6e 74 20 6e 29 7b 0a 20 20 57 68 65 72 65 54 65  nt n){.  WhereTe
27400 72 6d 20 2a 2a 70 61 4e 65 77 3b 0a 20 20 69 66  rm **paNew;.  if
27410 28 20 70 2d 3e 6e 4c 53 6c 6f 74 3e 3d 6e 20 29  ( p->nLSlot>=n )
27420 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
27430 4b 3b 0a 20 20 6e 20 3d 20 28 6e 2b 37 29 26 7e  K;.  n = (n+7)&~
27440 37 3b 0a 20 20 70 61 4e 65 77 20 3d 20 73 71 6c  7;.  paNew = sql
27450 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
27460 64 62 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 61 4c  db, sizeof(p->aL
27470 54 65 72 6d 5b 30 5d 29 2a 6e 29 3b 0a 20 20 69  Term[0])*n);.  i
27480 66 28 20 70 61 4e 65 77 3d 3d 30 20 29 20 72 65  f( paNew==0 ) re
27490 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
274a0 4d 3b 0a 20 20 6d 65 6d 63 70 79 28 70 61 4e 65  M;.  memcpy(paNe
274b0 77 2c 20 70 2d 3e 61 4c 54 65 72 6d 2c 20 73 69  w, p->aLTerm, si
274c0 7a 65 6f 66 28 70 2d 3e 61 4c 54 65 72 6d 5b 30  zeof(p->aLTerm[0
274d0 5d 29 2a 70 2d 3e 6e 4c 53 6c 6f 74 29 3b 0a 20  ])*p->nLSlot);. 
274e0 20 69 66 28 20 70 2d 3e 61 4c 54 65 72 6d 21 3d   if( p->aLTerm!=
274f0 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 20 29  p->aLTermSpace )
27500 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
27510 62 2c 20 70 2d 3e 61 4c 54 65 72 6d 29 3b 0a 20  b, p->aLTerm);. 
27520 20 70 2d 3e 61 4c 54 65 72 6d 20 3d 20 70 61 4e   p->aLTerm = paN
27530 65 77 3b 0a 20 20 70 2d 3e 6e 4c 53 6c 6f 74 20  ew;.  p->nLSlot 
27540 3d 20 6e 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  = n;.  return SQ
27550 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
27560 2a 20 54 72 61 6e 73 66 65 72 20 63 6f 6e 74 65  * Transfer conte
27570 6e 74 20 66 72 6f 6d 20 74 68 65 20 73 65 63 6f  nt from the seco
27580 6e 64 20 70 4c 6f 6f 70 20 69 6e 74 6f 20 74 68  nd pLoop into th
27590 65 20 66 69 72 73 74 2e 0a 2a 2f 0a 73 74 61 74  e first..*/.stat
275a0 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70  ic int whereLoop
275b0 58 66 65 72 28 73 71 6c 69 74 65 33 20 2a 64 62  Xfer(sqlite3 *db
275c0 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 54 6f  , WhereLoop *pTo
275d0 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 46 72  , WhereLoop *pFr
275e0 6f 6d 29 7b 0a 20 20 77 68 65 72 65 4c 6f 6f 70  om){.  whereLoop
275f0 43 6c 65 61 72 55 6e 69 6f 6e 28 64 62 2c 20 70  ClearUnion(db, p
27600 54 6f 29 3b 0a 20 20 69 66 28 20 77 68 65 72 65  To);.  if( where
27610 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62 2c 20 70  LoopResize(db, p
27620 54 6f 2c 20 70 46 72 6f 6d 2d 3e 6e 4c 54 65 72  To, pFrom->nLTer
27630 6d 29 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74  m) ){.    memset
27640 28 26 70 54 6f 2d 3e 75 2c 20 30 2c 20 73 69 7a  (&pTo->u, 0, siz
27650 65 6f 66 28 70 54 6f 2d 3e 75 29 29 3b 0a 20 20  eof(pTo->u));.  
27660 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
27670 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 6d 65 6d  NOMEM;.  }.  mem
27680 63 70 79 28 70 54 6f 2c 20 70 46 72 6f 6d 2c 20  cpy(pTo, pFrom, 
27690 57 48 45 52 45 5f 4c 4f 4f 50 5f 58 46 45 52 5f  WHERE_LOOP_XFER_
276a0 53 5a 29 3b 0a 20 20 6d 65 6d 63 70 79 28 70 54  SZ);.  memcpy(pT
276b0 6f 2d 3e 61 4c 54 65 72 6d 2c 20 70 46 72 6f 6d  o->aLTerm, pFrom
276c0 2d 3e 61 4c 54 65 72 6d 2c 20 70 54 6f 2d 3e 6e  ->aLTerm, pTo->n
276d0 4c 54 65 72 6d 2a 73 69 7a 65 6f 66 28 70 54 6f  LTerm*sizeof(pTo
276e0 2d 3e 61 4c 54 65 72 6d 5b 30 5d 29 29 3b 0a 20  ->aLTerm[0]));. 
276f0 20 69 66 28 20 70 46 72 6f 6d 2d 3e 77 73 46 6c   if( pFrom->wsFl
27700 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54  ags & WHERE_VIRT
27710 55 41 4c 54 41 42 4c 45 20 29 7b 0a 20 20 20 20  UALTABLE ){.    
27720 70 46 72 6f 6d 2d 3e 75 2e 76 74 61 62 2e 6e 65  pFrom->u.vtab.ne
27730 65 64 46 72 65 65 20 3d 20 30 3b 0a 20 20 7d 65  edFree = 0;.  }e
27740 6c 73 65 20 69 66 28 20 28 70 46 72 6f 6d 2d 3e  lse if( (pFrom->
27750 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
27760 41 55 54 4f 5f 49 4e 44 45 58 29 21 3d 30 20 29  AUTO_INDEX)!=0 )
27770 7b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 75 2e 62  {.    pFrom->u.b
27780 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 30 3b  tree.pIndex = 0;
27790 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
277a0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
277b0 2a 20 44 65 6c 65 74 65 20 61 20 57 68 65 72 65  * Delete a Where
277c0 4c 6f 6f 70 20 6f 62 6a 65 63 74 0a 2a 2f 0a 73  Loop object.*/.s
277d0 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65  tatic void where
277e0 4c 6f 6f 70 44 65 6c 65 74 65 28 73 71 6c 69 74  LoopDelete(sqlit
277f0 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f  e3 *db, WhereLoo
27800 70 20 2a 70 29 7b 0a 20 20 77 68 65 72 65 4c 6f  p *p){.  whereLo
27810 6f 70 43 6c 65 61 72 28 64 62 2c 20 70 29 3b 0a  opClear(db, p);.
27820 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
27830 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  db, p);.}../*.**
27840 20 46 72 65 65 20 61 20 57 68 65 72 65 49 6e 66   Free a WhereInf
27850 6f 20 73 74 72 75 63 74 75 72 65 0a 2a 2f 0a 73  o structure.*/.s
27860 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65  tatic void where
27870 49 6e 66 6f 46 72 65 65 28 73 71 6c 69 74 65 33  InfoFree(sqlite3
27880 20 2a 64 62 2c 20 57 68 65 72 65 49 6e 66 6f 20   *db, WhereInfo 
27890 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 69 66 28 20  *pWInfo){.  if( 
278a0 41 4c 57 41 59 53 28 70 57 49 6e 66 6f 29 20 29  ALWAYS(pWInfo) )
278b0 7b 0a 20 20 20 20 77 68 65 72 65 43 6c 61 75 73  {.    whereClaus
278c0 65 43 6c 65 61 72 28 26 70 57 49 6e 66 6f 2d 3e  eClear(&pWInfo->
278d0 73 57 43 29 3b 0a 20 20 20 20 77 68 69 6c 65 28  sWC);.    while(
278e0 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 20   pWInfo->pLoops 
278f0 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 4c 6f  ){.      WhereLo
27900 6f 70 20 2a 70 20 3d 20 70 57 49 6e 66 6f 2d 3e  op *p = pWInfo->
27910 70 4c 6f 6f 70 73 3b 0a 20 20 20 20 20 20 70 57  pLoops;.      pW
27920 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 20 3d 20 70  Info->pLoops = p
27930 2d 3e 70 4e 65 78 74 4c 6f 6f 70 3b 0a 20 20 20  ->pNextLoop;.   
27940 20 20 20 77 68 65 72 65 4c 6f 6f 70 44 65 6c 65     whereLoopDele
27950 74 65 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 7d  te(db, p);.    }
27960 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
27970 65 65 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a  ee(db, pWInfo);.
27980 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74    }.}../*.** Ret
27990 75 72 6e 20 54 52 55 45 20 69 66 20 61 6c 6c 20  urn TRUE if all 
279a0 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
279b0 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a   are true:.**.**
279c0 20 20 20 28 31 29 20 20 58 20 68 61 73 20 74 68     (1)  X has th
279d0 65 20 73 61 6d 65 20 6f 72 20 6c 6f 77 65 72 20  e same or lower 
279e0 63 6f 73 74 20 74 68 61 74 20 59 0a 2a 2a 20 20  cost that Y.**  
279f0 20 28 32 29 20 20 58 20 69 73 20 61 20 70 72 6f   (2)  X is a pro
27a00 70 65 72 20 73 75 62 73 65 74 20 6f 66 20 59 0a  per subset of Y.
27a10 2a 2a 20 20 20 28 33 29 20 20 58 20 73 6b 69 70  **   (3)  X skip
27a20 73 20 61 74 20 6c 65 61 73 74 20 61 73 20 6d 61  s at least as ma
27a30 6e 79 20 63 6f 6c 75 6d 6e 73 20 61 73 20 59 0a  ny columns as Y.
27a40 2a 2a 0a 2a 2a 20 42 79 20 22 70 72 6f 70 65 72  **.** By "proper
27a50 20 73 75 62 73 65 74 22 20 77 65 20 6d 65 61 6e   subset" we mean
27a60 20 74 68 61 74 20 58 20 75 73 65 73 20 66 65 77   that X uses few
27a70 65 72 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  er WHERE clause 
27a80 74 65 72 6d 73 0a 2a 2a 20 74 68 61 6e 20 59 20  terms.** than Y 
27a90 61 6e 64 20 74 68 61 74 20 65 76 65 72 79 20 57  and that every W
27aa0 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d  HERE clause term
27ab0 20 75 73 65 64 20 62 79 20 58 20 69 73 20 61 6c   used by X is al
27ac0 73 6f 20 75 73 65 64 0a 2a 2a 20 62 79 20 59 2e  so used.** by Y.
27ad0 0a 2a 2a 0a 2a 2a 20 49 66 20 58 20 69 73 20 61  .**.** If X is a
27ae0 20 70 72 6f 70 65 72 20 73 75 62 73 65 74 20 6f   proper subset o
27af0 66 20 59 20 74 68 65 6e 20 59 20 69 73 20 61 20  f Y then Y is a 
27b00 62 65 74 74 65 72 20 63 68 6f 69 63 65 20 61 6e  better choice an
27b10 64 20 6f 75 67 68 74 0a 2a 2a 20 74 6f 20 68 61  d ought.** to ha
27b20 76 65 20 61 20 6c 6f 77 65 72 20 63 6f 73 74 2e  ve a lower cost.
27b30 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72    This routine r
27b40 65 74 75 72 6e 73 20 54 52 55 45 20 77 68 65 6e  eturns TRUE when
27b50 20 74 68 61 74 20 63 6f 73 74 20 0a 2a 2a 20 72   that cost .** r
27b60 65 6c 61 74 69 6f 6e 73 68 69 70 20 69 73 20 69  elationship is i
27b70 6e 76 65 72 74 65 64 20 61 6e 64 20 6e 65 65 64  nverted and need
27b80 73 20 74 6f 20 62 65 20 61 64 6a 75 73 74 65 64  s to be adjusted
27b90 2e 20 20 54 68 65 20 74 68 69 72 64 20 72 75 6c  .  The third rul
27ba0 65 0a 2a 2a 20 77 61 73 20 61 64 64 65 64 20 62  e.** was added b
27bb0 65 63 61 75 73 65 20 69 66 20 58 20 75 73 65 73  ecause if X uses
27bc0 20 73 6b 69 70 2d 73 63 61 6e 20 6c 65 73 73 20   skip-scan less 
27bd0 74 68 61 6e 20 59 20 69 74 20 73 74 69 6c 6c 20  than Y it still 
27be0 6d 69 67 68 74 0a 2a 2a 20 64 65 73 65 72 76 65  might.** deserve
27bf0 20 61 20 6c 6f 77 65 72 20 63 6f 73 74 20 65 76   a lower cost ev
27c00 65 6e 20 69 66 20 69 74 20 69 73 20 61 20 70 72  en if it is a pr
27c10 6f 70 65 72 20 73 75 62 73 65 74 20 6f 66 20 59  oper subset of Y
27c20 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
27c30 77 68 65 72 65 4c 6f 6f 70 43 68 65 61 70 65 72  whereLoopCheaper
27c40 50 72 6f 70 65 72 53 75 62 73 65 74 28 0a 20 20  ProperSubset(.  
27c50 63 6f 6e 73 74 20 57 68 65 72 65 4c 6f 6f 70 20  const WhereLoop 
27c60 2a 70 58 2c 20 20 20 20 20 20 20 2f 2a 20 46 69  *pX,       /* Fi
27c70 72 73 74 20 57 68 65 72 65 4c 6f 6f 70 20 74 6f  rst WhereLoop to
27c80 20 63 6f 6d 70 61 72 65 20 2a 2f 0a 20 20 63 6f   compare */.  co
27c90 6e 73 74 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  nst WhereLoop *p
27ca0 59 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70  Y        /* Comp
27cb0 61 72 65 20 61 67 61 69 6e 73 74 20 74 68 69 73  are against this
27cc0 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2f 0a 29 7b   WhereLoop */.){
27cd0 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69  .  int i, j;.  i
27ce0 66 28 20 70 58 2d 3e 6e 4c 54 65 72 6d 2d 70 58  f( pX->nLTerm-pX
27cf0 2d 3e 6e 53 6b 69 70 20 3e 3d 20 70 59 2d 3e 6e  ->nSkip >= pY->n
27d00 4c 54 65 72 6d 2d 70 59 2d 3e 6e 53 6b 69 70 20  LTerm-pY->nSkip 
27d10 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
27d20 20 2f 2a 20 58 20 69 73 20 6e 6f 74 20 61 20 73   /* X is not a s
27d30 75 62 73 65 74 20 6f 66 20 59 20 2a 2f 0a 20 20  ubset of Y */.  
27d40 7d 0a 20 20 69 66 28 20 70 59 2d 3e 6e 53 6b 69  }.  if( pY->nSki
27d50 70 20 3e 20 70 58 2d 3e 6e 53 6b 69 70 20 29 20  p > pX->nSkip ) 
27d60 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
27d70 70 58 2d 3e 72 52 75 6e 20 3e 3d 20 70 59 2d 3e  pX->rRun >= pY->
27d80 72 52 75 6e 20 29 7b 0a 20 20 20 20 69 66 28 20  rRun ){.    if( 
27d90 70 58 2d 3e 72 52 75 6e 20 3e 20 70 59 2d 3e 72  pX->rRun > pY->r
27da0 52 75 6e 20 29 20 72 65 74 75 72 6e 20 30 3b 20  Run ) return 0; 
27db0 20 20 20 2f 2a 20 58 20 63 6f 73 74 73 20 6d 6f     /* X costs mo
27dc0 72 65 20 74 68 61 6e 20 59 20 2a 2f 0a 20 20 20  re than Y */.   
27dd0 20 69 66 28 20 70 58 2d 3e 6e 4f 75 74 20 3e 20   if( pX->nOut > 
27de0 70 59 2d 3e 6e 4f 75 74 20 29 20 72 65 74 75 72  pY->nOut ) retur
27df0 6e 20 30 3b 20 20 20 20 2f 2a 20 58 20 63 6f 73  n 0;    /* X cos
27e00 74 73 20 6d 6f 72 65 20 74 68 61 6e 20 59 20 2a  ts more than Y *
27e10 2f 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 70 58  /.  }.  for(i=pX
27e20 2d 3e 6e 4c 54 65 72 6d 2d 31 3b 20 69 3e 3d 30  ->nLTerm-1; i>=0
27e30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69 66 28 20  ; i--){.    if( 
27e40 70 58 2d 3e 61 4c 54 65 72 6d 5b 69 5d 3d 3d 30  pX->aLTerm[i]==0
27e50 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
27e60 20 66 6f 72 28 6a 3d 70 59 2d 3e 6e 4c 54 65 72   for(j=pY->nLTer
27e70 6d 2d 31 3b 20 6a 3e 3d 30 3b 20 6a 2d 2d 29 7b  m-1; j>=0; j--){
27e80 0a 20 20 20 20 20 20 69 66 28 20 70 59 2d 3e 61  .      if( pY->a
27e90 4c 54 65 72 6d 5b 6a 5d 3d 3d 70 58 2d 3e 61 4c  LTerm[j]==pX->aL
27ea0 54 65 72 6d 5b 69 5d 20 29 20 62 72 65 61 6b 3b  Term[i] ) break;
27eb0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6a  .    }.    if( j
27ec0 3c 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  <0 ) return 0;  
27ed0 2f 2a 20 58 20 6e 6f 74 20 61 20 73 75 62 73 65  /* X not a subse
27ee0 74 20 6f 66 20 59 20 73 69 6e 63 65 20 74 65 72  t of Y since ter
27ef0 6d 20 58 5b 69 5d 20 6e 6f 74 20 75 73 65 64 20  m X[i] not used 
27f00 62 79 20 59 20 2a 2f 0a 20 20 7d 0a 20 20 72 65  by Y */.  }.  re
27f10 74 75 72 6e 20 31 3b 20 20 2f 2a 20 41 6c 6c 20  turn 1;  /* All 
27f20 63 6f 6e 64 69 74 69 6f 6e 73 20 6d 65 65 74 20  conditions meet 
27f30 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20  */.}../*.** Try 
27f40 74 6f 20 61 64 6a 75 73 74 20 74 68 65 20 63 6f  to adjust the co
27f50 73 74 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70 20  st of WhereLoop 
27f60 70 54 65 6d 70 6c 61 74 65 20 75 70 77 61 72 64  pTemplate upward
27f70 73 20 6f 72 20 64 6f 77 6e 77 61 72 64 73 20 73  s or downwards s
27f80 6f 0a 2a 2a 20 74 68 61 74 3a 0a 2a 2a 0a 2a 2a  o.** that:.**.**
27f90 20 20 20 28 31 29 20 70 54 65 6d 70 6c 61 74 65     (1) pTemplate
27fa0 20 63 6f 73 74 73 20 6c 65 73 73 20 74 68 61 6e   costs less than
27fb0 20 61 6e 79 20 6f 74 68 65 72 20 57 68 65 72 65   any other Where
27fc0 4c 6f 6f 70 73 20 74 68 61 74 20 61 72 65 20 61  Loops that are a
27fd0 20 70 72 6f 70 65 72 0a 2a 2a 20 20 20 20 20 20   proper.**      
27fe0 20 73 75 62 73 65 74 20 6f 66 20 70 54 65 6d 70   subset of pTemp
27ff0 6c 61 74 65 0a 2a 2a 0a 2a 2a 20 20 20 28 32 29  late.**.**   (2)
28000 20 70 54 65 6d 70 6c 61 74 65 20 63 6f 73 74 73   pTemplate costs
28010 20 6d 6f 72 65 20 74 68 61 6e 20 61 6e 79 20 6f   more than any o
28020 74 68 65 72 20 57 68 65 72 65 4c 6f 6f 70 73 20  ther WhereLoops 
28030 66 6f 72 20 77 68 69 63 68 20 70 54 65 6d 70 6c  for which pTempl
28040 61 74 65 0a 2a 2a 20 20 20 20 20 20 20 69 73 20  ate.**       is 
28050 61 20 70 72 6f 70 65 72 20 73 75 62 73 65 74 2e  a proper subset.
28060 0a 2a 2a 0a 2a 2a 20 54 6f 20 73 61 79 20 22 57  .**.** To say "W
28070 68 65 72 65 4c 6f 6f 70 20 58 20 69 73 20 61 20  hereLoop X is a 
28080 70 72 6f 70 65 72 20 73 75 62 73 65 74 20 6f 66  proper subset of
28090 20 59 22 20 6d 65 61 6e 73 20 74 68 61 74 20 58   Y" means that X
280a0 20 75 73 65 73 20 66 65 77 65 72 0a 2a 2a 20 57   uses fewer.** W
280b0 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d  HERE clause term
280c0 73 20 74 68 61 6e 20 59 20 61 6e 64 20 74 68 61  s than Y and tha
280d0 74 20 65 76 65 72 79 20 57 48 45 52 45 20 63 6c  t every WHERE cl
280e0 61 75 73 65 20 74 65 72 6d 20 75 73 65 64 20 62  ause term used b
280f0 79 20 58 20 69 73 0a 2a 2a 20 61 6c 73 6f 20 75  y X is.** also u
28100 73 65 64 20 62 79 20 59 2e 0a 2a 2f 0a 73 74 61  sed by Y..*/.sta
28110 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 4c 6f  tic void whereLo
28120 6f 70 41 64 6a 75 73 74 43 6f 73 74 28 63 6f 6e  opAdjustCost(con
28130 73 74 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 2c  st WhereLoop *p,
28140 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 54 65 6d   WhereLoop *pTem
28150 70 6c 61 74 65 29 7b 0a 20 20 69 66 28 20 28 70  plate){.  if( (p
28160 54 65 6d 70 6c 61 74 65 2d 3e 77 73 46 6c 61 67  Template->wsFlag
28170 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45  s & WHERE_INDEXE
28180 44 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  D)==0 ) return;.
28190 20 20 66 6f 72 28 3b 20 70 3b 20 70 3d 70 2d 3e    for(; p; p=p->
281a0 70 4e 65 78 74 4c 6f 6f 70 29 7b 0a 20 20 20 20  pNextLoop){.    
281b0 69 66 28 20 70 2d 3e 69 54 61 62 21 3d 70 54 65  if( p->iTab!=pTe
281c0 6d 70 6c 61 74 65 2d 3e 69 54 61 62 20 29 20 63  mplate->iTab ) c
281d0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
281e0 20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57   (p->wsFlags & W
281f0 48 45 52 45 5f 49 4e 44 45 58 45 44 29 3d 3d 30  HERE_INDEXED)==0
28200 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
28210 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70 43 68   if( whereLoopCh
28220 65 61 70 65 72 50 72 6f 70 65 72 53 75 62 73 65  eaperProperSubse
28230 74 28 70 2c 20 70 54 65 6d 70 6c 61 74 65 29 20  t(p, pTemplate) 
28240 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 64 6a 75  ){.      /* Adju
28250 73 74 20 70 54 65 6d 70 6c 61 74 65 20 63 6f 73  st pTemplate cos
28260 74 20 64 6f 77 6e 77 61 72 64 20 73 6f 20 74 68  t downward so th
28270 61 74 20 69 74 20 69 73 20 63 68 65 61 70 65 72  at it is cheaper
28280 20 74 68 61 6e 20 69 74 73 20 0a 20 20 20 20 20   than its .     
28290 20 2a 2a 20 73 75 62 73 65 74 20 70 2e 20 2a 2f   ** subset p. */
282a0 0a 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43  .      WHERETRAC
282b0 45 28 30 78 38 30 2c 28 22 73 75 62 73 65 74 20  E(0x80,("subset 
282c0 63 6f 73 74 20 61 64 6a 75 73 74 6d 65 6e 74 20  cost adjustment 
282d0 25 64 2c 25 64 20 74 6f 20 25 64 2c 25 64 5c 6e  %d,%d to %d,%d\n
282e0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
282f0 20 20 20 20 20 20 20 20 20 20 70 54 65 6d 70 6c            pTempl
28300 61 74 65 2d 3e 72 52 75 6e 2c 20 70 54 65 6d 70  ate->rRun, pTemp
28310 6c 61 74 65 2d 3e 6e 4f 75 74 2c 20 70 2d 3e 72  late->nOut, p->r
28320 52 75 6e 2c 20 70 2d 3e 6e 4f 75 74 2d 31 29 29  Run, p->nOut-1))
28330 3b 0a 20 20 20 20 20 20 70 54 65 6d 70 6c 61 74  ;.      pTemplat
28340 65 2d 3e 72 52 75 6e 20 3d 20 70 2d 3e 72 52 75  e->rRun = p->rRu
28350 6e 3b 0a 20 20 20 20 20 20 70 54 65 6d 70 6c 61  n;.      pTempla
28360 74 65 2d 3e 6e 4f 75 74 20 3d 20 70 2d 3e 6e 4f  te->nOut = p->nO
28370 75 74 20 2d 20 31 3b 0a 20 20 20 20 7d 65 6c 73  ut - 1;.    }els
28380 65 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70 43  e if( whereLoopC
28390 68 65 61 70 65 72 50 72 6f 70 65 72 53 75 62 73  heaperProperSubs
283a0 65 74 28 70 54 65 6d 70 6c 61 74 65 2c 20 70 29  et(pTemplate, p)
283b0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 64 6a   ){.      /* Adj
283c0 75 73 74 20 70 54 65 6d 70 6c 61 74 65 20 63 6f  ust pTemplate co
283d0 73 74 20 75 70 77 61 72 64 20 73 6f 20 74 68 61  st upward so tha
283e0 74 20 69 74 20 69 73 20 63 6f 73 74 6c 69 65 72  t it is costlier
283f0 20 74 68 61 6e 20 70 20 73 69 6e 63 65 0a 20 20   than p since.  
28400 20 20 20 20 2a 2a 20 70 54 65 6d 70 6c 61 74 65      ** pTemplate
28410 20 69 73 20 61 20 70 72 6f 70 65 72 20 73 75 62   is a proper sub
28420 73 65 74 20 6f 66 20 70 20 2a 2f 0a 20 20 20 20  set of p */.    
28430 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78 38    WHERETRACE(0x8
28440 30 2c 28 22 73 75 62 73 65 74 20 63 6f 73 74 20  0,("subset cost 
28450 61 64 6a 75 73 74 6d 65 6e 74 20 25 64 2c 25 64  adjustment %d,%d
28460 20 74 6f 20 25 64 2c 25 64 5c 6e 22 2c 0a 20 20   to %d,%d\n",.  
28470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28480 20 20 20 20 20 70 54 65 6d 70 6c 61 74 65 2d 3e       pTemplate->
28490 72 52 75 6e 2c 20 70 54 65 6d 70 6c 61 74 65 2d  rRun, pTemplate-
284a0 3e 6e 4f 75 74 2c 20 70 2d 3e 72 52 75 6e 2c 20  >nOut, p->rRun, 
284b0 70 2d 3e 6e 4f 75 74 2b 31 29 29 3b 0a 20 20 20  p->nOut+1));.   
284c0 20 20 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52     pTemplate->rR
284d0 75 6e 20 3d 20 70 2d 3e 72 52 75 6e 3b 0a 20 20  un = p->rRun;.  
284e0 20 20 20 20 70 54 65 6d 70 6c 61 74 65 2d 3e 6e      pTemplate->n
284f0 4f 75 74 20 3d 20 70 2d 3e 6e 4f 75 74 20 2b 20  Out = p->nOut + 
28500 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  1;.    }.  }.}..
28510 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20 74 68 65  /*.** Search the
28520 20 6c 69 73 74 20 6f 66 20 57 68 65 72 65 4c 6f   list of WhereLo
28530 6f 70 73 20 69 6e 20 2a 70 70 50 72 65 76 20 6c  ops in *ppPrev l
28540 6f 6f 6b 69 6e 67 20 66 6f 72 20 6f 6e 65 20 74  ooking for one t
28550 68 61 74 20 63 61 6e 20 62 65 0a 2a 2a 20 73 75  hat can be.** su
28560 70 70 6c 61 6e 74 65 64 20 62 79 20 70 54 65 6d  pplanted by pTem
28570 70 6c 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  plate..**.** Ret
28580 75 72 6e 20 4e 55 4c 4c 20 69 66 20 74 68 65 20  urn NULL if the 
28590 57 68 65 72 65 4c 6f 6f 70 20 6c 69 73 74 20 63  WhereLoop list c
285a0 6f 6e 74 61 69 6e 73 20 61 6e 20 65 6e 74 72 79  ontains an entry
285b0 20 74 68 61 74 20 63 61 6e 20 73 75 70 70 6c 61   that can suppla
285c0 6e 74 0a 2a 2a 20 70 54 65 6d 70 6c 61 74 65 2c  nt.** pTemplate,
285d0 20 69 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 20   in other words 
285e0 69 66 20 70 54 65 6d 70 6c 61 74 65 20 64 6f 65  if pTemplate doe
285f0 73 20 6e 6f 74 20 62 65 6c 6f 6e 67 20 6f 6e 20  s not belong on 
28600 74 68 65 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20  the list..**.** 
28610 49 66 20 70 58 20 69 73 20 61 20 57 68 65 72 65  If pX is a Where
28620 4c 6f 6f 70 20 74 68 61 74 20 70 54 65 6d 70 6c  Loop that pTempl
28630 61 74 65 20 63 61 6e 20 73 75 70 70 6c 61 6e 74  ate can supplant
28640 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 74 68  , then return th
28650 65 0a 2a 2a 20 6c 69 6e 6b 20 74 68 61 74 20 70  e.** link that p
28660 6f 69 6e 74 73 20 74 6f 20 70 58 2e 0a 2a 2a 0a  oints to pX..**.
28670 2a 2a 20 49 66 20 70 54 65 6d 70 6c 61 74 65 20  ** If pTemplate 
28680 63 61 6e 6e 6f 74 20 73 75 70 70 6c 61 6e 74 20  cannot supplant 
28690 61 6e 79 20 65 78 69 73 74 69 6e 67 20 65 6c 65  any existing ele
286a0 6d 65 6e 74 20 6f 66 20 74 68 65 20 6c 69 73 74  ment of the list
286b0 20 62 75 74 20 6e 65 65 64 73 0a 2a 2a 20 74 6f   but needs.** to
286c0 20 62 65 20 61 64 64 65 64 20 74 6f 20 74 68 65   be added to the
286d0 20 6c 69 73 74 2c 20 74 68 65 6e 20 72 65 74 75   list, then retu
286e0 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
286f0 74 68 65 20 74 61 69 6c 20 6f 66 20 74 68 65 20  the tail of the 
28700 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  list..*/.static 
28710 57 68 65 72 65 4c 6f 6f 70 20 2a 2a 77 68 65 72  WhereLoop **wher
28720 65 4c 6f 6f 70 46 69 6e 64 4c 65 73 73 65 72 28  eLoopFindLesser(
28730 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a 70  .  WhereLoop **p
28740 70 50 72 65 76 2c 0a 20 20 63 6f 6e 73 74 20 57  pPrev,.  const W
28750 68 65 72 65 4c 6f 6f 70 20 2a 70 54 65 6d 70 6c  hereLoop *pTempl
28760 61 74 65 0a 29 7b 0a 20 20 57 68 65 72 65 4c 6f  ate.){.  WhereLo
28770 6f 70 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 28  op *p;.  for(p=(
28780 2a 70 70 50 72 65 76 29 3b 20 70 3b 20 70 70 50  *ppPrev); p; ppP
28790 72 65 76 3d 26 70 2d 3e 70 4e 65 78 74 4c 6f 6f  rev=&p->pNextLoo
287a0 70 2c 20 70 3d 2a 70 70 50 72 65 76 29 7b 0a 20  p, p=*ppPrev){. 
287b0 20 20 20 69 66 28 20 70 2d 3e 69 54 61 62 21 3d     if( p->iTab!=
287c0 70 54 65 6d 70 6c 61 74 65 2d 3e 69 54 61 62 20  pTemplate->iTab 
287d0 7c 7c 20 70 2d 3e 69 53 6f 72 74 49 64 78 21 3d  || p->iSortIdx!=
287e0 70 54 65 6d 70 6c 61 74 65 2d 3e 69 53 6f 72 74  pTemplate->iSort
287f0 49 64 78 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  Idx ){.      /* 
28800 49 66 20 65 69 74 68 65 72 20 74 68 65 20 69 54  If either the iT
28810 61 62 20 6f 72 20 69 53 6f 72 74 49 64 78 20 76  ab or iSortIdx v
28820 61 6c 75 65 73 20 66 6f 72 20 74 77 6f 20 57 68  alues for two Wh
28830 65 72 65 4c 6f 6f 70 20 61 72 65 20 64 69 66 66  ereLoop are diff
28840 65 72 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20 74  erent.      ** t
28850 68 65 6e 20 74 68 6f 73 65 20 57 68 65 72 65 4c  hen those WhereL
28860 6f 6f 70 73 20 6e 65 65 64 20 74 6f 20 62 65 20  oops need to be 
28870 63 6f 6e 73 69 64 65 72 65 64 20 73 65 70 61 72  considered separ
28880 61 74 65 6c 79 2e 20 20 4e 65 69 74 68 65 72 20  ately.  Neither 
28890 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 20 63 61  is.      ** a ca
288a0 6e 64 69 64 61 74 65 20 74 6f 20 72 65 70 6c 61  ndidate to repla
288b0 63 65 20 74 68 65 20 6f 74 68 65 72 2e 20 2a 2f  ce the other. */
288c0 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b  .      continue;
288d0 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 49 6e  .    }.    /* In
288e0 20 74 68 65 20 63 75 72 72 65 6e 74 20 69 6d 70   the current imp
288f0 6c 65 6d 65 6e 74 61 74 69 6f 6e 2c 20 74 68 65  lementation, the
28900 20 72 53 65 74 75 70 20 76 61 6c 75 65 20 69 73   rSetup value is
28910 20 65 69 74 68 65 72 20 7a 65 72 6f 0a 20 20 20   either zero.   
28920 20 2a 2a 20 6f 72 20 74 68 65 20 63 6f 73 74 20   ** or the cost 
28930 6f 66 20 62 75 69 6c 64 69 6e 67 20 61 6e 20 61  of building an a
28940 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 28  utomatic index (
28950 4e 6c 6f 67 4e 29 20 61 6e 64 20 74 68 65 20 4e  NlogN) and the N
28960 6c 6f 67 4e 0a 20 20 20 20 2a 2a 20 69 73 20 74  logN.    ** is t
28970 68 65 20 73 61 6d 65 20 66 6f 72 20 63 6f 6d 70  he same for comp
28980 61 74 69 62 6c 65 20 57 68 65 72 65 4c 6f 6f 70  atible WhereLoop
28990 73 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  s. */.    assert
289a0 28 20 70 2d 3e 72 53 65 74 75 70 3d 3d 30 20 7c  ( p->rSetup==0 |
289b0 7c 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65  | pTemplate->rSe
289c0 74 75 70 3d 3d 30 20 0a 20 20 20 20 20 20 20 20  tup==0 .        
289d0 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 72           || p->r
289e0 53 65 74 75 70 3d 3d 70 54 65 6d 70 6c 61 74 65  Setup==pTemplate
289f0 2d 3e 72 53 65 74 75 70 20 29 3b 0a 0a 20 20 20  ->rSetup );..   
28a00 20 2f 2a 20 77 68 65 72 65 4c 6f 6f 70 41 64 64   /* whereLoopAdd
28a10 42 74 72 65 65 28 29 20 61 6c 77 61 79 73 20 67  Btree() always g
28a20 65 6e 65 72 61 74 65 73 20 61 6e 64 20 69 6e 73  enerates and ins
28a30 65 72 74 73 20 74 68 65 20 61 75 74 6f 6d 61 74  erts the automat
28a40 69 63 20 69 6e 64 65 78 0a 20 20 20 20 2a 2a 20  ic index.    ** 
28a50 63 61 73 65 20 66 69 72 73 74 2e 20 20 48 65 6e  case first.  Hen
28a60 63 65 20 63 6f 6d 70 61 74 69 62 6c 65 20 63 61  ce compatible ca
28a70 6e 64 69 64 61 74 65 20 57 68 65 72 65 4c 6f 6f  ndidate WhereLoo
28a80 70 73 20 6e 65 76 65 72 20 68 61 76 65 20 61 20  ps never have a 
28a90 6c 61 72 67 65 72 0a 20 20 20 20 2a 2a 20 72 53  larger.    ** rS
28aa0 65 74 75 70 2e 20 43 61 6c 6c 20 74 68 69 73 20  etup. Call this 
28ab0 53 45 54 55 50 2d 49 4e 56 41 52 49 41 4e 54 20  SETUP-INVARIANT 
28ac0 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
28ad0 2d 3e 72 53 65 74 75 70 3e 3d 70 54 65 6d 70 6c  ->rSetup>=pTempl
28ae0 61 74 65 2d 3e 72 53 65 74 75 70 20 29 3b 0a 0a  ate->rSetup );..
28af0 20 20 20 20 2f 2a 20 41 6e 79 20 6c 6f 6f 70 20      /* Any loop 
28b00 75 73 69 6e 67 20 61 6e 20 61 70 70 6c 69 61 74  using an appliat
28b10 69 6f 6e 2d 64 65 66 69 6e 65 64 20 69 6e 64 65  ion-defined inde
28b20 78 20 28 6f 72 20 50 52 49 4d 41 52 59 20 4b 45  x (or PRIMARY KE
28b30 59 20 6f 72 0a 20 20 20 20 2a 2a 20 55 4e 49 51  Y or.    ** UNIQ
28b40 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 29 20 77  UE constraint) w
28b50 69 74 68 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  ith one or more 
28b60 3d 3d 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 69  == constraints i
28b70 73 20 62 65 74 74 65 72 0a 20 20 20 20 2a 2a 20  s better.    ** 
28b80 74 68 61 6e 20 61 6e 20 61 75 74 6f 6d 61 74 69  than an automati
28b90 63 20 69 6e 64 65 78 2e 20 55 6e 6c 65 73 73 20  c index. Unless 
28ba0 69 74 20 69 73 20 61 20 73 6b 69 70 2d 73 63 61  it is a skip-sca
28bb0 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70  n. */.    if( (p
28bc0 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
28bd0 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 21 3d 30  E_AUTO_INDEX)!=0
28be0 0a 20 20 20 20 20 26 26 20 28 70 54 65 6d 70 6c  .     && (pTempl
28bf0 61 74 65 2d 3e 6e 53 6b 69 70 29 3d 3d 30 0a 20  ate->nSkip)==0. 
28c00 20 20 20 20 26 26 20 28 70 54 65 6d 70 6c 61 74      && (pTemplat
28c10 65 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  e->wsFlags & WHE
28c20 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 0a 20  RE_INDEXED)!=0. 
28c30 20 20 20 20 26 26 20 28 70 54 65 6d 70 6c 61 74      && (pTemplat
28c40 65 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  e->wsFlags & WHE
28c50 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 29 21 3d 30  RE_COLUMN_EQ)!=0
28c60 0a 20 20 20 20 20 26 26 20 28 70 2d 3e 70 72 65  .     && (p->pre
28c70 72 65 71 20 26 20 70 54 65 6d 70 6c 61 74 65 2d  req & pTemplate-
28c80 3e 70 72 65 72 65 71 29 3d 3d 70 54 65 6d 70 6c  >prereq)==pTempl
28c90 61 74 65 2d 3e 70 72 65 72 65 71 0a 20 20 20 20  ate->prereq.    
28ca0 29 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ){.      break;.
28cb0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
28cc0 20 65 78 69 73 74 69 6e 67 20 57 68 65 72 65 4c   existing WhereL
28cd0 6f 6f 70 20 70 20 69 73 20 62 65 74 74 65 72 20  oop p is better 
28ce0 74 68 61 6e 20 70 54 65 6d 70 6c 61 74 65 2c 20  than pTemplate, 
28cf0 70 54 65 6d 70 6c 61 74 65 20 63 61 6e 20 62 65  pTemplate can be
28d00 0a 20 20 20 20 2a 2a 20 64 69 73 63 61 72 64 65  .    ** discarde
28d10 64 2e 20 20 57 68 65 72 65 4c 6f 6f 70 20 70 20  d.  WhereLoop p 
28d20 69 73 20 62 65 74 74 65 72 20 69 66 3a 0a 20 20  is better if:.  
28d30 20 20 2a 2a 20 20 20 28 31 29 20 20 70 20 68 61    **   (1)  p ha
28d40 73 20 6e 6f 20 6d 6f 72 65 20 64 65 70 65 6e 64  s no more depend
28d50 65 6e 63 69 65 73 20 74 68 61 6e 20 70 54 65 6d  encies than pTem
28d60 70 6c 61 74 65 2c 20 61 6e 64 0a 20 20 20 20 2a  plate, and.    *
28d70 2a 20 20 20 28 32 29 20 20 70 20 68 61 73 20 61  *   (2)  p has a
28d80 6e 20 65 71 75 61 6c 20 6f 72 20 6c 6f 77 65 72  n equal or lower
28d90 20 63 6f 73 74 20 74 68 61 6e 20 70 54 65 6d 70   cost than pTemp
28da0 6c 61 74 65 0a 20 20 20 20 2a 2f 0a 20 20 20 20  late.    */.    
28db0 69 66 28 20 28 70 2d 3e 70 72 65 72 65 71 20 26  if( (p->prereq &
28dc0 20 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72   pTemplate->prer
28dd0 65 71 29 3d 3d 70 2d 3e 70 72 65 72 65 71 20 20  eq)==p->prereq  
28de0 20 20 2f 2a 20 28 31 29 20 20 2a 2f 0a 20 20 20    /* (1)  */.   
28df0 20 20 26 26 20 70 2d 3e 72 53 65 74 75 70 3c 3d    && p->rSetup<=
28e00 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75  pTemplate->rSetu
28e10 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p               
28e20 20 20 20 2f 2a 20 28 32 61 29 20 2a 2f 0a 20 20     /* (2a) */.  
28e30 20 20 20 26 26 20 70 2d 3e 72 52 75 6e 3c 3d 70     && p->rRun<=p
28e40 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 20 20  Template->rRun  
28e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28e60 20 20 20 20 2f 2a 20 28 32 62 29 20 2a 2f 0a 20      /* (2b) */. 
28e70 20 20 20 20 26 26 20 70 2d 3e 6e 4f 75 74 3c 3d      && p->nOut<=
28e80 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74 20  pTemplate->nOut 
28e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ea0 20 20 20 20 20 2f 2a 20 28 32 63 29 20 2a 2f 0a       /* (2c) */.
28eb0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74      ){.      ret
28ec0 75 72 6e 20 30 3b 20 20 2f 2a 20 44 69 73 63 61  urn 0;  /* Disca
28ed0 72 64 20 70 54 65 6d 70 6c 61 74 65 20 2a 2f 0a  rd pTemplate */.
28ee0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
28ef0 20 70 54 65 6d 70 6c 61 74 65 20 69 73 20 61 6c   pTemplate is al
28f00 77 61 79 73 20 62 65 74 74 65 72 20 74 68 61 6e  ways better than
28f10 20 70 2c 20 74 68 65 6e 20 63 61 75 73 65 20 70   p, then cause p
28f20 20 74 6f 20 62 65 20 6f 76 65 72 77 72 69 74 74   to be overwritt
28f30 65 6e 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 70  en.    ** with p
28f40 54 65 6d 70 6c 61 74 65 2e 20 20 70 54 65 6d 70  Template.  pTemp
28f50 6c 61 74 65 20 69 73 20 62 65 74 74 65 72 20 74  late is better t
28f60 68 61 6e 20 70 20 69 66 3a 0a 20 20 20 20 2a 2a  han p if:.    **
28f70 20 20 20 28 31 29 20 20 70 54 65 6d 70 6c 61 74     (1)  pTemplat
28f80 65 20 68 61 73 20 6e 6f 20 6d 6f 72 65 20 64 65  e has no more de
28f90 70 65 6e 64 65 6e 63 65 73 20 74 68 61 6e 20 70  pendences than p
28fa0 2c 20 61 6e 64 0a 20 20 20 20 2a 2a 20 20 20 28  , and.    **   (
28fb0 32 29 20 20 70 54 65 6d 70 6c 61 74 65 20 68 61  2)  pTemplate ha
28fc0 73 20 61 6e 20 65 71 75 61 6c 20 6f 72 20 6c 6f  s an equal or lo
28fd0 77 65 72 20 63 6f 73 74 20 74 68 61 6e 20 70 2e  wer cost than p.
28fe0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
28ff0 28 70 2d 3e 70 72 65 72 65 71 20 26 20 70 54 65  (p->prereq & pTe
29000 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65 71 29 3d  mplate->prereq)=
29010 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72  =pTemplate->prer
29020 65 71 20 20 20 2f 2a 20 28 31 29 20 20 2a 2f 0a  eq   /* (1)  */.
29030 20 20 20 20 20 26 26 20 70 2d 3e 72 52 75 6e 3e       && p->rRun>
29040 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e  =pTemplate->rRun
29050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29060 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29070 28 32 61 29 20 2a 2f 0a 20 20 20 20 20 26 26 20  (2a) */.     && 
29080 70 2d 3e 6e 4f 75 74 3e 3d 70 54 65 6d 70 6c 61  p->nOut>=pTempla
29090 74 65 2d 3e 6e 4f 75 74 20 20 20 20 20 20 20 20  te->nOut        
290a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
290b0 20 20 20 20 20 2f 2a 20 28 32 62 29 20 2a 2f 0a       /* (2b) */.
290c0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 61 73 73      ){.      ass
290d0 65 72 74 28 20 70 2d 3e 72 53 65 74 75 70 3e 3d  ert( p->rSetup>=
290e0 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75  pTemplate->rSetu
290f0 70 20 29 3b 20 2f 2a 20 53 45 54 55 50 2d 49 4e  p ); /* SETUP-IN
29100 56 41 52 49 41 4e 54 20 61 62 6f 76 65 20 2a 2f  VARIANT above */
29110 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 20 20 20  .      break;   
29120 2f 2a 20 43 61 75 73 65 20 70 20 74 6f 20 62 65  /* Cause p to be
29130 20 6f 76 65 72 77 72 69 74 74 65 6e 20 62 79 20   overwritten by 
29140 70 54 65 6d 70 6c 61 74 65 20 2a 2f 0a 20 20 20  pTemplate */.   
29150 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
29160 70 70 50 72 65 76 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ppPrev;.}../*.**
29170 20 49 6e 73 65 72 74 20 6f 72 20 72 65 70 6c 61   Insert or repla
29180 63 65 20 61 20 57 68 65 72 65 4c 6f 6f 70 20 65  ce a WhereLoop e
29190 6e 74 72 79 20 75 73 69 6e 67 20 74 68 65 20 74  ntry using the t
291a0 65 6d 70 6c 61 74 65 20 73 75 70 70 6c 69 65 64  emplate supplied
291b0 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 69 73 74  ..**.** An exist
291c0 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 65 6e  ing WhereLoop en
291d0 74 72 79 20 6d 69 67 68 74 20 62 65 20 6f 76 65  try might be ove
291e0 72 77 72 69 74 74 65 6e 20 69 66 20 74 68 65 20  rwritten if the 
291f0 6e 65 77 20 74 65 6d 70 6c 61 74 65 0a 2a 2a 20  new template.** 
29200 69 73 20 62 65 74 74 65 72 20 61 6e 64 20 68 61  is better and ha
29210 73 20 66 65 77 65 72 20 64 65 70 65 6e 64 65 6e  s fewer dependen
29220 63 69 65 73 2e 20 20 4f 72 20 74 68 65 20 74 65  cies.  Or the te
29230 6d 70 6c 61 74 65 20 77 69 6c 6c 20 62 65 20 69  mplate will be i
29240 67 6e 6f 72 65 64 0a 2a 2a 20 61 6e 64 20 6e 6f  gnored.** and no
29250 20 69 6e 73 65 72 74 20 77 69 6c 6c 20 6f 63 63   insert will occ
29260 75 72 20 69 66 20 61 6e 20 65 78 69 73 74 69 6e  ur if an existin
29270 67 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 20 66  g WhereLoop is f
29280 61 73 74 65 72 20 61 6e 64 20 68 61 73 0a 2a 2a  aster and has.**
29290 20 66 65 77 65 72 20 64 65 70 65 6e 64 65 6e 63   fewer dependenc
292a0 69 65 73 20 74 68 61 6e 20 74 68 65 20 74 65 6d  ies than the tem
292b0 70 6c 61 74 65 2e 20 20 4f 74 68 65 72 77 69 73  plate.  Otherwis
292c0 65 20 61 20 6e 65 77 20 57 68 65 72 65 4c 6f 6f  e a new WhereLoo
292d0 70 20 69 73 0a 2a 2a 20 61 64 64 65 64 20 62 61  p is.** added ba
292e0 73 65 64 20 6f 6e 20 74 68 65 20 74 65 6d 70 6c  sed on the templ
292f0 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 42  ate..**.** If pB
29300 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20 69  uilder->pOrSet i
29310 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20  s not NULL then 
29320 77 65 20 63 61 72 65 20 61 62 6f 75 74 20 6f 6e  we care about on
29330 6c 79 20 74 68 65 0a 2a 2a 20 70 72 65 72 65 71  ly the.** prereq
29340 75 69 73 69 74 65 73 20 61 6e 64 20 72 52 75 6e  uisites and rRun
29350 20 61 6e 64 20 6e 4f 75 74 20 63 6f 73 74 73 20   and nOut costs 
29360 6f 66 20 74 68 65 20 4e 20 62 65 73 74 20 6c 6f  of the N best lo
29370 6f 70 73 2e 20 20 54 68 61 74 0a 2a 2a 20 69 6e  ops.  That.** in
29380 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 67 61 74  formation is gat
29390 68 65 72 65 64 20 69 6e 20 74 68 65 20 70 42 75  hered in the pBu
293a0 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20 6f 62  ilder->pOrSet ob
293b0 6a 65 63 74 2e 20 20 54 68 69 73 20 73 70 65 63  ject.  This spec
293c0 69 61 6c 0a 2a 2a 20 70 72 6f 63 65 73 73 69 6e  ial.** processin
293d0 67 20 6d 6f 64 65 20 69 73 20 75 73 65 64 20 6f  g mode is used o
293e0 6e 6c 79 20 66 6f 72 20 4f 52 20 63 6c 61 75 73  nly for OR claus
293f0 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a  e processing..**
29400 0a 2a 2a 20 57 68 65 6e 20 61 63 63 75 6d 75 6c  .** When accumul
29410 61 74 69 6e 67 20 6d 75 6c 74 69 70 6c 65 20 6c  ating multiple l
29420 6f 6f 70 73 20 28 77 68 65 6e 20 70 42 75 69 6c  oops (when pBuil
29430 64 65 72 2d 3e 70 4f 72 53 65 74 20 69 73 20 4e  der->pOrSet is N
29440 55 4c 4c 29 20 77 65 0a 2a 2a 20 73 74 69 6c 6c  ULL) we.** still
29450 20 6d 69 67 68 74 20 6f 76 65 72 77 72 69 74 65   might overwrite
29460 20 73 69 6d 69 6c 61 72 20 6c 6f 6f 70 73 20 77   similar loops w
29470 69 74 68 20 74 68 65 20 6e 65 77 20 74 65 6d 70  ith the new temp
29480 6c 61 74 65 20 69 66 20 74 68 65 0a 2a 2a 20 6e  late if the.** n
29490 65 77 20 74 65 6d 70 6c 61 74 65 20 69 73 20 62  ew template is b
294a0 65 74 74 65 72 2e 20 20 4c 6f 6f 70 73 20 6d 61  etter.  Loops ma
294b0 79 20 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e  y be overwritten
294c0 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   if the followin
294d0 67 20 0a 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e 73  g .** conditions
294e0 20 61 72 65 20 6d 65 74 3a 0a 2a 2a 0a 2a 2a 20   are met:.**.** 
294f0 20 20 20 28 31 29 20 20 54 68 65 79 20 68 61 76     (1)  They hav
29500 65 20 74 68 65 20 73 61 6d 65 20 69 54 61 62 2e  e the same iTab.
29510 0a 2a 2a 20 20 20 20 28 32 29 20 20 54 68 65 79  .**    (2)  They
29520 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 69   have the same i
29530 53 6f 72 74 49 64 78 2e 0a 2a 2a 20 20 20 20 28  SortIdx..**    (
29540 33 29 20 20 54 68 65 20 74 65 6d 70 6c 61 74 65  3)  The template
29550 20 68 61 73 20 73 61 6d 65 20 6f 72 20 66 65 77   has same or few
29560 65 72 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20  er dependencies 
29570 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74  than the current
29580 20 6c 6f 6f 70 0a 2a 2a 20 20 20 20 28 34 29 20   loop.**    (4) 
29590 20 54 68 65 20 74 65 6d 70 6c 61 74 65 20 68 61   The template ha
295a0 73 20 74 68 65 20 73 61 6d 65 20 6f 72 20 6c 6f  s the same or lo
295b0 77 65 72 20 63 6f 73 74 20 74 68 61 6e 20 74 68  wer cost than th
295c0 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f 70 0a 2a  e current loop.*
295d0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  /.static int whe
295e0 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 57 68 65  reLoopInsert(Whe
295f0 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70  reLoopBuilder *p
29600 42 75 69 6c 64 65 72 2c 20 57 68 65 72 65 4c 6f  Builder, WhereLo
29610 6f 70 20 2a 70 54 65 6d 70 6c 61 74 65 29 7b 0a  op *pTemplate){.
29620 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a 70 70    WhereLoop **pp
29630 50 72 65 76 2c 20 2a 70 3b 0a 20 20 57 68 65 72  Prev, *p;.  Wher
29640 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20  eInfo *pWInfo = 
29650 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f  pBuilder->pWInfo
29660 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
29670 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65  = pWInfo->pParse
29680 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 49 66 20 70  ->db;..  /* If p
29690 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20  Builder->pOrSet 
296a0 69 73 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e  is defined, then
296b0 20 6f 6e 6c 79 20 6b 65 65 70 20 74 72 61 63 6b   only keep track
296c0 20 6f 66 20 74 68 65 20 63 6f 73 74 73 0a 20 20   of the costs.  
296d0 2a 2a 20 61 6e 64 20 70 72 65 72 65 71 73 2e 0a  ** and prereqs..
296e0 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 75 69 6c    */.  if( pBuil
296f0 64 65 72 2d 3e 70 4f 72 53 65 74 21 3d 30 20 29  der->pOrSet!=0 )
29700 7b 0a 23 69 66 20 57 48 45 52 45 54 52 41 43 45  {.#if WHERETRACE
29710 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20 75 31 36  _ENABLED.    u16
29720 20 6e 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70   n = pBuilder->p
29730 4f 72 53 65 74 2d 3e 6e 3b 0a 20 20 20 20 69 6e  OrSet->n;.    in
29740 74 20 78 20 3d 0a 23 65 6e 64 69 66 0a 20 20 20  t x =.#endif.   
29750 20 77 68 65 72 65 4f 72 49 6e 73 65 72 74 28 70   whereOrInsert(p
29760 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 2c  Builder->pOrSet,
29770 20 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72   pTemplate->prer
29780 65 71 2c 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72  eq, pTemplate->r
29790 52 75 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Run,.           
297a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
297b0 20 20 20 20 20 20 20 20 20 70 54 65 6d 70 6c 61           pTempla
297c0 74 65 2d 3e 6e 4f 75 74 29 3b 0a 23 69 66 20 57  te->nOut);.#if W
297d0 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
297e0 44 20 2f 2a 20 30 78 38 20 2a 2f 0a 20 20 20 20  D /* 0x8 */.    
297f0 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65  if( sqlite3Where
29800 54 72 61 63 65 20 26 20 30 78 38 20 29 7b 0a 20  Trace & 0x8 ){. 
29810 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
29820 67 50 72 69 6e 74 66 28 78 3f 22 20 20 20 6f 72  gPrintf(x?"   or
29830 2d 25 64 3a 20 20 22 3a 22 20 20 20 6f 72 2d 58  -%d:  ":"   or-X
29840 3a 20 20 22 2c 20 6e 29 3b 0a 20 20 20 20 20 20  :  ", n);.      
29850 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70  whereLoopPrint(p
29860 54 65 6d 70 6c 61 74 65 2c 20 70 42 75 69 6c 64  Template, pBuild
29870 65 72 2d 3e 70 57 43 29 3b 0a 20 20 20 20 7d 0a  er->pWC);.    }.
29880 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72  #endif.    retur
29890 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
298a0 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 66 6f 72 20  ..  /* Look for 
298b0 61 6e 20 65 78 69 73 74 69 6e 67 20 57 68 65 72  an existing Wher
298c0 65 4c 6f 6f 70 20 74 6f 20 72 65 70 6c 61 63 65  eLoop to replace
298d0 20 77 69 74 68 20 70 54 65 6d 70 6c 61 74 65 0a   with pTemplate.
298e0 20 20 2a 2f 0a 20 20 77 68 65 72 65 4c 6f 6f 70    */.  whereLoop
298f0 41 64 6a 75 73 74 43 6f 73 74 28 70 57 49 6e 66  AdjustCost(pWInf
29900 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 70 54 65 6d 70  o->pLoops, pTemp
29910 6c 61 74 65 29 3b 0a 20 20 70 70 50 72 65 76 20  late);.  ppPrev 
29920 3d 20 77 68 65 72 65 4c 6f 6f 70 46 69 6e 64 4c  = whereLoopFindL
29930 65 73 73 65 72 28 26 70 57 49 6e 66 6f 2d 3e 70  esser(&pWInfo->p
29940 4c 6f 6f 70 73 2c 20 70 54 65 6d 70 6c 61 74 65  Loops, pTemplate
29950 29 3b 0a 0a 20 20 69 66 28 20 70 70 50 72 65 76  );..  if( ppPrev
29960 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  ==0 ){.    /* Th
29970 65 72 65 20 61 6c 72 65 61 64 79 20 65 78 69 73  ere already exis
29980 74 73 20 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f  ts a WhereLoop o
29990 6e 20 74 68 65 20 6c 69 73 74 20 74 68 61 74 20  n the list that 
299a0 69 73 20 62 65 74 74 65 72 0a 20 20 20 20 2a 2a  is better.    **
299b0 20 74 68 61 6e 20 70 54 65 6d 70 6c 61 74 65 2c   than pTemplate,
299c0 20 73 6f 20 6a 75 73 74 20 69 67 6e 6f 72 65 20   so just ignore 
299d0 70 54 65 6d 70 6c 61 74 65 20 2a 2f 0a 23 69 66  pTemplate */.#if
299e0 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42   WHERETRACE_ENAB
299f0 4c 45 44 20 2f 2a 20 30 78 38 20 2a 2f 0a 20 20  LED /* 0x8 */.  
29a00 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65    if( sqlite3Whe
29a10 72 65 54 72 61 63 65 20 26 20 30 78 38 20 29 7b  reTrace & 0x8 ){
29a20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65  .      sqlite3De
29a30 62 75 67 50 72 69 6e 74 66 28 22 20 20 20 73 6b  bugPrintf("   sk
29a40 69 70 3a 20 22 29 3b 0a 20 20 20 20 20 20 77 68  ip: ");.      wh
29a50 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 54 65  ereLoopPrint(pTe
29a60 6d 70 6c 61 74 65 2c 20 70 42 75 69 6c 64 65 72  mplate, pBuilder
29a70 2d 3e 70 57 43 29 3b 0a 20 20 20 20 7d 0a 23 65  ->pWC);.    }.#e
29a80 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20  ndif.    return 
29a90 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 0a 20 20 7d  SQLITE_OK;  .  }
29aa0 65 6c 73 65 7b 0a 20 20 20 20 70 20 3d 20 2a 70  else{.    p = *p
29ab0 70 50 72 65 76 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  pPrev;.  }..  /*
29ac0 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69   If we reach thi
29ad0 73 20 70 6f 69 6e 74 20 69 74 20 6d 65 61 6e 73  s point it means
29ae0 20 74 68 61 74 20 65 69 74 68 65 72 20 70 5b 5d   that either p[]
29af0 20 73 68 6f 75 6c 64 20 62 65 20 6f 76 65 72 77   should be overw
29b00 72 69 74 74 65 6e 0a 20 20 2a 2a 20 77 69 74 68  ritten.  ** with
29b10 20 70 54 65 6d 70 6c 61 74 65 5b 5d 20 69 66 20   pTemplate[] if 
29b20 70 5b 5d 20 65 78 69 73 74 73 2c 20 6f 72 20 69  p[] exists, or i
29b30 66 20 70 3d 3d 4e 55 4c 4c 20 74 68 65 6e 20 61  f p==NULL then a
29b40 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 0a 20 20  llocate a new.  
29b50 2a 2a 20 57 68 65 72 65 4c 6f 6f 70 20 61 6e 64  ** WhereLoop and
29b60 20 69 6e 73 65 72 74 20 69 74 2e 0a 20 20 2a 2f   insert it..  */
29b70 0a 23 69 66 20 57 48 45 52 45 54 52 41 43 45 5f  .#if WHERETRACE_
29b80 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78 38 20 2a  ENABLED /* 0x8 *
29b90 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 57  /.  if( sqlite3W
29ba0 68 65 72 65 54 72 61 63 65 20 26 20 30 78 38 20  hereTrace & 0x8 
29bb0 29 7b 0a 20 20 20 20 69 66 28 20 70 21 3d 30 20  ){.    if( p!=0 
29bc0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
29bd0 44 65 62 75 67 50 72 69 6e 74 66 28 22 72 65 70  DebugPrintf("rep
29be0 6c 61 63 65 3a 20 22 29 3b 0a 20 20 20 20 20 20  lace: ");.      
29bf0 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70  whereLoopPrint(p
29c00 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 29  , pBuilder->pWC)
29c10 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
29c20 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
29c30 20 20 20 20 61 64 64 3a 20 22 29 3b 0a 20 20 20      add: ");.   
29c40 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28   whereLoopPrint(
29c50 70 54 65 6d 70 6c 61 74 65 2c 20 70 42 75 69 6c  pTemplate, pBuil
29c60 64 65 72 2d 3e 70 57 43 29 3b 0a 20 20 7d 0a 23  der->pWC);.  }.#
29c70 65 6e 64 69 66 0a 20 20 69 66 28 20 70 3d 3d 30  endif.  if( p==0
29c80 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6c 6c 6f 63   ){.    /* Alloc
29c90 61 74 65 20 61 20 6e 65 77 20 57 68 65 72 65 4c  ate a new WhereL
29ca0 6f 6f 70 20 74 6f 20 61 64 64 20 74 6f 20 74 68  oop to add to th
29cb0 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 69 73  e end of the lis
29cc0 74 20 2a 2f 0a 20 20 20 20 2a 70 70 50 72 65 76  t */.    *ppPrev
29cd0 20 3d 20 70 20 3d 20 73 71 6c 69 74 65 33 44 62   = p = sqlite3Db
29ce0 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69  MallocRaw(db, si
29cf0 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70 29 29  zeof(WhereLoop))
29d00 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d 30 20 29  ;.    if( p==0 )
29d10 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
29d20 4f 4d 45 4d 3b 0a 20 20 20 20 77 68 65 72 65 4c  OMEM;.    whereL
29d30 6f 6f 70 49 6e 69 74 28 70 29 3b 0a 20 20 20 20  oopInit(p);.    
29d40 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 20 3d 20 30  p->pNextLoop = 0
29d50 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
29d60 2a 20 57 65 20 77 69 6c 6c 20 62 65 20 6f 76 65  * We will be ove
29d70 72 77 72 69 74 69 6e 67 20 57 68 65 72 65 4c 6f  rwriting WhereLo
29d80 6f 70 20 70 5b 5d 2e 20 20 42 75 74 20 62 65 66  op p[].  But bef
29d90 6f 72 65 20 77 65 20 64 6f 2c 20 66 69 72 73 74  ore we do, first
29da0 0a 20 20 20 20 2a 2a 20 67 6f 20 74 68 72 6f 75  .    ** go throu
29db0 67 68 20 74 68 65 20 72 65 73 74 20 6f 66 20 74  gh the rest of t
29dc0 68 65 20 6c 69 73 74 20 61 6e 64 20 64 65 6c 65  he list and dele
29dd0 74 65 20 61 6e 79 20 6f 74 68 65 72 20 65 6e 74  te any other ent
29de0 72 69 65 73 20 62 65 73 69 64 65 73 0a 20 20 20  ries besides.   
29df0 20 2a 2a 20 70 5b 5d 20 74 68 61 74 20 61 72 65   ** p[] that are
29e00 20 61 6c 73 6f 20 73 75 70 70 6c 61 74 65 64 20   also supplated 
29e10 62 79 20 70 54 65 6d 70 6c 61 74 65 20 2a 2f 0a  by pTemplate */.
29e20 20 20 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a      WhereLoop **
29e30 70 70 54 61 69 6c 20 3d 20 26 70 2d 3e 70 4e 65  ppTail = &p->pNe
29e40 78 74 4c 6f 6f 70 3b 0a 20 20 20 20 57 68 65 72  xtLoop;.    Wher
29e50 65 4c 6f 6f 70 20 2a 70 54 6f 44 65 6c 3b 0a 20  eLoop *pToDel;. 
29e60 20 20 20 77 68 69 6c 65 28 20 2a 70 70 54 61 69     while( *ppTai
29e70 6c 20 29 7b 0a 20 20 20 20 20 20 70 70 54 61 69  l ){.      ppTai
29e80 6c 20 3d 20 77 68 65 72 65 4c 6f 6f 70 46 69 6e  l = whereLoopFin
29e90 64 4c 65 73 73 65 72 28 70 70 54 61 69 6c 2c 20  dLesser(ppTail, 
29ea0 70 54 65 6d 70 6c 61 74 65 29 3b 0a 20 20 20 20  pTemplate);.    
29eb0 20 20 69 66 28 20 70 70 54 61 69 6c 3d 3d 30 20    if( ppTail==0 
29ec0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 70  ) break;.      p
29ed0 54 6f 44 65 6c 20 3d 20 2a 70 70 54 61 69 6c 3b  ToDel = *ppTail;
29ee0 0a 20 20 20 20 20 20 69 66 28 20 70 54 6f 44 65  .      if( pToDe
29ef0 6c 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  l==0 ) break;.  
29f00 20 20 20 20 2a 70 70 54 61 69 6c 20 3d 20 70 54      *ppTail = pT
29f10 6f 44 65 6c 2d 3e 70 4e 65 78 74 4c 6f 6f 70 3b  oDel->pNextLoop;
29f20 0a 23 69 66 20 57 48 45 52 45 54 52 41 43 45 5f  .#if WHERETRACE_
29f30 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78 38 20 2a  ENABLED /* 0x8 *
29f40 2f 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  /.      if( sqli
29f50 74 65 33 57 68 65 72 65 54 72 61 63 65 20 26 20  te3WhereTrace & 
29f60 30 78 38 20 29 7b 0a 20 20 20 20 20 20 20 20 73  0x8 ){.        s
29f70 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
29f80 66 28 22 20 64 65 6c 65 74 65 3a 20 22 29 3b 0a  f(" delete: ");.
29f90 20 20 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f          whereLoo
29fa0 70 50 72 69 6e 74 28 70 54 6f 44 65 6c 2c 20 70  pPrint(pToDel, p
29fb0 42 75 69 6c 64 65 72 2d 3e 70 57 43 29 3b 0a 20  Builder->pWC);. 
29fc0 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
29fd0 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 44 65 6c      whereLoopDel
29fe0 65 74 65 28 64 62 2c 20 70 54 6f 44 65 6c 29 3b  ete(db, pToDel);
29ff0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 77 68 65  .    }.  }.  whe
2a000 72 65 4c 6f 6f 70 58 66 65 72 28 64 62 2c 20 70  reLoopXfer(db, p
2a010 2c 20 70 54 65 6d 70 6c 61 74 65 29 3b 0a 20 20  , pTemplate);.  
2a020 69 66 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20  if( (p->wsFlags 
2a030 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54  & WHERE_VIRTUALT
2a040 41 42 4c 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ABLE)==0 ){.    
2a050 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 20 3d 20  Index *pIndex = 
2a060 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
2a070 78 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 64 65  x;.    if( pInde
2a080 78 20 26 26 20 70 49 6e 64 65 78 2d 3e 74 6e 75  x && pIndex->tnu
2a090 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d  m==0 ){.      p-
2a0a0 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20  >u.btree.pIndex 
2a0b0 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = 0;.    }.  }. 
2a0c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2a0d0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75  K;.}../*.** Adju
2a0e0 73 74 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70  st the WhereLoop
2a0f0 2e 6e 4f 75 74 20 76 61 6c 75 65 20 64 6f 77 6e  .nOut value down
2a100 77 61 72 64 20 74 6f 20 61 63 63 6f 75 6e 74 20  ward to account 
2a110 66 6f 72 20 74 65 72 6d 73 20 6f 66 20 74 68 65  for terms of the
2a120 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65  .** WHERE clause
2a130 20 74 68 61 74 20 72 65 66 65 72 65 6e 63 65 20   that reference 
2a140 74 68 65 20 6c 6f 6f 70 20 62 75 74 20 77 68 69  the loop but whi
2a150 63 68 20 61 72 65 20 6e 6f 74 20 75 73 65 64 20  ch are not used 
2a160 62 79 20 61 6e 0a 2a 2a 20 69 6e 64 65 78 2e 0a  by an.** index..
2a170 2a 0a 2a 2a 20 46 6f 72 20 65 76 65 72 79 20 57  *.** For every W
2a180 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d  HERE clause term
2a190 20 74 68 61 74 20 69 73 20 6e 6f 74 20 75 73 65   that is not use
2a1a0 64 20 62 79 20 74 68 65 20 69 6e 64 65 78 0a 2a  d by the index.*
2a1b0 2a 20 61 6e 64 20 77 68 69 63 68 20 68 61 73 20  * and which has 
2a1c0 61 20 74 72 75 74 68 20 70 72 6f 62 61 62 69 6c  a truth probabil
2a1d0 69 74 79 20 61 73 73 69 67 6e 65 64 20 62 79 20  ity assigned by 
2a1e0 6f 6e 65 20 6f 66 20 74 68 65 20 6c 69 6b 65 6c  one of the likel
2a1f0 69 68 6f 6f 64 28 29 2c 0a 2a 2a 20 6c 69 6b 65  ihood(),.** like
2a200 6c 79 28 29 2c 20 6f 72 20 75 6e 6c 69 6b 65 6c  ly(), or unlikel
2a210 79 28 29 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e  y() SQL function
2a220 73 2c 20 72 65 64 75 63 65 20 74 68 65 20 65 73  s, reduce the es
2a230 74 69 6d 61 74 65 64 20 6e 75 6d 62 65 72 0a 2a  timated number.*
2a240 2a 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73  * of output rows
2a250 20 62 79 20 74 68 65 20 70 72 6f 62 61 62 69 6c   by the probabil
2a260 69 74 79 20 73 70 65 63 69 66 69 65 64 2e 0a 2a  ity specified..*
2a270 2a 0a 2a 2a 20 54 55 4e 49 4e 47 3a 20 20 46 6f  *.** TUNING:  Fo
2a280 72 20 65 76 65 72 79 20 57 48 45 52 45 20 63 6c  r every WHERE cl
2a290 61 75 73 65 20 74 65 72 6d 20 74 68 61 74 20 69  ause term that i
2a2a0 73 20 6e 6f 74 20 75 73 65 64 20 62 79 20 74 68  s not used by th
2a2b0 65 20 69 6e 64 65 78 0a 2a 2a 20 61 6e 64 20 77  e index.** and w
2a2c0 68 69 63 68 20 64 6f 65 73 20 6e 6f 74 20 68 61  hich does not ha
2a2d0 76 65 20 61 6e 20 61 73 73 69 67 6e 65 64 20 74  ve an assigned t
2a2e0 72 75 74 68 20 70 72 6f 62 61 62 69 6c 69 74 79  ruth probability
2a2f0 2c 20 68 65 75 72 69 73 74 69 63 73 0a 2a 2a 20  , heuristics.** 
2a300 64 65 73 63 72 69 62 65 64 20 62 65 6c 6f 77 20  described below 
2a310 61 72 65 20 75 73 65 64 20 74 6f 20 74 72 79 20  are used to try 
2a320 74 6f 20 65 73 74 69 6d 61 74 65 20 74 68 65 20  to estimate the 
2a330 74 72 75 74 68 20 70 72 6f 62 61 62 69 6c 69 74  truth probabilit
2a340 79 2e 0a 2a 2a 20 54 4f 44 4f 20 2d 2d 3e 20 50  y..** TODO --> P
2a350 65 72 68 61 70 73 20 74 68 69 73 20 69 73 20 73  erhaps this is s
2a360 6f 6d 65 74 68 69 6e 67 20 74 68 61 74 20 63 6f  omething that co
2a370 75 6c 64 20 62 65 20 69 6d 70 72 6f 76 65 64 20  uld be improved 
2a380 62 79 20 62 65 74 74 65 72 0a 2a 2a 20 74 61 62  by better.** tab
2a390 6c 65 20 73 74 61 74 69 73 74 69 63 73 2e 0a 2a  le statistics..*
2a3a0 2a 0a 2a 2a 20 48 65 75 72 69 73 74 69 63 20 31  *.** Heuristic 1
2a3b0 3a 20 20 45 73 74 69 6d 61 74 65 20 74 68 65 20  :  Estimate the 
2a3c0 74 72 75 74 68 20 70 72 6f 62 61 62 69 6c 69 74  truth probabilit
2a3d0 79 20 61 73 20 39 33 2e 37 35 25 2e 20 20 54 68  y as 93.75%.  Th
2a3e0 65 20 39 33 2e 37 35 25 0a 2a 2a 20 76 61 6c 75  e 93.75%.** valu
2a3f0 65 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f  e corresponds to
2a400 20 2d 31 20 69 6e 20 4c 6f 67 45 73 74 20 6e 6f   -1 in LogEst no
2a410 74 61 74 69 6f 6e 2c 20 73 6f 20 74 68 69 73 20  tation, so this 
2a420 6d 65 61 6e 73 20 64 65 63 72 65 6d 65 6e 74 0a  means decrement.
2a430 2a 2a 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70  ** the WhereLoop
2a440 2e 6e 4f 75 74 20 66 69 65 6c 64 20 66 6f 72 20  .nOut field for 
2a450 65 76 65 72 79 20 73 75 63 68 20 57 48 45 52 45  every such WHERE
2a460 20 63 6c 61 75 73 65 20 74 65 72 6d 2e 0a 2a 2a   clause term..**
2a470 0a 2a 2a 20 48 65 75 72 69 73 74 69 63 20 32 3a  .** Heuristic 2:
2a480 20 20 49 66 20 74 68 65 72 65 20 65 78 69 73 74    If there exist
2a490 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 57 48  s one or more WH
2a4a0 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73  ERE clause terms
2a4b0 20 6f 66 20 74 68 65 0a 2a 2a 20 66 6f 72 6d 20   of the.** form 
2a4c0 22 78 3d 3d 45 58 50 52 22 20 61 6e 64 20 45 58  "x==EXPR" and EX
2a4d0 50 52 20 69 73 20 6e 6f 74 20 61 20 63 6f 6e 73  PR is not a cons
2a4e0 74 61 6e 74 20 30 20 6f 72 20 31 2c 20 74 68 65  tant 0 or 1, the
2a4f0 6e 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 0a  n make sure the.
2a500 2a 2a 20 66 69 6e 61 6c 20 6f 75 74 70 75 74 20  ** final output 
2a510 72 6f 77 20 65 73 74 69 6d 61 74 65 20 69 73 20  row estimate is 
2a520 6e 6f 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  no greater than 
2a530 31 2f 34 20 6f 66 20 74 68 65 20 74 6f 74 61 6c  1/4 of the total
2a540 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 72 6f   number.** of ro
2a550 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e  ws in the table.
2a560 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
2a570 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20 78 3d  , assume that x=
2a580 3d 45 58 50 52 20 77 69 6c 6c 20 66 69 6c 74 65  =EXPR will filte
2a590 72 0a 2a 2a 20 6f 75 74 20 61 74 20 6c 65 61 73  r.** out at leas
2a5a0 74 20 33 20 6f 75 74 20 6f 66 20 34 20 72 6f 77  t 3 out of 4 row
2a5b0 73 2e 20 20 49 66 20 45 58 50 52 20 69 73 20 2d  s.  If EXPR is -
2a5c0 31 20 6f 72 20 30 20 6f 72 20 31 2c 20 74 68 65  1 or 0 or 1, the
2a5d0 6e 20 6d 61 79 62 65 20 74 68 65 0a 2a 2a 20 22  n maybe the.** "
2a5e0 78 22 20 63 6f 6c 75 6d 6e 20 69 73 20 62 6f 6f  x" column is boo
2a5f0 6c 65 61 6e 20 6f 72 20 65 6c 73 65 20 2d 31 20  lean or else -1 
2a600 6f 72 20 30 20 6f 72 20 31 20 69 73 20 61 20 63  or 0 or 1 is a c
2a610 6f 6d 6d 6f 6e 20 64 65 66 61 75 6c 74 20 76 61  ommon default va
2a620 6c 75 65 0a 2a 2a 20 6f 6e 20 74 68 65 20 22 78  lue.** on the "x
2a630 22 20 63 6f 6c 75 6d 6e 20 61 6e 64 20 73 6f 20  " column and so 
2a640 69 6e 20 74 68 61 74 20 63 61 73 65 20 6f 6e 6c  in that case onl
2a650 79 20 63 61 70 20 74 68 65 20 6f 75 74 70 75 74  y cap the output
2a660 20 72 6f 77 20 65 73 74 69 6d 61 74 65 0a 2a 2a   row estimate.**
2a670 20 61 74 20 31 2f 32 20 69 6e 73 74 65 61 64 20   at 1/2 instead 
2a680 6f 66 20 31 2f 34 2e 0a 2a 2f 0a 73 74 61 74 69  of 1/4..*/.stati
2a690 63 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70  c void whereLoop
2a6a0 4f 75 74 70 75 74 41 64 6a 75 73 74 28 0a 20 20  OutputAdjust(.  
2a6b0 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
2a6c0 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48  ,      /* The WH
2a6d0 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
2a6e0 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70  WhereLoop *pLoop
2a6f0 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f  ,      /* The lo
2a700 6f 70 20 74 6f 20 61 64 6a 75 73 74 20 64 6f 77  op to adjust dow
2a710 6e 77 61 72 64 20 2a 2f 0a 20 20 4c 6f 67 45 73  nward */.  LogEs
2a720 74 20 6e 52 6f 77 20 20 20 20 20 20 20 20 20 20  t nRow          
2a730 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
2a740 6f 77 73 20 69 6e 20 74 68 65 20 65 6e 74 69 72  ows in the entir
2a750 65 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20  e table */.){.  
2a760 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
2a770 2c 20 2a 70 58 3b 0a 20 20 42 69 74 6d 61 73 6b  , *pX;.  Bitmask
2a780 20 6e 6f 74 41 6c 6c 6f 77 65 64 20 3d 20 7e 28   notAllowed = ~(
2a790 70 4c 6f 6f 70 2d 3e 70 72 65 72 65 71 7c 70 4c  pLoop->prereq|pL
2a7a0 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 29 3b 0a  oop->maskSelf);.
2a7b0 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 3b 0a 20    int i, j, k;. 
2a7c0 20 4c 6f 67 45 73 74 20 69 52 65 64 75 63 65 20   LogEst iReduce 
2a7d0 3d 20 30 3b 20 20 20 20 2f 2a 20 70 4c 6f 6f 70  = 0;    /* pLoop
2a7e0 2d 3e 6e 4f 75 74 20 73 68 6f 75 6c 64 20 6e 6f  ->nOut should no
2a7f0 74 20 65 78 63 65 65 64 20 6e 52 6f 77 2d 69 52  t exceed nRow-iR
2a800 65 64 75 63 65 20 2a 2f 0a 0a 20 20 61 73 73 65  educe */..  asse
2a810 72 74 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c  rt( (pLoop->wsFl
2a820 61 67 73 20 26 20 57 48 45 52 45 5f 41 55 54 4f  ags & WHERE_AUTO
2a830 5f 49 4e 44 45 58 29 3d 3d 30 20 29 3b 0a 20 20  _INDEX)==0 );.  
2a840 66 6f 72 28 69 3d 70 57 43 2d 3e 6e 54 65 72 6d  for(i=pWC->nTerm
2a850 2c 20 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20  , pTerm=pWC->a; 
2a860 69 3e 30 3b 20 69 2d 2d 2c 20 70 54 65 72 6d 2b  i>0; i--, pTerm+
2a870 2b 29 7b 0a 20 20 20 20 69 66 28 20 28 70 54 65  +){.    if( (pTe
2a880 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
2a890 52 4d 5f 56 49 52 54 55 41 4c 29 21 3d 30 20 29  RM_VIRTUAL)!=0 )
2a8a0 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20   break;.    if( 
2a8b0 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c  (pTerm->prereqAl
2a8c0 6c 20 26 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53  l & pLoop->maskS
2a8d0 65 6c 66 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  elf)==0 ) contin
2a8e0 75 65 3b 0a 20 20 20 20 69 66 28 20 28 70 54 65  ue;.    if( (pTe
2a8f0 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26 20  rm->prereqAll & 
2a900 6e 6f 74 41 6c 6c 6f 77 65 64 29 21 3d 30 20 29  notAllowed)!=0 )
2a910 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 66   continue;.    f
2a920 6f 72 28 6a 3d 70 4c 6f 6f 70 2d 3e 6e 4c 54 65  or(j=pLoop->nLTe
2a930 72 6d 2d 31 3b 20 6a 3e 3d 30 3b 20 6a 2d 2d 29  rm-1; j>=0; j--)
2a940 7b 0a 20 20 20 20 20 20 70 58 20 3d 20 70 4c 6f  {.      pX = pLo
2a950 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 3b 0a 20  op->aLTerm[j];. 
2a960 20 20 20 20 20 69 66 28 20 70 58 3d 3d 30 20 29       if( pX==0 )
2a970 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
2a980 20 69 66 28 20 70 58 3d 3d 70 54 65 72 6d 20 29   if( pX==pTerm )
2a990 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 66   break;.      if
2a9a0 28 20 70 58 2d 3e 69 50 61 72 65 6e 74 3e 3d 30  ( pX->iParent>=0
2a9b0 20 26 26 20 28 26 70 57 43 2d 3e 61 5b 70 58 2d   && (&pWC->a[pX-
2a9c0 3e 69 50 61 72 65 6e 74 5d 29 3d 3d 70 54 65 72  >iParent])==pTer
2a9d0 6d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  m ) break;.    }
2a9e0 0a 20 20 20 20 69 66 28 20 6a 3c 30 20 29 7b 0a  .    if( j<0 ){.
2a9f0 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d        if( pTerm-
2aa00 3e 74 72 75 74 68 50 72 6f 62 3c 3d 30 20 29 7b  >truthProb<=0 ){
2aa10 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61  .        /* If a
2aa20 20 74 72 75 74 68 20 70 72 6f 62 61 62 69 6c 69   truth probabili
2aa30 74 79 20 69 73 20 73 70 65 63 69 66 69 65 64 20  ty is specified 
2aa40 75 73 69 6e 67 20 74 68 65 20 6c 69 6b 65 6c 69  using the likeli
2aa50 68 6f 6f 64 28 29 20 68 69 6e 74 73 2c 0a 20 20  hood() hints,.  
2aa60 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 75 73        ** then us
2aa70 65 20 74 68 65 20 70 72 6f 62 61 62 69 6c 69 74  e the probabilit
2aa80 79 20 70 72 6f 76 69 64 65 64 20 62 79 20 74 68  y provided by th
2aa90 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 2e 20 2a  e application. *
2aaa0 2f 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d  /.        pLoop-
2aab0 3e 6e 4f 75 74 20 2b 3d 20 70 54 65 72 6d 2d 3e  >nOut += pTerm->
2aac0 74 72 75 74 68 50 72 6f 62 3b 0a 20 20 20 20 20  truthProb;.     
2aad0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2aae0 2f 2a 20 49 6e 20 74 68 65 20 61 62 73 65 6e 63  /* In the absenc
2aaf0 65 20 6f 66 20 65 78 70 6c 69 63 69 74 20 74 72  e of explicit tr
2ab00 75 74 68 20 70 72 6f 62 61 62 69 6c 69 74 69 65  uth probabilitie
2ab10 73 2c 20 75 73 65 20 68 65 75 72 69 73 74 69 63  s, use heuristic
2ab20 73 20 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20  s to.        ** 
2ab30 67 75 65 73 73 20 61 20 72 65 61 73 6f 6e 61 62  guess a reasonab
2ab40 6c 65 20 74 72 75 74 68 20 70 72 6f 62 61 62 69  le truth probabi
2ab50 6c 69 74 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20  lity. */.       
2ab60 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 2d 2d 3b 0a   pLoop->nOut--;.
2ab70 20 20 20 20 20 20 20 20 69 66 28 20 70 54 65 72          if( pTer
2ab80 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 26 57 4f 5f  m->eOperator&WO_
2ab90 45 51 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  EQ ){.          
2aba0 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70  Expr *pRight = p
2abb0 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69  Term->pExpr->pRi
2abc0 67 68 74 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ght;.          i
2abd0 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  f( sqlite3ExprIs
2abe0 49 6e 74 65 67 65 72 28 70 52 69 67 68 74 2c 20  Integer(pRight, 
2abf0 26 6b 29 20 26 26 20 6b 3e 3d 28 2d 31 29 20 26  &k) && k>=(-1) &
2ac00 26 20 6b 3c 3d 31 20 29 7b 0a 20 20 20 20 20 20  & k<=1 ){.      
2ac10 20 20 20 20 20 20 6b 20 3d 20 31 30 3b 0a 20 20        k = 10;.  
2ac20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
2ac30 20 20 20 20 20 20 20 20 20 20 20 6b 20 3d 20 32             k = 2
2ac40 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  0;.          }. 
2ac50 20 20 20 20 20 20 20 20 20 69 66 28 20 69 52 65           if( iRe
2ac60 64 75 63 65 3c 6b 20 29 20 69 52 65 64 75 63 65  duce<k ) iReduce
2ac70 20 3d 20 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = k;.        }.
2ac80 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2ac90 7d 0a 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 6e  }.  if( pLoop->n
2aca0 4f 75 74 20 3e 20 6e 52 6f 77 2d 69 52 65 64 75  Out > nRow-iRedu
2acb0 63 65 20 29 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75  ce )  pLoop->nOu
2acc0 74 20 3d 20 6e 52 6f 77 20 2d 20 69 52 65 64 75  t = nRow - iRedu
2acd0 63 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a  ce;.}../*.** Adj
2ace0 75 73 74 20 74 68 65 20 63 6f 73 74 20 43 20 62  ust the cost C b
2acf0 79 20 74 68 65 20 63 6f 73 74 4d 75 6c 74 20 66  y the costMult f
2ad00 61 63 74 65 72 20 54 2e 20 20 54 68 69 73 20 6f  acter T.  This o
2ad10 6e 6c 79 20 6f 63 63 75 72 73 20 69 66 0a 2a 2a  nly occurs if.**
2ad20 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 2d   compiled with -
2ad30 44 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43  DSQLITE_ENABLE_C
2ad40 4f 53 54 4d 55 4c 54 0a 2a 2f 0a 23 69 66 64 65  OSTMULT.*/.#ifde
2ad50 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
2ad60 43 4f 53 54 4d 55 4c 54 0a 23 20 64 65 66 69 6e  COSTMULT.# defin
2ad70 65 20 41 70 70 6c 79 43 6f 73 74 4d 75 6c 74 69  e ApplyCostMulti
2ad80 70 6c 69 65 72 28 43 2c 54 29 20 20 43 20 2b 3d  plier(C,T)  C +=
2ad90 20 54 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e   T.#else.# defin
2ada0 65 20 41 70 70 6c 79 43 6f 73 74 4d 75 6c 74 69  e ApplyCostMulti
2adb0 70 6c 69 65 72 28 43 2c 54 29 0a 23 65 6e 64 69  plier(C,T).#endi
2adc0 66 0a 0a 2f 2a 0a 2a 2a 20 57 65 20 68 61 76 65  f../*.** We have
2add0 20 73 6f 20 66 61 72 20 6d 61 74 63 68 65 64 20   so far matched 
2ade0 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e  pBuilder->pNew->
2adf0 75 2e 62 74 72 65 65 2e 6e 45 71 20 74 65 72 6d  u.btree.nEq term
2ae00 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20 69 6e 64  s of the .** ind
2ae10 65 78 20 70 49 6e 64 65 78 2e 20 54 72 79 20 74  ex pIndex. Try t
2ae20 6f 20 6d 61 74 63 68 20 6f 6e 65 20 6d 6f 72 65  o match one more
2ae30 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69  ..**.** When thi
2ae40 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
2ae50 6c 6c 65 64 2c 20 70 42 75 69 6c 64 65 72 2d 3e  lled, pBuilder->
2ae60 70 4e 65 77 2d 3e 6e 4f 75 74 20 63 6f 6e 74 61  pNew->nOut conta
2ae70 69 6e 73 20 74 68 65 20 0a 2a 2a 20 6e 75 6d 62  ins the .** numb
2ae80 65 72 20 6f 66 20 72 6f 77 73 20 65 78 70 65 63  er of rows expec
2ae90 74 65 64 20 74 6f 20 62 65 20 76 69 73 69 74 65  ted to be visite
2aea0 64 20 62 79 20 66 69 6c 74 65 72 69 6e 67 20 75  d by filtering u
2aeb0 73 69 6e 67 20 74 68 65 20 6e 45 71 20 0a 2a 2a  sing the nEq .**
2aec0 20 74 65 72 6d 73 20 6f 6e 6c 79 2e 20 49 66 20   terms only. If 
2aed0 69 74 20 69 73 20 6d 6f 64 69 66 69 65 64 2c 20  it is modified, 
2aee0 74 68 69 73 20 76 61 6c 75 65 20 69 73 20 72 65  this value is re
2aef0 73 74 6f 72 65 64 20 62 65 66 6f 72 65 20 74 68  stored before th
2af00 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  is .** function 
2af10 72 65 74 75 72 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49  returns..**.** I
2af20 66 20 70 50 72 6f 62 65 2d 3e 74 6e 75 6d 3d 3d  f pProbe->tnum==
2af30 30 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 70 49  0, that means pI
2af40 6e 64 65 78 20 69 73 20 61 20 66 61 6b 65 20 69  ndex is a fake i
2af50 6e 64 65 78 20 75 73 65 64 20 66 6f 72 20 74 68  ndex used for th
2af60 65 0a 2a 2a 20 49 4e 54 45 47 45 52 20 50 52 49  e.** INTEGER PRI
2af70 4d 41 52 59 20 4b 45 59 2e 0a 2a 2f 0a 73 74 61  MARY KEY..*/.sta
2af80 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f  tic int whereLoo
2af90 70 41 64 64 42 74 72 65 65 49 6e 64 65 78 28 0a  pAddBtreeIndex(.
2afa0 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64    WhereLoopBuild
2afb0 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 20 20 20  er *pBuilder,   
2afc0 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65 4c 6f    /* The WhereLo
2afd0 6f 70 20 66 61 63 74 6f 72 79 20 2a 2f 0a 20 20  op factory */.  
2afe0 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
2aff0 74 65 6d 20 2a 70 53 72 63 2c 20 20 20 20 20 20  tem *pSrc,      
2b000 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74  /* FROM clause t
2b010 65 72 6d 20 62 65 69 6e 67 20 61 6e 61 6c 79 7a  erm being analyz
2b020 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  ed */.  Index *p
2b030 50 72 6f 62 65 2c 20 20 20 20 20 20 20 20 20 20  Probe,          
2b040 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e          /* An in
2b050 64 65 78 20 6f 6e 20 70 53 72 63 20 2a 2f 0a 20  dex on pSrc */. 
2b060 20 4c 6f 67 45 73 74 20 6e 49 6e 4d 75 6c 20 20   LogEst nInMul  
2b070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b080 20 2f 2a 20 6c 6f 67 28 4e 75 6d 62 65 72 20 6f   /* log(Number o
2b090 66 20 69 74 65 72 61 74 69 6f 6e 73 20 64 75 65  f iterations due
2b0a0 20 74 6f 20 49 4e 29 20 2a 2f 0a 29 7b 0a 20 20   to IN) */.){.  
2b0b0 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
2b0c0 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57  o = pBuilder->pW
2b0d0 49 6e 66 6f 3b 20 20 2f 2a 20 57 48 45 52 45 20  Info;  /* WHERE 
2b0e0 61 6e 61 6c 79 73 65 20 63 6f 6e 74 65 78 74 20  analyse context 
2b0f0 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  */.  Parse *pPar
2b100 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61  se = pWInfo->pPa
2b110 72 73 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 50  rse;        /* P
2b120 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
2b130 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
2b140 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20  = pParse->db;   
2b150 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
2b160 63 6f 6e 6e 65 63 74 69 6f 6e 20 6d 61 6c 6c 6f  connection mallo
2b170 63 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57  c context */.  W
2b180 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 20  hereLoop *pNew; 
2b190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2b1a0 2a 20 54 65 6d 70 6c 61 74 65 20 57 68 65 72 65  * Template Where
2b1b0 4c 6f 6f 70 20 75 6e 64 65 72 20 63 6f 6e 73 74  Loop under const
2b1c0 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 57 68 65  ruction */.  Whe
2b1d0 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20  reTerm *pTerm;  
2b1e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2b1f0 41 20 57 68 65 72 65 54 65 72 6d 20 75 6e 64 65  A WhereTerm unde
2b200 72 20 63 6f 6e 73 69 64 65 72 61 74 69 6f 6e 20  r consideration 
2b210 2a 2f 0a 20 20 69 6e 74 20 6f 70 4d 61 73 6b 3b  */.  int opMask;
2b220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b230 20 20 20 20 20 2f 2a 20 56 61 6c 69 64 20 6f 70       /* Valid op
2b240 65 72 61 74 6f 72 73 20 66 6f 72 20 63 6f 6e 73  erators for cons
2b250 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 57 68 65  traints */.  Whe
2b260 72 65 53 63 61 6e 20 73 63 61 6e 3b 20 20 20 20  reScan scan;    
2b270 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2b280 49 74 65 72 61 74 6f 72 20 66 6f 72 20 57 48 45  Iterator for WHE
2b290 52 45 20 74 65 72 6d 73 20 2a 2f 0a 20 20 42 69  RE terms */.  Bi
2b2a0 74 6d 61 73 6b 20 73 61 76 65 64 5f 70 72 65 72  tmask saved_prer
2b2b0 65 71 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  eq;           /*
2b2c0 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20   Original value 
2b2d0 6f 66 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20  of pNew->prereq 
2b2e0 2a 2f 0a 20 20 75 31 36 20 73 61 76 65 64 5f 6e  */.  u16 saved_n
2b2f0 4c 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20  LTerm;          
2b300 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c       /* Original
2b310 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e   value of pNew->
2b320 6e 4c 54 65 72 6d 20 2a 2f 0a 20 20 75 31 36 20  nLTerm */.  u16 
2b330 73 61 76 65 64 5f 6e 45 71 3b 20 20 20 20 20 20  saved_nEq;      
2b340 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
2b350 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66  riginal value of
2b360 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
2b370 45 71 20 2a 2f 0a 20 20 75 31 36 20 73 61 76 65  Eq */.  u16 save
2b380 64 5f 6e 53 6b 69 70 3b 20 20 20 20 20 20 20 20  d_nSkip;        
2b390 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69          /* Origi
2b3a0 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65  nal value of pNe
2b3b0 77 2d 3e 6e 53 6b 69 70 20 2a 2f 0a 20 20 75 33  w->nSkip */.  u3
2b3c0 32 20 73 61 76 65 64 5f 77 73 46 6c 61 67 73 3b  2 saved_wsFlags;
2b3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2b3e0 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20   Original value 
2b3f0 6f 66 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73  of pNew->wsFlags
2b400 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 73 61 76   */.  LogEst sav
2b410 65 64 5f 6e 4f 75 74 3b 20 20 20 20 20 20 20 20  ed_nOut;        
2b420 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61        /* Origina
2b430 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d  l value of pNew-
2b440 3e 6e 4f 75 74 20 2a 2f 0a 20 20 69 6e 74 20 69  >nOut */.  int i
2b450 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Col;            
2b460 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
2b470 64 65 78 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  dex of the colum
2b480 6e 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 2a  n in the table *
2b490 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
2b4a0 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
2b4b0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
2b4c0 64 65 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 72  de */.  LogEst r
2b4d0 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
2b4e0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2b4f0 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65  r of rows in the
2b500 20 74 61 62 6c 65 20 2a 2f 0a 20 20 4c 6f 67 45   table */.  LogE
2b510 73 74 20 72 4c 6f 67 53 69 7a 65 3b 20 20 20 20  st rLogSize;    
2b520 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
2b530 6f 67 61 72 69 74 68 6d 20 6f 66 20 74 61 62 6c  ogarithm of tabl
2b540 65 20 73 69 7a 65 20 2a 2f 0a 20 20 57 68 65 72  e size */.  Wher
2b550 65 54 65 72 6d 20 2a 70 54 6f 70 20 3d 20 30 2c  eTerm *pTop = 0,
2b560 20 2a 70 42 74 6d 20 3d 20 30 3b 20 2f 2a 20 54   *pBtm = 0; /* T
2b570 6f 70 20 61 6e 64 20 62 6f 74 74 6f 6d 20 72 61  op and bottom ra
2b580 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  nge constraints 
2b590 2a 2f 0a 0a 20 20 70 4e 65 77 20 3d 20 70 42 75  */..  pNew = pBu
2b5a0 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 69  ilder->pNew;.  i
2b5b0 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
2b5c0 6c 65 64 20 29 20 72 65 74 75 72 6e 20 53 51 4c  led ) return SQL
2b5d0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 0a 20 20 61 73  ITE_NOMEM;..  as
2b5e0 73 65 72 74 28 20 28 70 4e 65 77 2d 3e 77 73 46  sert( (pNew->wsF
2b5f0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52  lags & WHERE_VIR
2b600 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30 20 29 3b  TUALTABLE)==0 );
2b610 0a 20 20 61 73 73 65 72 74 28 20 28 70 4e 65 77  .  assert( (pNew
2b620 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
2b630 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 3d 3d 30 20  E_TOP_LIMIT)==0 
2b640 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e 77  );.  if( pNew->w
2b650 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 42  sFlags & WHERE_B
2b660 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20  TM_LIMIT ){.    
2b670 6f 70 4d 61 73 6b 20 3d 20 57 4f 5f 4c 54 7c 57  opMask = WO_LT|W
2b680 4f 5f 4c 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66  O_LE;.  }else if
2b690 28 20 70 50 72 6f 62 65 2d 3e 74 6e 75 6d 3c 3d  ( pProbe->tnum<=
2b6a0 30 20 7c 7c 20 28 70 53 72 63 2d 3e 6a 6f 69 6e  0 || (pSrc->join
2b6b0 74 79 70 65 20 26 20 4a 54 5f 4c 45 46 54 29 21  type & JT_LEFT)!
2b6c0 3d 30 20 29 7b 0a 20 20 20 20 6f 70 4d 61 73 6b  =0 ){.    opMask
2b6d0 20 3d 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 7c 57   = WO_EQ|WO_IN|W
2b6e0 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4c 54  O_GT|WO_GE|WO_LT
2b6f0 7c 57 4f 5f 4c 45 3b 0a 20 20 7d 65 6c 73 65 7b  |WO_LE;.  }else{
2b700 0a 20 20 20 20 6f 70 4d 61 73 6b 20 3d 20 57 4f  .    opMask = WO
2b710 5f 45 51 7c 57 4f 5f 49 4e 7c 57 4f 5f 49 53 4e  _EQ|WO_IN|WO_ISN
2b720 55 4c 4c 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c  ULL|WO_GT|WO_GE|
2b730 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 3b 0a 20 20 7d  WO_LT|WO_LE;.  }
2b740 0a 20 20 69 66 28 20 70 50 72 6f 62 65 2d 3e 62  .  if( pProbe->b
2b750 55 6e 6f 72 64 65 72 65 64 20 29 20 6f 70 4d 61  Unordered ) opMa
2b760 73 6b 20 26 3d 20 7e 28 57 4f 5f 47 54 7c 57 4f  sk &= ~(WO_GT|WO
2b770 5f 47 45 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29  _GE|WO_LT|WO_LE)
2b780 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65  ;..  assert( pNe
2b790 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3c 70  w->u.btree.nEq<p
2b7a0 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 20 29  Probe->nColumn )
2b7b0 3b 0a 20 20 69 43 6f 6c 20 3d 20 70 50 72 6f 62  ;.  iCol = pProb
2b7c0 65 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 70 4e 65 77  e->aiColumn[pNew
2b7d0 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 5d 3b 0a  ->u.btree.nEq];.
2b7e0 0a 20 20 70 54 65 72 6d 20 3d 20 77 68 65 72 65  .  pTerm = where
2b7f0 53 63 61 6e 49 6e 69 74 28 26 73 63 61 6e 2c 20  ScanInit(&scan, 
2b800 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 2c 20 70  pBuilder->pWC, p
2b810 53 72 63 2d 3e 69 43 75 72 73 6f 72 2c 20 69 43  Src->iCursor, iC
2b820 6f 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ol,.            
2b830 20 20 20 20 20 20 20 20 20 20 20 20 6f 70 4d 61              opMa
2b840 73 6b 2c 20 70 50 72 6f 62 65 29 3b 0a 20 20 73  sk, pProbe);.  s
2b850 61 76 65 64 5f 6e 45 71 20 3d 20 70 4e 65 77 2d  aved_nEq = pNew-
2b860 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20  >u.btree.nEq;.  
2b870 73 61 76 65 64 5f 6e 53 6b 69 70 20 3d 20 70 4e  saved_nSkip = pN
2b880 65 77 2d 3e 6e 53 6b 69 70 3b 0a 20 20 73 61 76  ew->nSkip;.  sav
2b890 65 64 5f 6e 4c 54 65 72 6d 20 3d 20 70 4e 65 77  ed_nLTerm = pNew
2b8a0 2d 3e 6e 4c 54 65 72 6d 3b 0a 20 20 73 61 76 65  ->nLTerm;.  save
2b8b0 64 5f 77 73 46 6c 61 67 73 20 3d 20 70 4e 65 77  d_wsFlags = pNew
2b8c0 2d 3e 77 73 46 6c 61 67 73 3b 0a 20 20 73 61 76  ->wsFlags;.  sav
2b8d0 65 64 5f 70 72 65 72 65 71 20 3d 20 70 4e 65 77  ed_prereq = pNew
2b8e0 2d 3e 70 72 65 72 65 71 3b 0a 20 20 73 61 76 65  ->prereq;.  save
2b8f0 64 5f 6e 4f 75 74 20 3d 20 70 4e 65 77 2d 3e 6e  d_nOut = pNew->n
2b900 4f 75 74 3b 0a 20 20 70 4e 65 77 2d 3e 72 53 65  Out;.  pNew->rSe
2b910 74 75 70 20 3d 20 30 3b 0a 20 20 72 53 69 7a 65  tup = 0;.  rSize
2b920 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77   = pProbe->aiRow
2b930 4c 6f 67 45 73 74 5b 30 5d 3b 0a 20 20 72 4c 6f  LogEst[0];.  rLo
2b940 67 53 69 7a 65 20 3d 20 65 73 74 4c 6f 67 28 72  gSize = estLog(r
2b950 53 69 7a 65 29 3b 0a 20 20 66 6f 72 28 3b 20 72  Size);.  for(; r
2b960 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
2b970 70 54 65 72 6d 21 3d 30 3b 20 70 54 65 72 6d 20  pTerm!=0; pTerm 
2b980 3d 20 77 68 65 72 65 53 63 61 6e 4e 65 78 74 28  = whereScanNext(
2b990 26 73 63 61 6e 29 29 7b 0a 20 20 20 20 75 31 36  &scan)){.    u16
2b9a0 20 65 4f 70 20 3d 20 70 54 65 72 6d 2d 3e 65 4f   eOp = pTerm->eO
2b9b0 70 65 72 61 74 6f 72 3b 20 20 20 2f 2a 20 53 68  perator;   /* Sh
2b9c0 6f 72 74 68 61 6e 64 20 66 6f 72 20 70 54 65 72  orthand for pTer
2b9d0 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 2a 2f 0a  m->eOperator */.
2b9e0 20 20 20 20 4c 6f 67 45 73 74 20 72 43 6f 73 74      LogEst rCost
2b9f0 49 64 78 3b 0a 20 20 20 20 4c 6f 67 45 73 74 20  Idx;.    LogEst 
2ba00 6e 4f 75 74 55 6e 61 64 6a 75 73 74 65 64 3b 20  nOutUnadjusted; 
2ba10 20 20 20 20 20 20 20 2f 2a 20 6e 4f 75 74 20 62         /* nOut b
2ba20 65 66 6f 72 65 20 49 4e 28 29 20 61 6e 64 20 57  efore IN() and W
2ba30 48 45 52 45 20 61 64 6a 75 73 74 6d 65 6e 74 73  HERE adjustments
2ba40 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 49 6e 20   */.    int nIn 
2ba50 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  = 0;.#ifdef SQLI
2ba60 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f  TE_ENABLE_STAT3_
2ba70 4f 52 5f 53 54 41 54 34 0a 20 20 20 20 69 6e 74  OR_STAT4.    int
2ba80 20 6e 52 65 63 56 61 6c 69 64 20 3d 20 70 42 75   nRecValid = pBu
2ba90 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64  ilder->nRecValid
2baa0 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28  ;.#endif.    if(
2bab0 20 28 65 4f 70 3d 3d 57 4f 5f 49 53 4e 55 4c 4c   (eOp==WO_ISNULL
2bac0 20 7c 7c 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c   || (pTerm->wtFl
2bad0 61 67 73 26 54 45 52 4d 5f 56 4e 55 4c 4c 29 21  ags&TERM_VNULL)!
2bae0 3d 30 29 0a 20 20 20 20 20 26 26 20 28 69 43 6f  =0).     && (iCo
2baf0 6c 3c 30 20 7c 7c 20 70 53 72 63 2d 3e 70 54 61  l<0 || pSrc->pTa
2bb00 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 6e 6f  b->aCol[iCol].no
2bb10 74 4e 75 6c 6c 29 0a 20 20 20 20 29 7b 0a 20 20  tNull).    ){.  
2bb20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 2f 2a      continue; /*
2bb30 20 69 67 6e 6f 72 65 20 49 53 20 5b 4e 4f 54 5d   ignore IS [NOT]
2bb40 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74   NULL constraint
2bb50 73 20 6f 6e 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f  s on NOT NULL co
2bb60 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 7d 0a 20  lumns */.    }. 
2bb70 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 70 72     if( pTerm->pr
2bb80 65 72 65 71 52 69 67 68 74 20 26 20 70 4e 65 77  ereqRight & pNew
2bb90 2d 3e 6d 61 73 6b 53 65 6c 66 20 29 20 63 6f 6e  ->maskSelf ) con
2bba0 74 69 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 44  tinue;..    /* D
2bbb0 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20 74 68 65 20  o not allow the 
2bbc0 75 70 70 65 72 20 62 6f 75 6e 64 20 6f 66 20 61  upper bound of a
2bbd0 20 4c 49 4b 45 20 6f 70 74 69 6d 69 7a 61 74 69   LIKE optimizati
2bbe0 6f 6e 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61  on range constra
2bbf0 69 6e 74 0a 20 20 20 20 2a 2a 20 74 6f 20 6d 69  int.    ** to mi
2bc00 78 20 77 69 74 68 20 61 20 6c 6f 77 65 72 20 72  x with a lower r
2bc10 61 6e 67 65 20 62 6f 75 6e 64 20 66 72 6f 6d 20  ange bound from 
2bc20 73 6f 6d 65 20 6f 74 68 65 72 20 73 6f 75 72 63  some other sourc
2bc30 65 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 54 65  e */.    if( pTe
2bc40 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
2bc50 52 4d 5f 4c 49 4b 45 4f 50 54 20 26 26 20 70 54  RM_LIKEOPT && pT
2bc60 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d  erm->eOperator==
2bc70 57 4f 5f 4c 54 20 29 20 63 6f 6e 74 69 6e 75 65  WO_LT ) continue
2bc80 3b 0a 0a 20 20 20 20 70 4e 65 77 2d 3e 77 73 46  ;..    pNew->wsF
2bc90 6c 61 67 73 20 3d 20 73 61 76 65 64 5f 77 73 46  lags = saved_wsF
2bca0 6c 61 67 73 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  lags;.    pNew->
2bcb0 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 73 61  u.btree.nEq = sa
2bcc0 76 65 64 5f 6e 45 71 3b 0a 20 20 20 20 70 4e 65  ved_nEq;.    pNe
2bcd0 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 73 61 76 65  w->nLTerm = save
2bce0 64 5f 6e 4c 54 65 72 6d 3b 0a 20 20 20 20 69 66  d_nLTerm;.    if
2bcf0 28 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a  ( whereLoopResiz
2bd00 65 28 64 62 2c 20 70 4e 65 77 2c 20 70 4e 65 77  e(db, pNew, pNew
2bd10 2d 3e 6e 4c 54 65 72 6d 2b 31 29 20 29 20 62 72  ->nLTerm+1) ) br
2bd20 65 61 6b 3b 20 2f 2a 20 4f 4f 4d 20 2a 2f 0a 20  eak; /* OOM */. 
2bd30 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b     pNew->aLTerm[
2bd40 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b 2b 5d 20  pNew->nLTerm++] 
2bd50 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 70 4e 65  = pTerm;.    pNe
2bd60 77 2d 3e 70 72 65 72 65 71 20 3d 20 28 73 61 76  w->prereq = (sav
2bd70 65 64 5f 70 72 65 72 65 71 20 7c 20 70 54 65 72  ed_prereq | pTer
2bd80 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 29 20  m->prereqRight) 
2bd90 26 20 7e 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c  & ~pNew->maskSel
2bda0 66 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  f;..    assert( 
2bdb0 6e 49 6e 4d 75 6c 3d 3d 30 0a 20 20 20 20 20 20  nInMul==0.      
2bdc0 20 20 7c 7c 20 28 70 4e 65 77 2d 3e 77 73 46 6c    || (pNew->wsFl
2bdd0 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55  ags & WHERE_COLU
2bde0 4d 4e 5f 4e 55 4c 4c 29 21 3d 30 20 0a 20 20 20  MN_NULL)!=0 .   
2bdf0 20 20 20 20 20 7c 7c 20 28 70 4e 65 77 2d 3e 77       || (pNew->w
2be00 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43  sFlags & WHERE_C
2be10 4f 4c 55 4d 4e 5f 49 4e 29 21 3d 30 20 0a 20 20  OLUMN_IN)!=0 .  
2be20 20 20 20 20 20 20 7c 7c 20 28 70 4e 65 77 2d 3e        || (pNew->
2be30 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
2be40 53 4b 49 50 53 43 41 4e 29 21 3d 30 20 0a 20 20  SKIPSCAN)!=0 .  
2be50 20 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 65 4f    );..    if( eO
2be60 70 20 26 20 57 4f 5f 49 4e 20 29 7b 0a 20 20 20  p & WO_IN ){.   
2be70 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d     Expr *pExpr =
2be80 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20   pTerm->pExpr;. 
2be90 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61       pNew->wsFla
2bea0 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55  gs |= WHERE_COLU
2beb0 4d 4e 5f 49 4e 3b 0a 20 20 20 20 20 20 69 66 28  MN_IN;.      if(
2bec0 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
2bed0 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  (pExpr, EP_xIsSe
2bee0 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20 20  lect) ){.       
2bef0 20 2f 2a 20 22 78 20 49 4e 20 28 53 45 4c 45 43   /* "x IN (SELEC
2bf00 54 20 2e 2e 2e 29 22 3a 20 20 54 55 4e 49 4e 47  T ...)":  TUNING
2bf10 3a 20 74 68 65 20 53 45 4c 45 43 54 20 72 65 74  : the SELECT ret
2bf20 75 72 6e 73 20 32 35 20 72 6f 77 73 20 2a 2f 0a  urns 25 rows */.
2bf30 20 20 20 20 20 20 20 20 6e 49 6e 20 3d 20 34 36          nIn = 46
2bf40 3b 20 20 61 73 73 65 72 74 28 20 34 36 3d 3d 73  ;  assert( 46==s
2bf50 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 32 35 29  qlite3LogEst(25)
2bf60 20 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20   );.      }else 
2bf70 69 66 28 20 41 4c 57 41 59 53 28 70 45 78 70 72  if( ALWAYS(pExpr
2bf80 2d 3e 78 2e 70 4c 69 73 74 20 26 26 20 70 45 78  ->x.pList && pEx
2bf90 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78  pr->x.pList->nEx
2bfa0 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  pr) ){.        /
2bfb0 2a 20 22 78 20 49 4e 20 28 76 61 6c 75 65 2c 20  * "x IN (value, 
2bfc0 76 61 6c 75 65 2c 20 2e 2e 2e 29 22 20 2a 2f 0a  value, ...)" */.
2bfd0 20 20 20 20 20 20 20 20 6e 49 6e 20 3d 20 73 71          nIn = sq
2bfe0 6c 69 74 65 33 4c 6f 67 45 73 74 28 70 45 78 70  lite3LogEst(pExp
2bff0 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70  r->x.pList->nExp
2c000 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
2c010 20 20 61 73 73 65 72 74 28 20 6e 49 6e 3e 30 20    assert( nIn>0 
2c020 29 3b 20 20 2f 2a 20 52 48 53 20 61 6c 77 61 79  );  /* RHS alway
2c030 73 20 68 61 73 20 32 20 6f 72 20 6d 6f 72 65 20  s has 2 or more 
2c040 74 65 72 6d 73 2e 2e 2e 20 20 54 68 65 20 70 61  terms...  The pa
2c050 72 73 65 72 0a 20 20 20 20 20 20 20 20 20 20 20  rser.           
2c060 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
2c070 63 68 61 6e 67 65 73 20 22 78 20 49 4e 20 28 3f  changes "x IN (?
2c080 29 22 20 69 6e 74 6f 20 22 78 3d 3f 22 2e 20 2a  )" into "x=?". *
2c090 2f 0a 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  /..    }else if(
2c0a0 20 65 4f 70 20 26 20 28 57 4f 5f 45 51 29 20 29   eOp & (WO_EQ) )
2c0b0 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73  {.      pNew->ws
2c0c0 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43  Flags |= WHERE_C
2c0d0 4f 4c 55 4d 4e 5f 45 51 3b 0a 20 20 20 20 20 20  OLUMN_EQ;.      
2c0e0 69 66 28 20 69 43 6f 6c 3c 30 20 7c 7c 20 28 6e  if( iCol<0 || (n
2c0f0 49 6e 4d 75 6c 3d 3d 30 20 26 26 20 70 4e 65 77  InMul==0 && pNew
2c100 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3d 3d 70  ->u.btree.nEq==p
2c110 50 72 6f 62 65 2d 3e 6e 4b 65 79 43 6f 6c 2d 31  Probe->nKeyCol-1
2c120 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ) ){.        if(
2c130 20 69 43 6f 6c 3e 3d 30 20 26 26 20 70 50 72 6f   iCol>=0 && pPro
2c140 62 65 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c 3d  be->uniqNotNull=
2c150 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
2c160 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d  pNew->wsFlags |=
2c170 20 57 48 45 52 45 5f 55 4e 51 5f 57 41 4e 54 45   WHERE_UNQ_WANTE
2c180 44 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  D;.        }else
2c190 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77  {.          pNew
2c1a0 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45  ->wsFlags |= WHE
2c1b0 52 45 5f 4f 4e 45 52 4f 57 3b 0a 20 20 20 20 20  RE_ONEROW;.     
2c1c0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
2c1d0 20 7d 65 6c 73 65 20 69 66 28 20 65 4f 70 20 26   }else if( eOp &
2c1e0 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20   WO_ISNULL ){.  
2c1f0 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67      pNew->wsFlag
2c200 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d  s |= WHERE_COLUM
2c210 4e 5f 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73  N_NULL;.    }els
2c220 65 20 69 66 28 20 65 4f 70 20 26 20 28 57 4f 5f  e if( eOp & (WO_
2c230 47 54 7c 57 4f 5f 47 45 29 20 29 7b 0a 20 20 20  GT|WO_GE) ){.   
2c240 20 20 20 74 65 73 74 63 61 73 65 28 20 65 4f 70     testcase( eOp
2c250 20 26 20 57 4f 5f 47 54 20 29 3b 0a 20 20 20 20   & WO_GT );.    
2c260 20 20 74 65 73 74 63 61 73 65 28 20 65 4f 70 20    testcase( eOp 
2c270 26 20 57 4f 5f 47 45 20 29 3b 0a 20 20 20 20 20  & WO_GE );.     
2c280 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c   pNew->wsFlags |
2c290 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52  = WHERE_COLUMN_R
2c2a0 41 4e 47 45 7c 57 48 45 52 45 5f 42 54 4d 5f 4c  ANGE|WHERE_BTM_L
2c2b0 49 4d 49 54 3b 0a 20 20 20 20 20 20 70 42 74 6d  IMIT;.      pBtm
2c2c0 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20   = pTerm;.      
2c2d0 70 54 6f 70 20 3d 20 30 3b 0a 20 20 20 20 20 20  pTop = 0;.      
2c2e0 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61  if( pTerm->wtFla
2c2f0 67 73 20 26 20 54 45 52 4d 5f 4c 49 4b 45 4f 50  gs & TERM_LIKEOP
2c300 54 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  T ){.        /* 
2c310 52 61 6e 67 65 20 63 6f 6e 74 72 61 69 6e 74 73  Range contraints
2c320 20 74 68 61 74 20 63 6f 6d 65 20 66 72 6f 6d 20   that come from 
2c330 74 68 65 20 4c 49 4b 45 20 6f 70 74 69 6d 69 7a  the LIKE optimiz
2c340 61 74 69 6f 6e 20 61 72 65 0a 20 20 20 20 20 20  ation are.      
2c350 20 20 2a 2a 20 61 6c 77 61 79 73 20 75 73 65 64    ** always used
2c360 20 69 6e 20 70 61 69 72 73 2e 20 2a 2f 0a 20 20   in pairs. */.  
2c370 20 20 20 20 20 20 70 54 6f 70 20 3d 20 26 70 54        pTop = &pT
2c380 65 72 6d 5b 31 5d 3b 0a 20 20 20 20 20 20 20 20  erm[1];.        
2c390 61 73 73 65 72 74 28 20 28 70 54 6f 70 2d 28 70  assert( (pTop-(p
2c3a0 54 65 72 6d 2d 3e 70 57 43 2d 3e 61 29 29 3c 70  Term->pWC->a))<p
2c3b0 54 65 72 6d 2d 3e 70 57 43 2d 3e 6e 54 65 72 6d  Term->pWC->nTerm
2c3c0 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
2c3d0 72 74 28 20 70 54 6f 70 2d 3e 77 74 46 6c 61 67  rt( pTop->wtFlag
2c3e0 73 20 26 20 54 45 52 4d 5f 4c 49 4b 45 4f 50 54  s & TERM_LIKEOPT
2c3f0 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
2c400 72 74 28 20 70 54 6f 70 2d 3e 65 4f 70 65 72 61  rt( pTop->eOpera
2c410 74 6f 72 3d 3d 57 4f 5f 4c 54 20 29 3b 0a 20 20  tor==WO_LT );.  
2c420 20 20 20 20 20 20 69 66 28 20 77 68 65 72 65 4c        if( whereL
2c430 6f 6f 70 52 65 73 69 7a 65 28 64 62 2c 20 70 4e  oopResize(db, pN
2c440 65 77 2c 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d  ew, pNew->nLTerm
2c450 2b 31 29 20 29 20 62 72 65 61 6b 3b 20 2f 2a 20  +1) ) break; /* 
2c460 4f 4f 4d 20 2a 2f 0a 20 20 20 20 20 20 20 20 70  OOM */.        p
2c470 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 70 4e 65 77  New->aLTerm[pNew
2c480 2d 3e 6e 4c 54 65 72 6d 2b 2b 5d 20 3d 20 70 54  ->nLTerm++] = pT
2c490 6f 70 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  op;.        pNew
2c4a0 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45  ->wsFlags |= WHE
2c4b0 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 3b 0a 20 20  RE_TOP_LIMIT;.  
2c4c0 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
2c4d0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65  .      assert( e
2c4e0 4f 70 20 26 20 28 57 4f 5f 4c 54 7c 57 4f 5f 4c  Op & (WO_LT|WO_L
2c4f0 45 29 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  E) );.      test
2c500 63 61 73 65 28 20 65 4f 70 20 26 20 57 4f 5f 4c  case( eOp & WO_L
2c510 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  T );.      testc
2c520 61 73 65 28 20 65 4f 70 20 26 20 57 4f 5f 4c 45  ase( eOp & WO_LE
2c530 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e   );.      pNew->
2c540 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45  wsFlags |= WHERE
2c550 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c 57 48  _COLUMN_RANGE|WH
2c560 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 3b 0a 20  ERE_TOP_LIMIT;. 
2c570 20 20 20 20 20 70 54 6f 70 20 3d 20 70 54 65 72       pTop = pTer
2c580 6d 3b 0a 20 20 20 20 20 20 70 42 74 6d 20 3d 20  m;.      pBtm = 
2c590 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26  (pNew->wsFlags &
2c5a0 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54   WHERE_BTM_LIMIT
2c5b0 29 21 3d 30 20 3f 0a 20 20 20 20 20 20 20 20 20  )!=0 ?.         
2c5c0 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 65 77              pNew
2c5d0 2d 3e 61 4c 54 65 72 6d 5b 70 4e 65 77 2d 3e 6e  ->aLTerm[pNew->n
2c5e0 4c 54 65 72 6d 2d 32 5d 20 3a 20 30 3b 0a 20 20  LTerm-2] : 0;.  
2c5f0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74    }..    /* At t
2c600 68 69 73 20 70 6f 69 6e 74 20 70 4e 65 77 2d 3e  his point pNew->
2c610 6e 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 74  nOut is set to t
2c620 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
2c630 73 20 65 78 70 65 63 74 65 64 20 74 6f 0a 20 20  s expected to.  
2c640 20 20 2a 2a 20 62 65 20 76 69 73 69 74 65 64 20    ** be visited 
2c650 62 79 20 74 68 65 20 69 6e 64 65 78 20 73 63 61  by the index sca
2c660 6e 20 62 65 66 6f 72 65 20 63 6f 6e 73 69 64 65  n before conside
2c670 72 69 6e 67 20 74 65 72 6d 20 70 54 65 72 6d 2c  ring term pTerm,
2c680 20 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 76   or the.    ** v
2c690 61 6c 75 65 73 20 6f 66 20 6e 49 6e 20 61 6e 64  alues of nIn and
2c6a0 20 6e 49 6e 4d 75 6c 2e 20 49 6e 20 6f 74 68 65   nInMul. In othe
2c6b0 72 20 77 6f 72 64 73 2c 20 61 73 73 75 6d 69 6e  r words, assumin
2c6c0 67 20 74 68 61 74 20 61 6c 6c 20 0a 20 20 20 20  g that all .    
2c6d0 2a 2a 20 22 78 20 49 4e 28 2e 2e 2e 29 22 20 74  ** "x IN(...)" t
2c6e0 65 72 6d 73 20 61 72 65 20 72 65 70 6c 61 63 65  erms are replace
2c6f0 64 20 77 69 74 68 20 22 78 20 3d 20 3f 22 2e 20  d with "x = ?". 
2c700 54 68 69 73 20 62 6c 6f 63 6b 20 75 70 64 61 74  This block updat
2c710 65 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 76 61  es.    ** the va
2c720 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 6e 4f 75  lue of pNew->nOu
2c730 74 20 74 6f 20 61 63 63 6f 75 6e 74 20 66 6f 72  t to account for
2c740 20 70 54 65 72 6d 20 28 62 75 74 20 6e 6f 74 20   pTerm (but not 
2c750 6e 49 6e 2f 6e 49 6e 4d 75 6c 29 2e 20 20 2a 2f  nIn/nInMul).  */
2c760 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65  .    assert( pNe
2c770 77 2d 3e 6e 4f 75 74 3d 3d 73 61 76 65 64 5f 6e  w->nOut==saved_n
2c780 4f 75 74 20 29 3b 0a 20 20 20 20 69 66 28 20 70  Out );.    if( p
2c790 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  New->wsFlags & W
2c7a0 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47  HERE_COLUMN_RANG
2c7b0 45 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 64  E ){.      /* Ad
2c7c0 6a 75 73 74 20 6e 4f 75 74 20 75 73 69 6e 67 20  just nOut using 
2c7d0 73 74 61 74 33 2f 73 74 61 74 34 20 64 61 74 61  stat3/stat4 data
2c7e0 2e 20 4f 72 2c 20 69 66 20 74 68 65 72 65 20 69  . Or, if there i
2c7f0 73 20 6e 6f 20 73 74 61 74 33 2f 73 74 61 74 34  s no stat3/stat4
2c800 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 2c 20  .      ** data, 
2c810 75 73 69 6e 67 20 73 6f 6d 65 20 6f 74 68 65 72  using some other
2c820 20 65 73 74 69 6d 61 74 65 2e 20 20 2a 2f 0a 20   estimate.  */. 
2c830 20 20 20 20 20 77 68 65 72 65 52 61 6e 67 65 53       whereRangeS
2c840 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c 20 70  canEst(pParse, p
2c850 42 75 69 6c 64 65 72 2c 20 70 42 74 6d 2c 20 70  Builder, pBtm, p
2c860 54 6f 70 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20  Top, pNew);.    
2c870 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
2c880 20 6e 45 71 20 3d 20 2b 2b 70 4e 65 77 2d 3e 75   nEq = ++pNew->u
2c890 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20 20 20  .btree.nEq;.    
2c8a0 20 20 61 73 73 65 72 74 28 20 65 4f 70 20 26 20    assert( eOp & 
2c8b0 28 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 45 51  (WO_ISNULL|WO_EQ
2c8c0 7c 57 4f 5f 49 4e 29 20 29 3b 0a 0a 20 20 20 20  |WO_IN) );..    
2c8d0 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e    assert( pNew->
2c8e0 6e 4f 75 74 3d 3d 73 61 76 65 64 5f 6e 4f 75 74  nOut==saved_nOut
2c8f0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54   );.      if( pT
2c900 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3c 3d  erm->truthProb<=
2c910 30 20 26 26 20 69 43 6f 6c 3e 3d 30 20 29 7b 0a  0 && iCol>=0 ){.
2c920 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2c930 28 65 4f 70 20 26 20 57 4f 5f 49 4e 29 20 7c 7c  (eOp & WO_IN) ||
2c940 20 6e 49 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20   nIn==0 );.     
2c950 20 20 20 74 65 73 74 63 61 73 65 28 20 65 4f 70     testcase( eOp
2c960 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20   & WO_IN );.    
2c970 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b      pNew->nOut +
2c980 3d 20 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72  = pTerm->truthPr
2c990 6f 62 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  ob;.        pNew
2c9a0 2d 3e 6e 4f 75 74 20 2d 3d 20 6e 49 6e 3b 0a 20  ->nOut -= nIn;. 
2c9b0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 23 69 66 64       }else{.#ifd
2c9c0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
2c9d0 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a  _STAT3_OR_STAT4.
2c9e0 20 20 20 20 20 20 20 20 74 52 6f 77 63 6e 74 20          tRowcnt 
2c9f0 6e 4f 75 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  nOut = 0;.      
2ca00 20 20 69 66 28 20 6e 49 6e 4d 75 6c 3d 3d 30 20    if( nInMul==0 
2ca10 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 50 72  .         && pPr
2ca20 6f 62 65 2d 3e 6e 53 61 6d 70 6c 65 20 0a 20 20  obe->nSample .  
2ca30 20 20 20 20 20 20 20 26 26 20 70 4e 65 77 2d 3e         && pNew->
2ca40 75 2e 62 74 72 65 65 2e 6e 45 71 3c 3d 70 50 72  u.btree.nEq<=pPr
2ca50 6f 62 65 2d 3e 6e 53 61 6d 70 6c 65 43 6f 6c 0a  obe->nSampleCol.
2ca60 20 20 20 20 20 20 20 20 20 26 26 20 28 28 65 4f           && ((eO
2ca70 70 20 26 20 57 4f 5f 49 4e 29 3d 3d 30 20 7c 7c  p & WO_IN)==0 ||
2ca80 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
2ca90 79 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20  y(pTerm->pExpr, 
2caa0 45 50 5f 78 49 73 53 65 6c 65 63 74 29 29 0a 20  EP_xIsSelect)). 
2cab0 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
2cac0 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20      Expr *pExpr 
2cad0 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a  = pTerm->pExpr;.
2cae0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 65            if( (e
2caf0 4f 70 20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f 49  Op & (WO_EQ|WO_I
2cb00 53 4e 55 4c 4c 29 29 21 3d 30 20 29 7b 0a 20 20  SNULL))!=0 ){.  
2cb10 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
2cb20 73 65 28 20 65 4f 70 20 26 20 57 4f 5f 45 51 20  se( eOp & WO_EQ 
2cb30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  );.            t
2cb40 65 73 74 63 61 73 65 28 20 65 4f 70 20 26 20 57  estcase( eOp & W
2cb50 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20  O_ISNULL );.    
2cb60 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 68 65          rc = whe
2cb70 72 65 45 71 75 61 6c 53 63 61 6e 45 73 74 28 70  reEqualScanEst(p
2cb80 50 61 72 73 65 2c 20 70 42 75 69 6c 64 65 72 2c  Parse, pBuilder,
2cb90 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
2cba0 26 6e 4f 75 74 29 3b 0a 20 20 20 20 20 20 20 20  &nOut);.        
2cbb0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2cbc0 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 49       rc = whereI
2cbd0 6e 53 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c  nScanEst(pParse,
2cbe0 20 70 42 75 69 6c 64 65 72 2c 20 70 45 78 70 72   pBuilder, pExpr
2cbf0 2d 3e 78 2e 70 4c 69 73 74 2c 20 26 6e 4f 75 74  ->x.pList, &nOut
2cc00 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
2cc10 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d           if( rc=
2cc20 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44  =SQLITE_NOTFOUND
2cc30 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f   ) rc = SQLITE_O
2cc40 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  K;.          if(
2cc50 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2cc60 20 62 72 65 61 6b 3b 20 20 20 20 20 20 20 20 20   break;         
2cc70 20 2f 2a 20 4a 75 6d 70 20 6f 75 74 20 6f 66 20   /* Jump out of 
2cc80 74 68 65 20 70 54 65 72 6d 20 6c 6f 6f 70 20 2a  the pTerm loop *
2cc90 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
2cca0 6e 4f 75 74 20 29 7b 0a 20 20 20 20 20 20 20 20  nOut ){.        
2ccb0 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d      pNew->nOut =
2ccc0 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 6e   sqlite3LogEst(n
2ccd0 4f 75 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Out);.          
2cce0 20 20 69 66 28 20 70 4e 65 77 2d 3e 6e 4f 75 74    if( pNew->nOut
2ccf0 3e 73 61 76 65 64 5f 6e 4f 75 74 20 29 20 70 4e  >saved_nOut ) pN
2cd00 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64  ew->nOut = saved
2cd10 5f 6e 4f 75 74 3b 0a 20 20 20 20 20 20 20 20 20  _nOut;.         
2cd20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2d 3d     pNew->nOut -=
2cd30 20 6e 49 6e 3b 0a 20 20 20 20 20 20 20 20 20 20   nIn;.          
2cd40 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
2cd50 20 20 20 20 69 66 28 20 6e 4f 75 74 3d 3d 30 20      if( nOut==0 
2cd60 29 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20  ).#endif.       
2cd70 20 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65   {.          pNe
2cd80 77 2d 3e 6e 4f 75 74 20 2b 3d 20 28 70 50 72 6f  w->nOut += (pPro
2cd90 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b  be->aiRowLogEst[
2cda0 6e 45 71 5d 20 2d 20 70 50 72 6f 62 65 2d 3e 61  nEq] - pProbe->a
2cdb0 69 52 6f 77 4c 6f 67 45 73 74 5b 6e 45 71 2d 31  iRowLogEst[nEq-1
2cdc0 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ]);.          if
2cdd0 28 20 65 4f 70 20 26 20 57 4f 5f 49 53 4e 55 4c  ( eOp & WO_ISNUL
2cde0 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  L ){.           
2cdf0 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 49 66 20 74   /* TUNING: If t
2ce00 68 65 72 65 20 69 73 20 6e 6f 20 6c 69 6b 65 6c  here is no likel
2ce10 69 68 6f 6f 64 28 29 20 76 61 6c 75 65 2c 20 61  ihood() value, a
2ce20 73 73 75 6d 65 20 74 68 61 74 20 61 20 0a 20 20  ssume that a .  
2ce30 20 20 20 20 20 20 20 20 20 20 2a 2a 20 22 63 6f            ** "co
2ce40 6c 20 49 53 20 4e 55 4c 4c 22 20 65 78 70 72 65  l IS NULL" expre
2ce50 73 73 69 6f 6e 20 6d 61 74 63 68 65 73 20 74 77  ssion matches tw
2ce60 69 63 65 20 61 73 20 6d 61 6e 79 20 72 6f 77 73  ice as many rows
2ce70 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a   .            **
2ce80 20 61 73 20 28 63 6f 6c 3d 3f 29 2e 20 2a 2f 0a   as (col=?). */.
2ce90 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 65 77              pNew
2cea0 2d 3e 6e 4f 75 74 20 2b 3d 20 31 30 3b 0a 20 20  ->nOut += 10;.  
2ceb0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2cec0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
2ced0 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 72 43  }..    /* Set rC
2cee0 6f 73 74 49 64 78 20 74 6f 20 74 68 65 20 63 6f  ostIdx to the co
2cef0 73 74 20 6f 66 20 76 69 73 69 74 69 6e 67 20 73  st of visiting s
2cf00 65 6c 65 63 74 65 64 20 72 6f 77 73 20 69 6e 20  elected rows in 
2cf10 69 6e 64 65 78 2e 20 41 64 64 0a 20 20 20 20 2a  index. Add.    *
2cf20 2a 20 69 74 20 74 6f 20 70 4e 65 77 2d 3e 72 52  * it to pNew->rR
2cf30 75 6e 2c 20 77 68 69 63 68 20 69 73 20 63 75 72  un, which is cur
2cf40 72 65 6e 74 6c 79 20 73 65 74 20 74 6f 20 74 68  rently set to th
2cf50 65 20 63 6f 73 74 20 6f 66 20 74 68 65 20 69 6e  e cost of the in
2cf60 64 65 78 0a 20 20 20 20 2a 2a 20 73 65 65 6b 20  dex.    ** seek 
2cf70 6f 6e 6c 79 2e 20 54 68 65 6e 2c 20 69 66 20 74  only. Then, if t
2cf80 68 69 73 20 69 73 20 61 20 6e 6f 6e 2d 63 6f 76  his is a non-cov
2cf90 65 72 69 6e 67 20 69 6e 64 65 78 2c 20 61 64 64  ering index, add
2cfa0 20 74 68 65 20 63 6f 73 74 20 6f 66 0a 20 20 20   the cost of.   
2cfb0 20 2a 2a 20 76 69 73 69 74 69 6e 67 20 74 68 65   ** visiting the
2cfc0 20 72 6f 77 73 20 69 6e 20 74 68 65 20 6d 61 69   rows in the mai
2cfd0 6e 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 20  n table.  */.   
2cfe0 20 72 43 6f 73 74 49 64 78 20 3d 20 70 4e 65 77   rCostIdx = pNew
2cff0 2d 3e 6e 4f 75 74 20 2b 20 31 20 2b 20 28 31 35  ->nOut + 1 + (15
2d000 2a 70 50 72 6f 62 65 2d 3e 73 7a 49 64 78 52 6f  *pProbe->szIdxRo
2d010 77 29 2f 70 53 72 63 2d 3e 70 54 61 62 2d 3e 73  w)/pSrc->pTab->s
2d020 7a 54 61 62 52 6f 77 3b 0a 20 20 20 20 70 4e 65  zTabRow;.    pNe
2d030 77 2d 3e 72 52 75 6e 20 3d 20 73 71 6c 69 74 65  w->rRun = sqlite
2d040 33 4c 6f 67 45 73 74 41 64 64 28 72 4c 6f 67 53  3LogEstAdd(rLogS
2d050 69 7a 65 2c 20 72 43 6f 73 74 49 64 78 29 3b 0a  ize, rCostIdx);.
2d060 20 20 20 20 69 66 28 20 28 70 4e 65 77 2d 3e 77      if( (pNew->w
2d070 73 46 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f  sFlags & (WHERE_
2d080 49 44 58 5f 4f 4e 4c 59 7c 57 48 45 52 45 5f 49  IDX_ONLY|WHERE_I
2d090 50 4b 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  PK))==0 ){.     
2d0a0 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 73 71   pNew->rRun = sq
2d0b0 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28 70  lite3LogEstAdd(p
2d0c0 4e 65 77 2d 3e 72 52 75 6e 2c 20 70 4e 65 77 2d  New->rRun, pNew-
2d0d0 3e 6e 4f 75 74 20 2b 20 31 36 29 3b 0a 20 20 20  >nOut + 16);.   
2d0e0 20 7d 0a 20 20 20 20 41 70 70 6c 79 43 6f 73 74   }.    ApplyCost
2d0f0 4d 75 6c 74 69 70 6c 69 65 72 28 70 4e 65 77 2d  Multiplier(pNew-
2d100 3e 72 52 75 6e 2c 20 70 50 72 6f 62 65 2d 3e 70  >rRun, pProbe->p
2d110 54 61 62 6c 65 2d 3e 63 6f 73 74 4d 75 6c 74 29  Table->costMult)
2d120 3b 0a 0a 20 20 20 20 6e 4f 75 74 55 6e 61 64 6a  ;..    nOutUnadj
2d130 75 73 74 65 64 20 3d 20 70 4e 65 77 2d 3e 6e 4f  usted = pNew->nO
2d140 75 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 72 52  ut;.    pNew->rR
2d150 75 6e 20 2b 3d 20 6e 49 6e 4d 75 6c 20 2b 20 6e  un += nInMul + n
2d160 49 6e 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4f  In;.    pNew->nO
2d170 75 74 20 2b 3d 20 6e 49 6e 4d 75 6c 20 2b 20 6e  ut += nInMul + n
2d180 49 6e 3b 0a 20 20 20 20 77 68 65 72 65 4c 6f 6f  In;.    whereLoo
2d190 70 4f 75 74 70 75 74 41 64 6a 75 73 74 28 70 42  pOutputAdjust(pB
2d1a0 75 69 6c 64 65 72 2d 3e 70 57 43 2c 20 70 4e 65  uilder->pWC, pNe
2d1b0 77 2c 20 72 53 69 7a 65 29 3b 0a 20 20 20 20 72  w, rSize);.    r
2d1c0 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73  c = whereLoopIns
2d1d0 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e  ert(pBuilder, pN
2d1e0 65 77 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 4e  ew);..    if( pN
2d1f0 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  ew->wsFlags & WH
2d200 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45  ERE_COLUMN_RANGE
2d210 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e   ){.      pNew->
2d220 6e 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e 4f 75  nOut = saved_nOu
2d230 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  t;.    }else{.  
2d240 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d      pNew->nOut =
2d250 20 6e 4f 75 74 55 6e 61 64 6a 75 73 74 65 64 3b   nOutUnadjusted;
2d260 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
2d270 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26  (pNew->wsFlags &
2d280 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54   WHERE_TOP_LIMIT
2d290 29 3d 3d 30 0a 20 20 20 20 20 26 26 20 70 4e 65  )==0.     && pNe
2d2a0 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3c 70  w->u.btree.nEq<p
2d2b0 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 0a 20  Probe->nColumn. 
2d2c0 20 20 20 29 7b 0a 20 20 20 20 20 20 77 68 65 72     ){.      wher
2d2d0 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 49 6e 64  eLoopAddBtreeInd
2d2e0 65 78 28 70 42 75 69 6c 64 65 72 2c 20 70 53 72  ex(pBuilder, pSr
2d2f0 63 2c 20 70 50 72 6f 62 65 2c 20 6e 49 6e 4d 75  c, pProbe, nInMu
2d300 6c 2b 6e 49 6e 29 3b 0a 20 20 20 20 7d 0a 20 20  l+nIn);.    }.  
2d310 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73    pNew->nOut = s
2d320 61 76 65 64 5f 6e 4f 75 74 3b 0a 23 69 66 64 65  aved_nOut;.#ifde
2d330 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
2d340 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20  STAT3_OR_STAT4. 
2d350 20 20 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65     pBuilder->nRe
2d360 63 56 61 6c 69 64 20 3d 20 6e 52 65 63 56 61 6c  cValid = nRecVal
2d370 69 64 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20  id;.#endif.  }. 
2d380 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20   pNew->prereq = 
2d390 73 61 76 65 64 5f 70 72 65 72 65 71 3b 0a 20 20  saved_prereq;.  
2d3a0 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  pNew->u.btree.nE
2d3b0 71 20 3d 20 73 61 76 65 64 5f 6e 45 71 3b 0a 20  q = saved_nEq;. 
2d3c0 20 70 4e 65 77 2d 3e 6e 53 6b 69 70 20 3d 20 73   pNew->nSkip = s
2d3d0 61 76 65 64 5f 6e 53 6b 69 70 3b 0a 20 20 70 4e  aved_nSkip;.  pN
2d3e0 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 73 61  ew->wsFlags = sa
2d3f0 76 65 64 5f 77 73 46 6c 61 67 73 3b 0a 20 20 70  ved_wsFlags;.  p
2d400 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76 65  New->nOut = save
2d410 64 5f 6e 4f 75 74 3b 0a 20 20 70 4e 65 77 2d 3e  d_nOut;.  pNew->
2d420 6e 4c 54 65 72 6d 20 3d 20 73 61 76 65 64 5f 6e  nLTerm = saved_n
2d430 4c 54 65 72 6d 3b 0a 0a 20 20 2f 2a 20 43 6f 6e  LTerm;..  /* Con
2d440 73 69 64 65 72 20 75 73 69 6e 67 20 61 20 73 6b  sider using a sk
2d450 69 70 2d 73 63 61 6e 20 69 66 20 74 68 65 72 65  ip-scan if there
2d460 20 61 72 65 20 6e 6f 20 57 48 45 52 45 20 63 6c   are no WHERE cl
2d470 61 75 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73  ause constraints
2d480 0a 20 20 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20  .  ** available 
2d490 66 6f 72 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73  for the left-mos
2d4a0 74 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 69  t terms of the i
2d4b0 6e 64 65 78 2c 20 61 6e 64 20 69 66 20 74 68 65  ndex, and if the
2d4c0 20 61 76 65 72 61 67 65 0a 20 20 2a 2a 20 6e 75   average.  ** nu
2d4d0 6d 62 65 72 20 6f 66 20 72 65 70 65 61 74 73 20  mber of repeats 
2d4e0 69 6e 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74  in the left-most
2d4f0 20 74 65 72 6d 73 20 69 73 20 61 74 20 6c 65 61   terms is at lea
2d500 73 74 20 31 38 2e 20 0a 20 20 2a 2a 0a 20 20 2a  st 18. .  **.  *
2d510 2a 20 54 68 65 20 6d 61 67 69 63 20 6e 75 6d 62  * The magic numb
2d520 65 72 20 31 38 20 69 73 20 73 65 6c 65 63 74 65  er 18 is selecte
2d530 64 20 6f 6e 20 74 68 65 20 62 61 73 69 73 20 74  d on the basis t
2d540 68 61 74 20 73 63 61 6e 6e 69 6e 67 20 31 37 20  hat scanning 17 
2d550 72 6f 77 73 0a 20 20 2a 2a 20 69 73 20 61 6c 6d  rows.  ** is alm
2d560 6f 73 74 20 61 6c 77 61 79 73 20 71 75 69 63 6b  ost always quick
2d570 65 72 20 74 68 61 6e 20 61 6e 20 69 6e 64 65 78  er than an index
2d580 20 73 65 65 6b 20 28 65 76 65 6e 20 74 68 6f 75   seek (even thou
2d590 67 68 20 69 66 20 74 68 65 20 69 6e 64 65 78 0a  gh if the index.
2d5a0 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 66 65    ** contains fe
2d5b0 77 65 72 20 74 68 61 6e 20 32 5e 31 37 20 72 6f  wer than 2^17 ro
2d5c0 77 73 20 77 65 20 61 73 73 75 6d 65 20 6f 74 68  ws we assume oth
2d5d0 65 72 77 69 73 65 20 69 6e 20 6f 74 68 65 72 20  erwise in other 
2d5e0 70 61 72 74 73 20 6f 66 0a 20 20 2a 2a 20 74 68  parts of.  ** th
2d5f0 65 20 63 6f 64 65 29 2e 20 41 6e 64 2c 20 65 76  e code). And, ev
2d600 65 6e 20 69 66 20 69 74 20 69 73 20 6e 6f 74 2c  en if it is not,
2d610 20 69 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62   it should not b
2d620 65 20 74 6f 6f 20 6d 75 63 68 20 73 6c 6f 77 65  e too much slowe
2d630 72 2e 20 0a 20 20 2a 2a 20 4f 6e 20 74 68 65 20  r. .  ** On the 
2d640 6f 74 68 65 72 20 68 61 6e 64 2c 20 74 68 65 20  other hand, the 
2d650 65 78 74 72 61 20 73 65 65 6b 73 20 63 6f 75 6c  extra seeks coul
2d660 64 20 65 6e 64 20 75 70 20 62 65 69 6e 67 20 73  d end up being s
2d670 69 67 6e 69 66 69 63 61 6e 74 6c 79 0a 20 20 2a  ignificantly.  *
2d680 2a 20 6d 6f 72 65 20 65 78 70 65 6e 73 69 76 65  * more expensive
2d690 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
2d6a0 34 32 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73  42==sqlite3LogEs
2d6b0 74 28 31 38 29 20 29 3b 0a 20 20 69 66 28 20 73  t(18) );.  if( s
2d6c0 61 76 65 64 5f 6e 45 71 3d 3d 73 61 76 65 64 5f  aved_nEq==saved_
2d6d0 6e 53 6b 69 70 0a 20 20 20 26 26 20 73 61 76 65  nSkip.   && save
2d6e0 64 5f 6e 45 71 2b 31 3c 70 50 72 6f 62 65 2d 3e  d_nEq+1<pProbe->
2d6f0 6e 4b 65 79 43 6f 6c 0a 20 20 20 26 26 20 70 50  nKeyCol.   && pP
2d700 72 6f 62 65 2d 3e 6e 6f 53 6b 69 70 53 63 61 6e  robe->noSkipScan
2d710 3d 3d 30 0a 20 20 20 26 26 20 70 50 72 6f 62 65  ==0.   && pProbe
2d720 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 73 61  ->aiRowLogEst[sa
2d730 76 65 64 5f 6e 45 71 2b 31 5d 3e 3d 34 32 20 20  ved_nEq+1]>=42  
2d740 2f 2a 20 54 55 4e 49 4e 47 3a 20 4d 69 6e 69 6d  /* TUNING: Minim
2d750 75 6d 20 66 6f 72 20 73 6b 69 70 2d 73 63 61 6e  um for skip-scan
2d760 20 2a 2f 0a 20 20 20 26 26 20 28 72 63 20 3d 20   */.   && (rc = 
2d770 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28  whereLoopResize(
2d780 64 62 2c 20 70 4e 65 77 2c 20 70 4e 65 77 2d 3e  db, pNew, pNew->
2d790 6e 4c 54 65 72 6d 2b 31 29 29 3d 3d 53 51 4c 49  nLTerm+1))==SQLI
2d7a0 54 45 5f 4f 4b 0a 20 20 29 7b 0a 20 20 20 20 4c  TE_OK.  ){.    L
2d7b0 6f 67 45 73 74 20 6e 49 74 65 72 3b 0a 20 20 20  ogEst nIter;.   
2d7c0 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
2d7d0 45 71 2b 2b 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  Eq++;.    pNew->
2d7e0 6e 53 6b 69 70 2b 2b 3b 0a 20 20 20 20 70 4e 65  nSkip++;.    pNe
2d7f0 77 2d 3e 61 4c 54 65 72 6d 5b 70 4e 65 77 2d 3e  w->aLTerm[pNew->
2d800 6e 4c 54 65 72 6d 2b 2b 5d 20 3d 20 30 3b 0a 20  nLTerm++] = 0;. 
2d810 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73     pNew->wsFlags
2d820 20 7c 3d 20 57 48 45 52 45 5f 53 4b 49 50 53 43   |= WHERE_SKIPSC
2d830 41 4e 3b 0a 20 20 20 20 6e 49 74 65 72 20 3d 20  AN;.    nIter = 
2d840 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f 67  pProbe->aiRowLog
2d850 45 73 74 5b 73 61 76 65 64 5f 6e 45 71 5d 20 2d  Est[saved_nEq] -
2d860 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f   pProbe->aiRowLo
2d870 67 45 73 74 5b 73 61 76 65 64 5f 6e 45 71 2b 31  gEst[saved_nEq+1
2d880 5d 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75  ];.    pNew->nOu
2d890 74 20 2d 3d 20 6e 49 74 65 72 3b 0a 20 20 20 20  t -= nIter;.    
2d8a0 2f 2a 20 54 55 4e 49 4e 47 3a 20 20 42 65 63 61  /* TUNING:  Beca
2d8b0 75 73 65 20 75 6e 63 65 72 74 61 69 6e 74 69 65  use uncertaintie
2d8c0 73 20 69 6e 20 74 68 65 20 65 73 74 69 6d 61 74  s in the estimat
2d8d0 65 73 20 66 6f 72 20 73 6b 69 70 2d 73 63 61 6e  es for skip-scan
2d8e0 20 71 75 65 72 69 65 73 2c 0a 20 20 20 20 2a 2a   queries,.    **
2d8f0 20 61 64 64 20 61 20 31 2e 33 37 35 20 66 75 64   add a 1.375 fud
2d900 67 65 20 66 61 63 74 6f 72 20 74 6f 20 6d 61 6b  ge factor to mak
2d910 65 20 73 6b 69 70 2d 73 63 61 6e 20 73 6c 69 67  e skip-scan slig
2d920 68 74 6c 79 20 6c 65 73 73 20 6c 69 6b 65 6c 79  htly less likely
2d930 2e 20 2a 2f 0a 20 20 20 20 6e 49 74 65 72 20 2b  . */.    nIter +
2d940 3d 20 35 3b 0a 20 20 20 20 77 68 65 72 65 4c 6f  = 5;.    whereLo
2d950 6f 70 41 64 64 42 74 72 65 65 49 6e 64 65 78 28  opAddBtreeIndex(
2d960 70 42 75 69 6c 64 65 72 2c 20 70 53 72 63 2c 20  pBuilder, pSrc, 
2d970 70 50 72 6f 62 65 2c 20 6e 49 74 65 72 20 2b 20  pProbe, nIter + 
2d980 6e 49 6e 4d 75 6c 29 3b 0a 20 20 20 20 70 4e 65  nInMul);.    pNe
2d990 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64 5f  w->nOut = saved_
2d9a0 6e 4f 75 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  nOut;.    pNew->
2d9b0 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 73 61  u.btree.nEq = sa
2d9c0 76 65 64 5f 6e 45 71 3b 0a 20 20 20 20 70 4e 65  ved_nEq;.    pNe
2d9d0 77 2d 3e 6e 53 6b 69 70 20 3d 20 73 61 76 65 64  w->nSkip = saved
2d9e0 5f 6e 53 6b 69 70 3b 0a 20 20 20 20 70 4e 65 77  _nSkip;.    pNew
2d9f0 2d 3e 77 73 46 6c 61 67 73 20 3d 20 73 61 76 65  ->wsFlags = save
2da00 64 5f 77 73 46 6c 61 67 73 3b 0a 20 20 7d 0a 0a  d_wsFlags;.  }..
2da10 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2da20 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 72 75  /*.** Return Tru
2da30 65 20 69 66 20 69 74 20 69 73 20 70 6f 73 73 69  e if it is possi
2da40 62 6c 65 20 74 68 61 74 20 70 49 6e 64 65 78 20  ble that pIndex 
2da50 6d 69 67 68 74 20 62 65 20 75 73 65 66 75 6c 20  might be useful 
2da60 69 6e 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 69  in.** implementi
2da70 6e 67 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  ng the ORDER BY 
2da80 63 6c 61 75 73 65 20 69 6e 20 70 42 75 69 6c 64  clause in pBuild
2da90 65 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  er..**.** Return
2daa0 20 46 61 6c 73 65 20 69 66 20 70 42 75 69 6c 64   False if pBuild
2dab0 65 72 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74  er does not cont
2dac0 61 69 6e 20 61 6e 20 4f 52 44 45 52 20 42 59 20  ain an ORDER BY 
2dad0 63 6c 61 75 73 65 20 6f 72 0a 2a 2a 20 69 66 20  clause or.** if 
2dae0 74 68 65 72 65 20 69 73 20 6e 6f 20 77 61 79 20  there is no way 
2daf0 66 6f 72 20 70 49 6e 64 65 78 20 74 6f 20 62 65  for pIndex to be
2db00 20 75 73 65 66 75 6c 20 69 6e 20 69 6d 70 6c 65   useful in imple
2db10 6d 65 6e 74 69 6e 67 20 74 68 61 74 0a 2a 2a 20  menting that.** 
2db20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e  ORDER BY clause.
2db30 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69  .*/.static int i
2db40 6e 64 65 78 4d 69 67 68 74 48 65 6c 70 57 69 74  ndexMightHelpWit
2db50 68 4f 72 64 65 72 42 79 28 0a 20 20 57 68 65 72  hOrderBy(.  Wher
2db60 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42  eLoopBuilder *pB
2db70 75 69 6c 64 65 72 2c 0a 20 20 49 6e 64 65 78 20  uilder,.  Index 
2db80 2a 70 49 6e 64 65 78 2c 0a 20 20 69 6e 74 20 69  *pIndex,.  int i
2db90 43 75 72 73 6f 72 0a 29 7b 0a 20 20 45 78 70 72  Cursor.){.  Expr
2dba0 4c 69 73 74 20 2a 70 4f 42 3b 0a 20 20 69 6e 74  List *pOB;.  int
2dbb0 20 69 69 2c 20 6a 6a 3b 0a 0a 20 20 69 66 28 20   ii, jj;..  if( 
2dbc0 70 49 6e 64 65 78 2d 3e 62 55 6e 6f 72 64 65 72  pIndex->bUnorder
2dbd0 65 64 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  ed ) return 0;. 
2dbe0 20 69 66 28 20 28 70 4f 42 20 3d 20 70 42 75 69   if( (pOB = pBui
2dbf0 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 2d 3e 70 4f  lder->pWInfo->pO
2dc00 72 64 65 72 42 79 29 3d 3d 30 20 29 20 72 65 74  rderBy)==0 ) ret
2dc10 75 72 6e 20 30 3b 0a 20 20 66 6f 72 28 69 69 3d  urn 0;.  for(ii=
2dc20 30 3b 20 69 69 3c 70 4f 42 2d 3e 6e 45 78 70 72  0; ii<pOB->nExpr
2dc30 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70  ; ii++){.    Exp
2dc40 72 20 2a 70 45 78 70 72 20 3d 20 73 71 6c 69 74  r *pExpr = sqlit
2dc50 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74  e3ExprSkipCollat
2dc60 65 28 70 4f 42 2d 3e 61 5b 69 69 5d 2e 70 45 78  e(pOB->a[ii].pEx
2dc70 70 72 29 3b 0a 20 20 20 20 69 66 28 20 70 45 78  pr);.    if( pEx
2dc80 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d  pr->op!=TK_COLUM
2dc90 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  N ) return 0;.  
2dca0 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54 61    if( pExpr->iTa
2dcb0 62 6c 65 3d 3d 69 43 75 72 73 6f 72 20 29 7b 0a  ble==iCursor ){.
2dcc0 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
2dcd0 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 20 72 65 74  >iColumn<0 ) ret
2dce0 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 66 6f 72  urn 1;.      for
2dcf0 28 6a 6a 3d 30 3b 20 6a 6a 3c 70 49 6e 64 65 78  (jj=0; jj<pIndex
2dd00 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 6a 2b 2b 29  ->nKeyCol; jj++)
2dd10 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 45  {.        if( pE
2dd20 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 49  xpr->iColumn==pI
2dd30 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a  ndex->aiColumn[j
2dd40 6a 5d 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  j] ) return 1;. 
2dd50 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
2dd60 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
2dd70 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 62  /*.** Return a b
2dd80 69 74 6d 61 73 6b 20 77 68 65 72 65 20 31 73 20  itmask where 1s 
2dd90 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68  indicate that th
2dda0 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
2ddb0 63 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a 20 74 68 65  column of.** the
2ddc0 20 74 61 62 6c 65 20 69 73 20 75 73 65 64 20 62   table is used b
2ddd0 79 20 61 6e 20 69 6e 64 65 78 2e 20 20 4f 6e 6c  y an index.  Onl
2dde0 79 20 74 68 65 20 66 69 72 73 74 20 36 33 20 63  y the first 63 c
2ddf0 6f 6c 75 6d 6e 73 20 61 72 65 20 63 6f 6e 73 69  olumns are consi
2de00 64 65 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  dered..*/.static
2de10 20 42 69 74 6d 61 73 6b 20 63 6f 6c 75 6d 6e 73   Bitmask columns
2de20 49 6e 49 6e 64 65 78 28 49 6e 64 65 78 20 2a 70  InIndex(Index *p
2de30 49 64 78 29 7b 0a 20 20 42 69 74 6d 61 73 6b 20  Idx){.  Bitmask 
2de40 6d 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6a 3b 0a  m = 0;.  int j;.
2de50 20 20 66 6f 72 28 6a 3d 70 49 64 78 2d 3e 6e 43    for(j=pIdx->nC
2de60 6f 6c 75 6d 6e 2d 31 3b 20 6a 3e 3d 30 3b 20 6a  olumn-1; j>=0; j
2de70 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20 78 20 3d  --){.    int x =
2de80 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
2de90 6a 5d 3b 0a 20 20 20 20 69 66 28 20 78 3e 3d 30  j];.    if( x>=0
2dea0 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61   ){.      testca
2deb0 73 65 28 20 78 3d 3d 42 4d 53 2d 31 20 29 3b 0a  se( x==BMS-1 );.
2dec0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2ded0 78 3d 3d 42 4d 53 2d 32 20 29 3b 0a 20 20 20 20  x==BMS-2 );.    
2dee0 20 20 69 66 28 20 78 3c 42 4d 53 2d 31 20 29 20    if( x<BMS-1 ) 
2def0 6d 20 7c 3d 20 4d 41 53 4b 42 49 54 28 78 29 3b  m |= MASKBIT(x);
2df00 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
2df10 75 72 6e 20 6d 3b 0a 7d 0a 0a 2f 2a 20 43 68 65  urn m;.}../* Che
2df20 63 6b 20 74 6f 20 73 65 65 20 69 66 20 61 20 70  ck to see if a p
2df30 61 72 74 69 61 6c 20 69 6e 64 65 78 20 77 69 74  artial index wit
2df40 68 20 70 50 61 72 74 49 6e 64 65 78 57 68 65 72  h pPartIndexWher
2df50 65 20 63 61 6e 20 62 65 20 75 73 65 64 0a 2a 2a  e can be used.**
2df60 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   in the current 
2df70 71 75 65 72 79 2e 20 20 52 65 74 75 72 6e 20 74  query.  Return t
2df80 72 75 65 20 69 66 20 69 74 20 63 61 6e 20 62 65  rue if it can be
2df90 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20 6e 6f   and false if no
2dfa0 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
2dfb0 20 77 68 65 72 65 55 73 61 62 6c 65 50 61 72 74   whereUsablePart
2dfc0 69 61 6c 49 6e 64 65 78 28 69 6e 74 20 69 54 61  ialIndex(int iTa
2dfd0 62 2c 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  b, WhereClause *
2dfe0 70 57 43 2c 20 45 78 70 72 20 2a 70 57 68 65 72  pWC, Expr *pWher
2dff0 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 57  e){.  int i;.  W
2e000 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b  hereTerm *pTerm;
2e010 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 54 65 72  .  for(i=0, pTer
2e020 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c 70 57 43 2d  m=pWC->a; i<pWC-
2e030 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c 20 70 54 65  >nTerm; i++, pTe
2e040 72 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20  rm++){.    Expr 
2e050 2a 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e  *pExpr = pTerm->
2e060 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 73  pExpr;.    if( s
2e070 71 6c 69 74 65 33 45 78 70 72 49 6d 70 6c 69 65  qlite3ExprImplie
2e080 73 45 78 70 72 28 70 45 78 70 72 2c 20 70 57 68  sExpr(pExpr, pWh
2e090 65 72 65 2c 20 69 54 61 62 29 20 0a 20 20 20 20  ere, iTab) .    
2e0a0 20 26 26 20 28 21 45 78 70 72 48 61 73 50 72 6f   && (!ExprHasPro
2e0b0 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
2e0c0 46 72 6f 6d 4a 6f 69 6e 29 20 7c 7c 20 70 45 78  FromJoin) || pEx
2e0d0 70 72 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61  pr->iRightJoinTa
2e0e0 62 6c 65 3d 3d 69 54 61 62 29 0a 20 20 20 20 29  ble==iTab).    )
2e0f0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  {.      return 1
2e100 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
2e110 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
2e120 20 41 64 64 20 61 6c 6c 20 57 68 65 72 65 4c 6f   Add all WhereLo
2e130 6f 70 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 61  op objects for a
2e140 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 6f 66   single table of
2e150 20 74 68 65 20 6a 6f 69 6e 20 77 68 65 72 65 20   the join where 
2e160 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20 69 73 20  the table.** is 
2e170 69 64 65 6e 66 69 65 64 20 62 79 20 70 42 75 69  idenfied by pBui
2e180 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 69 54 61 62  lder->pNew->iTab
2e190 2e 20 20 54 68 61 74 20 74 61 62 6c 65 20 69 73  .  That table is
2e1a0 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62   guaranteed to b
2e1b0 65 0a 2a 2a 20 61 20 62 2d 74 72 65 65 20 74 61  e.** a b-tree ta
2e1c0 62 6c 65 2c 20 6e 6f 74 20 61 20 76 69 72 74 75  ble, not a virtu
2e1d0 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  al table..**.** 
2e1e0 54 68 65 20 63 6f 73 74 73 20 28 57 68 65 72 65  The costs (Where
2e1f0 4c 6f 6f 70 2e 72 52 75 6e 29 20 6f 66 20 74 68  Loop.rRun) of th
2e200 65 20 62 2d 74 72 65 65 20 6c 6f 6f 70 73 20 61  e b-tree loops a
2e210 64 64 65 64 20 62 79 20 74 68 69 73 20 66 75 6e  dded by this fun
2e220 63 74 69 6f 6e 0a 2a 2a 20 61 72 65 20 63 61 6c  ction.** are cal
2e230 63 75 6c 61 74 65 64 20 61 73 20 66 6f 6c 6c 6f  culated as follo
2e240 77 73 3a 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20  ws:.**.** For a 
2e250 66 75 6c 6c 20 73 63 61 6e 2c 20 61 73 73 75 6d  full scan, assum
2e260 69 6e 67 20 74 68 65 20 74 61 62 6c 65 20 28 6f  ing the table (o
2e270 72 20 69 6e 64 65 78 29 20 63 6f 6e 74 61 69 6e  r index) contain
2e280 73 20 6e 52 6f 77 20 72 6f 77 73 3a 0a 2a 2a 0a  s nRow rows:.**.
2e290 2a 2a 20 20 20 20 20 63 6f 73 74 20 3d 20 6e 52  **     cost = nR
2e2a0 6f 77 20 2a 20 33 2e 30 20 20 20 20 20 20 20 20  ow * 3.0        
2e2b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 66              // f
2e2c0 75 6c 6c 2d 74 61 62 6c 65 20 73 63 61 6e 0a 2a  ull-table scan.*
2e2d0 2a 20 20 20 20 20 63 6f 73 74 20 3d 20 6e 52 6f  *     cost = nRo
2e2e0 77 20 2a 20 4b 20 20 20 20 20 20 20 20 20 20 20  w * K           
2e2f0 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 73 63             // sc
2e300 61 6e 20 6f 66 20 63 6f 76 65 72 69 6e 67 20 69  an of covering i
2e310 6e 64 65 78 0a 2a 2a 20 20 20 20 20 63 6f 73 74  ndex.**     cost
2e320 20 3d 20 6e 52 6f 77 20 2a 20 28 4b 2b 33 2e 30   = nRow * (K+3.0
2e330 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  )               
2e340 20 2f 2f 20 73 63 61 6e 20 6f 66 20 6e 6f 6e 2d   // scan of non-
2e350 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 0a 2a  covering index.*
2e360 2a 0a 2a 2a 20 77 68 65 72 65 20 4b 20 69 73 20  *.** where K is 
2e370 61 20 76 61 6c 75 65 20 62 65 74 77 65 65 6e 20  a value between 
2e380 31 2e 31 20 61 6e 64 20 33 2e 30 20 73 65 74 20  1.1 and 3.0 set 
2e390 62 61 73 65 64 20 6f 6e 20 74 68 65 20 72 65 6c  based on the rel
2e3a0 61 74 69 76 65 20 0a 2a 2a 20 65 73 74 69 6d 61  ative .** estima
2e3b0 74 65 64 20 61 76 65 72 61 67 65 20 73 69 7a 65  ted average size
2e3c0 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 61 6e   of the index an
2e3d0 64 20 74 61 62 6c 65 20 72 65 63 6f 72 64 73 2e  d table records.
2e3e0 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 6e 20 69 6e  .**.** For an in
2e3f0 64 65 78 20 73 63 61 6e 2c 20 77 68 65 72 65 20  dex scan, where 
2e400 6e 56 69 73 69 74 20 69 73 20 74 68 65 20 6e 75  nVisit is the nu
2e410 6d 62 65 72 20 6f 66 20 69 6e 64 65 78 20 72 6f  mber of index ro
2e420 77 73 20 76 69 73 69 74 65 64 0a 2a 2a 20 62 79  ws visited.** by
2e430 20 74 68 65 20 73 63 61 6e 2c 20 61 6e 64 20 6e   the scan, and n
2e440 53 65 65 6b 20 69 73 20 74 68 65 20 6e 75 6d 62  Seek is the numb
2e450 65 72 20 6f 66 20 73 65 65 6b 20 6f 70 65 72 61  er of seek opera
2e460 74 69 6f 6e 73 20 72 65 71 75 69 72 65 64 20 6f  tions required o
2e470 6e 20 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78 20  n .** the index 
2e480 62 2d 74 72 65 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  b-tree:.**.**   
2e490 20 20 63 6f 73 74 20 3d 20 6e 53 65 65 6b 20 2a    cost = nSeek *
2e4a0 20 28 6c 6f 67 28 6e 52 6f 77 29 20 2b 20 4b 20   (log(nRow) + K 
2e4b0 2a 20 6e 56 69 73 69 74 29 20 20 20 20 20 20 20  * nVisit)       
2e4c0 20 20 20 2f 2f 20 63 6f 76 65 72 69 6e 67 20 69     // covering i
2e4d0 6e 64 65 78 0a 2a 2a 20 20 20 20 20 63 6f 73 74  ndex.**     cost
2e4e0 20 3d 20 6e 53 65 65 6b 20 2a 20 28 6c 6f 67 28   = nSeek * (log(
2e4f0 6e 52 6f 77 29 20 2b 20 28 4b 2b 33 2e 30 29 20  nRow) + (K+3.0) 
2e500 2a 20 6e 56 69 73 69 74 29 20 20 20 20 2f 2f 20  * nVisit)    // 
2e510 6e 6f 6e 2d 63 6f 76 65 72 69 6e 67 20 69 6e 64  non-covering ind
2e520 65 78 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c  ex.**.** Normall
2e530 79 2c 20 6e 53 65 65 6b 20 69 73 20 31 2e 20 6e  y, nSeek is 1. n
2e540 53 65 65 6b 20 76 61 6c 75 65 73 20 67 72 65 61  Seek values grea
2e550 74 65 72 20 74 68 61 6e 20 31 20 63 6f 6d 65 20  ter than 1 come 
2e560 61 62 6f 75 74 20 69 66 20 74 68 65 20 0a 2a 2a  about if the .**
2e570 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e   WHERE clause in
2e580 63 6c 75 64 65 73 20 22 78 20 49 4e 20 28 2e 2e  cludes "x IN (..
2e590 2e 2e 29 22 20 74 65 72 6d 73 20 75 73 65 64 20  ..)" terms used 
2e5a0 69 6e 20 70 6c 61 63 65 20 6f 66 20 22 78 3d 3f  in place of "x=?
2e5b0 22 2e 20 4f 72 20 77 68 65 6e 20 0a 2a 2a 20 69  ". Or when .** i
2e5c0 6d 70 6c 69 63 69 74 20 22 78 20 49 4e 20 28 53  mplicit "x IN (S
2e5d0 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 62 6c  ELECT x FROM tbl
2e5e0 29 22 20 74 65 72 6d 73 20 61 72 65 20 61 64 64  )" terms are add
2e5f0 65 64 20 66 6f 72 20 73 6b 69 70 2d 73 63 61 6e  ed for skip-scan
2e600 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 73 74  s..**.** The est
2e610 69 6d 61 74 65 64 20 76 61 6c 75 65 73 20 28 6e  imated values (n
2e620 52 6f 77 2c 20 6e 56 69 73 69 74 2c 20 6e 53 65  Row, nVisit, nSe
2e630 65 6b 29 20 6f 66 74 65 6e 20 63 6f 6e 74 61 69  ek) often contai
2e640 6e 20 61 20 6c 61 72 67 65 20 61 6d 6f 75 6e 74  n a large amount
2e650 0a 2a 2a 20 6f 66 20 75 6e 63 65 72 74 61 69 6e  .** of uncertain
2e660 74 79 2e 20 20 46 6f 72 20 74 68 69 73 20 72 65  ty.  For this re
2e670 61 73 6f 6e 2c 20 73 63 6f 72 69 6e 67 20 69 73  ason, scoring is
2e680 20 64 65 73 69 67 6e 65 64 20 74 6f 20 70 69 63   designed to pic
2e690 6b 20 70 6c 61 6e 73 20 74 68 61 74 0a 2a 2a 20  k plans that.** 
2e6a0 22 64 6f 20 74 68 65 20 6c 65 61 73 74 20 68 61  "do the least ha
2e6b0 72 6d 22 20 69 66 20 74 68 65 20 65 73 74 69 6d  rm" if the estim
2e6c0 61 74 65 73 20 61 72 65 20 69 6e 61 63 63 75 72  ates are inaccur
2e6d0 61 74 65 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c  ate.  For exampl
2e6e0 65 2c 20 61 0a 2a 2a 20 6c 6f 67 28 6e 52 6f 77  e, a.** log(nRow
2e6f0 29 20 66 61 63 74 6f 72 20 69 73 20 6f 6d 69 74  ) factor is omit
2e700 74 65 64 20 66 72 6f 6d 20 61 20 6e 6f 6e 2d 63  ted from a non-c
2e710 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20 73 63  overing index sc
2e720 61 6e 20 69 6e 20 6f 72 64 65 72 20 74 6f 0a 2a  an in order to.*
2e730 2a 20 62 69 61 73 20 74 68 65 20 73 63 6f 72 69  * bias the scori
2e740 6e 67 20 69 6e 20 66 61 76 6f 72 20 6f 66 20 75  ng in favor of u
2e750 73 69 6e 67 20 61 6e 20 69 6e 64 65 78 2c 20 73  sing an index, s
2e760 69 6e 63 65 20 74 68 65 20 77 6f 72 73 74 2d 63  ince the worst-c
2e770 61 73 65 0a 2a 2a 20 70 65 72 66 6f 72 6d 61 6e  ase.** performan
2e780 63 65 20 6f 66 20 75 73 69 6e 67 20 61 6e 20 69  ce of using an i
2e790 6e 64 65 78 20 69 73 20 66 61 72 20 62 65 74 74  ndex is far bett
2e7a0 65 72 20 74 68 61 6e 20 74 68 65 20 77 6f 72 73  er than the wors
2e7b0 74 2d 63 61 73 65 20 70 65 72 66 6f 72 6d 61 6e  t-case performan
2e7c0 63 65 0a 2a 2a 20 6f 66 20 61 20 66 75 6c 6c 20  ce.** of a full 
2e7d0 74 61 62 6c 65 20 73 63 61 6e 2e 0a 2a 2f 0a 73  table scan..*/.s
2e7e0 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c  tatic int whereL
2e7f0 6f 6f 70 41 64 64 42 74 72 65 65 28 0a 20 20 57  oopAddBtree(.  W
2e800 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20  hereLoopBuilder 
2e810 2a 70 42 75 69 6c 64 65 72 2c 20 2f 2a 20 57 48  *pBuilder, /* WH
2e820 45 52 45 20 63 6c 61 75 73 65 20 69 6e 66 6f 72  ERE clause infor
2e830 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 42 69 74 6d  mation */.  Bitm
2e840 61 73 6b 20 6d 45 78 74 72 61 20 20 20 20 20 20  ask mExtra      
2e850 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61          /* Extra
2e860 20 70 72 65 72 65 71 75 65 73 69 74 65 73 20 66   prerequesites f
2e870 6f 72 20 75 73 69 6e 67 20 74 68 69 73 20 74 61  or using this ta
2e880 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72  ble */.){.  Wher
2e890 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20  eInfo *pWInfo;  
2e8a0 20 20 20 20 20 20 20 20 2f 2a 20 57 48 45 52 45          /* WHERE
2e8b0 20 61 6e 61 6c 79 73 69 73 20 63 6f 6e 74 65 78   analysis contex
2e8c0 74 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 50  t */.  Index *pP
2e8d0 72 6f 62 65 3b 20 20 20 20 20 20 20 20 20 20 20  robe;           
2e8e0 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 77     /* An index w
2e8f0 65 20 61 72 65 20 65 76 61 6c 75 61 74 69 6e 67  e are evaluating
2e900 20 2a 2f 0a 20 20 49 6e 64 65 78 20 73 50 6b 3b   */.  Index sPk;
2e910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e920 20 20 2f 2a 20 41 20 66 61 6b 65 20 69 6e 64 65    /* A fake inde
2e930 78 20 6f 62 6a 65 63 74 20 66 6f 72 20 74 68 65  x object for the
2e940 20 70 72 69 6d 61 72 79 20 6b 65 79 20 2a 2f 0a   primary key */.
2e950 20 20 4c 6f 67 45 73 74 20 61 69 52 6f 77 45 73    LogEst aiRowEs
2e960 74 50 6b 5b 32 5d 3b 20 20 20 20 20 20 20 2f 2a  tPk[2];       /*
2e970 20 54 68 65 20 61 69 52 6f 77 4c 6f 67 45 73 74   The aiRowLogEst
2e980 5b 5d 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  [] value for the
2e990 20 73 50 6b 20 69 6e 64 65 78 20 2a 2f 0a 20 20   sPk index */.  
2e9a0 69 31 36 20 61 69 43 6f 6c 75 6d 6e 50 6b 20 3d  i16 aiColumnPk =
2e9b0 20 2d 31 3b 20 20 20 20 20 20 20 20 2f 2a 20 54   -1;        /* T
2e9c0 68 65 20 61 43 6f 6c 75 6d 6e 5b 5d 20 76 61 6c  he aColumn[] val
2e9d0 75 65 20 66 6f 72 20 74 68 65 20 73 50 6b 20 69  ue for the sPk i
2e9e0 6e 64 65 78 20 2a 2f 0a 20 20 53 72 63 4c 69 73  ndex */.  SrcLis
2e9f0 74 20 2a 70 54 61 62 4c 69 73 74 3b 20 20 20 20  t *pTabList;    
2ea00 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f        /* The FRO
2ea10 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74  M clause */.  st
2ea20 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
2ea30 6d 20 2a 70 53 72 63 3b 20 20 2f 2a 20 54 68 65  m *pSrc;  /* The
2ea40 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 62 74 72   FROM clause btr
2ea50 65 65 20 74 65 72 6d 20 74 6f 20 61 64 64 20 2a  ee term to add *
2ea60 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  /.  WhereLoop *p
2ea70 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20  New;            
2ea80 2f 2a 20 54 65 6d 70 6c 61 74 65 20 57 68 65 72  /* Template Wher
2ea90 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 2a 2f 0a  eLoop object */.
2eaa0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
2eab0 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 2f 2a  E_OK;         /*
2eac0 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
2ead0 20 20 69 6e 74 20 69 53 6f 72 74 49 64 78 20 3d    int iSortIdx =
2eae0 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   1;           /*
2eaf0 20 49 6e 64 65 78 20 6e 75 6d 62 65 72 20 2a 2f   Index number */
2eb00 0a 20 20 69 6e 74 20 62 3b 20 20 20 20 20 20 20  .  int b;       
2eb10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2eb20 2a 20 41 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75  * A boolean valu
2eb30 65 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 72 53  e */.  LogEst rS
2eb40 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
2eb50 20 20 20 2f 2a 20 6e 75 6d 62 65 72 20 6f 66 20     /* number of 
2eb60 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c  rows in the tabl
2eb70 65 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 72 4c  e */.  LogEst rL
2eb80 6f 67 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  ogSize;         
2eb90 20 20 20 2f 2a 20 4c 6f 67 61 72 69 74 68 6d 20     /* Logarithm 
2eba0 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  of the number of
2ebb0 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62   rows in the tab
2ebc0 6c 65 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61  le */.  WhereCla
2ebd0 75 73 65 20 2a 70 57 43 3b 20 20 20 20 20 20 20  use *pWC;       
2ebe0 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65      /* The parse
2ebf0 64 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  d WHERE clause *
2ec00 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  /.  Table *pTab;
2ec10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ec20 2f 2a 20 54 61 62 6c 65 20 62 65 69 6e 67 20 71  /* Table being q
2ec30 75 65 72 69 65 64 20 2a 2f 0a 20 20 0a 20 20 70  ueried */.  .  p
2ec40 4e 65 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  New = pBuilder->
2ec50 70 4e 65 77 3b 0a 20 20 70 57 49 6e 66 6f 20 3d  pNew;.  pWInfo =
2ec60 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66   pBuilder->pWInf
2ec70 6f 3b 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20  o;.  pTabList = 
2ec80 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
2ec90 3b 0a 20 20 70 53 72 63 20 3d 20 70 54 61 62 4c  ;.  pSrc = pTabL
2eca0 69 73 74 2d 3e 61 20 2b 20 70 4e 65 77 2d 3e 69  ist->a + pNew->i
2ecb0 54 61 62 3b 0a 20 20 70 54 61 62 20 3d 20 70 53  Tab;.  pTab = pS
2ecc0 72 63 2d 3e 70 54 61 62 3b 0a 20 20 70 57 43 20  rc->pTab;.  pWC 
2ecd0 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 3b  = pBuilder->pWC;
2ece0 0a 20 20 61 73 73 65 72 74 28 20 21 49 73 56 69  .  assert( !IsVi
2ecf0 72 74 75 61 6c 28 70 53 72 63 2d 3e 70 54 61 62  rtual(pSrc->pTab
2ed00 29 20 29 3b 0a 0a 20 20 69 66 28 20 70 53 72 63  ) );..  if( pSrc
2ed10 2d 3e 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20  ->pIndex ){.    
2ed20 2f 2a 20 41 6e 20 49 4e 44 45 58 45 44 20 42 59  /* An INDEXED BY
2ed30 20 63 6c 61 75 73 65 20 73 70 65 63 69 66 69 65   clause specifie
2ed40 73 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 69  s a particular i
2ed50 6e 64 65 78 20 74 6f 20 75 73 65 20 2a 2f 0a 20  ndex to use */. 
2ed60 20 20 20 70 50 72 6f 62 65 20 3d 20 70 53 72 63     pProbe = pSrc
2ed70 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 7d 65 6c 73  ->pIndex;.  }els
2ed80 65 20 69 66 28 20 21 48 61 73 52 6f 77 69 64 28  e if( !HasRowid(
2ed90 70 54 61 62 29 20 29 7b 0a 20 20 20 20 70 50 72  pTab) ){.    pPr
2eda0 6f 62 65 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64  obe = pTab->pInd
2edb0 65 78 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ex;.  }else{.   
2edc0 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 20   /* There is no 
2edd0 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73  INDEXED BY claus
2ede0 65 2e 20 20 43 72 65 61 74 65 20 61 20 66 61 6b  e.  Create a fak
2edf0 65 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 69  e Index object i
2ee00 6e 20 6c 6f 63 61 6c 0a 20 20 20 20 2a 2a 20 76  n local.    ** v
2ee10 61 72 69 61 62 6c 65 20 73 50 6b 20 74 6f 20 72  ariable sPk to r
2ee20 65 70 72 65 73 65 6e 74 20 74 68 65 20 72 6f 77  epresent the row
2ee30 69 64 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69  id primary key i
2ee40 6e 64 65 78 2e 20 20 4d 61 6b 65 20 74 68 69 73  ndex.  Make this
2ee50 0a 20 20 20 20 2a 2a 20 66 61 6b 65 20 69 6e 64  .    ** fake ind
2ee60 65 78 20 74 68 65 20 66 69 72 73 74 20 69 6e 20  ex the first in 
2ee70 61 20 63 68 61 69 6e 20 6f 66 20 49 6e 64 65 78  a chain of Index
2ee80 20 6f 62 6a 65 63 74 73 20 77 69 74 68 20 61 6c   objects with al
2ee90 6c 20 6f 66 20 74 68 65 20 72 65 61 6c 0a 20 20  l of the real.  
2eea0 20 20 2a 2a 20 69 6e 64 69 63 65 73 20 74 6f 20    ** indices to 
2eeb0 66 6f 6c 6c 6f 77 20 2a 2f 0a 20 20 20 20 49 6e  follow */.    In
2eec0 64 65 78 20 2a 70 46 69 72 73 74 3b 20 20 20 20  dex *pFirst;    
2eed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2eee0 20 46 69 72 73 74 20 6f 66 20 72 65 61 6c 20 69   First of real i
2eef0 6e 64 69 63 65 73 20 6f 6e 20 74 68 65 20 74 61  ndices on the ta
2ef00 62 6c 65 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65  ble */.    memse
2ef10 74 28 26 73 50 6b 2c 20 30 2c 20 73 69 7a 65 6f  t(&sPk, 0, sizeo
2ef20 66 28 49 6e 64 65 78 29 29 3b 0a 20 20 20 20 73  f(Index));.    s
2ef30 50 6b 2e 6e 4b 65 79 43 6f 6c 20 3d 20 31 3b 0a  Pk.nKeyCol = 1;.
2ef40 20 20 20 20 73 50 6b 2e 6e 43 6f 6c 75 6d 6e 20      sPk.nColumn 
2ef50 3d 20 31 3b 0a 20 20 20 20 73 50 6b 2e 61 69 43  = 1;.    sPk.aiC
2ef60 6f 6c 75 6d 6e 20 3d 20 26 61 69 43 6f 6c 75 6d  olumn = &aiColum
2ef70 6e 50 6b 3b 0a 20 20 20 20 73 50 6b 2e 61 69 52  nPk;.    sPk.aiR
2ef80 6f 77 4c 6f 67 45 73 74 20 3d 20 61 69 52 6f 77  owLogEst = aiRow
2ef90 45 73 74 50 6b 3b 0a 20 20 20 20 73 50 6b 2e 6f  EstPk;.    sPk.o
2efa0 6e 45 72 72 6f 72 20 3d 20 4f 45 5f 52 65 70 6c  nError = OE_Repl
2efb0 61 63 65 3b 0a 20 20 20 20 73 50 6b 2e 70 54 61  ace;.    sPk.pTa
2efc0 62 6c 65 20 3d 20 70 54 61 62 3b 0a 20 20 20 20  ble = pTab;.    
2efd0 73 50 6b 2e 73 7a 49 64 78 52 6f 77 20 3d 20 70  sPk.szIdxRow = p
2efe0 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 3b 0a 20  Tab->szTabRow;. 
2eff0 20 20 20 61 69 52 6f 77 45 73 74 50 6b 5b 30 5d     aiRowEstPk[0]
2f000 20 3d 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67   = pTab->nRowLog
2f010 45 73 74 3b 0a 20 20 20 20 61 69 52 6f 77 45 73  Est;.    aiRowEs
2f020 74 50 6b 5b 31 5d 20 3d 20 30 3b 0a 20 20 20 20  tPk[1] = 0;.    
2f030 70 46 69 72 73 74 20 3d 20 70 53 72 63 2d 3e 70  pFirst = pSrc->p
2f040 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20  Tab->pIndex;.   
2f050 20 69 66 28 20 70 53 72 63 2d 3e 6e 6f 74 49 6e   if( pSrc->notIn
2f060 64 65 78 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20  dexed==0 ){.    
2f070 20 20 2f 2a 20 54 68 65 20 72 65 61 6c 20 69 6e    /* The real in
2f080 64 69 63 65 73 20 6f 66 20 74 68 65 20 74 61 62  dices of the tab
2f090 6c 65 20 61 72 65 20 6f 6e 6c 79 20 63 6f 6e 73  le are only cons
2f0a0 69 64 65 72 65 64 20 69 66 20 74 68 65 0a 20 20  idered if the.  
2f0b0 20 20 20 20 2a 2a 20 4e 4f 54 20 49 4e 44 45 58      ** NOT INDEX
2f0c0 45 44 20 71 75 61 6c 69 66 69 65 72 20 69 73 20  ED qualifier is 
2f0d0 6f 6d 69 74 74 65 64 20 66 72 6f 6d 20 74 68 65  omitted from the
2f0e0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a   FROM clause */.
2f0f0 20 20 20 20 20 20 73 50 6b 2e 70 4e 65 78 74 20        sPk.pNext 
2f100 3d 20 70 46 69 72 73 74 3b 0a 20 20 20 20 7d 0a  = pFirst;.    }.
2f110 20 20 20 20 70 50 72 6f 62 65 20 3d 20 26 73 50      pProbe = &sP
2f120 6b 3b 0a 20 20 7d 0a 20 20 72 53 69 7a 65 20 3d  k;.  }.  rSize =
2f130 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73   pTab->nRowLogEs
2f140 74 3b 0a 20 20 72 4c 6f 67 53 69 7a 65 20 3d 20  t;.  rLogSize = 
2f150 65 73 74 4c 6f 67 28 72 53 69 7a 65 29 3b 0a 0a  estLog(rSize);..
2f160 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2f170 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e  MIT_AUTOMATIC_IN
2f180 44 45 58 0a 20 20 2f 2a 20 41 75 74 6f 6d 61 74  DEX.  /* Automat
2f190 69 63 20 69 6e 64 65 78 65 73 20 2a 2f 0a 20 20  ic indexes */.  
2f1a0 69 66 28 20 21 70 42 75 69 6c 64 65 72 2d 3e 70  if( !pBuilder->p
2f1b0 4f 72 53 65 74 0a 20 20 20 26 26 20 28 70 57 49  OrSet.   && (pWI
2f1c0 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
2f1d0 26 20 57 48 45 52 45 5f 4e 4f 5f 41 55 54 4f 49  & WHERE_NO_AUTOI
2f1e0 4e 44 45 58 29 3d 3d 30 0a 20 20 20 26 26 20 28  NDEX)==0.   && (
2f1f0 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e  pWInfo->pParse->
2f200 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
2f210 54 45 5f 41 75 74 6f 49 6e 64 65 78 29 21 3d 30  TE_AutoIndex)!=0
2f220 0a 20 20 20 26 26 20 70 53 72 63 2d 3e 70 49 6e  .   && pSrc->pIn
2f230 64 65 78 3d 3d 30 0a 20 20 20 26 26 20 21 70 53  dex==0.   && !pS
2f240 72 63 2d 3e 76 69 61 43 6f 72 6f 75 74 69 6e 65  rc->viaCoroutine
2f250 0a 20 20 20 26 26 20 21 70 53 72 63 2d 3e 6e 6f  .   && !pSrc->no
2f260 74 49 6e 64 65 78 65 64 0a 20 20 20 26 26 20 48  tIndexed.   && H
2f270 61 73 52 6f 77 69 64 28 70 54 61 62 29 0a 20 20  asRowid(pTab).  
2f280 20 26 26 20 21 70 53 72 63 2d 3e 69 73 43 6f 72   && !pSrc->isCor
2f290 72 65 6c 61 74 65 64 0a 20 20 20 26 26 20 21 70  related.   && !p
2f2a0 53 72 63 2d 3e 69 73 52 65 63 75 72 73 69 76 65  Src->isRecursive
2f2b0 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20 47 65 6e  .  ){.    /* Gen
2f2c0 65 72 61 74 65 20 61 75 74 6f 2d 69 6e 64 65 78  erate auto-index
2f2d0 20 57 68 65 72 65 4c 6f 6f 70 73 20 2a 2f 0a 20   WhereLoops */. 
2f2e0 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54     WhereTerm *pT
2f2f0 65 72 6d 3b 0a 20 20 20 20 57 68 65 72 65 54 65  erm;.    WhereTe
2f300 72 6d 20 2a 70 57 43 45 6e 64 20 3d 20 70 57 43  rm *pWCEnd = pWC
2f310 2d 3e 61 20 2b 20 70 57 43 2d 3e 6e 54 65 72 6d  ->a + pWC->nTerm
2f320 3b 0a 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d  ;.    for(pTerm=
2f330 70 57 43 2d 3e 61 3b 20 72 63 3d 3d 53 51 4c 49  pWC->a; rc==SQLI
2f340 54 45 5f 4f 4b 20 26 26 20 70 54 65 72 6d 3c 70  TE_OK && pTerm<p
2f350 57 43 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b  WCEnd; pTerm++){
2f360 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d  .      if( pTerm
2f370 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20  ->prereqRight & 
2f380 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 20 29  pNew->maskSelf )
2f390 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
2f3a0 20 69 66 28 20 74 65 72 6d 43 61 6e 44 72 69 76   if( termCanDriv
2f3b0 65 49 6e 64 65 78 28 70 54 65 72 6d 2c 20 70 53  eIndex(pTerm, pS
2f3c0 72 63 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20  rc, 0) ){.      
2f3d0 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e    pNew->u.btree.
2f3e0 6e 45 71 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  nEq = 1;.       
2f3f0 20 70 4e 65 77 2d 3e 6e 53 6b 69 70 20 3d 20 30   pNew->nSkip = 0
2f400 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
2f410 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d  u.btree.pIndex =
2f420 20 30 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77   0;.        pNew
2f430 2d 3e 6e 4c 54 65 72 6d 20 3d 20 31 3b 0a 20 20  ->nLTerm = 1;.  
2f440 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65        pNew->aLTe
2f450 72 6d 5b 30 5d 20 3d 20 70 54 65 72 6d 3b 0a 20  rm[0] = pTerm;. 
2f460 20 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47         /* TUNING
2f470 3a 20 4f 6e 65 2d 74 69 6d 65 20 63 6f 73 74 20  : One-time cost 
2f480 66 6f 72 20 63 6f 6d 70 75 74 69 6e 67 20 74 68  for computing th
2f490 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65  e automatic inde
2f4a0 78 20 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  x is.        ** 
2f4b0 65 73 74 69 6d 61 74 65 64 20 74 6f 20 62 65 20  estimated to be 
2f4c0 58 2a 4e 2a 6c 6f 67 32 28 4e 29 20 77 68 65 72  X*N*log2(N) wher
2f4d0 65 20 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65  e N is the numbe
2f4e0 72 20 6f 66 20 72 6f 77 73 20 69 6e 0a 20 20 20  r of rows in.   
2f4f0 20 20 20 20 20 2a 2a 20 74 68 65 20 74 61 62 6c       ** the tabl
2f500 65 20 62 65 69 6e 67 20 69 6e 64 65 78 65 64 20  e being indexed 
2f510 61 6e 64 20 77 68 65 72 65 20 58 20 69 73 20 37  and where X is 7
2f520 20 28 4c 6f 67 45 73 74 3d 32 38 29 20 66 6f 72   (LogEst=28) for
2f530 20 6e 6f 72 6d 61 6c 0a 20 20 20 20 20 20 20 20   normal.        
2f540 2a 2a 20 74 61 62 6c 65 73 20 6f 72 20 31 2e 33  ** tables or 1.3
2f550 37 35 20 28 4c 6f 67 45 73 74 3d 34 29 20 66 6f  75 (LogEst=4) fo
2f560 72 20 76 69 65 77 73 20 61 6e 64 20 73 75 62 71  r views and subq
2f570 75 65 72 69 65 73 2e 20 20 54 68 65 20 76 61 6c  ueries.  The val
2f580 75 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66  ue.        ** of
2f590 20 58 20 69 73 20 73 6d 61 6c 6c 65 72 20 66 6f   X is smaller fo
2f5a0 72 20 76 69 65 77 73 20 61 6e 64 20 73 75 62 71  r views and subq
2f5b0 75 65 72 69 65 73 20 73 6f 20 74 68 61 74 20 74  ueries so that t
2f5c0 68 65 20 71 75 65 72 79 20 70 6c 61 6e 6e 65 72  he query planner
2f5d0 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c  .        ** will
2f5e0 20 62 65 20 6d 6f 72 65 20 61 67 67 72 65 73 73   be more aggress
2f5f0 69 76 65 20 61 62 6f 75 74 20 67 65 6e 65 72 61  ive about genera
2f600 74 69 6e 67 20 61 75 74 6f 6d 61 74 69 63 20 69  ting automatic i
2f610 6e 64 65 78 65 73 20 66 6f 72 0a 20 20 20 20 20  ndexes for.     
2f620 20 20 20 2a 2a 20 74 68 6f 73 65 20 6f 62 6a 65     ** those obje
2f630 63 74 73 2c 20 73 69 6e 63 65 20 74 68 65 72 65  cts, since there
2f640 20 69 73 20 6e 6f 20 6f 70 70 6f 72 74 75 6e 69   is no opportuni
2f650 74 79 20 74 6f 20 61 64 64 20 73 63 68 65 6d 61  ty to add schema
2f660 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 64 65  .        ** inde
2f670 78 65 73 20 6f 6e 20 73 75 62 71 75 65 72 69 65  xes on subquerie
2f680 73 20 61 6e 64 20 76 69 65 77 73 2e 20 2a 2f 0a  s and views. */.
2f690 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 53          pNew->rS
2f6a0 65 74 75 70 20 3d 20 72 4c 6f 67 53 69 7a 65 20  etup = rLogSize 
2f6b0 2b 20 72 53 69 7a 65 20 2b 20 34 3b 0a 20 20 20  + rSize + 4;.   
2f6c0 20 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 70       if( pTab->p
2f6d0 53 65 6c 65 63 74 3d 3d 30 20 26 26 20 28 70 54  Select==0 && (pT
2f6e0 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54  ab->tabFlags & T
2f6f0 46 5f 45 70 68 65 6d 65 72 61 6c 29 3d 3d 30 20  F_Ephemeral)==0 
2f700 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65  ){.          pNe
2f710 77 2d 3e 72 53 65 74 75 70 20 2b 3d 20 32 34 3b  w->rSetup += 24;
2f720 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2f730 20 20 20 41 70 70 6c 79 43 6f 73 74 4d 75 6c 74     ApplyCostMult
2f740 69 70 6c 69 65 72 28 70 4e 65 77 2d 3e 72 53 65  iplier(pNew->rSe
2f750 74 75 70 2c 20 70 54 61 62 2d 3e 63 6f 73 74 4d  tup, pTab->costM
2f760 75 6c 74 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a  ult);.        /*
2f770 20 54 55 4e 49 4e 47 3a 20 45 61 63 68 20 69 6e   TUNING: Each in
2f780 64 65 78 20 6c 6f 6f 6b 75 70 20 79 69 65 6c 64  dex lookup yield
2f790 73 20 32 30 20 72 6f 77 73 20 69 6e 20 74 68 65  s 20 rows in the
2f7a0 20 74 61 62 6c 65 2e 20 20 54 68 69 73 0a 20 20   table.  This.  
2f7b0 20 20 20 20 20 20 2a 2a 20 69 73 20 6d 6f 72 65        ** is more
2f7c0 20 74 68 61 6e 20 74 68 65 20 75 73 75 61 6c 20   than the usual 
2f7d0 67 75 65 73 73 20 6f 66 20 31 30 20 72 6f 77 73  guess of 10 rows
2f7e0 2c 20 73 69 6e 63 65 20 77 65 20 68 61 76 65 20  , since we have 
2f7f0 6e 6f 20 77 61 79 0a 20 20 20 20 20 20 20 20 2a  no way.        *
2f800 2a 20 6f 66 20 6b 6e 6f 77 69 6e 67 20 68 6f 77  * of knowing how
2f810 20 73 65 6c 65 63 74 69 76 65 20 74 68 65 20 69   selective the i
2f820 6e 64 65 78 20 77 69 6c 6c 20 75 6c 74 69 6d 61  ndex will ultima
2f830 74 65 6c 79 20 62 65 2e 20 20 49 74 20 77 6f 75  tely be.  It wou
2f840 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f  ld.        ** no
2f850 74 20 62 65 20 75 6e 72 65 61 73 6f 6e 61 62 6c  t be unreasonabl
2f860 65 20 74 6f 20 6d 61 6b 65 20 74 68 69 73 20 76  e to make this v
2f870 61 6c 75 65 20 6d 75 63 68 20 6c 61 72 67 65 72  alue much larger
2f880 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65  . */.        pNe
2f890 77 2d 3e 6e 4f 75 74 20 3d 20 34 33 3b 20 20 61  w->nOut = 43;  a
2f8a0 73 73 65 72 74 28 20 34 33 3d 3d 73 71 6c 69 74  ssert( 43==sqlit
2f8b0 65 33 4c 6f 67 45 73 74 28 32 30 29 20 29 3b 0a  e3LogEst(20) );.
2f8c0 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52          pNew->rR
2f8d0 75 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  un = sqlite3LogE
2f8e0 73 74 41 64 64 28 72 4c 6f 67 53 69 7a 65 2c 70  stAdd(rLogSize,p
2f8f0 4e 65 77 2d 3e 6e 4f 75 74 29 3b 0a 20 20 20 20  New->nOut);.    
2f900 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67      pNew->wsFlag
2f910 73 20 3d 20 57 48 45 52 45 5f 41 55 54 4f 5f 49  s = WHERE_AUTO_I
2f920 4e 44 45 58 3b 0a 20 20 20 20 20 20 20 20 70 4e  NDEX;.        pN
2f930 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 6d 45 78  ew->prereq = mEx
2f940 74 72 61 20 7c 20 70 54 65 72 6d 2d 3e 70 72 65  tra | pTerm->pre
2f950 72 65 71 52 69 67 68 74 3b 0a 20 20 20 20 20 20  reqRight;.      
2f960 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70    rc = whereLoop
2f970 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c  Insert(pBuilder,
2f980 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 7d 0a   pNew);.      }.
2f990 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
2f9a0 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
2f9b0 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 20  AUTOMATIC_INDEX 
2f9c0 2a 2f 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20 6f 76  */..  /* Loop ov
2f9d0 65 72 20 61 6c 6c 20 69 6e 64 69 63 65 73 0a 20  er all indices. 
2f9e0 20 2a 2f 0a 20 20 66 6f 72 28 3b 20 72 63 3d 3d   */.  for(; rc==
2f9f0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 72  SQLITE_OK && pPr
2fa00 6f 62 65 3b 20 70 50 72 6f 62 65 3d 70 50 72 6f  obe; pProbe=pPro
2fa10 62 65 2d 3e 70 4e 65 78 74 2c 20 69 53 6f 72 74  be->pNext, iSort
2fa20 49 64 78 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  Idx++){.    if( 
2fa30 70 50 72 6f 62 65 2d 3e 70 50 61 72 74 49 64 78  pProbe->pPartIdx
2fa40 57 68 65 72 65 21 3d 30 0a 20 20 20 20 20 26 26  Where!=0.     &&
2fa50 20 21 77 68 65 72 65 55 73 61 62 6c 65 50 61 72   !whereUsablePar
2fa60 74 69 61 6c 49 6e 64 65 78 28 70 53 72 63 2d 3e  tialIndex(pSrc->
2fa70 69 43 75 72 73 6f 72 2c 20 70 57 43 2c 20 70 50  iCursor, pWC, pP
2fa80 72 6f 62 65 2d 3e 70 50 61 72 74 49 64 78 57 68  robe->pPartIdxWh
2fa90 65 72 65 29 20 29 7b 0a 20 20 20 20 20 20 74 65  ere) ){.      te
2faa0 73 74 63 61 73 65 28 20 70 4e 65 77 2d 3e 69 54  stcase( pNew->iT
2fab0 61 62 21 3d 70 53 72 63 2d 3e 69 43 75 72 73 6f  ab!=pSrc->iCurso
2fac0 72 20 29 3b 20 20 2f 2a 20 53 65 65 20 74 69 63  r );  /* See tic
2fad0 6b 65 74 20 5b 39 38 64 39 37 33 62 38 66 35 5d  ket [98d973b8f5]
2fae0 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e   */.      contin
2faf0 75 65 3b 20 20 2f 2a 20 50 61 72 74 69 61 6c 20  ue;  /* Partial 
2fb00 69 6e 64 65 78 20 69 6e 61 70 70 72 6f 70 72 69  index inappropri
2fb10 61 74 65 20 66 6f 72 20 74 68 69 73 20 71 75 65  ate for this que
2fb20 72 79 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20  ry */.    }.    
2fb30 72 53 69 7a 65 20 3d 20 70 50 72 6f 62 65 2d 3e  rSize = pProbe->
2fb40 61 69 52 6f 77 4c 6f 67 45 73 74 5b 30 5d 3b 0a  aiRowLogEst[0];.
2fb50 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65      pNew->u.btre
2fb60 65 2e 6e 45 71 20 3d 20 30 3b 0a 20 20 20 20 70  e.nEq = 0;.    p
2fb70 4e 65 77 2d 3e 6e 53 6b 69 70 20 3d 20 30 3b 0a  New->nSkip = 0;.
2fb80 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d      pNew->nLTerm
2fb90 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e   = 0;.    pNew->
2fba0 69 53 6f 72 74 49 64 78 20 3d 20 30 3b 0a 20 20  iSortIdx = 0;.  
2fbb0 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d    pNew->rSetup =
2fbc0 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 72   0;.    pNew->pr
2fbd0 65 72 65 71 20 3d 20 6d 45 78 74 72 61 3b 0a 20  ereq = mExtra;. 
2fbe0 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20     pNew->nOut = 
2fbf0 72 53 69 7a 65 3b 0a 20 20 20 20 70 4e 65 77 2d  rSize;.    pNew-
2fc00 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20  >u.btree.pIndex 
2fc10 3d 20 70 50 72 6f 62 65 3b 0a 20 20 20 20 62 20  = pProbe;.    b 
2fc20 3d 20 69 6e 64 65 78 4d 69 67 68 74 48 65 6c 70  = indexMightHelp
2fc30 57 69 74 68 4f 72 64 65 72 42 79 28 70 42 75 69  WithOrderBy(pBui
2fc40 6c 64 65 72 2c 20 70 50 72 6f 62 65 2c 20 70 53  lder, pProbe, pS
2fc50 72 63 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20  rc->iCursor);.  
2fc60 20 20 2f 2a 20 54 68 65 20 4f 4e 45 50 41 53 53    /* The ONEPASS
2fc70 5f 44 45 53 49 52 45 44 20 66 6c 61 67 73 20 6e  _DESIRED flags n
2fc80 65 76 65 72 20 6f 63 63 75 72 73 20 74 6f 67 65  ever occurs toge
2fc90 74 68 65 72 20 77 69 74 68 20 4f 52 44 45 52 20  ther with ORDER 
2fca0 42 59 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  BY */.    assert
2fcb0 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  ( (pWInfo->wctrl
2fcc0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e  Flags & WHERE_ON
2fcd0 45 50 41 53 53 5f 44 45 53 49 52 45 44 29 3d 3d  EPASS_DESIRED)==
2fce0 30 20 7c 7c 20 62 3d 3d 30 20 29 3b 0a 20 20 20  0 || b==0 );.   
2fcf0 20 69 66 28 20 70 50 72 6f 62 65 2d 3e 74 6e 75   if( pProbe->tnu
2fd00 6d 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  m<=0 ){.      /*
2fd10 20 49 6e 74 65 67 65 72 20 70 72 69 6d 61 72 79   Integer primary
2fd20 20 6b 65 79 20 69 6e 64 65 78 20 2a 2f 0a 20 20   key index */.  
2fd30 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67      pNew->wsFlag
2fd40 73 20 3d 20 57 48 45 52 45 5f 49 50 4b 3b 0a 0a  s = WHERE_IPK;..
2fd50 20 20 20 20 20 20 2f 2a 20 46 75 6c 6c 20 74 61        /* Full ta
2fd60 62 6c 65 20 73 63 61 6e 20 2a 2f 0a 20 20 20 20  ble scan */.    
2fd70 20 20 70 4e 65 77 2d 3e 69 53 6f 72 74 49 64 78    pNew->iSortIdx
2fd80 20 3d 20 62 20 3f 20 69 53 6f 72 74 49 64 78 20   = b ? iSortIdx 
2fd90 3a 20 30 3b 0a 20 20 20 20 20 20 2f 2a 20 54 55  : 0;.      /* TU
2fda0 4e 49 4e 47 3a 20 43 6f 73 74 20 6f 66 20 66 75  NING: Cost of fu
2fdb0 6c 6c 20 74 61 62 6c 65 20 73 63 61 6e 20 69 73  ll table scan is
2fdc0 20 28 4e 2a 33 2e 30 29 2e 20 2a 2f 0a 20 20 20   (N*3.0). */.   
2fdd0 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20     pNew->rRun = 
2fde0 72 53 69 7a 65 20 2b 20 31 36 3b 0a 20 20 20 20  rSize + 16;.    
2fdf0 20 20 41 70 70 6c 79 43 6f 73 74 4d 75 6c 74 69    ApplyCostMulti
2fe00 70 6c 69 65 72 28 70 4e 65 77 2d 3e 72 52 75 6e  plier(pNew->rRun
2fe10 2c 20 70 54 61 62 2d 3e 63 6f 73 74 4d 75 6c 74  , pTab->costMult
2fe20 29 3b 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f  );.      whereLo
2fe30 6f 70 4f 75 74 70 75 74 41 64 6a 75 73 74 28 70  opOutputAdjust(p
2fe40 57 43 2c 20 70 4e 65 77 2c 20 72 53 69 7a 65 29  WC, pNew, rSize)
2fe50 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68 65  ;.      rc = whe
2fe60 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75  reLoopInsert(pBu
2fe70 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20  ilder, pNew);.  
2fe80 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d      pNew->nOut =
2fe90 20 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 69 66   rSize;.      if
2fea0 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20  ( rc ) break;.  
2feb0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 42    }else{.      B
2fec0 69 74 6d 61 73 6b 20 6d 3b 0a 20 20 20 20 20 20  itmask m;.      
2fed0 69 66 28 20 70 50 72 6f 62 65 2d 3e 69 73 43 6f  if( pProbe->isCo
2fee0 76 65 72 69 6e 67 20 29 7b 0a 20 20 20 20 20 20  vering ){.      
2fef0 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20    pNew->wsFlags 
2ff00 3d 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59  = WHERE_IDX_ONLY
2ff10 20 7c 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44   | WHERE_INDEXED
2ff20 3b 0a 20 20 20 20 20 20 20 20 6d 20 3d 20 30 3b  ;.        m = 0;
2ff30 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
2ff40 20 20 20 20 20 20 6d 20 3d 20 70 53 72 63 2d 3e        m = pSrc->
2ff50 63 6f 6c 55 73 65 64 20 26 20 7e 63 6f 6c 75 6d  colUsed & ~colum
2ff60 6e 73 49 6e 49 6e 64 65 78 28 70 50 72 6f 62 65  nsInIndex(pProbe
2ff70 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  );.        pNew-
2ff80 3e 77 73 46 6c 61 67 73 20 3d 20 28 6d 3d 3d 30  >wsFlags = (m==0
2ff90 29 20 3f 20 28 57 48 45 52 45 5f 49 44 58 5f 4f  ) ? (WHERE_IDX_O
2ffa0 4e 4c 59 7c 57 48 45 52 45 5f 49 4e 44 45 58 45  NLY|WHERE_INDEXE
2ffb0 44 29 20 3a 20 57 48 45 52 45 5f 49 4e 44 45 58  D) : WHERE_INDEX
2ffc0 45 44 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ED;.      }..   
2ffd0 20 20 20 2f 2a 20 46 75 6c 6c 20 73 63 61 6e 20     /* Full scan 
2ffe0 76 69 61 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20  via index */.   
2fff0 20 20 20 69 66 28 20 62 0a 20 20 20 20 20 20 20     if( b.       
30000 7c 7c 20 21 48 61 73 52 6f 77 69 64 28 70 54 61  || !HasRowid(pTa
30010 62 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 20 6d  b).       || ( m
30020 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20  ==0.         && 
30030 70 50 72 6f 62 65 2d 3e 62 55 6e 6f 72 64 65 72  pProbe->bUnorder
30040 65 64 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26  ed==0.         &
30050 26 20 28 70 50 72 6f 62 65 2d 3e 73 7a 49 64 78  & (pProbe->szIdx
30060 52 6f 77 3c 70 54 61 62 2d 3e 73 7a 54 61 62 52  Row<pTab->szTabR
30070 6f 77 29 0a 20 20 20 20 20 20 20 20 20 26 26 20  ow).         && 
30080 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c  (pWInfo->wctrlFl
30090 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50  ags & WHERE_ONEP
300a0 41 53 53 5f 44 45 53 49 52 45 44 29 3d 3d 30 0a  ASS_DESIRED)==0.
300b0 20 20 20 20 20 20 20 20 20 26 26 20 73 71 6c 69           && sqli
300c0 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
300d0 62 55 73 65 43 69 73 0a 20 20 20 20 20 20 20 20  bUseCis.        
300e0 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e   && Optimization
300f0 45 6e 61 62 6c 65 64 28 70 57 49 6e 66 6f 2d 3e  Enabled(pWInfo->
30100 70 50 61 72 73 65 2d 3e 64 62 2c 20 53 51 4c 49  pParse->db, SQLI
30110 54 45 5f 43 6f 76 65 72 49 64 78 53 63 61 6e 29  TE_CoverIdxScan)
30120 0a 20 20 20 20 20 20 20 20 20 20 29 0a 20 20 20  .          ).   
30130 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e     ){.        pN
30140 65 77 2d 3e 69 53 6f 72 74 49 64 78 20 3d 20 62  ew->iSortIdx = b
30150 20 3f 20 69 53 6f 72 74 49 64 78 20 3a 20 30 3b   ? iSortIdx : 0;
30160 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ..        /* The
30170 20 63 6f 73 74 20 6f 66 20 76 69 73 69 74 69 6e   cost of visitin
30180 67 20 74 68 65 20 69 6e 64 65 78 20 72 6f 77 73  g the index rows
30190 20 69 73 20 4e 2a 4b 2c 20 77 68 65 72 65 20 4b   is N*K, where K
301a0 20 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 62   is.        ** b
301b0 65 74 77 65 65 6e 20 31 2e 31 20 61 6e 64 20 33  etween 1.1 and 3
301c0 2e 30 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e  .0, depending on
301d0 20 74 68 65 20 72 65 6c 61 74 69 76 65 20 73 69   the relative si
301e0 7a 65 73 20 6f 66 20 74 68 65 0a 20 20 20 20 20  zes of the.     
301f0 20 20 20 2a 2a 20 69 6e 64 65 78 20 61 6e 64 20     ** index and 
30200 74 61 62 6c 65 20 72 6f 77 73 2e 20 49 66 20 74  table rows. If t
30210 68 69 73 20 69 73 20 61 20 6e 6f 6e 2d 63 6f 76  his is a non-cov
30220 65 72 69 6e 67 20 69 6e 64 65 78 20 73 63 61 6e  ering index scan
30230 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 73  ,.        ** als
30240 6f 20 61 64 64 20 74 68 65 20 63 6f 73 74 20 6f  o add the cost o
30250 66 20 76 69 73 69 74 69 6e 67 20 74 61 62 6c 65  f visiting table
30260 20 72 6f 77 73 20 28 4e 2a 33 2e 30 29 2e 20 20   rows (N*3.0).  
30270 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  */.        pNew-
30280 3e 72 52 75 6e 20 3d 20 72 53 69 7a 65 20 2b 20  >rRun = rSize + 
30290 31 20 2b 20 28 31 35 2a 70 50 72 6f 62 65 2d 3e  1 + (15*pProbe->
302a0 73 7a 49 64 78 52 6f 77 29 2f 70 54 61 62 2d 3e  szIdxRow)/pTab->
302b0 73 7a 54 61 62 52 6f 77 3b 0a 20 20 20 20 20 20  szTabRow;.      
302c0 20 20 69 66 28 20 6d 21 3d 30 20 29 7b 0a 20 20    if( m!=0 ){.  
302d0 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52          pNew->rR
302e0 75 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  un = sqlite3LogE
302f0 73 74 41 64 64 28 70 4e 65 77 2d 3e 72 52 75 6e  stAdd(pNew->rRun
30300 2c 20 72 53 69 7a 65 2b 31 36 29 3b 0a 20 20 20  , rSize+16);.   
30310 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 41       }.        A
30320 70 70 6c 79 43 6f 73 74 4d 75 6c 74 69 70 6c 69  pplyCostMultipli
30330 65 72 28 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 70  er(pNew->rRun, p
30340 54 61 62 2d 3e 63 6f 73 74 4d 75 6c 74 29 3b 0a  Tab->costMult);.
30350 20 20 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f          whereLoo
30360 70 4f 75 74 70 75 74 41 64 6a 75 73 74 28 70 57  pOutputAdjust(pW
30370 43 2c 20 70 4e 65 77 2c 20 72 53 69 7a 65 29 3b  C, pNew, rSize);
30380 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 68  .        rc = wh
30390 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42  ereLoopInsert(pB
303a0 75 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20  uilder, pNew);. 
303b0 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75         pNew->nOu
303c0 74 20 3d 20 72 53 69 7a 65 3b 0a 20 20 20 20 20  t = rSize;.     
303d0 20 20 20 69 66 28 20 72 63 20 29 20 62 72 65 61     if( rc ) brea
303e0 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
303f0 0a 0a 20 20 20 20 72 63 20 3d 20 77 68 65 72 65  ..    rc = where
30400 4c 6f 6f 70 41 64 64 42 74 72 65 65 49 6e 64 65  LoopAddBtreeInde
30410 78 28 70 42 75 69 6c 64 65 72 2c 20 70 53 72 63  x(pBuilder, pSrc
30420 2c 20 70 50 72 6f 62 65 2c 20 30 29 3b 0a 23 69  , pProbe, 0);.#i
30430 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
30440 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54  LE_STAT3_OR_STAT
30450 34 0a 20 20 20 20 73 71 6c 69 74 65 33 53 74 61  4.    sqlite3Sta
30460 74 34 50 72 6f 62 65 46 72 65 65 28 70 42 75 69  t4ProbeFree(pBui
30470 6c 64 65 72 2d 3e 70 52 65 63 29 3b 0a 20 20 20  lder->pRec);.   
30480 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56   pBuilder->nRecV
30490 61 6c 69 64 20 3d 20 30 3b 0a 20 20 20 20 70 42  alid = 0;.    pB
304a0 75 69 6c 64 65 72 2d 3e 70 52 65 63 20 3d 20 30  uilder->pRec = 0
304b0 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  ;.#endif..    /*
304c0 20 49 66 20 74 68 65 72 65 20 77 61 73 20 61 6e   If there was an
304d0 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75   INDEXED BY clau
304e0 73 65 2c 20 74 68 65 6e 20 6f 6e 6c 79 20 74 68  se, then only th
304f0 61 74 20 6f 6e 65 20 69 6e 64 65 78 20 69 73 0a  at one index is.
30500 20 20 20 20 2a 2a 20 63 6f 6e 73 69 64 65 72 65      ** considere
30510 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53  d. */.    if( pS
30520 72 63 2d 3e 70 49 6e 64 65 78 20 29 20 62 72 65  rc->pIndex ) bre
30530 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ak;.  }.  return
30540 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20   rc;.}..#ifndef 
30550 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
30560 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 41  UALTABLE./*.** A
30570 64 64 20 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70  dd all WhereLoop
30580 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 61 20 74   objects for a t
30590 61 62 6c 65 20 6f 66 20 74 68 65 20 6a 6f 69 6e  able of the join
305a0 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 0a 2a   identified by.*
305b0 2a 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77  * pBuilder->pNew
305c0 2d 3e 69 54 61 62 2e 20 20 54 68 61 74 20 74 61  ->iTab.  That ta
305d0 62 6c 65 20 69 73 20 67 75 61 72 61 6e 74 65 65  ble is guarantee
305e0 64 20 74 6f 20 62 65 20 61 20 76 69 72 74 75 61  d to be a virtua
305f0 6c 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74  l table..*/.stat
30600 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70  ic int whereLoop
30610 41 64 64 56 69 72 74 75 61 6c 28 0a 20 20 57 68  AddVirtual(.  Wh
30620 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a  ereLoopBuilder *
30630 70 42 75 69 6c 64 65 72 2c 20 20 2f 2a 20 57 48  pBuilder,  /* WH
30640 45 52 45 20 63 6c 61 75 73 65 20 69 6e 66 6f 72  ERE clause infor
30650 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 42 69 74 6d  mation */.  Bitm
30660 61 73 6b 20 6d 45 78 74 72 61 0a 29 7b 0a 20 20  ask mExtra.){.  
30670 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
30680 6f 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  o;           /* 
30690 57 48 45 52 45 20 61 6e 61 6c 79 73 69 73 20 63  WHERE analysis c
306a0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 50 61 72 73  ontext */.  Pars
306b0 65 20 2a 70 50 61 72 73 65 3b 20 20 20 20 20 20  e *pParse;      
306c0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
306d0 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  parsing context 
306e0 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  */.  WhereClause
306f0 20 2a 70 57 43 3b 20 20 20 20 20 20 20 20 20 20   *pWC;          
30700 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63    /* The WHERE c
30710 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63  lause */.  struc
30720 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
30730 70 53 72 63 3b 20 20 20 2f 2a 20 54 68 65 20 46  pSrc;   /* The F
30740 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20  ROM clause term 
30750 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 54  to search */.  T
30760 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 73 71  able *pTab;.  sq
30770 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 73 71 6c  lite3 *db;.  sql
30780 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
30790 2a 70 49 64 78 49 6e 66 6f 3b 0a 20 20 73 74 72  *pIdxInfo;.  str
307a0 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
307b0 78 5f 63 6f 6e 73 74 72 61 69 6e 74 20 2a 70 49  x_constraint *pI
307c0 64 78 43 6f 6e 73 3b 0a 20 20 73 74 72 75 63 74  dxCons;.  struct
307d0 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63   sqlite3_index_c
307e0 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61 67 65 20  onstraint_usage 
307f0 2a 70 55 73 61 67 65 3b 0a 20 20 57 68 65 72 65  *pUsage;.  Where
30800 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 69  Term *pTerm;.  i
30810 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 69  nt i, j;.  int i
30820 54 65 72 6d 2c 20 6d 78 54 65 72 6d 3b 0a 20 20  Term, mxTerm;.  
30830 69 6e 74 20 6e 43 6f 6e 73 74 72 61 69 6e 74 3b  int nConstraint;
30840 0a 20 20 69 6e 74 20 73 65 65 6e 49 6e 20 3d 20  .  int seenIn = 
30850 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
30860 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 20 49 4e  /* True if an IN
30870 20 6f 70 65 72 61 74 6f 72 20 69 73 20 73 65 65   operator is see
30880 6e 20 2a 2f 0a 20 20 69 6e 74 20 73 65 65 6e 56  n */.  int seenV
30890 61 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ar = 0;         
308a0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61      /* True if a
308b0 20 6e 6f 6e 2d 63 6f 6e 73 74 61 6e 74 20 63 6f   non-constant co
308c0 6e 73 74 72 61 69 6e 74 20 69 73 20 73 65 65 6e  nstraint is seen
308d0 20 2a 2f 0a 20 20 69 6e 74 20 69 50 68 61 73 65   */.  int iPhase
308e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
308f0 20 20 20 2f 2a 20 30 3a 20 63 6f 6e 73 74 20 77     /* 0: const w
30900 2f 6f 20 49 4e 2c 20 31 3a 20 63 6f 6e 73 74 2c  /o IN, 1: const,
30910 20 32 3a 20 6e 6f 20 49 4e 2c 20 20 32 3a 20 49   2: no IN,  2: I
30920 4e 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70  N */.  WhereLoop
30930 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 72 63   *pNew;.  int rc
30940 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
30950 20 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64   pWInfo = pBuild
30960 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 70 50  er->pWInfo;.  pP
30970 61 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  arse = pWInfo->p
30980 50 61 72 73 65 3b 0a 20 20 64 62 20 3d 20 70 50  Parse;.  db = pP
30990 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 57 43 20  arse->db;.  pWC 
309a0 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 3b  = pBuilder->pWC;
309b0 0a 20 20 70 4e 65 77 20 3d 20 70 42 75 69 6c 64  .  pNew = pBuild
309c0 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 70 53 72 63  er->pNew;.  pSrc
309d0 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 70 54 61 62   = &pWInfo->pTab
309e0 4c 69 73 74 2d 3e 61 5b 70 4e 65 77 2d 3e 69 54  List->a[pNew->iT
309f0 61 62 5d 3b 0a 20 20 70 54 61 62 20 3d 20 70 53  ab];.  pTab = pS
30a00 72 63 2d 3e 70 54 61 62 3b 0a 20 20 61 73 73 65  rc->pTab;.  asse
30a10 72 74 28 20 49 73 56 69 72 74 75 61 6c 28 70 54  rt( IsVirtual(pT
30a20 61 62 29 20 29 3b 0a 20 20 70 49 64 78 49 6e 66  ab) );.  pIdxInf
30a30 6f 20 3d 20 61 6c 6c 6f 63 61 74 65 49 6e 64 65  o = allocateInde
30a40 78 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 57  xInfo(pParse, pW
30a50 43 2c 20 70 53 72 63 2c 20 70 42 75 69 6c 64 65  C, pSrc, pBuilde
30a60 72 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20  r->pOrderBy);.  
30a70 69 66 28 20 70 49 64 78 49 6e 66 6f 3d 3d 30 20  if( pIdxInfo==0 
30a80 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
30a90 4e 4f 4d 45 4d 3b 0a 20 20 70 4e 65 77 2d 3e 70  NOMEM;.  pNew->p
30aa0 72 65 72 65 71 20 3d 20 30 3b 0a 20 20 70 4e 65  rereq = 0;.  pNe
30ab0 77 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a 20  w->rSetup = 0;. 
30ac0 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d   pNew->wsFlags =
30ad0 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41   WHERE_VIRTUALTA
30ae0 42 4c 45 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4c 54  BLE;.  pNew->nLT
30af0 65 72 6d 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d  erm = 0;.  pNew-
30b00 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65  >u.vtab.needFree
30b10 20 3d 20 30 3b 0a 20 20 70 55 73 61 67 65 20 3d   = 0;.  pUsage =
30b20 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73   pIdxInfo->aCons
30b30 74 72 61 69 6e 74 55 73 61 67 65 3b 0a 20 20 6e  traintUsage;.  n
30b40 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 70 49 64  Constraint = pId
30b50 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69  xInfo->nConstrai
30b60 6e 74 3b 0a 20 20 69 66 28 20 77 68 65 72 65 4c  nt;.  if( whereL
30b70 6f 6f 70 52 65 73 69 7a 65 28 64 62 2c 20 70 4e  oopResize(db, pN
30b80 65 77 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74 29  ew, nConstraint)
30b90 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
30ba0 62 46 72 65 65 28 64 62 2c 20 70 49 64 78 49 6e  bFree(db, pIdxIn
30bb0 66 6f 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  fo);.    return 
30bc0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
30bd0 7d 0a 0a 20 20 66 6f 72 28 69 50 68 61 73 65 3d  }..  for(iPhase=
30be0 30 3b 20 69 50 68 61 73 65 3c 3d 33 3b 20 69 50  0; iPhase<=3; iP
30bf0 68 61 73 65 2b 2b 29 7b 0a 20 20 20 20 69 66 28  hase++){.    if(
30c00 20 21 73 65 65 6e 49 6e 20 26 26 20 28 69 50 68   !seenIn && (iPh
30c10 61 73 65 26 31 29 21 3d 30 20 29 7b 0a 20 20 20  ase&1)!=0 ){.   
30c20 20 20 20 69 50 68 61 73 65 2b 2b 3b 0a 20 20 20     iPhase++;.   
30c30 20 20 20 69 66 28 20 69 50 68 61 73 65 3e 33 20     if( iPhase>3 
30c40 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20  ) break;.    }. 
30c50 20 20 20 69 66 28 20 21 73 65 65 6e 56 61 72 20     if( !seenVar 
30c60 26 26 20 69 50 68 61 73 65 3e 31 20 29 20 62 72  && iPhase>1 ) br
30c70 65 61 6b 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e  eak;.    pIdxCon
30c80 73 20 3d 20 2a 28 73 74 72 75 63 74 20 73 71 6c  s = *(struct sql
30c90 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
30ca0 72 61 69 6e 74 2a 2a 29 26 70 49 64 78 49 6e 66  raint**)&pIdxInf
30cb0 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 3b 0a  o->aConstraint;.
30cc0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
30cd0 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72  IdxInfo->nConstr
30ce0 61 69 6e 74 3b 20 69 2b 2b 2c 20 70 49 64 78 43  aint; i++, pIdxC
30cf0 6f 6e 73 2b 2b 29 7b 0a 20 20 20 20 20 20 6a 20  ons++){.      j 
30d00 3d 20 70 49 64 78 43 6f 6e 73 2d 3e 69 54 65 72  = pIdxCons->iTer
30d10 6d 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70  mOffset;.      p
30d20 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 6a  Term = &pWC->a[j
30d30 5d 3b 0a 20 20 20 20 20 20 73 77 69 74 63 68 28  ];.      switch(
30d40 20 69 50 68 61 73 65 20 29 7b 0a 20 20 20 20 20   iPhase ){.     
30d50 20 20 20 63 61 73 65 20 30 3a 20 20 20 20 2f 2a     case 0:    /*
30d60 20 43 6f 6e 73 74 61 6e 74 73 20 77 69 74 68 6f   Constants witho
30d70 75 74 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a  ut IN operator *
30d80 2f 0a 20 20 20 20 20 20 20 20 20 20 70 49 64 78  /.          pIdx
30d90 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20 30  Cons->usable = 0
30da0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
30db0 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  (pTerm->eOperato
30dc0 72 20 26 20 57 4f 5f 49 4e 29 21 3d 30 20 29 7b  r & WO_IN)!=0 ){
30dd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65 65  .            see
30de0 6e 49 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  nIn = 1;.       
30df0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
30e00 66 28 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71  f( pTerm->prereq
30e10 52 69 67 68 74 21 3d 30 20 29 7b 0a 20 20 20 20  Right!=0 ){.    
30e20 20 20 20 20 20 20 20 20 73 65 65 6e 56 61 72 20          seenVar 
30e30 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 1;.          }
30e40 65 6c 73 65 20 69 66 28 20 28 70 54 65 72 6d 2d  else if( (pTerm-
30e50 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
30e60 49 4e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  IN)==0 ){.      
30e70 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e        pIdxCons->
30e80 75 73 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20  usable = 1;.    
30e90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
30ea0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
30eb0 20 63 61 73 65 20 31 3a 20 20 20 20 2f 2a 20 43   case 1:    /* C
30ec0 6f 6e 73 74 61 6e 74 73 20 77 69 74 68 20 49 4e  onstants with IN
30ed0 20 6f 70 65 72 61 74 6f 72 73 20 2a 2f 0a 20 20   operators */.  
30ee0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
30ef0 73 65 65 6e 49 6e 20 29 3b 0a 20 20 20 20 20 20  seenIn );.      
30f00 20 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73      pIdxCons->us
30f10 61 62 6c 65 20 3d 20 28 70 54 65 72 6d 2d 3e 70  able = (pTerm->p
30f20 72 65 72 65 71 52 69 67 68 74 3d 3d 30 29 3b 0a  rereqRight==0);.
30f30 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
30f40 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 32 3a  .        case 2:
30f50 20 20 20 20 2f 2a 20 56 61 72 69 61 62 6c 65 73      /* Variables
30f60 20 77 69 74 68 6f 75 74 20 49 4e 20 2a 2f 0a 20   without IN */. 
30f70 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
30f80 20 73 65 65 6e 56 61 72 20 29 3b 0a 20 20 20 20   seenVar );.    
30f90 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e        pIdxCons->
30fa0 75 73 61 62 6c 65 20 3d 20 28 70 54 65 72 6d 2d  usable = (pTerm-
30fb0 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
30fc0 49 4e 29 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20  IN)==0;.        
30fd0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
30fe0 20 64 65 66 61 75 6c 74 3a 20 20 20 2f 2a 20 56   default:   /* V
30ff0 61 72 69 61 62 6c 65 73 20 77 69 74 68 20 49 4e  ariables with IN
31000 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73   */.          as
31010 73 65 72 74 28 20 73 65 65 6e 56 61 72 20 26 26  sert( seenVar &&
31020 20 73 65 65 6e 49 6e 20 29 3b 0a 20 20 20 20 20   seenIn );.     
31030 20 20 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e 75       pIdxCons->u
31040 73 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 20  sable = 1;.     
31050 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
31060 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65    }.    }.    me
31070 6d 73 65 74 28 70 55 73 61 67 65 2c 20 30 2c 20  mset(pUsage, 0, 
31080 73 69 7a 65 6f 66 28 70 55 73 61 67 65 5b 30 5d  sizeof(pUsage[0]
31090 29 2a 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e  )*pIdxInfo->nCon
310a0 73 74 72 61 69 6e 74 29 3b 0a 20 20 20 20 69 66  straint);.    if
310b0 28 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64  ( pIdxInfo->need
310c0 54 6f 46 72 65 65 49 64 78 53 74 72 20 29 20 73  ToFreeIdxStr ) s
310d0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49 64 78  qlite3_free(pIdx
310e0 49 6e 66 6f 2d 3e 69 64 78 53 74 72 29 3b 0a 20  Info->idxStr);. 
310f0 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78     pIdxInfo->idx
31100 53 74 72 20 3d 20 30 3b 0a 20 20 20 20 70 49 64  Str = 0;.    pId
31110 78 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d 20 3d 20  xInfo->idxNum = 
31120 30 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d  0;.    pIdxInfo-
31130 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74  >needToFreeIdxSt
31140 72 20 3d 20 30 3b 0a 20 20 20 20 70 49 64 78 49  r = 0;.    pIdxI
31150 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73  nfo->orderByCons
31160 75 6d 65 64 20 3d 20 30 3b 0a 20 20 20 20 70 49  umed = 0;.    pI
31170 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65  dxInfo->estimate
31180 64 43 6f 73 74 20 3d 20 53 51 4c 49 54 45 5f 42  dCost = SQLITE_B
31190 49 47 5f 44 42 4c 20 2f 20 28 64 6f 75 62 6c 65  IG_DBL / (double
311a0 29 32 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f  )2;.    pIdxInfo
311b0 2d 3e 65 73 74 69 6d 61 74 65 64 52 6f 77 73 20  ->estimatedRows 
311c0 3d 20 32 35 3b 0a 20 20 20 20 72 63 20 3d 20 76  = 25;.    rc = v
311d0 74 61 62 42 65 73 74 49 6e 64 65 78 28 70 50 61  tabBestIndex(pPa
311e0 72 73 65 2c 20 70 54 61 62 2c 20 70 49 64 78 49  rse, pTab, pIdxI
311f0 6e 66 6f 29 3b 0a 20 20 20 20 69 66 28 20 72 63  nfo);.    if( rc
31200 20 29 20 67 6f 74 6f 20 77 68 65 72 65 4c 6f 6f   ) goto whereLoo
31210 70 41 64 64 56 74 61 62 5f 65 78 69 74 3b 0a 20  pAddVtab_exit;. 
31220 20 20 20 70 49 64 78 43 6f 6e 73 20 3d 20 2a 28     pIdxCons = *(
31230 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
31240 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a  ndex_constraint*
31250 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f  *)&pIdxInfo->aCo
31260 6e 73 74 72 61 69 6e 74 3b 0a 20 20 20 20 70 4e  nstraint;.    pN
31270 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 6d 45 78  ew->prereq = mEx
31280 74 72 61 3b 0a 20 20 20 20 6d 78 54 65 72 6d 20  tra;.    mxTerm 
31290 3d 20 2d 31 3b 0a 20 20 20 20 61 73 73 65 72 74  = -1;.    assert
312a0 28 20 70 4e 65 77 2d 3e 6e 4c 53 6c 6f 74 3e 3d  ( pNew->nLSlot>=
312b0 6e 43 6f 6e 73 74 72 61 69 6e 74 20 29 3b 0a 20  nConstraint );. 
312c0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
312d0 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29 20  onstraint; i++) 
312e0 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 69 5d 20  pNew->aLTerm[i] 
312f0 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75  = 0;.    pNew->u
31300 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 20 3d  .vtab.omitMask =
31310 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   0;.    for(i=0;
31320 20 69 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20   i<nConstraint; 
31330 69 2b 2b 2c 20 70 49 64 78 43 6f 6e 73 2b 2b 29  i++, pIdxCons++)
31340 7b 0a 20 20 20 20 20 20 69 66 28 20 28 69 54 65  {.      if( (iTe
31350 72 6d 20 3d 20 70 55 73 61 67 65 5b 69 5d 2e 61  rm = pUsage[i].a
31360 72 67 76 49 6e 64 65 78 20 2d 20 31 29 3e 3d 30  rgvIndex - 1)>=0
31370 20 29 7b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20   ){.        j = 
31380 70 49 64 78 43 6f 6e 73 2d 3e 69 54 65 72 6d 4f  pIdxCons->iTermO
31390 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20 69  ffset;.        i
313a0 66 28 20 69 54 65 72 6d 3e 3d 6e 43 6f 6e 73 74  f( iTerm>=nConst
313b0 72 61 69 6e 74 0a 20 20 20 20 20 20 20 20 20 7c  raint.         |
313c0 7c 20 6a 3c 30 0a 20 20 20 20 20 20 20 20 20 7c  | j<0.         |
313d0 7c 20 6a 3e 3d 70 57 43 2d 3e 6e 54 65 72 6d 0a  | j>=pWC->nTerm.
313e0 20 20 20 20 20 20 20 20 20 7c 7c 20 70 4e 65 77           || pNew
313f0 2d 3e 61 4c 54 65 72 6d 5b 69 54 65 72 6d 5d 21  ->aLTerm[iTerm]!
31400 3d 30 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  =0.        ){.  
31410 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
31420 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
31430 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
31440 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25 73  rMsg(pParse, "%s
31450 2e 78 42 65 73 74 49 6e 64 65 78 28 29 20 6d 61  .xBestIndex() ma
31460 6c 66 75 6e 63 74 69 6f 6e 22 2c 20 70 54 61 62  lfunction", pTab
31470 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
31480 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65 4c 6f      goto whereLo
31490 6f 70 41 64 64 56 74 61 62 5f 65 78 69 74 3b 0a  opAddVtab_exit;.
314a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
314b0 20 20 74 65 73 74 63 61 73 65 28 20 69 54 65 72    testcase( iTer
314c0 6d 3d 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 2d 31  m==nConstraint-1
314d0 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74   );.        test
314e0 63 61 73 65 28 20 6a 3d 3d 30 20 29 3b 0a 20 20  case( j==0 );.  
314f0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
31500 6a 3d 3d 70 57 43 2d 3e 6e 54 65 72 6d 2d 31 20  j==pWC->nTerm-1 
31510 29 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d  );.        pTerm
31520 20 3d 20 26 70 57 43 2d 3e 61 5b 6a 5d 3b 0a 20   = &pWC->a[j];. 
31530 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 72 65         pNew->pre
31540 72 65 71 20 7c 3d 20 70 54 65 72 6d 2d 3e 70 72  req |= pTerm->pr
31550 65 72 65 71 52 69 67 68 74 3b 0a 20 20 20 20 20  ereqRight;.     
31560 20 20 20 61 73 73 65 72 74 28 20 69 54 65 72 6d     assert( iTerm
31570 3c 70 4e 65 77 2d 3e 6e 4c 53 6c 6f 74 20 29 3b  <pNew->nLSlot );
31580 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61  .        pNew->a
31590 4c 54 65 72 6d 5b 69 54 65 72 6d 5d 20 3d 20 70  LTerm[iTerm] = p
315a0 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 69 66  Term;.        if
315b0 28 20 69 54 65 72 6d 3e 6d 78 54 65 72 6d 20 29  ( iTerm>mxTerm )
315c0 20 6d 78 54 65 72 6d 20 3d 20 69 54 65 72 6d 3b   mxTerm = iTerm;
315d0 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
315e0 65 28 20 69 54 65 72 6d 3d 3d 31 35 20 29 3b 0a  e( iTerm==15 );.
315f0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
31600 28 20 69 54 65 72 6d 3d 3d 31 36 20 29 3b 0a 20  ( iTerm==16 );. 
31610 20 20 20 20 20 20 20 69 66 28 20 69 54 65 72 6d         if( iTerm
31620 3c 31 36 20 26 26 20 70 55 73 61 67 65 5b 69 5d  <16 && pUsage[i]
31630 2e 6f 6d 69 74 20 29 20 70 4e 65 77 2d 3e 75 2e  .omit ) pNew->u.
31640 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 20 7c 3d  vtab.omitMask |=
31650 20 31 3c 3c 69 54 65 72 6d 3b 0a 20 20 20 20 20   1<<iTerm;.     
31660 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65     if( (pTerm->e
31670 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e  Operator & WO_IN
31680 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
31690 20 20 69 66 28 20 70 55 73 61 67 65 5b 69 5d 2e    if( pUsage[i].
316a0 6f 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  omit==0 ){.     
316b0 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74         /* Do not
316c0 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20   attempt to use 
316d0 61 6e 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74  an IN constraint
316e0 20 69 66 20 74 68 65 20 76 69 72 74 75 61 6c 20   if the virtual 
316f0 74 61 62 6c 65 0a 20 20 20 20 20 20 20 20 20 20  table.          
31700 20 20 2a 2a 20 73 61 79 73 20 74 68 61 74 20 74    ** says that t
31710 68 65 20 65 71 75 69 76 61 6c 65 6e 74 20 45 51  he equivalent EQ
31720 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 61 6e 6e   constraint cann
31730 6f 74 20 62 65 20 73 61 66 65 6c 79 20 6f 6d 69  ot be safely omi
31740 74 74 65 64 2e 0a 20 20 20 20 20 20 20 20 20 20  tted..          
31750 20 20 2a 2a 20 49 66 20 77 65 20 64 6f 20 61 74    ** If we do at
31760 74 65 6d 70 74 20 74 6f 20 75 73 65 20 73 75 63  tempt to use suc
31770 68 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 2c 20  h a constraint, 
31780 73 6f 6d 65 20 72 6f 77 73 20 6d 69 67 68 74 20  some rows might 
31790 62 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  be.            *
317a0 2a 20 72 65 70 65 61 74 65 64 20 69 6e 20 74 68  * repeated in th
317b0 65 20 6f 75 74 70 75 74 2e 20 2a 2f 0a 20 20 20  e output. */.   
317c0 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
317d0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
317e0 20 20 20 20 20 20 2f 2a 20 41 20 76 69 72 74 75        /* A virtu
317f0 61 6c 20 74 61 62 6c 65 20 74 68 61 74 20 69 73  al table that is
31800 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 62 79 20   constrained by 
31810 61 6e 20 49 4e 20 63 6c 61 75 73 65 20 6d 61 79  an IN clause may
31820 20 6e 6f 74 0a 20 20 20 20 20 20 20 20 20 20 2a   not.          *
31830 2a 20 63 6f 6e 73 75 6d 65 20 74 68 65 20 4f 52  * consume the OR
31840 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 62 65  DER BY clause be
31850 63 61 75 73 65 20 28 31 29 20 74 68 65 20 6f 72  cause (1) the or
31860 64 65 72 20 6f 66 20 49 4e 20 74 65 72 6d 73 0a  der of IN terms.
31870 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20            ** is 
31880 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20  not necessarily 
31890 72 65 6c 61 74 65 64 20 74 6f 20 74 68 65 20 6f  related to the o
318a0 72 64 65 72 20 6f 66 20 6f 75 74 70 75 74 20 74  rder of output t
318b0 65 72 6d 73 20 61 6e 64 0a 20 20 20 20 20 20 20  erms and.       
318c0 20 20 20 2a 2a 20 28 32 29 20 4d 75 6c 74 69 70     ** (2) Multip
318d0 6c 65 20 6f 75 74 70 75 74 73 20 66 72 6f 6d 20  le outputs from 
318e0 61 20 73 69 6e 67 6c 65 20 49 4e 20 76 61 6c 75  a single IN valu
318f0 65 20 77 69 6c 6c 20 6e 6f 74 20 6d 65 72 67 65  e will not merge
31900 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 6f  .          ** to
31910 67 65 74 68 65 72 2e 20 20 2a 2f 0a 20 20 20 20  gether.  */.    
31920 20 20 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e        pIdxInfo->
31930 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 20  orderByConsumed 
31940 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 0;.        }. 
31950 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
31960 20 69 66 28 20 69 3e 3d 6e 43 6f 6e 73 74 72 61   if( i>=nConstra
31970 69 6e 74 20 29 7b 0a 20 20 20 20 20 20 70 4e 65  int ){.      pNe
31980 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 6d 78 54 65  w->nLTerm = mxTe
31990 72 6d 2b 31 3b 0a 20 20 20 20 20 20 61 73 73 65  rm+1;.      asse
319a0 72 74 28 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d  rt( pNew->nLTerm
319b0 3c 3d 70 4e 65 77 2d 3e 6e 4c 53 6c 6f 74 20 29  <=pNew->nLSlot )
319c0 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e  ;.      pNew->u.
319d0 76 74 61 62 2e 69 64 78 4e 75 6d 20 3d 20 70 49  vtab.idxNum = pI
319e0 64 78 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d 3b 0a  dxInfo->idxNum;.
319f0 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74        pNew->u.vt
31a00 61 62 2e 6e 65 65 64 46 72 65 65 20 3d 20 70 49  ab.needFree = pI
31a10 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72  dxInfo->needToFr
31a20 65 65 49 64 78 53 74 72 3b 0a 20 20 20 20 20 20  eeIdxStr;.      
31a30 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f  pIdxInfo->needTo
31a40 46 72 65 65 49 64 78 53 74 72 20 3d 20 30 3b 0a  FreeIdxStr = 0;.
31a50 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74        pNew->u.vt
31a60 61 62 2e 69 64 78 53 74 72 20 3d 20 70 49 64 78  ab.idxStr = pIdx
31a70 49 6e 66 6f 2d 3e 69 64 78 53 74 72 3b 0a 20 20  Info->idxStr;.  
31a80 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62      pNew->u.vtab
31a90 2e 69 73 4f 72 64 65 72 65 64 20 3d 20 28 69 38  .isOrdered = (i8
31aa0 29 28 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65  )(pIdxInfo->orde
31ab0 72 42 79 43 6f 6e 73 75 6d 65 64 20 3f 0a 20 20  rByConsumed ?.  
31ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31ae0 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f      pIdxInfo->nO
31af0 72 64 65 72 42 79 20 3a 20 30 29 3b 0a 20 20 20  rderBy : 0);.   
31b00 20 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20     pNew->rSetup 
31b10 3d 20 30 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  = 0;.      pNew-
31b20 3e 72 52 75 6e 20 3d 20 73 71 6c 69 74 65 33 4c  >rRun = sqlite3L
31b30 6f 67 45 73 74 46 72 6f 6d 44 6f 75 62 6c 65 28  ogEstFromDouble(
31b40 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61  pIdxInfo->estima
31b50 74 65 64 43 6f 73 74 29 3b 0a 20 20 20 20 20 20  tedCost);.      
31b60 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 71 6c  pNew->nOut = sql
31b70 69 74 65 33 4c 6f 67 45 73 74 28 70 49 64 78 49  ite3LogEst(pIdxI
31b80 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 52 6f  nfo->estimatedRo
31b90 77 73 29 3b 0a 20 20 20 20 20 20 77 68 65 72 65  ws);.      where
31ba0 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c  LoopInsert(pBuil
31bb0 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20  der, pNew);.    
31bc0 20 20 69 66 28 20 70 4e 65 77 2d 3e 75 2e 76 74    if( pNew->u.vt
31bd0 61 62 2e 6e 65 65 64 46 72 65 65 20 29 7b 0a 20  ab.needFree ){. 
31be0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
31bf0 72 65 65 28 70 4e 65 77 2d 3e 75 2e 76 74 61 62  ree(pNew->u.vtab
31c00 2e 69 64 78 53 74 72 29 3b 0a 20 20 20 20 20 20  .idxStr);.      
31c10 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e    pNew->u.vtab.n
31c20 65 65 64 46 72 65 65 20 3d 20 30 3b 0a 20 20 20  eedFree = 0;.   
31c30 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20 20     }.    }.  }  
31c40 0a 0a 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 74  ..whereLoopAddVt
31c50 61 62 5f 65 78 69 74 3a 0a 20 20 69 66 28 20 70  ab_exit:.  if( p
31c60 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46  IdxInfo->needToF
31c70 72 65 65 49 64 78 53 74 72 20 29 20 73 71 6c 69  reeIdxStr ) sqli
31c80 74 65 33 5f 66 72 65 65 28 70 49 64 78 49 6e 66  te3_free(pIdxInf
31c90 6f 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20 73 71  o->idxStr);.  sq
31ca0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
31cb0 70 49 64 78 49 6e 66 6f 29 3b 0a 20 20 72 65 74  pIdxInfo);.  ret
31cc0 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
31cd0 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
31ce0 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a  VIRTUALTABLE */.
31cf0 0a 2f 2a 0a 2a 2a 20 41 64 64 20 57 68 65 72 65  ./*.** Add Where
31d00 4c 6f 6f 70 20 65 6e 74 72 69 65 73 20 74 6f 20  Loop entries to 
31d10 68 61 6e 64 6c 65 20 4f 52 20 74 65 72 6d 73 2e  handle OR terms.
31d20 20 20 54 68 69 73 20 77 6f 72 6b 73 20 66 6f 72    This works for
31d30 20 65 69 74 68 65 72 0a 2a 2a 20 62 74 72 65 65   either.** btree
31d40 73 20 6f 72 20 76 69 72 74 75 61 6c 20 74 61 62  s or virtual tab
31d50 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  les..*/.static i
31d60 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 4f  nt whereLoopAddO
31d70 72 28 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64  r(WhereLoopBuild
31d80 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 20 42 69  er *pBuilder, Bi
31d90 74 6d 61 73 6b 20 6d 45 78 74 72 61 29 7b 0a 20  tmask mExtra){. 
31da0 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e   WhereInfo *pWIn
31db0 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  fo = pBuilder->p
31dc0 57 49 6e 66 6f 3b 0a 20 20 57 68 65 72 65 43 6c  WInfo;.  WhereCl
31dd0 61 75 73 65 20 2a 70 57 43 3b 0a 20 20 57 68 65  ause *pWC;.  Whe
31de0 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a 20 20  reLoop *pNew;.  
31df0 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
31e00 2c 20 2a 70 57 43 45 6e 64 3b 0a 20 20 69 6e 74  , *pWCEnd;.  int
31e10 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
31e20 0a 20 20 69 6e 74 20 69 43 75 72 3b 0a 20 20 57  .  int iCur;.  W
31e30 68 65 72 65 43 6c 61 75 73 65 20 74 65 6d 70 57  hereClause tempW
31e40 43 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75  C;.  WhereLoopBu
31e50 69 6c 64 65 72 20 73 53 75 62 42 75 69 6c 64 3b  ilder sSubBuild;
31e60 0a 20 20 57 68 65 72 65 4f 72 53 65 74 20 73 53  .  WhereOrSet sS
31e70 75 6d 2c 20 73 43 75 72 3b 0a 20 20 73 74 72 75  um, sCur;.  stru
31e80 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
31e90 2a 70 49 74 65 6d 3b 0a 20 20 0a 20 20 70 57 43  *pItem;.  .  pWC
31ea0 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43   = pBuilder->pWC
31eb0 3b 0a 20 20 70 57 43 45 6e 64 20 3d 20 70 57 43  ;.  pWCEnd = pWC
31ec0 2d 3e 61 20 2b 20 70 57 43 2d 3e 6e 54 65 72 6d  ->a + pWC->nTerm
31ed0 3b 0a 20 20 70 4e 65 77 20 3d 20 70 42 75 69 6c  ;.  pNew = pBuil
31ee0 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 6d 65 6d  der->pNew;.  mem
31ef0 73 65 74 28 26 73 53 75 6d 2c 20 30 2c 20 73 69  set(&sSum, 0, si
31f00 7a 65 6f 66 28 73 53 75 6d 29 29 3b 0a 20 20 70  zeof(sSum));.  p
31f10 49 74 65 6d 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  Item = pWInfo->p
31f20 54 61 62 4c 69 73 74 2d 3e 61 20 2b 20 70 4e 65  TabList->a + pNe
31f30 77 2d 3e 69 54 61 62 3b 0a 20 20 69 43 75 72 20  w->iTab;.  iCur 
31f40 3d 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  = pItem->iCursor
31f50 3b 0a 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d 70  ;..  for(pTerm=p
31f60 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 57 43  WC->a; pTerm<pWC
31f70 45 6e 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  End && rc==SQLIT
31f80 45 5f 4f 4b 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a  E_OK; pTerm++){.
31f90 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e      if( (pTerm->
31fa0 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 4f  eOperator & WO_O
31fb0 52 29 21 3d 30 0a 20 20 20 20 20 26 26 20 28 70  R)!=0.     && (p
31fc0 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d  Term->u.pOrInfo-
31fd0 3e 69 6e 64 65 78 61 62 6c 65 20 26 20 70 4e 65  >indexable & pNe
31fe0 77 2d 3e 6d 61 73 6b 53 65 6c 66 29 21 3d 30 20  w->maskSelf)!=0 
31ff0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 57 68  .    ){.      Wh
32000 65 72 65 43 6c 61 75 73 65 20 2a 20 63 6f 6e 73  ereClause * cons
32010 74 20 70 4f 72 57 43 20 3d 20 26 70 54 65 72 6d  t pOrWC = &pTerm
32020 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 77 63 3b  ->u.pOrInfo->wc;
32030 0a 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d  .      WhereTerm
32040 20 2a 20 63 6f 6e 73 74 20 70 4f 72 57 43 45 6e   * const pOrWCEn
32050 64 20 3d 20 26 70 4f 72 57 43 2d 3e 61 5b 70 4f  d = &pOrWC->a[pO
32060 72 57 43 2d 3e 6e 54 65 72 6d 5d 3b 0a 20 20 20  rWC->nTerm];.   
32070 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f     WhereTerm *pO
32080 72 54 65 72 6d 3b 0a 20 20 20 20 20 20 69 6e 74  rTerm;.      int
32090 20 6f 6e 63 65 20 3d 20 31 3b 0a 20 20 20 20 20   once = 1;.     
320a0 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 0a   int i, j;.    .
320b0 20 20 20 20 20 20 73 53 75 62 42 75 69 6c 64 20        sSubBuild 
320c0 3d 20 2a 70 42 75 69 6c 64 65 72 3b 0a 20 20 20  = *pBuilder;.   
320d0 20 20 20 73 53 75 62 42 75 69 6c 64 2e 70 4f 72     sSubBuild.pOr
320e0 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20  derBy = 0;.     
320f0 20 73 53 75 62 42 75 69 6c 64 2e 70 4f 72 53 65   sSubBuild.pOrSe
32100 74 20 3d 20 26 73 43 75 72 3b 0a 0a 20 20 20 20  t = &sCur;..    
32110 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78 32    WHERETRACE(0x2
32120 30 30 2c 20 28 22 42 65 67 69 6e 20 70 72 6f 63  00, ("Begin proc
32130 65 73 73 69 6e 67 20 4f 52 2d 63 6c 61 75 73 65  essing OR-clause
32140 20 25 70 5c 6e 22 2c 20 70 54 65 72 6d 29 29 3b   %p\n", pTerm));
32150 0a 20 20 20 20 20 20 66 6f 72 28 70 4f 72 54 65  .      for(pOrTe
32160 72 6d 3d 70 4f 72 57 43 2d 3e 61 3b 20 70 4f 72  rm=pOrWC->a; pOr
32170 54 65 72 6d 3c 70 4f 72 57 43 45 6e 64 3b 20 70  Term<pOrWCEnd; p
32180 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20  OrTerm++){.     
32190 20 20 20 69 66 28 20 28 70 4f 72 54 65 72 6d 2d     if( (pOrTerm-
321a0 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
321b0 41 4e 44 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  AND)!=0 ){.     
321c0 20 20 20 20 20 73 53 75 62 42 75 69 6c 64 2e 70       sSubBuild.p
321d0 57 43 20 3d 20 26 70 4f 72 54 65 72 6d 2d 3e 75  WC = &pOrTerm->u
321e0 2e 70 41 6e 64 49 6e 66 6f 2d 3e 77 63 3b 0a 20  .pAndInfo->wc;. 
321f0 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
32200 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75   pOrTerm->leftCu
32210 72 73 6f 72 3d 3d 69 43 75 72 20 29 7b 0a 20 20  rsor==iCur ){.  
32220 20 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e 70          tempWC.p
32230 57 49 6e 66 6f 20 3d 20 70 57 43 2d 3e 70 57 49  WInfo = pWC->pWI
32240 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 74  nfo;.          t
32250 65 6d 70 57 43 2e 70 4f 75 74 65 72 20 3d 20 70  empWC.pOuter = p
32260 57 43 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65  WC;.          te
32270 6d 70 57 43 2e 6f 70 20 3d 20 54 4b 5f 41 4e 44  mpWC.op = TK_AND
32280 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 6d 70  ;.          temp
32290 57 43 2e 6e 54 65 72 6d 20 3d 20 31 3b 0a 20 20  WC.nTerm = 1;.  
322a0 20 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e 61          tempWC.a
322b0 20 3d 20 70 4f 72 54 65 72 6d 3b 0a 20 20 20 20   = pOrTerm;.    
322c0 20 20 20 20 20 20 73 53 75 62 42 75 69 6c 64 2e        sSubBuild.
322d0 70 57 43 20 3d 20 26 74 65 6d 70 57 43 3b 0a 20  pWC = &tempWC;. 
322e0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
322f0 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
32300 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
32310 20 20 20 20 73 43 75 72 2e 6e 20 3d 20 30 3b 0a      sCur.n = 0;.
32320 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41 43  #ifdef WHERETRAC
32330 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20 20 20  E_ENABLED.      
32340 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78 32    WHERETRACE(0x2
32350 30 30 2c 20 28 22 4f 52 2d 74 65 72 6d 20 25 64  00, ("OR-term %d
32360 20 6f 66 20 25 70 20 68 61 73 20 25 64 20 73 75   of %p has %d su
32370 62 74 65 72 6d 73 3a 5c 6e 22 2c 20 0a 20 20 20  bterms:\n", .   
32380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32390 28 69 6e 74 29 28 70 4f 72 54 65 72 6d 2d 70 4f  (int)(pOrTerm-pO
323a0 72 57 43 2d 3e 61 29 2c 20 70 54 65 72 6d 2c 20  rWC->a), pTerm, 
323b0 73 53 75 62 42 75 69 6c 64 2e 70 57 43 2d 3e 6e  sSubBuild.pWC->n
323c0 54 65 72 6d 29 29 3b 0a 20 20 20 20 20 20 20 20  Term));.        
323d0 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65  if( sqlite3Where
323e0 54 72 61 63 65 20 26 20 30 78 34 30 30 20 29 7b  Trace & 0x400 ){
323f0 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69  .          for(i
32400 3d 30 3b 20 69 3c 73 53 75 62 42 75 69 6c 64 2e  =0; i<sSubBuild.
32410 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 29  pWC->nTerm; i++)
32420 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 77 68  {.            wh
32430 65 72 65 54 65 72 6d 50 72 69 6e 74 28 26 73 53  ereTermPrint(&sS
32440 75 62 42 75 69 6c 64 2e 70 57 43 2d 3e 61 5b 69  ubBuild.pWC->a[i
32450 5d 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20  ], i);.         
32460 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e   }.        }.#en
32470 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  dif.#ifndef SQLI
32480 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
32490 41 42 4c 45 0a 20 20 20 20 20 20 20 20 69 66 28  ABLE.        if(
324a0 20 49 73 56 69 72 74 75 61 6c 28 70 49 74 65 6d   IsVirtual(pItem
324b0 2d 3e 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20  ->pTab) ){.     
324c0 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c       rc = whereL
324d0 6f 6f 70 41 64 64 56 69 72 74 75 61 6c 28 26 73  oopAddVirtual(&s
324e0 53 75 62 42 75 69 6c 64 2c 20 6d 45 78 74 72 61  SubBuild, mExtra
324f0 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
32500 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
32510 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
32520 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72   whereLoopAddBtr
32530 65 65 28 26 73 53 75 62 42 75 69 6c 64 2c 20 6d  ee(&sSubBuild, m
32540 45 78 74 72 61 29 3b 0a 20 20 20 20 20 20 20 20  Extra);.        
32550 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  }.        if( rc
32560 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
32570 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 68           rc = wh
32580 65 72 65 4c 6f 6f 70 41 64 64 4f 72 28 26 73 53  ereLoopAddOr(&sS
32590 75 62 42 75 69 6c 64 2c 20 6d 45 78 74 72 61 29  ubBuild, mExtra)
325a0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
325b0 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
325c0 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 43 75  SQLITE_OK || sCu
325d0 72 2e 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  r.n==0 );.      
325e0 20 20 69 66 28 20 73 43 75 72 2e 6e 3d 3d 30 20    if( sCur.n==0 
325f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 53 75  ){.          sSu
32600 6d 2e 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  m.n = 0;.       
32610 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
32620 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 6e 63 65    }else if( once
32630 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68   ){.          wh
32640 65 72 65 4f 72 4d 6f 76 65 28 26 73 53 75 6d 2c  ereOrMove(&sSum,
32650 20 26 73 43 75 72 29 3b 0a 20 20 20 20 20 20 20   &sCur);.       
32660 20 20 20 6f 6e 63 65 20 3d 20 30 3b 0a 20 20 20     once = 0;.   
32670 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
32680 20 20 20 20 20 20 57 68 65 72 65 4f 72 53 65 74        WhereOrSet
32690 20 73 50 72 65 76 3b 0a 20 20 20 20 20 20 20 20   sPrev;.        
326a0 20 20 77 68 65 72 65 4f 72 4d 6f 76 65 28 26 73    whereOrMove(&s
326b0 50 72 65 76 2c 20 26 73 53 75 6d 29 3b 0a 20 20  Prev, &sSum);.  
326c0 20 20 20 20 20 20 20 20 73 53 75 6d 2e 6e 20 3d          sSum.n =
326d0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f   0;.          fo
326e0 72 28 69 3d 30 3b 20 69 3c 73 50 72 65 76 2e 6e  r(i=0; i<sPrev.n
326f0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
32700 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 73      for(j=0; j<s
32710 43 75 72 2e 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20  Cur.n; j++){.   
32720 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65             where
32730 4f 72 49 6e 73 65 72 74 28 26 73 53 75 6d 2c 20  OrInsert(&sSum, 
32740 73 50 72 65 76 2e 61 5b 69 5d 2e 70 72 65 72 65  sPrev.a[i].prere
32750 71 20 7c 20 73 43 75 72 2e 61 5b 6a 5d 2e 70 72  q | sCur.a[j].pr
32760 65 72 65 71 2c 0a 20 20 20 20 20 20 20 20 20 20  ereq,.          
32770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32780 20 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41    sqlite3LogEstA
32790 64 64 28 73 50 72 65 76 2e 61 5b 69 5d 2e 72 52  dd(sPrev.a[i].rR
327a0 75 6e 2c 20 73 43 75 72 2e 61 5b 6a 5d 2e 72 52  un, sCur.a[j].rR
327b0 75 6e 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  un),.           
327c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
327d0 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64   sqlite3LogEstAd
327e0 64 28 73 50 72 65 76 2e 61 5b 69 5d 2e 6e 4f 75  d(sPrev.a[i].nOu
327f0 74 2c 20 73 43 75 72 2e 61 5b 6a 5d 2e 6e 4f 75  t, sCur.a[j].nOu
32800 74 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  t));.           
32810 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
32820 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
32830 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54  .      pNew->nLT
32840 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 70  erm = 1;.      p
32850 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 30 5d 20 3d  New->aLTerm[0] =
32860 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 4e   pTerm;.      pN
32870 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48  ew->wsFlags = WH
32880 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 3b 0a 20 20  ERE_MULTI_OR;.  
32890 20 20 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70      pNew->rSetup
328a0 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4e 65 77   = 0;.      pNew
328b0 2d 3e 69 53 6f 72 74 49 64 78 20 3d 20 30 3b 0a  ->iSortIdx = 0;.
328c0 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 70 4e        memset(&pN
328d0 65 77 2d 3e 75 2c 20 30 2c 20 73 69 7a 65 6f 66  ew->u, 0, sizeof
328e0 28 70 4e 65 77 2d 3e 75 29 29 3b 0a 20 20 20 20  (pNew->u));.    
328f0 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53    for(i=0; rc==S
32900 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 73 53  QLITE_OK && i<sS
32910 75 6d 2e 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  um.n; i++){.    
32920 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 43      /* TUNING: C
32930 75 72 72 65 6e 74 6c 79 20 73 53 75 6d 2e 61 5b  urrently sSum.a[
32940 69 5d 2e 72 52 75 6e 20 69 73 20 73 65 74 20 74  i].rRun is set t
32950 6f 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65  o the sum of the
32960 20 63 6f 73 74 73 0a 20 20 20 20 20 20 20 20 2a   costs.        *
32970 2a 20 6f 66 20 61 6c 6c 20 73 75 62 2d 73 63 61  * of all sub-sca
32980 6e 73 20 72 65 71 75 69 72 65 64 20 62 79 20 74  ns required by t
32990 68 65 20 4f 52 2d 73 63 61 6e 2e 20 48 6f 77 65  he OR-scan. Howe
329a0 76 65 72 2c 20 64 75 65 20 74 6f 20 72 6f 75 6e  ver, due to roun
329b0 64 69 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a 20  ding.        ** 
329c0 65 72 72 6f 72 73 2c 20 69 74 20 6d 61 79 20 62  errors, it may b
329d0 65 20 74 68 61 74 20 74 68 65 20 63 6f 73 74 20  e that the cost 
329e0 6f 66 20 74 68 65 20 4f 52 2d 73 63 61 6e 20 69  of the OR-scan i
329f0 73 20 65 71 75 61 6c 20 74 6f 20 69 74 73 0a 20  s equal to its. 
32a00 20 20 20 20 20 20 20 2a 2a 20 6d 6f 73 74 20 65         ** most e
32a10 78 70 65 6e 73 69 76 65 20 73 75 62 2d 73 63 61  xpensive sub-sca
32a20 6e 2e 20 41 64 64 20 74 68 65 20 73 6d 61 6c 6c  n. Add the small
32a30 65 73 74 20 70 6f 73 73 69 62 6c 65 20 70 65 6e  est possible pen
32a40 61 6c 74 79 20 0a 20 20 20 20 20 20 20 20 2a 2a  alty .        **
32a50 20 28 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20   (equivalent to 
32a60 6d 75 6c 74 69 70 6c 79 69 6e 67 20 74 68 65 20  multiplying the 
32a70 63 6f 73 74 20 62 79 20 31 2e 30 37 29 20 74 6f  cost by 1.07) to
32a80 20 65 6e 73 75 72 65 20 74 68 61 74 20 0a 20 20   ensure that .  
32a90 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 64 6f        ** this do
32aa0 65 73 20 6e 6f 74 20 68 61 70 70 65 6e 2e 20 4f  es not happen. O
32ab0 74 68 65 72 77 69 73 65 2c 20 66 6f 72 20 57 48  therwise, for WH
32ac0 45 52 45 20 63 6c 61 75 73 65 73 20 73 75 63 68  ERE clauses such
32ad0 20 61 73 20 74 68 65 0a 20 20 20 20 20 20 20 20   as the.        
32ae0 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 77 68 65  ** following whe
32af0 72 65 20 74 68 65 72 65 20 69 73 20 61 6e 20 69  re there is an i
32b00 6e 64 65 78 20 6f 6e 20 22 79 22 3a 0a 20 20 20  ndex on "y":.   
32b10 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
32b20 2a 2a 20 20 20 20 20 57 48 45 52 45 20 6c 69 6b  **     WHERE lik
32b30 65 6c 69 68 6f 6f 64 28 78 3d 3f 2c 20 30 2e 39  elihood(x=?, 0.9
32b40 39 29 20 4f 52 20 79 3d 3f 0a 20 20 20 20 20 20  9) OR y=?.      
32b50 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
32b60 74 68 65 20 70 6c 61 6e 6e 65 72 20 6d 61 79 20  the planner may 
32b70 65 6c 65 63 74 20 74 6f 20 22 4f 52 22 20 74 6f  elect to "OR" to
32b80 67 65 74 68 65 72 20 61 20 66 75 6c 6c 2d 74 61  gether a full-ta
32b90 62 6c 65 20 73 63 61 6e 20 61 6e 64 20 61 6e 0a  ble scan and an.
32ba0 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 64 65 78          ** index
32bb0 20 6c 6f 6f 6b 75 70 2e 20 41 6e 64 20 6f 74 68   lookup. And oth
32bc0 65 72 20 73 69 6d 69 6c 61 72 6c 79 20 6f 64 64  er similarly odd
32bd0 20 72 65 73 75 6c 74 73 2e 20 20 2a 2f 0a 20 20   results.  */.  
32be0 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e        pNew->rRun
32bf0 20 3d 20 73 53 75 6d 2e 61 5b 69 5d 2e 72 52 75   = sSum.a[i].rRu
32c00 6e 20 2b 20 31 3b 0a 20 20 20 20 20 20 20 20 70  n + 1;.        p
32c10 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 53 75 6d  New->nOut = sSum
32c20 2e 61 5b 69 5d 2e 6e 4f 75 74 3b 0a 20 20 20 20  .a[i].nOut;.    
32c30 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71      pNew->prereq
32c40 20 3d 20 73 53 75 6d 2e 61 5b 69 5d 2e 70 72 65   = sSum.a[i].pre
32c50 72 65 71 3b 0a 20 20 20 20 20 20 20 20 72 63 20  req;.        rc 
32c60 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72  = whereLoopInser
32c70 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e 65 77  t(pBuilder, pNew
32c80 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
32c90 20 57 48 45 52 45 54 52 41 43 45 28 30 78 32 30   WHERETRACE(0x20
32ca0 30 2c 20 28 22 45 6e 64 20 70 72 6f 63 65 73 73  0, ("End process
32cb0 69 6e 67 20 4f 52 2d 63 6c 61 75 73 65 20 25 70  ing OR-clause %p
32cc0 5c 6e 22 2c 20 70 54 65 72 6d 29 29 3b 0a 20 20  \n", pTerm));.  
32cd0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
32ce0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64   rc;.}../*.** Ad
32cf0 64 20 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 20  d all WhereLoop 
32d00 6f 62 6a 65 63 74 73 20 66 6f 72 20 61 6c 6c 20  objects for all 
32d10 74 61 62 6c 65 73 20 0a 2a 2f 0a 73 74 61 74 69  tables .*/.stati
32d20 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41  c int whereLoopA
32d30 64 64 41 6c 6c 28 57 68 65 72 65 4c 6f 6f 70 42  ddAll(WhereLoopB
32d40 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72  uilder *pBuilder
32d50 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  ){.  WhereInfo *
32d60 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65  pWInfo = pBuilde
32d70 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 42 69 74  r->pWInfo;.  Bit
32d80 6d 61 73 6b 20 6d 45 78 74 72 61 20 3d 20 30 3b  mask mExtra = 0;
32d90 0a 20 20 42 69 74 6d 61 73 6b 20 6d 50 72 69 6f  .  Bitmask mPrio
32da0 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 54 61  r = 0;.  int iTa
32db0 62 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  b;.  SrcList *pT
32dc0 61 62 4c 69 73 74 20 3d 20 70 57 49 6e 66 6f 2d  abList = pWInfo-
32dd0 3e 70 54 61 62 4c 69 73 74 3b 0a 20 20 73 74 72  >pTabList;.  str
32de0 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
32df0 20 2a 70 49 74 65 6d 3b 0a 20 20 73 71 6c 69 74   *pItem;.  sqlit
32e00 65 33 20 2a 64 62 20 3d 20 70 57 49 6e 66 6f 2d  e3 *db = pWInfo-
32e10 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69  >pParse->db;.  i
32e20 6e 74 20 6e 54 61 62 4c 69 73 74 20 3d 20 70 57  nt nTabList = pW
32e30 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 0a 20 20  Info->nLevel;.  
32e40 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
32e50 4f 4b 3b 0a 20 20 75 38 20 70 72 69 6f 72 4a 6f  OK;.  u8 priorJo
32e60 69 6e 54 79 70 65 20 3d 20 30 3b 0a 20 20 57 68  inType = 0;.  Wh
32e70 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a 0a  ereLoop *pNew;..
32e80 20 20 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72 20 74    /* Loop over t
32e90 68 65 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65  he tables in the
32ea0 20 6a 6f 69 6e 2c 20 66 72 6f 6d 20 6c 65 66 74   join, from left
32eb0 20 74 6f 20 72 69 67 68 74 20 2a 2f 0a 20 20 70   to right */.  p
32ec0 4e 65 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  New = pBuilder->
32ed0 70 4e 65 77 3b 0a 20 20 77 68 65 72 65 4c 6f 6f  pNew;.  whereLoo
32ee0 70 49 6e 69 74 28 70 4e 65 77 29 3b 0a 20 20 66  pInit(pNew);.  f
32ef0 6f 72 28 69 54 61 62 3d 30 2c 20 70 49 74 65 6d  or(iTab=0, pItem
32f00 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 54  =pTabList->a; iT
32f10 61 62 3c 6e 54 61 62 4c 69 73 74 3b 20 69 54 61  ab<nTabList; iTa
32f20 62 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  b++, pItem++){. 
32f30 20 20 20 70 4e 65 77 2d 3e 69 54 61 62 20 3d 20     pNew->iTab = 
32f40 69 54 61 62 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  iTab;.    pNew->
32f50 6d 61 73 6b 53 65 6c 66 20 3d 20 67 65 74 4d 61  maskSelf = getMa
32f60 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73  sk(&pWInfo->sMas
32f70 6b 53 65 74 2c 20 70 49 74 65 6d 2d 3e 69 43 75  kSet, pItem->iCu
32f80 72 73 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 28  rsor);.    if( (
32f90 28 70 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65  (pItem->jointype
32fa0 7c 70 72 69 6f 72 4a 6f 69 6e 54 79 70 65 29 20  |priorJoinType) 
32fb0 26 20 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f 43 52  & (JT_LEFT|JT_CR
32fc0 4f 53 53 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  OSS))!=0 ){.    
32fd0 20 20 6d 45 78 74 72 61 20 3d 20 6d 50 72 69 6f    mExtra = mPrio
32fe0 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 72 69  r;.    }.    pri
32ff0 6f 72 4a 6f 69 6e 54 79 70 65 20 3d 20 70 49 74  orJoinType = pIt
33000 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20  em->jointype;.  
33010 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28    if( IsVirtual(
33020 70 49 74 65 6d 2d 3e 70 54 61 62 29 20 29 7b 0a  pItem->pTab) ){.
33030 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65        rc = where
33040 4c 6f 6f 70 41 64 64 56 69 72 74 75 61 6c 28 70  LoopAddVirtual(p
33050 42 75 69 6c 64 65 72 2c 20 6d 45 78 74 72 61 29  Builder, mExtra)
33060 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
33070 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f     rc = whereLoo
33080 70 41 64 64 42 74 72 65 65 28 70 42 75 69 6c 64  pAddBtree(pBuild
33090 65 72 2c 20 6d 45 78 74 72 61 29 3b 0a 20 20 20  er, mExtra);.   
330a0 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
330b0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
330c0 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70    rc = whereLoop
330d0 41 64 64 4f 72 28 70 42 75 69 6c 64 65 72 2c 20  AddOr(pBuilder, 
330e0 6d 45 78 74 72 61 29 3b 0a 20 20 20 20 7d 0a 20  mExtra);.    }. 
330f0 20 20 20 6d 50 72 69 6f 72 20 7c 3d 20 70 4e 65     mPrior |= pNe
33100 77 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20  w->maskSelf;.   
33110 20 69 66 28 20 72 63 20 7c 7c 20 64 62 2d 3e 6d   if( rc || db->m
33120 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 62 72  allocFailed ) br
33130 65 61 6b 3b 0a 20 20 7d 0a 20 20 77 68 65 72 65  eak;.  }.  where
33140 4c 6f 6f 70 43 6c 65 61 72 28 64 62 2c 20 70 4e  LoopClear(db, pN
33150 65 77 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ew);.  return rc
33160 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 61 6d 69  ;.}../*.** Exami
33170 6e 65 20 61 20 57 68 65 72 65 50 61 74 68 20 28  ne a WherePath (
33180 77 69 74 68 20 74 68 65 20 61 64 64 69 74 69 6f  with the additio
33190 6e 20 6f 66 20 74 68 65 20 65 78 74 72 61 20 57  n of the extra W
331a0 68 65 72 65 4c 6f 6f 70 20 6f 66 20 74 68 65 20  hereLoop of the 
331b0 35 74 68 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72  5th.** parameter
331c0 73 29 20 74 6f 20 73 65 65 20 69 66 20 69 74 20  s) to see if it 
331d0 6f 75 74 70 75 74 73 20 72 6f 77 73 20 69 6e 20  outputs rows in 
331e0 74 68 65 20 72 65 71 75 65 73 74 65 64 20 4f 52  the requested OR
331f0 44 45 52 20 42 59 0a 2a 2a 20 28 6f 72 20 47 52  DER BY.** (or GR
33200 4f 55 50 20 42 59 29 20 77 69 74 68 6f 75 74 20  OUP BY) without 
33210 72 65 71 75 69 72 69 6e 67 20 61 20 73 65 70 61  requiring a sepa
33220 72 61 74 65 20 73 6f 72 74 20 6f 70 65 72 61 74  rate sort operat
33230 69 6f 6e 2e 20 20 52 65 74 75 72 6e 20 4e 3a 0a  ion.  Return N:.
33240 2a 2a 20 0a 2a 2a 20 20 20 4e 3e 30 3a 20 20 20  ** .**   N>0:   
33250 4e 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 4f  N terms of the O
33260 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61  RDER BY clause a
33270 72 65 20 73 61 74 69 73 66 69 65 64 0a 2a 2a 20  re satisfied.** 
33280 20 20 4e 3d 3d 30 3a 20 20 4e 6f 20 74 65 72 6d    N==0:  No term
33290 73 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42  s of the ORDER B
332a0 59 20 63 6c 61 75 73 65 20 61 72 65 20 73 61 74  Y clause are sat
332b0 69 73 66 69 65 64 0a 2a 2a 20 20 20 4e 3c 30 3a  isfied.**   N<0:
332c0 20 20 20 55 6e 6b 6e 6f 77 6e 20 79 65 74 20 68     Unknown yet h
332d0 6f 77 20 6d 61 6e 79 20 74 65 72 6d 73 20 6f 66  ow many terms of
332e0 20 4f 52 44 45 52 20 42 59 20 6d 69 67 68 74 20   ORDER BY might 
332f0 62 65 20 73 61 74 69 73 66 69 65 64 2e 20 20 20  be satisfied.   
33300 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74  .**.** Note that
33310 20 70 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20   processing for 
33320 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20 61 6e  WHERE_GROUPBY an
33330 64 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  d WHERE_DISTINCT
33340 42 59 20 69 73 20 6e 6f 74 20 61 73 0a 2a 2a 20  BY is not as.** 
33350 73 74 72 69 63 74 2e 20 20 57 69 74 68 20 47 52  strict.  With GR
33360 4f 55 50 20 42 59 20 61 6e 64 20 44 49 53 54 49  OUP BY and DISTI
33370 4e 43 54 20 74 68 65 20 6f 6e 6c 79 20 72 65 71  NCT the only req
33380 75 69 72 65 6d 65 6e 74 20 69 73 20 74 68 61 74  uirement is that
33390 0a 2a 2a 20 65 71 75 69 76 61 6c 65 6e 74 20 72  .** equivalent r
333a0 6f 77 73 20 61 70 70 65 61 72 20 69 6d 6d 65 64  ows appear immed
333b0 69 61 74 65 6c 79 20 61 64 6a 61 63 65 6e 74 20  iately adjacent 
333c0 74 6f 20 6f 6e 65 20 61 6e 6f 74 68 65 72 2e 20  to one another. 
333d0 20 47 52 4f 55 50 20 42 59 0a 2a 2a 20 61 6e 64   GROUP BY.** and
333e0 20 44 49 53 54 49 4e 43 54 20 64 6f 20 6e 6f 74   DISTINCT do not
333f0 20 72 65 71 75 69 72 65 20 72 6f 77 73 20 74 6f   require rows to
33400 20 61 70 70 65 61 72 20 69 6e 20 61 6e 79 20 70   appear in any p
33410 61 72 74 69 63 75 6c 61 72 20 6f 72 64 65 72 20  articular order 
33420 61 73 20 6c 6f 6e 67 0a 2a 2a 20 61 73 20 65 71  as long.** as eq
33430 75 69 76 61 6c 65 6e 74 20 72 6f 77 73 20 61 72  uivalent rows ar
33440 65 20 67 72 6f 75 70 65 64 20 74 6f 67 65 74 68  e grouped togeth
33450 65 72 2e 20 20 54 68 75 73 20 66 6f 72 20 47 52  er.  Thus for GR
33460 4f 55 50 20 42 59 20 61 6e 64 20 44 49 53 54 49  OUP BY and DISTI
33470 4e 43 54 0a 2a 2a 20 74 68 65 20 70 4f 72 64 65  NCT.** the pOrde
33480 72 42 79 20 74 65 72 6d 73 20 63 61 6e 20 62 65  rBy terms can be
33490 20 6d 61 74 63 68 65 64 20 69 6e 20 61 6e 79 20   matched in any 
334a0 6f 72 64 65 72 2e 20 20 57 69 74 68 20 4f 52 44  order.  With ORD
334b0 45 52 20 42 59 2c 20 74 68 65 20 0a 2a 2a 20 70  ER BY, the .** p
334c0 4f 72 64 65 72 42 79 20 74 65 72 6d 73 20 6d 75  OrderBy terms mu
334d0 73 74 20 62 65 20 6d 61 74 63 68 65 64 20 69 6e  st be matched in
334e0 20 73 74 72 69 63 74 20 6c 65 66 74 2d 74 6f 2d   strict left-to-
334f0 72 69 67 68 74 20 6f 72 64 65 72 2e 0a 2a 2f 0a  right order..*/.
33500 73 74 61 74 69 63 20 69 38 20 77 68 65 72 65 50  static i8 whereP
33510 61 74 68 53 61 74 69 73 66 69 65 73 4f 72 64 65  athSatisfiesOrde
33520 72 42 79 28 0a 20 20 57 68 65 72 65 49 6e 66 6f  rBy(.  WhereInfo
33530 20 2a 70 57 49 6e 66 6f 2c 20 20 20 20 2f 2a 20   *pWInfo,    /* 
33540 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
33550 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
33560 70 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a 20 4f  pOrderBy,   /* O
33570 52 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50  RDER BY or GROUP
33580 20 42 59 20 6f 72 20 44 49 53 54 49 4e 43 54 20   BY or DISTINCT 
33590 63 6c 61 75 73 65 20 74 6f 20 63 68 65 63 6b 20  clause to check 
335a0 2a 2f 0a 20 20 57 68 65 72 65 50 61 74 68 20 2a  */.  WherePath *
335b0 70 50 61 74 68 2c 20 20 20 20 20 2f 2a 20 54 68  pPath,     /* Th
335c0 65 20 57 68 65 72 65 50 61 74 68 20 74 6f 20 63  e WherePath to c
335d0 68 65 63 6b 20 2a 2f 0a 20 20 75 31 36 20 77 63  heck */.  u16 wc
335e0 74 72 6c 46 6c 61 67 73 2c 20 20 20 20 20 20 20  trlFlags,       
335f0 2f 2a 20 4d 69 67 68 74 20 63 6f 6e 74 61 69 6e  /* Might contain
33600 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20 6f   WHERE_GROUPBY o
33610 72 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  r WHERE_DISTINCT
33620 42 59 20 2a 2f 0a 20 20 75 31 36 20 6e 4c 6f 6f  BY */.  u16 nLoo
33630 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p,            /*
33640 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69   Number of entri
33650 65 73 20 69 6e 20 70 50 61 74 68 2d 3e 61 4c 6f  es in pPath->aLo
33660 6f 70 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65 4c  op[] */.  WhereL
33670 6f 6f 70 20 2a 70 4c 61 73 74 2c 20 20 20 20 20  oop *pLast,     
33680 2f 2a 20 41 64 64 20 74 68 69 73 20 57 68 65 72  /* Add this Wher
33690 65 4c 6f 6f 70 20 74 6f 20 74 68 65 20 65 6e 64  eLoop to the end
336a0 20 6f 66 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70   of pPath->aLoop
336b0 5b 5d 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  [] */.  Bitmask 
336c0 2a 70 52 65 76 4d 61 73 6b 20 20 20 20 20 2f 2a  *pRevMask     /*
336d0 20 4f 55 54 3a 20 4d 61 73 6b 20 6f 66 20 57 68   OUT: Mask of Wh
336e0 65 72 65 4c 6f 6f 70 73 20 74 6f 20 72 75 6e 20  ereLoops to run 
336f0 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65 72  in reverse order
33700 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 72 65 76 53   */.){.  u8 revS
33710 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  et;            /
33720 2a 20 54 72 75 65 20 69 66 20 72 65 76 20 69 73  * True if rev is
33730 20 6b 6e 6f 77 6e 20 2a 2f 0a 20 20 75 38 20 72   known */.  u8 r
33740 65 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ev;             
33750 20 20 2f 2a 20 43 6f 6d 70 6f 73 69 74 65 20 73    /* Composite s
33760 6f 72 74 20 6f 72 64 65 72 20 2a 2f 0a 20 20 75  ort order */.  u
33770 38 20 72 65 76 49 64 78 3b 20 20 20 20 20 20 20  8 revIdx;       
33780 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 73 6f       /* Index so
33790 72 74 20 6f 72 64 65 72 20 2a 2f 0a 20 20 75 38  rt order */.  u8
337a0 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74   isOrderDistinct
337b0 3b 20 20 20 2f 2a 20 41 6c 6c 20 70 72 69 6f 72  ;   /* All prior
337c0 20 57 68 65 72 65 4c 6f 6f 70 73 20 61 72 65 20   WhereLoops are 
337d0 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74 20 2a  order-distinct *
337e0 2f 0a 20 20 75 38 20 64 69 73 74 69 6e 63 74 43  /.  u8 distinctC
337f0 6f 6c 75 6d 6e 73 3b 20 20 20 2f 2a 20 54 72 75  olumns;   /* Tru
33800 65 20 69 66 20 74 68 65 20 6c 6f 6f 70 20 68 61  e if the loop ha
33810 73 20 55 4e 49 51 55 45 20 4e 4f 54 20 4e 55 4c  s UNIQUE NOT NUL
33820 4c 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 75  L columns */.  u
33830 38 20 69 73 4d 61 74 63 68 3b 20 20 20 20 20 20  8 isMatch;      
33840 20 20 20 20 20 2f 2a 20 69 43 6f 6c 75 6d 6e 20       /* iColumn 
33850 6d 61 74 63 68 65 73 20 61 20 74 65 72 6d 20 6f  matches a term o
33860 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  f the ORDER BY c
33870 6c 61 75 73 65 20 2a 2f 0a 20 20 75 31 36 20 6e  lause */.  u16 n
33880 4b 65 79 43 6f 6c 3b 20 20 20 20 20 20 20 20 20  KeyCol;         
33890 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6b 65   /* Number of ke
338a0 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 70 49 6e  y columns in pIn
338b0 64 65 78 20 2a 2f 0a 20 20 75 31 36 20 6e 43 6f  dex */.  u16 nCo
338c0 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20 20 20 2f  lumn;          /
338d0 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  * Total number o
338e0 66 20 6f 72 64 65 72 65 64 20 63 6f 6c 75 6d 6e  f ordered column
338f0 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78 20 2a  s in the index *
33900 2f 0a 20 20 75 31 36 20 6e 4f 72 64 65 72 42 79  /.  u16 nOrderBy
33910 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  ;         /* Num
33920 62 65 72 20 74 65 72 6d 73 20 69 6e 20 74 68 65  ber terms in the
33930 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
33940 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 6f 6f 70 3b   */.  int iLoop;
33950 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
33960 6e 64 65 78 20 6f 66 20 57 68 65 72 65 4c 6f 6f  ndex of WhereLoo
33970 70 20 69 6e 20 70 50 61 74 68 20 62 65 69 6e 67  p in pPath being
33980 20 70 72 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20   processed */.  
33990 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20  int i, j;       
339a0 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
339b0 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20  unters */.  int 
339c0 69 43 75 72 3b 20 20 20 20 20 20 20 20 20 20 20  iCur;           
339d0 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62    /* Cursor numb
339e0 65 72 20 66 6f 72 20 63 75 72 72 65 6e 74 20 57  er for current W
339f0 68 65 72 65 4c 6f 6f 70 20 2a 2f 0a 20 20 69 6e  hereLoop */.  in
33a00 74 20 69 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20  t iColumn;      
33a10 20 20 20 20 2f 2a 20 41 20 63 6f 6c 75 6d 6e 20      /* A column 
33a20 6e 75 6d 62 65 72 20 77 69 74 68 69 6e 20 74 61  number within ta
33a30 62 6c 65 20 69 43 75 72 20 2a 2f 0a 20 20 57 68  ble iCur */.  Wh
33a40 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 20 3d  ereLoop *pLoop =
33a50 20 30 3b 20 2f 2a 20 43 75 72 72 65 6e 74 20 57   0; /* Current W
33a60 68 65 72 65 4c 6f 6f 70 20 62 65 69 6e 67 20 70  hereLoop being p
33a70 72 6f 63 65 73 73 65 64 2e 20 2a 2f 0a 20 20 57  rocessed. */.  W
33a80 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b  hereTerm *pTerm;
33a90 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65       /* A single
33aa0 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45   term of the WHE
33ab0 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45  RE clause */.  E
33ac0 78 70 72 20 2a 70 4f 42 45 78 70 72 3b 20 20 20  xpr *pOBExpr;   
33ad0 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 70 72 65       /* An expre
33ae0 73 73 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 4f  ssion from the O
33af0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a  RDER BY clause *
33b00 2f 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f  /.  CollSeq *pCo
33b10 6c 6c 3b 20 20 20 20 20 20 20 2f 2a 20 43 4f 4c  ll;       /* COL
33b20 4c 41 54 45 20 66 75 6e 63 74 69 6f 6e 20 66 72  LATE function fr
33b30 6f 6d 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  om an ORDER BY c
33b40 6c 61 75 73 65 20 74 65 72 6d 20 2a 2f 0a 20 20  lause term */.  
33b50 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 20 20  Index *pIndex;  
33b60 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64        /* The ind
33b70 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ex associated wi
33b80 74 68 20 70 4c 6f 6f 70 20 2a 2f 0a 20 20 73 71  th pLoop */.  sq
33b90 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 57 49 6e  lite3 *db = pWIn
33ba0 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b 20  fo->pParse->db; 
33bb0 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
33bc0 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 42 69 74  nection */.  Bit
33bd0 6d 61 73 6b 20 6f 62 53 61 74 20 3d 20 30 3b 20  mask obSat = 0; 
33be0 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 4f 52     /* Mask of OR
33bf0 44 45 52 20 42 59 20 74 65 72 6d 73 20 73 61 74  DER BY terms sat
33c00 69 73 66 69 65 64 20 73 6f 20 66 61 72 20 2a 2f  isfied so far */
33c10 0a 20 20 42 69 74 6d 61 73 6b 20 6f 62 44 6f 6e  .  Bitmask obDon
33c20 65 3b 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b  e;       /* Mask
33c30 20 6f 66 20 61 6c 6c 20 4f 52 44 45 52 20 42 59   of all ORDER BY
33c40 20 74 65 72 6d 73 20 2a 2f 0a 20 20 42 69 74 6d   terms */.  Bitm
33c50 61 73 6b 20 6f 72 64 65 72 44 69 73 74 69 6e 63  ask orderDistinc
33c60 74 4d 61 73 6b 3b 20 20 2f 2a 20 4d 61 73 6b 20  tMask;  /* Mask 
33c70 6f 66 20 61 6c 6c 20 77 65 6c 6c 2d 6f 72 64 65  of all well-orde
33c80 72 65 64 20 6c 6f 6f 70 73 20 2a 2f 0a 20 20 42  red loops */.  B
33c90 69 74 6d 61 73 6b 20 72 65 61 64 79 3b 20 20 20  itmask ready;   
33ca0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
33cb0 73 6b 20 6f 66 20 69 6e 6e 65 72 20 6c 6f 6f 70  sk of inner loop
33cc0 73 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  s */..  /*.  ** 
33cd0 57 65 20 73 61 79 20 74 68 65 20 57 68 65 72 65  We say the Where
33ce0 4c 6f 6f 70 20 69 73 20 22 6f 6e 65 2d 72 6f 77  Loop is "one-row
33cf0 22 20 69 66 20 69 74 20 67 65 6e 65 72 61 74 65  " if it generate
33d00 73 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f  s no more than o
33d10 6e 65 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20 6f  ne.  ** row of o
33d20 75 74 70 75 74 2e 20 20 41 20 57 68 65 72 65 4c  utput.  A WhereL
33d30 6f 6f 70 20 69 73 20 6f 6e 65 2d 72 6f 77 20 69  oop is one-row i
33d40 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c  f all of the fol
33d50 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a  lowing are true:
33d60 0a 20 20 2a 2a 20 20 28 61 29 20 41 6c 6c 20 69  .  **  (a) All i
33d70 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20 6d 61 74  ndex columns mat
33d80 63 68 20 77 69 74 68 20 57 48 45 52 45 5f 43 4f  ch with WHERE_CO
33d90 4c 55 4d 4e 5f 45 51 2e 0a 20 20 2a 2a 20 20 28  LUMN_EQ..  **  (
33da0 62 29 20 54 68 65 20 69 6e 64 65 78 20 69 73 20  b) The index is 
33db0 75 6e 69 71 75 65 0a 20 20 2a 2a 20 41 6e 79 20  unique.  ** Any 
33dc0 57 68 65 72 65 4c 6f 6f 70 20 77 69 74 68 20 61  WhereLoop with a
33dd0 6e 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45  n WHERE_COLUMN_E
33de0 51 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e 20  Q constraint on 
33df0 74 68 65 20 72 6f 77 69 64 20 69 73 20 6f 6e 65  the rowid is one
33e00 2d 72 6f 77 2e 0a 20 20 2a 2a 20 45 76 65 72 79  -row..  ** Every
33e10 20 6f 6e 65 2d 72 6f 77 20 57 68 65 72 65 4c 6f   one-row WhereLo
33e20 6f 70 20 77 69 6c 6c 20 68 61 76 65 20 74 68 65  op will have the
33e30 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 20 62 69   WHERE_ONEROW bi
33e40 74 20 73 65 74 20 69 6e 20 77 73 46 6c 61 67 73  t set in wsFlags
33e50 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 65 20 73  ..  **.  ** We s
33e60 61 79 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70  ay the WhereLoop
33e70 20 69 73 20 22 6f 72 64 65 72 2d 64 69 73 74 69   is "order-disti
33e80 6e 63 74 22 20 69 66 20 74 68 65 20 73 65 74 20  nct" if the set 
33e90 6f 66 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 0a  of columns from.
33ea0 20 20 2a 2a 20 74 68 61 74 20 57 68 65 72 65 4c    ** that WhereL
33eb0 6f 6f 70 20 74 68 61 74 20 61 72 65 20 69 6e 20  oop that are in 
33ec0 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
33ed0 75 73 65 20 61 72 65 20 64 69 66 66 65 72 65 6e  use are differen
33ee0 74 20 66 6f 72 20 65 76 65 72 79 0a 20 20 2a 2a  t for every.  **
33ef0 20 72 6f 77 20 6f 66 20 74 68 65 20 57 68 65 72   row of the Wher
33f00 65 4c 6f 6f 70 2e 20 20 45 76 65 72 79 20 6f 6e  eLoop.  Every on
33f10 65 2d 72 6f 77 20 57 68 65 72 65 4c 6f 6f 70 20  e-row WhereLoop 
33f20 69 73 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  is automatically
33f30 0a 20 20 2a 2a 20 6f 72 64 65 72 2d 64 69 73 74  .  ** order-dist
33f40 69 6e 63 74 2e 20 20 20 41 20 57 68 65 72 65 4c  inct.   A WhereL
33f50 6f 6f 70 20 74 68 61 74 20 68 61 73 20 6e 6f 20  oop that has no 
33f60 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 4f  columns in the O
33f70 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 0a 20  RDER BY clause. 
33f80 20 2a 2a 20 69 73 20 6e 6f 74 20 6f 72 64 65 72   ** is not order
33f90 2d 64 69 73 74 69 6e 63 74 2e 20 54 6f 20 62 65  -distinct. To be
33fa0 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74 20   order-distinct 
33fb0 69 73 20 6e 6f 74 20 71 75 69 74 65 20 74 68 65  is not quite the
33fc0 20 73 61 6d 65 20 61 73 20 62 65 69 6e 67 0a 20   same as being. 
33fd0 20 2a 2a 20 55 4e 49 51 55 45 20 73 69 6e 63 65   ** UNIQUE since
33fe0 20 61 20 55 4e 49 51 55 45 20 63 6f 6c 75 6d 6e   a UNIQUE column
33ff0 20 6f 72 20 69 6e 64 65 78 20 63 61 6e 20 68 61   or index can ha
34000 76 65 20 6d 75 6c 74 69 70 6c 65 20 72 6f 77 73  ve multiple rows
34010 20 74 68 61 74 20 0a 20 20 2a 2a 20 61 72 65 20   that .  ** are 
34020 4e 55 4c 4c 20 61 6e 64 20 4e 55 4c 4c 20 76 61  NULL and NULL va
34030 6c 75 65 73 20 61 72 65 20 65 71 75 69 76 61 6c  lues are equival
34040 65 6e 74 20 66 6f 72 20 74 68 65 20 70 75 72 70  ent for the purp
34050 6f 73 65 20 6f 66 20 6f 72 64 65 72 2d 64 69 73  ose of order-dis
34060 74 69 6e 63 74 2e 0a 20 20 2a 2a 20 54 6f 20 62  tinct..  ** To b
34070 65 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74  e order-distinct
34080 2c 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6d 75  , the columns mu
34090 73 74 20 62 65 20 55 4e 49 51 55 45 20 61 6e 64  st be UNIQUE and
340a0 20 4e 4f 54 20 4e 55 4c 4c 2e 0a 20 20 2a 2a 0a   NOT NULL..  **.
340b0 20 20 2a 2a 20 54 68 65 20 72 6f 77 69 64 20 66    ** The rowid f
340c0 6f 72 20 61 20 74 61 62 6c 65 20 69 73 20 61 6c  or a table is al
340d0 77 61 79 73 20 55 4e 49 51 55 45 20 61 6e 64 20  ways UNIQUE and 
340e0 4e 4f 54 20 4e 55 4c 4c 20 73 6f 20 77 68 65 6e  NOT NULL so when
340f0 65 76 65 72 20 74 68 65 0a 20 20 2a 2a 20 72 6f  ever the.  ** ro
34100 77 69 64 20 61 70 70 65 61 72 73 20 69 6e 20 74  wid appears in t
34110 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
34120 73 65 2c 20 74 68 65 20 63 6f 72 72 65 73 70 6f  se, the correspo
34130 6e 64 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20  nding WhereLoop 
34140 69 73 0a 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69  is.  ** automati
34150 63 61 6c 6c 79 20 6f 72 64 65 72 2d 64 69 73 74  cally order-dist
34160 69 6e 63 74 2e 0a 20 20 2a 2f 0a 0a 20 20 61 73  inct..  */..  as
34170 73 65 72 74 28 20 70 4f 72 64 65 72 42 79 21 3d  sert( pOrderBy!=
34180 30 20 29 3b 0a 20 20 69 66 28 20 6e 4c 6f 6f 70  0 );.  if( nLoop
34190 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e   && Optimization
341a0 44 69 73 61 62 6c 65 64 28 64 62 2c 20 53 51 4c  Disabled(db, SQL
341b0 49 54 45 5f 4f 72 64 65 72 42 79 49 64 78 4a 6f  ITE_OrderByIdxJo
341c0 69 6e 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  in) ) return 0;.
341d0 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 70 4f  .  nOrderBy = pO
341e0 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20  rderBy->nExpr;. 
341f0 20 74 65 73 74 63 61 73 65 28 20 6e 4f 72 64 65   testcase( nOrde
34200 72 42 79 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20  rBy==BMS-1 );.  
34210 69 66 28 20 6e 4f 72 64 65 72 42 79 3e 42 4d 53  if( nOrderBy>BMS
34220 2d 31 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  -1 ) return 0;  
34230 2f 2a 20 43 61 6e 6e 6f 74 20 6f 70 74 69 6d 69  /* Cannot optimi
34240 7a 65 20 6f 76 65 72 6c 79 20 6c 61 72 67 65 20  ze overly large 
34250 4f 52 44 45 52 20 42 59 73 20 2a 2f 0a 20 20 69  ORDER BYs */.  i
34260 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d  sOrderDistinct =
34270 20 31 3b 0a 20 20 6f 62 44 6f 6e 65 20 3d 20 4d   1;.  obDone = M
34280 41 53 4b 42 49 54 28 6e 4f 72 64 65 72 42 79 29  ASKBIT(nOrderBy)
34290 2d 31 3b 0a 20 20 6f 72 64 65 72 44 69 73 74 69  -1;.  orderDisti
342a0 6e 63 74 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 72  nctMask = 0;.  r
342b0 65 61 64 79 20 3d 20 30 3b 0a 20 20 66 6f 72 28  eady = 0;.  for(
342c0 69 4c 6f 6f 70 3d 30 3b 20 69 73 4f 72 64 65 72  iLoop=0; isOrder
342d0 44 69 73 74 69 6e 63 74 20 26 26 20 6f 62 53 61  Distinct && obSa
342e0 74 3c 6f 62 44 6f 6e 65 20 26 26 20 69 4c 6f 6f  t<obDone && iLoo
342f0 70 3c 3d 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f 70 2b  p<=nLoop; iLoop+
34300 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 4c 6f 6f  +){.    if( iLoo
34310 70 3e 30 20 29 20 72 65 61 64 79 20 7c 3d 20 70  p>0 ) ready |= p
34320 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a  Loop->maskSelf;.
34330 20 20 20 20 70 4c 6f 6f 70 20 3d 20 69 4c 6f 6f      pLoop = iLoo
34340 70 3c 6e 4c 6f 6f 70 20 3f 20 70 50 61 74 68 2d  p<nLoop ? pPath-
34350 3e 61 4c 6f 6f 70 5b 69 4c 6f 6f 70 5d 20 3a 20  >aLoop[iLoop] : 
34360 70 4c 61 73 74 3b 0a 20 20 20 20 69 66 28 20 70  pLast;.    if( p
34370 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
34380 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42  WHERE_VIRTUALTAB
34390 4c 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  LE ){.      if( 
343a0 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 69 73  pLoop->u.vtab.is
343b0 4f 72 64 65 72 65 64 20 29 20 6f 62 53 61 74 20  Ordered ) obSat 
343c0 3d 20 6f 62 44 6f 6e 65 3b 0a 20 20 20 20 20 20  = obDone;.      
343d0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
343e0 20 69 43 75 72 20 3d 20 70 57 49 6e 66 6f 2d 3e   iCur = pWInfo->
343f0 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 6f 6f  pTabList->a[pLoo
34400 70 2d 3e 69 54 61 62 5d 2e 69 43 75 72 73 6f 72  p->iTab].iCursor
34410 3b 0a 0a 20 20 20 20 2f 2a 20 4d 61 72 6b 20 6f  ;..    /* Mark o
34420 66 66 20 61 6e 79 20 4f 52 44 45 52 20 42 59 20  ff any ORDER BY 
34430 74 65 72 6d 20 58 20 74 68 61 74 20 69 73 20 61  term X that is a
34440 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 74   column in the t
34450 61 62 6c 65 20 6f 66 0a 20 20 20 20 2a 2a 20 74  able of.    ** t
34460 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f 70 20  he current loop 
34470 66 6f 72 20 77 68 69 63 68 20 74 68 65 72 65 20  for which there 
34480 69 73 20 74 65 72 6d 20 69 6e 20 74 68 65 20 57  is term in the W
34490 48 45 52 45 0a 20 20 20 20 2a 2a 20 63 6c 61 75  HERE.    ** clau
344a0 73 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 58  se of the form X
344b0 20 49 53 20 4e 55 4c 4c 20 6f 72 20 58 3d 3f 20   IS NULL or X=? 
344c0 74 68 61 74 20 72 65 66 65 72 65 6e 63 65 20 6f  that reference o
344d0 6e 6c 79 20 6f 75 74 65 72 0a 20 20 20 20 2a 2a  nly outer.    **
344e0 20 6c 6f 6f 70 73 2e 0a 20 20 20 20 2a 2f 0a 20   loops..    */. 
344f0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f     for(i=0; i<nO
34500 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20  rderBy; i++){.  
34510 20 20 20 20 69 66 28 20 4d 41 53 4b 42 49 54 28      if( MASKBIT(
34520 69 29 20 26 20 6f 62 53 61 74 20 29 20 63 6f 6e  i) & obSat ) con
34530 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 4f 42  tinue;.      pOB
34540 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78  Expr = sqlite3Ex
34550 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4f  prSkipCollate(pO
34560 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78  rderBy->a[i].pEx
34570 70 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  pr);.      if( p
34580 4f 42 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43  OBExpr->op!=TK_C
34590 4f 4c 55 4d 4e 20 29 20 63 6f 6e 74 69 6e 75 65  OLUMN ) continue
345a0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 42 45  ;.      if( pOBE
345b0 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d 69 43 75  xpr->iTable!=iCu
345c0 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  r ) continue;.  
345d0 20 20 20 20 70 54 65 72 6d 20 3d 20 66 69 6e 64      pTerm = find
345e0 54 65 72 6d 28 26 70 57 49 6e 66 6f 2d 3e 73 57  Term(&pWInfo->sW
345f0 43 2c 20 69 43 75 72 2c 20 70 4f 42 45 78 70 72  C, iCur, pOBExpr
34600 2d 3e 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20  ->iColumn,.     
34610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34620 20 20 7e 72 65 61 64 79 2c 20 57 4f 5f 45 51 7c    ~ready, WO_EQ|
34630 57 4f 5f 49 53 4e 55 4c 4c 2c 20 30 29 3b 0a 20  WO_ISNULL, 0);. 
34640 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 3d 3d       if( pTerm==
34650 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
34660 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e      if( (pTerm->
34670 65 4f 70 65 72 61 74 6f 72 26 57 4f 5f 45 51 29  eOperator&WO_EQ)
34680 21 3d 30 20 26 26 20 70 4f 42 45 78 70 72 2d 3e  !=0 && pOBExpr->
34690 69 43 6f 6c 75 6d 6e 3e 3d 30 20 29 7b 0a 20 20  iColumn>=0 ){.  
346a0 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
346b0 20 2a 7a 31 2c 20 2a 7a 32 3b 0a 20 20 20 20 20   *z1, *z2;.     
346c0 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
346d0 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 57  e3ExprCollSeq(pW
346e0 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2c 20 70 4f  Info->pParse, pO
346f0 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78  rderBy->a[i].pEx
34700 70 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  pr);.        if(
34710 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20   !pColl ) pColl 
34720 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b  = db->pDfltColl;
34730 0a 20 20 20 20 20 20 20 20 7a 31 20 3d 20 70 43  .        z1 = pC
34740 6f 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20  oll->zName;.    
34750 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
34760 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
34770 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2c 20 70  WInfo->pParse, p
34780 54 65 72 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20  Term->pExpr);.  
34790 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c        if( !pColl
347a0 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70   ) pColl = db->p
347b0 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  DfltColl;.      
347c0 20 20 7a 32 20 3d 20 70 43 6f 6c 6c 2d 3e 7a 4e    z2 = pColl->zN
347d0 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ame;.        if(
347e0 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
347f0 7a 31 2c 20 7a 32 29 21 3d 30 20 29 20 63 6f 6e  z1, z2)!=0 ) con
34800 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20  tinue;.      }. 
34810 20 20 20 20 20 6f 62 53 61 74 20 7c 3d 20 4d 41       obSat |= MA
34820 53 4b 42 49 54 28 69 29 3b 0a 20 20 20 20 7d 0a  SKBIT(i);.    }.
34830 0a 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d  .    if( (pLoop-
34840 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
34850 5f 4f 4e 45 52 4f 57 29 3d 3d 30 20 29 7b 0a 20  _ONEROW)==0 ){. 
34860 20 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e       if( pLoop->
34870 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
34880 49 50 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70  IPK ){.        p
34890 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20 20 20  Index = 0;.     
348a0 20 20 20 6e 4b 65 79 43 6f 6c 20 3d 20 30 3b 0a     nKeyCol = 0;.
348b0 20 20 20 20 20 20 20 20 6e 43 6f 6c 75 6d 6e 20          nColumn 
348c0 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 1;.      }else
348d0 20 69 66 28 20 28 70 49 6e 64 65 78 20 3d 20 70   if( (pIndex = p
348e0 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49  Loop->u.btree.pI
348f0 6e 64 65 78 29 3d 3d 30 20 7c 7c 20 70 49 6e 64  ndex)==0 || pInd
34900 65 78 2d 3e 62 55 6e 6f 72 64 65 72 65 64 20 29  ex->bUnordered )
34910 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
34920 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   0;.      }else{
34930 0a 20 20 20 20 20 20 20 20 6e 4b 65 79 43 6f 6c  .        nKeyCol
34940 20 3d 20 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43   = pIndex->nKeyC
34950 6f 6c 3b 0a 20 20 20 20 20 20 20 20 6e 43 6f 6c  ol;.        nCol
34960 75 6d 6e 20 3d 20 70 49 6e 64 65 78 2d 3e 6e 43  umn = pIndex->nC
34970 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 61  olumn;.        a
34980 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d  ssert( nColumn==
34990 6e 4b 65 79 43 6f 6c 2b 31 20 7c 7c 20 21 48 61  nKeyCol+1 || !Ha
349a0 73 52 6f 77 69 64 28 70 49 6e 64 65 78 2d 3e 70  sRowid(pIndex->p
349b0 54 61 62 6c 65 29 20 29 3b 0a 20 20 20 20 20 20  Table) );.      
349c0 20 20 61 73 73 65 72 74 28 20 70 49 6e 64 65 78    assert( pIndex
349d0 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 43 6f 6c 75  ->aiColumn[nColu
349e0 6d 6e 2d 31 5d 3d 3d 28 2d 31 29 20 7c 7c 20 21  mn-1]==(-1) || !
349f0 48 61 73 52 6f 77 69 64 28 70 49 6e 64 65 78 2d  HasRowid(pIndex-
34a00 3e 70 54 61 62 6c 65 29 29 3b 0a 20 20 20 20 20  >pTable));.     
34a10 20 20 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e     isOrderDistin
34a20 63 74 20 3d 20 49 73 55 6e 69 71 75 65 49 6e 64  ct = IsUniqueInd
34a30 65 78 28 70 49 6e 64 65 78 29 3b 0a 20 20 20 20  ex(pIndex);.    
34a40 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 4c 6f    }..      /* Lo
34a50 6f 70 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 63  op through all c
34a60 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 69 6e  olumns of the in
34a70 64 65 78 20 61 6e 64 20 64 65 61 6c 20 77 69 74  dex and deal wit
34a80 68 20 74 68 65 20 6f 6e 65 73 0a 20 20 20 20 20  h the ones.     
34a90 20 2a 2a 20 74 68 61 74 20 61 72 65 20 6e 6f 74   ** that are not
34aa0 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 62 79 20   constrained by 
34ab0 3d 3d 20 6f 72 20 49 4e 2e 0a 20 20 20 20 20 20  == or IN..      
34ac0 2a 2f 0a 20 20 20 20 20 20 72 65 76 20 3d 20 72  */.      rev = r
34ad0 65 76 53 65 74 20 3d 20 30 3b 0a 20 20 20 20 20  evSet = 0;.     
34ae0 20 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73   distinctColumns
34af0 20 3d 20 30 3b 0a 20 20 20 20 20 20 66 6f 72 28   = 0;.      for(
34b00 6a 3d 30 3b 20 6a 3c 6e 43 6f 6c 75 6d 6e 3b 20  j=0; j<nColumn; 
34b10 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 75 38  j++){.        u8
34b20 20 62 4f 6e 63 65 3b 20 20 20 2f 2a 20 54 72 75   bOnce;   /* Tru
34b30 65 20 74 6f 20 72 75 6e 20 74 68 65 20 4f 52 44  e to run the ORD
34b40 45 52 20 42 59 20 73 65 61 72 63 68 20 6c 6f 6f  ER BY search loo
34b50 70 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 2f 2a  p */..        /*
34b60 20 53 6b 69 70 20 6f 76 65 72 20 3d 3d 20 61 6e   Skip over == an
34b70 64 20 49 53 20 4e 55 4c 4c 20 74 65 72 6d 73 20  d IS NULL terms 
34b80 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a  */.        if( j
34b90 3c 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e  <pLoop->u.btree.
34ba0 6e 45 71 0a 20 20 20 20 20 20 20 20 20 26 26 20  nEq.         && 
34bb0 70 4c 6f 6f 70 2d 3e 6e 53 6b 69 70 3d 3d 30 0a  pLoop->nSkip==0.
34bc0 20 20 20 20 20 20 20 20 20 26 26 20 28 28 69 20           && ((i 
34bd0 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b  = pLoop->aLTerm[
34be0 6a 5d 2d 3e 65 4f 70 65 72 61 74 6f 72 29 20 26  j]->eOperator) &
34bf0 20 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 4e 55 4c   (WO_EQ|WO_ISNUL
34c00 4c 29 29 21 3d 30 0a 20 20 20 20 20 20 20 20 29  L))!=0.        )
34c10 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
34c20 69 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 7b  i & WO_ISNULL ){
34c30 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73  .            tes
34c40 74 63 61 73 65 28 20 69 73 4f 72 64 65 72 44 69  tcase( isOrderDi
34c50 73 74 69 6e 63 74 20 29 3b 0a 20 20 20 20 20 20  stinct );.      
34c60 20 20 20 20 20 20 69 73 4f 72 64 65 72 44 69 73        isOrderDis
34c70 74 69 6e 63 74 20 3d 20 30 3b 0a 20 20 20 20 20  tinct = 0;.     
34c80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
34c90 20 63 6f 6e 74 69 6e 75 65 3b 20 20 0a 20 20 20   continue;  .   
34ca0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
34cb0 2f 2a 20 47 65 74 20 74 68 65 20 63 6f 6c 75 6d  /* Get the colum
34cc0 6e 20 6e 75 6d 62 65 72 20 69 6e 20 74 68 65 20  n number in the 
34cd0 74 61 62 6c 65 20 28 69 43 6f 6c 75 6d 6e 29 20  table (iColumn) 
34ce0 61 6e 64 20 73 6f 72 74 20 6f 72 64 65 72 0a 20  and sort order. 
34cf0 20 20 20 20 20 20 20 2a 2a 20 28 72 65 76 49 64         ** (revId
34d00 78 29 20 66 6f 72 20 74 68 65 20 6a 2d 74 68 20  x) for the j-th 
34d10 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e  column of the in
34d20 64 65 78 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  dex..        */.
34d30 20 20 20 20 20 20 20 20 69 66 28 20 70 49 6e 64          if( pInd
34d40 65 78 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ex ){.          
34d50 69 43 6f 6c 75 6d 6e 20 3d 20 70 49 6e 64 65 78  iColumn = pIndex
34d60 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20  ->aiColumn[j];. 
34d70 20 20 20 20 20 20 20 20 20 72 65 76 49 64 78 20           revIdx 
34d80 3d 20 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f  = pIndex->aSortO
34d90 72 64 65 72 5b 6a 5d 3b 0a 20 20 20 20 20 20 20  rder[j];.       
34da0 20 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3d 3d     if( iColumn==
34db0 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e  pIndex->pTable->
34dc0 69 50 4b 65 79 20 29 20 69 43 6f 6c 75 6d 6e 20  iPKey ) iColumn 
34dd0 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 65  = -1;.        }e
34de0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69  lse{.          i
34df0 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20  Column = -1;.   
34e00 20 20 20 20 20 20 20 72 65 76 49 64 78 20 3d 20         revIdx = 
34e10 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  0;.        }..  
34e20 20 20 20 20 20 20 2f 2a 20 41 6e 20 75 6e 63 6f        /* An unco
34e30 6e 73 74 72 61 69 6e 65 64 20 63 6f 6c 75 6d 6e  nstrained column
34e40 20 74 68 61 74 20 6d 69 67 68 74 20 62 65 20 4e   that might be N
34e50 55 4c 4c 20 6d 65 61 6e 73 20 74 68 61 74 20 74  ULL means that t
34e60 68 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 57  his.        ** W
34e70 68 65 72 65 4c 6f 6f 70 20 69 73 20 6e 6f 74 20  hereLoop is not 
34e80 77 65 6c 6c 2d 6f 72 64 65 72 65 64 0a 20 20 20  well-ordered.   
34e90 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
34ea0 69 66 28 20 69 73 4f 72 64 65 72 44 69 73 74 69  if( isOrderDisti
34eb0 6e 63 74 0a 20 20 20 20 20 20 20 20 20 26 26 20  nct.         && 
34ec0 69 43 6f 6c 75 6d 6e 3e 3d 30 0a 20 20 20 20 20  iColumn>=0.     
34ed0 20 20 20 20 26 26 20 6a 3e 3d 70 4c 6f 6f 70 2d      && j>=pLoop-
34ee0 3e 75 2e 62 74 72 65 65 2e 6e 45 71 0a 20 20 20  >u.btree.nEq.   
34ef0 20 20 20 20 20 20 26 26 20 70 49 6e 64 65 78 2d        && pIndex-
34f00 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43  >pTable->aCol[iC
34f10 6f 6c 75 6d 6e 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d  olumn].notNull==
34f20 30 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20  0.        ){.   
34f30 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 44 69         isOrderDi
34f40 73 74 69 6e 63 74 20 3d 20 30 3b 0a 20 20 20 20  stinct = 0;.    
34f50 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f      }..        /
34f60 2a 20 46 69 6e 64 20 74 68 65 20 4f 52 44 45 52  * Find the ORDER
34f70 20 42 59 20 74 65 72 6d 20 74 68 61 74 20 63 6f   BY term that co
34f80 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 74 68 65  rresponds to the
34f90 20 6a 2d 74 68 20 63 6f 6c 75 6d 6e 0a 20 20 20   j-th column.   
34fa0 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 69       ** of the i
34fb0 6e 64 65 78 20 61 6e 64 20 6d 61 72 6b 20 74 68  ndex and mark th
34fc0 61 74 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d  at ORDER BY term
34fd0 20 6f 66 66 20 0a 20 20 20 20 20 20 20 20 2a 2f   off .        */
34fe0 0a 20 20 20 20 20 20 20 20 62 4f 6e 63 65 20 3d  .        bOnce =
34ff0 20 31 3b 0a 20 20 20 20 20 20 20 20 69 73 4d 61   1;.        isMa
35000 74 63 68 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  tch = 0;.       
35010 20 66 6f 72 28 69 3d 30 3b 20 62 4f 6e 63 65 20   for(i=0; bOnce 
35020 26 26 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69  && i<nOrderBy; i
35030 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
35040 66 28 20 4d 41 53 4b 42 49 54 28 69 29 20 26 20  f( MASKBIT(i) & 
35050 6f 62 53 61 74 20 29 20 63 6f 6e 74 69 6e 75 65  obSat ) continue
35060 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 42 45  ;.          pOBE
35070 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
35080 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4f 72  rSkipCollate(pOr
35090 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70  derBy->a[i].pExp
350a0 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65  r);.          te
350b0 73 74 63 61 73 65 28 20 77 63 74 72 6c 46 6c 61  stcase( wctrlFla
350c0 67 73 20 26 20 57 48 45 52 45 5f 47 52 4f 55 50  gs & WHERE_GROUP
350d0 42 59 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  BY );.          
350e0 74 65 73 74 63 61 73 65 28 20 77 63 74 72 6c 46  testcase( wctrlF
350f0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 44 49 53  lags & WHERE_DIS
35100 54 49 4e 43 54 42 59 20 29 3b 0a 20 20 20 20 20  TINCTBY );.     
35110 20 20 20 20 20 69 66 28 20 28 77 63 74 72 6c 46       if( (wctrlF
35120 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 47 52  lags & (WHERE_GR
35130 4f 55 50 42 59 7c 57 48 45 52 45 5f 44 49 53 54  OUPBY|WHERE_DIST
35140 49 4e 43 54 42 59 29 29 3d 3d 30 20 29 20 62 4f  INCTBY))==0 ) bO
35150 6e 63 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  nce = 0;.       
35160 20 20 20 69 66 28 20 70 4f 42 45 78 70 72 2d 3e     if( pOBExpr->
35170 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20  op!=TK_COLUMN ) 
35180 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
35190 20 20 20 20 69 66 28 20 70 4f 42 45 78 70 72 2d      if( pOBExpr-
351a0 3e 69 54 61 62 6c 65 21 3d 69 43 75 72 20 29 20  >iTable!=iCur ) 
351b0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
351c0 20 20 20 20 69 66 28 20 70 4f 42 45 78 70 72 2d      if( pOBExpr-
351d0 3e 69 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 75 6d  >iColumn!=iColum
351e0 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  n ) continue;.  
351f0 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c          if( iCol
35200 75 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  umn>=0 ){.      
35210 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71        pColl = sq
35220 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
35230 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2c  (pWInfo->pParse,
35240 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
35250 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
35260 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29      if( !pColl )
35270 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66   pColl = db->pDf
35280 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20  ltColl;.        
35290 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
352a0 74 72 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e  trICmp(pColl->zN
352b0 61 6d 65 2c 20 70 49 6e 64 65 78 2d 3e 61 7a 43  ame, pIndex->azC
352c0 6f 6c 6c 5b 6a 5d 29 21 3d 30 20 29 20 63 6f 6e  oll[j])!=0 ) con
352d0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
352e0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 73 4d   }.          isM
352f0 61 74 63 68 20 3d 20 31 3b 0a 20 20 20 20 20 20  atch = 1;.      
35300 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
35310 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
35320 20 69 73 4d 61 74 63 68 20 26 26 20 28 77 63 74   isMatch && (wct
35330 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
35340 47 52 4f 55 50 42 59 29 3d 3d 30 20 29 7b 0a 20  GROUPBY)==0 ){. 
35350 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65           /* Make
35360 20 73 75 72 65 20 74 68 65 20 73 6f 72 74 20 6f   sure the sort o
35370 72 64 65 72 20 69 73 20 63 6f 6d 70 61 74 69 62  rder is compatib
35380 6c 65 20 69 6e 20 61 6e 20 4f 52 44 45 52 20 42  le in an ORDER B
35390 59 20 63 6c 61 75 73 65 2e 0a 20 20 20 20 20 20  Y clause..      
353a0 20 20 20 20 2a 2a 20 53 6f 72 74 20 6f 72 64 65      ** Sort orde
353b0 72 20 69 73 20 69 72 72 65 6c 65 76 61 6e 74 20  r is irrelevant 
353c0 66 6f 72 20 61 20 47 52 4f 55 50 20 42 59 20 63  for a GROUP BY c
353d0 6c 61 75 73 65 2e 20 2a 2f 0a 20 20 20 20 20 20  lause. */.      
353e0 20 20 20 20 69 66 28 20 72 65 76 53 65 74 20 29      if( revSet )
353f0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  {.            if
35400 28 20 28 72 65 76 20 5e 20 72 65 76 49 64 78 29  ( (rev ^ revIdx)
35410 21 3d 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  !=pOrderBy->a[i]
35420 2e 73 6f 72 74 4f 72 64 65 72 20 29 20 69 73 4d  .sortOrder ) isM
35430 61 74 63 68 20 3d 20 30 3b 0a 20 20 20 20 20 20  atch = 0;.      
35440 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
35450 20 20 20 20 20 20 20 72 65 76 20 3d 20 72 65 76         rev = rev
35460 49 64 78 20 5e 20 70 4f 72 64 65 72 42 79 2d 3e  Idx ^ pOrderBy->
35470 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a  a[i].sortOrder;.
35480 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
35490 72 65 76 20 29 20 2a 70 52 65 76 4d 61 73 6b 20  rev ) *pRevMask 
354a0 7c 3d 20 4d 41 53 4b 42 49 54 28 69 4c 6f 6f 70  |= MASKBIT(iLoop
354b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  );.            r
354c0 65 76 53 65 74 20 3d 20 31 3b 0a 20 20 20 20 20  evSet = 1;.     
354d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
354e0 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 73 4d  .        if( isM
354f0 61 74 63 68 20 29 7b 0a 20 20 20 20 20 20 20 20  atch ){.        
35500 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3c 30 20    if( iColumn<0 
35510 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  ){.            t
35520 65 73 74 63 61 73 65 28 20 64 69 73 74 69 6e 63  estcase( distinc
35530 74 43 6f 6c 75 6d 6e 73 3d 3d 30 20 29 3b 0a 20  tColumns==0 );. 
35540 20 20 20 20 20 20 20 20 20 20 20 64 69 73 74 69             disti
35550 6e 63 74 43 6f 6c 75 6d 6e 73 20 3d 20 31 3b 0a  nctColumns = 1;.
35560 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
35570 20 20 20 20 20 20 6f 62 53 61 74 20 7c 3d 20 4d        obSat |= M
35580 41 53 4b 42 49 54 28 69 29 3b 0a 20 20 20 20 20  ASKBIT(i);.     
35590 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
355a0 20 20 20 20 2f 2a 20 4e 6f 20 6d 61 74 63 68 20      /* No match 
355b0 66 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 20  found */.       
355c0 20 20 20 69 66 28 20 6a 3d 3d 30 20 7c 7c 20 6a     if( j==0 || j
355d0 3c 6e 4b 65 79 43 6f 6c 20 29 7b 0a 20 20 20 20  <nKeyCol ){.    
355e0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
355f0 28 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63  ( isOrderDistinc
35600 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  t!=0 );.        
35610 20 20 20 20 69 73 4f 72 64 65 72 44 69 73 74 69      isOrderDisti
35620 6e 63 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  nct = 0;.       
35630 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 62     }.          b
35640 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
35650 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64 20 4c        } /* end L
35660 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20 69 6e 64  oop over all ind
35670 65 78 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20  ex columns */.  
35680 20 20 20 20 69 66 28 20 64 69 73 74 69 6e 63 74      if( distinct
35690 43 6f 6c 75 6d 6e 73 20 29 7b 0a 20 20 20 20 20  Columns ){.     
356a0 20 20 20 74 65 73 74 63 61 73 65 28 20 69 73 4f     testcase( isO
356b0 72 64 65 72 44 69 73 74 69 6e 63 74 3d 3d 30 20  rderDistinct==0 
356c0 29 3b 0a 20 20 20 20 20 20 20 20 69 73 4f 72 64  );.        isOrd
356d0 65 72 44 69 73 74 69 6e 63 74 20 3d 20 31 3b 0a  erDistinct = 1;.
356e0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 2f 2a        }.    } /*
356f0 20 65 6e 64 2d 69 66 20 6e 6f 74 20 6f 6e 65 2d   end-if not one-
35700 72 6f 77 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4d  row */..    /* M
35710 61 72 6b 20 6f 66 66 20 61 6e 79 20 6f 74 68 65  ark off any othe
35720 72 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73  r ORDER BY terms
35730 20 74 68 61 74 20 72 65 66 65 72 65 6e 63 65 20   that reference 
35740 70 4c 6f 6f 70 20 2a 2f 0a 20 20 20 20 69 66 28  pLoop */.    if(
35750 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74   isOrderDistinct
35760 20 29 7b 0a 20 20 20 20 20 20 6f 72 64 65 72 44   ){.      orderD
35770 69 73 74 69 6e 63 74 4d 61 73 6b 20 7c 3d 20 70  istinctMask |= p
35780 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a  Loop->maskSelf;.
35790 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
357a0 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b  <nOrderBy; i++){
357b0 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70  .        Expr *p
357c0 3b 0a 20 20 20 20 20 20 20 20 42 69 74 6d 61 73  ;.        Bitmas
357d0 6b 20 6d 54 65 72 6d 3b 0a 20 20 20 20 20 20 20  k mTerm;.       
357e0 20 69 66 28 20 4d 41 53 4b 42 49 54 28 69 29 20   if( MASKBIT(i) 
357f0 26 20 6f 62 53 61 74 20 29 20 63 6f 6e 74 69 6e  & obSat ) contin
35800 75 65 3b 0a 20 20 20 20 20 20 20 20 70 20 3d 20  ue;.        p = 
35810 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70  pOrderBy->a[i].p
35820 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 6d 54  Expr;.        mT
35830 65 72 6d 20 3d 20 65 78 70 72 54 61 62 6c 65 55  erm = exprTableU
35840 73 61 67 65 28 26 70 57 49 6e 66 6f 2d 3e 73 4d  sage(&pWInfo->sM
35850 61 73 6b 53 65 74 2c 70 29 3b 0a 20 20 20 20 20  askSet,p);.     
35860 20 20 20 69 66 28 20 6d 54 65 72 6d 3d 3d 30 20     if( mTerm==0 
35870 26 26 20 21 73 71 6c 69 74 65 33 45 78 70 72 49  && !sqlite3ExprI
35880 73 43 6f 6e 73 74 61 6e 74 28 70 29 20 29 20 63  sConstant(p) ) c
35890 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
358a0 20 69 66 28 20 28 6d 54 65 72 6d 26 7e 6f 72 64   if( (mTerm&~ord
358b0 65 72 44 69 73 74 69 6e 63 74 4d 61 73 6b 29 3d  erDistinctMask)=
358c0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
358d0 6f 62 53 61 74 20 7c 3d 20 4d 41 53 4b 42 49 54  obSat |= MASKBIT
358e0 28 69 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  (i);.        }. 
358f0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
35900 20 2f 2a 20 45 6e 64 20 74 68 65 20 6c 6f 6f 70   /* End the loop
35910 20 6f 76 65 72 20 61 6c 6c 20 57 68 65 72 65 4c   over all WhereL
35920 6f 6f 70 73 20 66 72 6f 6d 20 6f 75 74 65 72 2d  oops from outer-
35930 6d 6f 73 74 20 64 6f 77 6e 20 74 6f 20 69 6e 6e  most down to inn
35940 65 72 2d 6d 6f 73 74 20 2a 2f 0a 20 20 69 66 28  er-most */.  if(
35950 20 6f 62 53 61 74 3d 3d 6f 62 44 6f 6e 65 20 29   obSat==obDone )
35960 20 72 65 74 75 72 6e 20 28 69 38 29 6e 4f 72 64   return (i8)nOrd
35970 65 72 42 79 3b 0a 20 20 69 66 28 20 21 69 73 4f  erBy;.  if( !isO
35980 72 64 65 72 44 69 73 74 69 6e 63 74 20 29 7b 0a  rderDistinct ){.
35990 20 20 20 20 66 6f 72 28 69 3d 6e 4f 72 64 65 72      for(i=nOrder
359a0 42 79 2d 31 3b 20 69 3e 30 3b 20 69 2d 2d 29 7b  By-1; i>0; i--){
359b0 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d  .      Bitmask m
359c0 20 3d 20 4d 41 53 4b 42 49 54 28 69 29 20 2d 20   = MASKBIT(i) - 
359d0 31 3b 0a 20 20 20 20 20 20 69 66 28 20 28 6f 62  1;.      if( (ob
359e0 53 61 74 26 6d 29 3d 3d 6d 20 29 20 72 65 74 75  Sat&m)==m ) retu
359f0 72 6e 20 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn i;.    }.    
35a00 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
35a10 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 0a 2f  return -1;.}.../
35a20 2a 0a 2a 2a 20 49 66 20 74 68 65 20 57 48 45 52  *.** If the WHER
35a30 45 5f 47 52 4f 55 50 42 59 20 66 6c 61 67 20 69  E_GROUPBY flag i
35a40 73 20 73 65 74 20 69 6e 20 74 68 65 20 6d 61 73  s set in the mas
35a50 6b 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c 69  k passed to sqli
35a60 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 2c  te3WhereBegin(),
35a70 0a 2a 2a 20 74 68 65 20 70 6c 61 6e 6e 65 72 20  .** the planner 
35a80 61 73 73 75 6d 65 73 20 74 68 61 74 20 74 68 65  assumes that the
35a90 20 73 70 65 63 69 66 69 65 64 20 70 4f 72 64 65   specified pOrde
35aa0 72 42 79 20 6c 69 73 74 20 69 73 20 61 63 74 75  rBy list is actu
35ab0 61 6c 6c 79 20 61 20 47 52 4f 55 50 0a 2a 2a 20  ally a GROUP.** 
35ac0 42 59 20 63 6c 61 75 73 65 20 2d 20 61 6e 64 20  BY clause - and 
35ad0 73 6f 20 61 6e 79 20 6f 72 64 65 72 20 74 68 61  so any order tha
35ae0 74 20 67 72 6f 75 70 73 20 72 6f 77 73 20 61 73  t groups rows as
35af0 20 72 65 71 75 69 72 65 64 20 73 61 74 69 73 66   required satisf
35b00 69 65 73 20 74 68 65 0a 2a 2a 20 72 65 71 75 65  ies the.** reque
35b10 73 74 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c  st..**.** Normal
35b20 6c 79 2c 20 69 6e 20 74 68 69 73 20 63 61 73 65  ly, in this case
35b30 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69   it is not possi
35b40 62 6c 65 20 66 6f 72 20 74 68 65 20 63 61 6c 6c  ble for the call
35b50 65 72 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 0a  er to determine.
35b60 2a 2a 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ** whether or no
35b70 74 20 74 68 65 20 72 6f 77 73 20 61 72 65 20 72  t the rows are r
35b80 65 61 6c 6c 79 20 62 65 69 6e 67 20 64 65 6c 69  eally being deli
35b90 76 65 72 65 64 20 69 6e 20 73 6f 72 74 65 64 20  vered in sorted 
35ba0 6f 72 64 65 72 2c 20 6f 72 0a 2a 2a 20 6a 75 73  order, or.** jus
35bb0 74 20 69 6e 20 73 6f 6d 65 20 6f 74 68 65 72 20  t in some other 
35bc0 6f 72 64 65 72 20 74 68 61 74 20 70 72 6f 76 69  order that provi
35bd0 64 65 73 20 74 68 65 20 72 65 71 75 69 72 65 64  des the required
35be0 20 67 72 6f 75 70 69 6e 67 2e 20 48 6f 77 65 76   grouping. Howev
35bf0 65 72 2c 0a 2a 2a 20 69 66 20 74 68 65 20 57 48  er,.** if the WH
35c00 45 52 45 5f 53 4f 52 54 42 59 47 52 4f 55 50 20  ERE_SORTBYGROUP 
35c10 66 6c 61 67 20 69 73 20 61 6c 73 6f 20 70 61 73  flag is also pas
35c20 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33 57 68  sed to sqlite3Wh
35c30 65 72 65 42 65 67 69 6e 28 29 2c 20 74 68 65 6e  ereBegin(), then
35c40 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f  .** this functio
35c50 6e 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20  n may be called 
35c60 6f 6e 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  on the returned 
35c70 57 68 65 72 65 49 6e 66 6f 20 6f 62 6a 65 63 74  WhereInfo object
35c80 2e 20 49 74 20 72 65 74 75 72 6e 73 0a 2a 2a 20  . It returns.** 
35c90 74 72 75 65 20 69 66 20 74 68 65 20 72 6f 77 73  true if the rows
35ca0 20 72 65 61 6c 6c 79 20 77 69 6c 6c 20 62 65 20   really will be 
35cb0 73 6f 72 74 65 64 20 69 6e 20 74 68 65 20 73 70  sorted in the sp
35cc0 65 63 69 66 69 65 64 20 6f 72 64 65 72 2c 20 6f  ecified order, o
35cd0 72 20 66 61 6c 73 65 0a 2a 2a 20 6f 74 68 65 72  r false.** other
35ce0 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  wise..**.** For 
35cf0 65 78 61 6d 70 6c 65 2c 20 61 73 73 75 6d 69 6e  example, assumin
35d00 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 43 52 45 41 54  g:.**.**   CREAT
35d10 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31  E INDEX i1 ON t1
35d20 28 78 2c 20 59 29 3b 0a 2a 2a 0a 2a 2a 20 74 68  (x, Y);.**.** th
35d30 65 6e 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43  en.**.**   SELEC
35d40 54 20 2a 20 46 52 4f 4d 20 74 31 20 47 52 4f 55  T * FROM t1 GROU
35d50 50 20 42 59 20 78 2c 79 20 4f 52 44 45 52 20 42  P BY x,y ORDER B
35d60 59 20 78 2c 79 3b 20 20 20 2d 2d 20 49 73 53 6f  Y x,y;   -- IsSo
35d70 72 74 65 64 28 29 3d 3d 31 0a 2a 2a 20 20 20 53  rted()==1.**   S
35d80 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
35d90 47 52 4f 55 50 20 42 59 20 79 2c 78 20 4f 52 44  GROUP BY y,x ORD
35da0 45 52 20 42 59 20 79 2c 78 3b 20 20 20 2d 2d 20  ER BY y,x;   -- 
35db0 49 73 53 6f 72 74 65 64 28 29 3d 3d 30 0a 2a 2f  IsSorted()==0.*/
35dc0 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65 72  .int sqlite3Wher
35dd0 65 49 73 53 6f 72 74 65 64 28 57 68 65 72 65 49  eIsSorted(WhereI
35de0 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20  nfo *pWInfo){.  
35df0 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e  assert( pWInfo->
35e00 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
35e10 52 45 5f 47 52 4f 55 50 42 59 20 29 3b 0a 20 20  RE_GROUPBY );.  
35e20 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e  assert( pWInfo->
35e30 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
35e40 52 45 5f 53 4f 52 54 42 59 47 52 4f 55 50 20 29  RE_SORTBYGROUP )
35e50 3b 0a 20 20 72 65 74 75 72 6e 20 70 57 49 6e 66  ;.  return pWInf
35e60 6f 2d 3e 73 6f 72 74 65 64 3b 0a 7d 0a 0a 23 69  o->sorted;.}..#i
35e70 66 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f  fdef WHERETRACE_
35e80 45 4e 41 42 4c 45 44 0a 2f 2a 20 46 6f 72 20 64  ENABLED./* For d
35e90 65 62 75 67 67 69 6e 67 20 75 73 65 20 6f 6e 6c  ebugging use onl
35ea0 79 3a 20 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  y: */.static con
35eb0 73 74 20 63 68 61 72 20 2a 77 68 65 72 65 50 61  st char *wherePa
35ec0 74 68 4e 61 6d 65 28 57 68 65 72 65 50 61 74 68  thName(WherePath
35ed0 20 2a 70 50 61 74 68 2c 20 69 6e 74 20 6e 4c 6f   *pPath, int nLo
35ee0 6f 70 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  op, WhereLoop *p
35ef0 4c 61 73 74 29 7b 0a 20 20 73 74 61 74 69 63 20  Last){.  static 
35f00 63 68 61 72 20 7a 4e 61 6d 65 5b 36 35 5d 3b 0a  char zName[65];.
35f10 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
35f20 3d 30 3b 20 69 3c 6e 4c 6f 6f 70 3b 20 69 2b 2b  =0; i<nLoop; i++
35f30 29 7b 20 7a 4e 61 6d 65 5b 69 5d 20 3d 20 70 50  ){ zName[i] = pP
35f40 61 74 68 2d 3e 61 4c 6f 6f 70 5b 69 5d 2d 3e 63  ath->aLoop[i]->c
35f50 49 64 3b 20 7d 0a 20 20 69 66 28 20 70 4c 61 73  Id; }.  if( pLas
35f60 74 20 29 20 7a 4e 61 6d 65 5b 69 2b 2b 5d 20 3d  t ) zName[i++] =
35f70 20 70 4c 61 73 74 2d 3e 63 49 64 3b 0a 20 20 7a   pLast->cId;.  z
35f80 4e 61 6d 65 5b 69 5d 20 3d 20 30 3b 0a 20 20 72  Name[i] = 0;.  r
35f90 65 74 75 72 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a 23  eturn zName;.}.#
35fa0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  endif../*.** Ret
35fb0 75 72 6e 20 74 68 65 20 63 6f 73 74 20 6f 66 20  urn the cost of 
35fc0 73 6f 72 74 69 6e 67 20 6e 52 6f 77 20 72 6f 77  sorting nRow row
35fd0 73 2c 20 61 73 73 75 6d 69 6e 67 20 74 68 61 74  s, assuming that
35fe0 20 74 68 65 20 6b 65 79 73 20 68 61 76 65 20 0a   the keys have .
35ff0 2a 2a 20 6e 4f 72 64 65 72 62 79 20 63 6f 6c 75  ** nOrderby colu
36000 6d 6e 73 20 61 6e 64 20 74 68 61 74 20 74 68 65  mns and that the
36010 20 66 69 72 73 74 20 6e 53 6f 72 74 65 64 20 63   first nSorted c
36020 6f 6c 75 6d 6e 73 20 61 72 65 20 61 6c 72 65 61  olumns are alrea
36030 64 79 20 69 6e 0a 2a 2a 20 6f 72 64 65 72 2e 0a  dy in.** order..
36040 2a 2f 0a 73 74 61 74 69 63 20 4c 6f 67 45 73 74  */.static LogEst
36050 20 77 68 65 72 65 53 6f 72 74 69 6e 67 43 6f 73   whereSortingCos
36060 74 28 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  t(.  WhereInfo *
36070 70 57 49 6e 66 6f 2c 0a 20 20 4c 6f 67 45 73 74  pWInfo,.  LogEst
36080 20 6e 52 6f 77 2c 0a 20 20 69 6e 74 20 6e 4f 72   nRow,.  int nOr
36090 64 65 72 42 79 2c 0a 20 20 69 6e 74 20 6e 53 6f  derBy,.  int nSo
360a0 72 74 65 64 0a 29 7b 0a 20 20 2f 2a 20 54 55 4e  rted.){.  /* TUN
360b0 49 4e 47 3a 20 45 73 74 69 6d 61 74 65 64 20 63  ING: Estimated c
360c0 6f 73 74 20 6f 66 20 61 20 66 75 6c 6c 20 65 78  ost of a full ex
360d0 74 65 72 6e 61 6c 20 73 6f 72 74 2c 20 77 68 65  ternal sort, whe
360e0 72 65 20 4e 20 69 73 20 0a 20 20 2a 2a 20 74 68  re N is .  ** th
360f0 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
36100 20 74 6f 20 73 6f 72 74 20 69 73 3a 0a 20 20 2a   to sort is:.  *
36110 2a 0a 20 20 2a 2a 20 20 20 63 6f 73 74 20 3d 20  *.  **   cost = 
36120 28 33 2e 30 20 2a 20 4e 20 2a 20 6c 6f 67 28 4e  (3.0 * N * log(N
36130 29 29 2e 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 4f  ))..  ** .  ** O
36140 72 2c 20 69 66 20 74 68 65 20 6f 72 64 65 72 2d  r, if the order-
36150 62 79 20 63 6c 61 75 73 65 20 68 61 73 20 58 20  by clause has X 
36160 74 65 72 6d 73 20 62 75 74 20 6f 6e 6c 79 20 74  terms but only t
36170 68 65 20 6c 61 73 74 20 59 20 0a 20 20 2a 2a 20  he last Y .  ** 
36180 74 65 72 6d 73 20 61 72 65 20 6f 75 74 20 6f 66  terms are out of
36190 20 6f 72 64 65 72 2c 20 74 68 65 6e 20 62 6c 6f   order, then blo
361a0 63 6b 2d 73 6f 72 74 69 6e 67 20 77 69 6c 6c 20  ck-sorting will 
361b0 72 65 64 75 63 65 20 74 68 65 20 0a 20 20 2a 2a  reduce the .  **
361c0 20 73 6f 72 74 69 6e 67 20 63 6f 73 74 20 74 6f   sorting cost to
361d0 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 63 6f  :.  **.  **   co
361e0 73 74 20 3d 20 28 33 2e 30 20 2a 20 4e 20 2a 20  st = (3.0 * N * 
361f0 6c 6f 67 28 4e 29 29 20 2a 20 28 59 2f 58 29 0a  log(N)) * (Y/X).
36200 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 28 59    **.  ** The (Y
36210 2f 58 29 20 74 65 72 6d 20 69 73 20 69 6d 70 6c  /X) term is impl
36220 65 6d 65 6e 74 65 64 20 75 73 69 6e 67 20 73 74  emented using st
36230 61 63 6b 20 76 61 72 69 61 62 6c 65 20 72 53 63  ack variable rSc
36240 61 6c 65 0a 20 20 2a 2a 20 62 65 6c 6f 77 2e 20  ale.  ** below. 
36250 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 72 53 63   */.  LogEst rSc
36260 61 6c 65 2c 20 72 53 6f 72 74 43 6f 73 74 3b 0a  ale, rSortCost;.
36270 20 20 61 73 73 65 72 74 28 20 6e 4f 72 64 65 72    assert( nOrder
36280 42 79 3e 30 20 26 26 20 36 36 3d 3d 73 71 6c 69  By>0 && 66==sqli
36290 74 65 33 4c 6f 67 45 73 74 28 31 30 30 29 20 29  te3LogEst(100) )
362a0 3b 0a 20 20 72 53 63 61 6c 65 20 3d 20 73 71 6c  ;.  rScale = sql
362b0 69 74 65 33 4c 6f 67 45 73 74 28 28 6e 4f 72 64  ite3LogEst((nOrd
362c0 65 72 42 79 2d 6e 53 6f 72 74 65 64 29 2a 31 30  erBy-nSorted)*10
362d0 30 2f 6e 4f 72 64 65 72 42 79 29 20 2d 20 36 36  0/nOrderBy) - 66
362e0 3b 0a 20 20 72 53 6f 72 74 43 6f 73 74 20 3d 20  ;.  rSortCost = 
362f0 6e 52 6f 77 20 2b 20 65 73 74 4c 6f 67 28 6e 52  nRow + estLog(nR
36300 6f 77 29 20 2b 20 72 53 63 61 6c 65 20 2b 20 31  ow) + rScale + 1
36310 36 3b 0a 0a 20 20 2f 2a 20 54 55 4e 49 4e 47 3a  6;..  /* TUNING:
36320 20 54 68 65 20 63 6f 73 74 20 6f 66 20 69 6d 70   The cost of imp
36330 6c 65 6d 65 6e 74 69 6e 67 20 44 49 53 54 49 4e  lementing DISTIN
36340 43 54 20 75 73 69 6e 67 20 61 20 42 2d 54 52 45  CT using a B-TRE
36350 45 20 69 73 0a 20 20 2a 2a 20 73 69 6d 69 6c 61  E is.  ** simila
36360 72 20 62 75 74 20 77 69 74 68 20 61 20 6c 61 72  r but with a lar
36370 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 6f 66 20  ger constant of 
36380 70 72 6f 70 6f 72 74 69 6f 6e 61 6c 69 74 79 2e  proportionality.
36390 20 0a 20 20 2a 2a 20 4d 75 6c 74 69 70 6c 79 20   .  ** Multiply 
363a0 62 79 20 61 6e 20 61 64 64 69 74 69 6f 6e 61 6c  by an additional
363b0 20 66 61 63 74 6f 72 20 6f 66 20 33 2e 30 2e 20   factor of 3.0. 
363c0 20 2a 2f 0a 20 20 69 66 28 20 70 57 49 6e 66 6f   */.  if( pWInfo
363d0 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ->wctrlFlags & W
363e0 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e  HERE_WANT_DISTIN
363f0 43 54 20 29 7b 0a 20 20 20 20 72 53 6f 72 74 43  CT ){.    rSortC
36400 6f 73 74 20 2b 3d 20 31 36 3b 0a 20 20 7d 0a 0a  ost += 16;.  }..
36410 20 20 72 65 74 75 72 6e 20 72 53 6f 72 74 43 6f    return rSortCo
36420 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76  st;.}../*.** Giv
36430 65 6e 20 74 68 65 20 6c 69 73 74 20 6f 66 20 57  en the list of W
36440 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73  hereLoop objects
36450 20 61 74 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f   at pWInfo->pLoo
36460 70 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ps, this routine
36470 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 74 6f 20  .** attempts to 
36480 66 69 6e 64 20 74 68 65 20 6c 6f 77 65 73 74 20  find the lowest 
36490 63 6f 73 74 20 70 61 74 68 20 74 68 61 74 20 76  cost path that v
364a0 69 73 69 74 73 20 65 61 63 68 20 57 68 65 72 65  isits each Where
364b0 4c 6f 6f 70 0a 2a 2a 20 6f 6e 63 65 2e 20 20 54  Loop.** once.  T
364c0 68 69 73 20 70 61 74 68 20 69 73 20 74 68 65 6e  his path is then
364d0 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20 74 68 65   loaded into the
364e0 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 70 57 4c   pWInfo->a[].pWL
364f0 6f 6f 70 20 66 69 65 6c 64 73 2e 0a 2a 2a 0a 2a  oop fields..**.*
36500 2a 20 41 73 73 75 6d 65 20 74 68 61 74 20 74 68  * Assume that th
36510 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
36520 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20 74 68  f output rows th
36530 61 74 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20  at will need to 
36540 62 65 20 73 6f 72 74 65 64 0a 2a 2a 20 77 69 6c  be sorted.** wil
36550 6c 20 62 65 20 6e 52 6f 77 45 73 74 20 28 69 6e  l be nRowEst (in
36560 20 74 68 65 20 31 30 2a 6c 6f 67 32 20 72 65 70   the 10*log2 rep
36570 72 65 73 65 6e 74 61 74 69 6f 6e 29 2e 20 20 4f  resentation).  O
36580 72 2c 20 69 67 6e 6f 72 65 20 73 6f 72 74 69 6e  r, ignore sortin
36590 67 0a 2a 2a 20 63 6f 73 74 73 20 69 66 20 6e 52  g.** costs if nR
365a0 6f 77 45 73 74 3d 3d 30 2e 0a 2a 2a 0a 2a 2a 20  owEst==0..**.** 
365b0 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
365c0 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 53   on success or S
365d0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6f 66 20 61  QLITE_NOMEM of a
365e0 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
365f0 6f 6e 0a 2a 2a 20 65 72 72 6f 72 20 6f 63 63 75  on.** error occu
36600 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  rs..*/.static in
36610 74 20 77 68 65 72 65 50 61 74 68 53 6f 6c 76 65  t wherePathSolve
36620 72 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49  r(WhereInfo *pWI
36630 6e 66 6f 2c 20 4c 6f 67 45 73 74 20 6e 52 6f 77  nfo, LogEst nRow
36640 45 73 74 29 7b 0a 20 20 69 6e 74 20 6d 78 43 68  Est){.  int mxCh
36650 6f 69 63 65 3b 20 20 20 20 20 20 20 20 20 20 20  oice;           
36660 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d    /* Maximum num
36670 62 65 72 20 6f 66 20 73 69 6d 75 6c 74 61 6e 65  ber of simultane
36680 6f 75 73 20 70 61 74 68 73 20 74 72 61 63 6b 65  ous paths tracke
36690 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f 6f 70  d */.  int nLoop
366a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
366b0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 65   /* Number of te
366c0 72 6d 73 20 69 6e 20 74 68 65 20 6a 6f 69 6e 20  rms in the join 
366d0 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  */.  Parse *pPar
366e0 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  se;            /
366f0 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
36700 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  t */.  sqlite3 *
36710 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  db;             
36720 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
36730 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
36740 20 69 6e 74 20 69 4c 6f 6f 70 3b 20 20 20 20 20   int iLoop;     
36750 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
36760 6f 70 20 63 6f 75 6e 74 65 72 20 6f 76 65 72 20  op counter over 
36770 74 68 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65  the terms of the
36780 20 6a 6f 69 6e 20 2a 2f 0a 20 20 69 6e 74 20 69   join */.  int i
36790 69 2c 20 6a 6a 3b 20 20 20 20 20 20 20 20 20 20  i, jj;          
367a0 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
367b0 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6d  nters */.  int m
367c0 78 49 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  xI = 0;         
367d0 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
367e0 20 6e 65 78 74 20 65 6e 74 72 79 20 74 6f 20 72   next entry to r
367f0 65 70 6c 61 63 65 20 2a 2f 0a 20 20 69 6e 74 20  eplace */.  int 
36800 6e 4f 72 64 65 72 42 79 3b 20 20 20 20 20 20 20  nOrderBy;       
36810 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
36820 6f 66 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  of ORDER BY clau
36830 73 65 20 74 65 72 6d 73 20 2a 2f 0a 20 20 4c 6f  se terms */.  Lo
36840 67 45 73 74 20 6d 78 43 6f 73 74 20 3d 20 30 3b  gEst mxCost = 0;
36850 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d          /* Maxim
36860 75 6d 20 63 6f 73 74 20 6f 66 20 61 20 73 65 74  um cost of a set
36870 20 6f 66 20 70 61 74 68 73 20 2a 2f 0a 20 20 4c   of paths */.  L
36880 6f 67 45 73 74 20 6d 78 55 6e 73 6f 72 74 65 64  ogEst mxUnsorted
36890 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4d 61 78 69   = 0;    /* Maxi
368a0 6d 75 6d 20 75 6e 73 6f 72 74 65 64 20 63 6f 73  mum unsorted cos
368b0 74 20 6f 66 20 61 20 73 65 74 20 6f 66 20 70 61  t of a set of pa
368c0 74 68 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 6f 2c  th */.  int nTo,
368d0 20 6e 46 72 6f 6d 3b 20 20 20 20 20 20 20 20 20   nFrom;         
368e0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 76    /* Number of v
368f0 61 6c 69 64 20 65 6e 74 72 69 65 73 20 69 6e 20  alid entries in 
36900 61 54 6f 5b 5d 20 61 6e 64 20 61 46 72 6f 6d 5b  aTo[] and aFrom[
36910 5d 20 2a 2f 0a 20 20 57 68 65 72 65 50 61 74 68  ] */.  WherePath
36920 20 2a 61 46 72 6f 6d 3b 20 20 20 20 20 20 20 20   *aFrom;        
36930 20 2f 2a 20 41 6c 6c 20 6e 46 72 6f 6d 20 70 61   /* All nFrom pa
36940 74 68 73 20 61 74 20 74 68 65 20 70 72 65 76 69  ths at the previ
36950 6f 75 73 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 57  ous level */.  W
36960 68 65 72 65 50 61 74 68 20 2a 61 54 6f 3b 20 20  herePath *aTo;  
36970 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
36980 6e 54 6f 20 62 65 73 74 20 70 61 74 68 73 20 61  nTo best paths a
36990 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 65  t the current le
369a0 76 65 6c 20 2a 2f 0a 20 20 57 68 65 72 65 50 61  vel */.  WherePa
369b0 74 68 20 2a 70 46 72 6f 6d 3b 20 20 20 20 20 20  th *pFrom;      
369c0 20 20 20 2f 2a 20 41 6e 20 65 6c 65 6d 65 6e 74     /* An element
369d0 20 6f 66 20 61 46 72 6f 6d 5b 5d 20 74 68 61 74   of aFrom[] that
369e0 20 77 65 20 61 72 65 20 77 6f 72 6b 69 6e 67 20   we are working 
369f0 6f 6e 20 2a 2f 0a 20 20 57 68 65 72 65 50 61 74  on */.  WherePat
36a00 68 20 2a 70 54 6f 3b 20 20 20 20 20 20 20 20 20  h *pTo;         
36a10 20 20 2f 2a 20 41 6e 20 65 6c 65 6d 65 6e 74 20    /* An element 
36a20 6f 66 20 61 54 6f 5b 5d 20 74 68 61 74 20 77 65  of aTo[] that we
36a30 20 61 72 65 20 77 6f 72 6b 69 6e 67 20 6f 6e 20   are working on 
36a40 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  */.  WhereLoop *
36a50 70 57 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 2f  pWLoop;        /
36a60 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 57 68 65  * One of the Whe
36a70 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 2a  reLoop objects *
36a80 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a  /.  WhereLoop **
36a90 70 58 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  pX;           /*
36aa0 20 55 73 65 64 20 74 6f 20 64 69 76 79 20 75 70   Used to divy up
36ab0 20 74 68 65 20 70 53 70 61 63 65 20 6d 65 6d 6f   the pSpace memo
36ac0 72 79 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 2a  ry */.  LogEst *
36ad0 61 53 6f 72 74 43 6f 73 74 20 3d 20 30 3b 20 20  aSortCost = 0;  
36ae0 20 20 2f 2a 20 53 6f 72 74 69 6e 67 20 61 6e 64    /* Sorting and
36af0 20 70 61 72 74 69 61 6c 20 73 6f 72 74 69 6e 67   partial sorting
36b00 20 63 6f 73 74 73 20 2a 2f 0a 20 20 63 68 61 72   costs */.  char
36b10 20 2a 70 53 70 61 63 65 3b 20 20 20 20 20 20 20   *pSpace;       
36b20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61        /* Tempora
36b30 72 79 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 62  ry memory used b
36b40 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 2a  y this routine *
36b50 2f 0a 20 20 69 6e 74 20 6e 53 70 61 63 65 3b 20  /.  int nSpace; 
36b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
36b70 20 42 79 74 65 73 20 6f 66 20 73 70 61 63 65 20   Bytes of space 
36b80 61 6c 6c 6f 63 61 74 65 64 20 61 74 20 70 53 70  allocated at pSp
36b90 61 63 65 20 2a 2f 0a 0a 20 20 70 50 61 72 73 65  ace */..  pParse
36ba0 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73   = pWInfo->pPars
36bb0 65 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65  e;.  db = pParse
36bc0 2d 3e 64 62 3b 0a 20 20 6e 4c 6f 6f 70 20 3d 20  ->db;.  nLoop = 
36bd0 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 0a  pWInfo->nLevel;.
36be0 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 46 6f 72    /* TUNING: For
36bf0 20 73 69 6d 70 6c 65 20 71 75 65 72 69 65 73 2c   simple queries,
36c00 20 6f 6e 6c 79 20 74 68 65 20 62 65 73 74 20 70   only the best p
36c10 61 74 68 20 69 73 20 74 72 61 63 6b 65 64 2e 0a  ath is tracked..
36c20 20 20 2a 2a 20 46 6f 72 20 32 2d 77 61 79 20 6a    ** For 2-way j
36c30 6f 69 6e 73 2c 20 74 68 65 20 35 20 62 65 73 74  oins, the 5 best
36c40 20 70 61 74 68 73 20 61 72 65 20 66 6f 6c 6c 6f   paths are follo
36c50 77 65 64 2e 0a 20 20 2a 2a 20 46 6f 72 20 6a 6f  wed..  ** For jo
36c60 69 6e 73 20 6f 66 20 33 20 6f 72 20 6d 6f 72 65  ins of 3 or more
36c70 20 74 61 62 6c 65 73 2c 20 74 72 61 63 6b 20 74   tables, track t
36c80 68 65 20 31 30 20 62 65 73 74 20 70 61 74 68 73  he 10 best paths
36c90 20 2a 2f 0a 20 20 6d 78 43 68 6f 69 63 65 20 3d   */.  mxChoice =
36ca0 20 28 6e 4c 6f 6f 70 3c 3d 31 29 20 3f 20 31 20   (nLoop<=1) ? 1 
36cb0 3a 20 28 6e 4c 6f 6f 70 3d 3d 32 20 3f 20 35 20  : (nLoop==2 ? 5 
36cc0 3a 20 31 30 29 3b 0a 20 20 61 73 73 65 72 74 28  : 10);.  assert(
36cd0 20 6e 4c 6f 6f 70 3c 3d 70 57 49 6e 66 6f 2d 3e   nLoop<=pWInfo->
36ce0 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29  pTabList->nSrc )
36cf0 3b 0a 20 20 57 48 45 52 45 54 52 41 43 45 28 30  ;.  WHERETRACE(0
36d00 78 30 30 32 2c 20 28 22 2d 2d 2d 2d 20 62 65 67  x002, ("---- beg
36d10 69 6e 20 73 6f 6c 76 65 72 2e 20 20 28 6e 52 6f  in solver.  (nRo
36d20 77 45 73 74 3d 25 64 29 5c 6e 22 2c 20 6e 52 6f  wEst=%d)\n", nRo
36d30 77 45 73 74 29 29 3b 0a 0a 20 20 2f 2a 20 49 66  wEst));..  /* If
36d40 20 6e 52 6f 77 45 73 74 20 69 73 20 7a 65 72 6f   nRowEst is zero
36d50 20 61 6e 64 20 74 68 65 72 65 20 69 73 20 61 6e   and there is an
36d60 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
36d70 2c 20 69 67 6e 6f 72 65 20 69 74 2e 20 49 6e 20  , ignore it. In 
36d80 74 68 69 73 0a 20 20 2a 2a 20 63 61 73 65 20 74  this.  ** case t
36d90 68 65 20 70 75 72 70 6f 73 65 20 6f 66 20 74 68  he purpose of th
36da0 69 73 20 63 61 6c 6c 20 69 73 20 74 6f 20 65 73  is call is to es
36db0 74 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65  timate the numbe
36dc0 72 20 6f 66 20 72 6f 77 73 20 72 65 74 75 72 6e  r of rows return
36dd0 65 64 0a 20 20 2a 2a 20 62 79 20 74 68 65 20 6f  ed.  ** by the o
36de0 76 65 72 61 6c 6c 20 71 75 65 72 79 2e 20 4f 6e  verall query. On
36df0 63 65 20 74 68 69 73 20 65 73 74 69 6d 61 74 65  ce this estimate
36e00 20 68 61 73 20 62 65 65 6e 20 6f 62 74 61 69 6e   has been obtain
36e10 65 64 2c 20 74 68 65 20 63 61 6c 6c 65 72 0a 20  ed, the caller. 
36e20 20 2a 2a 20 77 69 6c 6c 20 69 6e 76 6f 6b 65 20   ** will invoke 
36e30 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 20  this function a 
36e40 73 65 63 6f 6e 64 20 74 69 6d 65 2c 20 70 61 73  second time, pas
36e50 73 69 6e 67 20 74 68 65 20 65 73 74 69 6d 61 74  sing the estimat
36e60 65 20 61 73 20 74 68 65 0a 20 20 2a 2a 20 6e 52  e as the.  ** nR
36e70 6f 77 45 73 74 20 70 61 72 61 6d 65 74 65 72 2e  owEst parameter.
36e80 20 20 2a 2f 0a 20 20 69 66 28 20 70 57 49 6e 66    */.  if( pWInf
36e90 6f 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c  o->pOrderBy==0 |
36ea0 7c 20 6e 52 6f 77 45 73 74 3d 3d 30 20 29 7b 0a  | nRowEst==0 ){.
36eb0 20 20 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 30      nOrderBy = 0
36ec0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e  ;.  }else{.    n
36ed0 4f 72 64 65 72 42 79 20 3d 20 70 57 49 6e 66 6f  OrderBy = pWInfo
36ee0 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  ->pOrderBy->nExp
36ef0 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c  r;.  }..  /* All
36f00 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61  ocate and initia
36f10 6c 69 7a 65 20 73 70 61 63 65 20 66 6f 72 20 61  lize space for a
36f20 54 6f 2c 20 61 46 72 6f 6d 20 61 6e 64 20 61 53  To, aFrom and aS
36f30 6f 72 74 43 6f 73 74 5b 5d 20 2a 2f 0a 20 20 6e  ortCost[] */.  n
36f40 53 70 61 63 65 20 3d 20 28 73 69 7a 65 6f 66 28  Space = (sizeof(
36f50 57 68 65 72 65 50 61 74 68 29 2b 73 69 7a 65 6f  WherePath)+sizeo
36f60 66 28 57 68 65 72 65 4c 6f 6f 70 2a 29 2a 6e 4c  f(WhereLoop*)*nL
36f70 6f 6f 70 29 2a 6d 78 43 68 6f 69 63 65 2a 32 3b  oop)*mxChoice*2;
36f80 0a 20 20 6e 53 70 61 63 65 20 2b 3d 20 73 69 7a  .  nSpace += siz
36f90 65 6f 66 28 4c 6f 67 45 73 74 29 20 2a 20 6e 4f  eof(LogEst) * nO
36fa0 72 64 65 72 42 79 3b 0a 20 20 70 53 70 61 63 65  rderBy;.  pSpace
36fb0 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
36fc0 6f 63 52 61 77 28 64 62 2c 20 6e 53 70 61 63 65  ocRaw(db, nSpace
36fd0 29 3b 0a 20 20 69 66 28 20 70 53 70 61 63 65 3d  );.  if( pSpace=
36fe0 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
36ff0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 61 54 6f 20  TE_NOMEM;.  aTo 
37000 3d 20 28 57 68 65 72 65 50 61 74 68 2a 29 70 53  = (WherePath*)pS
37010 70 61 63 65 3b 0a 20 20 61 46 72 6f 6d 20 3d 20  pace;.  aFrom = 
37020 61 54 6f 2b 6d 78 43 68 6f 69 63 65 3b 0a 20 20  aTo+mxChoice;.  
37030 6d 65 6d 73 65 74 28 61 46 72 6f 6d 2c 20 30 2c  memset(aFrom, 0,
37040 20 73 69 7a 65 6f 66 28 61 46 72 6f 6d 5b 30 5d   sizeof(aFrom[0]
37050 29 29 3b 0a 20 20 70 58 20 3d 20 28 57 68 65 72  ));.  pX = (Wher
37060 65 4c 6f 6f 70 2a 2a 29 28 61 46 72 6f 6d 2b 6d  eLoop**)(aFrom+m
37070 78 43 68 6f 69 63 65 29 3b 0a 20 20 66 6f 72 28  xChoice);.  for(
37080 69 69 3d 6d 78 43 68 6f 69 63 65 2a 32 2c 20 70  ii=mxChoice*2, p
37090 46 72 6f 6d 3d 61 54 6f 3b 20 69 69 3e 30 3b 20  From=aTo; ii>0; 
370a0 69 69 2d 2d 2c 20 70 46 72 6f 6d 2b 2b 2c 20 70  ii--, pFrom++, p
370b0 58 20 2b 3d 20 6e 4c 6f 6f 70 29 7b 0a 20 20 20  X += nLoop){.   
370c0 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 20 3d 20   pFrom->aLoop = 
370d0 70 58 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 4f  pX;.  }.  if( nO
370e0 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 2f 2a  rderBy ){.    /*
370f0 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 20   If there is an 
37100 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
37110 61 6e 64 20 69 74 20 69 73 20 6e 6f 74 20 62 65  and it is not be
37120 69 6e 67 20 69 67 6e 6f 72 65 64 2c 20 73 65 74  ing ignored, set
37130 20 75 70 0a 20 20 20 20 2a 2a 20 73 70 61 63 65   up.    ** space
37140 20 66 6f 72 20 74 68 65 20 61 53 6f 72 74 43 6f   for the aSortCo
37150 73 74 5b 5d 20 61 72 72 61 79 2e 20 45 61 63 68  st[] array. Each
37160 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20   element of the 
37170 61 53 6f 72 74 43 6f 73 74 20 61 72 72 61 79 0a  aSortCost array.
37180 20 20 20 20 2a 2a 20 69 73 20 65 69 74 68 65 72      ** is either
37190 20 7a 65 72 6f 20 2d 20 6d 65 61 6e 69 6e 67 20   zero - meaning 
371a0 69 74 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62  it has not yet b
371b0 65 65 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64 20  een initialized 
371c0 2d 20 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20  - or the.    ** 
371d0 63 6f 73 74 20 6f 66 20 73 6f 72 74 69 6e 67 20  cost of sorting 
371e0 6e 52 6f 77 45 73 74 20 72 6f 77 73 20 6f 66 20  nRowEst rows of 
371f0 64 61 74 61 20 77 68 65 72 65 20 74 68 65 20 66  data where the f
37200 69 72 73 74 20 58 20 74 65 72 6d 73 20 6f 66 0a  irst X terms of.
37210 20 20 20 20 2a 2a 20 74 68 65 20 4f 52 44 45 52      ** the ORDER
37220 20 42 59 20 63 6c 61 75 73 65 20 61 72 65 20 61   BY clause are a
37230 6c 72 65 61 64 79 20 69 6e 20 6f 72 64 65 72 2c  lready in order,
37240 20 77 68 65 72 65 20 58 20 69 73 20 74 68 65 20   where X is the 
37250 61 72 72 61 79 20 0a 20 20 20 20 2a 2a 20 69 6e  array .    ** in
37260 64 65 78 2e 20 20 2a 2f 0a 20 20 20 20 61 53 6f  dex.  */.    aSo
37270 72 74 43 6f 73 74 20 3d 20 28 4c 6f 67 45 73 74  rtCost = (LogEst
37280 2a 29 70 58 3b 0a 20 20 20 20 6d 65 6d 73 65 74  *)pX;.    memset
37290 28 61 53 6f 72 74 43 6f 73 74 2c 20 30 2c 20 73  (aSortCost, 0, s
372a0 69 7a 65 6f 66 28 4c 6f 67 45 73 74 29 20 2a 20  izeof(LogEst) * 
372b0 6e 4f 72 64 65 72 42 79 29 3b 0a 20 20 7d 0a 20  nOrderBy);.  }. 
372c0 20 61 73 73 65 72 74 28 20 61 53 6f 72 74 43 6f   assert( aSortCo
372d0 73 74 3d 3d 30 20 7c 7c 20 26 70 53 70 61 63 65  st==0 || &pSpace
372e0 5b 6e 53 70 61 63 65 5d 3d 3d 28 63 68 61 72 2a  [nSpace]==(char*
372f0 29 26 61 53 6f 72 74 43 6f 73 74 5b 6e 4f 72 64  )&aSortCost[nOrd
37300 65 72 42 79 5d 20 29 3b 0a 20 20 61 73 73 65 72  erBy] );.  asser
37310 74 28 20 61 53 6f 72 74 43 6f 73 74 21 3d 30 20  t( aSortCost!=0 
37320 7c 7c 20 26 70 53 70 61 63 65 5b 6e 53 70 61 63  || &pSpace[nSpac
37330 65 5d 3d 3d 28 63 68 61 72 2a 29 70 58 20 29 3b  e]==(char*)pX );
37340 0a 0a 20 20 2f 2a 20 53 65 65 64 20 74 68 65 20  ..  /* Seed the 
37350 73 65 61 72 63 68 20 77 69 74 68 20 61 20 73 69  search with a si
37360 6e 67 6c 65 20 57 68 65 72 65 50 61 74 68 20 63  ngle WherePath c
37370 6f 6e 74 61 69 6e 69 6e 67 20 7a 65 72 6f 20 57  ontaining zero W
37380 68 65 72 65 4c 6f 6f 70 73 2e 0a 20 20 2a 2a 0a  hereLoops..  **.
37390 20 20 2a 2a 20 54 55 4e 49 4e 47 3a 20 44 6f 20    ** TUNING: Do 
373a0 6e 6f 74 20 6c 65 74 20 74 68 65 20 6e 75 6d 62  not let the numb
373b0 65 72 20 6f 66 20 69 74 65 72 61 74 69 6f 6e 73  er of iterations
373c0 20 67 6f 20 61 62 6f 76 65 20 32 38 2e 20 20 49   go above 28.  I
373d0 66 20 74 68 65 20 63 6f 73 74 0a 20 20 2a 2a 20  f the cost.  ** 
373e0 6f 66 20 63 6f 6d 70 75 74 69 6e 67 20 61 6e 20  of computing an 
373f0 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20  automatic index 
37400 69 73 20 6e 6f 74 20 70 61 69 64 20 62 61 63 6b  is not paid back
37410 20 77 69 74 68 69 6e 20 74 68 65 20 66 69 72 73   within the firs
37420 74 20 32 38 0a 20 20 2a 2a 20 72 6f 77 73 2c 20  t 28.  ** rows, 
37430 74 68 65 6e 20 64 6f 20 6e 6f 74 20 75 73 65 20  then do not use 
37440 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e  the automatic in
37450 64 65 78 2e 20 2a 2f 0a 20 20 61 46 72 6f 6d 5b  dex. */.  aFrom[
37460 30 5d 2e 6e 52 6f 77 20 3d 20 4d 49 4e 28 70 50  0].nRow = MIN(pP
37470 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70  arse->nQueryLoop
37480 2c 20 34 38 29 3b 20 20 61 73 73 65 72 74 28 20  , 48);  assert( 
37490 34 38 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73  48==sqlite3LogEs
374a0 74 28 32 38 29 20 29 3b 0a 20 20 6e 46 72 6f 6d  t(28) );.  nFrom
374b0 20 3d 20 31 3b 0a 20 20 61 73 73 65 72 74 28 20   = 1;.  assert( 
374c0 61 46 72 6f 6d 5b 30 5d 2e 69 73 4f 72 64 65 72  aFrom[0].isOrder
374d0 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 6e  ed==0 );.  if( n
374e0 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 2f  OrderBy ){.    /
374f0 2a 20 49 66 20 6e 4c 6f 6f 70 20 69 73 20 7a 65  * If nLoop is ze
37500 72 6f 2c 20 74 68 65 6e 20 74 68 65 72 65 20 61  ro, then there a
37510 72 65 20 6e 6f 20 46 52 4f 4d 20 74 65 72 6d 73  re no FROM terms
37520 20 69 6e 20 74 68 65 20 71 75 65 72 79 2e 20 53   in the query. S
37530 69 6e 63 65 0a 20 20 20 20 2a 2a 20 69 6e 20 74  ince.    ** in t
37540 68 69 73 20 63 61 73 65 20 74 68 65 20 71 75 65  his case the que
37550 72 79 20 6d 61 79 20 72 65 74 75 72 6e 20 61 20  ry may return a 
37560 6d 61 78 69 6d 75 6d 20 6f 66 20 6f 6e 65 20 72  maximum of one r
37570 6f 77 2c 20 74 68 65 20 72 65 73 75 6c 74 73 0a  ow, the results.
37580 20 20 20 20 2a 2a 20 61 72 65 20 61 6c 72 65 61      ** are alrea
37590 64 79 20 69 6e 20 74 68 65 20 72 65 71 75 65 73  dy in the reques
375a0 74 65 64 20 6f 72 64 65 72 2e 20 53 65 74 20 69  ted order. Set i
375b0 73 4f 72 64 65 72 65 64 20 74 6f 20 6e 4f 72 64  sOrdered to nOrd
375c0 65 72 42 79 20 74 6f 0a 20 20 20 20 2a 2a 20 69  erBy to.    ** i
375d0 6e 64 69 63 61 74 65 20 74 68 69 73 2e 20 4f 72  ndicate this. Or
375e0 2c 20 69 66 20 6e 4c 6f 6f 70 20 69 73 20 67 72  , if nLoop is gr
375f0 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2c  eater than zero,
37600 20 73 65 74 20 69 73 4f 72 64 65 72 65 64 20 74   set isOrdered t
37610 6f 0a 20 20 20 20 2a 2a 20 2d 31 2c 20 69 6e 64  o.    ** -1, ind
37620 69 63 61 74 69 6e 67 20 74 68 61 74 20 74 68 65  icating that the
37630 20 72 65 73 75 6c 74 20 73 65 74 20 6d 61 79 20   result set may 
37640 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f 72  or may not be or
37650 64 65 72 65 64 2c 20 0a 20 20 20 20 2a 2a 20 64  dered, .    ** d
37660 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20  epending on the 
37670 6c 6f 6f 70 73 20 61 64 64 65 64 20 74 6f 20 74  loops added to t
37680 68 65 20 63 75 72 72 65 6e 74 20 70 6c 61 6e 2e  he current plan.
37690 20 20 2a 2f 0a 20 20 20 20 61 46 72 6f 6d 5b 30    */.    aFrom[0
376a0 5d 2e 69 73 4f 72 64 65 72 65 64 20 3d 20 6e 4c  ].isOrdered = nL
376b0 6f 6f 70 3e 30 20 3f 20 2d 31 20 3a 20 6e 4f 72  oop>0 ? -1 : nOr
376c0 64 65 72 42 79 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  derBy;.  }..  /*
376d0 20 43 6f 6d 70 75 74 65 20 73 75 63 63 65 73 73   Compute success
376e0 69 76 65 6c 79 20 6c 6f 6e 67 65 72 20 57 68 65  ively longer Whe
376f0 72 65 50 61 74 68 73 20 75 73 69 6e 67 20 74 68  rePaths using th
37700 65 20 70 72 65 76 69 6f 75 73 20 67 65 6e 65 72  e previous gener
37710 61 74 69 6f 6e 0a 20 20 2a 2a 20 6f 66 20 57 68  ation.  ** of Wh
37720 65 72 65 50 61 74 68 73 20 61 73 20 74 68 65 20  erePaths as the 
37730 62 61 73 69 73 20 66 6f 72 20 74 68 65 20 6e 65  basis for the ne
37740 78 74 2e 20 20 4b 65 65 70 20 74 72 61 63 6b 20  xt.  Keep track 
37750 6f 66 20 74 68 65 20 6d 78 43 68 6f 69 63 65 0a  of the mxChoice.
37760 20 20 2a 2a 20 62 65 73 74 20 70 61 74 68 73 20    ** best paths 
37770 61 74 20 65 61 63 68 20 67 65 6e 65 72 61 74 69  at each generati
37780 6f 6e 20 2a 2f 0a 20 20 66 6f 72 28 69 4c 6f 6f  on */.  for(iLoo
37790 70 3d 30 3b 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70  p=0; iLoop<nLoop
377a0 3b 20 69 4c 6f 6f 70 2b 2b 29 7b 0a 20 20 20 20  ; iLoop++){.    
377b0 6e 54 6f 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72  nTo = 0;.    for
377c0 28 69 69 3d 30 2c 20 70 46 72 6f 6d 3d 61 46 72  (ii=0, pFrom=aFr
377d0 6f 6d 3b 20 69 69 3c 6e 46 72 6f 6d 3b 20 69 69  om; ii<nFrom; ii
377e0 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20  ++, pFrom++){.  
377f0 20 20 20 20 66 6f 72 28 70 57 4c 6f 6f 70 3d 70      for(pWLoop=p
37800 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 3b 20 70  WInfo->pLoops; p
37810 57 4c 6f 6f 70 3b 20 70 57 4c 6f 6f 70 3d 70 57  WLoop; pWLoop=pW
37820 4c 6f 6f 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 29  Loop->pNextLoop)
37830 7b 0a 20 20 20 20 20 20 20 20 4c 6f 67 45 73 74  {.        LogEst
37840 20 6e 4f 75 74 3b 20 20 20 20 20 20 20 20 20 20   nOut;          
37850 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
37860 6f 77 73 20 76 69 73 69 74 65 64 20 62 79 20 28  ows visited by (
37870 70 46 72 6f 6d 2b 70 57 4c 6f 6f 70 29 20 2a 2f  pFrom+pWLoop) */
37880 0a 20 20 20 20 20 20 20 20 4c 6f 67 45 73 74 20  .        LogEst 
37890 72 43 6f 73 74 3b 20 20 20 20 20 20 20 20 20 20  rCost;          
378a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
378b0 73 74 20 6f 66 20 70 61 74 68 20 28 70 46 72 6f  st of path (pFro
378c0 6d 2b 70 57 4c 6f 6f 70 29 20 2a 2f 0a 20 20 20  m+pWLoop) */.   
378d0 20 20 20 20 20 4c 6f 67 45 73 74 20 72 55 6e 73       LogEst rUns
378e0 6f 72 74 65 64 3b 20 20 20 20 20 20 20 20 20 20  orted;          
378f0 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 6f 72 74         /* Unsort
37900 65 64 20 63 6f 73 74 20 6f 66 20 28 70 46 72 6f  ed cost of (pFro
37910 6d 2b 70 57 4c 6f 6f 70 29 20 2a 2f 0a 20 20 20  m+pWLoop) */.   
37920 20 20 20 20 20 69 38 20 69 73 4f 72 64 65 72 65       i8 isOrdere
37930 64 20 3d 20 70 46 72 6f 6d 2d 3e 69 73 4f 72 64  d = pFrom->isOrd
37940 65 72 65 64 3b 20 20 2f 2a 20 69 73 4f 72 64 65  ered;  /* isOrde
37950 72 65 64 20 66 6f 72 20 28 70 46 72 6f 6d 2b 70  red for (pFrom+p
37960 57 4c 6f 6f 70 29 20 2a 2f 0a 20 20 20 20 20 20  WLoop) */.      
37970 20 20 42 69 74 6d 61 73 6b 20 6d 61 73 6b 4e 65    Bitmask maskNe
37980 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  w;              
37990 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 73      /* Mask of s
379a0 72 63 20 76 69 73 69 74 65 64 20 62 79 20 28 2e  rc visited by (.
379b0 2e 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 42 69  .) */.        Bi
379c0 74 6d 61 73 6b 20 72 65 76 4d 61 73 6b 20 3d 20  tmask revMask = 
379d0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
379e0 2f 2a 20 4d 61 73 6b 20 6f 66 20 72 65 76 2d 6f  /* Mask of rev-o
379f0 72 64 65 72 20 6c 6f 6f 70 73 20 66 6f 72 20 28  rder loops for (
37a00 2e 2e 29 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20  ..) */..        
37a10 69 66 28 20 28 70 57 4c 6f 6f 70 2d 3e 70 72 65  if( (pWLoop->pre
37a20 72 65 71 20 26 20 7e 70 46 72 6f 6d 2d 3e 6d 61  req & ~pFrom->ma
37a30 73 6b 4c 6f 6f 70 29 21 3d 30 20 29 20 63 6f 6e  skLoop)!=0 ) con
37a40 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69  tinue;.        i
37a50 66 28 20 28 70 57 4c 6f 6f 70 2d 3e 6d 61 73 6b  f( (pWLoop->mask
37a60 53 65 6c 66 20 26 20 70 46 72 6f 6d 2d 3e 6d 61  Self & pFrom->ma
37a70 73 6b 4c 6f 6f 70 29 21 3d 30 20 29 20 63 6f 6e  skLoop)!=0 ) con
37a80 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 2f  tinue;.        /
37a90 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c  * At this point,
37aa0 20 70 57 4c 6f 6f 70 20 69 73 20 61 20 63 61 6e   pWLoop is a can
37ab0 64 69 64 61 74 65 20 74 6f 20 62 65 20 74 68 65  didate to be the
37ac0 20 6e 65 78 74 20 6c 6f 6f 70 2e 20 0a 20 20 20   next loop. .   
37ad0 20 20 20 20 20 2a 2a 20 43 6f 6d 70 75 74 65 20       ** Compute 
37ae0 69 74 73 20 63 6f 73 74 20 2a 2f 0a 20 20 20 20  its cost */.    
37af0 20 20 20 20 72 55 6e 73 6f 72 74 65 64 20 3d 20      rUnsorted = 
37b00 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64  sqlite3LogEstAdd
37b10 28 70 57 4c 6f 6f 70 2d 3e 72 53 65 74 75 70 2c  (pWLoop->rSetup,
37b20 70 57 4c 6f 6f 70 2d 3e 72 52 75 6e 20 2b 20 70  pWLoop->rRun + p
37b30 46 72 6f 6d 2d 3e 6e 52 6f 77 29 3b 0a 20 20 20  From->nRow);.   
37b40 20 20 20 20 20 72 55 6e 73 6f 72 74 65 64 20 3d       rUnsorted =
37b50 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64   sqlite3LogEstAd
37b60 64 28 72 55 6e 73 6f 72 74 65 64 2c 20 70 46 72  d(rUnsorted, pFr
37b70 6f 6d 2d 3e 72 55 6e 73 6f 72 74 65 64 29 3b 0a  om->rUnsorted);.
37b80 20 20 20 20 20 20 20 20 6e 4f 75 74 20 3d 20 70          nOut = p
37b90 46 72 6f 6d 2d 3e 6e 52 6f 77 20 2b 20 70 57 4c  From->nRow + pWL
37ba0 6f 6f 70 2d 3e 6e 4f 75 74 3b 0a 20 20 20 20 20  oop->nOut;.     
37bb0 20 20 20 6d 61 73 6b 4e 65 77 20 3d 20 70 46 72     maskNew = pFr
37bc0 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 20 7c 20 70  om->maskLoop | p
37bd0 57 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b  WLoop->maskSelf;
37be0 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 73 4f  .        if( isO
37bf0 72 64 65 72 65 64 3c 30 20 29 7b 0a 20 20 20 20  rdered<0 ){.    
37c00 20 20 20 20 20 20 69 73 4f 72 64 65 72 65 64 20        isOrdered 
37c10 3d 20 77 68 65 72 65 50 61 74 68 53 61 74 69 73  = wherePathSatis
37c20 66 69 65 73 4f 72 64 65 72 42 79 28 70 57 49 6e  fiesOrderBy(pWIn
37c30 66 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  fo,.            
37c40 20 20 20 20 20 20 20 20 20 20 20 70 57 49 6e 66             pWInf
37c50 6f 2d 3e 70 4f 72 64 65 72 42 79 2c 20 70 46 72  o->pOrderBy, pFr
37c60 6f 6d 2c 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72  om, pWInfo->wctr
37c70 6c 46 6c 61 67 73 2c 0a 20 20 20 20 20 20 20 20  lFlags,.        
37c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
37c90 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 2c 20 26 72  Loop, pWLoop, &r
37ca0 65 76 4d 61 73 6b 29 3b 0a 20 20 20 20 20 20 20  evMask);.       
37cb0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
37cc0 20 20 72 65 76 4d 61 73 6b 20 3d 20 70 46 72 6f    revMask = pFro
37cd0 6d 2d 3e 72 65 76 4c 6f 6f 70 3b 0a 20 20 20 20  m->revLoop;.    
37ce0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
37cf0 28 20 69 73 4f 72 64 65 72 65 64 3e 3d 30 20 26  ( isOrdered>=0 &
37d00 26 20 69 73 4f 72 64 65 72 65 64 3c 6e 4f 72 64  & isOrdered<nOrd
37d10 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20  erBy ){.        
37d20 20 20 69 66 28 20 61 53 6f 72 74 43 6f 73 74 5b    if( aSortCost[
37d30 69 73 4f 72 64 65 72 65 64 5d 3d 3d 30 20 29 7b  isOrdered]==0 ){
37d40 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 53 6f  .            aSo
37d50 72 74 43 6f 73 74 5b 69 73 4f 72 64 65 72 65 64  rtCost[isOrdered
37d60 5d 20 3d 20 77 68 65 72 65 53 6f 72 74 69 6e 67  ] = whereSorting
37d70 43 6f 73 74 28 0a 20 20 20 20 20 20 20 20 20 20  Cost(.          
37d80 20 20 20 20 20 20 70 57 49 6e 66 6f 2c 20 6e 52        pWInfo, nR
37d90 6f 77 45 73 74 2c 20 6e 4f 72 64 65 72 42 79 2c  owEst, nOrderBy,
37da0 20 69 73 4f 72 64 65 72 65 64 0a 20 20 20 20 20   isOrdered.     
37db0 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
37dc0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
37dd0 72 43 6f 73 74 20 3d 20 73 71 6c 69 74 65 33 4c  rCost = sqlite3L
37de0 6f 67 45 73 74 41 64 64 28 72 55 6e 73 6f 72 74  ogEstAdd(rUnsort
37df0 65 64 2c 20 61 53 6f 72 74 43 6f 73 74 5b 69 73  ed, aSortCost[is
37e00 4f 72 64 65 72 65 64 5d 29 3b 0a 0a 20 20 20 20  Ordered]);..    
37e10 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45        WHERETRACE
37e20 28 30 78 30 30 32 2c 0a 20 20 20 20 20 20 20 20  (0x002,.        
37e30 20 20 20 20 20 20 28 22 2d 2d 2d 2d 20 73 6f 72        ("---- sor
37e40 74 20 63 6f 73 74 3d 25 2d 33 64 20 28 25 64 2f  t cost=%-3d (%d/
37e50 25 64 29 20 69 6e 63 72 65 61 73 65 73 20 63 6f  %d) increases co
37e60 73 74 20 25 33 64 20 74 6f 20 25 2d 33 64 5c 6e  st %3d to %-3d\n
37e70 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
37e80 20 20 61 53 6f 72 74 43 6f 73 74 5b 69 73 4f 72    aSortCost[isOr
37e90 64 65 72 65 64 5d 2c 20 28 6e 4f 72 64 65 72 42  dered], (nOrderB
37ea0 79 2d 69 73 4f 72 64 65 72 65 64 29 2c 20 6e 4f  y-isOrdered), nO
37eb0 72 64 65 72 42 79 2c 20 0a 20 20 20 20 20 20 20  rderBy, .       
37ec0 20 20 20 20 20 20 20 20 72 55 6e 73 6f 72 74 65          rUnsorte
37ed0 64 2c 20 72 43 6f 73 74 29 29 3b 0a 20 20 20 20  d, rCost));.    
37ee0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
37ef0 20 20 20 20 20 72 43 6f 73 74 20 3d 20 72 55 6e       rCost = rUn
37f00 73 6f 72 74 65 64 3b 0a 20 20 20 20 20 20 20 20  sorted;.        
37f10 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68  }..        /* Ch
37f20 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 70 57  eck to see if pW
37f30 4c 6f 6f 70 20 73 68 6f 75 6c 64 20 62 65 20 61  Loop should be a
37f40 64 64 65 64 20 74 6f 20 74 68 65 20 73 65 74 20  dded to the set 
37f50 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 78  of.        ** mx
37f60 43 68 6f 69 63 65 20 62 65 73 74 2d 73 6f 2d 66  Choice best-so-f
37f70 61 72 20 70 61 74 68 73 2e 0a 20 20 20 20 20 20  ar paths..      
37f80 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
37f90 46 69 72 73 74 20 6c 6f 6f 6b 20 66 6f 72 20 61  First look for a
37fa0 6e 20 65 78 69 73 74 69 6e 67 20 70 61 74 68 20  n existing path 
37fb0 61 6d 6f 6e 67 20 62 65 73 74 2d 73 6f 2d 66 61  among best-so-fa
37fc0 72 20 70 61 74 68 73 0a 20 20 20 20 20 20 20 20  r paths.        
37fd0 2a 2a 20 74 68 61 74 20 63 6f 76 65 72 73 20 74  ** that covers t
37fe0 68 65 20 73 61 6d 65 20 73 65 74 20 6f 66 20 6c  he same set of l
37ff0 6f 6f 70 73 20 61 6e 64 20 68 61 73 20 74 68 65  oops and has the
38000 20 73 61 6d 65 20 69 73 4f 72 64 65 72 65 64 0a   same isOrdered.
38010 20 20 20 20 20 20 20 20 2a 2a 20 73 65 74 74 69          ** setti
38020 6e 67 20 61 73 20 74 68 65 20 63 75 72 72 65 6e  ng as the curren
38030 74 20 70 61 74 68 20 63 61 6e 64 69 64 61 74 65  t path candidate
38040 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
38050 20 20 20 20 20 2a 2a 20 54 68 65 20 74 65 72 6d       ** The term
38060 20 22 28 28 70 54 6f 2d 3e 69 73 4f 72 64 65 72   "((pTo->isOrder
38070 65 64 5e 69 73 4f 72 64 65 72 65 64 29 26 30 78  ed^isOrdered)&0x
38080 38 30 29 3d 3d 30 22 20 69 73 20 65 71 75 69 76  80)==0" is equiv
38090 61 6c 65 6e 74 0a 20 20 20 20 20 20 20 20 2a 2a  alent.        **
380a0 20 74 6f 20 28 70 54 6f 2d 3e 69 73 4f 72 64 65   to (pTo->isOrde
380b0 72 65 64 3d 3d 28 2d 31 29 29 3d 3d 28 69 73 4f  red==(-1))==(isO
380c0 72 64 65 72 65 64 3d 3d 28 2d 31 29 29 22 20 66  rdered==(-1))" f
380d0 6f 72 20 74 68 65 20 72 61 6e 67 65 0a 20 20 20  or the range.   
380e0 20 20 20 20 20 2a 2a 20 6f 66 20 6c 65 67 61 6c       ** of legal
380f0 20 76 61 6c 75 65 73 20 66 6f 72 20 69 73 4f 72   values for isOr
38100 64 65 72 65 64 2c 20 2d 31 2e 2e 36 34 2e 0a 20  dered, -1..64.. 
38110 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
38120 20 20 66 6f 72 28 6a 6a 3d 30 2c 20 70 54 6f 3d    for(jj=0, pTo=
38130 61 54 6f 3b 20 6a 6a 3c 6e 54 6f 3b 20 6a 6a 2b  aTo; jj<nTo; jj+
38140 2b 2c 20 70 54 6f 2b 2b 29 7b 0a 20 20 20 20 20  +, pTo++){.     
38150 20 20 20 20 20 69 66 28 20 70 54 6f 2d 3e 6d 61       if( pTo->ma
38160 73 6b 4c 6f 6f 70 3d 3d 6d 61 73 6b 4e 65 77 0a  skLoop==maskNew.
38170 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28 28             &