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

Artifact 13a9920431358fc4885b31fe13a893d98f813a74:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d  ******.** This m
0180: 6f 64 75 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43  odule contains C
0190: 20 63 6f 64 65 20 74 68 61 74 20 67 65 6e 65 72   code that gener
01a0: 61 74 65 73 20 56 44 42 45 20 63 6f 64 65 20 75  ates VDBE code u
01b0: 73 65 64 20 74 6f 20 70 72 6f 63 65 73 73 0a 2a  sed to process.*
01c0: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
01d0: 73 65 20 6f 66 20 53 51 4c 20 73 74 61 74 65 6d  se of SQL statem
01e0: 65 6e 74 73 2e 20 20 54 68 69 73 20 6d 6f 64 75  ents.  This modu
01f0: 6c 65 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  le is responsibl
0200: 65 20 66 6f 72 0a 2a 2a 20 67 65 6e 65 72 61 74  e for.** generat
0210: 69 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68 61  ing the code tha
0220: 74 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20  t loops through 
0230: 61 20 74 61 62 6c 65 20 6c 6f 6f 6b 69 6e 67 20  a table looking 
0240: 66 6f 72 20 61 70 70 6c 69 63 61 62 6c 65 0a 2a  for applicable.*
0250: 2a 20 72 6f 77 73 2e 20 20 49 6e 64 69 63 65 73  * rows.  Indices
0260: 20 61 72 65 20 73 65 6c 65 63 74 65 64 20 61 6e   are selected an
0270: 64 20 75 73 65 64 20 74 6f 20 73 70 65 65 64 20  d used to speed 
0280: 74 68 65 20 73 65 61 72 63 68 20 77 68 65 6e 20  the search when 
0290: 64 6f 69 6e 67 0a 2a 2a 20 73 6f 20 69 73 20 61  doing.** so is a
02a0: 70 70 6c 69 63 61 62 6c 65 2e 20 20 42 65 63 61  pplicable.  Beca
02b0: 75 73 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 20  use this module 
02c0: 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
02d0: 6f 72 20 73 65 6c 65 63 74 69 6e 67 0a 2a 2a 20  or selecting.** 
02e0: 69 6e 64 69 63 65 73 2c 20 79 6f 75 20 6d 69 67  indices, you mig
02f0: 68 74 20 61 6c 73 6f 20 74 68 69 6e 6b 20 6f 66  ht also think of
0300: 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 61 73 20   this module as 
0310: 74 68 65 20 22 71 75 65 72 79 20 6f 70 74 69 6d  the "query optim
0320: 69 7a 65 72 22 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  izer"..*/.#inclu
0330: 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22  de "sqliteInt.h"
0340: 0a 23 69 6e 63 6c 75 64 65 20 22 77 68 65 72 65  .#include "where
0350: 49 6e 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 52 65  Int.h"../*.** Re
0360: 74 75 72 6e 20 74 68 65 20 65 73 74 69 6d 61 74  turn the estimat
0370: 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74  ed number of out
0380: 70 75 74 20 72 6f 77 73 20 66 72 6f 6d 20 61 20  put rows from a 
0390: 57 48 45 52 45 20 63 6c 61 75 73 65 0a 2a 2f 0a  WHERE clause.*/.
03a0: 75 36 34 20 73 71 6c 69 74 65 33 57 68 65 72 65  u64 sqlite3Where
03b0: 4f 75 74 70 75 74 52 6f 77 43 6f 75 6e 74 28 57  OutputRowCount(W
03c0: 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
03d0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
03e0: 74 65 33 4c 6f 67 45 73 74 54 6f 49 6e 74 28 70  te3LogEstToInt(p
03f0: 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 29 3b  WInfo->nRowOut);
0400: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
0410: 20 6f 6e 65 20 6f 66 20 74 68 65 20 57 48 45 52   one of the WHER
0420: 45 5f 44 49 53 54 49 4e 43 54 5f 78 78 78 78 78  E_DISTINCT_xxxxx
0430: 20 76 61 6c 75 65 73 20 74 6f 20 69 6e 64 69 63   values to indic
0440: 61 74 65 20 68 6f 77 20 74 68 69 73 0a 2a 2a 20  ate how this.** 
0450: 57 48 45 52 45 20 63 6c 61 75 73 65 20 72 65 74  WHERE clause ret
0460: 75 72 6e 73 20 6f 75 74 70 75 74 73 20 66 6f 72  urns outputs for
0470: 20 44 49 53 54 49 4e 43 54 20 70 72 6f 63 65 73   DISTINCT proces
0480: 73 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  sing..*/.int sql
0490: 69 74 65 33 57 68 65 72 65 49 73 44 69 73 74 69  ite3WhereIsDisti
04a0: 6e 63 74 28 57 68 65 72 65 49 6e 66 6f 20 2a 70  nct(WhereInfo *p
04b0: 57 49 6e 66 6f 29 7b 0a 20 20 72 65 74 75 72 6e  WInfo){.  return
04c0: 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e   pWInfo->eDistin
04d0: 63 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ct;.}../*.** Ret
04e0: 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
04f0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 72 65 74  WHERE clause ret
0500: 75 72 6e 73 20 72 6f 77 73 20 69 6e 20 4f 52 44  urns rows in ORD
0510: 45 52 20 42 59 20 6f 72 64 65 72 2e 0a 2a 2a 20  ER BY order..** 
0520: 52 65 74 75 72 6e 20 46 41 4c 53 45 20 69 66 20  Return FALSE if 
0530: 74 68 65 20 6f 75 74 70 75 74 20 6e 65 65 64 73  the output needs
0540: 20 74 6f 20 62 65 20 73 6f 72 74 65 64 2e 0a 2a   to be sorted..*
0550: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65  /.int sqlite3Whe
0560: 72 65 49 73 4f 72 64 65 72 65 64 28 57 68 65 72  reIsOrdered(Wher
0570: 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a  eInfo *pWInfo){.
0580: 20 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 2d    return pWInfo-
0590: 3e 6e 4f 42 53 61 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  >nOBSat;.}../*.*
05a0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 56 44 42  * Return the VDB
05b0: 45 20 61 64 64 72 65 73 73 20 6f 72 20 6c 61 62  E address or lab
05c0: 65 6c 20 74 6f 20 6a 75 6d 70 20 74 6f 20 69 6e  el to jump to in
05d0: 20 6f 72 64 65 72 20 74 6f 20 63 6f 6e 74 69 6e   order to contin
05e0: 75 65 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c  ue.** immediatel
05f0: 79 20 77 69 74 68 20 74 68 65 20 6e 65 78 74 20  y with the next 
0600: 72 6f 77 20 6f 66 20 61 20 57 48 45 52 45 20 63  row of a WHERE c
0610: 6c 61 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  lause..*/.int sq
0620: 6c 69 74 65 33 57 68 65 72 65 43 6f 6e 74 69 6e  lite3WhereContin
0630: 75 65 4c 61 62 65 6c 28 57 68 65 72 65 49 6e 66  ueLabel(WhereInf
0640: 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 61 73  o *pWInfo){.  as
0650: 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 69 43  sert( pWInfo->iC
0660: 6f 6e 74 69 6e 75 65 21 3d 30 20 29 3b 0a 20 20  ontinue!=0 );.  
0670: 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 69  return pWInfo->i
0680: 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a  Continue;.}../*.
0690: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 56 44  ** Return the VD
06a0: 42 45 20 61 64 64 72 65 73 73 20 6f 72 20 6c 61  BE address or la
06b0: 62 65 6c 20 74 6f 20 6a 75 6d 70 20 74 6f 20 69  bel to jump to i
06c0: 6e 20 6f 72 64 65 72 20 74 6f 20 62 72 65 61 6b  n order to break
06d0: 0a 2a 2a 20 6f 75 74 20 6f 66 20 61 20 57 48 45  .** out of a WHE
06e0: 52 45 20 6c 6f 6f 70 2e 0a 2a 2f 0a 69 6e 74 20  RE loop..*/.int 
06f0: 73 71 6c 69 74 65 33 57 68 65 72 65 42 72 65 61  sqlite3WhereBrea
0700: 6b 4c 61 62 65 6c 28 57 68 65 72 65 49 6e 66 6f  kLabel(WhereInfo
0710: 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 72 65 74   *pWInfo){.  ret
0720: 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65  urn pWInfo->iBre
0730: 61 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ak;.}../*.** Ret
0740: 75 72 6e 20 54 52 55 45 20 69 66 20 61 6e 20 55  urn TRUE if an U
0750: 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20  PDATE or DELETE 
0760: 73 74 61 74 65 6d 65 6e 74 20 63 61 6e 20 6f 70  statement can op
0770: 65 72 61 74 65 20 64 69 72 65 63 74 6c 79 20 6f  erate directly o
0780: 6e 0a 2a 2a 20 74 68 65 20 72 6f 77 69 64 73 20  n.** the rowids 
0790: 72 65 74 75 72 6e 65 64 20 62 79 20 61 20 57 48  returned by a WH
07a0: 45 52 45 20 63 6c 61 75 73 65 2e 20 20 52 65 74  ERE clause.  Ret
07b0: 75 72 6e 20 46 41 4c 53 45 20 69 66 20 64 6f 69  urn FALSE if doi
07c0: 6e 67 20 61 6e 0a 2a 2a 20 55 50 44 41 54 45 20  ng an.** UPDATE 
07d0: 6f 72 20 44 45 4c 45 54 45 20 6d 69 67 68 74 20  or DELETE might 
07e0: 63 68 61 6e 67 65 20 73 75 62 73 65 71 75 65 6e  change subsequen
07f0: 74 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 72  t WHERE clause r
0800: 65 73 75 6c 74 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  esults..**.** If
0810: 20 74 68 65 20 4f 4e 45 50 41 53 53 20 6f 70 74   the ONEPASS opt
0820: 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 75 73 65  imization is use
0830: 64 20 28 69 66 20 74 68 69 73 20 72 6f 75 74 69  d (if this routi
0840: 6e 65 20 72 65 74 75 72 6e 73 20 74 72 75 65 29  ne returns true)
0850: 0a 2a 2a 20 74 68 65 6e 20 61 6c 73 6f 20 77 72  .** then also wr
0860: 69 74 65 20 74 68 65 20 69 6e 64 69 63 65 73 20  ite the indices 
0870: 6f 66 20 6f 70 65 6e 20 63 75 72 73 6f 72 73 20  of open cursors 
0880: 75 73 65 64 20 62 79 20 4f 4e 45 50 41 53 53 0a  used by ONEPASS.
0890: 2a 2a 20 69 6e 74 6f 20 61 69 43 75 72 5b 30 5d  ** into aiCur[0]
08a0: 20 61 6e 64 20 61 69 43 75 72 5b 31 5d 2e 20 20   and aiCur[1].  
08b0: 69 61 43 75 72 5b 30 5d 20 67 65 74 73 20 74 68  iaCur[0] gets th
08c0: 65 20 63 75 72 73 6f 72 20 6f 66 20 74 68 65 20  e cursor of the 
08d0: 64 61 74 61 0a 2a 2a 20 74 61 62 6c 65 20 61 6e  data.** table an
08e0: 64 20 69 61 43 75 72 5b 31 5d 20 67 65 74 73 20  d iaCur[1] gets 
08f0: 74 68 65 20 63 75 72 73 6f 72 20 75 73 65 64 20  the cursor used 
0900: 62 79 20 61 6e 20 61 75 78 69 6c 69 61 72 79 20  by an auxiliary 
0910: 69 6e 64 65 78 2e 0a 2a 2a 20 45 69 74 68 65 72  index..** Either
0920: 20 76 61 6c 75 65 20 6d 61 79 20 62 65 20 2d 31   value may be -1
0930: 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61  , indicating tha
0940: 74 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20  t cursor is not 
0950: 75 73 65 64 2e 0a 2a 2a 20 41 6e 79 20 63 75 72  used..** Any cur
0960: 73 6f 72 73 20 72 65 74 75 72 6e 65 64 20 77 69  sors returned wi
0970: 6c 6c 20 68 61 76 65 20 62 65 65 6e 20 6f 70 65  ll have been ope
0980: 6e 65 64 20 66 6f 72 20 77 72 69 74 69 6e 67 2e  ned for writing.
0990: 0a 2a 2a 0a 2a 2a 20 61 69 43 75 72 5b 30 5d 20  .**.** aiCur[0] 
09a0: 61 6e 64 20 61 69 43 75 72 5b 31 5d 20 62 6f 74  and aiCur[1] bot
09b0: 68 20 67 65 74 20 2d 31 20 69 66 20 74 68 65 20  h get -1 if the 
09c0: 77 68 65 72 65 2d 63 6c 61 75 73 65 20 6c 6f 67  where-clause log
09d0: 69 63 20 69 73 0a 2a 2a 20 75 6e 61 62 6c 65 20  ic is.** unable 
09e0: 74 6f 20 75 73 65 20 74 68 65 20 4f 4e 45 50 41  to use the ONEPA
09f0: 53 53 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e  SS optimization.
0a00: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 57  .*/.int sqlite3W
0a10: 68 65 72 65 4f 6b 4f 6e 65 50 61 73 73 28 57 68  hereOkOnePass(Wh
0a20: 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c  ereInfo *pWInfo,
0a30: 20 69 6e 74 20 2a 61 69 43 75 72 29 7b 0a 20 20   int *aiCur){.  
0a40: 6d 65 6d 63 70 79 28 61 69 43 75 72 2c 20 70 57  memcpy(aiCur, pW
0a50: 49 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e 65 50 61  Info->aiCurOnePa
0a60: 73 73 2c 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a  ss, sizeof(int)*
0a70: 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 57 49  2);.  return pWI
0a80: 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 3b 0a  nfo->okOnePass;.
0a90: 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  }../*.** Move th
0aa0: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 53 72  e content of pSr
0ab0: 63 20 69 6e 74 6f 20 70 44 65 73 74 0a 2a 2f 0a  c into pDest.*/.
0ac0: 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72  static void wher
0ad0: 65 4f 72 4d 6f 76 65 28 57 68 65 72 65 4f 72 53  eOrMove(WhereOrS
0ae0: 65 74 20 2a 70 44 65 73 74 2c 20 57 68 65 72 65  et *pDest, Where
0af0: 4f 72 53 65 74 20 2a 70 53 72 63 29 7b 0a 20 20  OrSet *pSrc){.  
0b00: 70 44 65 73 74 2d 3e 6e 20 3d 20 70 53 72 63 2d  pDest->n = pSrc-
0b10: 3e 6e 3b 0a 20 20 6d 65 6d 63 70 79 28 70 44 65  >n;.  memcpy(pDe
0b20: 73 74 2d 3e 61 2c 20 70 53 72 63 2d 3e 61 2c 20  st->a, pSrc->a, 
0b30: 70 44 65 73 74 2d 3e 6e 2a 73 69 7a 65 6f 66 28  pDest->n*sizeof(
0b40: 70 44 65 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 7d  pDest->a[0]));.}
0b50: 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 69  ../*.** Try to i
0b60: 6e 73 65 72 74 20 61 20 6e 65 77 20 70 72 65 72  nsert a new prer
0b70: 65 71 75 69 73 69 74 65 2f 63 6f 73 74 20 65 6e  equisite/cost en
0b80: 74 72 79 20 69 6e 74 6f 20 74 68 65 20 57 68 65  try into the Whe
0b90: 72 65 4f 72 53 65 74 20 70 53 65 74 2e 0a 2a 2a  reOrSet pSet..**
0ba0: 0a 2a 2a 20 54 68 65 20 6e 65 77 20 65 6e 74 72  .** The new entr
0bb0: 79 20 6d 69 67 68 74 20 6f 76 65 72 77 72 69 74  y might overwrit
0bc0: 65 20 61 6e 20 65 78 69 73 74 69 6e 67 20 65 6e  e an existing en
0bd0: 74 72 79 2c 20 6f 72 20 69 74 20 6d 69 67 68 74  try, or it might
0be0: 20 62 65 0a 2a 2a 20 61 70 70 65 6e 64 65 64 2c   be.** appended,
0bf0: 20 6f 72 20 69 74 20 6d 69 67 68 74 20 62 65 20   or it might be 
0c00: 64 69 73 63 61 72 64 65 64 2e 20 20 44 6f 20 77  discarded.  Do w
0c10: 68 61 74 65 76 65 72 20 69 73 20 74 68 65 20 72  hatever is the r
0c20: 69 67 68 74 20 74 68 69 6e 67 0a 2a 2a 20 73 6f  ight thing.** so
0c30: 20 74 68 61 74 20 70 53 65 74 20 6b 65 65 70 73   that pSet keeps
0c40: 20 74 68 65 20 4e 5f 4f 52 5f 43 4f 53 54 20 62   the N_OR_COST b
0c50: 65 73 74 20 65 6e 74 72 69 65 73 20 73 65 65 6e  est entries seen
0c60: 20 73 6f 20 66 61 72 2e 0a 2a 2f 0a 73 74 61 74   so far..*/.stat
0c70: 69 63 20 69 6e 74 20 77 68 65 72 65 4f 72 49 6e  ic int whereOrIn
0c80: 73 65 72 74 28 0a 20 20 57 68 65 72 65 4f 72 53  sert(.  WhereOrS
0c90: 65 74 20 2a 70 53 65 74 2c 20 20 20 20 20 20 2f  et *pSet,      /
0ca0: 2a 20 54 68 65 20 57 68 65 72 65 4f 72 53 65 74  * The WhereOrSet
0cb0: 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 20 2a   to be updated *
0cc0: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 70 72 65 72  /.  Bitmask prer
0cd0: 65 71 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 72  eq,        /* Pr
0ce0: 65 72 65 71 75 69 73 69 74 65 73 20 6f 66 20 74  erequisites of t
0cf0: 68 65 20 6e 65 77 20 65 6e 74 72 79 20 2a 2f 0a  he new entry */.
0d00: 20 20 4c 6f 67 45 73 74 20 72 52 75 6e 2c 20 20    LogEst rRun,  
0d10: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 75 6e 2d           /* Run-
0d20: 63 6f 73 74 20 6f 66 20 74 68 65 20 6e 65 77 20  cost of the new 
0d30: 65 6e 74 72 79 20 2a 2f 0a 20 20 4c 6f 67 45 73  entry */.  LogEs
0d40: 74 20 6e 4f 75 74 20 20 20 20 20 20 20 20 20 20  t nOut          
0d50: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f    /* Number of o
0d60: 75 74 70 75 74 73 20 66 6f 72 20 74 68 65 20 6e  utputs for the n
0d70: 65 77 20 65 6e 74 72 79 20 2a 2f 0a 29 7b 0a 20  ew entry */.){. 
0d80: 20 75 31 36 20 69 3b 0a 20 20 57 68 65 72 65 4f   u16 i;.  WhereO
0d90: 72 43 6f 73 74 20 2a 70 3b 0a 20 20 66 6f 72 28  rCost *p;.  for(
0da0: 69 3d 70 53 65 74 2d 3e 6e 2c 20 70 3d 70 53 65  i=pSet->n, p=pSe
0db0: 74 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20  t->a; i>0; i--, 
0dc0: 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 72 52  p++){.    if( rR
0dd0: 75 6e 3c 3d 70 2d 3e 72 52 75 6e 20 26 26 20 28  un<=p->rRun && (
0de0: 70 72 65 72 65 71 20 26 20 70 2d 3e 70 72 65 72  prereq & p->prer
0df0: 65 71 29 3d 3d 70 72 65 72 65 71 20 29 7b 0a 20  eq)==prereq ){. 
0e00: 20 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65 4f       goto whereO
0e10: 72 49 6e 73 65 72 74 5f 64 6f 6e 65 3b 0a 20 20  rInsert_done;.  
0e20: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 72    }.    if( p->r
0e30: 52 75 6e 3c 3d 72 52 75 6e 20 26 26 20 28 70 2d  Run<=rRun && (p-
0e40: 3e 70 72 65 72 65 71 20 26 20 70 72 65 72 65 71  >prereq & prereq
0e50: 29 3d 3d 70 2d 3e 70 72 65 72 65 71 20 29 7b 0a  )==p->prereq ){.
0e60: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
0e70: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
0e80: 70 53 65 74 2d 3e 6e 3c 4e 5f 4f 52 5f 43 4f 53  pSet->n<N_OR_COS
0e90: 54 20 29 7b 0a 20 20 20 20 70 20 3d 20 26 70 53  T ){.    p = &pS
0ea0: 65 74 2d 3e 61 5b 70 53 65 74 2d 3e 6e 2b 2b 5d  et->a[pSet->n++]
0eb0: 3b 0a 20 20 20 20 70 2d 3e 6e 4f 75 74 20 3d 20  ;.    p->nOut = 
0ec0: 6e 4f 75 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  nOut;.  }else{. 
0ed0: 20 20 20 70 20 3d 20 70 53 65 74 2d 3e 61 3b 0a     p = pSet->a;.
0ee0: 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 70      for(i=1; i<p
0ef0: 53 65 74 2d 3e 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Set->n; i++){.  
0f00: 20 20 20 20 69 66 28 20 70 2d 3e 72 52 75 6e 3e      if( p->rRun>
0f10: 70 53 65 74 2d 3e 61 5b 69 5d 2e 72 52 75 6e 20  pSet->a[i].rRun 
0f20: 29 20 70 20 3d 20 70 53 65 74 2d 3e 61 20 2b 20  ) p = pSet->a + 
0f30: 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  i;.    }.    if(
0f40: 20 70 2d 3e 72 52 75 6e 3c 3d 72 52 75 6e 20 29   p->rRun<=rRun )
0f50: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 77   return 0;.  }.w
0f60: 68 65 72 65 4f 72 49 6e 73 65 72 74 5f 64 6f 6e  hereOrInsert_don
0f70: 65 3a 0a 20 20 70 2d 3e 70 72 65 72 65 71 20 3d  e:.  p->prereq =
0f80: 20 70 72 65 72 65 71 3b 0a 20 20 70 2d 3e 72 52   prereq;.  p->rR
0f90: 75 6e 20 3d 20 72 52 75 6e 3b 0a 20 20 69 66 28  un = rRun;.  if(
0fa0: 20 70 2d 3e 6e 4f 75 74 3e 6e 4f 75 74 20 29 20   p->nOut>nOut ) 
0fb0: 70 2d 3e 6e 4f 75 74 20 3d 20 6e 4f 75 74 3b 0a  p->nOut = nOut;.
0fc0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f    return 1;.}../
0fd0: 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
0fe0: 61 20 70 72 65 61 6c 6c 6f 63 61 74 65 64 20 57  a preallocated W
0ff0: 68 65 72 65 43 6c 61 75 73 65 20 73 74 72 75 63  hereClause struc
1000: 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ture..*/.static 
1010: 76 6f 69 64 20 77 68 65 72 65 43 6c 61 75 73 65  void whereClause
1020: 49 6e 69 74 28 0a 20 20 57 68 65 72 65 43 6c 61  Init(.  WhereCla
1030: 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20  use *pWC,       
1040: 20 2f 2a 20 54 68 65 20 57 68 65 72 65 43 6c 61   /* The WhereCla
1050: 75 73 65 20 74 6f 20 62 65 20 69 6e 69 74 69 61  use to be initia
1060: 6c 69 7a 65 64 20 2a 2f 0a 20 20 57 68 65 72 65  lized */.  Where
1070: 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 20 20 20  Info *pWInfo    
1080: 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
1090: 20 70 72 6f 63 65 73 73 69 6e 67 20 63 6f 6e 74   processing cont
10a0: 65 78 74 20 2a 2f 0a 29 7b 0a 20 20 70 57 43 2d  ext */.){.  pWC-
10b0: 3e 70 57 49 6e 66 6f 20 3d 20 70 57 49 6e 66 6f  >pWInfo = pWInfo
10c0: 3b 0a 20 20 70 57 43 2d 3e 70 4f 75 74 65 72 20  ;.  pWC->pOuter 
10d0: 3d 20 30 3b 0a 20 20 70 57 43 2d 3e 6e 54 65 72  = 0;.  pWC->nTer
10e0: 6d 20 3d 20 30 3b 0a 20 20 70 57 43 2d 3e 6e 53  m = 0;.  pWC->nS
10f0: 6c 6f 74 20 3d 20 41 72 72 61 79 53 69 7a 65 28  lot = ArraySize(
1100: 70 57 43 2d 3e 61 53 74 61 74 69 63 29 3b 0a 20  pWC->aStatic);. 
1110: 20 70 57 43 2d 3e 61 20 3d 20 70 57 43 2d 3e 61   pWC->a = pWC->a
1120: 53 74 61 74 69 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f  Static;.}../* Fo
1130: 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20  rward reference 
1140: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
1150: 68 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28  hereClauseClear(
1160: 57 68 65 72 65 43 6c 61 75 73 65 2a 29 3b 0a 0a  WhereClause*);..
1170: 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65  /*.** Deallocate
1180: 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 73 73 6f   all memory asso
1190: 63 69 61 74 65 64 20 77 69 74 68 20 61 20 57 68  ciated with a Wh
11a0: 65 72 65 4f 72 49 6e 66 6f 20 6f 62 6a 65 63 74  ereOrInfo object
11b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
11c0: 20 77 68 65 72 65 4f 72 49 6e 66 6f 44 65 6c 65   whereOrInfoDele
11d0: 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  te(sqlite3 *db, 
11e0: 57 68 65 72 65 4f 72 49 6e 66 6f 20 2a 70 29 7b  WhereOrInfo *p){
11f0: 0a 20 20 77 68 65 72 65 43 6c 61 75 73 65 43 6c  .  whereClauseCl
1200: 65 61 72 28 26 70 2d 3e 77 63 29 3b 0a 20 20 73  ear(&p->wc);.  s
1210: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
1220: 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65   p);.}../*.** De
1230: 61 6c 6c 6f 63 61 74 65 20 61 6c 6c 20 6d 65 6d  allocate all mem
1240: 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77  ory associated w
1250: 69 74 68 20 61 20 57 68 65 72 65 41 6e 64 49 6e  ith a WhereAndIn
1260: 66 6f 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74  fo object..*/.st
1270: 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 41  atic void whereA
1280: 6e 64 49 6e 66 6f 44 65 6c 65 74 65 28 73 71 6c  ndInfoDelete(sql
1290: 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 41  ite3 *db, WhereA
12a0: 6e 64 49 6e 66 6f 20 2a 70 29 7b 0a 20 20 77 68  ndInfo *p){.  wh
12b0: 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28 26  ereClauseClear(&
12c0: 70 2d 3e 77 63 29 3b 0a 20 20 73 71 6c 69 74 65  p->wc);.  sqlite
12d0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a  3DbFree(db, p);.
12e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63  }../*.** Dealloc
12f0: 61 74 65 20 61 20 57 68 65 72 65 43 6c 61 75 73  ate a WhereClaus
1300: 65 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68  e structure.  Th
1310: 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 73 74  e WhereClause st
1320: 72 75 63 74 75 72 65 0a 2a 2a 20 69 74 73 65 6c  ructure.** itsel
1330: 66 20 69 73 20 6e 6f 74 20 66 72 65 65 64 2e 20  f is not freed. 
1340: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
1350: 20 74 68 65 20 69 6e 76 65 72 73 65 20 6f 66 20   the inverse of 
1360: 77 68 65 72 65 43 6c 61 75 73 65 49 6e 69 74 28  whereClauseInit(
1370: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  )..*/.static voi
1380: 64 20 77 68 65 72 65 43 6c 61 75 73 65 43 6c 65  d whereClauseCle
1390: 61 72 28 57 68 65 72 65 43 6c 61 75 73 65 20 2a  ar(WhereClause *
13a0: 70 57 43 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  pWC){.  int i;. 
13b0: 20 57 68 65 72 65 54 65 72 6d 20 2a 61 3b 0a 20   WhereTerm *a;. 
13c0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
13d0: 57 43 2d 3e 70 57 49 6e 66 6f 2d 3e 70 50 61 72  WC->pWInfo->pPar
13e0: 73 65 2d 3e 64 62 3b 0a 20 20 66 6f 72 28 69 3d  se->db;.  for(i=
13f0: 70 57 43 2d 3e 6e 54 65 72 6d 2d 31 2c 20 61 3d  pWC->nTerm-1, a=
1400: 70 57 43 2d 3e 61 3b 20 69 3e 3d 30 3b 20 69 2d  pWC->a; i>=0; i-
1410: 2d 2c 20 61 2b 2b 29 7b 0a 20 20 20 20 69 66 28  -, a++){.    if(
1420: 20 61 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45   a->wtFlags & TE
1430: 52 4d 5f 44 59 4e 41 4d 49 43 20 29 7b 0a 20 20  RM_DYNAMIC ){.  
1440: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
1450: 65 6c 65 74 65 28 64 62 2c 20 61 2d 3e 70 45 78  elete(db, a->pEx
1460: 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  pr);.    }.    i
1470: 66 28 20 61 2d 3e 77 74 46 6c 61 67 73 20 26 20  f( a->wtFlags & 
1480: 54 45 52 4d 5f 4f 52 49 4e 46 4f 20 29 7b 0a 20  TERM_ORINFO ){. 
1490: 20 20 20 20 20 77 68 65 72 65 4f 72 49 6e 66 6f       whereOrInfo
14a0: 44 65 6c 65 74 65 28 64 62 2c 20 61 2d 3e 75 2e  Delete(db, a->u.
14b0: 70 4f 72 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 65  pOrInfo);.    }e
14c0: 6c 73 65 20 69 66 28 20 61 2d 3e 77 74 46 6c 61  lse if( a->wtFla
14d0: 67 73 20 26 20 54 45 52 4d 5f 41 4e 44 49 4e 46  gs & TERM_ANDINF
14e0: 4f 20 29 7b 0a 20 20 20 20 20 20 77 68 65 72 65  O ){.      where
14f0: 41 6e 64 49 6e 66 6f 44 65 6c 65 74 65 28 64 62  AndInfoDelete(db
1500: 2c 20 61 2d 3e 75 2e 70 41 6e 64 49 6e 66 6f 29  , a->u.pAndInfo)
1510: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
1520: 28 20 70 57 43 2d 3e 61 21 3d 70 57 43 2d 3e 61  ( pWC->a!=pWC->a
1530: 53 74 61 74 69 63 20 29 7b 0a 20 20 20 20 73 71  Static ){.    sq
1540: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
1550: 70 57 43 2d 3e 61 29 3b 0a 20 20 7d 0a 7d 0a 0a  pWC->a);.  }.}..
1560: 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 73 69 6e 67  /*.** Add a sing
1570: 6c 65 20 6e 65 77 20 57 68 65 72 65 54 65 72 6d  le new WhereTerm
1580: 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20 57 68   entry to the Wh
1590: 65 72 65 43 6c 61 75 73 65 20 6f 62 6a 65 63 74  ereClause object
15a0: 20 70 57 43 2e 0a 2a 2a 20 54 68 65 20 6e 65 77   pWC..** The new
15b0: 20 57 68 65 72 65 54 65 72 6d 20 6f 62 6a 65 63   WhereTerm objec
15c0: 74 20 69 73 20 63 6f 6e 73 74 72 75 63 74 65 64  t is constructed
15d0: 20 66 72 6f 6d 20 45 78 70 72 20 70 20 61 6e 64   from Expr p and
15e0: 20 77 69 74 68 20 77 74 46 6c 61 67 73 2e 0a 2a   with wtFlags..*
15f0: 2a 20 54 68 65 20 69 6e 64 65 78 20 69 6e 20 70  * The index in p
1600: 57 43 2d 3e 61 5b 5d 20 6f 66 20 74 68 65 20 6e  WC->a[] of the n
1610: 65 77 20 57 68 65 72 65 54 65 72 6d 20 69 73 20  ew WhereTerm is 
1620: 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63  returned on succ
1630: 65 73 73 2e 0a 2a 2a 20 30 20 69 73 20 72 65 74  ess..** 0 is ret
1640: 75 72 6e 65 64 20 69 66 20 74 68 65 20 6e 65 77  urned if the new
1650: 20 57 68 65 72 65 54 65 72 6d 20 63 6f 75 6c 64   WhereTerm could
1660: 20 6e 6f 74 20 62 65 20 61 64 64 65 64 20 64 75   not be added du
1670: 65 20 74 6f 20 61 20 6d 65 6d 6f 72 79 0a 2a 2a  e to a memory.**
1680: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f   allocation erro
1690: 72 2e 20 20 54 68 65 20 6d 65 6d 6f 72 79 20 61  r.  The memory a
16a0: 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 75 72  llocation failur
16b0: 65 20 77 69 6c 6c 20 62 65 20 72 65 63 6f 72 64  e will be record
16c0: 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 64 62 2d  ed in.** the db-
16d0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c  >mallocFailed fl
16e0: 61 67 20 73 6f 20 74 68 61 74 20 68 69 67 68 65  ag so that highe
16f0: 72 2d 6c 65 76 65 6c 20 66 75 6e 63 74 69 6f 6e  r-level function
1700: 73 20 63 61 6e 20 64 65 74 65 63 74 20 69 74 2e  s can detect it.
1710: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
1720: 69 6e 65 20 77 69 6c 6c 20 69 6e 63 72 65 61 73  ine will increas
1730: 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  e the size of th
1740: 65 20 70 57 43 2d 3e 61 5b 5d 20 61 72 72 61 79  e pWC->a[] array
1750: 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a   as necessary..*
1760: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 77 74 46 6c  *.** If the wtFl
1770: 61 67 73 20 61 72 67 75 6d 65 6e 74 20 69 6e 63  ags argument inc
1780: 6c 75 64 65 73 20 54 45 52 4d 5f 44 59 4e 41 4d  ludes TERM_DYNAM
1790: 49 43 2c 20 74 68 65 6e 20 72 65 73 70 6f 6e 73  IC, then respons
17a0: 69 62 69 6c 69 74 79 0a 2a 2a 20 66 6f 72 20 66  ibility.** for f
17b0: 72 65 65 69 6e 67 20 74 68 65 20 65 78 70 72 65  reeing the expre
17c0: 73 73 69 6f 6e 20 70 20 69 73 20 61 73 73 75 6d  ssion p is assum
17d0: 65 64 20 62 79 20 74 68 65 20 57 68 65 72 65 43  ed by the WhereC
17e0: 6c 61 75 73 65 20 6f 62 6a 65 63 74 20 70 57 43  lause object pWC
17f0: 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 72 75  ..** This is tru
1800: 65 20 65 76 65 6e 20 69 66 20 74 68 69 73 20 72  e even if this r
1810: 6f 75 74 69 6e 65 20 66 61 69 6c 73 20 74 6f 20  outine fails to 
1820: 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 57  allocate a new W
1830: 68 65 72 65 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20  hereTerm..**.** 
1840: 57 41 52 4e 49 4e 47 3a 20 20 54 68 69 73 20 72  WARNING:  This r
1850: 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 72 65 61  outine might rea
1860: 6c 6c 6f 63 61 74 65 20 74 68 65 20 73 70 61 63  llocate the spac
1870: 65 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a  e used to store.
1880: 2a 2a 20 57 68 65 72 65 54 65 72 6d 73 2e 20 20  ** WhereTerms.  
1890: 41 6c 6c 20 70 6f 69 6e 74 65 72 73 20 74 6f 20  All pointers to 
18a0: 57 68 65 72 65 54 65 72 6d 73 20 73 68 6f 75 6c  WhereTerms shoul
18b0: 64 20 62 65 20 69 6e 76 61 6c 69 64 61 74 65 64  d be invalidated
18c0: 20 61 66 74 65 72 0a 2a 2a 20 63 61 6c 6c 69 6e   after.** callin
18d0: 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20  g this routine. 
18e0: 20 53 75 63 68 20 70 6f 69 6e 74 65 72 73 20 6d   Such pointers m
18f0: 61 79 20 62 65 20 72 65 69 6e 69 74 69 61 6c 69  ay be reinitiali
1900: 7a 65 64 20 62 79 20 72 65 66 65 72 65 6e 63 69  zed by referenci
1910: 6e 67 0a 2a 2a 20 74 68 65 20 70 57 43 2d 3e 61  ng.** the pWC->a
1920: 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a 73 74 61  [] array..*/.sta
1930: 74 69 63 20 69 6e 74 20 77 68 65 72 65 43 6c 61  tic int whereCla
1940: 75 73 65 49 6e 73 65 72 74 28 57 68 65 72 65 43  useInsert(WhereC
1950: 6c 61 75 73 65 20 2a 70 57 43 2c 20 45 78 70 72  lause *pWC, Expr
1960: 20 2a 70 2c 20 75 38 20 77 74 46 6c 61 67 73 29   *p, u8 wtFlags)
1970: 7b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  {.  WhereTerm *p
1980: 54 65 72 6d 3b 0a 20 20 69 6e 74 20 69 64 78 3b  Term;.  int idx;
1990: 0a 20 20 74 65 73 74 63 61 73 65 28 20 77 74 46  .  testcase( wtF
19a0: 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54  lags & TERM_VIRT
19b0: 55 41 4c 20 29 3b 0a 20 20 69 66 28 20 70 57 43  UAL );.  if( pWC
19c0: 2d 3e 6e 54 65 72 6d 3e 3d 70 57 43 2d 3e 6e 53  ->nTerm>=pWC->nS
19d0: 6c 6f 74 20 29 7b 0a 20 20 20 20 57 68 65 72 65  lot ){.    Where
19e0: 54 65 72 6d 20 2a 70 4f 6c 64 20 3d 20 70 57 43  Term *pOld = pWC
19f0: 2d 3e 61 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ->a;.    sqlite3
1a00: 20 2a 64 62 20 3d 20 70 57 43 2d 3e 70 57 49 6e   *db = pWC->pWIn
1a10: 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a  fo->pParse->db;.
1a20: 20 20 20 20 70 57 43 2d 3e 61 20 3d 20 73 71 6c      pWC->a = sql
1a30: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
1a40: 64 62 2c 20 73 69 7a 65 6f 66 28 70 57 43 2d 3e  db, sizeof(pWC->
1a50: 61 5b 30 5d 29 2a 70 57 43 2d 3e 6e 53 6c 6f 74  a[0])*pWC->nSlot
1a60: 2a 32 20 29 3b 0a 20 20 20 20 69 66 28 20 70 57  *2 );.    if( pW
1a70: 43 2d 3e 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20  C->a==0 ){.     
1a80: 20 69 66 28 20 77 74 46 6c 61 67 73 20 26 20 54   if( wtFlags & T
1a90: 45 52 4d 5f 44 59 4e 41 4d 49 43 20 29 7b 0a 20  ERM_DYNAMIC ){. 
1aa0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
1ab0: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 29 3b  prDelete(db, p);
1ac0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
1ad0: 57 43 2d 3e 61 20 3d 20 70 4f 6c 64 3b 0a 20 20  WC->a = pOld;.  
1ae0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
1af0: 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28 70    }.    memcpy(p
1b00: 57 43 2d 3e 61 2c 20 70 4f 6c 64 2c 20 73 69 7a  WC->a, pOld, siz
1b10: 65 6f 66 28 70 57 43 2d 3e 61 5b 30 5d 29 2a 70  eof(pWC->a[0])*p
1b20: 57 43 2d 3e 6e 54 65 72 6d 29 3b 0a 20 20 20 20  WC->nTerm);.    
1b30: 69 66 28 20 70 4f 6c 64 21 3d 70 57 43 2d 3e 61  if( pOld!=pWC->a
1b40: 53 74 61 74 69 63 20 29 7b 0a 20 20 20 20 20 20  Static ){.      
1b50: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
1b60: 2c 20 70 4f 6c 64 29 3b 0a 20 20 20 20 7d 0a 20  , pOld);.    }. 
1b70: 20 20 20 70 57 43 2d 3e 6e 53 6c 6f 74 20 3d 20     pWC->nSlot = 
1b80: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 53  sqlite3DbMallocS
1b90: 69 7a 65 28 64 62 2c 20 70 57 43 2d 3e 61 29 2f  ize(db, pWC->a)/
1ba0: 73 69 7a 65 6f 66 28 70 57 43 2d 3e 61 5b 30 5d  sizeof(pWC->a[0]
1bb0: 29 3b 0a 20 20 7d 0a 20 20 70 54 65 72 6d 20 3d  );.  }.  pTerm =
1bc0: 20 26 70 57 43 2d 3e 61 5b 69 64 78 20 3d 20 70   &pWC->a[idx = p
1bd0: 57 43 2d 3e 6e 54 65 72 6d 2b 2b 5d 3b 0a 20 20  WC->nTerm++];.  
1be0: 69 66 28 20 70 20 26 26 20 45 78 70 72 48 61 73  if( p && ExprHas
1bf0: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 55  Property(p, EP_U
1c00: 6e 6c 69 6b 65 6c 79 29 20 29 7b 0a 20 20 20 20  nlikely) ){.    
1c10: 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62  pTerm->truthProb
1c20: 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
1c30: 28 70 2d 3e 69 54 61 62 6c 65 29 20 2d 20 32 37  (p->iTable) - 27
1c40: 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
1c50: 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62  pTerm->truthProb
1c60: 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 70 54 65 72   = 1;.  }.  pTer
1c70: 6d 2d 3e 70 45 78 70 72 20 3d 20 73 71 6c 69 74  m->pExpr = sqlit
1c80: 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74  e3ExprSkipCollat
1c90: 65 28 70 29 3b 0a 20 20 70 54 65 72 6d 2d 3e 77  e(p);.  pTerm->w
1ca0: 74 46 6c 61 67 73 20 3d 20 77 74 46 6c 61 67 73  tFlags = wtFlags
1cb0: 3b 0a 20 20 70 54 65 72 6d 2d 3e 70 57 43 20 3d  ;.  pTerm->pWC =
1cc0: 20 70 57 43 3b 0a 20 20 70 54 65 72 6d 2d 3e 69   pWC;.  pTerm->i
1cd0: 50 61 72 65 6e 74 20 3d 20 2d 31 3b 0a 20 20 72  Parent = -1;.  r
1ce0: 65 74 75 72 6e 20 69 64 78 3b 0a 7d 0a 0a 2f 2a  eturn idx;.}../*
1cf0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1d00: 20 69 64 65 6e 74 69 66 69 65 73 20 73 75 62 65   identifies sube
1d10: 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68  xpressions in th
1d20: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 77  e WHERE clause w
1d30: 68 65 72 65 0a 2a 2a 20 65 61 63 68 20 73 75 62  here.** each sub
1d40: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 73 65  expression is se
1d50: 70 61 72 61 74 65 64 20 62 79 20 74 68 65 20 41  parated by the A
1d60: 4e 44 20 6f 70 65 72 61 74 6f 72 20 6f 72 20 73  ND operator or s
1d70: 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 6f 70 65  ome other.** ope
1d80: 72 61 74 6f 72 20 73 70 65 63 69 66 69 65 64 20  rator specified 
1d90: 69 6e 20 74 68 65 20 6f 70 20 70 61 72 61 6d 65  in the op parame
1da0: 74 65 72 2e 20 20 54 68 65 20 57 68 65 72 65 43  ter.  The WhereC
1db0: 6c 61 75 73 65 20 73 74 72 75 63 74 75 72 65 0a  lause structure.
1dc0: 2a 2a 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74  ** is filled wit
1dd0: 68 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 73 75  h pointers to su
1de0: 62 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 20 46  bexpressions.  F
1df0: 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a  or example:.**.*
1e00: 2a 20 20 20 20 57 48 45 52 45 20 20 61 3d 3d 27  *    WHERE  a=='
1e10: 68 65 6c 6c 6f 27 20 41 4e 44 20 63 6f 61 6c 65  hello' AND coale
1e20: 73 63 65 28 62 2c 31 31 29 3c 31 30 20 41 4e 44  sce(b,11)<10 AND
1e30: 20 28 63 2b 31 32 21 3d 64 20 4f 52 20 63 3d 3d   (c+12!=d OR c==
1e40: 32 32 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  22).**          
1e50: 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20   \________/     
1e60: 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  \_______________
1e70: 2f 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f  /     \_________
1e80: 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 20 20 20 20 20  _______/.**     
1e90: 20 20 20 20 20 20 20 73 6c 6f 74 5b 30 5d 20 20         slot[0]  
1ea0: 20 20 20 20 20 20 20 20 20 20 73 6c 6f 74 5b 31            slot[1
1eb0: 5d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ]               
1ec0: 73 6c 6f 74 5b 32 5d 0a 2a 2a 0a 2a 2a 20 54 68  slot[2].**.** Th
1ed0: 65 20 6f 72 69 67 69 6e 61 6c 20 57 48 45 52 45  e original WHERE
1ee0: 20 63 6c 61 75 73 65 20 69 6e 20 70 45 78 70 72   clause in pExpr
1ef0: 20 69 73 20 75 6e 61 6c 74 65 72 65 64 2e 20 20   is unaltered.  
1f00: 41 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  All this routine
1f10: 0a 2a 2a 20 64 6f 65 73 20 69 73 20 6d 61 6b 65  .** does is make
1f20: 20 73 6c 6f 74 5b 5d 20 65 6e 74 72 69 65 73 20   slot[] entries 
1f30: 70 6f 69 6e 74 20 74 6f 20 73 75 62 73 74 72 75  point to substru
1f40: 63 74 75 72 65 20 77 69 74 68 69 6e 20 70 45 78  cture within pEx
1f50: 70 72 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65  pr..**.** In the
1f60: 20 70 72 65 76 69 6f 75 73 20 73 65 6e 74 65 6e   previous senten
1f70: 63 65 20 61 6e 64 20 69 6e 20 74 68 65 20 64 69  ce and in the di
1f80: 61 67 72 61 6d 2c 20 22 73 6c 6f 74 5b 5d 22 20  agram, "slot[]" 
1f90: 72 65 66 65 72 73 20 74 6f 0a 2a 2a 20 74 68 65  refers to.** the
1fa0: 20 57 68 65 72 65 43 6c 61 75 73 65 2e 61 5b 5d   WhereClause.a[]
1fb0: 20 61 72 72 61 79 2e 20 20 54 68 65 20 73 6c 6f   array.  The slo
1fc0: 74 5b 5d 20 61 72 72 61 79 20 67 72 6f 77 73 20  t[] array grows 
1fd0: 61 73 20 6e 65 65 64 65 64 20 74 6f 20 63 6f 6e  as needed to con
1fe0: 74 61 69 6e 0a 2a 2a 20 61 6c 6c 20 74 65 72 6d  tain.** all term
1ff0: 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  s of the WHERE c
2000: 6c 61 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  lause..*/.static
2010: 20 76 6f 69 64 20 77 68 65 72 65 53 70 6c 69 74   void whereSplit
2020: 28 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57  (WhereClause *pW
2030: 43 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  C, Expr *pExpr, 
2040: 75 38 20 6f 70 29 7b 0a 20 20 70 57 43 2d 3e 6f  u8 op){.  pWC->o
2050: 70 20 3d 20 6f 70 3b 0a 20 20 69 66 28 20 70 45  p = op;.  if( pE
2060: 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  xpr==0 ) return;
2070: 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  .  if( pExpr->op
2080: 21 3d 6f 70 20 29 7b 0a 20 20 20 20 77 68 65 72  !=op ){.    wher
2090: 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57  eClauseInsert(pW
20a0: 43 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20  C, pExpr, 0);.  
20b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 65 72 65  }else{.    where
20c0: 53 70 6c 69 74 28 70 57 43 2c 20 70 45 78 70 72  Split(pWC, pExpr
20d0: 2d 3e 70 4c 65 66 74 2c 20 6f 70 29 3b 0a 20 20  ->pLeft, op);.  
20e0: 20 20 77 68 65 72 65 53 70 6c 69 74 28 70 57 43    whereSplit(pWC
20f0: 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
2100: 20 6f 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   op);.  }.}../*.
2110: 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 20  ** Initialize a 
2120: 57 68 65 72 65 4d 61 73 6b 53 65 74 20 6f 62 6a  WhereMaskSet obj
2130: 65 63 74 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 69  ect.*/.#define i
2140: 6e 69 74 4d 61 73 6b 53 65 74 28 50 29 20 20 28  nitMaskSet(P)  (
2150: 50 29 2d 3e 6e 3d 30 0a 0a 2f 2a 0a 2a 2a 20 52  P)->n=0../*.** R
2160: 65 74 75 72 6e 20 74 68 65 20 62 69 74 6d 61 73  eturn the bitmas
2170: 6b 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20  k for the given 
2180: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 2e 20 20  cursor number.  
2190: 52 65 74 75 72 6e 20 30 20 69 66 0a 2a 2a 20 69  Return 0 if.** i
21a0: 43 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 69 6e  Cursor is not in
21b0: 20 74 68 65 20 73 65 74 2e 0a 2a 2f 0a 73 74 61   the set..*/.sta
21c0: 74 69 63 20 42 69 74 6d 61 73 6b 20 67 65 74 4d  tic Bitmask getM
21d0: 61 73 6b 28 57 68 65 72 65 4d 61 73 6b 53 65 74  ask(WhereMaskSet
21e0: 20 2a 70 4d 61 73 6b 53 65 74 2c 20 69 6e 74 20   *pMaskSet, int 
21f0: 69 43 75 72 73 6f 72 29 7b 0a 20 20 69 6e 74 20  iCursor){.  int 
2200: 69 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4d 61  i;.  assert( pMa
2210: 73 6b 53 65 74 2d 3e 6e 3c 3d 28 69 6e 74 29 73  skSet->n<=(int)s
2220: 69 7a 65 6f 66 28 42 69 74 6d 61 73 6b 29 2a 38  izeof(Bitmask)*8
2230: 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   );.  for(i=0; i
2240: 3c 70 4d 61 73 6b 53 65 74 2d 3e 6e 3b 20 69 2b  <pMaskSet->n; i+
2250: 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 4d 61 73  +){.    if( pMas
2260: 6b 53 65 74 2d 3e 69 78 5b 69 5d 3d 3d 69 43 75  kSet->ix[i]==iCu
2270: 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 72 65  rsor ){.      re
2280: 74 75 72 6e 20 4d 41 53 4b 42 49 54 28 69 29 3b  turn MASKBIT(i);
2290: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
22a0: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
22b0: 43 72 65 61 74 65 20 61 20 6e 65 77 20 6d 61 73  Create a new mas
22c0: 6b 20 66 6f 72 20 63 75 72 73 6f 72 20 69 43 75  k for cursor iCu
22d0: 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72  rsor..**.** Ther
22e0: 65 20 69 73 20 6f 6e 65 20 63 75 72 73 6f 72 20  e is one cursor 
22f0: 70 65 72 20 74 61 62 6c 65 20 69 6e 20 74 68 65  per table in the
2300: 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 54   FROM clause.  T
2310: 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  he number of.** 
2320: 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52  tables in the FR
2330: 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 6c 69 6d  OM clause is lim
2340: 69 74 65 64 20 62 79 20 61 20 74 65 73 74 20 65  ited by a test e
2350: 61 72 6c 79 20 69 6e 20 74 68 65 0a 2a 2a 20 73  arly in the.** s
2360: 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
2370: 28 29 20 72 6f 75 74 69 6e 65 2e 20 20 53 6f 20  () routine.  So 
2380: 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65  we know that the
2390: 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 5d 0a   pMaskSet->ix[].
23a0: 2a 2a 20 61 72 72 61 79 20 77 69 6c 6c 20 6e 65  ** array will ne
23b0: 76 65 72 20 6f 76 65 72 66 6c 6f 77 2e 0a 2a 2f  ver overflow..*/
23c0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 72 65  .static void cre
23d0: 61 74 65 4d 61 73 6b 28 57 68 65 72 65 4d 61 73  ateMask(WhereMas
23e0: 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20  kSet *pMaskSet, 
23f0: 69 6e 74 20 69 43 75 72 73 6f 72 29 7b 0a 20 20  int iCursor){.  
2400: 61 73 73 65 72 74 28 20 70 4d 61 73 6b 53 65 74  assert( pMaskSet
2410: 2d 3e 6e 20 3c 20 41 72 72 61 79 53 69 7a 65 28  ->n < ArraySize(
2420: 70 4d 61 73 6b 53 65 74 2d 3e 69 78 29 20 29 3b  pMaskSet->ix) );
2430: 0a 20 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b  .  pMaskSet->ix[
2440: 70 4d 61 73 6b 53 65 74 2d 3e 6e 2b 2b 5d 20 3d  pMaskSet->n++] =
2450: 20 69 43 75 72 73 6f 72 3b 0a 7d 0a 0a 2f 2a 0a   iCursor;.}../*.
2460: 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65  ** These routine
2470: 73 20 77 61 6c 6b 20 28 72 65 63 75 72 73 69 76  s walk (recursiv
2480: 65 6c 79 29 20 61 6e 20 65 78 70 72 65 73 73 69  ely) an expressi
2490: 6f 6e 20 74 72 65 65 20 61 6e 64 20 67 65 6e 65  on tree and gene
24a0: 72 61 74 65 0a 2a 2a 20 61 20 62 69 74 6d 61 73  rate.** a bitmas
24b0: 6b 20 69 6e 64 69 63 61 74 69 6e 67 20 77 68 69  k indicating whi
24c0: 63 68 20 74 61 62 6c 65 73 20 61 72 65 20 75 73  ch tables are us
24d0: 65 64 20 69 6e 20 74 68 61 74 20 65 78 70 72 65  ed in that expre
24e0: 73 73 69 6f 6e 0a 2a 2a 20 74 72 65 65 2e 0a 2a  ssion.** tree..*
24f0: 2f 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b  /.static Bitmask
2500: 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73   exprListTableUs
2510: 61 67 65 28 57 68 65 72 65 4d 61 73 6b 53 65 74  age(WhereMaskSet
2520: 2a 2c 20 45 78 70 72 4c 69 73 74 2a 29 3b 0a 73  *, ExprList*);.s
2530: 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20 65 78  tatic Bitmask ex
2540: 70 72 53 65 6c 65 63 74 54 61 62 6c 65 55 73 61  prSelectTableUsa
2550: 67 65 28 57 68 65 72 65 4d 61 73 6b 53 65 74 2a  ge(WhereMaskSet*
2560: 2c 20 53 65 6c 65 63 74 2a 29 3b 0a 73 74 61 74  , Select*);.stat
2570: 69 63 20 42 69 74 6d 61 73 6b 20 65 78 70 72 54  ic Bitmask exprT
2580: 61 62 6c 65 55 73 61 67 65 28 57 68 65 72 65 4d  ableUsage(WhereM
2590: 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74  askSet *pMaskSet
25a0: 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 42 69  , Expr *p){.  Bi
25b0: 74 6d 61 73 6b 20 6d 61 73 6b 20 3d 20 30 3b 0a  tmask mask = 0;.
25c0: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
25d0: 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e  urn 0;.  if( p->
25e0: 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b  op==TK_COLUMN ){
25f0: 0a 20 20 20 20 6d 61 73 6b 20 3d 20 67 65 74 4d  .    mask = getM
2600: 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d  ask(pMaskSet, p-
2610: 3e 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 72 65  >iTable);.    re
2620: 74 75 72 6e 20 6d 61 73 6b 3b 0a 20 20 7d 0a 20  turn mask;.  }. 
2630: 20 6d 61 73 6b 20 3d 20 65 78 70 72 54 61 62 6c   mask = exprTabl
2640: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
2650: 20 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 6d   p->pRight);.  m
2660: 61 73 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c 65  ask |= exprTable
2670: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
2680: 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66 28  p->pLeft);.  if(
2690: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
26a0: 28 70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  (p, EP_xIsSelect
26b0: 29 20 29 7b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d  ) ){.    mask |=
26c0: 20 65 78 70 72 53 65 6c 65 63 74 54 61 62 6c 65   exprSelectTable
26d0: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
26e0: 70 2d 3e 78 2e 70 53 65 6c 65 63 74 29 3b 0a 20  p->x.pSelect);. 
26f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 61 73 6b   }else{.    mask
2700: 20 7c 3d 20 65 78 70 72 4c 69 73 74 54 61 62 6c   |= exprListTabl
2710: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
2720: 20 70 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20   p->x.pList);.  
2730: 7d 0a 20 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b  }.  return mask;
2740: 0a 7d 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73  .}.static Bitmas
2750: 6b 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55  k exprListTableU
2760: 73 61 67 65 28 57 68 65 72 65 4d 61 73 6b 53 65  sage(WhereMaskSe
2770: 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 45 78 70  t *pMaskSet, Exp
2780: 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20  rList *pList){. 
2790: 20 69 6e 74 20 69 3b 0a 20 20 42 69 74 6d 61 73   int i;.  Bitmas
27a0: 6b 20 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 69 66  k mask = 0;.  if
27b0: 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 66  ( pList ){.    f
27c0: 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  or(i=0; i<pList-
27d0: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
27e0: 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72      mask |= expr
27f0: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
2800: 53 65 74 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d  Set, pList->a[i]
2810: 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20  .pExpr);.    }. 
2820: 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d 61 73 6b   }.  return mask
2830: 3b 0a 7d 0a 73 74 61 74 69 63 20 42 69 74 6d 61  ;.}.static Bitma
2840: 73 6b 20 65 78 70 72 53 65 6c 65 63 74 54 61 62  sk exprSelectTab
2850: 6c 65 55 73 61 67 65 28 57 68 65 72 65 4d 61 73  leUsage(WhereMas
2860: 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20  kSet *pMaskSet, 
2870: 53 65 6c 65 63 74 20 2a 70 53 29 7b 0a 20 20 42  Select *pS){.  B
2880: 69 74 6d 61 73 6b 20 6d 61 73 6b 20 3d 20 30 3b  itmask mask = 0;
2890: 0a 20 20 77 68 69 6c 65 28 20 70 53 20 29 7b 0a  .  while( pS ){.
28a0: 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72      SrcList *pSr
28b0: 63 20 3d 20 70 53 2d 3e 70 53 72 63 3b 0a 20 20  c = pS->pSrc;.  
28c0: 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69    mask |= exprLi
28d0: 73 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  stTableUsage(pMa
28e0: 73 6b 53 65 74 2c 20 70 53 2d 3e 70 45 4c 69 73  skSet, pS->pELis
28f0: 74 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20  t);.    mask |= 
2900: 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61  exprListTableUsa
2910: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d  ge(pMaskSet, pS-
2920: 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20  >pGroupBy);.    
2930: 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69 73 74  mask |= exprList
2940: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
2950: 53 65 74 2c 20 70 53 2d 3e 70 4f 72 64 65 72 42  Set, pS->pOrderB
2960: 79 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20  y);.    mask |= 
2970: 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70  exprTableUsage(p
2980: 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70 57 68  MaskSet, pS->pWh
2990: 65 72 65 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c  ere);.    mask |
29a0: 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65  = exprTableUsage
29b0: 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70  (pMaskSet, pS->p
29c0: 48 61 76 69 6e 67 29 3b 0a 20 20 20 20 69 66 28  Having);.    if(
29d0: 20 41 4c 57 41 59 53 28 70 53 72 63 21 3d 30 29   ALWAYS(pSrc!=0)
29e0: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   ){.      int i;
29f0: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
2a00: 69 3c 70 53 72 63 2d 3e 6e 53 72 63 3b 20 69 2b  i<pSrc->nSrc; i+
2a10: 2b 29 7b 0a 20 20 20 20 20 20 20 20 6d 61 73 6b  +){.        mask
2a20: 20 7c 3d 20 65 78 70 72 53 65 6c 65 63 74 54 61   |= exprSelectTa
2a30: 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65  bleUsage(pMaskSe
2a40: 74 2c 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 53  t, pSrc->a[i].pS
2a50: 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20  elect);.        
2a60: 6d 61 73 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c  mask |= exprTabl
2a70: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
2a80: 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 4f 6e 29   pSrc->a[i].pOn)
2a90: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2aa0: 20 20 20 20 70 53 20 3d 20 70 53 2d 3e 70 50 72      pS = pS->pPr
2ab0: 69 6f 72 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ior;.  }.  retur
2ac0: 6e 20 6d 61 73 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n mask;.}../*.**
2ad0: 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
2ae0: 74 68 65 20 67 69 76 65 6e 20 6f 70 65 72 61 74  the given operat
2af0: 6f 72 20 69 73 20 6f 6e 65 20 6f 66 20 74 68 65  or is one of the
2b00: 20 6f 70 65 72 61 74 6f 72 73 20 74 68 61 74 20   operators that 
2b10: 69 73 0a 2a 2a 20 61 6c 6c 6f 77 65 64 20 66 6f  is.** allowed fo
2b20: 72 20 61 6e 20 69 6e 64 65 78 61 62 6c 65 20 57  r an indexable W
2b30: 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d  HERE clause term
2b40: 2e 20 20 54 68 65 20 61 6c 6c 6f 77 65 64 20 6f  .  The allowed o
2b50: 70 65 72 61 74 6f 72 73 20 61 72 65 0a 2a 2a 20  perators are.** 
2b60: 22 3d 22 2c 20 22 3c 22 2c 20 22 3e 22 2c 20 22  "=", "<", ">", "
2b70: 3c 3d 22 2c 20 22 3e 3d 22 2c 20 22 49 4e 22 2c  <=", ">=", "IN",
2b80: 20 61 6e 64 20 22 49 53 20 4e 55 4c 4c 22 0a 2a   and "IS NULL".*
2b90: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c  /.static int all
2ba0: 6f 77 65 64 4f 70 28 69 6e 74 20 6f 70 29 7b 0a  owedOp(int op){.
2bb0: 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 54 3e    assert( TK_GT>
2bc0: 54 4b 5f 45 51 20 26 26 20 54 4b 5f 47 54 3c 54  TK_EQ && TK_GT<T
2bd0: 4b 5f 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74  K_GE );.  assert
2be0: 28 20 54 4b 5f 4c 54 3e 54 4b 5f 45 51 20 26 26  ( TK_LT>TK_EQ &&
2bf0: 20 54 4b 5f 4c 54 3c 54 4b 5f 47 45 20 29 3b 0a   TK_LT<TK_GE );.
2c00: 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 45 3e    assert( TK_LE>
2c10: 54 4b 5f 45 51 20 26 26 20 54 4b 5f 4c 45 3c 54  TK_EQ && TK_LE<T
2c20: 4b 5f 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74  K_GE );.  assert
2c30: 28 20 54 4b 5f 47 45 3d 3d 54 4b 5f 45 51 2b 34  ( TK_GE==TK_EQ+4
2c40: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 6f 70 3d   );.  return op=
2c50: 3d 54 4b 5f 49 4e 20 7c 7c 20 28 6f 70 3e 3d 54  =TK_IN || (op>=T
2c60: 4b 5f 45 51 20 26 26 20 6f 70 3c 3d 54 4b 5f 47  K_EQ && op<=TK_G
2c70: 45 29 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 53 4e  E) || op==TK_ISN
2c80: 55 4c 4c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  ULL;.}../*.** Co
2c90: 6d 6d 75 74 65 20 61 20 63 6f 6d 70 61 72 69 73  mmute a comparis
2ca0: 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 20 20 45 78  on operator.  Ex
2cb0: 70 72 65 73 73 69 6f 6e 73 20 6f 66 20 74 68 65  pressions of the
2cc0: 20 66 6f 72 6d 20 22 58 20 6f 70 20 59 22 0a 2a   form "X op Y".*
2cd0: 2a 20 61 72 65 20 63 6f 6e 76 65 72 74 65 64 20  * are converted 
2ce0: 69 6e 74 6f 20 22 59 20 6f 70 20 58 22 2e 0a 2a  into "Y op X"..*
2cf0: 2a 0a 2a 2a 20 49 66 20 6c 65 66 74 2f 72 69 67  *.** If left/rig
2d00: 68 74 20 70 72 65 63 65 64 65 6e 63 65 20 72 75  ht precedence ru
2d10: 6c 65 73 20 63 6f 6d 65 20 69 6e 74 6f 20 70 6c  les come into pl
2d20: 61 79 20 77 68 65 6e 20 64 65 74 65 72 6d 69 6e  ay when determin
2d30: 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 6c 6c 61  ing the.** colla
2d40: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2c 20 74  ting sequence, t
2d50: 68 65 6e 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72  hen COLLATE oper
2d60: 61 74 6f 72 73 20 61 72 65 20 61 64 6a 75 73 74  ators are adjust
2d70: 65 64 20 74 6f 20 65 6e 73 75 72 65 0a 2a 2a 20  ed to ensure.** 
2d80: 74 68 61 74 20 74 68 65 20 63 6f 6c 6c 61 74 69  that the collati
2d90: 6e 67 20 73 65 71 75 65 6e 63 65 20 64 6f 65 73  ng sequence does
2da0: 20 6e 6f 74 20 63 68 61 6e 67 65 2e 20 20 46 6f   not change.  Fo
2db0: 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 20 22 59  r example:.** "Y
2dc0: 20 63 6f 6c 6c 61 74 65 20 4e 4f 43 41 53 45 20   collate NOCASE 
2dd0: 6f 70 20 58 22 20 62 65 63 6f 6d 65 73 20 22 58  op X" becomes "X
2de0: 20 6f 70 20 59 22 20 62 65 63 61 75 73 65 20 61   op Y" because a
2df0: 6e 79 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  ny collation seq
2e00: 75 65 6e 63 65 20 6f 6e 0a 2a 2a 20 74 68 65 20  uence on.** the 
2e10: 6c 65 66 74 20 68 61 6e 64 20 73 69 64 65 20 6f  left hand side o
2e20: 66 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f  f a comparison o
2e30: 76 65 72 72 69 64 65 73 20 61 6e 79 20 63 6f 6c  verrides any col
2e40: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
2e50: 0a 2a 2a 20 61 74 74 61 63 68 65 64 20 74 6f 20  .** attached to 
2e60: 74 68 65 20 72 69 67 68 74 2e 20 46 6f 72 20 74  the right. For t
2e70: 68 65 20 73 61 6d 65 20 72 65 61 73 6f 6e 20 74  he same reason t
2e80: 68 65 20 45 50 5f 43 6f 6c 6c 61 74 65 20 66 6c  he EP_Collate fl
2e90: 61 67 0a 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6d  ag.** is not com
2ea0: 6d 75 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  muted..*/.static
2eb0: 20 76 6f 69 64 20 65 78 70 72 43 6f 6d 6d 75 74   void exprCommut
2ec0: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
2ed0: 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20   Expr *pExpr){. 
2ee0: 20 75 31 36 20 65 78 70 52 69 67 68 74 20 3d 20   u16 expRight = 
2ef0: 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2d 3e  (pExpr->pRight->
2f00: 66 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61  flags & EP_Colla
2f10: 74 65 29 3b 0a 20 20 75 31 36 20 65 78 70 4c 65  te);.  u16 expLe
2f20: 66 74 20 3d 20 28 70 45 78 70 72 2d 3e 70 4c 65  ft = (pExpr->pLe
2f30: 66 74 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 43  ft->flags & EP_C
2f40: 6f 6c 6c 61 74 65 29 3b 0a 20 20 61 73 73 65 72  ollate);.  asser
2f50: 74 28 20 61 6c 6c 6f 77 65 64 4f 70 28 70 45 78  t( allowedOp(pEx
2f60: 70 72 2d 3e 6f 70 29 20 26 26 20 70 45 78 70 72  pr->op) && pExpr
2f70: 2d 3e 6f 70 21 3d 54 4b 5f 49 4e 20 29 3b 0a 20  ->op!=TK_IN );. 
2f80: 20 69 66 28 20 65 78 70 52 69 67 68 74 3d 3d 65   if( expRight==e
2f90: 78 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 2f 2a  xpLeft ){.    /*
2fa0: 20 45 69 74 68 65 72 20 58 20 61 6e 64 20 59 20   Either X and Y 
2fb0: 62 6f 74 68 20 68 61 76 65 20 43 4f 4c 4c 41 54  both have COLLAT
2fc0: 45 20 6f 70 65 72 61 74 6f 72 20 6f 72 20 6e 65  E operator or ne
2fd0: 69 74 68 65 72 20 64 6f 20 2a 2f 0a 20 20 20 20  ither do */.    
2fe0: 69 66 28 20 65 78 70 52 69 67 68 74 20 29 7b 0a  if( expRight ){.
2ff0: 20 20 20 20 20 20 2f 2a 20 42 6f 74 68 20 58 20        /* Both X 
3000: 61 6e 64 20 59 20 68 61 76 65 20 43 4f 4c 4c 41  and Y have COLLA
3010: 54 45 20 6f 70 65 72 61 74 6f 72 73 2e 20 20 4d  TE operators.  M
3020: 61 6b 65 20 73 75 72 65 20 58 20 69 73 20 61 6c  ake sure X is al
3030: 77 61 79 73 0a 20 20 20 20 20 20 2a 2a 20 75 73  ways.      ** us
3040: 65 64 20 62 79 20 63 6c 65 61 72 69 6e 67 20 74  ed by clearing t
3050: 68 65 20 45 50 5f 43 6f 6c 6c 61 74 65 20 66 6c  he EP_Collate fl
3060: 61 67 20 66 72 6f 6d 20 59 2e 20 2a 2f 0a 20 20  ag from Y. */.  
3070: 20 20 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68      pExpr->pRigh
3080: 74 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 45 50 5f  t->flags &= ~EP_
3090: 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 7d 65 6c  Collate;.    }el
30a0: 73 65 20 69 66 28 20 73 71 6c 69 74 65 33 45 78  se if( sqlite3Ex
30b0: 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
30c0: 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 21  , pExpr->pLeft)!
30d0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4e  =0 ){.      /* N
30e0: 65 69 74 68 65 72 20 58 20 6e 6f 72 20 59 20 68  either X nor Y h
30f0: 61 76 65 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72  ave COLLATE oper
3100: 61 74 6f 72 73 2c 20 62 75 74 20 58 20 68 61 73  ators, but X has
3110: 20 61 20 6e 6f 6e 2d 64 65 66 61 75 6c 74 0a 20   a non-default. 
3120: 20 20 20 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6e       ** collatin
3130: 67 20 73 65 71 75 65 6e 63 65 2e 20 20 53 6f 20  g sequence.  So 
3140: 61 64 64 20 74 68 65 20 45 50 5f 43 6f 6c 6c 61  add the EP_Colla
3150: 74 65 20 6d 61 72 6b 65 72 20 6f 6e 20 58 20 74  te marker on X t
3160: 6f 20 63 61 75 73 65 0a 20 20 20 20 20 20 2a 2a  o cause.      **
3170: 20 69 74 20 74 6f 20 62 65 20 73 65 61 72 63 68   it to be search
3180: 65 64 20 66 69 72 73 74 2e 20 2a 2f 0a 20 20 20  ed first. */.   
3190: 20 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d     pExpr->pLeft-
31a0: 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 43 6f 6c  >flags |= EP_Col
31b0: 6c 61 74 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  late;.    }.  }.
31c0: 20 20 53 57 41 50 28 45 78 70 72 2a 2c 70 45 78    SWAP(Expr*,pEx
31d0: 70 72 2d 3e 70 52 69 67 68 74 2c 70 45 78 70 72  pr->pRight,pExpr
31e0: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66 28 20  ->pLeft);.  if( 
31f0: 70 45 78 70 72 2d 3e 6f 70 3e 3d 54 4b 5f 47 54  pExpr->op>=TK_GT
3200: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
3210: 54 4b 5f 4c 54 3d 3d 54 4b 5f 47 54 2b 32 20 29  TK_LT==TK_GT+2 )
3220: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 54 4b  ;.    assert( TK
3230: 5f 47 45 3d 3d 54 4b 5f 4c 45 2b 32 20 29 3b 0a  _GE==TK_LE+2 );.
3240: 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47      assert( TK_G
3250: 54 3e 54 4b 5f 45 51 20 29 3b 0a 20 20 20 20 61  T>TK_EQ );.    a
3260: 73 73 65 72 74 28 20 54 4b 5f 47 54 3c 54 4b 5f  ssert( TK_GT<TK_
3270: 4c 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  LE );.    assert
3280: 28 20 70 45 78 70 72 2d 3e 6f 70 3e 3d 54 4b 5f  ( pExpr->op>=TK_
3290: 47 54 20 26 26 20 70 45 78 70 72 2d 3e 6f 70 3c  GT && pExpr->op<
32a0: 3d 54 4b 5f 47 45 20 29 3b 0a 20 20 20 20 70 45  =TK_GE );.    pE
32b0: 78 70 72 2d 3e 6f 70 20 3d 20 28 28 70 45 78 70  xpr->op = ((pExp
32c0: 72 2d 3e 6f 70 2d 54 4b 5f 47 54 29 5e 32 29 2b  r->op-TK_GT)^2)+
32d0: 54 4b 5f 47 54 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  TK_GT;.  }.}../*
32e0: 0a 2a 2a 20 54 72 61 6e 73 6c 61 74 65 20 66 72  .** Translate fr
32f0: 6f 6d 20 54 4b 5f 78 78 20 6f 70 65 72 61 74 6f  om TK_xx operato
3300: 72 20 74 6f 20 57 4f 5f 78 78 20 62 69 74 6d 61  r to WO_xx bitma
3310: 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 31  sk..*/.static u1
3320: 36 20 6f 70 65 72 61 74 6f 72 4d 61 73 6b 28 69  6 operatorMask(i
3330: 6e 74 20 6f 70 29 7b 0a 20 20 75 31 36 20 63 3b  nt op){.  u16 c;
3340: 0a 20 20 61 73 73 65 72 74 28 20 61 6c 6c 6f 77  .  assert( allow
3350: 65 64 4f 70 28 6f 70 29 20 29 3b 0a 20 20 69 66  edOp(op) );.  if
3360: 28 20 6f 70 3d 3d 54 4b 5f 49 4e 20 29 7b 0a 20  ( op==TK_IN ){. 
3370: 20 20 20 63 20 3d 20 57 4f 5f 49 4e 3b 0a 20 20     c = WO_IN;.  
3380: 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b  }else if( op==TK
3390: 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 63  _ISNULL ){.    c
33a0: 20 3d 20 57 4f 5f 49 53 4e 55 4c 4c 3b 0a 20 20   = WO_ISNULL;.  
33b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
33c0: 74 28 20 28 57 4f 5f 45 51 3c 3c 28 6f 70 2d 54  t( (WO_EQ<<(op-T
33d0: 4b 5f 45 51 29 29 20 3c 20 30 78 37 66 66 66 20  K_EQ)) < 0x7fff 
33e0: 29 3b 0a 20 20 20 20 63 20 3d 20 28 75 31 36 29  );.    c = (u16)
33f0: 28 57 4f 5f 45 51 3c 3c 28 6f 70 2d 54 4b 5f 45  (WO_EQ<<(op-TK_E
3400: 51 29 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  Q));.  }.  asser
3410: 74 28 20 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c  t( op!=TK_ISNULL
3420: 20 7c 7c 20 63 3d 3d 57 4f 5f 49 53 4e 55 4c 4c   || c==WO_ISNULL
3430: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70   );.  assert( op
3440: 21 3d 54 4b 5f 49 4e 20 7c 7c 20 63 3d 3d 57 4f  !=TK_IN || c==WO
3450: 5f 49 4e 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _IN );.  assert(
3460: 20 6f 70 21 3d 54 4b 5f 45 51 20 7c 7c 20 63 3d   op!=TK_EQ || c=
3470: 3d 57 4f 5f 45 51 20 29 3b 0a 20 20 61 73 73 65  =WO_EQ );.  asse
3480: 72 74 28 20 6f 70 21 3d 54 4b 5f 4c 54 20 7c 7c  rt( op!=TK_LT ||
3490: 20 63 3d 3d 57 4f 5f 4c 54 20 29 3b 0a 20 20 61   c==WO_LT );.  a
34a0: 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 4c 45  ssert( op!=TK_LE
34b0: 20 7c 7c 20 63 3d 3d 57 4f 5f 4c 45 20 29 3b 0a   || c==WO_LE );.
34c0: 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b    assert( op!=TK
34d0: 5f 47 54 20 7c 7c 20 63 3d 3d 57 4f 5f 47 54 20  _GT || c==WO_GT 
34e0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21  );.  assert( op!
34f0: 3d 54 4b 5f 47 45 20 7c 7c 20 63 3d 3d 57 4f 5f  =TK_GE || c==WO_
3500: 47 45 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 63  GE );.  return c
3510: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e  ;.}../*.** Advan
3520: 63 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20 57  ce to the next W
3530: 68 65 72 65 54 65 72 6d 20 74 68 61 74 20 6d 61  hereTerm that ma
3540: 74 63 68 65 73 20 61 63 63 6f 72 64 69 6e 67 20  tches according 
3550: 74 6f 20 74 68 65 20 63 72 69 74 65 72 69 61 0a  to the criteria.
3560: 2a 2a 20 65 73 74 61 62 6c 69 73 68 65 64 20 77  ** established w
3570: 68 65 6e 20 74 68 65 20 70 53 63 61 6e 20 6f 62  hen the pScan ob
3580: 6a 65 63 74 20 77 61 73 20 69 6e 69 74 69 61 6c  ject was initial
3590: 69 7a 65 64 20 62 79 20 77 68 65 72 65 53 63 61  ized by whereSca
35a0: 6e 49 6e 69 74 28 29 2e 0a 2a 2a 20 52 65 74 75  nInit()..** Retu
35b0: 72 6e 20 4e 55 4c 4c 20 69 66 20 74 68 65 72 65  rn NULL if there
35c0: 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20 6d 61 74   are no more mat
35d0: 63 68 69 6e 67 20 57 68 65 72 65 54 65 72 6d 73  ching WhereTerms
35e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 57 68 65 72  ..*/.static Wher
35f0: 65 54 65 72 6d 20 2a 77 68 65 72 65 53 63 61 6e  eTerm *whereScan
3600: 4e 65 78 74 28 57 68 65 72 65 53 63 61 6e 20 2a  Next(WhereScan *
3610: 70 53 63 61 6e 29 7b 0a 20 20 69 6e 74 20 69 43  pScan){.  int iC
3620: 75 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ur;            /
3630: 2a 20 54 68 65 20 63 75 72 73 6f 72 20 6f 6e 20  * The cursor on 
3640: 74 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20 74  the LHS of the t
3650: 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f  erm */.  int iCo
3660: 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a  lumn;         /*
3670: 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6f 6e 20 74   The column on t
3680: 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20 74 65  he LHS of the te
3690: 72 6d 2e 20 20 2d 31 20 66 6f 72 20 49 50 4b 20  rm.  -1 for IPK 
36a0: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 58 3b 20 20  */.  Expr *pX;  
36b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20            /* An 
36c0: 65 78 70 72 65 73 73 69 6f 6e 20 62 65 69 6e 67  expression being
36d0: 20 74 65 73 74 65 64 20 2a 2f 0a 20 20 57 68 65   tested */.  Whe
36e0: 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 20 20  reClause *pWC;  
36f0: 20 20 2f 2a 20 53 68 6f 72 74 68 61 6e 64 20 66    /* Shorthand f
3700: 6f 72 20 70 53 63 61 6e 2d 3e 70 57 43 20 2a 2f  or pScan->pWC */
3710: 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
3720: 65 72 6d 3b 20 20 20 20 2f 2a 20 54 68 65 20 74  erm;    /* The t
3730: 65 72 6d 20 62 65 69 6e 67 20 74 65 73 74 65 64  erm being tested
3740: 20 2a 2f 0a 20 20 69 6e 74 20 6b 20 3d 20 70 53   */.  int k = pS
3750: 63 61 6e 2d 3e 6b 3b 20 20 20 20 2f 2a 20 57 68  can->k;    /* Wh
3760: 65 72 65 20 74 6f 20 73 74 61 72 74 20 73 63 61  ere to start sca
3770: 6e 6e 69 6e 67 20 2a 2f 0a 0a 20 20 77 68 69 6c  nning */..  whil
3780: 65 28 20 70 53 63 61 6e 2d 3e 69 45 71 75 69 76  e( pScan->iEquiv
3790: 3c 3d 70 53 63 61 6e 2d 3e 6e 45 71 75 69 76 20  <=pScan->nEquiv 
37a0: 29 7b 0a 20 20 20 20 69 43 75 72 20 3d 20 70 53  ){.    iCur = pS
37b0: 63 61 6e 2d 3e 61 45 71 75 69 76 5b 70 53 63 61  can->aEquiv[pSca
37c0: 6e 2d 3e 69 45 71 75 69 76 2d 32 5d 3b 0a 20 20  n->iEquiv-2];.  
37d0: 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 70 53 63 61    iColumn = pSca
37e0: 6e 2d 3e 61 45 71 75 69 76 5b 70 53 63 61 6e 2d  n->aEquiv[pScan-
37f0: 3e 69 45 71 75 69 76 2d 31 5d 3b 0a 20 20 20 20  >iEquiv-1];.    
3800: 77 68 69 6c 65 28 20 28 70 57 43 20 3d 20 70 53  while( (pWC = pS
3810: 63 61 6e 2d 3e 70 57 43 29 21 3d 30 20 29 7b 0a  can->pWC)!=0 ){.
3820: 20 20 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d        for(pTerm=
3830: 70 57 43 2d 3e 61 2b 6b 3b 20 6b 3c 70 57 43 2d  pWC->a+k; k<pWC-
3840: 3e 6e 54 65 72 6d 3b 20 6b 2b 2b 2c 20 70 54 65  >nTerm; k++, pTe
3850: 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69  rm++){.        i
3860: 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75  f( pTerm->leftCu
3870: 72 73 6f 72 3d 3d 69 43 75 72 0a 20 20 20 20 20  rsor==iCur.     
3880: 20 20 20 20 26 26 20 70 54 65 72 6d 2d 3e 75 2e      && pTerm->u.
3890: 6c 65 66 74 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c  leftColumn==iCol
38a0: 75 6d 6e 0a 20 20 20 20 20 20 20 20 20 26 26 20  umn.         && 
38b0: 28 70 53 63 61 6e 2d 3e 69 45 71 75 69 76 3c 3d  (pScan->iEquiv<=
38c0: 32 20 7c 7c 20 21 45 78 70 72 48 61 73 50 72 6f  2 || !ExprHasPro
38d0: 70 65 72 74 79 28 70 54 65 72 6d 2d 3e 70 45 78  perty(pTerm->pEx
38e0: 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  pr, EP_FromJoin)
38f0: 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20  ).        ){.   
3900: 20 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72         if( (pTer
3910: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
3920: 4f 5f 45 51 55 49 56 29 21 3d 30 0a 20 20 20 20  O_EQUIV)!=0.    
3930: 20 20 20 20 20 20 20 26 26 20 70 53 63 61 6e 2d         && pScan-
3940: 3e 6e 45 71 75 69 76 3c 41 72 72 61 79 53 69 7a  >nEquiv<ArraySiz
3950: 65 28 70 53 63 61 6e 2d 3e 61 45 71 75 69 76 29  e(pScan->aEquiv)
3960: 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20  .          ){.  
3970: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b            int j;
3980: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 58 20  .            pX 
3990: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69  = sqlite3ExprSki
39a0: 70 43 6f 6c 6c 61 74 65 28 70 54 65 72 6d 2d 3e  pCollate(pTerm->
39b0: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a  pExpr->pRight);.
39c0: 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
39d0: 72 74 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 43  rt( pX->op==TK_C
39e0: 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 20  OLUMN );.       
39f0: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
3a00: 70 53 63 61 6e 2d 3e 6e 45 71 75 69 76 3b 20 6a  pScan->nEquiv; j
3a10: 2b 3d 32 29 7b 0a 20 20 20 20 20 20 20 20 20 20  +=2){.          
3a20: 20 20 20 20 69 66 28 20 70 53 63 61 6e 2d 3e 61      if( pScan->a
3a30: 45 71 75 69 76 5b 6a 5d 3d 3d 70 58 2d 3e 69 54  Equiv[j]==pX->iT
3a40: 61 62 6c 65 0a 20 20 20 20 20 20 20 20 20 20 20  able.           
3a50: 20 20 20 20 26 26 20 70 53 63 61 6e 2d 3e 61 45      && pScan->aE
3a60: 71 75 69 76 5b 6a 2b 31 5d 3d 3d 70 58 2d 3e 69  quiv[j+1]==pX->i
3a70: 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20  Column ){.      
3a80: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
3a90: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  k;.             
3aa0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d   }.            }
3ab0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
3ac0: 20 6a 3d 3d 70 53 63 61 6e 2d 3e 6e 45 71 75 69   j==pScan->nEqui
3ad0: 76 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  v ){.           
3ae0: 20 20 20 70 53 63 61 6e 2d 3e 61 45 71 75 69 76     pScan->aEquiv
3af0: 5b 6a 5d 20 3d 20 70 58 2d 3e 69 54 61 62 6c 65  [j] = pX->iTable
3b00: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
3b10: 70 53 63 61 6e 2d 3e 61 45 71 75 69 76 5b 6a 2b  pScan->aEquiv[j+
3b20: 31 5d 20 3d 20 70 58 2d 3e 69 43 6f 6c 75 6d 6e  1] = pX->iColumn
3b30: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
3b40: 70 53 63 61 6e 2d 3e 6e 45 71 75 69 76 20 2b 3d  pScan->nEquiv +=
3b50: 20 32 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   2;.            
3b60: 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
3b70: 20 20 20 20 20 20 20 20 69 66 28 20 28 70 54 65          if( (pTe
3b80: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
3b90: 70 53 63 61 6e 2d 3e 6f 70 4d 61 73 6b 29 21 3d  pScan->opMask)!=
3ba0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
3bb0: 20 2f 2a 20 56 65 72 69 66 79 20 74 68 65 20 61   /* Verify the a
3bc0: 66 66 69 6e 69 74 79 20 61 6e 64 20 63 6f 6c 6c  ffinity and coll
3bd0: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 6d  ating sequence m
3be0: 61 74 63 68 20 2a 2f 0a 20 20 20 20 20 20 20 20  atch */.        
3bf0: 20 20 20 20 69 66 28 20 70 53 63 61 6e 2d 3e 7a      if( pScan->z
3c00: 43 6f 6c 6c 4e 61 6d 65 20 26 26 20 28 70 54 65  CollName && (pTe
3c10: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
3c20: 57 4f 5f 49 53 4e 55 4c 4c 29 3d 3d 30 20 29 7b  WO_ISNULL)==0 ){
3c30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 43  .              C
3c40: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20  ollSeq *pColl;. 
3c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 50 61 72               Par
3c60: 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 43  se *pParse = pWC
3c70: 2d 3e 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65  ->pWInfo->pParse
3c80: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
3c90: 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70  pX = pTerm->pExp
3ca0: 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r;.             
3cb0: 20 69 66 28 20 21 73 71 6c 69 74 65 33 49 6e 64   if( !sqlite3Ind
3cc0: 65 78 41 66 66 69 6e 69 74 79 4f 6b 28 70 58 2c  exAffinityOk(pX,
3cd0: 20 70 53 63 61 6e 2d 3e 69 64 78 61 66 66 29 20   pScan->idxaff) 
3ce0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
3cf0: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
3d00: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
3d10: 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
3d20: 74 28 70 58 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  t(pX->pLeft);.  
3d30: 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
3d40: 6c 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72  l = sqlite3Binar
3d50: 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28  yCompareCollSeq(
3d60: 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20  pParse,.        
3d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3d90: 20 20 20 20 20 20 20 20 20 20 70 58 2d 3e 70 4c            pX->pL
3da0: 65 66 74 2c 20 70 58 2d 3e 70 52 69 67 68 74 29  eft, pX->pRight)
3db0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
3dc0: 69 66 28 20 70 43 6f 6c 6c 3d 3d 30 20 29 20 70  if( pColl==0 ) p
3dd0: 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64  Coll = pParse->d
3de0: 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20  b->pDfltColl;.  
3df0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
3e00: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
3e10: 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 70 53 63  Coll->zName, pSc
3e20: 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65 29 20 29  an->zCollName) )
3e30: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
3e40: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
3e50: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
3e60: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
3e70: 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d        if( (pTerm
3e80: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
3e90: 5f 45 51 29 21 3d 30 0a 20 20 20 20 20 20 20 20  _EQ)!=0.        
3ea0: 20 20 20 20 20 26 26 20 28 70 58 20 3d 20 70 54       && (pX = pT
3eb0: 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67  erm->pExpr->pRig
3ec0: 68 74 29 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  ht)->op==TK_COLU
3ed0: 4d 4e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  MN.             
3ee0: 26 26 20 70 58 2d 3e 69 54 61 62 6c 65 3d 3d 70  && pX->iTable==p
3ef0: 53 63 61 6e 2d 3e 61 45 71 75 69 76 5b 30 5d 0a  Scan->aEquiv[0].
3f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
3f10: 70 58 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 53 63  pX->iColumn==pSc
3f20: 61 6e 2d 3e 61 45 71 75 69 76 5b 31 5d 0a 20 20  an->aEquiv[1].  
3f30: 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20            ){.   
3f40: 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
3f50: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nue;.           
3f60: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70   }.            p
3f70: 53 63 61 6e 2d 3e 6b 20 3d 20 6b 2b 31 3b 0a 20  Scan->k = k+1;. 
3f80: 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
3f90: 6e 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 20  n pTerm;.       
3fa0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
3fb0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 53 63       }.      pSc
3fc0: 61 6e 2d 3e 70 57 43 20 3d 20 70 53 63 61 6e 2d  an->pWC = pScan-
3fd0: 3e 70 57 43 2d 3e 70 4f 75 74 65 72 3b 0a 20 20  >pWC->pOuter;.  
3fe0: 20 20 20 20 6b 20 3d 20 30 3b 0a 20 20 20 20 7d      k = 0;.    }
3ff0: 0a 20 20 20 20 70 53 63 61 6e 2d 3e 70 57 43 20  .    pScan->pWC 
4000: 3d 20 70 53 63 61 6e 2d 3e 70 4f 72 69 67 57 43  = pScan->pOrigWC
4010: 3b 0a 20 20 20 20 6b 20 3d 20 30 3b 0a 20 20 20  ;.    k = 0;.   
4020: 20 70 53 63 61 6e 2d 3e 69 45 71 75 69 76 20 2b   pScan->iEquiv +
4030: 3d 20 32 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 2;.  }.  retur
4040: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  n 0;.}../*.** In
4050: 69 74 69 61 6c 69 7a 65 20 61 20 57 48 45 52 45  itialize a WHERE
4060: 20 63 6c 61 75 73 65 20 73 63 61 6e 6e 65 72 20   clause scanner 
4070: 6f 62 6a 65 63 74 2e 20 20 52 65 74 75 72 6e 20  object.  Return 
4080: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
4090: 0a 2a 2a 20 66 69 72 73 74 20 6d 61 74 63 68 2e  .** first match.
40a0: 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66    Return NULL if
40b0: 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 61   there are no ma
40c0: 74 63 68 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  tches..**.** The
40d0: 20 73 63 61 6e 6e 65 72 20 77 69 6c 6c 20 62 65   scanner will be
40e0: 20 73 65 61 72 63 68 69 6e 67 20 74 68 65 20 57   searching the W
40f0: 48 45 52 45 20 63 6c 61 75 73 65 20 70 57 43 2e  HERE clause pWC.
4100: 20 20 49 74 20 77 69 6c 6c 20 6c 6f 6f 6b 0a 2a    It will look.*
4110: 2a 20 66 6f 72 20 74 65 72 6d 73 20 6f 66 20 74  * for terms of t
4120: 68 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20  he form "X <op> 
4130: 3c 65 78 70 72 3e 22 20 77 68 65 72 65 20 58 20  <expr>" where X 
4140: 69 73 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 75 6d  is column iColum
4150: 6e 20 6f 66 20 74 61 62 6c 65 0a 2a 2a 20 69 43  n of table.** iC
4160: 75 72 2e 20 20 54 68 65 20 3c 6f 70 3e 20 6d 75  ur.  The <op> mu
4170: 73 74 20 62 65 20 6f 6e 65 20 6f 66 20 74 68 65  st be one of the
4180: 20 6f 70 65 72 61 74 6f 72 73 20 64 65 73 63 72   operators descr
4190: 69 62 65 64 20 62 79 20 6f 70 4d 61 73 6b 2e 0a  ibed by opMask..
41a0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 65 61  **.** If the sea
41b0: 72 63 68 20 69 73 20 66 6f 72 20 58 20 61 6e 64  rch is for X and
41c0: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
41d0: 65 20 63 6f 6e 74 61 69 6e 73 20 74 65 72 6d 73  e contains terms
41e0: 20 6f 66 20 74 68 65 0a 2a 2a 20 66 6f 72 6d 20   of the.** form 
41f0: 58 3d 59 20 74 68 65 6e 20 74 68 69 73 20 72 6f  X=Y then this ro
4200: 75 74 69 6e 65 20 6d 69 67 68 74 20 61 6c 73 6f  utine might also
4210: 20 72 65 74 75 72 6e 20 74 65 72 6d 73 20 6f 66   return terms of
4220: 20 74 68 65 20 66 6f 72 6d 0a 2a 2a 20 22 59 20   the form.** "Y 
4230: 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 2e 20 20 54  <op> <expr>".  T
4240: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65 76  he number of lev
4250: 65 6c 73 20 6f 66 20 74 72 61 6e 73 69 74 69 76  els of transitiv
4260: 69 74 79 20 69 73 20 6c 69 6d 69 74 65 64 2c 0a  ity is limited,.
4270: 2a 2a 20 62 75 74 20 69 73 20 65 6e 6f 75 67 68  ** but is enough
4280: 20 74 6f 20 68 61 6e 64 6c 65 20 6d 6f 73 74 20   to handle most 
4290: 63 6f 6d 6d 6f 6e 6c 79 20 6f 63 63 75 72 72 69  commonly occurri
42a0: 6e 67 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  ng SQL statement
42b0: 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 58 20 69 73  s..**.** If X is
42c0: 20 6e 6f 74 20 74 68 65 20 49 4e 54 45 47 45 52   not the INTEGER
42d0: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 74 68 65   PRIMARY KEY the
42e0: 6e 20 58 20 6d 75 73 74 20 62 65 20 63 6f 6d 70  n X must be comp
42f0: 61 74 69 62 6c 65 20 77 69 74 68 0a 2a 2a 20 69  atible with.** i
4300: 6e 64 65 78 20 70 49 64 78 2e 0a 2a 2f 0a 73 74  ndex pIdx..*/.st
4310: 61 74 69 63 20 57 68 65 72 65 54 65 72 6d 20 2a  atic WhereTerm *
4320: 77 68 65 72 65 53 63 61 6e 49 6e 69 74 28 0a 20  whereScanInit(. 
4330: 20 57 68 65 72 65 53 63 61 6e 20 2a 70 53 63 61   WhereScan *pSca
4340: 6e 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  n,       /* The 
4350: 57 68 65 72 65 53 63 61 6e 20 6f 62 6a 65 63 74  WhereScan object
4360: 20 62 65 69 6e 67 20 69 6e 69 74 69 61 6c 69 7a   being initializ
4370: 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61  ed */.  WhereCla
4380: 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20  use *pWC,       
4390: 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
43a0: 75 73 65 20 74 6f 20 62 65 20 73 63 61 6e 6e 65  use to be scanne
43b0: 64 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 2c  d */.  int iCur,
43c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
43d0: 2a 20 43 75 72 73 6f 72 20 74 6f 20 73 63 61 6e  * Cursor to scan
43e0: 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 43   for */.  int iC
43f0: 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 20 20 20 20  olumn,          
4400: 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 74 6f 20 73    /* Column to s
4410: 63 61 6e 20 66 6f 72 20 2a 2f 0a 20 20 75 33 32  can for */.  u32
4420: 20 6f 70 4d 61 73 6b 2c 20 20 20 20 20 20 20 20   opMask,        
4430: 20 20 20 20 20 2f 2a 20 4f 70 65 72 61 74 6f 72       /* Operator
4440: 28 73 29 20 74 6f 20 73 63 61 6e 20 66 6f 72 20  (s) to scan for 
4450: 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  */.  Index *pIdx
4460: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4470: 4d 75 73 74 20 62 65 20 63 6f 6d 70 61 74 69 62  Must be compatib
4480: 6c 65 20 77 69 74 68 20 74 68 69 73 20 69 6e 64  le with this ind
4490: 65 78 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6a  ex */.){.  int j
44a0: 3b 0a 0a 20 20 2f 2a 20 6d 65 6d 73 65 74 28 70  ;..  /* memset(p
44b0: 53 63 61 6e 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Scan, 0, sizeof(
44c0: 2a 70 53 63 61 6e 29 29 3b 20 2a 2f 0a 20 20 70  *pScan)); */.  p
44d0: 53 63 61 6e 2d 3e 70 4f 72 69 67 57 43 20 3d 20  Scan->pOrigWC = 
44e0: 70 57 43 3b 0a 20 20 70 53 63 61 6e 2d 3e 70 57  pWC;.  pScan->pW
44f0: 43 20 3d 20 70 57 43 3b 0a 20 20 69 66 28 20 70  C = pWC;.  if( p
4500: 49 64 78 20 26 26 20 69 43 6f 6c 75 6d 6e 3e 3d  Idx && iColumn>=
4510: 30 20 29 7b 0a 20 20 20 20 70 53 63 61 6e 2d 3e  0 ){.    pScan->
4520: 69 64 78 61 66 66 20 3d 20 70 49 64 78 2d 3e 70  idxaff = pIdx->p
4530: 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43 6f 6c  Table->aCol[iCol
4540: 75 6d 6e 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20  umn].affinity;. 
4550: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 70 49 64 78     for(j=0; pIdx
4560: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 21 3d 69  ->aiColumn[j]!=i
4570: 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20  Column; j++){.  
4580: 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 6a 3e      if( NEVER(j>
4590: 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 20 29  pIdx->nColumn) )
45a0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
45b0: 0a 20 20 20 20 70 53 63 61 6e 2d 3e 7a 43 6f 6c  .    pScan->zCol
45c0: 6c 4e 61 6d 65 20 3d 20 70 49 64 78 2d 3e 61 7a  lName = pIdx->az
45d0: 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 7d 65 6c 73 65  Coll[j];.  }else
45e0: 7b 0a 20 20 20 20 70 53 63 61 6e 2d 3e 69 64 78  {.    pScan->idx
45f0: 61 66 66 20 3d 20 30 3b 0a 20 20 20 20 70 53 63  aff = 0;.    pSc
4600: 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65 20 3d 20  an->zCollName = 
4610: 30 3b 0a 20 20 7d 0a 20 20 70 53 63 61 6e 2d 3e  0;.  }.  pScan->
4620: 6f 70 4d 61 73 6b 20 3d 20 6f 70 4d 61 73 6b 3b  opMask = opMask;
4630: 0a 20 20 70 53 63 61 6e 2d 3e 6b 20 3d 20 30 3b  .  pScan->k = 0;
4640: 0a 20 20 70 53 63 61 6e 2d 3e 61 45 71 75 69 76  .  pScan->aEquiv
4650: 5b 30 5d 20 3d 20 69 43 75 72 3b 0a 20 20 70 53  [0] = iCur;.  pS
4660: 63 61 6e 2d 3e 61 45 71 75 69 76 5b 31 5d 20 3d  can->aEquiv[1] =
4670: 20 69 43 6f 6c 75 6d 6e 3b 0a 20 20 70 53 63 61   iColumn;.  pSca
4680: 6e 2d 3e 6e 45 71 75 69 76 20 3d 20 32 3b 0a 20  n->nEquiv = 2;. 
4690: 20 70 53 63 61 6e 2d 3e 69 45 71 75 69 76 20 3d   pScan->iEquiv =
46a0: 20 32 3b 0a 20 20 72 65 74 75 72 6e 20 77 68 65   2;.  return whe
46b0: 72 65 53 63 61 6e 4e 65 78 74 28 70 53 63 61 6e  reScanNext(pScan
46c0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72  );.}../*.** Sear
46d0: 63 68 20 66 6f 72 20 61 20 74 65 72 6d 20 69 6e  ch for a term in
46e0: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
46f0: 65 20 74 68 61 74 20 69 73 20 6f 66 20 74 68 65  e that is of the
4700: 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 3c 65   form "X <op> <e
4710: 78 70 72 3e 22 0a 2a 2a 20 77 68 65 72 65 20 58  xpr>".** where X
4720: 20 69 73 20 61 20 72 65 66 65 72 65 6e 63 65 20   is a reference 
4730: 74 6f 20 74 68 65 20 69 43 6f 6c 75 6d 6e 20 6f  to the iColumn o
4740: 66 20 74 61 62 6c 65 20 69 43 75 72 20 61 6e 64  f table iCur and
4750: 20 3c 6f 70 3e 20 69 73 20 6f 6e 65 20 6f 66 0a   <op> is one of.
4760: 2a 2a 20 74 68 65 20 57 4f 5f 78 78 20 6f 70 65  ** the WO_xx ope
4770: 72 61 74 6f 72 20 63 6f 64 65 73 20 73 70 65 63  rator codes spec
4780: 69 66 69 65 64 20 62 79 20 74 68 65 20 6f 70 20  ified by the op 
4790: 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 20 52 65  parameter..** Re
47a0: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
47b0: 6f 20 74 68 65 20 74 65 72 6d 2e 20 20 52 65 74  o the term.  Ret
47c0: 75 72 6e 20 30 20 69 66 20 6e 6f 74 20 66 6f 75  urn 0 if not fou
47d0: 6e 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 65  nd..**.** The te
47e0: 72 6d 20 72 65 74 75 72 6e 65 64 20 6d 69 67 68  rm returned migh
47f0: 74 20 62 79 20 59 3d 3c 65 78 70 72 3e 20 69 66  t by Y=<expr> if
4800: 20 74 68 65 72 65 20 69 73 20 61 6e 6f 74 68 65   there is anothe
4810: 72 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 6e 0a  r constraint in.
4820: 2a 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  ** the WHERE cla
4830: 75 73 65 20 74 68 61 74 20 73 70 65 63 69 66 69  use that specifi
4840: 65 73 20 74 68 61 74 20 58 3d 59 2e 20 20 41 6e  es that X=Y.  An
4850: 79 20 73 75 63 68 20 63 6f 6e 73 74 72 61 69 6e  y such constrain
4860: 74 73 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 69 64  ts will be.** id
4870: 65 6e 74 69 66 69 65 64 20 62 79 20 74 68 65 20  entified by the 
4880: 57 4f 5f 45 51 55 49 56 20 62 69 74 20 69 6e 20  WO_EQUIV bit in 
4890: 74 68 65 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  the pTerm->eOper
48a0: 61 74 6f 72 20 66 69 65 6c 64 2e 20 20 54 68 65  ator field.  The
48b0: 0a 2a 2a 20 61 45 71 75 69 76 5b 5d 20 61 72 72  .** aEquiv[] arr
48c0: 61 79 20 68 6f 6c 64 73 20 58 20 61 6e 64 20 61  ay holds X and a
48d0: 6c 6c 20 69 74 73 20 65 71 75 69 76 61 6c 65 6e  ll its equivalen
48e0: 74 73 2c 20 77 69 74 68 20 65 61 63 68 20 53 51  ts, with each SQ
48f0: 4c 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 74 61  L variable.** ta
4900: 6b 69 6e 67 20 75 70 20 74 77 6f 20 73 6c 6f 74  king up two slot
4910: 73 20 69 6e 20 61 45 71 75 69 76 5b 5d 2e 20 20  s in aEquiv[].  
4920: 54 68 65 20 66 69 72 73 74 20 73 6c 6f 74 20 69  The first slot i
4930: 73 20 66 6f 72 20 74 68 65 20 63 75 72 73 6f 72  s for the cursor
4940: 20 6e 75 6d 62 65 72 0a 2a 2a 20 61 6e 64 20 74   number.** and t
4950: 68 65 20 73 65 63 6f 6e 64 20 69 73 20 66 6f 72  he second is for
4960: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62   the column numb
4970: 65 72 2e 20 20 54 68 65 72 65 20 61 72 65 20 32  er.  There are 2
4980: 32 20 73 6c 6f 74 73 20 69 6e 20 61 45 71 75 69  2 slots in aEqui
4990: 76 5b 5d 0a 2a 2a 20 73 6f 20 74 68 61 74 20 6d  v[].** so that m
49a0: 65 61 6e 73 20 77 65 20 63 61 6e 20 6c 6f 6f 6b  eans we can look
49b0: 20 66 6f 72 20 58 20 70 6c 75 73 20 75 70 20 74   for X plus up t
49c0: 6f 20 31 30 20 6f 74 68 65 72 20 65 71 75 69 76  o 10 other equiv
49d0: 61 6c 65 6e 74 20 76 61 6c 75 65 73 2e 0a 2a 2a  alent values..**
49e0: 20 48 65 6e 63 65 20 61 20 73 65 61 72 63 68 20   Hence a search 
49f0: 66 6f 72 20 58 20 77 69 6c 6c 20 72 65 74 75 72  for X will retur
4a00: 6e 20 3c 65 78 70 72 3e 20 69 66 20 58 3d 41 31  n <expr> if X=A1
4a10: 20 61 6e 64 20 41 31 3d 41 32 20 61 6e 64 20 41   and A1=A2 and A
4a20: 32 3d 41 33 0a 2a 2a 20 61 6e 64 20 2e 2e 2e 20  2=A3.** and ... 
4a30: 61 6e 64 20 41 39 3d 41 31 30 20 61 6e 64 20 41  and A9=A10 and A
4a40: 31 30 3d 3c 65 78 70 72 3e 2e 0a 2a 2a 0a 2a 2a  10=<expr>..**.**
4a50: 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6d 75   If there are mu
4a60: 6c 74 69 70 6c 65 20 74 65 72 6d 73 20 69 6e 20  ltiple terms in 
4a70: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
4a80: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 58 20   of the form "X 
4a90: 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 0a 2a 2a 20  <op> <expr>".** 
4aa0: 74 68 65 6e 20 74 72 79 20 66 6f 72 20 74 68 65  then try for the
4ab0: 20 6f 6e 65 20 77 69 74 68 20 6e 6f 20 64 65 70   one with no dep
4ac0: 65 6e 64 65 6e 63 69 65 73 20 6f 6e 20 3c 65 78  endencies on <ex
4ad0: 70 72 3e 20 2d 20 69 6e 20 6f 74 68 65 72 20 77  pr> - in other w
4ae0: 6f 72 64 73 20 77 68 65 72 65 0a 2a 2a 20 3c 65  ords where.** <e
4af0: 78 70 72 3e 20 69 73 20 61 20 63 6f 6e 73 74 61  xpr> is a consta
4b00: 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 66  nt expression of
4b10: 20 73 6f 6d 65 20 6b 69 6e 64 2e 20 20 4f 6e 6c   some kind.  Onl
4b20: 79 20 72 65 74 75 72 6e 20 65 6e 74 72 69 65 73  y return entries
4b30: 20 6f 66 0a 2a 2a 20 74 68 65 20 66 6f 72 6d 20   of.** the form 
4b40: 22 58 20 3c 6f 70 3e 20 59 22 20 77 68 65 72 65  "X <op> Y" where
4b50: 20 59 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 69   Y is a column i
4b60: 6e 20 61 6e 6f 74 68 65 72 20 74 61 62 6c 65 20  n another table 
4b70: 69 66 20 6e 6f 20 74 65 72 6d 73 20 6f 66 0a 2a  if no terms of.*
4b80: 2a 20 74 68 65 20 66 6f 72 6d 20 22 58 20 3c 6f  * the form "X <o
4b90: 70 3e 20 3c 63 6f 6e 73 74 2d 65 78 70 72 3e 22  p> <const-expr>"
4ba0: 20 65 78 69 73 74 2e 20 20 20 49 66 20 6e 6f 20   exist.   If no 
4bb0: 74 65 72 6d 73 20 77 69 74 68 20 61 20 63 6f 6e  terms with a con
4bc0: 73 74 61 6e 74 20 52 48 53 0a 2a 2a 20 65 78 69  stant RHS.** exi
4bd0: 73 74 2c 20 74 72 79 20 74 6f 20 72 65 74 75 72  st, try to retur
4be0: 6e 20 61 20 74 65 72 6d 20 74 68 61 74 20 64 6f  n a term that do
4bf0: 65 73 20 6e 6f 74 20 75 73 65 20 57 4f 5f 45 51  es not use WO_EQ
4c00: 55 49 56 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 57  UIV..*/.static W
4c10: 68 65 72 65 54 65 72 6d 20 2a 66 69 6e 64 54 65  hereTerm *findTe
4c20: 72 6d 28 0a 20 20 57 68 65 72 65 43 6c 61 75 73  rm(.  WhereClaus
4c30: 65 20 2a 70 57 43 2c 20 20 20 20 20 2f 2a 20 54  e *pWC,     /* T
4c40: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
4c50: 74 6f 20 62 65 20 73 65 61 72 63 68 65 64 20 2a  to be searched *
4c60: 2f 0a 20 20 69 6e 74 20 69 43 75 72 2c 20 20 20  /.  int iCur,   
4c70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
4c80: 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 4c 48  sor number of LH
4c90: 53 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75  S */.  int iColu
4ca0: 6d 6e 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  mn,          /* 
4cb0: 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 6f 66  Column number of
4cc0: 20 4c 48 53 20 2a 2f 0a 20 20 42 69 74 6d 61 73   LHS */.  Bitmas
4cd0: 6b 20 6e 6f 74 52 65 61 64 79 2c 20 20 20 20 20  k notReady,     
4ce0: 2f 2a 20 52 48 53 20 6d 75 73 74 20 6e 6f 74 20  /* RHS must not 
4cf0: 6f 76 65 72 6c 61 70 20 77 69 74 68 20 74 68 69  overlap with thi
4d00: 73 20 6d 61 73 6b 20 2a 2f 0a 20 20 75 33 32 20  s mask */.  u32 
4d10: 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  op,             
4d20: 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 57 4f 5f    /* Mask of WO_
4d30: 78 78 20 76 61 6c 75 65 73 20 64 65 73 63 72 69  xx values descri
4d40: 62 69 6e 67 20 6f 70 65 72 61 74 6f 72 20 2a 2f  bing operator */
4d50: 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 20  .  Index *pIdx  
4d60: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 75 73 74           /* Must
4d70: 20 62 65 20 63 6f 6d 70 61 74 69 62 6c 65 20 77   be compatible w
4d80: 69 74 68 20 74 68 69 73 20 69 6e 64 65 78 2c 20  ith this index, 
4d90: 69 66 20 6e 6f 74 20 4e 55 4c 4c 20 2a 2f 0a 29  if not NULL */.)
4da0: 7b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  {.  WhereTerm *p
4db0: 52 65 73 75 6c 74 20 3d 20 30 3b 0a 20 20 57 68  Result = 0;.  Wh
4dc0: 65 72 65 54 65 72 6d 20 2a 70 3b 0a 20 20 57 68  ereTerm *p;.  Wh
4dd0: 65 72 65 53 63 61 6e 20 73 63 61 6e 3b 0a 0a 20  ereScan scan;.. 
4de0: 20 70 20 3d 20 77 68 65 72 65 53 63 61 6e 49 6e   p = whereScanIn
4df0: 69 74 28 26 73 63 61 6e 2c 20 70 57 43 2c 20 69  it(&scan, pWC, i
4e00: 43 75 72 2c 20 69 43 6f 6c 75 6d 6e 2c 20 6f 70  Cur, iColumn, op
4e10: 2c 20 70 49 64 78 29 3b 0a 20 20 77 68 69 6c 65  , pIdx);.  while
4e20: 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28 20 28  ( p ){.    if( (
4e30: 70 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 26  p->prereqRight &
4e40: 20 6e 6f 74 52 65 61 64 79 29 3d 3d 30 20 29 7b   notReady)==0 ){
4e50: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 72  .      if( p->pr
4e60: 65 72 65 71 52 69 67 68 74 3d 3d 30 20 26 26 20  ereqRight==0 && 
4e70: 28 70 2d 3e 65 4f 70 65 72 61 74 6f 72 26 57 4f  (p->eOperator&WO
4e80: 5f 45 51 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  _EQ)!=0 ){.     
4e90: 20 20 20 72 65 74 75 72 6e 20 70 3b 0a 20 20 20     return p;.   
4ea0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
4eb0: 52 65 73 75 6c 74 3d 3d 30 20 29 20 70 52 65 73  Result==0 ) pRes
4ec0: 75 6c 74 20 3d 20 70 3b 0a 20 20 20 20 7d 0a 20  ult = p;.    }. 
4ed0: 20 20 20 70 20 3d 20 77 68 65 72 65 53 63 61 6e     p = whereScan
4ee0: 4e 65 78 74 28 26 73 63 61 6e 29 3b 0a 20 20 7d  Next(&scan);.  }
4ef0: 0a 20 20 72 65 74 75 72 6e 20 70 52 65 73 75 6c  .  return pResul
4f00: 74 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  t;.}../* Forward
4f10: 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74   reference */.st
4f20: 61 74 69 63 20 76 6f 69 64 20 65 78 70 72 41 6e  atic void exprAn
4f30: 61 6c 79 7a 65 28 53 72 63 4c 69 73 74 2a 2c 20  alyze(SrcList*, 
4f40: 57 68 65 72 65 43 6c 61 75 73 65 2a 2c 20 69 6e  WhereClause*, in
4f50: 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20  t);../*.** Call 
4f60: 65 78 70 72 41 6e 61 6c 79 7a 65 20 6f 6e 20 61  exprAnalyze on a
4f70: 6c 6c 20 74 65 72 6d 73 20 69 6e 20 61 20 57 48  ll terms in a WH
4f80: 45 52 45 20 63 6c 61 75 73 65 2e 20 20 0a 2a 2f  ERE clause.  .*/
4f90: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
4fa0: 72 41 6e 61 6c 79 7a 65 41 6c 6c 28 0a 20 20 53  rAnalyzeAll(.  S
4fb0: 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
4fc0: 2c 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20 46  ,       /* the F
4fd0: 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ROM clause */.  
4fe0: 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
4ff0: 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20           /* the 
5000: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20  WHERE clause to 
5010: 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 29  be analyzed */.)
5020: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  {.  int i;.  for
5030: 28 69 3d 70 57 43 2d 3e 6e 54 65 72 6d 2d 31 3b  (i=pWC->nTerm-1;
5040: 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20   i>=0; i--){.   
5050: 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 54 61   exprAnalyze(pTa
5060: 62 4c 69 73 74 2c 20 70 57 43 2c 20 69 29 3b 0a  bList, pWC, i);.
5070: 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53    }.}..#ifndef S
5080: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f  QLITE_OMIT_LIKE_
5090: 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 2f 2a 0a  OPTIMIZATION./*.
50a0: 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  ** Check to see 
50b0: 69 66 20 74 68 65 20 67 69 76 65 6e 20 65 78 70  if the given exp
50c0: 72 65 73 73 69 6f 6e 20 69 73 20 61 20 4c 49 4b  ression is a LIK
50d0: 45 20 6f 72 20 47 4c 4f 42 20 6f 70 65 72 61 74  E or GLOB operat
50e0: 6f 72 20 74 68 61 74 0a 2a 2a 20 63 61 6e 20 62  or that.** can b
50f0: 65 20 6f 70 74 69 6d 69 7a 65 64 20 75 73 69 6e  e optimized usin
5100: 67 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e  g inequality con
5110: 73 74 72 61 69 6e 74 73 2e 20 20 52 65 74 75 72  straints.  Retur
5120: 6e 20 54 52 55 45 20 69 66 20 69 74 20 69 73 0a  n TRUE if it is.
5130: 2a 2a 20 73 6f 20 61 6e 64 20 66 61 6c 73 65 20  ** so and false 
5140: 69 66 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e  if not..**.** In
5150: 20 6f 72 64 65 72 20 66 6f 72 20 74 68 65 20 6f   order for the o
5160: 70 65 72 61 74 6f 72 20 74 6f 20 62 65 20 6f 70  perator to be op
5170: 74 69 6d 69 7a 69 62 6c 65 2c 20 74 68 65 20 52  timizible, the R
5180: 48 53 20 6d 75 73 74 20 62 65 20 61 20 73 74 72  HS must be a str
5190: 69 6e 67 0a 2a 2a 20 6c 69 74 65 72 61 6c 20 74  ing.** literal t
51a0: 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 62 65 67  hat does not beg
51b0: 69 6e 20 77 69 74 68 20 61 20 77 69 6c 64 63 61  in with a wildca
51c0: 72 64 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20  rd.  .*/.static 
51d0: 69 6e 74 20 69 73 4c 69 6b 65 4f 72 47 6c 6f 62  int isLikeOrGlob
51e0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
51f0: 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67  e,    /* Parsing
5200: 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61   and code genera
5210: 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  ting context */.
5220: 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20    Expr *pExpr,  
5230: 20 20 20 20 2f 2a 20 54 65 73 74 20 74 68 69 73      /* Test this
5240: 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20   expression */. 
5250: 20 45 78 70 72 20 2a 2a 70 70 50 72 65 66 69 78   Expr **ppPrefix
5260: 2c 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f  ,  /* Pointer to
5270: 20 54 4b 5f 53 54 52 49 4e 47 20 65 78 70 72 65   TK_STRING expre
5280: 73 73 69 6f 6e 20 77 69 74 68 20 70 61 74 74 65  ssion with patte
5290: 72 6e 20 70 72 65 66 69 78 20 2a 2f 0a 20 20 69  rn prefix */.  i
52a0: 6e 74 20 2a 70 69 73 43 6f 6d 70 6c 65 74 65 2c  nt *pisComplete,
52b0: 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20   /* True if the 
52c0: 6f 6e 6c 79 20 77 69 6c 64 63 61 72 64 20 69 73  only wildcard is
52d0: 20 25 20 69 6e 20 74 68 65 20 6c 61 73 74 20 63   % in the last c
52e0: 68 61 72 61 63 74 65 72 20 2a 2f 0a 20 20 69 6e  haracter */.  in
52f0: 74 20 2a 70 6e 6f 43 61 73 65 20 20 20 20 20 20  t *pnoCase      
5300: 2f 2a 20 54 72 75 65 20 69 66 20 75 70 70 65 72  /* True if upper
5310: 63 61 73 65 20 69 73 20 65 71 75 69 76 61 6c 65  case is equivale
5320: 6e 74 20 74 6f 20 6c 6f 77 65 72 63 61 73 65 20  nt to lowercase 
5330: 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  */.){.  const ch
5340: 61 72 20 2a 7a 20 3d 20 30 3b 20 20 20 20 20 20  ar *z = 0;      
5350: 20 20 20 2f 2a 20 53 74 72 69 6e 67 20 6f 6e 20     /* String on 
5360: 52 48 53 20 6f 66 20 4c 49 4b 45 20 6f 70 65 72  RHS of LIKE oper
5370: 61 74 6f 72 20 2a 2f 0a 20 20 45 78 70 72 20 2a  ator */.  Expr *
5380: 70 52 69 67 68 74 2c 20 2a 70 4c 65 66 74 3b 20  pRight, *pLeft; 
5390: 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20 61 6e       /* Right an
53a0: 64 20 6c 65 66 74 20 73 69 7a 65 20 6f 66 20 4c  d left size of L
53b0: 49 4b 45 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a  IKE operator */.
53c0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
53d0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t;           /* 
53e0: 4c 69 73 74 20 6f 66 20 6f 70 65 72 61 6e 64 73  List of operands
53f0: 20 74 6f 20 74 68 65 20 4c 49 4b 45 20 6f 70 65   to the LIKE ope
5400: 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 63  rator */.  int c
5410: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
5420: 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 63 68 61        /* One cha
5430: 72 61 63 74 65 72 20 69 6e 20 7a 5b 5d 20 2a 2f  racter in z[] */
5440: 0a 20 20 69 6e 74 20 63 6e 74 3b 20 20 20 20 20  .  int cnt;     
5450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5460: 20 4e 75 6d 62 65 72 20 6f 66 20 6e 6f 6e 2d 77   Number of non-w
5470: 69 6c 64 63 61 72 64 20 70 72 65 66 69 78 20 63  ildcard prefix c
5480: 68 61 72 61 63 74 65 72 73 20 2a 2f 0a 20 20 63  haracters */.  c
5490: 68 61 72 20 77 63 5b 33 5d 3b 20 20 20 20 20 20  har wc[3];      
54a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 69 6c            /* Wil
54b0: 64 63 61 72 64 20 63 68 61 72 61 63 74 65 72 73  dcard characters
54c0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
54d0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20  b = pParse->db; 
54e0: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
54f0: 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c  nection */.  sql
5500: 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c  ite3_value *pVal
5510: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6f 70 3b 20   = 0;.  int op; 
5520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5530: 20 20 20 2f 2a 20 4f 70 63 6f 64 65 20 6f 66 20     /* Opcode of 
5540: 70 52 69 67 68 74 20 2a 2f 0a 0a 20 20 69 66 28  pRight */..  if(
5550: 20 21 73 71 6c 69 74 65 33 49 73 4c 69 6b 65 46   !sqlite3IsLikeF
5560: 75 6e 63 74 69 6f 6e 28 64 62 2c 20 70 45 78 70  unction(db, pExp
5570: 72 2c 20 70 6e 6f 43 61 73 65 2c 20 77 63 29 20  r, pnoCase, wc) 
5580: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
5590: 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49  .  }.#ifdef SQLI
55a0: 54 45 5f 45 42 43 44 49 43 0a 20 20 69 66 28 20  TE_EBCDIC.  if( 
55b0: 2a 70 6e 6f 43 61 73 65 20 29 20 72 65 74 75 72  *pnoCase ) retur
55c0: 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 70 4c  n 0;.#endif.  pL
55d0: 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  ist = pExpr->x.p
55e0: 4c 69 73 74 3b 0a 20 20 70 4c 65 66 74 20 3d 20  List;.  pLeft = 
55f0: 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70  pList->a[1].pExp
5600: 72 3b 0a 20 20 69 66 28 20 70 4c 65 66 74 2d 3e  r;.  if( pLeft->
5610: 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 0a 20  op!=TK_COLUMN . 
5620: 20 20 7c 7c 20 73 71 6c 69 74 65 33 45 78 70 72    || sqlite3Expr
5630: 41 66 66 69 6e 69 74 79 28 70 4c 65 66 74 29 21  Affinity(pLeft)!
5640: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54  =SQLITE_AFF_TEXT
5650: 20 0a 20 20 20 7c 7c 20 49 73 56 69 72 74 75 61   .   || IsVirtua
5660: 6c 28 70 4c 65 66 74 2d 3e 70 54 61 62 29 0a 20  l(pLeft->pTab). 
5670: 20 29 7b 0a 20 20 20 20 2f 2a 20 49 4d 50 3a 20   ){.    /* IMP: 
5680: 52 2d 30 32 30 36 35 2d 34 39 34 36 35 20 54 68  R-02065-49465 Th
5690: 65 20 6c 65 66 74 2d 68 61 6e 64 20 73 69 64 65  e left-hand side
56a0: 20 6f 66 20 74 68 65 20 4c 49 4b 45 20 6f 72 20   of the LIKE or 
56b0: 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72 20 6d 75  GLOB operator mu
56c0: 73 74 0a 20 20 20 20 2a 2a 20 62 65 20 74 68 65  st.    ** be the
56d0: 20 6e 61 6d 65 20 6f 66 20 61 6e 20 69 6e 64 65   name of an inde
56e0: 78 65 64 20 63 6f 6c 75 6d 6e 20 77 69 74 68 20  xed column with 
56f0: 54 45 58 54 20 61 66 66 69 6e 69 74 79 2e 20 2a  TEXT affinity. *
5700: 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  /.    return 0;.
5710: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4c    }.  assert( pL
5720: 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 28 2d  eft->iColumn!=(-
5730: 31 29 20 29 3b 20 2f 2a 20 42 65 63 61 75 73 65  1) ); /* Because
5740: 20 49 50 4b 20 6e 65 76 65 72 20 68 61 73 20 41   IPK never has A
5750: 46 46 5f 54 45 58 54 20 2a 2f 0a 0a 20 20 70 52  FF_TEXT */..  pR
5760: 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78  ight = sqlite3Ex
5770: 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4c  prSkipCollate(pL
5780: 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29  ist->a[0].pExpr)
5790: 3b 0a 20 20 6f 70 20 3d 20 70 52 69 67 68 74 2d  ;.  op = pRight-
57a0: 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54  >op;.  if( op==T
57b0: 4b 5f 56 41 52 49 41 42 4c 45 20 29 7b 0a 20 20  K_VARIABLE ){.  
57c0: 20 20 56 64 62 65 20 2a 70 52 65 70 72 65 70 61    Vdbe *pReprepa
57d0: 72 65 20 3d 20 70 50 61 72 73 65 2d 3e 70 52 65  re = pParse->pRe
57e0: 70 72 65 70 61 72 65 3b 0a 20 20 20 20 69 6e 74  prepare;.    int
57f0: 20 69 43 6f 6c 20 3d 20 70 52 69 67 68 74 2d 3e   iCol = pRight->
5800: 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 70 56 61  iColumn;.    pVa
5810: 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47  l = sqlite3VdbeG
5820: 65 74 42 6f 75 6e 64 56 61 6c 75 65 28 70 52 65  etBoundValue(pRe
5830: 70 72 65 70 61 72 65 2c 20 69 43 6f 6c 2c 20 53  prepare, iCol, S
5840: 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 29 3b  QLITE_AFF_NONE);
5850: 0a 20 20 20 20 69 66 28 20 70 56 61 6c 20 26 26  .    if( pVal &&
5860: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
5870: 79 70 65 28 70 56 61 6c 29 3d 3d 53 51 4c 49 54  ype(pVal)==SQLIT
5880: 45 5f 54 45 58 54 20 29 7b 0a 20 20 20 20 20 20  E_TEXT ){.      
5890: 7a 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69  z = (char *)sqli
58a0: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 70  te3_value_text(p
58b0: 56 61 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Val);.    }.    
58c0: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 56 61  sqlite3VdbeSetVa
58d0: 72 6d 61 73 6b 28 70 50 61 72 73 65 2d 3e 70 56  rmask(pParse->pV
58e0: 64 62 65 2c 20 69 43 6f 6c 29 3b 0a 20 20 20 20  dbe, iCol);.    
58f0: 61 73 73 65 72 74 28 20 70 52 69 67 68 74 2d 3e  assert( pRight->
5900: 6f 70 3d 3d 54 4b 5f 56 41 52 49 41 42 4c 45 20  op==TK_VARIABLE 
5910: 7c 7c 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54  || pRight->op==T
5920: 4b 5f 52 45 47 49 53 54 45 52 20 29 3b 0a 20 20  K_REGISTER );.  
5930: 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b  }else if( op==TK
5940: 5f 53 54 52 49 4e 47 20 29 7b 0a 20 20 20 20 7a  _STRING ){.    z
5950: 20 3d 20 70 52 69 67 68 74 2d 3e 75 2e 7a 54 6f   = pRight->u.zTo
5960: 6b 65 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a  ken;.  }.  if( z
5970: 20 29 7b 0a 20 20 20 20 63 6e 74 20 3d 20 30 3b   ){.    cnt = 0;
5980: 0a 20 20 20 20 77 68 69 6c 65 28 20 28 63 3d 7a  .    while( (c=z
5990: 5b 63 6e 74 5d 29 21 3d 30 20 26 26 20 63 21 3d  [cnt])!=0 && c!=
59a0: 77 63 5b 30 5d 20 26 26 20 63 21 3d 77 63 5b 31  wc[0] && c!=wc[1
59b0: 5d 20 26 26 20 63 21 3d 77 63 5b 32 5d 20 29 7b  ] && c!=wc[2] ){
59c0: 0a 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20  .      cnt++;.  
59d0: 20 20 7d 0a 20 20 20 20 69 66 28 20 63 6e 74 21    }.    if( cnt!
59e0: 3d 30 20 26 26 20 32 35 35 21 3d 28 75 38 29 7a  =0 && 255!=(u8)z
59f0: 5b 63 6e 74 2d 31 5d 20 29 7b 0a 20 20 20 20 20  [cnt-1] ){.     
5a00: 20 45 78 70 72 20 2a 70 50 72 65 66 69 78 3b 0a   Expr *pPrefix;.
5a10: 20 20 20 20 20 20 2a 70 69 73 43 6f 6d 70 6c 65        *pisComple
5a20: 74 65 20 3d 20 63 3d 3d 77 63 5b 30 5d 20 26 26  te = c==wc[0] &&
5a30: 20 7a 5b 63 6e 74 2b 31 5d 3d 3d 30 3b 0a 20 20   z[cnt+1]==0;.  
5a40: 20 20 20 20 70 50 72 65 66 69 78 20 3d 20 73 71      pPrefix = sq
5a50: 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b  lite3Expr(db, TK
5a60: 5f 53 54 52 49 4e 47 2c 20 7a 29 3b 0a 20 20 20  _STRING, z);.   
5a70: 20 20 20 69 66 28 20 70 50 72 65 66 69 78 20 29     if( pPrefix )
5a80: 20 70 50 72 65 66 69 78 2d 3e 75 2e 7a 54 6f 6b   pPrefix->u.zTok
5a90: 65 6e 5b 63 6e 74 5d 20 3d 20 30 3b 0a 20 20 20  en[cnt] = 0;.   
5aa0: 20 20 20 2a 70 70 50 72 65 66 69 78 20 3d 20 70     *ppPrefix = p
5ab0: 50 72 65 66 69 78 3b 0a 20 20 20 20 20 20 69 66  Prefix;.      if
5ac0: 28 20 6f 70 3d 3d 54 4b 5f 56 41 52 49 41 42 4c  ( op==TK_VARIABL
5ad0: 45 20 29 7b 0a 20 20 20 20 20 20 20 20 56 64 62  E ){.        Vdb
5ae0: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
5af0: 56 64 62 65 3b 0a 20 20 20 20 20 20 20 20 73 71  Vdbe;.        sq
5b00: 6c 69 74 65 33 56 64 62 65 53 65 74 56 61 72 6d  lite3VdbeSetVarm
5b10: 61 73 6b 28 76 2c 20 70 52 69 67 68 74 2d 3e 69  ask(v, pRight->i
5b20: 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 20  Column);.       
5b30: 20 69 66 28 20 2a 70 69 73 43 6f 6d 70 6c 65 74   if( *pisComplet
5b40: 65 20 26 26 20 70 52 69 67 68 74 2d 3e 75 2e 7a  e && pRight->u.z
5b50: 54 6f 6b 65 6e 5b 31 5d 20 29 7b 0a 20 20 20 20  Token[1] ){.    
5b60: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
5b70: 72 68 73 20 6f 66 20 74 68 65 20 4c 49 4b 45 20  rhs of the LIKE 
5b80: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20  expression is a 
5b90: 76 61 72 69 61 62 6c 65 2c 20 61 6e 64 20 74 68  variable, and th
5ba0: 65 20 63 75 72 72 65 6e 74 0a 20 20 20 20 20 20  e current.      
5bb0: 20 20 20 20 2a 2a 20 76 61 6c 75 65 20 6f 66 20      ** value of 
5bc0: 74 68 65 20 76 61 72 69 61 62 6c 65 20 6d 65 61  the variable mea
5bd0: 6e 73 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e  ns there is no n
5be0: 65 65 64 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68  eed to invoke th
5bf0: 65 20 4c 49 4b 45 0a 20 20 20 20 20 20 20 20 20  e LIKE.         
5c00: 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68   ** function, th
5c10: 65 6e 20 6e 6f 20 4f 50 5f 56 61 72 69 61 62 6c  en no OP_Variabl
5c20: 65 20 77 69 6c 6c 20 62 65 20 61 64 64 65 64 20  e will be added 
5c30: 74 6f 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 0a  to the program..
5c40: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69            ** Thi
5c50: 73 20 63 61 75 73 65 73 20 70 72 6f 62 6c 65 6d  s causes problem
5c60: 73 20 66 6f 72 20 74 68 65 20 73 71 6c 69 74 65  s for the sqlite
5c70: 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72  3_bind_parameter
5c80: 5f 6e 61 6d 65 28 29 0a 20 20 20 20 20 20 20 20  _name().        
5c90: 20 20 2a 2a 20 41 50 49 2e 20 54 6f 20 77 6f 72    ** API. To wor
5ca0: 6b 20 61 72 6f 75 6e 64 20 74 68 65 6d 2c 20 61  k around them, a
5cb0: 64 64 20 61 20 64 75 6d 6d 79 20 4f 50 5f 56 61  dd a dummy OP_Va
5cc0: 72 69 61 62 6c 65 20 68 65 72 65 2e 0a 20 20 20  riable here..   
5cd0: 20 20 20 20 20 20 20 2a 2f 20 0a 20 20 20 20 20         */ .     
5ce0: 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71       int r1 = sq
5cf0: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
5d00: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
5d10: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
5d20: 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c  deTarget(pParse,
5d30: 20 70 52 69 67 68 74 2c 20 72 31 29 3b 0a 20 20   pRight, r1);.  
5d40: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
5d50: 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 73  dbeChangeP3(v, s
5d60: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
5d70: 74 41 64 64 72 28 76 29 2d 31 2c 20 30 29 3b 0a  tAddr(v)-1, 0);.
5d80: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
5d90: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
5da0: 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20  pParse, r1);.   
5db0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
5dc0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
5dd0: 7a 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  z = 0;.    }.  }
5de0: 0a 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65  ..  sqlite3Value
5df0: 46 72 65 65 28 70 56 61 6c 29 3b 0a 20 20 72 65  Free(pVal);.  re
5e00: 74 75 72 6e 20 28 7a 21 3d 30 29 3b 0a 7d 0a 23  turn (z!=0);.}.#
5e10: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
5e20: 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49  OMIT_LIKE_OPTIMI
5e30: 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 0a 23 69 66 6e  ZATION */...#ifn
5e40: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
5e50: 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a  VIRTUALTABLE./*.
5e60: 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  ** Check to see 
5e70: 69 66 20 74 68 65 20 67 69 76 65 6e 20 65 78 70  if the given exp
5e80: 72 65 73 73 69 6f 6e 20 69 73 20 6f 66 20 74 68  ression is of th
5e90: 65 20 66 6f 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20  e form.**.**    
5ea0: 20 20 20 20 20 63 6f 6c 75 6d 6e 20 4d 41 54 43       column MATC
5eb0: 48 20 65 78 70 72 0a 2a 2a 0a 2a 2a 20 49 66 20  H expr.**.** If 
5ec0: 69 74 20 69 73 20 74 68 65 6e 20 72 65 74 75 72  it is then retur
5ed0: 6e 20 54 52 55 45 2e 20 20 49 66 20 6e 6f 74 2c  n TRUE.  If not,
5ee0: 20 72 65 74 75 72 6e 20 46 41 4c 53 45 2e 0a 2a   return FALSE..*
5ef0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73 4d  /.static int isM
5f00: 61 74 63 68 4f 66 43 6f 6c 75 6d 6e 28 0a 20 20  atchOfColumn(.  
5f10: 45 78 70 72 20 2a 70 45 78 70 72 20 20 20 20 20  Expr *pExpr     
5f20: 20 2f 2a 20 54 65 73 74 20 74 68 69 73 20 65 78   /* Test this ex
5f30: 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 29 7b 0a 20  pression */.){. 
5f40: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
5f50: 3b 0a 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  ;..  if( pExpr->
5f60: 6f 70 21 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20  op!=TK_FUNCTION 
5f70: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
5f80: 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74  .  }.  if( sqlit
5f90: 65 33 53 74 72 49 43 6d 70 28 70 45 78 70 72 2d  e3StrICmp(pExpr-
5fa0: 3e 75 2e 7a 54 6f 6b 65 6e 2c 22 6d 61 74 63 68  >u.zToken,"match
5fb0: 22 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ")!=0 ){.    ret
5fc0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4c 69  urn 0;.  }.  pLi
5fd0: 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c  st = pExpr->x.pL
5fe0: 69 73 74 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  ist;.  if( pList
5ff0: 2d 3e 6e 45 78 70 72 21 3d 32 20 29 7b 0a 20 20  ->nExpr!=2 ){.  
6000: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
6010: 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 61 5b 31    if( pList->a[1
6020: 5d 2e 70 45 78 70 72 2d 3e 6f 70 20 21 3d 20 54  ].pExpr->op != T
6030: 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20  K_COLUMN ){.    
6040: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
6050: 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64  return 1;.}.#end
6060: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
6070: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a  T_VIRTUALTABLE *
6080: 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  /../*.** If the 
6090: 70 42 61 73 65 20 65 78 70 72 65 73 73 69 6f 6e  pBase expression
60a0: 20 6f 72 69 67 69 6e 61 74 65 64 20 69 6e 20 74   originated in t
60b0: 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63  he ON or USING c
60c0: 6c 61 75 73 65 20 6f 66 0a 2a 2a 20 61 20 6a 6f  lause of.** a jo
60d0: 69 6e 2c 20 74 68 65 6e 20 74 72 61 6e 73 66 65  in, then transfe
60e0: 72 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  r the appropriat
60f0: 65 20 6d 61 72 6b 69 6e 67 73 20 6f 76 65 72 20  e markings over 
6100: 74 6f 20 64 65 72 69 76 65 64 2e 0a 2a 2f 0a 73  to derived..*/.s
6110: 74 61 74 69 63 20 76 6f 69 64 20 74 72 61 6e 73  tatic void trans
6120: 66 65 72 4a 6f 69 6e 4d 61 72 6b 69 6e 67 73 28  ferJoinMarkings(
6130: 45 78 70 72 20 2a 70 44 65 72 69 76 65 64 2c 20  Expr *pDerived, 
6140: 45 78 70 72 20 2a 70 42 61 73 65 29 7b 0a 20 20  Expr *pBase){.  
6150: 69 66 28 20 70 44 65 72 69 76 65 64 20 29 7b 0a  if( pDerived ){.
6160: 20 20 20 20 70 44 65 72 69 76 65 64 2d 3e 66 6c      pDerived->fl
6170: 61 67 73 20 7c 3d 20 70 42 61 73 65 2d 3e 66 6c  ags |= pBase->fl
6180: 61 67 73 20 26 20 45 50 5f 46 72 6f 6d 4a 6f 69  ags & EP_FromJoi
6190: 6e 3b 0a 20 20 20 20 70 44 65 72 69 76 65 64 2d  n;.    pDerived-
61a0: 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65  >iRightJoinTable
61b0: 20 3d 20 70 42 61 73 65 2d 3e 69 52 69 67 68 74   = pBase->iRight
61c0: 4a 6f 69 6e 54 61 62 6c 65 3b 0a 20 20 7d 0a 7d  JoinTable;.  }.}
61d0: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 74 65 72  ../*.** Mark ter
61e0: 6d 20 69 43 68 69 6c 64 20 61 73 20 62 65 69 6e  m iChild as bein
61f0: 67 20 61 20 63 68 69 6c 64 20 6f 66 20 74 65 72  g a child of ter
6200: 6d 20 69 50 61 72 65 6e 74 0a 2a 2f 0a 73 74 61  m iParent.*/.sta
6210: 74 69 63 20 76 6f 69 64 20 6d 61 72 6b 54 65 72  tic void markTer
6220: 6d 41 73 43 68 69 6c 64 28 57 68 65 72 65 43 6c  mAsChild(WhereCl
6230: 61 75 73 65 20 2a 70 57 43 2c 20 69 6e 74 20 69  ause *pWC, int i
6240: 43 68 69 6c 64 2c 20 69 6e 74 20 69 50 61 72 65  Child, int iPare
6250: 6e 74 29 7b 0a 20 20 70 57 43 2d 3e 61 5b 69 43  nt){.  pWC->a[iC
6260: 68 69 6c 64 5d 2e 69 50 61 72 65 6e 74 20 3d 20  hild].iParent = 
6270: 69 50 61 72 65 6e 74 3b 0a 20 20 70 57 43 2d 3e  iParent;.  pWC->
6280: 61 5b 69 43 68 69 6c 64 5d 2e 74 72 75 74 68 50  a[iChild].truthP
6290: 72 6f 62 20 3d 20 70 57 43 2d 3e 61 5b 69 50 61  rob = pWC->a[iPa
62a0: 72 65 6e 74 5d 2e 74 72 75 74 68 50 72 6f 62 3b  rent].truthProb;
62b0: 0a 20 20 70 57 43 2d 3e 61 5b 69 50 61 72 65 6e  .  pWC->a[iParen
62c0: 74 5d 2e 6e 43 68 69 6c 64 2b 2b 3b 0a 7d 0a 0a  t].nChild++;.}..
62d0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
62e0: 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49  ITE_OMIT_OR_OPTI
62f0: 4d 49 5a 41 54 49 4f 4e 29 20 26 26 20 21 64 65  MIZATION) && !de
6300: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
6310: 54 5f 53 55 42 51 55 45 52 59 29 0a 2f 2a 0a 2a  T_SUBQUERY)./*.*
6320: 2a 20 41 6e 61 6c 79 7a 65 20 61 20 74 65 72 6d  * Analyze a term
6330: 20 74 68 61 74 20 63 6f 6e 73 69 73 74 73 20 6f   that consists o
6340: 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 4f 52  f two or more OR
6350: 2d 63 6f 6e 6e 65 63 74 65 64 0a 2a 2a 20 73 75  -connected.** su
6360: 62 74 65 72 6d 73 2e 20 20 53 6f 20 69 6e 3a 0a  bterms.  So in:.
6370: 2a 2a 0a 2a 2a 20 20 20 20 20 2e 2e 2e 20 57 48  **.**     ... WH
6380: 45 52 45 20 20 28 61 3d 35 29 20 41 4e 44 20 28  ERE  (a=5) AND (
6390: 62 3d 37 20 4f 52 20 63 3d 39 20 4f 52 20 64 3d  b=7 OR c=9 OR d=
63a0: 31 33 29 20 41 4e 44 20 28 64 3d 31 33 29 0a 2a  13) AND (d=13).*
63b0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
63c0: 20 20 20 20 20 20 20 20 20 20 20 5e 5e 5e 5e 5e             ^^^^^
63d0: 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 0a  ^^^^^^^^^^^^^^^.
63e0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
63f0: 6e 65 20 61 6e 61 6c 79 7a 65 73 20 74 65 72 6d  ne analyzes term
6400: 73 20 73 75 63 68 20 61 73 20 74 68 65 20 6d 69  s such as the mi
6410: 64 64 6c 65 20 74 65 72 6d 20 69 6e 20 74 68 65  ddle term in the
6420: 20 61 62 6f 76 65 20 65 78 61 6d 70 6c 65 2e 0a   above example..
6430: 2a 2a 20 41 20 57 68 65 72 65 4f 72 54 65 72 6d  ** A WhereOrTerm
6440: 20 6f 62 6a 65 63 74 20 69 73 20 63 6f 6d 70 75   object is compu
6450: 74 65 64 20 61 6e 64 20 61 74 74 61 63 68 65 64  ted and attached
6460: 20 74 6f 20 74 68 65 20 74 65 72 6d 20 75 6e 64   to the term und
6470: 65 72 0a 2a 2a 20 61 6e 61 6c 79 73 69 73 2c 20  er.** analysis, 
6480: 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68  regardless of th
6490: 65 20 6f 75 74 63 6f 6d 65 20 6f 66 20 74 68 65  e outcome of the
64a0: 20 61 6e 61 6c 79 73 69 73 2e 20 20 48 65 6e 63   analysis.  Henc
64b0: 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 57 68 65  e:.**.**     Whe
64c0: 72 65 54 65 72 6d 2e 77 74 46 6c 61 67 73 20 20  reTerm.wtFlags  
64d0: 20 7c 3d 20 20 54 45 52 4d 5f 4f 52 49 4e 46 4f   |=  TERM_ORINFO
64e0: 0a 2a 2a 20 20 20 20 20 57 68 65 72 65 54 65 72  .**     WhereTer
64f0: 6d 2e 75 2e 70 4f 72 49 6e 66 6f 20 20 3d 20 20  m.u.pOrInfo  =  
6500: 61 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c  a dynamically al
6510: 6c 6f 63 61 74 65 64 20 57 68 65 72 65 4f 72 54  located WhereOrT
6520: 65 72 6d 20 6f 62 6a 65 63 74 0a 2a 2a 0a 2a 2a  erm object.**.**
6530: 20 54 68 65 20 74 65 72 6d 20 62 65 69 6e 67 20   The term being 
6540: 61 6e 61 6c 79 7a 65 64 20 6d 75 73 74 20 68 61  analyzed must ha
6550: 76 65 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 6f  ve two or more o
6560: 66 20 4f 52 2d 63 6f 6e 6e 65 63 74 65 64 20 73  f OR-connected s
6570: 75 62 74 65 72 6d 73 2e 0a 2a 2a 20 41 20 73 69  ubterms..** A si
6580: 6e 67 6c 65 20 73 75 62 74 65 72 6d 20 6d 69 67  ngle subterm mig
6590: 68 74 20 62 65 20 61 20 73 65 74 20 6f 66 20 41  ht be a set of A
65a0: 4e 44 2d 63 6f 6e 6e 65 63 74 65 64 20 73 75 62  ND-connected sub
65b0: 2d 73 75 62 74 65 72 6d 73 2e 0a 2a 2a 20 45 78  -subterms..** Ex
65c0: 61 6d 70 6c 65 73 20 6f 66 20 74 65 72 6d 73 20  amples of terms 
65d0: 75 6e 64 65 72 20 61 6e 61 6c 79 73 69 73 3a 0a  under analysis:.
65e0: 2a 2a 0a 2a 2a 20 20 20 20 20 28 41 29 20 20 20  **.**     (A)   
65f0: 20 20 74 31 2e 78 3d 74 32 2e 79 20 4f 52 20 74    t1.x=t2.y OR t
6600: 31 2e 78 3d 74 32 2e 7a 20 4f 52 20 74 31 2e 79  1.x=t2.z OR t1.y
6610: 3d 31 35 20 4f 52 20 74 31 2e 7a 3d 74 33 2e 61  =15 OR t1.z=t3.a
6620: 2b 35 0a 2a 2a 20 20 20 20 20 28 42 29 20 20 20  +5.**     (B)   
6630: 20 20 78 3d 65 78 70 72 31 20 4f 52 20 65 78 70    x=expr1 OR exp
6640: 72 32 3d 78 20 4f 52 20 78 3d 65 78 70 72 33 0a  r2=x OR x=expr3.
6650: 2a 2a 20 20 20 20 20 28 43 29 20 20 20 20 20 74  **     (C)     t
6660: 31 2e 78 3d 74 32 2e 79 20 4f 52 20 28 74 31 2e  1.x=t2.y OR (t1.
6670: 78 3d 74 32 2e 7a 20 41 4e 44 20 74 31 2e 79 3d  x=t2.z AND t1.y=
6680: 31 35 29 0a 2a 2a 20 20 20 20 20 28 44 29 20 20  15).**     (D)  
6690: 20 20 20 78 3d 65 78 70 72 31 20 4f 52 20 28 79     x=expr1 OR (y
66a0: 3e 31 31 20 41 4e 44 20 79 3c 32 32 20 41 4e 44  >11 AND y<22 AND
66b0: 20 7a 20 4c 49 4b 45 20 27 2a 68 65 6c 6c 6f 2a   z LIKE '*hello*
66c0: 27 29 0a 2a 2a 20 20 20 20 20 28 45 29 20 20 20  ').**     (E)   
66d0: 20 20 28 70 2e 61 3d 31 20 41 4e 44 20 71 2e 62    (p.a=1 AND q.b
66e0: 3d 32 20 41 4e 44 20 72 2e 63 3d 33 29 20 4f 52  =2 AND r.c=3) OR
66f0: 20 28 70 2e 78 3d 34 20 41 4e 44 20 71 2e 79 3d   (p.x=4 AND q.y=
6700: 35 20 41 4e 44 20 72 2e 7a 3d 36 29 0a 2a 2a 0a  5 AND r.z=6).**.
6710: 2a 2a 20 43 41 53 45 20 31 3a 0a 2a 2a 0a 2a 2a  ** CASE 1:.**.**
6720: 20 49 66 20 61 6c 6c 20 73 75 62 74 65 72 6d 73   If all subterms
6730: 20 61 72 65 20 6f 66 20 74 68 65 20 66 6f 72 6d   are of the form
6740: 20 54 2e 43 3d 65 78 70 72 20 66 6f 72 20 73 6f   T.C=expr for so
6750: 6d 65 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e  me single column
6760: 20 6f 66 20 43 20 61 6e 64 0a 2a 2a 20 61 20 73   of C and.** a s
6770: 69 6e 67 6c 65 20 74 61 62 6c 65 20 54 20 28 61  ingle table T (a
6780: 73 20 73 68 6f 77 6e 20 69 6e 20 65 78 61 6d 70  s shown in examp
6790: 6c 65 20 42 20 61 62 6f 76 65 29 20 74 68 65 6e  le B above) then
67a0: 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 76 69   create a new vi
67b0: 72 74 75 61 6c 0a 2a 2a 20 74 65 72 6d 20 74 68  rtual.** term th
67c0: 61 74 20 69 73 20 61 6e 20 65 71 75 69 76 61 6c  at is an equival
67d0: 65 6e 74 20 49 4e 20 65 78 70 72 65 73 73 69 6f  ent IN expressio
67e0: 6e 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  n.  In other wor
67f0: 64 73 2c 20 69 66 20 74 68 65 20 74 65 72 6d 0a  ds, if the term.
6800: 2a 2a 20 62 65 69 6e 67 20 61 6e 61 6c 79 7a 65  ** being analyze
6810: 64 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  d is:.**.**     
6820: 20 78 20 3d 20 65 78 70 72 31 20 20 4f 52 20 20   x = expr1  OR  
6830: 65 78 70 72 32 20 3d 20 78 20 20 4f 52 20 20 78  expr2 = x  OR  x
6840: 20 3d 20 65 78 70 72 33 0a 2a 2a 0a 2a 2a 20 74   = expr3.**.** t
6850: 68 65 6e 20 63 72 65 61 74 65 20 61 20 6e 65 77  hen create a new
6860: 20 76 69 72 74 75 61 6c 20 74 65 72 6d 20 6c 69   virtual term li
6870: 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  ke this:.**.**  
6880: 20 20 20 20 78 20 49 4e 20 28 65 78 70 72 31 2c      x IN (expr1,
6890: 65 78 70 72 32 2c 65 78 70 72 33 29 0a 2a 2a 0a  expr2,expr3).**.
68a0: 2a 2a 20 43 41 53 45 20 32 3a 0a 2a 2a 0a 2a 2a  ** CASE 2:.**.**
68b0: 20 49 66 20 61 6c 6c 20 73 75 62 74 65 72 6d 73   If all subterms
68c0: 20 61 72 65 20 69 6e 64 65 78 61 62 6c 65 20 62   are indexable b
68d0: 79 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65  y a single table
68e0: 20 54 2c 20 74 68 65 6e 20 73 65 74 0a 2a 2a 0a   T, then set.**.
68f0: 2a 2a 20 20 20 20 20 57 68 65 72 65 54 65 72 6d  **     WhereTerm
6900: 2e 65 4f 70 65 72 61 74 6f 72 20 20 20 20 20 20  .eOperator      
6910: 20 20 20 20 20 20 20 20 3d 20 20 57 4f 5f 4f 52          =  WO_OR
6920: 0a 2a 2a 20 20 20 20 20 57 68 65 72 65 54 65 72  .**     WhereTer
6930: 6d 2e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 69 6e 64  m.u.pOrInfo->ind
6940: 65 78 61 62 6c 65 20 20 7c 3d 20 20 74 68 65 20  exable  |=  the 
6950: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f  cursor number fo
6960: 72 20 74 61 62 6c 65 20 54 0a 2a 2a 0a 2a 2a 20  r table T.**.** 
6970: 41 20 73 75 62 74 65 72 6d 20 69 73 20 22 69 6e  A subterm is "in
6980: 64 65 78 61 62 6c 65 22 20 69 66 20 69 74 20 69  dexable" if it i
6990: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a 2a 2a  s of the form.**
69a0: 20 22 54 2e 43 20 3c 6f 70 3e 20 3c 65 78 70 72   "T.C <op> <expr
69b0: 3e 22 20 77 68 65 72 65 20 43 20 69 73 20 61 6e  >" where C is an
69c0: 79 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c  y column of tabl
69d0: 65 20 54 20 61 6e 64 20 0a 2a 2a 20 3c 6f 70 3e  e T and .** <op>
69e0: 20 69 73 20 6f 6e 65 20 6f 66 20 22 3d 22 2c 20   is one of "=", 
69f0: 22 3c 22 2c 20 22 3c 3d 22 2c 20 22 3e 22 2c 20  "<", "<=", ">", 
6a00: 22 3e 3d 22 2c 20 22 49 53 20 4e 55 4c 4c 22 2c  ">=", "IS NULL",
6a10: 20 6f 72 20 22 49 4e 22 2e 0a 2a 2a 20 41 20 73   or "IN"..** A s
6a20: 75 62 74 65 72 6d 20 69 73 20 61 6c 73 6f 20 69  ubterm is also i
6a30: 6e 64 65 78 61 62 6c 65 20 69 66 20 69 74 20 69  ndexable if it i
6a40: 73 20 61 6e 20 41 4e 44 20 6f 66 20 74 77 6f 20  s an AND of two 
6a50: 6f 72 20 6d 6f 72 65 0a 2a 2a 20 73 75 62 73 75  or more.** subsu
6a60: 62 74 65 72 6d 73 20 61 74 20 6c 65 61 73 74 20  bterms at least 
6a70: 6f 6e 65 20 6f 66 20 77 68 69 63 68 20 69 73 20  one of which is 
6a80: 69 6e 64 65 78 61 62 6c 65 2e 20 20 49 6e 64 65  indexable.  Inde
6a90: 78 61 62 6c 65 20 41 4e 44 20 0a 2a 2a 20 73 75  xable AND .** su
6aa0: 62 74 65 72 6d 73 20 68 61 76 65 20 74 68 65 69  bterms have thei
6ab0: 72 20 65 4f 70 65 72 61 74 6f 72 20 73 65 74 20  r eOperator set 
6ac0: 74 6f 20 57 4f 5f 41 4e 44 20 61 6e 64 20 74 68  to WO_AND and th
6ad0: 65 79 20 68 61 76 65 0a 2a 2a 20 75 2e 70 41 6e  ey have.** u.pAn
6ae0: 64 49 6e 66 6f 20 73 65 74 20 74 6f 20 61 20 64  dInfo set to a d
6af0: 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f 63  ynamically alloc
6b00: 61 74 65 64 20 57 68 65 72 65 41 6e 64 54 65 72  ated WhereAndTer
6b10: 6d 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20  m object..**.** 
6b20: 46 72 6f 6d 20 61 6e 6f 74 68 65 72 20 70 6f 69  From another poi
6b30: 6e 74 20 6f 66 20 76 69 65 77 2c 20 22 69 6e 64  nt of view, "ind
6b40: 65 78 61 62 6c 65 22 20 6d 65 61 6e 73 20 74 68  exable" means th
6b50: 61 74 20 74 68 65 20 73 75 62 74 65 72 6d 20 63  at the subterm c
6b60: 6f 75 6c 64 0a 2a 2a 20 70 6f 74 65 6e 74 69 61  ould.** potentia
6b70: 6c 6c 79 20 62 65 20 75 73 65 64 20 77 69 74 68  lly be used with
6b80: 20 61 6e 20 69 6e 64 65 78 20 69 66 20 61 6e 20   an index if an 
6b90: 61 70 70 72 6f 70 72 69 61 74 65 20 69 6e 64 65  appropriate inde
6ba0: 78 20 65 78 69 73 74 73 2e 0a 2a 2a 20 54 68 69  x exists..** Thi
6bb0: 73 20 61 6e 61 6c 79 73 69 73 20 64 6f 65 73 20  s analysis does 
6bc0: 6e 6f 74 20 63 6f 6e 73 69 64 65 72 20 77 68 65  not consider whe
6bd0: 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20  ther or not the 
6be0: 69 6e 64 65 78 20 65 78 69 73 74 73 3b 20 74 68  index exists; th
6bf0: 61 74 0a 2a 2a 20 69 73 20 64 65 63 69 64 65 64  at.** is decided
6c00: 20 65 6c 73 65 77 68 65 72 65 2e 20 20 54 68 69   elsewhere.  Thi
6c10: 73 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 20  s analysis only 
6c20: 6c 6f 6f 6b 73 20 61 74 20 77 68 65 74 68 65 72  looks at whether
6c30: 20 73 75 62 74 65 72 6d 73 0a 2a 2a 20 61 70 70   subterms.** app
6c40: 72 6f 70 72 69 61 74 65 20 66 6f 72 20 69 6e 64  ropriate for ind
6c50: 65 78 69 6e 67 20 65 78 69 73 74 2e 0a 2a 2a 0a  exing exist..**.
6c60: 2a 2a 20 41 6c 6c 20 65 78 61 6d 70 6c 65 73 20  ** All examples 
6c70: 41 20 74 68 72 6f 75 67 68 20 45 20 61 62 6f 76  A through E abov
6c80: 65 20 73 61 74 69 73 66 79 20 63 61 73 65 20 32  e satisfy case 2
6c90: 2e 20 20 42 75 74 20 69 66 20 61 20 74 65 72 6d  .  But if a term
6ca0: 0a 2a 2a 20 61 6c 73 6f 20 73 61 74 69 73 66 69  .** also satisfi
6cb0: 65 73 20 63 61 73 65 20 31 20 28 73 75 63 68 20  es case 1 (such 
6cc0: 61 73 20 42 29 20 77 65 20 6b 6e 6f 77 20 74 68  as B) we know th
6cd0: 61 74 20 74 68 65 20 6f 70 74 69 6d 69 7a 65 72  at the optimizer
6ce0: 20 77 69 6c 6c 0a 2a 2a 20 61 6c 77 61 79 73 20   will.** always 
6cf0: 70 72 65 66 65 72 20 63 61 73 65 20 31 2c 20 73  prefer case 1, s
6d00: 6f 20 69 6e 20 74 68 61 74 20 63 61 73 65 20 77  o in that case w
6d10: 65 20 70 72 65 74 65 6e 64 20 74 68 61 74 20 63  e pretend that c
6d20: 61 73 65 20 32 20 69 73 20 6e 6f 74 0a 2a 2a 20  ase 2 is not.** 
6d30: 73 61 74 69 73 66 69 65 64 2e 0a 2a 2a 0a 2a 2a  satisfied..**.**
6d40: 20 49 74 20 6d 69 67 68 74 20 62 65 20 74 68 65   It might be the
6d50: 20 63 61 73 65 20 74 68 61 74 20 6d 75 6c 74 69   case that multi
6d60: 70 6c 65 20 74 61 62 6c 65 73 20 61 72 65 20 69  ple tables are i
6d70: 6e 64 65 78 61 62 6c 65 2e 20 20 46 6f 72 20 65  ndexable.  For e
6d80: 78 61 6d 70 6c 65 2c 0a 2a 2a 20 28 45 29 20 61  xample,.** (E) a
6d90: 62 6f 76 65 20 69 73 20 69 6e 64 65 78 61 62 6c  bove is indexabl
6da0: 65 20 6f 6e 20 74 61 62 6c 65 73 20 50 2c 20 51  e on tables P, Q
6db0: 2c 20 61 6e 64 20 52 2e 0a 2a 2a 0a 2a 2a 20 54  , and R..**.** T
6dc0: 65 72 6d 73 20 74 68 61 74 20 73 61 74 69 73 66  erms that satisf
6dd0: 79 20 63 61 73 65 20 32 20 61 72 65 20 63 61 6e  y case 2 are can
6de0: 64 69 64 61 74 65 73 20 66 6f 72 20 6c 6f 6f 6b  didates for look
6df0: 75 70 20 62 79 20 75 73 69 6e 67 0a 2a 2a 20 73  up by using.** s
6e00: 65 70 61 72 61 74 65 20 69 6e 64 69 63 65 73 20  eparate indices 
6e10: 74 6f 20 66 69 6e 64 20 72 6f 77 69 64 73 20 66  to find rowids f
6e20: 6f 72 20 65 61 63 68 20 73 75 62 74 65 72 6d 20  or each subterm 
6e30: 61 6e 64 20 63 6f 6d 70 6f 73 69 6e 67 0a 2a 2a  and composing.**
6e40: 20 74 68 65 20 75 6e 69 6f 6e 20 6f 66 20 61 6c   the union of al
6e50: 6c 20 72 6f 77 69 64 73 20 75 73 69 6e 67 20 61  l rowids using a
6e60: 20 52 6f 77 53 65 74 20 6f 62 6a 65 63 74 2e 20   RowSet object. 
6e70: 20 54 68 69 73 20 69 73 20 73 69 6d 69 6c 61 72   This is similar
6e80: 0a 2a 2a 20 74 6f 20 22 62 69 74 6d 61 70 20 69  .** to "bitmap i
6e90: 6e 64 69 63 65 73 22 20 69 6e 20 6f 74 68 65 72  ndices" in other
6ea0: 20 64 61 74 61 62 61 73 65 20 65 6e 67 69 6e 65   database engine
6eb0: 73 2e 0a 2a 2a 0a 2a 2a 20 4f 54 48 45 52 57 49  s..**.** OTHERWI
6ec0: 53 45 3a 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 65 69  SE:.**.** If nei
6ed0: 74 68 65 72 20 63 61 73 65 20 31 20 6e 6f 72 20  ther case 1 nor 
6ee0: 63 61 73 65 20 32 20 61 70 70 6c 79 2c 20 74 68  case 2 apply, th
6ef0: 65 6e 20 6c 65 61 76 65 20 74 68 65 20 65 4f 70  en leave the eOp
6f00: 65 72 61 74 6f 72 20 73 65 74 20 74 6f 0a 2a 2a  erator set to.**
6f10: 20 7a 65 72 6f 2e 20 20 54 68 69 73 20 74 65 72   zero.  This ter
6f20: 6d 20 69 73 20 6e 6f 74 20 75 73 65 66 75 6c 20  m is not useful 
6f30: 66 6f 72 20 73 65 61 72 63 68 2e 0a 2a 2f 0a 73  for search..*/.s
6f40: 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 72 41  tatic void exprA
6f50: 6e 61 6c 79 7a 65 4f 72 54 65 72 6d 28 0a 20 20  nalyzeOrTerm(.  
6f60: 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20  SrcList *pSrc,  
6f70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65            /* the
6f80: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a   FROM clause */.
6f90: 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
6fa0: 57 43 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 74  WC,         /* t
6fb0: 68 65 20 63 6f 6d 70 6c 65 74 65 20 57 48 45 52  he complete WHER
6fc0: 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e  E clause */.  in
6fd0: 74 20 69 64 78 54 65 72 6d 20 20 20 20 20 20 20  t idxTerm       
6fe0: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
6ff0: 20 6f 66 20 74 68 65 20 4f 52 2d 74 65 72 6d 20   of the OR-term 
7000: 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a  to be analyzed *
7010: 2f 0a 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f  /.){.  WhereInfo
7020: 20 2a 70 57 49 6e 66 6f 20 3d 20 70 57 43 2d 3e   *pWInfo = pWC->
7030: 70 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 2f  pWInfo;        /
7040: 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 70  * WHERE clause p
7050: 72 6f 63 65 73 73 69 6e 67 20 63 6f 6e 74 65 78  rocessing contex
7060: 74 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50  t */.  Parse *pP
7070: 61 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  arse = pWInfo->p
7080: 50 61 72 73 65 3b 20 20 20 20 20 20 20 20 20 2f  Parse;         /
7090: 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74  * Parser context
70a0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
70b0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20  b = pParse->db; 
70c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
70d0: 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
70e0: 74 69 6f 6e 20 2a 2f 0a 20 20 57 68 65 72 65 54  tion */.  WhereT
70f0: 65 72 6d 20 2a 70 54 65 72 6d 20 3d 20 26 70 57  erm *pTerm = &pW
7100: 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 20 20  C->a[idxTerm];  
7110: 20 20 2f 2a 20 54 68 65 20 74 65 72 6d 20 74 6f    /* The term to
7120: 20 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a   be analyzed */.
7130: 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
7140: 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 20 20 20  pTerm->pExpr;   
7150: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
7160: 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 66 20 74   expression of t
7170: 68 65 20 74 65 72 6d 20 2a 2f 0a 20 20 69 6e 74  he term */.  int
7180: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
7190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
71a0: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
71b0: 6e 74 65 72 73 20 2a 2f 0a 20 20 57 68 65 72 65  nters */.  Where
71c0: 43 6c 61 75 73 65 20 2a 70 4f 72 57 63 3b 20 20  Clause *pOrWc;  
71d0: 20 20 20 20 20 2f 2a 20 42 72 65 61 6b 75 70 20       /* Breakup 
71e0: 6f 66 20 70 54 65 72 6d 20 69 6e 74 6f 20 73 75  of pTerm into su
71f0: 62 74 65 72 6d 73 20 2a 2f 0a 20 20 57 68 65 72  bterms */.  Wher
7200: 65 54 65 72 6d 20 2a 70 4f 72 54 65 72 6d 3b 20  eTerm *pOrTerm; 
7210: 20 20 20 20 20 20 2f 2a 20 41 20 53 75 62 2d 74        /* A Sub-t
7220: 65 72 6d 20 77 69 74 68 69 6e 20 74 68 65 20 70  erm within the p
7230: 4f 72 57 63 20 2a 2f 0a 20 20 57 68 65 72 65 4f  OrWc */.  WhereO
7240: 72 49 6e 66 6f 20 2a 70 4f 72 49 6e 66 6f 3b 20  rInfo *pOrInfo; 
7250: 20 20 20 20 2f 2a 20 41 64 64 69 74 69 6f 6e 61      /* Additiona
7260: 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 73  l information as
7270: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 54  sociated with pT
7280: 65 72 6d 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  erm */.  Bitmask
7290: 20 63 68 6e 67 54 6f 49 4e 3b 20 20 20 20 20 20   chngToIN;      
72a0: 20 20 20 2f 2a 20 54 61 62 6c 65 73 20 74 68 61     /* Tables tha
72b0: 74 20 6d 69 67 68 74 20 73 61 74 69 73 66 79 20  t might satisfy 
72c0: 63 61 73 65 20 31 20 2a 2f 0a 20 20 42 69 74 6d  case 1 */.  Bitm
72d0: 61 73 6b 20 69 6e 64 65 78 61 62 6c 65 3b 20 20  ask indexable;  
72e0: 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 73 20        /* Tables 
72f0: 74 68 61 74 20 61 72 65 20 69 6e 64 65 78 61 62  that are indexab
7300: 6c 65 2c 20 73 61 74 69 73 66 79 69 6e 67 20 63  le, satisfying c
7310: 61 73 65 20 32 20 2a 2f 0a 0a 20 20 2f 2a 0a 20  ase 2 */..  /*. 
7320: 20 2a 2a 20 42 72 65 61 6b 20 74 68 65 20 4f 52   ** Break the OR
7330: 20 63 6c 61 75 73 65 20 69 6e 74 6f 20 69 74 73   clause into its
7340: 20 73 65 70 61 72 61 74 65 20 73 75 62 74 65 72   separate subter
7350: 6d 73 2e 20 20 54 68 65 20 73 75 62 74 65 72 6d  ms.  The subterm
7360: 73 20 61 72 65 0a 20 20 2a 2a 20 73 74 6f 72 65  s are.  ** store
7370: 64 20 69 6e 20 61 20 57 68 65 72 65 43 6c 61 75  d in a WhereClau
7380: 73 65 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e  se structure con
7390: 74 61 69 6e 69 6e 67 20 77 69 74 68 69 6e 20 74  taining within t
73a0: 68 65 20 57 68 65 72 65 4f 72 49 6e 66 6f 0a 20  he WhereOrInfo. 
73b0: 20 2a 2a 20 6f 62 6a 65 63 74 20 74 68 61 74 20   ** object that 
73c0: 69 73 20 61 74 74 61 63 68 65 64 20 74 6f 20 74  is attached to t
73d0: 68 65 20 6f 72 69 67 69 6e 61 6c 20 4f 52 20 63  he original OR c
73e0: 6c 61 75 73 65 20 74 65 72 6d 2e 0a 20 20 2a 2f  lause term..  */
73f0: 0a 20 20 61 73 73 65 72 74 28 20 28 70 54 65 72  .  assert( (pTer
7400: 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54 45  m->wtFlags & (TE
7410: 52 4d 5f 44 59 4e 41 4d 49 43 7c 54 45 52 4d 5f  RM_DYNAMIC|TERM_
7420: 4f 52 49 4e 46 4f 7c 54 45 52 4d 5f 41 4e 44 49  ORINFO|TERM_ANDI
7430: 4e 46 4f 29 29 3d 3d 30 20 29 3b 0a 20 20 61 73  NFO))==0 );.  as
7440: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d  sert( pExpr->op=
7450: 3d 54 4b 5f 4f 52 20 29 3b 0a 20 20 70 54 65 72  =TK_OR );.  pTer
7460: 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 20 3d 20 70  m->u.pOrInfo = p
7470: 4f 72 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33  OrInfo = sqlite3
7480: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
7490: 20 73 69 7a 65 6f 66 28 2a 70 4f 72 49 6e 66 6f   sizeof(*pOrInfo
74a0: 29 29 3b 0a 20 20 69 66 28 20 70 4f 72 49 6e 66  ));.  if( pOrInf
74b0: 6f 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  o==0 ) return;. 
74c0: 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
74d0: 7c 3d 20 54 45 52 4d 5f 4f 52 49 4e 46 4f 3b 0a  |= TERM_ORINFO;.
74e0: 20 20 70 4f 72 57 63 20 3d 20 26 70 4f 72 49 6e    pOrWc = &pOrIn
74f0: 66 6f 2d 3e 77 63 3b 0a 20 20 77 68 65 72 65 43  fo->wc;.  whereC
7500: 6c 61 75 73 65 49 6e 69 74 28 70 4f 72 57 63 2c  lauseInit(pOrWc,
7510: 20 70 57 49 6e 66 6f 29 3b 0a 20 20 77 68 65 72   pWInfo);.  wher
7520: 65 53 70 6c 69 74 28 70 4f 72 57 63 2c 20 70 45  eSplit(pOrWc, pE
7530: 78 70 72 2c 20 54 4b 5f 4f 52 29 3b 0a 20 20 65  xpr, TK_OR);.  e
7540: 78 70 72 41 6e 61 6c 79 7a 65 41 6c 6c 28 70 53  xprAnalyzeAll(pS
7550: 72 63 2c 20 70 4f 72 57 63 29 3b 0a 20 20 69 66  rc, pOrWc);.  if
7560: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
7570: 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61  ed ) return;.  a
7580: 73 73 65 72 74 28 20 70 4f 72 57 63 2d 3e 6e 54  ssert( pOrWc->nT
7590: 65 72 6d 3e 3d 32 20 29 3b 0a 0a 20 20 2f 2a 0a  erm>=2 );..  /*.
75a0: 20 20 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65    ** Compute the
75b0: 20 73 65 74 20 6f 66 20 74 61 62 6c 65 73 20 74   set of tables t
75c0: 68 61 74 20 6d 69 67 68 74 20 73 61 74 69 73 66  hat might satisf
75d0: 79 20 63 61 73 65 73 20 31 20 6f 72 20 32 2e 0a  y cases 1 or 2..
75e0: 20 20 2a 2f 0a 20 20 69 6e 64 65 78 61 62 6c 65    */.  indexable
75f0: 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b 0a   = ~(Bitmask)0;.
7600: 20 20 63 68 6e 67 54 6f 49 4e 20 3d 20 7e 28 42    chngToIN = ~(B
7610: 69 74 6d 61 73 6b 29 30 3b 0a 20 20 66 6f 72 28  itmask)0;.  for(
7620: 69 3d 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d 31  i=pOrWc->nTerm-1
7630: 2c 20 70 4f 72 54 65 72 6d 3d 70 4f 72 57 63 2d  , pOrTerm=pOrWc-
7640: 3e 61 3b 20 69 3e 3d 30 20 26 26 20 69 6e 64 65  >a; i>=0 && inde
7650: 78 61 62 6c 65 3b 20 69 2d 2d 2c 20 70 4f 72 54  xable; i--, pOrT
7660: 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  erm++){.    if( 
7670: 28 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61  (pOrTerm->eOpera
7680: 74 6f 72 20 26 20 57 4f 5f 53 49 4e 47 4c 45 29  tor & WO_SINGLE)
7690: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 57 68 65  ==0 ){.      Whe
76a0: 72 65 41 6e 64 49 6e 66 6f 20 2a 70 41 6e 64 49  reAndInfo *pAndI
76b0: 6e 66 6f 3b 0a 20 20 20 20 20 20 61 73 73 65 72  nfo;.      asser
76c0: 74 28 20 28 70 4f 72 54 65 72 6d 2d 3e 77 74 46  t( (pOrTerm->wtF
76d0: 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 41 4e 44  lags & (TERM_AND
76e0: 49 4e 46 4f 7c 54 45 52 4d 5f 4f 52 49 4e 46 4f  INFO|TERM_ORINFO
76f0: 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 63  ))==0 );.      c
7700: 68 6e 67 54 6f 49 4e 20 3d 20 30 3b 0a 20 20 20  hngToIN = 0;.   
7710: 20 20 20 70 41 6e 64 49 6e 66 6f 20 3d 20 73 71     pAndInfo = sq
7720: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
7730: 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 41 6e  (db, sizeof(*pAn
7740: 64 49 6e 66 6f 29 29 3b 0a 20 20 20 20 20 20 69  dInfo));.      i
7750: 66 28 20 70 41 6e 64 49 6e 66 6f 20 29 7b 0a 20  f( pAndInfo ){. 
7760: 20 20 20 20 20 20 20 57 68 65 72 65 43 6c 61 75         WhereClau
7770: 73 65 20 2a 70 41 6e 64 57 43 3b 0a 20 20 20 20  se *pAndWC;.    
7780: 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
7790: 41 6e 64 54 65 72 6d 3b 0a 20 20 20 20 20 20 20  AndTerm;.       
77a0: 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20 20   int j;.        
77b0: 42 69 74 6d 61 73 6b 20 62 20 3d 20 30 3b 0a 20  Bitmask b = 0;. 
77c0: 20 20 20 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e         pOrTerm->
77d0: 75 2e 70 41 6e 64 49 6e 66 6f 20 3d 20 70 41 6e  u.pAndInfo = pAn
77e0: 64 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 70  dInfo;.        p
77f0: 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20  OrTerm->wtFlags 
7800: 7c 3d 20 54 45 52 4d 5f 41 4e 44 49 4e 46 4f 3b  |= TERM_ANDINFO;
7810: 0a 20 20 20 20 20 20 20 20 70 4f 72 54 65 72 6d  .        pOrTerm
7820: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 57 4f  ->eOperator = WO
7830: 5f 41 4e 44 3b 0a 20 20 20 20 20 20 20 20 70 41  _AND;.        pA
7840: 6e 64 57 43 20 3d 20 26 70 41 6e 64 49 6e 66 6f  ndWC = &pAndInfo
7850: 2d 3e 77 63 3b 0a 20 20 20 20 20 20 20 20 77 68  ->wc;.        wh
7860: 65 72 65 43 6c 61 75 73 65 49 6e 69 74 28 70 41  ereClauseInit(pA
7870: 6e 64 57 43 2c 20 70 57 43 2d 3e 70 57 49 6e 66  ndWC, pWC->pWInf
7880: 6f 29 3b 0a 20 20 20 20 20 20 20 20 77 68 65 72  o);.        wher
7890: 65 53 70 6c 69 74 28 70 41 6e 64 57 43 2c 20 70  eSplit(pAndWC, p
78a0: 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 54  OrTerm->pExpr, T
78b0: 4b 5f 41 4e 44 29 3b 0a 20 20 20 20 20 20 20 20  K_AND);.        
78c0: 65 78 70 72 41 6e 61 6c 79 7a 65 41 6c 6c 28 70  exprAnalyzeAll(p
78d0: 53 72 63 2c 20 70 41 6e 64 57 43 29 3b 0a 20 20  Src, pAndWC);.  
78e0: 20 20 20 20 20 20 70 41 6e 64 57 43 2d 3e 70 4f        pAndWC->pO
78f0: 75 74 65 72 20 3d 20 70 57 43 3b 0a 20 20 20 20  uter = pWC;.    
7900: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 64 62      testcase( db
7910: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
7920: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 64  ;.        if( !d
7930: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
7940: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  ){.          for
7950: 28 6a 3d 30 2c 20 70 41 6e 64 54 65 72 6d 3d 70  (j=0, pAndTerm=p
7960: 41 6e 64 57 43 2d 3e 61 3b 20 6a 3c 70 41 6e 64  AndWC->a; j<pAnd
7970: 57 43 2d 3e 6e 54 65 72 6d 3b 20 6a 2b 2b 2c 20  WC->nTerm; j++, 
7980: 70 41 6e 64 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  pAndTerm++){.   
7990: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
79a0: 20 70 41 6e 64 54 65 72 6d 2d 3e 70 45 78 70 72   pAndTerm->pExpr
79b0: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
79c0: 69 66 28 20 61 6c 6c 6f 77 65 64 4f 70 28 70 41  if( allowedOp(pA
79d0: 6e 64 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 6f  ndTerm->pExpr->o
79e0: 70 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  p) ){.          
79f0: 20 20 20 20 62 20 7c 3d 20 67 65 74 4d 61 73 6b      b |= getMask
7a00: 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53  (&pWInfo->sMaskS
7a10: 65 74 2c 20 70 41 6e 64 54 65 72 6d 2d 3e 6c 65  et, pAndTerm->le
7a20: 66 74 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20  ftCursor);.     
7a30: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
7a40: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
7a50: 20 20 20 20 20 20 20 69 6e 64 65 78 61 62 6c 65         indexable
7a60: 20 26 3d 20 62 3b 0a 20 20 20 20 20 20 7d 0a 20   &= b;.      }. 
7a70: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 72     }else if( pOr
7a80: 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
7a90: 54 45 52 4d 5f 43 4f 50 49 45 44 20 29 7b 0a 20  TERM_COPIED ){. 
7aa0: 20 20 20 20 20 2f 2a 20 53 6b 69 70 20 74 68 69       /* Skip thi
7ab0: 73 20 74 65 72 6d 20 66 6f 72 20 6e 6f 77 2e 20  s term for now. 
7ac0: 20 57 65 20 72 65 76 69 73 69 74 20 69 74 20 77   We revisit it w
7ad0: 68 65 6e 20 77 65 20 70 72 6f 63 65 73 73 20 74  hen we process t
7ae0: 68 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f 72 72  he.      ** corr
7af0: 65 73 70 6f 6e 64 69 6e 67 20 54 45 52 4d 5f 56  esponding TERM_V
7b00: 49 52 54 55 41 4c 20 74 65 72 6d 20 2a 2f 0a 20  IRTUAL term */. 
7b10: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
7b20: 42 69 74 6d 61 73 6b 20 62 3b 0a 20 20 20 20 20  Bitmask b;.     
7b30: 20 62 20 3d 20 67 65 74 4d 61 73 6b 28 26 70 57   b = getMask(&pW
7b40: 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20  Info->sMaskSet, 
7b50: 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72  pOrTerm->leftCur
7b60: 73 6f 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  sor);.      if( 
7b70: 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  pOrTerm->wtFlags
7b80: 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20   & TERM_VIRTUAL 
7b90: 29 7b 0a 20 20 20 20 20 20 20 20 57 68 65 72 65  ){.        Where
7ba0: 54 65 72 6d 20 2a 70 4f 74 68 65 72 20 3d 20 26  Term *pOther = &
7bb0: 70 4f 72 57 63 2d 3e 61 5b 70 4f 72 54 65 72 6d  pOrWc->a[pOrTerm
7bc0: 2d 3e 69 50 61 72 65 6e 74 5d 3b 0a 20 20 20 20  ->iParent];.    
7bd0: 20 20 20 20 62 20 7c 3d 20 67 65 74 4d 61 73 6b      b |= getMask
7be0: 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53  (&pWInfo->sMaskS
7bf0: 65 74 2c 20 70 4f 74 68 65 72 2d 3e 6c 65 66 74  et, pOther->left
7c00: 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 7d  Cursor);.      }
7c10: 0a 20 20 20 20 20 20 69 6e 64 65 78 61 62 6c 65  .      indexable
7c20: 20 26 3d 20 62 3b 0a 20 20 20 20 20 20 69 66 28   &= b;.      if(
7c30: 20 28 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72   (pOrTerm->eOper
7c40: 61 74 6f 72 20 26 20 57 4f 5f 45 51 29 3d 3d 30  ator & WO_EQ)==0
7c50: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 6e 67   ){.        chng
7c60: 54 6f 49 4e 20 3d 20 30 3b 0a 20 20 20 20 20 20  ToIN = 0;.      
7c70: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63  }else{.        c
7c80: 68 6e 67 54 6f 49 4e 20 26 3d 20 62 3b 0a 20 20  hngToIN &= b;.  
7c90: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
7ca0: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 52 65 63 6f 72  .  /*.  ** Recor
7cb0: 64 20 74 68 65 20 73 65 74 20 6f 66 20 74 61 62  d the set of tab
7cc0: 6c 65 73 20 74 68 61 74 20 73 61 74 69 73 66 79  les that satisfy
7cd0: 20 63 61 73 65 20 32 2e 20 20 54 68 65 20 73 65   case 2.  The se
7ce0: 74 20 6d 69 67 68 74 20 62 65 0a 20 20 2a 2a 20  t might be.  ** 
7cf0: 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20 20 70 4f  empty..  */.  pO
7d00: 72 49 6e 66 6f 2d 3e 69 6e 64 65 78 61 62 6c 65  rInfo->indexable
7d10: 20 3d 20 69 6e 64 65 78 61 62 6c 65 3b 0a 20 20   = indexable;.  
7d20: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
7d30: 20 3d 20 69 6e 64 65 78 61 62 6c 65 3d 3d 30 20   = indexable==0 
7d40: 3f 20 30 20 3a 20 57 4f 5f 4f 52 3b 0a 0a 20 20  ? 0 : WO_OR;..  
7d50: 2f 2a 0a 20 20 2a 2a 20 63 68 6e 67 54 6f 49 4e  /*.  ** chngToIN
7d60: 20 68 6f 6c 64 73 20 61 20 73 65 74 20 6f 66 20   holds a set of 
7d70: 74 61 62 6c 65 73 20 74 68 61 74 20 2a 6d 69 67  tables that *mig
7d80: 68 74 2a 20 73 61 74 69 73 66 79 20 63 61 73 65  ht* satisfy case
7d90: 20 31 2e 20 20 42 75 74 0a 20 20 2a 2a 20 77 65   1.  But.  ** we
7da0: 20 68 61 76 65 20 74 6f 20 64 6f 20 73 6f 6d 65   have to do some
7db0: 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 68 65 63   additional chec
7dc0: 6b 69 6e 67 20 74 6f 20 73 65 65 20 69 66 20 63  king to see if c
7dd0: 61 73 65 20 31 20 72 65 61 6c 6c 79 0a 20 20 2a  ase 1 really.  *
7de0: 2a 20 69 73 20 73 61 74 69 73 66 69 65 64 2e 0a  * is satisfied..
7df0: 20 20 2a 2a 0a 20 20 2a 2a 20 63 68 6e 67 54 6f    **.  ** chngTo
7e00: 49 4e 20 77 69 6c 6c 20 68 6f 6c 64 20 65 69 74  IN will hold eit
7e10: 68 65 72 20 30 2c 20 31 2c 20 6f 72 20 32 20 62  her 0, 1, or 2 b
7e20: 69 74 73 2e 20 20 54 68 65 20 30 2d 62 69 74 20  its.  The 0-bit 
7e30: 63 61 73 65 20 6d 65 61 6e 73 0a 20 20 2a 2a 20  case means.  ** 
7e40: 74 68 61 74 20 74 68 65 72 65 20 69 73 20 6e 6f  that there is no
7e50: 20 70 6f 73 73 69 62 69 6c 69 74 79 20 6f 66 20   possibility of 
7e60: 74 72 61 6e 73 66 6f 72 6d 69 6e 67 20 74 68 65  transforming the
7e70: 20 4f 52 20 63 6c 61 75 73 65 20 69 6e 74 6f 20   OR clause into 
7e80: 61 6e 0a 20 20 2a 2a 20 49 4e 20 6f 70 65 72 61  an.  ** IN opera
7e90: 74 6f 72 20 62 65 63 61 75 73 65 20 6f 6e 65 20  tor because one 
7ea0: 6f 72 20 6d 6f 72 65 20 74 65 72 6d 73 20 69 6e  or more terms in
7eb0: 20 74 68 65 20 4f 52 20 63 6c 61 75 73 65 20 63   the OR clause c
7ec0: 6f 6e 74 61 69 6e 0a 20 20 2a 2a 20 73 6f 6d 65  ontain.  ** some
7ed0: 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e  thing other than
7ee0: 20 3d 3d 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20   == on a column 
7ef0: 69 6e 20 74 68 65 20 73 69 6e 67 6c 65 20 74 61  in the single ta
7f00: 62 6c 65 2e 20 20 54 68 65 20 31 2d 62 69 74 0a  ble.  The 1-bit.
7f10: 20 20 2a 2a 20 63 61 73 65 20 6d 65 61 6e 73 20    ** case means 
7f20: 74 68 61 74 20 65 76 65 72 79 20 74 65 72 6d 20  that every term 
7f30: 6f 66 20 74 68 65 20 4f 52 20 63 6c 61 75 73 65  of the OR clause
7f40: 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a   is of the form.
7f50: 20 20 2a 2a 20 22 74 61 62 6c 65 2e 63 6f 6c 75    ** "table.colu
7f60: 6d 6e 3d 65 78 70 72 22 20 66 6f 72 20 73 6f 6d  mn=expr" for som
7f70: 65 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 2e 20  e single table. 
7f80: 20 54 68 65 20 6f 6e 65 20 62 69 74 20 74 68 61   The one bit tha
7f90: 74 20 69 73 20 73 65 74 0a 20 20 2a 2a 20 77 69  t is set.  ** wi
7fa0: 6c 6c 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f  ll correspond to
7fb0: 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 74 61 62 6c   the common tabl
7fc0: 65 2e 20 20 57 65 20 73 74 69 6c 6c 20 6e 65 65  e.  We still nee
7fd0: 64 20 74 6f 20 63 68 65 63 6b 20 74 6f 20 6d 61  d to check to ma
7fe0: 6b 65 0a 20 20 2a 2a 20 73 75 72 65 20 74 68 65  ke.  ** sure the
7ff0: 20 73 61 6d 65 20 63 6f 6c 75 6d 6e 20 69 73 20   same column is 
8000: 75 73 65 64 20 6f 6e 20 61 6c 6c 20 74 65 72 6d  used on all term
8010: 73 2e 20 20 54 68 65 20 32 2d 62 69 74 20 63 61  s.  The 2-bit ca
8020: 73 65 20 69 73 20 77 68 65 6e 0a 20 20 2a 2a 20  se is when.  ** 
8030: 74 68 65 20 61 6c 6c 20 74 65 72 6d 73 20 61 72  the all terms ar
8040: 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 74  e of the form "t
8050: 61 62 6c 65 31 2e 63 6f 6c 75 6d 6e 3d 74 61 62  able1.column=tab
8060: 6c 65 32 2e 63 6f 6c 75 6d 6e 22 2e 20 20 49 74  le2.column".  It
8070: 0a 20 20 2a 2a 20 6d 69 67 68 74 20 62 65 20 70  .  ** might be p
8080: 6f 73 73 69 62 6c 65 20 74 6f 20 66 6f 72 6d 20  ossible to form 
8090: 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 77  an IN operator w
80a0: 69 74 68 20 65 69 74 68 65 72 20 74 61 62 6c 65  ith either table
80b0: 31 2e 63 6f 6c 75 6d 6e 0a 20 20 2a 2a 20 6f 72  1.column.  ** or
80c0: 20 74 61 62 6c 65 32 2e 63 6f 6c 75 6d 6e 20 61   table2.column a
80d0: 73 20 74 68 65 20 4c 48 53 20 69 66 20 65 69 74  s the LHS if eit
80e0: 68 65 72 20 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f  her is common to
80f0: 20 65 76 65 72 79 20 74 65 72 6d 20 6f 66 0a 20   every term of. 
8100: 20 2a 2a 20 74 68 65 20 4f 52 20 63 6c 61 75 73   ** the OR claus
8110: 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74  e..  **.  ** Not
8120: 65 20 74 68 61 74 20 74 65 72 6d 73 20 6f 66 20  e that terms of 
8130: 74 68 65 20 66 6f 72 6d 20 22 74 61 62 6c 65 2e  the form "table.
8140: 63 6f 6c 75 6d 6e 31 3d 74 61 62 6c 65 2e 63 6f  column1=table.co
8150: 6c 75 6d 6e 32 22 20 28 74 68 65 0a 20 20 2a 2a  lumn2" (the.  **
8160: 20 73 61 6d 65 20 74 61 62 6c 65 20 6f 6e 20 62   same table on b
8170: 6f 74 68 20 73 69 7a 65 73 20 6f 66 20 74 68 65  oth sizes of the
8180: 20 3d 3d 29 20 63 61 6e 6e 6f 74 20 62 65 20 6f   ==) cannot be o
8190: 70 74 69 6d 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20  ptimized..  */. 
81a0: 20 69 66 28 20 63 68 6e 67 54 6f 49 4e 20 29 7b   if( chngToIN ){
81b0: 0a 20 20 20 20 69 6e 74 20 6f 6b 54 6f 43 68 6e  .    int okToChn
81c0: 67 54 6f 49 4e 20 3d 20 30 3b 20 20 20 20 20 2f  gToIN = 0;     /
81d0: 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 63 6f  * True if the co
81e0: 6e 76 65 72 73 69 6f 6e 20 74 6f 20 49 4e 20 69  nversion to IN i
81f0: 73 20 76 61 6c 69 64 20 2a 2f 0a 20 20 20 20 69  s valid */.    i
8200: 6e 74 20 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b  nt iColumn = -1;
8210: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75           /* Colu
8220: 6d 6e 20 69 6e 64 65 78 20 6f 6e 20 6c 68 73 20  mn index on lhs 
8230: 6f 66 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a  of IN operator *
8240: 2f 0a 20 20 20 20 69 6e 74 20 69 43 75 72 73 6f  /.    int iCurso
8250: 72 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20  r = -1;         
8260: 2f 2a 20 54 61 62 6c 65 20 63 75 72 73 6f 72 20  /* Table cursor 
8270: 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 74 65  common to all te
8280: 72 6d 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6a  rms */.    int j
8290: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
82a0: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
82b0: 6e 74 65 72 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  nter */..    /* 
82c0: 53 65 61 72 63 68 20 66 6f 72 20 61 20 74 61 62  Search for a tab
82d0: 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 74 68  le and column th
82e0: 61 74 20 61 70 70 65 61 72 73 20 6f 6e 20 6f 6e  at appears on on
82f0: 65 20 73 69 64 65 20 6f 72 20 74 68 65 0a 20 20  e side or the.  
8300: 20 20 2a 2a 20 6f 74 68 65 72 20 6f 66 20 74 68    ** other of th
8310: 65 20 3d 3d 20 6f 70 65 72 61 74 6f 72 20 69 6e  e == operator in
8320: 20 65 76 65 72 79 20 73 75 62 74 65 72 6d 2e 20   every subterm. 
8330: 20 54 68 61 74 20 74 61 62 6c 65 20 61 6e 64 20   That table and 
8340: 63 6f 6c 75 6d 6e 0a 20 20 20 20 2a 2a 20 77 69  column.    ** wi
8350: 6c 6c 20 62 65 20 72 65 63 6f 72 64 65 64 20 69  ll be recorded i
8360: 6e 20 69 43 75 72 73 6f 72 20 61 6e 64 20 69 43  n iCursor and iC
8370: 6f 6c 75 6d 6e 2e 20 20 54 68 65 72 65 20 6d 69  olumn.  There mi
8380: 67 68 74 20 6e 6f 74 20 62 65 20 61 6e 79 0a 20  ght not be any. 
8390: 20 20 20 2a 2a 20 73 75 63 68 20 74 61 62 6c 65     ** such table
83a0: 20 61 6e 64 20 63 6f 6c 75 6d 6e 2e 20 20 53 65   and column.  Se
83b0: 74 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 69  t okToChngToIN i
83c0: 66 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65  f an appropriate
83d0: 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20 61 6e   table.    ** an
83e0: 64 20 63 6f 6c 75 6d 6e 20 69 73 20 66 6f 75 6e  d column is foun
83f0: 64 20 62 75 74 20 6c 65 61 76 65 20 6f 6b 54 6f  d but leave okTo
8400: 43 68 6e 67 54 6f 49 4e 20 66 61 6c 73 65 20 69  ChngToIN false i
8410: 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20 20 20  f not found..   
8420: 20 2a 2f 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b   */.    for(j=0;
8430: 20 6a 3c 32 20 26 26 20 21 6f 6b 54 6f 43 68 6e   j<2 && !okToChn
8440: 67 54 6f 49 4e 3b 20 6a 2b 2b 29 7b 0a 20 20 20  gToIN; j++){.   
8450: 20 20 20 70 4f 72 54 65 72 6d 20 3d 20 70 4f 72     pOrTerm = pOr
8460: 57 63 2d 3e 61 3b 0a 20 20 20 20 20 20 66 6f 72  Wc->a;.      for
8470: 28 69 3d 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d  (i=pOrWc->nTerm-
8480: 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 4f  1; i>=0; i--, pO
8490: 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  rTerm++){.      
84a0: 20 20 61 73 73 65 72 74 28 20 70 4f 72 54 65 72    assert( pOrTer
84b0: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
84c0: 4f 5f 45 51 20 29 3b 0a 20 20 20 20 20 20 20 20  O_EQ );.        
84d0: 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  pOrTerm->wtFlags
84e0: 20 26 3d 20 7e 54 45 52 4d 5f 4f 52 5f 4f 4b 3b   &= ~TERM_OR_OK;
84f0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 72  .        if( pOr
8500: 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
8510: 3d 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20 20 20  ==iCursor ){.   
8520: 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 69         /* This i
8530: 73 20 74 68 65 20 32 2d 62 69 74 20 63 61 73 65  s the 2-bit case
8540: 20 61 6e 64 20 77 65 20 61 72 65 20 6f 6e 20 74   and we are on t
8550: 68 65 20 73 65 63 6f 6e 64 20 69 74 65 72 61 74  he second iterat
8560: 69 6f 6e 20 61 6e 64 0a 20 20 20 20 20 20 20 20  ion and.        
8570: 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 74 65 72    ** current ter
8580: 6d 20 69 73 20 66 72 6f 6d 20 74 68 65 20 66 69  m is from the fi
8590: 72 73 74 20 69 74 65 72 61 74 69 6f 6e 2e 20 20  rst iteration.  
85a0: 53 6f 20 73 6b 69 70 20 74 68 69 73 20 74 65 72  So skip this ter
85b0: 6d 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  m. */.          
85c0: 61 73 73 65 72 74 28 20 6a 3d 3d 31 20 29 3b 0a  assert( j==1 );.
85d0: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
85e0: 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ue;.        }.  
85f0: 20 20 20 20 20 20 69 66 28 20 28 63 68 6e 67 54        if( (chngT
8600: 6f 49 4e 20 26 20 67 65 74 4d 61 73 6b 28 26 70  oIN & getMask(&p
8610: 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c  WInfo->sMaskSet,
8620: 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75   pOrTerm->leftCu
8630: 72 73 6f 72 29 29 3d 3d 30 20 29 7b 0a 20 20 20  rsor))==0 ){.   
8640: 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 74         /* This t
8650: 65 72 6d 20 6d 75 73 74 20 62 65 20 6f 66 20 74  erm must be of t
8660: 68 65 20 66 6f 72 6d 20 74 31 2e 61 3d 3d 74 32  he form t1.a==t2
8670: 2e 62 20 77 68 65 72 65 20 74 32 20 69 73 20 69  .b where t2 is i
8680: 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20  n the.          
8690: 2a 2a 20 63 68 6e 67 54 6f 49 4e 20 73 65 74 20  ** chngToIN set 
86a0: 62 75 74 20 74 31 20 69 73 20 6e 6f 74 2e 20 20  but t1 is not.  
86b0: 54 68 69 73 20 74 65 72 6d 20 77 69 6c 6c 20 62  This term will b
86c0: 65 20 65 69 74 68 65 72 20 70 72 65 63 65 64 65  e either precede
86d0: 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f  d.          ** o
86e0: 72 20 66 6f 6c 6c 77 65 64 20 62 79 20 61 6e 20  r follwed by an 
86f0: 69 6e 76 65 72 74 65 64 20 63 6f 70 79 20 28 74  inverted copy (t
8700: 32 2e 62 3d 3d 74 31 2e 61 29 2e 20 20 53 6b 69  2.b==t1.a).  Ski
8710: 70 20 74 68 69 73 20 74 65 72 6d 20 0a 20 20 20  p this term .   
8720: 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 75 73         ** and us
8730: 65 20 69 74 73 20 69 6e 76 65 72 73 69 6f 6e 2e  e its inversion.
8740: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65   */.          te
8750: 73 74 63 61 73 65 28 20 70 4f 72 54 65 72 6d 2d  stcase( pOrTerm-
8760: 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
8770: 43 4f 50 49 45 44 20 29 3b 0a 20 20 20 20 20 20  COPIED );.      
8780: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4f      testcase( pO
8790: 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  rTerm->wtFlags &
87a0: 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b   TERM_VIRTUAL );
87b0: 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
87c0: 74 28 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c  t( pOrTerm->wtFl
87d0: 61 67 73 20 26 20 28 54 45 52 4d 5f 43 4f 50 49  ags & (TERM_COPI
87e0: 45 44 7c 54 45 52 4d 5f 56 49 52 54 55 41 4c 29  ED|TERM_VIRTUAL)
87f0: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f   );.          co
8800: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
8810: 7d 0a 20 20 20 20 20 20 20 20 69 43 6f 6c 75 6d  }.        iColum
8820: 6e 20 3d 20 70 4f 72 54 65 72 6d 2d 3e 75 2e 6c  n = pOrTerm->u.l
8830: 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  eftColumn;.     
8840: 20 20 20 69 43 75 72 73 6f 72 20 3d 20 70 4f 72     iCursor = pOr
8850: 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
8860: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
8870: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
8880: 66 28 20 69 3c 30 20 29 7b 0a 20 20 20 20 20 20  f( i<0 ){.      
8890: 20 20 2f 2a 20 4e 6f 20 63 61 6e 64 69 64 61 74    /* No candidat
88a0: 65 20 74 61 62 6c 65 2b 63 6f 6c 75 6d 6e 20 77  e table+column w
88b0: 61 73 20 66 6f 75 6e 64 2e 20 20 54 68 69 73 20  as found.  This 
88c0: 63 61 6e 20 6f 6e 6c 79 20 6f 63 63 75 72 0a 20  can only occur. 
88d0: 20 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65         ** on the
88e0: 20 73 65 63 6f 6e 64 20 69 74 65 72 61 74 69 6f   second iteratio
88f0: 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73  n */.        ass
8900: 65 72 74 28 20 6a 3d 3d 31 20 29 3b 0a 20 20 20  ert( j==1 );.   
8910: 20 20 20 20 20 61 73 73 65 72 74 28 20 49 73 50       assert( IsP
8920: 6f 77 65 72 4f 66 54 77 6f 28 63 68 6e 67 54 6f  owerOfTwo(chngTo
8930: 49 4e 29 20 29 3b 0a 20 20 20 20 20 20 20 20 61  IN) );.        a
8940: 73 73 65 72 74 28 20 63 68 6e 67 54 6f 49 4e 3d  ssert( chngToIN=
8950: 3d 67 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f  =getMask(&pWInfo
8960: 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 69 43 75 72  ->sMaskSet, iCur
8970: 73 6f 72 29 20 29 3b 0a 20 20 20 20 20 20 20 20  sor) );.        
8980: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
8990: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
89a0: 3d 3d 31 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  ==1 );..      /*
89b0: 20 57 65 20 68 61 76 65 20 66 6f 75 6e 64 20 61   We have found a
89c0: 20 63 61 6e 64 69 64 61 74 65 20 74 61 62 6c 65   candidate table
89d0: 20 61 6e 64 20 63 6f 6c 75 6d 6e 2e 20 20 43 68   and column.  Ch
89e0: 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68  eck to see if th
89f0: 61 74 0a 20 20 20 20 20 20 2a 2a 20 74 61 62 6c  at.      ** tabl
8a00: 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 69 73 20  e and column is 
8a10: 63 6f 6d 6d 6f 6e 20 74 6f 20 65 76 65 72 79 20  common to every 
8a20: 74 65 72 6d 20 69 6e 20 74 68 65 20 4f 52 20 63  term in the OR c
8a30: 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 6f  lause */.      o
8a40: 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 3d 20 31 3b  kToChngToIN = 1;
8a50: 0a 20 20 20 20 20 20 66 6f 72 28 3b 20 69 3e 3d  .      for(; i>=
8a60: 30 20 26 26 20 6f 6b 54 6f 43 68 6e 67 54 6f 49  0 && okToChngToI
8a70: 4e 3b 20 69 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b  N; i--, pOrTerm+
8a80: 2b 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  +){.        asse
8a90: 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70  rt( pOrTerm->eOp
8aa0: 65 72 61 74 6f 72 20 26 20 57 4f 5f 45 51 20 29  erator & WO_EQ )
8ab0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f  ;.        if( pO
8ac0: 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  rTerm->leftCurso
8ad0: 72 21 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20 20  r!=iCursor ){.  
8ae0: 20 20 20 20 20 20 20 20 70 4f 72 54 65 72 6d 2d          pOrTerm-
8af0: 3e 77 74 46 6c 61 67 73 20 26 3d 20 7e 54 45 52  >wtFlags &= ~TER
8b00: 4d 5f 4f 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  M_OR_OK;.       
8b10: 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 72 54 65   }else if( pOrTe
8b20: 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e  rm->u.leftColumn
8b30: 21 3d 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20  !=iColumn ){.   
8b40: 20 20 20 20 20 20 20 6f 6b 54 6f 43 68 6e 67 54         okToChngT
8b50: 6f 49 4e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  oIN = 0;.       
8b60: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
8b70: 20 20 69 6e 74 20 61 66 66 4c 65 66 74 2c 20 61    int affLeft, a
8b80: 66 66 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20  ffRight;.       
8b90: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 72 69 67     /* If the rig
8ba0: 68 74 2d 68 61 6e 64 20 73 69 64 65 20 69 73 20  ht-hand side is 
8bb0: 61 6c 73 6f 20 61 20 63 6f 6c 75 6d 6e 2c 20 74  also a column, t
8bc0: 68 65 6e 20 74 68 65 20 61 66 66 69 6e 69 74 69  hen the affiniti
8bd0: 65 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  es.          ** 
8be0: 6f 66 20 62 6f 74 68 20 72 69 67 68 74 20 61 6e  of both right an
8bf0: 64 20 6c 65 66 74 20 73 69 64 65 73 20 6d 75 73  d left sides mus
8c00: 74 20 62 65 20 73 75 63 68 20 74 68 61 74 20 6e  t be such that n
8c10: 6f 20 74 79 70 65 0a 20 20 20 20 20 20 20 20 20  o type.         
8c20: 20 2a 2a 20 63 6f 6e 76 65 72 73 69 6f 6e 73 20   ** conversions 
8c30: 61 72 65 20 72 65 71 75 69 72 65 64 20 6f 6e 20  are required on 
8c40: 74 68 65 20 72 69 67 68 74 2e 20 20 28 54 69 63  the right.  (Tic
8c50: 6b 65 74 20 23 32 32 34 39 29 0a 20 20 20 20 20  ket #2249).     
8c60: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
8c70: 20 20 61 66 66 52 69 67 68 74 20 3d 20 73 71 6c    affRight = sql
8c80: 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79  ite3ExprAffinity
8c90: 28 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72 2d  (pOrTerm->pExpr-
8ca0: 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20  >pRight);.      
8cb0: 20 20 20 20 61 66 66 4c 65 66 74 20 3d 20 73 71      affLeft = sq
8cc0: 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74  lite3ExprAffinit
8cd0: 79 28 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72  y(pOrTerm->pExpr
8ce0: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20  ->pLeft);.      
8cf0: 20 20 20 20 69 66 28 20 61 66 66 52 69 67 68 74      if( affRight
8d00: 21 3d 30 20 26 26 20 61 66 66 52 69 67 68 74 21  !=0 && affRight!
8d10: 3d 61 66 66 4c 65 66 74 20 29 7b 0a 20 20 20 20  =affLeft ){.    
8d20: 20 20 20 20 20 20 20 20 6f 6b 54 6f 43 68 6e 67          okToChng
8d30: 54 6f 49 4e 20 3d 20 30 3b 0a 20 20 20 20 20 20  ToIN = 0;.      
8d40: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
8d50: 20 20 20 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e         pOrTerm->
8d60: 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f  wtFlags |= TERM_
8d70: 4f 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20  OR_OK;.         
8d80: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
8d90: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
8da0: 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  /* At this point
8db0: 2c 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 69  , okToChngToIN i
8dc0: 73 20 74 72 75 65 20 69 66 20 6f 72 69 67 69 6e  s true if origin
8dd0: 61 6c 20 70 54 65 72 6d 20 73 61 74 69 73 66 69  al pTerm satisfi
8de0: 65 73 0a 20 20 20 20 2a 2a 20 63 61 73 65 20 31  es.    ** case 1
8df0: 2e 20 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c  .  In that case,
8e00: 20 63 6f 6e 73 74 72 75 63 74 20 61 20 6e 65 77   construct a new
8e10: 20 76 69 72 74 75 61 6c 20 74 65 72 6d 20 74 68   virtual term th
8e20: 61 74 20 69 73 20 0a 20 20 20 20 2a 2a 20 70 54  at is .    ** pT
8e30: 65 72 6d 20 63 6f 6e 76 65 72 74 65 64 20 69 6e  erm converted in
8e40: 74 6f 20 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f  to an IN operato
8e50: 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  r..    */.    if
8e60: 28 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 29  ( okToChngToIN )
8e70: 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 44  {.      Expr *pD
8e80: 75 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  up;            /
8e90: 2a 20 41 20 74 72 61 6e 73 69 65 6e 74 20 64 75  * A transient du
8ea0: 70 6c 69 63 61 74 65 20 65 78 70 72 65 73 73 69  plicate expressi
8eb0: 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72  on */.      Expr
8ec0: 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 30 3b  List *pList = 0;
8ed0: 20 20 20 2f 2a 20 54 68 65 20 52 48 53 20 6f 66     /* The RHS of
8ee0: 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
8ef0: 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a   */.      Expr *
8f00: 70 4c 65 66 74 20 3d 20 30 3b 20 20 20 20 20 20  pLeft = 0;      
8f10: 20 2f 2a 20 54 68 65 20 4c 48 53 20 6f 66 20 74   /* The LHS of t
8f20: 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a  he IN operator *
8f30: 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e  /.      Expr *pN
8f40: 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ew;            /
8f50: 2a 20 54 68 65 20 63 6f 6d 70 6c 65 74 65 20 49  * The complete I
8f60: 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 0a 20  N operator */.. 
8f70: 20 20 20 20 20 66 6f 72 28 69 3d 70 4f 72 57 63       for(i=pOrWc
8f80: 2d 3e 6e 54 65 72 6d 2d 31 2c 20 70 4f 72 54 65  ->nTerm-1, pOrTe
8f90: 72 6d 3d 70 4f 72 57 63 2d 3e 61 3b 20 69 3e 3d  rm=pOrWc->a; i>=
8fa0: 30 3b 20 69 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b  0; i--, pOrTerm+
8fb0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
8fc0: 28 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67  (pOrTerm->wtFlag
8fd0: 73 20 26 20 54 45 52 4d 5f 4f 52 5f 4f 4b 29 3d  s & TERM_OR_OK)=
8fe0: 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
8ff0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
9000: 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  OrTerm->eOperato
9010: 72 20 26 20 57 4f 5f 45 51 20 29 3b 0a 20 20 20  r & WO_EQ );.   
9020: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 72       assert( pOr
9030: 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
9040: 3d 3d 69 43 75 72 73 6f 72 20 29 3b 0a 20 20 20  ==iCursor );.   
9050: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 72       assert( pOr
9060: 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75  Term->u.leftColu
9070: 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e 20 29 3b 0a 20  mn==iColumn );. 
9080: 20 20 20 20 20 20 20 70 44 75 70 20 3d 20 73 71         pDup = sq
9090: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
90a0: 20 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72 2d   pOrTerm->pExpr-
90b0: 3e 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 20  >pRight, 0);.   
90c0: 20 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c       pList = sql
90d0: 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
90e0: 6e 64 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73  nd(pWInfo->pPars
90f0: 65 2c 20 70 4c 69 73 74 2c 20 70 44 75 70 29 3b  e, pList, pDup);
9100: 0a 20 20 20 20 20 20 20 20 70 4c 65 66 74 20 3d  .        pLeft =
9110: 20 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72 2d   pOrTerm->pExpr-
9120: 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 7d 0a  >pLeft;.      }.
9130: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c        assert( pL
9140: 65 66 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  eft!=0 );.      
9150: 70 44 75 70 20 3d 20 73 71 6c 69 74 65 33 45 78  pDup = sqlite3Ex
9160: 70 72 44 75 70 28 64 62 2c 20 70 4c 65 66 74 2c  prDup(db, pLeft,
9170: 20 30 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 20   0);.      pNew 
9180: 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
9190: 50 61 72 73 65 2c 20 54 4b 5f 49 4e 2c 20 70 44  Parse, TK_IN, pD
91a0: 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  up, 0, 0);.     
91b0: 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20   if( pNew ){.   
91c0: 20 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77 3b       int idxNew;
91d0: 0a 20 20 20 20 20 20 20 20 74 72 61 6e 73 66 65  .        transfe
91e0: 72 4a 6f 69 6e 4d 61 72 6b 69 6e 67 73 28 70 4e  rJoinMarkings(pN
91f0: 65 77 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20  ew, pExpr);.    
9200: 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
9210: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 4e 65  rHasProperty(pNe
9220: 77 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  w, EP_xIsSelect)
9230: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77   );.        pNew
9240: 2d 3e 78 2e 70 4c 69 73 74 20 3d 20 70 4c 69 73  ->x.pList = pLis
9250: 74 3b 0a 20 20 20 20 20 20 20 20 69 64 78 4e 65  t;.        idxNe
9260: 77 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49  w = whereClauseI
9270: 6e 73 65 72 74 28 70 57 43 2c 20 70 4e 65 77 2c  nsert(pWC, pNew,
9280: 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45   TERM_VIRTUAL|TE
9290: 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20  RM_DYNAMIC);.   
92a0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
92b0: 64 78 4e 65 77 3d 3d 30 20 29 3b 0a 20 20 20 20  dxNew==0 );.    
92c0: 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 28      exprAnalyze(
92d0: 70 53 72 63 2c 20 70 57 43 2c 20 69 64 78 4e 65  pSrc, pWC, idxNe
92e0: 77 29 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72  w);.        pTer
92f0: 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54  m = &pWC->a[idxT
9300: 65 72 6d 5d 3b 0a 20 20 20 20 20 20 20 20 6d 61  erm];.        ma
9310: 72 6b 54 65 72 6d 41 73 43 68 69 6c 64 28 70 57  rkTermAsChild(pW
9320: 43 2c 20 69 64 78 4e 65 77 2c 20 69 64 78 54 65  C, idxNew, idxTe
9330: 72 6d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  rm);.      }else
9340: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
9350: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
9360: 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 20 20  db, pList);.    
9370: 20 20 7d 0a 20 20 20 20 20 20 70 54 65 72 6d 2d    }.      pTerm-
9380: 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 57 4f 5f  >eOperator = WO_
9390: 4e 4f 4f 50 3b 20 20 2f 2a 20 63 61 73 65 20 31  NOOP;  /* case 1
93a0: 20 74 72 75 6d 70 73 20 63 61 73 65 20 32 20 2a   trumps case 2 *
93b0: 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65  /.    }.  }.}.#e
93c0: 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f  ndif /* !SQLITE_
93d0: 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41  OMIT_OR_OPTIMIZA
93e0: 54 49 4f 4e 20 26 26 20 21 53 51 4c 49 54 45 5f  TION && !SQLITE_
93f0: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f  OMIT_SUBQUERY */
9400: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 6e 70 75  ../*.** The inpu
9410: 74 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  t to this routin
9420: 65 20 69 73 20 61 6e 20 57 68 65 72 65 54 65 72  e is an WhereTer
9430: 6d 20 73 74 72 75 63 74 75 72 65 20 77 69 74 68  m structure with
9440: 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 22 70 45   only the.** "pE
9450: 78 70 72 22 20 66 69 65 6c 64 20 66 69 6c 6c 65  xpr" field fille
9460: 64 20 69 6e 2e 20 20 54 68 65 20 6a 6f 62 20 6f  d in.  The job o
9470: 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  f this routine i
9480: 73 20 74 6f 20 61 6e 61 6c 79 7a 65 20 74 68 65  s to analyze the
9490: 0a 2a 2a 20 73 75 62 65 78 70 72 65 73 73 69 6f  .** subexpressio
94a0: 6e 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 20 61  n and populate a
94b0: 6c 6c 20 74 68 65 20 6f 74 68 65 72 20 66 69 65  ll the other fie
94c0: 6c 64 73 20 6f 66 20 74 68 65 20 57 68 65 72 65  lds of the Where
94d0: 54 65 72 6d 0a 2a 2a 20 73 74 72 75 63 74 75 72  Term.** structur
94e0: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
94f0: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6f 66  expression is of
9500: 20 74 68 65 20 66 6f 72 6d 20 22 3c 65 78 70 72   the form "<expr
9510: 3e 20 3c 6f 70 3e 20 58 22 20 69 74 20 67 65 74  > <op> X" it get
9520: 73 20 63 6f 6d 6d 75 74 65 64 0a 2a 2a 20 74 6f  s commuted.** to
9530: 20 74 68 65 20 73 74 61 6e 64 61 72 64 20 66 6f   the standard fo
9540: 72 6d 20 6f 66 20 22 58 20 3c 6f 70 3e 20 3c 65  rm of "X <op> <e
9550: 78 70 72 3e 22 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  xpr>"..**.** If 
9560: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
9570: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 58  s of the form "X
9580: 20 3c 6f 70 3e 20 59 22 20 77 68 65 72 65 20 62   <op> Y" where b
9590: 6f 74 68 20 58 20 61 6e 64 20 59 20 61 72 65 0a  oth X and Y are.
95a0: 2a 2a 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e  ** columns, then
95b0: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 65 78   the original ex
95c0: 70 72 65 73 73 69 6f 6e 20 69 73 20 75 6e 63 68  pression is unch
95d0: 61 6e 67 65 64 20 61 6e 64 20 61 20 6e 65 77 20  anged and a new 
95e0: 76 69 72 74 75 61 6c 0a 2a 2a 20 74 65 72 6d 20  virtual.** term 
95f0: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 59 20 3c  of the form "Y <
9600: 6f 70 3e 20 58 22 20 69 73 20 61 64 64 65 64 20  op> X" is added 
9610: 74 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  to the WHERE cla
9620: 75 73 65 20 61 6e 64 0a 2a 2a 20 61 6e 61 6c 79  use and.** analy
9630: 7a 65 64 20 73 65 70 61 72 61 74 65 6c 79 2e 20  zed separately. 
9640: 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 74 65   The original te
9650: 72 6d 20 69 73 20 6d 61 72 6b 65 64 20 77 69 74  rm is marked wit
9660: 68 20 54 45 52 4d 5f 43 4f 50 49 45 44 0a 2a 2a  h TERM_COPIED.**
9670: 20 61 6e 64 20 74 68 65 20 6e 65 77 20 74 65 72   and the new ter
9680: 6d 20 69 73 20 6d 61 72 6b 65 64 20 77 69 74 68  m is marked with
9690: 20 54 45 52 4d 5f 44 59 4e 41 4d 49 43 20 28 62   TERM_DYNAMIC (b
96a0: 65 63 61 75 73 65 20 69 74 27 73 20 70 45 78 70  ecause it's pExp
96b0: 72 0a 2a 2a 20 6e 65 65 64 73 20 74 6f 20 62 65  r.** needs to be
96c0: 20 66 72 65 65 64 20 77 69 74 68 20 74 68 65 20   freed with the 
96d0: 57 68 65 72 65 43 6c 61 75 73 65 29 20 61 6e 64  WhereClause) and
96e0: 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 28 62   TERM_VIRTUAL (b
96f0: 65 63 61 75 73 65 20 69 74 0a 2a 2a 20 69 73 20  ecause it.** is 
9700: 61 20 63 6f 6d 6d 75 74 65 64 20 63 6f 70 79 20  a commuted copy 
9710: 6f 66 20 61 20 70 72 69 6f 72 20 74 65 72 6d 2e  of a prior term.
9720: 29 20 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20  )  The original 
9730: 74 65 72 6d 20 68 61 73 20 6e 43 68 69 6c 64 3d  term has nChild=
9740: 31 0a 2a 2a 20 61 6e 64 20 74 68 65 20 63 6f 70  1.** and the cop
9750: 79 20 68 61 73 20 69 64 78 50 61 72 65 6e 74 20  y has idxParent 
9760: 73 65 74 20 74 6f 20 74 68 65 20 69 6e 64 65 78  set to the index
9770: 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   of the original
9780: 20 74 65 72 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63   term..*/.static
9790: 20 76 6f 69 64 20 65 78 70 72 41 6e 61 6c 79 7a   void exprAnalyz
97a0: 65 28 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  e(.  SrcList *pS
97b0: 72 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  rc,            /
97c0: 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * the FROM claus
97d0: 65 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75  e */.  WhereClau
97e0: 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20  se *pWC,        
97f0: 20 2f 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c   /* the WHERE cl
9800: 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 64  ause */.  int id
9810: 78 54 65 72 6d 20 20 20 20 20 20 20 20 20 20 20  xTerm           
9820: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
9830: 74 68 65 20 74 65 72 6d 20 74 6f 20 62 65 20 61  the term to be a
9840: 6e 61 6c 79 7a 65 64 20 2a 2f 0a 29 7b 0a 20 20  nalyzed */.){.  
9850: 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
9860: 6f 20 3d 20 70 57 43 2d 3e 70 57 49 6e 66 6f 3b  o = pWC->pWInfo;
9870: 20 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65   /* WHERE clause
9880: 20 70 72 6f 63 65 73 73 69 6e 67 20 63 6f 6e 74   processing cont
9890: 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  ext */.  WhereTe
98a0: 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20  rm *pTerm;      
98b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
98c0: 20 74 65 72 6d 20 74 6f 20 62 65 20 61 6e 61 6c   term to be anal
98d0: 79 7a 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 4d  yzed */.  WhereM
98e0: 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74  askSet *pMaskSet
98f0: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65  ;          /* Se
9900: 74 20 6f 66 20 74 61 62 6c 65 20 69 6e 64 65 78  t of table index
9910: 20 6d 61 73 6b 73 20 2a 2f 0a 20 20 45 78 70 72   masks */.  Expr
9920: 20 2a 70 45 78 70 72 3b 20 20 20 20 20 20 20 20   *pExpr;        
9930: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9940: 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74  The expression t
9950: 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f  o be analyzed */
9960: 0a 20 20 42 69 74 6d 61 73 6b 20 70 72 65 72 65  .  Bitmask prere
9970: 71 4c 65 66 74 3b 20 20 20 20 20 20 20 20 20 20  qLeft;          
9980: 20 20 20 20 2f 2a 20 50 72 65 72 65 71 75 65 73      /* Prereques
9990: 69 74 65 73 20 6f 66 20 74 68 65 20 70 45 78 70  ites of the pExp
99a0: 72 2d 3e 70 4c 65 66 74 20 2a 2f 0a 20 20 42 69  r->pLeft */.  Bi
99b0: 74 6d 61 73 6b 20 70 72 65 72 65 71 41 6c 6c 3b  tmask prereqAll;
99c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
99d0: 2a 20 50 72 65 72 65 71 75 65 73 69 74 65 73 20  * Prerequesites 
99e0: 6f 66 20 70 45 78 70 72 20 2a 2f 0a 20 20 42 69  of pExpr */.  Bi
99f0: 74 6d 61 73 6b 20 65 78 74 72 61 52 69 67 68 74  tmask extraRight
9a00: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f   = 0;          /
9a10: 2a 20 45 78 74 72 61 20 64 65 70 65 6e 64 65 6e  * Extra dependen
9a20: 63 69 65 73 20 6f 6e 20 4c 45 46 54 20 4a 4f 49  cies on LEFT JOI
9a30: 4e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 53 74  N */.  Expr *pSt
9a40: 72 31 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  r1 = 0;         
9a50: 20 20 20 20 20 20 20 20 2f 2a 20 52 48 53 20 6f          /* RHS o
9a60: 66 20 4c 49 4b 45 2f 47 4c 4f 42 20 6f 70 65 72  f LIKE/GLOB oper
9a70: 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 73  ator */.  int is
9a80: 43 6f 6d 70 6c 65 74 65 20 3d 20 30 3b 20 20 20  Complete = 0;   
9a90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 48             /* RH
9aa0: 53 20 6f 66 20 4c 49 4b 45 2f 47 4c 4f 42 20 65  S of LIKE/GLOB e
9ab0: 6e 64 73 20 77 69 74 68 20 77 69 6c 64 63 61 72  nds with wildcar
9ac0: 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43 61 73  d */.  int noCas
9ad0: 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  e = 0;          
9ae0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 49 4b 45 2f          /* LIKE/
9af0: 47 4c 4f 42 20 64 69 73 74 69 6e 67 75 69 73 68  GLOB distinguish
9b00: 65 73 20 63 61 73 65 20 2a 2f 0a 20 20 69 6e 74  es case */.  int
9b10: 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   op;            
9b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9b30: 20 54 6f 70 2d 6c 65 76 65 6c 20 6f 70 65 72 61   Top-level opera
9b40: 74 6f 72 2e 20 20 70 45 78 70 72 2d 3e 6f 70 20  tor.  pExpr->op 
9b50: 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  */.  Parse *pPar
9b60: 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61  se = pWInfo->pPa
9b70: 72 73 65 3b 20 20 2f 2a 20 50 61 72 73 69 6e 67  rse;  /* Parsing
9b80: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73 71   context */.  sq
9b90: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
9ba0: 73 65 2d 3e 64 62 3b 20 20 20 20 20 20 20 20 2f  se->db;        /
9bb0: 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
9bc0: 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 69 66 28 20  ction */..  if( 
9bd0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
9be0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
9bf0: 20 20 7d 0a 20 20 70 54 65 72 6d 20 3d 20 26 70    }.  pTerm = &p
9c00: 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a  WC->a[idxTerm];.
9c10: 20 20 70 4d 61 73 6b 53 65 74 20 3d 20 26 70 57    pMaskSet = &pW
9c20: 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 3b 0a  Info->sMaskSet;.
9c30: 20 20 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d    pExpr = pTerm-
9c40: 3e 70 45 78 70 72 3b 0a 20 20 61 73 73 65 72 74  >pExpr;.  assert
9c50: 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
9c60: 41 53 20 26 26 20 70 45 78 70 72 2d 3e 6f 70 21  AS && pExpr->op!
9c70: 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 29 3b 0a 20  =TK_COLLATE );. 
9c80: 20 70 72 65 72 65 71 4c 65 66 74 20 3d 20 65 78   prereqLeft = ex
9c90: 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  prTableUsage(pMa
9ca0: 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 70 4c  skSet, pExpr->pL
9cb0: 65 66 74 29 3b 0a 20 20 6f 70 20 3d 20 70 45 78  eft);.  op = pEx
9cc0: 70 72 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70  pr->op;.  if( op
9cd0: 3d 3d 54 4b 5f 49 4e 20 29 7b 0a 20 20 20 20 61  ==TK_IN ){.    a
9ce0: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 52  ssert( pExpr->pR
9cf0: 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 69  ight==0 );.    i
9d00: 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
9d10: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73  ty(pExpr, EP_xIs
9d20: 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20  Select) ){.     
9d30: 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69   pTerm->prereqRi
9d40: 67 68 74 20 3d 20 65 78 70 72 53 65 6c 65 63 74  ght = exprSelect
9d50: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
9d60: 53 65 74 2c 20 70 45 78 70 72 2d 3e 78 2e 70 53  Set, pExpr->x.pS
9d70: 65 6c 65 63 74 29 3b 0a 20 20 20 20 7d 65 6c 73  elect);.    }els
9d80: 65 7b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e  e{.      pTerm->
9d90: 70 72 65 72 65 71 52 69 67 68 74 20 3d 20 65 78  prereqRight = ex
9da0: 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65  prListTableUsage
9db0: 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72  (pMaskSet, pExpr
9dc0: 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20  ->x.pList);.    
9dd0: 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70  }.  }else if( op
9de0: 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20  ==TK_ISNULL ){. 
9df0: 20 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71     pTerm->prereq
9e00: 52 69 67 68 74 20 3d 20 30 3b 0a 20 20 7d 65 6c  Right = 0;.  }el
9e10: 73 65 7b 0a 20 20 20 20 70 54 65 72 6d 2d 3e 70  se{.    pTerm->p
9e20: 72 65 72 65 71 52 69 67 68 74 20 3d 20 65 78 70  rereqRight = exp
9e30: 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  rTableUsage(pMas
9e40: 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 70 52 69  kSet, pExpr->pRi
9e50: 67 68 74 29 3b 0a 20 20 7d 0a 20 20 70 72 65 72  ght);.  }.  prer
9e60: 65 71 41 6c 6c 20 3d 20 65 78 70 72 54 61 62 6c  eqAll = exprTabl
9e70: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
9e80: 20 70 45 78 70 72 29 3b 0a 20 20 69 66 28 20 45   pExpr);.  if( E
9e90: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
9ea0: 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69  Expr, EP_FromJoi
9eb0: 6e 29 20 29 7b 0a 20 20 20 20 42 69 74 6d 61 73  n) ){.    Bitmas
9ec0: 6b 20 78 20 3d 20 67 65 74 4d 61 73 6b 28 70 4d  k x = getMask(pM
9ed0: 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 69  askSet, pExpr->i
9ee0: 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 29 3b  RightJoinTable);
9ef0: 0a 20 20 20 20 70 72 65 72 65 71 41 6c 6c 20 7c  .    prereqAll |
9f00: 3d 20 78 3b 0a 20 20 20 20 65 78 74 72 61 52 69  = x;.    extraRi
9f10: 67 68 74 20 3d 20 78 2d 31 3b 20 20 2f 2a 20 4f  ght = x-1;  /* O
9f20: 4e 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 6d  N clause terms m
9f30: 61 79 20 6e 6f 74 20 62 65 20 75 73 65 64 20 77  ay not be used w
9f40: 69 74 68 20 61 6e 20 69 6e 64 65 78 0a 20 20 20  ith an index.   
9f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9f60: 20 20 20 20 2a 2a 20 6f 6e 20 6c 65 66 74 20 74      ** on left t
9f70: 61 62 6c 65 20 6f 66 20 61 20 4c 45 46 54 20 4a  able of a LEFT J
9f80: 4f 49 4e 2e 20 20 54 69 63 6b 65 74 20 23 33 30  OIN.  Ticket #30
9f90: 31 35 20 2a 2f 0a 20 20 7d 0a 20 20 70 54 65 72  15 */.  }.  pTer
9fa0: 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20 70  m->prereqAll = p
9fb0: 72 65 72 65 71 41 6c 6c 3b 0a 20 20 70 54 65 72  rereqAll;.  pTer
9fc0: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20  m->leftCursor = 
9fd0: 2d 31 3b 0a 20 20 70 54 65 72 6d 2d 3e 69 50 61  -1;.  pTerm->iPa
9fe0: 72 65 6e 74 20 3d 20 2d 31 3b 0a 20 20 70 54 65  rent = -1;.  pTe
9ff0: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20  rm->eOperator = 
a000: 30 3b 0a 20 20 69 66 28 20 61 6c 6c 6f 77 65 64  0;.  if( allowed
a010: 4f 70 28 6f 70 29 20 29 7b 0a 20 20 20 20 45 78  Op(op) ){.    Ex
a020: 70 72 20 2a 70 4c 65 66 74 20 3d 20 73 71 6c 69  pr *pLeft = sqli
a030: 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61  te3ExprSkipColla
a040: 74 65 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  te(pExpr->pLeft)
a050: 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 52 69 67  ;.    Expr *pRig
a060: 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ht = sqlite3Expr
a070: 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 45 78 70  SkipCollate(pExp
a080: 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20  r->pRight);.    
a090: 75 31 36 20 6f 70 4d 61 73 6b 20 3d 20 28 70 54  u16 opMask = (pT
a0a0: 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
a0b0: 20 26 20 70 72 65 72 65 71 4c 65 66 74 29 3d 3d   & prereqLeft)==
a0c0: 30 20 3f 20 57 4f 5f 41 4c 4c 20 3a 20 57 4f 5f  0 ? WO_ALL : WO_
a0d0: 45 51 55 49 56 3b 0a 20 20 20 20 69 66 28 20 70  EQUIV;.    if( p
a0e0: 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  Left->op==TK_COL
a0f0: 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 70 54 65  UMN ){.      pTe
a100: 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d  rm->leftCursor =
a110: 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a   pLeft->iTable;.
a120: 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 75 2e 6c        pTerm->u.l
a130: 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66  eftColumn = pLef
a140: 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  t->iColumn;.    
a150: 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74    pTerm->eOperat
a160: 6f 72 20 3d 20 6f 70 65 72 61 74 6f 72 4d 61 73  or = operatorMas
a170: 6b 28 6f 70 29 20 26 20 6f 70 4d 61 73 6b 3b 0a  k(op) & opMask;.
a180: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 52      }.    if( pR
a190: 69 67 68 74 20 26 26 20 70 52 69 67 68 74 2d 3e  ight && pRight->
a1a0: 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b  op==TK_COLUMN ){
a1b0: 0a 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d  .      WhereTerm
a1c0: 20 2a 70 4e 65 77 3b 0a 20 20 20 20 20 20 45 78   *pNew;.      Ex
a1d0: 70 72 20 2a 70 44 75 70 3b 0a 20 20 20 20 20 20  pr *pDup;.      
a1e0: 75 31 36 20 65 45 78 74 72 61 4f 70 20 3d 20 30  u16 eExtraOp = 0
a1f0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72  ;        /* Extr
a200: 61 20 62 69 74 73 20 66 6f 72 20 70 4e 65 77 2d  a bits for pNew-
a210: 3e 65 4f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  >eOperator */.  
a220: 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c      if( pTerm->l
a230: 65 66 74 43 75 72 73 6f 72 3e 3d 30 20 29 7b 0a  eftCursor>=0 ){.
a240: 20 20 20 20 20 20 20 20 69 6e 74 20 69 64 78 4e          int idxN
a250: 65 77 3b 0a 20 20 20 20 20 20 20 20 70 44 75 70  ew;.        pDup
a260: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
a270: 70 28 64 62 2c 20 70 45 78 70 72 2c 20 30 29 3b  p(db, pExpr, 0);
a280: 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 62 2d  .        if( db-
a290: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
a2a0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
a2b0: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
a2c0: 20 70 44 75 70 29 3b 0a 20 20 20 20 20 20 20 20   pDup);.        
a2d0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20    return;.      
a2e0: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 64 78 4e    }.        idxN
a2f0: 65 77 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65  ew = whereClause
a300: 49 6e 73 65 72 74 28 70 57 43 2c 20 70 44 75 70  Insert(pWC, pDup
a310: 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54  , TERM_VIRTUAL|T
a320: 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20  ERM_DYNAMIC);.  
a330: 20 20 20 20 20 20 69 66 28 20 69 64 78 4e 65 77        if( idxNew
a340: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
a350: 20 20 20 20 20 20 70 4e 65 77 20 3d 20 26 70 57        pNew = &pW
a360: 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 3b 0a 20 20  C->a[idxNew];.  
a370: 20 20 20 20 20 20 6d 61 72 6b 54 65 72 6d 41 73        markTermAs
a380: 43 68 69 6c 64 28 70 57 43 2c 20 69 64 78 4e 65  Child(pWC, idxNe
a390: 77 2c 20 69 64 78 54 65 72 6d 29 3b 0a 20 20 20  w, idxTerm);.   
a3a0: 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57       pTerm = &pW
a3b0: 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20  C->a[idxTerm];. 
a3c0: 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 77 74         pTerm->wt
a3d0: 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f  Flags |= TERM_CO
a3e0: 50 49 45 44 3b 0a 20 20 20 20 20 20 20 20 69 66  PIED;.        if
a3f0: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
a400: 45 51 0a 20 20 20 20 20 20 20 20 20 26 26 20 21  EQ.         && !
a410: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
a420: 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f  pExpr, EP_FromJo
a430: 69 6e 29 0a 20 20 20 20 20 20 20 20 20 26 26 20  in).         && 
a440: 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62  OptimizationEnab
a450: 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 54  led(db, SQLITE_T
a460: 72 61 6e 73 69 74 69 76 65 29 0a 20 20 20 20 20  ransitive).     
a470: 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
a480: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
a490: 20 7c 3d 20 57 4f 5f 45 51 55 49 56 3b 0a 20 20   |= WO_EQUIV;.  
a4a0: 20 20 20 20 20 20 20 20 65 45 78 74 72 61 4f 70          eExtraOp
a4b0: 20 3d 20 57 4f 5f 45 51 55 49 56 3b 0a 20 20 20   = WO_EQUIV;.   
a4c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
a4d0: 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44 75 70  se{.        pDup
a4e0: 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20   = pExpr;.      
a4f0: 20 20 70 4e 65 77 20 3d 20 70 54 65 72 6d 3b 0a    pNew = pTerm;.
a500: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 65 78        }.      ex
a510: 70 72 43 6f 6d 6d 75 74 65 28 70 50 61 72 73 65  prCommute(pParse
a520: 2c 20 70 44 75 70 29 3b 0a 20 20 20 20 20 20 70  , pDup);.      p
a530: 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78  Left = sqlite3Ex
a540: 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 44  prSkipCollate(pD
a550: 75 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20  up->pLeft);.    
a560: 20 20 70 4e 65 77 2d 3e 6c 65 66 74 43 75 72 73    pNew->leftCurs
a570: 6f 72 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62  or = pLeft->iTab
a580: 6c 65 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  le;.      pNew->
a590: 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70  u.leftColumn = p
a5a0: 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20  Left->iColumn;. 
a5b0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28       testcase( (
a5c0: 70 72 65 72 65 71 4c 65 66 74 20 7c 20 65 78 74  prereqLeft | ext
a5d0: 72 61 52 69 67 68 74 29 20 21 3d 20 70 72 65 72  raRight) != prer
a5e0: 65 71 4c 65 66 74 20 29 3b 0a 20 20 20 20 20 20  eqLeft );.      
a5f0: 70 4e 65 77 2d 3e 70 72 65 72 65 71 52 69 67 68  pNew->prereqRigh
a600: 74 20 3d 20 70 72 65 72 65 71 4c 65 66 74 20 7c  t = prereqLeft |
a610: 20 65 78 74 72 61 52 69 67 68 74 3b 0a 20 20 20   extraRight;.   
a620: 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 41     pNew->prereqA
a630: 6c 6c 20 3d 20 70 72 65 72 65 71 41 6c 6c 3b 0a  ll = prereqAll;.
a640: 20 20 20 20 20 20 70 4e 65 77 2d 3e 65 4f 70 65        pNew->eOpe
a650: 72 61 74 6f 72 20 3d 20 28 6f 70 65 72 61 74 6f  rator = (operato
a660: 72 4d 61 73 6b 28 70 44 75 70 2d 3e 6f 70 29 20  rMask(pDup->op) 
a670: 2b 20 65 45 78 74 72 61 4f 70 29 20 26 20 6f 70  + eExtraOp) & op
a680: 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Mask;.    }.  }.
a690: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
a6a0: 4f 4d 49 54 5f 42 45 54 57 45 45 4e 5f 4f 50 54  OMIT_BETWEEN_OPT
a6b0: 49 4d 49 5a 41 54 49 4f 4e 0a 20 20 2f 2a 20 49  IMIZATION.  /* I
a6c0: 66 20 61 20 74 65 72 6d 20 69 73 20 74 68 65 20  f a term is the 
a6d0: 42 45 54 57 45 45 4e 20 6f 70 65 72 61 74 6f 72  BETWEEN operator
a6e0: 2c 20 63 72 65 61 74 65 20 74 77 6f 20 6e 65 77  , create two new
a6f0: 20 76 69 72 74 75 61 6c 20 74 65 72 6d 73 0a 20   virtual terms. 
a700: 20 2a 2a 20 74 68 61 74 20 64 65 66 69 6e 65 20   ** that define 
a710: 74 68 65 20 72 61 6e 67 65 20 74 68 61 74 20 74  the range that t
a720: 68 65 20 42 45 54 57 45 45 4e 20 69 6d 70 6c 65  he BETWEEN imple
a730: 6d 65 6e 74 73 2e 20 20 46 6f 72 20 65 78 61 6d  ments.  For exam
a740: 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  ple:.  **.  **  
a750: 20 20 20 20 61 20 42 45 54 57 45 45 4e 20 62 20      a BETWEEN b 
a760: 41 4e 44 20 63 0a 20 20 2a 2a 0a 20 20 2a 2a 20  AND c.  **.  ** 
a770: 69 73 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74  is converted int
a780: 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  o:.  **.  **    
a790: 20 20 28 61 20 42 45 54 57 45 45 4e 20 62 20 41    (a BETWEEN b A
a7a0: 4e 44 20 63 29 20 41 4e 44 20 28 61 3e 3d 62 29  ND c) AND (a>=b)
a7b0: 20 41 4e 44 20 28 61 3c 3d 63 29 0a 20 20 2a 2a   AND (a<=c).  **
a7c0: 0a 20 20 2a 2a 20 54 68 65 20 74 77 6f 20 6e 65  .  ** The two ne
a7d0: 77 20 74 65 72 6d 73 20 61 72 65 20 61 64 64 65  w terms are adde
a7e0: 64 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f  d onto the end o
a7f0: 66 20 74 68 65 20 57 68 65 72 65 43 6c 61 75 73  f the WhereClaus
a800: 65 20 6f 62 6a 65 63 74 2e 0a 20 20 2a 2a 20 54  e object..  ** T
a810: 68 65 20 6e 65 77 20 74 65 72 6d 73 20 61 72 65  he new terms are
a820: 20 22 64 79 6e 61 6d 69 63 22 20 61 6e 64 20 61   "dynamic" and a
a830: 72 65 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 74  re children of t
a840: 68 65 20 6f 72 69 67 69 6e 61 6c 20 42 45 54 57  he original BETW
a850: 45 45 4e 0a 20 20 2a 2a 20 74 65 72 6d 2e 20 20  EEN.  ** term.  
a860: 54 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20  That means that 
a870: 69 66 20 74 68 65 20 42 45 54 57 45 45 4e 20 74  if the BETWEEN t
a880: 65 72 6d 20 69 73 20 63 6f 64 65 64 2c 20 74 68  erm is coded, th
a890: 65 20 63 68 69 6c 64 72 65 6e 20 61 72 65 0a 20  e children are. 
a8a0: 20 2a 2a 20 73 6b 69 70 70 65 64 2e 20 20 4f 72   ** skipped.  Or
a8b0: 2c 20 69 66 20 74 68 65 20 63 68 69 6c 64 72 65  , if the childre
a8c0: 6e 20 61 72 65 20 73 61 74 69 73 66 69 65 64 20  n are satisfied 
a8d0: 62 79 20 61 6e 20 69 6e 64 65 78 2c 20 74 68 65  by an index, the
a8e0: 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 42   original.  ** B
a8f0: 45 54 57 45 45 4e 20 74 65 72 6d 20 69 73 20 73  ETWEEN term is s
a900: 6b 69 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 65  kipped..  */.  e
a910: 6c 73 65 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  lse if( pExpr->o
a920: 70 3d 3d 54 4b 5f 42 45 54 57 45 45 4e 20 26 26  p==TK_BETWEEN &&
a930: 20 70 57 43 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44   pWC->op==TK_AND
a940: 20 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74   ){.    ExprList
a950: 20 2a 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d   *pList = pExpr-
a960: 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 69 6e  >x.pList;.    in
a970: 74 20 69 3b 0a 20 20 20 20 73 74 61 74 69 63 20  t i;.    static 
a980: 63 6f 6e 73 74 20 75 38 20 6f 70 73 5b 5d 20 3d  const u8 ops[] =
a990: 20 7b 54 4b 5f 47 45 2c 20 54 4b 5f 4c 45 7d 3b   {TK_GE, TK_LE};
a9a0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69  .    assert( pLi
a9b0: 73 74 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  st!=0 );.    ass
a9c0: 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70  ert( pList->nExp
a9d0: 72 3d 3d 32 20 29 3b 0a 20 20 20 20 66 6f 72 28  r==2 );.    for(
a9e0: 69 3d 30 3b 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a  i=0; i<2; i++){.
a9f0: 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77        Expr *pNew
aa00: 45 78 70 72 3b 0a 20 20 20 20 20 20 69 6e 74 20  Expr;.      int 
aa10: 69 64 78 4e 65 77 3b 0a 20 20 20 20 20 20 70 4e  idxNew;.      pN
aa20: 65 77 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  ewExpr = sqlite3
aa30: 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 6f 70  PExpr(pParse, op
aa40: 73 5b 69 5d 2c 20 0a 20 20 20 20 20 20 20 20 20  s[i], .         
aa50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa60: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
aa70: 75 70 28 64 62 2c 20 70 45 78 70 72 2d 3e 70 4c  up(db, pExpr->pL
aa80: 65 66 74 2c 20 30 29 2c 0a 20 20 20 20 20 20 20  eft, 0),.       
aa90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aaa0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
aab0: 72 44 75 70 28 64 62 2c 20 70 4c 69 73 74 2d 3e  rDup(db, pList->
aac0: 61 5b 69 5d 2e 70 45 78 70 72 2c 20 30 29 2c 20  a[i].pExpr, 0), 
aad0: 30 29 3b 0a 20 20 20 20 20 20 74 72 61 6e 73 66  0);.      transf
aae0: 65 72 4a 6f 69 6e 4d 61 72 6b 69 6e 67 73 28 70  erJoinMarkings(p
aaf0: 4e 65 77 45 78 70 72 2c 20 70 45 78 70 72 29 3b  NewExpr, pExpr);
ab00: 0a 20 20 20 20 20 20 69 64 78 4e 65 77 20 3d 20  .      idxNew = 
ab10: 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72  whereClauseInser
ab20: 74 28 70 57 43 2c 20 70 4e 65 77 45 78 70 72 2c  t(pWC, pNewExpr,
ab30: 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45   TERM_VIRTUAL|TE
ab40: 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20  RM_DYNAMIC);.   
ab50: 20 20 20 74 65 73 74 63 61 73 65 28 20 69 64 78     testcase( idx
ab60: 4e 65 77 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  New==0 );.      
ab70: 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 53 72 63  exprAnalyze(pSrc
ab80: 2c 20 70 57 43 2c 20 69 64 78 4e 65 77 29 3b 0a  , pWC, idxNew);.
ab90: 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70        pTerm = &p
aba0: 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a  WC->a[idxTerm];.
abb0: 20 20 20 20 20 20 6d 61 72 6b 54 65 72 6d 41 73        markTermAs
abc0: 43 68 69 6c 64 28 70 57 43 2c 20 69 64 78 4e 65  Child(pWC, idxNe
abd0: 77 2c 20 69 64 78 54 65 72 6d 29 3b 0a 20 20 20  w, idxTerm);.   
abe0: 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a   }.  }.#endif /*
abf0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 45 54   SQLITE_OMIT_BET
ac00: 57 45 45 4e 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  WEEN_OPTIMIZATIO
ac10: 4e 20 2a 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e  N */..#if !defin
ac20: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f  ed(SQLITE_OMIT_O
ac30: 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 29 20  R_OPTIMIZATION) 
ac40: 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
ac50: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
ac60: 29 0a 20 20 2f 2a 20 41 6e 61 6c 79 7a 65 20 61  ).  /* Analyze a
ac70: 20 74 65 72 6d 20 74 68 61 74 20 69 73 20 63 6f   term that is co
ac80: 6d 70 6f 73 65 64 20 6f 66 20 74 77 6f 20 6f 72  mposed of two or
ac90: 20 6d 6f 72 65 20 73 75 62 74 65 72 6d 73 20 63   more subterms c
aca0: 6f 6e 6e 65 63 74 65 64 20 62 79 0a 20 20 2a 2a  onnected by.  **
acb0: 20 61 6e 20 4f 52 20 6f 70 65 72 61 74 6f 72 2e   an OR operator.
acc0: 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 28  .  */.  else if(
acd0: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4f   pExpr->op==TK_O
ace0: 52 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  R ){.    assert(
acf0: 20 70 57 43 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44   pWC->op==TK_AND
ad00: 20 29 3b 0a 20 20 20 20 65 78 70 72 41 6e 61 6c   );.    exprAnal
ad10: 79 7a 65 4f 72 54 65 72 6d 28 70 53 72 63 2c 20  yzeOrTerm(pSrc, 
ad20: 70 57 43 2c 20 69 64 78 54 65 72 6d 29 3b 0a 20  pWC, idxTerm);. 
ad30: 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d     pTerm = &pWC-
ad40: 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 7d  >a[idxTerm];.  }
ad50: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
ad60: 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49  E_OMIT_OR_OPTIMI
ad70: 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66 6e 64  ZATION */..#ifnd
ad80: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c  ef SQLITE_OMIT_L
ad90: 49 4b 45 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e  IKE_OPTIMIZATION
ada0: 0a 20 20 2f 2a 20 41 64 64 20 63 6f 6e 73 74 72  .  /* Add constr
adb0: 61 69 6e 74 73 20 74 6f 20 72 65 64 75 63 65 20  aints to reduce 
adc0: 74 68 65 20 73 65 61 72 63 68 20 73 70 61 63 65  the search space
add0: 20 6f 6e 20 61 20 4c 49 4b 45 20 6f 72 20 47 4c   on a LIKE or GL
ade0: 4f 42 0a 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72  OB.  ** operator
adf0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 6c 69  ..  **.  ** A li
ae00: 6b 65 20 70 61 74 74 65 72 6e 20 6f 66 20 74 68  ke pattern of th
ae10: 65 20 66 6f 72 6d 20 22 78 20 4c 49 4b 45 20 27  e form "x LIKE '
ae20: 61 62 63 25 27 22 20 69 73 20 63 68 61 6e 67 65  abc%'" is change
ae30: 64 20 69 6e 74 6f 20 63 6f 6e 73 74 72 61 69 6e  d into constrain
ae40: 74 73 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  ts.  **.  **    
ae50: 20 20 20 20 20 20 78 3e 3d 27 61 62 63 27 20 41        x>='abc' A
ae60: 4e 44 20 78 3c 27 61 62 64 27 20 41 4e 44 20 78  ND x<'abd' AND x
ae70: 20 4c 49 4b 45 20 27 61 62 63 25 27 0a 20 20 2a   LIKE 'abc%'.  *
ae80: 2a 0a 20 20 2a 2a 20 54 68 65 20 6c 61 73 74 20  *.  ** The last 
ae90: 63 68 61 72 61 63 74 65 72 20 6f 66 20 74 68 65  character of the
aea0: 20 70 72 65 66 69 78 20 22 61 62 63 22 20 69 73   prefix "abc" is
aeb0: 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 74 6f 20   incremented to 
aec0: 66 6f 72 6d 20 74 68 65 0a 20 20 2a 2a 20 74 65  form the.  ** te
aed0: 72 6d 69 6e 61 74 69 6f 6e 20 63 6f 6e 64 69 74  rmination condit
aee0: 69 6f 6e 20 22 61 62 64 22 2e 0a 20 20 2a 2f 0a  ion "abd"..  */.
aef0: 20 20 69 66 28 20 70 57 43 2d 3e 6f 70 3d 3d 54    if( pWC->op==T
af00: 4b 5f 41 4e 44 20 0a 20 20 20 26 26 20 69 73 4c  K_AND .   && isL
af10: 69 6b 65 4f 72 47 6c 6f 62 28 70 50 61 72 73 65  ikeOrGlob(pParse
af20: 2c 20 70 45 78 70 72 2c 20 26 70 53 74 72 31 2c  , pExpr, &pStr1,
af30: 20 26 69 73 43 6f 6d 70 6c 65 74 65 2c 20 26 6e   &isComplete, &n
af40: 6f 43 61 73 65 29 0a 20 20 29 7b 0a 20 20 20 20  oCase).  ){.    
af50: 45 78 70 72 20 2a 70 4c 65 66 74 3b 20 20 20 20  Expr *pLeft;    
af60: 20 20 20 2f 2a 20 4c 48 53 20 6f 66 20 4c 49 4b     /* LHS of LIK
af70: 45 2f 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72 20  E/GLOB operator 
af80: 2a 2f 0a 20 20 20 20 45 78 70 72 20 2a 70 53 74  */.    Expr *pSt
af90: 72 32 3b 20 20 20 20 20 20 20 2f 2a 20 43 6f 70  r2;       /* Cop
afa0: 79 20 6f 66 20 70 53 74 72 31 20 2d 20 52 48 53  y of pStr1 - RHS
afb0: 20 6f 66 20 4c 49 4b 45 2f 47 4c 4f 42 20 6f 70   of LIKE/GLOB op
afc0: 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 45 78  erator */.    Ex
afd0: 70 72 20 2a 70 4e 65 77 45 78 70 72 31 3b 0a 20  pr *pNewExpr1;. 
afe0: 20 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70     Expr *pNewExp
aff0: 72 32 3b 0a 20 20 20 20 69 6e 74 20 69 64 78 4e  r2;.    int idxN
b000: 65 77 31 3b 0a 20 20 20 20 69 6e 74 20 69 64 78  ew1;.    int idx
b010: 4e 65 77 32 3b 0a 20 20 20 20 54 6f 6b 65 6e 20  New2;.    Token 
b020: 73 43 6f 6c 6c 53 65 71 4e 61 6d 65 3b 20 20 2f  sCollSeqName;  /
b030: 2a 20 4e 61 6d 65 20 6f 66 20 63 6f 6c 6c 61 74  * Name of collat
b040: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 2a 2f 0a  ing sequence */.
b050: 0a 20 20 20 20 70 4c 65 66 74 20 3d 20 70 45 78  .    pLeft = pEx
b060: 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 31  pr->x.pList->a[1
b070: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 53 74  ].pExpr;.    pSt
b080: 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r2 = sqlite3Expr
b090: 44 75 70 28 64 62 2c 20 70 53 74 72 31 2c 20 30  Dup(db, pStr1, 0
b0a0: 29 3b 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e  );.    if( !db->
b0b0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
b0c0: 20 20 20 20 20 20 75 38 20 63 2c 20 2a 70 43 3b        u8 c, *pC;
b0d0: 20 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 63         /* Last c
b0e0: 68 61 72 61 63 74 65 72 20 62 65 66 6f 72 65 20  haracter before 
b0f0: 74 68 65 20 66 69 72 73 74 20 77 69 6c 64 63 61  the first wildca
b100: 72 64 20 2a 2f 0a 20 20 20 20 20 20 70 43 20 3d  rd */.      pC =
b110: 20 28 75 38 2a 29 26 70 53 74 72 32 2d 3e 75 2e   (u8*)&pStr2->u.
b120: 7a 54 6f 6b 65 6e 5b 73 71 6c 69 74 65 33 53 74  zToken[sqlite3St
b130: 72 6c 65 6e 33 30 28 70 53 74 72 32 2d 3e 75 2e  rlen30(pStr2->u.
b140: 7a 54 6f 6b 65 6e 29 2d 31 5d 3b 0a 20 20 20 20  zToken)-1];.    
b150: 20 20 63 20 3d 20 2a 70 43 3b 0a 20 20 20 20 20    c = *pC;.     
b160: 20 69 66 28 20 6e 6f 43 61 73 65 20 29 7b 0a 20   if( noCase ){. 
b170: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f         /* The po
b180: 69 6e 74 20 69 73 20 74 6f 20 69 6e 63 72 65 6d  int is to increm
b190: 65 6e 74 20 74 68 65 20 6c 61 73 74 20 63 68 61  ent the last cha
b1a0: 72 61 63 74 65 72 20 62 65 66 6f 72 65 20 74 68  racter before th
b1b0: 65 20 66 69 72 73 74 0a 20 20 20 20 20 20 20 20  e first.        
b1c0: 2a 2a 20 77 69 6c 64 63 61 72 64 2e 20 20 42 75  ** wildcard.  Bu
b1d0: 74 20 69 66 20 77 65 20 69 6e 63 72 65 6d 65 6e  t if we incremen
b1e0: 74 20 27 40 27 2c 20 74 68 61 74 20 77 69 6c 6c  t '@', that will
b1f0: 20 70 75 73 68 20 69 74 20 69 6e 74 6f 20 74 68   push it into th
b200: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 70  e.        ** alp
b210: 68 61 62 65 74 69 63 20 72 61 6e 67 65 20 77 68  habetic range wh
b220: 65 72 65 20 63 61 73 65 20 63 6f 6e 76 65 72 73  ere case convers
b230: 69 6f 6e 73 20 77 69 6c 6c 20 6d 65 73 73 20 75  ions will mess u
b240: 70 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a  p the .        *
b250: 2a 20 69 6e 65 71 75 61 6c 69 74 79 2e 20 20 54  * inequality.  T
b260: 6f 20 61 76 6f 69 64 20 74 68 69 73 2c 20 6d 61  o avoid this, ma
b270: 6b 65 20 73 75 72 65 20 74 6f 20 61 6c 73 6f 20  ke sure to also 
b280: 72 75 6e 20 74 68 65 20 66 75 6c 6c 0a 20 20 20  run the full.   
b290: 20 20 20 20 20 2a 2a 20 4c 49 4b 45 20 6f 6e 20       ** LIKE on 
b2a0: 61 6c 6c 20 63 61 6e 64 69 64 61 74 65 20 65 78  all candidate ex
b2b0: 70 72 65 73 73 69 6f 6e 73 20 62 79 20 63 6c 65  pressions by cle
b2c0: 61 72 69 6e 67 20 74 68 65 20 69 73 43 6f 6d 70  aring the isComp
b2d0: 6c 65 74 65 20 66 6c 61 67 0a 20 20 20 20 20 20  lete flag.      
b2e0: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
b2f0: 20 63 3d 3d 27 41 27 2d 31 20 29 20 69 73 43 6f   c=='A'-1 ) isCo
b300: 6d 70 6c 65 74 65 20 3d 20 30 3b 0a 20 20 20 20  mplete = 0;.    
b310: 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33 55      c = sqlite3U
b320: 70 70 65 72 54 6f 4c 6f 77 65 72 5b 63 5d 3b 0a  pperToLower[c];.
b330: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 70        }.      *p
b340: 43 20 3d 20 63 20 2b 20 31 3b 0a 20 20 20 20 7d  C = c + 1;.    }
b350: 0a 20 20 20 20 73 43 6f 6c 6c 53 65 71 4e 61 6d  .    sCollSeqNam
b360: 65 2e 7a 20 3d 20 6e 6f 43 61 73 65 20 3f 20 22  e.z = noCase ? "
b370: 4e 4f 43 41 53 45 22 20 3a 20 22 42 49 4e 41 52  NOCASE" : "BINAR
b380: 59 22 3b 0a 20 20 20 20 73 43 6f 6c 6c 53 65 71  Y";.    sCollSeq
b390: 4e 61 6d 65 2e 6e 20 3d 20 36 3b 0a 20 20 20 20  Name.n = 6;.    
b3a0: 70 4e 65 77 45 78 70 72 31 20 3d 20 73 71 6c 69  pNewExpr1 = sqli
b3b0: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
b3c0: 4c 65 66 74 2c 20 30 29 3b 0a 20 20 20 20 70 4e  Left, 0);.    pN
b3d0: 65 77 45 78 70 72 31 20 3d 20 73 71 6c 69 74 65  ewExpr1 = sqlite
b3e0: 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
b3f0: 4b 5f 47 45 2c 20 0a 20 20 20 20 20 20 20 20 20  K_GE, .         
b400: 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 64 64    sqlite3ExprAdd
b410: 43 6f 6c 6c 61 74 65 54 6f 6b 65 6e 28 70 50 61  CollateToken(pPa
b420: 72 73 65 2c 70 4e 65 77 45 78 70 72 31 2c 26 73  rse,pNewExpr1,&s
b430: 43 6f 6c 6c 53 65 71 4e 61 6d 65 29 2c 0a 20 20  CollSeqName),.  
b440: 20 20 20 20 20 20 20 20 20 70 53 74 72 31 2c 20           pStr1, 
b450: 30 29 3b 0a 20 20 20 20 74 72 61 6e 73 66 65 72  0);.    transfer
b460: 4a 6f 69 6e 4d 61 72 6b 69 6e 67 73 28 70 4e 65  JoinMarkings(pNe
b470: 77 45 78 70 72 31 2c 20 70 45 78 70 72 29 3b 0a  wExpr1, pExpr);.
b480: 20 20 20 20 69 64 78 4e 65 77 31 20 3d 20 77 68      idxNew1 = wh
b490: 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28  ereClauseInsert(
b4a0: 70 57 43 2c 20 70 4e 65 77 45 78 70 72 31 2c 20  pWC, pNewExpr1, 
b4b0: 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52  TERM_VIRTUAL|TER
b4c0: 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20  M_DYNAMIC);.    
b4d0: 74 65 73 74 63 61 73 65 28 20 69 64 78 4e 65 77  testcase( idxNew
b4e0: 31 3d 3d 30 20 29 3b 0a 20 20 20 20 65 78 70 72  1==0 );.    expr
b4f0: 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20 70 57  Analyze(pSrc, pW
b500: 43 2c 20 69 64 78 4e 65 77 31 29 3b 0a 20 20 20  C, idxNew1);.   
b510: 20 70 4e 65 77 45 78 70 72 32 20 3d 20 73 71 6c   pNewExpr2 = sql
b520: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
b530: 70 4c 65 66 74 2c 20 30 29 3b 0a 20 20 20 20 70  pLeft, 0);.    p
b540: 4e 65 77 45 78 70 72 32 20 3d 20 73 71 6c 69 74  NewExpr2 = sqlit
b550: 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
b560: 54 4b 5f 4c 54 2c 0a 20 20 20 20 20 20 20 20 20  TK_LT,.         
b570: 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 64 64    sqlite3ExprAdd
b580: 43 6f 6c 6c 61 74 65 54 6f 6b 65 6e 28 70 50 61  CollateToken(pPa
b590: 72 73 65 2c 70 4e 65 77 45 78 70 72 32 2c 26 73  rse,pNewExpr2,&s
b5a0: 43 6f 6c 6c 53 65 71 4e 61 6d 65 29 2c 0a 20 20  CollSeqName),.  
b5b0: 20 20 20 20 20 20 20 20 20 70 53 74 72 32 2c 20           pStr2, 
b5c0: 30 29 3b 0a 20 20 20 20 74 72 61 6e 73 66 65 72  0);.    transfer
b5d0: 4a 6f 69 6e 4d 61 72 6b 69 6e 67 73 28 70 4e 65  JoinMarkings(pNe
b5e0: 77 45 78 70 72 32 2c 20 70 45 78 70 72 29 3b 0a  wExpr2, pExpr);.
b5f0: 20 20 20 20 69 64 78 4e 65 77 32 20 3d 20 77 68      idxNew2 = wh
b600: 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28  ereClauseInsert(
b610: 70 57 43 2c 20 70 4e 65 77 45 78 70 72 32 2c 20  pWC, pNewExpr2, 
b620: 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52  TERM_VIRTUAL|TER
b630: 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20  M_DYNAMIC);.    
b640: 74 65 73 74 63 61 73 65 28 20 69 64 78 4e 65 77  testcase( idxNew
b650: 32 3d 3d 30 20 29 3b 0a 20 20 20 20 65 78 70 72  2==0 );.    expr
b660: 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20 70 57  Analyze(pSrc, pW
b670: 43 2c 20 69 64 78 4e 65 77 32 29 3b 0a 20 20 20  C, idxNew2);.   
b680: 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61   pTerm = &pWC->a
b690: 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20 69  [idxTerm];.    i
b6a0: 66 28 20 69 73 43 6f 6d 70 6c 65 74 65 20 29 7b  f( isComplete ){
b6b0: 0a 20 20 20 20 20 20 6d 61 72 6b 54 65 72 6d 41  .      markTermA
b6c0: 73 43 68 69 6c 64 28 70 57 43 2c 20 69 64 78 4e  sChild(pWC, idxN
b6d0: 65 77 31 2c 20 69 64 78 54 65 72 6d 29 3b 0a 20  ew1, idxTerm);. 
b6e0: 20 20 20 20 20 6d 61 72 6b 54 65 72 6d 41 73 43       markTermAsC
b6f0: 68 69 6c 64 28 70 57 43 2c 20 69 64 78 4e 65 77  hild(pWC, idxNew
b700: 32 2c 20 69 64 78 54 65 72 6d 29 3b 0a 20 20 20  2, idxTerm);.   
b710: 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a   }.  }.#endif /*
b720: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b   SQLITE_OMIT_LIK
b730: 45 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a  E_OPTIMIZATION *
b740: 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
b750: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
b760: 42 4c 45 0a 20 20 2f 2a 20 41 64 64 20 61 20 57  BLE.  /* Add a W
b770: 4f 5f 4d 41 54 43 48 20 61 75 78 69 6c 69 61 72  O_MATCH auxiliar
b780: 79 20 74 65 72 6d 20 74 6f 20 74 68 65 20 63 6f  y term to the co
b790: 6e 73 74 72 61 69 6e 74 20 73 65 74 20 69 66 20  nstraint set if 
b7a0: 74 68 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74  the.  ** current
b7b0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6f   expression is o
b7c0: 66 20 74 68 65 20 66 6f 72 6d 3a 20 20 63 6f 6c  f the form:  col
b7d0: 75 6d 6e 20 4d 41 54 43 48 20 65 78 70 72 2e 0a  umn MATCH expr..
b7e0: 20 20 2a 2a 20 54 68 69 73 20 69 6e 66 6f 72 6d    ** This inform
b7f0: 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 62 79  ation is used by
b800: 20 74 68 65 20 78 42 65 73 74 49 6e 64 65 78 20   the xBestIndex 
b810: 6d 65 74 68 6f 64 73 20 6f 66 0a 20 20 2a 2a 20  methods of.  ** 
b820: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 2e 20  virtual tables. 
b830: 20 54 68 65 20 6e 61 74 69 76 65 20 71 75 65 72   The native quer
b840: 79 20 6f 70 74 69 6d 69 7a 65 72 20 64 6f 65 73  y optimizer does
b850: 20 6e 6f 74 20 61 74 74 65 6d 70 74 0a 20 20 2a   not attempt.  *
b860: 2a 20 74 6f 20 64 6f 20 61 6e 79 74 68 69 6e 67  * to do anything
b870: 20 77 69 74 68 20 4d 41 54 43 48 20 66 75 6e 63   with MATCH func
b880: 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  tions..  */.  if
b890: 28 20 69 73 4d 61 74 63 68 4f 66 43 6f 6c 75 6d  ( isMatchOfColum
b8a0: 6e 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20  n(pExpr) ){.    
b8b0: 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20 20 20  int idxNew;.    
b8c0: 45 78 70 72 20 2a 70 52 69 67 68 74 2c 20 2a 70  Expr *pRight, *p
b8d0: 4c 65 66 74 3b 0a 20 20 20 20 57 68 65 72 65 54  Left;.    WhereT
b8e0: 65 72 6d 20 2a 70 4e 65 77 54 65 72 6d 3b 0a 20  erm *pNewTerm;. 
b8f0: 20 20 20 42 69 74 6d 61 73 6b 20 70 72 65 72 65     Bitmask prere
b900: 71 43 6f 6c 75 6d 6e 2c 20 70 72 65 72 65 71 45  qColumn, prereqE
b910: 78 70 72 3b 0a 0a 20 20 20 20 70 52 69 67 68 74  xpr;..    pRight
b920: 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   = pExpr->x.pLis
b930: 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20  t->a[0].pExpr;. 
b940: 20 20 20 70 4c 65 66 74 20 3d 20 70 45 78 70 72     pLeft = pExpr
b950: 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e  ->x.pList->a[1].
b960: 70 45 78 70 72 3b 0a 20 20 20 20 70 72 65 72 65  pExpr;.    prere
b970: 71 45 78 70 72 20 3d 20 65 78 70 72 54 61 62 6c  qExpr = exprTabl
b980: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
b990: 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20 70 72   pRight);.    pr
b9a0: 65 72 65 71 43 6f 6c 75 6d 6e 20 3d 20 65 78 70  ereqColumn = exp
b9b0: 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  rTableUsage(pMas
b9c0: 6b 53 65 74 2c 20 70 4c 65 66 74 29 3b 0a 20 20  kSet, pLeft);.  
b9d0: 20 20 69 66 28 20 28 70 72 65 72 65 71 45 78 70    if( (prereqExp
b9e0: 72 20 26 20 70 72 65 72 65 71 43 6f 6c 75 6d 6e  r & prereqColumn
b9f0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 45 78  )==0 ){.      Ex
ba00: 70 72 20 2a 70 4e 65 77 45 78 70 72 3b 0a 20 20  pr *pNewExpr;.  
ba10: 20 20 20 20 70 4e 65 77 45 78 70 72 20 3d 20 73      pNewExpr = s
ba20: 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
ba30: 73 65 2c 20 54 4b 5f 4d 41 54 43 48 2c 20 0a 20  se, TK_MATCH, . 
ba40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba50: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20               0, 
ba60: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
ba70: 62 2c 20 70 52 69 67 68 74 2c 20 30 29 2c 20 30  b, pRight, 0), 0
ba80: 29 3b 0a 20 20 20 20 20 20 69 64 78 4e 65 77 20  );.      idxNew 
ba90: 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73  = whereClauseIns
baa0: 65 72 74 28 70 57 43 2c 20 70 4e 65 77 45 78 70  ert(pWC, pNewExp
bab0: 72 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c  r, TERM_VIRTUAL|
bac0: 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  TERM_DYNAMIC);. 
bad0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
bae0: 64 78 4e 65 77 3d 3d 30 20 29 3b 0a 20 20 20 20  dxNew==0 );.    
baf0: 20 20 70 4e 65 77 54 65 72 6d 20 3d 20 26 70 57    pNewTerm = &pW
bb00: 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 3b 0a 20 20  C->a[idxNew];.  
bb10: 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 70 72      pNewTerm->pr
bb20: 65 72 65 71 52 69 67 68 74 20 3d 20 70 72 65 72  ereqRight = prer
bb30: 65 71 45 78 70 72 3b 0a 20 20 20 20 20 20 70 4e  eqExpr;.      pN
bb40: 65 77 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73  ewTerm->leftCurs
bb50: 6f 72 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62  or = pLeft->iTab
bb60: 6c 65 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65  le;.      pNewTe
bb70: 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e  rm->u.leftColumn
bb80: 20 3d 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d   = pLeft->iColum
bb90: 6e 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72  n;.      pNewTer
bba0: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 57  m->eOperator = W
bbb0: 4f 5f 4d 41 54 43 48 3b 0a 20 20 20 20 20 20 6d  O_MATCH;.      m
bbc0: 61 72 6b 54 65 72 6d 41 73 43 68 69 6c 64 28 70  arkTermAsChild(p
bbd0: 57 43 2c 20 69 64 78 4e 65 77 2c 20 69 64 78 54  WC, idxNew, idxT
bbe0: 65 72 6d 29 3b 0a 20 20 20 20 20 20 70 54 65 72  erm);.      pTer
bbf0: 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54  m = &pWC->a[idxT
bc00: 65 72 6d 5d 3b 0a 20 20 20 20 20 20 70 54 65 72  erm];.      pTer
bc10: 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45  m->wtFlags |= TE
bc20: 52 4d 5f 43 4f 50 49 45 44 3b 0a 20 20 20 20 20  RM_COPIED;.     
bc30: 20 70 4e 65 77 54 65 72 6d 2d 3e 70 72 65 72 65   pNewTerm->prere
bc40: 71 41 6c 6c 20 3d 20 70 54 65 72 6d 2d 3e 70 72  qAll = pTerm->pr
bc50: 65 72 65 71 41 6c 6c 3b 0a 20 20 20 20 7d 0a 20  ereqAll;.    }. 
bc60: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
bc70: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
bc80: 54 41 42 4c 45 20 2a 2f 0a 0a 23 69 66 64 65 66  TABLE */..#ifdef
bc90: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
bca0: 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20  TAT3_OR_STAT4.  
bcb0: 2f 2a 20 57 68 65 6e 20 73 71 6c 69 74 65 5f 73  /* When sqlite_s
bcc0: 74 61 74 33 20 68 69 73 74 6f 67 72 61 6d 20 64  tat3 histogram d
bcd0: 61 74 61 20 69 73 20 61 76 61 69 6c 61 62 6c 65  ata is available
bce0: 20 61 6e 20 6f 70 65 72 61 74 6f 72 20 6f 66 20   an operator of 
bcf0: 74 68 65 0a 20 20 2a 2a 20 66 6f 72 6d 20 22 78  the.  ** form "x
bd00: 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 22 20 63 61   IS NOT NULL" ca
bd10: 6e 20 73 6f 6d 65 74 69 6d 65 73 20 62 65 20 65  n sometimes be e
bd20: 76 61 6c 75 61 74 65 64 20 6d 6f 72 65 20 65 66  valuated more ef
bd30: 66 69 63 69 65 6e 74 6c 79 0a 20 20 2a 2a 20 61  ficiently.  ** a
bd40: 73 20 22 78 3e 4e 55 4c 4c 22 20 69 66 20 78 20  s "x>NULL" if x 
bd50: 69 73 20 6e 6f 74 20 61 6e 20 49 4e 54 45 47 45  is not an INTEGE
bd60: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 20 20  R PRIMARY KEY.  
bd70: 53 6f 20 63 6f 6e 73 74 72 75 63 74 20 61 0a 20  So construct a. 
bd80: 20 2a 2a 20 76 69 72 74 75 61 6c 20 74 65 72 6d   ** virtual term
bd90: 20 6f 66 20 74 68 61 74 20 66 6f 72 6d 2e 0a 20   of that form.. 
bda0: 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68   **.  ** Note th
bdb0: 61 74 20 74 68 65 20 76 69 72 74 75 61 6c 20 74  at the virtual t
bdc0: 65 72 6d 20 6d 75 73 74 20 62 65 20 74 61 67 67  erm must be tagg
bdd0: 65 64 20 77 69 74 68 20 54 45 52 4d 5f 56 4e 55  ed with TERM_VNU
bde0: 4c 4c 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20 54  LL.  This.  ** T
bdf0: 45 52 4d 5f 56 4e 55 4c 4c 20 74 61 67 20 77 69  ERM_VNULL tag wi
be00: 6c 6c 20 73 75 70 70 72 65 73 73 20 74 68 65 20  ll suppress the 
be10: 6e 6f 74 2d 6e 75 6c 6c 20 63 68 65 63 6b 20 61  not-null check a
be20: 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 0a  t the beginning.
be30: 20 20 2a 2a 20 6f 66 20 74 68 65 20 6c 6f 6f 70    ** of the loop
be40: 2e 20 20 57 69 74 68 6f 75 74 20 74 68 65 20 54  .  Without the T
be50: 45 52 4d 5f 56 4e 55 4c 4c 20 66 6c 61 67 2c 20  ERM_VNULL flag, 
be60: 74 68 65 20 6e 6f 74 2d 6e 75 6c 6c 20 63 68 65  the not-null che
be70: 63 6b 20 61 74 0a 20 20 2a 2a 20 74 68 65 20 73  ck at.  ** the s
be80: 74 61 72 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70  tart of the loop
be90: 20 77 69 6c 6c 20 70 72 65 76 65 6e 74 20 61 6e   will prevent an
bea0: 79 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 62  y results from b
beb0: 65 69 6e 67 20 72 65 74 75 72 6e 65 64 2e 0a 20  eing returned.. 
bec0: 20 2a 2f 0a 20 20 69 66 28 20 70 45 78 70 72 2d   */.  if( pExpr-
bed0: 3e 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 0a  >op==TK_NOTNULL.
bee0: 20 20 20 26 26 20 70 45 78 70 72 2d 3e 70 4c 65     && pExpr->pLe
bef0: 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  ft->op==TK_COLUM
bf00: 4e 0a 20 20 20 26 26 20 70 45 78 70 72 2d 3e 70  N.   && pExpr->p
bf10: 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30  Left->iColumn>=0
bf20: 0a 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61 74  .   && Optimizat
bf30: 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20 53  ionEnabled(db, S
bf40: 51 4c 49 54 45 5f 53 74 61 74 33 34 29 0a 20 20  QLITE_Stat34).  
bf50: 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 4e 65  ){.    Expr *pNe
bf60: 77 45 78 70 72 3b 0a 20 20 20 20 45 78 70 72 20  wExpr;.    Expr 
bf70: 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e  *pLeft = pExpr->
bf80: 70 4c 65 66 74 3b 0a 20 20 20 20 69 6e 74 20 69  pLeft;.    int i
bf90: 64 78 4e 65 77 3b 0a 20 20 20 20 57 68 65 72 65  dxNew;.    Where
bfa0: 54 65 72 6d 20 2a 70 4e 65 77 54 65 72 6d 3b 0a  Term *pNewTerm;.
bfb0: 0a 20 20 20 20 70 4e 65 77 45 78 70 72 20 3d 20  .    pNewExpr = 
bfc0: 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61  sqlite3PExpr(pPa
bfd0: 72 73 65 2c 20 54 4b 5f 47 54 2c 0a 20 20 20 20  rse, TK_GT,.    
bfe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bff0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
c000: 78 70 72 44 75 70 28 64 62 2c 20 70 4c 65 66 74  xprDup(db, pLeft
c010: 2c 20 30 29 2c 0a 20 20 20 20 20 20 20 20 20 20  , 0),.          
c020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c030: 20 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70    sqlite3PExpr(p
c040: 50 61 72 73 65 2c 20 54 4b 5f 4e 55 4c 4c 2c 20  Parse, TK_NULL, 
c050: 30 2c 20 30 2c 20 30 29 2c 20 30 29 3b 0a 0a 20  0, 0, 0), 0);.. 
c060: 20 20 20 69 64 78 4e 65 77 20 3d 20 77 68 65 72     idxNew = wher
c070: 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57  eClauseInsert(pW
c080: 43 2c 20 70 4e 65 77 45 78 70 72 2c 0a 20 20 20  C, pNewExpr,.   
c090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c0a0: 20 20 20 20 20 20 20 20 20 20 20 54 45 52 4d 5f             TERM_
c0b0: 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e  VIRTUAL|TERM_DYN
c0c0: 41 4d 49 43 7c 54 45 52 4d 5f 56 4e 55 4c 4c 29  AMIC|TERM_VNULL)
c0d0: 3b 0a 20 20 20 20 69 66 28 20 69 64 78 4e 65 77  ;.    if( idxNew
c0e0: 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 54 65   ){.      pNewTe
c0f0: 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78  rm = &pWC->a[idx
c100: 4e 65 77 5d 3b 0a 20 20 20 20 20 20 70 4e 65 77  New];.      pNew
c110: 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
c120: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4e 65  t = 0;.      pNe
c130: 77 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  wTerm->leftCurso
c140: 72 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c  r = pLeft->iTabl
c150: 65 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72  e;.      pNewTer
c160: 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20  m->u.leftColumn 
c170: 3d 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e  = pLeft->iColumn
c180: 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d  ;.      pNewTerm
c190: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 57 4f  ->eOperator = WO
c1a0: 5f 47 54 3b 0a 20 20 20 20 20 20 6d 61 72 6b 54  _GT;.      markT
c1b0: 65 72 6d 41 73 43 68 69 6c 64 28 70 57 43 2c 20  ermAsChild(pWC, 
c1c0: 69 64 78 4e 65 77 2c 20 69 64 78 54 65 72 6d 29  idxNew, idxTerm)
c1d0: 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20  ;.      pTerm = 
c1e0: 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d  &pWC->a[idxTerm]
c1f0: 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 77  ;.      pTerm->w
c200: 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43  tFlags |= TERM_C
c210: 4f 50 49 45 44 3b 0a 20 20 20 20 20 20 70 4e 65  OPIED;.      pNe
c220: 77 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c  wTerm->prereqAll
c230: 20 3d 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71   = pTerm->prereq
c240: 41 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  All;.    }.  }.#
c250: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
c260: 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f  ENABLE_STAT3_OR_
c270: 53 54 41 54 34 20 2a 2f 0a 0a 20 20 2f 2a 20 50  STAT4 */..  /* P
c280: 72 65 76 65 6e 74 20 4f 4e 20 63 6c 61 75 73 65  revent ON clause
c290: 20 74 65 72 6d 73 20 6f 66 20 61 20 4c 45 46 54   terms of a LEFT
c2a0: 20 4a 4f 49 4e 20 66 72 6f 6d 20 62 65 69 6e 67   JOIN from being
c2b0: 20 75 73 65 64 20 74 6f 20 64 72 69 76 65 0a 20   used to drive. 
c2c0: 20 2a 2a 20 61 6e 20 69 6e 64 65 78 20 66 6f 72   ** an index for
c2d0: 20 74 61 62 6c 65 73 20 74 6f 20 74 68 65 20 6c   tables to the l
c2e0: 65 66 74 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e  eft of the join.
c2f0: 0a 20 20 2a 2f 0a 20 20 70 54 65 72 6d 2d 3e 70  .  */.  pTerm->p
c300: 72 65 72 65 71 52 69 67 68 74 20 7c 3d 20 65 78  rereqRight |= ex
c310: 74 72 61 52 69 67 68 74 3b 0a 7d 0a 0a 2f 2a 0a  traRight;.}../*.
c320: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
c330: 20 73 65 61 72 63 68 65 73 20 70 4c 69 73 74 20   searches pList 
c340: 66 6f 72 20 61 6e 20 65 6e 74 72 79 20 74 68 61  for an entry tha
c350: 74 20 6d 61 74 63 68 65 73 20 74 68 65 20 69 43  t matches the iC
c360: 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 0a 2a 2a 20  ol-th column.** 
c370: 6f 66 20 69 6e 64 65 78 20 70 49 64 78 2e 0a 2a  of index pIdx..*
c380: 2a 0a 2a 2a 20 49 66 20 73 75 63 68 20 61 6e 20  *.** If such an 
c390: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66 6f  expression is fo
c3a0: 75 6e 64 2c 20 69 74 73 20 69 6e 64 65 78 20 69  und, its index i
c3b0: 6e 20 70 4c 69 73 74 2d 3e 61 5b 5d 20 69 73 20  n pList->a[] is 
c3c0: 72 65 74 75 72 6e 65 64 2e 20 49 66 0a 2a 2a 20  returned. If.** 
c3d0: 6e 6f 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  no expression is
c3e0: 20 66 6f 75 6e 64 2c 20 2d 31 20 69 73 20 72 65   found, -1 is re
c3f0: 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
c400: 63 20 69 6e 74 20 66 69 6e 64 49 6e 64 65 78 43  c int findIndexC
c410: 6f 6c 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ol(.  Parse *pPa
c420: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  rse,            
c430: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63        /* Parse c
c440: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
c450: 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20  List *pList,    
c460: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
c470: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 74  xpression list t
c480: 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 69 6e  o search */.  in
c490: 74 20 69 42 61 73 65 2c 20 20 20 20 20 20 20 20  t iBase,        
c4a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c4b0: 20 43 75 72 73 6f 72 20 66 6f 72 20 74 61 62 6c   Cursor for tabl
c4c0: 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  e associated wit
c4d0: 68 20 70 49 64 78 20 2a 2f 0a 20 20 49 6e 64 65  h pIdx */.  Inde
c4e0: 78 20 2a 70 49 64 78 2c 20 20 20 20 20 20 20 20  x *pIdx,        
c4f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
c500: 6e 64 65 78 20 74 6f 20 6d 61 74 63 68 20 63 6f  ndex to match co
c510: 6c 75 6d 6e 20 6f 66 20 2a 2f 0a 20 20 69 6e 74  lumn of */.  int
c520: 20 69 43 6f 6c 20 20 20 20 20 20 20 20 20 20 20   iCol           
c530: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c540: 43 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20  Column of index 
c550: 74 6f 20 6d 61 74 63 68 20 2a 2f 0a 29 7b 0a 20  to match */.){. 
c560: 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74 20   int i;.  const 
c570: 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70 49  char *zColl = pI
c580: 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 43 6f 6c 5d  dx->azColl[iCol]
c590: 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  ;..  for(i=0; i<
c5a0: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
c5b0: 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 20  +){.    Expr *p 
c5c0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69  = sqlite3ExprSki
c5d0: 70 43 6f 6c 6c 61 74 65 28 70 4c 69 73 74 2d 3e  pCollate(pList->
c5e0: 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[i].pExpr);.   
c5f0: 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43   if( p->op==TK_C
c600: 4f 4c 55 4d 4e 0a 20 20 20 20 20 26 26 20 70 2d  OLUMN.     && p-
c610: 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 49 64 78 2d 3e  >iColumn==pIdx->
c620: 61 69 43 6f 6c 75 6d 6e 5b 69 43 6f 6c 5d 0a 20  aiColumn[iCol]. 
c630: 20 20 20 20 26 26 20 70 2d 3e 69 54 61 62 6c 65      && p->iTable
c640: 3d 3d 69 42 61 73 65 0a 20 20 20 20 29 7b 0a 20  ==iBase.    ){. 
c650: 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43       CollSeq *pC
c660: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
c670: 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
c680: 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78   pList->a[i].pEx
c690: 70 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 41  pr);.      if( A
c6a0: 4c 57 41 59 53 28 70 43 6f 6c 6c 29 20 26 26 20  LWAYS(pColl) && 
c6b0: 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d  0==sqlite3StrICm
c6c0: 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20  p(pColl->zName, 
c6d0: 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20  zColl) ){.      
c6e0: 20 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 20 20    return i;.    
c6f0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
c700: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f   return -1;.}../
c710: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
c720: 20 69 66 20 74 68 65 20 44 49 53 54 49 4e 43 54   if the DISTINCT
c730: 20 65 78 70 72 65 73 73 69 6f 6e 2d 6c 69 73 74   expression-list
c740: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 74   passed as the t
c750: 68 69 72 64 20 61 72 67 75 6d 65 6e 74 0a 2a 2a  hird argument.**
c760: 20 69 73 20 72 65 64 75 6e 64 61 6e 74 2e 0a 2a   is redundant..*
c770: 2a 0a 2a 2a 20 41 20 44 49 53 54 49 4e 43 54 20  *.** A DISTINCT 
c780: 6c 69 73 74 20 69 73 20 72 65 64 75 6e 64 61 6e  list is redundan
c790: 74 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  t if the databas
c7a0: 65 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20  e contains some 
c7b0: 73 75 62 73 65 74 20 6f 66 0a 2a 2a 20 63 6f 6c  subset of.** col
c7c0: 75 6d 6e 73 20 74 68 61 74 20 61 72 65 20 75 6e  umns that are un
c7d0: 69 71 75 65 20 61 6e 64 20 6e 6f 6e 2d 6e 75 6c  ique and non-nul
c7e0: 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  l..*/.static int
c7f0: 20 69 73 44 69 73 74 69 6e 63 74 52 65 64 75 6e   isDistinctRedun
c800: 64 61 6e 74 28 0a 20 20 50 61 72 73 65 20 2a 70  dant(.  Parse *p
c810: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
c820: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
c830: 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73  text */.  SrcLis
c840: 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 20 20  t *pTabList,    
c850: 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20      /* The FROM 
c860: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72  clause */.  Wher
c870: 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20  eClause *pWC,   
c880: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45        /* The WHE
c890: 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45  RE clause */.  E
c8a0: 78 70 72 4c 69 73 74 20 2a 70 44 69 73 74 69 6e  xprList *pDistin
c8b0: 63 74 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ct       /* The 
c8c0: 72 65 73 75 6c 74 20 73 65 74 20 74 68 61 74 20  result set that 
c8d0: 6e 65 65 64 73 20 74 6f 20 62 65 20 44 49 53 54  needs to be DIST
c8e0: 49 4e 43 54 20 2a 2f 0a 29 7b 0a 20 20 54 61 62  INCT */.){.  Tab
c8f0: 6c 65 20 2a 70 54 61 62 3b 0a 20 20 49 6e 64 65  le *pTab;.  Inde
c900: 78 20 2a 70 49 64 78 3b 0a 20 20 69 6e 74 20 69  x *pIdx;.  int i
c910: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
c920: 20 20 20 20 20 20 20 20 20 20 20 0a 20 20 69 6e             .  in
c930: 74 20 69 42 61 73 65 3b 0a 0a 20 20 2f 2a 20 49  t iBase;..  /* I
c940: 66 20 74 68 65 72 65 20 69 73 20 6d 6f 72 65 20  f there is more 
c950: 74 68 61 6e 20 6f 6e 65 20 74 61 62 6c 65 20 6f  than one table o
c960: 72 20 73 75 62 2d 73 65 6c 65 63 74 20 69 6e 20  r sub-select in 
c970: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
c980: 6f 66 0a 20 20 2a 2a 20 74 68 69 73 20 71 75 65  of.  ** this que
c990: 72 79 2c 20 74 68 65 6e 20 69 74 20 77 69 6c 6c  ry, then it will
c9a0: 20 6e 6f 74 20 62 65 20 70 6f 73 73 69 62 6c 65   not be possible
c9b0: 20 74 6f 20 73 68 6f 77 20 74 68 61 74 20 74 68   to show that th
c9c0: 65 20 44 49 53 54 49 4e 43 54 20 0a 20 20 2a 2a  e DISTINCT .  **
c9d0: 20 63 6c 61 75 73 65 20 69 73 20 72 65 64 75 6e   clause is redun
c9e0: 64 61 6e 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70  dant. */.  if( p
c9f0: 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 21 3d 31  TabList->nSrc!=1
ca00: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
ca10: 42 61 73 65 20 3d 20 70 54 61 62 4c 69 73 74 2d  Base = pTabList-
ca20: 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72 3b 0a 20  >a[0].iCursor;. 
ca30: 20 70 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74   pTab = pTabList
ca40: 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 0a 20 20  ->a[0].pTab;..  
ca50: 2f 2a 20 49 66 20 61 6e 79 20 6f 66 20 74 68 65  /* If any of the
ca60: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 73 20   expressions is 
ca70: 61 6e 20 49 50 4b 20 63 6f 6c 75 6d 6e 20 6f 6e  an IPK column on
ca80: 20 74 61 62 6c 65 20 69 42 61 73 65 2c 20 74 68   table iBase, th
ca90: 65 6e 20 72 65 74 75 72 6e 20 0a 20 20 2a 2a 20  en return .  ** 
caa0: 74 72 75 65 2e 20 4e 6f 74 65 3a 20 54 68 65 20  true. Note: The 
cab0: 28 70 2d 3e 69 54 61 62 6c 65 3d 3d 69 42 61 73  (p->iTable==iBas
cac0: 65 29 20 70 61 72 74 20 6f 66 20 74 68 69 73 20  e) part of this 
cad0: 74 65 73 74 20 6d 61 79 20 62 65 20 66 61 6c 73  test may be fals
cae0: 65 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 63 75  e if the.  ** cu
caf0: 72 72 65 6e 74 20 53 45 4c 45 43 54 20 69 73 20  rrent SELECT is 
cb00: 61 20 63 6f 72 72 65 6c 61 74 65 64 20 73 75 62  a correlated sub
cb10: 2d 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 66  -query..  */.  f
cb20: 6f 72 28 69 3d 30 3b 20 69 3c 70 44 69 73 74 69  or(i=0; i<pDisti
cb30: 6e 63 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  nct->nExpr; i++)
cb40: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20  {.    Expr *p = 
cb50: 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43  sqlite3ExprSkipC
cb60: 6f 6c 6c 61 74 65 28 70 44 69 73 74 69 6e 63 74  ollate(pDistinct
cb70: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[i].pExpr);. 
cb80: 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b     if( p->op==TK
cb90: 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 2d 3e 69 54  _COLUMN && p->iT
cba0: 61 62 6c 65 3d 3d 69 42 61 73 65 20 26 26 20 70  able==iBase && p
cbb0: 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 20 72 65  ->iColumn<0 ) re
cbc0: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f  turn 1;.  }..  /
cbd0: 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 61  * Loop through a
cbe0: 6c 6c 20 69 6e 64 69 63 65 73 20 6f 6e 20 74 68  ll indices on th
cbf0: 65 20 74 61 62 6c 65 2c 20 63 68 65 63 6b 69 6e  e table, checkin
cc00: 67 20 65 61 63 68 20 74 6f 20 73 65 65 20 69 66  g each to see if
cc10: 20 69 74 20 6d 61 6b 65 73 0a 20 20 2a 2a 20 74   it makes.  ** t
cc20: 68 65 20 44 49 53 54 49 4e 43 54 20 71 75 61 6c  he DISTINCT qual
cc30: 69 66 69 65 72 20 72 65 64 75 6e 64 61 6e 74 2e  ifier redundant.
cc40: 20 49 74 20 64 6f 65 73 20 73 6f 20 69 66 3a 0a   It does so if:.
cc50: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 31 2e 20 54    **.  **   1. T
cc60: 68 65 20 69 6e 64 65 78 20 69 73 20 69 74 73 65  he index is itse
cc70: 6c 66 20 55 4e 49 51 55 45 2c 20 61 6e 64 0a 20  lf UNIQUE, and. 
cc80: 20 2a 2a 0a 20 20 2a 2a 20 20 20 32 2e 20 41 6c   **.  **   2. Al
cc90: 6c 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73  l of the columns
cca0: 20 69 6e 20 74 68 65 20 69 6e 64 65 78 20 61 72   in the index ar
ccb0: 65 20 65 69 74 68 65 72 20 70 61 72 74 20 6f 66  e either part of
ccc0: 20 74 68 65 20 70 44 69 73 74 69 6e 63 74 0a 20   the pDistinct. 
ccd0: 20 2a 2a 20 20 20 20 20 20 6c 69 73 74 2c 20 6f   **      list, o
cce0: 72 20 65 6c 73 65 20 74 68 65 20 57 48 45 52 45  r else the WHERE
ccf0: 20 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73   clause contains
cd00: 20 61 20 74 65 72 6d 20 6f 66 20 74 68 65 20 66   a term of the f
cd10: 6f 72 6d 20 22 63 6f 6c 3d 58 22 2c 0a 20 20 2a  orm "col=X",.  *
cd20: 2a 20 20 20 20 20 20 77 68 65 72 65 20 58 20 69  *      where X i
cd30: 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 76 61 6c  s a constant val
cd40: 75 65 2e 20 54 68 65 20 63 6f 6c 6c 61 74 69 6f  ue. The collatio
cd50: 6e 20 73 65 71 75 65 6e 63 65 73 20 6f 66 20 74  n sequences of t
cd60: 68 65 0a 20 20 2a 2a 20 20 20 20 20 20 63 6f 6d  he.  **      com
cd70: 70 61 72 69 73 6f 6e 20 61 6e 64 20 73 65 6c 65  parison and sele
cd80: 63 74 2d 6c 69 73 74 20 65 78 70 72 65 73 73 69  ct-list expressi
cd90: 6f 6e 73 20 6d 75 73 74 20 6d 61 74 63 68 20 74  ons must match t
cda0: 68 6f 73 65 20 6f 66 20 74 68 65 20 69 6e 64 65  hose of the inde
cdb0: 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 33  x..  **.  **   3
cdc0: 2e 20 41 6c 6c 20 6f 66 20 74 68 6f 73 65 20 69  . All of those i
cdd0: 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20 66 6f 72  ndex columns for
cde0: 20 77 68 69 63 68 20 74 68 65 20 57 48 45 52 45   which the WHERE
cdf0: 20 63 6c 61 75 73 65 20 64 6f 65 73 20 6e 6f 74   clause does not
ce00: 0a 20 20 2a 2a 20 20 20 20 20 20 63 6f 6e 74 61  .  **      conta
ce10: 69 6e 20 61 20 22 63 6f 6c 3d 58 22 20 74 65 72  in a "col=X" ter
ce20: 6d 20 61 72 65 20 73 75 62 6a 65 63 74 20 74 6f  m are subject to
ce30: 20 61 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e 73   a NOT NULL cons
ce40: 74 72 61 69 6e 74 2e 0a 20 20 2a 2f 0a 20 20 66  traint..  */.  f
ce50: 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49  or(pIdx=pTab->pI
ce60: 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78  ndex; pIdx; pIdx
ce70: 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20  =pIdx->pNext){. 
ce80: 20 20 20 69 66 28 20 21 49 73 55 6e 69 71 75 65     if( !IsUnique
ce90: 49 6e 64 65 78 28 70 49 64 78 29 20 29 20 63 6f  Index(pIdx) ) co
cea0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 66 6f 72 28  ntinue;.    for(
ceb0: 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 4b 65  i=0; i<pIdx->nKe
cec0: 79 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  yCol; i++){.    
ced0: 20 20 69 31 36 20 69 43 6f 6c 20 3d 20 70 49 64    i16 iCol = pId
cee0: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a  x->aiColumn[i];.
cef0: 20 20 20 20 20 20 69 66 28 20 30 3d 3d 66 69 6e        if( 0==fin
cf00: 64 54 65 72 6d 28 70 57 43 2c 20 69 42 61 73 65  dTerm(pWC, iBase
cf10: 2c 20 69 43 6f 6c 2c 20 7e 28 42 69 74 6d 61 73  , iCol, ~(Bitmas
cf20: 6b 29 30 2c 20 57 4f 5f 45 51 2c 20 70 49 64 78  k)0, WO_EQ, pIdx
cf30: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  ) ){.        int
cf40: 20 69 49 64 78 43 6f 6c 20 3d 20 66 69 6e 64 49   iIdxCol = findI
cf50: 6e 64 65 78 43 6f 6c 28 70 50 61 72 73 65 2c 20  ndexCol(pParse, 
cf60: 70 44 69 73 74 69 6e 63 74 2c 20 69 42 61 73 65  pDistinct, iBase
cf70: 2c 20 70 49 64 78 2c 20 69 29 3b 0a 20 20 20 20  , pIdx, i);.    
cf80: 20 20 20 20 69 66 28 20 69 49 64 78 43 6f 6c 3c      if( iIdxCol<
cf90: 30 20 7c 7c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  0 || pTab->aCol[
cfa0: 69 43 6f 6c 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30  iCol].notNull==0
cfb0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62 72   ){.          br
cfc0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
cfd0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
cfe0: 20 69 66 28 20 69 3d 3d 70 49 64 78 2d 3e 6e 4b   if( i==pIdx->nK
cff0: 65 79 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 2f  eyCol ){.      /
d000: 2a 20 54 68 69 73 20 69 6e 64 65 78 20 69 6d 70  * This index imp
d010: 6c 69 65 73 20 74 68 61 74 20 74 68 65 20 44 49  lies that the DI
d020: 53 54 49 4e 43 54 20 71 75 61 6c 69 66 69 65 72  STINCT qualifier
d030: 20 69 73 20 72 65 64 75 6e 64 61 6e 74 2e 20 2a   is redundant. *
d040: 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  /.      return 1
d050: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
d060: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a  eturn 0;.}.../*.
d070: 2a 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65 20  ** Estimate the 
d080: 6c 6f 67 61 72 69 74 68 6d 20 6f 66 20 74 68 65  logarithm of the
d090: 20 69 6e 70 75 74 20 76 61 6c 75 65 20 74 6f 20   input value to 
d0a0: 62 61 73 65 20 32 2e 0a 2a 2f 0a 73 74 61 74 69  base 2..*/.stati
d0b0: 63 20 4c 6f 67 45 73 74 20 65 73 74 4c 6f 67 28  c LogEst estLog(
d0c0: 4c 6f 67 45 73 74 20 4e 29 7b 0a 20 20 72 65 74  LogEst N){.  ret
d0d0: 75 72 6e 20 4e 3c 3d 31 30 20 3f 20 30 20 3a 20  urn N<=10 ? 0 : 
d0e0: 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 4e 29  sqlite3LogEst(N)
d0f0: 20 2d 20 33 33 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   - 33;.}../*.** 
d100: 54 77 6f 20 72 6f 75 74 69 6e 65 73 20 66 6f 72  Two routines for
d110: 20 70 72 69 6e 74 69 6e 67 20 74 68 65 20 63 6f   printing the co
d120: 6e 74 65 6e 74 20 6f 66 20 61 6e 20 73 71 6c 69  ntent of an sqli
d130: 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 0a 2a  te3_index_info.*
d140: 2a 20 73 74 72 75 63 74 75 72 65 2e 20 20 55 73  * structure.  Us
d150: 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61  ed for testing a
d160: 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c  nd debugging onl
d170: 79 2e 20 20 49 66 20 6e 65 69 74 68 65 72 0a 2a  y.  If neither.*
d180: 2a 20 53 51 4c 49 54 45 5f 54 45 53 54 20 6f 72  * SQLITE_TEST or
d190: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 61 72   SQLITE_DEBUG ar
d1a0: 65 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20  e defined, then 
d1b0: 74 68 65 73 65 20 72 6f 75 74 69 6e 65 73 0a 2a  these routines.*
d1c0: 2a 20 61 72 65 20 6e 6f 2d 6f 70 73 2e 0a 2a 2f  * are no-ops..*/
d1d0: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
d1e0: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
d1f0: 4c 54 41 42 4c 45 29 20 26 26 20 64 65 66 69 6e  LTABLE) && defin
d200: 65 64 28 57 48 45 52 45 54 52 41 43 45 5f 45 4e  ed(WHERETRACE_EN
d210: 41 42 4c 45 44 29 0a 73 74 61 74 69 63 20 76 6f  ABLED).static vo
d220: 69 64 20 54 52 41 43 45 5f 49 44 58 5f 49 4e 50  id TRACE_IDX_INP
d230: 55 54 53 28 73 71 6c 69 74 65 33 5f 69 6e 64 65  UTS(sqlite3_inde
d240: 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 6e  x_info *p){.  in
d250: 74 20 69 3b 0a 20 20 69 66 28 20 21 73 71 6c 69  t i;.  if( !sqli
d260: 74 65 33 57 68 65 72 65 54 72 61 63 65 20 29 20  te3WhereTrace ) 
d270: 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d  return;.  for(i=
d280: 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61  0; i<p->nConstra
d290: 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  int; i++){.    s
d2a0: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
d2b0: 66 28 22 20 20 63 6f 6e 73 74 72 61 69 6e 74 5b  f("  constraint[
d2c0: 25 64 5d 3a 20 63 6f 6c 3d 25 64 20 74 65 72 6d  %d]: col=%d term
d2d0: 69 64 3d 25 64 20 6f 70 3d 25 64 20 75 73 61 62  id=%d op=%d usab
d2e0: 6c 65 64 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  led=%d\n",.     
d2f0: 20 20 69 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61    i,.       p->a
d300: 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 69 43  Constraint[i].iC
d310: 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 70 2d  olumn,.       p-
d320: 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e  >aConstraint[i].
d330: 69 54 65 72 6d 4f 66 66 73 65 74 2c 0a 20 20 20  iTermOffset,.   
d340: 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69      p->aConstrai
d350: 6e 74 5b 69 5d 2e 6f 70 2c 0a 20 20 20 20 20 20  nt[i].op,.      
d360: 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b   p->aConstraint[
d370: 69 5d 2e 75 73 61 62 6c 65 29 3b 0a 20 20 7d 0a  i].usable);.  }.
d380: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
d390: 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a  nOrderBy; i++){.
d3a0: 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
d3b0: 50 72 69 6e 74 66 28 22 20 20 6f 72 64 65 72 62  Printf("  orderb
d3c0: 79 5b 25 64 5d 3a 20 63 6f 6c 3d 25 64 20 64 65  y[%d]: col=%d de
d3d0: 73 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  sc=%d\n",.      
d3e0: 20 69 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 4f   i,.       p->aO
d3f0: 72 64 65 72 42 79 5b 69 5d 2e 69 43 6f 6c 75 6d  rderBy[i].iColum
d400: 6e 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 4f 72  n,.       p->aOr
d410: 64 65 72 42 79 5b 69 5d 2e 64 65 73 63 29 3b 0a  derBy[i].desc);.
d420: 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69    }.}.static voi
d430: 64 20 54 52 41 43 45 5f 49 44 58 5f 4f 55 54 50  d TRACE_IDX_OUTP
d440: 55 54 53 28 73 71 6c 69 74 65 33 5f 69 6e 64 65  UTS(sqlite3_inde
d450: 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 6e  x_info *p){.  in
d460: 74 20 69 3b 0a 20 20 69 66 28 20 21 73 71 6c 69  t i;.  if( !sqli
d470: 74 65 33 57 68 65 72 65 54 72 61 63 65 20 29 20  te3WhereTrace ) 
d480: 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d  return;.  for(i=
d490: 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61  0; i<p->nConstra
d4a0: 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  int; i++){.    s
d4b0: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
d4c0: 66 28 22 20 20 75 73 61 67 65 5b 25 64 5d 3a 20  f("  usage[%d]: 
d4d0: 61 72 67 76 49 64 78 3d 25 64 20 6f 6d 69 74 3d  argvIdx=%d omit=
d4e0: 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69 2c  %d\n",.       i,
d4f0: 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73  .       p->aCons
d500: 74 72 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e 61  traintUsage[i].a
d510: 72 67 76 49 6e 64 65 78 2c 0a 20 20 20 20 20 20  rgvIndex,.      
d520: 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55   p->aConstraintU
d530: 73 61 67 65 5b 69 5d 2e 6f 6d 69 74 29 3b 0a 20  sage[i].omit);. 
d540: 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75   }.  sqlite3Debu
d550: 67 50 72 69 6e 74 66 28 22 20 20 69 64 78 4e 75  gPrintf("  idxNu
d560: 6d 3d 25 64 5c 6e 22 2c 20 70 2d 3e 69 64 78 4e  m=%d\n", p->idxN
d570: 75 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65  um);.  sqlite3De
d580: 62 75 67 50 72 69 6e 74 66 28 22 20 20 69 64 78  bugPrintf("  idx
d590: 53 74 72 3d 25 73 5c 6e 22 2c 20 70 2d 3e 69 64  Str=%s\n", p->id
d5a0: 78 53 74 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  xStr);.  sqlite3
d5b0: 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 6f  DebugPrintf("  o
d5c0: 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 3d 25  rderByConsumed=%
d5d0: 64 5c 6e 22 2c 20 70 2d 3e 6f 72 64 65 72 42 79  d\n", p->orderBy
d5e0: 43 6f 6e 73 75 6d 65 64 29 3b 0a 20 20 73 71 6c  Consumed);.  sql
d5f0: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
d600: 22 20 20 65 73 74 69 6d 61 74 65 64 43 6f 73 74  "  estimatedCost
d610: 3d 25 67 5c 6e 22 2c 20 70 2d 3e 65 73 74 69 6d  =%g\n", p->estim
d620: 61 74 65 64 43 6f 73 74 29 3b 0a 20 20 73 71 6c  atedCost);.  sql
d630: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
d640: 22 20 20 65 73 74 69 6d 61 74 65 64 52 6f 77 73  "  estimatedRows
d650: 3d 25 6c 6c 64 5c 6e 22 2c 20 70 2d 3e 65 73 74  =%lld\n", p->est
d660: 69 6d 61 74 65 64 52 6f 77 73 29 3b 0a 7d 0a 23  imatedRows);.}.#
d670: 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 54 52 41  else.#define TRA
d680: 43 45 5f 49 44 58 5f 49 4e 50 55 54 53 28 41 29  CE_IDX_INPUTS(A)
d690: 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45 5f 49  .#define TRACE_I
d6a0: 44 58 5f 4f 55 54 50 55 54 53 28 41 29 0a 23 65  DX_OUTPUTS(A).#e
d6b0: 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
d6c0: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41  LITE_OMIT_AUTOMA
d6d0: 54 49 43 5f 49 4e 44 45 58 0a 2f 2a 0a 2a 2a 20  TIC_INDEX./*.** 
d6e0: 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
d6f0: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
d700: 74 65 72 6d 20 70 54 65 72 6d 20 69 73 20 6f 66  term pTerm is of
d710: 20 61 20 66 6f 72 6d 20 77 68 65 72 65 20 69 74   a form where it
d720: 0a 2a 2a 20 63 6f 75 6c 64 20 62 65 20 75 73 65  .** could be use
d730: 64 20 77 69 74 68 20 61 6e 20 69 6e 64 65 78 20  d with an index 
d740: 74 6f 20 61 63 63 65 73 73 20 70 53 72 63 2c 20  to access pSrc, 
d750: 61 73 73 75 6d 69 6e 67 20 61 6e 20 61 70 70 72  assuming an appr
d760: 6f 70 72 69 61 74 65 0a 2a 2a 20 69 6e 64 65 78  opriate.** index
d770: 20 65 78 69 73 74 65 64 2e 0a 2a 2f 0a 73 74 61   existed..*/.sta
d780: 74 69 63 20 69 6e 74 20 74 65 72 6d 43 61 6e 44  tic int termCanD
d790: 72 69 76 65 49 6e 64 65 78 28 0a 20 20 57 68 65  riveIndex(.  Whe
d7a0: 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 20  reTerm *pTerm,  
d7b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
d7c0: 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d  HERE clause term
d7d0: 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20 73   to check */.  s
d7e0: 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
d7f0: 65 6d 20 2a 70 53 72 63 2c 20 20 20 20 20 2f 2a  em *pSrc,     /*
d800: 20 54 61 62 6c 65 20 77 65 20 61 72 65 20 74 72   Table we are tr
d810: 79 69 6e 67 20 74 6f 20 61 63 63 65 73 73 20 2a  ying to access *
d820: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52  /.  Bitmask notR
d830: 65 61 64 79 20 20 20 20 20 20 20 20 20 20 20 20  eady            
d840: 20 20 20 2f 2a 20 54 61 62 6c 65 73 20 69 6e 20     /* Tables in 
d850: 6f 75 74 65 72 20 6c 6f 6f 70 73 20 6f 66 20 74  outer loops of t
d860: 68 65 20 6a 6f 69 6e 20 2a 2f 0a 29 7b 0a 20 20  he join */.){.  
d870: 63 68 61 72 20 61 66 66 3b 0a 20 20 69 66 28 20  char aff;.  if( 
d880: 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  pTerm->leftCurso
d890: 72 21 3d 70 53 72 63 2d 3e 69 43 75 72 73 6f 72  r!=pSrc->iCursor
d8a0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
d8b0: 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  f( (pTerm->eOper
d8c0: 61 74 6f 72 20 26 20 57 4f 5f 45 51 29 3d 3d 30  ator & WO_EQ)==0
d8d0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
d8e0: 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65  f( (pTerm->prere
d8f0: 71 52 69 67 68 74 20 26 20 6e 6f 74 52 65 61 64  qRight & notRead
d900: 79 29 21 3d 30 20 29 20 72 65 74 75 72 6e 20 30  y)!=0 ) return 0
d910: 3b 0a 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 75  ;.  if( pTerm->u
d920: 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3c 30 20 29 20  .leftColumn<0 ) 
d930: 72 65 74 75 72 6e 20 30 3b 0a 20 20 61 66 66 20  return 0;.  aff 
d940: 3d 20 70 53 72 63 2d 3e 70 54 61 62 2d 3e 61 43  = pSrc->pTab->aC
d950: 6f 6c 5b 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74  ol[pTerm->u.left
d960: 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69 74 79  Column].affinity
d970: 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  ;.  if( !sqlite3
d980: 49 6e 64 65 78 41 66 66 69 6e 69 74 79 4f 6b 28  IndexAffinityOk(
d990: 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 61 66  pTerm->pExpr, af
d9a0: 66 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  f) ) return 0;. 
d9b0: 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e   return 1;.}.#en
d9c0: 64 69 66 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51  dif...#ifndef SQ
d9d0: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41  LITE_OMIT_AUTOMA
d9e0: 54 49 43 5f 49 4e 44 45 58 0a 2f 2a 0a 2a 2a 20  TIC_INDEX./*.** 
d9f0: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
da00: 20 63 6f 6e 73 74 72 75 63 74 20 74 68 65 20 49   construct the I
da10: 6e 64 65 78 20 6f 62 6a 65 63 74 20 66 6f 72 20  ndex object for 
da20: 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64  an automatic ind
da30: 65 78 0a 2a 2a 20 61 6e 64 20 74 6f 20 73 65 74  ex.** and to set
da40: 20 75 70 20 74 68 65 20 57 68 65 72 65 4c 65 76   up the WhereLev
da50: 65 6c 20 6f 62 6a 65 63 74 20 70 4c 65 76 65 6c  el object pLevel
da60: 20 73 6f 20 74 68 61 74 20 74 68 65 20 63 6f 64   so that the cod
da70: 65 20 67 65 6e 65 72 61 74 6f 72 0a 2a 2a 20 6d  e generator.** m
da80: 61 6b 65 73 20 75 73 65 20 6f 66 20 74 68 65 20  akes use of the 
da90: 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 2e  automatic index.
daa0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
dab0: 63 6f 6e 73 74 72 75 63 74 41 75 74 6f 6d 61 74  constructAutomat
dac0: 69 63 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65  icIndex(.  Parse
dad0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
dae0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
daf0: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
db00: 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
db10: 70 57 43 2c 20 20 20 20 20 20 20 20 20 20 20 2f  pWC,           /
db20: 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
db30: 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  se */.  struct S
db40: 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72  rcList_item *pSr
db50: 63 2c 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20  c,  /* The FROM 
db60: 63 6c 61 75 73 65 20 74 65 72 6d 20 74 6f 20 67  clause term to g
db70: 65 74 20 74 68 65 20 6e 65 78 74 20 69 6e 64 65  et the next inde
db80: 78 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e  x */.  Bitmask n
db90: 6f 74 52 65 61 64 79 2c 20 20 20 20 20 20 20 20  otReady,        
dba0: 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 63 75     /* Mask of cu
dbb0: 72 73 6f 72 73 20 74 68 61 74 20 61 72 65 20 6e  rsors that are n
dbc0: 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a  ot available */.
dbd0: 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c    WhereLevel *pL
dbe0: 65 76 65 6c 20 20 20 20 20 20 20 20 20 20 2f 2a  evel          /*
dbf0: 20 57 72 69 74 65 20 6e 65 77 20 69 6e 64 65 78   Write new index
dc00: 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   here */.){.  in
dc10: 74 20 6e 4b 65 79 43 6f 6c 3b 20 20 20 20 20 20  t nKeyCol;      
dc20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
dc30: 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
dc40: 6e 20 74 68 65 20 63 6f 6e 73 74 72 75 63 74 65  n the constructe
dc50: 64 20 69 6e 64 65 78 20 2a 2f 0a 20 20 57 68 65  d index */.  Whe
dc60: 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20  reTerm *pTerm;  
dc70: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69           /* A si
dc80: 6e 67 6c 65 20 74 65 72 6d 20 6f 66 20 74 68 65  ngle term of the
dc90: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
dca0: 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 57  .  WhereTerm *pW
dcb0: 43 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20 2f  CEnd;          /
dcc0: 2a 20 45 6e 64 20 6f 66 20 70 57 43 2d 3e 61 5b  * End of pWC->a[
dcd0: 5d 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  ] */.  Index *pI
dce0: 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dx;             
dcf0: 20 20 20 2f 2a 20 4f 62 6a 65 63 74 20 64 65 73     /* Object des
dd00: 63 72 69 62 69 6e 67 20 74 68 65 20 74 72 61 6e  cribing the tran
dd10: 73 69 65 6e 74 20 69 6e 64 65 78 20 2a 2f 0a 20  sient index */. 
dd20: 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20   Vdbe *v;       
dd30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
dd40: 50 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  Prepared stateme
dd50: 6e 74 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  nt under constru
dd60: 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 61  ction */.  int a
dd70: 64 64 72 49 6e 69 74 3b 20 20 20 20 20 20 20 20  ddrInit;        
dd80: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
dd90: 73 20 6f 66 20 74 68 65 20 69 6e 69 74 69 61 6c  s of the initial
dda0: 69 7a 61 74 69 6f 6e 20 62 79 70 61 73 73 20 6a  ization bypass j
ddb0: 75 6d 70 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a  ump */.  Table *
ddc0: 70 54 61 62 6c 65 3b 20 20 20 20 20 20 20 20 20  pTable;         
ddd0: 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c       /* The tabl
dde0: 65 20 62 65 69 6e 67 20 69 6e 64 65 78 65 64 20  e being indexed 
ddf0: 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 54 6f 70  */.  int addrTop
de00: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
de10: 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 69   /* Top of the i
de20: 6e 64 65 78 20 66 69 6c 6c 20 6c 6f 6f 70 20 2a  ndex fill loop *
de30: 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 63 6f 72  /.  int regRecor
de40: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
de50: 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64  /* Register hold
de60: 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 72 65 63  ing an index rec
de70: 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20  ord */.  int n; 
de80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de90: 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 63       /* Column c
dea0: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
deb0: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
dec0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
ded0: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  counter */.  int
dee0: 20 6d 78 42 69 74 43 6f 6c 3b 20 20 20 20 20 20   mxBitCol;      
def0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69           /* Maxi
df00: 6d 75 6d 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 53  mum column in pS
df10: 72 63 2d 3e 63 6f 6c 55 73 65 64 20 2a 2f 0a 20  rc->colUsed */. 
df20: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
df30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
df40: 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  Collating sequen
df50: 63 65 20 74 6f 20 6f 6e 20 61 20 63 6f 6c 75 6d  ce to on a colum
df60: 6e 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70  n */.  WhereLoop
df70: 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20   *pLoop;        
df80: 20 20 20 2f 2a 20 54 68 65 20 4c 6f 6f 70 20 6f     /* The Loop o
df90: 62 6a 65 63 74 20 2a 2f 0a 20 20 63 68 61 72 20  bject */.  char 
dfa0: 2a 7a 4e 6f 74 55 73 65 64 3b 20 20 20 20 20 20  *zNotUsed;      
dfb0: 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20         /* Extra 
dfc0: 73 70 61 63 65 20 6f 6e 20 74 68 65 20 65 6e 64  space on the end
dfd0: 20 6f 66 20 70 49 64 78 20 2a 2f 0a 20 20 42 69   of pIdx */.  Bi
dfe0: 74 6d 61 73 6b 20 69 64 78 43 6f 6c 73 3b 20 20  tmask idxCols;  
dff0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69 74            /* Bit
e000: 6d 61 70 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 75  map of columns u
e010: 73 65 64 20 66 6f 72 20 69 6e 64 65 78 69 6e 67  sed for indexing
e020: 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 65 78   */.  Bitmask ex
e030: 74 72 61 43 6f 6c 73 3b 20 20 20 20 20 20 20 20  traCols;        
e040: 20 20 2f 2a 20 42 69 74 6d 61 70 20 6f 66 20 61    /* Bitmap of a
e050: 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e  dditional column
e060: 73 20 2a 2f 0a 20 20 75 38 20 73 65 6e 74 57 61  s */.  u8 sentWa
e070: 72 6e 69 6e 67 20 3d 20 30 3b 20 20 20 20 20 20  rning = 0;      
e080: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20     /* True if a 
e090: 77 61 72 6e 6e 69 6e 67 20 68 61 73 20 62 65 65  warnning has bee
e0a0: 6e 20 69 73 73 75 65 64 20 2a 2f 0a 20 20 45 78  n issued */.  Ex
e0b0: 70 72 20 2a 70 50 61 72 74 69 61 6c 20 3d 20 30  pr *pPartial = 0
e0c0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72  ;         /* Par
e0d0: 74 69 61 6c 20 49 6e 64 65 78 20 45 78 70 72 65  tial Index Expre
e0e0: 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  ssion */.  int i
e0f0: 43 6f 6e 74 69 6e 75 65 20 3d 20 30 3b 20 20 20  Continue = 0;   
e100: 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68         /* Jump h
e110: 65 72 65 20 74 6f 20 73 6b 69 70 20 65 78 63 6c  ere to skip excl
e120: 75 64 65 64 20 72 6f 77 73 20 2a 2f 0a 0a 20 20  uded rows */..  
e130: 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
e140: 20 74 6f 20 73 6b 69 70 20 6f 76 65 72 20 74 68   to skip over th
e150: 65 20 63 72 65 61 74 69 6f 6e 20 61 6e 64 20 69  e creation and i
e160: 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66  nitialization of
e170: 20 74 68 65 0a 20 20 2a 2a 20 74 72 61 6e 73 69   the.  ** transi
e180: 65 6e 74 20 69 6e 64 65 78 20 6f 6e 20 32 6e 64  ent index on 2nd
e190: 20 61 6e 64 20 73 75 62 73 65 71 75 65 6e 74 20   and subsequent 
e1a0: 69 74 65 72 61 74 69 6f 6e 73 20 6f 66 20 74 68  iterations of th
e1b0: 65 20 6c 6f 6f 70 2e 20 2a 2f 0a 20 20 76 20 3d  e loop. */.  v =
e1c0: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
e1d0: 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29    assert( v!=0 )
e1e0: 3b 0a 20 20 61 64 64 72 49 6e 69 74 20 3d 20 73  ;.  addrInit = s
e1f0: 71 6c 69 74 65 33 43 6f 64 65 4f 6e 63 65 28 70  qlite3CodeOnce(p
e200: 50 61 72 73 65 29 3b 20 56 64 62 65 43 6f 76 65  Parse); VdbeCove
e210: 72 61 67 65 28 76 29 3b 0a 0a 20 20 2f 2a 20 43  rage(v);..  /* C
e220: 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20  ount the number 
e230: 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20  of columns that 
e240: 77 69 6c 6c 20 62 65 20 61 64 64 65 64 20 74 6f  will be added to
e250: 20 74 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20   the index.  ** 
e260: 61 6e 64 20 75 73 65 64 20 74 6f 20 6d 61 74 63  and used to matc
e270: 68 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 63  h WHERE clause c
e280: 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20  onstraints */.  
e290: 6e 4b 65 79 43 6f 6c 20 3d 20 30 3b 0a 20 20 70  nKeyCol = 0;.  p
e2a0: 54 61 62 6c 65 20 3d 20 70 53 72 63 2d 3e 70 54  Table = pSrc->pT
e2b0: 61 62 3b 0a 20 20 70 57 43 45 6e 64 20 3d 20 26  ab;.  pWCEnd = &
e2c0: 70 57 43 2d 3e 61 5b 70 57 43 2d 3e 6e 54 65 72  pWC->a[pWC->nTer
e2d0: 6d 5d 3b 0a 20 20 70 4c 6f 6f 70 20 3d 20 70 4c  m];.  pLoop = pL
e2e0: 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20  evel->pWLoop;.  
e2f0: 69 64 78 43 6f 6c 73 20 3d 20 30 3b 0a 20 20 66  idxCols = 0;.  f
e300: 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b  or(pTerm=pWC->a;
e310: 20 70 54 65 72 6d 3c 70 57 43 45 6e 64 3b 20 70   pTerm<pWCEnd; p
e320: 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28  Term++){.    if(
e330: 20 70 4c 6f 6f 70 2d 3e 70 72 65 72 65 71 3d 3d   pLoop->prereq==
e340: 30 0a 20 20 20 20 20 26 26 20 28 70 54 65 72 6d  0.     && (pTerm
e350: 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
e360: 5f 56 49 52 54 55 41 4c 29 3d 3d 30 0a 20 20 20  _VIRTUAL)==0.   
e370: 20 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72    && sqlite3Expr
e380: 49 73 54 61 62 6c 65 43 6f 6e 73 74 61 6e 74 28  IsTableConstant(
e390: 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 70 53  pTerm->pExpr, pS
e3a0: 72 63 2d 3e 69 43 75 72 73 6f 72 29 20 29 7b 0a  rc->iCursor) ){.
e3b0: 20 20 20 20 20 20 70 50 61 72 74 69 61 6c 20 3d        pPartial =
e3c0: 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28   sqlite3ExprAnd(
e3d0: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 50 61 72  pParse->db, pPar
e3e0: 74 69 61 6c 2c 0a 20 20 20 20 20 20 20 20 20 20  tial,.          
e3f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e400: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
e410: 72 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c  rDup(pParse->db,
e420: 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 30   pTerm->pExpr, 0
e430: 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ));.    }.    if
e440: 28 20 74 65 72 6d 43 61 6e 44 72 69 76 65 49 6e  ( termCanDriveIn
e450: 64 65 78 28 70 54 65 72 6d 2c 20 70 53 72 63 2c  dex(pTerm, pSrc,
e460: 20 6e 6f 74 52 65 61 64 79 29 20 29 7b 0a 20 20   notReady) ){.  
e470: 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70      int iCol = p
e480: 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75  Term->u.leftColu
e490: 6d 6e 3b 0a 20 20 20 20 20 20 42 69 74 6d 61 73  mn;.      Bitmas
e4a0: 6b 20 63 4d 61 73 6b 20 3d 20 69 43 6f 6c 3e 3d  k cMask = iCol>=
e4b0: 42 4d 53 20 3f 20 4d 41 53 4b 42 49 54 28 42 4d  BMS ? MASKBIT(BM
e4c0: 53 2d 31 29 20 3a 20 4d 41 53 4b 42 49 54 28 69  S-1) : MASKBIT(i
e4d0: 43 6f 6c 29 3b 0a 20 20 20 20 20 20 74 65 73 74  Col);.      test
e4e0: 63 61 73 65 28 20 69 43 6f 6c 3d 3d 42 4d 53 20  case( iCol==BMS 
e4f0: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
e500: 65 28 20 69 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29  e( iCol==BMS-1 )
e510: 3b 0a 20 20 20 20 20 20 69 66 28 20 21 73 65 6e  ;.      if( !sen
e520: 74 57 61 72 6e 69 6e 67 20 29 7b 0a 20 20 20 20  tWarning ){.    
e530: 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28      sqlite3_log(
e540: 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 5f 41  SQLITE_WARNING_A
e550: 55 54 4f 49 4e 44 45 58 2c 0a 20 20 20 20 20 20  UTOINDEX,.      
e560: 20 20 20 20 20 20 22 61 75 74 6f 6d 61 74 69 63        "automatic
e570: 20 69 6e 64 65 78 20 6f 6e 20 25 73 28 25 73 29   index on %s(%s)
e580: 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65  ", pTable->zName
e590: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 54  ,.            pT
e5a0: 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  able->aCol[iCol]
e5b0: 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  .zName);.       
e5c0: 20 73 65 6e 74 57 61 72 6e 69 6e 67 20 3d 20 31   sentWarning = 1
e5d0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
e5e0: 69 66 28 20 28 69 64 78 43 6f 6c 73 20 26 20 63  if( (idxCols & c
e5f0: 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Mask)==0 ){.    
e600: 20 20 20 20 69 66 28 20 77 68 65 72 65 4c 6f 6f      if( whereLoo
e610: 70 52 65 73 69 7a 65 28 70 50 61 72 73 65 2d 3e  pResize(pParse->
e620: 64 62 2c 20 70 4c 6f 6f 70 2c 20 6e 4b 65 79 43  db, pLoop, nKeyC
e630: 6f 6c 2b 31 29 20 29 7b 0a 20 20 20 20 20 20 20  ol+1) ){.       
e640: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 75 74 6f     goto end_auto
e650: 5f 69 6e 64 65 78 5f 63 72 65 61 74 65 3b 0a 20  _index_create;. 
e660: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
e670: 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6e   pLoop->aLTerm[n
e680: 4b 65 79 43 6f 6c 2b 2b 5d 20 3d 20 70 54 65 72  KeyCol++] = pTer
e690: 6d 3b 0a 20 20 20 20 20 20 20 20 69 64 78 43 6f  m;.        idxCo
e6a0: 6c 73 20 7c 3d 20 63 4d 61 73 6b 3b 0a 20 20 20  ls |= cMask;.   
e6b0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
e6c0: 20 61 73 73 65 72 74 28 20 6e 4b 65 79 43 6f 6c   assert( nKeyCol
e6d0: 3e 30 20 29 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 75  >0 );.  pLoop->u
e6e0: 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 70 4c 6f  .btree.nEq = pLo
e6f0: 6f 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20 6e 4b 65  op->nLTerm = nKe
e700: 79 43 6f 6c 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 77  yCol;.  pLoop->w
e710: 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 43  sFlags = WHERE_C
e720: 4f 4c 55 4d 4e 5f 45 51 20 7c 20 57 48 45 52 45  OLUMN_EQ | WHERE
e730: 5f 49 44 58 5f 4f 4e 4c 59 20 7c 20 57 48 45 52  _IDX_ONLY | WHER
e740: 45 5f 49 4e 44 45 58 45 44 0a 20 20 20 20 20 20  E_INDEXED.      
e750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
e760: 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45   WHERE_AUTO_INDE
e770: 58 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 74  X;..  /* Count t
e780: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 64 64  he number of add
e790: 69 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 73 20  itional columns 
e7a0: 6e 65 65 64 65 64 20 74 6f 20 63 72 65 61 74 65  needed to create
e7b0: 20 61 0a 20 20 2a 2a 20 63 6f 76 65 72 69 6e 67   a.  ** covering
e7c0: 20 69 6e 64 65 78 2e 20 20 41 20 22 63 6f 76 65   index.  A "cove
e7d0: 72 69 6e 67 20 69 6e 64 65 78 22 20 69 73 20 61  ring index" is a
e7e0: 6e 20 69 6e 64 65 78 20 74 68 61 74 20 63 6f 6e  n index that con
e7f0: 74 61 69 6e 73 20 61 6c 6c 0a 20 20 2a 2a 20 63  tains all.  ** c
e800: 6f 6c 75 6d 6e 73 20 74 68 61 74 20 61 72 65 20  olumns that are 
e810: 6e 65 65 64 65 64 20 62 79 20 74 68 65 20 71 75  needed by the qu
e820: 65 72 79 2e 20 20 57 69 74 68 20 61 20 63 6f 76  ery.  With a cov
e830: 65 72 69 6e 67 20 69 6e 64 65 78 2c 20 74 68 65  ering index, the
e840: 0a 20 20 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 74  .  ** original t
e850: 61 62 6c 65 20 6e 65 76 65 72 20 6e 65 65 64 73  able never needs
e860: 20 74 6f 20 62 65 20 61 63 63 65 73 73 65 64 2e   to be accessed.
e870: 20 20 41 75 74 6f 6d 61 74 69 63 20 69 6e 64 69    Automatic indi
e880: 63 65 73 20 6d 75 73 74 0a 20 20 2a 2a 20 62 65  ces must.  ** be
e890: 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65   a covering inde
e8a0: 78 20 62 65 63 61 75 73 65 20 74 68 65 20 69 6e  x because the in
e8b0: 64 65 78 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  dex will not be 
e8c0: 75 70 64 61 74 65 64 20 69 66 20 74 68 65 0a 20  updated if the. 
e8d0: 20 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 74 61 62   ** original tab
e8e0: 6c 65 20 63 68 61 6e 67 65 73 20 61 6e 64 20 74  le changes and t
e8f0: 68 65 20 69 6e 64 65 78 20 61 6e 64 20 74 61 62  he index and tab
e900: 6c 65 20 63 61 6e 6e 6f 74 20 62 6f 74 68 20 62  le cannot both b
e910: 65 20 75 73 65 64 0a 20 20 2a 2a 20 69 66 20 74  e used.  ** if t
e920: 68 65 79 20 67 6f 20 6f 75 74 20 6f 66 20 73 79  hey go out of sy
e930: 6e 63 2e 0a 20 20 2a 2f 0a 20 20 65 78 74 72 61  nc..  */.  extra
e940: 43 6f 6c 73 20 3d 20 70 53 72 63 2d 3e 63 6f 6c  Cols = pSrc->col
e950: 55 73 65 64 20 26 20 28 7e 69 64 78 43 6f 6c 73  Used & (~idxCols
e960: 20 7c 20 4d 41 53 4b 42 49 54 28 42 4d 53 2d 31   | MASKBIT(BMS-1
e970: 29 29 3b 0a 20 20 6d 78 42 69 74 43 6f 6c 20 3d  ));.  mxBitCol =
e980: 20 4d 49 4e 28 42 4d 53 2d 31 2c 70 54 61 62 6c   MIN(BMS-1,pTabl
e990: 65 2d 3e 6e 43 6f 6c 29 3b 0a 20 20 74 65 73 74  e->nCol);.  test
e9a0: 63 61 73 65 28 20 70 54 61 62 6c 65 2d 3e 6e 43  case( pTable->nC
e9b0: 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 74  ol==BMS-1 );.  t
e9c0: 65 73 74 63 61 73 65 28 20 70 54 61 62 6c 65 2d  estcase( pTable-
e9d0: 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 32 20 29 3b 0a  >nCol==BMS-2 );.
e9e0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6d 78 42    for(i=0; i<mxB
e9f0: 69 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  itCol; i++){.   
ea00: 20 69 66 28 20 65 78 74 72 61 43 6f 6c 73 20 26   if( extraCols &
ea10: 20 4d 41 53 4b 42 49 54 28 69 29 20 29 20 6e 4b   MASKBIT(i) ) nK
ea20: 65 79 43 6f 6c 2b 2b 3b 0a 20 20 7d 0a 20 20 69  eyCol++;.  }.  i
ea30: 66 28 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64  f( pSrc->colUsed
ea40: 20 26 20 4d 41 53 4b 42 49 54 28 42 4d 53 2d 31   & MASKBIT(BMS-1
ea50: 29 20 29 7b 0a 20 20 20 20 6e 4b 65 79 43 6f 6c  ) ){.    nKeyCol
ea60: 20 2b 3d 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c   += pTable->nCol
ea70: 20 2d 20 42 4d 53 20 2b 20 31 3b 0a 20 20 7d 0a   - BMS + 1;.  }.
ea80: 0a 20 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20  .  /* Construct 
ea90: 74 68 65 20 49 6e 64 65 78 20 6f 62 6a 65 63 74  the Index object
eaa0: 20 74 6f 20 64 65 73 63 72 69 62 65 20 74 68 69   to describe thi
eab0: 73 20 69 6e 64 65 78 20 2a 2f 0a 20 20 70 49 64  s index */.  pId
eac0: 78 20 3d 20 73 71 6c 69 74 65 33 41 6c 6c 6f 63  x = sqlite3Alloc
ead0: 61 74 65 49 6e 64 65 78 4f 62 6a 65 63 74 28 70  ateIndexObject(p
eae0: 50 61 72 73 65 2d 3e 64 62 2c 20 6e 4b 65 79 43  Parse->db, nKeyC
eaf0: 6f 6c 2b 31 2c 20 30 2c 20 26 7a 4e 6f 74 55 73  ol+1, 0, &zNotUs
eb00: 65 64 29 3b 0a 20 20 69 66 28 20 70 49 64 78 3d  ed);.  if( pIdx=
eb10: 3d 30 20 29 20 67 6f 74 6f 20 65 6e 64 5f 61 75  =0 ) goto end_au
eb20: 74 6f 5f 69 6e 64 65 78 5f 63 72 65 61 74 65 3b  to_index_create;
eb30: 0a 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65  .  pLoop->u.btre
eb40: 65 2e 70 49 6e 64 65 78 20 3d 20 70 49 64 78 3b  e.pIndex = pIdx;
eb50: 0a 20 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 20 3d  .  pIdx->zName =
eb60: 20 22 61 75 74 6f 2d 69 6e 64 65 78 22 3b 0a 20   "auto-index";. 
eb70: 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 20 3d 20   pIdx->pTable = 
eb80: 70 54 61 62 6c 65 3b 0a 20 20 6e 20 3d 20 30 3b  pTable;.  n = 0;
eb90: 0a 20 20 69 64 78 43 6f 6c 73 20 3d 20 30 3b 0a  .  idxCols = 0;.
eba0: 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d    for(pTerm=pWC-
ebb0: 3e 61 3b 20 70 54 65 72 6d 3c 70 57 43 45 6e 64  >a; pTerm<pWCEnd
ebc0: 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  ; pTerm++){.    
ebd0: 69 66 28 20 74 65 72 6d 43 61 6e 44 72 69 76 65  if( termCanDrive
ebe0: 49 6e 64 65 78 28 70 54 65 72 6d 2c 20 70 53 72  Index(pTerm, pSr
ebf0: 63 2c 20 6e 6f 74 52 65 61 64 79 29 20 29 7b 0a  c, notReady) ){.
ec00: 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d        int iCol =
ec10: 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f   pTerm->u.leftCo
ec20: 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 42 69 74 6d  lumn;.      Bitm
ec30: 61 73 6b 20 63 4d 61 73 6b 20 3d 20 69 43 6f 6c  ask cMask = iCol
ec40: 3e 3d 42 4d 53 20 3f 20 4d 41 53 4b 42 49 54 28  >=BMS ? MASKBIT(
ec50: 42 4d 53 2d 31 29 20 3a 20 4d 41 53 4b 42 49 54  BMS-1) : MASKBIT
ec60: 28 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20 74 65  (iCol);.      te
ec70: 73 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d 42 4d  stcase( iCol==BM
ec80: 53 2d 31 20 29 3b 0a 20 20 20 20 20 20 74 65 73  S-1 );.      tes
ec90: 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d 42 4d 53  tcase( iCol==BMS
eca0: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 69   );.      if( (i
ecb0: 64 78 43 6f 6c 73 20 26 20 63 4d 61 73 6b 29 3d  dxCols & cMask)=
ecc0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 45 78  =0 ){.        Ex
ecd0: 70 72 20 2a 70 58 20 3d 20 70 54 65 72 6d 2d 3e  pr *pX = pTerm->
ece0: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 69  pExpr;.        i
ecf0: 64 78 43 6f 6c 73 20 7c 3d 20 63 4d 61 73 6b 3b  dxCols |= cMask;
ed00: 0a 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61  .        pIdx->a
ed10: 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 70 54 65  iColumn[n] = pTe
ed20: 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e  rm->u.leftColumn
ed30: 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20  ;.        pColl 
ed40: 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43  = sqlite3BinaryC
ed50: 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50  ompareCollSeq(pP
ed60: 61 72 73 65 2c 20 70 58 2d 3e 70 4c 65 66 74 2c  arse, pX->pLeft,
ed70: 20 70 58 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20   pX->pRight);.  
ed80: 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f        pIdx->azCo
ed90: 6c 6c 5b 6e 5d 20 3d 20 41 4c 57 41 59 53 28 70  ll[n] = ALWAYS(p
eda0: 43 6f 6c 6c 29 20 3f 20 70 43 6f 6c 6c 2d 3e 7a  Coll) ? pColl->z
edb0: 4e 61 6d 65 20 3a 20 22 42 49 4e 41 52 59 22 3b  Name : "BINARY";
edc0: 0a 20 20 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20  .        n++;.  
edd0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
ede0: 20 20 61 73 73 65 72 74 28 20 28 75 33 32 29 6e    assert( (u32)n
edf0: 3d 3d 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  ==pLoop->u.btree
ee00: 2e 6e 45 71 20 29 3b 0a 0a 20 20 2f 2a 20 41 64  .nEq );..  /* Ad
ee10: 64 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6c  d additional col
ee20: 75 6d 6e 73 20 6e 65 65 64 65 64 20 74 6f 20 6d  umns needed to m
ee30: 61 6b 65 20 74 68 65 20 61 75 74 6f 6d 61 74 69  ake the automati
ee40: 63 20 69 6e 64 65 78 20 69 6e 74 6f 0a 20 20 2a  c index into.  *
ee50: 2a 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64  * a covering ind
ee60: 65 78 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  ex */.  for(i=0;
ee70: 20 69 3c 6d 78 42 69 74 43 6f 6c 3b 20 69 2b 2b   i<mxBitCol; i++
ee80: 29 7b 0a 20 20 20 20 69 66 28 20 65 78 74 72 61  ){.    if( extra
ee90: 43 6f 6c 73 20 26 20 4d 41 53 4b 42 49 54 28 69  Cols & MASKBIT(i
eea0: 29 20 29 7b 0a 20 20 20 20 20 20 70 49 64 78 2d  ) ){.      pIdx-
eeb0: 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 69  >aiColumn[n] = i
eec0: 3b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a  ;.      pIdx->az
eed0: 43 6f 6c 6c 5b 6e 5d 20 3d 20 22 42 49 4e 41 52  Coll[n] = "BINAR
eee0: 59 22 3b 0a 20 20 20 20 20 20 6e 2b 2b 3b 0a 20  Y";.      n++;. 
eef0: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
ef00: 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20 26 20 4d  Src->colUsed & M
ef10: 41 53 4b 42 49 54 28 42 4d 53 2d 31 29 20 29 7b  ASKBIT(BMS-1) ){
ef20: 0a 20 20 20 20 66 6f 72 28 69 3d 42 4d 53 2d 31  .    for(i=BMS-1
ef30: 3b 20 69 3c 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c  ; i<pTable->nCol
ef40: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 49  ; i++){.      pI
ef50: 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20  dx->aiColumn[n] 
ef60: 3d 20 69 3b 0a 20 20 20 20 20 20 70 49 64 78 2d  = i;.      pIdx-
ef70: 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 22 42 49  >azColl[n] = "BI
ef80: 4e 41 52 59 22 3b 0a 20 20 20 20 20 20 6e 2b 2b  NARY";.      n++
ef90: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73  ;.    }.  }.  as
efa0: 73 65 72 74 28 20 6e 3d 3d 6e 4b 65 79 43 6f 6c  sert( n==nKeyCol
efb0: 20 29 3b 0a 20 20 70 49 64 78 2d 3e 61 69 43 6f   );.  pIdx->aiCo
efc0: 6c 75 6d 6e 5b 6e 5d 20 3d 20 2d 31 3b 0a 20 20  lumn[n] = -1;.  
efd0: 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20  pIdx->azColl[n] 
efe0: 3d 20 22 42 49 4e 41 52 59 22 3b 0a 0a 20 20 2f  = "BINARY";..  /
eff0: 2a 20 43 72 65 61 74 65 20 74 68 65 20 61 75 74  * Create the aut
f000: 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 2a 2f 0a  omatic index */.
f010: 20 20 61 73 73 65 72 74 28 20 70 4c 65 76 65 6c    assert( pLevel
f020: 2d 3e 69 49 64 78 43 75 72 3e 3d 30 20 29 3b 0a  ->iIdxCur>=0 );.
f030: 20 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75    pLevel->iIdxCu
f040: 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  r = pParse->nTab
f050: 2b 2b 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  ++;.  sqlite3Vdb
f060: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70  eAddOp2(v, OP_Op
f070: 65 6e 41 75 74 6f 69 6e 64 65 78 2c 20 70 4c 65  enAutoindex, pLe
f080: 76 65 6c 2d 3e 69 49 64 78 43 75 72 2c 20 6e 4b  vel->iIdxCur, nK
f090: 65 79 43 6f 6c 2b 31 29 3b 0a 20 20 73 71 6c 69  eyCol+1);.  sqli
f0a0: 74 65 33 56 64 62 65 53 65 74 50 34 4b 65 79 49  te3VdbeSetP4KeyI
f0b0: 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49 64 78  nfo(pParse, pIdx
f0c0: 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  );.  VdbeComment
f0d0: 28 28 76 2c 20 22 66 6f 72 20 25 73 22 2c 20 70  ((v, "for %s", p
f0e0: 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 29 3b 0a  Table->zName));.
f0f0: 0a 20 20 2f 2a 20 46 69 6c 6c 20 74 68 65 20 61  .  /* Fill the a
f100: 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 77  utomatic index w
f110: 69 74 68 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20  ith content */. 
f120: 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
f130: 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20  ePush(pParse);. 
f140: 20 61 64 64 72 54 6f 70 20 3d 20 73 71 6c 69 74   addrTop = sqlit
f150: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
f160: 4f 50 5f 52 65 77 69 6e 64 2c 20 70 4c 65 76 65  OP_Rewind, pLeve
f170: 6c 2d 3e 69 54 61 62 43 75 72 29 3b 20 56 64 62  l->iTabCur); Vdb
f180: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
f190: 69 66 28 20 70 50 61 72 74 69 61 6c 20 29 7b 0a  if( pPartial ){.
f1a0: 20 20 20 20 69 43 6f 6e 74 69 6e 75 65 20 3d 20      iContinue = 
f1b0: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
f1c0: 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 73 71 6c  abel(v);.    sql
f1d0: 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
f1e0: 70 50 61 72 73 65 2c 20 70 50 61 72 74 69 61 6c  pParse, pPartial
f1f0: 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20 53 51 4c  , iContinue, SQL
f200: 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b  ITE_JUMPIFNULL);
f210: 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c  .    pLoop->wsFl
f220: 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 50 41 52  ags |= WHERE_PAR
f230: 54 49 41 4c 49 44 58 3b 0a 20 20 7d 0a 20 20 72  TIALIDX;.  }.  r
f240: 65 67 52 65 63 6f 72 64 20 3d 20 73 71 6c 69 74  egRecord = sqlit
f250: 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
f260: 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 47  rse);.  sqlite3G
f270: 65 6e 65 72 61 74 65 49 6e 64 65 78 4b 65 79 28  enerateIndexKey(
f280: 70 50 61 72 73 65 2c 20 70 49 64 78 2c 20 70 4c  pParse, pIdx, pL
f290: 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 2c 20 72  evel->iTabCur, r
f2a0: 65 67 52 65 63 6f 72 64 2c 20 30 2c 20 30 2c 20  egRecord, 0, 0, 
f2b0: 30 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  0, 0);.  sqlite3
f2c0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
f2d0: 5f 49 64 78 49 6e 73 65 72 74 2c 20 70 4c 65 76  _IdxInsert, pLev
f2e0: 65 6c 2d 3e 69 49 64 78 43 75 72 2c 20 72 65 67  el->iIdxCur, reg
f2f0: 52 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74  Record);.  sqlit
f300: 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
f310: 2c 20 4f 50 46 4c 41 47 5f 55 53 45 53 45 45 4b  , OPFLAG_USESEEK
f320: 52 45 53 55 4c 54 29 3b 0a 20 20 69 66 28 20 70  RESULT);.  if( p
f330: 50 61 72 74 69 61 6c 20 29 20 73 71 6c 69 74 65  Partial ) sqlite
f340: 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
f350: 6c 28 76 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b  l(v, iContinue);
f360: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
f370: 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c  dOp2(v, OP_Next,
f380: 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72   pLevel->iTabCur
f390: 2c 20 61 64 64 72 54 6f 70 2b 31 29 3b 20 56 64  , addrTop+1); Vd
f3a0: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
f3b0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
f3c0: 67 65 50 35 28 76 2c 20 53 51 4c 49 54 45 5f 53  geP5(v, SQLITE_S
f3d0: 54 4d 54 53 54 41 54 55 53 5f 41 55 54 4f 49 4e  TMTSTATUS_AUTOIN
f3e0: 44 45 58 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  DEX);.  sqlite3V
f3f0: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
f400: 64 64 72 54 6f 70 29 3b 0a 20 20 73 71 6c 69 74  ddrTop);.  sqlit
f410: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
f420: 28 70 50 61 72 73 65 2c 20 72 65 67 52 65 63 6f  (pParse, regReco
f430: 72 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  rd);.  sqlite3Ex
f440: 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73  prCachePop(pPars
f450: 65 29 3b 0a 20 20 0a 20 20 2f 2a 20 4a 75 6d 70  e);.  .  /* Jump
f460: 20 68 65 72 65 20 77 68 65 6e 20 73 6b 69 70 70   here when skipp
f470: 69 6e 67 20 74 68 65 20 69 6e 69 74 69 61 6c 69  ing the initiali
f480: 7a 61 74 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69  zation */.  sqli
f490: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
f4a0: 76 2c 20 61 64 64 72 49 6e 69 74 29 3b 0a 0a 65  v, addrInit);..e
f4b0: 6e 64 5f 61 75 74 6f 5f 69 6e 64 65 78 5f 63 72  nd_auto_index_cr
f4c0: 65 61 74 65 3a 0a 20 20 73 71 6c 69 74 65 33 45  eate:.  sqlite3E
f4d0: 78 70 72 44 65 6c 65 74 65 28 70 50 61 72 73 65  xprDelete(pParse
f4e0: 2d 3e 64 62 2c 20 70 50 61 72 74 69 61 6c 29 3b  ->db, pPartial);
f4f0: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
f500: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54  ITE_OMIT_AUTOMAT
f510: 49 43 5f 49 4e 44 45 58 20 2a 2f 0a 0a 23 69 66  IC_INDEX */..#if
f520: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
f530: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a  _VIRTUALTABLE./*
f540: 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64  .** Allocate and
f550: 20 70 6f 70 75 6c 61 74 65 20 61 6e 20 73 71 6c   populate an sql
f560: 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
f570: 73 74 72 75 63 74 75 72 65 2e 20 49 74 20 69 73  structure. It is
f580: 20 74 68 65 20 0a 2a 2a 20 72 65 73 70 6f 6e 73   the .** respons
f590: 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63  ibility of the c
f5a0: 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61  aller to eventua
f5b0: 6c 6c 79 20 72 65 6c 65 61 73 65 20 74 68 65 20  lly release the 
f5c0: 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 62 79 20  structure.** by 
f5d0: 70 61 73 73 69 6e 67 20 74 68 65 20 70 6f 69 6e  passing the poin
f5e0: 74 65 72 20 72 65 74 75 72 6e 65 64 20 62 79 20  ter returned by 
f5f0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 74 6f  this function to
f600: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29 2e   sqlite3_free().
f610: 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74  .*/.static sqlit
f620: 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 61  e3_index_info *a
f630: 6c 6c 6f 63 61 74 65 49 6e 64 65 78 49 6e 66 6f  llocateIndexInfo
f640: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
f650: 65 2c 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  e,.  WhereClause
f660: 20 2a 70 57 43 2c 0a 20 20 73 74 72 75 63 74 20   *pWC,.  struct 
f670: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53  SrcList_item *pS
f680: 72 63 2c 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  rc,.  ExprList *
f690: 70 4f 72 64 65 72 42 79 0a 29 7b 0a 20 20 69 6e  pOrderBy.){.  in
f6a0: 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 6e 54  t i, j;.  int nT
f6b0: 65 72 6d 3b 0a 20 20 73 74 72 75 63 74 20 73 71  erm;.  struct sq
f6c0: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
f6d0: 74 72 61 69 6e 74 20 2a 70 49 64 78 43 6f 6e 73  traint *pIdxCons
f6e0: 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69 74  ;.  struct sqlit
f6f0: 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62 79  e3_index_orderby
f700: 20 2a 70 49 64 78 4f 72 64 65 72 42 79 3b 0a 20   *pIdxOrderBy;. 
f710: 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f   struct sqlite3_
f720: 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
f730: 5f 75 73 61 67 65 20 2a 70 55 73 61 67 65 3b 0a  _usage *pUsage;.
f740: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
f750: 72 6d 3b 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72  rm;.  int nOrder
f760: 42 79 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e  By;.  sqlite3_in
f770: 64 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e  dex_info *pIdxIn
f780: 66 6f 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20  fo;..  /* Count 
f790: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 6f  the number of po
f7a0: 73 73 69 62 6c 65 20 57 48 45 52 45 20 63 6c 61  ssible WHERE cla
f7b0: 75 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  use constraints 
f7c0: 72 65 66 65 72 72 69 6e 67 0a 20 20 2a 2a 20 74  referring.  ** t
f7d0: 6f 20 74 68 69 73 20 76 69 72 74 75 61 6c 20 74  o this virtual t
f7e0: 61 62 6c 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  able */.  for(i=
f7f0: 6e 54 65 72 6d 3d 30 2c 20 70 54 65 72 6d 3d 70  nTerm=0, pTerm=p
f800: 57 43 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54  WC->a; i<pWC->nT
f810: 65 72 6d 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b  erm; i++, pTerm+
f820: 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65 72  +){.    if( pTer
f830: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 21 3d  m->leftCursor !=
f840: 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29   pSrc->iCursor )
f850: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61   continue;.    a
f860: 73 73 65 72 74 28 20 49 73 50 6f 77 65 72 4f 66  ssert( IsPowerOf
f870: 54 77 6f 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  Two(pTerm->eOper
f880: 61 74 6f 72 20 26 20 7e 57 4f 5f 45 51 55 49 56  ator & ~WO_EQUIV
f890: 29 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  ) );.    testcas
f8a0: 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  e( pTerm->eOpera
f8b0: 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20  tor & WO_IN );. 
f8c0: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
f8d0: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
f8e0: 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20  WO_ISNULL );.   
f8f0: 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
f900: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
f910: 5f 41 4c 4c 20 29 3b 0a 20 20 20 20 69 66 28 20  _ALL );.    if( 
f920: 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  (pTerm->eOperato
f930: 72 20 26 20 7e 28 57 4f 5f 49 53 4e 55 4c 4c 7c  r & ~(WO_ISNULL|
f940: 57 4f 5f 45 51 55 49 56 29 29 3d 3d 30 20 29 20  WO_EQUIV))==0 ) 
f950: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
f960: 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  ( pTerm->wtFlags
f970: 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 20 29 20   & TERM_VNULL ) 
f980: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 6e 54  continue;.    nT
f990: 65 72 6d 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  erm++;.  }..  /*
f9a0: 20 49 66 20 74 68 65 20 4f 52 44 45 52 20 42 59   If the ORDER BY
f9b0: 20 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73   clause contains
f9c0: 20 6f 6e 6c 79 20 63 6f 6c 75 6d 6e 73 20 69 6e   only columns in
f9d0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 0a 20 20   the current .  
f9e0: 2a 2a 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  ** virtual table
f9f0: 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65 20 73   then allocate s
fa00: 70 61 63 65 20 66 6f 72 20 74 68 65 20 61 4f 72  pace for the aOr
fa10: 64 65 72 42 79 20 70 61 72 74 20 6f 66 0a 20 20  derBy part of.  
fa20: 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69  ** the sqlite3_i
fa30: 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74  ndex_info struct
fa40: 75 72 65 2e 0a 20 20 2a 2f 0a 20 20 6e 4f 72 64  ure..  */.  nOrd
fa50: 65 72 42 79 20 3d 20 30 3b 0a 20 20 69 66 28 20  erBy = 0;.  if( 
fa60: 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
fa70: 69 6e 74 20 6e 20 3d 20 70 4f 72 64 65 72 42 79  int n = pOrderBy
fa80: 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 66 6f 72  ->nExpr;.    for
fa90: 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b  (i=0; i<n; i++){
faa0: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78  .      Expr *pEx
fab0: 70 72 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61  pr = pOrderBy->a
fac0: 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [i].pExpr;.     
fad0: 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d   if( pExpr->op!=
fae0: 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 45 78  TK_COLUMN || pEx
faf0: 70 72 2d 3e 69 54 61 62 6c 65 21 3d 70 53 72 63  pr->iTable!=pSrc
fb00: 2d 3e 69 43 75 72 73 6f 72 20 29 20 62 72 65 61  ->iCursor ) brea
fb10: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  k;.    }.    if(
fb20: 20 69 3d 3d 6e 29 7b 0a 20 20 20 20 20 20 6e 4f   i==n){.      nO
fb30: 72 64 65 72 42 79 20 3d 20 6e 3b 0a 20 20 20 20  rderBy = n;.    
fb40: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  }.  }..  /* Allo
fb50: 63 61 74 65 20 74 68 65 20 73 71 6c 69 74 65 33  cate the sqlite3
fb60: 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75  _index_info stru
fb70: 63 74 75 72 65 0a 20 20 2a 2f 0a 20 20 70 49 64  cture.  */.  pId
fb80: 78 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44  xInfo = sqlite3D
fb90: 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 50 61 72  bMallocZero(pPar
fba0: 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f 66 28 2a  se->db, sizeof(*
fbb0: 70 49 64 78 49 6e 66 6f 29 0a 20 20 20 20 20 20  pIdxInfo).      
fbc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fbd0: 20 20 20 20 20 2b 20 28 73 69 7a 65 6f 66 28 2a       + (sizeof(*
fbe0: 70 49 64 78 43 6f 6e 73 29 20 2b 20 73 69 7a 65  pIdxCons) + size
fbf0: 6f 66 28 2a 70 55 73 61 67 65 29 29 2a 6e 54 65  of(*pUsage))*nTe
fc00: 72 6d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  rm.             
fc10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 20                + 
fc20: 73 69 7a 65 6f 66 28 2a 70 49 64 78 4f 72 64 65  sizeof(*pIdxOrde
fc30: 72 42 79 29 2a 6e 4f 72 64 65 72 42 79 20 29 3b  rBy)*nOrderBy );
fc40: 0a 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f 3d  .  if( pIdxInfo=
fc50: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
fc60: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
fc70: 2c 20 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79  , "out of memory
fc80: 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  ");.    return 0
fc90: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74  ;.  }..  /* Init
fca0: 69 61 6c 69 7a 65 20 74 68 65 20 73 74 72 75 63  ialize the struc
fcb0: 74 75 72 65 2e 20 20 54 68 65 20 73 71 6c 69 74  ture.  The sqlit
fcc0: 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74  e3_index_info st
fcd0: 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73  ructure contains
fce0: 0a 20 20 2a 2a 20 6d 61 6e 79 20 66 69 65 6c 64  .  ** many field
fcf0: 73 20 74 68 61 74 20 61 72 65 20 64 65 63 6c 61  s that are decla
fd00: 72 65 64 20 22 63 6f 6e 73 74 22 20 74 6f 20 70  red "const" to p
fd10: 72 65 76 65 6e 74 20 78 42 65 73 74 49 6e 64 65  revent xBestInde
fd20: 78 20 66 72 6f 6d 0a 20 20 2a 2a 20 63 68 61 6e  x from.  ** chan
fd30: 67 69 6e 67 20 74 68 65 6d 2e 20 20 57 65 20 68  ging them.  We h
fd40: 61 76 65 20 74 6f 20 64 6f 20 73 6f 6d 65 20 66  ave to do some f
fd50: 75 6e 6b 79 20 63 61 73 74 69 6e 67 20 69 6e 20  unky casting in 
fd60: 6f 72 64 65 72 20 74 6f 0a 20 20 2a 2a 20 69 6e  order to.  ** in
fd70: 69 74 69 61 6c 69 7a 65 20 74 68 6f 73 65 20 66  itialize those f
fd80: 69 65 6c 64 73 2e 0a 20 20 2a 2f 0a 20 20 70 49  ields..  */.  pI
fd90: 64 78 43 6f 6e 73 20 3d 20 28 73 74 72 75 63 74  dxCons = (struct
fda0: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63   sqlite3_index_c
fdb0: 6f 6e 73 74 72 61 69 6e 74 2a 29 26 70 49 64 78  onstraint*)&pIdx
fdc0: 49 6e 66 6f 5b 31 5d 3b 0a 20 20 70 49 64 78 4f  Info[1];.  pIdxO
fdd0: 72 64 65 72 42 79 20 3d 20 28 73 74 72 75 63 74  rderBy = (struct
fde0: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f   sqlite3_index_o
fdf0: 72 64 65 72 62 79 2a 29 26 70 49 64 78 43 6f 6e  rderby*)&pIdxCon
fe00: 73 5b 6e 54 65 72 6d 5d 3b 0a 20 20 70 55 73 61  s[nTerm];.  pUsa
fe10: 67 65 20 3d 20 28 73 74 72 75 63 74 20 73 71 6c  ge = (struct sql
fe20: 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
fe30: 72 61 69 6e 74 5f 75 73 61 67 65 2a 29 26 70 49  raint_usage*)&pI
fe40: 64 78 4f 72 64 65 72 42 79 5b 6e 4f 72 64 65 72  dxOrderBy[nOrder
fe50: 42 79 5d 3b 0a 20 20 2a 28 69 6e 74 2a 29 26 70  By];.  *(int*)&p
fe60: 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72  IdxInfo->nConstr
fe70: 61 69 6e 74 20 3d 20 6e 54 65 72 6d 3b 0a 20 20  aint = nTerm;.  
fe80: 2a 28 69 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f  *(int*)&pIdxInfo
fe90: 2d 3e 6e 4f 72 64 65 72 42 79 20 3d 20 6e 4f 72  ->nOrderBy = nOr
fea0: 64 65 72 42 79 3b 0a 20 20 2a 28 73 74 72 75 63  derBy;.  *(struc
feb0: 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  t sqlite3_index_
fec0: 63 6f 6e 73 74 72 61 69 6e 74 2a 2a 29 26 70 49  constraint**)&pI
fed0: 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61  dxInfo->aConstra
fee0: 69 6e 74 20 3d 20 70 49 64 78 43 6f 6e 73 3b 0a  int = pIdxCons;.
fef0: 20 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74    *(struct sqlit
ff00: 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62 79  e3_index_orderby
ff10: 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 4f  **)&pIdxInfo->aO
ff20: 72 64 65 72 42 79 20 3d 20 70 49 64 78 4f 72 64  rderBy = pIdxOrd
ff30: 65 72 42 79 3b 0a 20 20 2a 28 73 74 72 75 63 74  erBy;.  *(struct
ff40: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63   sqlite3_index_c
ff50: 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61 67 65 2a  onstraint_usage*
ff60: 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f  *)&pIdxInfo->aCo
ff70: 6e 73 74 72 61 69 6e 74 55 73 61 67 65 20 3d 0a  nstraintUsage =.
ff80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ff90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ffa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ffb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ffc0: 20 20 20 70 55 73 61 67 65 3b 0a 0a 20 20 66 6f     pUsage;..  fo
ffd0: 72 28 69 3d 6a 3d 30 2c 20 70 54 65 72 6d 3d 70  r(i=j=0, pTerm=p
ffe0: 57 43 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54  WC->a; i<pWC->nT
fff0: 65 72 6d 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b  erm; i++, pTerm+
10000 2b 29 7b 0a 20 20 20 20 75 38 20 6f 70 3b 0a 20  +){.    u8 op;. 
10010 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65     if( pTerm->le
10020 66 74 43 75 72 73 6f 72 20 21 3d 20 70 53 72 63  ftCursor != pSrc
10030 2d 3e 69 43 75 72 73 6f 72 20 29 20 63 6f 6e 74  ->iCursor ) cont
10040 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74  inue;.    assert
10050 28 20 49 73 50 6f 77 65 72 4f 66 54 77 6f 28 70  ( IsPowerOfTwo(p
10060 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
10070 26 20 7e 57 4f 5f 45 51 55 49 56 29 20 29 3b 0a  & ~WO_EQUIV) );.
10080 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
10090 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
100a0 20 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 74 65   WO_IN );.    te
100b0 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65  stcase( pTerm->e
100c0 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53  Operator & WO_IS
100d0 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 74 65 73 74  NULL );.    test
100e0 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70  case( pTerm->eOp
100f0 65 72 61 74 6f 72 20 26 20 57 4f 5f 41 4c 4c 20  erator & WO_ALL 
10100 29 3b 0a 20 20 20 20 69 66 28 20 28 70 54 65 72  );.    if( (pTer
10110 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 7e  m->eOperator & ~
10120 28 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 45 51  (WO_ISNULL|WO_EQ
10130 55 49 56 29 29 3d 3d 30 20 29 20 63 6f 6e 74 69  UIV))==0 ) conti
10140 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 54 65  nue;.    if( pTe
10150 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
10160 52 4d 5f 56 4e 55 4c 4c 20 29 20 63 6f 6e 74 69  RM_VNULL ) conti
10170 6e 75 65 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e  nue;.    pIdxCon
10180 73 5b 6a 5d 2e 69 43 6f 6c 75 6d 6e 20 3d 20 70  s[j].iColumn = p
10190 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75  Term->u.leftColu
101a0 6d 6e 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e 73  mn;.    pIdxCons
101b0 5b 6a 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74 20  [j].iTermOffset 
101c0 3d 20 69 3b 0a 20 20 20 20 6f 70 20 3d 20 28 75  = i;.    op = (u
101d0 38 29 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  8)pTerm->eOperat
101e0 6f 72 20 26 20 57 4f 5f 41 4c 4c 3b 0a 20 20 20  or & WO_ALL;.   
101f0 20 69 66 28 20 6f 70 3d 3d 57 4f 5f 49 4e 20 29   if( op==WO_IN )
10200 20 6f 70 20 3d 20 57 4f 5f 45 51 3b 0a 20 20 20   op = WO_EQ;.   
10210 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 6f 70 20   pIdxCons[j].op 
10220 3d 20 6f 70 3b 0a 20 20 20 20 2f 2a 20 54 68 65  = op;.    /* The
10230 20 64 69 72 65 63 74 20 61 73 73 69 67 6e 6d 65   direct assignme
10240 6e 74 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f  nt in the previo
10250 75 73 20 6c 69 6e 65 20 69 73 20 70 6f 73 73 69  us line is possi
10260 62 6c 65 20 6f 6e 6c 79 20 62 65 63 61 75 73 65  ble only because
10270 0a 20 20 20 20 2a 2a 20 74 68 65 20 57 4f 5f 20  .    ** the WO_ 
10280 61 6e 64 20 53 51 4c 49 54 45 5f 49 4e 44 45 58  and SQLITE_INDEX
10290 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 20 63 6f 64  _CONSTRAINT_ cod
102a0 65 73 20 61 72 65 20 69 64 65 6e 74 69 63 61 6c  es are identical
102b0 2e 20 20 54 68 65 0a 20 20 20 20 2a 2a 20 66 6f  .  The.    ** fo
102c0 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 73 20  llowing asserts 
102d0 76 65 72 69 66 79 20 74 68 69 73 20 66 61 63 74  verify this fact
102e0 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
102f0 20 57 4f 5f 45 51 3d 3d 53 51 4c 49 54 45 5f 49   WO_EQ==SQLITE_I
10300 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  NDEX_CONSTRAINT_
10310 45 51 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  EQ );.    assert
10320 28 20 57 4f 5f 4c 54 3d 3d 53 51 4c 49 54 45 5f  ( WO_LT==SQLITE_
10330 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54  INDEX_CONSTRAINT
10340 5f 4c 54 20 29 3b 0a 20 20 20 20 61 73 73 65 72  _LT );.    asser
10350 74 28 20 57 4f 5f 4c 45 3d 3d 53 51 4c 49 54 45  t( WO_LE==SQLITE
10360 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e  _INDEX_CONSTRAIN
10370 54 5f 4c 45 20 29 3b 0a 20 20 20 20 61 73 73 65  T_LE );.    asse
10380 72 74 28 20 57 4f 5f 47 54 3d 3d 53 51 4c 49 54  rt( WO_GT==SQLIT
10390 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49  E_INDEX_CONSTRAI
103a0 4e 54 5f 47 54 20 29 3b 0a 20 20 20 20 61 73 73  NT_GT );.    ass
103b0 65 72 74 28 20 57 4f 5f 47 45 3d 3d 53 51 4c 49  ert( WO_GE==SQLI
103c0 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41  TE_INDEX_CONSTRA
103d0 49 4e 54 5f 47 45 20 29 3b 0a 20 20 20 20 61 73  INT_GE );.    as
103e0 73 65 72 74 28 20 57 4f 5f 4d 41 54 43 48 3d 3d  sert( WO_MATCH==
103f0 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e  SQLITE_INDEX_CON
10400 53 54 52 41 49 4e 54 5f 4d 41 54 43 48 20 29 3b  STRAINT_MATCH );
10410 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65  .    assert( pTe
10420 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
10430 28 57 4f 5f 49 4e 7c 57 4f 5f 45 51 7c 57 4f 5f  (WO_IN|WO_EQ|WO_
10440 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c 57  LT|WO_LE|WO_GT|W
10450 4f 5f 47 45 7c 57 4f 5f 4d 41 54 43 48 29 20 29  O_GE|WO_MATCH) )
10460 3b 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20 7d 0a 20  ;.    j++;.  }. 
10470 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64   for(i=0; i<nOrd
10480 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  erBy; i++){.    
10490 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4f  Expr *pExpr = pO
104a0 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78  rderBy->a[i].pEx
104b0 70 72 3b 0a 20 20 20 20 70 49 64 78 4f 72 64 65  pr;.    pIdxOrde
104c0 72 42 79 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 20 3d  rBy[i].iColumn =
104d0 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b   pExpr->iColumn;
104e0 0a 20 20 20 20 70 49 64 78 4f 72 64 65 72 42 79  .    pIdxOrderBy
104f0 5b 69 5d 2e 64 65 73 63 20 3d 20 70 4f 72 64 65  [i].desc = pOrde
10500 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72  rBy->a[i].sortOr
10510 64 65 72 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  der;.  }..  retu
10520 72 6e 20 70 49 64 78 49 6e 66 6f 3b 0a 7d 0a 0a  rn pIdxInfo;.}..
10530 2f 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65 20  /*.** The table 
10540 6f 62 6a 65 63 74 20 72 65 66 65 72 65 6e 63 65  object reference
10550 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
10560 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74  econd argument t
10570 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  o this function.
10580 2a 2a 20 6d 75 73 74 20 72 65 70 72 65 73 65 6e  ** must represen
10590 74 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c  t a virtual tabl
105a0 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  e. This function
105b0 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 78 42 65   invokes the xBe
105c0 73 74 49 6e 64 65 78 28 29 0a 2a 2a 20 6d 65 74  stIndex().** met
105d0 68 6f 64 20 6f 66 20 74 68 65 20 76 69 72 74 75  hod of the virtu
105e0 61 6c 20 74 61 62 6c 65 20 77 69 74 68 20 74 68  al table with th
105f0 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  e sqlite3_index_
10600 69 6e 66 6f 20 6f 62 6a 65 63 74 20 74 68 61 74  info object that
10610 0a 2a 2a 20 63 6f 6d 65 73 20 69 6e 20 61 73 20  .** comes in as 
10620 74 68 65 20 33 72 64 20 61 72 67 75 6d 65 6e 74  the 3rd argument
10630 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
10640 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  n..**.** If an e
10650 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 70 50 61  rror occurs, pPa
10660 72 73 65 20 69 73 20 70 6f 70 75 6c 61 74 65 64  rse is populated
10670 20 77 69 74 68 20 61 6e 20 65 72 72 6f 72 20 6d   with an error m
10680 65 73 73 61 67 65 20 61 6e 64 20 61 0a 2a 2a 20  essage and a.** 
10690 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 69  non-zero value i
106a0 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
106b0 72 77 69 73 65 2c 20 30 20 69 73 20 72 65 74 75  rwise, 0 is retu
106c0 72 6e 65 64 20 61 6e 64 20 74 68 65 20 6f 75 74  rned and the out
106d0 70 75 74 0a 2a 2a 20 70 61 72 74 20 6f 66 20 74  put.** part of t
106e0 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  he sqlite3_index
106f0 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  _info structure 
10700 69 73 20 6c 65 66 74 20 70 6f 70 75 6c 61 74 65  is left populate
10710 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68 65 72  d..**.** Whether
10720 20 6f 72 20 6e 6f 74 20 61 6e 20 65 72 72 6f 72   or not an error
10730 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 69 74   is returned, it
10740 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69   is the responsi
10750 62 69 6c 69 74 79 20 6f 66 20 74 68 65 0a 2a 2a  bility of the.**
10760 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74   caller to event
10770 75 61 6c 6c 79 20 66 72 65 65 20 70 2d 3e 69 64  ually free p->id
10780 78 53 74 72 20 69 66 20 70 2d 3e 6e 65 65 64 54  xStr if p->needT
10790 6f 46 72 65 65 49 64 78 53 74 72 20 69 6e 64 69  oFreeIdxStr indi
107a0 63 61 74 65 73 0a 2a 2a 20 74 68 61 74 20 74 68  cates.** that th
107b0 69 73 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a  is is required..
107c0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 74  */.static int vt
107d0 61 62 42 65 73 74 49 6e 64 65 78 28 50 61 72 73  abBestIndex(Pars
107e0 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65  e *pParse, Table
107f0 20 2a 70 54 61 62 2c 20 73 71 6c 69 74 65 33 5f   *pTab, sqlite3_
10800 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a  index_info *p){.
10810 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a    sqlite3_vtab *
10820 70 56 74 61 62 20 3d 20 73 71 6c 69 74 65 33 47  pVtab = sqlite3G
10830 65 74 56 54 61 62 6c 65 28 70 50 61 72 73 65 2d  etVTable(pParse-
10840 3e 64 62 2c 20 70 54 61 62 29 2d 3e 70 56 74 61  >db, pTab)->pVta
10850 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  b;.  int i;.  in
10860 74 20 72 63 3b 0a 0a 20 20 54 52 41 43 45 5f 49  t rc;..  TRACE_I
10870 44 58 5f 49 4e 50 55 54 53 28 70 29 3b 0a 20 20  DX_INPUTS(p);.  
10880 72 63 20 3d 20 70 56 74 61 62 2d 3e 70 4d 6f 64  rc = pVtab->pMod
10890 75 6c 65 2d 3e 78 42 65 73 74 49 6e 64 65 78 28  ule->xBestIndex(
108a0 70 56 74 61 62 2c 20 70 29 3b 0a 20 20 54 52 41  pVtab, p);.  TRA
108b0 43 45 5f 49 44 58 5f 4f 55 54 50 55 54 53 28 70  CE_IDX_OUTPUTS(p
108c0 29 3b 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51  );..  if( rc!=SQ
108d0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
108e0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  f( rc==SQLITE_NO
108f0 4d 45 4d 20 29 7b 0a 20 20 20 20 20 20 70 50 61  MEM ){.      pPa
10900 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
10910 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d  ailed = 1;.    }
10920 65 6c 73 65 20 69 66 28 20 21 70 56 74 61 62 2d  else if( !pVtab-
10930 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20  >zErrMsg ){.    
10940 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
10950 67 28 70 50 61 72 73 65 2c 20 22 25 73 22 2c 20  g(pParse, "%s", 
10960 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 72 63  sqlite3ErrStr(rc
10970 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ));.    }else{. 
10980 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
10990 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25 73  rMsg(pParse, "%s
109a0 22 2c 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73  ", pVtab->zErrMs
109b0 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  g);.    }.  }.  
109c0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 56 74  sqlite3_free(pVt
109d0 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20  ab->zErrMsg);.  
109e0 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20 3d  pVtab->zErrMsg =
109f0 20 30 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20   0;..  for(i=0; 
10a00 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74  i<p->nConstraint
10a10 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
10a20 21 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b  !p->aConstraint[
10a30 69 5d 2e 75 73 61 62 6c 65 20 26 26 20 70 2d 3e  i].usable && p->
10a40 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65  aConstraintUsage
10a50 5b 69 5d 2e 61 72 67 76 49 6e 64 65 78 3e 30 20  [i].argvIndex>0 
10a60 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
10a70 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
10a80 20 0a 20 20 20 20 20 20 20 20 20 20 22 74 61 62   .          "tab
10a90 6c 65 20 25 73 3a 20 78 42 65 73 74 49 6e 64 65  le %s: xBestInde
10aa0 78 20 72 65 74 75 72 6e 65 64 20 61 6e 20 69 6e  x returned an in
10ab0 76 61 6c 69 64 20 70 6c 61 6e 22 2c 20 70 54 61  valid plan", pTa
10ac0 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  b->zName);.    }
10ad0 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70  .  }..  return p
10ae0 50 61 72 73 65 2d 3e 6e 45 72 72 3b 0a 7d 0a 23  Parse->nErr;.}.#
10af0 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
10b00 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
10b10 52 54 55 41 4c 54 41 42 4c 45 29 20 2a 2f 0a 0a  RTUALTABLE) */..
10b20 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
10b30 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54  ABLE_STAT3_OR_ST
10b40 41 54 34 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61  AT4./*.** Estima
10b50 74 65 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20  te the location 
10b60 6f 66 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  of a particular 
10b70 6b 65 79 20 61 6d 6f 6e 67 20 61 6c 6c 20 6b 65  key among all ke
10b80 79 73 20 69 6e 20 61 6e 0a 2a 2a 20 69 6e 64 65  ys in an.** inde
10b90 78 2e 20 20 53 74 6f 72 65 20 74 68 65 20 72 65  x.  Store the re
10ba0 73 75 6c 74 73 20 69 6e 20 61 53 74 61 74 20 61  sults in aStat a
10bb0 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
10bc0 20 20 20 20 61 53 74 61 74 5b 30 5d 20 20 20 20      aStat[0]    
10bd0 20 20 45 73 74 2e 20 6e 75 6d 62 65 72 20 6f 66    Est. number of
10be0 20 72 6f 77 73 20 6c 65 73 73 20 74 68 61 6e 20   rows less than 
10bf0 70 56 61 6c 0a 2a 2a 20 20 20 20 61 53 74 61 74  pVal.**    aStat
10c00 5b 31 5d 20 20 20 20 20 20 45 73 74 2e 20 6e 75  [1]      Est. nu
10c10 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 65 71 75  mber of rows equ
10c20 61 6c 20 74 6f 20 70 56 61 6c 0a 2a 2a 0a 2a 2a  al to pVal.**.**
10c30 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65   Return the inde
10c40 78 20 6f 66 20 74 68 65 20 73 61 6d 70 6c 65 20  x of the sample 
10c50 74 68 61 74 20 69 73 20 74 68 65 20 73 6d 61 6c  that is the smal
10c60 6c 65 73 74 20 73 61 6d 70 6c 65 20 74 68 61 74  lest sample that
10c70 0a 2a 2a 20 69 73 20 67 72 65 61 74 65 72 20 74  .** is greater t
10c80 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
10c90 70 52 65 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  pRec..*/.static 
10ca0 69 6e 74 20 77 68 65 72 65 4b 65 79 53 74 61 74  int whereKeyStat
10cb0 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  s(.  Parse *pPar
10cc0 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
10cd0 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
10ce0 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 49 6e 64  nection */.  Ind
10cf0 65 78 20 2a 70 49 64 78 2c 20 20 20 20 20 20 20  ex *pIdx,       
10d00 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
10d10 78 20 74 6f 20 63 6f 6e 73 69 64 65 72 20 64 6f  x to consider do
10d20 6d 61 69 6e 20 6f 66 20 2a 2f 0a 20 20 55 6e 70  main of */.  Unp
10d30 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 52 65  ackedRecord *pRe
10d40 63 2c 20 20 20 20 20 20 20 2f 2a 20 56 65 63 74  c,       /* Vect
10d50 6f 72 20 6f 66 20 76 61 6c 75 65 73 20 74 6f 20  or of values to 
10d60 63 6f 6e 73 69 64 65 72 20 2a 2f 0a 20 20 69 6e  consider */.  in
10d70 74 20 72 6f 75 6e 64 55 70 2c 20 20 20 20 20 20  t roundUp,      
10d80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 75            /* Rou
10d90 6e 64 20 75 70 20 69 66 20 74 72 75 65 2e 20 20  nd up if true.  
10da0 52 6f 75 6e 64 20 64 6f 77 6e 20 69 66 20 66 61  Round down if fa
10db0 6c 73 65 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74  lse */.  tRowcnt
10dc0 20 2a 61 53 74 61 74 20 20 20 20 20 20 20 20 20   *aStat         
10dd0 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 73 74 61       /* OUT: sta
10de0 74 73 20 77 72 69 74 74 65 6e 20 68 65 72 65 20  ts written here 
10df0 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 53 61 6d  */.){.  IndexSam
10e00 70 6c 65 20 2a 61 53 61 6d 70 6c 65 20 3d 20 70  ple *aSample = p
10e10 49 64 78 2d 3e 61 53 61 6d 70 6c 65 3b 0a 20 20  Idx->aSample;.  
10e20 69 6e 74 20 69 43 6f 6c 3b 20 20 20 20 20 20 20  int iCol;       
10e30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
10e40 6e 64 65 78 20 6f 66 20 72 65 71 75 69 72 65 64  ndex of required
10e50 20 73 74 61 74 73 20 69 6e 20 61 6e 45 71 5b 5d   stats in anEq[]
10e60 20 65 74 63 2e 20 2a 2f 0a 20 20 69 6e 74 20 69   etc. */.  int i
10e70 4d 69 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Min = 0;        
10e80 20 20 20 20 20 20 20 2f 2a 20 53 6d 61 6c 6c 65         /* Smalle
10e90 73 74 20 73 61 6d 70 6c 65 20 6e 6f 74 20 79 65  st sample not ye
10ea0 74 20 74 65 73 74 65 64 20 2a 2f 0a 20 20 69 6e  t tested */.  in
10eb0 74 20 69 20 3d 20 70 49 64 78 2d 3e 6e 53 61 6d  t i = pIdx->nSam
10ec0 70 6c 65 3b 20 20 20 20 20 20 2f 2a 20 53 6d 61  ple;      /* Sma
10ed0 6c 6c 65 73 74 20 73 61 6d 70 6c 65 20 6c 61 72  llest sample lar
10ee0 67 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ger than or equa
10ef0 6c 20 74 6f 20 70 52 65 63 20 2a 2f 0a 20 20 69  l to pRec */.  i
10f00 6e 74 20 69 54 65 73 74 3b 20 20 20 20 20 20 20  nt iTest;       
10f10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
10f20 78 74 20 73 61 6d 70 6c 65 20 74 6f 20 74 65 73  xt sample to tes
10f30 74 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73 3b 20  t */.  int res; 
10f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10f50 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 6f 66 20     /* Result of 
10f60 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61  comparison opera
10f70 74 69 6f 6e 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  tion */..#ifndef
10f80 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
10f90 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
10fa0 28 20 70 50 61 72 73 65 20 29 3b 0a 23 65 6e 64  ( pParse );.#end
10fb0 69 66 0a 20 20 61 73 73 65 72 74 28 20 70 52 65  if.  assert( pRe
10fc0 63 21 3d 30 20 29 3b 0a 20 20 69 43 6f 6c 20 3d  c!=0 );.  iCol =
10fd0 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 20 2d 20   pRec->nField - 
10fe0 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 64  1;.  assert( pId
10ff0 78 2d 3e 6e 53 61 6d 70 6c 65 3e 30 20 29 3b 0a  x->nSample>0 );.
11000 20 20 61 73 73 65 72 74 28 20 70 52 65 63 2d 3e    assert( pRec->
11010 6e 46 69 65 6c 64 3e 30 20 26 26 20 69 43 6f 6c  nField>0 && iCol
11020 3c 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 43 6f  <pIdx->nSampleCo
11030 6c 20 29 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 69  l );.  do{.    i
11040 54 65 73 74 20 3d 20 28 69 4d 69 6e 2b 69 29 2f  Test = (iMin+i)/
11050 32 3b 0a 20 20 20 20 72 65 73 20 3d 20 73 71 6c  2;.    res = sql
11060 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
11070 6d 70 61 72 65 28 61 53 61 6d 70 6c 65 5b 69 54  mpare(aSample[iT
11080 65 73 74 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b  est].n, aSample[
11090 69 54 65 73 74 5d 2e 70 2c 20 70 52 65 63 29 3b  iTest].p, pRec);
110a0 0a 20 20 20 20 69 66 28 20 72 65 73 3c 30 20 29  .    if( res<0 )
110b0 7b 0a 20 20 20 20 20 20 69 4d 69 6e 20 3d 20 69  {.      iMin = i
110c0 54 65 73 74 2b 31 3b 0a 20 20 20 20 7d 65 6c 73  Test+1;.    }els
110d0 65 7b 0a 20 20 20 20 20 20 69 20 3d 20 69 54 65  e{.      i = iTe
110e0 73 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69  st;.    }.  }whi
110f0 6c 65 28 20 72 65 73 20 26 26 20 69 4d 69 6e 3c  le( res && iMin<
11100 69 20 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  i );..#ifdef SQL
11110 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 54  ITE_DEBUG.  /* T
11120 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73  he following ass
11130 65 72 74 20 73 74 61 74 65 6d 65 6e 74 73 20 63  ert statements c
11140 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 62 69  heck that the bi
11150 6e 61 72 79 20 73 65 61 72 63 68 20 63 6f 64 65  nary search code
11160 0a 20 20 2a 2a 20 61 62 6f 76 65 20 66 6f 75 6e  .  ** above foun
11170 64 20 74 68 65 20 72 69 67 68 74 20 61 6e 73 77  d the right answ
11180 65 72 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20 73  er. This block s
11190 65 72 76 65 73 20 6e 6f 20 70 75 72 70 6f 73 65  erves no purpose
111a0 20 6f 74 68 65 72 0a 20 20 2a 2a 20 74 68 61 6e   other.  ** than
111b0 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20 61   to invoke the a
111c0 73 73 65 72 74 73 2e 20 20 2a 2f 0a 20 20 69 66  sserts.  */.  if
111d0 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20  ( res==0 ){.    
111e0 2f 2a 20 49 66 20 28 72 65 73 3d 3d 30 29 20 69  /* If (res==0) i
111f0 73 20 74 72 75 65 2c 20 74 68 65 6e 20 73 61 6d  s true, then sam
11200 70 6c 65 20 24 69 20 6d 75 73 74 20 62 65 20 65  ple $i must be e
11210 71 75 61 6c 20 74 6f 20 70 52 65 63 20 2a 2f 0a  qual to pRec */.
11220 20 20 20 20 61 73 73 65 72 74 28 20 69 3c 70 49      assert( i<pI
11230 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 29 3b 0a 20  dx->nSample );. 
11240 20 20 20 61 73 73 65 72 74 28 20 30 3d 3d 73 71     assert( 0==sq
11250 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
11260 6f 6d 70 61 72 65 28 61 53 61 6d 70 6c 65 5b 69  ompare(aSample[i
11270 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b 69 5d 2e  ].n, aSample[i].
11280 70 2c 20 70 52 65 63 29 0a 20 20 20 20 20 20 20  p, pRec).       
11290 20 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d    || pParse->db-
112a0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
112b0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
112c0 20 4f 74 68 65 72 77 69 73 65 2c 20 70 52 65 63   Otherwise, pRec
112d0 20 6d 75 73 74 20 62 65 20 73 6d 61 6c 6c 65 72   must be smaller
112e0 20 74 68 61 6e 20 73 61 6d 70 6c 65 20 24 69 20   than sample $i 
112f0 61 6e 64 20 6c 61 72 67 65 72 20 74 68 61 6e 0a  and larger than.
11300 20 20 20 20 2a 2a 20 73 61 6d 70 6c 65 20 28 24      ** sample ($
11310 69 2d 31 29 2e 20 20 2a 2f 0a 20 20 20 20 61 73  i-1).  */.    as
11320 73 65 72 74 28 20 69 3d 3d 70 49 64 78 2d 3e 6e  sert( i==pIdx->n
11330 53 61 6d 70 6c 65 20 0a 20 20 20 20 20 20 20 20  Sample .        
11340 20 7c 7c 20 73 71 6c 69 74 65 33 56 64 62 65 52   || sqlite3VdbeR
11350 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 61 53 61  ecordCompare(aSa
11360 6d 70 6c 65 5b 69 5d 2e 6e 2c 20 61 53 61 6d 70  mple[i].n, aSamp
11370 6c 65 5b 69 5d 2e 70 2c 20 70 52 65 63 29 3e 30  le[i].p, pRec)>0
11380 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61  .         || pPa
11390 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
113a0 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 61 73 73  ailed );.    ass
113b0 65 72 74 28 20 69 3d 3d 30 0a 20 20 20 20 20 20  ert( i==0.      
113c0 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 56 64 62     || sqlite3Vdb
113d0 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 61  eRecordCompare(a
113e0 53 61 6d 70 6c 65 5b 69 2d 31 5d 2e 6e 2c 20 61  Sample[i-1].n, a
113f0 53 61 6d 70 6c 65 5b 69 2d 31 5d 2e 70 2c 20 70  Sample[i-1].p, p
11400 52 65 63 29 3c 30 0a 20 20 20 20 20 20 20 20 20  Rec)<0.         
11410 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  || pParse->db->m
11420 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
11430 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 69 66 64   }.#endif /* ifd
11440 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  ef SQLITE_DEBUG 
11450 2a 2f 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73  */..  /* At this
11460 20 70 6f 69 6e 74 2c 20 61 53 61 6d 70 6c 65 5b   point, aSample[
11470 69 5d 20 69 73 20 74 68 65 20 66 69 72 73 74 20  i] is the first 
11480 73 61 6d 70 6c 65 20 74 68 61 74 20 69 73 20 67  sample that is g
11490 72 65 61 74 65 72 20 74 68 61 6e 0a 20 20 2a 2a  reater than.  **
114a0 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 70 56 61   or equal to pVa
114b0 6c 2e 20 20 4f 72 20 69 66 20 69 3d 3d 70 49 64  l.  Or if i==pId
114c0 78 2d 3e 6e 53 61 6d 70 6c 65 2c 20 74 68 65 6e  x->nSample, then
114d0 20 61 6c 6c 20 73 61 6d 70 6c 65 73 20 61 72 65   all samples are
114e0 20 6c 65 73 73 0a 20 20 2a 2a 20 74 68 61 6e 20   less.  ** than 
114f0 70 56 61 6c 2e 20 20 49 66 20 61 53 61 6d 70 6c  pVal.  If aSampl
11500 65 5b 69 5d 3d 3d 70 56 61 6c 2c 20 74 68 65 6e  e[i]==pVal, then
11510 20 72 65 73 3d 3d 30 2e 0a 20 20 2a 2f 0a 20 20   res==0..  */.  
11520 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20  if( res==0 ){.  
11530 20 20 61 53 74 61 74 5b 30 5d 20 3d 20 61 53 61    aStat[0] = aSa
11540 6d 70 6c 65 5b 69 5d 2e 61 6e 4c 74 5b 69 43 6f  mple[i].anLt[iCo
11550 6c 5d 3b 0a 20 20 20 20 61 53 74 61 74 5b 31 5d  l];.    aStat[1]
11560 20 3d 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 61 6e   = aSample[i].an
11570 45 71 5b 69 43 6f 6c 5d 3b 0a 20 20 7d 65 6c 73  Eq[iCol];.  }els
11580 65 7b 0a 20 20 20 20 74 52 6f 77 63 6e 74 20 69  e{.    tRowcnt i
11590 4c 6f 77 65 72 2c 20 69 55 70 70 65 72 2c 20 69  Lower, iUpper, i
115a0 47 61 70 3b 0a 20 20 20 20 69 66 28 20 69 3d 3d  Gap;.    if( i==
115b0 30 20 29 7b 0a 20 20 20 20 20 20 69 4c 6f 77 65  0 ){.      iLowe
115c0 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 55 70  r = 0;.      iUp
115d0 70 65 72 20 3d 20 61 53 61 6d 70 6c 65 5b 30 5d  per = aSample[0]
115e0 2e 61 6e 4c 74 5b 69 43 6f 6c 5d 3b 0a 20 20 20  .anLt[iCol];.   
115f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 36   }else{.      i6
11600 34 20 6e 52 6f 77 30 20 3d 20 73 71 6c 69 74 65  4 nRow0 = sqlite
11610 33 4c 6f 67 45 73 74 54 6f 49 6e 74 28 70 49 64  3LogEstToInt(pId
11620 78 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 30  x->aiRowLogEst[0
11630 5d 29 3b 0a 20 20 20 20 20 20 69 55 70 70 65 72  ]);.      iUpper
11640 20 3d 20 69 3e 3d 70 49 64 78 2d 3e 6e 53 61 6d   = i>=pIdx->nSam
11650 70 6c 65 20 3f 20 6e 52 6f 77 30 20 3a 20 61 53  ple ? nRow0 : aS
11660 61 6d 70 6c 65 5b 69 5d 2e 61 6e 4c 74 5b 69 43  ample[i].anLt[iC
11670 6f 6c 5d 3b 0a 20 20 20 20 20 20 69 4c 6f 77 65  ol];.      iLowe
11680 72 20 3d 20 61 53 61 6d 70 6c 65 5b 69 2d 31 5d  r = aSample[i-1]
11690 2e 61 6e 45 71 5b 69 43 6f 6c 5d 20 2b 20 61 53  .anEq[iCol] + aS
116a0 61 6d 70 6c 65 5b 69 2d 31 5d 2e 61 6e 4c 74 5b  ample[i-1].anLt[
116b0 69 43 6f 6c 5d 3b 0a 20 20 20 20 7d 0a 20 20 20  iCol];.    }.   
116c0 20 61 53 74 61 74 5b 31 5d 20 3d 20 70 49 64 78   aStat[1] = pIdx
116d0 2d 3e 61 41 76 67 45 71 5b 69 43 6f 6c 5d 3b 0a  ->aAvgEq[iCol];.
116e0 20 20 20 20 69 66 28 20 69 4c 6f 77 65 72 3e 3d      if( iLower>=
116f0 69 55 70 70 65 72 20 29 7b 0a 20 20 20 20 20 20  iUpper ){.      
11700 69 47 61 70 20 3d 20 30 3b 0a 20 20 20 20 7d 65  iGap = 0;.    }e
11710 6c 73 65 7b 0a 20 20 20 20 20 20 69 47 61 70 20  lse{.      iGap 
11720 3d 20 69 55 70 70 65 72 20 2d 20 69 4c 6f 77 65  = iUpper - iLowe
11730 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  r;.    }.    if(
11740 20 72 6f 75 6e 64 55 70 20 29 7b 0a 20 20 20 20   roundUp ){.    
11750 20 20 69 47 61 70 20 3d 20 28 69 47 61 70 2a 32    iGap = (iGap*2
11760 29 2f 33 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  )/3;.    }else{.
11770 20 20 20 20 20 20 69 47 61 70 20 3d 20 69 47 61        iGap = iGa
11780 70 2f 33 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  p/3;.    }.    a
11790 53 74 61 74 5b 30 5d 20 3d 20 69 4c 6f 77 65 72  Stat[0] = iLower
117a0 20 2b 20 69 47 61 70 3b 0a 20 20 7d 0a 20 20 72   + iGap;.  }.  r
117b0 65 74 75 72 6e 20 69 3b 0a 7d 0a 23 65 6e 64 69  eturn i;.}.#endi
117c0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42  f /* SQLITE_ENAB
117d0 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54  LE_STAT3_OR_STAT
117e0 34 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 69  4 */../*.** If i
117f0 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 70  t is not NULL, p
11800 54 65 72 6d 20 69 73 20 61 20 74 65 72 6d 20 74  Term is a term t
11810 68 61 74 20 70 72 6f 76 69 64 65 73 20 61 6e 20  hat provides an 
11820 75 70 70 65 72 20 6f 72 20 6c 6f 77 65 72 0a 2a  upper or lower.*
11830 2a 20 62 6f 75 6e 64 20 6f 6e 20 61 20 72 61 6e  * bound on a ran
11840 67 65 20 73 63 61 6e 2e 20 57 69 74 68 6f 75 74  ge scan. Without
11850 20 63 6f 6e 73 69 64 65 72 69 6e 67 20 70 54 65   considering pTe
11860 72 6d 2c 20 69 74 20 69 73 20 65 73 74 69 6d 61  rm, it is estima
11870 74 65 64 20 0a 2a 2a 20 74 68 61 74 20 74 68 65  ted .** that the
11880 20 73 63 61 6e 20 77 69 6c 6c 20 76 69 73 69 74   scan will visit
11890 20 6e 4e 65 77 20 72 6f 77 73 2e 20 54 68 69 73   nNew rows. This
118a0 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
118b0 73 20 74 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20  s the number.** 
118c0 65 73 74 69 6d 61 74 65 64 20 74 6f 20 62 65 20  estimated to be 
118d0 76 69 73 69 74 65 64 20 61 66 74 65 72 20 74 61  visited after ta
118e0 6b 69 6e 67 20 70 54 65 72 6d 20 69 6e 74 6f 20  king pTerm into 
118f0 61 63 63 6f 75 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49  account..**.** I
11900 66 20 74 68 65 20 75 73 65 72 20 65 78 70 6c 69  f the user expli
11910 63 69 74 6c 79 20 73 70 65 63 69 66 69 65 64 20  citly specified 
11920 61 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 29 20 76  a likelihood() v
11930 61 6c 75 65 20 66 6f 72 20 74 68 69 73 20 74 65  alue for this te
11940 72 6d 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20  rm,.** then the 
11950 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20  return value is 
11960 74 68 65 20 6c 69 6b 65 6c 69 68 6f 6f 64 20 6d  the likelihood m
11970 75 6c 74 69 70 6c 69 65 64 20 62 79 20 74 68 65  ultiplied by the
11980 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 69 6e   number of.** in
11990 70 75 74 20 72 6f 77 73 2e 20 4f 74 68 65 72 77  put rows. Otherw
119a0 69 73 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ise, this functi
119b0 6f 6e 20 61 73 73 75 6d 65 73 20 74 68 61 74 20  on assumes that 
119c0 61 6e 20 22 49 53 20 4e 4f 54 20 4e 55 4c 4c 22  an "IS NOT NULL"
119d0 20 74 65 72 6d 0a 2a 2a 20 68 61 73 20 61 20 6c   term.** has a l
119e0 69 6b 65 6c 69 68 6f 6f 64 20 6f 66 20 30 2e 35  ikelihood of 0.5
119f0 30 2c 20 61 6e 64 20 61 6e 79 20 6f 74 68 65 72  0, and any other
11a00 20 74 65 72 6d 20 61 20 6c 69 6b 65 6c 69 68 6f   term a likeliho
11a10 6f 64 20 6f 66 20 30 2e 32 35 2e 0a 2a 2f 0a 73  od of 0.25..*/.s
11a20 74 61 74 69 63 20 4c 6f 67 45 73 74 20 77 68 65  tatic LogEst whe
11a30 72 65 52 61 6e 67 65 41 64 6a 75 73 74 28 57 68  reRangeAdjust(Wh
11a40 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20  ereTerm *pTerm, 
11a50 4c 6f 67 45 73 74 20 6e 4e 65 77 29 7b 0a 20 20  LogEst nNew){.  
11a60 4c 6f 67 45 73 74 20 6e 52 65 74 20 3d 20 6e 4e  LogEst nRet = nN
11a70 65 77 3b 0a 20 20 69 66 28 20 70 54 65 72 6d 20  ew;.  if( pTerm 
11a80 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d  ){.    if( pTerm
11a90 2d 3e 74 72 75 74 68 50 72 6f 62 3c 3d 30 20 29  ->truthProb<=0 )
11aa0 7b 0a 20 20 20 20 20 20 6e 52 65 74 20 2b 3d 20  {.      nRet += 
11ab0 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62  pTerm->truthProb
11ac0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
11ad0 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20  (pTerm->wtFlags 
11ae0 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30  & TERM_VNULL)==0
11af0 20 29 7b 0a 20 20 20 20 20 20 6e 52 65 74 20 2d   ){.      nRet -
11b00 3d 20 32 30 3b 20 20 20 20 20 20 20 20 61 73 73  = 20;        ass
11b10 65 72 74 28 20 32 30 3d 3d 73 71 6c 69 74 65 33  ert( 20==sqlite3
11b20 4c 6f 67 45 73 74 28 34 29 20 29 3b 0a 20 20 20  LogEst(4) );.   
11b30 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
11b40 6e 52 65 74 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  nRet;.}..#ifdef 
11b50 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
11b60 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 2f 2a 20  AT3_OR_STAT4./* 
11b70 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
11b80 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 65  n is called to e
11b90 73 74 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62  stimate the numb
11ba0 65 72 20 6f 66 20 72 6f 77 73 20 76 69 73 69 74  er of rows visit
11bb0 65 64 20 62 79 20 61 0a 2a 2a 20 72 61 6e 67 65  ed by a.** range
11bc0 2d 73 63 61 6e 20 6f 6e 20 61 20 73 6b 69 70 2d  -scan on a skip-
11bd0 73 63 61 6e 20 69 6e 64 65 78 2e 20 46 6f 72 20  scan index. For 
11be0 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20  example:.**.**  
11bf0 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 31   CREATE INDEX i1
11c00 20 4f 4e 20 74 31 28 61 2c 20 62 2c 20 63 29 3b   ON t1(a, b, c);
11c10 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a 20 46  .**   SELECT * F
11c20 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3d 3f  ROM t1 WHERE a=?
11c30 20 41 4e 44 20 63 20 42 45 54 57 45 45 4e 20 3f   AND c BETWEEN ?
11c40 20 41 4e 44 20 3f 3b 0a 2a 2a 0a 2a 2a 20 56 61   AND ?;.**.** Va
11c50 6c 75 65 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20  lue pLoop->nOut 
11c60 69 73 20 63 75 72 72 65 6e 74 6c 79 20 73 65 74  is currently set
11c70 20 74 6f 20 74 68 65 20 65 73 74 69 6d 61 74 65   to the estimate
11c80 64 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  d number of rows
11c90 20 0a 2a 2a 20 76 69 73 69 74 65 64 20 66 6f 72   .** visited for
11ca0 20 73 63 61 6e 6e 69 6e 67 20 28 61 3d 3f 20 41   scanning (a=? A
11cb0 4e 44 20 62 3d 3f 29 2e 20 54 68 69 73 20 66 75  ND b=?). This fu
11cc0 6e 63 74 69 6f 6e 20 72 65 64 75 63 65 73 20 74  nction reduces t
11cd0 68 61 74 20 65 73 74 69 6d 61 74 65 20 0a 2a 2a  hat estimate .**
11ce0 20 62 79 20 73 6f 6d 65 20 66 61 63 74 6f 72 20   by some factor 
11cf0 74 6f 20 61 63 63 6f 75 6e 74 20 66 6f 72 20 74  to account for t
11d00 68 65 20 28 63 20 42 45 54 57 45 45 4e 20 3f 20  he (c BETWEEN ? 
11d10 41 4e 44 20 3f 29 20 65 78 70 72 65 73 73 69 6f  AND ?) expressio
11d20 6e 20 62 61 73 65 64 0a 2a 2a 20 6f 6e 20 74 68  n based.** on th
11d30 65 20 73 74 61 74 34 20 64 61 74 61 20 66 6f 72  e stat4 data for
11d40 20 74 68 65 20 69 6e 64 65 78 2e 20 74 68 69 73   the index. this
11d50 20 73 63 61 6e 20 77 69 6c 6c 20 62 65 20 70 65   scan will be pe
11d60 66 6f 72 6d 65 64 20 6d 75 6c 74 69 70 6c 65 20  formed multiple 
11d70 0a 2a 2a 20 74 69 6d 65 73 20 28 6f 6e 63 65 20  .** times (once 
11d80 66 6f 72 20 65 61 63 68 20 28 61 2c 62 29 20 63  for each (a,b) c
11d90 6f 6d 62 69 6e 61 74 69 6f 6e 20 74 68 61 74 20  ombination that 
11da0 6d 61 74 63 68 65 73 20 61 3d 3f 29 20 69 73 20  matches a=?) is 
11db0 64 65 61 6c 74 20 77 69 74 68 20 0a 2a 2a 20 62  dealt with .** b
11dc0 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a  y the caller..**
11dd0 0a 2a 2a 20 49 74 20 64 6f 65 73 20 74 68 69 73  .** It does this
11de0 20 62 79 20 73 63 61 6e 6e 69 6e 67 20 74 68 72   by scanning thr
11df0 6f 75 67 68 20 61 6c 6c 20 73 74 61 74 34 20 73  ough all stat4 s
11e00 61 6d 70 6c 65 73 2c 20 63 6f 6d 70 61 72 69 6e  amples, comparin
11e10 67 20 76 61 6c 75 65 73 0a 2a 2a 20 65 78 74 72  g values.** extr
11e20 61 63 74 65 64 20 66 72 6f 6d 20 70 4c 6f 77 65  acted from pLowe
11e30 72 20 61 6e 64 20 70 55 70 70 65 72 20 77 69 74  r and pUpper wit
11e40 68 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  h the correspond
11e50 69 6e 67 20 63 6f 6c 75 6d 6e 20 69 6e 20 65 61  ing column in ea
11e60 63 68 0a 2a 2a 20 73 61 6d 70 6c 65 2e 20 49 66  ch.** sample. If
11e70 20 4c 20 61 6e 64 20 55 20 61 72 65 20 74 68 65   L and U are the
11e80 20 6e 75 6d 62 65 72 20 6f 66 20 73 61 6d 70 6c   number of sampl
11e90 65 73 20 66 6f 75 6e 64 20 74 6f 20 62 65 20 6c  es found to be l
11ea0 65 73 73 20 74 68 61 6e 20 6f 72 0a 2a 2a 20 65  ess than or.** e
11eb0 71 75 61 6c 20 74 6f 20 74 68 65 20 76 61 6c 75  qual to the valu
11ec0 65 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  es extracted fro
11ed0 6d 20 70 4c 6f 77 65 72 20 61 6e 64 20 70 55 70  m pLower and pUp
11ee0 70 65 72 20 72 65 73 70 65 63 74 69 76 65 6c 79  per respectively
11ef0 2c 20 61 6e 64 0a 2a 2a 20 4e 20 69 73 20 74 68  , and.** N is th
11f00 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
11f10 66 20 73 61 6d 70 6c 65 73 2c 20 74 68 65 20 70  f samples, the p
11f20 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 76 61 6c 75 65  Loop->nOut value
11f30 20 69 73 20 61 64 6a 75 73 74 65 64 0a 2a 2a 20   is adjusted.** 
11f40 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
11f50 2a 20 20 20 6e 4f 75 74 20 3d 20 6e 4f 75 74 20  *   nOut = nOut 
11f60 2a 20 28 20 6d 69 6e 28 55 20 2d 20 4c 2c 20 31  * ( min(U - L, 1
11f70 29 20 2f 20 4e 20 29 0a 2a 2a 0a 2a 2a 20 49 66  ) / N ).**.** If
11f80 20 70 4c 6f 77 65 72 20 69 73 20 4e 55 4c 4c 2c   pLower is NULL,
11f90 20 6f 72 20 61 20 76 61 6c 75 65 20 63 61 6e 6e   or a value cann
11fa0 6f 74 20 62 65 20 65 78 74 72 61 63 74 65 64 20  ot be extracted 
11fb0 66 72 6f 6d 20 74 68 65 20 74 65 72 6d 2c 20 4c  from the term, L
11fc0 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 7a 65   is.** set to ze
11fd0 72 6f 2e 20 49 66 20 70 55 70 70 65 72 20 69 73  ro. If pUpper is
11fe0 20 4e 55 4c 4c 2c 20 6f 72 20 61 20 76 61 6c 75   NULL, or a valu
11ff0 65 20 63 61 6e 6e 6f 74 20 62 65 20 65 78 74 72  e cannot be extr
12000 61 63 74 65 64 20 66 72 6f 6d 20 69 74 2c 0a 2a  acted from it,.*
12010 2a 20 55 20 69 73 20 73 65 74 20 74 6f 20 4e 2e  * U is set to N.
12020 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c  .**.** Normally,
12030 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73   this function s
12040 65 74 73 20 2a 70 62 44 6f 6e 65 20 74 6f 20 31  ets *pbDone to 1
12050 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
12060 67 2e 20 48 6f 77 65 76 65 72 2c 0a 2a 2a 20 69  g. However,.** i
12070 66 20 6e 6f 20 76 61 6c 75 65 20 63 61 6e 20 62  f no value can b
12080 65 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  e extracted from
12090 20 65 69 74 68 65 72 20 70 4c 6f 77 65 72 20 6f   either pLower o
120a0 72 20 70 55 70 70 65 72 20 28 61 6e 64 20 73 6f  r pUpper (and so
120b0 20 74 68 65 0a 2a 2a 20 65 73 74 69 6d 61 74 65   the.** estimate
120c0 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   of the number o
120d0 66 20 72 6f 77 73 20 64 65 6c 69 76 65 72 65 64  f rows delivered
120e0 20 72 65 6d 61 69 6e 73 20 75 6e 63 68 61 6e 67   remains unchang
120f0 65 64 29 2c 20 2a 70 62 44 6f 6e 65 0a 2a 2a 20  ed), *pbDone.** 
12100 69 73 20 6c 65 66 74 20 61 73 20 69 73 2e 0a 2a  is left as is..*
12110 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
12120 20 6f 63 63 75 72 73 2c 20 61 6e 20 53 51 4c 69   occurs, an SQLi
12130 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  te error code is
12140 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72   returned. Other
12150 77 69 73 65 2c 20 0a 2a 2a 20 53 51 4c 49 54 45  wise, .** SQLITE
12160 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  _OK..*/.static i
12170 6e 74 20 77 68 65 72 65 52 61 6e 67 65 53 6b 69  nt whereRangeSki
12180 70 53 63 61 6e 45 73 74 28 0a 20 20 50 61 72 73  pScanEst(.  Pars
12190 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
121a0 20 2f 2a 20 50 61 72 73 69 6e 67 20 26 20 63 6f   /* Parsing & co
121b0 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f  de generating co
121c0 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65  ntext */.  Where
121d0 54 65 72 6d 20 2a 70 4c 6f 77 65 72 2c 20 20 20  Term *pLower,   
121e0 2f 2a 20 4c 6f 77 65 72 20 62 6f 75 6e 64 20 6f  /* Lower bound o
121f0 6e 20 74 68 65 20 72 61 6e 67 65 2e 20 65 78 3a  n the range. ex:
12200 20 22 78 3e 31 32 33 22 20 4d 69 67 68 74 20 62   "x>123" Might b
12210 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68 65 72  e NULL */.  Wher
12220 65 54 65 72 6d 20 2a 70 55 70 70 65 72 2c 20 20  eTerm *pUpper,  
12230 20 2f 2a 20 55 70 70 65 72 20 62 6f 75 6e 64 20   /* Upper bound 
12240 6f 6e 20 74 68 65 20 72 61 6e 67 65 2e 20 65 78  on the range. ex
12250 3a 20 22 78 3c 34 35 35 22 20 4d 69 67 68 74 20  : "x<455" Might 
12260 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68 65  be NULL */.  Whe
12270 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 2c 20 20  reLoop *pLoop,  
12280 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20    /* Update the 
12290 2e 6e 4f 75 74 20 76 61 6c 75 65 20 6f 66 20 74  .nOut value of t
122a0 68 69 73 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e  his loop */.  in
122b0 74 20 2a 70 62 44 6f 6e 65 20 20 20 20 20 20 20  t *pbDone       
122c0 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 74 72 75     /* Set to tru
122d0 65 20 69 66 20 61 74 20 6c 65 61 73 74 20 6f 6e  e if at least on
122e0 65 20 65 78 70 72 2e 20 76 61 6c 75 65 20 65 78  e expr. value ex
122f0 74 72 61 63 74 65 64 20 2a 2f 0a 29 7b 0a 20 20  tracted */.){.  
12300 49 6e 64 65 78 20 2a 70 20 3d 20 70 4c 6f 6f 70  Index *p = pLoop
12310 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
12320 3b 0a 20 20 69 6e 74 20 6e 45 71 20 3d 20 70 4c  ;.  int nEq = pL
12330 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  oop->u.btree.nEq
12340 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
12350 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
12360 69 6e 74 20 6e 4c 6f 77 65 72 20 3d 20 2d 31 3b  int nLower = -1;
12370 0a 20 20 69 6e 74 20 6e 55 70 70 65 72 20 3d 20  .  int nUpper = 
12380 70 2d 3e 6e 53 61 6d 70 6c 65 2b 31 3b 0a 20 20  p->nSample+1;.  
12390 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
123a0 4f 4b 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 20 3d  OK;.  int iCol =
123b0 20 70 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 45 71   p->aiColumn[nEq
123c0 5d 3b 0a 20 20 75 38 20 61 66 66 20 3d 20 69 43  ];.  u8 aff = iC
123d0 6f 6c 3e 3d 30 20 3f 20 70 2d 3e 70 54 61 62 6c  ol>=0 ? p->pTabl
123e0 65 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 61 66  e->aCol[iCol].af
123f0 66 69 6e 69 74 79 20 3a 20 53 51 4c 49 54 45 5f  finity : SQLITE_
12400 41 46 46 5f 49 4e 54 45 47 45 52 3b 0a 20 20 43  AFF_INTEGER;.  C
12410 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20  ollSeq *pColl;. 
12420 20 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75   .  sqlite3_valu
12430 65 20 2a 70 31 20 3d 20 30 3b 20 20 20 20 20 20  e *p1 = 0;      
12440 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 65 78 74      /* Value ext
12450 72 61 63 74 65 64 20 66 72 6f 6d 20 70 4c 6f 77  racted from pLow
12460 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  er */.  sqlite3_
12470 76 61 6c 75 65 20 2a 70 32 20 3d 20 30 3b 20 20  value *p2 = 0;  
12480 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
12490 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
124a0 70 55 70 70 65 72 20 2a 2f 0a 20 20 73 71 6c 69  pUpper */.  sqli
124b0 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 20  te3_value *pVal 
124c0 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 56  = 0;        /* V
124d0 61 6c 75 65 20 65 78 74 72 61 63 74 65 64 20 66  alue extracted f
124e0 72 6f 6d 20 72 65 63 6f 72 64 20 2a 2f 0a 0a 20  rom record */.. 
124f0 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
12500 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 70 50  LocateCollSeq(pP
12510 61 72 73 65 2c 20 70 2d 3e 61 7a 43 6f 6c 6c 5b  arse, p->azColl[
12520 6e 45 71 5d 29 3b 0a 20 20 69 66 28 20 70 4c 6f  nEq]);.  if( pLo
12530 77 65 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  wer ){.    rc = 
12540 73 71 6c 69 74 65 33 53 74 61 74 34 56 61 6c 75  sqlite3Stat4Valu
12550 65 46 72 6f 6d 45 78 70 72 28 70 50 61 72 73 65  eFromExpr(pParse
12560 2c 20 70 4c 6f 77 65 72 2d 3e 70 45 78 70 72 2d  , pLower->pExpr-
12570 3e 70 52 69 67 68 74 2c 20 61 66 66 2c 20 26 70  >pRight, aff, &p
12580 31 29 3b 0a 20 20 20 20 6e 4c 6f 77 65 72 20 3d  1);.    nLower =
12590 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 55   0;.  }.  if( pU
125a0 70 70 65 72 20 26 26 20 72 63 3d 3d 53 51 4c 49  pper && rc==SQLI
125b0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
125c0 3d 20 73 71 6c 69 74 65 33 53 74 61 74 34 56 61  = sqlite3Stat4Va
125d0 6c 75 65 46 72 6f 6d 45 78 70 72 28 70 50 61 72  lueFromExpr(pPar
125e0 73 65 2c 20 70 55 70 70 65 72 2d 3e 70 45 78 70  se, pUpper->pExp
125f0 72 2d 3e 70 52 69 67 68 74 2c 20 61 66 66 2c 20  r->pRight, aff, 
12600 26 70 32 29 3b 0a 20 20 20 20 6e 55 70 70 65 72  &p2);.    nUpper
12610 20 3d 20 70 32 20 3f 20 30 20 3a 20 70 2d 3e 6e   = p2 ? 0 : p->n
12620 53 61 6d 70 6c 65 3b 0a 20 20 7d 0a 0a 20 20 69  Sample;.  }..  i
12630 66 28 20 70 31 20 7c 7c 20 70 32 20 29 7b 0a 20  f( p1 || p2 ){. 
12640 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e     int i;.    in
12650 74 20 6e 44 69 66 66 3b 0a 20 20 20 20 66 6f 72  t nDiff;.    for
12660 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45  (i=0; rc==SQLITE
12670 5f 4f 4b 20 26 26 20 69 3c 70 2d 3e 6e 53 61 6d  _OK && i<p->nSam
12680 70 6c 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ple; i++){.     
12690 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 74 61   rc = sqlite3Sta
126a0 74 34 43 6f 6c 75 6d 6e 28 64 62 2c 20 70 2d 3e  t4Column(db, p->
126b0 61 53 61 6d 70 6c 65 5b 69 5d 2e 70 2c 20 70 2d  aSample[i].p, p-
126c0 3e 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e 2c 20 6e  >aSample[i].n, n
126d0 45 71 2c 20 26 70 56 61 6c 29 3b 0a 20 20 20 20  Eq, &pVal);.    
126e0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
126f0 5f 4f 4b 20 26 26 20 70 31 20 29 7b 0a 20 20 20  _OK && p1 ){.   
12700 20 20 20 20 20 69 6e 74 20 72 65 73 20 3d 20 73       int res = s
12710 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65  qlite3MemCompare
12720 28 70 31 2c 20 70 56 61 6c 2c 20 70 43 6f 6c 6c  (p1, pVal, pColl
12730 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
12740 65 73 3e 3d 30 20 29 20 6e 4c 6f 77 65 72 2b 2b  es>=0 ) nLower++
12750 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
12760 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
12770 4b 20 26 26 20 70 32 20 29 7b 0a 20 20 20 20 20  K && p2 ){.     
12780 20 20 20 69 6e 74 20 72 65 73 20 3d 20 73 71 6c     int res = sql
12790 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 70  ite3MemCompare(p
127a0 32 2c 20 70 56 61 6c 2c 20 70 43 6f 6c 6c 29 3b  2, pVal, pColl);
127b0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 65 73  .        if( res
127c0 3e 3d 30 20 29 20 6e 55 70 70 65 72 2b 2b 3b 0a  >=0 ) nUpper++;.
127d0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
127e0 20 20 6e 44 69 66 66 20 3d 20 28 6e 55 70 70 65    nDiff = (nUppe
127f0 72 20 2d 20 6e 4c 6f 77 65 72 29 3b 0a 20 20 20  r - nLower);.   
12800 20 69 66 28 20 6e 44 69 66 66 3c 3d 30 20 29 20   if( nDiff<=0 ) 
12810 6e 44 69 66 66 20 3d 20 31 3b 0a 0a 20 20 20 20  nDiff = 1;..    
12820 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 62  /* If there is b
12830 6f 74 68 20 61 6e 20 75 70 70 65 72 20 61 6e 64  oth an upper and
12840 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20 73 70 65   lower bound spe
12850 63 69 66 69 65 64 2c 20 61 6e 64 20 74 68 65 20  cified, and the 
12860 0a 20 20 20 20 2a 2a 20 63 6f 6d 70 61 72 69 73  .    ** comparis
12870 6f 6e 73 20 69 6e 64 69 63 61 74 65 20 74 68 61  ons indicate tha
12880 74 20 74 68 65 79 20 61 72 65 20 63 6c 6f 73 65  t they are close
12890 20 74 6f 67 65 74 68 65 72 2c 20 75 73 65 20 74   together, use t
128a0 68 65 20 66 61 6c 6c 62 61 63 6b 0a 20 20 20 20  he fallback.    
128b0 2a 2a 20 6d 65 74 68 6f 64 20 28 61 73 73 75 6d  ** method (assum
128c0 65 20 74 68 61 74 20 74 68 65 20 73 63 61 6e 20  e that the scan 
128d0 76 69 73 69 74 73 20 31 2f 36 34 20 6f 66 20 74  visits 1/64 of t
128e0 68 65 20 72 6f 77 73 29 20 66 6f 72 20 65 73 74  he rows) for est
128f0 69 6d 61 74 69 6e 67 0a 20 20 20 20 2a 2a 20 74  imating.    ** t
12900 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
12910 73 20 76 69 73 69 74 65 64 2e 20 4f 74 68 65 72  s visited. Other
12920 77 69 73 65 2c 20 65 73 74 69 6d 61 74 65 20 74  wise, estimate t
12930 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
12940 73 0a 20 20 20 20 2a 2a 20 75 73 69 6e 67 20 74  s.    ** using t
12950 68 65 20 6d 65 74 68 6f 64 20 64 65 73 63 72 69  he method descri
12960 62 65 64 20 69 6e 20 74 68 65 20 68 65 61 64 65  bed in the heade
12970 72 20 63 6f 6d 6d 65 6e 74 20 66 6f 72 20 74 68  r comment for th
12980 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 2a 2f 0a  is function. */.
12990 20 20 20 20 69 66 28 20 6e 44 69 66 66 21 3d 31      if( nDiff!=1
129a0 20 7c 7c 20 70 55 70 70 65 72 3d 3d 30 20 7c 7c   || pUpper==0 ||
129b0 20 70 4c 6f 77 65 72 3d 3d 30 20 29 7b 0a 20 20   pLower==0 ){.  
129c0 20 20 20 20 69 6e 74 20 6e 41 64 6a 75 73 74 20      int nAdjust 
129d0 3d 20 28 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  = (sqlite3LogEst
129e0 28 70 2d 3e 6e 53 61 6d 70 6c 65 29 20 2d 20 73  (p->nSample) - s
129f0 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 6e 44 69  qlite3LogEst(nDi
12a00 66 66 29 29 3b 0a 20 20 20 20 20 20 70 4c 6f 6f  ff));.      pLoo
12a10 70 2d 3e 6e 4f 75 74 20 2d 3d 20 6e 41 64 6a 75  p->nOut -= nAdju
12a20 73 74 3b 0a 20 20 20 20 20 20 2a 70 62 44 6f 6e  st;.      *pbDon
12a30 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 57 48 45  e = 1;.      WHE
12a40 52 45 54 52 41 43 45 28 30 78 31 30 2c 20 28 22  RETRACE(0x10, ("
12a50 72 61 6e 67 65 20 73 6b 69 70 2d 73 63 61 6e 20  range skip-scan 
12a60 72 65 67 69 6f 6e 73 3a 20 25 75 2e 2e 25 75 20  regions: %u..%u 
12a70 20 61 64 6a 75 73 74 3d 25 64 20 65 73 74 3d 25   adjust=%d est=%
12a80 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
12a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12aa0 20 6e 4c 6f 77 65 72 2c 20 6e 55 70 70 65 72 2c   nLower, nUpper,
12ab0 20 6e 41 64 6a 75 73 74 2a 2d 31 2c 20 70 4c 6f   nAdjust*-1, pLo
12ac0 6f 70 2d 3e 6e 4f 75 74 29 29 3b 0a 20 20 20 20  op->nOut));.    
12ad0 7d 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  }..  }else{.    
12ae0 61 73 73 65 72 74 28 20 2a 70 62 44 6f 6e 65 3d  assert( *pbDone=
12af0 3d 30 20 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c  =0 );.  }..  sql
12b00 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 31  ite3ValueFree(p1
12b10 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75  );.  sqlite3Valu
12b20 65 46 72 65 65 28 70 32 29 3b 0a 20 20 73 71 6c  eFree(p2);.  sql
12b30 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 56  ite3ValueFree(pV
12b40 61 6c 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72  al);..  return r
12b50 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  c;.}.#endif /* S
12b60 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
12b70 54 33 5f 4f 52 5f 53 54 41 54 34 20 2a 2f 0a 0a  T3_OR_STAT4 */..
12b80 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
12b90 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 65  ion is used to e
12ba0 73 74 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62  stimate the numb
12bb0 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20  er of rows that 
12bc0 77 69 6c 6c 20 62 65 20 76 69 73 69 74 65 64 0a  will be visited.
12bd0 2a 2a 20 62 79 20 73 63 61 6e 6e 69 6e 67 20 61  ** by scanning a
12be0 6e 20 69 6e 64 65 78 20 66 6f 72 20 61 20 72 61  n index for a ra
12bf0 6e 67 65 20 6f 66 20 76 61 6c 75 65 73 2e 20 54  nge of values. T
12c00 68 65 20 72 61 6e 67 65 20 6d 61 79 20 68 61 76  he range may hav
12c10 65 20 61 6e 20 75 70 70 65 72 0a 2a 2a 20 62 6f  e an upper.** bo
12c20 75 6e 64 2c 20 61 20 6c 6f 77 65 72 20 62 6f 75  und, a lower bou
12c30 6e 64 2c 20 6f 72 20 62 6f 74 68 2e 20 54 68 65  nd, or both. The
12c40 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65   WHERE clause te
12c50 72 6d 73 20 74 68 61 74 20 73 65 74 20 74 68 65  rms that set the
12c60 20 75 70 70 65 72 0a 2a 2a 20 61 6e 64 20 6c 6f   upper.** and lo
12c70 77 65 72 20 62 6f 75 6e 64 73 20 61 72 65 20 72  wer bounds are r
12c80 65 70 72 65 73 65 6e 74 65 64 20 62 79 20 70 4c  epresented by pL
12c90 6f 77 65 72 20 61 6e 64 20 70 55 70 70 65 72 20  ower and pUpper 
12ca0 72 65 73 70 65 63 74 69 76 65 6c 79 2e 20 46 6f  respectively. Fo
12cb0 72 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 61 73  r.** example, as
12cc0 73 75 6d 69 6e 67 20 74 68 61 74 20 69 6e 64 65  suming that inde
12cd0 78 20 70 20 69 73 20 6f 6e 20 74 31 28 61 29 3a  x p is on t1(a):
12ce0 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f  .**.**   ... FRO
12cf0 4d 20 74 31 20 57 48 45 52 45 20 61 20 3e 20 3f  M t1 WHERE a > ?
12d00 20 41 4e 44 20 61 20 3c 20 3f 20 2e 2e 2e 0a 2a   AND a < ? ....*
12d10 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
12d20 20 20 20 20 20 7c 5f 5f 5f 5f 5f 7c 20 20 20 7c       |_____|   |
12d30 5f 5f 5f 5f 5f 7c 0a 2a 2a 20 20 20 20 20 20 20  _____|.**       
12d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d50 7c 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20  |         |.**  
12d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d70 20 20 20 70 4c 6f 77 65 72 20 20 20 20 70 55 70     pLower    pUp
12d80 70 65 72 0a 2a 2a 0a 2a 2a 20 49 66 20 65 69 74  per.**.** If eit
12d90 68 65 72 20 6f 66 20 74 68 65 20 75 70 70 65 72  her of the upper
12da0 20 6f 72 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20   or lower bound 
12db0 69 73 20 6e 6f 74 20 70 72 65 73 65 6e 74 2c 20  is not present, 
12dc0 74 68 65 6e 20 4e 55 4c 4c 20 69 73 20 70 61 73  then NULL is pas
12dd0 73 65 64 20 69 6e 0a 2a 2a 20 70 6c 61 63 65 20  sed in.** place 
12de0 6f 66 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  of the correspon
12df0 64 69 6e 67 20 57 68 65 72 65 54 65 72 6d 2e 0a  ding WhereTerm..
12e00 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20  **.** The value 
12e10 69 6e 20 28 70 42 75 69 6c 64 65 72 2d 3e 70 4e  in (pBuilder->pN
12e20 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 29  ew->u.btree.nEq)
12e30 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
12e40 66 20 74 68 65 20 69 6e 64 65 78 0a 2a 2a 20 63  f the index.** c
12e50 6f 6c 75 6d 6e 20 73 75 62 6a 65 63 74 20 74 6f  olumn subject to
12e60 20 74 68 65 20 72 61 6e 67 65 20 63 6f 6e 73 74   the range const
12e70 72 61 69 6e 74 2e 20 4f 72 2c 20 65 71 75 69 76  raint. Or, equiv
12e80 61 6c 65 6e 74 6c 79 2c 20 74 68 65 20 6e 75 6d  alently, the num
12e90 62 65 72 20 6f 66 0a 2a 2a 20 65 71 75 61 6c 69  ber of.** equali
12ea0 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f  ty constraints o
12eb0 70 74 69 6d 69 7a 65 64 20 62 79 20 74 68 65 20  ptimized by the 
12ec0 70 72 6f 70 6f 73 65 64 20 69 6e 64 65 78 20 73  proposed index s
12ed0 63 61 6e 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65  can. For example
12ee0 2c 0a 2a 2a 20 61 73 73 75 6d 69 6e 67 20 69 6e  ,.** assuming in
12ef0 64 65 78 20 70 20 69 73 20 6f 6e 20 74 31 28 61  dex p is on t1(a
12f00 2c 20 62 29 2c 20 61 6e 64 20 74 68 65 20 53 51  , b), and the SQ
12f10 4c 20 71 75 65 72 79 20 69 73 3a 0a 2a 2a 0a 2a  L query is:.**.*
12f20 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20  *   ... FROM t1 
12f30 57 48 45 52 45 20 61 20 3d 20 3f 20 41 4e 44 20  WHERE a = ? AND 
12f40 62 20 3e 20 3f 20 41 4e 44 20 62 20 3c 20 3f 20  b > ? AND b < ? 
12f50 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 6e  ....**.** then n
12f60 45 71 20 69 73 20 73 65 74 20 74 6f 20 31 20 28  Eq is set to 1 (
12f70 61 73 20 74 68 65 20 72 61 6e 67 65 20 72 65 73  as the range res
12f80 74 72 69 63 74 65 64 20 63 6f 6c 75 6d 6e 2c 20  tricted column, 
12f90 62 2c 20 69 73 20 74 68 65 20 73 65 63 6f 6e 64  b, is the second
12fa0 20 0a 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74 20 63   .** left-most c
12fb0 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64  olumn of the ind
12fc0 65 78 29 2e 20 4f 72 2c 20 69 66 20 74 68 65 20  ex). Or, if the 
12fd0 71 75 65 72 79 20 69 73 3a 0a 2a 2a 0a 2a 2a 20  query is:.**.** 
12fe0 20 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 57 48    ... FROM t1 WH
12ff0 45 52 45 20 61 20 3e 20 3f 20 41 4e 44 20 61 20  ERE a > ? AND a 
13000 3c 20 3f 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 74 68  < ? ....**.** th
13010 65 6e 20 6e 45 71 20 69 73 20 73 65 74 20 74 6f  en nEq is set to
13020 20 30 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74   0..**.** When t
13030 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
13040 63 61 6c 6c 65 64 2c 20 2a 70 6e 4f 75 74 20 69  called, *pnOut i
13050 73 20 73 65 74 20 74 6f 20 74 68 65 20 73 71 6c  s set to the sql
13060 69 74 65 33 4c 6f 67 45 73 74 28 29 20 6f 66 20  ite3LogEst() of 
13070 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66  the.** number of
13080 20 72 6f 77 73 20 74 68 61 74 20 74 68 65 20 69   rows that the i
13090 6e 64 65 78 20 73 63 61 6e 20 69 73 20 65 78 70  ndex scan is exp
130a0 65 63 74 65 64 20 74 6f 20 76 69 73 69 74 20 77  ected to visit w
130b0 69 74 68 6f 75 74 20 0a 2a 2a 20 63 6f 6e 73 69  ithout .** consi
130c0 64 65 72 69 6e 67 20 74 68 65 20 72 61 6e 67 65  dering the range
130d0 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 20 49 66   constraints. If
130e0 20 6e 45 71 20 69 73 20 30 2c 20 74 68 65 6e 20   nEq is 0, then 
130f0 2a 70 6e 4f 75 74 20 69 73 20 74 68 65 20 6e 75  *pnOut is the nu
13100 6d 62 65 72 20 6f 66 20 0a 2a 2a 20 72 6f 77 73  mber of .** rows
13110 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2e 20 41   in the index. A
13120 73 73 75 6d 69 6e 67 20 6e 6f 20 65 72 72 6f 72  ssuming no error
13130 20 6f 63 63 75 72 73 2c 20 2a 70 6e 4f 75 74 20   occurs, *pnOut 
13140 69 73 20 61 64 6a 75 73 74 65 64 20 28 72 65 64  is adjusted (red
13150 75 63 65 64 29 0a 2a 2a 20 74 6f 20 61 63 63 6f  uced).** to acco
13160 75 6e 74 20 66 6f 72 20 74 68 65 20 72 61 6e 67  unt for the rang
13170 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 70 4c  e constraints pL
13180 6f 77 65 72 20 61 6e 64 20 70 55 70 70 65 72 2e  ower and pUpper.
13190 0a 2a 2a 20 0a 2a 2a 20 49 6e 20 74 68 65 20 61  .** .** In the a
131a0 62 73 65 6e 63 65 20 6f 66 20 73 71 6c 69 74 65  bsence of sqlite
131b0 5f 73 74 61 74 34 20 41 4e 41 4c 59 5a 45 20 64  _stat4 ANALYZE d
131c0 61 74 61 2c 20 6f 72 20 69 66 20 73 75 63 68 20  ata, or if such 
131d0 64 61 74 61 20 63 61 6e 6e 6f 74 20 62 65 0a 2a  data cannot be.*
131e0 2a 20 75 73 65 64 2c 20 61 20 73 69 6e 67 6c 65  * used, a single
131f0 20 72 61 6e 67 65 20 69 6e 65 71 75 61 6c 69 74   range inequalit
13200 79 20 72 65 64 75 63 65 73 20 74 68 65 20 73 65  y reduces the se
13210 61 72 63 68 20 73 70 61 63 65 20 62 79 20 61 20  arch space by a 
13220 66 61 63 74 6f 72 20 6f 66 20 34 2e 20 0a 2a 2a  factor of 4. .**
13230 20 61 6e 64 20 61 20 70 61 69 72 20 6f 66 20 63   and a pair of c
13240 6f 6e 73 74 72 61 69 6e 74 73 20 28 78 3e 3f 20  onstraints (x>? 
13250 41 4e 44 20 78 3c 3f 29 20 72 65 64 75 63 65 73  AND x<?) reduces
13260 20 74 68 65 20 65 78 70 65 63 74 65 64 20 6e 75   the expected nu
13270 6d 62 65 72 20 6f 66 0a 2a 2a 20 72 6f 77 73 20  mber of.** rows 
13280 76 69 73 69 74 65 64 20 62 79 20 61 20 66 61 63  visited by a fac
13290 74 6f 72 20 6f 66 20 36 34 2e 0a 2a 2f 0a 73 74  tor of 64..*/.st
132a0 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 52 61  atic int whereRa
132b0 6e 67 65 53 63 61 6e 45 73 74 28 0a 20 20 50 61  ngeScanEst(.  Pa
132c0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
132d0 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 26 20     /* Parsing & 
132e0 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20  code generating 
132f0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65  context */.  Whe
13300 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70  reLoopBuilder *p
13310 42 75 69 6c 64 65 72 2c 0a 20 20 57 68 65 72 65  Builder,.  Where
13320 54 65 72 6d 20 2a 70 4c 6f 77 65 72 2c 20 20 20  Term *pLower,   
13330 2f 2a 20 4c 6f 77 65 72 20 62 6f 75 6e 64 20 6f  /* Lower bound o
13340 6e 20 74 68 65 20 72 61 6e 67 65 2e 20 65 78 3a  n the range. ex:
13350 20 22 78 3e 31 32 33 22 20 4d 69 67 68 74 20 62   "x>123" Might b
13360 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68 65 72  e NULL */.  Wher
13370 65 54 65 72 6d 20 2a 70 55 70 70 65 72 2c 20 20  eTerm *pUpper,  
13380 20 2f 2a 20 55 70 70 65 72 20 62 6f 75 6e 64 20   /* Upper bound 
13390 6f 6e 20 74 68 65 20 72 61 6e 67 65 2e 20 65 78  on the range. ex
133a0 3a 20 22 78 3c 34 35 35 22 20 4d 69 67 68 74 20  : "x<455" Might 
133b0 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68 65  be NULL */.  Whe
133c0 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 20 20 20  reLoop *pLoop   
133d0 20 20 2f 2a 20 4d 6f 64 69 66 79 20 74 68 65 20    /* Modify the 
133e0 2e 6e 4f 75 74 20 61 6e 64 20 6d 61 79 62 65 20  .nOut and maybe 
133f0 2e 72 52 75 6e 20 66 69 65 6c 64 73 20 2a 2f 0a  .rRun fields */.
13400 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
13410 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e  LITE_OK;.  int n
13420 4f 75 74 20 3d 20 70 4c 6f 6f 70 2d 3e 6e 4f 75  Out = pLoop->nOu
13430 74 3b 0a 20 20 4c 6f 67 45 73 74 20 6e 4e 65 77  t;.  LogEst nNew
13440 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
13450 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52  _ENABLE_STAT3_OR
13460 5f 53 54 41 54 34 0a 20 20 49 6e 64 65 78 20 2a  _STAT4.  Index *
13470 70 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72  p = pLoop->u.btr
13480 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 69 6e 74  ee.pIndex;.  int
13490 20 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e   nEq = pLoop->u.
134a0 62 74 72 65 65 2e 6e 45 71 3b 0a 0a 20 20 69 66  btree.nEq;..  if
134b0 28 20 70 2d 3e 6e 53 61 6d 70 6c 65 3e 30 20 26  ( p->nSample>0 &
134c0 26 20 6e 45 71 3c 70 2d 3e 6e 53 61 6d 70 6c 65  & nEq<p->nSample
134d0 43 6f 6c 20 29 7b 0a 20 20 20 20 69 66 28 20 6e  Col ){.    if( n
134e0 45 71 3d 3d 70 42 75 69 6c 64 65 72 2d 3e 6e 52  Eq==pBuilder->nR
134f0 65 63 56 61 6c 69 64 20 29 7b 0a 20 20 20 20 20  ecValid ){.     
13500 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
13510 2a 70 52 65 63 20 3d 20 70 42 75 69 6c 64 65 72  *pRec = pBuilder
13520 2d 3e 70 52 65 63 3b 0a 20 20 20 20 20 20 74 52  ->pRec;.      tR
13530 6f 77 63 6e 74 20 61 5b 32 5d 3b 0a 20 20 20 20  owcnt a[2];.    
13540 20 20 75 38 20 61 66 66 3b 0a 0a 20 20 20 20 20    u8 aff;..     
13550 20 2f 2a 20 56 61 72 69 61 62 6c 65 20 69 4c 6f   /* Variable iLo
13560 77 65 72 20 77 69 6c 6c 20 62 65 20 73 65 74 20  wer will be set 
13570 74 6f 20 74 68 65 20 65 73 74 69 6d 61 74 65 20  to the estimate 
13580 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  of the number of
13590 20 72 6f 77 73 20 69 6e 20 0a 20 20 20 20 20 20   rows in .      
135a0 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 74 68 61  ** the index tha
135b0 74 20 61 72 65 20 6c 65 73 73 20 74 68 61 6e 20  t are less than 
135c0 74 68 65 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20  the lower bound 
135d0 6f 66 20 74 68 65 20 72 61 6e 67 65 20 71 75 65  of the range que
135e0 72 79 2e 20 54 68 65 0a 20 20 20 20 20 20 2a 2a  ry. The.      **
135f0 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20 62 65 69   lower bound bei
13600 6e 67 20 74 68 65 20 63 6f 6e 63 61 74 65 6e 61  ng the concatena
13610 74 69 6f 6e 20 6f 66 20 24 50 20 61 6e 64 20 24  tion of $P and $
13620 4c 2c 20 77 68 65 72 65 20 24 50 20 69 73 20 74  L, where $P is t
13630 68 65 0a 20 20 20 20 20 20 2a 2a 20 6b 65 79 2d  he.      ** key-
13640 70 72 65 66 69 78 20 66 6f 72 6d 65 64 20 62 79  prefix formed by
13650 20 74 68 65 20 6e 45 71 20 76 61 6c 75 65 73 20   the nEq values 
13660 6d 61 74 63 68 65 64 20 61 67 61 69 6e 73 74 20  matched against 
13670 74 68 65 20 6e 45 71 20 6c 65 66 74 2d 6d 6f 73  the nEq left-mos
13680 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6c 75 6d  t.      ** colum
13690 6e 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2c  ns of the index,
136a0 20 61 6e 64 20 24 4c 20 69 73 20 74 68 65 20 76   and $L is the v
136b0 61 6c 75 65 20 69 6e 20 70 4c 6f 77 65 72 2e 0a  alue in pLower..
136c0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
136d0 2a 20 4f 72 2c 20 69 66 20 70 4c 6f 77 65 72 20  * Or, if pLower 
136e0 69 73 20 4e 55 4c 4c 20 6f 72 20 24 4c 20 63 61  is NULL or $L ca
136f0 6e 6e 6f 74 20 62 65 20 65 78 74 72 61 63 74 65  nnot be extracte
13700 64 20 66 72 6f 6d 20 69 74 20 28 62 65 63 61 75  d from it (becau
13710 73 65 20 69 74 0a 20 20 20 20 20 20 2a 2a 20 69  se it.      ** i
13720 73 20 6e 6f 74 20 61 20 73 69 6d 70 6c 65 20 76  s not a simple v
13730 61 72 69 61 62 6c 65 20 6f 72 20 6c 69 74 65 72  ariable or liter
13740 61 6c 20 76 61 6c 75 65 29 2c 20 74 68 65 20 6c  al value), the l
13750 6f 77 65 72 20 62 6f 75 6e 64 20 6f 66 20 74 68  ower bound of th
13760 65 0a 20 20 20 20 20 20 2a 2a 20 72 61 6e 67 65  e.      ** range
13770 20 69 73 20 24 50 2e 20 44 75 65 20 74 6f 20 61   is $P. Due to a
13780 20 71 75 69 72 6b 20 69 6e 20 74 68 65 20 77 61   quirk in the wa
13790 79 20 77 68 65 72 65 4b 65 79 53 74 61 74 73 28  y whereKeyStats(
137a0 29 20 77 6f 72 6b 73 2c 20 65 76 65 6e 0a 20 20  ) works, even.  
137b0 20 20 20 20 2a 2a 20 69 66 20 24 4c 20 69 73 20      ** if $L is 
137c0 61 76 61 69 6c 61 62 6c 65 2c 20 77 68 65 72 65  available, where
137d0 4b 65 79 53 74 61 74 73 28 29 20 69 73 20 63 61  KeyStats() is ca
137e0 6c 6c 65 64 20 66 6f 72 20 62 6f 74 68 20 28 24  lled for both ($
137f0 50 29 20 61 6e 64 20 0a 20 20 20 20 20 20 2a 2a  P) and .      **
13800 20 28 24 50 3a 24 4c 29 20 61 6e 64 20 74 68 65   ($P:$L) and the
13810 20 6c 61 72 67 65 72 20 6f 66 20 74 68 65 20 74   larger of the t
13820 77 6f 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75  wo returned valu
13830 65 73 20 69 73 20 75 73 65 64 2e 0a 20 20 20 20  es is used..    
13840 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 53 69    **.      ** Si
13850 6d 69 6c 61 72 6c 79 2c 20 69 55 70 70 65 72 20  milarly, iUpper 
13860 69 73 20 74 6f 20 62 65 20 73 65 74 20 74 6f 20  is to be set to 
13870 74 68 65 20 65 73 74 69 6d 61 74 65 20 6f 66 20  the estimate of 
13880 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
13890 77 73 0a 20 20 20 20 20 20 2a 2a 20 6c 65 73 73  ws.      ** less
138a0 20 74 68 61 6e 20 74 68 65 20 75 70 70 65 72 20   than the upper 
138b0 62 6f 75 6e 64 20 6f 66 20 74 68 65 20 72 61 6e  bound of the ran
138c0 67 65 20 71 75 65 72 79 2e 20 57 68 65 72 65 20  ge query. Where 
138d0 74 68 65 20 75 70 70 65 72 20 62 6f 75 6e 64 0a  the upper bound.
138e0 20 20 20 20 20 20 2a 2a 20 69 73 20 65 69 74 68        ** is eith
138f0 65 72 20 28 24 50 29 20 6f 72 20 28 24 50 3a 24  er ($P) or ($P:$
13900 55 29 2e 20 41 67 61 69 6e 2c 20 65 76 65 6e 20  U). Again, even 
13910 69 66 20 24 55 20 69 73 20 61 76 61 69 6c 61 62  if $U is availab
13920 6c 65 2c 20 62 6f 74 68 20 76 61 6c 75 65 73 0a  le, both values.
13930 20 20 20 20 20 20 2a 2a 20 6f 66 20 69 55 70 70        ** of iUpp
13940 65 72 20 61 72 65 20 72 65 71 75 65 73 74 65 64  er are requested
13950 20 6f 66 20 77 68 65 72 65 4b 65 79 53 74 61 74   of whereKeyStat
13960 73 28 29 20 61 6e 64 20 74 68 65 20 73 6d 61 6c  s() and the smal
13970 6c 65 72 20 75 73 65 64 2e 0a 20 20 20 20 20 20  ler used..      
13980 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 20  **.      ** The 
13990 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 62  number of rows b
139a0 65 74 77 65 65 6e 20 74 68 65 20 74 77 6f 20 62  etween the two b
139b0 6f 75 6e 64 73 20 69 73 20 74 68 65 6e 20 6a 75  ounds is then ju
139c0 73 74 20 69 55 70 70 65 72 2d 69 4c 6f 77 65 72  st iUpper-iLower
139d0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
139e0 20 74 52 6f 77 63 6e 74 20 69 4c 6f 77 65 72 3b   tRowcnt iLower;
139f0 20 20 20 20 20 2f 2a 20 52 6f 77 73 20 6c 65 73       /* Rows les
13a00 73 20 74 68 61 6e 20 74 68 65 20 6c 6f 77 65 72  s than the lower
13a10 20 62 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20   bound */.      
13a20 74 52 6f 77 63 6e 74 20 69 55 70 70 65 72 3b 20  tRowcnt iUpper; 
13a30 20 20 20 20 2f 2a 20 52 6f 77 73 20 6c 65 73 73      /* Rows less
13a40 20 74 68 61 6e 20 74 68 65 20 75 70 70 65 72 20   than the upper 
13a50 62 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 69  bound */.      i
13a60 6e 74 20 69 4c 77 72 49 64 78 20 3d 20 2d 32 3b  nt iLwrIdx = -2;
13a70 20 20 20 2f 2a 20 61 53 61 6d 70 6c 65 5b 5d 20     /* aSample[] 
13a80 66 6f 72 20 74 68 65 20 6c 6f 77 65 72 20 62 6f  for the lower bo
13a90 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  und */.      int
13aa0 20 69 55 70 72 49 64 78 20 3d 20 2d 31 3b 20 20   iUprIdx = -1;  
13ab0 20 2f 2a 20 61 53 61 6d 70 6c 65 5b 5d 20 66 6f   /* aSample[] fo
13ac0 72 20 74 68 65 20 75 70 70 65 72 20 62 6f 75 6e  r the upper boun
13ad0 64 20 2a 2f 0a 0a 20 20 20 20 20 20 69 66 28 20  d */..      if( 
13ae0 70 52 65 63 20 29 7b 0a 20 20 20 20 20 20 20 20  pRec ){.        
13af0 74 65 73 74 63 61 73 65 28 20 70 52 65 63 2d 3e  testcase( pRec->
13b00 6e 46 69 65 6c 64 21 3d 70 42 75 69 6c 64 65 72  nField!=pBuilder
13b10 2d 3e 6e 52 65 63 56 61 6c 69 64 20 29 3b 0a 20  ->nRecValid );. 
13b20 20 20 20 20 20 20 20 70 52 65 63 2d 3e 6e 46 69         pRec->nFi
13b30 65 6c 64 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  eld = pBuilder->
13b40 6e 52 65 63 56 61 6c 69 64 3b 0a 20 20 20 20 20  nRecValid;.     
13b50 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 45 71   }.      if( nEq
13b60 3d 3d 70 2d 3e 6e 4b 65 79 43 6f 6c 20 29 7b 0a  ==p->nKeyCol ){.
13b70 20 20 20 20 20 20 20 20 61 66 66 20 3d 20 53 51          aff = SQ
13b80 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52  LITE_AFF_INTEGER
13b90 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
13ba0 20 20 20 20 20 20 20 61 66 66 20 3d 20 70 2d 3e         aff = p->
13bb0 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 70 2d 3e  pTable->aCol[p->
13bc0 61 69 43 6f 6c 75 6d 6e 5b 6e 45 71 5d 5d 2e 61  aiColumn[nEq]].a
13bd0 66 66 69 6e 69 74 79 3b 0a 20 20 20 20 20 20 7d  ffinity;.      }
13be0 0a 20 20 20 20 20 20 2f 2a 20 44 65 74 65 72 6d  .      /* Determ
13bf0 69 6e 65 20 69 4c 6f 77 65 72 20 61 6e 64 20 69  ine iLower and i
13c00 55 70 70 65 72 20 75 73 69 6e 67 20 28 24 50 29  Upper using ($P)
13c10 20 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 20 20 20 20   only. */.      
13c20 69 66 28 20 6e 45 71 3d 3d 30 20 29 7b 0a 20 20  if( nEq==0 ){.  
13c30 20 20 20 20 20 20 69 4c 6f 77 65 72 20 3d 20 30        iLower = 0
13c40 3b 0a 20 20 20 20 20 20 20 20 69 55 70 70 65 72  ;.        iUpper
13c50 20 3d 20 70 2d 3e 6e 52 6f 77 45 73 74 30 3b 0a   = p->nRowEst0;.
13c60 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
13c70 20 20 20 20 20 2f 2a 20 4e 6f 74 65 3a 20 74 68       /* Note: th
13c80 69 73 20 63 61 6c 6c 20 63 6f 75 6c 64 20 62 65  is call could be
13c90 20 6f 70 74 69 6d 69 7a 65 64 20 61 77 61 79 20   optimized away 
13ca0 2d 20 73 69 6e 63 65 20 74 68 65 20 73 61 6d 65  - since the same
13cb0 20 76 61 6c 75 65 73 20 6d 75 73 74 20 0a 20 20   values must .  
13cc0 20 20 20 20 20 20 2a 2a 20 68 61 76 65 20 62 65        ** have be
13cd0 65 6e 20 72 65 71 75 65 73 74 65 64 20 77 68 65  en requested whe
13ce0 6e 20 74 65 73 74 69 6e 67 20 6b 65 79 20 24 50  n testing key $P
13cf0 20 69 6e 20 77 68 65 72 65 45 71 75 61 6c 53 63   in whereEqualSc
13d00 61 6e 45 73 74 28 29 2e 20 20 2a 2f 0a 20 20 20  anEst().  */.   
13d10 20 20 20 20 20 77 68 65 72 65 4b 65 79 53 74 61       whereKeySta
13d20 74 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70 52  ts(pParse, p, pR
13d30 65 63 2c 20 30 2c 20 61 29 3b 0a 20 20 20 20 20  ec, 0, a);.     
13d40 20 20 20 69 4c 6f 77 65 72 20 3d 20 61 5b 30 5d     iLower = a[0]
13d50 3b 0a 20 20 20 20 20 20 20 20 69 55 70 70 65 72  ;.        iUpper
13d60 20 3d 20 61 5b 30 5d 20 2b 20 61 5b 31 5d 3b 0a   = a[0] + a[1];.
13d70 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61        }..      a
13d80 73 73 65 72 74 28 20 70 4c 6f 77 65 72 3d 3d 30  ssert( pLower==0
13d90 20 7c 7c 20 28 70 4c 6f 77 65 72 2d 3e 65 4f 70   || (pLower->eOp
13da0 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 47 54 7c  erator & (WO_GT|
13db0 57 4f 5f 47 45 29 29 21 3d 30 20 29 3b 0a 20 20  WO_GE))!=0 );.  
13dc0 20 20 20 20 61 73 73 65 72 74 28 20 70 55 70 70      assert( pUpp
13dd0 65 72 3d 3d 30 20 7c 7c 20 28 70 55 70 70 65 72  er==0 || (pUpper
13de0 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57  ->eOperator & (W
13df0 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 29 21 3d 30 20  O_LT|WO_LE))!=0 
13e00 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
13e10 20 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d   p->aSortOrder!=
13e20 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  0 );.      if( p
13e30 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6e 45 71  ->aSortOrder[nEq
13e40 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ] ){.        /* 
13e50 54 68 65 20 72 6f 6c 65 73 20 6f 66 20 70 4c 6f  The roles of pLo
13e60 77 65 72 20 61 6e 64 20 70 55 70 70 65 72 20 61  wer and pUpper a
13e70 72 65 20 73 77 61 70 70 65 64 20 66 6f 72 20 61  re swapped for a
13e80 20 44 45 53 43 20 69 6e 64 65 78 20 2a 2f 0a 20   DESC index */. 
13e90 20 20 20 20 20 20 20 53 57 41 50 28 57 68 65 72         SWAP(Wher
13ea0 65 54 65 72 6d 2a 2c 20 70 4c 6f 77 65 72 2c 20  eTerm*, pLower, 
13eb0 70 55 70 70 65 72 29 3b 0a 20 20 20 20 20 20 7d  pUpper);.      }
13ec0 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70 6f  ..      /* If po
13ed0 73 73 69 62 6c 65 2c 20 69 6d 70 72 6f 76 65 20  ssible, improve 
13ee0 6f 6e 20 74 68 65 20 69 4c 6f 77 65 72 20 65 73  on the iLower es
13ef0 74 69 6d 61 74 65 20 75 73 69 6e 67 20 28 24 50  timate using ($P
13f00 3a 24 4c 29 2e 20 2a 2f 0a 20 20 20 20 20 20 69  :$L). */.      i
13f10 66 28 20 70 4c 6f 77 65 72 20 29 7b 0a 20 20 20  f( pLower ){.   
13f20 20 20 20 20 20 69 6e 74 20 62 4f 6b 3b 20 20 20       int bOk;   
13f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f40 20 2f 2a 20 54 72 75 65 20 69 66 20 76 61 6c 75   /* True if valu
13f50 65 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66  e is extracted f
13f60 72 6f 6d 20 70 45 78 70 72 20 2a 2f 0a 20 20 20  rom pExpr */.   
13f70 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72       Expr *pExpr
13f80 20 3d 20 70 4c 6f 77 65 72 2d 3e 70 45 78 70 72   = pLower->pExpr
13f90 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  ->pRight;.      
13fa0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 74    rc = sqlite3St
13fb0 61 74 34 50 72 6f 62 65 53 65 74 56 61 6c 75 65  at4ProbeSetValue
13fc0 28 70 50 61 72 73 65 2c 20 70 2c 20 26 70 52 65  (pParse, p, &pRe
13fd0 63 2c 20 70 45 78 70 72 2c 20 61 66 66 2c 20 6e  c, pExpr, aff, n
13fe0 45 71 2c 20 26 62 4f 6b 29 3b 0a 20 20 20 20 20  Eq, &bOk);.     
13ff0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
14000 45 5f 4f 4b 20 26 26 20 62 4f 6b 20 29 7b 0a 20  E_OK && bOk ){. 
14010 20 20 20 20 20 20 20 20 20 74 52 6f 77 63 6e 74           tRowcnt
14020 20 69 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 20   iNew;.         
14030 20 69 4c 77 72 49 64 78 20 3d 20 77 68 65 72 65   iLwrIdx = where
14040 4b 65 79 53 74 61 74 73 28 70 50 61 72 73 65 2c  KeyStats(pParse,
14050 20 70 2c 20 70 52 65 63 2c 20 30 2c 20 61 29 3b   p, pRec, 0, a);
14060 0a 20 20 20 20 20 20 20 20 20 20 69 4e 65 77 20  .          iNew 
14070 3d 20 61 5b 30 5d 20 2b 20 28 28 70 4c 6f 77 65  = a[0] + ((pLowe
14080 72 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28  r->eOperator & (
14090 57 4f 5f 47 54 7c 57 4f 5f 4c 45 29 29 20 3f 20  WO_GT|WO_LE)) ? 
140a0 61 5b 31 5d 20 3a 20 30 29 3b 0a 20 20 20 20 20  a[1] : 0);.     
140b0 20 20 20 20 20 69 66 28 20 69 4e 65 77 3e 69 4c       if( iNew>iL
140c0 6f 77 65 72 20 29 20 69 4c 6f 77 65 72 20 3d 20  ower ) iLower = 
140d0 69 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 20 20  iNew;.          
140e0 6e 4f 75 74 2d 2d 3b 0a 20 20 20 20 20 20 20 20  nOut--;.        
140f0 20 20 70 4c 6f 77 65 72 20 3d 20 30 3b 0a 20 20    pLower = 0;.  
14100 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
14110 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70 6f 73  .      /* If pos
14120 73 69 62 6c 65 2c 20 69 6d 70 72 6f 76 65 20 6f  sible, improve o
14130 6e 20 74 68 65 20 69 55 70 70 65 72 20 65 73 74  n the iUpper est
14140 69 6d 61 74 65 20 75 73 69 6e 67 20 28 24 50 3a  imate using ($P:
14150 24 55 29 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66  $U). */.      if
14160 28 20 70 55 70 70 65 72 20 29 7b 0a 20 20 20 20  ( pUpper ){.    
14170 20 20 20 20 69 6e 74 20 62 4f 6b 3b 20 20 20 20      int bOk;    
14180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14190 2f 2a 20 54 72 75 65 20 69 66 20 76 61 6c 75 65  /* True if value
141a0 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66 72   is extracted fr
141b0 6f 6d 20 70 45 78 70 72 20 2a 2f 0a 20 20 20 20  om pExpr */.    
141c0 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20      Expr *pExpr 
141d0 3d 20 70 55 70 70 65 72 2d 3e 70 45 78 70 72 2d  = pUpper->pExpr-
141e0 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20  >pRight;.       
141f0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 74 61   rc = sqlite3Sta
14200 74 34 50 72 6f 62 65 53 65 74 56 61 6c 75 65 28  t4ProbeSetValue(
14210 70 50 61 72 73 65 2c 20 70 2c 20 26 70 52 65 63  pParse, p, &pRec
14220 2c 20 70 45 78 70 72 2c 20 61 66 66 2c 20 6e 45  , pExpr, aff, nE
14230 71 2c 20 26 62 4f 6b 29 3b 0a 20 20 20 20 20 20  q, &bOk);.      
14240 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
14250 5f 4f 4b 20 26 26 20 62 4f 6b 20 29 7b 0a 20 20  _OK && bOk ){.  
14260 20 20 20 20 20 20 20 20 74 52 6f 77 63 6e 74 20          tRowcnt 
14270 69 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 20 20  iNew;.          
14280 69 55 70 72 49 64 78 20 3d 20 77 68 65 72 65 4b  iUprIdx = whereK
14290 65 79 53 74 61 74 73 28 70 50 61 72 73 65 2c 20  eyStats(pParse, 
142a0 70 2c 20 70 52 65 63 2c 20 31 2c 20 61 29 3b 0a  p, pRec, 1, a);.
142b0 20 20 20 20 20 20 20 20 20 20 69 4e 65 77 20 3d            iNew =
142c0 20 61 5b 30 5d 20 2b 20 28 28 70 55 70 70 65 72   a[0] + ((pUpper
142d0 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57  ->eOperator & (W
142e0 4f 5f 47 54 7c 57 4f 5f 4c 45 29 29 20 3f 20 61  O_GT|WO_LE)) ? a
142f0 5b 31 5d 20 3a 20 30 29 3b 0a 20 20 20 20 20 20  [1] : 0);.      
14300 20 20 20 20 69 66 28 20 69 4e 65 77 3c 69 55 70      if( iNew<iUp
14310 70 65 72 20 29 20 69 55 70 70 65 72 20 3d 20 69  per ) iUpper = i
14320 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 20 20 6e  New;.          n
14330 4f 75 74 2d 2d 3b 0a 20 20 20 20 20 20 20 20 20  Out--;.         
14340 20 70 55 70 70 65 72 20 3d 20 30 3b 0a 20 20 20   pUpper = 0;.   
14350 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a       }.      }..
14360 20 20 20 20 20 20 70 42 75 69 6c 64 65 72 2d 3e        pBuilder->
14370 70 52 65 63 20 3d 20 70 52 65 63 3b 0a 20 20 20  pRec = pRec;.   
14380 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
14390 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
143a0 69 66 28 20 69 55 70 70 65 72 3e 69 4c 6f 77 65  if( iUpper>iLowe
143b0 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e  r ){.          n
143c0 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  New = sqlite3Log
143d0 45 73 74 28 69 55 70 70 65 72 20 2d 20 69 4c 6f  Est(iUpper - iLo
143e0 77 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  wer);.          
143f0 2f 2a 20 54 55 4e 49 4e 47 3a 20 20 49 66 20 62  /* TUNING:  If b
14400 6f 74 68 20 69 55 70 70 65 72 20 61 6e 64 20 69  oth iUpper and i
14410 4c 6f 77 65 72 20 61 72 65 20 64 65 72 69 76 65  Lower are derive
14420 64 20 66 72 6f 6d 20 74 68 65 20 73 61 6d 65 0a  d from the same.
14430 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 61 6d            ** sam
14440 70 6c 65 2c 20 74 68 65 6e 20 61 73 73 75 6d 65  ple, then assume
14450 20 74 68 65 79 20 61 72 65 20 34 78 20 6d 6f 72   they are 4x mor
14460 65 20 73 65 6c 65 63 74 69 76 65 2e 20 20 54 68  e selective.  Th
14470 69 73 20 62 72 69 6e 67 73 0a 20 20 20 20 20 20  is brings.      
14480 20 20 20 20 2a 2a 20 74 68 65 20 65 73 74 69 6d      ** the estim
14490 61 74 65 64 20 73 65 6c 65 63 74 69 76 69 74 79  ated selectivity
144a0 20 6d 6f 72 65 20 69 6e 20 6c 69 6e 65 20 77 69   more in line wi
144b0 74 68 20 77 68 61 74 20 69 74 20 77 6f 75 6c 64  th what it would
144c0 20 62 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   be.          **
144d0 20 69 66 20 65 73 74 69 6d 61 74 65 64 20 77 69   if estimated wi
144e0 74 68 6f 75 74 20 74 68 65 20 75 73 65 20 6f 66  thout the use of
144f0 20 53 54 41 54 33 2f 34 20 74 61 62 6c 65 73 2e   STAT3/4 tables.
14500 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
14510 28 20 69 4c 77 72 49 64 78 3d 3d 69 55 70 72 49  ( iLwrIdx==iUprI
14520 64 78 20 29 20 6e 4e 65 77 20 2d 3d 20 32 30 3b  dx ) nNew -= 20;
14530 20 20 61 73 73 65 72 74 28 20 32 30 3d 3d 73 71    assert( 20==sq
14540 6c 69 74 65 33 4c 6f 67 45 73 74 28 34 29 20 29  lite3LogEst(4) )
14550 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
14560 0a 20 20 20 20 20 20 20 20 20 20 6e 4e 65 77 20  .          nNew 
14570 3d 20 31 30 3b 20 20 20 20 20 20 20 20 61 73 73  = 10;        ass
14580 65 72 74 28 20 31 30 3d 3d 73 71 6c 69 74 65 33  ert( 10==sqlite3
14590 4c 6f 67 45 73 74 28 32 29 20 29 3b 0a 20 20 20  LogEst(2) );.   
145a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
145b0 66 28 20 6e 4e 65 77 3c 6e 4f 75 74 20 29 7b 0a  f( nNew<nOut ){.
145c0 20 20 20 20 20 20 20 20 20 20 6e 4f 75 74 20 3d            nOut =
145d0 20 6e 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 7d   nNew;.        }
145e0 0a 20 20 20 20 20 20 20 20 57 48 45 52 45 54 52  .        WHERETR
145f0 41 43 45 28 30 78 31 30 2c 20 28 22 53 54 41 54  ACE(0x10, ("STAT
14600 34 20 72 61 6e 67 65 20 73 63 61 6e 3a 20 25 75  4 range scan: %u
14610 2e 2e 25 75 20 20 65 73 74 3d 25 64 5c 6e 22 2c  ..%u  est=%d\n",
14620 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
14630 20 20 20 20 20 20 20 20 20 20 20 20 28 75 33 32              (u32
14640 29 69 4c 6f 77 65 72 2c 20 28 75 33 32 29 69 55  )iLower, (u32)iU
14650 70 70 65 72 2c 20 6e 4f 75 74 29 29 3b 0a 20 20  pper, nOut));.  
14660 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
14670 0a 20 20 20 20 20 20 69 6e 74 20 62 44 6f 6e 65  .      int bDone
14680 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 0;.      rc =
14690 20 77 68 65 72 65 52 61 6e 67 65 53 6b 69 70 53   whereRangeSkipS
146a0 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c 20 70  canEst(pParse, p
146b0 4c 6f 77 65 72 2c 20 70 55 70 70 65 72 2c 20 70  Lower, pUpper, p
146c0 4c 6f 6f 70 2c 20 26 62 44 6f 6e 65 29 3b 0a 20  Loop, &bDone);. 
146d0 20 20 20 20 20 69 66 28 20 62 44 6f 6e 65 20 29       if( bDone )
146e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
146f0 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 55 4e  }.  }.#else.  UN
14700 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
14710 50 61 72 73 65 29 3b 0a 20 20 55 4e 55 53 45 44  Parse);.  UNUSED
14720 5f 50 41 52 41 4d 45 54 45 52 28 70 42 75 69 6c  _PARAMETER(pBuil
14730 64 65 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20  der);.  assert( 
14740 70 4c 6f 77 65 72 20 7c 7c 20 70 55 70 70 65 72  pLower || pUpper
14750 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73   );.#endif.  ass
14760 65 72 74 28 20 70 55 70 70 65 72 3d 3d 30 20 7c  ert( pUpper==0 |
14770 7c 20 28 70 55 70 70 65 72 2d 3e 77 74 46 6c 61  | (pUpper->wtFla
14780 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29  gs & TERM_VNULL)
14790 3d 3d 30 20 29 3b 0a 20 20 6e 4e 65 77 20 3d 20  ==0 );.  nNew = 
147a0 77 68 65 72 65 52 61 6e 67 65 41 64 6a 75 73 74  whereRangeAdjust
147b0 28 70 4c 6f 77 65 72 2c 20 6e 4f 75 74 29 3b 0a  (pLower, nOut);.
147c0 20 20 6e 4e 65 77 20 3d 20 77 68 65 72 65 52 61    nNew = whereRa
147d0 6e 67 65 41 64 6a 75 73 74 28 70 55 70 70 65 72  ngeAdjust(pUpper
147e0 2c 20 6e 4e 65 77 29 3b 0a 0a 20 20 2f 2a 20 54  , nNew);..  /* T
147f0 55 4e 49 4e 47 3a 20 49 66 20 74 68 65 72 65 20  UNING: If there 
14800 69 73 20 62 6f 74 68 20 61 6e 20 75 70 70 65 72  is both an upper
14810 20 61 6e 64 20 6c 6f 77 65 72 20 6c 69 6d 69 74   and lower limit
14820 20 61 6e 64 20 6e 65 69 74 68 65 72 20 6c 69 6d   and neither lim
14830 69 74 0a 20 20 2a 2a 20 68 61 73 20 61 6e 20 61  it.  ** has an a
14840 70 70 6c 69 63 61 74 69 6f 6e 2d 64 65 66 69 6e  pplication-defin
14850 65 64 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 29 2c  ed likelihood(),
14860 20 61 73 73 75 6d 65 20 74 68 65 20 72 61 6e 67   assume the rang
14870 65 20 69 73 0a 20 20 2a 2a 20 72 65 64 75 63 65  e is.  ** reduce
14880 64 20 62 79 20 61 6e 20 61 64 64 69 74 69 6f 6e  d by an addition
14890 61 6c 20 37 35 25 2e 20 54 68 69 73 20 6d 65 61  al 75%. This mea
148a0 6e 73 20 74 68 61 74 2c 20 62 79 20 64 65 66 61  ns that, by defa
148b0 75 6c 74 2c 20 61 6e 20 6f 70 65 6e 2d 65 6e 64  ult, an open-end
148c0 65 64 0a 20 20 2a 2a 20 72 61 6e 67 65 20 71 75  ed.  ** range qu
148d0 65 72 79 20 28 65 2e 67 2e 20 63 6f 6c 20 3e 20  ery (e.g. col > 
148e0 3f 29 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f  ?) is assumed to
148f0 20 6d 61 74 63 68 20 31 2f 34 20 6f 66 20 74 68   match 1/4 of th
14900 65 20 72 6f 77 73 20 69 6e 20 74 68 65 0a 20 20  e rows in the.  
14910 2a 2a 20 69 6e 64 65 78 2e 20 57 68 69 6c 65 20  ** index. While 
14920 61 20 63 6c 6f 73 65 64 20 72 61 6e 67 65 20 28  a closed range (
14930 65 2e 67 2e 20 63 6f 6c 20 42 45 54 57 45 45 4e  e.g. col BETWEEN
14940 20 3f 20 41 4e 44 20 3f 29 20 69 73 20 65 73 74   ? AND ?) is est
14950 69 6d 61 74 65 64 20 74 6f 0a 20 20 2a 2a 20 6d  imated to.  ** m
14960 61 74 63 68 20 31 2f 36 34 20 6f 66 20 74 68 65  atch 1/64 of the
14970 20 69 6e 64 65 78 2e 20 2a 2f 20 0a 20 20 69 66   index. */ .  if
14980 28 20 70 4c 6f 77 65 72 20 26 26 20 70 4c 6f 77  ( pLower && pLow
14990 65 72 2d 3e 74 72 75 74 68 50 72 6f 62 3e 30 20  er->truthProb>0 
149a0 26 26 20 70 55 70 70 65 72 20 26 26 20 70 55 70  && pUpper && pUp
149b0 70 65 72 2d 3e 74 72 75 74 68 50 72 6f 62 3e 30  per->truthProb>0
149c0 20 29 7b 0a 20 20 20 20 6e 4e 65 77 20 2d 3d 20   ){.    nNew -= 
149d0 32 30 3b 0a 20 20 7d 0a 0a 20 20 6e 4f 75 74 20  20;.  }..  nOut 
149e0 2d 3d 20 28 70 4c 6f 77 65 72 21 3d 30 29 20 2b  -= (pLower!=0) +
149f0 20 28 70 55 70 70 65 72 21 3d 30 29 3b 0a 20 20   (pUpper!=0);.  
14a00 69 66 28 20 6e 4e 65 77 3c 31 30 20 29 20 6e 4e  if( nNew<10 ) nN
14a10 65 77 20 3d 20 31 30 3b 0a 20 20 69 66 28 20 6e  ew = 10;.  if( n
14a20 4e 65 77 3c 6e 4f 75 74 20 29 20 6e 4f 75 74 20  New<nOut ) nOut 
14a30 3d 20 6e 4e 65 77 3b 0a 23 69 66 20 64 65 66 69  = nNew;.#if defi
14a40 6e 65 64 28 57 48 45 52 45 54 52 41 43 45 5f 45  ned(WHERETRACE_E
14a50 4e 41 42 4c 45 44 29 0a 20 20 69 66 28 20 70 4c  NABLED).  if( pL
14a60 6f 6f 70 2d 3e 6e 4f 75 74 3e 6e 4f 75 74 20 29  oop->nOut>nOut )
14a70 7b 0a 20 20 20 20 57 48 45 52 45 54 52 41 43 45  {.    WHERETRACE
14a80 28 30 78 31 30 2c 28 22 52 61 6e 67 65 20 73 63  (0x10,("Range sc
14a90 61 6e 20 6c 6f 77 65 72 73 20 6e 4f 75 74 20 66  an lowers nOut f
14aa0 72 6f 6d 20 25 64 20 74 6f 20 25 64 5c 6e 22 2c  rom %d to %d\n",
14ab0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
14ac0 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74       pLoop->nOut
14ad0 2c 20 6e 4f 75 74 29 29 3b 0a 20 20 7d 0a 23 65  , nOut));.  }.#e
14ae0 6e 64 69 66 0a 20 20 70 4c 6f 6f 70 2d 3e 6e 4f  ndif.  pLoop->nO
14af0 75 74 20 3d 20 28 4c 6f 67 45 73 74 29 6e 4f 75  ut = (LogEst)nOu
14b00 74 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  t;.  return rc;.
14b10 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
14b20 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52  _ENABLE_STAT3_OR
14b30 5f 53 54 41 54 34 0a 2f 2a 0a 2a 2a 20 45 73 74  _STAT4./*.** Est
14b40 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72  imate the number
14b50 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77 69   of rows that wi
14b60 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 62  ll be returned b
14b70 61 73 65 64 20 6f 6e 0a 2a 2a 20 61 6e 20 65 71  ased on.** an eq
14b80 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
14b90 74 20 78 3d 56 41 4c 55 45 20 61 6e 64 20 77 68  t x=VALUE and wh
14ba0 65 72 65 20 74 68 61 74 20 56 41 4c 55 45 20 6f  ere that VALUE o
14bb0 63 63 75 72 73 20 69 6e 0a 2a 2a 20 74 68 65 20  ccurs in.** the 
14bc0 68 69 73 74 6f 67 72 61 6d 20 64 61 74 61 2e 20  histogram data. 
14bd0 20 54 68 69 73 20 6f 6e 6c 79 20 77 6f 72 6b 73   This only works
14be0 20 77 68 65 6e 20 78 20 69 73 20 74 68 65 20 6c   when x is the l
14bf0 65 66 74 2d 6d 6f 73 74 0a 2a 2a 20 63 6f 6c 75  eft-most.** colu
14c00 6d 6e 20 6f 66 20 61 6e 20 69 6e 64 65 78 20 61  mn of an index a
14c10 6e 64 20 73 71 6c 69 74 65 5f 73 74 61 74 33 20  nd sqlite_stat3 
14c20 68 69 73 74 6f 67 72 61 6d 20 64 61 74 61 20 69  histogram data i
14c30 73 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 66  s available.** f
14c40 6f 72 20 74 68 61 74 20 69 6e 64 65 78 2e 20 20  or that index.  
14c50 57 68 65 6e 20 70 45 78 70 72 3d 3d 4e 55 4c 4c  When pExpr==NULL
14c60 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 65 20   that means the 
14c70 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 0a 2a 2a  constraint is.**
14c80 20 22 78 20 49 53 20 4e 55 4c 4c 22 20 69 6e 73   "x IS NULL" ins
14c90 74 65 61 64 20 6f 66 20 22 78 3d 56 41 4c 55 45  tead of "x=VALUE
14ca0 22 2e 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74  "..**.** Write t
14cb0 68 65 20 65 73 74 69 6d 61 74 65 64 20 72 6f 77  he estimated row
14cc0 20 63 6f 75 6e 74 20 69 6e 74 6f 20 2a 70 6e 52   count into *pnR
14cd0 6f 77 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51  ow and return SQ
14ce0 4c 49 54 45 5f 4f 4b 2e 20 0a 2a 2a 20 49 66 20  LITE_OK. .** If 
14cf0 75 6e 61 62 6c 65 20 74 6f 20 6d 61 6b 65 20 61  unable to make a
14d00 6e 20 65 73 74 69 6d 61 74 65 2c 20 6c 65 61 76  n estimate, leav
14d10 65 20 2a 70 6e 52 6f 77 20 75 6e 63 68 61 6e 67  e *pnRow unchang
14d20 65 64 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a  ed and return.**
14d30 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a   non-zero..**.**
14d40 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61   This routine ca
14d50 6e 20 66 61 69 6c 20 69 66 20 69 74 20 69 73 20  n fail if it is 
14d60 75 6e 61 62 6c 65 20 74 6f 20 6c 6f 61 64 20 61  unable to load a
14d70 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
14d80 6e 63 65 0a 2a 2a 20 72 65 71 75 69 72 65 64 20  nce.** required 
14d90 66 6f 72 20 73 74 72 69 6e 67 20 63 6f 6d 70 61  for string compa
14da0 72 69 73 6f 6e 2c 20 6f 72 20 69 66 20 75 6e 61  rison, or if una
14db0 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  ble to allocate 
14dc0 6d 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20 61 20  memory.** for a 
14dd0 55 54 46 20 63 6f 6e 76 65 72 73 69 6f 6e 20 72  UTF conversion r
14de0 65 71 75 69 72 65 64 20 66 6f 72 20 63 6f 6d 70  equired for comp
14df0 61 72 69 73 6f 6e 2e 20 20 54 68 65 20 65 72 72  arison.  The err
14e00 6f 72 20 69 73 20 73 74 6f 72 65 64 0a 2a 2a 20  or is stored.** 
14e10 69 6e 20 74 68 65 20 70 50 61 72 73 65 20 73 74  in the pParse st
14e20 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74  ructure..*/.stat
14e30 69 63 20 69 6e 74 20 77 68 65 72 65 45 71 75 61  ic int whereEqua
14e40 6c 53 63 61 6e 45 73 74 28 0a 20 20 50 61 72 73  lScanEst(.  Pars
14e50 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
14e60 20 2f 2a 20 50 61 72 73 69 6e 67 20 26 20 63 6f   /* Parsing & co
14e70 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f  de generating co
14e80 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65  ntext */.  Where
14e90 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75  LoopBuilder *pBu
14ea0 69 6c 64 65 72 2c 0a 20 20 45 78 70 72 20 2a 70  ilder,.  Expr *p
14eb0 45 78 70 72 2c 20 20 20 20 20 20 20 20 20 2f 2a  Expr,         /*
14ec0 20 45 78 70 72 65 73 73 69 6f 6e 20 66 6f 72 20   Expression for 
14ed0 56 41 4c 55 45 20 69 6e 20 74 68 65 20 78 3d 56  VALUE in the x=V
14ee0 41 4c 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20  ALUE constraint 
14ef0 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 2a 70 6e  */.  tRowcnt *pn
14f00 52 6f 77 20 20 20 20 20 20 20 2f 2a 20 57 72 69  Row       /* Wri
14f10 74 65 20 74 68 65 20 72 65 76 69 73 65 64 20 72  te the revised r
14f20 6f 77 20 65 73 74 69 6d 61 74 65 20 68 65 72 65  ow estimate here
14f30 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 20 2a   */.){.  Index *
14f40 70 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e  p = pBuilder->pN
14f50 65 77 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  ew->u.btree.pInd
14f60 65 78 3b 0a 20 20 69 6e 74 20 6e 45 71 20 3d 20  ex;.  int nEq = 
14f70 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e  pBuilder->pNew->
14f80 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20 55  u.btree.nEq;.  U
14f90 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
14fa0 52 65 63 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  Rec = pBuilder->
14fb0 70 52 65 63 3b 0a 20 20 75 38 20 61 66 66 3b 20  pRec;.  u8 aff; 
14fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14fd0 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 61 66 66 69    /* Column affi
14fe0 6e 69 74 79 20 2a 2f 0a 20 20 69 6e 74 20 72 63  nity */.  int rc
14ff0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
15000 20 20 20 20 2f 2a 20 53 75 62 66 75 6e 63 74 69      /* Subfuncti
15010 6f 6e 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a  on return code *
15020 2f 0a 20 20 74 52 6f 77 63 6e 74 20 61 5b 32 5d  /.  tRowcnt a[2]
15030 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
15040 20 53 74 61 74 69 73 74 69 63 73 20 2a 2f 0a 20   Statistics */. 
15050 20 69 6e 74 20 62 4f 6b 3b 0a 0a 20 20 61 73 73   int bOk;..  ass
15060 65 72 74 28 20 6e 45 71 3e 3d 31 20 29 3b 0a 20  ert( nEq>=1 );. 
15070 20 61 73 73 65 72 74 28 20 6e 45 71 3c 3d 70 2d   assert( nEq<=p-
15080 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 61 73  >nColumn );.  as
15090 73 65 72 74 28 20 70 2d 3e 61 53 61 6d 70 6c 65  sert( p->aSample
150a0 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
150b0 20 70 2d 3e 6e 53 61 6d 70 6c 65 3e 30 20 29 3b   p->nSample>0 );
150c0 0a 20 20 61 73 73 65 72 74 28 20 70 42 75 69 6c  .  assert( pBuil
150d0 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3c 6e  der->nRecValid<n
150e0 45 71 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 76  Eq );..  /* If v
150f0 61 6c 75 65 73 20 61 72 65 20 6e 6f 74 20 61 76  alues are not av
15100 61 69 6c 61 62 6c 65 20 66 6f 72 20 61 6c 6c 20  ailable for all 
15110 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 69 6e  fields of the in
15120 64 65 78 20 74 6f 20 74 68 65 20 6c 65 66 74 0a  dex to the left.
15130 20 20 2a 2a 20 6f 66 20 74 68 69 73 20 6f 6e 65    ** of this one
15140 2c 20 6e 6f 20 65 73 74 69 6d 61 74 65 20 63 61  , no estimate ca
15150 6e 20 62 65 20 6d 61 64 65 2e 20 52 65 74 75 72  n be made. Retur
15160 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e  n SQLITE_NOTFOUN
15170 44 2e 20 2a 2f 0a 20 20 69 66 28 20 70 42 75 69  D. */.  if( pBui
15180 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3c  lder->nRecValid<
15190 28 6e 45 71 2d 31 29 20 29 7b 0a 20 20 20 20 72  (nEq-1) ){.    r
151a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54  eturn SQLITE_NOT
151b0 46 4f 55 4e 44 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  FOUND;.  }..  /*
151c0 20 54 68 69 73 20 69 73 20 61 6e 20 6f 70 74 69   This is an opti
151d0 6d 69 7a 61 74 69 6f 6e 20 6f 6e 6c 79 2e 20 54  mization only. T
151e0 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  he call to sqlit
151f0 65 33 53 74 61 74 34 50 72 6f 62 65 53 65 74 56  e3Stat4ProbeSetV
15200 61 6c 75 65 28 29 0a 20 20 2a 2a 20 62 65 6c 6f  alue().  ** belo
15210 77 20 77 6f 75 6c 64 20 72 65 74 75 72 6e 20 74  w would return t
15220 68 65 20 73 61 6d 65 20 76 61 6c 75 65 2e 20 20  he same value.  
15230 2a 2f 0a 20 20 69 66 28 20 6e 45 71 3e 3d 70 2d  */.  if( nEq>=p-
15240 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20  >nColumn ){.    
15250 2a 70 6e 52 6f 77 20 3d 20 31 3b 0a 20 20 20 20  *pnRow = 1;.    
15260 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
15270 3b 0a 20 20 7d 0a 0a 20 20 61 66 66 20 3d 20 70  ;.  }..  aff = p
15280 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 70  ->pTable->aCol[p
15290 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 45 71 2d 31  ->aiColumn[nEq-1
152a0 5d 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 72  ]].affinity;.  r
152b0 63 20 3d 20 73 71 6c 69 74 65 33 53 74 61 74 34  c = sqlite3Stat4
152c0 50 72 6f 62 65 53 65 74 56 61 6c 75 65 28 70 50  ProbeSetValue(pP
152d0 61 72 73 65 2c 20 70 2c 20 26 70 52 65 63 2c 20  arse, p, &pRec, 
152e0 70 45 78 70 72 2c 20 61 66 66 2c 20 6e 45 71 2d  pExpr, aff, nEq-
152f0 31 2c 20 26 62 4f 6b 29 3b 0a 20 20 70 42 75 69  1, &bOk);.  pBui
15300 6c 64 65 72 2d 3e 70 52 65 63 20 3d 20 70 52 65  lder->pRec = pRe
15310 63 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  c;.  if( rc!=SQL
15320 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
15330 72 63 3b 0a 20 20 69 66 28 20 62 4f 6b 3d 3d 30  rc;.  if( bOk==0
15340 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
15350 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 20 20 70 42 75  _NOTFOUND;.  pBu
15360 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64  ilder->nRecValid
15370 20 3d 20 6e 45 71 3b 0a 0a 20 20 77 68 65 72 65   = nEq;..  where
15380 4b 65 79 53 74 61 74 73 28 70 50 61 72 73 65 2c  KeyStats(pParse,
15390 20 70 2c 20 70 52 65 63 2c 20 30 2c 20 61 29 3b   p, pRec, 0, a);
153a0 0a 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78  .  WHERETRACE(0x
153b0 31 30 2c 28 22 65 71 75 61 6c 69 74 79 20 73 63  10,("equality sc
153c0 61 6e 20 72 65 67 69 6f 6e 73 3a 20 25 64 5c 6e  an regions: %d\n
153d0 22 2c 20 28 69 6e 74 29 61 5b 31 5d 29 29 3b 0a  ", (int)a[1]));.
153e0 20 20 2a 70 6e 52 6f 77 20 3d 20 61 5b 31 5d 3b    *pnRow = a[1];
153f0 0a 20 20 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  .  .  return rc;
15400 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
15410 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
15420 5f 4f 52 5f 53 54 41 54 34 20 2a 2f 0a 0a 23 69  _OR_STAT4 */..#i
15430 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
15440 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54  LE_STAT3_OR_STAT
15450 34 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65  4./*.** Estimate
15460 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
15470 6f 77 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65  ows that will be
15480 20 72 65 74 75 72 6e 65 64 20 62 61 73 65 64 20   returned based 
15490 6f 6e 0a 2a 2a 20 61 6e 20 49 4e 20 63 6f 6e 73  on.** an IN cons
154a0 74 72 61 69 6e 74 20 77 68 65 72 65 20 74 68 65  traint where the
154b0 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
154c0 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61   of the IN opera
154d0 74 6f 72 0a 2a 2a 20 69 73 20 61 20 6c 69 73 74  tor.** is a list
154e0 20 6f 66 20 76 61 6c 75 65 73 2e 20 20 45 78 61   of values.  Exa
154f0 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  mple:.**.**     
15500 20 20 20 57 48 45 52 45 20 78 20 49 4e 20 28 31     WHERE x IN (1
15510 2c 32 2c 33 2c 34 29 0a 2a 2a 0a 2a 2a 20 57 72  ,2,3,4).**.** Wr
15520 69 74 65 20 74 68 65 20 65 73 74 69 6d 61 74 65  ite the estimate
15530 64 20 72 6f 77 20 63 6f 75 6e 74 20 69 6e 74 6f  d row count into
15540 20 2a 70 6e 52 6f 77 20 61 6e 64 20 72 65 74 75   *pnRow and retu
15550 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 0a 2a  rn SQLITE_OK. .*
15560 2a 20 49 66 20 75 6e 61 62 6c 65 20 74 6f 20 6d  * If unable to m
15570 61 6b 65 20 61 6e 20 65 73 74 69 6d 61 74 65 2c  ake an estimate,
15580 20 6c 65 61 76 65 20 2a 70 6e 52 6f 77 20 75 6e   leave *pnRow un
15590 63 68 61 6e 67 65 64 20 61 6e 64 20 72 65 74 75  changed and retu
155a0 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a  rn.** non-zero..
155b0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
155c0 6e 65 20 63 61 6e 20 66 61 69 6c 20 69 66 20 69  ne can fail if i
155d0 74 20 69 73 20 75 6e 61 62 6c 65 20 74 6f 20 6c  t is unable to l
155e0 6f 61 64 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20  oad a collating 
155f0 73 65 71 75 65 6e 63 65 0a 2a 2a 20 72 65 71 75  sequence.** requ
15600 69 72 65 64 20 66 6f 72 20 73 74 72 69 6e 67 20  ired for string 
15610 63 6f 6d 70 61 72 69 73 6f 6e 2c 20 6f 72 20 69  comparison, or i
15620 66 20 75 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f  f unable to allo
15630 63 61 74 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20 66  cate memory.** f
15640 6f 72 20 61 20 55 54 46 20 63 6f 6e 76 65 72 73  or a UTF convers
15650 69 6f 6e 20 72 65 71 75 69 72 65 64 20 66 6f 72  ion required for
15660 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 20 54 68   comparison.  Th
15670 65 20 65 72 72 6f 72 20 69 73 20 73 74 6f 72 65  e error is store
15680 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70 50 61 72  d.** in the pPar
15690 73 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f  se structure..*/
156a0 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
156b0 65 49 6e 53 63 61 6e 45 73 74 28 0a 20 20 50 61  eInScanEst(.  Pa
156c0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
156d0 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 26 20     /* Parsing & 
156e0 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20  code generating 
156f0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65  context */.  Whe
15700 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70  reLoopBuilder *p
15710 42 75 69 6c 64 65 72 2c 0a 20 20 45 78 70 72 4c  Builder,.  ExprL
15720 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20  ist *pList,     
15730 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 6c 69 73  /* The value lis
15740 74 20 6f 6e 20 74 68 65 20 52 48 53 20 6f 66 20  t on the RHS of 
15750 22 78 20 49 4e 20 28 76 31 2c 76 32 2c 76 33 2c  "x IN (v1,v2,v3,
15760 2e 2e 2e 29 22 20 2a 2f 0a 20 20 74 52 6f 77 63  ...)" */.  tRowc
15770 6e 74 20 2a 70 6e 52 6f 77 20 20 20 20 20 20 20  nt *pnRow       
15780 2f 2a 20 57 72 69 74 65 20 74 68 65 20 72 65 76  /* Write the rev
15790 69 73 65 64 20 72 6f 77 20 65 73 74 69 6d 61 74  ised row estimat
157a0 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 49  e here */.){.  I
157b0 6e 64 65 78 20 2a 70 20 3d 20 70 42 75 69 6c 64  ndex *p = pBuild
157c0 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74 72 65  er->pNew->u.btre
157d0 65 2e 70 49 6e 64 65 78 3b 0a 20 20 69 36 34 20  e.pIndex;.  i64 
157e0 6e 52 6f 77 30 20 3d 20 73 71 6c 69 74 65 33 4c  nRow0 = sqlite3L
157f0 6f 67 45 73 74 54 6f 49 6e 74 28 70 2d 3e 61 69  ogEstToInt(p->ai
15800 52 6f 77 4c 6f 67 45 73 74 5b 30 5d 29 3b 0a 20  RowLogEst[0]);. 
15810 20 69 6e 74 20 6e 52 65 63 56 61 6c 69 64 20 3d   int nRecValid =
15820 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56   pBuilder->nRecV
15830 61 6c 69 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d  alid;.  int rc =
15840 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
15850 2f 2a 20 53 75 62 66 75 6e 63 74 69 6f 6e 20 72  /* Subfunction r
15860 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
15870 74 52 6f 77 63 6e 74 20 6e 45 73 74 3b 20 20 20  tRowcnt nEst;   
15880 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
15890 72 20 6f 66 20 72 6f 77 73 20 66 6f 72 20 61 20  r of rows for a 
158a0 73 69 6e 67 6c 65 20 74 65 72 6d 20 2a 2f 0a 20  single term */. 
158b0 20 74 52 6f 77 63 6e 74 20 6e 52 6f 77 45 73 74   tRowcnt nRowEst
158c0 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 65 77 20   = 0;    /* New 
158d0 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20  estimate of the 
158e0 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 2a  number of rows *
158f0 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
15900 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
15910 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a  oop counter */..
15920 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 53 61    assert( p->aSa
15930 6d 70 6c 65 21 3d 30 20 29 3b 0a 20 20 66 6f 72  mple!=0 );.  for
15940 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45  (i=0; rc==SQLITE
15950 5f 4f 4b 20 26 26 20 69 3c 70 4c 69 73 74 2d 3e  _OK && i<pList->
15960 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
15970 20 6e 45 73 74 20 3d 20 6e 52 6f 77 30 3b 0a 20   nEst = nRow0;. 
15980 20 20 20 72 63 20 3d 20 77 68 65 72 65 45 71 75     rc = whereEqu
15990 61 6c 53 63 61 6e 45 73 74 28 70 50 61 72 73 65  alScanEst(pParse
159a0 2c 20 70 42 75 69 6c 64 65 72 2c 20 70 4c 69 73  , pBuilder, pLis
159b0 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 26  t->a[i].pExpr, &
159c0 6e 45 73 74 29 3b 0a 20 20 20 20 6e 52 6f 77 45  nEst);.    nRowE
159d0 73 74 20 2b 3d 20 6e 45 73 74 3b 0a 20 20 20 20  st += nEst;.    
159e0 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61  pBuilder->nRecVa
159f0 6c 69 64 20 3d 20 6e 52 65 63 56 61 6c 69 64 3b  lid = nRecValid;
15a00 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d  .  }..  if( rc==
15a10 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
15a20 20 69 66 28 20 6e 52 6f 77 45 73 74 20 3e 20 6e   if( nRowEst > n
15a30 52 6f 77 30 20 29 20 6e 52 6f 77 45 73 74 20 3d  Row0 ) nRowEst =
15a40 20 6e 52 6f 77 30 3b 0a 20 20 20 20 2a 70 6e 52   nRow0;.    *pnR
15a50 6f 77 20 3d 20 6e 52 6f 77 45 73 74 3b 0a 20 20  ow = nRowEst;.  
15a60 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78 31    WHERETRACE(0x1
15a70 30 2c 28 22 49 4e 20 72 6f 77 20 65 73 74 69 6d  0,("IN row estim
15a80 61 74 65 3a 20 65 73 74 3d 25 64 5c 6e 22 2c 20  ate: est=%d\n", 
15a90 6e 52 6f 77 45 73 74 29 29 3b 0a 20 20 7d 0a 20  nRowEst));.  }. 
15aa0 20 61 73 73 65 72 74 28 20 70 42 75 69 6c 64 65   assert( pBuilde
15ab0 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3d 3d 6e 52  r->nRecValid==nR
15ac0 65 63 56 61 6c 69 64 20 29 3b 0a 20 20 72 65 74  ecValid );.  ret
15ad0 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
15ae0 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   /* SQLITE_ENABL
15af0 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34  E_STAT3_OR_STAT4
15b00 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 61 62   */../*.** Disab
15b10 6c 65 20 61 20 74 65 72 6d 20 69 6e 20 74 68 65  le a term in the
15b20 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20   WHERE clause.  
15b30 45 78 63 65 70 74 2c 20 64 6f 20 6e 6f 74 20 64  Except, do not d
15b40 69 73 61 62 6c 65 20 74 68 65 20 74 65 72 6d 0a  isable the term.
15b50 2a 2a 20 69 66 20 69 74 20 63 6f 6e 74 72 6f 6c  ** if it control
15b60 73 20 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a  s a LEFT OUTER J
15b70 4f 49 4e 20 61 6e 64 20 69 74 20 64 69 64 20 6e  OIN and it did n
15b80 6f 74 20 6f 72 69 67 69 6e 61 74 65 20 69 6e 20  ot originate in 
15b90 74 68 65 20 4f 4e 0a 2a 2a 20 6f 72 20 55 53 49  the ON.** or USI
15ba0 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 74 68 61  NG clause of tha
15bb0 74 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 43 6f  t join..**.** Co
15bc0 6e 73 69 64 65 72 20 74 68 65 20 74 65 72 6d 20  nsider the term 
15bd0 74 32 2e 7a 3d 27 6f 6b 27 20 69 6e 20 74 68 65  t2.z='ok' in the
15be0 20 66 6f 6c 6c 6f 77 69 6e 67 20 71 75 65 72 69   following queri
15bf0 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20  es:.**.**   (1) 
15c00 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
15c10 31 20 4c 45 46 54 20 4a 4f 49 4e 20 74 32 20 4f  1 LEFT JOIN t2 O
15c20 4e 20 74 31 2e 61 3d 74 32 2e 78 20 57 48 45 52  N t1.a=t2.x WHER
15c30 45 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 20 20  E t2.z='ok'.**  
15c40 20 28 32 29 20 20 53 45 4c 45 43 54 20 2a 20 46   (2)  SELECT * F
15c50 52 4f 4d 20 74 31 20 4c 45 46 54 20 4a 4f 49 4e  ROM t1 LEFT JOIN
15c60 20 74 32 20 4f 4e 20 74 31 2e 61 3d 74 32 2e 78   t2 ON t1.a=t2.x
15c70 20 41 4e 44 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a   AND t2.z='ok'.*
15c80 2a 20 20 20 28 33 29 20 20 53 45 4c 45 43 54 20  *   (3)  SELECT 
15c90 2a 20 46 52 4f 4d 20 74 31 2c 20 74 32 20 57 48  * FROM t1, t2 WH
15ca0 45 52 45 20 74 31 2e 61 3d 74 32 2e 78 20 41 4e  ERE t1.a=t2.x AN
15cb0 44 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 0a 2a  D t2.z='ok'.**.*
15cc0 2a 20 54 68 65 20 74 32 2e 7a 3d 27 6f 6b 27 20  * The t2.z='ok' 
15cd0 69 73 20 64 69 73 61 62 6c 65 64 20 69 6e 20 74  is disabled in t
15ce0 68 65 20 69 6e 20 28 32 29 20 62 65 63 61 75 73  he in (2) becaus
15cf0 65 20 69 74 20 6f 72 69 67 69 6e 61 74 65 73 0a  e it originates.
15d00 2a 2a 20 69 6e 20 74 68 65 20 4f 4e 20 63 6c 61  ** in the ON cla
15d10 75 73 65 2e 20 20 54 68 65 20 74 65 72 6d 20 69  use.  The term i
15d20 73 20 64 69 73 61 62 6c 65 64 20 69 6e 20 28 33  s disabled in (3
15d30 29 20 62 65 63 61 75 73 65 20 69 74 20 69 73 20  ) because it is 
15d40 6e 6f 74 20 70 61 72 74 0a 2a 2a 20 6f 66 20 61  not part.** of a
15d50 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e   LEFT OUTER JOIN
15d60 2e 20 20 49 6e 20 28 31 29 2c 20 74 68 65 20 74  .  In (1), the t
15d70 65 72 6d 20 69 73 20 6e 6f 74 20 64 69 73 61 62  erm is not disab
15d80 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 44 69 73 61 62  led..**.** Disab
15d90 6c 69 6e 67 20 61 20 74 65 72 6d 20 63 61 75 73  ling a term caus
15da0 65 73 20 74 68 61 74 20 74 65 72 6d 20 74 6f 20  es that term to 
15db0 6e 6f 74 20 62 65 20 74 65 73 74 65 64 20 69 6e  not be tested in
15dc0 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a   the inner loop.
15dd0 2a 2a 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20  ** of the join. 
15de0 20 44 69 73 61 62 6c 69 6e 67 20 69 73 20 61 6e   Disabling is an
15df0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20   optimization.  
15e00 57 68 65 6e 20 74 65 72 6d 73 20 61 72 65 20 73  When terms are s
15e10 61 74 69 73 66 69 65 64 0a 2a 2a 20 62 79 20 69  atisfied.** by i
15e20 6e 64 69 63 65 73 2c 20 77 65 20 64 69 73 61 62  ndices, we disab
15e30 6c 65 20 74 68 65 6d 20 74 6f 20 70 72 65 76 65  le them to preve
15e40 6e 74 20 72 65 64 75 6e 64 61 6e 74 20 74 65 73  nt redundant tes
15e50 74 73 20 69 6e 20 74 68 65 20 69 6e 6e 65 72 0a  ts in the inner.
15e60 2a 2a 20 6c 6f 6f 70 2e 20 20 57 65 20 77 6f 75  ** loop.  We wou
15e70 6c 64 20 67 65 74 20 74 68 65 20 63 6f 72 72 65  ld get the corre
15e80 63 74 20 72 65 73 75 6c 74 73 20 69 66 20 6e 6f  ct results if no
15e90 74 68 69 6e 67 20 77 65 72 65 20 65 76 65 72 20  thing were ever 
15ea0 64 69 73 61 62 6c 65 64 2c 0a 2a 2a 20 62 75 74  disabled,.** but
15eb0 20 6a 6f 69 6e 73 20 6d 69 67 68 74 20 72 75 6e   joins might run
15ec0 20 61 20 6c 69 74 74 6c 65 20 73 6c 6f 77 65 72   a little slower
15ed0 2e 20 20 54 68 65 20 74 72 69 63 6b 20 69 73 20  .  The trick is 
15ee0 74 6f 20 64 69 73 61 62 6c 65 20 61 73 20 6d 75  to disable as mu
15ef0 63 68 0a 2a 2a 20 61 73 20 77 65 20 63 61 6e 20  ch.** as we can 
15f00 77 69 74 68 6f 75 74 20 64 69 73 61 62 6c 69 6e  without disablin
15f10 67 20 74 6f 6f 20 6d 75 63 68 2e 20 20 49 66 20  g too much.  If 
15f20 77 65 20 64 69 73 61 62 6c 65 64 20 69 6e 20 28  we disabled in (
15f30 31 29 2c 20 77 65 27 64 20 67 65 74 0a 2a 2a 20  1), we'd get.** 
15f40 74 68 65 20 77 72 6f 6e 67 20 61 6e 73 77 65 72  the wrong answer
15f50 2e 20 20 53 65 65 20 74 69 63 6b 65 74 20 23 38  .  See ticket #8
15f60 31 33 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  13..*/.static vo
15f70 69 64 20 64 69 73 61 62 6c 65 54 65 72 6d 28 57  id disableTerm(W
15f80 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65  hereLevel *pLeve
15f90 6c 2c 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  l, WhereTerm *pT
15fa0 65 72 6d 29 7b 0a 20 20 69 66 28 20 70 54 65 72  erm){.  if( pTer
15fb0 6d 0a 20 20 20 20 20 20 26 26 20 28 70 54 65 72  m.      && (pTer
15fc0 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
15fd0 4d 5f 43 4f 44 45 44 29 3d 3d 30 0a 20 20 20 20  M_CODED)==0.    
15fe0 20 20 26 26 20 28 70 4c 65 76 65 6c 2d 3e 69 4c    && (pLevel->iL
15ff0 65 66 74 4a 6f 69 6e 3d 3d 30 20 7c 7c 20 45 78  eftJoin==0 || Ex
16000 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 54  prHasProperty(pT
16010 65 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f 46  erm->pExpr, EP_F
16020 72 6f 6d 4a 6f 69 6e 29 29 0a 20 20 20 20 20 20  romJoin)).      
16030 26 26 20 28 70 4c 65 76 65 6c 2d 3e 6e 6f 74 52  && (pLevel->notR
16040 65 61 64 79 20 26 20 70 54 65 72 6d 2d 3e 70 72  eady & pTerm->pr
16050 65 72 65 71 41 6c 6c 29 3d 3d 30 0a 20 20 29 7b  ereqAll)==0.  ){
16060 0a 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c  .    pTerm->wtFl
16070 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45  ags |= TERM_CODE
16080 44 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d  D;.    if( pTerm
16090 2d 3e 69 50 61 72 65 6e 74 3e 3d 30 20 29 7b 0a  ->iParent>=0 ){.
160a0 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20        WhereTerm 
160b0 2a 70 4f 74 68 65 72 20 3d 20 26 70 54 65 72 6d  *pOther = &pTerm
160c0 2d 3e 70 57 43 2d 3e 61 5b 70 54 65 72 6d 2d 3e  ->pWC->a[pTerm->
160d0 69 50 61 72 65 6e 74 5d 3b 0a 20 20 20 20 20 20  iParent];.      
160e0 69 66 28 20 28 2d 2d 70 4f 74 68 65 72 2d 3e 6e  if( (--pOther->n
160f0 43 68 69 6c 64 29 3d 3d 30 20 29 7b 0a 20 20 20  Child)==0 ){.   
16100 20 20 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d       disableTerm
16110 28 70 4c 65 76 65 6c 2c 20 70 4f 74 68 65 72 29  (pLevel, pOther)
16120 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
16130 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64    }.}../*.** Cod
16140 65 20 61 6e 20 4f 50 5f 41 66 66 69 6e 69 74 79  e an OP_Affinity
16150 20 6f 70 63 6f 64 65 20 74 6f 20 61 70 70 6c 79   opcode to apply
16160 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61 66 66 69   the column affi
16170 6e 69 74 79 20 73 74 72 69 6e 67 20 7a 41 66 66  nity string zAff
16180 0a 2a 2a 20 74 6f 20 74 68 65 20 6e 20 72 65 67  .** to the n reg
16190 69 73 74 65 72 73 20 73 74 61 72 74 69 6e 67 20  isters starting 
161a0 61 74 20 62 61 73 65 2e 20 0a 2a 2a 0a 2a 2a 20  at base. .**.** 
161b0 41 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69  As an optimizati
161c0 6f 6e 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  on, SQLITE_AFF_N
161d0 4f 4e 45 20 65 6e 74 72 69 65 73 20 28 77 68 69  ONE entries (whi
161e0 63 68 20 61 72 65 20 6e 6f 2d 6f 70 73 29 20 61  ch are no-ops) a
161f0 74 20 74 68 65 0a 2a 2a 20 62 65 67 69 6e 6e 69  t the.** beginni
16200 6e 67 20 61 6e 64 20 65 6e 64 20 6f 66 20 7a 41  ng and end of zA
16210 66 66 20 61 72 65 20 69 67 6e 6f 72 65 64 2e 20  ff are ignored. 
16220 20 49 66 20 61 6c 6c 20 65 6e 74 72 69 65 73 20   If all entries 
16230 69 6e 20 7a 41 66 66 20 61 72 65 0a 2a 2a 20 53  in zAff are.** S
16240 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 2c 20  QLITE_AFF_NONE, 
16250 74 68 65 6e 20 6e 6f 20 63 6f 64 65 20 67 65 74  then no code get
16260 73 20 67 65 6e 65 72 61 74 65 64 2e 0a 2a 2a 0a  s generated..**.
16270 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
16280 6d 61 6b 65 73 20 69 74 73 20 6f 77 6e 20 63 6f  makes its own co
16290 70 79 20 6f 66 20 7a 41 66 66 20 73 6f 20 74 68  py of zAff so th
162a0 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73  at the caller is
162b0 20 66 72 65 65 0a 2a 2a 20 74 6f 20 6d 6f 64 69   free.** to modi
162c0 66 79 20 7a 41 66 66 20 61 66 74 65 72 20 74 68  fy zAff after th
162d0 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
162e0 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ns..*/.static vo
162f0 69 64 20 63 6f 64 65 41 70 70 6c 79 41 66 66 69  id codeApplyAffi
16300 6e 69 74 79 28 50 61 72 73 65 20 2a 70 50 61 72  nity(Parse *pPar
16310 73 65 2c 20 69 6e 74 20 62 61 73 65 2c 20 69 6e  se, int base, in
16320 74 20 6e 2c 20 63 68 61 72 20 2a 7a 41 66 66 29  t n, char *zAff)
16330 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
16340 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
16350 66 28 20 7a 41 66 66 3d 3d 30 20 29 7b 0a 20 20  f( zAff==0 ){.  
16360 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
16370 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
16380 65 64 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ed );.    return
16390 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
163a0 76 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 64  v!=0 );..  /* Ad
163b0 6a 75 73 74 20 62 61 73 65 20 61 6e 64 20 6e 20  just base and n 
163c0 74 6f 20 73 6b 69 70 20 6f 76 65 72 20 53 51 4c  to skip over SQL
163d0 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 65 6e 74  ITE_AFF_NONE ent
163e0 72 69 65 73 20 61 74 20 74 68 65 20 62 65 67 69  ries at the begi
163f0 6e 6e 69 6e 67 0a 20 20 2a 2a 20 61 6e 64 20 65  nning.  ** and e
16400 6e 64 20 6f 66 20 74 68 65 20 61 66 66 69 6e 69  nd of the affini
16410 74 79 20 73 74 72 69 6e 67 2e 0a 20 20 2a 2f 0a  ty string..  */.
16420 20 20 77 68 69 6c 65 28 20 6e 3e 30 20 26 26 20    while( n>0 && 
16430 7a 41 66 66 5b 30 5d 3d 3d 53 51 4c 49 54 45 5f  zAff[0]==SQLITE_
16440 41 46 46 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20  AFF_NONE ){.    
16450 6e 2d 2d 3b 0a 20 20 20 20 62 61 73 65 2b 2b 3b  n--;.    base++;
16460 0a 20 20 20 20 7a 41 66 66 2b 2b 3b 0a 20 20 7d  .    zAff++;.  }
16470 0a 20 20 77 68 69 6c 65 28 20 6e 3e 31 20 26 26  .  while( n>1 &&
16480 20 7a 41 66 66 5b 6e 2d 31 5d 3d 3d 53 51 4c 49   zAff[n-1]==SQLI
16490 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 29 7b 0a 20  TE_AFF_NONE ){. 
164a0 20 20 20 6e 2d 2d 3b 0a 20 20 7d 0a 0a 20 20 2f     n--;.  }..  /
164b0 2a 20 43 6f 64 65 20 74 68 65 20 4f 50 5f 41 66  * Code the OP_Af
164c0 66 69 6e 69 74 79 20 6f 70 63 6f 64 65 20 69 66  finity opcode if
164d0 20 74 68 65 72 65 20 69 73 20 61 6e 79 74 68 69   there is anythi
164e0 6e 67 20 6c 65 66 74 20 74 6f 20 64 6f 2e 20 2a  ng left to do. *
164f0 2f 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20  /.  if( n>0 ){. 
16500 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
16510 64 4f 70 32 28 76 2c 20 4f 50 5f 41 66 66 69 6e  dOp2(v, OP_Affin
16520 69 74 79 2c 20 62 61 73 65 2c 20 6e 29 3b 0a 20  ity, base, n);. 
16530 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
16540 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 7a 41  angeP4(v, -1, zA
16550 66 66 2c 20 6e 29 3b 0a 20 20 20 20 73 71 6c 69  ff, n);.    sqli
16560 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69  te3ExprCacheAffi
16570 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73  nityChange(pPars
16580 65 2c 20 62 61 73 65 2c 20 6e 29 3b 0a 20 20 7d  e, base, n);.  }
16590 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  .}.../*.** Gener
165a0 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20 73  ate code for a s
165b0 69 6e 67 6c 65 20 65 71 75 61 6c 69 74 79 20 74  ingle equality t
165c0 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45  erm of the WHERE
165d0 20 63 6c 61 75 73 65 2e 20 20 41 6e 20 65 71 75   clause.  An equ
165e0 61 6c 69 74 79 0a 2a 2a 20 74 65 72 6d 20 63 61  ality.** term ca
165f0 6e 20 62 65 20 65 69 74 68 65 72 20 58 3d 65 78  n be either X=ex
16600 70 72 20 6f 72 20 58 20 49 4e 20 28 2e 2e 2e 29  pr or X IN (...)
16610 2e 20 20 20 70 54 65 72 6d 20 69 73 20 74 68 65  .   pTerm is the
16620 20 74 65 72 6d 20 74 6f 20 62 65 20 0a 2a 2a 20   term to be .** 
16630 63 6f 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  coded..**.** The
16640 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 66   current value f
16650 6f 72 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e  or the constrain
16660 74 20 69 73 20 6c 65 66 74 20 69 6e 20 72 65 67  t is left in reg
16670 69 73 74 65 72 20 69 52 65 67 2e 0a 2a 2a 0a 2a  ister iReg..**.*
16680 2a 20 46 6f 72 20 61 20 63 6f 6e 73 74 72 61 69  * For a constrai
16690 6e 74 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 58  nt of the form X
166a0 3d 65 78 70 72 2c 20 74 68 65 20 65 78 70 72 65  =expr, the expre
166b0 73 73 69 6f 6e 20 69 73 20 65 76 61 6c 75 61 74  ssion is evaluat
166c0 65 64 20 61 6e 64 20 69 74 73 0a 2a 2a 20 72 65  ed and its.** re
166d0 73 75 6c 74 20 69 73 20 6c 65 66 74 20 6f 6e 20  sult is left on 
166e0 74 68 65 20 73 74 61 63 6b 2e 20 20 46 6f 72 20  the stack.  For 
166f0 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 66 20 74  constraints of t
16700 68 65 20 66 6f 72 6d 20 58 20 49 4e 20 28 2e 2e  he form X IN (..
16710 2e 29 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  .).** this routi
16720 6e 65 20 73 65 74 73 20 75 70 20 61 20 6c 6f 6f  ne sets up a loo
16730 70 20 74 68 61 74 20 77 69 6c 6c 20 69 74 65 72  p that will iter
16740 61 74 65 20 6f 76 65 72 20 61 6c 6c 20 76 61 6c  ate over all val
16750 75 65 73 20 6f 66 20 58 2e 0a 2a 2f 0a 73 74 61  ues of X..*/.sta
16760 74 69 63 20 69 6e 74 20 63 6f 64 65 45 71 75 61  tic int codeEqua
16770 6c 69 74 79 54 65 72 6d 28 0a 20 20 50 61 72 73  lityTerm(.  Pars
16780 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
16790 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63  /* The parsing c
167a0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72  ontext */.  Wher
167b0 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 20 20  eTerm *pTerm,   
167c0 2f 2a 20 54 68 65 20 74 65 72 6d 20 6f 66 20 74  /* The term of t
167d0 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
167e0 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20  to be coded */. 
167f0 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65   WhereLevel *pLe
16800 76 65 6c 2c 20 2f 2a 20 54 68 65 20 6c 65 76 65  vel, /* The leve
16810 6c 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c  l of the FROM cl
16820 61 75 73 65 20 77 65 20 61 72 65 20 77 6f 72 6b  ause we are work
16830 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ing on */.  int 
16840 69 45 71 2c 20 20 20 20 20 20 20 20 20 20 20 20  iEq,            
16850 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20  /* Index of the 
16860 65 71 75 61 6c 69 74 79 20 74 65 72 6d 20 77 69  equality term wi
16870 74 68 69 6e 20 74 68 69 73 20 6c 65 76 65 6c 20  thin this level 
16880 2a 2f 0a 20 20 69 6e 74 20 62 52 65 76 2c 20 20  */.  int bRev,  
16890 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
168a0 20 66 6f 72 20 72 65 76 65 72 73 65 2d 6f 72 64   for reverse-ord
168b0 65 72 20 49 4e 20 6f 70 65 72 61 74 69 6f 6e 73  er IN operations
168c0 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 72 67 65   */.  int iTarge
168d0 74 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74 74  t         /* Att
168e0 65 6d 70 74 20 74 6f 20 6c 65 61 76 65 20 72 65  empt to leave re
168f0 73 75 6c 74 73 20 69 6e 20 74 68 69 73 20 72 65  sults in this re
16900 67 69 73 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 45  gister */.){.  E
16910 78 70 72 20 2a 70 58 20 3d 20 70 54 65 72 6d 2d  xpr *pX = pTerm-
16920 3e 70 45 78 70 72 3b 0a 20 20 56 64 62 65 20 2a  >pExpr;.  Vdbe *
16930 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
16940 65 3b 0a 20 20 69 6e 74 20 69 52 65 67 3b 20 20  e;.  int iReg;  
16950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16960 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64  /* Register hold
16970 69 6e 67 20 72 65 73 75 6c 74 73 20 2a 2f 0a 0a  ing results */..
16980 20 20 61 73 73 65 72 74 28 20 69 54 61 72 67 65    assert( iTarge
16990 74 3e 30 20 29 3b 0a 20 20 69 66 28 20 70 58 2d  t>0 );.  if( pX-
169a0 3e 6f 70 3d 3d 54 4b 5f 45 51 20 29 7b 0a 20 20  >op==TK_EQ ){.  
169b0 20 20 69 52 65 67 20 3d 20 73 71 6c 69 74 65 33    iReg = sqlite3
169c0 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70  ExprCodeTarget(p
169d0 50 61 72 73 65 2c 20 70 58 2d 3e 70 52 69 67 68  Parse, pX->pRigh
169e0 74 2c 20 69 54 61 72 67 65 74 29 3b 0a 20 20 7d  t, iTarget);.  }
169f0 65 6c 73 65 20 69 66 28 20 70 58 2d 3e 6f 70 3d  else if( pX->op=
16a00 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20  =TK_ISNULL ){.  
16a10 20 20 69 52 65 67 20 3d 20 69 54 61 72 67 65 74    iReg = iTarget
16a20 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
16a30 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75  eAddOp2(v, OP_Nu
16a40 6c 6c 2c 20 30 2c 20 69 52 65 67 29 3b 0a 23 69  ll, 0, iReg);.#i
16a50 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
16a60 54 5f 53 55 42 51 55 45 52 59 0a 20 20 7d 65 6c  T_SUBQUERY.  }el
16a70 73 65 7b 0a 20 20 20 20 69 6e 74 20 65 54 79 70  se{.    int eTyp
16a80 65 3b 0a 20 20 20 20 69 6e 74 20 69 54 61 62 3b  e;.    int iTab;
16a90 0a 20 20 20 20 73 74 72 75 63 74 20 49 6e 4c 6f  .    struct InLo
16aa0 6f 70 20 2a 70 49 6e 3b 0a 20 20 20 20 57 68 65  op *pIn;.    Whe
16ab0 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 20 3d 20  reLoop *pLoop = 
16ac0 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a  pLevel->pWLoop;.
16ad0 0a 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d  .    if( (pLoop-
16ae0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
16af0 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d  _VIRTUALTABLE)==
16b00 30 0a 20 20 20 20 20 20 26 26 20 70 4c 6f 6f 70  0.      && pLoop
16b10 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
16b20 21 3d 30 0a 20 20 20 20 20 20 26 26 20 70 4c 6f  !=0.      && pLo
16b30 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  op->u.btree.pInd
16b40 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69  ex->aSortOrder[i
16b50 45 71 5d 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  Eq].    ){.     
16b60 20 74 65 73 74 63 61 73 65 28 20 69 45 71 3d 3d   testcase( iEq==
16b70 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  0 );.      testc
16b80 61 73 65 28 20 62 52 65 76 20 29 3b 0a 20 20 20  ase( bRev );.   
16b90 20 20 20 62 52 65 76 20 3d 20 21 62 52 65 76 3b     bRev = !bRev;
16ba0 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
16bb0 74 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e  t( pX->op==TK_IN
16bc0 20 29 3b 0a 20 20 20 20 69 52 65 67 20 3d 20 69   );.    iReg = i
16bd0 54 61 72 67 65 74 3b 0a 20 20 20 20 65 54 79 70  Target;.    eTyp
16be0 65 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49  e = sqlite3FindI
16bf0 6e 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70  nIndex(pParse, p
16c00 58 2c 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50  X, IN_INDEX_LOOP
16c10 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 65 54  , 0);.    if( eT
16c20 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 49 4e  ype==IN_INDEX_IN
16c30 44 45 58 5f 44 45 53 43 20 29 7b 0a 20 20 20 20  DEX_DESC ){.    
16c40 20 20 74 65 73 74 63 61 73 65 28 20 62 52 65 76    testcase( bRev
16c50 20 29 3b 0a 20 20 20 20 20 20 62 52 65 76 20 3d   );.      bRev =
16c60 20 21 62 52 65 76 3b 0a 20 20 20 20 7d 0a 20 20   !bRev;.    }.  
16c70 20 20 69 54 61 62 20 3d 20 70 58 2d 3e 69 54 61    iTab = pX->iTa
16c80 62 6c 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ble;.    sqlite3
16c90 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 62 52  VdbeAddOp2(v, bR
16ca0 65 76 20 3f 20 4f 50 5f 4c 61 73 74 20 3a 20 4f  ev ? OP_Last : O
16cb0 50 5f 52 65 77 69 6e 64 2c 20 69 54 61 62 2c 20  P_Rewind, iTab, 
16cc0 30 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65  0);.    VdbeCove
16cd0 72 61 67 65 49 66 28 76 2c 20 62 52 65 76 29 3b  rageIf(v, bRev);
16ce0 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67  .    VdbeCoverag
16cf0 65 49 66 28 76 2c 20 21 62 52 65 76 29 3b 0a 20  eIf(v, !bRev);. 
16d00 20 20 20 61 73 73 65 72 74 28 20 28 70 4c 6f 6f     assert( (pLoo
16d10 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
16d20 52 45 5f 4d 55 4c 54 49 5f 4f 52 29 3d 3d 30 20  RE_MULTI_OR)==0 
16d30 29 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 77 73  );.    pLoop->ws
16d40 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 49  Flags |= WHERE_I
16d50 4e 5f 41 42 4c 45 3b 0a 20 20 20 20 69 66 28 20  N_ABLE;.    if( 
16d60 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e  pLevel->u.in.nIn
16d70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 4c 65  ==0 ){.      pLe
16d80 76 65 6c 2d 3e 61 64 64 72 4e 78 74 20 3d 20 73  vel->addrNxt = s
16d90 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
16da0 62 65 6c 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20  bel(v);.    }.  
16db0 20 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e    pLevel->u.in.n
16dc0 49 6e 2b 2b 3b 0a 20 20 20 20 70 4c 65 76 65 6c  In++;.    pLevel
16dd0 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 20 3d  ->u.in.aInLoop =
16de0 0a 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  .       sqlite3D
16df0 62 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 70  bReallocOrFree(p
16e00 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c 65 76 65  Parse->db, pLeve
16e10 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 2c  l->u.in.aInLoop,
16e20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
16e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
16e40 69 7a 65 6f 66 28 70 4c 65 76 65 6c 2d 3e 75 2e  izeof(pLevel->u.
16e50 69 6e 2e 61 49 6e 4c 6f 6f 70 5b 30 5d 29 2a 70  in.aInLoop[0])*p
16e60 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 29  Level->u.in.nIn)
16e70 3b 0a 20 20 20 20 70 49 6e 20 3d 20 70 4c 65 76  ;.    pIn = pLev
16e80 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70  el->u.in.aInLoop
16e90 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 20 29 7b  ;.    if( pIn ){
16ea0 0a 20 20 20 20 20 20 70 49 6e 20 2b 3d 20 70 4c  .      pIn += pL
16eb0 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 20 2d  evel->u.in.nIn -
16ec0 20 31 3b 0a 20 20 20 20 20 20 70 49 6e 2d 3e 69   1;.      pIn->i
16ed0 43 75 72 20 3d 20 69 54 61 62 3b 0a 20 20 20 20  Cur = iTab;.    
16ee0 20 20 69 66 28 20 65 54 79 70 65 3d 3d 49 4e 5f    if( eType==IN_
16ef0 49 4e 44 45 58 5f 52 4f 57 49 44 20 29 7b 0a 20  INDEX_ROWID ){. 
16f00 20 20 20 20 20 20 20 70 49 6e 2d 3e 61 64 64 72         pIn->addr
16f10 49 6e 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56  InTop = sqlite3V
16f20 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
16f30 52 6f 77 69 64 2c 20 69 54 61 62 2c 20 69 52 65  Rowid, iTab, iRe
16f40 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  g);.      }else{
16f50 0a 20 20 20 20 20 20 20 20 70 49 6e 2d 3e 61 64  .        pIn->ad
16f60 64 72 49 6e 54 6f 70 20 3d 20 73 71 6c 69 74 65  drInTop = sqlite
16f70 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
16f80 50 5f 43 6f 6c 75 6d 6e 2c 20 69 54 61 62 2c 20  P_Column, iTab, 
16f90 30 2c 20 69 52 65 67 29 3b 0a 20 20 20 20 20 20  0, iReg);.      
16fa0 7d 0a 20 20 20 20 20 20 70 49 6e 2d 3e 65 45 6e  }.      pIn->eEn
16fb0 64 4c 6f 6f 70 4f 70 20 3d 20 62 52 65 76 20 3f  dLoopOp = bRev ?
16fc0 20 4f 50 5f 50 72 65 76 49 66 4f 70 65 6e 20 3a   OP_PrevIfOpen :
16fd0 20 4f 50 5f 4e 65 78 74 49 66 4f 70 65 6e 3b 0a   OP_NextIfOpen;.
16fe0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
16ff0 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 73  eAddOp1(v, OP_Is
17000 4e 75 6c 6c 2c 20 69 52 65 67 29 3b 20 56 64 62  Null, iReg); Vdb
17010 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
17020 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
17030 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 20  Level->u.in.nIn 
17040 3d 20 30 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  = 0;.    }.#endi
17050 66 0a 20 20 7d 0a 20 20 64 69 73 61 62 6c 65 54  f.  }.  disableT
17060 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 54 65 72  erm(pLevel, pTer
17070 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 52 65  m);.  return iRe
17080 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  g;.}../*.** Gene
17090 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77  rate code that w
170a0 69 6c 6c 20 65 76 61 6c 75 61 74 65 20 61 6c 6c  ill evaluate all
170b0 20 3d 3d 20 61 6e 64 20 49 4e 20 63 6f 6e 73 74   == and IN const
170c0 72 61 69 6e 74 73 20 66 6f 72 20 61 6e 0a 2a 2a  raints for an.**
170d0 20 69 6e 64 65 78 20 73 63 61 6e 2e 0a 2a 2a 0a   index scan..**.
170e0 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  ** For example, 
170f0 63 6f 6e 73 69 64 65 72 20 74 61 62 6c 65 20 74  consider table t
17100 31 28 61 2c 62 2c 63 2c 64 2c 65 2c 66 29 20 77  1(a,b,c,d,e,f) w
17110 69 74 68 20 69 6e 64 65 78 20 69 31 28 61 2c 62  ith index i1(a,b
17120 2c 63 29 2e 0a 2a 2a 20 53 75 70 70 6f 73 65 20  ,c)..** Suppose 
17130 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
17140 20 69 73 20 74 68 69 73 3a 20 20 61 3d 3d 35 20   is this:  a==5 
17150 41 4e 44 20 62 20 49 4e 20 28 31 2c 32 2c 33 29  AND b IN (1,2,3)
17160 20 41 4e 44 20 63 3e 35 20 41 4e 44 20 63 3c 31   AND c>5 AND c<1
17170 30 0a 2a 2a 20 54 68 65 20 69 6e 64 65 78 20 68  0.** The index h
17180 61 73 20 61 73 20 6d 61 6e 79 20 61 73 20 74 68  as as many as th
17190 72 65 65 20 65 71 75 61 6c 69 74 79 20 63 6f 6e  ree equality con
171a0 73 74 72 61 69 6e 74 73 2c 20 62 75 74 20 69 6e  straints, but in
171b0 20 74 68 69 73 0a 2a 2a 20 65 78 61 6d 70 6c 65   this.** example
171c0 2c 20 74 68 65 20 74 68 69 72 64 20 22 63 22 20  , the third "c" 
171d0 76 61 6c 75 65 20 69 73 20 61 6e 20 69 6e 65 71  value is an ineq
171e0 75 61 6c 69 74 79 2e 20 20 53 6f 20 6f 6e 6c 79  uality.  So only
171f0 20 74 77 6f 20 0a 2a 2a 20 63 6f 6e 73 74 72 61   two .** constra
17200 69 6e 74 73 20 61 72 65 20 63 6f 64 65 64 2e 20  ints are coded. 
17210 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   This routine wi
17220 6c 6c 20 67 65 6e 65 72 61 74 65 20 63 6f 64 65  ll generate code
17230 20 74 6f 20 65 76 61 6c 75 61 74 65 0a 2a 2a 20   to evaluate.** 
17240 61 3d 3d 35 20 61 6e 64 20 62 20 49 4e 20 28 31  a==5 and b IN (1
17250 2c 32 2c 33 29 2e 20 20 54 68 65 20 63 75 72 72  ,2,3).  The curr
17260 65 6e 74 20 76 61 6c 75 65 73 20 66 6f 72 20 61  ent values for a
17270 20 61 6e 64 20 62 20 77 69 6c 6c 20 62 65 20 73   and b will be s
17280 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 63 6f 6e 73  tored.** in cons
17290 65 63 75 74 69 76 65 20 72 65 67 69 73 74 65 72  ecutive register
172a0 73 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20  s and the index 
172b0 6f 66 20 74 68 65 20 66 69 72 73 74 20 72 65 67  of the first reg
172c0 69 73 74 65 72 20 69 73 20 72 65 74 75 72 6e 65  ister is returne
172d0 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20  d..**.** In the 
172e0 65 78 61 6d 70 6c 65 20 61 62 6f 76 65 20 6e 45  example above nE
172f0 71 3d 3d 32 2e 20 20 42 75 74 20 74 68 69 73 20  q==2.  But this 
17300 73 75 62 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73  subroutine works
17310 20 66 6f 72 20 61 6e 79 20 76 61 6c 75 65 0a 2a   for any value.*
17320 2a 20 6f 66 20 6e 45 71 20 69 6e 63 6c 75 64 69  * of nEq includi
17330 6e 67 20 30 2e 20 20 49 66 20 6e 45 71 3d 3d 30  ng 0.  If nEq==0
17340 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
17350 73 20 6e 65 61 72 6c 79 20 61 20 6e 6f 2d 6f 70  s nearly a no-op
17360 2e 0a 2a 2a 20 54 68 65 20 6f 6e 6c 79 20 74 68  ..** The only th
17370 69 6e 67 20 69 74 20 64 6f 65 73 20 69 73 20 61  ing it does is a
17380 6c 6c 6f 63 61 74 65 20 74 68 65 20 70 4c 65 76  llocate the pLev
17390 65 6c 2d 3e 69 4d 65 6d 20 6d 65 6d 6f 72 79 20  el->iMem memory 
173a0 63 65 6c 6c 20 61 6e 64 0a 2a 2a 20 63 6f 6d 70  cell and.** comp
173b0 75 74 65 20 74 68 65 20 61 66 66 69 6e 69 74 79  ute the affinity
173c0 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54   string..**.** T
173d0 68 65 20 6e 45 78 74 72 61 52 65 67 20 70 61 72  he nExtraReg par
173e0 61 6d 65 74 65 72 20 69 73 20 30 20 6f 72 20 31  ameter is 0 or 1
173f0 2e 20 20 49 74 20 69 73 20 30 20 69 66 20 61 6c  .  It is 0 if al
17400 6c 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 63  l WHERE clause c
17410 6f 6e 73 74 72 61 69 6e 74 73 0a 2a 2a 20 61 72  onstraints.** ar
17420 65 20 3d 3d 20 6f 72 20 49 4e 20 61 6e 64 20 61  e == or IN and a
17430 72 65 20 63 6f 76 65 72 65 64 20 62 79 20 74 68  re covered by th
17440 65 20 6e 45 71 2e 20 20 6e 45 78 74 72 61 52 65  e nEq.  nExtraRe
17450 67 20 69 73 20 31 20 69 66 20 74 68 65 72 65 20  g is 1 if there 
17460 69 73 0a 2a 2a 20 61 6e 20 69 6e 65 71 75 61 6c  is.** an inequal
17470 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 28  ity constraint (
17480 73 75 63 68 20 61 73 20 74 68 65 20 22 63 3e 3d  such as the "c>=
17490 35 20 41 4e 44 20 63 3c 31 30 22 20 69 6e 20 74  5 AND c<10" in t
174a0 68 65 20 65 78 61 6d 70 6c 65 29 20 74 68 61 74  he example) that
174b0 0a 2a 2a 20 6f 63 63 75 72 73 20 61 66 74 65 72  .** occurs after
174c0 20 74 68 65 20 6e 45 71 20 71 75 61 6c 69 74 79   the nEq quality
174d0 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 0a 2a 2a   constraints..**
174e0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
174f0 20 61 6c 6c 6f 63 61 74 65 73 20 61 20 72 61 6e   allocates a ran
17500 67 65 20 6f 66 20 6e 45 71 2b 6e 45 78 74 72 61  ge of nEq+nExtra
17510 52 65 67 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73  Reg memory cells
17520 20 61 6e 64 20 72 65 74 75 72 6e 73 0a 2a 2a 20   and returns.** 
17530 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  the index of the
17540 20 66 69 72 73 74 20 6d 65 6d 6f 72 79 20 63 65   first memory ce
17550 6c 6c 20 69 6e 20 74 68 61 74 20 72 61 6e 67 65  ll in that range
17560 2e 20 54 68 65 20 63 6f 64 65 20 74 68 61 74 0a  . The code that.
17570 2a 2a 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f  ** calls this ro
17580 75 74 69 6e 65 20 77 69 6c 6c 20 75 73 65 20 74  utine will use t
17590 68 61 74 20 6d 65 6d 6f 72 79 20 72 61 6e 67 65  hat memory range
175a0 20 74 6f 20 73 74 6f 72 65 20 6b 65 79 73 20 66   to store keys f
175b0 6f 72 0a 2a 2a 20 73 74 61 72 74 20 61 6e 64 20  or.** start and 
175c0 74 65 72 6d 69 6e 61 74 69 6f 6e 20 63 6f 6e 64  termination cond
175d0 69 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 6c 6f  itions of the lo
175e0 6f 70 2e 0a 2a 2a 20 6b 65 79 20 76 61 6c 75 65  op..** key value
175f0 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20 20 49   of the loop.  I
17600 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 49 4e  f one or more IN
17610 20 6f 70 65 72 61 74 6f 72 73 20 61 70 70 65 61   operators appea
17620 72 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20  r, then.** this 
17630 72 6f 75 74 69 6e 65 20 61 6c 6c 6f 63 61 74 65  routine allocate
17640 73 20 61 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20  s an additional 
17650 6e 45 71 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73  nEq memory cells
17660 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c 0a 2a 2a   for internal.**
17670 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f   use..**.** Befo
17680 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 2a 70  re returning, *p
17690 7a 41 66 66 20 69 73 20 73 65 74 20 74 6f 20 70  zAff is set to p
176a0 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72  oint to a buffer
176b0 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 0a 2a 2a   containing a.**
176c0 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63 6f 6c   copy of the col
176d0 75 6d 6e 20 61 66 66 69 6e 69 74 79 20 73 74 72  umn affinity str
176e0 69 6e 67 20 6f 66 20 74 68 65 20 69 6e 64 65 78  ing of the index
176f0 20 61 6c 6c 6f 63 61 74 65 64 20 75 73 69 6e 67   allocated using
17700 0a 2a 2a 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  .** sqlite3DbMal
17710 6c 6f 63 28 29 2e 20 45 78 63 65 70 74 2c 20 65  loc(). Except, e
17720 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 63 6f  ntries in the co
17730 70 79 20 6f 66 20 74 68 65 20 73 74 72 69 6e 67  py of the string
17740 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77   associated.** w
17750 69 74 68 20 65 71 75 61 6c 69 74 79 20 63 6f 6e  ith equality con
17760 73 74 72 61 69 6e 74 73 20 74 68 61 74 20 75 73  straints that us
17770 65 20 4e 4f 4e 45 20 61 66 66 69 6e 69 74 79 20  e NONE affinity 
17780 61 72 65 20 73 65 74 20 74 6f 0a 2a 2a 20 53 51  are set to.** SQ
17790 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 2e 20 54  LITE_AFF_NONE. T
177a0 68 69 73 20 69 73 20 74 6f 20 64 65 61 6c 20 77  his is to deal w
177b0 69 74 68 20 53 51 4c 20 73 75 63 68 20 61 73 20  ith SQL such as 
177c0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a  the following:.*
177d0 2a 0a 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41  *.**   CREATE TA
177e0 42 4c 45 20 74 31 28 61 20 54 45 58 54 20 50 52  BLE t1(a TEXT PR
177f0 49 4d 41 52 59 20 4b 45 59 2c 20 62 29 3b 0a 2a  IMARY KEY, b);.*
17800 2a 20 20 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46  *   SELECT ... F
17810 52 4f 4d 20 74 31 20 41 53 20 74 32 2c 20 74 31  ROM t1 AS t2, t1
17820 20 57 48 45 52 45 20 74 31 2e 61 20 3d 20 74 32   WHERE t1.a = t2
17830 2e 62 3b 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65  .b;.**.** In the
17840 20 65 78 61 6d 70 6c 65 20 61 62 6f 76 65 2c 20   example above, 
17850 74 68 65 20 69 6e 64 65 78 20 6f 6e 20 74 31 28  the index on t1(
17860 61 29 20 68 61 73 20 54 45 58 54 20 61 66 66 69  a) has TEXT affi
17870 6e 69 74 79 2e 20 42 75 74 20 73 69 6e 63 65 0a  nity. But since.
17880 2a 2a 20 74 68 65 20 72 69 67 68 74 20 68 61 6e  ** the right han
17890 64 20 73 69 64 65 20 6f 66 20 74 68 65 20 65 71  d side of the eq
178a0 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
178b0 74 20 28 74 32 2e 62 29 20 68 61 73 20 4e 4f 4e  t (t2.b) has NON
178c0 45 20 61 66 66 69 6e 69 74 79 2c 0a 2a 2a 20 6e  E affinity,.** n
178d0 6f 20 63 6f 6e 76 65 72 73 69 6f 6e 20 73 68 6f  o conversion sho
178e0 75 6c 64 20 62 65 20 61 74 74 65 6d 70 74 65 64  uld be attempted
178f0 20 62 65 66 6f 72 65 20 75 73 69 6e 67 20 61 20   before using a 
17900 74 32 2e 62 20 76 61 6c 75 65 20 61 73 20 70 61  t2.b value as pa
17910 72 74 20 6f 66 0a 2a 2a 20 61 20 6b 65 79 20 74  rt of.** a key t
17920 6f 20 73 65 61 72 63 68 20 74 68 65 20 69 6e 64  o search the ind
17930 65 78 2e 20 48 65 6e 63 65 20 74 68 65 20 66 69  ex. Hence the fi
17940 72 73 74 20 62 79 74 65 20 69 6e 20 74 68 65 20  rst byte in the 
17950 72 65 74 75 72 6e 65 64 20 61 66 66 69 6e 69 74  returned affinit
17960 79 0a 2a 2a 20 73 74 72 69 6e 67 20 69 6e 20 74  y.** string in t
17970 68 69 73 20 65 78 61 6d 70 6c 65 20 77 6f 75 6c  his example woul
17980 64 20 62 65 20 73 65 74 20 74 6f 20 53 51 4c 49  d be set to SQLI
17990 54 45 5f 41 46 46 5f 4e 4f 4e 45 2e 0a 2a 2f 0a  TE_AFF_NONE..*/.
179a0 73 74 61 74 69 63 20 69 6e 74 20 63 6f 64 65 41  static int codeA
179b0 6c 6c 45 71 75 61 6c 69 74 79 54 65 72 6d 73 28  llEqualityTerms(
179c0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
179d0 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  ,        /* Pars
179e0 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
179f0 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65   WhereLevel *pLe
17a00 76 65 6c 2c 20 20 20 2f 2a 20 57 68 69 63 68 20  vel,   /* Which 
17a10 6e 65 73 74 65 64 20 6c 6f 6f 70 20 6f 66 20 74  nested loop of t
17a20 68 65 20 46 52 4f 4d 20 77 65 20 61 72 65 20 63  he FROM we are c
17a30 6f 64 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 62  oding */.  int b
17a40 52 65 76 2c 20 20 20 20 20 20 20 20 20 20 20 20  Rev,            
17a50 20 2f 2a 20 52 65 76 65 72 73 65 20 74 68 65 20   /* Reverse the 
17a60 6f 72 64 65 72 20 6f 66 20 49 4e 20 6f 70 65 72  order of IN oper
17a70 61 74 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  ators */.  int n
17a80 45 78 74 72 61 52 65 67 2c 20 20 20 20 20 20 20  ExtraReg,       
17a90 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 78   /* Number of ex
17aa0 74 72 61 20 72 65 67 69 73 74 65 72 73 20 74 6f  tra registers to
17ab0 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 63   allocate */.  c
17ac0 68 61 72 20 2a 2a 70 7a 41 66 66 20 20 20 20 20  har **pzAff     
17ad0 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 65 74       /* OUT: Set
17ae0 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 66 66   to point to aff
17af0 69 6e 69 74 79 20 73 74 72 69 6e 67 20 2a 2f 0a  inity string */.
17b00 29 7b 0a 20 20 75 31 36 20 6e 45 71 3b 20 20 20  ){.  u16 nEq;   
17b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17b20 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72     /* The number
17b30 20 6f 66 20 3d 3d 20 6f 72 20 49 4e 20 63 6f 6e   of == or IN con
17b40 73 74 72 61 69 6e 74 73 20 74 6f 20 63 6f 64 65  straints to code
17b50 20 2a 2f 0a 20 20 75 31 36 20 6e 53 6b 69 70 3b   */.  u16 nSkip;
17b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17b70 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
17b80 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d   left-most colum
17b90 6e 73 20 74 6f 20 73 6b 69 70 20 2a 2f 0a 20 20  ns to skip */.  
17ba0 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
17bb0 2d 3e 70 56 64 62 65 3b 20 20 20 20 20 20 2f 2a  ->pVdbe;      /*
17bc0 20 54 68 65 20 76 6d 20 75 6e 64 65 72 20 63 6f   The vm under co
17bd0 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20  nstruction */.  
17be0 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20  Index *pIdx;    
17bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17c00 20 54 68 65 20 69 6e 64 65 78 20 62 65 69 6e 67   The index being
17c10 20 75 73 65 64 20 66 6f 72 20 74 68 69 73 20 6c   used for this l
17c20 6f 6f 70 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  oop */.  WhereTe
17c30 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20  rm *pTerm;      
17c40 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67         /* A sing
17c50 6c 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 65  le constraint te
17c60 72 6d 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f  rm */.  WhereLoo
17c70 70 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20  p *pLoop;       
17c80 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 68 65        /* The Whe
17c90 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 2a 2f  reLoop object */
17ca0 0a 20 20 69 6e 74 20 6a 3b 20 20 20 20 20 20 20  .  int j;       
17cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17cc0 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
17cd0 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 42 61 73   */.  int regBas
17ce0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
17cf0 20 20 20 20 2f 2a 20 42 61 73 65 20 72 65 67 69      /* Base regi
17d00 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 52  ster */.  int nR
17d10 65 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  eg;             
17d20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
17d30 72 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 74  r of registers t
17d40 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20  o allocate */.  
17d50 63 68 61 72 20 2a 7a 41 66 66 3b 20 20 20 20 20  char *zAff;     
17d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17d70 20 41 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67   Affinity string
17d80 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 0a 20   to return */.. 
17d90 20 2f 2a 20 54 68 69 73 20 6d 6f 64 75 6c 65 20   /* This module 
17da0 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 6f  is only called o
17db0 6e 20 71 75 65 72 79 20 70 6c 61 6e 73 20 74 68  n query plans th
17dc0 61 74 20 75 73 65 20 61 6e 20 69 6e 64 65 78 2e  at use an index.
17dd0 20 2a 2f 0a 20 20 70 4c 6f 6f 70 20 3d 20 70 4c   */.  pLoop = pL
17de0 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20  evel->pWLoop;.  
17df0 61 73 73 65 72 74 28 20 28 70 4c 6f 6f 70 2d 3e  assert( (pLoop->
17e00 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
17e10 56 49 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30  VIRTUALTABLE)==0
17e20 20 29 3b 0a 20 20 6e 45 71 20 3d 20 70 4c 6f 6f   );.  nEq = pLoo
17e30 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a  p->u.btree.nEq;.
17e40 20 20 6e 53 6b 69 70 20 3d 20 70 4c 6f 6f 70 2d    nSkip = pLoop-
17e50 3e 6e 53 6b 69 70 3b 0a 20 20 70 49 64 78 20 3d  >nSkip;.  pIdx =
17e60 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
17e70 70 49 6e 64 65 78 3b 0a 20 20 61 73 73 65 72 74  pIndex;.  assert
17e80 28 20 70 49 64 78 21 3d 30 20 29 3b 0a 0a 20 20  ( pIdx!=0 );..  
17e90 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f  /* Figure out ho
17ea0 77 20 6d 61 6e 79 20 6d 65 6d 6f 72 79 20 63 65  w many memory ce
17eb0 6c 6c 73 20 77 65 20 77 69 6c 6c 20 6e 65 65 64  lls we will need
17ec0 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65 20 74   then allocate t
17ed0 68 65 6d 2e 0a 20 20 2a 2f 0a 20 20 72 65 67 42  hem..  */.  regB
17ee0 61 73 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  ase = pParse->nM
17ef0 65 6d 20 2b 20 31 3b 0a 20 20 6e 52 65 67 20 3d  em + 1;.  nReg =
17f00 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
17f10 6e 45 71 20 2b 20 6e 45 78 74 72 61 52 65 67 3b  nEq + nExtraReg;
17f20 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20  .  pParse->nMem 
17f30 2b 3d 20 6e 52 65 67 3b 0a 0a 20 20 7a 41 66 66  += nReg;..  zAff
17f40 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
17f50 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 73  up(pParse->db, s
17f60 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e  qlite3IndexAffin
17f70 69 74 79 53 74 72 28 76 2c 20 70 49 64 78 29 29  ityStr(v, pIdx))
17f80 3b 0a 20 20 69 66 28 20 21 7a 41 66 66 20 29 7b  ;.  if( !zAff ){
17f90 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2d  .    pParse->db-
17fa0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20  >mallocFailed = 
17fb0 31 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6e 53  1;.  }..  if( nS
17fc0 6b 69 70 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  kip ){.    int i
17fd0 49 64 78 43 75 72 20 3d 20 70 4c 65 76 65 6c 2d  IdxCur = pLevel-
17fe0 3e 69 49 64 78 43 75 72 3b 0a 20 20 20 20 73 71  >iIdxCur;.    sq
17ff0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
18000 76 2c 20 28 62 52 65 76 3f 4f 50 5f 4c 61 73 74  v, (bRev?OP_Last
18010 3a 4f 50 5f 52 65 77 69 6e 64 29 2c 20 69 49 64  :OP_Rewind), iId
18020 78 43 75 72 29 3b 0a 20 20 20 20 56 64 62 65 43  xCur);.    VdbeC
18030 6f 76 65 72 61 67 65 49 66 28 76 2c 20 62 52 65  overageIf(v, bRe
18040 76 3d 3d 30 29 3b 0a 20 20 20 20 56 64 62 65 43  v==0);.    VdbeC
18050 6f 76 65 72 61 67 65 49 66 28 76 2c 20 62 52 65  overageIf(v, bRe
18060 76 21 3d 30 29 3b 0a 20 20 20 20 56 64 62 65 43  v!=0);.    VdbeC
18070 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 62 65 67 69  omment((v, "begi
18080 6e 20 73 6b 69 70 2d 73 63 61 6e 20 6f 6e 20 25  n skip-scan on %
18090 73 22 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 29  s", pIdx->zName)
180a0 29 3b 0a 20 20 20 20 6a 20 3d 20 73 71 6c 69 74  );.    j = sqlit
180b0 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20  e3VdbeAddOp0(v, 
180c0 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20 20 20 70 4c  OP_Goto);.    pL
180d0 65 76 65 6c 2d 3e 61 64 64 72 53 6b 69 70 20 3d  evel->addrSkip =
180e0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
180f0 70 34 49 6e 74 28 76 2c 20 28 62 52 65 76 3f 4f  p4Int(v, (bRev?O
18100 50 5f 53 65 65 6b 4c 54 3a 4f 50 5f 53 65 65 6b  P_SeekLT:OP_Seek
18110 47 54 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  GT),.           
18120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18130 20 69 49 64 78 43 75 72 2c 20 30 2c 20 72 65 67   iIdxCur, 0, reg
18140 42 61 73 65 2c 20 6e 53 6b 69 70 29 3b 0a 20 20  Base, nSkip);.  
18150 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
18160 28 76 2c 20 62 52 65 76 3d 3d 30 29 3b 0a 20 20  (v, bRev==0);.  
18170 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
18180 28 76 2c 20 62 52 65 76 21 3d 30 29 3b 0a 20 20  (v, bRev!=0);.  
18190 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
181a0 70 48 65 72 65 28 76 2c 20 6a 29 3b 0a 20 20 20  pHere(v, j);.   
181b0 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 53 6b 69   for(j=0; j<nSki
181c0 70 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 73  p; j++){.      s
181d0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
181e0 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69  (v, OP_Column, i
181f0 49 64 78 43 75 72 2c 20 6a 2c 20 72 65 67 42 61  IdxCur, j, regBa
18200 73 65 2b 6a 29 3b 0a 20 20 20 20 20 20 61 73 73  se+j);.      ass
18210 65 72 74 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c  ert( pIdx->aiCol
18220 75 6d 6e 5b 6a 5d 3e 3d 30 20 29 3b 0a 20 20 20  umn[j]>=0 );.   
18230 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
18240 76 2c 20 22 25 73 22 2c 20 70 49 64 78 2d 3e 70  v, "%s", pIdx->p
18250 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 70 49 64 78  Table->aCol[pIdx
18260 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 5d 2e 7a  ->aiColumn[j]].z
18270 4e 61 6d 65 29 29 3b 0a 20 20 20 20 7d 0a 20 20  Name));.    }.  
18280 7d 20 20 20 20 0a 0a 20 20 2f 2a 20 45 76 61 6c  }    ..  /* Eval
18290 75 61 74 65 20 74 68 65 20 65 71 75 61 6c 69 74  uate the equalit
182a0 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20  y constraints.  
182b0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 7a 41 66  */.  assert( zAf
182c0 66 3d 3d 30 20 7c 7c 20 28 69 6e 74 29 73 74 72  f==0 || (int)str
182d0 6c 65 6e 28 7a 41 66 66 29 3e 3d 6e 45 71 20 29  len(zAff)>=nEq )
182e0 3b 0a 20 20 66 6f 72 28 6a 3d 6e 53 6b 69 70 3b  ;.  for(j=nSkip;
182f0 20 6a 3c 6e 45 71 3b 20 6a 2b 2b 29 7b 0a 20 20   j<nEq; j++){.  
18300 20 20 69 6e 74 20 72 31 3b 0a 20 20 20 20 70 54    int r1;.    pT
18310 65 72 6d 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54  erm = pLoop->aLT
18320 65 72 6d 5b 6a 5d 3b 0a 20 20 20 20 61 73 73 65  erm[j];.    asse
18330 72 74 28 20 70 54 65 72 6d 21 3d 30 20 29 3b 0a  rt( pTerm!=0 );.
18340 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f      /* The follo
18350 77 69 6e 67 20 74 65 73 74 63 61 73 65 20 69 73  wing testcase is
18360 20 74 72 75 65 20 66 6f 72 20 69 6e 64 69 63 65   true for indice
18370 73 20 77 69 74 68 20 72 65 64 75 6e 64 61 6e 74  s with redundant
18380 20 63 6f 6c 75 6d 6e 73 2e 20 0a 20 20 20 20 2a   columns. .    *
18390 2a 20 45 78 3a 20 43 52 45 41 54 45 20 49 4e 44  * Ex: CREATE IND
183a0 45 58 20 69 31 20 4f 4e 20 74 31 28 61 2c 62 2c  EX i1 ON t1(a,b,
183b0 61 29 3b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  a); SELECT * FRO
183c0 4d 20 74 31 20 57 48 45 52 45 20 61 3d 30 20 41  M t1 WHERE a=0 A
183d0 4e 44 20 62 3d 30 3b 20 2a 2f 0a 20 20 20 20 74  ND b=0; */.    t
183e0 65 73 74 63 61 73 65 28 20 28 70 54 65 72 6d 2d  estcase( (pTerm-
183f0 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
18400 43 4f 44 45 44 29 21 3d 30 20 29 3b 0a 20 20 20  CODED)!=0 );.   
18410 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
18420 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
18430 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20 20 20 20  _VIRTUAL );.    
18440 72 31 20 3d 20 63 6f 64 65 45 71 75 61 6c 69 74  r1 = codeEqualit
18450 79 54 65 72 6d 28 70 50 61 72 73 65 2c 20 70 54  yTerm(pParse, pT
18460 65 72 6d 2c 20 70 4c 65 76 65 6c 2c 20 6a 2c 20  erm, pLevel, j, 
18470 62 52 65 76 2c 20 72 65 67 42 61 73 65 2b 6a 29  bRev, regBase+j)
18480 3b 0a 20 20 20 20 69 66 28 20 72 31 21 3d 72 65  ;.    if( r1!=re
18490 67 42 61 73 65 2b 6a 20 29 7b 0a 20 20 20 20 20  gBase+j ){.     
184a0 20 69 66 28 20 6e 52 65 67 3d 3d 31 20 29 7b 0a   if( nReg==1 ){.
184b0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
184c0 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
184d0 61 72 73 65 2c 20 72 65 67 42 61 73 65 29 3b 0a  arse, regBase);.
184e0 20 20 20 20 20 20 20 20 72 65 67 42 61 73 65 20          regBase 
184f0 3d 20 72 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73  = r1;.      }els
18500 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
18510 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
18520 4f 50 5f 53 43 6f 70 79 2c 20 72 31 2c 20 72 65  OP_SCopy, r1, re
18530 67 42 61 73 65 2b 6a 29 3b 0a 20 20 20 20 20 20  gBase+j);.      
18540 7d 0a 20 20 20 20 7d 0a 20 20 20 20 74 65 73 74  }.    }.    test
18550 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70  case( pTerm->eOp
18560 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 4e 55  erator & WO_ISNU
18570 4c 4c 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  LL );.    testca
18580 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  se( pTerm->eOper
18590 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29 3b 0a  ator & WO_IN );.
185a0 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e      if( (pTerm->
185b0 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f  eOperator & (WO_
185c0 49 53 4e 55 4c 4c 7c 57 4f 5f 49 4e 29 29 3d 3d  ISNULL|WO_IN))==
185d0 30 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  0 ){.      Expr 
185e0 2a 70 52 69 67 68 74 20 3d 20 70 54 65 72 6d 2d  *pRight = pTerm-
185f0 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a  >pExpr->pRight;.
18600 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
18610 33 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28 70  3ExprCanBeNull(p
18620 52 69 67 68 74 29 20 29 7b 0a 20 20 20 20 20 20  Right) ){.      
18630 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
18640 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c  Op2(v, OP_IsNull
18650 2c 20 72 65 67 42 61 73 65 2b 6a 2c 20 70 4c 65  , regBase+j, pLe
18660 76 65 6c 2d 3e 61 64 64 72 42 72 6b 29 3b 0a 20  vel->addrBrk);. 
18670 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
18680 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 7d 0a  age(v);.      }.
18690 20 20 20 20 20 20 69 66 28 20 7a 41 66 66 20 29        if( zAff )
186a0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  {.        if( sq
186b0 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69  lite3CompareAffi
186c0 6e 69 74 79 28 70 52 69 67 68 74 2c 20 7a 41 66  nity(pRight, zAf
186d0 66 5b 6a 5d 29 3d 3d 53 51 4c 49 54 45 5f 41 46  f[j])==SQLITE_AF
186e0 46 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20  F_NONE ){.      
186f0 20 20 20 20 7a 41 66 66 5b 6a 5d 20 3d 20 53 51      zAff[j] = SQ
18700 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20  LITE_AFF_NONE;. 
18710 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
18720 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
18730 4e 65 65 64 73 4e 6f 41 66 66 69 6e 69 74 79 43  NeedsNoAffinityC
18740 68 61 6e 67 65 28 70 52 69 67 68 74 2c 20 7a 41  hange(pRight, zA
18750 66 66 5b 6a 5d 29 20 29 7b 0a 20 20 20 20 20 20  ff[j]) ){.      
18760 20 20 20 20 7a 41 66 66 5b 6a 5d 20 3d 20 53 51      zAff[j] = SQ
18770 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20  LITE_AFF_NONE;. 
18780 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
18790 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 7a  .    }.  }.  *pz
187a0 41 66 66 20 3d 20 7a 41 66 66 3b 0a 20 20 72 65  Aff = zAff;.  re
187b0 74 75 72 6e 20 72 65 67 42 61 73 65 3b 0a 7d 0a  turn regBase;.}.
187c0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
187d0 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a  OMIT_EXPLAIN./*.
187e0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
187f0 69 73 20 61 20 68 65 6c 70 65 72 20 66 6f 72 20  is a helper for 
18800 65 78 70 6c 61 69 6e 49 6e 64 65 78 52 61 6e 67  explainIndexRang
18810 65 28 29 20 62 65 6c 6f 77 0a 2a 2a 0a 2a 2a 20  e() below.**.** 
18820 70 53 74 72 20 68 6f 6c 64 73 20 74 68 65 20 74  pStr holds the t
18830 65 78 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73  ext of an expres
18840 73 69 6f 6e 20 74 68 61 74 20 77 65 20 61 72 65  sion that we are
18850 20 62 75 69 6c 64 69 6e 67 20 75 70 20 6f 6e 65   building up one
18860 20 74 65 72 6d 0a 2a 2a 20 61 74 20 61 20 74 69   term.** at a ti
18870 6d 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  me.  This routin
18880 65 20 61 64 64 73 20 61 20 6e 65 77 20 74 65 72  e adds a new ter
18890 6d 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  m to the end of 
188a0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a  the expression..
188b0 2a 2a 20 54 65 72 6d 73 20 61 72 65 20 73 65 70  ** Terms are sep
188c0 61 72 61 74 65 64 20 62 79 20 41 4e 44 20 73 6f  arated by AND so
188d0 20 61 64 64 20 74 68 65 20 22 41 4e 44 22 20 74   add the "AND" t
188e0 65 78 74 20 66 6f 72 20 73 65 63 6f 6e 64 20 61  ext for second a
188f0 6e 64 20 73 75 62 73 65 71 75 65 6e 74 0a 2a 2a  nd subsequent.**
18900 20 74 65 72 6d 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a   terms only..*/.
18910 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 6c  static void expl
18920 61 69 6e 41 70 70 65 6e 64 54 65 72 6d 28 0a 20  ainAppendTerm(. 
18930 20 53 74 72 41 63 63 75 6d 20 2a 70 53 74 72 2c   StrAccum *pStr,
18940 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18950 54 68 65 20 74 65 78 74 20 65 78 70 72 65 73 73  The text express
18960 69 6f 6e 20 62 65 69 6e 67 20 62 75 69 6c 74 20  ion being built 
18970 2a 2f 0a 20 20 69 6e 74 20 69 54 65 72 6d 2c 20  */.  int iTerm, 
18980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18990 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 69   /* Index of thi
189a0 73 20 74 65 72 6d 2e 20 20 46 69 72 73 74 20 69  s term.  First i
189b0 73 20 7a 65 72 6f 20 2a 2f 0a 20 20 63 6f 6e 73  s zero */.  cons
189c0 74 20 63 68 61 72 20 2a 7a 43 6f 6c 75 6d 6e 2c  t char *zColumn,
189d0 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
189e0 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 2a 2f  of the column */
189f0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
18a00 4f 70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  Op             /
18a10 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f 70  * Name of the op
18a20 65 72 61 74 6f 72 20 2a 2f 0a 29 7b 0a 20 20 69  erator */.){.  i
18a30 66 28 20 69 54 65 72 6d 20 29 20 73 71 6c 69 74  f( iTerm ) sqlit
18a40 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64  e3StrAccumAppend
18a50 28 70 53 74 72 2c 20 22 20 41 4e 44 20 22 2c 20  (pStr, " AND ", 
18a60 35 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 74 72  5);.  sqlite3Str
18a70 41 63 63 75 6d 41 70 70 65 6e 64 41 6c 6c 28 70  AccumAppendAll(p
18a80 53 74 72 2c 20 7a 43 6f 6c 75 6d 6e 29 3b 0a 20  Str, zColumn);. 
18a90 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
18aa0 41 70 70 65 6e 64 28 70 53 74 72 2c 20 7a 4f 70  Append(pStr, zOp
18ab0 2c 20 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 53  , 1);.  sqlite3S
18ac0 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 70 53  trAccumAppend(pS
18ad0 74 72 2c 20 22 3f 22 2c 20 31 29 3b 0a 7d 0a 0a  tr, "?", 1);.}..
18ae0 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70  /*.** Argument p
18af0 4c 65 76 65 6c 20 64 65 73 63 72 69 62 65 73 20  Level describes 
18b00 61 20 73 74 72 61 74 65 67 79 20 66 6f 72 20 73  a strategy for s
18b10 63 61 6e 6e 69 6e 67 20 74 61 62 6c 65 20 70 54  canning table pT
18b20 61 62 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e  ab. This .** fun
18b30 63 74 69 6f 6e 20 61 70 70 65 6e 64 73 20 74 65  ction appends te
18b40 78 74 20 74 6f 20 70 53 74 72 20 74 68 61 74 20  xt to pStr that 
18b50 64 65 73 63 72 69 62 65 73 20 74 68 65 20 73 75  describes the su
18b60 62 73 65 74 20 6f 66 20 74 61 62 6c 65 0a 2a 2a  bset of table.**
18b70 20 72 6f 77 73 20 73 63 61 6e 6e 65 64 20 62 79   rows scanned by
18b80 20 74 68 65 20 73 74 72 61 74 65 67 79 20 69 6e   the strategy in
18b90 20 74 68 65 20 66 6f 72 6d 20 6f 66 20 61 6e 20   the form of an 
18ba0 53 51 4c 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a  SQL expression..
18bb0 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c  **.** For exampl
18bc0 65 2c 20 69 66 20 74 68 65 20 71 75 65 72 79 3a  e, if the query:
18bd0 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20  .**.**   SELECT 
18be0 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  * FROM t1 WHERE 
18bf0 61 3d 31 20 41 4e 44 20 62 3e 32 3b 0a 2a 2a 0a  a=1 AND b>2;.**.
18c00 2a 2a 20 69 73 20 72 75 6e 20 61 6e 64 20 74 68  ** is run and th
18c10 65 72 65 20 69 73 20 61 6e 20 69 6e 64 65 78 20  ere is an index 
18c20 6f 6e 20 28 61 2c 20 62 29 2c 20 74 68 65 6e 20  on (a, b), then 
18c30 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
18c40 74 75 72 6e 73 20 61 0a 2a 2a 20 73 74 72 69 6e  turns a.** strin
18c50 67 20 73 69 6d 69 6c 61 72 20 74 6f 3a 0a 2a 2a  g similar to:.**
18c60 0a 2a 2a 20 20 20 22 61 3d 3f 20 41 4e 44 20 62  .**   "a=? AND b
18c70 3e 3f 22 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  >?".*/.static vo
18c80 69 64 20 65 78 70 6c 61 69 6e 49 6e 64 65 78 52  id explainIndexR
18c90 61 6e 67 65 28 53 74 72 41 63 63 75 6d 20 2a 70  ange(StrAccum *p
18ca0 53 74 72 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a  Str, WhereLoop *
18cb0 70 4c 6f 6f 70 2c 20 54 61 62 6c 65 20 2a 70 54  pLoop, Table *pT
18cc0 61 62 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49  ab){.  Index *pI
18cd0 6e 64 65 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e  ndex = pLoop->u.
18ce0 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20  btree.pIndex;.  
18cf0 75 31 36 20 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d  u16 nEq = pLoop-
18d00 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20  >u.btree.nEq;.  
18d10 75 31 36 20 6e 53 6b 69 70 20 3d 20 70 4c 6f 6f  u16 nSkip = pLoo
18d20 70 2d 3e 6e 53 6b 69 70 3b 0a 20 20 69 6e 74 20  p->nSkip;.  int 
18d30 69 2c 20 6a 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a  i, j;.  Column *
18d40 61 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f  aCol = pTab->aCo
18d50 6c 3b 0a 20 20 69 31 36 20 2a 61 69 43 6f 6c 75  l;.  i16 *aiColu
18d60 6d 6e 20 3d 20 70 49 6e 64 65 78 2d 3e 61 69 43  mn = pIndex->aiC
18d70 6f 6c 75 6d 6e 3b 0a 0a 20 20 69 66 28 20 6e 45  olumn;..  if( nE
18d80 71 3d 3d 30 20 26 26 20 28 70 4c 6f 6f 70 2d 3e  q==0 && (pLoop->
18d90 77 73 46 6c 61 67 73 26 28 57 48 45 52 45 5f 42  wsFlags&(WHERE_B
18da0 54 4d 5f 4c 49 4d 49 54 7c 57 48 45 52 45 5f 54  TM_LIMIT|WHERE_T
18db0 4f 50 5f 4c 49 4d 49 54 29 29 3d 3d 30 20 29 20  OP_LIMIT))==0 ) 
18dc0 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65  return;.  sqlite
18dd0 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28  3StrAccumAppend(
18de0 70 53 74 72 2c 20 22 20 28 22 2c 20 32 29 3b 0a  pStr, " (", 2);.
18df0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 71    for(i=0; i<nEq
18e00 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72  ; i++){.    char
18e10 20 2a 7a 20 3d 20 61 69 43 6f 6c 75 6d 6e 5b 69   *z = aiColumn[i
18e20 5d 20 3c 20 30 20 3f 20 22 72 6f 77 69 64 22 20  ] < 0 ? "rowid" 
18e30 3a 20 61 43 6f 6c 5b 61 69 43 6f 6c 75 6d 6e 5b  : aCol[aiColumn[
18e40 69 5d 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 69  i]].zName;.    i
18e50 66 28 20 69 3e 3d 6e 53 6b 69 70 20 29 7b 0a 20  f( i>=nSkip ){. 
18e60 20 20 20 20 20 65 78 70 6c 61 69 6e 41 70 70 65       explainAppe
18e70 6e 64 54 65 72 6d 28 70 53 74 72 2c 20 69 2c 20  ndTerm(pStr, i, 
18e80 7a 2c 20 22 3d 22 29 3b 0a 20 20 20 20 7d 65 6c  z, "=");.    }el
18e90 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 69 20  se{.      if( i 
18ea0 29 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75  ) sqlite3StrAccu
18eb0 6d 41 70 70 65 6e 64 28 70 53 74 72 2c 20 22 20  mAppend(pStr, " 
18ec0 41 4e 44 20 22 2c 20 35 29 3b 0a 20 20 20 20 20  AND ", 5);.     
18ed0 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28   sqlite3XPrintf(
18ee0 70 53 74 72 2c 20 30 2c 20 22 41 4e 59 28 25 73  pStr, 0, "ANY(%s
18ef0 29 22 2c 20 7a 29 3b 0a 20 20 20 20 7d 0a 20 20  )", z);.    }.  
18f00 7d 0a 0a 20 20 6a 20 3d 20 69 3b 0a 20 20 69 66  }..  j = i;.  if
18f10 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  ( pLoop->wsFlags
18f20 26 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54  &WHERE_BTM_LIMIT
18f30 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 20   ){.    char *z 
18f40 3d 20 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 20 3c 20  = aiColumn[j] < 
18f50 30 20 3f 20 22 72 6f 77 69 64 22 20 3a 20 61 43  0 ? "rowid" : aC
18f60 6f 6c 5b 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 5d 2e  ol[aiColumn[j]].
18f70 7a 4e 61 6d 65 3b 0a 20 20 20 20 65 78 70 6c 61  zName;.    expla
18f80 69 6e 41 70 70 65 6e 64 54 65 72 6d 28 70 53 74  inAppendTerm(pSt
18f90 72 2c 20 69 2b 2b 2c 20 7a 2c 20 22 3e 22 29 3b  r, i++, z, ">");
18fa0 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 6f 6f 70  .  }.  if( pLoop
18fb0 2d 3e 77 73 46 6c 61 67 73 26 57 48 45 52 45 5f  ->wsFlags&WHERE_
18fc0 54 4f 50 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20  TOP_LIMIT ){.   
18fd0 20 63 68 61 72 20 2a 7a 20 3d 20 61 69 43 6f 6c   char *z = aiCol
18fe0 75 6d 6e 5b 6a 5d 20 3c 20 30 20 3f 20 22 72 6f  umn[j] < 0 ? "ro
18ff0 77 69 64 22 20 3a 20 61 43 6f 6c 5b 61 69 43 6f  wid" : aCol[aiCo
19000 6c 75 6d 6e 5b 6a 5d 5d 2e 7a 4e 61 6d 65 3b 0a  lumn[j]].zName;.
19010 20 20 20 20 65 78 70 6c 61 69 6e 41 70 70 65 6e      explainAppen
19020 64 54 65 72 6d 28 70 53 74 72 2c 20 69 2c 20 7a  dTerm(pStr, i, z
19030 2c 20 22 3c 22 29 3b 0a 20 20 7d 0a 20 20 73 71  , "<");.  }.  sq
19040 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70  lite3StrAccumApp
19050 65 6e 64 28 70 53 74 72 2c 20 22 29 22 2c 20 31  end(pStr, ")", 1
19060 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
19070 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
19080 6f 2d 6f 70 20 75 6e 6c 65 73 73 20 63 75 72 72  o-op unless curr
19090 65 6e 74 6c 79 20 70 72 6f 63 65 73 73 69 6e 67  ently processing
190a0 20 61 6e 20 45 58 50 4c 41 49 4e 20 51 55 45 52   an EXPLAIN QUER
190b0 59 20 50 4c 41 4e 0a 2a 2a 20 63 6f 6d 6d 61 6e  Y PLAN.** comman
190c0 64 2c 20 6f 72 20 69 66 20 65 69 74 68 65 72 20  d, or if either 
190d0 53 51 4c 49 54 45 5f 44 45 42 55 47 20 6f 72 20  SQLITE_DEBUG or 
190e0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
190f0 4d 54 5f 53 43 41 4e 53 54 41 54 55 53 20 77 61  MT_SCANSTATUS wa
19100 73 0a 2a 2a 20 64 65 66 69 6e 65 64 20 61 74 20  s.** defined at 
19110 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 2e 20 49 66  compile-time. If
19120 20 69 74 20 69 73 20 6e 6f 74 20 61 20 6e 6f 2d   it is not a no-
19130 6f 70 2c 20 61 20 73 69 6e 67 6c 65 20 4f 50 5f  op, a single OP_
19140 45 78 70 6c 61 69 6e 20 6f 70 63 6f 64 65 20 0a  Explain opcode .
19150 2a 2a 20 69 73 20 61 64 64 65 64 20 74 6f 20 74  ** is added to t
19160 68 65 20 6f 75 74 70 75 74 20 74 6f 20 64 65 73  he output to des
19170 63 72 69 62 65 20 74 68 65 20 74 61 62 6c 65 20  cribe the table 
19180 73 63 61 6e 20 73 74 72 61 74 65 67 79 20 69 6e  scan strategy in
19190 20 70 4c 65 76 65 6c 2e 0a 2a 2a 0a 2a 2a 20 49   pLevel..**.** I
191a0 66 20 61 6e 20 4f 50 5f 45 78 70 6c 61 69 6e 20  f an OP_Explain 
191b0 6f 70 63 6f 64 65 20 69 73 20 61 64 64 65 64 20  opcode is added 
191c0 74 6f 20 74 68 65 20 56 4d 2c 20 69 74 73 20 61  to the VM, its a
191d0 64 64 72 65 73 73 20 69 73 20 72 65 74 75 72 6e  ddress is return
191e0 65 64 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  ed..** Otherwise
191f0 2c 20 69 66 20 6e 6f 20 4f 50 5f 45 78 70 6c 61  , if no OP_Expla
19200 69 6e 20 69 73 20 63 6f 64 65 64 2c 20 7a 65 72  in is coded, zer
19210 6f 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  o is returned..*
19220 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70  /.static int exp
19230 6c 61 69 6e 4f 6e 65 53 63 61 6e 28 0a 20 20 50  lainOneScan(.  P
19240 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
19250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
19260 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20  * Parse context 
19270 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  */.  SrcList *pT
19280 61 62 4c 69 73 74 2c 20 20 20 20 20 20 20 20 20  abList,         
19290 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 6c 69       /* Table li
192a0 73 74 20 74 68 69 73 20 6c 6f 6f 70 20 72 65 66  st this loop ref
192b0 65 72 73 20 74 6f 20 2a 2f 0a 20 20 57 68 65 72  ers to */.  Wher
192c0 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20  eLevel *pLevel, 
192d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
192e0 63 61 6e 20 74 6f 20 77 72 69 74 65 20 4f 50 5f  can to write OP_
192f0 45 78 70 6c 61 69 6e 20 6f 70 63 6f 64 65 20 66  Explain opcode f
19300 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 76  or */.  int iLev
19310 65 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  el,             
19320 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
19330 20 66 6f 72 20 22 6c 65 76 65 6c 22 20 63 6f 6c   for "level" col
19340 75 6d 6e 20 6f 66 20 6f 75 74 70 75 74 20 2a 2f  umn of output */
19350 0a 20 20 69 6e 74 20 69 46 72 6f 6d 2c 20 20 20  .  int iFrom,   
19360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19370 20 20 20 2f 2a 20 56 61 6c 75 65 20 66 6f 72 20     /* Value for 
19380 22 66 72 6f 6d 22 20 63 6f 6c 75 6d 6e 20 6f 66  "from" column of
19390 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 75 31 36   output */.  u16
193a0 20 77 63 74 72 6c 46 6c 61 67 73 20 20 20 20 20   wctrlFlags     
193b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
193c0 46 6c 61 67 73 20 70 61 73 73 65 64 20 74 6f 20  Flags passed to 
193d0 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
193e0 6e 28 29 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  n() */.){.  int 
193f0 72 65 74 20 3d 20 30 3b 0a 23 69 66 20 21 64 65  ret = 0;.#if !de
19400 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
19410 55 47 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  UG) && !defined(
19420 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
19430 4d 54 5f 53 43 41 4e 53 54 41 54 55 53 29 0a 20  MT_SCANSTATUS). 
19440 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70   if( pParse->exp
19450 6c 61 69 6e 3d 3d 32 20 29 0a 23 65 6e 64 69 66  lain==2 ).#endif
19460 0a 20 20 7b 0a 20 20 20 20 73 74 72 75 63 74 20  .  {.    struct 
19470 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
19480 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d  tem = &pTabList-
19490 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d  >a[pLevel->iFrom
194a0 5d 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d  ];.    Vdbe *v =
194b0 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20   pParse->pVdbe; 
194c0 20 20 20 20 20 2f 2a 20 56 4d 20 62 65 69 6e 67       /* VM being
194d0 20 63 6f 6e 73 74 72 75 63 74 65 64 20 2a 2f 0a   constructed */.
194e0 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20      sqlite3 *db 
194f0 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20  = pParse->db;   
19500 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 61    /* Database ha
19510 6e 64 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ndle */.    int 
19520 69 49 64 20 3d 20 70 50 61 72 73 65 2d 3e 69 53  iId = pParse->iS
19530 65 6c 65 63 74 49 64 3b 20 20 2f 2a 20 53 65 6c  electId;  /* Sel
19540 65 63 74 20 69 64 20 28 6c 65 66 74 2d 6d 6f 73  ect id (left-mos
19550 74 20 6f 75 74 70 75 74 20 63 6f 6c 75 6d 6e 29  t output column)
19560 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 73 53 65   */.    int isSe
19570 61 72 63 68 3b 20 20 20 20 20 20 20 20 20 20 20  arch;           
19580 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
19590 72 20 61 20 53 45 41 52 43 48 2e 20 46 61 6c 73  r a SEARCH. Fals
195a0 65 20 66 6f 72 20 53 43 41 4e 2e 20 2a 2f 0a 20  e for SCAN. */. 
195b0 20 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c     WhereLoop *pL
195c0 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  oop;            
195d0 20 2f 2a 20 54 68 65 20 63 6f 6e 74 72 6f 6c 6c   /* The controll
195e0 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62  ing WhereLoop ob
195f0 6a 65 63 74 20 2a 2f 0a 20 20 20 20 75 33 32 20  ject */.    u32 
19600 66 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20  flags;          
19610 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
19620 67 73 20 74 68 61 74 20 64 65 73 63 72 69 62 65  gs that describe
19630 20 74 68 69 73 20 6c 6f 6f 70 20 2a 2f 0a 20 20   this loop */.  
19640 20 20 63 68 61 72 20 2a 7a 4d 73 67 3b 20 20 20    char *zMsg;   
19650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19660 2f 2a 20 54 65 78 74 20 74 6f 20 61 64 64 20 74  /* Text to add t
19670 6f 20 45 51 50 20 6f 75 74 70 75 74 20 2a 2f 0a  o EQP output */.
19680 20 20 20 20 53 74 72 41 63 63 75 6d 20 73 74 72      StrAccum str
19690 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
196a0 20 20 2f 2a 20 45 51 50 20 6f 75 74 70 75 74 20    /* EQP output 
196b0 73 74 72 69 6e 67 20 2a 2f 0a 20 20 20 20 63 68  string */.    ch
196c0 61 72 20 7a 42 75 66 5b 31 30 30 5d 3b 20 20 20  ar zBuf[100];   
196d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
196e0 6e 69 74 69 61 6c 20 73 70 61 63 65 20 66 6f 72  nitial space for
196f0 20 45 51 50 20 6f 75 74 70 75 74 20 73 74 72 69   EQP output stri
19700 6e 67 20 2a 2f 0a 0a 20 20 20 20 70 4c 6f 6f 70  ng */..    pLoop
19710 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f   = pLevel->pWLoo
19720 70 3b 0a 20 20 20 20 66 6c 61 67 73 20 3d 20 70  p;.    flags = p
19730 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 3b 0a 20  Loop->wsFlags;. 
19740 20 20 20 69 66 28 20 28 66 6c 61 67 73 26 57 48     if( (flags&WH
19750 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 29 20 7c 7c  ERE_MULTI_OR) ||
19760 20 28 77 63 74 72 6c 46 6c 61 67 73 26 57 48 45   (wctrlFlags&WHE
19770 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59  RE_ONETABLE_ONLY
19780 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20  ) ) return 0;.. 
19790 20 20 20 69 73 53 65 61 72 63 68 20 3d 20 28 66     isSearch = (f
197a0 6c 61 67 73 26 28 57 48 45 52 45 5f 42 54 4d 5f  lags&(WHERE_BTM_
197b0 4c 49 4d 49 54 7c 57 48 45 52 45 5f 54 4f 50 5f  LIMIT|WHERE_TOP_
197c0 4c 49 4d 49 54 29 29 21 3d 30 0a 20 20 20 20 20  LIMIT))!=0.     
197d0 20 20 20 20 20 20 20 7c 7c 20 28 28 66 6c 61 67         || ((flag
197e0 73 26 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54  s&WHERE_VIRTUALT
197f0 41 42 4c 45 29 3d 3d 30 20 26 26 20 28 70 4c 6f  ABLE)==0 && (pLo
19800 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3e  op->u.btree.nEq>
19810 30 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  0)).            
19820 7c 7c 20 28 77 63 74 72 6c 46 6c 61 67 73 26 28  || (wctrlFlags&(
19830 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49  WHERE_ORDERBY_MI
19840 4e 7c 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f  N|WHERE_ORDERBY_
19850 4d 41 58 29 29 3b 0a 0a 20 20 20 20 73 71 6c 69  MAX));..    sqli
19860 74 65 33 53 74 72 41 63 63 75 6d 49 6e 69 74 28  te3StrAccumInit(
19870 26 73 74 72 2c 20 7a 42 75 66 2c 20 73 69 7a 65  &str, zBuf, size
19880 6f 66 28 7a 42 75 66 29 2c 20 53 51 4c 49 54 45  of(zBuf), SQLITE
19890 5f 4d 41 58 5f 4c 45 4e 47 54 48 29 3b 0a 20 20  _MAX_LENGTH);.  
198a0 20 20 73 74 72 2e 64 62 20 3d 20 64 62 3b 0a 20    str.db = db;. 
198b0 20 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63     sqlite3StrAcc
198c0 75 6d 41 70 70 65 6e 64 41 6c 6c 28 26 73 74 72  umAppendAll(&str
198d0 2c 20 69 73 53 65 61 72 63 68 20 3f 20 22 53 45  , isSearch ? "SE
198e0 41 52 43 48 22 20 3a 20 22 53 43 41 4e 22 29 3b  ARCH" : "SCAN");
198f0 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e  .    if( pItem->
19900 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  pSelect ){.     
19910 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28   sqlite3XPrintf(
19920 26 73 74 72 2c 20 30 2c 20 22 20 53 55 42 51 55  &str, 0, " SUBQU
19930 45 52 59 20 25 64 22 2c 20 70 49 74 65 6d 2d 3e  ERY %d", pItem->
19940 69 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20  iSelectId);.    
19950 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
19960 69 74 65 33 58 50 72 69 6e 74 66 28 26 73 74 72  ite3XPrintf(&str
19970 2c 20 30 2c 20 22 20 54 41 42 4c 45 20 25 73 22  , 0, " TABLE %s"
19980 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b  , pItem->zName);
19990 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
199a0 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 29 7b  pItem->zAlias ){
199b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 58 50  .      sqlite3XP
199c0 72 69 6e 74 66 28 26 73 74 72 2c 20 30 2c 20 22  rintf(&str, 0, "
199d0 20 41 53 20 25 73 22 2c 20 70 49 74 65 6d 2d 3e   AS %s", pItem->
199e0 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 7d 0a 20  zAlias);.    }. 
199f0 20 20 20 69 66 28 20 28 66 6c 61 67 73 20 26 20     if( (flags & 
19a00 28 57 48 45 52 45 5f 49 50 4b 7c 57 48 45 52 45  (WHERE_IPK|WHERE
19a10 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 29 3d  _VIRTUALTABLE))=
19a20 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73  =0 ){.      cons
19a30 74 20 63 68 61 72 20 2a 7a 46 6d 74 20 3d 20 30  t char *zFmt = 0
19a40 3b 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70  ;.      Index *p
19a50 49 64 78 3b 0a 0a 20 20 20 20 20 20 61 73 73 65  Idx;..      asse
19a60 72 74 28 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72  rt( pLoop->u.btr
19a70 65 65 2e 70 49 6e 64 65 78 21 3d 30 20 29 3b 0a  ee.pIndex!=0 );.
19a80 20 20 20 20 20 20 70 49 64 78 20 3d 20 70 4c 6f        pIdx = pLo
19a90 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  op->u.btree.pInd
19aa0 65 78 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ex;.      assert
19ab0 28 20 21 28 66 6c 61 67 73 26 57 48 45 52 45 5f  ( !(flags&WHERE_
19ac0 41 55 54 4f 5f 49 4e 44 45 58 29 20 7c 7c 20 28  AUTO_INDEX) || (
19ad0 66 6c 61 67 73 26 57 48 45 52 45 5f 49 44 58 5f  flags&WHERE_IDX_
19ae0 4f 4e 4c 59 29 20 29 3b 0a 20 20 20 20 20 20 69  ONLY) );.      i
19af0 66 28 20 21 48 61 73 52 6f 77 69 64 28 70 49 74  f( !HasRowid(pIt
19b00 65 6d 2d 3e 70 54 61 62 29 20 26 26 20 49 73 50  em->pTab) && IsP
19b10 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70  rimaryKeyIndex(p
19b20 49 64 78 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Idx) ){.        
19b30 69 66 28 20 69 73 53 65 61 72 63 68 20 29 7b 0a  if( isSearch ){.
19b40 20 20 20 20 20 20 20 20 20 20 7a 46 6d 74 20 3d            zFmt =
19b50 20 22 50 52 49 4d 41 52 59 20 4b 45 59 22 3b 0a   "PRIMARY KEY";.
19b60 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
19b70 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20  }else if( flags 
19b80 26 20 57 48 45 52 45 5f 50 41 52 54 49 41 4c 49  & WHERE_PARTIALI
19b90 44 58 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 46  DX ){.        zF
19ba0 6d 74 20 3d 20 22 41 55 54 4f 4d 41 54 49 43 20  mt = "AUTOMATIC 
19bb0 50 41 52 54 49 41 4c 20 43 4f 56 45 52 49 4e 47  PARTIAL COVERING
19bc0 20 49 4e 44 45 58 22 3b 0a 20 20 20 20 20 20 7d   INDEX";.      }
19bd0 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20 26  else if( flags &
19be0 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45   WHERE_AUTO_INDE
19bf0 58 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 46 6d  X ){.        zFm
19c00 74 20 3d 20 22 41 55 54 4f 4d 41 54 49 43 20 43  t = "AUTOMATIC C
19c10 4f 56 45 52 49 4e 47 20 49 4e 44 45 58 22 3b 0a  OVERING INDEX";.
19c20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
19c30 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 44  flags & WHERE_ID
19c40 58 5f 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20  X_ONLY ){.      
19c50 20 20 7a 46 6d 74 20 3d 20 22 43 4f 56 45 52 49    zFmt = "COVERI
19c60 4e 47 20 49 4e 44 45 58 20 25 73 22 3b 0a 20 20  NG INDEX %s";.  
19c70 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
19c80 20 20 20 7a 46 6d 74 20 3d 20 22 49 4e 44 45 58     zFmt = "INDEX
19c90 20 25 73 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20   %s";.      }.  
19ca0 20 20 20 20 69 66 28 20 7a 46 6d 74 20 29 7b 0a      if( zFmt ){.
19cb0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53          sqlite3S
19cc0 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 26 73  trAccumAppend(&s
19cd0 74 72 2c 20 22 20 55 53 49 4e 47 20 22 2c 20 37  tr, " USING ", 7
19ce0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
19cf0 65 33 58 50 72 69 6e 74 66 28 26 73 74 72 2c 20  e3XPrintf(&str, 
19d00 30 2c 20 7a 46 6d 74 2c 20 70 49 64 78 2d 3e 7a  0, zFmt, pIdx->z
19d10 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 65  Name);.        e
19d20 78 70 6c 61 69 6e 49 6e 64 65 78 52 61 6e 67 65  xplainIndexRange
19d30 28 26 73 74 72 2c 20 70 4c 6f 6f 70 2c 20 70 49  (&str, pLoop, pI
19d40 74 65 6d 2d 3e 70 54 61 62 29 3b 0a 20 20 20 20  tem->pTab);.    
19d50 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
19d60 28 20 28 66 6c 61 67 73 20 26 20 57 48 45 52 45  ( (flags & WHERE
19d70 5f 49 50 4b 29 21 3d 30 20 26 26 20 28 66 6c 61  _IPK)!=0 && (fla
19d80 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4e 53 54  gs & WHERE_CONST
19d90 52 41 49 4e 54 29 21 3d 30 20 29 7b 0a 20 20 20  RAINT)!=0 ){.   
19da0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
19db0 52 61 6e 67 65 3b 0a 20 20 20 20 20 20 69 66 28  Range;.      if(
19dc0 20 66 6c 61 67 73 26 28 57 48 45 52 45 5f 43 4f   flags&(WHERE_CO
19dd0 4c 55 4d 4e 5f 45 51 7c 57 48 45 52 45 5f 43 4f  LUMN_EQ|WHERE_CO
19de0 4c 55 4d 4e 5f 49 4e 29 20 29 7b 0a 20 20 20 20  LUMN_IN) ){.    
19df0 20 20 20 20 7a 52 61 6e 67 65 20 3d 20 22 28 72      zRange = "(r
19e00 6f 77 69 64 3d 3f 29 22 3b 0a 20 20 20 20 20 20  owid=?)";.      
19e10 7d 65 6c 73 65 20 69 66 28 20 28 66 6c 61 67 73  }else if( (flags
19e20 26 57 48 45 52 45 5f 42 4f 54 48 5f 4c 49 4d 49  &WHERE_BOTH_LIMI
19e30 54 29 3d 3d 57 48 45 52 45 5f 42 4f 54 48 5f 4c  T)==WHERE_BOTH_L
19e40 49 4d 49 54 20 29 7b 0a 20 20 20 20 20 20 20 20  IMIT ){.        
19e50 7a 52 61 6e 67 65 20 3d 20 22 28 72 6f 77 69 64  zRange = "(rowid
19e60 3e 3f 20 41 4e 44 20 72 6f 77 69 64 3c 3f 29 22  >? AND rowid<?)"
19e70 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
19e80 28 20 66 6c 61 67 73 26 57 48 45 52 45 5f 42 54  ( flags&WHERE_BT
19e90 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 20  M_LIMIT ){.     
19ea0 20 20 20 7a 52 61 6e 67 65 20 3d 20 22 28 72 6f     zRange = "(ro
19eb0 77 69 64 3e 3f 29 22 3b 0a 20 20 20 20 20 20 7d  wid>?)";.      }
19ec0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73  else{.        as
19ed0 73 65 72 74 28 20 66 6c 61 67 73 26 57 48 45 52  sert( flags&WHER
19ee0 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 3b 0a 20 20  E_TOP_LIMIT);.  
19ef0 20 20 20 20 20 20 7a 52 61 6e 67 65 20 3d 20 22        zRange = "
19f00 28 72 6f 77 69 64 3c 3f 29 22 3b 0a 20 20 20 20  (rowid<?)";.    
19f10 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
19f20 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 41  3StrAccumAppendA
19f30 6c 6c 28 26 73 74 72 2c 20 22 20 55 53 49 4e 47  ll(&str, " USING
19f40 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
19f50 20 4b 45 59 20 22 29 3b 0a 20 20 20 20 20 20 73   KEY ");.      s
19f60 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70  qlite3StrAccumAp
19f70 70 65 6e 64 41 6c 6c 28 26 73 74 72 2c 20 7a 52  pendAll(&str, zR
19f80 61 6e 67 65 29 3b 0a 20 20 20 20 7d 0a 23 69 66  ange);.    }.#if
19f90 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
19fa0 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
19fb0 20 20 65 6c 73 65 20 69 66 28 20 28 66 6c 61 67    else if( (flag
19fc0 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41  s & WHERE_VIRTUA
19fd0 4c 54 41 42 4c 45 29 21 3d 30 20 29 7b 0a 20 20  LTABLE)!=0 ){.  
19fe0 20 20 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e      sqlite3XPrin
19ff0 74 66 28 26 73 74 72 2c 20 30 2c 20 22 20 56 49  tf(&str, 0, " VI
1a000 52 54 55 41 4c 20 54 41 42 4c 45 20 49 4e 44 45  RTUAL TABLE INDE
1a010 58 20 25 64 3a 25 73 22 2c 0a 20 20 20 20 20 20  X %d:%s",.      
1a020 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 6f 6f              pLoo
1a030 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 4e 75 6d  p->u.vtab.idxNum
1a040 2c 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e  , pLoop->u.vtab.
1a050 69 64 78 53 74 72 29 3b 0a 20 20 20 20 7d 0a 23  idxStr);.    }.#
1a060 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c  endif.#ifdef SQL
1a070 49 54 45 5f 45 58 50 4c 41 49 4e 5f 45 53 54 49  ITE_EXPLAIN_ESTI
1a080 4d 41 54 45 44 5f 52 4f 57 53 0a 20 20 20 20 69  MATED_ROWS.    i
1a090 66 28 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 3e 3d  f( pLoop->nOut>=
1a0a0 31 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  10 ){.      sqli
1a0b0 74 65 33 58 50 72 69 6e 74 66 28 26 73 74 72 2c  te3XPrintf(&str,
1a0c0 20 30 2c 20 22 20 28 7e 25 6c 6c 75 20 72 6f 77   0, " (~%llu row
1a0d0 73 29 22 2c 20 73 71 6c 69 74 65 33 4c 6f 67 45  s)", sqlite3LogE
1a0e0 73 74 54 6f 49 6e 74 28 70 4c 6f 6f 70 2d 3e 6e  stToInt(pLoop->n
1a0f0 4f 75 74 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Out));.    }else
1a100 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  {.      sqlite3S
1a110 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 26 73  trAccumAppend(&s
1a120 74 72 2c 20 22 20 28 7e 31 20 72 6f 77 29 22 2c  tr, " (~1 row)",
1a130 20 39 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69   9);.    }.#endi
1a140 66 0a 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c  f.    zMsg = sql
1a150 69 74 65 33 53 74 72 41 63 63 75 6d 46 69 6e 69  ite3StrAccumFini
1a160 73 68 28 26 73 74 72 29 3b 0a 20 20 20 20 72 65  sh(&str);.    re
1a170 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  t = sqlite3VdbeA
1a180 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45 78 70 6c  ddOp4(v, OP_Expl
1a190 61 69 6e 2c 20 69 49 64 2c 20 69 4c 65 76 65 6c  ain, iId, iLevel
1a1a0 2c 20 69 46 72 6f 6d 2c 20 7a 4d 73 67 2c 50 34  , iFrom, zMsg,P4
1a1b0 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 20  _DYNAMIC);.  }. 
1a1c0 20 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 23   return ret;.}.#
1a1d0 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 65 78  else.# define ex
1a1e0 70 6c 61 69 6e 4f 6e 65 53 63 61 6e 28 75 2c 76  plainOneScan(u,v
1a1f0 2c 77 2c 78 2c 79 2c 7a 29 20 30 0a 23 65 6e 64  ,w,x,y,z) 0.#end
1a200 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
1a210 54 5f 45 58 50 4c 41 49 4e 20 2a 2f 0a 0a 23 69  T_EXPLAIN */..#i
1a220 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
1a230 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41 54  LE_STMT_SCANSTAT
1a240 55 53 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75  US./*.** Configu
1a250 72 65 20 74 68 65 20 56 4d 20 70 61 73 73 65 64  re the VM passed
1a260 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
1a270 67 75 6d 65 6e 74 20 77 69 74 68 20 61 6e 0a 2a  gument with an.*
1a280 2a 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73  * sqlite3_stmt_s
1a290 63 61 6e 73 74 61 74 75 73 28 29 20 65 6e 74 72  canstatus() entr
1a2a0 79 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  y corresponding 
1a2b0 74 6f 20 74 68 65 20 73 63 61 6e 20 75 73 65 64  to the scan used
1a2c0 20 74 6f 20 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e   to .** implemen
1a2d0 74 20 6c 65 76 65 6c 20 70 4c 76 6c 2e 20 41 72  t level pLvl. Ar
1a2e0 67 75 6d 65 6e 74 20 70 53 72 63 6c 69 73 74 20  gument pSrclist 
1a2f0 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
1a300 74 68 65 20 46 52 4f 4d 20 0a 2a 2a 20 63 6c 61  the FROM .** cla
1a310 75 73 65 20 74 68 61 74 20 74 68 65 20 73 63 61  use that the sca
1a320 6e 20 72 65 61 64 73 20 64 61 74 61 20 66 72 6f  n reads data fro
1a330 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72 67 75  m..**.** If argu
1a340 6d 65 6e 74 20 61 64 64 72 45 78 70 6c 61 69 6e  ment addrExplain
1a350 20 69 73 20 6e 6f 74 20 30 2c 20 69 74 20 6d 75   is not 0, it mu
1a360 73 74 20 62 65 20 74 68 65 20 61 64 64 72 65 73  st be the addres
1a370 73 20 6f 66 20 61 6e 20 0a 2a 2a 20 4f 50 5f 45  s of an .** OP_E
1a380 78 70 6c 61 69 6e 20 69 6e 73 74 72 75 63 74 69  xplain instructi
1a390 6f 6e 20 74 68 61 74 20 64 65 73 63 72 69 62 65  on that describe
1a3a0 73 20 74 68 65 20 73 61 6d 65 20 6c 6f 6f 70 2e  s the same loop.
1a3b0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1a3c0 61 64 64 53 63 61 6e 53 74 61 74 75 73 28 0a 20  addScanStatus(. 
1a3d0 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20 20 20   Vdbe *v,       
1a3e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a3f0 20 2f 2a 20 56 64 62 65 20 74 6f 20 61 64 64 20   /* Vdbe to add 
1a400 73 63 61 6e 73 74 61 74 75 73 20 65 6e 74 72 79  scanstatus entry
1a410 20 74 6f 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74   to */.  SrcList
1a420 20 2a 70 53 72 63 6c 69 73 74 2c 20 20 20 20 20   *pSrclist,     
1a430 20 20 20 20 20 20 20 20 20 2f 2a 20 46 52 4f 4d           /* FROM
1a440 20 63 6c 61 75 73 65 20 70 4c 76 6c 20 72 65 61   clause pLvl rea
1a450 64 73 20 64 61 74 61 20 66 72 6f 6d 20 2a 2f 0a  ds data from */.
1a460 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c    WhereLevel *pL
1a470 76 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  vl,             
1a480 20 20 2f 2a 20 4c 65 76 65 6c 20 74 6f 20 61 64    /* Level to ad
1a490 64 20 73 63 61 6e 73 74 61 74 75 73 28 29 20 65  d scanstatus() e
1a4a0 6e 74 72 79 20 66 6f 72 20 2a 2f 0a 20 20 69 6e  ntry for */.  in
1a4b0 74 20 61 64 64 72 45 78 70 6c 61 69 6e 20 20 20  t addrExplain   
1a4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a4d0 20 41 64 64 72 65 73 73 20 6f 66 20 4f 50 5f 45   Address of OP_E
1a4e0 78 70 6c 61 69 6e 20 28 6f 72 20 30 29 20 2a 2f  xplain (or 0) */
1a4f0 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  .){.  const char
1a500 20 2a 7a 4f 62 6a 20 3d 20 30 3b 0a 20 20 57 68   *zObj = 0;.  Wh
1a510 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 20 3d  ereLoop *pLoop =
1a520 20 70 4c 76 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20   pLvl->pWLoop;. 
1a530 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46   if( (pLoop->wsF
1a540 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 49 50  lags & (WHERE_IP
1a550 4b 7c 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54  K|WHERE_VIRTUALT
1a560 41 42 4c 45 29 29 3d 3d 30 20 29 7b 0a 20 20 20  ABLE))==0 ){.   
1a570 20 7a 4f 62 6a 20 3d 20 70 4c 6f 6f 70 2d 3e 75   zObj = pLoop->u
1a580 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 2d 3e 7a  .btree.pIndex->z
1a590 4e 61 6d 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Name;.  }else{. 
1a5a0 20 20 20 7a 4f 62 6a 20 3d 20 70 53 72 63 6c 69     zObj = pSrcli
1a5b0 73 74 2d 3e 61 5b 70 4c 76 6c 2d 3e 69 46 72 6f  st->a[pLvl->iFro
1a5c0 6d 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 7d 0a 20 20  m].zName;.  }.  
1a5d0 73 71 6c 69 74 65 33 56 64 62 65 53 63 61 6e 53  sqlite3VdbeScanS
1a5e0 74 61 74 75 73 28 0a 20 20 20 20 20 20 76 2c 20  tatus(.      v, 
1a5f0 61 64 64 72 45 78 70 6c 61 69 6e 2c 20 70 4c 76  addrExplain, pLv
1a600 6c 2d 3e 61 64 64 72 42 6f 64 79 2c 20 70 4c 76  l->addrBody, pLv
1a610 6c 2d 3e 61 64 64 72 56 69 73 69 74 2c 20 70 4c  l->addrVisit, pL
1a620 6f 6f 70 2d 3e 6e 4f 75 74 2c 20 7a 4f 62 6a 0a  oop->nOut, zObj.
1a630 20 20 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64    );.}.#else.# d
1a640 65 66 69 6e 65 20 61 64 64 53 63 61 6e 53 74 61  efine addScanSta
1a650 74 75 73 28 61 2c 20 62 2c 20 63 2c 20 64 29 20  tus(a, b, c, d) 
1a660 28 28 76 6f 69 64 29 64 29 0a 23 65 6e 64 69 66  ((void)d).#endif
1a670 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  ..../*.** Genera
1a680 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20  te code for the 
1a690 73 74 61 72 74 20 6f 66 20 74 68 65 20 69 4c 65  start of the iLe
1a6a0 76 65 6c 2d 74 68 20 6c 6f 6f 70 20 69 6e 20 74  vel-th loop in t
1a6b0 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 0a  he WHERE clause.
1a6c0 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** implementatio
1a6d0 6e 20 64 65 73 63 72 69 62 65 64 20 62 79 20 70  n described by p
1a6e0 57 49 6e 66 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63  WInfo..*/.static
1a6f0 20 42 69 74 6d 61 73 6b 20 63 6f 64 65 4f 6e 65   Bitmask codeOne
1a700 4c 6f 6f 70 53 74 61 72 74 28 0a 20 20 57 68 65  LoopStart(.  Whe
1a710 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 20  reInfo *pWInfo, 
1a720 20 20 2f 2a 20 43 6f 6d 70 6c 65 74 65 20 69 6e    /* Complete in
1a730 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
1a740 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
1a750 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 76 65 6c   */.  int iLevel
1a760 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68  ,          /* Wh
1a770 69 63 68 20 6c 65 76 65 6c 20 6f 66 20 70 57 49  ich level of pWI
1a780 6e 66 6f 2d 3e 61 5b 5d 20 73 68 6f 75 6c 64 20  nfo->a[] should 
1a790 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 42 69  be coded */.  Bi
1a7a0 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 20 20  tmask notReady  
1a7b0 20 20 20 2f 2a 20 57 68 69 63 68 20 74 61 62 6c     /* Which tabl
1a7c0 65 73 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79  es are currently
1a7d0 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 29 7b   available */.){
1a7e0 0a 20 20 69 6e 74 20 6a 2c 20 6b 3b 20 20 20 20  .  int j, k;    
1a7f0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
1a800 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e  counters */.  in
1a810 74 20 69 43 75 72 3b 20 20 20 20 20 20 20 20 20  t iCur;         
1a820 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 63     /* The VDBE c
1a830 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20 74 61  ursor for the ta
1a840 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ble */.  int add
1a850 72 4e 78 74 3b 20 20 20 20 20 20 20 20 20 2f 2a  rNxt;         /*
1a860 20 57 68 65 72 65 20 74 6f 20 6a 75 6d 70 20 74   Where to jump t
1a870 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20  o continue with 
1a880 74 68 65 20 6e 65 78 74 20 49 4e 20 63 61 73 65  the next IN case
1a890 20 2a 2f 0a 20 20 69 6e 74 20 6f 6d 69 74 54 61   */.  int omitTa
1a8a0 62 6c 65 3b 20 20 20 20 20 20 20 2f 2a 20 54 72  ble;       /* Tr
1a8b0 75 65 20 69 66 20 77 65 20 75 73 65 20 74 68 65  ue if we use the
1a8c0 20 69 6e 64 65 78 20 6f 6e 6c 79 20 2a 2f 0a 20   index only */. 
1a8d0 20 69 6e 74 20 62 52 65 76 3b 20 20 20 20 20 20   int bRev;      
1a8e0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
1a8f0 20 77 65 20 6e 65 65 64 20 74 6f 20 73 63 61 6e   we need to scan
1a900 20 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65   in reverse orde
1a910 72 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65  r */.  WhereLeve
1a920 6c 20 2a 70 4c 65 76 65 6c 3b 20 20 2f 2a 20 54  l *pLevel;  /* T
1a930 68 65 20 77 68 65 72 65 20 6c 65 76 65 6c 20 74  he where level t
1a940 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20  o be coded */.  
1a950 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70  WhereLoop *pLoop
1a960 3b 20 20 20 20 2f 2a 20 54 68 65 20 57 68 65 72  ;    /* The Wher
1a970 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 62 65 69  eLoop object bei
1a980 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 57 68  ng coded */.  Wh
1a990 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 20  ereClause *pWC; 
1a9a0 20 20 20 2f 2a 20 44 65 63 6f 6d 70 6f 73 69 74     /* Decomposit
1a9b0 69 6f 6e 20 6f 66 20 74 68 65 20 65 6e 74 69 72  ion of the entir
1a9c0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
1a9d0 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  /.  WhereTerm *p
1a9e0 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20  Term;           
1a9f0 20 20 20 20 2f 2a 20 41 20 57 48 45 52 45 20 63      /* A WHERE c
1aa00 6c 61 75 73 65 20 74 65 72 6d 20 2a 2f 0a 20 20  lause term */.  
1aa10 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20 20  Parse *pParse;  
1aa20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aa30 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
1aa40 78 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  xt */.  sqlite3 
1aa50 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  *db;            
1aa60 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
1aa70 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
1aa80 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20  /.  Vdbe *v;    
1aa90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aaa0 20 20 20 20 2f 2a 20 54 68 65 20 70 72 65 70 61      /* The prepa
1aab0 72 65 64 20 73 74 6d 74 20 75 6e 64 65 72 20 63  red stmt under c
1aac0 6f 6e 73 74 72 75 63 74 69 6f 6e 73 20 2a 2f 0a  onstructions */.
1aad0 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
1aae0 5f 69 74 65 6d 20 2a 70 54 61 62 49 74 65 6d 3b  _item *pTabItem;
1aaf0 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65    /* FROM clause
1ab00 20 74 65 72 6d 20 62 65 69 6e 67 20 63 6f 64 65   term being code
1ab10 64 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 42  d */.  int addrB
1ab20 72 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rk;             
1ab30 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68         /* Jump h
1ab40 65 72 65 20 74 6f 20 62 72 65 61 6b 20 6f 75 74  ere to break out
1ab50 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a   of the loop */.
1ab60 20 20 69 6e 74 20 61 64 64 72 43 6f 6e 74 3b 20    int addrCont; 
1ab70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ab80 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74    /* Jump here t
1ab90 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20  o continue with 
1aba0 6e 65 78 74 20 63 79 63 6c 65 20 2a 2f 0a 20 20  next cycle */.  
1abb0 69 6e 74 20 69 52 6f 77 69 64 52 65 67 20 3d 20  int iRowidReg = 
1abc0 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77  0;        /* Row
1abd0 69 64 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  id is stored in 
1abe0 74 68 69 73 20 72 65 67 69 73 74 65 72 2c 20 69  this register, i
1abf0 66 20 6e 6f 74 20 7a 65 72 6f 20 2a 2f 0a 20 20  f not zero */.  
1ac00 69 6e 74 20 69 52 65 6c 65 61 73 65 52 65 67 20  int iReleaseReg 
1ac10 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 54 65 6d  = 0;      /* Tem
1ac20 70 20 72 65 67 69 73 74 65 72 20 74 6f 20 66 72  p register to fr
1ac30 65 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  ee before return
1ac40 69 6e 67 20 2a 2f 0a 0a 20 20 70 50 61 72 73 65  ing */..  pParse
1ac50 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73   = pWInfo->pPars
1ac60 65 3b 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d  e;.  v = pParse-
1ac70 3e 70 56 64 62 65 3b 0a 20 20 70 57 43 20 3d 20  >pVdbe;.  pWC = 
1ac80 26 70 57 49 6e 66 6f 2d 3e 73 57 43 3b 0a 20 20  &pWInfo->sWC;.  
1ac90 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
1aca0 0a 20 20 70 4c 65 76 65 6c 20 3d 20 26 70 57 49  .  pLevel = &pWI
1acb0 6e 66 6f 2d 3e 61 5b 69 4c 65 76 65 6c 5d 3b 0a  nfo->a[iLevel];.
1acc0 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c    pLoop = pLevel
1acd0 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 70 54 61 62  ->pWLoop;.  pTab
1ace0 49 74 65 6d 20 3d 20 26 70 57 49 6e 66 6f 2d 3e  Item = &pWInfo->
1acf0 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76  pTabList->a[pLev
1ad00 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 69 43  el->iFrom];.  iC
1ad10 75 72 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69  ur = pTabItem->i
1ad20 43 75 72 73 6f 72 3b 0a 20 20 70 4c 65 76 65 6c  Cursor;.  pLevel
1ad30 2d 3e 6e 6f 74 52 65 61 64 79 20 3d 20 6e 6f 74  ->notReady = not
1ad40 52 65 61 64 79 20 26 20 7e 67 65 74 4d 61 73 6b  Ready & ~getMask
1ad50 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53  (&pWInfo->sMaskS
1ad60 65 74 2c 20 69 43 75 72 29 3b 0a 20 20 62 52 65  et, iCur);.  bRe
1ad70 76 20 3d 20 28 70 57 49 6e 66 6f 2d 3e 72 65 76  v = (pWInfo->rev
1ad80 4d 61 73 6b 3e 3e 69 4c 65 76 65 6c 29 26 31 3b  Mask>>iLevel)&1;
1ad90 0a 20 20 6f 6d 69 74 54 61 62 6c 65 20 3d 20 28  .  omitTable = (
1ada0 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
1adb0 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29   WHERE_IDX_ONLY)
1adc0 21 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20 20  !=0 .           
1add0 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72  && (pWInfo->wctr
1ade0 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 46  lFlags & WHERE_F
1adf0 4f 52 43 45 5f 54 41 42 4c 45 29 3d 3d 30 3b 0a  ORCE_TABLE)==0;.
1ae00 20 20 56 64 62 65 4d 6f 64 75 6c 65 43 6f 6d 6d    VdbeModuleComm
1ae10 65 6e 74 28 28 76 2c 20 22 42 65 67 69 6e 20 57  ent((v, "Begin W
1ae20 48 45 52 45 2d 6c 6f 6f 70 25 64 3a 20 25 73 22  HERE-loop%d: %s"
1ae30 2c 69 4c 65 76 65 6c 2c 70 54 61 62 49 74 65 6d  ,iLevel,pTabItem
1ae40 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b  ->pTab->zName));
1ae50 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 20 6c 61  ..  /* Create la
1ae60 62 65 6c 73 20 66 6f 72 20 74 68 65 20 22 62 72  bels for the "br
1ae70 65 61 6b 22 20 61 6e 64 20 22 63 6f 6e 74 69 6e  eak" and "contin
1ae80 75 65 22 20 69 6e 73 74 72 75 63 74 69 6f 6e 73  ue" instructions
1ae90 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 63 75  .  ** for the cu
1aea0 72 72 65 6e 74 20 6c 6f 6f 70 2e 20 20 4a 75 6d  rrent loop.  Jum
1aeb0 70 20 74 6f 20 61 64 64 72 42 72 6b 20 74 6f 20  p to addrBrk to 
1aec0 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 61 20 6c  break out of a l
1aed0 6f 6f 70 2e 0a 20 20 2a 2a 20 4a 75 6d 70 20 74  oop..  ** Jump t
1aee0 6f 20 63 6f 6e 74 20 74 6f 20 67 6f 20 69 6d 6d  o cont to go imm
1aef0 65 64 69 61 74 65 6c 79 20 74 6f 20 74 68 65 20  ediately to the 
1af00 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e 20 6f  next iteration o
1af10 66 20 74 68 65 0a 20 20 2a 2a 20 6c 6f 6f 70 2e  f the.  ** loop.
1af20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20  .  **.  ** When 
1af30 74 68 65 72 65 20 69 73 20 61 6e 20 49 4e 20 6f  there is an IN o
1af40 70 65 72 61 74 6f 72 2c 20 77 65 20 61 6c 73 6f  perator, we also
1af50 20 68 61 76 65 20 61 20 22 61 64 64 72 4e 78 74   have a "addrNxt
1af60 22 20 6c 61 62 65 6c 20 74 68 61 74 0a 20 20 2a  " label that.  *
1af70 2a 20 6d 65 61 6e 73 20 74 6f 20 63 6f 6e 74 69  * means to conti
1af80 6e 75 65 20 77 69 74 68 20 74 68 65 20 6e 65 78  nue with the nex
1af90 74 20 49 4e 20 76 61 6c 75 65 20 63 6f 6d 62 69  t IN value combi
1afa0 6e 61 74 69 6f 6e 2e 20 20 57 68 65 6e 0a 20 20  nation.  When.  
1afb0 2a 2a 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  ** there are no 
1afc0 49 4e 20 6f 70 65 72 61 74 6f 72 73 20 69 6e 20  IN operators in 
1afd0 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c  the constraints,
1afe0 20 74 68 65 20 22 61 64 64 72 4e 78 74 22 20 6c   the "addrNxt" l
1aff0 61 62 65 6c 0a 20 20 2a 2a 20 69 73 20 74 68 65  abel.  ** is the
1b000 20 73 61 6d 65 20 61 73 20 22 61 64 64 72 42 72   same as "addrBr
1b010 6b 22 2e 0a 20 20 2a 2f 0a 20 20 61 64 64 72 42  k"..  */.  addrB
1b020 72 6b 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64  rk = pLevel->add
1b030 72 42 72 6b 20 3d 20 70 4c 65 76 65 6c 2d 3e 61  rBrk = pLevel->a
1b040 64 64 72 4e 78 74 20 3d 20 73 71 6c 69 74 65 33  ddrNxt = sqlite3
1b050 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
1b060 3b 0a 20 20 61 64 64 72 43 6f 6e 74 20 3d 20 70  ;.  addrCont = p
1b070 4c 65 76 65 6c 2d 3e 61 64 64 72 43 6f 6e 74 20  Level->addrCont 
1b080 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
1b090 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 2f 2a  eLabel(v);..  /*
1b0a0 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
1b0b0 72 69 67 68 74 20 74 61 62 6c 65 20 6f 66 20 61  right table of a
1b0c0 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e   LEFT OUTER JOIN
1b0d0 2c 20 61 6c 6c 6f 63 61 74 65 20 61 6e 64 0a 20  , allocate and. 
1b0e0 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 20 61   ** initialize a
1b0f0 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 68 61   memory cell tha
1b100 74 20 72 65 63 6f 72 64 73 20 69 66 20 74 68 69  t records if thi
1b110 73 20 74 61 62 6c 65 20 6d 61 74 63 68 65 73 20  s table matches 
1b120 61 6e 79 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20  any.  ** row of 
1b130 74 68 65 20 6c 65 66 74 20 74 61 62 6c 65 20 6f  the left table o
1b140 66 20 74 68 65 20 6a 6f 69 6e 2e 0a 20 20 2a 2f  f the join..  */
1b150 0a 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69  .  if( pLevel->i
1b160 46 72 6f 6d 3e 30 20 26 26 20 28 70 54 61 62 49  From>0 && (pTabI
1b170 74 65 6d 5b 30 5d 2e 6a 6f 69 6e 74 79 70 65 20  tem[0].jointype 
1b180 26 20 4a 54 5f 4c 45 46 54 29 21 3d 30 20 29 7b  & JT_LEFT)!=0 ){
1b190 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 4c 65  .    pLevel->iLe
1b1a0 66 74 4a 6f 69 6e 20 3d 20 2b 2b 70 50 61 72 73  ftJoin = ++pPars
1b1b0 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c  e->nMem;.    sql
1b1c0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1b1d0 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
1b1e0 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f   pLevel->iLeftJo
1b1f0 69 6e 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d  in);.    VdbeCom
1b200 6d 65 6e 74 28 28 76 2c 20 22 69 6e 69 74 20 4c  ment((v, "init L
1b210 45 46 54 20 4a 4f 49 4e 20 6e 6f 2d 6d 61 74 63  EFT JOIN no-matc
1b220 68 20 66 6c 61 67 22 29 29 3b 0a 20 20 7d 0a 0a  h flag"));.  }..
1b230 20 20 2f 2a 20 53 70 65 63 69 61 6c 20 63 61 73    /* Special cas
1b240 65 20 6f 66 20 61 20 46 52 4f 4d 20 63 6c 61 75  e of a FROM clau
1b250 73 65 20 73 75 62 71 75 65 72 79 20 69 6d 70 6c  se subquery impl
1b260 65 6d 65 6e 74 65 64 20 61 73 20 61 20 63 6f 2d  emented as a co-
1b270 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 66 28  routine */.  if(
1b280 20 70 54 61 62 49 74 65 6d 2d 3e 76 69 61 43 6f   pTabItem->viaCo
1b290 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20 69  routine ){.    i
1b2a0 6e 74 20 72 65 67 59 69 65 6c 64 20 3d 20 70 54  nt regYield = pT
1b2b0 61 62 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72  abItem->regRetur
1b2c0 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  n;.    sqlite3Vd
1b2d0 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
1b2e0 6e 69 74 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65  nitCoroutine, re
1b2f0 67 59 69 65 6c 64 2c 20 30 2c 20 70 54 61 62 49  gYield, 0, pTabI
1b300 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62  tem->addrFillSub
1b310 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  );.    pLevel->p
1b320 32 20 3d 20 20 73 71 6c 69 74 65 33 56 64 62 65  2 =  sqlite3Vdbe
1b330 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65  AddOp2(v, OP_Yie
1b340 6c 64 2c 20 72 65 67 59 69 65 6c 64 2c 20 61 64  ld, regYield, ad
1b350 64 72 42 72 6b 29 3b 0a 20 20 20 20 56 64 62 65  drBrk);.    Vdbe
1b360 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
1b370 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
1b380 20 22 6e 65 78 74 20 72 6f 77 20 6f 66 20 5c 22   "next row of \"
1b390 25 73 5c 22 22 2c 20 70 54 61 62 49 74 65 6d 2d  %s\"", pTabItem-
1b3a0 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a  >pTab->zName));.
1b3b0 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d      pLevel->op =
1b3c0 20 4f 50 5f 47 6f 74 6f 3b 0a 20 20 7d 65 6c 73   OP_Goto;.  }els
1b3d0 65 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  e..#ifndef SQLIT
1b3e0 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
1b3f0 42 4c 45 0a 20 20 69 66 28 20 20 28 70 4c 6f 6f  BLE.  if(  (pLoo
1b400 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
1b410 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  RE_VIRTUALTABLE)
1b420 21 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61  !=0 ){.    /* Ca
1b430 73 65 20 31 3a 20 20 54 68 65 20 74 61 62 6c 65  se 1:  The table
1b440 20 69 73 20 61 20 76 69 72 74 75 61 6c 2d 74 61   is a virtual-ta
1b450 62 6c 65 2e 20 20 55 73 65 20 74 68 65 20 56 46  ble.  Use the VF
1b460 69 6c 74 65 72 20 61 6e 64 20 56 4e 65 78 74 0a  ilter and VNext.
1b470 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
1b480 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 64 61  to access the da
1b490 74 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ta..    */.    i
1b4a0 6e 74 20 69 52 65 67 3b 20 20 20 2f 2a 20 50 33  nt iReg;   /* P3
1b4b0 20 56 61 6c 75 65 20 66 6f 72 20 4f 50 5f 56 46   Value for OP_VF
1b4c0 69 6c 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74  ilter */.    int
1b4d0 20 61 64 64 72 4e 6f 74 46 6f 75 6e 64 3b 0a 20   addrNotFound;. 
1b4e0 20 20 20 69 6e 74 20 6e 43 6f 6e 73 74 72 61 69     int nConstrai
1b4f0 6e 74 20 3d 20 70 4c 6f 6f 70 2d 3e 6e 4c 54 65  nt = pLoop->nLTe
1b500 72 6d 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33  rm;..    sqlite3
1b510 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50  ExprCachePush(pP
1b520 61 72 73 65 29 3b 0a 20 20 20 20 69 52 65 67 20  arse);.    iReg 
1b530 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
1b540 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 43  Range(pParse, nC
1b550 6f 6e 73 74 72 61 69 6e 74 2b 32 29 3b 0a 20 20  onstraint+2);.  
1b560 20 20 61 64 64 72 4e 6f 74 46 6f 75 6e 64 20 3d    addrNotFound =
1b570 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b   pLevel->addrBrk
1b580 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  ;.    for(j=0; j
1b590 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 6a 2b  <nConstraint; j+
1b5a0 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 54  +){.      int iT
1b5b0 61 72 67 65 74 20 3d 20 69 52 65 67 2b 6a 2b 32  arget = iReg+j+2
1b5c0 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20  ;.      pTerm = 
1b5d0 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d  pLoop->aLTerm[j]
1b5e0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72  ;.      if( pTer
1b5f0 6d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  m==0 ) continue;
1b600 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d  .      if( pTerm
1b610 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
1b620 5f 49 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 63  _IN ){.        c
1b630 6f 64 65 45 71 75 61 6c 69 74 79 54 65 72 6d 28  odeEqualityTerm(
1b640 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2c 20 70  pParse, pTerm, p
1b650 4c 65 76 65 6c 2c 20 6a 2c 20 62 52 65 76 2c 20  Level, j, bRev, 
1b660 69 54 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20  iTarget);.      
1b670 20 20 61 64 64 72 4e 6f 74 46 6f 75 6e 64 20 3d    addrNotFound =
1b680 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74   pLevel->addrNxt
1b690 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1b6a0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
1b6b0 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
1b6c0 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69  Term->pExpr->pRi
1b6d0 67 68 74 2c 20 69 54 61 72 67 65 74 29 3b 0a 20  ght, iTarget);. 
1b6e0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1b6f0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1b700 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
1b710 2c 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e  , pLoop->u.vtab.
1b720 69 64 78 4e 75 6d 2c 20 69 52 65 67 29 3b 0a 20  idxNum, iReg);. 
1b730 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1b740 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
1b750 65 72 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2c  er, nConstraint,
1b760 20 69 52 65 67 2b 31 29 3b 0a 20 20 20 20 73 71   iReg+1);.    sq
1b770 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
1b780 76 2c 20 4f 50 5f 56 46 69 6c 74 65 72 2c 20 69  v, OP_VFilter, i
1b790 43 75 72 2c 20 61 64 64 72 4e 6f 74 46 6f 75 6e  Cur, addrNotFoun
1b7a0 64 2c 20 69 52 65 67 2c 0a 20 20 20 20 20 20 20  d, iReg,.       
1b7b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1b7c0 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78  Loop->u.vtab.idx
1b7d0 53 74 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Str,.           
1b7e0 20 20 20 20 20 20 20 20 20 20 20 70 4c 6f 6f 70             pLoop
1b7f0 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65  ->u.vtab.needFre
1b800 65 20 3f 20 50 34 5f 4d 50 52 49 4e 54 46 20 3a  e ? P4_MPRINTF :
1b810 20 50 34 5f 53 54 41 54 49 43 29 3b 0a 20 20 20   P4_STATIC);.   
1b820 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
1b830 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 76  ;.    pLoop->u.v
1b840 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3d 20 30  tab.needFree = 0
1b850 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  ;.    for(j=0; j
1b860 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 20 26 26 20  <nConstraint && 
1b870 6a 3c 31 36 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  j<16; j++){.    
1b880 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 75 2e    if( (pLoop->u.
1b890 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 3e 3e 6a  vtab.omitMask>>j
1b8a0 29 26 31 20 29 7b 0a 20 20 20 20 20 20 20 20 64  )&1 ){.        d
1b8b0 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65  isableTerm(pLeve
1b8c0 6c 2c 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d  l, pLoop->aLTerm
1b8d0 5b 6a 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  [j]);.      }.  
1b8e0 20 20 7d 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e    }.    pLevel->
1b8f0 6f 70 20 3d 20 4f 50 5f 56 4e 65 78 74 3b 0a 20  op = OP_VNext;. 
1b900 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20     pLevel->p1 = 
1b910 69 43 75 72 3b 0a 20 20 20 20 70 4c 65 76 65 6c  iCur;.    pLevel
1b920 2d 3e 70 32 20 3d 20 73 71 6c 69 74 65 33 56 64  ->p2 = sqlite3Vd
1b930 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
1b940 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c  ;.    sqlite3Rel
1b950 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50  easeTempRange(pP
1b960 61 72 73 65 2c 20 69 52 65 67 2c 20 6e 43 6f 6e  arse, iReg, nCon
1b970 73 74 72 61 69 6e 74 2b 32 29 3b 0a 20 20 20 20  straint+2);.    
1b980 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
1b990 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20 7d  Pop(pParse);.  }
1b9a0 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53  else.#endif /* S
1b9b0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
1b9c0 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 20 20 69 66  ALTABLE */..  if
1b9d0 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  ( (pLoop->wsFlag
1b9e0 73 20 26 20 57 48 45 52 45 5f 49 50 4b 29 21 3d  s & WHERE_IPK)!=
1b9f0 30 0a 20 20 20 26 26 20 28 70 4c 6f 6f 70 2d 3e  0.   && (pLoop->
1ba00 77 73 46 6c 61 67 73 20 26 20 28 57 48 45 52 45  wsFlags & (WHERE
1ba10 5f 43 4f 4c 55 4d 4e 5f 49 4e 7c 57 48 45 52 45  _COLUMN_IN|WHERE
1ba20 5f 43 4f 4c 55 4d 4e 5f 45 51 29 29 21 3d 30 0a  _COLUMN_EQ))!=0.
1ba30 20 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65    ){.    /* Case
1ba40 20 32 3a 20 20 57 65 20 63 61 6e 20 64 69 72 65   2:  We can dire
1ba50 63 74 6c 79 20 72 65 66 65 72 65 6e 63 65 20 61  ctly reference a
1ba60 20 73 69 6e 67 6c 65 20 72 6f 77 20 75 73 69 6e   single row usin
1ba70 67 20 61 6e 0a 20 20 20 20 2a 2a 20 20 20 20 20  g an.    **     
1ba80 20 20 20 20 20 65 71 75 61 6c 69 74 79 20 63 6f       equality co
1ba90 6d 70 61 72 69 73 6f 6e 20 61 67 61 69 6e 73 74  mparison against
1baa0 20 74 68 65 20 52 4f 57 49 44 20 66 69 65 6c 64   the ROWID field
1bab0 2e 20 20 4f 72 0a 20 20 20 20 2a 2a 20 20 20 20  .  Or.    **    
1bac0 20 20 20 20 20 20 77 65 20 72 65 66 65 72 65 6e        we referen
1bad0 63 65 20 6d 75 6c 74 69 70 6c 65 20 72 6f 77 73  ce multiple rows
1bae0 20 75 73 69 6e 67 20 61 20 22 72 6f 77 69 64 20   using a "rowid 
1baf0 49 4e 20 28 2e 2e 2e 29 22 0a 20 20 20 20 2a 2a  IN (...)".    **
1bb00 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 72            constr
1bb10 75 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  uct..    */.    
1bb20 61 73 73 65 72 74 28 20 70 4c 6f 6f 70 2d 3e 75  assert( pLoop->u
1bb30 2e 62 74 72 65 65 2e 6e 45 71 3d 3d 31 20 29 3b  .btree.nEq==1 );
1bb40 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 70 4c 6f  .    pTerm = pLo
1bb50 6f 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d 3b 0a 20  op->aLTerm[0];. 
1bb60 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d     assert( pTerm
1bb70 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  !=0 );.    asser
1bb80 74 28 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 21  t( pTerm->pExpr!
1bb90 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
1bba0 28 20 6f 6d 69 74 54 61 62 6c 65 3d 3d 30 20 29  ( omitTable==0 )
1bbb0 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
1bbc0 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
1bbd0 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b   TERM_VIRTUAL );
1bbe0 0a 20 20 20 20 69 52 65 6c 65 61 73 65 52 65 67  .    iReleaseReg
1bbf0 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
1bc00 6d 3b 0a 20 20 20 20 69 52 6f 77 69 64 52 65 67  m;.    iRowidReg
1bc10 20 3d 20 63 6f 64 65 45 71 75 61 6c 69 74 79 54   = codeEqualityT
1bc20 65 72 6d 28 70 50 61 72 73 65 2c 20 70 54 65 72  erm(pParse, pTer
1bc30 6d 2c 20 70 4c 65 76 65 6c 2c 20 30 2c 20 62 52  m, pLevel, 0, bR
1bc40 65 76 2c 20 69 52 65 6c 65 61 73 65 52 65 67 29  ev, iReleaseReg)
1bc50 3b 0a 20 20 20 20 69 66 28 20 69 52 6f 77 69 64  ;.    if( iRowid
1bc60 52 65 67 21 3d 69 52 65 6c 65 61 73 65 52 65 67  Reg!=iReleaseReg
1bc70 20 29 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73   ) sqlite3Releas
1bc80 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
1bc90 20 69 52 65 6c 65 61 73 65 52 65 67 29 3b 0a 20   iReleaseReg);. 
1bca0 20 20 20 61 64 64 72 4e 78 74 20 3d 20 70 4c 65     addrNxt = pLe
1bcb0 76 65 6c 2d 3e 61 64 64 72 4e 78 74 3b 0a 20 20  vel->addrNxt;.  
1bcc0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1bcd0 4f 70 32 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65  Op2(v, OP_MustBe
1bce0 49 6e 74 2c 20 69 52 6f 77 69 64 52 65 67 2c 20  Int, iRowidReg, 
1bcf0 61 64 64 72 4e 78 74 29 3b 20 56 64 62 65 43 6f  addrNxt); VdbeCo
1bd00 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73  verage(v);.    s
1bd10 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
1bd20 28 76 2c 20 4f 50 5f 4e 6f 74 45 78 69 73 74 73  (v, OP_NotExists
1bd30 2c 20 69 43 75 72 2c 20 61 64 64 72 4e 78 74 2c  , iCur, addrNxt,
1bd40 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20   iRowidReg);.   
1bd50 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
1bd60 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
1bd70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68  rCacheAffinityCh
1bd80 61 6e 67 65 28 70 50 61 72 73 65 2c 20 69 52 6f  ange(pParse, iRo
1bd90 77 69 64 52 65 67 2c 20 31 29 3b 0a 20 20 20 20  widReg, 1);.    
1bda0 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
1bdb0 53 74 6f 72 65 28 70 50 61 72 73 65 2c 20 69 43  Store(pParse, iC
1bdc0 75 72 2c 20 2d 31 2c 20 69 52 6f 77 69 64 52 65  ur, -1, iRowidRe
1bdd0 67 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d  g);.    VdbeComm
1bde0 65 6e 74 28 28 76 2c 20 22 70 6b 22 29 29 3b 0a  ent((v, "pk"));.
1bdf0 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d      pLevel->op =
1be00 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 7d 65 6c 73   OP_Noop;.  }els
1be10 65 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73  e if( (pLoop->ws
1be20 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 50  Flags & WHERE_IP
1be30 4b 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 26  K)!=0.         &
1be40 26 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  & (pLoop->wsFlag
1be50 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  s & WHERE_COLUMN
1be60 5f 52 41 4e 47 45 29 21 3d 30 0a 20 20 29 7b 0a  _RANGE)!=0.  ){.
1be70 20 20 20 20 2f 2a 20 43 61 73 65 20 33 3a 20 20      /* Case 3:  
1be80 57 65 20 68 61 76 65 20 61 6e 20 69 6e 65 71 75  We have an inequ
1be90 61 6c 69 74 79 20 63 6f 6d 70 61 72 69 73 6f 6e  ality comparison
1bea0 20 61 67 61 69 6e 73 74 20 74 68 65 20 52 4f 57   against the ROW
1beb0 49 44 20 66 69 65 6c 64 2e 0a 20 20 20 20 2a 2f  ID field..    */
1bec0 0a 20 20 20 20 69 6e 74 20 74 65 73 74 4f 70 20  .    int testOp 
1bed0 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 69  = OP_Noop;.    i
1bee0 6e 74 20 73 74 61 72 74 3b 0a 20 20 20 20 69 6e  nt start;.    in
1bef0 74 20 6d 65 6d 45 6e 64 56 61 6c 75 65 20 3d 20  t memEndValue = 
1bf00 30 3b 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d  0;.    WhereTerm
1bf10 20 2a 70 53 74 61 72 74 2c 20 2a 70 45 6e 64 3b   *pStart, *pEnd;
1bf20 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f 6d  ..    assert( om
1bf30 69 74 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20  itTable==0 );.  
1bf40 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20 70 53 74    j = 0;.    pSt
1bf50 61 72 74 20 3d 20 70 45 6e 64 20 3d 20 30 3b 0a  art = pEnd = 0;.
1bf60 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77      if( pLoop->w
1bf70 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 42  sFlags & WHERE_B
1bf80 54 4d 5f 4c 49 4d 49 54 20 29 20 70 53 74 61 72  TM_LIMIT ) pStar
1bf90 74 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72  t = pLoop->aLTer
1bfa0 6d 5b 6a 2b 2b 5d 3b 0a 20 20 20 20 69 66 28 20  m[j++];.    if( 
1bfb0 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
1bfc0 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54   WHERE_TOP_LIMIT
1bfd0 20 29 20 70 45 6e 64 20 3d 20 70 4c 6f 6f 70 2d   ) pEnd = pLoop-
1bfe0 3e 61 4c 54 65 72 6d 5b 6a 2b 2b 5d 3b 0a 20 20  >aLTerm[j++];.  
1bff0 20 20 61 73 73 65 72 74 28 20 70 53 74 61 72 74    assert( pStart
1c000 21 3d 30 20 7c 7c 20 70 45 6e 64 21 3d 30 20 29  !=0 || pEnd!=0 )
1c010 3b 0a 20 20 20 20 69 66 28 20 62 52 65 76 20 29  ;.    if( bRev )
1c020 7b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20  {.      pTerm = 
1c030 70 53 74 61 72 74 3b 0a 20 20 20 20 20 20 70 53  pStart;.      pS
1c040 74 61 72 74 20 3d 20 70 45 6e 64 3b 0a 20 20 20  tart = pEnd;.   
1c050 20 20 20 70 45 6e 64 20 3d 20 70 54 65 72 6d 3b     pEnd = pTerm;
1c060 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
1c070 53 74 61 72 74 20 29 7b 0a 20 20 20 20 20 20 45  Start ){.      E
1c080 78 70 72 20 2a 70 58 3b 20 20 20 20 20 20 20 20  xpr *pX;        
1c090 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72       /* The expr
1c0a0 65 73 73 69 6f 6e 20 74 68 61 74 20 64 65 66 69  ession that defi
1c0b0 6e 65 73 20 74 68 65 20 73 74 61 72 74 20 62 6f  nes the start bo
1c0c0 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  und */.      int
1c0d0 20 72 31 2c 20 72 54 65 6d 70 3b 20 20 20 20 20   r1, rTemp;     
1c0e0 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 73 20     /* Registers 
1c0f0 66 6f 72 20 68 6f 6c 64 69 6e 67 20 74 68 65 20  for holding the 
1c100 73 74 61 72 74 20 62 6f 75 6e 64 61 72 79 20 2a  start boundary *
1c110 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  /..      /* The 
1c120 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6e 73 74 61  following consta
1c130 6e 74 20 6d 61 70 73 20 54 4b 5f 78 78 20 63 6f  nt maps TK_xx co
1c140 64 65 73 20 69 6e 74 6f 20 63 6f 72 72 65 73 70  des into corresp
1c150 6f 6e 64 69 6e 67 20 0a 20 20 20 20 20 20 2a 2a  onding .      **
1c160 20 73 65 65 6b 20 6f 70 63 6f 64 65 73 2e 20 20   seek opcodes.  
1c170 49 74 20 64 65 70 65 6e 64 73 20 6f 6e 20 61 20  It depends on a 
1c180 70 61 72 74 69 63 75 6c 61 72 20 6f 72 64 65 72  particular order
1c190 69 6e 67 20 6f 66 20 54 4b 5f 78 78 0a 20 20 20  ing of TK_xx.   
1c1a0 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73     */.      cons
1c1b0 74 20 75 38 20 61 4d 6f 76 65 4f 70 5b 5d 20 3d  t u8 aMoveOp[] =
1c1c0 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 2f 2a   {.           /*
1c1d0 20 54 4b 5f 47 54 20 2a 2f 20 20 4f 50 5f 53 65   TK_GT */  OP_Se
1c1e0 65 6b 47 54 2c 0a 20 20 20 20 20 20 20 20 20 20  ekGT,.          
1c1f0 20 2f 2a 20 54 4b 5f 4c 45 20 2a 2f 20 20 4f 50   /* TK_LE */  OP
1c200 5f 53 65 65 6b 4c 45 2c 0a 20 20 20 20 20 20 20  _SeekLE,.       
1c210 20 20 20 20 2f 2a 20 54 4b 5f 4c 54 20 2a 2f 20      /* TK_LT */ 
1c220 20 4f 50 5f 53 65 65 6b 4c 54 2c 0a 20 20 20 20   OP_SeekLT,.    
1c230 20 20 20 20 20 20 20 2f 2a 20 54 4b 5f 47 45 20         /* TK_GE 
1c240 2a 2f 20 20 4f 50 5f 53 65 65 6b 47 45 0a 20 20  */  OP_SeekGE.  
1c250 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 61 73 73      };.      ass
1c260 65 72 74 28 20 54 4b 5f 4c 45 3d 3d 54 4b 5f 47  ert( TK_LE==TK_G
1c270 54 2b 31 20 29 3b 20 20 20 20 20 20 2f 2a 20 4d  T+1 );      /* M
1c280 61 6b 65 20 73 75 72 65 20 74 68 65 20 6f 72 64  ake sure the ord
1c290 65 72 69 6e 67 2e 2e 20 2a 2f 0a 20 20 20 20 20  ering.. */.     
1c2a0 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 54 3d 3d   assert( TK_LT==
1c2b0 54 4b 5f 47 54 2b 32 20 29 3b 20 20 20 20 20 20  TK_GT+2 );      
1c2c0 2f 2a 20 20 2e 2e 2e 20 6f 66 20 74 68 65 20 54  /*  ... of the T
1c2d0 4b 5f 78 78 20 76 61 6c 75 65 73 2e 2e 2e 20 2a  K_xx values... *
1c2e0 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
1c2f0 54 4b 5f 47 45 3d 3d 54 4b 5f 47 54 2b 33 20 29  TK_GE==TK_GT+3 )
1c300 3b 20 20 20 20 20 20 2f 2a 20 20 2e 2e 2e 20 69  ;      /*  ... i
1c310 73 20 63 6f 72 72 65 63 63 74 2e 20 2a 2f 0a 0a  s correcct. */..
1c320 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
1c330 53 74 61 72 74 2d 3e 77 74 46 6c 61 67 73 20 26  Start->wtFlags &
1c340 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20   TERM_VNULL)==0 
1c350 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1c360 65 28 20 70 53 74 61 72 74 2d 3e 77 74 46 6c 61  e( pStart->wtFla
1c370 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41  gs & TERM_VIRTUA
1c380 4c 20 29 3b 0a 20 20 20 20 20 20 70 58 20 3d 20  L );.      pX = 
1c390 70 53 74 61 72 74 2d 3e 70 45 78 70 72 3b 0a 20  pStart->pExpr;. 
1c3a0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 58 21       assert( pX!
1c3b0 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  =0 );.      test
1c3c0 63 61 73 65 28 20 70 53 74 61 72 74 2d 3e 6c 65  case( pStart->le
1c3d0 66 74 43 75 72 73 6f 72 21 3d 69 43 75 72 20 29  ftCursor!=iCur )
1c3e0 3b 20 2f 2a 20 74 72 61 6e 73 69 74 69 76 65 20  ; /* transitive 
1c3f0 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20  constraints */. 
1c400 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
1c410 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
1c420 61 72 73 65 2c 20 70 58 2d 3e 70 52 69 67 68 74  arse, pX->pRight
1c430 2c 20 26 72 54 65 6d 70 29 3b 0a 20 20 20 20 20  , &rTemp);.     
1c440 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1c450 70 33 28 76 2c 20 61 4d 6f 76 65 4f 70 5b 70 58  p3(v, aMoveOp[pX
1c460 2d 3e 6f 70 2d 54 4b 5f 47 54 5d 2c 20 69 43 75  ->op-TK_GT], iCu
1c470 72 2c 20 61 64 64 72 42 72 6b 2c 20 72 31 29 3b  r, addrBrk, r1);
1c480 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
1c490 6e 74 28 28 76 2c 20 22 70 6b 22 29 29 3b 0a 20  nt((v, "pk"));. 
1c4a0 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
1c4b0 65 49 66 28 76 2c 20 70 58 2d 3e 6f 70 3d 3d 54  eIf(v, pX->op==T
1c4c0 4b 5f 47 54 29 3b 0a 20 20 20 20 20 20 56 64 62  K_GT);.      Vdb
1c4d0 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 70  eCoverageIf(v, p
1c4e0 58 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45 29 3b 0a 20  X->op==TK_LE);. 
1c4f0 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
1c500 65 49 66 28 76 2c 20 70 58 2d 3e 6f 70 3d 3d 54  eIf(v, pX->op==T
1c510 4b 5f 4c 54 29 3b 0a 20 20 20 20 20 20 56 64 62  K_LT);.      Vdb
1c520 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 70  eCoverageIf(v, p
1c530 58 2d 3e 6f 70 3d 3d 54 4b 5f 47 45 29 3b 0a 20  X->op==TK_GE);. 
1c540 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1c550 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61  CacheAffinityCha
1c560 6e 67 65 28 70 50 61 72 73 65 2c 20 72 31 2c 20  nge(pParse, r1, 
1c570 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
1c580 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
1c590 70 50 61 72 73 65 2c 20 72 54 65 6d 70 29 3b 0a  pParse, rTemp);.
1c5a0 20 20 20 20 20 20 64 69 73 61 62 6c 65 54 65 72        disableTer
1c5b0 6d 28 70 4c 65 76 65 6c 2c 20 70 53 74 61 72 74  m(pLevel, pStart
1c5c0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
1c5d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1c5e0 64 64 4f 70 32 28 76 2c 20 62 52 65 76 20 3f 20  ddOp2(v, bRev ? 
1c5f0 4f 50 5f 4c 61 73 74 20 3a 20 4f 50 5f 52 65 77  OP_Last : OP_Rew
1c600 69 6e 64 2c 20 69 43 75 72 2c 20 61 64 64 72 42  ind, iCur, addrB
1c610 72 6b 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  rk);.      VdbeC
1c620 6f 76 65 72 61 67 65 49 66 28 76 2c 20 62 52 65  overageIf(v, bRe
1c630 76 3d 3d 30 29 3b 0a 20 20 20 20 20 20 56 64 62  v==0);.      Vdb
1c640 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 62  eCoverageIf(v, b
1c650 52 65 76 21 3d 30 29 3b 0a 20 20 20 20 7d 0a 20  Rev!=0);.    }. 
1c660 20 20 20 69 66 28 20 70 45 6e 64 20 29 7b 0a 20     if( pEnd ){. 
1c670 20 20 20 20 20 45 78 70 72 20 2a 70 58 3b 0a 20       Expr *pX;. 
1c680 20 20 20 20 20 70 58 20 3d 20 70 45 6e 64 2d 3e       pX = pEnd->
1c690 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73  pExpr;.      ass
1c6a0 65 72 74 28 20 70 58 21 3d 30 20 29 3b 0a 20 20  ert( pX!=0 );.  
1c6b0 20 20 20 20 61 73 73 65 72 74 28 20 28 70 45 6e      assert( (pEn
1c6c0 64 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  d->wtFlags & TER
1c6d0 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29 3b 0a 20  M_VNULL)==0 );. 
1c6e0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
1c6f0 45 6e 64 2d 3e 6c 65 66 74 43 75 72 73 6f 72 21  End->leftCursor!
1c700 3d 69 43 75 72 20 29 3b 20 2f 2a 20 54 72 61 6e  =iCur ); /* Tran
1c710 73 69 74 69 76 65 20 63 6f 6e 73 74 72 61 69 6e  sitive constrain
1c720 74 73 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74  ts */.      test
1c730 63 61 73 65 28 20 70 45 6e 64 2d 3e 77 74 46 6c  case( pEnd->wtFl
1c740 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55  ags & TERM_VIRTU
1c750 41 4c 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 45  AL );.      memE
1c760 6e 64 56 61 6c 75 65 20 3d 20 2b 2b 70 50 61 72  ndValue = ++pPar
1c770 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
1c780 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
1c790 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 52 69 67  pParse, pX->pRig
1c7a0 68 74 2c 20 6d 65 6d 45 6e 64 56 61 6c 75 65 29  ht, memEndValue)
1c7b0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 58 2d 3e  ;.      if( pX->
1c7c0 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 20 70 58 2d  op==TK_LT || pX-
1c7d0 3e 6f 70 3d 3d 54 4b 5f 47 54 20 29 7b 0a 20 20  >op==TK_GT ){.  
1c7e0 20 20 20 20 20 20 74 65 73 74 4f 70 20 3d 20 62        testOp = b
1c7f0 52 65 76 20 3f 20 4f 50 5f 4c 65 20 3a 20 4f 50  Rev ? OP_Le : OP
1c800 5f 47 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  _Ge;.      }else
1c810 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74 4f 70  {.        testOp
1c820 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f 4c 74 20   = bRev ? OP_Lt 
1c830 3a 20 4f 50 5f 47 74 3b 0a 20 20 20 20 20 20 7d  : OP_Gt;.      }
1c840 0a 20 20 20 20 20 20 64 69 73 61 62 6c 65 54 65  .      disableTe
1c850 72 6d 28 70 4c 65 76 65 6c 2c 20 70 45 6e 64 29  rm(pLevel, pEnd)
1c860 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 74 61 72  ;.    }.    star
1c870 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  t = sqlite3VdbeC
1c880 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
1c890 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20     pLevel->op = 
1c8a0 62 52 65 76 20 3f 20 4f 50 5f 50 72 65 76 20 3a  bRev ? OP_Prev :
1c8b0 20 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20 70 4c   OP_Next;.    pL
1c8c0 65 76 65 6c 2d 3e 70 31 20 3d 20 69 43 75 72 3b  evel->p1 = iCur;
1c8d0 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20  .    pLevel->p2 
1c8e0 3d 20 73 74 61 72 74 3b 0a 20 20 20 20 61 73 73  = start;.    ass
1c8f0 65 72 74 28 20 70 4c 65 76 65 6c 2d 3e 70 35 3d  ert( pLevel->p5=
1c900 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 74 65  =0 );.    if( te
1c910 73 74 4f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b  stOp!=OP_Noop ){
1c920 0a 20 20 20 20 20 20 69 52 6f 77 69 64 52 65 67  .      iRowidReg
1c930 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
1c940 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  m;.      sqlite3
1c950 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1c960 5f 52 6f 77 69 64 2c 20 69 43 75 72 2c 20 69 52  _Rowid, iCur, iR
1c970 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20 20 20  owidReg);.      
1c980 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
1c990 53 74 6f 72 65 28 70 50 61 72 73 65 2c 20 69 43  Store(pParse, iC
1c9a0 75 72 2c 20 2d 31 2c 20 69 52 6f 77 69 64 52 65  ur, -1, iRowidRe
1c9b0 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  g);.      sqlite
1c9c0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 74  3VdbeAddOp3(v, t
1c9d0 65 73 74 4f 70 2c 20 6d 65 6d 45 6e 64 56 61 6c  estOp, memEndVal
1c9e0 75 65 2c 20 61 64 64 72 42 72 6b 2c 20 69 52 6f  ue, addrBrk, iRo
1c9f0 77 69 64 52 65 67 29 3b 0a 20 20 20 20 20 20 56  widReg);.      V
1ca00 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
1ca10 20 74 65 73 74 4f 70 3d 3d 4f 50 5f 4c 65 29 3b   testOp==OP_Le);
1ca20 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
1ca30 61 67 65 49 66 28 76 2c 20 74 65 73 74 4f 70 3d  ageIf(v, testOp=
1ca40 3d 4f 50 5f 4c 74 29 3b 0a 20 20 20 20 20 20 56  =OP_Lt);.      V
1ca50 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
1ca60 20 74 65 73 74 4f 70 3d 3d 4f 50 5f 47 65 29 3b   testOp==OP_Ge);
1ca70 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
1ca80 61 67 65 49 66 28 76 2c 20 74 65 73 74 4f 70 3d  ageIf(v, testOp=
1ca90 3d 4f 50 5f 47 74 29 3b 0a 20 20 20 20 20 20 73  =OP_Gt);.      s
1caa0 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
1cab0 50 35 28 76 2c 20 53 51 4c 49 54 45 5f 41 46 46  P5(v, SQLITE_AFF
1cac0 5f 4e 55 4d 45 52 49 43 20 7c 20 53 51 4c 49 54  _NUMERIC | SQLIT
1cad0 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20  E_JUMPIFNULL);. 
1cae0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
1caf0 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20   pLoop->wsFlags 
1cb00 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 20  & WHERE_INDEXED 
1cb10 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 34  ){.    /* Case 4
1cb20 3a 20 41 20 73 63 61 6e 20 75 73 69 6e 67 20 61  : A scan using a
1cb30 6e 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2a 0a  n index..    **.
1cb40 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 54      **         T
1cb50 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
1cb60 6d 61 79 20 63 6f 6e 74 61 69 6e 20 7a 65 72 6f  may contain zero
1cb70 20 6f 72 20 6d 6f 72 65 20 65 71 75 61 6c 69 74   or more equalit
1cb80 79 20 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  y .    **       
1cb90 20 20 74 65 72 6d 73 20 28 22 3d 3d 22 20 6f 72    terms ("==" or
1cba0 20 22 49 4e 22 20 6f 70 65 72 61 74 6f 72 73 29   "IN" operators)
1cbb0 20 74 68 61 74 20 72 65 66 65 72 20 74 6f 20 74   that refer to t
1cbc0 68 65 20 4e 0a 20 20 20 20 2a 2a 20 20 20 20 20  he N.    **     
1cbd0 20 20 20 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f      left-most co
1cbe0 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 69 6e 64  lumns of the ind
1cbf0 65 78 2e 20 49 74 20 6d 61 79 20 61 6c 73 6f 20  ex. It may also 
1cc00 63 6f 6e 74 61 69 6e 0a 20 20 20 20 2a 2a 20 20  contain.    **  
1cc10 20 20 20 20 20 20 20 69 6e 65 71 75 61 6c 69 74         inequalit
1cc20 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 28 3e  y constraints (>
1cc30 2c 20 3c 2c 20 3e 3d 20 6f 72 20 3c 3d 29 20 6f  , <, >= or <=) o
1cc40 6e 20 74 68 65 20 69 6e 64 65 78 65 64 0a 20 20  n the indexed.  
1cc50 20 20 2a 2a 20 20 20 20 20 20 20 20 20 63 6f 6c    **         col
1cc60 75 6d 6e 20 74 68 61 74 20 69 6d 6d 65 64 69 61  umn that immedia
1cc70 74 65 6c 79 20 66 6f 6c 6c 6f 77 73 20 74 68 65  tely follows the
1cc80 20 4e 20 65 71 75 61 6c 69 74 69 65 73 2e 20 4f   N equalities. O
1cc90 6e 6c 79 20 0a 20 20 20 20 2a 2a 20 20 20 20 20  nly .    **     
1cca0 20 20 20 20 74 68 65 20 72 69 67 68 74 2d 6d 6f      the right-mo
1ccb0 73 74 20 63 6f 6c 75 6d 6e 20 63 61 6e 20 62 65  st column can be
1ccc0 20 61 6e 20 69 6e 65 71 75 61 6c 69 74 79 20 2d   an inequality -
1ccd0 20 74 68 65 20 72 65 73 74 20 6d 75 73 74 0a 20   the rest must. 
1cce0 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 75 73     **         us
1ccf0 65 20 74 68 65 20 22 3d 3d 22 20 61 6e 64 20 22  e the "==" and "
1cd00 49 4e 22 20 6f 70 65 72 61 74 6f 72 73 2e 20 46  IN" operators. F
1cd10 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74  or example, if t
1cd20 68 65 20 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  he .    **      
1cd30 20 20 20 69 6e 64 65 78 20 69 73 20 6f 6e 20 28     index is on (
1cd40 78 2c 79 2c 7a 29 2c 20 74 68 65 6e 20 74 68 65  x,y,z), then the
1cd50 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6c 61 75 73   following claus
1cd60 65 73 20 61 72 65 20 61 6c 6c 20 0a 20 20 20 20  es are all .    
1cd70 2a 2a 20 20 20 20 20 20 20 20 20 6f 70 74 69 6d  **         optim
1cd80 69 7a 65 64 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  ized:.    **.   
1cd90 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 78   **            x
1cda0 3d 35 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  =5.    **       
1cdb0 20 20 20 20 20 78 3d 35 20 41 4e 44 20 79 3d 31       x=5 AND y=1
1cdc0 30 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  0.    **        
1cdd0 20 20 20 20 78 3d 35 20 41 4e 44 20 79 3c 31 30      x=5 AND y<10
1cde0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
1cdf0 20 20 20 78 3d 35 20 41 4e 44 20 79 3e 35 20 41     x=5 AND y>5 A
1ce00 4e 44 20 79 3c 31 30 0a 20 20 20 20 2a 2a 20 20  ND y<10.    **  
1ce10 20 20 20 20 20 20 20 20 20 20 78 3d 35 20 41 4e            x=5 AN
1ce20 44 20 79 3d 35 20 41 4e 44 20 7a 3c 3d 31 30 0a  D y=5 AND z<=10.
1ce30 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
1ce40 20 20 20 20 20 20 54 68 65 20 7a 3c 31 30 20 74        The z<10 t
1ce50 65 72 6d 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  erm of the follo
1ce60 77 69 6e 67 20 63 61 6e 6e 6f 74 20 62 65 20 75  wing cannot be u
1ce70 73 65 64 2c 20 6f 6e 6c 79 0a 20 20 20 20 2a 2a  sed, only.    **
1ce80 20 20 20 20 20 20 20 20 20 74 68 65 20 78 3d 35           the x=5
1ce90 20 74 65 72 6d 3a 0a 20 20 20 20 2a 2a 0a 20 20   term:.    **.  
1cea0 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20    **            
1ceb0 78 3d 35 20 41 4e 44 20 7a 3c 31 30 0a 20 20 20  x=5 AND z<10.   
1cec0 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   **.    **      
1ced0 20 20 20 4e 20 6d 61 79 20 62 65 20 7a 65 72 6f     N may be zero
1cee0 20 69 66 20 74 68 65 72 65 20 61 72 65 20 69 6e   if there are in
1cef0 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
1cf00 69 6e 74 73 2e 0a 20 20 20 20 2a 2a 20 20 20 20  ints..    **    
1cf10 20 20 20 20 20 49 66 20 74 68 65 72 65 20 61 72       If there ar
1cf20 65 20 6e 6f 20 69 6e 65 71 75 61 6c 69 74 79 20  e no inequality 
1cf30 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20 74 68 65  constraints, the
1cf40 6e 20 4e 20 69 73 20 61 74 0a 20 20 20 20 2a 2a  n N is at.    **
1cf50 20 20 20 20 20 20 20 20 20 6c 65 61 73 74 20 6f           least o
1cf60 6e 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ne..    **.    *
1cf70 2a 20 20 20 20 20 20 20 20 20 54 68 69 73 20 63  *         This c
1cf80 61 73 65 20 69 73 20 61 6c 73 6f 20 75 73 65 64  ase is also used
1cf90 20 77 68 65 6e 20 74 68 65 72 65 20 61 72 65 20   when there are 
1cfa0 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65 0a  no WHERE clause.
1cfb0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 63      **         c
1cfc0 6f 6e 73 74 72 61 69 6e 74 73 20 62 75 74 20 61  onstraints but a
1cfd0 6e 20 69 6e 64 65 78 20 69 73 20 73 65 6c 65 63  n index is selec
1cfe0 74 65 64 20 61 6e 79 77 61 79 2c 20 69 6e 20 6f  ted anyway, in o
1cff0 72 64 65 72 0a 20 20 20 20 2a 2a 20 20 20 20 20  rder.    **     
1d000 20 20 20 20 74 6f 20 66 6f 72 63 65 20 74 68 65      to force the
1d010 20 6f 75 74 70 75 74 20 6f 72 64 65 72 20 74 6f   output order to
1d020 20 63 6f 6e 66 6f 72 6d 20 74 6f 20 61 6e 20 4f   conform to an O
1d030 52 44 45 52 20 42 59 2e 0a 20 20 20 20 2a 2f 20  RDER BY..    */ 
1d040 20 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e   .    static con
1d050 73 74 20 75 38 20 61 53 74 61 72 74 4f 70 5b 5d  st u8 aStartOp[]
1d060 20 3d 20 7b 0a 20 20 20 20 20 20 30 2c 0a 20 20   = {.      0,.  
1d070 20 20 20 20 30 2c 0a 20 20 20 20 20 20 4f 50 5f      0,.      OP_
1d080 52 65 77 69 6e 64 2c 20 20 20 20 20 20 20 20 20  Rewind,         
1d090 20 20 2f 2a 20 32 3a 20 28 21 73 74 61 72 74 5f    /* 2: (!start_
1d0a0 63 6f 6e 73 74 72 61 69 6e 74 73 20 26 26 20 73  constraints && s
1d0b0 74 61 72 74 45 71 20 26 26 20 20 21 62 52 65 76  tartEq &&  !bRev
1d0c0 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 4c 61  ) */.      OP_La
1d0d0 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  st,             
1d0e0 2f 2a 20 33 3a 20 28 21 73 74 61 72 74 5f 63 6f  /* 3: (!start_co
1d0f0 6e 73 74 72 61 69 6e 74 73 20 26 26 20 73 74 61  nstraints && sta
1d100 72 74 45 71 20 26 26 20 20 20 62 52 65 76 29 20  rtEq &&   bRev) 
1d110 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 53 65 65 6b  */.      OP_Seek
1d120 47 54 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  GT,           /*
1d130 20 34 3a 20 28 73 74 61 72 74 5f 63 6f 6e 73 74   4: (start_const
1d140 72 61 69 6e 74 73 20 20 26 26 20 21 73 74 61 72  raints  && !star
1d150 74 45 71 20 26 26 20 21 62 52 65 76 29 20 2a 2f  tEq && !bRev) */
1d160 0a 20 20 20 20 20 20 4f 50 5f 53 65 65 6b 4c 54  .      OP_SeekLT
1d170 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 35  ,           /* 5
1d180 3a 20 28 73 74 61 72 74 5f 63 6f 6e 73 74 72 61  : (start_constra
1d190 69 6e 74 73 20 20 26 26 20 21 73 74 61 72 74 45  ints  && !startE
1d1a0 71 20 26 26 20 20 62 52 65 76 29 20 2a 2f 0a 20  q &&  bRev) */. 
1d1b0 20 20 20 20 20 4f 50 5f 53 65 65 6b 47 45 2c 20       OP_SeekGE, 
1d1c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 36 3a 20            /* 6: 
1d1d0 28 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e  (start_constrain
1d1e0 74 73 20 20 26 26 20 20 73 74 61 72 74 45 71 20  ts  &&  startEq 
1d1f0 26 26 20 21 62 52 65 76 29 20 2a 2f 0a 20 20 20  && !bRev) */.   
1d200 20 20 20 4f 50 5f 53 65 65 6b 4c 45 20 20 20 20     OP_SeekLE    
1d210 20 20 20 20 20 20 20 20 2f 2a 20 37 3a 20 28 73          /* 7: (s
1d220 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73  tart_constraints
1d230 20 20 26 26 20 20 73 74 61 72 74 45 71 20 26 26    &&  startEq &&
1d240 20 20 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 7d    bRev) */.    }
1d250 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e  ;.    static con
1d260 73 74 20 75 38 20 61 45 6e 64 4f 70 5b 5d 20 3d  st u8 aEndOp[] =
1d270 20 7b 0a 20 20 20 20 20 20 4f 50 5f 49 64 78 47   {.      OP_IdxG
1d280 45 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  E,            /*
1d290 20 30 3a 20 28 65 6e 64 5f 63 6f 6e 73 74 72 61   0: (end_constra
1d2a0 69 6e 74 73 20 26 26 20 21 62 52 65 76 20 26 26  ints && !bRev &&
1d2b0 20 21 65 6e 64 45 71 29 20 2a 2f 0a 20 20 20 20   !endEq) */.    
1d2c0 20 20 4f 50 5f 49 64 78 47 54 2c 20 20 20 20 20    OP_IdxGT,     
1d2d0 20 20 20 20 20 20 20 2f 2a 20 31 3a 20 28 65 6e         /* 1: (en
1d2e0 64 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 26 26  d_constraints &&
1d2f0 20 21 62 52 65 76 20 26 26 20 20 65 6e 64 45 71   !bRev &&  endEq
1d300 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 49 64  ) */.      OP_Id
1d310 78 4c 45 2c 20 20 20 20 20 20 20 20 20 20 20 20  xLE,            
1d320 2f 2a 20 32 3a 20 28 65 6e 64 5f 63 6f 6e 73 74  /* 2: (end_const
1d330 72 61 69 6e 74 73 20 26 26 20 20 62 52 65 76 20  raints &&  bRev 
1d340 26 26 20 21 65 6e 64 45 71 29 20 2a 2f 0a 20 20  && !endEq) */.  
1d350 20 20 20 20 4f 50 5f 49 64 78 4c 54 2c 20 20 20      OP_IdxLT,   
1d360 20 20 20 20 20 20 20 20 20 2f 2a 20 33 3a 20 28           /* 3: (
1d370 65 6e 64 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20  end_constraints 
1d380 26 26 20 20 62 52 65 76 20 26 26 20 20 65 6e 64  &&  bRev &&  end
1d390 45 71 29 20 2a 2f 0a 20 20 20 20 7d 3b 0a 20 20  Eq) */.    };.  
1d3a0 20 20 75 31 36 20 6e 45 71 20 3d 20 70 4c 6f 6f    u16 nEq = pLoo
1d3b0 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 20  p->u.btree.nEq; 
1d3c0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1d3d0 20 3d 3d 20 6f 72 20 49 4e 20 74 65 72 6d 73 20   == or IN terms 
1d3e0 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65 67 42 61  */.    int regBa
1d3f0 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  se;             
1d400 20 20 20 20 2f 2a 20 42 61 73 65 20 72 65 67 69      /* Base regi
1d410 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 63 6f 6e  ster holding con
1d420 73 74 72 61 69 6e 74 20 76 61 6c 75 65 73 20 2a  straint values *
1d430 2f 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20  /.    WhereTerm 
1d440 2a 70 52 61 6e 67 65 53 74 61 72 74 20 3d 20 30  *pRangeStart = 0
1d450 3b 20 20 2f 2a 20 49 6e 65 71 75 61 6c 69 74 79  ;  /* Inequality
1d460 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 74 20 72   constraint at r
1d470 61 6e 67 65 20 73 74 61 72 74 20 2a 2f 0a 20 20  ange start */.  
1d480 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 52 61    WhereTerm *pRa
1d490 6e 67 65 45 6e 64 20 3d 20 30 3b 20 20 20 20 2f  ngeEnd = 0;    /
1d4a0 2a 20 49 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e  * Inequality con
1d4b0 73 74 72 61 69 6e 74 20 61 74 20 72 61 6e 67 65  straint at range
1d4c0 20 65 6e 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20   end */.    int 
1d4d0 73 74 61 72 74 45 71 3b 20 20 20 20 20 20 20 20  startEq;        
1d4e0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
1d4f0 20 69 66 20 72 61 6e 67 65 20 73 74 61 72 74 20   if range start 
1d500 75 73 65 73 20 3d 3d 2c 20 3e 3d 20 6f 72 20 3c  uses ==, >= or <
1d510 3d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 65 6e 64  = */.    int end
1d520 45 71 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Eq;             
1d530 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
1d540 20 72 61 6e 67 65 20 65 6e 64 20 75 73 65 73 20   range end uses 
1d550 3d 3d 2c 20 3e 3d 20 6f 72 20 3c 3d 20 2a 2f 0a  ==, >= or <= */.
1d560 20 20 20 20 69 6e 74 20 73 74 61 72 74 5f 63 6f      int start_co
1d570 6e 73 74 72 61 69 6e 74 73 3b 20 20 20 20 20 20  nstraints;      
1d580 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 72 61 6e   /* Start of ran
1d590 67 65 20 69 73 20 63 6f 6e 73 74 72 61 69 6e 65  ge is constraine
1d5a0 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 43 6f  d */.    int nCo
1d5b0 6e 73 74 72 61 69 6e 74 3b 20 20 20 20 20 20 20  nstraint;       
1d5c0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1d5d0 6f 66 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 65  of constraint te
1d5e0 72 6d 73 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78  rms */.    Index
1d5f0 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20 20   *pIdx;         
1d600 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69          /* The i
1d610 6e 64 65 78 20 77 65 20 77 69 6c 6c 20 62 65 20  ndex we will be 
1d620 75 73 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e 74  using */.    int
1d630 20 69 49 64 78 43 75 72 3b 20 20 20 20 20 20 20   iIdxCur;       
1d640 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1d650 20 56 44 42 45 20 63 75 72 73 6f 72 20 66 6f 72   VDBE cursor for
1d660 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20   the index */.  
1d670 20 20 69 6e 74 20 6e 45 78 74 72 61 52 65 67 20    int nExtraReg 
1d680 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  = 0;           /
1d690 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 78 74 72  * Number of extr
1d6a0 61 20 72 65 67 69 73 74 65 72 73 20 6e 65 65 64  a registers need
1d6b0 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6f 70  ed */.    int op
1d6c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1d6d0 20 20 20 20 20 20 20 2f 2a 20 49 6e 73 74 72 75         /* Instru
1d6e0 63 74 69 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a  ction opcode */.
1d6f0 20 20 20 20 63 68 61 72 20 2a 7a 53 74 61 72 74      char *zStart
1d700 41 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Aff;            
1d710 20 2f 2a 20 41 66 66 69 6e 69 74 79 20 66 6f 72   /* Affinity for
1d720 20 73 74 61 72 74 20 6f 66 20 72 61 6e 67 65 20   start of range 
1d730 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20  constraint */.  
1d740 20 20 63 68 61 72 20 63 45 6e 64 41 66 66 20 3d    char cEndAff =
1d750 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   0;            /
1d760 2a 20 41 66 66 69 6e 69 74 79 20 66 6f 72 20 65  * Affinity for e
1d770 6e 64 20 6f 66 20 72 61 6e 67 65 20 63 6f 6e 73  nd of range cons
1d780 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20 20 75 38  traint */.    u8
1d790 20 62 53 65 65 6b 50 61 73 74 4e 75 6c 6c 20 3d   bSeekPastNull =
1d7a0 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72   0;        /* Tr
1d7b0 75 65 20 74 6f 20 73 65 65 6b 20 70 61 73 74 20  ue to seek past 
1d7c0 69 6e 69 74 69 61 6c 20 6e 75 6c 6c 73 20 2a 2f  initial nulls */
1d7d0 0a 20 20 20 20 75 38 20 62 53 74 6f 70 41 74 4e  .    u8 bStopAtN
1d7e0 75 6c 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ull = 0;        
1d7f0 20 20 2f 2a 20 41 64 64 20 63 6f 6e 64 69 74 69    /* Add conditi
1d800 6f 6e 20 74 6f 20 74 65 72 6d 69 6e 61 74 65 20  on to terminate 
1d810 61 74 20 4e 55 4c 4c 73 20 2a 2f 0a 0a 20 20 20  at NULLs */..   
1d820 20 70 49 64 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75   pIdx = pLoop->u
1d830 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20  .btree.pIndex;. 
1d840 20 20 20 69 49 64 78 43 75 72 20 3d 20 70 4c 65     iIdxCur = pLe
1d850 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20  vel->iIdxCur;.  
1d860 20 20 61 73 73 65 72 74 28 20 6e 45 71 3e 3d 70    assert( nEq>=p
1d870 4c 6f 6f 70 2d 3e 6e 53 6b 69 70 20 29 3b 0a 0a  Loop->nSkip );..
1d880 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 6c      /* If this l
1d890 6f 6f 70 20 73 61 74 69 73 66 69 65 73 20 61 20  oop satisfies a 
1d8a0 73 6f 72 74 20 6f 72 64 65 72 20 28 70 4f 72 64  sort order (pOrd
1d8b0 65 72 42 79 29 20 72 65 71 75 65 73 74 20 74 68  erBy) request th
1d8c0 61 74 20 0a 20 20 20 20 2a 2a 20 77 61 73 20 70  at .    ** was p
1d8d0 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 66 75  assed to this fu
1d8e0 6e 63 74 69 6f 6e 20 74 6f 20 69 6d 70 6c 65 6d  nction to implem
1d8f0 65 6e 74 20 61 20 22 53 45 4c 45 43 54 20 6d 69  ent a "SELECT mi
1d900 6e 28 78 29 20 2e 2e 2e 22 20 0a 20 20 20 20 2a  n(x) ..." .    *
1d910 2a 20 71 75 65 72 79 2c 20 74 68 65 6e 20 74 68  * query, then th
1d920 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6f 6e  e caller will on
1d930 6c 79 20 61 6c 6c 6f 77 20 74 68 65 20 6c 6f 6f  ly allow the loo
1d940 70 20 74 6f 20 72 75 6e 20 66 6f 72 0a 20 20 20  p to run for.   
1d950 20 2a 2a 20 61 20 73 69 6e 67 6c 65 20 69 74 65   ** a single ite
1d960 72 61 74 69 6f 6e 2e 20 54 68 69 73 20 6d 65 61  ration. This mea
1d970 6e 73 20 74 68 61 74 20 74 68 65 20 66 69 72 73  ns that the firs
1d980 74 20 72 6f 77 20 72 65 74 75 72 6e 65 64 0a 20  t row returned. 
1d990 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20 6e 6f 74     ** should not
1d9a0 20 68 61 76 65 20 61 20 4e 55 4c 4c 20 76 61 6c   have a NULL val
1d9b0 75 65 20 73 74 6f 72 65 64 20 69 6e 20 27 78 27  ue stored in 'x'
1d9c0 2e 20 49 66 20 63 6f 6c 75 6d 6e 20 27 78 27 20  . If column 'x' 
1d9d0 69 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 66 69  is.    ** the fi
1d9e0 72 73 74 20 6f 6e 65 20 61 66 74 65 72 20 74 68  rst one after th
1d9f0 65 20 6e 45 71 20 65 71 75 61 6c 69 74 79 20 63  e nEq equality c
1da00 6f 6e 73 74 72 61 69 6e 74 73 20 69 6e 20 74 68  onstraints in th
1da10 65 20 69 6e 64 65 78 2c 0a 20 20 20 20 2a 2a 20  e index,.    ** 
1da20 74 68 69 73 20 72 65 71 75 69 72 65 73 20 73 6f  this requires so
1da30 6d 65 20 73 70 65 63 69 61 6c 20 68 61 6e 64 6c  me special handl
1da40 69 6e 67 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ing..    */.    
1da50 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e  assert( pWInfo->
1da60 70 4f 72 64 65 72 42 79 3d 3d 30 0a 20 20 20 20  pOrderBy==0.    
1da70 20 20 20 20 20 7c 7c 20 70 57 49 6e 66 6f 2d 3e       || pWInfo->
1da80 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3d  pOrderBy->nExpr=
1da90 3d 31 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28  =1.         || (
1daa0 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
1dab0 67 73 26 57 48 45 52 45 5f 4f 52 44 45 52 42 59  gs&WHERE_ORDERBY
1dac0 5f 4d 49 4e 29 3d 3d 30 20 29 3b 0a 20 20 20 20  _MIN)==0 );.    
1dad0 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74  if( (pWInfo->wct
1dae0 72 6c 46 6c 61 67 73 26 57 48 45 52 45 5f 4f 52  rlFlags&WHERE_OR
1daf0 44 45 52 42 59 5f 4d 49 4e 29 21 3d 30 0a 20 20  DERBY_MIN)!=0.  
1db00 20 20 20 26 26 20 70 57 49 6e 66 6f 2d 3e 6e 4f     && pWInfo->nO
1db10 42 53 61 74 3e 30 0a 20 20 20 20 20 26 26 20 28  BSat>0.     && (
1db20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3e 6e 45  pIdx->nKeyCol>nE
1db30 71 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  q).    ){.      
1db40 61 73 73 65 72 74 28 20 70 4c 6f 6f 70 2d 3e 6e  assert( pLoop->n
1db50 53 6b 69 70 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Skip==0 );.     
1db60 20 62 53 65 65 6b 50 61 73 74 4e 75 6c 6c 20 3d   bSeekPastNull =
1db70 20 31 3b 0a 20 20 20 20 20 20 6e 45 78 74 72 61   1;.      nExtra
1db80 52 65 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a  Reg = 1;.    }..
1db90 20 20 20 20 2f 2a 20 46 69 6e 64 20 61 6e 79 20      /* Find any 
1dba0 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  inequality const
1dbb0 72 61 69 6e 74 20 74 65 72 6d 73 20 66 6f 72 20  raint terms for 
1dbc0 74 68 65 20 73 74 61 72 74 20 61 6e 64 20 65 6e  the start and en
1dbd0 64 20 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  d .    ** of the
1dbe0 20 72 61 6e 67 65 2e 20 0a 20 20 20 20 2a 2f 0a   range. .    */.
1dbf0 20 20 20 20 6a 20 3d 20 6e 45 71 3b 0a 20 20 20      j = nEq;.   
1dc00 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c   if( pLoop->wsFl
1dc10 61 67 73 20 26 20 57 48 45 52 45 5f 42 54 4d 5f  ags & WHERE_BTM_
1dc20 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 20 20 70  LIMIT ){.      p
1dc30 52 61 6e 67 65 53 74 61 72 74 20 3d 20 70 4c 6f  RangeStart = pLo
1dc40 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 2b 2b 5d 3b  op->aLTerm[j++];
1dc50 0a 20 20 20 20 20 20 6e 45 78 74 72 61 52 65 67  .      nExtraReg
1dc60 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 1;.    }.    
1dc70 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  if( pLoop->wsFla
1dc80 67 73 20 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c  gs & WHERE_TOP_L
1dc90 49 4d 49 54 20 29 7b 0a 20 20 20 20 20 20 70 52  IMIT ){.      pR
1dca0 61 6e 67 65 45 6e 64 20 3d 20 70 4c 6f 6f 70 2d  angeEnd = pLoop-
1dcb0 3e 61 4c 54 65 72 6d 5b 6a 2b 2b 5d 3b 0a 20 20  >aLTerm[j++];.  
1dcc0 20 20 20 20 6e 45 78 74 72 61 52 65 67 20 3d 20      nExtraReg = 
1dcd0 31 3b 0a 20 20 20 20 20 20 69 66 28 20 70 52 61  1;.      if( pRa
1dce0 6e 67 65 53 74 61 72 74 3d 3d 30 0a 20 20 20 20  ngeStart==0.    
1dcf0 20 20 20 26 26 20 28 6a 20 3d 20 70 49 64 78 2d     && (j = pIdx-
1dd00 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 45 71 5d 29 3e  >aiColumn[nEq])>
1dd10 3d 30 20 0a 20 20 20 20 20 20 20 26 26 20 70 49  =0 .       && pI
1dd20 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c  dx->pTable->aCol
1dd30 5b 6a 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 0a 20  [j].notNull==0. 
1dd40 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
1dd50 62 53 65 65 6b 50 61 73 74 4e 75 6c 6c 20 3d 20  bSeekPastNull = 
1dd60 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
1dd70 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 52 61  .    assert( pRa
1dd80 6e 67 65 45 6e 64 3d 3d 30 20 7c 7c 20 28 70 52  ngeEnd==0 || (pR
1dd90 61 6e 67 65 45 6e 64 2d 3e 77 74 46 6c 61 67 73  angeEnd->wtFlags
1dda0 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d   & TERM_VNULL)==
1ddb0 30 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 47 65 6e  0 );..    /* Gen
1ddc0 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 65 76  erate code to ev
1ddd0 61 6c 75 61 74 65 20 61 6c 6c 20 63 6f 6e 73 74  aluate all const
1dde0 72 61 69 6e 74 20 74 65 72 6d 73 20 75 73 69 6e  raint terms usin
1ddf0 67 20 3d 3d 20 6f 72 20 49 4e 0a 20 20 20 20 2a  g == or IN.    *
1de00 2a 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20  * and store the 
1de10 76 61 6c 75 65 73 20 6f 66 20 74 68 6f 73 65 20  values of those 
1de20 74 65 72 6d 73 20 69 6e 20 61 6e 20 61 72 72 61  terms in an arra
1de30 79 20 6f 66 20 72 65 67 69 73 74 65 72 73 0a 20  y of registers. 
1de40 20 20 20 2a 2a 20 73 74 61 72 74 69 6e 67 20 61     ** starting a
1de50 74 20 72 65 67 42 61 73 65 2e 0a 20 20 20 20 2a  t regBase..    *
1de60 2f 0a 20 20 20 20 72 65 67 42 61 73 65 20 3d 20  /.    regBase = 
1de70 63 6f 64 65 41 6c 6c 45 71 75 61 6c 69 74 79 54  codeAllEqualityT
1de80 65 72 6d 73 28 70 50 61 72 73 65 2c 70 4c 65 76  erms(pParse,pLev
1de90 65 6c 2c 62 52 65 76 2c 6e 45 78 74 72 61 52 65  el,bRev,nExtraRe
1dea0 67 2c 26 7a 53 74 61 72 74 41 66 66 29 3b 0a 20  g,&zStartAff);. 
1deb0 20 20 20 61 73 73 65 72 74 28 20 7a 53 74 61 72     assert( zStar
1dec0 74 41 66 66 3d 3d 30 20 7c 7c 20 73 71 6c 69 74  tAff==0 || sqlit
1ded0 65 33 53 74 72 6c 65 6e 33 30 28 7a 53 74 61 72  e3Strlen30(zStar
1dee0 74 41 66 66 29 3e 3d 6e 45 71 20 29 3b 0a 20 20  tAff)>=nEq );.  
1def0 20 20 69 66 28 20 7a 53 74 61 72 74 41 66 66 20    if( zStartAff 
1df00 29 20 63 45 6e 64 41 66 66 20 3d 20 7a 53 74 61  ) cEndAff = zSta
1df10 72 74 41 66 66 5b 6e 45 71 5d 3b 0a 20 20 20 20  rtAff[nEq];.    
1df20 61 64 64 72 4e 78 74 20 3d 20 70 4c 65 76 65 6c  addrNxt = pLevel
1df30 2d 3e 61 64 64 72 4e 78 74 3b 0a 0a 20 20 20 20  ->addrNxt;..    
1df40 2f 2a 20 49 66 20 77 65 20 61 72 65 20 64 6f 69  /* If we are doi
1df50 6e 67 20 61 20 72 65 76 65 72 73 65 20 6f 72 64  ng a reverse ord
1df60 65 72 20 73 63 61 6e 20 6f 6e 20 61 6e 20 61 73  er scan on an as
1df70 63 65 6e 64 69 6e 67 20 69 6e 64 65 78 2c 20 6f  cending index, o
1df80 72 0a 20 20 20 20 2a 2a 20 61 20 66 6f 72 77 61  r.    ** a forwa
1df90 72 64 20 6f 72 64 65 72 20 73 63 61 6e 20 6f 6e  rd order scan on
1dfa0 20 61 20 64 65 73 63 65 6e 64 69 6e 67 20 69 6e   a descending in
1dfb0 64 65 78 2c 20 69 6e 74 65 72 63 68 61 6e 67 65  dex, interchange
1dfc0 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 73 74 61   the .    ** sta
1dfd0 72 74 20 61 6e 64 20 65 6e 64 20 74 65 72 6d 73  rt and end terms
1dfe0 20 28 70 52 61 6e 67 65 53 74 61 72 74 20 61 6e   (pRangeStart an
1dff0 64 20 70 52 61 6e 67 65 45 6e 64 29 2e 0a 20 20  d pRangeEnd)..  
1e000 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 6e 45    */.    if( (nE
1e010 71 3c 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 20  q<pIdx->nKeyCol 
1e020 26 26 20 62 52 65 76 3d 3d 28 70 49 64 78 2d 3e  && bRev==(pIdx->
1e030 61 53 6f 72 74 4f 72 64 65 72 5b 6e 45 71 5d 3d  aSortOrder[nEq]=
1e040 3d 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43 29 29  =SQLITE_SO_ASC))
1e050 0a 20 20 20 20 20 7c 7c 20 28 62 52 65 76 20 26  .     || (bRev &
1e060 26 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3d  & pIdx->nKeyCol=
1e070 3d 6e 45 71 29 0a 20 20 20 20 29 7b 0a 20 20 20  =nEq).    ){.   
1e080 20 20 20 53 57 41 50 28 57 68 65 72 65 54 65 72     SWAP(WhereTer
1e090 6d 20 2a 2c 20 70 52 61 6e 67 65 45 6e 64 2c 20  m *, pRangeEnd, 
1e0a0 70 52 61 6e 67 65 53 74 61 72 74 29 3b 0a 20 20  pRangeStart);.  
1e0b0 20 20 20 20 53 57 41 50 28 75 38 2c 20 62 53 65      SWAP(u8, bSe
1e0c0 65 6b 50 61 73 74 4e 75 6c 6c 2c 20 62 53 74 6f  ekPastNull, bSto
1e0d0 70 41 74 4e 75 6c 6c 29 3b 0a 20 20 20 20 7d 0a  pAtNull);.    }.
1e0e0 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
1e0f0 52 61 6e 67 65 53 74 61 72 74 20 26 26 20 28 70  RangeStart && (p
1e100 52 61 6e 67 65 53 74 61 72 74 2d 3e 65 4f 70 65  RangeStart->eOpe
1e110 72 61 74 6f 72 20 26 20 57 4f 5f 4c 45 29 21 3d  rator & WO_LE)!=
1e120 30 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  0 );.    testcas
1e130 65 28 20 70 52 61 6e 67 65 53 74 61 72 74 20 26  e( pRangeStart &
1e140 26 20 28 70 52 61 6e 67 65 53 74 61 72 74 2d 3e  & (pRangeStart->
1e150 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 47  eOperator & WO_G
1e160 45 29 21 3d 30 20 29 3b 0a 20 20 20 20 74 65 73  E)!=0 );.    tes
1e170 74 63 61 73 65 28 20 70 52 61 6e 67 65 45 6e 64  tcase( pRangeEnd
1e180 20 26 26 20 28 70 52 61 6e 67 65 45 6e 64 2d 3e   && (pRangeEnd->
1e190 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 4c  eOperator & WO_L
1e1a0 45 29 21 3d 30 20 29 3b 0a 20 20 20 20 74 65 73  E)!=0 );.    tes
1e1b0 74 63 61 73 65 28 20 70 52 61 6e 67 65 45 6e 64  tcase( pRangeEnd
1e1c0 20 26 26 20 28 70 52 61 6e 67 65 45 6e 64 2d 3e   && (pRangeEnd->
1e1d0 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 47  eOperator & WO_G
1e1e0 45 29 21 3d 30 20 29 3b 0a 20 20 20 20 73 74 61  E)!=0 );.    sta
1e1f0 72 74 45 71 20 3d 20 21 70 52 61 6e 67 65 53 74  rtEq = !pRangeSt
1e200 61 72 74 20 7c 7c 20 70 52 61 6e 67 65 53 74 61  art || pRangeSta
1e210 72 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rt->eOperator & 
1e220 28 57 4f 5f 4c 45 7c 57 4f 5f 47 45 29 3b 0a 20  (WO_LE|WO_GE);. 
1e230 20 20 20 65 6e 64 45 71 20 3d 20 20 20 21 70 52     endEq =   !pR
1e240 61 6e 67 65 45 6e 64 20 7c 7c 20 70 52 61 6e 67  angeEnd || pRang
1e250 65 45 6e 64 2d 3e 65 4f 70 65 72 61 74 6f 72 20  eEnd->eOperator 
1e260 26 20 28 57 4f 5f 4c 45 7c 57 4f 5f 47 45 29 3b  & (WO_LE|WO_GE);
1e270 0a 20 20 20 20 73 74 61 72 74 5f 63 6f 6e 73 74  .    start_const
1e280 72 61 69 6e 74 73 20 3d 20 70 52 61 6e 67 65 53  raints = pRangeS
1e290 74 61 72 74 20 7c 7c 20 6e 45 71 3e 30 3b 0a 0a  tart || nEq>0;..
1e2a0 20 20 20 20 2f 2a 20 53 65 65 6b 20 74 68 65 20      /* Seek the 
1e2b0 69 6e 64 65 78 20 63 75 72 73 6f 72 20 74 6f 20  index cursor to 
1e2c0 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
1e2d0 20 72 61 6e 67 65 2e 20 2a 2f 0a 20 20 20 20 6e   range. */.    n
1e2e0 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 6e 45 71  Constraint = nEq
1e2f0 3b 0a 20 20 20 20 69 66 28 20 70 52 61 6e 67 65  ;.    if( pRange
1e300 53 74 61 72 74 20 29 7b 0a 20 20 20 20 20 20 45  Start ){.      E
1e310 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70 52  xpr *pRight = pR
1e320 61 6e 67 65 53 74 61 72 74 2d 3e 70 45 78 70 72  angeStart->pExpr
1e330 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  ->pRight;.      
1e340 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
1e350 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 2c 20  pParse, pRight, 
1e360 72 65 67 42 61 73 65 2b 6e 45 71 29 3b 0a 20 20  regBase+nEq);.  
1e370 20 20 20 20 69 66 28 20 28 70 52 61 6e 67 65 53      if( (pRangeS
1e380 74 61 72 74 2d 3e 77 74 46 6c 61 67 73 20 26 20  tart->wtFlags & 
1e390 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 0a 20  TERM_VNULL)==0. 
1e3a0 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
1e3b0 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28 70 52  ExprCanBeNull(pR
1e3c0 69 67 68 74 29 0a 20 20 20 20 20 20 29 7b 0a 20  ight).      ){. 
1e3d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1e3e0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
1e3f0 73 4e 75 6c 6c 2c 20 72 65 67 42 61 73 65 2b 6e  sNull, regBase+n
1e400 45 71 2c 20 61 64 64 72 4e 78 74 29 3b 0a 20 20  Eq, addrNxt);.  
1e410 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
1e420 67 65 28 76 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ge(v);.      }. 
1e430 20 20 20 20 20 69 66 28 20 7a 53 74 61 72 74 41       if( zStartA
1e440 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  ff ){.        if
1e450 28 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65  ( sqlite3Compare
1e460 41 66 66 69 6e 69 74 79 28 70 52 69 67 68 74 2c  Affinity(pRight,
1e470 20 7a 53 74 61 72 74 41 66 66 5b 6e 45 71 5d 29   zStartAff[nEq])
1e480 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  ==SQLITE_AFF_NON
1e490 45 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  E){.          /*
1e4a0 20 53 69 6e 63 65 20 74 68 65 20 63 6f 6d 70 61   Since the compa
1e4b0 72 69 73 6f 6e 20 69 73 20 74 6f 20 62 65 20 70  rison is to be p
1e4c0 65 72 66 6f 72 6d 65 64 20 77 69 74 68 20 6e 6f  erformed with no
1e4d0 20 63 6f 6e 76 65 72 73 69 6f 6e 73 0a 20 20 20   conversions.   
1e4e0 20 20 20 20 20 20 20 2a 2a 20 61 70 70 6c 69 65         ** applie
1e4f0 64 20 74 6f 20 74 68 65 20 6f 70 65 72 61 6e 64  d to the operand
1e500 73 2c 20 73 65 74 20 74 68 65 20 61 66 66 69 6e  s, set the affin
1e510 69 74 79 20 74 6f 20 61 70 70 6c 79 20 74 6f 20  ity to apply to 
1e520 70 52 69 67 68 74 20 74 6f 20 0a 20 20 20 20 20  pRight to .     
1e530 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 41       ** SQLITE_A
1e540 46 46 5f 4e 4f 4e 45 2e 20 20 2a 2f 0a 20 20 20  FF_NONE.  */.   
1e550 20 20 20 20 20 20 20 7a 53 74 61 72 74 41 66 66         zStartAff
1e560 5b 6e 45 71 5d 20 3d 20 53 51 4c 49 54 45 5f 41  [nEq] = SQLITE_A
1e570 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20  FF_NONE;.       
1e580 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 73   }.        if( s
1e590 71 6c 69 74 65 33 45 78 70 72 4e 65 65 64 73 4e  qlite3ExprNeedsN
1e5a0 6f 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  oAffinityChange(
1e5b0 70 52 69 67 68 74 2c 20 7a 53 74 61 72 74 41 66  pRight, zStartAf
1e5c0 66 5b 6e 45 71 5d 29 20 29 7b 0a 20 20 20 20 20  f[nEq]) ){.     
1e5d0 20 20 20 20 20 7a 53 74 61 72 74 41 66 66 5b 6e       zStartAff[n
1e5e0 45 71 5d 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  Eq] = SQLITE_AFF
1e5f0 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d  _NONE;.        }
1e600 0a 20 20 20 20 20 20 7d 20 20 0a 20 20 20 20 20  .      }  .     
1e610 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b 0a   nConstraint++;.
1e620 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1e630 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 77 74 46  pRangeStart->wtF
1e640 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54  lags & TERM_VIRT
1e650 55 41 4c 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65  UAL );.    }else
1e660 20 69 66 28 20 62 53 65 65 6b 50 61 73 74 4e 75   if( bSeekPastNu
1e670 6c 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ll ){.      sqli
1e680 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1e690 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65 67   OP_Null, 0, reg
1e6a0 42 61 73 65 2b 6e 45 71 29 3b 0a 20 20 20 20 20  Base+nEq);.     
1e6b0 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b 0a   nConstraint++;.
1e6c0 20 20 20 20 20 20 73 74 61 72 74 45 71 20 3d 20        startEq = 
1e6d0 30 3b 0a 20 20 20 20 20 20 73 74 61 72 74 5f 63  0;.      start_c
1e6e0 6f 6e 73 74 72 61 69 6e 74 73 20 3d 20 31 3b 0a  onstraints = 1;.
1e6f0 20 20 20 20 7d 0a 20 20 20 20 63 6f 64 65 41 70      }.    codeAp
1e700 70 6c 79 41 66 66 69 6e 69 74 79 28 70 50 61 72  plyAffinity(pPar
1e710 73 65 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f  se, regBase, nCo
1e720 6e 73 74 72 61 69 6e 74 20 2d 20 62 53 65 65 6b  nstraint - bSeek
1e730 50 61 73 74 4e 75 6c 6c 2c 20 7a 53 74 61 72 74  PastNull, zStart
1e740 41 66 66 29 3b 0a 20 20 20 20 6f 70 20 3d 20 61  Aff);.    op = a
1e750 53 74 61 72 74 4f 70 5b 28 73 74 61 72 74 5f 63  StartOp[(start_c
1e760 6f 6e 73 74 72 61 69 6e 74 73 3c 3c 32 29 20 2b  onstraints<<2) +
1e770 20 28 73 74 61 72 74 45 71 3c 3c 31 29 20 2b 20   (startEq<<1) + 
1e780 62 52 65 76 5d 3b 0a 20 20 20 20 61 73 73 65 72  bRev];.    asser
1e790 74 28 20 6f 70 21 3d 30 20 29 3b 0a 20 20 20 20  t( op!=0 );.    
1e7a0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1e7b0 34 49 6e 74 28 76 2c 20 6f 70 2c 20 69 49 64 78  4Int(v, op, iIdx
1e7c0 43 75 72 2c 20 61 64 64 72 4e 78 74 2c 20 72 65  Cur, addrNxt, re
1e7d0 67 42 61 73 65 2c 20 6e 43 6f 6e 73 74 72 61 69  gBase, nConstrai
1e7e0 6e 74 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76  nt);.    VdbeCov
1e7f0 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 56 64  erage(v);.    Vd
1e800 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
1e810 6f 70 3d 3d 4f 50 5f 52 65 77 69 6e 64 29 3b 20  op==OP_Rewind); 
1e820 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f   testcase( op==O
1e830 50 5f 52 65 77 69 6e 64 20 29 3b 0a 20 20 20 20  P_Rewind );.    
1e840 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
1e850 2c 20 6f 70 3d 3d 4f 50 5f 4c 61 73 74 29 3b 20  , op==OP_Last); 
1e860 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
1e870 3d 4f 50 5f 4c 61 73 74 20 29 3b 0a 20 20 20 20  =OP_Last );.    
1e880 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
1e890 2c 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 47 54 29  , op==OP_SeekGT)
1e8a0 3b 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d  ;  testcase( op=
1e8b0 3d 4f 50 5f 53 65 65 6b 47 54 20 29 3b 0a 20 20  =OP_SeekGT );.  
1e8c0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
1e8d0 28 76 2c 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 47  (v, op==OP_SeekG
1e8e0 45 29 3b 20 20 74 65 73 74 63 61 73 65 28 20 6f  E);  testcase( o
1e8f0 70 3d 3d 4f 50 5f 53 65 65 6b 47 45 20 29 3b 0a  p==OP_SeekGE );.
1e900 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
1e910 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 53 65 65  If(v, op==OP_See
1e920 6b 4c 45 29 3b 20 20 74 65 73 74 63 61 73 65 28  kLE);  testcase(
1e930 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 4c 45 20 29   op==OP_SeekLE )
1e940 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61  ;.    VdbeCovera
1e950 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 53  geIf(v, op==OP_S
1e960 65 65 6b 4c 54 29 3b 20 20 74 65 73 74 63 61 73  eekLT);  testcas
1e970 65 28 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 4c 54  e( op==OP_SeekLT
1e980 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 4c 6f 61 64   );..    /* Load
1e990 20 74 68 65 20 76 61 6c 75 65 20 66 6f 72 20 74   the value for t
1e9a0 68 65 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f  he inequality co
1e9b0 6e 73 74 72 61 69 6e 74 20 61 74 20 74 68 65 20  nstraint at the 
1e9c0 65 6e 64 20 6f 66 20 74 68 65 0a 20 20 20 20 2a  end of the.    *
1e9d0 2a 20 72 61 6e 67 65 20 28 69 66 20 61 6e 79 29  * range (if any)
1e9e0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e 43 6f  ..    */.    nCo
1e9f0 6e 73 74 72 61 69 6e 74 20 3d 20 6e 45 71 3b 0a  nstraint = nEq;.
1ea00 20 20 20 20 69 66 28 20 70 52 61 6e 67 65 45 6e      if( pRangeEn
1ea10 64 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  d ){.      Expr 
1ea20 2a 70 52 69 67 68 74 20 3d 20 70 52 61 6e 67 65  *pRight = pRange
1ea30 45 6e 64 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67  End->pExpr->pRig
1ea40 68 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ht;.      sqlite
1ea50 33 45 78 70 72 43 61 63 68 65 52 65 6d 6f 76 65  3ExprCacheRemove
1ea60 28 70 50 61 72 73 65 2c 20 72 65 67 42 61 73 65  (pParse, regBase
1ea70 2b 6e 45 71 2c 20 31 29 3b 0a 20 20 20 20 20 20  +nEq, 1);.      
1ea80 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
1ea90 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 2c 20  pParse, pRight, 
1eaa0 72 65 67 42 61 73 65 2b 6e 45 71 29 3b 0a 20 20  regBase+nEq);.  
1eab0 20 20 20 20 69 66 28 20 28 70 52 61 6e 67 65 45      if( (pRangeE
1eac0 6e 64 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  nd->wtFlags & TE
1ead0 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 0a 20 20 20  RM_VNULL)==0.   
1eae0 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 45 78      && sqlite3Ex
1eaf0 70 72 43 61 6e 42 65 4e 75 6c 6c 28 70 52 69 67  prCanBeNull(pRig
1eb00 68 74 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  ht).      ){.   
1eb10 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1eb20 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e  AddOp2(v, OP_IsN
1eb30 75 6c 6c 2c 20 72 65 67 42 61 73 65 2b 6e 45 71  ull, regBase+nEq
1eb40 2c 20 61 64 64 72 4e 78 74 29 3b 0a 20 20 20 20  , addrNxt);.    
1eb50 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
1eb60 28 76 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  (v);.      }.   
1eb70 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 43 6f     if( sqlite3Co
1eb80 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 52  mpareAffinity(pR
1eb90 69 67 68 74 2c 20 63 45 6e 64 41 66 66 29 21 3d  ight, cEndAff)!=
1eba0 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 0a  SQLITE_AFF_NONE.
1ebb0 20 20 20 20 20 20 20 26 26 20 21 73 71 6c 69 74         && !sqlit
1ebc0 65 33 45 78 70 72 4e 65 65 64 73 4e 6f 41 66 66  e3ExprNeedsNoAff
1ebd0 69 6e 69 74 79 43 68 61 6e 67 65 28 70 52 69 67  inityChange(pRig
1ebe0 68 74 2c 20 63 45 6e 64 41 66 66 29 0a 20 20 20  ht, cEndAff).   
1ebf0 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f     ){.        co
1ec00 64 65 41 70 70 6c 79 41 66 66 69 6e 69 74 79 28  deApplyAffinity(
1ec10 70 50 61 72 73 65 2c 20 72 65 67 42 61 73 65 2b  pParse, regBase+
1ec20 6e 45 71 2c 20 31 2c 20 26 63 45 6e 64 41 66 66  nEq, 1, &cEndAff
1ec30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1ec40 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b 0a   nConstraint++;.
1ec50 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1ec60 70 52 61 6e 67 65 45 6e 64 2d 3e 77 74 46 6c 61  pRangeEnd->wtFla
1ec70 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41  gs & TERM_VIRTUA
1ec80 4c 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  L );.    }else i
1ec90 66 28 20 62 53 74 6f 70 41 74 4e 75 6c 6c 20 29  f( bStopAtNull )
1eca0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
1ecb0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1ecc0 4e 75 6c 6c 2c 20 30 2c 20 72 65 67 42 61 73 65  Null, 0, regBase
1ecd0 2b 6e 45 71 29 3b 0a 20 20 20 20 20 20 65 6e 64  +nEq);.      end
1ece0 45 71 20 3d 20 30 3b 0a 20 20 20 20 20 20 6e 43  Eq = 0;.      nC
1ecf0 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b 0a 20 20 20  onstraint++;.   
1ed00 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62   }.    sqlite3Db
1ed10 46 72 65 65 28 64 62 2c 20 7a 53 74 61 72 74 41  Free(db, zStartA
1ed20 66 66 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 6f 70  ff);..    /* Top
1ed30 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 62 6f 64   of the loop bod
1ed40 79 20 2a 2f 0a 20 20 20 20 70 4c 65 76 65 6c 2d  y */.    pLevel-
1ed50 3e 70 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62  >p2 = sqlite3Vdb
1ed60 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
1ed70 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 69  ..    /* Check i
1ed80 66 20 74 68 65 20 69 6e 64 65 78 20 63 75 72 73  f the index curs
1ed90 6f 72 20 69 73 20 70 61 73 74 20 74 68 65 20 65  or is past the e
1eda0 6e 64 20 6f 66 20 74 68 65 20 72 61 6e 67 65 2e  nd of the range.
1edb0 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 43 6f 6e   */.    if( nCon
1edc0 73 74 72 61 69 6e 74 20 29 7b 0a 20 20 20 20 20  straint ){.     
1edd0 20 6f 70 20 3d 20 61 45 6e 64 4f 70 5b 62 52 65   op = aEndOp[bRe
1ede0 76 2a 32 20 2b 20 65 6e 64 45 71 5d 3b 0a 20 20  v*2 + endEq];.  
1edf0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1ee00 64 64 4f 70 34 49 6e 74 28 76 2c 20 6f 70 2c 20  ddOp4Int(v, op, 
1ee10 69 49 64 78 43 75 72 2c 20 61 64 64 72 4e 78 74  iIdxCur, addrNxt
1ee20 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f 6e 73  , regBase, nCons
1ee30 74 72 61 69 6e 74 29 3b 0a 20 20 20 20 20 20 74  traint);.      t
1ee40 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f  estcase( op==OP_
1ee50 49 64 78 47 54 20 29 3b 20 20 56 64 62 65 43 6f  IdxGT );  VdbeCo
1ee60 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
1ee70 4f 50 5f 49 64 78 47 54 20 29 3b 0a 20 20 20 20  OP_IdxGT );.    
1ee80 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1ee90 4f 50 5f 49 64 78 47 45 20 29 3b 20 20 56 64 62  OP_IdxGE );  Vdb
1eea0 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f  eCoverageIf(v, o
1eeb0 70 3d 3d 4f 50 5f 49 64 78 47 45 20 29 3b 0a 20  p==OP_IdxGE );. 
1eec0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
1eed0 70 3d 3d 4f 50 5f 49 64 78 4c 54 20 29 3b 20 20  p==OP_IdxLT );  
1eee0 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
1eef0 2c 20 6f 70 3d 3d 4f 50 5f 49 64 78 4c 54 20 29  , op==OP_IdxLT )
1ef00 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1ef10 28 20 6f 70 3d 3d 4f 50 5f 49 64 78 4c 45 20 29  ( op==OP_IdxLE )
1ef20 3b 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49  ;  VdbeCoverageI
1ef30 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 49 64 78 4c  f(v, op==OP_IdxL
1ef40 45 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  E );.    }..    
1ef50 2f 2a 20 53 65 65 6b 20 74 68 65 20 74 61 62 6c  /* Seek the tabl
1ef60 65 20 63 75 72 73 6f 72 2c 20 69 66 20 72 65 71  e cursor, if req
1ef70 75 69 72 65 64 20 2a 2f 0a 20 20 20 20 64 69 73  uired */.    dis
1ef80 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c  ableTerm(pLevel,
1ef90 20 70 52 61 6e 67 65 53 74 61 72 74 29 3b 0a 20   pRangeStart);. 
1efa0 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70     disableTerm(p
1efb0 4c 65 76 65 6c 2c 20 70 52 61 6e 67 65 45 6e 64  Level, pRangeEnd
1efc0 29 3b 0a 20 20 20 20 69 66 28 20 6f 6d 69 74 54  );.    if( omitT
1efd0 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a  able ){.      /*
1efe0 20 70 49 64 78 20 69 73 20 61 20 63 6f 76 65 72   pIdx is a cover
1eff0 69 6e 67 20 69 6e 64 65 78 2e 20 20 4e 6f 20 6e  ing index.  No n
1f000 65 65 64 20 74 6f 20 61 63 63 65 73 73 20 74 68  eed to access th
1f010 65 20 6d 61 69 6e 20 74 61 62 6c 65 2e 20 2a 2f  e main table. */
1f020 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 48  .    }else if( H
1f030 61 73 52 6f 77 69 64 28 70 49 64 78 2d 3e 70 54  asRowid(pIdx->pT
1f040 61 62 6c 65 29 20 29 7b 0a 20 20 20 20 20 20 69  able) ){.      i
1f050 52 6f 77 69 64 52 65 67 20 3d 20 2b 2b 70 50 61  RowidReg = ++pPa
1f060 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
1f070 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1f080 70 32 28 76 2c 20 4f 50 5f 49 64 78 52 6f 77 69  p2(v, OP_IdxRowi
1f090 64 2c 20 69 49 64 78 43 75 72 2c 20 69 52 6f 77  d, iIdxCur, iRow
1f0a0 69 64 52 65 67 29 3b 0a 20 20 20 20 20 20 73 71  idReg);.      sq
1f0b0 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 53 74  lite3ExprCacheSt
1f0c0 6f 72 65 28 70 50 61 72 73 65 2c 20 69 43 75 72  ore(pParse, iCur
1f0d0 2c 20 2d 31 2c 20 69 52 6f 77 69 64 52 65 67 29  , -1, iRowidReg)
1f0e0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1f0f0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1f100 53 65 65 6b 2c 20 69 43 75 72 2c 20 69 52 6f 77  Seek, iCur, iRow
1f110 69 64 52 65 67 29 3b 20 20 2f 2a 20 44 65 66 65  idReg);  /* Defe
1f120 72 72 65 64 20 73 65 65 6b 20 2a 2f 0a 20 20 20  rred seek */.   
1f130 20 7d 65 6c 73 65 20 69 66 28 20 69 43 75 72 21   }else if( iCur!
1f140 3d 69 49 64 78 43 75 72 20 29 7b 0a 20 20 20 20  =iIdxCur ){.    
1f150 20 20 49 6e 64 65 78 20 2a 70 50 6b 20 3d 20 73    Index *pPk = s
1f160 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79  qlite3PrimaryKey
1f170 49 6e 64 65 78 28 70 49 64 78 2d 3e 70 54 61 62  Index(pIdx->pTab
1f180 6c 65 29 3b 0a 20 20 20 20 20 20 69 52 6f 77 69  le);.      iRowi
1f190 64 52 65 67 20 3d 20 73 71 6c 69 74 65 33 47 65  dReg = sqlite3Ge
1f1a0 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  tTempRange(pPars
1f1b0 65 2c 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 29  e, pPk->nKeyCol)
1f1c0 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ;.      for(j=0;
1f1d0 20 6a 3c 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b   j<pPk->nKeyCol;
1f1e0 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 6b   j++){.        k
1f1f0 20 3d 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e   = sqlite3Column
1f200 4f 66 49 6e 64 65 78 28 70 49 64 78 2c 20 70 50  OfIndex(pIdx, pP
1f210 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 29 3b  k->aiColumn[j]);
1f220 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1f230 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
1f240 5f 43 6f 6c 75 6d 6e 2c 20 69 49 64 78 43 75 72  _Column, iIdxCur
1f250 2c 20 6b 2c 20 69 52 6f 77 69 64 52 65 67 2b 6a  , k, iRowidReg+j
1f260 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1f270 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1f280 70 34 49 6e 74 28 76 2c 20 4f 50 5f 4e 6f 74 46  p4Int(v, OP_NotF
1f290 6f 75 6e 64 2c 20 69 43 75 72 2c 20 61 64 64 72  ound, iCur, addr
1f2a0 43 6f 6e 74 2c 0a 20 20 20 20 20 20 20 20 20 20  Cont,.          
1f2b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f2c0 20 69 52 6f 77 69 64 52 65 67 2c 20 70 50 6b 2d   iRowidReg, pPk-
1f2d0 3e 6e 4b 65 79 43 6f 6c 29 3b 20 56 64 62 65 43  >nKeyCol); VdbeC
1f2e0 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
1f2f0 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 63 6f 72 64  }..    /* Record
1f300 20 74 68 65 20 69 6e 73 74 72 75 63 74 69 6f 6e   the instruction
1f310 20 75 73 65 64 20 74 6f 20 74 65 72 6d 69 6e 61   used to termina
1f320 74 65 20 74 68 65 20 6c 6f 6f 70 2e 20 44 69 73  te the loop. Dis
1f330 61 62 6c 65 20 0a 20 20 20 20 2a 2a 20 57 48 45  able .    ** WHE
1f340 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20  RE clause terms 
1f350 6d 61 64 65 20 72 65 64 75 6e 64 61 6e 74 20 62  made redundant b
1f360 79 20 74 68 65 20 69 6e 64 65 78 20 72 61 6e 67  y the index rang
1f370 65 20 73 63 61 6e 2e 0a 20 20 20 20 2a 2f 0a 20  e scan..    */. 
1f380 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73     if( pLoop->ws
1f390 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e  Flags & WHERE_ON
1f3a0 45 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 70 4c  EROW ){.      pL
1f3b0 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 6f  evel->op = OP_No
1f3c0 6f 70 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  op;.    }else if
1f3d0 28 20 62 52 65 76 20 29 7b 0a 20 20 20 20 20 20  ( bRev ){.      
1f3e0 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f  pLevel->op = OP_
1f3f0 50 72 65 76 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Prev;.    }else{
1f400 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f  .      pLevel->o
1f410 70 20 3d 20 4f 50 5f 4e 65 78 74 3b 0a 20 20 20  p = OP_Next;.   
1f420 20 7d 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70   }.    pLevel->p
1f430 31 20 3d 20 69 49 64 78 43 75 72 3b 0a 20 20 20  1 = iIdxCur;.   
1f440 20 70 4c 65 76 65 6c 2d 3e 70 33 20 3d 20 28 70   pLevel->p3 = (p
1f450 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 26 57 48  Loop->wsFlags&WH
1f460 45 52 45 5f 55 4e 51 5f 57 41 4e 54 45 44 29 21  ERE_UNQ_WANTED)!
1f470 3d 30 20 3f 20 31 3a 30 3b 0a 20 20 20 20 69 66  =0 ? 1:0;.    if
1f480 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  ( (pLoop->wsFlag
1f490 73 20 26 20 57 48 45 52 45 5f 43 4f 4e 53 54 52  s & WHERE_CONSTR
1f4a0 41 49 4e 54 29 3d 3d 30 20 29 7b 0a 20 20 20 20  AINT)==0 ){.    
1f4b0 20 20 70 4c 65 76 65 6c 2d 3e 70 35 20 3d 20 53    pLevel->p5 = S
1f4c0 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53  QLITE_STMTSTATUS
1f4d0 5f 46 55 4c 4c 53 43 41 4e 5f 53 54 45 50 3b 0a  _FULLSCAN_STEP;.
1f4e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1f4f0 20 61 73 73 65 72 74 28 20 70 4c 65 76 65 6c 2d   assert( pLevel-
1f500 3e 70 35 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a  >p5==0 );.    }.
1f510 20 20 7d 65 6c 73 65 0a 0a 23 69 66 6e 64 65 66    }else..#ifndef
1f520 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f   SQLITE_OMIT_OR_
1f530 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 20 20 69  OPTIMIZATION.  i
1f540 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  f( pLoop->wsFlag
1f550 73 20 26 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f  s & WHERE_MULTI_
1f560 4f 52 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73  OR ){.    /* Cas
1f570 65 20 35 3a 20 20 54 77 6f 20 6f 72 20 6d 6f 72  e 5:  Two or mor
1f580 65 20 73 65 70 61 72 61 74 65 6c 79 20 69 6e 64  e separately ind
1f590 65 78 65 64 20 74 65 72 6d 73 20 63 6f 6e 6e 65  exed terms conne
1f5a0 63 74 65 64 20 62 79 20 4f 52 0a 20 20 20 20 2a  cted by OR.    *
1f5b0 2a 0a 20 20 20 20 2a 2a 20 45 78 61 6d 70 6c 65  *.    ** Example
1f5c0 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  :.    **.    ** 
1f5d0 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
1f5e0 31 28 61 2c 62 2c 63 2c 64 29 3b 0a 20 20 20 20  1(a,b,c,d);.    
1f5f0 2a 2a 20 20 20 43 52 45 41 54 45 20 49 4e 44 45  **   CREATE INDE
1f600 58 20 69 31 20 4f 4e 20 74 31 28 61 29 3b 0a 20  X i1 ON t1(a);. 
1f610 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20 49     **   CREATE I
1f620 4e 44 45 58 20 69 32 20 4f 4e 20 74 31 28 62 29  NDEX i2 ON t1(b)
1f630 3b 0a 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54  ;.    **   CREAT
1f640 45 20 49 4e 44 45 58 20 69 33 20 4f 4e 20 74 31  E INDEX i3 ON t1
1f650 28 63 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20  (c);.    **.    
1f660 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  **   SELECT * FR
1f670 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3d 35 20  OM t1 WHERE a=5 
1f680 4f 52 20 62 3d 37 20 4f 52 20 28 63 3d 31 31 20  OR b=7 OR (c=11 
1f690 41 4e 44 20 64 3d 31 33 29 0a 20 20 20 20 2a 2a  AND d=13).    **
1f6a0 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68 65 20 65  .    ** In the e
1f6b0 78 61 6d 70 6c 65 2c 20 74 68 65 72 65 20 61 72  xample, there ar
1f6c0 65 20 74 68 72 65 65 20 69 6e 64 65 78 65 64 20  e three indexed 
1f6d0 74 65 72 6d 73 20 63 6f 6e 6e 65 63 74 65 64 20  terms connected 
1f6e0 62 79 20 4f 52 2e 0a 20 20 20 20 2a 2a 20 54 68  by OR..    ** Th
1f6f0 65 20 74 6f 70 20 6f 66 20 74 68 65 20 6c 6f 6f  e top of the loo
1f700 70 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 74 68 69  p looks like thi
1f710 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  s:.    **.    **
1f720 20 20 20 20 20 20 20 20 20 20 4e 75 6c 6c 20 20            Null  
1f730 20 20 20 20 20 31 20 20 20 20 20 20 20 20 20 20       1          
1f740 20 20 20 20 20 20 23 20 5a 65 72 6f 20 74 68 65        # Zero the
1f750 20 72 6f 77 73 65 74 20 69 6e 20 72 65 67 20 31   rowset in reg 1
1f760 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
1f770 68 65 6e 2c 20 66 6f 72 20 65 61 63 68 20 69 6e  hen, for each in
1f780 64 65 78 65 64 20 74 65 72 6d 2c 20 74 68 65 20  dexed term, the 
1f790 66 6f 6c 6c 6f 77 69 6e 67 2e 20 54 68 65 20 61  following. The a
1f7a0 72 67 75 6d 65 6e 74 73 20 74 6f 0a 20 20 20 20  rguments to.    
1f7b0 2a 2a 20 52 6f 77 53 65 74 54 65 73 74 20 61 72  ** RowSetTest ar
1f7c0 65 20 73 75 63 68 20 74 68 61 74 20 74 68 65 20  e such that the 
1f7d0 72 6f 77 69 64 20 6f 66 20 74 68 65 20 63 75 72  rowid of the cur
1f7e0 72 65 6e 74 20 72 6f 77 20 69 73 20 69 6e 73 65  rent row is inse
1f7f0 72 74 65 64 0a 20 20 20 20 2a 2a 20 69 6e 74 6f  rted.    ** into
1f800 20 74 68 65 20 52 6f 77 53 65 74 2e 20 49 66 20   the RowSet. If 
1f810 69 74 20 69 73 20 61 6c 72 65 61 64 79 20 70 72  it is already pr
1f820 65 73 65 6e 74 2c 20 63 6f 6e 74 72 6f 6c 20 73  esent, control s
1f830 6b 69 70 73 20 74 68 65 0a 20 20 20 20 2a 2a 20  kips the.    ** 
1f840 47 6f 73 75 62 20 6f 70 63 6f 64 65 20 61 6e 64  Gosub opcode and
1f850 20 6a 75 6d 70 73 20 73 74 72 61 69 67 68 74 20   jumps straight 
1f860 74 6f 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65  to the code gene
1f870 72 61 74 65 64 20 62 79 20 57 68 65 72 65 45 6e  rated by WhereEn
1f880 64 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  d()..    **.    
1f890 2a 2a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  **        sqlite
1f8a0 33 57 68 65 72 65 42 65 67 69 6e 28 3c 74 65 72  3WhereBegin(<ter
1f8b0 6d 3e 29 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  m>).    **      
1f8c0 20 20 20 20 52 6f 77 53 65 74 54 65 73 74 20 20      RowSetTest  
1f8d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f8e0 23 20 49 6e 73 65 72 74 20 72 6f 77 69 64 20 69  # Insert rowid i
1f8f0 6e 74 6f 20 72 6f 77 73 65 74 0a 20 20 20 20 2a  nto rowset.    *
1f900 2a 20 20 20 20 20 20 20 20 20 20 47 6f 73 75 62  *          Gosub
1f910 20 20 20 20 20 20 32 20 41 0a 20 20 20 20 2a 2a        2 A.    **
1f920 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57          sqlite3W
1f930 68 65 72 65 45 6e 64 28 29 0a 20 20 20 20 2a 2a  hereEnd().    **
1f940 0a 20 20 20 20 2a 2a 20 46 6f 6c 6c 6f 77 69 6e  .    ** Followin
1f950 67 20 74 68 65 20 61 62 6f 76 65 2c 20 63 6f 64  g the above, cod
1f960 65 20 74 6f 20 74 65 72 6d 69 6e 61 74 65 20 74  e to terminate t
1f970 68 65 20 6c 6f 6f 70 2e 20 4c 61 62 65 6c 20 41  he loop. Label A
1f980 2c 20 74 68 65 20 74 61 72 67 65 74 0a 20 20 20  , the target.   
1f990 20 2a 2a 20 6f 66 20 74 68 65 20 47 6f 73 75 62   ** of the Gosub
1f9a0 20 61 62 6f 76 65 2c 20 6a 75 6d 70 73 20 74 6f   above, jumps to
1f9b0 20 74 68 65 20 69 6e 73 74 72 75 63 74 69 6f 6e   the instruction
1f9c0 20 72 69 67 68 74 20 61 66 74 65 72 20 74 68 65   right after the
1f9d0 20 47 6f 74 6f 2e 0a 20 20 20 20 2a 2a 0a 20 20   Goto..    **.  
1f9e0 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 4e 75    **          Nu
1f9f0 6c 6c 20 20 20 20 20 20 20 31 20 20 20 20 20 20  ll       1      
1fa00 20 20 20 20 20 20 20 20 20 20 23 20 5a 65 72 6f            # Zero
1fa10 20 74 68 65 20 72 6f 77 73 65 74 20 69 6e 20 72   the rowset in r
1fa20 65 67 20 31 0a 20 20 20 20 2a 2a 20 20 20 20 20  eg 1.    **     
1fa30 20 20 20 20 20 47 6f 74 6f 20 20 20 20 20 20 20       Goto       
1fa40 42 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  B               
1fa50 20 23 20 54 68 65 20 6c 6f 6f 70 20 69 73 20 66   # The loop is f
1fa60 69 6e 69 73 68 65 64 2e 0a 20 20 20 20 2a 2a 0a  inished..    **.
1fa70 20 20 20 20 2a 2a 20 20 20 20 20 20 20 41 3a 20      **       A: 
1fa80 3c 6c 6f 6f 70 20 62 6f 64 79 3e 20 20 20 20 20  <loop body>     
1fa90 20 20 20 20 20 20 20 20 20 20 20 20 23 20 52 65              # Re
1faa0 74 75 72 6e 20 64 61 74 61 2c 20 77 68 61 74 65  turn data, whate
1fab0 76 65 72 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ver..    **.    
1fac0 2a 2a 20 20 20 20 20 20 20 20 20 20 52 65 74 75  **          Retu
1fad0 72 6e 20 20 20 20 20 32 20 20 20 20 20 20 20 20  rn     2        
1fae0 20 20 20 20 20 20 20 20 23 20 4a 75 6d 70 20 62          # Jump b
1faf0 61 63 6b 20 74 6f 20 74 68 65 20 47 6f 73 75 62  ack to the Gosub
1fb00 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
1fb10 20 20 20 20 20 42 3a 20 3c 61 66 74 65 72 20 74       B: <after t
1fb20 68 65 20 6c 6f 6f 70 3e 0a 20 20 20 20 2a 2a 0a  he loop>.    **.
1fb30 20 20 20 20 2a 2a 20 41 64 64 65 64 20 32 30 31      ** Added 201
1fb40 34 2d 30 35 2d 32 36 3a 20 49 66 20 74 68 65 20  4-05-26: If the 
1fb50 74 61 62 6c 65 20 69 73 20 61 20 57 49 54 48 4f  table is a WITHO
1fb60 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65 2c 20  UT ROWID table, 
1fb70 74 68 65 6e 0a 20 20 20 20 2a 2a 20 75 73 65 20  then.    ** use 
1fb80 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 69 6e 64  an ephemeral ind
1fb90 65 78 20 69 6e 73 74 65 61 64 20 6f 66 20 61 20  ex instead of a 
1fba0 52 6f 77 53 65 74 20 74 6f 20 72 65 63 6f 72 64  RowSet to record
1fbb0 20 74 68 65 20 70 72 69 6d 61 72 79 0a 20 20 20   the primary.   
1fbc0 20 2a 2a 20 6b 65 79 73 20 6f 66 20 74 68 65 20   ** keys of the 
1fbd0 72 6f 77 73 20 77 65 20 68 61 76 65 20 61 6c 72  rows we have alr
1fbe0 65 61 64 79 20 73 65 65 6e 2e 0a 20 20 20 20 2a  eady seen..    *
1fbf0 2a 0a 20 20 20 20 2a 2f 0a 20 20 20 20 57 68 65  *.    */.    Whe
1fc00 72 65 43 6c 61 75 73 65 20 2a 70 4f 72 57 63 3b  reClause *pOrWc;
1fc10 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 2d 63 6c      /* The OR-cl
1fc20 61 75 73 65 20 62 72 6f 6b 65 6e 20 6f 75 74 20  ause broken out 
1fc30 69 6e 74 6f 20 73 75 62 74 65 72 6d 73 20 2a 2f  into subterms */
1fc40 0a 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70 4f  .    SrcList *pO
1fc50 72 54 61 62 3b 20 20 20 20 20 20 20 2f 2a 20 53  rTab;       /* S
1fc60 68 6f 72 74 65 6e 65 64 20 74 61 62 6c 65 20 6c  hortened table l
1fc70 69 73 74 20 6f 72 20 4f 52 2d 63 6c 61 75 73 65  ist or OR-clause
1fc80 20 67 65 6e 65 72 61 74 69 6f 6e 20 2a 2f 0a 20   generation */. 
1fc90 20 20 20 49 6e 64 65 78 20 2a 70 43 6f 76 20 3d     Index *pCov =
1fca0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
1fcb0 2f 2a 20 50 6f 74 65 6e 74 69 61 6c 20 63 6f 76  /* Potential cov
1fcc0 65 72 69 6e 67 20 69 6e 64 65 78 20 28 6f 72 20  ering index (or 
1fcd0 4e 55 4c 4c 29 20 2a 2f 0a 20 20 20 20 69 6e 74  NULL) */.    int
1fce0 20 69 43 6f 76 43 75 72 20 3d 20 70 50 61 72 73   iCovCur = pPars
1fcf0 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 2f 2a 20 43  e->nTab++;  /* C
1fd00 75 72 73 6f 72 20 75 73 65 64 20 66 6f 72 20 69  ursor used for i
1fd10 6e 64 65 78 20 73 63 61 6e 73 20 28 69 66 20 61  ndex scans (if a
1fd20 6e 79 29 20 2a 2f 0a 0a 20 20 20 20 69 6e 74 20  ny) */..    int 
1fd30 72 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70 50  regReturn = ++pP
1fd40 61 72 73 65 2d 3e 6e 4d 65 6d 3b 20 20 20 20 20  arse->nMem;     
1fd50 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
1fd60 72 20 75 73 65 64 20 77 69 74 68 20 4f 50 5f 47  r used with OP_G
1fd70 6f 73 75 62 20 2a 2f 0a 20 20 20 20 69 6e 74 20  osub */.    int 
1fd80 72 65 67 52 6f 77 73 65 74 20 3d 20 30 3b 20 20  regRowset = 0;  
1fd90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fda0 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
1fdb0 72 20 66 6f 72 20 52 6f 77 53 65 74 20 6f 62 6a  r for RowSet obj
1fdc0 65 63 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72  ect */.    int r
1fdd0 65 67 52 6f 77 69 64 20 3d 20 30 3b 20 20 20 20  egRowid = 0;    
1fde0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fdf0 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
1fe00 20 68 6f 6c 64 69 6e 67 20 72 6f 77 69 64 20 2a   holding rowid *
1fe10 2f 0a 20 20 20 20 69 6e 74 20 69 4c 6f 6f 70 42  /.    int iLoopB
1fe20 6f 64 79 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ody = sqlite3Vdb
1fe30 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 20 20  eMakeLabel(v);  
1fe40 2f 2a 20 53 74 61 72 74 20 6f 66 20 6c 6f 6f 70  /* Start of loop
1fe50 20 62 6f 64 79 20 2a 2f 0a 20 20 20 20 69 6e 74   body */.    int
1fe60 20 69 52 65 74 49 6e 69 74 3b 20 20 20 20 20 20   iRetInit;      
1fe70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fe80 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
1fe90 73 20 6f 66 20 72 65 67 52 65 74 75 72 6e 20 69  s of regReturn i
1fea0 6e 69 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 75  nit */.    int u
1feb0 6e 74 65 73 74 65 64 54 65 72 6d 73 20 3d 20 30  ntestedTerms = 0
1fec0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1fed0 20 53 6f 6d 65 20 74 65 72 6d 73 20 6e 6f 74 20   Some terms not 
1fee0 63 6f 6d 70 6c 65 74 65 6c 79 20 74 65 73 74 65  completely teste
1fef0 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b  d */.    int ii;
1ff00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ff10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
1ff20 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
1ff30 20 20 20 75 31 36 20 77 63 74 72 6c 46 6c 61 67     u16 wctrlFlag
1ff40 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
1ff50 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 66        /* Flags f
1ff60 6f 72 20 73 75 62 2d 57 48 45 52 45 20 63 6c 61  or sub-WHERE cla
1ff70 75 73 65 20 2a 2f 0a 20 20 20 20 45 78 70 72 20  use */.    Expr 
1ff80 2a 70 41 6e 64 45 78 70 72 20 3d 20 30 3b 20 20  *pAndExpr = 0;  
1ff90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ffa0 20 41 6e 20 22 2e 2e 20 41 4e 44 20 28 2e 2e 2e   An ".. AND (...
1ffb0 29 22 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f  )" expression */
1ffc0 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
1ffd0 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61   = pTabItem->pTa
1ffe0 62 3b 0a 20 20 20 0a 20 20 20 20 70 54 65 72 6d  b;.   .    pTerm
1fff0 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d   = pLoop->aLTerm
20000 5b 30 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  [0];.    assert(
20010 20 70 54 65 72 6d 21 3d 30 20 29 3b 0a 20 20 20   pTerm!=0 );.   
20020 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e   assert( pTerm->
20030 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 4f  eOperator & WO_O
20040 52 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  R );.    assert(
20050 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73   (pTerm->wtFlags
20060 20 26 20 54 45 52 4d 5f 4f 52 49 4e 46 4f 29 21   & TERM_ORINFO)!
20070 3d 30 20 29 3b 0a 20 20 20 20 70 4f 72 57 63 20  =0 );.    pOrWc 
20080 3d 20 26 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49  = &pTerm->u.pOrI
20090 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20 20 70 4c 65  nfo->wc;.    pLe
200a0 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 52 65 74  vel->op = OP_Ret
200b0 75 72 6e 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  urn;.    pLevel-
200c0 3e 70 31 20 3d 20 72 65 67 52 65 74 75 72 6e 3b  >p1 = regReturn;
200d0 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 75 70 20  ..    /* Set up 
200e0 61 20 6e 65 77 20 53 72 63 4c 69 73 74 20 69 6e  a new SrcList in
200f0 20 70 4f 72 54 61 62 20 63 6f 6e 74 61 69 6e 69   pOrTab containi
20100 6e 67 20 74 68 65 20 74 61 62 6c 65 20 62 65 69  ng the table bei
20110 6e 67 20 73 63 61 6e 6e 65 64 0a 20 20 20 20 2a  ng scanned.    *
20120 2a 20 62 79 20 74 68 69 73 20 6c 6f 6f 70 20 69  * by this loop i
20130 6e 20 74 68 65 20 61 5b 30 5d 20 73 6c 6f 74 20  n the a[0] slot 
20140 61 6e 64 20 61 6c 6c 20 6e 6f 74 52 65 61 64 79  and all notReady
20150 20 74 61 62 6c 65 73 20 69 6e 20 61 5b 31 2e 2e   tables in a[1..
20160 5d 20 73 6c 6f 74 73 2e 0a 20 20 20 20 2a 2a 20  ] slots..    ** 
20170 54 68 69 73 20 62 65 63 6f 6d 65 73 20 74 68 65  This becomes the
20180 20 53 72 63 4c 69 73 74 20 69 6e 20 74 68 65 20   SrcList in the 
20190 72 65 63 75 72 73 69 76 65 20 63 61 6c 6c 20 74  recursive call t
201a0 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  o sqlite3WhereBe
201b0 67 69 6e 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20  gin()..    */.  
201c0 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c    if( pWInfo->nL
201d0 65 76 65 6c 3e 31 20 29 7b 0a 20 20 20 20 20 20  evel>1 ){.      
201e0 69 6e 74 20 6e 4e 6f 74 52 65 61 64 79 3b 20 20  int nNotReady;  
201f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20200 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * The number of 
20210 6e 6f 74 52 65 61 64 79 20 74 61 62 6c 65 73 20  notReady tables 
20220 2a 2f 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  */.      struct 
20230 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 6f 72  SrcList_item *or
20240 69 67 53 72 63 3b 20 20 20 20 20 2f 2a 20 4f 72  igSrc;     /* Or
20250 69 67 69 6e 61 6c 20 6c 69 73 74 20 6f 66 20 74  iginal list of t
20260 61 62 6c 65 73 20 2a 2f 0a 20 20 20 20 20 20 6e  ables */.      n
20270 4e 6f 74 52 65 61 64 79 20 3d 20 70 57 49 6e 66  NotReady = pWInf
20280 6f 2d 3e 6e 4c 65 76 65 6c 20 2d 20 69 4c 65 76  o->nLevel - iLev
20290 65 6c 20 2d 20 31 3b 0a 20 20 20 20 20 20 70 4f  el - 1;.      pO
202a0 72 54 61 62 20 3d 20 73 71 6c 69 74 65 33 53 74  rTab = sqlite3St
202b0 61 63 6b 41 6c 6c 6f 63 52 61 77 28 64 62 2c 0a  ackAllocRaw(db,.
202c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
202d0 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65              size
202e0 6f 66 28 2a 70 4f 72 54 61 62 29 2b 20 6e 4e 6f  of(*pOrTab)+ nNo
202f0 74 52 65 61 64 79 2a 73 69 7a 65 6f 66 28 70 4f  tReady*sizeof(pO
20300 72 54 61 62 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20  rTab->a[0]));.  
20310 20 20 20 20 69 66 28 20 70 4f 72 54 61 62 3d 3d      if( pOrTab==
20320 30 20 29 20 72 65 74 75 72 6e 20 6e 6f 74 52 65  0 ) return notRe
20330 61 64 79 3b 0a 20 20 20 20 20 20 70 4f 72 54 61  ady;.      pOrTa
20340 62 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 28 75 38 29  b->nAlloc = (u8)
20350 28 6e 4e 6f 74 52 65 61 64 79 20 2b 20 31 29 3b  (nNotReady + 1);
20360 0a 20 20 20 20 20 20 70 4f 72 54 61 62 2d 3e 6e  .      pOrTab->n
20370 53 72 63 20 3d 20 70 4f 72 54 61 62 2d 3e 6e 41  Src = pOrTab->nA
20380 6c 6c 6f 63 3b 0a 20 20 20 20 20 20 6d 65 6d 63  lloc;.      memc
20390 70 79 28 70 4f 72 54 61 62 2d 3e 61 2c 20 70 54  py(pOrTab->a, pT
203a0 61 62 49 74 65 6d 2c 20 73 69 7a 65 6f 66 28 2a  abItem, sizeof(*
203b0 70 54 61 62 49 74 65 6d 29 29 3b 0a 20 20 20 20  pTabItem));.    
203c0 20 20 6f 72 69 67 53 72 63 20 3d 20 70 57 49 6e    origSrc = pWIn
203d0 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 3b  fo->pTabList->a;
203e0 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 31 3b 20  .      for(k=1; 
203f0 6b 3c 3d 6e 4e 6f 74 52 65 61 64 79 3b 20 6b 2b  k<=nNotReady; k+
20400 2b 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63  +){.        memc
20410 70 79 28 26 70 4f 72 54 61 62 2d 3e 61 5b 6b 5d  py(&pOrTab->a[k]
20420 2c 20 26 6f 72 69 67 53 72 63 5b 70 4c 65 76 65  , &origSrc[pLeve
20430 6c 5b 6b 5d 2e 69 46 72 6f 6d 5d 2c 20 73 69 7a  l[k].iFrom], siz
20440 65 6f 66 28 70 4f 72 54 61 62 2d 3e 61 5b 6b 5d  eof(pOrTab->a[k]
20450 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
20460 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4f 72  }else{.      pOr
20470 54 61 62 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54  Tab = pWInfo->pT
20480 61 62 4c 69 73 74 3b 0a 20 20 20 20 7d 0a 0a 20  abList;.    }.. 
20490 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65     /* Initialize
204a0 20 74 68 65 20 72 6f 77 73 65 74 20 72 65 67 69   the rowset regi
204b0 73 74 65 72 20 74 6f 20 63 6f 6e 74 61 69 6e 20  ster to contain 
204c0 4e 55 4c 4c 2e 20 41 6e 20 53 51 4c 20 4e 55 4c  NULL. An SQL NUL
204d0 4c 20 69 73 20 0a 20 20 20 20 2a 2a 20 65 71 75  L is .    ** equ
204e0 69 76 61 6c 65 6e 74 20 74 6f 20 61 6e 20 65 6d  ivalent to an em
204f0 70 74 79 20 72 6f 77 73 65 74 2e 20 20 4f 72 2c  pty rowset.  Or,
20500 20 63 72 65 61 74 65 20 61 6e 20 65 70 68 65 6d   create an ephem
20510 65 72 61 6c 20 69 6e 64 65 78 0a 20 20 20 20 2a  eral index.    *
20520 2a 20 63 61 70 61 62 6c 65 20 6f 66 20 68 6f 6c  * capable of hol
20530 64 69 6e 67 20 70 72 69 6d 61 72 79 20 6b 65 79  ding primary key
20540 73 20 69 6e 20 74 68 65 20 63 61 73 65 20 6f 66  s in the case of
20550 20 61 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44   a WITHOUT ROWID
20560 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
20570 41 6c 73 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20  Also initialize 
20580 72 65 67 52 65 74 75 72 6e 20 74 6f 20 63 6f 6e  regReturn to con
20590 74 61 69 6e 20 74 68 65 20 61 64 64 72 65 73 73  tain the address
205a0 20 6f 66 20 74 68 65 20 69 6e 73 74 72 75 63 74   of the instruct
205b0 69 6f 6e 20 0a 20 20 20 20 2a 2a 20 69 6d 6d 65  ion .    ** imme
205c0 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e  diately followin
205d0 67 20 74 68 65 20 4f 50 5f 52 65 74 75 72 6e 20  g the OP_Return 
205e0 61 74 20 74 68 65 20 62 6f 74 74 6f 6d 20 6f 66  at the bottom of
205f0 20 74 68 65 20 6c 6f 6f 70 2e 20 54 68 69 73 0a   the loop. This.
20600 20 20 20 20 2a 2a 20 69 73 20 72 65 71 75 69 72      ** is requir
20610 65 64 20 69 6e 20 61 20 66 65 77 20 6f 62 73 63  ed in a few obsc
20620 75 72 65 20 4c 45 46 54 20 4a 4f 49 4e 20 63 61  ure LEFT JOIN ca
20630 73 65 73 20 77 68 65 72 65 20 63 6f 6e 74 72 6f  ses where contro
20640 6c 20 6a 75 6d 70 73 0a 20 20 20 20 2a 2a 20 6f  l jumps.    ** o
20650 76 65 72 20 74 68 65 20 74 6f 70 20 6f 66 20 74  ver the top of t
20660 68 65 20 6c 6f 6f 70 20 69 6e 74 6f 20 74 68 65  he loop into the
20670 20 62 6f 64 79 20 6f 66 20 69 74 2e 20 49 6e 20   body of it. In 
20680 74 68 69 73 20 63 61 73 65 20 74 68 65 20 0a 20  this case the . 
20690 20 20 20 2a 2a 20 63 6f 72 72 65 63 74 20 72 65     ** correct re
206a0 73 70 6f 6e 73 65 20 66 6f 72 20 74 68 65 20 65  sponse for the e
206b0 6e 64 2d 6f 66 2d 6c 6f 6f 70 20 63 6f 64 65 20  nd-of-loop code 
206c0 28 74 68 65 20 4f 50 5f 52 65 74 75 72 6e 29 20  (the OP_Return) 
206d0 69 73 20 74 6f 20 0a 20 20 20 20 2a 2a 20 66 61  is to .    ** fa
206e0 6c 6c 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68  ll through to th
206f0 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69  e next instructi
20700 6f 6e 2c 20 6a 75 73 74 20 61 73 20 61 6e 20 4f  on, just as an O
20710 50 5f 4e 65 78 74 20 64 6f 65 73 20 69 66 0a 20  P_Next does if. 
20720 20 20 20 2a 2a 20 63 61 6c 6c 65 64 20 6f 6e 20     ** called on 
20730 61 6e 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64  an uninitialized
20740 20 63 75 72 73 6f 72 2e 0a 20 20 20 20 2a 2f 0a   cursor..    */.
20750 20 20 20 20 69 66 28 20 28 70 57 49 6e 66 6f 2d      if( (pWInfo-
20760 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  >wctrlFlags & WH
20770 45 52 45 5f 44 55 50 4c 49 43 41 54 45 53 5f 4f  ERE_DUPLICATES_O
20780 4b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  K)==0 ){.      i
20790 66 28 20 48 61 73 52 6f 77 69 64 28 70 54 61 62  f( HasRowid(pTab
207a0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 67  ) ){.        reg
207b0 52 6f 77 73 65 74 20 3d 20 2b 2b 70 50 61 72 73  Rowset = ++pPars
207c0 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20  e->nMem;.       
207d0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
207e0 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  p2(v, OP_Null, 0
207f0 2c 20 72 65 67 52 6f 77 73 65 74 29 3b 0a 20 20  , regRowset);.  
20800 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
20810 20 20 20 49 6e 64 65 78 20 2a 70 50 6b 20 3d 20     Index *pPk = 
20820 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65  sqlite3PrimaryKe
20830 79 49 6e 64 65 78 28 70 54 61 62 29 3b 0a 20 20  yIndex(pTab);.  
20840 20 20 20 20 20 20 72 65 67 52 6f 77 73 65 74 20        regRowset 
20850 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
20860 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
20870 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
20880 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
20890 20 72 65 67 52 6f 77 73 65 74 2c 20 70 50 6b 2d   regRowset, pPk-
208a0 3e 6e 4b 65 79 43 6f 6c 29 3b 0a 20 20 20 20 20  >nKeyCol);.     
208b0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
208c0 74 50 34 4b 65 79 49 6e 66 6f 28 70 50 61 72 73  tP4KeyInfo(pPars
208d0 65 2c 20 70 50 6b 29 3b 0a 20 20 20 20 20 20 7d  e, pPk);.      }
208e0 0a 20 20 20 20 20 20 72 65 67 52 6f 77 69 64 20  .      regRowid 
208f0 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
20900 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 52 65 74  ;.    }.    iRet
20910 49 6e 69 74 20 3d 20 73 71 6c 69 74 65 33 56 64  Init = sqlite3Vd
20920 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
20930 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67 52 65  nteger, 0, regRe
20940 74 75 72 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  turn);..    /* I
20950 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 57  f the original W
20960 48 45 52 45 20 63 6c 61 75 73 65 20 69 73 20 7a  HERE clause is z
20970 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 20 20 28   of the form:  (
20980 78 31 20 4f 52 20 78 32 20 4f 52 20 2e 2e 2e 29  x1 OR x2 OR ...)
20990 20 41 4e 44 20 79 0a 20 20 20 20 2a 2a 20 54 68   AND y.    ** Th
209a0 65 6e 20 66 6f 72 20 65 76 65 72 79 20 74 65 72  en for every ter
209b0 6d 20 78 4e 2c 20 65 76 61 6c 75 61 74 65 20 61  m xN, evaluate a
209c0 73 20 74 68 65 20 73 75 62 65 78 70 72 65 73 73  s the subexpress
209d0 69 6f 6e 3a 20 78 4e 20 41 4e 44 20 7a 0a 20 20  ion: xN AND z.  
209e0 20 20 2a 2a 20 54 68 61 74 20 77 61 79 2c 20 74    ** That way, t
209f0 65 72 6d 73 20 69 6e 20 79 20 74 68 61 74 20 61  erms in y that a
20a00 72 65 20 66 61 63 74 6f 72 65 64 20 69 6e 74 6f  re factored into
20a10 20 74 68 65 20 64 69 73 6a 75 6e 63 74 69 6f 6e   the disjunction
20a20 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20   will.    ** be 
20a30 70 69 63 6b 65 64 20 75 70 20 62 79 20 74 68 65  picked up by the
20a40 20 72 65 63 75 72 73 69 76 65 20 63 61 6c 6c 73   recursive calls
20a50 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65   to sqlite3Where
20a60 42 65 67 69 6e 28 29 20 62 65 6c 6f 77 2e 0a 20  Begin() below.. 
20a70 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 63 74     **.    ** Act
20a80 75 61 6c 6c 79 2c 20 65 61 63 68 20 73 75 62 65  ually, each sube
20a90 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e  xpression is con
20aa0 76 65 72 74 65 64 20 74 6f 20 22 78 4e 20 41 4e  verted to "xN AN
20ab0 44 20 77 22 20 77 68 65 72 65 20 77 20 69 73 0a  D w" where w is.
20ac0 20 20 20 20 2a 2a 20 74 68 65 20 22 69 6e 74 65      ** the "inte
20ad0 72 65 73 74 69 6e 67 22 20 74 65 72 6d 73 20 6f  resting" terms o
20ae0 66 20 7a 20 2d 20 74 65 72 6d 73 20 74 68 61 74  f z - terms that
20af0 20 64 69 64 20 6e 6f 74 20 6f 72 69 67 69 6e 61   did not origina
20b00 74 65 20 69 6e 20 74 68 65 0a 20 20 20 20 2a 2a  te in the.    **
20b10 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61   ON or USING cla
20b20 75 73 65 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f  use of a LEFT JO
20b30 49 4e 2c 20 61 6e 64 20 74 65 72 6d 73 20 74 68  IN, and terms th
20b40 61 74 20 61 72 65 20 75 73 61 62 6c 65 20 61 73  at are usable as
20b50 20 0a 20 20 20 20 2a 2a 20 69 6e 64 69 63 65 73   .    ** indices
20b60 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
20b70 54 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f  This optimizatio
20b80 6e 20 61 6c 73 6f 20 6f 6e 6c 79 20 61 70 70 6c  n also only appl
20b90 69 65 73 20 69 66 20 74 68 65 20 28 78 31 20 4f  ies if the (x1 O
20ba0 52 20 78 32 20 4f 52 20 2e 2e 2e 29 20 74 65 72  R x2 OR ...) ter
20bb0 6d 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20  m.    ** is not 
20bc0 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65  contained in the
20bd0 20 4f 4e 20 63 6c 61 75 73 65 20 6f 66 20 61 20   ON clause of a 
20be0 4c 45 46 54 20 4a 4f 49 4e 2e 0a 20 20 20 20 2a  LEFT JOIN..    *
20bf0 2a 20 53 65 65 20 74 69 63 6b 65 74 20 68 74 74  * See ticket htt
20c00 70 3a 2f 2f 77 77 77 2e 73 71 6c 69 74 65 2e 6f  p://www.sqlite.o
20c10 72 67 2f 73 72 63 2f 69 6e 66 6f 2f 66 32 33 36  rg/src/info/f236
20c20 39 33 30 34 65 34 0a 20 20 20 20 2a 2f 0a 20 20  9304e4.    */.  
20c30 20 20 69 66 28 20 70 57 43 2d 3e 6e 54 65 72 6d    if( pWC->nTerm
20c40 3e 31 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  >1 ){.      int 
20c50 69 54 65 72 6d 3b 0a 20 20 20 20 20 20 66 6f 72  iTerm;.      for
20c60 28 69 54 65 72 6d 3d 30 3b 20 69 54 65 72 6d 3c  (iTerm=0; iTerm<
20c70 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 54 65 72  pWC->nTerm; iTer
20c80 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 45 78  m++){.        Ex
20c90 70 72 20 2a 70 45 78 70 72 20 3d 20 70 57 43 2d  pr *pExpr = pWC-
20ca0 3e 61 5b 69 54 65 72 6d 5d 2e 70 45 78 70 72 3b  >a[iTerm].pExpr;
20cb0 0a 20 20 20 20 20 20 20 20 69 66 28 20 26 70 57  .        if( &pW
20cc0 43 2d 3e 61 5b 69 54 65 72 6d 5d 20 3d 3d 20 70  C->a[iTerm] == p
20cd0 54 65 72 6d 20 29 20 63 6f 6e 74 69 6e 75 65 3b  Term ) continue;
20ce0 0a 20 20 20 20 20 20 20 20 69 66 28 20 45 78 70  .        if( Exp
20cf0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
20d00 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  pr, EP_FromJoin)
20d10 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
20d20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
20d30 57 43 2d 3e 61 5b 69 54 65 72 6d 5d 2e 77 74 46  WC->a[iTerm].wtF
20d40 6c 61 67 73 20 26 20 54 45 52 4d 5f 4f 52 49 4e  lags & TERM_ORIN
20d50 46 4f 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65  FO );.        te
20d60 73 74 63 61 73 65 28 20 70 57 43 2d 3e 61 5b 69  stcase( pWC->a[i
20d70 54 65 72 6d 5d 2e 77 74 46 6c 61 67 73 20 26 20  Term].wtFlags & 
20d80 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a  TERM_VIRTUAL );.
20d90 20 20 20 20 20 20 20 20 69 66 28 20 70 57 43 2d          if( pWC-
20da0 3e 61 5b 69 54 65 72 6d 5d 2e 77 74 46 6c 61 67  >a[iTerm].wtFlag
20db0 73 20 26 20 28 54 45 52 4d 5f 4f 52 49 4e 46 4f  s & (TERM_ORINFO
20dc0 7c 54 45 52 4d 5f 56 49 52 54 55 41 4c 29 20 29  |TERM_VIRTUAL) )
20dd0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
20de0 20 20 20 69 66 28 20 28 70 57 43 2d 3e 61 5b 69     if( (pWC->a[i
20df0 54 65 72 6d 5d 2e 65 4f 70 65 72 61 74 6f 72 20  Term].eOperator 
20e00 26 20 57 4f 5f 41 4c 4c 29 3d 3d 30 20 29 20 63  & WO_ALL)==0 ) c
20e10 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
20e20 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33   pExpr = sqlite3
20e30 45 78 70 72 44 75 70 28 64 62 2c 20 70 45 78 70  ExprDup(db, pExp
20e40 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70  r, 0);.        p
20e50 41 6e 64 45 78 70 72 20 3d 20 73 71 6c 69 74 65  AndExpr = sqlite
20e60 33 45 78 70 72 41 6e 64 28 64 62 2c 20 70 41 6e  3ExprAnd(db, pAn
20e70 64 45 78 70 72 2c 20 70 45 78 70 72 29 3b 0a 20  dExpr, pExpr);. 
20e80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
20e90 20 70 41 6e 64 45 78 70 72 20 29 7b 0a 20 20 20   pAndExpr ){.   
20ea0 20 20 20 20 20 70 41 6e 64 45 78 70 72 20 3d 20       pAndExpr = 
20eb0 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61  sqlite3PExpr(pPa
20ec0 72 73 65 2c 20 54 4b 5f 41 4e 44 2c 20 30 2c 20  rse, TK_AND, 0, 
20ed0 70 41 6e 64 45 78 70 72 2c 20 30 29 3b 0a 20 20  pAndExpr, 0);.  
20ee0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
20ef0 20 2f 2a 20 52 75 6e 20 61 20 73 65 70 61 72 61   /* Run a separa
20f00 74 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  te WHERE clause 
20f10 66 6f 72 20 65 61 63 68 20 74 65 72 6d 20 6f 66  for each term of
20f20 20 74 68 65 20 4f 52 20 63 6c 61 75 73 65 2e 20   the OR clause. 
20f30 20 41 66 74 65 72 0a 20 20 20 20 2a 2a 20 65 6c   After.    ** el
20f40 69 6d 69 6e 61 74 69 6e 67 20 64 75 70 6c 69 63  iminating duplic
20f50 61 74 65 73 20 66 72 6f 6d 20 6f 74 68 65 72 20  ates from other 
20f60 57 48 45 52 45 20 63 6c 61 75 73 65 73 2c 20 74  WHERE clauses, t
20f70 68 65 20 61 63 74 69 6f 6e 20 66 6f 72 20 65 61  he action for ea
20f80 63 68 0a 20 20 20 20 2a 2a 20 73 75 62 2d 57 48  ch.    ** sub-WH
20f90 45 52 45 20 63 6c 61 75 73 65 20 69 73 20 74 6f  ERE clause is to
20fa0 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20 6d   to invoke the m
20fb0 61 69 6e 20 6c 6f 6f 70 20 62 6f 64 79 20 61 73  ain loop body as
20fc0 20 61 20 73 75 62 72 6f 75 74 69 6e 65 2e 0a 20   a subroutine.. 
20fd0 20 20 20 2a 2f 0a 20 20 20 20 77 63 74 72 6c 46     */.    wctrlF
20fe0 6c 61 67 73 20 3d 20 20 57 48 45 52 45 5f 4f 4d  lags =  WHERE_OM
20ff0 49 54 5f 4f 50 45 4e 5f 43 4c 4f 53 45 0a 20 20  IT_OPEN_CLOSE.  
21000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
21010 57 48 45 52 45 5f 46 4f 52 43 45 5f 54 41 42 4c  WHERE_FORCE_TABL
21020 45 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  E.              
21030 20 20 7c 20 57 48 45 52 45 5f 4f 4e 45 54 41 42    | WHERE_ONETAB
21040 4c 45 5f 4f 4e 4c 59 3b 0a 20 20 20 20 66 6f 72  LE_ONLY;.    for
21050 28 69 69 3d 30 3b 20 69 69 3c 70 4f 72 57 63 2d  (ii=0; ii<pOrWc-
21060 3e 6e 54 65 72 6d 3b 20 69 69 2b 2b 29 7b 0a 20  >nTerm; ii++){. 
21070 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a       WhereTerm *
21080 70 4f 72 54 65 72 6d 20 3d 20 26 70 4f 72 57 63  pOrTerm = &pOrWc
21090 2d 3e 61 5b 69 69 5d 3b 0a 20 20 20 20 20 20 69  ->a[ii];.      i
210a0 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74  f( pOrTerm->left
210b0 43 75 72 73 6f 72 3d 3d 69 43 75 72 20 7c 7c 20  Cursor==iCur || 
210c0 28 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61  (pOrTerm->eOpera
210d0 74 6f 72 20 26 20 57 4f 5f 41 4e 44 29 21 3d 30  tor & WO_AND)!=0
210e0 20 29 7b 0a 20 20 20 20 20 20 20 20 57 68 65 72   ){.        Wher
210f0 65 49 6e 66 6f 20 2a 70 53 75 62 57 49 6e 66 6f  eInfo *pSubWInfo
21100 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ;           /* I
21110 6e 66 6f 20 66 6f 72 20 73 69 6e 67 6c 65 20 4f  nfo for single O
21120 52 2d 74 65 72 6d 20 73 63 61 6e 20 2a 2f 0a 20  R-term scan */. 
21130 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 4f 72         Expr *pOr
21140 45 78 70 72 20 3d 20 70 4f 72 54 65 72 6d 2d 3e  Expr = pOrTerm->
21150 70 45 78 70 72 3b 20 2f 2a 20 43 75 72 72 65 6e  pExpr; /* Curren
21160 74 20 4f 52 20 63 6c 61 75 73 65 20 74 65 72 6d  t OR clause term
21170 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
21180 6a 31 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  j1 = 0;         
21190 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
211a0 64 64 72 65 73 73 20 6f 66 20 6a 75 6d 70 20 6f  ddress of jump o
211b0 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  peration */.    
211c0 20 20 20 20 69 66 28 20 70 41 6e 64 45 78 70 72      if( pAndExpr
211d0 20 26 26 20 21 45 78 70 72 48 61 73 50 72 6f 70   && !ExprHasProp
211e0 65 72 74 79 28 70 4f 72 45 78 70 72 2c 20 45 50  erty(pOrExpr, EP
211f0 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20  _FromJoin) ){.  
21200 20 20 20 20 20 20 20 20 70 41 6e 64 45 78 70 72          pAndExpr
21210 2d 3e 70 4c 65 66 74 20 3d 20 70 4f 72 45 78 70  ->pLeft = pOrExp
21220 72 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 72  r;.          pOr
21230 45 78 70 72 20 3d 20 70 41 6e 64 45 78 70 72 3b  Expr = pAndExpr;
21240 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
21250 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75     /* Loop throu
21260 67 68 20 74 61 62 6c 65 20 65 6e 74 72 69 65 73  gh table entries
21270 20 74 68 61 74 20 6d 61 74 63 68 20 74 65 72 6d   that match term
21280 20 70 4f 72 54 65 72 6d 2e 20 2a 2f 0a 20 20 20   pOrTerm. */.   
21290 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28       WHERETRACE(
212a0 30 78 66 66 66 66 2c 20 28 22 53 75 62 70 6c 61  0xffff, ("Subpla
212b0 6e 20 66 6f 72 20 4f 52 2d 63 6c 61 75 73 65 3a  n for OR-clause:
212c0 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 20 20 70  \n"));.        p
212d0 53 75 62 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74  SubWInfo = sqlit
212e0 65 33 57 68 65 72 65 42 65 67 69 6e 28 70 50 61  e3WhereBegin(pPa
212f0 72 73 65 2c 20 70 4f 72 54 61 62 2c 20 70 4f 72  rse, pOrTab, pOr
21300 45 78 70 72 2c 20 30 2c 20 30 2c 0a 20 20 20 20  Expr, 0, 0,.    
21310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21330 20 20 77 63 74 72 6c 46 6c 61 67 73 2c 20 69 43    wctrlFlags, iC
21340 6f 76 43 75 72 29 3b 0a 20 20 20 20 20 20 20 20  ovCur);.        
21350 61 73 73 65 72 74 28 20 70 53 75 62 57 49 6e 66  assert( pSubWInf
21360 6f 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72  o || pParse->nEr
21370 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  r || db->mallocF
21380 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20  ailed );.       
21390 20 69 66 28 20 70 53 75 62 57 49 6e 66 6f 20 29   if( pSubWInfo )
213a0 7b 0a 20 20 20 20 20 20 20 20 20 20 57 68 65 72  {.          Wher
213b0 65 4c 6f 6f 70 20 2a 70 53 75 62 4c 6f 6f 70 3b  eLoop *pSubLoop;
213c0 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 61  .          int a
213d0 64 64 72 45 78 70 6c 61 69 6e 20 3d 20 65 78 70  ddrExplain = exp
213e0 6c 61 69 6e 4f 6e 65 53 63 61 6e 28 0a 20 20 20  lainOneScan(.   
213f0 20 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73             pPars
21400 65 2c 20 70 4f 72 54 61 62 2c 20 26 70 53 75 62  e, pOrTab, &pSub
21410 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2c 20 69 4c 65  WInfo->a[0], iLe
21420 76 65 6c 2c 20 70 4c 65 76 65 6c 2d 3e 69 46 72  vel, pLevel->iFr
21430 6f 6d 2c 20 30 0a 20 20 20 20 20 20 20 20 20 20  om, 0.          
21440 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 64 64  );.          add
21450 53 63 61 6e 53 74 61 74 75 73 28 76 2c 20 70 4f  ScanStatus(v, pO
21460 72 54 61 62 2c 20 26 70 53 75 62 57 49 6e 66 6f  rTab, &pSubWInfo
21470 2d 3e 61 5b 30 5d 2c 20 61 64 64 72 45 78 70 6c  ->a[0], addrExpl
21480 61 69 6e 29 3b 0a 0a 20 20 20 20 20 20 20 20 20  ain);..         
21490 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65 20   /* This is the 
214a0 73 75 62 2d 57 48 45 52 45 20 63 6c 61 75 73 65  sub-WHERE clause
214b0 20 62 6f 64 79 2e 20 20 46 69 72 73 74 20 73 6b   body.  First sk
214c0 69 70 20 6f 76 65 72 0a 20 20 20 20 20 20 20 20  ip over.        
214d0 20 20 2a 2a 20 64 75 70 6c 69 63 61 74 65 20 72    ** duplicate r
214e0 6f 77 73 20 66 72 6f 6d 20 70 72 69 6f 72 20 73  ows from prior s
214f0 75 62 2d 57 48 45 52 45 20 63 6c 61 75 73 65 73  ub-WHERE clauses
21500 2c 20 61 6e 64 20 72 65 63 6f 72 64 20 74 68 65  , and record the
21510 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72 6f  .          ** ro
21520 77 69 64 20 28 6f 72 20 50 52 49 4d 41 52 59 20  wid (or PRIMARY 
21530 4b 45 59 29 20 66 6f 72 20 74 68 65 20 63 75 72  KEY) for the cur
21540 72 65 6e 74 20 72 6f 77 20 73 6f 20 74 68 61 74  rent row so that
21550 20 74 68 65 20 73 61 6d 65 0a 20 20 20 20 20 20   the same.      
21560 20 20 20 20 2a 2a 20 72 6f 77 20 77 69 6c 6c 20      ** row will 
21570 62 65 20 73 6b 69 70 70 65 64 20 69 6e 20 73 75  be skipped in su
21580 62 73 65 71 75 65 6e 74 20 73 75 62 2d 57 48 45  bsequent sub-WHE
21590 52 45 20 63 6c 61 75 73 65 73 2e 0a 20 20 20 20  RE clauses..    
215a0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
215b0 20 20 20 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e     if( (pWInfo->
215c0 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
215d0 52 45 5f 44 55 50 4c 49 43 41 54 45 53 5f 4f 4b  RE_DUPLICATES_OK
215e0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
215f0 20 20 20 20 69 6e 74 20 72 3b 0a 20 20 20 20 20      int r;.     
21600 20 20 20 20 20 20 20 69 6e 74 20 69 53 65 74 20         int iSet 
21610 3d 20 28 28 69 69 3d 3d 70 4f 72 57 63 2d 3e 6e  = ((ii==pOrWc->n
21620 54 65 72 6d 2d 31 29 3f 2d 31 3a 69 69 29 3b 0a  Term-1)?-1:ii);.
21630 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
21640 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 29  HasRowid(pTab) )
21650 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
21660 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  r = sqlite3ExprC
21670 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28 70 50 61  odeGetColumn(pPa
21680 72 73 65 2c 20 70 54 61 62 2c 20 2d 31 2c 20 69  rse, pTab, -1, i
21690 43 75 72 2c 20 72 65 67 52 6f 77 69 64 2c 20 30  Cur, regRowid, 0
216a0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
216b0 20 6a 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62   j1 = sqlite3Vdb
216c0 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
216d0 5f 52 6f 77 53 65 74 54 65 73 74 2c 20 72 65 67  _RowSetTest, reg
216e0 52 6f 77 73 65 74 2c 20 30 2c 20 72 2c 69 53 65  Rowset, 0, r,iSe
216f0 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  t);.            
21700 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
21710 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
21720 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
21730 20 20 20 20 49 6e 64 65 78 20 2a 70 50 6b 20 3d      Index *pPk =
21740 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b   sqlite3PrimaryK
21750 65 79 49 6e 64 65 78 28 70 54 61 62 29 3b 0a 20  eyIndex(pTab);. 
21760 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74               int
21770 20 6e 50 6b 20 3d 20 70 50 6b 2d 3e 6e 4b 65 79   nPk = pPk->nKey
21780 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Col;.           
21790 20 20 20 69 6e 74 20 69 50 6b 3b 0a 0a 20 20 20     int iPk;..   
217a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
217b0 61 64 20 74 68 65 20 50 4b 20 69 6e 74 6f 20 61  ad the PK into a
217c0 6e 20 61 72 72 61 79 20 6f 66 20 74 65 6d 70 20  n array of temp 
217d0 72 65 67 69 73 74 65 72 73 2e 20 2a 2f 0a 20 20  registers. */.  
217e0 20 20 20 20 20 20 20 20 20 20 20 20 72 20 3d 20              r = 
217f0 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61  sqlite3GetTempRa
21800 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 50 6b 29  nge(pParse, nPk)
21810 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
21820 66 6f 72 28 69 50 6b 3d 30 3b 20 69 50 6b 3c 6e  for(iPk=0; iPk<n
21830 50 6b 3b 20 69 50 6b 2b 2b 29 7b 0a 20 20 20 20  Pk; iPk++){.    
21840 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
21850 69 43 6f 6c 20 3d 20 70 50 6b 2d 3e 61 69 43 6f  iCol = pPk->aiCo
21860 6c 75 6d 6e 5b 69 50 6b 5d 3b 0a 20 20 20 20 20  lumn[iPk];.     
21870 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
21880 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c  e3ExprCodeGetCol
21890 75 6d 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62  umn(pParse, pTab
218a0 2c 20 69 43 6f 6c 2c 20 69 43 75 72 2c 20 72 2b  , iCol, iCur, r+
218b0 69 50 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  iPk, 0);.       
218c0 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
218d0 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b          /* Check
218e0 20 69 66 20 74 68 65 20 74 65 6d 70 20 74 61 62   if the temp tab
218f0 6c 65 20 61 6c 72 65 61 64 79 20 63 6f 6e 74 61  le already conta
21900 69 6e 73 20 74 68 69 73 20 6b 65 79 2e 20 49 66  ins this key. If
21910 20 73 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20   so,.           
21920 20 20 20 2a 2a 20 74 68 65 20 72 6f 77 20 68 61     ** the row ha
21930 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 69  s already been i
21940 6e 63 6c 75 64 65 64 20 69 6e 20 74 68 65 20 72  ncluded in the r
21950 65 73 75 6c 74 20 73 65 74 20 61 6e 64 0a 20 20  esult set and.  
21960 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63              ** c
21970 61 6e 20 62 65 20 69 67 6e 6f 72 65 64 20 28 62  an be ignored (b
21980 79 20 6a 75 6d 70 69 6e 67 20 70 61 73 74 20 74  y jumping past t
21990 68 65 20 47 6f 73 75 62 20 62 65 6c 6f 77 29 2e  he Gosub below).
219a0 20 4f 74 68 65 72 77 69 73 65 2c 0a 20 20 20 20   Otherwise,.    
219b0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 73            ** ins
219c0 65 72 74 20 74 68 65 20 6b 65 79 20 69 6e 74 6f  ert the key into
219d0 20 74 68 65 20 74 65 6d 70 20 74 61 62 6c 65 20   the temp table 
219e0 61 6e 64 20 70 72 6f 63 65 65 64 20 77 69 74 68  and proceed with
219f0 20 70 72 6f 63 65 73 73 69 6e 67 0a 20 20 20 20   processing.    
21a00 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65            ** the
21a10 20 72 6f 77 2e 0a 20 20 20 20 20 20 20 20 20 20   row..          
21a20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 20      **.         
21a30 20 20 20 20 20 2a 2a 20 55 73 65 20 73 6f 6d 65       ** Use some
21a40 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6f 70 74   of the same opt
21a50 69 6d 69 7a 61 74 69 6f 6e 73 20 61 73 20 4f 50  imizations as OP
21a60 5f 52 6f 77 53 65 74 54 65 73 74 3a 20 49 66 20  _RowSetTest: If 
21a70 69 53 65 74 0a 20 20 20 20 20 20 20 20 20 20 20  iSet.           
21a80 20 20 20 2a 2a 20 69 73 20 7a 65 72 6f 2c 20 61     ** is zero, a
21a90 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 20 6b  ssume that the k
21aa0 65 79 20 63 61 6e 6e 6f 74 20 61 6c 72 65 61 64  ey cannot alread
21ab0 79 20 62 65 20 70 72 65 73 65 6e 74 20 69 6e 0a  y be present in.
21ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
21ad0 20 74 68 65 20 74 65 6d 70 20 74 61 62 6c 65 2e   the temp table.
21ae0 20 41 6e 64 20 69 66 20 69 53 65 74 20 69 73 20   And if iSet is 
21af0 2d 31 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20  -1, assume that 
21b00 74 68 65 72 65 20 69 73 20 6e 6f 20 0a 20 20 20  there is no .   
21b10 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6e 65             ** ne
21b20 65 64 20 74 6f 20 69 6e 73 65 72 74 20 74 68 65  ed to insert the
21b30 20 6b 65 79 20 69 6e 74 6f 20 74 68 65 20 74 65   key into the te
21b40 6d 70 20 74 61 62 6c 65 2c 20 61 73 20 69 74 20  mp table, as it 
21b50 77 69 6c 6c 20 6e 65 76 65 72 20 0a 20 20 20 20  will never .    
21b60 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 65 20            ** be 
21b70 74 65 73 74 65 64 20 66 6f 72 2e 20 20 2a 2f 20  tested for.  */ 
21b80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
21b90 66 28 20 69 53 65 74 20 29 7b 0a 20 20 20 20 20  f( iSet ){.     
21ba0 20 20 20 20 20 20 20 20 20 20 20 6a 31 20 3d 20             j1 = 
21bb0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
21bc0 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64  4Int(v, OP_Found
21bd0 2c 20 72 65 67 52 6f 77 73 65 74 2c 20 30 2c 20  , regRowset, 0, 
21be0 72 2c 20 6e 50 6b 29 3b 0a 20 20 20 20 20 20 20  r, nPk);.       
21bf0 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76           VdbeCov
21c00 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
21c10 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
21c20 20 20 20 20 20 20 20 20 69 66 28 20 69 53 65 74          if( iSet
21c30 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  >=0 ){.         
21c40 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
21c50 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d  beAddOp3(v, OP_M
21c60 61 6b 65 52 65 63 6f 72 64 2c 20 72 2c 20 6e 50  akeRecord, r, nP
21c70 6b 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20  k, regRowid);.  
21c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
21c90 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
21ca0 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c  v, OP_IdxInsert,
21cb0 20 72 65 67 52 6f 77 73 65 74 2c 20 72 65 67 52   regRowset, regR
21cc0 6f 77 69 64 2c 20 30 29 3b 0a 20 20 20 20 20 20  owid, 0);.      
21cd0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 53            if( iS
21ce0 65 74 20 29 20 73 71 6c 69 74 65 33 56 64 62 65  et ) sqlite3Vdbe
21cf0 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
21d00 41 47 5f 55 53 45 53 45 45 4b 52 45 53 55 4c 54  AG_USESEEKRESULT
21d10 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
21d20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
21d30 20 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65    /* Release the
21d40 20 61 72 72 61 79 20 6f 66 20 74 65 6d 70 20 72   array of temp r
21d50 65 67 69 73 74 65 72 73 20 2a 2f 0a 20 20 20 20  egisters */.    
21d60 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
21d70 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67  3ReleaseTempRang
21d80 65 28 70 50 61 72 73 65 2c 20 72 2c 20 6e 50 6b  e(pParse, r, nPk
21d90 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
21da0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  .          }..  
21db0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 76 6f 6b          /* Invok
21dc0 65 20 74 68 65 20 6d 61 69 6e 20 6c 6f 6f 70 20  e the main loop 
21dd0 62 6f 64 79 20 61 73 20 61 20 73 75 62 72 6f 75  body as a subrou
21de0 74 69 6e 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  tine */.        
21df0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
21e00 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
21e10 20 72 65 67 52 65 74 75 72 6e 2c 20 69 4c 6f 6f   regReturn, iLoo
21e20 70 42 6f 64 79 29 3b 0a 0a 20 20 20 20 20 20 20  pBody);..       
21e30 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
21e40 28 73 6b 69 70 70 69 6e 67 20 74 68 65 20 6d 61  (skipping the ma
21e50 69 6e 20 6c 6f 6f 70 20 62 6f 64 79 20 73 75 62  in loop body sub
21e60 72 6f 75 74 69 6e 65 29 20 69 66 20 74 68 65 0a  routine) if the.
21e70 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 75 72            ** cur
21e80 72 65 6e 74 20 73 75 62 2d 57 48 45 52 45 20 72  rent sub-WHERE r
21e90 6f 77 20 69 73 20 61 20 64 75 70 6c 69 63 61 74  ow is a duplicat
21ea0 65 20 66 72 6f 6d 20 70 72 69 6f 72 20 73 75 62  e from prior sub
21eb0 2d 57 48 45 52 45 73 2e 20 2a 2f 0a 20 20 20 20  -WHEREs. */.    
21ec0 20 20 20 20 20 20 69 66 28 20 6a 31 20 29 20 73        if( j1 ) s
21ed0 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
21ee0 72 65 28 76 2c 20 6a 31 29 3b 0a 0a 20 20 20 20  re(v, j1);..    
21ef0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 53 75        /* The pSu
21f00 62 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64  bWInfo->untested
21f10 54 65 72 6d 73 20 66 6c 61 67 20 6d 65 61 6e 73  Terms flag means
21f20 20 74 68 61 74 20 74 68 69 73 20 4f 52 20 74 65   that this OR te
21f30 72 6d 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  rm.          ** 
21f40 63 6f 6e 74 61 69 6e 65 64 20 6f 6e 65 20 6f 72  contained one or
21f50 20 6d 6f 72 65 20 41 4e 44 20 74 65 72 6d 20 66   more AND term f
21f60 72 6f 6d 20 61 20 6e 6f 74 52 65 61 64 79 20 74  rom a notReady t
21f70 61 62 6c 65 2e 20 20 54 68 65 0a 20 20 20 20 20  able.  The.     
21f80 20 20 20 20 20 2a 2a 20 74 65 72 6d 73 20 66 72       ** terms fr
21f90 6f 6d 20 74 68 65 20 6e 6f 74 52 65 61 64 79 20  om the notReady 
21fa0 74 61 62 6c 65 20 63 6f 75 6c 64 20 6e 6f 74 20  table could not 
21fb0 62 65 20 74 65 73 74 65 64 20 61 6e 64 20 77 69  be tested and wi
21fc0 6c 6c 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ll.          ** 
21fd0 6e 65 65 64 20 74 6f 20 62 65 20 74 65 73 74 65  need to be teste
21fe0 64 20 6c 61 74 65 72 2e 0a 20 20 20 20 20 20 20  d later..       
21ff0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
22000 69 66 28 20 70 53 75 62 57 49 6e 66 6f 2d 3e 75  if( pSubWInfo->u
22010 6e 74 65 73 74 65 64 54 65 72 6d 73 20 29 20 75  ntestedTerms ) u
22020 6e 74 65 73 74 65 64 54 65 72 6d 73 20 3d 20 31  ntestedTerms = 1
22030 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;..          /* 
22040 49 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 4f 52  If all of the OR
22050 2d 63 6f 6e 6e 65 63 74 65 64 20 74 65 72 6d 73  -connected terms
22060 20 61 72 65 20 6f 70 74 69 6d 69 7a 65 64 20 75   are optimized u
22070 73 69 6e 67 20 74 68 65 20 73 61 6d 65 0a 20 20  sing the same.  
22080 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 64 65 78          ** index
22090 2c 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20  , and the index 
220a0 69 73 20 6f 70 65 6e 65 64 20 75 73 69 6e 67 20  is opened using 
220b0 74 68 65 20 73 61 6d 65 20 63 75 72 73 6f 72 20  the same cursor 
220c0 6e 75 6d 62 65 72 0a 20 20 20 20 20 20 20 20 20  number.         
220d0 20 2a 2a 20 62 79 20 65 61 63 68 20 63 61 6c 6c   ** by each call
220e0 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65   to sqlite3Where
220f0 42 65 67 69 6e 28 29 20 6d 61 64 65 20 62 79 20  Begin() made by 
22100 74 68 69 73 20 6c 6f 6f 70 2c 20 69 74 20 6d 61  this loop, it ma
22110 79 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62  y.          ** b
22120 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 75 73  e possible to us
22130 65 20 74 68 61 74 20 69 6e 64 65 78 20 61 73 20  e that index as 
22140 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78  a covering index
22150 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 0a 20  ..          **. 
22160 20 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20 74           ** If t
22170 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  he call to sqlit
22180 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 61  e3WhereBegin() a
22190 62 6f 76 65 20 72 65 73 75 6c 74 65 64 20 69 6e  bove resulted in
221a0 20 61 20 73 63 61 6e 20 74 68 61 74 0a 20 20 20   a scan that.   
221b0 20 20 20 20 20 20 20 2a 2a 20 75 73 65 73 20 61         ** uses a
221c0 6e 20 69 6e 64 65 78 2c 20 61 6e 64 20 74 68 69  n index, and thi
221d0 73 20 69 73 20 65 69 74 68 65 72 20 74 68 65 20  s is either the 
221e0 66 69 72 73 74 20 4f 52 2d 63 6f 6e 6e 65 63 74  first OR-connect
221f0 65 64 20 74 65 72 6d 0a 20 20 20 20 20 20 20 20  ed term.        
22200 20 20 2a 2a 20 70 72 6f 63 65 73 73 65 64 20 6f    ** processed o
22210 72 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 74  r the index is t
22220 68 65 20 73 61 6d 65 20 61 73 20 74 68 61 74 20  he same as that 
22230 75 73 65 64 20 62 79 20 61 6c 6c 20 70 72 65 76  used by all prev
22240 69 6f 75 73 0a 20 20 20 20 20 20 20 20 20 20 2a  ious.          *
22250 2a 20 74 65 72 6d 73 2c 20 73 65 74 20 70 43 6f  * terms, set pCo
22260 76 20 74 6f 20 74 68 65 20 63 61 6e 64 69 64 61  v to the candida
22270 74 65 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65  te covering inde
22280 78 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 73 65  x. Otherwise, se
22290 74 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  t .          ** 
222a0 70 43 6f 76 20 74 6f 20 4e 55 4c 4c 20 74 6f 20  pCov to NULL to 
222b0 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 6e 6f  indicate that no
222c0 20 63 61 6e 64 69 64 61 74 65 20 63 6f 76 65 72   candidate cover
222d0 69 6e 67 20 69 6e 64 65 78 20 77 69 6c 6c 20 0a  ing index will .
222e0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 65 20            ** be 
222f0 61 76 61 69 6c 61 62 6c 65 2e 0a 20 20 20 20 20  available..     
22300 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
22310 20 20 70 53 75 62 4c 6f 6f 70 20 3d 20 70 53 75    pSubLoop = pSu
22320 62 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70 57 4c  bWInfo->a[0].pWL
22330 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20 20 20 61  oop;.          a
22340 73 73 65 72 74 28 20 28 70 53 75 62 4c 6f 6f 70  ssert( (pSubLoop
22350 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
22360 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 3d 3d 30  E_AUTO_INDEX)==0
22370 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   );.          if
22380 28 20 28 70 53 75 62 4c 6f 6f 70 2d 3e 77 73 46  ( (pSubLoop->wsF
22390 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44  lags & WHERE_IND
223a0 45 58 45 44 29 21 3d 30 0a 20 20 20 20 20 20 20  EXED)!=0.       
223b0 20 20 20 20 26 26 20 28 69 69 3d 3d 30 20 7c 7c      && (ii==0 ||
223c0 20 70 53 75 62 4c 6f 6f 70 2d 3e 75 2e 62 74 72   pSubLoop->u.btr
223d0 65 65 2e 70 49 6e 64 65 78 3d 3d 70 43 6f 76 29  ee.pIndex==pCov)
223e0 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28  .           && (
223f0 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 7c  HasRowid(pTab) |
22400 7c 20 21 49 73 50 72 69 6d 61 72 79 4b 65 79 49  | !IsPrimaryKeyI
22410 6e 64 65 78 28 70 53 75 62 4c 6f 6f 70 2d 3e 75  ndex(pSubLoop->u
22420 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 29 29 0a  .btree.pIndex)).
22430 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20            ){.   
22440 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
22450 20 70 53 75 62 57 49 6e 66 6f 2d 3e 61 5b 30 5d   pSubWInfo->a[0]
22460 2e 69 49 64 78 43 75 72 3d 3d 69 43 6f 76 43 75  .iIdxCur==iCovCu
22470 72 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  r );.           
22480 20 70 43 6f 76 20 3d 20 70 53 75 62 4c 6f 6f 70   pCov = pSubLoop
22490 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
224a0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 77 63  ;.            wc
224b0 74 72 6c 46 6c 61 67 73 20 7c 3d 20 57 48 45 52  trlFlags |= WHER
224c0 45 5f 52 45 4f 50 45 4e 5f 49 44 58 3b 0a 20 20  E_REOPEN_IDX;.  
224d0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
224e0 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 76 20             pCov 
224f0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 0;.          }
22500 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  ..          /* F
22510 69 6e 69 73 68 20 74 68 65 20 6c 6f 6f 70 20 74  inish the loop t
22520 68 72 6f 75 67 68 20 74 61 62 6c 65 20 65 6e 74  hrough table ent
22530 72 69 65 73 20 74 68 61 74 20 6d 61 74 63 68 20  ries that match 
22540 74 65 72 6d 20 70 4f 72 54 65 72 6d 2e 20 2a 2f  term pOrTerm. */
22550 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
22560 65 33 57 68 65 72 65 45 6e 64 28 70 53 75 62 57  e3WhereEnd(pSubW
22570 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 7d  Info);.        }
22580 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
22590 20 20 20 70 4c 65 76 65 6c 2d 3e 75 2e 70 43 6f     pLevel->u.pCo
225a0 76 69 64 78 20 3d 20 70 43 6f 76 3b 0a 20 20 20  vidx = pCov;.   
225b0 20 69 66 28 20 70 43 6f 76 20 29 20 70 4c 65 76   if( pCov ) pLev
225c0 65 6c 2d 3e 69 49 64 78 43 75 72 20 3d 20 69 43  el->iIdxCur = iC
225d0 6f 76 43 75 72 3b 0a 20 20 20 20 69 66 28 20 70  ovCur;.    if( p
225e0 41 6e 64 45 78 70 72 20 29 7b 0a 20 20 20 20 20  AndExpr ){.     
225f0 20 70 41 6e 64 45 78 70 72 2d 3e 70 4c 65 66 74   pAndExpr->pLeft
22600 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69   = 0;.      sqli
22610 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
22620 2c 20 70 41 6e 64 45 78 70 72 29 3b 0a 20 20 20  , pAndExpr);.   
22630 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64   }.    sqlite3Vd
22640 62 65 43 68 61 6e 67 65 50 31 28 76 2c 20 69 52  beChangeP1(v, iR
22650 65 74 49 6e 69 74 2c 20 73 71 6c 69 74 65 33 56  etInit, sqlite3V
22660 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
22670 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  ));.    sqlite3V
22680 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
22690 47 6f 74 6f 2c 20 30 2c 20 70 4c 65 76 65 6c 2d  Goto, 0, pLevel-
226a0 3e 61 64 64 72 42 72 6b 29 3b 0a 20 20 20 20 73  >addrBrk);.    s
226b0 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
226c0 65 4c 61 62 65 6c 28 76 2c 20 69 4c 6f 6f 70 42  eLabel(v, iLoopB
226d0 6f 64 79 29 3b 0a 0a 20 20 20 20 69 66 28 20 70  ody);..    if( p
226e0 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3e 31 20  WInfo->nLevel>1 
226f0 29 20 73 71 6c 69 74 65 33 53 74 61 63 6b 46 72  ) sqlite3StackFr
22700 65 65 28 64 62 2c 20 70 4f 72 54 61 62 29 3b 0a  ee(db, pOrTab);.
22710 20 20 20 20 69 66 28 20 21 75 6e 74 65 73 74 65      if( !unteste
22720 64 54 65 72 6d 73 20 29 20 64 69 73 61 62 6c 65  dTerms ) disable
22730 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 54 65  Term(pLevel, pTe
22740 72 6d 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e  rm);.  }else.#en
22750 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
22760 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49  IT_OR_OPTIMIZATI
22770 4f 4e 20 2a 2f 0a 0a 20 20 7b 0a 20 20 20 20 2f  ON */..  {.    /
22780 2a 20 43 61 73 65 20 36 3a 20 20 54 68 65 72 65  * Case 6:  There
22790 20 69 73 20 6e 6f 20 75 73 61 62 6c 65 20 69 6e   is no usable in
227a0 64 65 78 2e 20 20 57 65 20 6d 75 73 74 20 64 6f  dex.  We must do
227b0 20 61 20 63 6f 6d 70 6c 65 74 65 0a 20 20 20 20   a complete.    
227c0 2a 2a 20 20 20 20 20 20 20 20 20 20 73 63 61 6e  **          scan
227d0 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20 74   of the entire t
227e0 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  able..    */.   
227f0 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38   static const u8
22800 20 61 53 74 65 70 5b 5d 20 3d 20 7b 20 4f 50 5f   aStep[] = { OP_
22810 4e 65 78 74 2c 20 4f 50 5f 50 72 65 76 20 7d 3b  Next, OP_Prev };
22820 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73  .    static cons
22830 74 20 75 38 20 61 53 74 61 72 74 5b 5d 20 3d 20  t u8 aStart[] = 
22840 7b 20 4f 50 5f 52 65 77 69 6e 64 2c 20 4f 50 5f  { OP_Rewind, OP_
22850 4c 61 73 74 20 7d 3b 0a 20 20 20 20 61 73 73 65  Last };.    asse
22860 72 74 28 20 62 52 65 76 3d 3d 30 20 7c 7c 20 62  rt( bRev==0 || b
22870 52 65 76 3d 3d 31 20 29 3b 0a 20 20 20 20 69 66  Rev==1 );.    if
22880 28 20 70 54 61 62 49 74 65 6d 2d 3e 69 73 52 65  ( pTabItem->isRe
22890 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20 20  cursive ){.     
228a0 20 2f 2a 20 54 61 62 6c 65 73 20 6d 61 72 6b 65   /* Tables marke
228b0 64 20 69 73 52 65 63 75 72 73 69 76 65 20 68 61  d isRecursive ha
228c0 76 65 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65  ve only a single
228d0 20 72 6f 77 20 74 68 61 74 20 69 73 20 73 74 6f   row that is sto
228e0 72 65 64 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20  red in.      ** 
228f0 61 20 70 73 65 75 64 6f 2d 63 75 72 73 6f 72 2e  a pseudo-cursor.
22900 20 20 4e 6f 20 6e 65 65 64 20 74 6f 20 52 65 77    No need to Rew
22910 69 6e 64 20 6f 72 20 4e 65 78 74 20 73 75 63 68  ind or Next such
22920 20 63 75 72 73 6f 72 73 2e 20 2a 2f 0a 20 20 20   cursors. */.   
22930 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20     pLevel->op = 
22940 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 7d 65 6c  OP_Noop;.    }el
22950 73 65 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c  se{.      pLevel
22960 2d 3e 6f 70 20 3d 20 61 53 74 65 70 5b 62 52 65  ->op = aStep[bRe
22970 76 5d 3b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c  v];.      pLevel
22980 2d 3e 70 31 20 3d 20 69 43 75 72 3b 0a 20 20 20  ->p1 = iCur;.   
22990 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20     pLevel->p2 = 
229a0 31 20 2b 20 73 71 6c 69 74 65 33 56 64 62 65 41  1 + sqlite3VdbeA
229b0 64 64 4f 70 32 28 76 2c 20 61 53 74 61 72 74 5b  ddOp2(v, aStart[
229c0 62 52 65 76 5d 2c 20 69 43 75 72 2c 20 61 64 64  bRev], iCur, add
229d0 72 42 72 6b 29 3b 0a 20 20 20 20 20 20 56 64 62  rBrk);.      Vdb
229e0 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 62  eCoverageIf(v, b
229f0 52 65 76 3d 3d 30 29 3b 0a 20 20 20 20 20 20 56  Rev==0);.      V
22a00 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
22a10 20 62 52 65 76 21 3d 30 29 3b 0a 20 20 20 20 20   bRev!=0);.     
22a20 20 70 4c 65 76 65 6c 2d 3e 70 35 20 3d 20 53 51   pLevel->p5 = SQ
22a30 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f  LITE_STMTSTATUS_
22a40 46 55 4c 4c 53 43 41 4e 5f 53 54 45 50 3b 0a 20  FULLSCAN_STEP;. 
22a50 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 64 65 66     }.  }..#ifdef
22a60 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
22a70 54 4d 54 5f 53 43 41 4e 53 54 41 54 55 53 0a 20  TMT_SCANSTATUS. 
22a80 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 56 69 73   pLevel->addrVis
22a90 69 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  it = sqlite3Vdbe
22aa0 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
22ab0 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 6e 73  #endif..  /* Ins
22ac0 65 72 74 20 63 6f 64 65 20 74 6f 20 74 65 73 74  ert code to test
22ad0 20 65 76 65 72 79 20 73 75 62 65 78 70 72 65 73   every subexpres
22ae0 73 69 6f 6e 20 74 68 61 74 20 63 61 6e 20 62 65  sion that can be
22af0 20 63 6f 6d 70 6c 65 74 65 6c 79 0a 20 20 2a 2a   completely.  **
22b00 20 63 6f 6d 70 75 74 65 64 20 75 73 69 6e 67 20   computed using 
22b10 74 68 65 20 63 75 72 72 65 6e 74 20 73 65 74 20  the current set 
22b20 6f 66 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a  of tables..  */.
22b30 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d    for(pTerm=pWC-
22b40 3e 61 2c 20 6a 3d 70 57 43 2d 3e 6e 54 65 72 6d  >a, j=pWC->nTerm
22b50 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c 20 70 54 65 72  ; j>0; j--, pTer
22b60 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  m++){.    Expr *
22b70 70 45 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  pE;.    testcase
22b80 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  ( pTerm->wtFlags
22b90 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20   & TERM_VIRTUAL 
22ba0 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
22bb0 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
22bc0 26 20 54 45 52 4d 5f 43 4f 44 45 44 20 29 3b 0a  & TERM_CODED );.
22bd0 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77      if( pTerm->w
22be0 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 56  tFlags & (TERM_V
22bf0 49 52 54 55 41 4c 7c 54 45 52 4d 5f 43 4f 44 45  IRTUAL|TERM_CODE
22c00 44 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  D) ) continue;. 
22c10 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70     if( (pTerm->p
22c20 72 65 72 65 71 41 6c 6c 20 26 20 70 4c 65 76 65  rereqAll & pLeve
22c30 6c 2d 3e 6e 6f 74 52 65 61 64 79 29 21 3d 30 20  l->notReady)!=0 
22c40 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  ){.      testcas
22c50 65 28 20 70 57 49 6e 66 6f 2d 3e 75 6e 74 65 73  e( pWInfo->untes
22c60 74 65 64 54 65 72 6d 73 3d 3d 30 0a 20 20 20 20  tedTerms==0.    
22c70 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28 70             && (p
22c80 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67  WInfo->wctrlFlag
22c90 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 54 41 42  s & WHERE_ONETAB
22ca0 4c 45 5f 4f 4e 4c 59 29 21 3d 30 20 29 3b 0a 20  LE_ONLY)!=0 );. 
22cb0 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 75 6e 74       pWInfo->unt
22cc0 65 73 74 65 64 54 65 72 6d 73 20 3d 20 31 3b 0a  estedTerms = 1;.
22cd0 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
22ce0 20 20 20 20 7d 0a 20 20 20 20 70 45 20 3d 20 70      }.    pE = p
22cf0 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Term->pExpr;.   
22d00 20 61 73 73 65 72 74 28 20 70 45 21 3d 30 20 29   assert( pE!=0 )
22d10 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c  ;.    if( pLevel
22d20 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 26 26 20 21  ->iLeftJoin && !
22d30 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
22d40 70 45 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  pE, EP_FromJoin)
22d50 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e   ){.      contin
22d60 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  ue;.    }.    sq
22d70 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
22d80 28 70 50 61 72 73 65 2c 20 70 45 2c 20 61 64 64  (pParse, pE, add
22d90 72 43 6f 6e 74 2c 20 53 51 4c 49 54 45 5f 4a 55  rCont, SQLITE_JU
22da0 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 70  MPIFNULL);.    p
22db0 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d  Term->wtFlags |=
22dc0 20 54 45 52 4d 5f 43 4f 44 45 44 3b 0a 20 20 7d   TERM_CODED;.  }
22dd0 0a 0a 20 20 2f 2a 20 49 6e 73 65 72 74 20 63 6f  ..  /* Insert co
22de0 64 65 20 74 6f 20 74 65 73 74 20 66 6f 72 20 69  de to test for i
22df0 6d 70 6c 69 65 64 20 63 6f 6e 73 74 72 61 69 6e  mplied constrain
22e00 74 73 20 62 61 73 65 64 20 6f 6e 20 74 72 61 6e  ts based on tran
22e10 73 69 74 69 76 69 74 79 0a 20 20 2a 2a 20 6f 66  sitivity.  ** of
22e20 20 74 68 65 20 22 3d 3d 22 20 6f 70 65 72 61 74   the "==" operat
22e30 6f 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78  or..  **.  ** Ex
22e40 61 6d 70 6c 65 3a 20 49 66 20 74 68 65 20 57 48  ample: If the WH
22e50 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 74 61  ERE clause conta
22e60 69 6e 73 20 22 74 31 2e 61 3d 74 32 2e 62 22 20  ins "t1.a=t2.b" 
22e70 61 6e 64 20 22 74 32 2e 62 3d 31 32 33 22 0a 20  and "t2.b=123". 
22e80 20 2a 2a 20 61 6e 64 20 77 65 20 61 72 65 20 63   ** and we are c
22e90 6f 64 69 6e 67 20 74 68 65 20 74 31 20 6c 6f 6f  oding the t1 loo
22ea0 70 20 61 6e 64 20 74 68 65 20 74 32 20 6c 6f 6f  p and the t2 loo
22eb0 70 20 68 61 73 20 6e 6f 74 20 79 65 74 20 63 6f  p has not yet co
22ec0 64 65 64 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 77  ded,.  ** then w
22ed0 65 20 63 61 6e 6e 6f 74 20 75 73 65 20 74 68 65  e cannot use the
22ee0 20 22 74 31 2e 61 3d 74 32 2e 62 22 20 63 6f 6e   "t1.a=t2.b" con
22ef0 73 74 72 61 69 6e 74 2c 20 62 75 74 20 77 65 20  straint, but we 
22f00 63 61 6e 20 63 6f 64 65 0a 20 20 2a 2a 20 74 68  can code.  ** th
22f10 65 20 69 6d 70 6c 69 65 64 20 22 74 31 2e 61 3d  e implied "t1.a=
22f20 31 32 33 22 20 63 6f 6e 73 74 72 61 69 6e 74 2e  123" constraint.
22f30 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 54 65 72  .  */.  for(pTer
22f40 6d 3d 70 57 43 2d 3e 61 2c 20 6a 3d 70 57 43 2d  m=pWC->a, j=pWC-
22f50 3e 6e 54 65 72 6d 3b 20 6a 3e 30 3b 20 6a 2d 2d  >nTerm; j>0; j--
22f60 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  , pTerm++){.    
22f70 45 78 70 72 20 2a 70 45 2c 20 2a 70 45 41 6c 74  Expr *pE, *pEAlt
22f80 3b 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20  ;.    WhereTerm 
22f90 2a 70 41 6c 74 3b 0a 20 20 20 20 69 66 28 20 70  *pAlt;.    if( p
22fa0 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
22fb0 28 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45  (TERM_VIRTUAL|TE
22fc0 52 4d 5f 43 4f 44 45 44 29 20 29 20 63 6f 6e 74  RM_CODED) ) cont
22fd0 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 54  inue;.    if( pT
22fe0 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 21 3d  erm->eOperator!=
22ff0 28 57 4f 5f 45 51 55 49 56 7c 57 4f 5f 45 51 29  (WO_EQUIV|WO_EQ)
23000 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
23010 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74   if( pTerm->left
23020 43 75 72 73 6f 72 21 3d 69 43 75 72 20 29 20 63  Cursor!=iCur ) c
23030 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
23040 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f   pLevel->iLeftJo
23050 69 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  in ) continue;. 
23060 20 20 20 70 45 20 3d 20 70 54 65 72 6d 2d 3e 70     pE = pTerm->p
23070 45 78 70 72 3b 0a 20 20 20 20 61 73 73 65 72 74  Expr;.    assert
23080 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
23090 74 79 28 70 45 2c 20 45 50 5f 46 72 6f 6d 4a 6f  ty(pE, EP_FromJo
230a0 69 6e 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72  in) );.    asser
230b0 74 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65  t( (pTerm->prere
230c0 71 52 69 67 68 74 20 26 20 70 4c 65 76 65 6c 2d  qRight & pLevel-
230d0 3e 6e 6f 74 52 65 61 64 79 29 21 3d 30 20 29 3b  >notReady)!=0 );
230e0 0a 20 20 20 20 70 41 6c 74 20 3d 20 66 69 6e 64  .    pAlt = find
230f0 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20  Term(pWC, iCur, 
23100 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c  pTerm->u.leftCol
23110 75 6d 6e 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57  umn, notReady, W
23120 4f 5f 45 51 7c 57 4f 5f 49 4e 2c 20 30 29 3b 0a  O_EQ|WO_IN, 0);.
23130 20 20 20 20 69 66 28 20 70 41 6c 74 3d 3d 30 20      if( pAlt==0 
23140 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
23150 69 66 28 20 70 41 6c 74 2d 3e 77 74 46 6c 61 67  if( pAlt->wtFlag
23160 73 20 26 20 28 54 45 52 4d 5f 43 4f 44 45 44 29  s & (TERM_CODED)
23170 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
23180 20 74 65 73 74 63 61 73 65 28 20 70 41 6c 74 2d   testcase( pAlt-
23190 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
231a0 45 51 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  EQ );.    testca
231b0 73 65 28 20 70 41 6c 74 2d 3e 65 4f 70 65 72 61  se( pAlt->eOpera
231c0 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20  tor & WO_IN );. 
231d0 20 20 20 56 64 62 65 4d 6f 64 75 6c 65 43 6f 6d     VdbeModuleCom
231e0 6d 65 6e 74 28 28 76 2c 20 22 62 65 67 69 6e 20  ment((v, "begin 
231f0 74 72 61 6e 73 69 74 69 76 65 20 63 6f 6e 73 74  transitive const
23200 72 61 69 6e 74 22 29 29 3b 0a 20 20 20 20 70 45  raint"));.    pE
23210 41 6c 74 20 3d 20 73 71 6c 69 74 65 33 53 74 61  Alt = sqlite3Sta
23220 63 6b 41 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73  ckAllocRaw(db, s
23230 69 7a 65 6f 66 28 2a 70 45 41 6c 74 29 29 3b 0a  izeof(*pEAlt));.
23240 20 20 20 20 69 66 28 20 70 45 41 6c 74 20 29 7b      if( pEAlt ){
23250 0a 20 20 20 20 20 20 2a 70 45 41 6c 74 20 3d 20  .      *pEAlt = 
23260 2a 70 41 6c 74 2d 3e 70 45 78 70 72 3b 0a 20 20  *pAlt->pExpr;.  
23270 20 20 20 20 70 45 41 6c 74 2d 3e 70 4c 65 66 74      pEAlt->pLeft
23280 20 3d 20 70 45 2d 3e 70 4c 65 66 74 3b 0a 20 20   = pE->pLeft;.  
23290 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
232a0 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
232b0 45 41 6c 74 2c 20 61 64 64 72 43 6f 6e 74 2c 20  EAlt, addrCont, 
232c0 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
232d0 4c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  L);.      sqlite
232e0 33 53 74 61 63 6b 46 72 65 65 28 64 62 2c 20 70  3StackFree(db, p
232f0 45 41 6c 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  EAlt);.    }.  }
23300 0a 0a 20 20 2f 2a 20 46 6f 72 20 61 20 4c 45 46  ..  /* For a LEF
23310 54 20 4f 55 54 45 52 20 4a 4f 49 4e 2c 20 67 65  T OUTER JOIN, ge
23320 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
23330 20 77 69 6c 6c 20 72 65 63 6f 72 64 20 74 68 65   will record the
23340 20 66 61 63 74 20 74 68 61 74 0a 20 20 2a 2a 20   fact that.  ** 
23350 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 72 6f 77  at least one row
23360 20 6f 66 20 74 68 65 20 72 69 67 68 74 20 74 61   of the right ta
23370 62 6c 65 20 68 61 73 20 6d 61 74 63 68 65 64 20  ble has matched 
23380 74 68 65 20 6c 65 66 74 20 74 61 62 6c 65 2e 20  the left table. 
23390 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c 65   .  */.  if( pLe
233a0 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 29  vel->iLeftJoin )
233b0 7b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 61 64  {.    pLevel->ad
233c0 64 72 46 69 72 73 74 20 3d 20 73 71 6c 69 74 65  drFirst = sqlite
233d0 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
233e0 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (v);.    sqlite3
233f0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
23400 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 70 4c 65  _Integer, 1, pLe
23410 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b  vel->iLeftJoin);
23420 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  .    VdbeComment
23430 28 28 76 2c 20 22 72 65 63 6f 72 64 20 4c 45 46  ((v, "record LEF
23440 54 20 4a 4f 49 4e 20 68 69 74 22 29 29 3b 0a 20  T JOIN hit"));. 
23450 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
23460 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29  cheClear(pParse)
23470 3b 0a 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d  ;.    for(pTerm=
23480 70 57 43 2d 3e 61 2c 20 6a 3d 30 3b 20 6a 3c 70  pWC->a, j=0; j<p
23490 57 43 2d 3e 6e 54 65 72 6d 3b 20 6a 2b 2b 2c 20  WC->nTerm; j++, 
234a0 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pTerm++){.      
234b0 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
234c0 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
234d0 56 49 52 54 55 41 4c 20 29 3b 0a 20 20 20 20 20  VIRTUAL );.     
234e0 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
234f0 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
23500 5f 43 4f 44 45 44 20 29 3b 0a 20 20 20 20 20 20  _CODED );.      
23510 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61  if( pTerm->wtFla
23520 67 73 20 26 20 28 54 45 52 4d 5f 56 49 52 54 55  gs & (TERM_VIRTU
23530 41 4c 7c 54 45 52 4d 5f 43 4f 44 45 44 29 20 29  AL|TERM_CODED) )
23540 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
23550 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65   if( (pTerm->pre
23560 72 65 71 41 6c 6c 20 26 20 70 4c 65 76 65 6c 2d  reqAll & pLevel-
23570 3e 6e 6f 74 52 65 61 64 79 29 21 3d 30 20 29 7b  >notReady)!=0 ){
23580 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
23590 20 70 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65   pWInfo->unteste
235a0 64 54 65 72 6d 73 20 29 3b 0a 20 20 20 20 20 20  dTerms );.      
235b0 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
235c0 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
235d0 28 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 20 29  ( pTerm->pExpr )
235e0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
235f0 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
23600 65 2c 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c  e, pTerm->pExpr,
23610 20 61 64 64 72 43 6f 6e 74 2c 20 53 51 4c 49 54   addrCont, SQLIT
23620 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20  E_JUMPIFNULL);. 
23630 20 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c       pTerm->wtFl
23640 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45  ags |= TERM_CODE
23650 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  D;.    }.  }..  
23660 72 65 74 75 72 6e 20 70 4c 65 76 65 6c 2d 3e 6e  return pLevel->n
23670 6f 74 52 65 61 64 79 3b 0a 7d 0a 0a 23 69 66 64  otReady;.}..#ifd
23680 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  ef WHERETRACE_EN
23690 41 42 4c 45 44 0a 2f 2a 0a 2a 2a 20 50 72 69 6e  ABLED./*.** Prin
236a0 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  t the content of
236b0 20 61 20 57 68 65 72 65 54 65 72 6d 20 6f 62 6a   a WhereTerm obj
236c0 65 63 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ect.*/.static vo
236d0 69 64 20 77 68 65 72 65 54 65 72 6d 50 72 69 6e  id whereTermPrin
236e0 74 28 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65  t(WhereTerm *pTe
236f0 72 6d 2c 20 69 6e 74 20 69 54 65 72 6d 29 7b 0a  rm, int iTerm){.
23700 20 20 69 66 28 20 70 54 65 72 6d 3d 3d 30 20 29    if( pTerm==0 )
23710 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  {.    sqlite3Deb
23720 75 67 50 72 69 6e 74 66 28 22 54 45 52 4d 2d 25  ugPrintf("TERM-%
23730 2d 33 64 20 4e 55 4c 4c 5c 6e 22 2c 20 69 54 65  -3d NULL\n", iTe
23740 72 6d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  rm);.  }else{.  
23750 20 20 63 68 61 72 20 7a 54 79 70 65 5b 34 5d 3b    char zType[4];
23760 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 54 79 70  .    memcpy(zTyp
23770 65 2c 20 22 2e 2e 2e 22 2c 20 34 29 3b 0a 20 20  e, "...", 4);.  
23780 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46    if( pTerm->wtF
23790 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54  lags & TERM_VIRT
237a0 55 41 4c 20 29 20 7a 54 79 70 65 5b 30 5d 20 3d  UAL ) zType[0] =
237b0 20 27 56 27 3b 0a 20 20 20 20 69 66 28 20 70 54   'V';.    if( pT
237c0 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
237d0 20 57 4f 5f 45 51 55 49 56 20 20 29 20 7a 54 79   WO_EQUIV  ) zTy
237e0 70 65 5b 31 5d 20 3d 20 27 45 27 3b 0a 20 20 20  pe[1] = 'E';.   
237f0 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
23800 65 72 74 79 28 70 54 65 72 6d 2d 3e 70 45 78 70  erty(pTerm->pExp
23810 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20  r, EP_FromJoin) 
23820 29 20 7a 54 79 70 65 5b 32 5d 20 3d 20 27 4c 27  ) zType[2] = 'L'
23830 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  ;.    sqlite3Deb
23840 75 67 50 72 69 6e 74 66 28 22 54 45 52 4d 2d 25  ugPrintf("TERM-%
23850 2d 33 64 20 25 70 20 25 73 20 63 75 72 73 6f 72  -3d %p %s cursor
23860 3d 25 2d 33 64 20 70 72 6f 62 3d 25 2d 33 64 20  =%-3d prob=%-3d 
23870 6f 70 3d 30 78 25 30 33 78 5c 6e 22 2c 0a 20 20  op=0x%03x\n",.  
23880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23890 20 20 20 20 20 69 54 65 72 6d 2c 20 70 54 65 72       iTerm, pTer
238a0 6d 2c 20 7a 54 79 70 65 2c 20 70 54 65 72 6d 2d  m, zType, pTerm-
238b0 3e 6c 65 66 74 43 75 72 73 6f 72 2c 20 70 54 65  >leftCursor, pTe
238c0 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 2c 0a 20  rm->truthProb,. 
238d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
238e0 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 65 4f 70        pTerm->eOp
238f0 65 72 61 74 6f 72 29 3b 0a 20 20 20 20 73 71 6c  erator);.    sql
23900 69 74 65 33 54 72 65 65 56 69 65 77 45 78 70 72  ite3TreeViewExpr
23910 28 30 2c 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  (0, pTerm->pExpr
23920 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  , 0);.  }.}.#end
23930 69 66 0a 0a 23 69 66 64 65 66 20 57 48 45 52 45  if..#ifdef WHERE
23940 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 2f 2a  TRACE_ENABLED./*
23950 0a 2a 2a 20 50 72 69 6e 74 20 61 20 57 68 65 72  .** Print a Wher
23960 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 66 6f 72  eLoop object for
23970 20 64 65 62 75 67 67 69 6e 67 20 70 75 72 70 6f   debugging purpo
23980 73 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ses.*/.static vo
23990 69 64 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e  id whereLoopPrin
239a0 74 28 57 68 65 72 65 4c 6f 6f 70 20 2a 70 2c 20  t(WhereLoop *p, 
239b0 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
239c0 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  ){.  WhereInfo *
239d0 70 57 49 6e 66 6f 20 3d 20 70 57 43 2d 3e 70 57  pWInfo = pWC->pW
239e0 49 6e 66 6f 3b 0a 20 20 69 6e 74 20 6e 62 20 3d  Info;.  int nb =
239f0 20 31 2b 28 70 57 49 6e 66 6f 2d 3e 70 54 61 62   1+(pWInfo->pTab
23a00 4c 69 73 74 2d 3e 6e 53 72 63 2b 37 29 2f 38 3b  List->nSrc+7)/8;
23a10 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
23a20 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20  t_item *pItem = 
23a30 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
23a40 2d 3e 61 20 2b 20 70 2d 3e 69 54 61 62 3b 0a 20  ->a + p->iTab;. 
23a50 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
23a60 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 73 71  Item->pTab;.  sq
23a70 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
23a80 28 22 25 63 25 32 64 2e 25 30 2a 6c 6c 78 2e 25  ("%c%2d.%0*llx.%
23a90 30 2a 6c 6c 78 22 2c 20 70 2d 3e 63 49 64 2c 0a  0*llx", p->cId,.
23aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23ab0 20 20 20 20 20 70 2d 3e 69 54 61 62 2c 20 6e 62       p->iTab, nb
23ac0 2c 20 70 2d 3e 6d 61 73 6b 53 65 6c 66 2c 20 6e  , p->maskSelf, n
23ad0 62 2c 20 70 2d 3e 70 72 65 72 65 71 29 3b 0a 20  b, p->prereq);. 
23ae0 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
23af0 6e 74 66 28 22 20 25 31 32 73 22 2c 0a 20 20 20  ntf(" %12s",.   
23b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23b10 20 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20    pItem->zAlias 
23b20 3f 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20  ? pItem->zAlias 
23b30 3a 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  : pTab->zName);.
23b40 20 20 69 66 28 20 28 70 2d 3e 77 73 46 6c 61 67    if( (p->wsFlag
23b50 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41  s & WHERE_VIRTUA
23b60 4c 54 41 42 4c 45 29 3d 3d 30 20 29 7b 0a 20 20  LTABLE)==0 ){.  
23b70 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
23b80 61 6d 65 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  ame;.    if( p->
23b90 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20 26  u.btree.pIndex &
23ba0 26 20 28 7a 4e 61 6d 65 20 3d 20 70 2d 3e 75 2e  & (zName = p->u.
23bb0 62 74 72 65 65 2e 70 49 6e 64 65 78 2d 3e 7a 4e  btree.pIndex->zN
23bc0 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ame)!=0 ){.     
23bd0 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 4e 61   if( strncmp(zNa
23be0 6d 65 2c 20 22 73 71 6c 69 74 65 5f 61 75 74 6f  me, "sqlite_auto
23bf0 69 6e 64 65 78 5f 22 2c 20 31 37 29 3d 3d 30 20  index_", 17)==0 
23c00 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  ){.        int i
23c10 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
23c20 33 30 28 7a 4e 61 6d 65 29 20 2d 20 31 3b 0a 20  30(zName) - 1;. 
23c30 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 7a 4e         while( zN
23c40 61 6d 65 5b 69 5d 21 3d 27 5f 27 20 29 20 69 2d  ame[i]!='_' ) i-
23c50 2d 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65  -;.        zName
23c60 20 2b 3d 20 69 3b 0a 20 20 20 20 20 20 7d 0a 20   += i;.      }. 
23c70 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
23c80 67 50 72 69 6e 74 66 28 22 2e 25 2d 31 36 73 20  gPrintf(".%-16s 
23c90 25 32 64 22 2c 20 7a 4e 61 6d 65 2c 20 70 2d 3e  %2d", zName, p->
23ca0 75 2e 62 74 72 65 65 2e 6e 45 71 29 3b 0a 20 20  u.btree.nEq);.  
23cb0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
23cc0 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
23cd0 66 28 22 25 32 30 73 22 2c 22 22 29 3b 0a 20 20  f("%20s","");.  
23ce0 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
23cf0 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 69 66   char *z;.    if
23d00 28 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53  ( p->u.vtab.idxS
23d10 74 72 20 29 7b 0a 20 20 20 20 20 20 7a 20 3d 20  tr ){.      z = 
23d20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
23d30 22 28 25 64 2c 5c 22 25 73 5c 22 2c 25 78 29 22  "(%d,\"%s\",%x)"
23d40 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
23d50 20 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 4e    p->u.vtab.idxN
23d60 75 6d 2c 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64  um, p->u.vtab.id
23d70 78 53 74 72 2c 20 70 2d 3e 75 2e 76 74 61 62 2e  xStr, p->u.vtab.
23d80 6f 6d 69 74 4d 61 73 6b 29 3b 0a 20 20 20 20 7d  omitMask);.    }
23d90 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 20 3d 20  else{.      z = 
23da0 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
23db0 22 28 25 64 2c 25 78 29 22 2c 20 70 2d 3e 75 2e  "(%d,%x)", p->u.
23dc0 76 74 61 62 2e 69 64 78 4e 75 6d 2c 20 70 2d 3e  vtab.idxNum, p->
23dd0 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 29  u.vtab.omitMask)
23de0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
23df0 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
23e00 20 25 2d 31 39 73 22 2c 20 7a 29 3b 0a 20 20 20   %-19s", z);.   
23e10 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29   sqlite3_free(z)
23e20 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 77  ;.  }.  if( p->w
23e30 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 53  sFlags & WHERE_S
23e40 4b 49 50 53 43 41 4e 20 29 7b 0a 20 20 20 20 73  KIPSCAN ){.    s
23e50 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
23e60 66 28 22 20 66 20 25 30 35 78 20 25 64 2d 25 64  f(" f %05x %d-%d
23e70 22 2c 20 70 2d 3e 77 73 46 6c 61 67 73 2c 20 70  ", p->wsFlags, p
23e80 2d 3e 6e 4c 54 65 72 6d 2c 70 2d 3e 6e 53 6b 69  ->nLTerm,p->nSki
23e90 70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  p);.  }else{.   
23ea0 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
23eb0 6e 74 66 28 22 20 66 20 25 30 35 78 20 4e 20 25  ntf(" f %05x N %
23ec0 64 22 2c 20 70 2d 3e 77 73 46 6c 61 67 73 2c 20  d", p->wsFlags, 
23ed0 70 2d 3e 6e 4c 54 65 72 6d 29 3b 0a 20 20 7d 0a  p->nLTerm);.  }.
23ee0 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
23ef0 69 6e 74 66 28 22 20 63 6f 73 74 20 25 64 2c 25  intf(" cost %d,%
23f00 64 2c 25 64 5c 6e 22 2c 20 70 2d 3e 72 53 65 74  d,%d\n", p->rSet
23f10 75 70 2c 20 70 2d 3e 72 52 75 6e 2c 20 70 2d 3e  up, p->rRun, p->
23f20 6e 4f 75 74 29 3b 0a 20 20 69 66 28 20 70 2d 3e  nOut);.  if( p->
23f30 6e 4c 54 65 72 6d 20 26 26 20 28 73 71 6c 69 74  nLTerm && (sqlit
23f40 65 33 57 68 65 72 65 54 72 61 63 65 20 26 20 30  e3WhereTrace & 0
23f50 78 31 30 30 29 21 3d 30 20 29 7b 0a 20 20 20 20  x100)!=0 ){.    
23f60 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
23f70 3d 30 3b 20 69 3c 70 2d 3e 6e 4c 54 65 72 6d 3b  =0; i<p->nLTerm;
23f80 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 77 68 65   i++){.      whe
23f90 72 65 54 65 72 6d 50 72 69 6e 74 28 70 2d 3e 61  reTermPrint(p->a
23fa0 4c 54 65 72 6d 5b 69 5d 2c 20 69 29 3b 0a 20 20  LTerm[i], i);.  
23fb0 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66    }.  }.}.#endif
23fc0 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20  ../*.** Convert 
23fd0 62 75 6c 6b 20 6d 65 6d 6f 72 79 20 69 6e 74 6f  bulk memory into
23fe0 20 61 20 76 61 6c 69 64 20 57 68 65 72 65 4c 6f   a valid WhereLo
23ff0 6f 70 20 74 68 61 74 20 63 61 6e 20 62 65 20 70  op that can be p
24000 61 73 73 65 64 0a 2a 2a 20 74 6f 20 77 68 65 72  assed.** to wher
24010 65 4c 6f 6f 70 43 6c 65 61 72 20 68 61 72 6d 6c  eLoopClear harml
24020 65 73 73 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  essly..*/.static
24030 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 49   void whereLoopI
24040 6e 69 74 28 57 68 65 72 65 4c 6f 6f 70 20 2a 70  nit(WhereLoop *p
24050 29 7b 0a 20 20 70 2d 3e 61 4c 54 65 72 6d 20 3d  ){.  p->aLTerm =
24060 20 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 3b   p->aLTermSpace;
24070 0a 20 20 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20 30  .  p->nLTerm = 0
24080 3b 0a 20 20 70 2d 3e 6e 4c 53 6c 6f 74 20 3d 20  ;.  p->nLSlot = 
24090 41 72 72 61 79 53 69 7a 65 28 70 2d 3e 61 4c 54  ArraySize(p->aLT
240a0 65 72 6d 53 70 61 63 65 29 3b 0a 20 20 70 2d 3e  ermSpace);.  p->
240b0 77 73 46 6c 61 67 73 20 3d 20 30 3b 0a 7d 0a 0a  wsFlags = 0;.}..
240c0 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20  /*.** Clear the 
240d0 57 68 65 72 65 4c 6f 6f 70 2e 75 20 75 6e 69 6f  WhereLoop.u unio
240e0 6e 2e 20 20 4c 65 61 76 65 20 57 68 65 72 65 4c  n.  Leave WhereL
240f0 6f 6f 70 2e 70 4c 54 65 72 6d 20 69 6e 74 61 63  oop.pLTerm intac
24100 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
24110 64 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72  d whereLoopClear
24120 55 6e 69 6f 6e 28 73 71 6c 69 74 65 33 20 2a 64  Union(sqlite3 *d
24130 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29  b, WhereLoop *p)
24140 7b 0a 20 20 69 66 28 20 70 2d 3e 77 73 46 6c 61  {.  if( p->wsFla
24150 67 73 20 26 20 28 57 48 45 52 45 5f 56 49 52 54  gs & (WHERE_VIRT
24160 55 41 4c 54 41 42 4c 45 7c 57 48 45 52 45 5f 41  UALTABLE|WHERE_A
24170 55 54 4f 5f 49 4e 44 45 58 29 20 29 7b 0a 20 20  UTO_INDEX) ){.  
24180 20 20 69 66 28 20 28 70 2d 3e 77 73 46 6c 61 67    if( (p->wsFlag
24190 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41  s & WHERE_VIRTUA
241a0 4c 54 41 42 4c 45 29 21 3d 30 20 26 26 20 70 2d  LTABLE)!=0 && p-
241b0 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65  >u.vtab.needFree
241c0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
241d0 33 5f 66 72 65 65 28 70 2d 3e 75 2e 76 74 61 62  3_free(p->u.vtab
241e0 2e 69 64 78 53 74 72 29 3b 0a 20 20 20 20 20 20  .idxStr);.      
241f0 70 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72  p->u.vtab.needFr
24200 65 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d  ee = 0;.      p-
24210 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72 20 3d  >u.vtab.idxStr =
24220 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   0;.    }else if
24230 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  ( (p->wsFlags & 
24240 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58  WHERE_AUTO_INDEX
24250 29 21 3d 30 20 26 26 20 70 2d 3e 75 2e 62 74 72  )!=0 && p->u.btr
24260 65 65 2e 70 49 6e 64 65 78 21 3d 30 20 29 7b 0a  ee.pIndex!=0 ){.
24270 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
24280 72 65 65 28 64 62 2c 20 70 2d 3e 75 2e 62 74 72  ree(db, p->u.btr
24290 65 65 2e 70 49 6e 64 65 78 2d 3e 7a 43 6f 6c 41  ee.pIndex->zColA
242a0 66 66 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ff);.      sqlit
242b0 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28 70  e3KeyInfoUnref(p
242c0 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
242d0 2d 3e 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 20  ->pKeyInfo);.   
242e0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
242f0 28 64 62 2c 20 70 2d 3e 75 2e 62 74 72 65 65 2e  (db, p->u.btree.
24300 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 70  pIndex);.      p
24310 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
24320 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
24330 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63  }../*.** Dealloc
24340 61 74 65 20 69 6e 74 65 72 6e 61 6c 20 6d 65 6d  ate internal mem
24350 6f 72 79 20 75 73 65 64 20 62 79 20 61 20 57 68  ory used by a Wh
24360 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 0a 2a  ereLoop object.*
24370 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68  /.static void wh
24380 65 72 65 4c 6f 6f 70 43 6c 65 61 72 28 73 71 6c  ereLoopClear(sql
24390 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c  ite3 *db, WhereL
243a0 6f 6f 70 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  oop *p){.  if( p
243b0 2d 3e 61 4c 54 65 72 6d 21 3d 70 2d 3e 61 4c 54  ->aLTerm!=p->aLT
243c0 65 72 6d 53 70 61 63 65 20 29 20 73 71 6c 69 74  ermSpace ) sqlit
243d0 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
243e0 61 4c 54 65 72 6d 29 3b 0a 20 20 77 68 65 72 65  aLTerm);.  where
243f0 4c 6f 6f 70 43 6c 65 61 72 55 6e 69 6f 6e 28 64  LoopClearUnion(d
24400 62 2c 20 70 29 3b 0a 20 20 77 68 65 72 65 4c 6f  b, p);.  whereLo
24410 6f 70 49 6e 69 74 28 70 29 3b 0a 7d 0a 0a 2f 2a  opInit(p);.}../*
24420 0a 2a 2a 20 49 6e 63 72 65 61 73 65 20 74 68 65  .** Increase the
24430 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
24440 6f 6e 20 66 6f 72 20 70 4c 6f 6f 70 2d 3e 61 4c  on for pLoop->aL
24450 54 65 72 6d 5b 5d 20 74 6f 20 62 65 20 61 74 20  Term[] to be at 
24460 6c 65 61 73 74 20 6e 2e 0a 2a 2f 0a 73 74 61 74  least n..*/.stat
24470 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70  ic int whereLoop
24480 52 65 73 69 7a 65 28 73 71 6c 69 74 65 33 20 2a  Resize(sqlite3 *
24490 64 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  db, WhereLoop *p
244a0 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 57 68 65 72  , int n){.  Wher
244b0 65 54 65 72 6d 20 2a 2a 70 61 4e 65 77 3b 0a 20  eTerm **paNew;. 
244c0 20 69 66 28 20 70 2d 3e 6e 4c 53 6c 6f 74 3e 3d   if( p->nLSlot>=
244d0 6e 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  n ) return SQLIT
244e0 45 5f 4f 4b 3b 0a 20 20 6e 20 3d 20 28 6e 2b 37  E_OK;.  n = (n+7
244f0 29 26 7e 37 3b 0a 20 20 70 61 4e 65 77 20 3d 20  )&~7;.  paNew = 
24500 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
24510 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 70 2d  aw(db, sizeof(p-
24520 3e 61 4c 54 65 72 6d 5b 30 5d 29 2a 6e 29 3b 0a  >aLTerm[0])*n);.
24530 20 20 69 66 28 20 70 61 4e 65 77 3d 3d 30 20 29    if( paNew==0 )
24540 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
24550 4f 4d 45 4d 3b 0a 20 20 6d 65 6d 63 70 79 28 70  OMEM;.  memcpy(p
24560 61 4e 65 77 2c 20 70 2d 3e 61 4c 54 65 72 6d 2c  aNew, p->aLTerm,
24570 20 73 69 7a 65 6f 66 28 70 2d 3e 61 4c 54 65 72   sizeof(p->aLTer
24580 6d 5b 30 5d 29 2a 70 2d 3e 6e 4c 53 6c 6f 74 29  m[0])*p->nLSlot)
24590 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4c 54 65 72  ;.  if( p->aLTer
245a0 6d 21 3d 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63  m!=p->aLTermSpac
245b0 65 20 29 20 73 71 6c 69 74 65 33 44 62 46 72 65  e ) sqlite3DbFre
245c0 65 28 64 62 2c 20 70 2d 3e 61 4c 54 65 72 6d 29  e(db, p->aLTerm)
245d0 3b 0a 20 20 70 2d 3e 61 4c 54 65 72 6d 20 3d 20  ;.  p->aLTerm = 
245e0 70 61 4e 65 77 3b 0a 20 20 70 2d 3e 6e 4c 53 6c  paNew;.  p->nLSl
245f0 6f 74 20 3d 20 6e 3b 0a 20 20 72 65 74 75 72 6e  ot = n;.  return
24600 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
24610 2a 0a 2a 2a 20 54 72 61 6e 73 66 65 72 20 63 6f  *.** Transfer co
24620 6e 74 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 73  ntent from the s
24630 65 63 6f 6e 64 20 70 4c 6f 6f 70 20 69 6e 74 6f  econd pLoop into
24640 20 74 68 65 20 66 69 72 73 74 2e 0a 2a 2f 0a 73   the first..*/.s
24650 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c  tatic int whereL
24660 6f 6f 70 58 66 65 72 28 73 71 6c 69 74 65 33 20  oopXfer(sqlite3 
24670 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a  *db, WhereLoop *
24680 70 54 6f 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a  pTo, WhereLoop *
24690 70 46 72 6f 6d 29 7b 0a 20 20 77 68 65 72 65 4c  pFrom){.  whereL
246a0 6f 6f 70 43 6c 65 61 72 55 6e 69 6f 6e 28 64 62  oopClearUnion(db
246b0 2c 20 70 54 6f 29 3b 0a 20 20 69 66 28 20 77 68  , pTo);.  if( wh
246c0 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62  ereLoopResize(db
246d0 2c 20 70 54 6f 2c 20 70 46 72 6f 6d 2d 3e 6e 4c  , pTo, pFrom->nL
246e0 54 65 72 6d 29 20 29 7b 0a 20 20 20 20 6d 65 6d  Term) ){.    mem
246f0 73 65 74 28 26 70 54 6f 2d 3e 75 2c 20 30 2c 20  set(&pTo->u, 0, 
24700 73 69 7a 65 6f 66 28 70 54 6f 2d 3e 75 29 29 3b  sizeof(pTo->u));
24710 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
24720 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  TE_NOMEM;.  }.  
24730 6d 65 6d 63 70 79 28 70 54 6f 2c 20 70 46 72 6f  memcpy(pTo, pFro
24740 6d 2c 20 57 48 45 52 45 5f 4c 4f 4f 50 5f 58 46  m, WHERE_LOOP_XF
24750 45 52 5f 53 5a 29 3b 0a 20 20 6d 65 6d 63 70 79  ER_SZ);.  memcpy
24760 28 70 54 6f 2d 3e 61 4c 54 65 72 6d 2c 20 70 46  (pTo->aLTerm, pF
24770 72 6f 6d 2d 3e 61 4c 54 65 72 6d 2c 20 70 54 6f  rom->aLTerm, pTo
24780 2d 3e 6e 4c 54 65 72 6d 2a 73 69 7a 65 6f 66 28  ->nLTerm*sizeof(
24790 70 54 6f 2d 3e 61 4c 54 65 72 6d 5b 30 5d 29 29  pTo->aLTerm[0]))
247a0 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 77  ;.  if( pFrom->w
247b0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56  sFlags & WHERE_V
247c0 49 52 54 55 41 4c 54 41 42 4c 45 20 29 7b 0a 20  IRTUALTABLE ){. 
247d0 20 20 20 70 46 72 6f 6d 2d 3e 75 2e 76 74 61 62     pFrom->u.vtab
247e0 2e 6e 65 65 64 46 72 65 65 20 3d 20 30 3b 0a 20  .needFree = 0;. 
247f0 20 7d 65 6c 73 65 20 69 66 28 20 28 70 46 72 6f   }else if( (pFro
24800 6d 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  m->wsFlags & WHE
24810 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 21 3d  RE_AUTO_INDEX)!=
24820 30 20 29 7b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e  0 ){.    pFrom->
24830 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d  u.btree.pIndex =
24840 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
24850 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
24860 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 57 68  *.** Delete a Wh
24870 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 0a 2a  ereLoop object.*
24880 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68  /.static void wh
24890 65 72 65 4c 6f 6f 70 44 65 6c 65 74 65 28 73 71  ereLoopDelete(sq
248a0 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65  lite3 *db, Where
248b0 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20 77 68 65 72  Loop *p){.  wher
248c0 65 4c 6f 6f 70 43 6c 65 61 72 28 64 62 2c 20 70  eLoopClear(db, p
248d0 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
248e0 65 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a  ee(db, p);.}../*
248f0 0a 2a 2a 20 46 72 65 65 20 61 20 57 68 65 72 65  .** Free a Where
24900 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 0a 2a  Info structure.*
24910 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68  /.static void wh
24920 65 72 65 49 6e 66 6f 46 72 65 65 28 73 71 6c 69  ereInfoFree(sqli
24930 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 49 6e  te3 *db, WhereIn
24940 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 69  fo *pWInfo){.  i
24950 66 28 20 41 4c 57 41 59 53 28 70 57 49 6e 66 6f  f( ALWAYS(pWInfo
24960 29 20 29 7b 0a 20 20 20 20 77 68 65 72 65 43 6c  ) ){.    whereCl
24970 61 75 73 65 43 6c 65 61 72 28 26 70 57 49 6e 66  auseClear(&pWInf
24980 6f 2d 3e 73 57 43 29 3b 0a 20 20 20 20 77 68 69  o->sWC);.    whi
24990 6c 65 28 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f  le( pWInfo->pLoo
249a0 70 73 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72  ps ){.      Wher
249b0 65 4c 6f 6f 70 20 2a 70 20 3d 20 70 57 49 6e 66  eLoop *p = pWInf
249c0 6f 2d 3e 70 4c 6f 6f 70 73 3b 0a 20 20 20 20 20  o->pLoops;.     
249d0 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 20   pWInfo->pLoops 
249e0 3d 20 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 3b 0a  = p->pNextLoop;.
249f0 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 44        whereLoopD
24a00 65 6c 65 74 65 28 64 62 2c 20 70 29 3b 0a 20 20  elete(db, p);.  
24a10 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44    }.    sqlite3D
24a20 62 46 72 65 65 28 64 62 2c 20 70 57 49 6e 66 6f  bFree(db, pWInfo
24a30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
24a40 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 61  Return TRUE if a
24a50 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ll of the follow
24a60 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a  ing are true:.**
24a70 0a 2a 2a 20 20 20 28 31 29 20 20 58 20 68 61 73  .**   (1)  X has
24a80 20 74 68 65 20 73 61 6d 65 20 6f 72 20 6c 6f 77   the same or low
24a90 65 72 20 63 6f 73 74 20 74 68 61 74 20 59 0a 2a  er cost that Y.*
24aa0 2a 20 20 20 28 32 29 20 20 58 20 69 73 20 61 20  *   (2)  X is a 
24ab0 70 72 6f 70 65 72 20 73 75 62 73 65 74 20 6f 66  proper subset of
24ac0 20 59 0a 2a 2a 20 20 20 28 33 29 20 20 58 20 73   Y.**   (3)  X s
24ad0 6b 69 70 73 20 61 74 20 6c 65 61 73 74 20 61 73  kips at least as
24ae0 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 61 73   many columns as
24af0 20 59 0a 2a 2a 0a 2a 2a 20 42 79 20 22 70 72 6f   Y.**.** By "pro
24b00 70 65 72 20 73 75 62 73 65 74 22 20 77 65 20 6d  per subset" we m
24b10 65 61 6e 20 74 68 61 74 20 58 20 75 73 65 73 20  ean that X uses 
24b20 66 65 77 65 72 20 57 48 45 52 45 20 63 6c 61 75  fewer WHERE clau
24b30 73 65 20 74 65 72 6d 73 0a 2a 2a 20 74 68 61 6e  se terms.** than
24b40 20 59 20 61 6e 64 20 74 68 61 74 20 65 76 65 72   Y and that ever
24b50 79 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  y WHERE clause t
24b60 65 72 6d 20 75 73 65 64 20 62 79 20 58 20 69 73  erm used by X is
24b70 20 61 6c 73 6f 20 75 73 65 64 0a 2a 2a 20 62 79   also used.** by
24b80 20 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 58 20 69   Y..**.** If X i
24b90 73 20 61 20 70 72 6f 70 65 72 20 73 75 62 73 65  s a proper subse
24ba0 74 20 6f 66 20 59 20 74 68 65 6e 20 59 20 69 73  t of Y then Y is
24bb0 20 61 20 62 65 74 74 65 72 20 63 68 6f 69 63 65   a better choice
24bc0 20 61 6e 64 20 6f 75 67 68 74 0a 2a 2a 20 74 6f   and ought.** to
24bd0 20 68 61 76 65 20 61 20 6c 6f 77 65 72 20 63 6f   have a lower co
24be0 73 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  st.  This routin
24bf0 65 20 72 65 74 75 72 6e 73 20 54 52 55 45 20 77  e returns TRUE w
24c00 68 65 6e 20 74 68 61 74 20 63 6f 73 74 20 0a 2a  hen that cost .*
24c10 2a 20 72 65 6c 61 74 69 6f 6e 73 68 69 70 20 69  * relationship i
24c20 73 20 69 6e 76 65 72 74 65 64 20 61 6e 64 20 6e  s inverted and n
24c30 65 65 64 73 20 74 6f 20 62 65 20 61 64 6a 75 73  eeds to be adjus
24c40 74 65 64 2e 20 20 54 68 65 20 74 68 69 72 64 20  ted.  The third 
24c50 72 75 6c 65 0a 2a 2a 20 77 61 73 20 61 64 64 65  rule.** was adde
24c60 64 20 62 65 63 61 75 73 65 20 69 66 20 58 20 75  d because if X u
24c70 73 65 73 20 73 6b 69 70 2d 73 63 61 6e 20 6c 65  ses skip-scan le
24c80 73 73 20 74 68 61 6e 20 59 20 69 74 20 73 74 69  ss than Y it sti
24c90 6c 6c 20 6d 69 67 68 74 0a 2a 2a 20 64 65 73 65  ll might.** dese
24ca0 72 76 65 20 61 20 6c 6f 77 65 72 20 63 6f 73 74  rve a lower cost
24cb0 20 65 76 65 6e 20 69 66 20 69 74 20 69 73 20 61   even if it is a
24cc0 20 70 72 6f 70 65 72 20 73 75 62 73 65 74 20 6f   proper subset o
24cd0 66 20 59 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  f Y..*/.static i
24ce0 6e 74 20 77 68 65 72 65 4c 6f 6f 70 43 68 65 61  nt whereLoopChea
24cf0 70 65 72 50 72 6f 70 65 72 53 75 62 73 65 74 28  perProperSubset(
24d00 0a 20 20 63 6f 6e 73 74 20 57 68 65 72 65 4c 6f  .  const WhereLo
24d10 6f 70 20 2a 70 58 2c 20 20 20 20 20 20 20 2f 2a  op *pX,       /*
24d20 20 46 69 72 73 74 20 57 68 65 72 65 4c 6f 6f 70   First WhereLoop
24d30 20 74 6f 20 63 6f 6d 70 61 72 65 20 2a 2f 0a 20   to compare */. 
24d40 20 63 6f 6e 73 74 20 57 68 65 72 65 4c 6f 6f 70   const WhereLoop
24d50 20 2a 70 59 20 20 20 20 20 20 20 20 2f 2a 20 43   *pY        /* C
24d60 6f 6d 70 61 72 65 20 61 67 61 69 6e 73 74 20 74  ompare against t
24d70 68 69 73 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2f  his WhereLoop */
24d80 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  .){.  int i, j;.
24d90 20 20 69 66 28 20 70 58 2d 3e 6e 4c 54 65 72 6d    if( pX->nLTerm
24da0 2d 70 58 2d 3e 6e 53 6b 69 70 20 3e 3d 20 70 59  -pX->nSkip >= pY
24db0 2d 3e 6e 4c 54 65 72 6d 2d 70 59 2d 3e 6e 53 6b  ->nLTerm-pY->nSk
24dc0 69 70 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ip ){.    return
24dd0 20 30 3b 20 2f 2a 20 58 20 69 73 20 6e 6f 74 20   0; /* X is not 
24de0 61 20 73 75 62 73 65 74 20 6f 66 20 59 20 2a 2f  a subset of Y */
24df0 0a 20 20 7d 0a 20 20 69 66 28 20 70 59 2d 3e 6e  .  }.  if( pY->n
24e00 53 6b 69 70 20 3e 20 70 58 2d 3e 6e 53 6b 69 70  Skip > pX->nSkip
24e10 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
24e20 66 28 20 70 58 2d 3e 72 52 75 6e 20 3e 3d 20 70  f( pX->rRun >= p
24e30 59 2d 3e 72 52 75 6e 20 29 7b 0a 20 20 20 20 69  Y->rRun ){.    i
24e40 66 28 20 70 58 2d 3e 72 52 75 6e 20 3e 20 70 59  f( pX->rRun > pY
24e50 2d 3e 72 52 75 6e 20 29 20 72 65 74 75 72 6e 20  ->rRun ) return 
24e60 30 3b 20 20 20 20 2f 2a 20 58 20 63 6f 73 74 73  0;    /* X costs
24e70 20 6d 6f 72 65 20 74 68 61 6e 20 59 20 2a 2f 0a   more than Y */.
24e80 20 20 20 20 69 66 28 20 70 58 2d 3e 6e 4f 75 74      if( pX->nOut
24e90 20 3e 20 70 59 2d 3e 6e 4f 75 74 20 29 20 72 65   > pY->nOut ) re
24ea0 74 75 72 6e 20 30 3b 20 20 20 20 2f 2a 20 58 20  turn 0;    /* X 
24eb0 63 6f 73 74 73 20 6d 6f 72 65 20 74 68 61 6e 20  costs more than 
24ec0 59 20 2a 2f 0a 20 20 7d 0a 20 20 66 6f 72 28 69  Y */.  }.  for(i
24ed0 3d 70 58 2d 3e 6e 4c 54 65 72 6d 2d 31 3b 20 69  =pX->nLTerm-1; i
24ee0 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69  >=0; i--){.    i
24ef0 66 28 20 70 58 2d 3e 61 4c 54 65 72 6d 5b 69 5d  f( pX->aLTerm[i]
24f00 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
24f10 20 20 20 20 66 6f 72 28 6a 3d 70 59 2d 3e 6e 4c      for(j=pY->nL
24f20 54 65 72 6d 2d 31 3b 20 6a 3e 3d 30 3b 20 6a 2d  Term-1; j>=0; j-
24f30 2d 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 59  -){.      if( pY
24f40 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 3d 3d 70 58 2d  ->aLTerm[j]==pX-
24f50 3e 61 4c 54 65 72 6d 5b 69 5d 20 29 20 62 72 65  >aLTerm[i] ) bre
24f60 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ak;.    }.    if
24f70 28 20 6a 3c 30 20 29 20 72 65 74 75 72 6e 20 30  ( j<0 ) return 0
24f80 3b 20 20 2f 2a 20 58 20 6e 6f 74 20 61 20 73 75  ;  /* X not a su
24f90 62 73 65 74 20 6f 66 20 59 20 73 69 6e 63 65 20  bset of Y since 
24fa0 74 65 72 6d 20 58 5b 69 5d 20 6e 6f 74 20 75 73  term X[i] not us
24fb0 65 64 20 62 79 20 59 20 2a 2f 0a 20 20 7d 0a 20  ed by Y */.  }. 
24fc0 20 72 65 74 75 72 6e 20 31 3b 20 20 2f 2a 20 41   return 1;  /* A
24fd0 6c 6c 20 63 6f 6e 64 69 74 69 6f 6e 73 20 6d 65  ll conditions me
24fe0 65 74 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  et */.}../*.** T
24ff0 72 79 20 74 6f 20 61 64 6a 75 73 74 20 74 68 65  ry to adjust the
25000 20 63 6f 73 74 20 6f 66 20 57 68 65 72 65 4c 6f   cost of WhereLo
25010 6f 70 20 70 54 65 6d 70 6c 61 74 65 20 75 70 77  op pTemplate upw
25020 61 72 64 73 20 6f 72 20 64 6f 77 6e 77 61 72 64  ards or downward
25030 73 20 73 6f 0a 2a 2a 20 74 68 61 74 3a 0a 2a 2a  s so.** that:.**
25040 0a 2a 2a 20 20 20 28 31 29 20 70 54 65 6d 70 6c  .**   (1) pTempl
25050 61 74 65 20 63 6f 73 74 73 20 6c 65 73 73 20 74  ate costs less t
25060 68 61 6e 20 61 6e 79 20 6f 74 68 65 72 20 57 68  han any other Wh
25070 65 72 65 4c 6f 6f 70 73 20 74 68 61 74 20 61 72  ereLoops that ar
25080 65 20 61 20 70 72 6f 70 65 72 0a 2a 2a 20 20 20  e a proper.**   
25090 20 20 20 20 73 75 62 73 65 74 20 6f 66 20 70 54      subset of pT
250a0 65 6d 70 6c 61 74 65 0a 2a 2a 0a 2a 2a 20 20 20  emplate.**.**   
250b0 28 32 29 20 70 54 65 6d 70 6c 61 74 65 20 63 6f  (2) pTemplate co
250c0 73 74 73 20 6d 6f 72 65 20 74 68 61 6e 20 61 6e  sts more than an
250d0 79 20 6f 74 68 65 72 20 57 68 65 72 65 4c 6f 6f  y other WhereLoo
250e0 70 73 20 66 6f 72 20 77 68 69 63 68 20 70 54 65  ps for which pTe
250f0 6d 70 6c 61 74 65 0a 2a 2a 20 20 20 20 20 20 20  mplate.**       
25100 69 73 20 61 20 70 72 6f 70 65 72 20 73 75 62 73  is a proper subs
25110 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 73 61 79  et..**.** To say
25120 20 22 57 68 65 72 65 4c 6f 6f 70 20 58 20 69 73   "WhereLoop X is
25130 20 61 20 70 72 6f 70 65 72 20 73 75 62 73 65 74   a proper subset
25140 20 6f 66 20 59 22 20 6d 65 61 6e 73 20 74 68 61   of Y" means tha
25150 74 20 58 20 75 73 65 73 20 66 65 77 65 72 0a 2a  t X uses fewer.*
25160 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  * WHERE clause t
25170 65 72 6d 73 20 74 68 61 6e 20 59 20 61 6e 64 20  erms than Y and 
25180 74 68 61 74 20 65 76 65 72 79 20 57 48 45 52 45  that every WHERE
25190 20 63 6c 61 75 73 65 20 74 65 72 6d 20 75 73 65   clause term use
251a0 64 20 62 79 20 58 20 69 73 0a 2a 2a 20 61 6c 73  d by X is.** als
251b0 6f 20 75 73 65 64 20 62 79 20 59 2e 0a 2a 2f 0a  o used by Y..*/.
251c0 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72  static void wher
251d0 65 4c 6f 6f 70 41 64 6a 75 73 74 43 6f 73 74 28  eLoopAdjustCost(
251e0 63 6f 6e 73 74 20 57 68 65 72 65 4c 6f 6f 70 20  const WhereLoop 
251f0 2a 70 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  *p, WhereLoop *p
25200 54 65 6d 70 6c 61 74 65 29 7b 0a 20 20 69 66 28  Template){.  if(
25210 20 28 70 54 65 6d 70 6c 61 74 65 2d 3e 77 73 46   (pTemplate->wsF
25220 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44  lags & WHERE_IND
25230 45 58 45 44 29 3d 3d 30 20 29 20 72 65 74 75 72  EXED)==0 ) retur
25240 6e 3b 0a 20 20 66 6f 72 28 3b 20 70 3b 20 70 3d  n;.  for(; p; p=
25250 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 29 7b 0a 20  p->pNextLoop){. 
25260 20 20 20 69 66 28 20 70 2d 3e 69 54 61 62 21 3d     if( p->iTab!=
25270 70 54 65 6d 70 6c 61 74 65 2d 3e 69 54 61 62 20  pTemplate->iTab 
25280 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
25290 69 66 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20  if( (p->wsFlags 
252a0 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29  & WHERE_INDEXED)
252b0 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
252c0 20 20 20 20 69 66 28 20 77 68 65 72 65 4c 6f 6f      if( whereLoo
252d0 70 43 68 65 61 70 65 72 50 72 6f 70 65 72 53 75  pCheaperProperSu
252e0 62 73 65 74 28 70 2c 20 70 54 65 6d 70 6c 61 74  bset(p, pTemplat
252f0 65 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41  e) ){.      /* A
25300 64 6a 75 73 74 20 70 54 65 6d 70 6c 61 74 65 20  djust pTemplate 
25310 63 6f 73 74 20 64 6f 77 6e 77 61 72 64 20 73 6f  cost downward so
25320 20 74 68 61 74 20 69 74 20 69 73 20 63 68 65 61   that it is chea
25330 70 65 72 20 74 68 61 6e 20 69 74 73 20 0a 20 20  per than its .  
25340 20 20 20 20 2a 2a 20 73 75 62 73 65 74 20 70 2e      ** subset p.
25350 20 2a 2f 0a 20 20 20 20 20 20 57 48 45 52 45 54   */.      WHERET
25360 52 41 43 45 28 30 78 38 30 2c 28 22 73 75 62 73  RACE(0x80,("subs
25370 65 74 20 63 6f 73 74 20 61 64 6a 75 73 74 6d 65  et cost adjustme
25380 6e 74 20 25 64 2c 25 64 20 74 6f 20 25 64 2c 25  nt %d,%d to %d,%
25390 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
253a0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54 65               pTe
253b0 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 2c 20 70 54  mplate->rRun, pT
253c0 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74 2c 20 70  emplate->nOut, p
253d0 2d 3e 72 52 75 6e 2c 20 70 2d 3e 6e 4f 75 74 2d  ->rRun, p->nOut-
253e0 31 29 29 3b 0a 20 20 20 20 20 20 70 54 65 6d 70  1));.      pTemp
253f0 6c 61 74 65 2d 3e 72 52 75 6e 20 3d 20 70 2d 3e  late->rRun = p->
25400 72 52 75 6e 3b 0a 20 20 20 20 20 20 70 54 65 6d  rRun;.      pTem
25410 70 6c 61 74 65 2d 3e 6e 4f 75 74 20 3d 20 70 2d  plate->nOut = p-
25420 3e 6e 4f 75 74 20 2d 20 31 3b 0a 20 20 20 20 7d  >nOut - 1;.    }
25430 65 6c 73 65 20 69 66 28 20 77 68 65 72 65 4c 6f  else if( whereLo
25440 6f 70 43 68 65 61 70 65 72 50 72 6f 70 65 72 53  opCheaperProperS
25450 75 62 73 65 74 28 70 54 65 6d 70 6c 61 74 65 2c  ubset(pTemplate,
25460 20 70 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20   p) ){.      /* 
25470 41 64 6a 75 73 74 20 70 54 65 6d 70 6c 61 74 65  Adjust pTemplate
25480 20 63 6f 73 74 20 75 70 77 61 72 64 20 73 6f 20   cost upward so 
25490 74 68 61 74 20 69 74 20 69 73 20 63 6f 73 74 6c  that it is costl
254a0 69 65 72 20 74 68 61 6e 20 70 20 73 69 6e 63 65  ier than p since
254b0 0a 20 20 20 20 20 20 2a 2a 20 70 54 65 6d 70 6c  .      ** pTempl
254c0 61 74 65 20 69 73 20 61 20 70 72 6f 70 65 72 20  ate is a proper 
254d0 73 75 62 73 65 74 20 6f 66 20 70 20 2a 2f 0a 20  subset of p */. 
254e0 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28       WHERETRACE(
254f0 30 78 38 30 2c 28 22 73 75 62 73 65 74 20 63 6f  0x80,("subset co
25500 73 74 20 61 64 6a 75 73 74 6d 65 6e 74 20 25 64  st adjustment %d
25510 2c 25 64 20 74 6f 20 25 64 2c 25 64 5c 6e 22 2c  ,%d to %d,%d\n",
25520 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
25530 20 20 20 20 20 20 20 20 70 54 65 6d 70 6c 61 74          pTemplat
25540 65 2d 3e 72 52 75 6e 2c 20 70 54 65 6d 70 6c 61  e->rRun, pTempla
25550 74 65 2d 3e 6e 4f 75 74 2c 20 70 2d 3e 72 52 75  te->nOut, p->rRu
25560 6e 2c 20 70 2d 3e 6e 4f 75 74 2b 31 29 29 3b 0a  n, p->nOut+1));.
25570 20 20 20 20 20 20 70 54 65 6d 70 6c 61 74 65 2d        pTemplate-
25580 3e 72 52 75 6e 20 3d 20 70 2d 3e 72 52 75 6e 3b  >rRun = p->rRun;
25590 0a 20 20 20 20 20 20 70 54 65 6d 70 6c 61 74 65  .      pTemplate
255a0 2d 3e 6e 4f 75 74 20 3d 20 70 2d 3e 6e 4f 75 74  ->nOut = p->nOut
255b0 20 2b 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   + 1;.    }.  }.
255c0 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20  }../*.** Search 
255d0 74 68 65 20 6c 69 73 74 20 6f 66 20 57 68 65 72  the list of Wher
255e0 65 4c 6f 6f 70 73 20 69 6e 20 2a 70 70 50 72 65  eLoops in *ppPre
255f0 76 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 6f 6e  v looking for on
25600 65 20 74 68 61 74 20 63 61 6e 20 62 65 0a 2a 2a  e that can be.**
25610 20 73 75 70 70 6c 61 6e 74 65 64 20 62 79 20 70   supplanted by p
25620 54 65 6d 70 6c 61 74 65 2e 0a 2a 2a 0a 2a 2a 20  Template..**.** 
25630 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 74  Return NULL if t
25640 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 6c 69 73  he WhereLoop lis
25650 74 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 65 6e  t contains an en
25660 74 72 79 20 74 68 61 74 20 63 61 6e 20 73 75 70  try that can sup
25670 70 6c 61 6e 74 0a 2a 2a 20 70 54 65 6d 70 6c 61  plant.** pTempla
25680 74 65 2c 20 69 6e 20 6f 74 68 65 72 20 77 6f 72  te, in other wor
25690 64 73 20 69 66 20 70 54 65 6d 70 6c 61 74 65 20  ds if pTemplate 
256a0 64 6f 65 73 20 6e 6f 74 20 62 65 6c 6f 6e 67 20  does not belong 
256b0 6f 6e 20 74 68 65 20 6c 69 73 74 2e 0a 2a 2a 0a  on the list..**.
256c0 2a 2a 20 49 66 20 70 58 20 69 73 20 61 20 57 68  ** If pX is a Wh
256d0 65 72 65 4c 6f 6f 70 20 74 68 61 74 20 70 54 65  ereLoop that pTe
256e0 6d 70 6c 61 74 65 20 63 61 6e 20 73 75 70 70 6c  mplate can suppl
256f0 61 6e 74 2c 20 74 68 65 6e 20 72 65 74 75 72 6e  ant, then return
25700 20 74 68 65 0a 2a 2a 20 6c 69 6e 6b 20 74 68 61   the.** link tha
25710 74 20 70 6f 69 6e 74 73 20 74 6f 20 70 58 2e 0a  t points to pX..
25720 2a 2a 0a 2a 2a 20 49 66 20 70 54 65 6d 70 6c 61  **.** If pTempla
25730 74 65 20 63 61 6e 6e 6f 74 20 73 75 70 70 6c 61  te cannot suppla
25740 6e 74 20 61 6e 79 20 65 78 69 73 74 69 6e 67 20  nt any existing 
25750 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 6c  element of the l
25760 69 73 74 20 62 75 74 20 6e 65 65 64 73 0a 2a 2a  ist but needs.**
25770 20 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f 20   to be added to 
25780 74 68 65 20 6c 69 73 74 2c 20 74 68 65 6e 20 72  the list, then r
25790 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
257a0 74 6f 20 74 68 65 20 74 61 69 6c 20 6f 66 20 74  to the tail of t
257b0 68 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74  he list..*/.stat
257c0 69 63 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a 77  ic WhereLoop **w
257d0 68 65 72 65 4c 6f 6f 70 46 69 6e 64 4c 65 73 73  hereLoopFindLess
257e0 65 72 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20  er(.  WhereLoop 
257f0 2a 2a 70 70 50 72 65 76 2c 0a 20 20 63 6f 6e 73  **ppPrev,.  cons
25800 74 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 54 65  t WhereLoop *pTe
25810 6d 70 6c 61 74 65 0a 29 7b 0a 20 20 57 68 65 72  mplate.){.  Wher
25820 65 4c 6f 6f 70 20 2a 70 3b 0a 20 20 66 6f 72 28  eLoop *p;.  for(
25830 70 3d 28 2a 70 70 50 72 65 76 29 3b 20 70 3b 20  p=(*ppPrev); p; 
25840 70 70 50 72 65 76 3d 26 70 2d 3e 70 4e 65 78 74  ppPrev=&p->pNext
25850 4c 6f 6f 70 2c 20 70 3d 2a 70 70 50 72 65 76 29  Loop, p=*ppPrev)
25860 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 54 61  {.    if( p->iTa
25870 62 21 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 69 54  b!=pTemplate->iT
25880 61 62 20 7c 7c 20 70 2d 3e 69 53 6f 72 74 49 64  ab || p->iSortId
25890 78 21 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 69 53  x!=pTemplate->iS
258a0 6f 72 74 49 64 78 20 29 7b 0a 20 20 20 20 20 20  ortIdx ){.      
258b0 2f 2a 20 49 66 20 65 69 74 68 65 72 20 74 68 65  /* If either the
258c0 20 69 54 61 62 20 6f 72 20 69 53 6f 72 74 49 64   iTab or iSortId
258d0 78 20 76 61 6c 75 65 73 20 66 6f 72 20 74 77 6f  x values for two
258e0 20 57 68 65 72 65 4c 6f 6f 70 20 61 72 65 20 64   WhereLoop are d
258f0 69 66 66 65 72 65 6e 74 0a 20 20 20 20 20 20 2a  ifferent.      *
25900 2a 20 74 68 65 6e 20 74 68 6f 73 65 20 57 68 65  * then those Whe
25910 72 65 4c 6f 6f 70 73 20 6e 65 65 64 20 74 6f 20  reLoops need to 
25920 62 65 20 63 6f 6e 73 69 64 65 72 65 64 20 73 65  be considered se
25930 70 61 72 61 74 65 6c 79 2e 20 20 4e 65 69 74 68  parately.  Neith
25940 65 72 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61  er is.      ** a
25950 20 63 61 6e 64 69 64 61 74 65 20 74 6f 20 72 65   candidate to re
25960 70 6c 61 63 65 20 74 68 65 20 6f 74 68 65 72 2e  place the other.
25970 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e   */.      contin
25980 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a  ue;.    }.    /*
25990 20 49 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   In the current 
259a0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2c 20  implementation, 
259b0 74 68 65 20 72 53 65 74 75 70 20 76 61 6c 75 65  the rSetup value
259c0 20 69 73 20 65 69 74 68 65 72 20 7a 65 72 6f 0a   is either zero.
259d0 20 20 20 20 2a 2a 20 6f 72 20 74 68 65 20 63 6f      ** or the co
259e0 73 74 20 6f 66 20 62 75 69 6c 64 69 6e 67 20 61  st of building a
259f0 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65  n automatic inde
25a00 78 20 28 4e 6c 6f 67 4e 29 20 61 6e 64 20 74 68  x (NlogN) and th
25a10 65 20 4e 6c 6f 67 4e 0a 20 20 20 20 2a 2a 20 69  e NlogN.    ** i
25a20 73 20 74 68 65 20 73 61 6d 65 20 66 6f 72 20 63  s the same for c
25a30 6f 6d 70 61 74 69 62 6c 65 20 57 68 65 72 65 4c  ompatible WhereL
25a40 6f 6f 70 73 2e 20 2a 2f 0a 20 20 20 20 61 73 73  oops. */.    ass
25a50 65 72 74 28 20 70 2d 3e 72 53 65 74 75 70 3d 3d  ert( p->rSetup==
25a60 30 20 7c 7c 20 70 54 65 6d 70 6c 61 74 65 2d 3e  0 || pTemplate->
25a70 72 53 65 74 75 70 3d 3d 30 20 0a 20 20 20 20 20  rSetup==0 .     
25a80 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70              || p
25a90 2d 3e 72 53 65 74 75 70 3d 3d 70 54 65 6d 70 6c  ->rSetup==pTempl
25aa0 61 74 65 2d 3e 72 53 65 74 75 70 20 29 3b 0a 0a  ate->rSetup );..
25ab0 20 20 20 20 2f 2a 20 77 68 65 72 65 4c 6f 6f 70      /* whereLoop
25ac0 41 64 64 42 74 72 65 65 28 29 20 61 6c 77 61 79  AddBtree() alway
25ad0 73 20 67 65 6e 65 72 61 74 65 73 20 61 6e 64 20  s generates and 
25ae0 69 6e 73 65 72 74 73 20 74 68 65 20 61 75 74 6f  inserts the auto
25af0 6d 61 74 69 63 20 69 6e 64 65 78 0a 20 20 20 20  matic index.    
25b00 2a 2a 20 63 61 73 65 20 66 69 72 73 74 2e 20 20  ** case first.  
25b10 48 65 6e 63 65 20 63 6f 6d 70 61 74 69 62 6c 65  Hence compatible
25b20 20 63 61 6e 64 69 64 61 74 65 20 57 68 65 72 65   candidate Where
25b30 4c 6f 6f 70 73 20 6e 65 76 65 72 20 68 61 76 65  Loops never have
25b40 20 61 20 6c 61 72 67 65 72 0a 20 20 20 20 2a 2a   a larger.    **
25b50 20 72 53 65 74 75 70 2e 20 43 61 6c 6c 20 74 68   rSetup. Call th
25b60 69 73 20 53 45 54 55 50 2d 49 4e 56 41 52 49 41  is SETUP-INVARIA
25b70 4e 54 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  NT */.    assert
25b80 28 20 70 2d 3e 72 53 65 74 75 70 3e 3d 70 54 65  ( p->rSetup>=pTe
25b90 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75 70 20 29  mplate->rSetup )
25ba0 3b 0a 0a 20 20 20 20 2f 2a 20 41 6e 79 20 6c 6f  ;..    /* Any lo
25bb0 6f 70 20 75 73 69 6e 67 20 61 6e 20 61 70 70 6c  op using an appl
25bc0 69 61 74 69 6f 6e 2d 64 65 66 69 6e 65 64 20 69  iation-defined i
25bd0 6e 64 65 78 20 28 6f 72 20 50 52 49 4d 41 52 59  ndex (or PRIMARY
25be0 20 4b 45 59 20 6f 72 0a 20 20 20 20 2a 2a 20 55   KEY or.    ** U
25bf0 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74  NIQUE constraint
25c00 29 20 77 69 74 68 20 6f 6e 65 20 6f 72 20 6d 6f  ) with one or mo
25c10 72 65 20 3d 3d 20 63 6f 6e 73 74 72 61 69 6e 74  re == constraint
25c20 73 20 69 73 20 62 65 74 74 65 72 0a 20 20 20 20  s is better.    
25c30 2a 2a 20 74 68 61 6e 20 61 6e 20 61 75 74 6f 6d  ** than an autom
25c40 61 74 69 63 20 69 6e 64 65 78 2e 20 55 6e 6c 65  atic index. Unle
25c50 73 73 20 69 74 20 69 73 20 61 20 73 6b 69 70 2d  ss it is a skip-
25c60 73 63 61 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28  scan. */.    if(
25c70 20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57   (p->wsFlags & W
25c80 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29  HERE_AUTO_INDEX)
25c90 21 3d 30 0a 20 20 20 20 20 26 26 20 28 70 54 65  !=0.     && (pTe
25ca0 6d 70 6c 61 74 65 2d 3e 6e 53 6b 69 70 29 3d 3d  mplate->nSkip)==
25cb0 30 0a 20 20 20 20 20 26 26 20 28 70 54 65 6d 70  0.     && (pTemp
25cc0 6c 61 74 65 2d 3e 77 73 46 6c 61 67 73 20 26 20  late->wsFlags & 
25cd0 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d  WHERE_INDEXED)!=
25ce0 30 0a 20 20 20 20 20 26 26 20 28 70 54 65 6d 70  0.     && (pTemp
25cf0 6c 61 74 65 2d 3e 77 73 46 6c 61 67 73 20 26 20  late->wsFlags & 
25d00 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 29  WHERE_COLUMN_EQ)
25d10 21 3d 30 0a 20 20 20 20 20 26 26 20 28 70 2d 3e  !=0.     && (p->
25d20 70 72 65 72 65 71 20 26 20 70 54 65 6d 70 6c 61  prereq & pTempla
25d30 74 65 2d 3e 70 72 65 72 65 71 29 3d 3d 70 54 65  te->prereq)==pTe
25d40 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65 71 0a 20  mplate->prereq. 
25d50 20 20 20 29 7b 0a 20 20 20 20 20 20 62 72 65 61     ){.      brea
25d60 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
25d70 20 49 66 20 65 78 69 73 74 69 6e 67 20 57 68 65   If existing Whe
25d80 72 65 4c 6f 6f 70 20 70 20 69 73 20 62 65 74 74  reLoop p is bett
25d90 65 72 20 74 68 61 6e 20 70 54 65 6d 70 6c 61 74  er than pTemplat
25da0 65 2c 20 70 54 65 6d 70 6c 61 74 65 20 63 61 6e  e, pTemplate can
25db0 20 62 65 0a 20 20 20 20 2a 2a 20 64 69 73 63 61   be.    ** disca
25dc0 72 64 65 64 2e 20 20 57 68 65 72 65 4c 6f 6f 70  rded.  WhereLoop
25dd0 20 70 20 69 73 20 62 65 74 74 65 72 20 69 66 3a   p is better if:
25de0 0a 20 20 20 20 2a 2a 20 20 20 28 31 29 20 20 70  .    **   (1)  p
25df0 20 68 61 73 20 6e 6f 20 6d 6f 72 65 20 64 65 70   has no more dep
25e00 65 6e 64 65 6e 63 69 65 73 20 74 68 61 6e 20 70  endencies than p
25e10 54 65 6d 70 6c 61 74 65 2c 20 61 6e 64 0a 20 20  Template, and.  
25e20 20 20 2a 2a 20 20 20 28 32 29 20 20 70 20 68 61    **   (2)  p ha
25e30 73 20 61 6e 20 65 71 75 61 6c 20 6f 72 20 6c 6f  s an equal or lo
25e40 77 65 72 20 63 6f 73 74 20 74 68 61 6e 20 70 54  wer cost than pT
25e50 65 6d 70 6c 61 74 65 0a 20 20 20 20 2a 2f 0a 20  emplate.    */. 
25e60 20 20 20 69 66 28 20 28 70 2d 3e 70 72 65 72 65     if( (p->prere
25e70 71 20 26 20 70 54 65 6d 70 6c 61 74 65 2d 3e 70  q & pTemplate->p
25e80 72 65 72 65 71 29 3d 3d 70 2d 3e 70 72 65 72 65  rereq)==p->prere
25e90 71 20 20 20 20 2f 2a 20 28 31 29 20 20 2a 2f 0a  q    /* (1)  */.
25ea0 20 20 20 20 20 26 26 20 70 2d 3e 72 53 65 74 75       && p->rSetu
25eb0 70 3c 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53  p<=pTemplate->rS
25ec0 65 74 75 70 20 20 20 20 20 20 20 20 20 20 20 20  etup            
25ed0 20 20 20 20 20 20 2f 2a 20 28 32 61 29 20 2a 2f        /* (2a) */
25ee0 0a 20 20 20 20 20 26 26 20 70 2d 3e 72 52 75 6e  .     && p->rRun
25ef0 3c 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75  <=pTemplate->rRu
25f00 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n               
25f10 20 20 20 20 20 20 20 2f 2a 20 28 32 62 29 20 2a         /* (2b) *
25f20 2f 0a 20 20 20 20 20 26 26 20 70 2d 3e 6e 4f 75  /.     && p->nOu
25f30 74 3c 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f  t<=pTemplate->nO
25f40 75 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ut              
25f50 20 20 20 20 20 20 20 20 2f 2a 20 28 32 63 29 20          /* (2c) 
25f60 2a 2f 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  */.    ){.      
25f70 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 44 69  return 0;  /* Di
25f80 73 63 61 72 64 20 70 54 65 6d 70 6c 61 74 65 20  scard pTemplate 
25f90 2a 2f 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  */.    }..    /*
25fa0 20 49 66 20 70 54 65 6d 70 6c 61 74 65 20 69 73   If pTemplate is
25fb0 20 61 6c 77 61 79 73 20 62 65 74 74 65 72 20 74   always better t
25fc0 68 61 6e 20 70 2c 20 74 68 65 6e 20 63 61 75 73  han p, then caus
25fd0 65 20 70 20 74 6f 20 62 65 20 6f 76 65 72 77 72  e p to be overwr
25fe0 69 74 74 65 6e 0a 20 20 20 20 2a 2a 20 77 69 74  itten.    ** wit
25ff0 68 20 70 54 65 6d 70 6c 61 74 65 2e 20 20 70 54  h pTemplate.  pT
26000 65 6d 70 6c 61 74 65 20 69 73 20 62 65 74 74 65  emplate is bette
26010 72 20 74 68 61 6e 20 70 20 69 66 3a 0a 20 20 20  r than p if:.   
26020 20 2a 2a 20 20 20 28 31 29 20 20 70 54 65 6d 70   **   (1)  pTemp
26030 6c 61 74 65 20 68 61 73 20 6e 6f 20 6d 6f 72 65  late has no more
26040 20 64 65 70 65 6e 64 65 6e 63 65 73 20 74 68 61   dependences tha
26050 6e 20 70 2c 20 61 6e 64 0a 20 20 20 20 2a 2a 20  n p, and.    ** 
26060 20 20 28 32 29 20 20 70 54 65 6d 70 6c 61 74 65    (2)  pTemplate
26070 20 68 61 73 20 61 6e 20 65 71 75 61 6c 20 6f 72   has an equal or
26080 20 6c 6f 77 65 72 20 63 6f 73 74 20 74 68 61 6e   lower cost than
26090 20 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69   p..    */.    i
260a0 66 28 20 28 70 2d 3e 70 72 65 72 65 71 20 26 20  f( (p->prereq & 
260b0 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65  pTemplate->prere
260c0 71 29 3d 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 70  q)==pTemplate->p
260d0 72 65 72 65 71 20 20 20 2f 2a 20 28 31 29 20 20  rereq   /* (1)  
260e0 2a 2f 0a 20 20 20 20 20 26 26 20 70 2d 3e 72 52  */.     && p->rR
260f0 75 6e 3e 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72  un>=pTemplate->r
26100 52 75 6e 20 20 20 20 20 20 20 20 20 20 20 20 20  Run             
26110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26120 2f 2a 20 28 32 61 29 20 2a 2f 0a 20 20 20 20 20  /* (2a) */.     
26130 26 26 20 70 2d 3e 6e 4f 75 74 3e 3d 70 54 65 6d  && p->nOut>=pTem
26140 70 6c 61 74 65 2d 3e 6e 4f 75 74 20 20 20 20 20  plate->nOut     
26150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26160 20 20 20 20 20 20 20 20 2f 2a 20 28 32 62 29 20          /* (2b) 
26170 2a 2f 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  */.    ){.      
26180 61 73 73 65 72 74 28 20 70 2d 3e 72 53 65 74 75  assert( p->rSetu
26190 70 3e 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53  p>=pTemplate->rS
261a0 65 74 75 70 20 29 3b 20 2f 2a 20 53 45 54 55 50  etup ); /* SETUP
261b0 2d 49 4e 56 41 52 49 41 4e 54 20 61 62 6f 76 65  -INVARIANT above
261c0 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   */.      break;
261d0 20 20 20 2f 2a 20 43 61 75 73 65 20 70 20 74 6f     /* Cause p to
261e0 20 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e 20   be overwritten 
261f0 62 79 20 70 54 65 6d 70 6c 61 74 65 20 2a 2f 0a  by pTemplate */.
26200 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
26210 72 6e 20 70 70 50 72 65 76 3b 0a 7d 0a 0a 2f 2a  rn ppPrev;.}../*
26220 0a 2a 2a 20 49 6e 73 65 72 74 20 6f 72 20 72 65  .** Insert or re
26230 70 6c 61 63 65 20 61 20 57 68 65 72 65 4c 6f 6f  place a WhereLoo
26240 70 20 65 6e 74 72 79 20 75 73 69 6e 67 20 74 68  p entry using th
26250 65 20 74 65 6d 70 6c 61 74 65 20 73 75 70 70 6c  e template suppl
26260 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78  ied..**.** An ex
26270 69 73 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70  isting WhereLoop
26280 20 65 6e 74 72 79 20 6d 69 67 68 74 20 62 65 20   entry might be 
26290 6f 76 65 72 77 72 69 74 74 65 6e 20 69 66 20 74  overwritten if t
262a0 68 65 20 6e 65 77 20 74 65 6d 70 6c 61 74 65 0a  he new template.
262b0 2a 2a 20 69 73 20 62 65 74 74 65 72 20 61 6e 64  ** is better and
262c0 20 68 61 73 20 66 65 77 65 72 20 64 65 70 65 6e   has fewer depen
262d0 64 65 6e 63 69 65 73 2e 20 20 4f 72 20 74 68 65  dencies.  Or the
262e0 20 74 65 6d 70 6c 61 74 65 20 77 69 6c 6c 20 62   template will b
262f0 65 20 69 67 6e 6f 72 65 64 0a 2a 2a 20 61 6e 64  e ignored.** and
26300 20 6e 6f 20 69 6e 73 65 72 74 20 77 69 6c 6c 20   no insert will 
26310 6f 63 63 75 72 20 69 66 20 61 6e 20 65 78 69 73  occur if an exis
26320 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 69  ting WhereLoop i
26330 73 20 66 61 73 74 65 72 20 61 6e 64 20 68 61 73  s faster and has
26340 0a 2a 2a 20 66 65 77 65 72 20 64 65 70 65 6e 64  .** fewer depend
26350 65 6e 63 69 65 73 20 74 68 61 6e 20 74 68 65 20  encies than the 
26360 74 65 6d 70 6c 61 74 65 2e 20 20 4f 74 68 65 72  template.  Other
26370 77 69 73 65 20 61 20 6e 65 77 20 57 68 65 72 65  wise a new Where
26380 4c 6f 6f 70 20 69 73 0a 2a 2a 20 61 64 64 65 64  Loop is.** added
26390 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 74 65   based on the te
263a0 6d 70 6c 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  mplate..**.** If
263b0 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65   pBuilder->pOrSe
263c0 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68  t is not NULL th
263d0 65 6e 20 77 65 20 63 61 72 65 20 61 62 6f 75 74  en we care about
263e0 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 70 72 65   only the.** pre
263f0 72 65 71 75 69 73 69 74 65 73 20 61 6e 64 20 72  requisites and r
26400 52 75 6e 20 61 6e 64 20 6e 4f 75 74 20 63 6f 73  Run and nOut cos
26410 74 73 20 6f 66 20 74 68 65 20 4e 20 62 65 73 74  ts of the N best
26420 20 6c 6f 6f 70 73 2e 20 20 54 68 61 74 0a 2a 2a   loops.  That.**
26430 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
26440 67 61 74 68 65 72 65 64 20 69 6e 20 74 68 65 20  gathered in the 
26450 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74  pBuilder->pOrSet
26460 20 6f 62 6a 65 63 74 2e 20 20 54 68 69 73 20 73   object.  This s
26470 70 65 63 69 61 6c 0a 2a 2a 20 70 72 6f 63 65 73  pecial.** proces
26480 73 69 6e 67 20 6d 6f 64 65 20 69 73 20 75 73 65  sing mode is use
26490 64 20 6f 6e 6c 79 20 66 6f 72 20 4f 52 20 63 6c  d only for OR cl
264a0 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e  ause processing.
264b0 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61 63 63 75  .**.** When accu
264c0 6d 75 6c 61 74 69 6e 67 20 6d 75 6c 74 69 70 6c  mulating multipl
264d0 65 20 6c 6f 6f 70 73 20 28 77 68 65 6e 20 70 42  e loops (when pB
264e0 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20 69  uilder->pOrSet i
264f0 73 20 4e 55 4c 4c 29 20 77 65 0a 2a 2a 20 73 74  s NULL) we.** st
26500 69 6c 6c 20 6d 69 67 68 74 20 6f 76 65 72 77 72  ill might overwr
26510 69 74 65 20 73 69 6d 69 6c 61 72 20 6c 6f 6f 70  ite similar loop
26520 73 20 77 69 74 68 20 74 68 65 20 6e 65 77 20 74  s with the new t
26530 65 6d 70 6c 61 74 65 20 69 66 20 74 68 65 0a 2a  emplate if the.*
26540 2a 20 6e 65 77 20 74 65 6d 70 6c 61 74 65 20 69  * new template i
26550 73 20 62 65 74 74 65 72 2e 20 20 4c 6f 6f 70 73  s better.  Loops
26560 20 6d 61 79 20 62 65 20 6f 76 65 72 77 72 69 74   may be overwrit
26570 74 65 6e 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f  ten if the follo
26580 77 69 6e 67 20 0a 2a 2a 20 63 6f 6e 64 69 74 69  wing .** conditi
26590 6f 6e 73 20 61 72 65 20 6d 65 74 3a 0a 2a 2a 0a  ons are met:.**.
265a0 2a 2a 20 20 20 20 28 31 29 20 20 54 68 65 79 20  **    (1)  They 
265b0 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 69 54  have the same iT
265c0 61 62 2e 0a 2a 2a 20 20 20 20 28 32 29 20 20 54  ab..**    (2)  T
265d0 68 65 79 20 68 61 76 65 20 74 68 65 20 73 61 6d  hey have the sam
265e0 65 20 69 53 6f 72 74 49 64 78 2e 0a 2a 2a 20 20  e iSortIdx..**  
265f0 20 20 28 33 29 20 20 54 68 65 20 74 65 6d 70 6c    (3)  The templ
26600 61 74 65 20 68 61 73 20 73 61 6d 65 20 6f 72 20  ate has same or 
26610 66 65 77 65 72 20 64 65 70 65 6e 64 65 6e 63 69  fewer dependenci
26620 65 73 20 74 68 61 6e 20 74 68 65 20 63 75 72 72  es than the curr
26630 65 6e 74 20 6c 6f 6f 70 0a 2a 2a 20 20 20 20 28  ent loop.**    (
26640 34 29 20 20 54 68 65 20 74 65 6d 70 6c 61 74 65  4)  The template
26650 20 68 61 73 20 74 68 65 20 73 61 6d 65 20 6f 72   has the same or
26660 20 6c 6f 77 65 72 20 63 6f 73 74 20 74 68 61 6e   lower cost than
26670 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f   the current loo
26680 70 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  p.*/.static int 
26690 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28  whereLoopInsert(
266a0 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72  WhereLoopBuilder
266b0 20 2a 70 42 75 69 6c 64 65 72 2c 20 57 68 65 72   *pBuilder, Wher
266c0 65 4c 6f 6f 70 20 2a 70 54 65 6d 70 6c 61 74 65  eLoop *pTemplate
266d0 29 7b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  ){.  WhereLoop *
266e0 2a 70 70 50 72 65 76 2c 20 2a 70 3b 0a 20 20 57  *ppPrev, *p;.  W
266f0 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
26700 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49   = pBuilder->pWI
26710 6e 66 6f 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  nfo;.  sqlite3 *
26720 64 62 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61  db = pWInfo->pPa
26730 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 49  rse->db;..  /* I
26740 66 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53  f pBuilder->pOrS
26750 65 74 20 69 73 20 64 65 66 69 6e 65 64 2c 20 74  et is defined, t
26760 68 65 6e 20 6f 6e 6c 79 20 6b 65 65 70 20 74 72  hen only keep tr
26770 61 63 6b 20 6f 66 20 74 68 65 20 63 6f 73 74 73  ack of the costs
26780 0a 20 20 2a 2a 20 61 6e 64 20 70 72 65 72 65 71  .  ** and prereq
26790 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42  s..  */.  if( pB
267a0 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 21 3d  uilder->pOrSet!=
267b0 30 20 29 7b 0a 23 69 66 20 57 48 45 52 45 54 52  0 ){.#if WHERETR
267c0 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20  ACE_ENABLED.    
267d0 75 31 36 20 6e 20 3d 20 70 42 75 69 6c 64 65 72  u16 n = pBuilder
267e0 2d 3e 70 4f 72 53 65 74 2d 3e 6e 3b 0a 20 20 20  ->pOrSet->n;.   
267f0 20 69 6e 74 20 78 20 3d 0a 23 65 6e 64 69 66 0a   int x =.#endif.
26800 20 20 20 20 77 68 65 72 65 4f 72 49 6e 73 65 72      whereOrInser
26810 74 28 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53  t(pBuilder->pOrS
26820 65 74 2c 20 70 54 65 6d 70 6c 61 74 65 2d 3e 70  et, pTemplate->p
26830 72 65 72 65 71 2c 20 70 54 65 6d 70 6c 61 74 65  rereq, pTemplate
26840 2d 3e 72 52 75 6e 2c 0a 20 20 20 20 20 20 20 20  ->rRun,.        
26850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26860 20 20 20 20 20 20 20 20 20 20 20 20 70 54 65 6d              pTem
26870 70 6c 61 74 65 2d 3e 6e 4f 75 74 29 3b 0a 23 69  plate->nOut);.#i
26880 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  f WHERETRACE_ENA
26890 42 4c 45 44 20 2f 2a 20 30 78 38 20 2a 2f 0a 20  BLED /* 0x8 */. 
268a0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68     if( sqlite3Wh
268b0 65 72 65 54 72 61 63 65 20 26 20 30 78 38 20 29  ereTrace & 0x8 )
268c0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
268d0 65 62 75 67 50 72 69 6e 74 66 28 78 3f 22 20 20  ebugPrintf(x?"  
268e0 20 6f 72 2d 25 64 3a 20 20 22 3a 22 20 20 20 6f   or-%d:  ":"   o
268f0 72 2d 58 3a 20 20 22 2c 20 6e 29 3b 0a 20 20 20  r-X:  ", n);.   
26900 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e     whereLoopPrin
26910 74 28 70 54 65 6d 70 6c 61 74 65 2c 20 70 42 75  t(pTemplate, pBu
26920 69 6c 64 65 72 2d 3e 70 57 43 29 3b 0a 20 20 20  ilder->pWC);.   
26930 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65   }.#endif.    re
26940 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
26950 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 66    }..  /* Look f
26960 6f 72 20 61 6e 20 65 78 69 73 74 69 6e 67 20 57  or an existing W
26970 68 65 72 65 4c 6f 6f 70 20 74 6f 20 72 65 70 6c  hereLoop to repl
26980 61 63 65 20 77 69 74 68 20 70 54 65 6d 70 6c 61  ace with pTempla
26990 74 65 0a 20 20 2a 2f 0a 20 20 77 68 65 72 65 4c  te.  */.  whereL
269a0 6f 6f 70 41 64 6a 75 73 74 43 6f 73 74 28 70 57  oopAdjustCost(pW
269b0 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 70 54  Info->pLoops, pT
269c0 65 6d 70 6c 61 74 65 29 3b 0a 20 20 70 70 50 72  emplate);.  ppPr
269d0 65 76 20 3d 20 77 68 65 72 65 4c 6f 6f 70 46 69  ev = whereLoopFi
269e0 6e 64 4c 65 73 73 65 72 28 26 70 57 49 6e 66 6f  ndLesser(&pWInfo
269f0 2d 3e 70 4c 6f 6f 70 73 2c 20 70 54 65 6d 70 6c  ->pLoops, pTempl
26a00 61 74 65 29 3b 0a 0a 20 20 69 66 28 20 70 70 50  ate);..  if( ppP
26a10 72 65 76 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  rev==0 ){.    /*
26a20 20 54 68 65 72 65 20 61 6c 72 65 61 64 79 20 65   There already e
26a30 78 69 73 74 73 20 61 20 57 68 65 72 65 4c 6f 6f  xists a WhereLoo
26a40 70 20 6f 6e 20 74 68 65 20 6c 69 73 74 20 74 68  p on the list th
26a50 61 74 20 69 73 20 62 65 74 74 65 72 0a 20 20 20  at is better.   
26a60 20 2a 2a 20 74 68 61 6e 20 70 54 65 6d 70 6c 61   ** than pTempla
26a70 74 65 2c 20 73 6f 20 6a 75 73 74 20 69 67 6e 6f  te, so just igno
26a80 72 65 20 70 54 65 6d 70 6c 61 74 65 20 2a 2f 0a  re pTemplate */.
26a90 23 69 66 20 57 48 45 52 45 54 52 41 43 45 5f 45  #if WHERETRACE_E
26aa0 4e 41 42 4c 45 44 20 2f 2a 20 30 78 38 20 2a 2f  NABLED /* 0x8 */
26ab0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
26ac0 57 68 65 72 65 54 72 61 63 65 20 26 20 30 78 38  WhereTrace & 0x8
26ad0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
26ae0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20  3DebugPrintf("  
26af0 20 73 6b 69 70 3a 20 22 29 3b 0a 20 20 20 20 20   skip: ");.     
26b00 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28   whereLoopPrint(
26b10 70 54 65 6d 70 6c 61 74 65 2c 20 70 42 75 69 6c  pTemplate, pBuil
26b20 64 65 72 2d 3e 70 57 43 29 3b 0a 20 20 20 20 7d  der->pWC);.    }
26b30 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75  .#endif.    retu
26b40 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 0a  rn SQLITE_OK;  .
26b50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20 3d    }else{.    p =
26b60 20 2a 70 70 50 72 65 76 3b 0a 20 20 7d 0a 0a 20   *ppPrev;.  }.. 
26b70 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68 20   /* If we reach 
26b80 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20 6d 65  this point it me
26b90 61 6e 73 20 74 68 61 74 20 65 69 74 68 65 72 20  ans that either 
26ba0 70 5b 5d 20 73 68 6f 75 6c 64 20 62 65 20 6f 76  p[] should be ov
26bb0 65 72 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20 77  erwritten.  ** w
26bc0 69 74 68 20 70 54 65 6d 70 6c 61 74 65 5b 5d 20  ith pTemplate[] 
26bd0 69 66 20 70 5b 5d 20 65 78 69 73 74 73 2c 20 6f  if p[] exists, o
26be0 72 20 69 66 20 70 3d 3d 4e 55 4c 4c 20 74 68 65  r if p==NULL the
26bf0 6e 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  n allocate a new
26c00 0a 20 20 2a 2a 20 57 68 65 72 65 4c 6f 6f 70 20  .  ** WhereLoop 
26c10 61 6e 64 20 69 6e 73 65 72 74 20 69 74 2e 0a 20  and insert it.. 
26c20 20 2a 2f 0a 23 69 66 20 57 48 45 52 45 54 52 41   */.#if WHERETRA
26c30 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78  CE_ENABLED /* 0x
26c40 38 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74  8 */.  if( sqlit
26c50 65 33 57 68 65 72 65 54 72 61 63 65 20 26 20 30  e3WhereTrace & 0
26c60 78 38 20 29 7b 0a 20 20 20 20 69 66 28 20 70 21  x8 ){.    if( p!
26c70 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
26c80 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
26c90 72 65 70 6c 61 63 65 3a 20 22 29 3b 0a 20 20 20  replace: ");.   
26ca0 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e     whereLoopPrin
26cb0 74 28 70 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70  t(p, pBuilder->p
26cc0 57 43 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  WC);.    }.    s
26cd0 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
26ce0 66 28 22 20 20 20 20 61 64 64 3a 20 22 29 3b 0a  f("    add: ");.
26cf0 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69      whereLoopPri
26d00 6e 74 28 70 54 65 6d 70 6c 61 74 65 2c 20 70 42  nt(pTemplate, pB
26d10 75 69 6c 64 65 72 2d 3e 70 57 43 29 3b 0a 20 20  uilder->pWC);.  
26d20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70  }.#endif.  if( p
26d30 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6c  ==0 ){.    /* Al
26d40 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 57 68 65  locate a new Whe
26d50 72 65 4c 6f 6f 70 20 74 6f 20 61 64 64 20 74 6f  reLoop to add to
26d60 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
26d70 6c 69 73 74 20 2a 2f 0a 20 20 20 20 2a 70 70 50  list */.    *ppP
26d80 72 65 76 20 3d 20 70 20 3d 20 73 71 6c 69 74 65  rev = p = sqlite
26d90 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c  3DbMallocRaw(db,
26da0 20 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f   sizeof(WhereLoo
26db0 70 29 29 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d  p));.    if( p==
26dc0 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
26dd0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 77 68 65  E_NOMEM;.    whe
26de0 72 65 4c 6f 6f 70 49 6e 69 74 28 70 29 3b 0a 20  reLoopInit(p);. 
26df0 20 20 20 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 20     p->pNextLoop 
26e00 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
26e10 20 20 2f 2a 20 57 65 20 77 69 6c 6c 20 62 65 20    /* We will be 
26e20 6f 76 65 72 77 72 69 74 69 6e 67 20 57 68 65 72  overwriting Wher
26e30 65 4c 6f 6f 70 20 70 5b 5d 2e 20 20 42 75 74 20  eLoop p[].  But 
26e40 62 65 66 6f 72 65 20 77 65 20 64 6f 2c 20 66 69  before we do, fi
26e50 72 73 74 0a 20 20 20 20 2a 2a 20 67 6f 20 74 68  rst.    ** go th
26e60 72 6f 75 67 68 20 74 68 65 20 72 65 73 74 20 6f  rough the rest o
26e70 66 20 74 68 65 20 6c 69 73 74 20 61 6e 64 20 64  f the list and d
26e80 65 6c 65 74 65 20 61 6e 79 20 6f 74 68 65 72 20  elete any other 
26e90 65 6e 74 72 69 65 73 20 62 65 73 69 64 65 73 0a  entries besides.
26ea0 20 20 20 20 2a 2a 20 70 5b 5d 20 74 68 61 74 20      ** p[] that 
26eb0 61 72 65 20 61 6c 73 6f 20 73 75 70 70 6c 61 74  are also supplat
26ec0 65 64 20 62 79 20 70 54 65 6d 70 6c 61 74 65 20  ed by pTemplate 
26ed0 2a 2f 0a 20 20 20 20 57 68 65 72 65 4c 6f 6f 70  */.    WhereLoop
26ee0 20 2a 2a 70 70 54 61 69 6c 20 3d 20 26 70 2d 3e   **ppTail = &p->
26ef0 70 4e 65 78 74 4c 6f 6f 70 3b 0a 20 20 20 20 57  pNextLoop;.    W
26f00 68 65 72 65 4c 6f 6f 70 20 2a 70 54 6f 44 65 6c  hereLoop *pToDel
26f10 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 2a 70 70  ;.    while( *pp
26f20 54 61 69 6c 20 29 7b 0a 20 20 20 20 20 20 70 70  Tail ){.      pp
26f30 54 61 69 6c 20 3d 20 77 68 65 72 65 4c 6f 6f 70  Tail = whereLoop
26f40 46 69 6e 64 4c 65 73 73 65 72 28 70 70 54 61 69  FindLesser(ppTai
26f50 6c 2c 20 70 54 65 6d 70 6c 61 74 65 29 3b 0a 20  l, pTemplate);. 
26f60 20 20 20 20 20 69 66 28 20 70 70 54 61 69 6c 3d       if( ppTail=
26f70 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
26f80 20 20 70 54 6f 44 65 6c 20 3d 20 2a 70 70 54 61    pToDel = *ppTa
26f90 69 6c 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54  il;.      if( pT
26fa0 6f 44 65 6c 3d 3d 30 20 29 20 62 72 65 61 6b 3b  oDel==0 ) break;
26fb0 0a 20 20 20 20 20 20 2a 70 70 54 61 69 6c 20 3d  .      *ppTail =
26fc0 20 70 54 6f 44 65 6c 2d 3e 70 4e 65 78 74 4c 6f   pToDel->pNextLo
26fd0 6f 70 3b 0a 23 69 66 20 57 48 45 52 45 54 52 41  op;.#if WHERETRA
26fe0 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78  CE_ENABLED /* 0x
26ff0 38 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 73  8 */.      if( s
27000 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65  qlite3WhereTrace
27010 20 26 20 30 78 38 20 29 7b 0a 20 20 20 20 20 20   & 0x8 ){.      
27020 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
27030 69 6e 74 66 28 22 20 64 65 6c 65 74 65 3a 20 22  intf(" delete: "
27040 29 3b 0a 20 20 20 20 20 20 20 20 77 68 65 72 65  );.        where
27050 4c 6f 6f 70 50 72 69 6e 74 28 70 54 6f 44 65 6c  LoopPrint(pToDel
27060 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 29  , pBuilder->pWC)
27070 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
27080 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70  .      whereLoop
27090 44 65 6c 65 74 65 28 64 62 2c 20 70 54 6f 44 65  Delete(db, pToDe
270a0 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  l);.    }.  }.  
270b0 77 68 65 72 65 4c 6f 6f 70 58 66 65 72 28 64 62  whereLoopXfer(db
270c0 2c 20 70 2c 20 70 54 65 6d 70 6c 61 74 65 29 3b  , p, pTemplate);
270d0 0a 20 20 69 66 28 20 28 70 2d 3e 77 73 46 6c 61  .  if( (p->wsFla
270e0 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55  gs & WHERE_VIRTU
270f0 41 4c 54 41 42 4c 45 29 3d 3d 30 20 29 7b 0a 20  ALTABLE)==0 ){. 
27100 20 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78     Index *pIndex
27110 20 3d 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49   = p->u.btree.pI
27120 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20 70 49  ndex;.    if( pI
27130 6e 64 65 78 20 26 26 20 70 49 6e 64 65 78 2d 3e  ndex && pIndex->
27140 74 6e 75 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20  tnum==0 ){.     
27150 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64   p->u.btree.pInd
27160 65 78 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  ex = 0;.    }.  
27170 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
27180 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  E_OK;.}../*.** A
27190 64 6a 75 73 74 20 74 68 65 20 57 68 65 72 65 4c  djust the WhereL
271a0 6f 6f 70 2e 6e 4f 75 74 20 76 61 6c 75 65 20 64  oop.nOut value d
271b0 6f 77 6e 77 61 72 64 20 74 6f 20 61 63 63 6f 75  ownward to accou
271c0 6e 74 20 66 6f 72 20 74 65 72 6d 73 20 6f 66 20  nt for terms of 
271d0 74 68 65 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61  the.** WHERE cla
271e0 75 73 65 20 74 68 61 74 20 72 65 66 65 72 65 6e  use that referen
271f0 63 65 20 74 68 65 20 6c 6f 6f 70 20 62 75 74 20  ce the loop but 
27200 77 68 69 63 68 20 61 72 65 20 6e 6f 74 20 75 73  which are not us
27210 65 64 20 62 79 20 61 6e 0a 2a 2a 20 69 6e 64 65  ed by an.** inde
27220 78 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20  x..**.** In the 
27230 63 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e  current implemen
27240 74 61 74 69 6f 6e 2c 20 74 68 65 20 66 69 72 73  tation, the firs
27250 74 20 65 78 74 72 61 20 57 48 45 52 45 20 63 6c  t extra WHERE cl
27260 61 75 73 65 20 74 65 72 6d 20 72 65 64 75 63 65  ause term reduce
27270 73 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20  s.** the number 
27280 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20 62  of output rows b
27290 79 20 61 20 66 61 63 74 6f 72 20 6f 66 20 31 30  y a factor of 10
272a0 20 61 6e 64 20 65 61 63 68 20 61 64 64 69 74 69   and each additi
272b0 6f 6e 61 6c 20 74 65 72 6d 0a 2a 2a 20 72 65 64  onal term.** red
272c0 75 63 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20  uces the number 
272d0 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20 62  of output rows b
272e0 79 20 73 71 72 74 28 32 29 2e 0a 2a 2f 0a 73 74  y sqrt(2)..*/.st
272f0 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 4c  atic void whereL
27300 6f 6f 70 4f 75 74 70 75 74 41 64 6a 75 73 74 28  oopOutputAdjust(
27310 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
27320 70 57 43 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  pWC,      /* The
27330 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
27340 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c  .  WhereLoop *pL
27350 6f 6f 70 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  oop,      /* The
27360 20 6c 6f 6f 70 20 74 6f 20 61 64 6a 75 73 74 20   loop to adjust 
27370 64 6f 77 6e 77 61 72 64 20 2a 2f 0a 20 20 4c 6f  downward */.  Lo
27380 67 45 73 74 20 6e 52 6f 77 20 20 20 20 20 20 20  gEst nRow       
27390 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
273a0 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 65 6e  f rows in the en
273b0 74 69 72 65 20 74 61 62 6c 65 20 2a 2f 0a 29 7b  tire table */.){
273c0 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
273d0 65 72 6d 2c 20 2a 70 58 3b 0a 20 20 42 69 74 6d  erm, *pX;.  Bitm
273e0 61 73 6b 20 6e 6f 74 41 6c 6c 6f 77 65 64 20 3d  ask notAllowed =
273f0 20 7e 28 70 4c 6f 6f 70 2d 3e 70 72 65 72 65 71   ~(pLoop->prereq
27400 7c 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66  |pLoop->maskSelf
27410 29 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  );.  int i, j;. 
27420 20 69 6e 74 20 6e 45 71 20 3d 20 30 3b 20 20 20   int nEq = 0;   
27430 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 3d 20   /* Number of = 
27440 63 6f 6e 73 74 72 61 69 6e 74 73 20 6e 6f 74 20  constraints not 
27450 77 69 74 68 69 6e 20 6c 69 6b 65 6c 79 28 29 2f  within likely()/
27460 75 6e 6c 69 6b 65 6c 79 28 29 20 2a 2f 0a 0a 20  unlikely() */.. 
27470 20 61 73 73 65 72 74 28 20 28 70 4c 6f 6f 70 2d   assert( (pLoop-
27480 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
27490 5f 41 55 54 4f 5f 49 4e 44 45 58 29 3d 3d 30 20  _AUTO_INDEX)==0 
274a0 29 3b 0a 20 20 66 6f 72 28 69 3d 70 57 43 2d 3e  );.  for(i=pWC->
274b0 6e 54 65 72 6d 2c 20 70 54 65 72 6d 3d 70 57 43  nTerm, pTerm=pWC
274c0 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70  ->a; i>0; i--, p
274d0 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28  Term++){.    if(
274e0 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73   (pTerm->wtFlags
274f0 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 29   & TERM_VIRTUAL)
27500 21 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  !=0 ) break;.   
27510 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65   if( (pTerm->pre
27520 72 65 71 41 6c 6c 20 26 20 70 4c 6f 6f 70 2d 3e  reqAll & pLoop->
27530 6d 61 73 6b 53 65 6c 66 29 3d 3d 30 20 29 20 63  maskSelf)==0 ) c
27540 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
27550 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41   (pTerm->prereqA
27560 6c 6c 20 26 20 6e 6f 74 41 6c 6c 6f 77 65 64 29  ll & notAllowed)
27570 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  !=0 ) continue;.
27580 20 20 20 20 66 6f 72 28 6a 3d 70 4c 6f 6f 70 2d      for(j=pLoop-
27590 3e 6e 4c 54 65 72 6d 2d 31 3b 20 6a 3e 3d 30 3b  >nLTerm-1; j>=0;
275a0 20 6a 2d 2d 29 7b 0a 20 20 20 20 20 20 70 58 20   j--){.      pX 
275b0 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b  = pLoop->aLTerm[
275c0 6a 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 58  j];.      if( pX
275d0 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
275e0 20 20 20 20 20 20 69 66 28 20 70 58 3d 3d 70 54        if( pX==pT
275f0 65 72 6d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  erm ) break;.   
27600 20 20 20 69 66 28 20 70 58 2d 3e 69 50 61 72 65     if( pX->iPare
27610 6e 74 3e 3d 30 20 26 26 20 28 26 70 57 43 2d 3e  nt>=0 && (&pWC->
27620 61 5b 70 58 2d 3e 69 50 61 72 65 6e 74 5d 29 3d  a[pX->iParent])=
27630 3d 70 54 65 72 6d 20 29 20 62 72 65 61 6b 3b 0a  =pTerm ) break;.
27640 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6a 3c      }.    if( j<
27650 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  0 ){.      if( p
27660 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3c  Term->truthProb<
27670 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c  =0 ){.        pL
27680 6f 6f 70 2d 3e 6e 4f 75 74 20 2b 3d 20 70 54 65  oop->nOut += pTe
27690 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3b 0a 20  rm->truthProb;. 
276a0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
276b0 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 2d      pLoop->nOut-
276c0 2d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  -;.        if( p
276d0 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 26  Term->eOperator&
276e0 57 4f 5f 45 51 20 29 20 6e 45 71 2b 2b 3b 0a 20  WO_EQ ) nEq++;. 
276f0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
27700 0a 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 20 49  .  /* TUNING:  I
27710 66 20 74 68 65 72 65 20 69 73 20 61 74 20 6c 65  f there is at le
27720 61 73 74 20 6f 6e 65 20 65 71 75 61 6c 69 74 79  ast one equality
27730 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 6e 20 74   constraint in t
27740 68 65 20 57 48 45 52 45 0a 20 20 2a 2a 20 63 6c  he WHERE.  ** cl
27750 61 75 73 65 20 74 68 61 74 20 64 6f 65 73 20 6e  ause that does n
27760 6f 74 20 68 61 76 65 20 61 20 6c 69 6b 65 6c 69  ot have a likeli
27770 68 6f 6f 64 28 29 20 65 78 70 6c 69 63 69 74 6c  hood() explicitl
27780 79 20 61 73 73 69 67 6e 65 64 20 74 6f 20 69 74  y assigned to it
27790 0a 20 20 2a 2a 20 74 68 65 6e 20 64 6f 20 6e 6f  .  ** then do no
277a0 74 20 6c 65 74 20 74 68 65 20 65 73 74 69 6d 61  t let the estima
277b0 74 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75  ted number of ou
277c0 74 70 75 74 20 72 6f 77 73 20 65 78 63 65 65 64  tput rows exceed
277d0 20 68 61 6c 66 20 0a 20 20 2a 2a 20 74 68 65 20   half .  ** the 
277e0 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69  number of rows i
277f0 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 2a 2f 0a  n the table. */.
27800 20 20 69 66 28 20 6e 45 71 20 26 26 20 70 4c 6f    if( nEq && pLo
27810 6f 70 2d 3e 6e 4f 75 74 3e 6e 52 6f 77 2d 31 30  op->nOut>nRow-10
27820 20 29 7b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e   ){.    pLoop->n
27830 4f 75 74 20 3d 20 6e 52 6f 77 20 2d 20 31 30 3b  Out = nRow - 10;
27840 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  .  }.}../*.** Ad
27850 6a 75 73 74 20 74 68 65 20 63 6f 73 74 20 43 20  just the cost C 
27860 62 79 20 74 68 65 20 63 6f 73 74 4d 75 6c 74 20  by the costMult 
27870 66 61 63 74 65 72 20 54 2e 20 20 54 68 69 73 20  facter T.  This 
27880 6f 6e 6c 79 20 6f 63 63 75 72 73 20 69 66 0a 2a  only occurs if.*
27890 2a 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20  * compiled with 
278a0 2d 44 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  -DSQLITE_ENABLE_
278b0 43 4f 53 54 4d 55 4c 54 0a 2a 2f 0a 23 69 66 64  COSTMULT.*/.#ifd
278c0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
278d0 5f 43 4f 53 54 4d 55 4c 54 0a 23 20 64 65 66 69  _COSTMULT.# defi
278e0 6e 65 20 41 70 70 6c 79 43 6f 73 74 4d 75 6c 74  ne ApplyCostMult
278f0 69 70 6c 69 65 72 28 43 2c 54 29 20 20 43 20 2b  iplier(C,T)  C +
27900 3d 20 54 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  = T.#else.# defi
27910 6e 65 20 41 70 70 6c 79 43 6f 73 74 4d 75 6c 74  ne ApplyCostMult
27920 69 70 6c 69 65 72 28 43 2c 54 29 0a 23 65 6e 64  iplier(C,T).#end
27930 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 65 20 68 61 76  if../*.** We hav
27940 65 20 73 6f 20 66 61 72 20 6d 61 74 63 68 65 64  e so far matched
27950 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d   pBuilder->pNew-
27960 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 74 65 72  >u.btree.nEq ter
27970 6d 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20 69 6e  ms of the .** in
27980 64 65 78 20 70 49 6e 64 65 78 2e 20 54 72 79 20  dex pIndex. Try 
27990 74 6f 20 6d 61 74 63 68 20 6f 6e 65 20 6d 6f 72  to match one mor
279a0 65 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  e..**.** When th
279b0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
279c0 61 6c 6c 65 64 2c 20 70 42 75 69 6c 64 65 72 2d  alled, pBuilder-
279d0 3e 70 4e 65 77 2d 3e 6e 4f 75 74 20 63 6f 6e 74  >pNew->nOut cont
279e0 61 69 6e 73 20 74 68 65 20 0a 2a 2a 20 6e 75 6d  ains the .** num
279f0 62 65 72 20 6f 66 20 72 6f 77 73 20 65 78 70 65  ber of rows expe
27a00 63 74 65 64 20 74 6f 20 62 65 20 76 69 73 69 74  cted to be visit
27a10 65 64 20 62 79 20 66 69 6c 74 65 72 69 6e 67 20  ed by filtering 
27a20 75 73 69 6e 67 20 74 68 65 20 6e 45 71 20 0a 2a  using the nEq .*
27a30 2a 20 74 65 72 6d 73 20 6f 6e 6c 79 2e 20 49 66  * terms only. If
27a40 20 69 74 20 69 73 20 6d 6f 64 69 66 69 65 64 2c   it is modified,
27a50 20 74 68 69 73 20 76 61 6c 75 65 20 69 73 20 72   this value is r
27a60 65 73 74 6f 72 65 64 20 62 65 66 6f 72 65 20 74  estored before t
27a70 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  his .** function
27a80 20 72 65 74 75 72 6e 73 2e 0a 2a 2a 0a 2a 2a 20   returns..**.** 
27a90 49 66 20 70 50 72 6f 62 65 2d 3e 74 6e 75 6d 3d  If pProbe->tnum=
27aa0 3d 30 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 70  =0, that means p
27ab0 49 6e 64 65 78 20 69 73 20 61 20 66 61 6b 65 20  Index is a fake 
27ac0 69 6e 64 65 78 20 75 73 65 64 20 66 6f 72 20 74  index used for t
27ad0 68 65 0a 2a 2a 20 49 4e 54 45 47 45 52 20 50 52  he.** INTEGER PR
27ae0 49 4d 41 52 59 20 4b 45 59 2e 0a 2a 2f 0a 73 74  IMARY KEY..*/.st
27af0 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f  atic int whereLo
27b00 6f 70 41 64 64 42 74 72 65 65 49 6e 64 65 78 28  opAddBtreeIndex(
27b10 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c  .  WhereLoopBuil
27b20 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 20 20  der *pBuilder,  
27b30 20 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65 4c     /* The WhereL
27b40 6f 6f 70 20 66 61 63 74 6f 72 79 20 2a 2f 0a 20  oop factory */. 
27b50 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
27b60 69 74 65 6d 20 2a 70 53 72 63 2c 20 20 20 20 20  item *pSrc,     
27b70 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20   /* FROM clause 
27b80 74 65 72 6d 20 62 65 69 6e 67 20 61 6e 61 6c 79  term being analy
27b90 7a 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  zed */.  Index *
27ba0 70 50 72 6f 62 65 2c 20 20 20 20 20 20 20 20 20  pProbe,         
27bb0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69           /* An i
27bc0 6e 64 65 78 20 6f 6e 20 70 53 72 63 20 2a 2f 0a  ndex on pSrc */.
27bd0 20 20 4c 6f 67 45 73 74 20 6e 49 6e 4d 75 6c 20    LogEst nInMul 
27be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27bf0 20 20 2f 2a 20 6c 6f 67 28 4e 75 6d 62 65 72 20    /* log(Number 
27c00 6f 66 20 69 74 65 72 61 74 69 6f 6e 73 20 64 75  of iterations du
27c10 65 20 74 6f 20 49 4e 29 20 2a 2f 0a 29 7b 0a 20  e to IN) */.){. 
27c20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e   WhereInfo *pWIn
27c30 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  fo = pBuilder->p
27c40 57 49 6e 66 6f 3b 20 20 2f 2a 20 57 48 45 52 45  WInfo;  /* WHERE
27c50 20 61 6e 61 6c 79 73 65 20 63 6f 6e 74 65 78 74   analyse context
27c60 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61   */.  Parse *pPa
27c70 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50  rse = pWInfo->pP
27c80 61 72 73 65 3b 20 20 20 20 20 20 20 20 2f 2a 20  arse;        /* 
27c90 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
27ca0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
27cb0 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20   = pParse->db;  
27cc0 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
27cd0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6d 61 6c 6c   connection mall
27ce0 6f 63 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  oc context */.  
27cf0 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b  WhereLoop *pNew;
27d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27d10 2f 2a 20 54 65 6d 70 6c 61 74 65 20 57 68 65 72  /* Template Wher
27d20 65 4c 6f 6f 70 20 75 6e 64 65 72 20 63 6f 6e 73  eLoop under cons
27d30 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 57 68  truction */.  Wh
27d40 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20  ereTerm *pTerm; 
27d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
27d60 20 41 20 57 68 65 72 65 54 65 72 6d 20 75 6e 64   A WhereTerm und
27d70 65 72 20 63 6f 6e 73 69 64 65 72 61 74 69 6f 6e  er consideration
27d80 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 4d 61 73 6b   */.  int opMask
27d90 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
27da0 20 20 20 20 20 20 2f 2a 20 56 61 6c 69 64 20 6f        /* Valid o
27db0 70 65 72 61 74 6f 72 73 20 66 6f 72 20 63 6f 6e  perators for con
27dc0 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 57 68  straints */.  Wh
27dd0 65 72 65 53 63 61 6e 20 73 63 61 6e 3b 20 20 20  ereScan scan;   
27de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
27df0 20 49 74 65 72 61 74 6f 72 20 66 6f 72 20 57 48   Iterator for WH
27e00 45 52 45 20 74 65 72 6d 73 20 2a 2f 0a 20 20 42  ERE terms */.  B
27e10 69 74 6d 61 73 6b 20 73 61 76 65 64 5f 70 72 65  itmask saved_pre
27e20 72 65 71 3b 20 20 20 20 20 20 20 20 20 20 20 2f  req;           /
27e30 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65  * Original value
27e40 20 6f 66 20 70 4e 65 77 2d 3e 70 72 65 72 65 71   of pNew->prereq
27e50 20 2a 2f 0a 20 20 75 31 36 20 73 61 76 65 64 5f   */.  u16 saved_
27e60 6e 4c 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20  nLTerm;         
27e70 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61        /* Origina
27e80 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d  l value of pNew-
27e90 3e 6e 4c 54 65 72 6d 20 2a 2f 0a 20 20 75 31 36  >nLTerm */.  u16
27ea0 20 73 61 76 65 64 5f 6e 45 71 3b 20 20 20 20 20   saved_nEq;     
27eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27ec0 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f  Original value o
27ed0 66 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e  f pNew->u.btree.
27ee0 6e 45 71 20 2a 2f 0a 20 20 75 31 36 20 73 61 76  nEq */.  u16 sav
27ef0 65 64 5f 6e 53 6b 69 70 3b 20 20 20 20 20 20 20  ed_nSkip;       
27f00 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67           /* Orig
27f10 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e  inal value of pN
27f20 65 77 2d 3e 6e 53 6b 69 70 20 2a 2f 0a 20 20 75  ew->nSkip */.  u
27f30 33 32 20 73 61 76 65 64 5f 77 73 46 6c 61 67 73  32 saved_wsFlags
27f40 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
27f50 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65  * Original value
27f60 20 6f 66 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67   of pNew->wsFlag
27f70 73 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 73 61  s */.  LogEst sa
27f80 76 65 64 5f 6e 4f 75 74 3b 20 20 20 20 20 20 20  ved_nOut;       
27f90 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e         /* Origin
27fa0 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77  al value of pNew
27fb0 2d 3e 6e 4f 75 74 20 2a 2f 0a 20 20 69 6e 74 20  ->nOut */.  int 
27fc0 69 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20  iCol;           
27fd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
27fe0 6e 64 65 78 20 6f 66 20 74 68 65 20 63 6f 6c 75  ndex of the colu
27ff0 6d 6e 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  mn in the table 
28000 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
28010 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
28020 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
28030 6f 64 65 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20  ode */.  LogEst 
28040 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  rSize;          
28050 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
28060 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68  er of rows in th
28070 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 4c 6f 67  e table */.  Log
28080 45 73 74 20 72 4c 6f 67 53 69 7a 65 3b 20 20 20  Est rLogSize;   
28090 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
280a0 4c 6f 67 61 72 69 74 68 6d 20 6f 66 20 74 61 62  Logarithm of tab
280b0 6c 65 20 73 69 7a 65 20 2a 2f 0a 20 20 57 68 65  le size */.  Whe
280c0 72 65 54 65 72 6d 20 2a 70 54 6f 70 20 3d 20 30  reTerm *pTop = 0
280d0 2c 20 2a 70 42 74 6d 20 3d 20 30 3b 20 2f 2a 20  , *pBtm = 0; /* 
280e0 54 6f 70 20 61 6e 64 20 62 6f 74 74 6f 6d 20 72  Top and bottom r
280f0 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 73  ange constraints
28100 20 2a 2f 0a 0a 20 20 70 4e 65 77 20 3d 20 70 42   */..  pNew = pB
28110 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20  uilder->pNew;.  
28120 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
28130 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20 53 51  iled ) return SQ
28140 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 0a 20 20 61  LITE_NOMEM;..  a
28150 73 73 65 72 74 28 20 28 70 4e 65 77 2d 3e 77 73  ssert( (pNew->ws
28160 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49  Flags & WHERE_VI
28170 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30 20 29  RTUALTABLE)==0 )
28180 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 4e 65  ;.  assert( (pNe
28190 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  w->wsFlags & WHE
281a0 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 3d 3d 30  RE_TOP_LIMIT)==0
281b0 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e   );.  if( pNew->
281c0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
281d0 42 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20  BTM_LIMIT ){.   
281e0 20 6f 70 4d 61 73 6b 20 3d 20 57 4f 5f 4c 54 7c   opMask = WO_LT|
281f0 57 4f 5f 4c 45 3b 0a 20 20 7d 65 6c 73 65 20 69  WO_LE;.  }else i
28200 66 28 20 70 50 72 6f 62 65 2d 3e 74 6e 75 6d 3c  f( pProbe->tnum<
28210 3d 30 20 7c 7c 20 28 70 53 72 63 2d 3e 6a 6f 69  =0 || (pSrc->joi
28220 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45 46 54 29  ntype & JT_LEFT)
28230 21 3d 30 20 29 7b 0a 20 20 20 20 6f 70 4d 61 73  !=0 ){.    opMas
28240 6b 20 3d 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 7c  k = WO_EQ|WO_IN|
28250 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4c  WO_GT|WO_GE|WO_L
28260 54 7c 57 4f 5f 4c 45 3b 0a 20 20 7d 65 6c 73 65  T|WO_LE;.  }else
28270 7b 0a 20 20 20 20 6f 70 4d 61 73 6b 20 3d 20 57  {.    opMask = W
28280 4f 5f 45 51 7c 57 4f 5f 49 4e 7c 57 4f 5f 49 53  O_EQ|WO_IN|WO_IS
28290 4e 55 4c 4c 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45  NULL|WO_GT|WO_GE
282a0 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 3b 0a 20 20  |WO_LT|WO_LE;.  
282b0 7d 0a 20 20 69 66 28 20 70 50 72 6f 62 65 2d 3e  }.  if( pProbe->
282c0 62 55 6e 6f 72 64 65 72 65 64 20 29 20 6f 70 4d  bUnordered ) opM
282d0 61 73 6b 20 26 3d 20 7e 28 57 4f 5f 47 54 7c 57  ask &= ~(WO_GT|W
282e0 4f 5f 47 45 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45  O_GE|WO_LT|WO_LE
282f0 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4e  );..  assert( pN
28300 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3c  ew->u.btree.nEq<
28310 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 20  pProbe->nColumn 
28320 29 3b 0a 20 20 69 43 6f 6c 20 3d 20 70 50 72 6f  );.  iCol = pPro
28330 62 65 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 70 4e 65  be->aiColumn[pNe
28340 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 5d 3b  w->u.btree.nEq];
28350 0a 0a 20 20 70 54 65 72 6d 20 3d 20 77 68 65 72  ..  pTerm = wher
28360 65 53 63 61 6e 49 6e 69 74 28 26 73 63 61 6e 2c  eScanInit(&scan,
28370 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 2c 20   pBuilder->pWC, 
28380 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 2c 20 69  pSrc->iCursor, i
28390 43 6f 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Col,.           
283a0 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 70 4d               opM
283b0 61 73 6b 2c 20 70 50 72 6f 62 65 29 3b 0a 20 20  ask, pProbe);.  
283c0 73 61 76 65 64 5f 6e 45 71 20 3d 20 70 4e 65 77  saved_nEq = pNew
283d0 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20  ->u.btree.nEq;. 
283e0 20 73 61 76 65 64 5f 6e 53 6b 69 70 20 3d 20 70   saved_nSkip = p
283f0 4e 65 77 2d 3e 6e 53 6b 69 70 3b 0a 20 20 73 61  New->nSkip;.  sa
28400 76 65 64 5f 6e 4c 54 65 72 6d 20 3d 20 70 4e 65  ved_nLTerm = pNe
28410 77 2d 3e 6e 4c 54 65 72 6d 3b 0a 20 20 73 61 76  w->nLTerm;.  sav
28420 65 64 5f 77 73 46 6c 61 67 73 20 3d 20 70 4e 65  ed_wsFlags = pNe
28430 77 2d 3e 77 73 46 6c 61 67 73 3b 0a 20 20 73 61  w->wsFlags;.  sa
28440 76 65 64 5f 70 72 65 72 65 71 20 3d 20 70 4e 65  ved_prereq = pNe
28450 77 2d 3e 70 72 65 72 65 71 3b 0a 20 20 73 61 76  w->prereq;.  sav
28460 65 64 5f 6e 4f 75 74 20 3d 20 70 4e 65 77 2d 3e  ed_nOut = pNew->
28470 6e 4f 75 74 3b 0a 20 20 70 4e 65 77 2d 3e 72 53  nOut;.  pNew->rS
28480 65 74 75 70 20 3d 20 30 3b 0a 20 20 72 53 69 7a  etup = 0;.  rSiz
28490 65 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f  e = pProbe->aiRo
284a0 77 4c 6f 67 45 73 74 5b 30 5d 3b 0a 20 20 72 4c  wLogEst[0];.  rL
284b0 6f 67 53 69 7a 65 20 3d 20 65 73 74 4c 6f 67 28  ogSize = estLog(
284c0 72 53 69 7a 65 29 3b 0a 20 20 66 6f 72 28 3b 20  rSize);.  for(; 
284d0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
284e0 20 70 54 65 72 6d 21 3d 30 3b 20 70 54 65 72 6d   pTerm!=0; pTerm
284f0 20 3d 20 77 68 65 72 65 53 63 61 6e 4e 65 78 74   = whereScanNext
28500 28 26 73 63 61 6e 29 29 7b 0a 20 20 20 20 75 31  (&scan)){.    u1
28510 36 20 65 4f 70 20 3d 20 70 54 65 72 6d 2d 3e 65  6 eOp = pTerm->e
28520 4f 70 65 72 61 74 6f 72 3b 20 20 20 2f 2a 20 53  Operator;   /* S
28530 68 6f 72 74 68 61 6e 64 20 66 6f 72 20 70 54 65  horthand for pTe
28540 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 2a 2f  rm->eOperator */
28550 0a 20 20 20 20 4c 6f 67 45 73 74 20 72 43 6f 73  .    LogEst rCos
28560 74 49 64 78 3b 0a 20 20 20 20 4c 6f 67 45 73 74  tIdx;.    LogEst
28570 20 6e 4f 75 74 55 6e 61 64 6a 75 73 74 65 64 3b   nOutUnadjusted;
28580 20 20 20 20 20 20 20 20 2f 2a 20 6e 4f 75 74 20          /* nOut 
28590 62 65 66 6f 72 65 20 49 4e 28 29 20 61 6e 64 20  before IN() and 
285a0 57 48 45 52 45 20 61 64 6a 75 73 74 6d 65 6e 74  WHERE adjustment
285b0 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 49 6e  s */.    int nIn
285c0 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c   = 0;.#ifdef SQL
285d0 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
285e0 5f 4f 52 5f 53 54 41 54 34 0a 20 20 20 20 69 6e  _OR_STAT4.    in
285f0 74 20 6e 52 65 63 56 61 6c 69 64 20 3d 20 70 42  t nRecValid = pB
28600 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69  uilder->nRecVali
28610 64 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66  d;.#endif.    if
28620 28 20 28 65 4f 70 3d 3d 57 4f 5f 49 53 4e 55 4c  ( (eOp==WO_ISNUL
28630 4c 20 7c 7c 20 28 70 54 65 72 6d 2d 3e 77 74 46  L || (pTerm->wtF
28640 6c 61 67 73 26 54 45 52 4d 5f 56 4e 55 4c 4c 29  lags&TERM_VNULL)
28650 21 3d 30 29 0a 20 20 20 20 20 26 26 20 28 69 43  !=0).     && (iC
28660 6f 6c 3c 30 20 7c 7c 20 70 53 72 63 2d 3e 70 54  ol<0 || pSrc->pT
28670 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 6e  ab->aCol[iCol].n
28680 6f 74 4e 75 6c 6c 29 0a 20 20 20 20 29 7b 0a 20  otNull).    ){. 
28690 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 2f       continue; /
286a0 2a 20 69 67 6e 6f 72 65 20 49 53 20 5b 4e 4f 54  * ignore IS [NOT
286b0 5d 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e  ] NULL constrain
286c0 74 73 20 6f 6e 20 4e 4f 54 20 4e 55 4c 4c 20 63  ts on NOT NULL c
286d0 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 7d 0a  olumns */.    }.
286e0 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 70      if( pTerm->p
286f0 72 65 72 65 71 52 69 67 68 74 20 26 20 70 4e 65  rereqRight & pNe
28700 77 2d 3e 6d 61 73 6b 53 65 6c 66 20 29 20 63 6f  w->maskSelf ) co
28710 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20 70 4e 65  ntinue;..    pNe
28720 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 73 61 76  w->wsFlags = sav
28730 65 64 5f 77 73 46 6c 61 67 73 3b 0a 20 20 20 20  ed_wsFlags;.    
28740 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  pNew->u.btree.nE
28750 71 20 3d 20 73 61 76 65 64 5f 6e 45 71 3b 0a 20  q = saved_nEq;. 
28760 20 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20     pNew->nLTerm 
28770 3d 20 73 61 76 65 64 5f 6e 4c 54 65 72 6d 3b 0a  = saved_nLTerm;.
28780 20 20 20 20 69 66 28 20 77 68 65 72 65 4c 6f 6f      if( whereLoo
28790 70 52 65 73 69 7a 65 28 64 62 2c 20 70 4e 65 77  pResize(db, pNew
287a0 2c 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b 31  , pNew->nLTerm+1
287b0 29 20 29 20 62 72 65 61 6b 3b 20 2f 2a 20 4f 4f  ) ) break; /* OO
287c0 4d 20 2a 2f 0a 20 20 20 20 70 4e 65 77 2d 3e 61  M */.    pNew->a
287d0 4c 54 65 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54 65  LTerm[pNew->nLTe
287e0 72 6d 2b 2b 5d 20 3d 20 70 54 65 72 6d 3b 0a 20  rm++] = pTerm;. 
287f0 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20     pNew->prereq 
28800 3d 20 28 73 61 76 65 64 5f 70 72 65 72 65 71 20  = (saved_prereq 
28810 7c 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52  | pTerm->prereqR
28820 69 67 68 74 29 20 26 20 7e 70 4e 65 77 2d 3e 6d  ight) & ~pNew->m
28830 61 73 6b 53 65 6c 66 3b 0a 0a 20 20 20 20 61 73  askSelf;..    as
28840 73 65 72 74 28 20 6e 49 6e 4d 75 6c 3d 3d 30 0a  sert( nInMul==0.
28850 20 20 20 20 20 20 20 20 7c 7c 20 28 70 4e 65 77          || (pNew
28860 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
28870 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c 29 21 3d  E_COLUMN_NULL)!=
28880 30 20 0a 20 20 20 20 20 20 20 20 7c 7c 20 28 70  0 .        || (p
28890 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  New->wsFlags & W
288a0 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 29 21  HERE_COLUMN_IN)!
288b0 3d 30 20 0a 20 20 20 20 20 20 20 20 7c 7c 20 28  =0 .        || (
288c0 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20  pNew->wsFlags & 
288d0 57 48 45 52 45 5f 53 4b 49 50 53 43 41 4e 29 21  WHERE_SKIPSCAN)!
288e0 3d 30 20 0a 20 20 20 20 29 3b 0a 0a 20 20 20 20  =0 .    );..    
288f0 69 66 28 20 65 4f 70 20 26 20 57 4f 5f 49 4e 20  if( eOp & WO_IN 
28900 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  ){.      Expr *p
28910 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45  Expr = pTerm->pE
28920 78 70 72 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  xpr;.      pNew-
28930 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52  >wsFlags |= WHER
28940 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 3b 0a 20 20 20  E_COLUMN_IN;.   
28950 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72     if( ExprHasPr
28960 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
28970 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20  _xIsSelect) ){. 
28980 20 20 20 20 20 20 20 2f 2a 20 22 78 20 49 4e 20         /* "x IN 
28990 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 3a 20 20  (SELECT ...)":  
289a0 54 55 4e 49 4e 47 3a 20 74 68 65 20 53 45 4c 45  TUNING: the SELE
289b0 43 54 20 72 65 74 75 72 6e 73 20 32 35 20 72 6f  CT returns 25 ro
289c0 77 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 6e 49  ws */.        nI
289d0 6e 20 3d 20 34 36 3b 20 20 61 73 73 65 72 74 28  n = 46;  assert(
289e0 20 34 36 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45   46==sqlite3LogE
289f0 73 74 28 32 35 29 20 29 3b 0a 20 20 20 20 20 20  st(25) );.      
28a00 7d 65 6c 73 65 20 69 66 28 20 41 4c 57 41 59 53  }else if( ALWAYS
28a10 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20  (pExpr->x.pList 
28a20 26 26 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  && pExpr->x.pLis
28a30 74 2d 3e 6e 45 78 70 72 29 20 29 7b 0a 20 20 20  t->nExpr) ){.   
28a40 20 20 20 20 20 2f 2a 20 22 78 20 49 4e 20 28 76       /* "x IN (v
28a50 61 6c 75 65 2c 20 76 61 6c 75 65 2c 20 2e 2e 2e  alue, value, ...
28a60 29 22 20 2a 2f 0a 20 20 20 20 20 20 20 20 6e 49  )" */.        nI
28a70 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  n = sqlite3LogEs
28a80 74 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  t(pExpr->x.pList
28a90 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ->nExpr);.      
28aa0 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
28ab0 6e 49 6e 3e 30 20 29 3b 20 20 2f 2a 20 52 48 53  nIn>0 );  /* RHS
28ac0 20 61 6c 77 61 79 73 20 68 61 73 20 32 20 6f 72   always has 2 or
28ad0 20 6d 6f 72 65 20 74 65 72 6d 73 2e 2e 2e 20 20   more terms...  
28ae0 54 68 65 20 70 61 72 73 65 72 0a 20 20 20 20 20  The parser.     
28af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b00 20 20 20 2a 2a 20 63 68 61 6e 67 65 73 20 22 78     ** changes "x
28b10 20 49 4e 20 28 3f 29 22 20 69 6e 74 6f 20 22 78   IN (?)" into "x
28b20 3d 3f 22 2e 20 2a 2f 0a 0a 20 20 20 20 7d 65 6c  =?". */..    }el
28b30 73 65 20 69 66 28 20 65 4f 70 20 26 20 28 57 4f  se if( eOp & (WO
28b40 5f 45 51 29 20 29 7b 0a 20 20 20 20 20 20 70 4e  _EQ) ){.      pN
28b50 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57  ew->wsFlags |= W
28b60 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 3b 0a  HERE_COLUMN_EQ;.
28b70 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30        if( iCol<0
28b80 20 7c 7c 20 28 6e 49 6e 4d 75 6c 3d 3d 30 20 26   || (nInMul==0 &
28b90 26 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e  & pNew->u.btree.
28ba0 6e 45 71 3d 3d 70 50 72 6f 62 65 2d 3e 6e 4b 65  nEq==pProbe->nKe
28bb0 79 43 6f 6c 2d 31 29 20 29 7b 0a 20 20 20 20 20  yCol-1) ){.     
28bc0 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 26     if( iCol>=0 &
28bd0 26 20 21 49 73 55 6e 69 71 75 65 49 6e 64 65 78  & !IsUniqueIndex
28be0 28 70 50 72 6f 62 65 29 20 29 7b 0a 20 20 20 20  (pProbe) ){.    
28bf0 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c        pNew->wsFl
28c00 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 55 4e 51  ags |= WHERE_UNQ
28c10 5f 57 41 4e 54 45 44 3b 0a 20 20 20 20 20 20 20  _WANTED;.       
28c20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
28c30 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20    pNew->wsFlags 
28c40 7c 3d 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 3b  |= WHERE_ONEROW;
28c50 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
28c60 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28   }.    }else if(
28c70 20 65 4f 70 20 26 20 57 4f 5f 49 53 4e 55 4c 4c   eOp & WO_ISNULL
28c80 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e   ){.      pNew->
28c90 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45  wsFlags |= WHERE
28ca0 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c 3b 0a 20 20  _COLUMN_NULL;.  
28cb0 20 20 7d 65 6c 73 65 20 69 66 28 20 65 4f 70 20    }else if( eOp 
28cc0 26 20 28 57 4f 5f 47 54 7c 57 4f 5f 47 45 29 20  & (WO_GT|WO_GE) 
28cd0 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  ){.      testcas
28ce0 65 28 20 65 4f 70 20 26 20 57 4f 5f 47 54 20 29  e( eOp & WO_GT )
28cf0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
28d00 28 20 65 4f 70 20 26 20 57 4f 5f 47 45 20 29 3b  ( eOp & WO_GE );
28d10 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46  .      pNew->wsF
28d20 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f  lags |= WHERE_CO
28d30 4c 55 4d 4e 5f 52 41 4e 47 45 7c 57 48 45 52 45  LUMN_RANGE|WHERE
28d40 5f 42 54 4d 5f 4c 49 4d 49 54 3b 0a 20 20 20 20  _BTM_LIMIT;.    
28d50 20 20 70 42 74 6d 20 3d 20 70 54 65 72 6d 3b 0a    pBtm = pTerm;.
28d60 20 20 20 20 20 20 70 54 6f 70 20 3d 20 30 3b 0a        pTop = 0;.
28d70 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
28d80 20 61 73 73 65 72 74 28 20 65 4f 70 20 26 20 28   assert( eOp & (
28d90 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 20 29 3b 0a  WO_LT|WO_LE) );.
28da0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
28db0 65 4f 70 20 26 20 57 4f 5f 4c 54 20 29 3b 0a 20  eOp & WO_LT );. 
28dc0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65       testcase( e
28dd0 4f 70 20 26 20 57 4f 5f 4c 45 20 29 3b 0a 20 20  Op & WO_LE );.  
28de0 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67      pNew->wsFlag
28df0 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d  s |= WHERE_COLUM
28e00 4e 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f 54 4f  N_RANGE|WHERE_TO
28e10 50 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20 70  P_LIMIT;.      p
28e20 54 6f 70 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20  Top = pTerm;.   
28e30 20 20 20 70 42 74 6d 20 3d 20 28 70 4e 65 77 2d     pBtm = (pNew-
28e40 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
28e50 5f 42 54 4d 5f 4c 49 4d 49 54 29 21 3d 30 20 3f  _BTM_LIMIT)!=0 ?
28e60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
28e70 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65        pNew->aLTe
28e80 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2d  rm[pNew->nLTerm-
28e90 32 5d 20 3a 20 30 3b 0a 20 20 20 20 7d 0a 0a 20  2] : 0;.    }.. 
28ea0 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f     /* At this po
28eb0 69 6e 74 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 69  int pNew->nOut i
28ec0 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d  s set to the num
28ed0 62 65 72 20 6f 66 20 72 6f 77 73 20 65 78 70 65  ber of rows expe
28ee0 63 74 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 62  cted to.    ** b
28ef0 65 20 76 69 73 69 74 65 64 20 62 79 20 74 68 65  e visited by the
28f00 20 69 6e 64 65 78 20 73 63 61 6e 20 62 65 66 6f   index scan befo
28f10 72 65 20 63 6f 6e 73 69 64 65 72 69 6e 67 20 74  re considering t
28f20 65 72 6d 20 70 54 65 72 6d 2c 20 6f 72 20 74 68  erm pTerm, or th
28f30 65 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65 73 20  e.    ** values 
28f40 6f 66 20 6e 49 6e 20 61 6e 64 20 6e 49 6e 4d 75  of nIn and nInMu
28f50 6c 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  l. In other word
28f60 73 2c 20 61 73 73 75 6d 69 6e 67 20 74 68 61 74  s, assuming that
28f70 20 61 6c 6c 20 0a 20 20 20 20 2a 2a 20 22 78 20   all .    ** "x 
28f80 49 4e 28 2e 2e 2e 29 22 20 74 65 72 6d 73 20 61  IN(...)" terms a
28f90 72 65 20 72 65 70 6c 61 63 65 64 20 77 69 74 68  re replaced with
28fa0 20 22 78 20 3d 20 3f 22 2e 20 54 68 69 73 20 62   "x = ?". This b
28fb0 6c 6f 63 6b 20 75 70 64 61 74 65 73 0a 20 20 20  lock updates.   
28fc0 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66   ** the value of
28fd0 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 74 6f 20 61   pNew->nOut to a
28fe0 63 63 6f 75 6e 74 20 66 6f 72 20 70 54 65 72 6d  ccount for pTerm
28ff0 20 28 62 75 74 20 6e 6f 74 20 6e 49 6e 2f 6e 49   (but not nIn/nI
29000 6e 4d 75 6c 29 2e 20 20 2a 2f 0a 20 20 20 20 61  nMul).  */.    a
29010 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4f 75  ssert( pNew->nOu
29020 74 3d 3d 73 61 76 65 64 5f 6e 4f 75 74 20 29 3b  t==saved_nOut );
29030 0a 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 77  .    if( pNew->w
29040 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43  sFlags & WHERE_C
29050 4f 4c 55 4d 4e 5f 52 41 4e 47 45 20 29 7b 0a 20  OLUMN_RANGE ){. 
29060 20 20 20 20 20 2f 2a 20 41 64 6a 75 73 74 20 6e       /* Adjust n
29070 4f 75 74 20 75 73 69 6e 67 20 73 74 61 74 33 2f  Out using stat3/
29080 73 74 61 74 34 20 64 61 74 61 2e 20 4f 72 2c 20  stat4 data. Or, 
29090 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 73  if there is no s
290a0 74 61 74 33 2f 73 74 61 74 34 0a 20 20 20 20 20  tat3/stat4.     
290b0 20 2a 2a 20 64 61 74 61 2c 20 75 73 69 6e 67 20   ** data, using 
290c0 73 6f 6d 65 20 6f 74 68 65 72 20 65 73 74 69 6d  some other estim
290d0 61 74 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 77  ate.  */.      w
290e0 68 65 72 65 52 61 6e 67 65 53 63 61 6e 45 73 74  hereRangeScanEst
290f0 28 70 50 61 72 73 65 2c 20 70 42 75 69 6c 64 65  (pParse, pBuilde
29100 72 2c 20 70 42 74 6d 2c 20 70 54 6f 70 2c 20 70  r, pBtm, pTop, p
29110 4e 65 77 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  New);.    }else{
29120 0a 20 20 20 20 20 20 69 6e 74 20 6e 45 71 20 3d  .      int nEq =
29130 20 2b 2b 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65   ++pNew->u.btree
29140 2e 6e 45 71 3b 0a 20 20 20 20 20 20 61 73 73 65  .nEq;.      asse
29150 72 74 28 20 65 4f 70 20 26 20 28 57 4f 5f 49 53  rt( eOp & (WO_IS
29160 4e 55 4c 4c 7c 57 4f 5f 45 51 7c 57 4f 5f 49 4e  NULL|WO_EQ|WO_IN
29170 29 20 29 3b 0a 0a 20 20 20 20 20 20 61 73 73 65  ) );..      asse
29180 72 74 28 20 70 4e 65 77 2d 3e 6e 4f 75 74 3d 3d  rt( pNew->nOut==
29190 73 61 76 65 64 5f 6e 4f 75 74 20 29 3b 0a 20 20  saved_nOut );.  
291a0 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 74      if( pTerm->t
291b0 72 75 74 68 50 72 6f 62 3c 3d 30 20 26 26 20 69  ruthProb<=0 && i
291c0 43 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  Col>=0 ){.      
291d0 20 20 61 73 73 65 72 74 28 20 28 65 4f 70 20 26    assert( (eOp &
291e0 20 57 4f 5f 49 4e 29 20 7c 7c 20 6e 49 6e 3d 3d   WO_IN) || nIn==
291f0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  0 );.        tes
29200 74 63 61 73 65 28 20 65 4f 70 20 26 20 57 4f 5f  tcase( eOp & WO_
29210 49 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4e  IN );.        pN
29220 65 77 2d 3e 6e 4f 75 74 20 2b 3d 20 70 54 65 72  ew->nOut += pTer
29230 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3b 0a 20 20  m->truthProb;.  
29240 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74        pNew->nOut
29250 20 2d 3d 20 6e 49 6e 3b 0a 20 20 20 20 20 20 7d   -= nIn;.      }
29260 65 6c 73 65 7b 0a 23 69 66 64 65 66 20 53 51 4c  else{.#ifdef SQL
29270 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
29280 5f 4f 52 5f 53 54 41 54 34 0a 20 20 20 20 20 20  _OR_STAT4.      
29290 20 20 74 52 6f 77 63 6e 74 20 6e 4f 75 74 20 3d    tRowcnt nOut =
292a0 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   0;.        if( 
292b0 6e 49 6e 4d 75 6c 3d 3d 30 20 0a 20 20 20 20 20  nInMul==0 .     
292c0 20 20 20 20 26 26 20 70 50 72 6f 62 65 2d 3e 6e      && pProbe->n
292d0 53 61 6d 70 6c 65 20 0a 20 20 20 20 20 20 20 20  Sample .        
292e0 20 26 26 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65   && pNew->u.btre
292f0 65 2e 6e 45 71 3c 3d 70 50 72 6f 62 65 2d 3e 6e  e.nEq<=pProbe->n
29300 53 61 6d 70 6c 65 43 6f 6c 0a 20 20 20 20 20 20  SampleCol.      
29310 20 20 20 26 26 20 28 28 65 4f 70 20 26 20 57 4f     && ((eOp & WO
29320 5f 49 4e 29 3d 3d 30 20 7c 7c 20 21 45 78 70 72  _IN)==0 || !Expr
29330 48 61 73 50 72 6f 70 65 72 74 79 28 70 54 65 72  HasProperty(pTer
29340 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f 78 49 73  m->pExpr, EP_xIs
29350 53 65 6c 65 63 74 29 29 0a 20 20 20 20 20 20 20  Select)).       
29360 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45 78   ){.          Ex
29370 70 72 20 2a 70 45 78 70 72 20 3d 20 70 54 65 72  pr *pExpr = pTer
29380 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  m->pExpr;.      
29390 20 20 20 20 69 66 28 20 28 65 4f 70 20 26 20 28      if( (eOp & (
293a0 57 4f 5f 45 51 7c 57 4f 5f 49 53 4e 55 4c 4c 29  WO_EQ|WO_ISNULL)
293b0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
293c0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65 4f      testcase( eO
293d0 70 20 26 20 57 4f 5f 45 51 20 29 3b 0a 20 20 20  p & WO_EQ );.   
293e0 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
293f0 65 28 20 65 4f 70 20 26 20 57 4f 5f 49 53 4e 55  e( eOp & WO_ISNU
29400 4c 4c 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  LL );.          
29410 20 20 72 63 20 3d 20 77 68 65 72 65 45 71 75 61    rc = whereEqua
29420 6c 53 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c  lScanEst(pParse,
29430 20 70 42 75 69 6c 64 65 72 2c 20 70 45 78 70 72   pBuilder, pExpr
29440 2d 3e 70 52 69 67 68 74 2c 20 26 6e 4f 75 74 29  ->pRight, &nOut)
29450 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
29460 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  e{.            r
29470 63 20 3d 20 77 68 65 72 65 49 6e 53 63 61 6e 45  c = whereInScanE
29480 73 74 28 70 50 61 72 73 65 2c 20 70 42 75 69 6c  st(pParse, pBuil
29490 64 65 72 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c  der, pExpr->x.pL
294a0 69 73 74 2c 20 26 6e 4f 75 74 29 3b 0a 20 20 20  ist, &nOut);.   
294b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
294c0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
294d0 45 5f 4e 4f 54 46 4f 55 4e 44 20 29 20 72 63 20  E_NOTFOUND ) rc 
294e0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
294f0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
29500 51 4c 49 54 45 5f 4f 4b 20 29 20 62 72 65 61 6b  QLITE_OK ) break
29510 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75  ;          /* Ju
29520 6d 70 20 6f 75 74 20 6f 66 20 74 68 65 20 70 54  mp out of the pT
29530 65 72 6d 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20  erm loop */.    
29540 20 20 20 20 20 20 69 66 28 20 6e 4f 75 74 20 29        if( nOut )
29550 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4e  {.            pN
29560 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 71 6c 69 74  ew->nOut = sqlit
29570 65 33 4c 6f 67 45 73 74 28 6e 4f 75 74 29 3b 0a  e3LogEst(nOut);.
29580 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
29590 70 4e 65 77 2d 3e 6e 4f 75 74 3e 73 61 76 65 64  pNew->nOut>saved
295a0 5f 6e 4f 75 74 20 29 20 70 4e 65 77 2d 3e 6e 4f  _nOut ) pNew->nO
295b0 75 74 20 3d 20 73 61 76 65 64 5f 6e 4f 75 74 3b  ut = saved_nOut;
295c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 65  .            pNe
295d0 77 2d 3e 6e 4f 75 74 20 2d 3d 20 6e 49 6e 3b 0a  w->nOut -= nIn;.
295e0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
295f0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
29600 28 20 6e 4f 75 74 3d 3d 30 20 29 0a 23 65 6e 64  ( nOut==0 ).#end
29610 69 66 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20  if.        {.   
29620 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75         pNew->nOu
29630 74 20 2b 3d 20 28 70 50 72 6f 62 65 2d 3e 61 69  t += (pProbe->ai
29640 52 6f 77 4c 6f 67 45 73 74 5b 6e 45 71 5d 20 2d  RowLogEst[nEq] -
29650 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f   pProbe->aiRowLo
29660 67 45 73 74 5b 6e 45 71 2d 31 5d 29 3b 0a 20 20  gEst[nEq-1]);.  
29670 20 20 20 20 20 20 20 20 69 66 28 20 65 4f 70 20          if( eOp 
29680 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20  & WO_ISNULL ){. 
29690 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 55             /* TU
296a0 4e 49 4e 47 3a 20 49 66 20 74 68 65 72 65 20 69  NING: If there i
296b0 73 20 6e 6f 20 6c 69 6b 65 6c 69 68 6f 6f 64 28  s no likelihood(
296c0 29 20 76 61 6c 75 65 2c 20 61 73 73 75 6d 65 20  ) value, assume 
296d0 74 68 61 74 20 61 20 0a 20 20 20 20 20 20 20 20  that a .        
296e0 20 20 20 20 2a 2a 20 22 63 6f 6c 20 49 53 20 4e      ** "col IS N
296f0 55 4c 4c 22 20 65 78 70 72 65 73 73 69 6f 6e 20  ULL" expression 
29700 6d 61 74 63 68 65 73 20 74 77 69 63 65 20 61 73  matches twice as
29710 20 6d 61 6e 79 20 72 6f 77 73 20 0a 20 20 20 20   many rows .    
29720 20 20 20 20 20 20 20 20 2a 2a 20 61 73 20 28 63          ** as (c
29730 6f 6c 3d 3f 29 2e 20 2a 2f 0a 20 20 20 20 20 20  ol=?). */.      
29740 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74        pNew->nOut
29750 20 2b 3d 20 31 30 3b 0a 20 20 20 20 20 20 20 20   += 10;.        
29760 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
29770 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
29780 20 2f 2a 20 53 65 74 20 72 43 6f 73 74 49 64 78   /* Set rCostIdx
29790 20 74 6f 20 74 68 65 20 63 6f 73 74 20 6f 66 20   to the cost of 
297a0 76 69 73 69 74 69 6e 67 20 73 65 6c 65 63 74 65  visiting selecte
297b0 64 20 72 6f 77 73 20 69 6e 20 69 6e 64 65 78 2e  d rows in index.
297c0 20 41 64 64 0a 20 20 20 20 2a 2a 20 69 74 20 74   Add.    ** it t
297d0 6f 20 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 77 68  o pNew->rRun, wh
297e0 69 63 68 20 69 73 20 63 75 72 72 65 6e 74 6c 79  ich is currently
297f0 20 73 65 74 20 74 6f 20 74 68 65 20 63 6f 73 74   set to the cost
29800 20 6f 66 20 74 68 65 20 69 6e 64 65 78 0a 20 20   of the index.  
29810 20 20 2a 2a 20 73 65 65 6b 20 6f 6e 6c 79 2e 20    ** seek only. 
29820 54 68 65 6e 2c 20 69 66 20 74 68 69 73 20 69 73  Then, if this is
29830 20 61 20 6e 6f 6e 2d 63 6f 76 65 72 69 6e 67 20   a non-covering 
29840 69 6e 64 65 78 2c 20 61 64 64 20 74 68 65 20 63  index, add the c
29850 6f 73 74 20 6f 66 0a 20 20 20 20 2a 2a 20 76 69  ost of.    ** vi
29860 73 69 74 69 6e 67 20 74 68 65 20 72 6f 77 73 20  siting the rows 
29870 69 6e 20 74 68 65 20 6d 61 69 6e 20 74 61 62 6c  in the main tabl
29880 65 2e 20 20 2a 2f 0a 20 20 20 20 72 43 6f 73 74  e.  */.    rCost
29890 49 64 78 20 3d 20 70 4e 65 77 2d 3e 6e 4f 75 74  Idx = pNew->nOut
298a0 20 2b 20 31 20 2b 20 28 31 35 2a 70 50 72 6f 62   + 1 + (15*pProb
298b0 65 2d 3e 73 7a 49 64 78 52 6f 77 29 2f 70 53 72  e->szIdxRow)/pSr
298c0 63 2d 3e 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f  c->pTab->szTabRo
298d0 77 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 72 52 75  w;.    pNew->rRu
298e0 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  n = sqlite3LogEs
298f0 74 41 64 64 28 72 4c 6f 67 53 69 7a 65 2c 20 72  tAdd(rLogSize, r
29900 43 6f 73 74 49 64 78 29 3b 0a 20 20 20 20 69 66  CostIdx);.    if
29910 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73  ( (pNew->wsFlags
29920 20 26 20 28 57 48 45 52 45 5f 49 44 58 5f 4f 4e   & (WHERE_IDX_ON
29930 4c 59 7c 57 48 45 52 45 5f 49 50 4b 29 29 3d 3d  LY|WHERE_IPK))==
29940 30 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d  0 ){.      pNew-
29950 3e 72 52 75 6e 20 3d 20 73 71 6c 69 74 65 33 4c  >rRun = sqlite3L
29960 6f 67 45 73 74 41 64 64 28 70 4e 65 77 2d 3e 72  ogEstAdd(pNew->r
29970 52 75 6e 2c 20 70 4e 65 77 2d 3e 6e 4f 75 74 20  Run, pNew->nOut 
29980 2b 20 31 36 29 3b 0a 20 20 20 20 7d 0a 20 20 20  + 16);.    }.   
29990 20 41 70 70 6c 79 43 6f 73 74 4d 75 6c 74 69 70   ApplyCostMultip
299a0 6c 69 65 72 28 70 4e 65 77 2d 3e 72 52 75 6e 2c  lier(pNew->rRun,
299b0 20 70 50 72 6f 62 65 2d 3e 70 54 61 62 6c 65 2d   pProbe->pTable-
299c0 3e 63 6f 73 74 4d 75 6c 74 29 3b 0a 0a 20 20 20  >costMult);..   
299d0 20 6e 4f 75 74 55 6e 61 64 6a 75 73 74 65 64 20   nOutUnadjusted 
299e0 3d 20 70 4e 65 77 2d 3e 6e 4f 75 74 3b 0a 20 20  = pNew->nOut;.  
299f0 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 2b 3d 20    pNew->rRun += 
29a00 6e 49 6e 4d 75 6c 20 2b 20 6e 49 6e 3b 0a 20 20  nInMul + nIn;.  
29a10 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b 3d 20    pNew->nOut += 
29a20 6e 49 6e 4d 75 6c 20 2b 20 6e 49 6e 3b 0a 20 20  nInMul + nIn;.  
29a30 20 20 77 68 65 72 65 4c 6f 6f 70 4f 75 74 70 75    whereLoopOutpu
29a40 74 41 64 6a 75 73 74 28 70 42 75 69 6c 64 65 72  tAdjust(pBuilder
29a50 2d 3e 70 57 43 2c 20 70 4e 65 77 2c 20 72 53 69  ->pWC, pNew, rSi
29a60 7a 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 77 68  ze);.    rc = wh
29a70 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42  ereLoopInsert(pB
29a80 75 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 0a  uilder, pNew);..
29a90 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 77 73      if( pNew->ws
29aa0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f  Flags & WHERE_CO
29ab0 4c 55 4d 4e 5f 52 41 4e 47 45 20 29 7b 0a 20 20  LUMN_RANGE ){.  
29ac0 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d      pNew->nOut =
29ad0 20 73 61 76 65 64 5f 6e 4f 75 74 3b 0a 20 20 20   saved_nOut;.   
29ae0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4e   }else{.      pN
29af0 65 77 2d 3e 6e 4f 75 74 20 3d 20 6e 4f 75 74 55  ew->nOut = nOutU
29b00 6e 61 64 6a 75 73 74 65 64 3b 0a 20 20 20 20 7d  nadjusted;.    }
29b10 0a 0a 20 20 20 20 69 66 28 20 28 70 4e 65 77 2d  ..    if( (pNew-
29b20 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
29b30 5f 54 4f 50 5f 4c 49 4d 49 54 29 3d 3d 30 0a 20  _TOP_LIMIT)==0. 
29b40 20 20 20 20 26 26 20 70 4e 65 77 2d 3e 75 2e 62      && pNew->u.b
29b50 74 72 65 65 2e 6e 45 71 3c 70 50 72 6f 62 65 2d  tree.nEq<pProbe-
29b60 3e 6e 43 6f 6c 75 6d 6e 0a 20 20 20 20 29 7b 0a  >nColumn.    ){.
29b70 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 41        whereLoopA
29b80 64 64 42 74 72 65 65 49 6e 64 65 78 28 70 42 75  ddBtreeIndex(pBu
29b90 69 6c 64 65 72 2c 20 70 53 72 63 2c 20 70 50 72  ilder, pSrc, pPr
29ba0 6f 62 65 2c 20 6e 49 6e 4d 75 6c 2b 6e 49 6e 29  obe, nInMul+nIn)
29bb0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 65 77  ;.    }.    pNew
29bc0 2d 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e  ->nOut = saved_n
29bd0 4f 75 74 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  Out;.#ifdef SQLI
29be0 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f  TE_ENABLE_STAT3_
29bf0 4f 52 5f 53 54 41 54 34 0a 20 20 20 20 70 42 75  OR_STAT4.    pBu
29c00 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64  ilder->nRecValid
29c10 20 3d 20 6e 52 65 63 56 61 6c 69 64 3b 0a 23 65   = nRecValid;.#e
29c20 6e 64 69 66 0a 20 20 7d 0a 20 20 70 4e 65 77 2d  ndif.  }.  pNew-
29c30 3e 70 72 65 72 65 71 20 3d 20 73 61 76 65 64 5f  >prereq = saved_
29c40 70 72 65 72 65 71 3b 0a 20 20 70 4e 65 77 2d 3e  prereq;.  pNew->
29c50 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 73 61  u.btree.nEq = sa
29c60 76 65 64 5f 6e 45 71 3b 0a 20 20 70 4e 65 77 2d  ved_nEq;.  pNew-
29c70 3e 6e 53 6b 69 70 20 3d 20 73 61 76 65 64 5f 6e  >nSkip = saved_n
29c80 53 6b 69 70 3b 0a 20 20 70 4e 65 77 2d 3e 77 73  Skip;.  pNew->ws
29c90 46 6c 61 67 73 20 3d 20 73 61 76 65 64 5f 77 73  Flags = saved_ws
29ca0 46 6c 61 67 73 3b 0a 20 20 70 4e 65 77 2d 3e 6e  Flags;.  pNew->n
29cb0 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e 4f 75 74  Out = saved_nOut
29cc0 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d  ;.  pNew->nLTerm
29cd0 20 3d 20 73 61 76 65 64 5f 6e 4c 54 65 72 6d 3b   = saved_nLTerm;
29ce0 0a 0a 20 20 2f 2a 20 43 6f 6e 73 69 64 65 72 20  ..  /* Consider 
29cf0 75 73 69 6e 67 20 61 20 73 6b 69 70 2d 73 63 61  using a skip-sca
29d00 6e 20 69 66 20 74 68 65 72 65 20 61 72 65 20 6e  n if there are n
29d10 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 63  o WHERE clause c
29d20 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a 2a 20  onstraints.  ** 
29d30 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 74 68  available for th
29d40 65 20 6c 65 66 74 2d 6d 6f 73 74 20 74 65 72 6d  e left-most term
29d50 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2c 20  s of the index, 
29d60 61 6e 64 20 69 66 20 74 68 65 20 61 76 65 72 61  and if the avera
29d70 67 65 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f  ge.  ** number o
29d80 66 20 72 65 70 65 61 74 73 20 69 6e 20 74 68 65  f repeats in the
29d90 20 6c 65 66 74 2d 6d 6f 73 74 20 74 65 72 6d 73   left-most terms
29da0 20 69 73 20 61 74 20 6c 65 61 73 74 20 31 38 2e   is at least 18.
29db0 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20   .  **.  ** The 
29dc0 6d 61 67 69 63 20 6e 75 6d 62 65 72 20 31 38 20  magic number 18 
29dd0 69 73 20 73 65 6c 65 63 74 65 64 20 6f 6e 20 74  is selected on t
29de0 68 65 20 62 61 73 69 73 20 74 68 61 74 20 73 63  he basis that sc
29df0 61 6e 6e 69 6e 67 20 31 37 20 72 6f 77 73 0a 20  anning 17 rows. 
29e00 20 2a 2a 20 69 73 20 61 6c 6d 6f 73 74 20 61 6c   ** is almost al
29e10 77 61 79 73 20 71 75 69 63 6b 65 72 20 74 68 61  ways quicker tha
29e20 6e 20 61 6e 20 69 6e 64 65 78 20 73 65 65 6b 20  n an index seek 
29e30 28 65 76 65 6e 20 74 68 6f 75 67 68 20 69 66 20  (even though if 
29e40 74 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20 63  the index.  ** c
29e50 6f 6e 74 61 69 6e 73 20 66 65 77 65 72 20 74 68  ontains fewer th
29e60 61 6e 20 32 5e 31 37 20 72 6f 77 73 20 77 65 20  an 2^17 rows we 
29e70 61 73 73 75 6d 65 20 6f 74 68 65 72 77 69 73 65  assume otherwise
29e80 20 69 6e 20 6f 74 68 65 72 20 70 61 72 74 73 20   in other parts 
29e90 6f 66 0a 20 20 2a 2a 20 74 68 65 20 63 6f 64 65  of.  ** the code
29ea0 29 2e 20 41 6e 64 2c 20 65 76 65 6e 20 69 66 20  ). And, even if 
29eb0 69 74 20 69 73 20 6e 6f 74 2c 20 69 74 20 73 68  it is not, it sh
29ec0 6f 75 6c 64 20 6e 6f 74 20 62 65 20 74 6f 6f 20  ould not be too 
29ed0 6d 75 63 68 20 73 6c 6f 77 65 72 2e 20 0a 20 20  much slower. .  
29ee0 2a 2a 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20  ** On the other 
29ef0 68 61 6e 64 2c 20 74 68 65 20 65 78 74 72 61 20  hand, the extra 
29f00 73 65 65 6b 73 20 63 6f 75 6c 64 20 65 6e 64 20  seeks could end 
29f10 75 70 20 62 65 69 6e 67 20 73 69 67 6e 69 66 69  up being signifi
29f20 63 61 6e 74 6c 79 0a 20 20 2a 2a 20 6d 6f 72 65  cantly.  ** more
29f30 20 65 78 70 65 6e 73 69 76 65 2e 20 20 2a 2f 0a   expensive.  */.
29f40 20 20 61 73 73 65 72 74 28 20 34 32 3d 3d 73 71    assert( 42==sq
29f50 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 38 29 20  lite3LogEst(18) 
29f60 29 3b 0a 20 20 69 66 28 20 73 61 76 65 64 5f 6e  );.  if( saved_n
29f70 45 71 3d 3d 73 61 76 65 64 5f 6e 53 6b 69 70 0a  Eq==saved_nSkip.
29f80 20 20 20 26 26 20 73 61 76 65 64 5f 6e 45 71 2b     && saved_nEq+
29f90 31 3c 70 50 72 6f 62 65 2d 3e 6e 4b 65 79 43 6f  1<pProbe->nKeyCo
29fa0 6c 0a 20 20 20 26 26 20 70 50 72 6f 62 65 2d 3e  l.   && pProbe->
29fb0 6e 6f 53 6b 69 70 53 63 61 6e 3d 3d 30 0a 20 20  noSkipScan==0.  
29fc0 20 26 26 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f   && pProbe->aiRo
29fd0 77 4c 6f 67 45 73 74 5b 73 61 76 65 64 5f 6e 45  wLogEst[saved_nE
29fe0 71 2b 31 5d 3e 3d 34 32 20 20 2f 2a 20 54 55 4e  q+1]>=42  /* TUN
29ff0 49 4e 47 3a 20 4d 69 6e 69 6d 75 6d 20 66 6f 72  ING: Minimum for
2a000 20 73 6b 69 70 2d 73 63 61 6e 20 2a 2f 0a 20 20   skip-scan */.  
2a010 20 26 26 20 28 72 63 20 3d 20 77 68 65 72 65 4c   && (rc = whereL
2a020 6f 6f 70 52 65 73 69 7a 65 28 64 62 2c 20 70 4e  oopResize(db, pN
2a030 65 77 2c 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d  ew, pNew->nLTerm
2a040 2b 31 29 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a  +1))==SQLITE_OK.
2a050 20 20 29 7b 0a 20 20 20 20 4c 6f 67 45 73 74 20    ){.    LogEst 
2a060 6e 49 74 65 72 3b 0a 20 20 20 20 70 4e 65 77 2d  nIter;.    pNew-
2a070 3e 75 2e 62 74 72 65 65 2e 6e 45 71 2b 2b 3b 0a  >u.btree.nEq++;.
2a080 20 20 20 20 70 4e 65 77 2d 3e 6e 53 6b 69 70 2b      pNew->nSkip+
2a090 2b 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54  +;.    pNew->aLT
2a0a0 65 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d  erm[pNew->nLTerm
2a0b0 2b 2b 5d 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65  ++] = 0;.    pNe
2a0c0 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48  w->wsFlags |= WH
2a0d0 45 52 45 5f 53 4b 49 50 53 43 41 4e 3b 0a 20 20  ERE_SKIPSCAN;.  
2a0e0 20 20 6e 49 74 65 72 20 3d 20 70 50 72 6f 62 65    nIter = pProbe
2a0f0 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 73 61  ->aiRowLogEst[sa
2a100 76 65 64 5f 6e 45 71 5d 20 2d 20 70 50 72 6f 62  ved_nEq] - pProb
2a110 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 73  e->aiRowLogEst[s
2a120 61 76 65 64 5f 6e 45 71 2b 31 5d 3b 0a 20 20 20  aved_nEq+1];.   
2a130 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2d 3d 20 6e   pNew->nOut -= n
2a140 49 74 65 72 3b 0a 20 20 20 20 2f 2a 20 54 55 4e  Iter;.    /* TUN
2a150 49 4e 47 3a 20 20 42 65 63 61 75 73 65 20 75 6e  ING:  Because un
2a160 63 65 72 74 61 69 6e 74 69 65 73 20 69 6e 20 74  certainties in t
2a170 68 65 20 65 73 74 69 6d 61 74 65 73 20 66 6f 72  he estimates for
2a180 20 73 6b 69 70 2d 73 63 61 6e 20 71 75 65 72 69   skip-scan queri
2a190 65 73 2c 0a 20 20 20 20 2a 2a 20 61 64 64 20 61  es,.    ** add a
2a1a0 20 31 2e 33 37 35 20 66 75 64 67 65 20 66 61 63   1.375 fudge fac
2a1b0 74 6f 72 20 74 6f 20 6d 61 6b 65 20 73 6b 69 70  tor to make skip
2a1c0 2d 73 63 61 6e 20 73 6c 69 67 68 74 6c 79 20 6c  -scan slightly l
2a1d0 65 73 73 20 6c 69 6b 65 6c 79 2e 20 2a 2f 0a 20  ess likely. */. 
2a1e0 20 20 20 6e 49 74 65 72 20 2b 3d 20 35 3b 0a 20     nIter += 5;. 
2a1f0 20 20 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42     whereLoopAddB
2a200 74 72 65 65 49 6e 64 65 78 28 70 42 75 69 6c 64  treeIndex(pBuild
2a210 65 72 2c 20 70 53 72 63 2c 20 70 50 72 6f 62 65  er, pSrc, pProbe
2a220 2c 20 6e 49 74 65 72 20 2b 20 6e 49 6e 4d 75 6c  , nIter + nInMul
2a230 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75  );.    pNew->nOu
2a240 74 20 3d 20 73 61 76 65 64 5f 6e 4f 75 74 3b 0a  t = saved_nOut;.
2a250 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65      pNew->u.btre
2a260 65 2e 6e 45 71 20 3d 20 73 61 76 65 64 5f 6e 45  e.nEq = saved_nE
2a270 71 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 53 6b  q;.    pNew->nSk
2a280 69 70 20 3d 20 73 61 76 65 64 5f 6e 53 6b 69 70  ip = saved_nSkip
2a290 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c  ;.    pNew->wsFl
2a2a0 61 67 73 20 3d 20 73 61 76 65 64 5f 77 73 46 6c  ags = saved_wsFl
2a2b0 61 67 73 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  ags;.  }..  retu
2a2c0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
2a2d0 52 65 74 75 72 6e 20 54 72 75 65 20 69 66 20 69  Return True if i
2a2e0 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 68  t is possible th
2a2f0 61 74 20 70 49 6e 64 65 78 20 6d 69 67 68 74 20  at pIndex might 
2a300 62 65 20 75 73 65 66 75 6c 20 69 6e 0a 2a 2a 20  be useful in.** 
2a310 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68 65  implementing the
2a320 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
2a330 20 69 6e 20 70 42 75 69 6c 64 65 72 2e 0a 2a 2a   in pBuilder..**
2a340 0a 2a 2a 20 52 65 74 75 72 6e 20 46 61 6c 73 65  .** Return False
2a350 20 69 66 20 70 42 75 69 6c 64 65 72 20 64 6f 65   if pBuilder doe
2a360 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 6e  s not contain an
2a370 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
2a380 20 6f 72 0a 2a 2a 20 69 66 20 74 68 65 72 65 20   or.** if there 
2a390 69 73 20 6e 6f 20 77 61 79 20 66 6f 72 20 70 49  is no way for pI
2a3a0 6e 64 65 78 20 74 6f 20 62 65 20 75 73 65 66 75  ndex to be usefu
2a3b0 6c 20 69 6e 20 69 6d 70 6c 65 6d 65 6e 74 69 6e  l in implementin
2a3c0 67 20 74 68 61 74 0a 2a 2a 20 4f 52 44 45 52 20  g that.** ORDER 
2a3d0 42 59 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 73 74  BY clause..*/.st
2a3e0 61 74 69 63 20 69 6e 74 20 69 6e 64 65 78 4d 69  atic int indexMi
2a3f0 67 68 74 48 65 6c 70 57 69 74 68 4f 72 64 65 72  ghtHelpWithOrder
2a400 42 79 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42  By(.  WhereLoopB
2a410 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72  uilder *pBuilder
2a420 2c 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65  ,.  Index *pInde
2a430 78 2c 0a 20 20 69 6e 74 20 69 43 75 72 73 6f 72  x,.  int iCursor
2a440 0a 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  .){.  ExprList *
2a450 70 4f 42 3b 0a 20 20 69 6e 74 20 69 69 2c 20 6a  pOB;.  int ii, j
2a460 6a 3b 0a 0a 20 20 69 66 28 20 70 49 6e 64 65 78  j;..  if( pIndex
2a470 2d 3e 62 55 6e 6f 72 64 65 72 65 64 20 29 20 72  ->bUnordered ) r
2a480 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28  eturn 0;.  if( (
2a490 70 4f 42 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  pOB = pBuilder->
2a4a0 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79  pWInfo->pOrderBy
2a4b0 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  )==0 ) return 0;
2a4c0 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c  .  for(ii=0; ii<
2a4d0 70 4f 42 2d 3e 6e 45 78 70 72 3b 20 69 69 2b 2b  pOB->nExpr; ii++
2a4e0 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78  ){.    Expr *pEx
2a4f0 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pr = sqlite3Expr
2a500 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4f 42 2d  SkipCollate(pOB-
2a510 3e 61 5b 69 69 5d 2e 70 45 78 70 72 29 3b 0a 20  >a[ii].pExpr);. 
2a520 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70     if( pExpr->op
2a530 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 72 65  !=TK_COLUMN ) re
2a540 74 75 72 6e 20 30 3b 0a 20 20 20 20 69 66 28 20  turn 0;.    if( 
2a550 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 69  pExpr->iTable==i
2a560 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20  Cursor ){.      
2a570 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  if( pExpr->iColu
2a580 6d 6e 3c 30 20 29 20 72 65 74 75 72 6e 20 31 3b  mn<0 ) return 1;
2a590 0a 20 20 20 20 20 20 66 6f 72 28 6a 6a 3d 30 3b  .      for(jj=0;
2a5a0 20 6a 6a 3c 70 49 6e 64 65 78 2d 3e 6e 4b 65 79   jj<pIndex->nKey
2a5b0 43 6f 6c 3b 20 6a 6a 2b 2b 29 7b 0a 20 20 20 20  Col; jj++){.    
2a5c0 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69      if( pExpr->i
2a5d0 43 6f 6c 75 6d 6e 3d 3d 70 49 6e 64 65 78 2d 3e  Column==pIndex->
2a5e0 61 69 43 6f 6c 75 6d 6e 5b 6a 6a 5d 20 29 20 72  aiColumn[jj] ) r
2a5f0 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d  eturn 1;.      }
2a600 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
2a610 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
2a620 52 65 74 75 72 6e 20 61 20 62 69 74 6d 61 73 6b  Return a bitmask
2a630 20 77 68 65 72 65 20 31 73 20 69 6e 64 69 63 61   where 1s indica
2a640 74 65 20 74 68 61 74 20 74 68 65 20 63 6f 72 72  te that the corr
2a650 65 73 70 6f 6e 64 69 6e 67 20 63 6f 6c 75 6d 6e  esponding column
2a660 20 6f 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65   of.** the table
2a670 20 69 73 20 75 73 65 64 20 62 79 20 61 6e 20 69   is used by an i
2a680 6e 64 65 78 2e 20 20 4f 6e 6c 79 20 74 68 65 20  ndex.  Only the 
2a690 66 69 72 73 74 20 36 33 20 63 6f 6c 75 6d 6e 73  first 63 columns
2a6a0 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64 2e   are considered.
2a6b0 0a 2a 2f 0a 73 74 61 74 69 63 20 42 69 74 6d 61  .*/.static Bitma
2a6c0 73 6b 20 63 6f 6c 75 6d 6e 73 49 6e 49 6e 64 65  sk columnsInInde
2a6d0 78 28 49 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a  x(Index *pIdx){.
2a6e0 20 20 42 69 74 6d 61 73 6b 20 6d 20 3d 20 30 3b    Bitmask m = 0;
2a6f0 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 66 6f 72 28  .  int j;.  for(
2a700 6a 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 2d  j=pIdx->nColumn-
2a710 31 3b 20 6a 3e 3d 30 3b 20 6a 2d 2d 29 7b 0a 20  1; j>=0; j--){. 
2a720 20 20 20 69 6e 74 20 78 20 3d 20 70 49 64 78 2d     int x = pIdx-
2a730 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20  >aiColumn[j];.  
2a740 20 20 69 66 28 20 78 3e 3d 30 20 29 7b 0a 20 20    if( x>=0 ){.  
2a750 20 20 20 20 74 65 73 74 63 61 73 65 28 20 78 3d      testcase( x=
2a760 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20 20  =BMS-1 );.      
2a770 74 65 73 74 63 61 73 65 28 20 78 3d 3d 42 4d 53  testcase( x==BMS
2a780 2d 32 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  -2 );.      if( 
2a790 78 3c 42 4d 53 2d 31 20 29 20 6d 20 7c 3d 20 4d  x<BMS-1 ) m |= M
2a7a0 41 53 4b 42 49 54 28 78 29 3b 0a 20 20 20 20 7d  ASKBIT(x);.    }
2a7b0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d 3b  .  }.  return m;
2a7c0 0a 7d 0a 0a 2f 2a 20 43 68 65 63 6b 20 74 6f 20  .}../* Check to 
2a7d0 73 65 65 20 69 66 20 61 20 70 61 72 74 69 61 6c  see if a partial
2a7e0 20 69 6e 64 65 78 20 77 69 74 68 20 70 50 61 72   index with pPar
2a7f0 74 49 6e 64 65 78 57 68 65 72 65 20 63 61 6e 20  tIndexWhere can 
2a800 62 65 20 75 73 65 64 0a 2a 2a 20 69 6e 20 74 68  be used.** in th
2a810 65 20 63 75 72 72 65 6e 74 20 71 75 65 72 79 2e  e current query.
2a820 20 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66    Return true if
2a830 20 69 74 20 63 61 6e 20 62 65 20 61 6e 64 20 66   it can be and f
2a840 61 6c 73 65 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a  alse if not..*/.
2a850 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
2a860 55 73 61 62 6c 65 50 61 72 74 69 61 6c 49 6e 64  UsablePartialInd
2a870 65 78 28 69 6e 74 20 69 54 61 62 2c 20 57 68 65  ex(int iTab, Whe
2a880 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 45  reClause *pWC, E
2a890 78 70 72 20 2a 70 57 68 65 72 65 29 7b 0a 20 20  xpr *pWhere){.  
2a8a0 69 6e 74 20 69 3b 0a 20 20 57 68 65 72 65 54 65  int i;.  WhereTe
2a8b0 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 66 6f 72  rm *pTerm;.  for
2a8c0 28 69 3d 30 2c 20 70 54 65 72 6d 3d 70 57 43 2d  (i=0, pTerm=pWC-
2a8d0 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72 6d  >a; i<pWC->nTerm
2a8e0 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b  ; i++, pTerm++){
2a8f0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
2a900 45 78 70 72 49 6d 70 6c 69 65 73 45 78 70 72 28  ExprImpliesExpr(
2a910 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 70 57  pTerm->pExpr, pW
2a920 68 65 72 65 2c 20 69 54 61 62 29 20 29 20 72 65  here, iTab) ) re
2a930 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65  turn 1;.  }.  re
2a940 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
2a950 20 41 64 64 20 61 6c 6c 20 57 68 65 72 65 4c 6f   Add all WhereLo
2a960 6f 70 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 61  op objects for a
2a970 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 6f 66   single table of
2a980 20 74 68 65 20 6a 6f 69 6e 20 77 68 65 72 65 20   the join where 
2a990 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20 69 73 20  the table.** is 
2a9a0 69 64 65 6e 66 69 65 64 20 62 79 20 70 42 75 69  idenfied by pBui
2a9b0 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 69 54 61 62  lder->pNew->iTab
2a9c0 2e 20 20 54 68 61 74 20 74 61 62 6c 65 20 69 73  .  That table is
2a9d0 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62   guaranteed to b
2a9e0 65 0a 2a 2a 20 61 20 62 2d 74 72 65 65 20 74 61  e.** a b-tree ta
2a9f0 62 6c 65 2c 20 6e 6f 74 20 61 20 76 69 72 74 75  ble, not a virtu
2aa00 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  al table..**.** 
2aa10 54 68 65 20 63 6f 73 74 73 20 28 57 68 65 72 65  The costs (Where
2aa20 4c 6f 6f 70 2e 72 52 75 6e 29 20 6f 66 20 74 68  Loop.rRun) of th
2aa30 65 20 62 2d 74 72 65 65 20 6c 6f 6f 70 73 20 61  e b-tree loops a
2aa40 64 64 65 64 20 62 79 20 74 68 69 73 20 66 75 6e  dded by this fun
2aa50 63 74 69 6f 6e 0a 2a 2a 20 61 72 65 20 63 61 6c  ction.** are cal
2aa60 63 75 6c 61 74 65 64 20 61 73 20 66 6f 6c 6c 6f  culated as follo
2aa70 77 73 3a 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20  ws:.**.** For a 
2aa80 66 75 6c 6c 20 73 63 61 6e 2c 20 61 73 73 75 6d  full scan, assum
2aa90 69 6e 67 20 74 68 65 20 74 61 62 6c 65 20 28 6f  ing the table (o
2aaa0 72 20 69 6e 64 65 78 29 20 63 6f 6e 74 61 69 6e  r index) contain
2aab0 73 20 6e 52 6f 77 20 72 6f 77 73 3a 0a 2a 2a 0a  s nRow rows:.**.
2aac0 2a 2a 20 20 20 20 20 63 6f 73 74 20 3d 20 6e 52  **     cost = nR
2aad0 6f 77 20 2a 20 33 2e 30 20 20 20 20 20 20 20 20  ow * 3.0        
2aae0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 66              // f
2aaf0 75 6c 6c 2d 74 61 62 6c 65 20 73 63 61 6e 0a 2a  ull-table scan.*
2ab00 2a 20 20 20 20 20 63 6f 73 74 20 3d 20 6e 52 6f  *     cost = nRo
2ab10 77 20 2a 20 4b 20 20 20 20 20 20 20 20 20 20 20  w * K           
2ab20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 73 63             // sc
2ab30 61 6e 20 6f 66 20 63 6f 76 65 72 69 6e 67 20 69  an of covering i
2ab40 6e 64 65 78 0a 2a 2a 20 20 20 20 20 63 6f 73 74  ndex.**     cost
2ab50 20 3d 20 6e 52 6f 77 20 2a 20 28 4b 2b 33 2e 30   = nRow * (K+3.0
2ab60 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  )               
2ab70 20 2f 2f 20 73 63 61 6e 20 6f 66 20 6e 6f 6e 2d   // scan of non-
2ab80 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 0a 2a  covering index.*
2ab90 2a 0a 2a 2a 20 77 68 65 72 65 20 4b 20 69 73 20  *.** where K is 
2aba0 61 20 76 61 6c 75 65 20 62 65 74 77 65 65 6e 20  a value between 
2abb0 31 2e 31 20 61 6e 64 20 33 2e 30 20 73 65 74 20  1.1 and 3.0 set 
2abc0 62 61 73 65 64 20 6f 6e 20 74 68 65 20 72 65 6c  based on the rel
2abd0 61 74 69 76 65 20 0a 2a 2a 20 65 73 74 69 6d 61  ative .** estima
2abe0 74 65 64 20 61 76 65 72 61 67 65 20 73 69 7a 65  ted average size
2abf0 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 61 6e   of the index an
2ac00 64 20 74 61 62 6c 65 20 72 65 63 6f 72 64 73 2e  d table records.
2ac10 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 6e 20 69 6e  .**.** For an in
2ac20 64 65 78 20 73 63 61 6e 2c 20 77 68 65 72 65 20  dex scan, where 
2ac30 6e 56 69 73 69 74 20 69 73 20 74 68 65 20 6e 75  nVisit is the nu
2ac40 6d 62 65 72 20 6f 66 20 69 6e 64 65 78 20 72 6f  mber of index ro
2ac50 77 73 20 76 69 73 69 74 65 64 0a 2a 2a 20 62 79  ws visited.** by
2ac60 20 74 68 65 20 73 63 61 6e 2c 20 61 6e 64 20 6e   the scan, and n
2ac70 53 65 65 6b 20 69 73 20 74 68 65 20 6e 75 6d 62  Seek is the numb
2ac80 65 72 20 6f 66 20 73 65 65 6b 20 6f 70 65 72 61  er of seek opera
2ac90 74 69 6f 6e 73 20 72 65 71 75 69 72 65 64 20 6f  tions required o
2aca0 6e 20 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78 20  n .** the index 
2acb0 62 2d 74 72 65 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  b-tree:.**.**   
2acc0 20 20 63 6f 73 74 20 3d 20 6e 53 65 65 6b 20 2a    cost = nSeek *
2acd0 20 28 6c 6f 67 28 6e 52 6f 77 29 20 2b 20 4b 20   (log(nRow) + K 
2ace0 2a 20 6e 56 69 73 69 74 29 20 20 20 20 20 20 20  * nVisit)       
2acf0 20 20 20 2f 2f 20 63 6f 76 65 72 69 6e 67 20 69     // covering i
2ad00 6e 64 65 78 0a 2a 2a 20 20 20 20 20 63 6f 73 74  ndex.**     cost
2ad10 20 3d 20 6e 53 65 65 6b 20 2a 20 28 6c 6f 67 28   = nSeek * (log(
2ad20 6e 52 6f 77 29 20 2b 20 28 4b 2b 33 2e 30 29 20  nRow) + (K+3.0) 
2ad30 2a 20 6e 56 69 73 69 74 29 20 20 20 20 2f 2f 20  * nVisit)    // 
2ad40 6e 6f 6e 2d 63 6f 76 65 72 69 6e 67 20 69 6e 64  non-covering ind
2ad50 65 78 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c  ex.**.** Normall
2ad60 79 2c 20 6e 53 65 65 6b 20 69 73 20 31 2e 20 6e  y, nSeek is 1. n
2ad70 53 65 65 6b 20 76 61 6c 75 65 73 20 67 72 65 61  Seek values grea
2ad80 74 65 72 20 74 68 61 6e 20 31 20 63 6f 6d 65 20  ter than 1 come 
2ad90 61 62 6f 75 74 20 69 66 20 74 68 65 20 0a 2a 2a  about if the .**
2ada0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e   WHERE clause in
2adb0 63 6c 75 64 65 73 20 22 78 20 49 4e 20 28 2e 2e  cludes "x IN (..
2adc0 2e 2e 29 22 20 74 65 72 6d 73 20 75 73 65 64 20  ..)" terms used 
2add0 69 6e 20 70 6c 61 63 65 20 6f 66 20 22 78 3d 3f  in place of "x=?
2ade0 22 2e 20 4f 72 20 77 68 65 6e 20 0a 2a 2a 20 69  ". Or when .** i
2adf0 6d 70 6c 69 63 69 74 20 22 78 20 49 4e 20 28 53  mplicit "x IN (S
2ae00 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 62 6c  ELECT x FROM tbl
2ae10 29 22 20 74 65 72 6d 73 20 61 72 65 20 61 64 64  )" terms are add
2ae20 65 64 20 66 6f 72 20 73 6b 69 70 2d 73 63 61 6e  ed for skip-scan
2ae30 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 73 74  s..**.** The est
2ae40 69 6d 61 74 65 64 20 76 61 6c 75 65 73 20 28 6e  imated values (n
2ae50 52 6f 77 2c 20 6e 56 69 73 69 74 2c 20 6e 53 65  Row, nVisit, nSe
2ae60 65 6b 29 20 6f 66 74 65 6e 20 63 6f 6e 74 61 69  ek) often contai
2ae70 6e 20 61 20 6c 61 72 67 65 20 61 6d 6f 75 6e 74  n a large amount
2ae80 0a 2a 2a 20 6f 66 20 75 6e 63 65 72 74 61 69 6e  .** of uncertain
2ae90 74 79 2e 20 20 46 6f 72 20 74 68 69 73 20 72 65  ty.  For this re
2aea0 61 73 6f 6e 2c 20 73 63 6f 72 69 6e 67 20 69 73  ason, scoring is
2aeb0 20 64 65 73 69 67 6e 65 64 20 74 6f 20 70 69 63   designed to pic
2aec0 6b 20 70 6c 61 6e 73 20 74 68 61 74 0a 2a 2a 20  k plans that.** 
2aed0 22 64 6f 20 74 68 65 20 6c 65 61 73 74 20 68 61  "do the least ha
2aee0 72 6d 22 20 69 66 20 74 68 65 20 65 73 74 69 6d  rm" if the estim
2aef0 61 74 65 73 20 61 72 65 20 69 6e 61 63 63 75 72  ates are inaccur
2af00 61 74 65 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c  ate.  For exampl
2af10 65 2c 20 61 0a 2a 2a 20 6c 6f 67 28 6e 52 6f 77  e, a.** log(nRow
2af20 29 20 66 61 63 74 6f 72 20 69 73 20 6f 6d 69 74  ) factor is omit
2af30 74 65 64 20 66 72 6f 6d 20 61 20 6e 6f 6e 2d 63  ted from a non-c
2af40 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20 73 63  overing index sc
2af50 61 6e 20 69 6e 20 6f 72 64 65 72 20 74 6f 0a 2a  an in order to.*
2af60 2a 20 62 69 61 73 20 74 68 65 20 73 63 6f 72 69  * bias the scori
2af70 6e 67 20 69 6e 20 66 61 76 6f 72 20 6f 66 20 75  ng in favor of u
2af80 73 69 6e 67 20 61 6e 20 69 6e 64 65 78 2c 20 73  sing an index, s
2af90 69 6e 63 65 20 74 68 65 20 77 6f 72 73 74 2d 63  ince the worst-c
2afa0 61 73 65 0a 2a 2a 20 70 65 72 66 6f 72 6d 61 6e  ase.** performan
2afb0 63 65 20 6f 66 20 75 73 69 6e 67 20 61 6e 20 69  ce of using an i
2afc0 6e 64 65 78 20 69 73 20 66 61 72 20 62 65 74 74  ndex is far bett
2afd0 65 72 20 74 68 61 6e 20 74 68 65 20 77 6f 72 73  er than the wors
2afe0 74 2d 63 61 73 65 20 70 65 72 66 6f 72 6d 61 6e  t-case performan
2aff0 63 65 0a 2a 2a 20 6f 66 20 61 20 66 75 6c 6c 20  ce.** of a full 
2b000 74 61 62 6c 65 20 73 63 61 6e 2e 0a 2a 2f 0a 73  table scan..*/.s
2b010 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c  tatic int whereL
2b020 6f 6f 70 41 64 64 42 74 72 65 65 28 0a 20 20 57  oopAddBtree(.  W
2b030 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20  hereLoopBuilder 
2b040 2a 70 42 75 69 6c 64 65 72 2c 20 2f 2a 20 57 48  *pBuilder, /* WH
2b050 45 52 45 20 63 6c 61 75 73 65 20 69 6e 66 6f 72  ERE clause infor
2b060 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 42 69 74 6d  mation */.  Bitm
2b070 61 73 6b 20 6d 45 78 74 72 61 20 20 20 20 20 20  ask mExtra      
2b080 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61          /* Extra
2b090 20 70 72 65 72 65 71 75 65 73 69 74 65 73 20 66   prerequesites f
2b0a0 6f 72 20 75 73 69 6e 67 20 74 68 69 73 20 74 61  or using this ta
2b0b0 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72  ble */.){.  Wher
2b0c0 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20  eInfo *pWInfo;  
2b0d0 20 20 20 20 20 20 20 20 2f 2a 20 57 48 45 52 45          /* WHERE
2b0e0 20 61 6e 61 6c 79 73 69 73 20 63 6f 6e 74 65 78   analysis contex
2b0f0 74 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 50  t */.  Index *pP
2b100 72 6f 62 65 3b 20 20 20 20 20 20 20 20 20 20 20  robe;           
2b110 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 77     /* An index w
2b120 65 20 61 72 65 20 65 76 61 6c 75 61 74 69 6e 67  e are evaluating
2b130 20 2a 2f 0a 20 20 49 6e 64 65 78 20 73 50 6b 3b   */.  Index sPk;
2b140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b150 20 20 2f 2a 20 41 20 66 61 6b 65 20 69 6e 64 65    /* A fake inde
2b160 78 20 6f 62 6a 65 63 74 20 66 6f 72 20 74 68 65  x object for the
2b170 20 70 72 69 6d 61 72 79 20 6b 65 79 20 2a 2f 0a   primary key */.
2b180 20 20 4c 6f 67 45 73 74 20 61 69 52 6f 77 45 73    LogEst aiRowEs
2b190 74 50 6b 5b 32 5d 3b 20 20 20 20 20 20 20 2f 2a  tPk[2];       /*
2b1a0 20 54 68 65 20 61 69 52 6f 77 4c 6f 67 45 73 74   The aiRowLogEst
2b1b0 5b 5d 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  [] value for the
2b1c0 20 73 50 6b 20 69 6e 64 65 78 20 2a 2f 0a 20 20   sPk index */.  
2b1d0 69 31 36 20 61 69 43 6f 6c 75 6d 6e 50 6b 20 3d  i16 aiColumnPk =
2b1e0 20 2d 31 3b 20 20 20 20 20 20 20 20 2f 2a 20 54   -1;        /* T
2b1f0 68 65 20 61 43 6f 6c 75 6d 6e 5b 5d 20 76 61 6c  he aColumn[] val
2b200 75 65 20 66 6f 72 20 74 68 65 20 73 50 6b 20 69  ue for the sPk i
2b210 6e 64 65 78 20 2a 2f 0a 20 20 53 72 63 4c 69 73  ndex */.  SrcLis
2b220 74 20 2a 70 54 61 62 4c 69 73 74 3b 20 20 20 20  t *pTabList;    
2b230 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f        /* The FRO
2b240 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74  M clause */.  st
2b250 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
2b260 6d 20 2a 70 53 72 63 3b 20 20 2f 2a 20 54 68 65  m *pSrc;  /* The
2b270 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 62 74 72   FROM clause btr
2b280 65 65 20 74 65 72 6d 20 74 6f 20 61 64 64 20 2a  ee term to add *
2b290 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  /.  WhereLoop *p
2b2a0 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20  New;            
2b2b0 2f 2a 20 54 65 6d 70 6c 61 74 65 20 57 68 65 72  /* Template Wher
2b2c0 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 2a 2f 0a  eLoop object */.
2b2d0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
2b2e0 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 2f 2a  E_OK;         /*
2b2f0 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
2b300 20 20 69 6e 74 20 69 53 6f 72 74 49 64 78 20 3d    int iSortIdx =
2b310 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   1;           /*
2b320 20 49 6e 64 65 78 20 6e 75 6d 62 65 72 20 2a 2f   Index number */
2b330 0a 20 20 69 6e 74 20 62 3b 20 20 20 20 20 20 20  .  int b;       
2b340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2b350 2a 20 41 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75  * A boolean valu
2b360 65 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 72 53  e */.  LogEst rS
2b370 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
2b380 20 20 20 2f 2a 20 6e 75 6d 62 65 72 20 6f 66 20     /* number of 
2b390 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c  rows in the tabl
2b3a0 65 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 72 4c  e */.  LogEst rL
2b3b0 6f 67 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  ogSize;         
2b3c0 20 20 20 2f 2a 20 4c 6f 67 61 72 69 74 68 6d 20     /* Logarithm 
2b3d0 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  of the number of
2b3e0 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62   rows in the tab
2b3f0 6c 65 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61  le */.  WhereCla
2b400 75 73 65 20 2a 70 57 43 3b 20 20 20 20 20 20 20  use *pWC;       
2b410 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65      /* The parse
2b420 64 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  d WHERE clause *
2b430 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  /.  Table *pTab;
2b440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b450 2f 2a 20 54 61 62 6c 65 20 62 65 69 6e 67 20 71  /* Table being q
2b460 75 65 72 69 65 64 20 2a 2f 0a 20 20 0a 20 20 70  ueried */.  .  p
2b470 4e 65 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  New = pBuilder->
2b480 70 4e 65 77 3b 0a 20 20 70 57 49 6e 66 6f 20 3d  pNew;.  pWInfo =
2b490 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66   pBuilder->pWInf
2b4a0 6f 3b 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20  o;.  pTabList = 
2b4b0 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
2b4c0 3b 0a 20 20 70 53 72 63 20 3d 20 70 54 61 62 4c  ;.  pSrc = pTabL
2b4d0 69 73 74 2d 3e 61 20 2b 20 70 4e 65 77 2d 3e 69  ist->a + pNew->i
2b4e0 54 61 62 3b 0a 20 20 70 54 61 62 20 3d 20 70 53  Tab;.  pTab = pS
2b4f0 72 63 2d 3e 70 54 61 62 3b 0a 20 20 70 57 43 20  rc->pTab;.  pWC 
2b500 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 3b  = pBuilder->pWC;
2b510 0a 20 20 61 73 73 65 72 74 28 20 21 49 73 56 69  .  assert( !IsVi
2b520 72 74 75 61 6c 28 70 53 72 63 2d 3e 70 54 61 62  rtual(pSrc->pTab
2b530 29 20 29 3b 0a 0a 20 20 69 66 28 20 70 53 72 63  ) );..  if( pSrc
2b540 2d 3e 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20  ->pIndex ){.    
2b550 2f 2a 20 41 6e 20 49 4e 44 45 58 45 44 20 42 59  /* An INDEXED BY
2b560 20 63 6c 61 75 73 65 20 73 70 65 63 69 66 69 65   clause specifie
2b570 73 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 69  s a particular i
2b580 6e 64 65 78 20 74 6f 20 75 73 65 20 2a 2f 0a 20  ndex to use */. 
2b590 20 20 20 70 50 72 6f 62 65 20 3d 20 70 53 72 63     pProbe = pSrc
2b5a0 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 7d 65 6c 73  ->pIndex;.  }els
2b5b0 65 20 69 66 28 20 21 48 61 73 52 6f 77 69 64 28  e if( !HasRowid(
2b5c0 70 54 61 62 29 20 29 7b 0a 20 20 20 20 70 50 72  pTab) ){.    pPr
2b5d0 6f 62 65 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64  obe = pTab->pInd
2b5e0 65 78 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ex;.  }else{.   
2b5f0 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 20   /* There is no 
2b600 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73  INDEXED BY claus
2b610 65 2e 20 20 43 72 65 61 74 65 20 61 20 66 61 6b  e.  Create a fak
2b620 65 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 69  e Index object i
2b630 6e 20 6c 6f 63 61 6c 0a 20 20 20 20 2a 2a 20 76  n local.    ** v
2b640 61 72 69 61 62 6c 65 20 73 50 6b 20 74 6f 20 72  ariable sPk to r
2b650 65 70 72 65 73 65 6e 74 20 74 68 65 20 72 6f 77  epresent the row
2b660 69 64 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69  id primary key i
2b670 6e 64 65 78 2e 20 20 4d 61 6b 65 20 74 68 69 73  ndex.  Make this
2b680 0a 20 20 20 20 2a 2a 20 66 61 6b 65 20 69 6e 64  .    ** fake ind
2b690 65 78 20 74 68 65 20 66 69 72 73 74 20 69 6e 20  ex the first in 
2b6a0 61 20 63 68 61 69 6e 20 6f 66 20 49 6e 64 65 78  a chain of Index
2b6b0 20 6f 62 6a 65 63 74 73 20 77 69 74 68 20 61 6c   objects with al
2b6c0 6c 20 6f 66 20 74 68 65 20 72 65 61 6c 0a 20 20  l of the real.  
2b6d0 20 20 2a 2a 20 69 6e 64 69 63 65 73 20 74 6f 20    ** indices to 
2b6e0 66 6f 6c 6c 6f 77 20 2a 2f 0a 20 20 20 20 49 6e  follow */.    In
2b6f0 64 65 78 20 2a 70 46 69 72 73 74 3b 20 20 20 20  dex *pFirst;    
2b700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2b710 20 46 69 72 73 74 20 6f 66 20 72 65 61 6c 20 69   First of real i
2b720 6e 64 69 63 65 73 20 6f 6e 20 74 68 65 20 74 61  ndices on the ta
2b730 62 6c 65 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65  ble */.    memse
2b740 74 28 26 73 50 6b 2c 20 30 2c 20 73 69 7a 65 6f  t(&sPk, 0, sizeo
2b750 66 28 49 6e 64 65 78 29 29 3b 0a 20 20 20 20 73  f(Index));.    s
2b760 50 6b 2e 6e 4b 65 79 43 6f 6c 20 3d 20 31 3b 0a  Pk.nKeyCol = 1;.
2b770 20 20 20 20 73 50 6b 2e 6e 43 6f 6c 75 6d 6e 20      sPk.nColumn 
2b780 3d 20 31 3b 0a 20 20 20 20 73 50 6b 2e 61 69 43  = 1;.    sPk.aiC
2b790 6f 6c 75 6d 6e 20 3d 20 26 61 69 43 6f 6c 75 6d  olumn = &aiColum
2b7a0 6e 50 6b 3b 0a 20 20 20 20 73 50 6b 2e 61 69 52  nPk;.    sPk.aiR
2b7b0 6f 77 4c 6f 67 45 73 74 20 3d 20 61 69 52 6f 77  owLogEst = aiRow
2b7c0 45 73 74 50 6b 3b 0a 20 20 20 20 73 50 6b 2e 6f  EstPk;.    sPk.o
2b7d0 6e 45 72 72 6f 72 20 3d 20 4f 45 5f 52 65 70 6c  nError = OE_Repl
2b7e0 61 63 65 3b 0a 20 20 20 20 73 50 6b 2e 70 54 61  ace;.    sPk.pTa
2b7f0 62 6c 65 20 3d 20 70 54 61 62 3b 0a 20 20 20 20  ble = pTab;.    
2b800 73 50 6b 2e 73 7a 49 64 78 52 6f 77 20 3d 20 70  sPk.szIdxRow = p
2b810 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 3b 0a 20  Tab->szTabRow;. 
2b820 20 20 20 61 69 52 6f 77 45 73 74 50 6b 5b 30 5d     aiRowEstPk[0]
2b830 20 3d 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67   = pTab->nRowLog
2b840 45 73 74 3b 0a 20 20 20 20 61 69 52 6f 77 45 73  Est;.    aiRowEs
2b850 74 50 6b 5b 31 5d 20 3d 20 30 3b 0a 20 20 20 20  tPk[1] = 0;.    
2b860 70 46 69 72 73 74 20 3d 20 70 53 72 63 2d 3e 70  pFirst = pSrc->p
2b870 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20  Tab->pIndex;.   
2b880 20 69 66 28 20 70 53 72 63 2d 3e 6e 6f 74 49 6e   if( pSrc->notIn
2b890 64 65 78 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20  dexed==0 ){.    
2b8a0 20 20 2f 2a 20 54 68 65 20 72 65 61 6c 20 69 6e    /* The real in
2b8b0 64 69 63 65 73 20 6f 66 20 74 68 65 20 74 61 62  dices of the tab
2b8c0 6c 65 20 61 72 65 20 6f 6e 6c 79 20 63 6f 6e 73  le are only cons
2b8d0 69 64 65 72 65 64 20 69 66 20 74 68 65 0a 20 20  idered if the.  
2b8e0 20 20 20 20 2a 2a 20 4e 4f 54 20 49 4e 44 45 58      ** NOT INDEX
2b8f0 45 44 20 71 75 61 6c 69 66 69 65 72 20 69 73 20  ED qualifier is 
2b900 6f 6d 69 74 74 65 64 20 66 72 6f 6d 20 74 68 65  omitted from the
2b910 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a   FROM clause */.
2b920 20 20 20 20 20 20 73 50 6b 2e 70 4e 65 78 74 20        sPk.pNext 
2b930 3d 20 70 46 69 72 73 74 3b 0a 20 20 20 20 7d 0a  = pFirst;.    }.
2b940 20 20 20 20 70 50 72 6f 62 65 20 3d 20 26 73 50      pProbe = &sP
2b950 6b 3b 0a 20 20 7d 0a 20 20 72 53 69 7a 65 20 3d  k;.  }.  rSize =
2b960 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73   pTab->nRowLogEs
2b970 74 3b 0a 20 20 72 4c 6f 67 53 69 7a 65 20 3d 20  t;.  rLogSize = 
2b980 65 73 74 4c 6f 67 28 72 53 69 7a 65 29 3b 0a 0a  estLog(rSize);..
2b990 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2b9a0 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e  MIT_AUTOMATIC_IN
2b9b0 44 45 58 0a 20 20 2f 2a 20 41 75 74 6f 6d 61 74  DEX.  /* Automat
2b9c0 69 63 20 69 6e 64 65 78 65 73 20 2a 2f 0a 20 20  ic indexes */.  
2b9d0 69 66 28 20 21 70 42 75 69 6c 64 65 72 2d 3e 70  if( !pBuilder->p
2b9e0 4f 72 53 65 74 0a 20 20 20 26 26 20 28 70 57 49  OrSet.   && (pWI
2b9f0 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2d  nfo->pParse->db-
2ba00 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
2ba10 41 75 74 6f 49 6e 64 65 78 29 21 3d 30 0a 20 20  AutoIndex)!=0.  
2ba20 20 26 26 20 70 53 72 63 2d 3e 70 49 6e 64 65 78   && pSrc->pIndex
2ba30 3d 3d 30 0a 20 20 20 26 26 20 21 70 53 72 63 2d  ==0.   && !pSrc-
2ba40 3e 76 69 61 43 6f 72 6f 75 74 69 6e 65 0a 20 20  >viaCoroutine.  
2ba50 20 26 26 20 21 70 53 72 63 2d 3e 6e 6f 74 49 6e   && !pSrc->notIn
2ba60 64 65 78 65 64 0a 20 20 20 26 26 20 48 61 73 52  dexed.   && HasR
2ba70 6f 77 69 64 28 70 54 61 62 29 0a 20 20 20 26 26  owid(pTab).   &&
2ba80 20 21 70 53 72 63 2d 3e 69 73 43 6f 72 72 65 6c   !pSrc->isCorrel
2ba90 61 74 65 64 0a 20 20 20 26 26 20 21 70 53 72 63  ated.   && !pSrc
2baa0 2d 3e 69 73 52 65 63 75 72 73 69 76 65 0a 20 20  ->isRecursive.  
2bab0 29 7b 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72 61  ){.    /* Genera
2bac0 74 65 20 61 75 74 6f 2d 69 6e 64 65 78 20 57 68  te auto-index Wh
2bad0 65 72 65 4c 6f 6f 70 73 20 2a 2f 0a 20 20 20 20  ereLoops */.    
2bae0 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
2baf0 3b 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20  ;.    WhereTerm 
2bb00 2a 70 57 43 45 6e 64 20 3d 20 70 57 43 2d 3e 61  *pWCEnd = pWC->a
2bb10 20 2b 20 70 57 43 2d 3e 6e 54 65 72 6d 3b 0a 20   + pWC->nTerm;. 
2bb20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43     for(pTerm=pWC
2bb30 2d 3e 61 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ->a; rc==SQLITE_
2bb40 4f 4b 20 26 26 20 70 54 65 72 6d 3c 70 57 43 45  OK && pTerm<pWCE
2bb50 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20  nd; pTerm++){.  
2bb60 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 70      if( pTerm->p
2bb70 72 65 72 65 71 52 69 67 68 74 20 26 20 70 4e 65  rereqRight & pNe
2bb80 77 2d 3e 6d 61 73 6b 53 65 6c 66 20 29 20 63 6f  w->maskSelf ) co
2bb90 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66  ntinue;.      if
2bba0 28 20 74 65 72 6d 43 61 6e 44 72 69 76 65 49 6e  ( termCanDriveIn
2bbb0 64 65 78 28 70 54 65 72 6d 2c 20 70 53 72 63 2c  dex(pTerm, pSrc,
2bbc0 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70   0) ){.        p
2bbd0 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
2bbe0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 4e   = 1;.        pN
2bbf0 65 77 2d 3e 6e 53 6b 69 70 20 3d 20 30 3b 0a 20  ew->nSkip = 0;. 
2bc00 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62         pNew->u.b
2bc10 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 30 3b  tree.pIndex = 0;
2bc20 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e  .        pNew->n
2bc30 4c 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20  LTerm = 1;.     
2bc40 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b     pNew->aLTerm[
2bc50 30 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20  0] = pTerm;.    
2bc60 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 4f      /* TUNING: O
2bc70 6e 65 2d 74 69 6d 65 20 63 6f 73 74 20 66 6f 72  ne-time cost for
2bc80 20 63 6f 6d 70 75 74 69 6e 67 20 74 68 65 20 61   computing the a
2bc90 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 69  utomatic index i
2bca0 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 73 74  s.        ** est
2bcb0 69 6d 61 74 65 64 20 74 6f 20 62 65 20 58 2a 4e  imated to be X*N
2bcc0 2a 6c 6f 67 32 28 4e 29 20 77 68 65 72 65 20 4e  *log2(N) where N
2bcd0 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
2bce0 66 20 72 6f 77 73 20 69 6e 0a 20 20 20 20 20 20  f rows in.      
2bcf0 20 20 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 62    ** the table b
2bd00 65 69 6e 67 20 69 6e 64 65 78 65 64 20 61 6e 64  eing indexed and
2bd10 20 77 68 65 72 65 20 58 20 69 73 20 37 20 28 4c   where X is 7 (L
2bd20 6f 67 45 73 74 3d 32 38 29 20 66 6f 72 20 6e 6f  ogEst=28) for no
2bd30 72 6d 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20  rmal.        ** 
2bd40 74 61 62 6c 65 73 20 6f 72 20 31 2e 33 37 35 20  tables or 1.375 
2bd50 28 4c 6f 67 45 73 74 3d 34 29 20 66 6f 72 20 76  (LogEst=4) for v
2bd60 69 65 77 73 20 61 6e 64 20 73 75 62 71 75 65 72  iews and subquer
2bd70 69 65 73 2e 20 20 54 68 65 20 76 61 6c 75 65 0a  ies.  The value.
2bd80 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 58 20          ** of X 
2bd90 69 73 20 73 6d 61 6c 6c 65 72 20 66 6f 72 20 76  is smaller for v
2bda0 69 65 77 73 20 61 6e 64 20 73 75 62 71 75 65 72  iews and subquer
2bdb0 69 65 73 20 73 6f 20 74 68 61 74 20 74 68 65 20  ies so that the 
2bdc0 71 75 65 72 79 20 70 6c 61 6e 6e 65 72 0a 20 20  query planner.  
2bdd0 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65        ** will be
2bde0 20 6d 6f 72 65 20 61 67 67 72 65 73 73 69 76 65   more aggressive
2bdf0 20 61 62 6f 75 74 20 67 65 6e 65 72 61 74 69 6e   about generatin
2be00 67 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65  g automatic inde
2be10 78 65 73 20 66 6f 72 0a 20 20 20 20 20 20 20 20  xes for.        
2be20 2a 2a 20 74 68 6f 73 65 20 6f 62 6a 65 63 74 73  ** those objects
2be30 2c 20 73 69 6e 63 65 20 74 68 65 72 65 20 69 73  , since there is
2be40 20 6e 6f 20 6f 70 70 6f 72 74 75 6e 69 74 79 20   no opportunity 
2be50 74 6f 20 61 64 64 20 73 63 68 65 6d 61 0a 20 20  to add schema.  
2be60 20 20 20 20 20 20 2a 2a 20 69 6e 64 65 78 65 73        ** indexes
2be70 20 6f 6e 20 73 75 62 71 75 65 72 69 65 73 20 61   on subqueries a
2be80 6e 64 20 76 69 65 77 73 2e 20 2a 2f 0a 20 20 20  nd views. */.   
2be90 20 20 20 20 20 70 4e 65 77 2d 3e 72 53 65 74 75       pNew->rSetu
2bea0 70 20 3d 20 72 4c 6f 67 53 69 7a 65 20 2b 20 72  p = rLogSize + r
2beb0 53 69 7a 65 20 2b 20 34 3b 0a 20 20 20 20 20 20  Size + 4;.      
2bec0 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c    if( pTab->pSel
2bed0 65 63 74 3d 3d 30 20 26 26 20 28 70 54 61 62 2d  ect==0 && (pTab-
2bee0 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 45  >tabFlags & TF_E
2bef0 70 68 65 6d 65 72 61 6c 29 3d 3d 30 20 29 7b 0a  phemeral)==0 ){.
2bf00 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
2bf10 72 53 65 74 75 70 20 2b 3d 20 32 34 3b 0a 20 20  rSetup += 24;.  
2bf20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2bf30 41 70 70 6c 79 43 6f 73 74 4d 75 6c 74 69 70 6c  ApplyCostMultipl
2bf40 69 65 72 28 70 4e 65 77 2d 3e 72 53 65 74 75 70  ier(pNew->rSetup
2bf50 2c 20 70 54 61 62 2d 3e 63 6f 73 74 4d 75 6c 74  , pTab->costMult
2bf60 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 55  );.        /* TU
2bf70 4e 49 4e 47 3a 20 45 61 63 68 20 69 6e 64 65 78  NING: Each index
2bf80 20 6c 6f 6f 6b 75 70 20 79 69 65 6c 64 73 20 32   lookup yields 2
2bf90 30 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61  0 rows in the ta
2bfa0 62 6c 65 2e 20 20 54 68 69 73 0a 20 20 20 20 20  ble.  This.     
2bfb0 20 20 20 2a 2a 20 69 73 20 6d 6f 72 65 20 74 68     ** is more th
2bfc0 61 6e 20 74 68 65 20 75 73 75 61 6c 20 67 75 65  an the usual gue
2bfd0 73 73 20 6f 66 20 31 30 20 72 6f 77 73 2c 20 73  ss of 10 rows, s
2bfe0 69 6e 63 65 20 77 65 20 68 61 76 65 20 6e 6f 20  ince we have no 
2bff0 77 61 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  way.        ** o
2c000 66 20 6b 6e 6f 77 69 6e 67 20 68 6f 77 20 73 65  f knowing how se
2c010 6c 65 63 74 69 76 65 20 74 68 65 20 69 6e 64 65  lective the inde
2c020 78 20 77 69 6c 6c 20 75 6c 74 69 6d 61 74 65 6c  x will ultimatel
2c030 79 20 62 65 2e 20 20 49 74 20 77 6f 75 6c 64 0a  y be.  It would.
2c040 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20 62          ** not b
2c050 65 20 75 6e 72 65 61 73 6f 6e 61 62 6c 65 20 74  e unreasonable t
2c060 6f 20 6d 61 6b 65 20 74 68 69 73 20 76 61 6c 75  o make this valu
2c070 65 20 6d 75 63 68 20 6c 61 72 67 65 72 2e 20 2a  e much larger. *
2c080 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  /.        pNew->
2c090 6e 4f 75 74 20 3d 20 34 33 3b 20 20 61 73 73 65  nOut = 43;  asse
2c0a0 72 74 28 20 34 33 3d 3d 73 71 6c 69 74 65 33 4c  rt( 43==sqlite3L
2c0b0 6f 67 45 73 74 28 32 30 29 20 29 3b 0a 20 20 20  ogEst(20) );.   
2c0c0 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20       pNew->rRun 
2c0d0 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41  = sqlite3LogEstA
2c0e0 64 64 28 72 4c 6f 67 53 69 7a 65 2c 70 4e 65 77  dd(rLogSize,pNew
2c0f0 2d 3e 6e 4f 75 74 29 3b 0a 20 20 20 20 20 20 20  ->nOut);.       
2c100 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d   pNew->wsFlags =
2c110 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45   WHERE_AUTO_INDE
2c120 58 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  X;.        pNew-
2c130 3e 70 72 65 72 65 71 20 3d 20 6d 45 78 74 72 61  >prereq = mExtra
2c140 20 7c 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71   | pTerm->prereq
2c150 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 72  Right;.        r
2c160 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73  c = whereLoopIns
2c170 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e  ert(pBuilder, pN
2c180 65 77 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ew);.      }.   
2c190 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a   }.  }.#endif /*
2c1a0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
2c1b0 4f 4d 41 54 49 43 5f 49 4e 44 45 58 20 2a 2f 0a  OMATIC_INDEX */.
2c1c0 0a 20 20 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72 20  .  /* Loop over 
2c1d0 61 6c 6c 20 69 6e 64 69 63 65 73 0a 20 20 2a 2f  all indices.  */
2c1e0 0a 20 20 66 6f 72 28 3b 20 72 63 3d 3d 53 51 4c  .  for(; rc==SQL
2c1f0 49 54 45 5f 4f 4b 20 26 26 20 70 50 72 6f 62 65  ITE_OK && pProbe
2c200 3b 20 70 50 72 6f 62 65 3d 70 50 72 6f 62 65 2d  ; pProbe=pProbe-
2c210 3e 70 4e 65 78 74 2c 20 69 53 6f 72 74 49 64 78  >pNext, iSortIdx
2c220 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 50 72  ++){.    if( pPr
2c230 6f 62 65 2d 3e 70 50 61 72 74 49 64 78 57 68 65  obe->pPartIdxWhe
2c240 72 65 21 3d 30 0a 20 20 20 20 20 26 26 20 21 77  re!=0.     && !w
2c250 68 65 72 65 55 73 61 62 6c 65 50 61 72 74 69 61  hereUsablePartia
2c260 6c 49 6e 64 65 78 28 70 53 72 63 2d 3e 69 43 75  lIndex(pSrc->iCu
2c270 72 73 6f 72 2c 20 70 57 43 2c 20 70 50 72 6f 62  rsor, pWC, pProb
2c280 65 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72 65  e->pPartIdxWhere
2c290 29 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63  ) ){.      testc
2c2a0 61 73 65 28 20 70 4e 65 77 2d 3e 69 54 61 62 21  ase( pNew->iTab!
2c2b0 3d 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29  =pSrc->iCursor )
2c2c0 3b 20 20 2f 2a 20 53 65 65 20 74 69 63 6b 65 74  ;  /* See ticket
2c2d0 20 5b 39 38 64 39 37 33 62 38 66 35 5d 20 2a 2f   [98d973b8f5] */
2c2e0 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b  .      continue;
2c2f0 20 20 2f 2a 20 50 61 72 74 69 61 6c 20 69 6e 64    /* Partial ind
2c300 65 78 20 69 6e 61 70 70 72 6f 70 72 69 61 74 65  ex inappropriate
2c310 20 66 6f 72 20 74 68 69 73 20 71 75 65 72 79 20   for this query 
2c320 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 72 53 69  */.    }.    rSi
2c330 7a 65 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69 52  ze = pProbe->aiR
2c340 6f 77 4c 6f 67 45 73 74 5b 30 5d 3b 0a 20 20 20  owLogEst[0];.   
2c350 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
2c360 45 71 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77  Eq = 0;.    pNew
2c370 2d 3e 6e 53 6b 69 70 20 3d 20 30 3b 0a 20 20 20  ->nSkip = 0;.   
2c380 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20   pNew->nLTerm = 
2c390 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 53 6f  0;.    pNew->iSo
2c3a0 72 74 49 64 78 20 3d 20 30 3b 0a 20 20 20 20 70  rtIdx = 0;.    p
2c3b0 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b  New->rSetup = 0;
2c3c0 0a 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65  .    pNew->prere
2c3d0 71 20 3d 20 6d 45 78 74 72 61 3b 0a 20 20 20 20  q = mExtra;.    
2c3e0 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 72 53 69  pNew->nOut = rSi
2c3f0 7a 65 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e  ze;.    pNew->u.
2c400 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 70  btree.pIndex = p
2c410 50 72 6f 62 65 3b 0a 20 20 20 20 62 20 3d 20 69  Probe;.    b = i
2c420 6e 64 65 78 4d 69 67 68 74 48 65 6c 70 57 69 74  ndexMightHelpWit
2c430 68 4f 72 64 65 72 42 79 28 70 42 75 69 6c 64 65  hOrderBy(pBuilde
2c440 72 2c 20 70 50 72 6f 62 65 2c 20 70 53 72 63 2d  r, pProbe, pSrc-
2c450 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 2f  >iCursor);.    /
2c460 2a 20 54 68 65 20 4f 4e 45 50 41 53 53 5f 44 45  * The ONEPASS_DE
2c470 53 49 52 45 44 20 66 6c 61 67 73 20 6e 65 76 65  SIRED flags neve
2c480 72 20 6f 63 63 75 72 73 20 74 6f 67 65 74 68 65  r occurs togethe
2c490 72 20 77 69 74 68 20 4f 52 44 45 52 20 42 59 20  r with ORDER BY 
2c4a0 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  */.    assert( (
2c4b0 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
2c4c0 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41  gs & WHERE_ONEPA
2c4d0 53 53 5f 44 45 53 49 52 45 44 29 3d 3d 30 20 7c  SS_DESIRED)==0 |
2c4e0 7c 20 62 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66  | b==0 );.    if
2c4f0 28 20 70 50 72 6f 62 65 2d 3e 74 6e 75 6d 3c 3d  ( pProbe->tnum<=
2c500 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e  0 ){.      /* In
2c510 74 65 67 65 72 20 70 72 69 6d 61 72 79 20 6b 65  teger primary ke
2c520 79 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20  y index */.     
2c530 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d   pNew->wsFlags =
2c540 20 57 48 45 52 45 5f 49 50 4b 3b 0a 0a 20 20 20   WHERE_IPK;..   
2c550 20 20 20 2f 2a 20 46 75 6c 6c 20 74 61 62 6c 65     /* Full table
2c560 20 73 63 61 6e 20 2a 2f 0a 20 20 20 20 20 20 70   scan */.      p
2c570 4e 65 77 2d 3e 69 53 6f 72 74 49 64 78 20 3d 20  New->iSortIdx = 
2c580 62 20 3f 20 69 53 6f 72 74 49 64 78 20 3a 20 30  b ? iSortIdx : 0
2c590 3b 0a 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e  ;.      /* TUNIN
2c5a0 47 3a 20 43 6f 73 74 20 6f 66 20 66 75 6c 6c 20  G: Cost of full 
2c5b0 74 61 62 6c 65 20 73 63 61 6e 20 69 73 20 28 4e  table scan is (N
2c5c0 2a 33 2e 30 29 2e 20 2a 2f 0a 20 20 20 20 20 20  *3.0). */.      
2c5d0 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 72 53 69  pNew->rRun = rSi
2c5e0 7a 65 20 2b 20 31 36 3b 0a 20 20 20 20 20 20 41  ze + 16;.      A
2c5f0 70 70 6c 79 43 6f 73 74 4d 75 6c 74 69 70 6c 69  pplyCostMultipli
2c600 65 72 28 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 70  er(pNew->rRun, p
2c610 54 61 62 2d 3e 63 6f 73 74 4d 75 6c 74 29 3b 0a  Tab->costMult);.
2c620 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 4f        whereLoopO
2c630 75 74 70 75 74 41 64 6a 75 73 74 28 70 57 43 2c  utputAdjust(pWC,
2c640 20 70 4e 65 77 2c 20 72 53 69 7a 65 29 3b 0a 20   pNew, rSize);. 
2c650 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c       rc = whereL
2c660 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64  oopInsert(pBuild
2c670 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20  er, pNew);.     
2c680 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 72 53   pNew->nOut = rS
2c690 69 7a 65 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ize;.      if( r
2c6a0 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  c ) break;.    }
2c6b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 42 69 74 6d  else{.      Bitm
2c6c0 61 73 6b 20 6d 3b 0a 20 20 20 20 20 20 69 66 28  ask m;.      if(
2c6d0 20 70 50 72 6f 62 65 2d 3e 69 73 43 6f 76 65 72   pProbe->isCover
2c6e0 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ing ){.        p
2c6f0 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57  New->wsFlags = W
2c700 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20 7c 20  HERE_IDX_ONLY | 
2c710 57 48 45 52 45 5f 49 4e 44 45 58 45 44 3b 0a 20  WHERE_INDEXED;. 
2c720 20 20 20 20 20 20 20 6d 20 3d 20 30 3b 0a 20 20         m = 0;.  
2c730 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2c740 20 20 20 6d 20 3d 20 70 53 72 63 2d 3e 63 6f 6c     m = pSrc->col
2c750 55 73 65 64 20 26 20 7e 63 6f 6c 75 6d 6e 73 49  Used & ~columnsI
2c760 6e 49 6e 64 65 78 28 70 50 72 6f 62 65 29 3b 0a  nIndex(pProbe);.
2c770 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73          pNew->ws
2c780 46 6c 61 67 73 20 3d 20 28 6d 3d 3d 30 29 20 3f  Flags = (m==0) ?
2c790 20 28 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59   (WHERE_IDX_ONLY
2c7a0 7c 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 20  |WHERE_INDEXED) 
2c7b0 3a 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 3b  : WHERE_INDEXED;
2c7c0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
2c7d0 2f 2a 20 46 75 6c 6c 20 73 63 61 6e 20 76 69 61  /* Full scan via
2c7e0 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20   index */.      
2c7f0 69 66 28 20 62 0a 20 20 20 20 20 20 20 7c 7c 20  if( b.       || 
2c800 21 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 0a  !HasRowid(pTab).
2c810 20 20 20 20 20 20 20 7c 7c 20 28 20 6d 3d 3d 30         || ( m==0
2c820 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 50 72  .         && pPr
2c830 6f 62 65 2d 3e 62 55 6e 6f 72 64 65 72 65 64 3d  obe->bUnordered=
2c840 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  =0.         && (
2c850 70 50 72 6f 62 65 2d 3e 73 7a 49 64 78 52 6f 77  pProbe->szIdxRow
2c860 3c 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 29  <pTab->szTabRow)
2c870 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 70 57  .         && (pW
2c880 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
2c890 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53   & WHERE_ONEPASS
2c8a0 5f 44 45 53 49 52 45 44 29 3d 3d 30 0a 20 20 20  _DESIRED)==0.   
2c8b0 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
2c8c0 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 55 73  GlobalConfig.bUs
2c8d0 65 43 69 73 0a 20 20 20 20 20 20 20 20 20 26 26  eCis.         &&
2c8e0 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61   OptimizationEna
2c8f0 62 6c 65 64 28 70 57 49 6e 66 6f 2d 3e 70 50 61  bled(pWInfo->pPa
2c900 72 73 65 2d 3e 64 62 2c 20 53 51 4c 49 54 45 5f  rse->db, SQLITE_
2c910 43 6f 76 65 72 49 64 78 53 63 61 6e 29 0a 20 20  CoverIdxScan).  
2c920 20 20 20 20 20 20 20 20 29 0a 20 20 20 20 20 20          ).      
2c930 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  ){.        pNew-
2c940 3e 69 53 6f 72 74 49 64 78 20 3d 20 62 20 3f 20  >iSortIdx = b ? 
2c950 69 53 6f 72 74 49 64 78 20 3a 20 30 3b 0a 0a 20  iSortIdx : 0;.. 
2c960 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f         /* The co
2c970 73 74 20 6f 66 20 76 69 73 69 74 69 6e 67 20 74  st of visiting t
2c980 68 65 20 69 6e 64 65 78 20 72 6f 77 73 20 69 73  he index rows is
2c990 20 4e 2a 4b 2c 20 77 68 65 72 65 20 4b 20 69 73   N*K, where K is
2c9a0 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 65 74 77  .        ** betw
2c9b0 65 65 6e 20 31 2e 31 20 61 6e 64 20 33 2e 30 2c  een 1.1 and 3.0,
2c9c0 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68   depending on th
2c9d0 65 20 72 65 6c 61 74 69 76 65 20 73 69 7a 65 73  e relative sizes
2c9e0 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20 20   of the.        
2c9f0 2a 2a 20 69 6e 64 65 78 20 61 6e 64 20 74 61 62  ** index and tab
2ca00 6c 65 20 72 6f 77 73 2e 20 49 66 20 74 68 69 73  le rows. If this
2ca10 20 69 73 20 61 20 6e 6f 6e 2d 63 6f 76 65 72 69   is a non-coveri
2ca20 6e 67 20 69 6e 64 65 78 20 73 63 61 6e 2c 0a 20  ng index scan,. 
2ca30 20 20 20 20 20 20 20 2a 2a 20 61 6c 73 6f 20 61         ** also a
2ca40 64 64 20 74 68 65 20 63 6f 73 74 20 6f 66 20 76  dd the cost of v
2ca50 69 73 69 74 69 6e 67 20 74 61 62 6c 65 20 72 6f  isiting table ro
2ca60 77 73 20 28 4e 2a 33 2e 30 29 2e 20 20 2a 2f 0a  ws (N*3.0).  */.
2ca70 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52          pNew->rR
2ca80 75 6e 20 3d 20 72 53 69 7a 65 20 2b 20 31 20 2b  un = rSize + 1 +
2ca90 20 28 31 35 2a 70 50 72 6f 62 65 2d 3e 73 7a 49   (15*pProbe->szI
2caa0 64 78 52 6f 77 29 2f 70 54 61 62 2d 3e 73 7a 54  dxRow)/pTab->szT
2cab0 61 62 52 6f 77 3b 0a 20 20 20 20 20 20 20 20 69  abRow;.        i
2cac0 66 28 20 6d 21 3d 30 20 29 7b 0a 20 20 20 20 20  f( m!=0 ){.     
2cad0 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20       pNew->rRun 
2cae0 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41  = sqlite3LogEstA
2caf0 64 64 28 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 72  dd(pNew->rRun, r
2cb00 53 69 7a 65 2b 31 36 29 3b 0a 20 20 20 20 20 20  Size+16);.      
2cb10 20 20 7d 0a 20 20 20 20 20 20 20 20 41 70 70 6c    }.        Appl
2cb20 79 43 6f 73 74 4d 75 6c 74 69 70 6c 69 65 72 28  yCostMultiplier(
2cb30 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 70 54 61 62  pNew->rRun, pTab
2cb40 2d 3e 63 6f 73 74 4d 75 6c 74 29 3b 0a 20 20 20  ->costMult);.   
2cb50 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 4f 75       whereLoopOu
2cb60 74 70 75 74 41 64 6a 75 73 74 28 70 57 43 2c 20  tputAdjust(pWC, 
2cb70 70 4e 65 77 2c 20 72 53 69 7a 65 29 3b 0a 20 20  pNew, rSize);.  
2cb80 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65        rc = where
2cb90 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c  LoopInsert(pBuil
2cba0 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20  der, pNew);.    
2cbb0 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d      pNew->nOut =
2cbc0 20 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20   rSize;.        
2cbd0 69 66 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a  if( rc ) break;.
2cbe0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
2cbf0 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f     rc = whereLoo
2cc00 70 41 64 64 42 74 72 65 65 49 6e 64 65 78 28 70  pAddBtreeIndex(p
2cc10 42 75 69 6c 64 65 72 2c 20 70 53 72 63 2c 20 70  Builder, pSrc, p
2cc20 50 72 6f 62 65 2c 20 30 29 3b 0a 23 69 66 64 65  Probe, 0);.#ifde
2cc30 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
2cc40 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20  STAT3_OR_STAT4. 
2cc50 20 20 20 73 71 6c 69 74 65 33 53 74 61 74 34 50     sqlite3Stat4P
2cc60 72 6f 62 65 46 72 65 65 28 70 42 75 69 6c 64 65  robeFree(pBuilde
2cc70 72 2d 3e 70 52 65 63 29 3b 0a 20 20 20 20 70 42  r->pRec);.    pB
2cc80 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69  uilder->nRecVali
2cc90 64 20 3d 20 30 3b 0a 20 20 20 20 70 42 75 69 6c  d = 0;.    pBuil
2cca0 64 65 72 2d 3e 70 52 65 63 20 3d 20 30 3b 0a 23  der->pRec = 0;.#
2ccb0 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49 66  endif..    /* If
2ccc0 20 74 68 65 72 65 20 77 61 73 20 61 6e 20 49 4e   there was an IN
2ccd0 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 2c  DEXED BY clause,
2cce0 20 74 68 65 6e 20 6f 6e 6c 79 20 74 68 61 74 20   then only that 
2ccf0 6f 6e 65 20 69 6e 64 65 78 20 69 73 0a 20 20 20  one index is.   
2cd00 20 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 2e 20   ** considered. 
2cd10 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 72 63 2d  */.    if( pSrc-
2cd20 3e 70 49 6e 64 65 78 20 29 20 62 72 65 61 6b 3b  >pIndex ) break;
2cd30 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
2cd40 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
2cd50 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
2cd60 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 41 64 64 20  TABLE./*.** Add 
2cd70 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62  all WhereLoop ob
2cd80 6a 65 63 74 73 20 66 6f 72 20 61 20 74 61 62 6c  jects for a tabl
2cd90 65 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 69 64  e of the join id
2cda0 65 6e 74 69 66 69 65 64 20 62 79 0a 2a 2a 20 70  entified by.** p
2cdb0 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 69  Builder->pNew->i
2cdc0 54 61 62 2e 20 20 54 68 61 74 20 74 61 62 6c 65  Tab.  That table
2cdd0 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
2cde0 6f 20 62 65 20 61 20 76 69 72 74 75 61 6c 20 74  o be a virtual t
2cdf0 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  able..*/.static 
2ce00 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  int whereLoopAdd
2ce10 56 69 72 74 75 61 6c 28 0a 20 20 57 68 65 72 65  Virtual(.  Where
2ce20 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75  LoopBuilder *pBu
2ce30 69 6c 64 65 72 2c 20 20 2f 2a 20 57 48 45 52 45  ilder,  /* WHERE
2ce40 20 63 6c 61 75 73 65 20 69 6e 66 6f 72 6d 61 74   clause informat
2ce50 69 6f 6e 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  ion */.  Bitmask
2ce60 20 6d 45 78 74 72 61 0a 29 7b 0a 20 20 57 68 65   mExtra.){.  Whe
2ce70 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20  reInfo *pWInfo; 
2ce80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 48 45            /* WHE
2ce90 52 45 20 61 6e 61 6c 79 73 69 73 20 63 6f 6e 74  RE analysis cont
2cea0 65 78 74 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a  ext */.  Parse *
2ceb0 70 50 61 72 73 65 3b 20 20 20 20 20 20 20 20 20  pParse;         
2cec0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
2ced0 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
2cee0 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
2cef0 57 43 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  WC;            /
2cf00 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
2cf10 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  se */.  struct S
2cf20 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72  rcList_item *pSr
2cf30 63 3b 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d  c;   /* The FROM
2cf40 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74 6f 20   clause term to 
2cf50 73 65 61 72 63 68 20 2a 2f 0a 20 20 54 61 62 6c  search */.  Tabl
2cf60 65 20 2a 70 54 61 62 3b 0a 20 20 73 71 6c 69 74  e *pTab;.  sqlit
2cf70 65 33 20 2a 64 62 3b 0a 20 20 73 71 6c 69 74 65  e3 *db;.  sqlite
2cf80 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49  3_index_info *pI
2cf90 64 78 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74  dxInfo;.  struct
2cfa0 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63   sqlite3_index_c
2cfb0 6f 6e 73 74 72 61 69 6e 74 20 2a 70 49 64 78 43  onstraint *pIdxC
2cfc0 6f 6e 73 3b 0a 20 20 73 74 72 75 63 74 20 73 71  ons;.  struct sq
2cfd0 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
2cfe0 74 72 61 69 6e 74 5f 75 73 61 67 65 20 2a 70 55  traint_usage *pU
2cff0 73 61 67 65 3b 0a 20 20 57 68 65 72 65 54 65 72  sage;.  WhereTer
2d000 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 69 6e 74 20  m *pTerm;.  int 
2d010 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 69 54 65 72  i, j;.  int iTer
2d020 6d 2c 20 6d 78 54 65 72 6d 3b 0a 20 20 69 6e 74  m, mxTerm;.  int
2d030 20 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20   nConstraint;.  
2d040 69 6e 74 20 73 65 65 6e 49 6e 20 3d 20 30 3b 20  int seenIn = 0; 
2d050 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2d060 54 72 75 65 20 69 66 20 61 6e 20 49 4e 20 6f 70  True if an IN op
2d070 65 72 61 74 6f 72 20 69 73 20 73 65 65 6e 20 2a  erator is seen *
2d080 2f 0a 20 20 69 6e 74 20 73 65 65 6e 56 61 72 20  /.  int seenVar 
2d090 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
2d0a0 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 6e 6f   /* True if a no
2d0b0 6e 2d 63 6f 6e 73 74 61 6e 74 20 63 6f 6e 73 74  n-constant const
2d0c0 72 61 69 6e 74 20 69 73 20 73 65 65 6e 20 2a 2f  raint is seen */
2d0d0 0a 20 20 69 6e 74 20 69 50 68 61 73 65 3b 20 20  .  int iPhase;  
2d0e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d0f0 2f 2a 20 30 3a 20 63 6f 6e 73 74 20 77 2f 6f 20  /* 0: const w/o 
2d100 49 4e 2c 20 31 3a 20 63 6f 6e 73 74 2c 20 32 3a  IN, 1: const, 2:
2d110 20 6e 6f 20 49 4e 2c 20 20 32 3a 20 49 4e 20 2a   no IN,  2: IN *
2d120 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  /.  WhereLoop *p
2d130 4e 65 77 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  New;.  int rc = 
2d140 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 70 57  SQLITE_OK;..  pW
2d150 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d  Info = pBuilder-
2d160 3e 70 57 49 6e 66 6f 3b 0a 20 20 70 50 61 72 73  >pWInfo;.  pPars
2d170 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72  e = pWInfo->pPar
2d180 73 65 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73  se;.  db = pPars
2d190 65 2d 3e 64 62 3b 0a 20 20 70 57 43 20 3d 20 70  e->db;.  pWC = p
2d1a0 42 75 69 6c 64 65 72 2d 3e 70 57 43 3b 0a 20 20  Builder->pWC;.  
2d1b0 70 4e 65 77 20 3d 20 70 42 75 69 6c 64 65 72 2d  pNew = pBuilder-
2d1c0 3e 70 4e 65 77 3b 0a 20 20 70 53 72 63 20 3d 20  >pNew;.  pSrc = 
2d1d0 26 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73  &pWInfo->pTabLis
2d1e0 74 2d 3e 61 5b 70 4e 65 77 2d 3e 69 54 61 62 5d  t->a[pNew->iTab]
2d1f0 3b 0a 20 20 70 54 61 62 20 3d 20 70 53 72 63 2d  ;.  pTab = pSrc-
2d200 3e 70 54 61 62 3b 0a 20 20 61 73 73 65 72 74 28  >pTab;.  assert(
2d210 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29   IsVirtual(pTab)
2d220 20 29 3b 0a 20 20 70 49 64 78 49 6e 66 6f 20 3d   );.  pIdxInfo =
2d230 20 61 6c 6c 6f 63 61 74 65 49 6e 64 65 78 49 6e   allocateIndexIn
2d240 66 6f 28 70 50 61 72 73 65 2c 20 70 57 43 2c 20  fo(pParse, pWC, 
2d250 70 53 72 63 2c 20 70 42 75 69 6c 64 65 72 2d 3e  pSrc, pBuilder->
2d260 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 69 66 28  pOrderBy);.  if(
2d270 20 70 49 64 78 49 6e 66 6f 3d 3d 30 20 29 20 72   pIdxInfo==0 ) r
2d280 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
2d290 45 4d 3b 0a 20 20 70 4e 65 77 2d 3e 70 72 65 72  EM;.  pNew->prer
2d2a0 65 71 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  eq = 0;.  pNew->
2d2b0 72 53 65 74 75 70 20 3d 20 30 3b 0a 20 20 70 4e  rSetup = 0;.  pN
2d2c0 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48  ew->wsFlags = WH
2d2d0 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  ERE_VIRTUALTABLE
2d2e0 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d  ;.  pNew->nLTerm
2d2f0 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e   = 0;.  pNew->u.
2d300 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3d 20  vtab.needFree = 
2d310 30 3b 0a 20 20 70 55 73 61 67 65 20 3d 20 70 49  0;.  pUsage = pI
2d320 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61  dxInfo->aConstra
2d330 69 6e 74 55 73 61 67 65 3b 0a 20 20 6e 43 6f 6e  intUsage;.  nCon
2d340 73 74 72 61 69 6e 74 20 3d 20 70 49 64 78 49 6e  straint = pIdxIn
2d350 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b  fo->nConstraint;
2d360 0a 20 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70  .  if( whereLoop
2d370 52 65 73 69 7a 65 28 64 62 2c 20 70 4e 65 77 2c  Resize(db, pNew,
2d380 20 6e 43 6f 6e 73 74 72 61 69 6e 74 29 20 29 7b   nConstraint) ){
2d390 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
2d3a0 65 65 28 64 62 2c 20 70 49 64 78 49 6e 66 6f 29  ee(db, pIdxInfo)
2d3b0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
2d3c0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a  ITE_NOMEM;.  }..
2d3d0 20 20 66 6f 72 28 69 50 68 61 73 65 3d 30 3b 20    for(iPhase=0; 
2d3e0 69 50 68 61 73 65 3c 3d 33 3b 20 69 50 68 61 73  iPhase<=3; iPhas
2d3f0 65 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 21 73  e++){.    if( !s
2d400 65 65 6e 49 6e 20 26 26 20 28 69 50 68 61 73 65  eenIn && (iPhase
2d410 26 31 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  &1)!=0 ){.      
2d420 69 50 68 61 73 65 2b 2b 3b 0a 20 20 20 20 20 20  iPhase++;.      
2d430 69 66 28 20 69 50 68 61 73 65 3e 33 20 29 20 62  if( iPhase>3 ) b
2d440 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
2d450 69 66 28 20 21 73 65 65 6e 56 61 72 20 26 26 20  if( !seenVar && 
2d460 69 50 68 61 73 65 3e 31 20 29 20 62 72 65 61 6b  iPhase>1 ) break
2d470 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 20 3d  ;.    pIdxCons =
2d480 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74 65   *(struct sqlite
2d490 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69  3_index_constrai
2d4a0 6e 74 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e  nt**)&pIdxInfo->
2d4b0 61 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 20  aConstraint;.   
2d4c0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78   for(i=0; i<pIdx
2d4d0 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e  Info->nConstrain
2d4e0 74 3b 20 69 2b 2b 2c 20 70 49 64 78 43 6f 6e 73  t; i++, pIdxCons
2d4f0 2b 2b 29 7b 0a 20 20 20 20 20 20 6a 20 3d 20 70  ++){.      j = p
2d500 49 64 78 43 6f 6e 73 2d 3e 69 54 65 72 6d 4f 66  IdxCons->iTermOf
2d510 66 73 65 74 3b 0a 20 20 20 20 20 20 70 54 65 72  fset;.      pTer
2d520 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 6a 5d 3b 0a  m = &pWC->a[j];.
2d530 20 20 20 20 20 20 73 77 69 74 63 68 28 20 69 50        switch( iP
2d540 68 61 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20  hase ){.        
2d550 63 61 73 65 20 30 3a 20 20 20 20 2f 2a 20 43 6f  case 0:    /* Co
2d560 6e 73 74 61 6e 74 73 20 77 69 74 68 6f 75 74 20  nstants without 
2d570 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  IN operator */. 
2d580 20 20 20 20 20 20 20 20 20 70 49 64 78 43 6f 6e           pIdxCon
2d590 73 2d 3e 75 73 61 62 6c 65 20 3d 20 30 3b 0a 20  s->usable = 0;. 
2d5a0 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70 54           if( (pT
2d5b0 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
2d5c0 20 57 4f 5f 49 4e 29 21 3d 30 20 29 7b 0a 20 20   WO_IN)!=0 ){.  
2d5d0 20 20 20 20 20 20 20 20 20 20 73 65 65 6e 49 6e            seenIn
2d5e0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
2d5f0 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  }.          if( 
2d600 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
2d610 68 74 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ht!=0 ){.       
2d620 20 20 20 20 20 73 65 65 6e 56 61 72 20 3d 20 31       seenVar = 1
2d630 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
2d640 65 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f  e if( (pTerm->eO
2d650 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 29  perator & WO_IN)
2d660 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
2d670 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61     pIdxCons->usa
2d680 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ble = 1;.       
2d690 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 62     }.          b
2d6a0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61  reak;.        ca
2d6b0 73 65 20 31 3a 20 20 20 20 2f 2a 20 43 6f 6e 73  se 1:    /* Cons
2d6c0 74 61 6e 74 73 20 77 69 74 68 20 49 4e 20 6f 70  tants with IN op
2d6d0 65 72 61 74 6f 72 73 20 2a 2f 0a 20 20 20 20 20  erators */.     
2d6e0 20 20 20 20 20 61 73 73 65 72 74 28 20 73 65 65       assert( see
2d6f0 6e 49 6e 20 29 3b 0a 20 20 20 20 20 20 20 20 20  nIn );.         
2d700 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c   pIdxCons->usabl
2d710 65 20 3d 20 28 70 54 65 72 6d 2d 3e 70 72 65 72  e = (pTerm->prer
2d720 65 71 52 69 67 68 74 3d 3d 30 29 3b 0a 20 20 20  eqRight==0);.   
2d730 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
2d740 20 20 20 20 20 20 63 61 73 65 20 32 3a 20 20 20        case 2:   
2d750 20 2f 2a 20 56 61 72 69 61 62 6c 65 73 20 77 69   /* Variables wi
2d760 74 68 6f 75 74 20 49 4e 20 2a 2f 0a 20 20 20 20  thout IN */.    
2d770 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 65        assert( se
2d780 65 6e 56 61 72 20 29 3b 0a 20 20 20 20 20 20 20  enVar );.       
2d790 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61     pIdxCons->usa
2d7a0 62 6c 65 20 3d 20 28 70 54 65 72 6d 2d 3e 65 4f  ble = (pTerm->eO
2d7b0 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 29  perator & WO_IN)
2d7c0 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20 20 20 62  ==0;.          b
2d7d0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 64 65  reak;.        de
2d7e0 66 61 75 6c 74 3a 20 20 20 2f 2a 20 56 61 72 69  fault:   /* Vari
2d7f0 61 62 6c 65 73 20 77 69 74 68 20 49 4e 20 2a 2f  ables with IN */
2d800 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
2d810 74 28 20 73 65 65 6e 56 61 72 20 26 26 20 73 65  t( seenVar && se
2d820 65 6e 49 6e 20 29 3b 0a 20 20 20 20 20 20 20 20  enIn );.        
2d830 20 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62    pIdxCons->usab
2d840 6c 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  le = 1;.        
2d850 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
2d860 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65  .    }.    memse
2d870 74 28 70 55 73 61 67 65 2c 20 30 2c 20 73 69 7a  t(pUsage, 0, siz
2d880 65 6f 66 28 70 55 73 61 67 65 5b 30 5d 29 2a 70  eof(pUsage[0])*p
2d890 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72  IdxInfo->nConstr
2d8a0 61 69 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 70  aint);.    if( p
2d8b0 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46  IdxInfo->needToF
2d8c0 72 65 65 49 64 78 53 74 72 20 29 20 73 71 6c 69  reeIdxStr ) sqli
2d8d0 74 65 33 5f 66 72 65 65 28 70 49 64 78 49 6e 66  te3_free(pIdxInf
2d8e0 6f 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20 20 20  o->idxStr);.    
2d8f0 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72  pIdxInfo->idxStr
2d900 20 3d 20 30 3b 0a 20 20 20 20 70 49 64 78 49 6e   = 0;.    pIdxIn
2d910 66 6f 2d 3e 69 64 78 4e 75 6d 20 3d 20 30 3b 0a  fo->idxNum = 0;.
2d920 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65      pIdxInfo->ne
2d930 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 20 3d  edToFreeIdxStr =
2d940 20 30 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f   0;.    pIdxInfo
2d950 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65  ->orderByConsume
2d960 64 20 3d 20 30 3b 0a 20 20 20 20 70 49 64 78 49  d = 0;.    pIdxI
2d970 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f  nfo->estimatedCo
2d980 73 74 20 3d 20 53 51 4c 49 54 45 5f 42 49 47 5f  st = SQLITE_BIG_
2d990 44 42 4c 20 2f 20 28 64 6f 75 62 6c 65 29 32 3b  DBL / (double)2;
2d9a0 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65  .    pIdxInfo->e
2d9b0 73 74 69 6d 61 74 65 64 52 6f 77 73 20 3d 20 32  stimatedRows = 2
2d9c0 35 3b 0a 20 20 20 20 72 63 20 3d 20 76 74 61 62  5;.    rc = vtab
2d9d0 42 65 73 74 49 6e 64 65 78 28 70 50 61 72 73 65  BestIndex(pParse
2d9e0 2c 20 70 54 61 62 2c 20 70 49 64 78 49 6e 66 6f  , pTab, pIdxInfo
2d9f0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
2da00 67 6f 74 6f 20 77 68 65 72 65 4c 6f 6f 70 41 64  goto whereLoopAd
2da10 64 56 74 61 62 5f 65 78 69 74 3b 0a 20 20 20 20  dVtab_exit;.    
2da20 70 49 64 78 43 6f 6e 73 20 3d 20 2a 28 73 74 72  pIdxCons = *(str
2da30 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
2da40 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 2a 29 26  x_constraint**)&
2da50 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74  pIdxInfo->aConst
2da60 72 61 69 6e 74 3b 0a 20 20 20 20 70 4e 65 77 2d  raint;.    pNew-
2da70 3e 70 72 65 72 65 71 20 3d 20 6d 45 78 74 72 61  >prereq = mExtra
2da80 3b 0a 20 20 20 20 6d 78 54 65 72 6d 20 3d 20 2d  ;.    mxTerm = -
2da90 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  1;.    assert( p
2daa0 4e 65 77 2d 3e 6e 4c 53 6c 6f 74 3e 3d 6e 43 6f  New->nLSlot>=nCo
2dab0 6e 73 74 72 61 69 6e 74 20 29 3b 0a 20 20 20 20  nstraint );.    
2dac0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6e 73  for(i=0; i<nCons
2dad0 74 72 61 69 6e 74 3b 20 69 2b 2b 29 20 70 4e 65  traint; i++) pNe
2dae0 77 2d 3e 61 4c 54 65 72 6d 5b 69 5d 20 3d 20 30  w->aLTerm[i] = 0
2daf0 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74  ;.    pNew->u.vt
2db00 61 62 2e 6f 6d 69 74 4d 61 73 6b 20 3d 20 30 3b  ab.omitMask = 0;
2db10 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
2db20 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b  nConstraint; i++
2db30 2c 20 70 49 64 78 43 6f 6e 73 2b 2b 29 7b 0a 20  , pIdxCons++){. 
2db40 20 20 20 20 20 69 66 28 20 28 69 54 65 72 6d 20       if( (iTerm 
2db50 3d 20 70 55 73 61 67 65 5b 69 5d 2e 61 72 67 76  = pUsage[i].argv
2db60 49 6e 64 65 78 20 2d 20 31 29 3e 3d 30 20 29 7b  Index - 1)>=0 ){
2db70 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 70 49 64  .        j = pId
2db80 78 43 6f 6e 73 2d 3e 69 54 65 72 6d 4f 66 66 73  xCons->iTermOffs
2db90 65 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  et;.        if( 
2dba0 69 54 65 72 6d 3e 3d 6e 43 6f 6e 73 74 72 61 69  iTerm>=nConstrai
2dbb0 6e 74 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 6a  nt.         || j
2dbc0 3c 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 6a  <0.         || j
2dbd0 3e 3d 70 57 43 2d 3e 6e 54 65 72 6d 0a 20 20 20  >=pWC->nTerm.   
2dbe0 20 20 20 20 20 20 7c 7c 20 70 4e 65 77 2d 3e 61        || pNew->a
2dbf0 4c 54 65 72 6d 5b 69 54 65 72 6d 5d 21 3d 30 0a  LTerm[iTerm]!=0.
2dc00 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
2dc10 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
2dc20 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20  _ERROR;.        
2dc30 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
2dc40 67 28 70 50 61 72 73 65 2c 20 22 25 73 2e 78 42  g(pParse, "%s.xB
2dc50 65 73 74 49 6e 64 65 78 28 29 20 6d 61 6c 66 75  estIndex() malfu
2dc60 6e 63 74 69 6f 6e 22 2c 20 70 54 61 62 2d 3e 7a  nction", pTab->z
2dc70 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Name);.         
2dc80 20 67 6f 74 6f 20 77 68 65 72 65 4c 6f 6f 70 41   goto whereLoopA
2dc90 64 64 56 74 61 62 5f 65 78 69 74 3b 0a 20 20 20  ddVtab_exit;.   
2dca0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 74       }.        t
2dcb0 65 73 74 63 61 73 65 28 20 69 54 65 72 6d 3d 3d  estcase( iTerm==
2dcc0 6e 43 6f 6e 73 74 72 61 69 6e 74 2d 31 20 29 3b  nConstraint-1 );
2dcd0 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
2dce0 65 28 20 6a 3d 3d 30 20 29 3b 0a 20 20 20 20 20  e( j==0 );.     
2dcf0 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 3d 3d     testcase( j==
2dd00 70 57 43 2d 3e 6e 54 65 72 6d 2d 31 20 29 3b 0a  pWC->nTerm-1 );.
2dd10 20 20 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20          pTerm = 
2dd20 26 70 57 43 2d 3e 61 5b 6a 5d 3b 0a 20 20 20 20  &pWC->a[j];.    
2dd30 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71      pNew->prereq
2dd40 20 7c 3d 20 70 54 65 72 6d 2d 3e 70 72 65 72 65   |= pTerm->prere
2dd50 71 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20  qRight;.        
2dd60 61 73 73 65 72 74 28 20 69 54 65 72 6d 3c 70 4e  assert( iTerm<pN
2dd70 65 77 2d 3e 6e 4c 53 6c 6f 74 20 29 3b 0a 20 20  ew->nLSlot );.  
2dd80 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65        pNew->aLTe
2dd90 72 6d 5b 69 54 65 72 6d 5d 20 3d 20 70 54 65 72  rm[iTerm] = pTer
2dda0 6d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  m;.        if( i
2ddb0 54 65 72 6d 3e 6d 78 54 65 72 6d 20 29 20 6d 78  Term>mxTerm ) mx
2ddc0 54 65 72 6d 20 3d 20 69 54 65 72 6d 3b 0a 20 20  Term = iTerm;.  
2ddd0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2dde0 69 54 65 72 6d 3d 3d 31 35 20 29 3b 0a 20 20 20  iTerm==15 );.   
2ddf0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
2de00 54 65 72 6d 3d 3d 31 36 20 29 3b 0a 20 20 20 20  Term==16 );.    
2de10 20 20 20 20 69 66 28 20 69 54 65 72 6d 3c 31 36      if( iTerm<16
2de20 20 26 26 20 70 55 73 61 67 65 5b 69 5d 2e 6f 6d   && pUsage[i].om
2de30 69 74 20 29 20 70 4e 65 77 2d 3e 75 2e 76 74 61  it ) pNew->u.vta
2de40 62 2e 6f 6d 69 74 4d 61 73 6b 20 7c 3d 20 31 3c  b.omitMask |= 1<
2de50 3c 69 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20  <iTerm;.        
2de60 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65  if( (pTerm->eOpe
2de70 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 29 21 3d  rator & WO_IN)!=
2de80 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  0 ){.          i
2de90 66 28 20 70 55 73 61 67 65 5b 69 5d 2e 6f 6d 69  f( pUsage[i].omi
2dea0 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t==0 ){.        
2deb0 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 74      /* Do not at
2dec0 74 65 6d 70 74 20 74 6f 20 75 73 65 20 61 6e 20  tempt to use an 
2ded0 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 66  IN constraint if
2dee0 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62   the virtual tab
2def0 6c 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  le.            *
2df00 2a 20 73 61 79 73 20 74 68 61 74 20 74 68 65 20  * says that the 
2df10 65 71 75 69 76 61 6c 65 6e 74 20 45 51 20 63 6f  equivalent EQ co
2df20 6e 73 74 72 61 69 6e 74 20 63 61 6e 6e 6f 74 20  nstraint cannot 
2df30 62 65 20 73 61 66 65 6c 79 20 6f 6d 69 74 74 65  be safely omitte
2df40 64 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  d..            *
2df50 2a 20 49 66 20 77 65 20 64 6f 20 61 74 74 65 6d  * If we do attem
2df60 70 74 20 74 6f 20 75 73 65 20 73 75 63 68 20 61  pt to use such a
2df70 20 63 6f 6e 73 74 72 61 69 6e 74 2c 20 73 6f 6d   constraint, som
2df80 65 20 72 6f 77 73 20 6d 69 67 68 74 20 62 65 0a  e rows might be.
2df90 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72              ** r
2dfa0 65 70 65 61 74 65 64 20 69 6e 20 74 68 65 20 6f  epeated in the o
2dfb0 75 74 70 75 74 2e 20 2a 2f 0a 20 20 20 20 20 20  utput. */.      
2dfc0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2dfd0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2dfe0 20 20 20 2f 2a 20 41 20 76 69 72 74 75 61 6c 20     /* A virtual 
2dff0 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 63 6f  table that is co
2e000 6e 73 74 72 61 69 6e 65 64 20 62 79 20 61 6e 20  nstrained by an 
2e010 49 4e 20 63 6c 61 75 73 65 20 6d 61 79 20 6e 6f  IN clause may no
2e020 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63  t.          ** c
2e030 6f 6e 73 75 6d 65 20 74 68 65 20 4f 52 44 45 52  onsume the ORDER
2e040 20 42 59 20 63 6c 61 75 73 65 20 62 65 63 61 75   BY clause becau
2e050 73 65 20 28 31 29 20 74 68 65 20 6f 72 64 65 72  se (1) the order
2e060 20 6f 66 20 49 4e 20 74 65 72 6d 73 0a 20 20 20   of IN terms.   
2e070 20 20 20 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74         ** is not
2e080 20 6e 65 63 65 73 73 61 72 69 6c 79 20 72 65 6c   necessarily rel
2e090 61 74 65 64 20 74 6f 20 74 68 65 20 6f 72 64 65  ated to the orde
2e0a0 72 20 6f 66 20 6f 75 74 70 75 74 20 74 65 72 6d  r of output term
2e0b0 73 20 61 6e 64 0a 20 20 20 20 20 20 20 20 20 20  s and.          
2e0c0 2a 2a 20 28 32 29 20 4d 75 6c 74 69 70 6c 65 20  ** (2) Multiple 
2e0d0 6f 75 74 70 75 74 73 20 66 72 6f 6d 20 61 20 73  outputs from a s
2e0e0 69 6e 67 6c 65 20 49 4e 20 76 61 6c 75 65 20 77  ingle IN value w
2e0f0 69 6c 6c 20 6e 6f 74 20 6d 65 72 67 65 0a 20 20  ill not merge.  
2e100 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 67 65 74          ** toget
2e110 68 65 72 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  her.  */.       
2e120 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64     pIdxInfo->ord
2e130 65 72 42 79 43 6f 6e 73 75 6d 65 64 20 3d 20 30  erByConsumed = 0
2e140 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2e150 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
2e160 28 20 69 3e 3d 6e 43 6f 6e 73 74 72 61 69 6e 74  ( i>=nConstraint
2e170 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e   ){.      pNew->
2e180 6e 4c 54 65 72 6d 20 3d 20 6d 78 54 65 72 6d 2b  nLTerm = mxTerm+
2e190 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  1;.      assert(
2e1a0 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 3c 3d 70   pNew->nLTerm<=p
2e1b0 4e 65 77 2d 3e 6e 4c 53 6c 6f 74 20 29 3b 0a 20  New->nLSlot );. 
2e1c0 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61       pNew->u.vta
2e1d0 62 2e 69 64 78 4e 75 6d 20 3d 20 70 49 64 78 49  b.idxNum = pIdxI
2e1e0 6e 66 6f 2d 3e 69 64 78 4e 75 6d 3b 0a 20 20 20  nfo->idxNum;.   
2e1f0 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e     pNew->u.vtab.
2e200 6e 65 65 64 46 72 65 65 20 3d 20 70 49 64 78 49  needFree = pIdxI
2e210 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49  nfo->needToFreeI
2e220 64 78 53 74 72 3b 0a 20 20 20 20 20 20 70 49 64  dxStr;.      pId
2e230 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65  xInfo->needToFre
2e240 65 49 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 20  eIdxStr = 0;.   
2e250 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e     pNew->u.vtab.
2e260 69 64 78 53 74 72 20 3d 20 70 49 64 78 49 6e 66  idxStr = pIdxInf
2e270 6f 2d 3e 69 64 78 53 74 72 3b 0a 20 20 20 20 20  o->idxStr;.     
2e280 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69 73   pNew->u.vtab.is
2e290 4f 72 64 65 72 65 64 20 3d 20 28 69 38 29 28 70  Ordered = (i8)(p
2e2a0 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79  IdxInfo->orderBy
2e2b0 43 6f 6e 73 75 6d 65 64 20 3f 0a 20 20 20 20 20  Consumed ?.     
2e2c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e2d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e2e0 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65   pIdxInfo->nOrde
2e2f0 72 42 79 20 3a 20 30 29 3b 0a 20 20 20 20 20 20  rBy : 0);.      
2e300 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 30  pNew->rSetup = 0
2e310 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52  ;.      pNew->rR
2e320 75 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  un = sqlite3LogE
2e330 73 74 46 72 6f 6d 44 6f 75 62 6c 65 28 70 49 64  stFromDouble(pId
2e340 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64  xInfo->estimated
2e350 43 6f 73 74 29 3b 0a 20 20 20 20 20 20 70 4e 65  Cost);.      pNe
2e360 77 2d 3e 6e 4f 75 74 20 3d 20 73 71 6c 69 74 65  w->nOut = sqlite
2e370 33 4c 6f 67 45 73 74 28 70 49 64 78 49 6e 66 6f  3LogEst(pIdxInfo
2e380 2d 3e 65 73 74 69 6d 61 74 65 64 52 6f 77 73 29  ->estimatedRows)
2e390 3b 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f  ;.      whereLoo
2e3a0 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72  pInsert(pBuilder
2e3b0 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 69  , pNew);.      i
2e3c0 66 28 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e  f( pNew->u.vtab.
2e3d0 6e 65 65 64 46 72 65 65 20 29 7b 0a 20 20 20 20  needFree ){.    
2e3e0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
2e3f0 28 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69 64  (pNew->u.vtab.id
2e400 78 53 74 72 29 3b 0a 20 20 20 20 20 20 20 20 70  xStr);.        p
2e410 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64  New->u.vtab.need
2e420 46 72 65 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Free = 0;.      
2e430 7d 0a 20 20 20 20 7d 0a 20 20 7d 20 20 0a 0a 77  }.    }.  }  ..w
2e440 68 65 72 65 4c 6f 6f 70 41 64 64 56 74 61 62 5f  hereLoopAddVtab_
2e450 65 78 69 74 3a 0a 20 20 69 66 28 20 70 49 64 78  exit:.  if( pIdx
2e460 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65  Info->needToFree
2e470 49 64 78 53 74 72 20 29 20 73 71 6c 69 74 65 33  IdxStr ) sqlite3
2e480 5f 66 72 65 65 28 70 49 64 78 49 6e 66 6f 2d 3e  _free(pIdxInfo->
2e490 69 64 78 53 74 72 29 3b 0a 20 20 73 71 6c 69 74  idxStr);.  sqlit
2e4a0 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 64  e3DbFree(db, pId
2e4b0 78 49 6e 66 6f 29 3b 0a 20 20 72 65 74 75 72 6e  xInfo);.  return
2e4c0 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a   rc;.}.#endif /*
2e4d0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
2e4e0 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 2f 2a  TUALTABLE */../*
2e4f0 0a 2a 2a 20 41 64 64 20 57 68 65 72 65 4c 6f 6f  .** Add WhereLoo
2e500 70 20 65 6e 74 72 69 65 73 20 74 6f 20 68 61 6e  p entries to han
2e510 64 6c 65 20 4f 52 20 74 65 72 6d 73 2e 20 20 54  dle OR terms.  T
2e520 68 69 73 20 77 6f 72 6b 73 20 66 6f 72 20 65 69  his works for ei
2e530 74 68 65 72 0a 2a 2a 20 62 74 72 65 65 73 20 6f  ther.** btrees o
2e540 72 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73  r virtual tables
2e550 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2e560 77 68 65 72 65 4c 6f 6f 70 41 64 64 4f 72 28 57  whereLoopAddOr(W
2e570 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20  hereLoopBuilder 
2e580 2a 70 42 75 69 6c 64 65 72 2c 20 42 69 74 6d 61  *pBuilder, Bitma
2e590 73 6b 20 6d 45 78 74 72 61 29 7b 0a 20 20 57 68  sk mExtra){.  Wh
2e5a0 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20  ereInfo *pWInfo 
2e5b0 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e  = pBuilder->pWIn
2e5c0 66 6f 3b 0a 20 20 57 68 65 72 65 43 6c 61 75 73  fo;.  WhereClaus
2e5d0 65 20 2a 70 57 43 3b 0a 20 20 57 68 65 72 65 4c  e *pWC;.  WhereL
2e5e0 6f 6f 70 20 2a 70 4e 65 77 3b 0a 20 20 57 68 65  oop *pNew;.  Whe
2e5f0 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 2a  reTerm *pTerm, *
2e600 70 57 43 45 6e 64 3b 0a 20 20 69 6e 74 20 72 63  pWCEnd;.  int rc
2e610 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
2e620 69 6e 74 20 69 43 75 72 3b 0a 20 20 57 68 65 72  int iCur;.  Wher
2e630 65 43 6c 61 75 73 65 20 74 65 6d 70 57 43 3b 0a  eClause tempWC;.
2e640 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64    WhereLoopBuild
2e650 65 72 20 73 53 75 62 42 75 69 6c 64 3b 0a 20 20  er sSubBuild;.  
2e660 57 68 65 72 65 4f 72 53 65 74 20 73 53 75 6d 2c  WhereOrSet sSum,
2e670 20 73 43 75 72 3b 0a 20 20 73 74 72 75 63 74 20   sCur;.  struct 
2e680 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
2e690 74 65 6d 3b 0a 20 20 0a 20 20 70 57 43 20 3d 20  tem;.  .  pWC = 
2e6a0 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 3b 0a 20  pBuilder->pWC;. 
2e6b0 20 70 57 43 45 6e 64 20 3d 20 70 57 43 2d 3e 61   pWCEnd = pWC->a
2e6c0 20 2b 20 70 57 43 2d 3e 6e 54 65 72 6d 3b 0a 20   + pWC->nTerm;. 
2e6d0 20 70 4e 65 77 20 3d 20 70 42 75 69 6c 64 65 72   pNew = pBuilder
2e6e0 2d 3e 70 4e 65 77 3b 0a 20 20 6d 65 6d 73 65 74  ->pNew;.  memset
2e6f0 28 26 73 53 75 6d 2c 20 30 2c 20 73 69 7a 65 6f  (&sSum, 0, sizeo
2e700 66 28 73 53 75 6d 29 29 3b 0a 20 20 70 49 74 65  f(sSum));.  pIte
2e710 6d 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62  m = pWInfo->pTab
2e720 4c 69 73 74 2d 3e 61 20 2b 20 70 4e 65 77 2d 3e  List->a + pNew->
2e730 69 54 61 62 3b 0a 20 20 69 43 75 72 20 3d 20 70  iTab;.  iCur = p
2e740 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 0a  Item->iCursor;..
2e750 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d    for(pTerm=pWC-
2e760 3e 61 3b 20 70 54 65 72 6d 3c 70 57 43 45 6e 64  >a; pTerm<pWCEnd
2e770 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
2e780 4b 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  K; pTerm++){.   
2e790 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70   if( (pTerm->eOp
2e7a0 65 72 61 74 6f 72 20 26 20 57 4f 5f 4f 52 29 21  erator & WO_OR)!
2e7b0 3d 30 0a 20 20 20 20 20 26 26 20 28 70 54 65 72  =0.     && (pTer
2e7c0 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 69 6e  m->u.pOrInfo->in
2e7d0 64 65 78 61 62 6c 65 20 26 20 70 4e 65 77 2d 3e  dexable & pNew->
2e7e0 6d 61 73 6b 53 65 6c 66 29 21 3d 30 20 0a 20 20  maskSelf)!=0 .  
2e7f0 20 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65    ){.      Where
2e800 43 6c 61 75 73 65 20 2a 20 63 6f 6e 73 74 20 70  Clause * const p
2e810 4f 72 57 43 20 3d 20 26 70 54 65 72 6d 2d 3e 75  OrWC = &pTerm->u
2e820 2e 70 4f 72 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20  .pOrInfo->wc;.  
2e830 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 20      WhereTerm * 
2e840 63 6f 6e 73 74 20 70 4f 72 57 43 45 6e 64 20 3d  const pOrWCEnd =
2e850 20 26 70 4f 72 57 43 2d 3e 61 5b 70 4f 72 57 43   &pOrWC->a[pOrWC
2e860 2d 3e 6e 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20  ->nTerm];.      
2e870 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 72 54 65  WhereTerm *pOrTe
2e880 72 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20 6f 6e  rm;.      int on
2e890 63 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 6e  ce = 1;.      in
2e8a0 74 20 69 2c 20 6a 3b 0a 20 20 20 20 0a 20 20 20  t i, j;.    .   
2e8b0 20 20 20 73 53 75 62 42 75 69 6c 64 20 3d 20 2a     sSubBuild = *
2e8c0 70 42 75 69 6c 64 65 72 3b 0a 20 20 20 20 20 20  pBuilder;.      
2e8d0 73 53 75 62 42 75 69 6c 64 2e 70 4f 72 64 65 72  sSubBuild.pOrder
2e8e0 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 53  By = 0;.      sS
2e8f0 75 62 42 75 69 6c 64 2e 70 4f 72 53 65 74 20 3d  ubBuild.pOrSet =
2e900 20 26 73 43 75 72 3b 0a 0a 20 20 20 20 20 20 57   &sCur;..      W
2e910 48 45 52 45 54 52 41 43 45 28 30 78 32 30 30 2c  HERETRACE(0x200,
2e920 20 28 22 42 65 67 69 6e 20 70 72 6f 63 65 73 73   ("Begin process
2e930 69 6e 67 20 4f 52 2d 63 6c 61 75 73 65 20 25 70  ing OR-clause %p
2e940 5c 6e 22 2c 20 70 54 65 72 6d 29 29 3b 0a 20 20  \n", pTerm));.  
2e950 20 20 20 20 66 6f 72 28 70 4f 72 54 65 72 6d 3d      for(pOrTerm=
2e960 70 4f 72 57 43 2d 3e 61 3b 20 70 4f 72 54 65 72  pOrWC->a; pOrTer
2e970 6d 3c 70 4f 72 57 43 45 6e 64 3b 20 70 4f 72 54  m<pOrWCEnd; pOrT
2e980 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  erm++){.        
2e990 69 66 28 20 28 70 4f 72 54 65 72 6d 2d 3e 65 4f  if( (pOrTerm->eO
2e9a0 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 41 4e 44  perator & WO_AND
2e9b0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
2e9c0 20 20 73 53 75 62 42 75 69 6c 64 2e 70 57 43 20    sSubBuild.pWC 
2e9d0 3d 20 26 70 4f 72 54 65 72 6d 2d 3e 75 2e 70 41  = &pOrTerm->u.pA
2e9e0 6e 64 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20 20  ndInfo->wc;.    
2e9f0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f      }else if( pO
2ea00 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  rTerm->leftCurso
2ea10 72 3d 3d 69 43 75 72 20 29 7b 0a 20 20 20 20 20  r==iCur ){.     
2ea20 20 20 20 20 20 74 65 6d 70 57 43 2e 70 57 49 6e       tempWC.pWIn
2ea30 66 6f 20 3d 20 70 57 43 2d 3e 70 57 49 6e 66 6f  fo = pWC->pWInfo
2ea40 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 6d 70  ;.          temp
2ea50 57 43 2e 70 4f 75 74 65 72 20 3d 20 70 57 43 3b  WC.pOuter = pWC;
2ea60 0a 20 20 20 20 20 20 20 20 20 20 74 65 6d 70 57  .          tempW
2ea70 43 2e 6f 70 20 3d 20 54 4b 5f 41 4e 44 3b 0a 20  C.op = TK_AND;. 
2ea80 20 20 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e           tempWC.
2ea90 6e 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20  nTerm = 1;.     
2eaa0 20 20 20 20 20 74 65 6d 70 57 43 2e 61 20 3d 20       tempWC.a = 
2eab0 70 4f 72 54 65 72 6d 3b 0a 20 20 20 20 20 20 20  pOrTerm;.       
2eac0 20 20 20 73 53 75 62 42 75 69 6c 64 2e 70 57 43     sSubBuild.pWC
2ead0 20 3d 20 26 74 65 6d 70 57 43 3b 0a 20 20 20 20   = &tempWC;.    
2eae0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2eaf0 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
2eb00 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2eb10 20 73 43 75 72 2e 6e 20 3d 20 30 3b 0a 23 69 66   sCur.n = 0;.#if
2eb20 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45  def WHERETRACE_E
2eb30 4e 41 42 4c 45 44 0a 20 20 20 20 20 20 20 20 57  NABLED.        W
2eb40 48 45 52 45 54 52 41 43 45 28 30 78 32 30 30 2c  HERETRACE(0x200,
2eb50 20 28 22 4f 52 2d 74 65 72 6d 20 25 64 20 6f 66   ("OR-term %d of
2eb60 20 25 70 20 68 61 73 20 25 64 20 73 75 62 74 65   %p has %d subte
2eb70 72 6d 73 3a 5c 6e 22 2c 20 0a 20 20 20 20 20 20  rms:\n", .      
2eb80 20 20 20 20 20 20 20 20 20 20 20 20 20 28 69 6e               (in
2eb90 74 29 28 70 4f 72 54 65 72 6d 2d 70 4f 72 57 43  t)(pOrTerm-pOrWC
2eba0 2d 3e 61 29 2c 20 70 54 65 72 6d 2c 20 73 53 75  ->a), pTerm, sSu
2ebb0 62 42 75 69 6c 64 2e 70 57 43 2d 3e 6e 54 65 72  bBuild.pWC->nTer
2ebc0 6d 29 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  m));.        if(
2ebd0 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61   sqlite3WhereTra
2ebe0 63 65 20 26 20 30 78 34 30 30 20 29 7b 0a 20 20  ce & 0x400 ){.  
2ebf0 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
2ec00 20 69 3c 73 53 75 62 42 75 69 6c 64 2e 70 57 43   i<sSubBuild.pWC
2ec10 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 29 7b 0a 20  ->nTerm; i++){. 
2ec20 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65             where
2ec30 54 65 72 6d 50 72 69 6e 74 28 26 73 53 75 62 42  TermPrint(&sSubB
2ec40 75 69 6c 64 2e 70 57 43 2d 3e 61 5b 69 5d 2c 20  uild.pWC->a[i], 
2ec50 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  i);.          }.
2ec60 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66          }.#endif
2ec70 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2ec80 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
2ec90 45 0a 20 20 20 20 20 20 20 20 69 66 28 20 49 73  E.        if( Is
2eca0 56 69 72 74 75 61 6c 28 70 49 74 65 6d 2d 3e 70  Virtual(pItem->p
2ecb0 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Tab) ){.        
2ecc0 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70    rc = whereLoop
2ecd0 41 64 64 56 69 72 74 75 61 6c 28 26 73 53 75 62  AddVirtual(&sSub
2ece0 42 75 69 6c 64 2c 20 6d 45 78 74 72 61 29 3b 0a  Build, mExtra);.
2ecf0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65          }else.#e
2ed00 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7b 0a 20  ndif.        {. 
2ed10 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 68           rc = wh
2ed20 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 28  ereLoopAddBtree(
2ed30 26 73 53 75 62 42 75 69 6c 64 2c 20 6d 45 78 74  &sSubBuild, mExt
2ed40 72 61 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ra);.        }. 
2ed50 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
2ed60 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2ed70 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65        rc = where
2ed80 4c 6f 6f 70 41 64 64 4f 72 28 26 73 53 75 62 42  LoopAddOr(&sSubB
2ed90 75 69 6c 64 2c 20 6d 45 78 74 72 61 29 3b 0a 20  uild, mExtra);. 
2eda0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2edb0 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
2edc0 49 54 45 5f 4f 4b 20 7c 7c 20 73 43 75 72 2e 6e  ITE_OK || sCur.n
2edd0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69  ==0 );.        i
2ede0 66 28 20 73 43 75 72 2e 6e 3d 3d 30 20 29 7b 0a  f( sCur.n==0 ){.
2edf0 20 20 20 20 20 20 20 20 20 20 73 53 75 6d 2e 6e            sSum.n
2ee00 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
2ee10 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
2ee20 65 6c 73 65 20 69 66 28 20 6f 6e 63 65 20 29 7b  else if( once ){
2ee30 0a 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65  .          where
2ee40 4f 72 4d 6f 76 65 28 26 73 53 75 6d 2c 20 26 73  OrMove(&sSum, &s
2ee50 43 75 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Cur);.          
2ee60 6f 6e 63 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  once = 0;.      
2ee70 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2ee80 20 20 20 57 68 65 72 65 4f 72 53 65 74 20 73 50     WhereOrSet sP
2ee90 72 65 76 3b 0a 20 20 20 20 20 20 20 20 20 20 77  rev;.          w
2eea0 68 65 72 65 4f 72 4d 6f 76 65 28 26 73 50 72 65  hereOrMove(&sPre
2eeb0 76 2c 20 26 73 53 75 6d 29 3b 0a 20 20 20 20 20  v, &sSum);.     
2eec0 20 20 20 20 20 73 53 75 6d 2e 6e 20 3d 20 30 3b       sSum.n = 0;
2eed0 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69  .          for(i
2eee0 3d 30 3b 20 69 3c 73 50 72 65 76 2e 6e 3b 20 69  =0; i<sPrev.n; i
2eef0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
2ef00 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 73 43 75 72   for(j=0; j<sCur
2ef10 2e 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  .n; j++){.      
2ef20 20 20 20 20 20 20 20 20 77 68 65 72 65 4f 72 49          whereOrI
2ef30 6e 73 65 72 74 28 26 73 53 75 6d 2c 20 73 50 72  nsert(&sSum, sPr
2ef40 65 76 2e 61 5b 69 5d 2e 70 72 65 72 65 71 20 7c  ev.a[i].prereq |
2ef50 20 73 43 75 72 2e 61 5b 6a 5d 2e 70 72 65 72 65   sCur.a[j].prere
2ef60 71 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  q,.             
2ef70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
2ef80 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28  qlite3LogEstAdd(
2ef90 73 50 72 65 76 2e 61 5b 69 5d 2e 72 52 75 6e 2c  sPrev.a[i].rRun,
2efa0 20 73 43 75 72 2e 61 5b 6a 5d 2e 72 52 75 6e 29   sCur.a[j].rRun)
2efb0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2efc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
2efd0 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28 73  lite3LogEstAdd(s
2efe0 50 72 65 76 2e 61 5b 69 5d 2e 6e 4f 75 74 2c 20  Prev.a[i].nOut, 
2eff0 73 43 75 72 2e 61 5b 6a 5d 2e 6e 4f 75 74 29 29  sCur.a[j].nOut))
2f000 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
2f010 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2f020 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
2f030 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d      pNew->nLTerm
2f040 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 4e 65 77   = 1;.      pNew
2f050 2d 3e 61 4c 54 65 72 6d 5b 30 5d 20 3d 20 70 54  ->aLTerm[0] = pT
2f060 65 72 6d 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  erm;.      pNew-
2f070 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45  >wsFlags = WHERE
2f080 5f 4d 55 4c 54 49 5f 4f 52 3b 0a 20 20 20 20 20  _MULTI_OR;.     
2f090 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20   pNew->rSetup = 
2f0a0 30 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 69  0;.      pNew->i
2f0b0 53 6f 72 74 49 64 78 20 3d 20 30 3b 0a 20 20 20  SortIdx = 0;.   
2f0c0 20 20 20 6d 65 6d 73 65 74 28 26 70 4e 65 77 2d     memset(&pNew-
2f0d0 3e 75 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 4e  >u, 0, sizeof(pN
2f0e0 65 77 2d 3e 75 29 29 3b 0a 20 20 20 20 20 20 66  ew->u));.      f
2f0f0 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  or(i=0; rc==SQLI
2f100 54 45 5f 4f 4b 20 26 26 20 69 3c 73 53 75 6d 2e  TE_OK && i<sSum.
2f110 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  n; i++){.       
2f120 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 43 75 72 72   /* TUNING: Curr
2f130 65 6e 74 6c 79 20 73 53 75 6d 2e 61 5b 69 5d 2e  ently sSum.a[i].
2f140 72 52 75 6e 20 69 73 20 73 65 74 20 74 6f 20 74  rRun is set to t
2f150 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 63 6f  he sum of the co
2f160 73 74 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  sts.        ** o
2f170 66 20 61 6c 6c 20 73 75 62 2d 73 63 61 6e 73 20  f all sub-scans 
2f180 72 65 71 75 69 72 65 64 20 62 79 20 74 68 65 20  required by the 
2f190 4f 52 2d 73 63 61 6e 2e 20 48 6f 77 65 76 65 72  OR-scan. However
2f1a0 2c 20 64 75 65 20 74 6f 20 72 6f 75 6e 64 69 6e  , due to roundin
2f1b0 67 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 72 72  g.        ** err
2f1c0 6f 72 73 2c 20 69 74 20 6d 61 79 20 62 65 20 74  ors, it may be t
2f1d0 68 61 74 20 74 68 65 20 63 6f 73 74 20 6f 66 20  hat the cost of 
2f1e0 74 68 65 20 4f 52 2d 73 63 61 6e 20 69 73 20 65  the OR-scan is e
2f1f0 71 75 61 6c 20 74 6f 20 69 74 73 0a 20 20 20 20  qual to its.    
2f200 20 20 20 20 2a 2a 20 6d 6f 73 74 20 65 78 70 65      ** most expe
2f210 6e 73 69 76 65 20 73 75 62 2d 73 63 61 6e 2e 20  nsive sub-scan. 
2f220 41 64 64 20 74 68 65 20 73 6d 61 6c 6c 65 73 74  Add the smallest
2f230 20 70 6f 73 73 69 62 6c 65 20 70 65 6e 61 6c 74   possible penalt
2f240 79 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 65  y .        ** (e
2f250 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 6d 75 6c  quivalent to mul
2f260 74 69 70 6c 79 69 6e 67 20 74 68 65 20 63 6f 73  tiplying the cos
2f270 74 20 62 79 20 31 2e 30 37 29 20 74 6f 20 65 6e  t by 1.07) to en
2f280 73 75 72 65 20 74 68 61 74 20 0a 20 20 20 20 20  sure that .     
2f290 20 20 20 2a 2a 20 74 68 69 73 20 64 6f 65 73 20     ** this does 
2f2a0 6e 6f 74 20 68 61 70 70 65 6e 2e 20 4f 74 68 65  not happen. Othe
2f2b0 72 77 69 73 65 2c 20 66 6f 72 20 57 48 45 52 45  rwise, for WHERE
2f2c0 20 63 6c 61 75 73 65 73 20 73 75 63 68 20 61 73   clauses such as
2f2d0 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
2f2e0 66 6f 6c 6c 6f 77 69 6e 67 20 77 68 65 72 65 20  following where 
2f2f0 74 68 65 72 65 20 69 73 20 61 6e 20 69 6e 64 65  there is an inde
2f300 78 20 6f 6e 20 22 79 22 3a 0a 20 20 20 20 20 20  x on "y":.      
2f310 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
2f320 20 20 20 20 57 48 45 52 45 20 6c 69 6b 65 6c 69      WHERE likeli
2f330 68 6f 6f 64 28 78 3d 3f 2c 20 30 2e 39 39 29 20  hood(x=?, 0.99) 
2f340 4f 52 20 79 3d 3f 0a 20 20 20 20 20 20 20 20 2a  OR y=?.        *
2f350 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  *.        ** the
2f360 20 70 6c 61 6e 6e 65 72 20 6d 61 79 20 65 6c 65   planner may ele
2f370 63 74 20 74 6f 20 22 4f 52 22 20 74 6f 67 65 74  ct to "OR" toget
2f380 68 65 72 20 61 20 66 75 6c 6c 2d 74 61 62 6c 65  her a full-table
2f390 20 73 63 61 6e 20 61 6e 64 20 61 6e 0a 20 20 20   scan and an.   
2f3a0 20 20 20 20 20 2a 2a 20 69 6e 64 65 78 20 6c 6f       ** index lo
2f3b0 6f 6b 75 70 2e 20 41 6e 64 20 6f 74 68 65 72 20  okup. And other 
2f3c0 73 69 6d 69 6c 61 72 6c 79 20 6f 64 64 20 72 65  similarly odd re
2f3d0 73 75 6c 74 73 2e 20 20 2a 2f 0a 20 20 20 20 20  sults.  */.     
2f3e0 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20     pNew->rRun = 
2f3f0 73 53 75 6d 2e 61 5b 69 5d 2e 72 52 75 6e 20 2b  sSum.a[i].rRun +
2f400 20 31 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77   1;.        pNew
2f410 2d 3e 6e 4f 75 74 20 3d 20 73 53 75 6d 2e 61 5b  ->nOut = sSum.a[
2f420 69 5d 2e 6e 4f 75 74 3b 0a 20 20 20 20 20 20 20  i].nOut;.       
2f430 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20   pNew->prereq = 
2f440 73 53 75 6d 2e 61 5b 69 5d 2e 70 72 65 72 65 71  sSum.a[i].prereq
2f450 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77  ;.        rc = w
2f460 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70  hereLoopInsert(p
2f470 42 75 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a  Builder, pNew);.
2f480 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 57 48        }.      WH
2f490 45 52 45 54 52 41 43 45 28 30 78 32 30 30 2c 20  ERETRACE(0x200, 
2f4a0 28 22 45 6e 64 20 70 72 6f 63 65 73 73 69 6e 67  ("End processing
2f4b0 20 4f 52 2d 63 6c 61 75 73 65 20 25 70 5c 6e 22   OR-clause %p\n"
2f4c0 2c 20 70 54 65 72 6d 29 29 3b 0a 20 20 20 20 7d  , pTerm));.    }
2f4d0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
2f4e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  ;.}../*.** Add a
2f4f0 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a  ll WhereLoop obj
2f500 65 63 74 73 20 66 6f 72 20 61 6c 6c 20 74 61 62  ects for all tab
2f510 6c 65 73 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69  les .*/.static i
2f520 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 41  nt whereLoopAddA
2f530 6c 6c 28 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c  ll(WhereLoopBuil
2f540 64 65 72 20 2a 70 42 75 69 6c 64 65 72 29 7b 0a  der *pBuilder){.
2f550 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
2f560 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  nfo = pBuilder->
2f570 70 57 49 6e 66 6f 3b 0a 20 20 42 69 74 6d 61 73  pWInfo;.  Bitmas
2f580 6b 20 6d 45 78 74 72 61 20 3d 20 30 3b 0a 20 20  k mExtra = 0;.  
2f590 42 69 74 6d 61 73 6b 20 6d 50 72 69 6f 72 20 3d  Bitmask mPrior =
2f5a0 20 30 3b 0a 20 20 69 6e 74 20 69 54 61 62 3b 0a   0;.  int iTab;.
2f5b0 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
2f5c0 69 73 74 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54  ist = pWInfo->pT
2f5d0 61 62 4c 69 73 74 3b 0a 20 20 73 74 72 75 63 74  abList;.  struct
2f5e0 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
2f5f0 49 74 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20  Item;.  sqlite3 
2f600 2a 64 62 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50  *db = pWInfo->pP
2f610 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20  arse->db;.  int 
2f620 6e 54 61 62 4c 69 73 74 20 3d 20 70 57 49 6e 66  nTabList = pWInf
2f630 6f 2d 3e 6e 4c 65 76 65 6c 3b 0a 20 20 69 6e 74  o->nLevel;.  int
2f640 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2f650 0a 20 20 75 38 20 70 72 69 6f 72 4a 6f 69 6e 54  .  u8 priorJoinT
2f660 79 70 65 20 3d 20 30 3b 0a 20 20 57 68 65 72 65  ype = 0;.  Where
2f670 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a 0a 20 20 2f  Loop *pNew;..  /
2f680 2a 20 4c 6f 6f 70 20 6f 76 65 72 20 74 68 65 20  * Loop over the 
2f690 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 6a 6f  tables in the jo
2f6a0 69 6e 2c 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f  in, from left to
2f6b0 20 72 69 67 68 74 20 2a 2f 0a 20 20 70 4e 65 77   right */.  pNew
2f6c0 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65   = pBuilder->pNe
2f6d0 77 3b 0a 20 20 77 68 65 72 65 4c 6f 6f 70 49 6e  w;.  whereLoopIn
2f6e0 69 74 28 70 4e 65 77 29 3b 0a 20 20 66 6f 72 28  it(pNew);.  for(
2f6f0 69 54 61 62 3d 30 2c 20 70 49 74 65 6d 3d 70 54  iTab=0, pItem=pT
2f700 61 62 4c 69 73 74 2d 3e 61 3b 20 69 54 61 62 3c  abList->a; iTab<
2f710 6e 54 61 62 4c 69 73 74 3b 20 69 54 61 62 2b 2b  nTabList; iTab++
2f720 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
2f730 70 4e 65 77 2d 3e 69 54 61 62 20 3d 20 69 54 61  pNew->iTab = iTa
2f740 62 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6d 61 73  b;.    pNew->mas
2f750 6b 53 65 6c 66 20 3d 20 67 65 74 4d 61 73 6b 28  kSelf = getMask(
2f760 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65  &pWInfo->sMaskSe
2f770 74 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f  t, pItem->iCurso
2f780 72 29 3b 0a 20 20 20 20 69 66 28 20 28 28 70 49  r);.    if( ((pI
2f790 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 7c 70 72  tem->jointype|pr
2f7a0 69 6f 72 4a 6f 69 6e 54 79 70 65 29 20 26 20 28  iorJoinType) & (
2f7b0 4a 54 5f 4c 45 46 54 7c 4a 54 5f 43 52 4f 53 53  JT_LEFT|JT_CROSS
2f7c0 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 6d  ))!=0 ){.      m
2f7d0 45 78 74 72 61 20 3d 20 6d 50 72 69 6f 72 3b 0a  Extra = mPrior;.
2f7e0 20 20 20 20 7d 0a 20 20 20 20 70 72 69 6f 72 4a      }.    priorJ
2f7f0 6f 69 6e 54 79 70 65 20 3d 20 70 49 74 65 6d 2d  oinType = pItem-
2f800 3e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20 69  >jointype;.    i
2f810 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 49 74  f( IsVirtual(pIt
2f820 65 6d 2d 3e 70 54 61 62 29 20 29 7b 0a 20 20 20  em->pTab) ){.   
2f830 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f     rc = whereLoo
2f840 70 41 64 64 56 69 72 74 75 61 6c 28 70 42 75 69  pAddVirtual(pBui
2f850 6c 64 65 72 2c 20 6d 45 78 74 72 61 29 3b 0a 20  lder, mExtra);. 
2f860 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2f870 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64  rc = whereLoopAd
2f880 64 42 74 72 65 65 28 70 42 75 69 6c 64 65 72 2c  dBtree(pBuilder,
2f890 20 6d 45 78 74 72 61 29 3b 0a 20 20 20 20 7d 0a   mExtra);.    }.
2f8a0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2f8b0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
2f8c0 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  c = whereLoopAdd
2f8d0 4f 72 28 70 42 75 69 6c 64 65 72 2c 20 6d 45 78  Or(pBuilder, mEx
2f8e0 74 72 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  tra);.    }.    
2f8f0 6d 50 72 69 6f 72 20 7c 3d 20 70 4e 65 77 2d 3e  mPrior |= pNew->
2f900 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20 69 66  maskSelf;.    if
2f910 28 20 72 63 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  ( rc || db->mall
2f920 6f 63 46 61 69 6c 65 64 20 29 20 62 72 65 61 6b  ocFailed ) break
2f930 3b 0a 20 20 7d 0a 20 20 77 68 65 72 65 4c 6f 6f  ;.  }.  whereLoo
2f940 70 43 6c 65 61 72 28 64 62 2c 20 70 4e 65 77 29  pClear(db, pNew)
2f950 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
2f960 0a 0a 2f 2a 0a 2a 2a 20 45 78 61 6d 69 6e 65 20  ../*.** Examine 
2f970 61 20 57 68 65 72 65 50 61 74 68 20 28 77 69 74  a WherePath (wit
2f980 68 20 74 68 65 20 61 64 64 69 74 69 6f 6e 20 6f  h the addition o
2f990 66 20 74 68 65 20 65 78 74 72 61 20 57 68 65 72  f the extra Wher
2f9a0 65 4c 6f 6f 70 20 6f 66 20 74 68 65 20 35 74 68  eLoop of the 5th
2f9b0 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 73 29 20  .** parameters) 
2f9c0 74 6f 20 73 65 65 20 69 66 20 69 74 20 6f 75 74  to see if it out
2f9d0 70 75 74 73 20 72 6f 77 73 20 69 6e 20 74 68 65  puts rows in the
2f9e0 20 72 65 71 75 65 73 74 65 64 20 4f 52 44 45 52   requested ORDER
2f9f0 20 42 59 0a 2a 2a 20 28 6f 72 20 47 52 4f 55 50   BY.** (or GROUP
2fa00 20 42 59 29 20 77 69 74 68 6f 75 74 20 72 65 71   BY) without req
2fa10 75 69 72 69 6e 67 20 61 20 73 65 70 61 72 61 74  uiring a separat
2fa20 65 20 73 6f 72 74 20 6f 70 65 72 61 74 69 6f 6e  e sort operation
2fa30 2e 20 20 52 65 74 75 72 6e 20 4e 3a 0a 2a 2a 20  .  Return N:.** 
2fa40 0a 2a 2a 20 20 20 4e 3e 30 3a 20 20 20 4e 20 74  .**   N>0:   N t
2fa50 65 72 6d 73 20 6f 66 20 74 68 65 20 4f 52 44 45  erms of the ORDE
2fa60 52 20 42 59 20 63 6c 61 75 73 65 20 61 72 65 20  R BY clause are 
2fa70 73 61 74 69 73 66 69 65 64 0a 2a 2a 20 20 20 4e  satisfied.**   N
2fa80 3d 3d 30 3a 20 20 4e 6f 20 74 65 72 6d 73 20 6f  ==0:  No terms o
2fa90 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  f the ORDER BY c
2faa0 6c 61 75 73 65 20 61 72 65 20 73 61 74 69 73 66  lause are satisf
2fab0 69 65 64 0a 2a 2a 20 20 20 4e 3c 30 3a 20 20 20  ied.**   N<0:   
2fac0 55 6e 6b 6e 6f 77 6e 20 79 65 74 20 68 6f 77 20  Unknown yet how 
2fad0 6d 61 6e 79 20 74 65 72 6d 73 20 6f 66 20 4f 52  many terms of OR
2fae0 44 45 52 20 42 59 20 6d 69 67 68 74 20 62 65 20  DER BY might be 
2faf0 73 61 74 69 73 66 69 65 64 2e 20 20 20 0a 2a 2a  satisfied.   .**
2fb00 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 70 72  .** Note that pr
2fb10 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 57 48 45  ocessing for WHE
2fb20 52 45 5f 47 52 4f 55 50 42 59 20 61 6e 64 20 57  RE_GROUPBY and W
2fb30 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59 20  HERE_DISTINCTBY 
2fb40 69 73 20 6e 6f 74 20 61 73 0a 2a 2a 20 73 74 72  is not as.** str
2fb50 69 63 74 2e 20 20 57 69 74 68 20 47 52 4f 55 50  ict.  With GROUP
2fb60 20 42 59 20 61 6e 64 20 44 49 53 54 49 4e 43 54   BY and DISTINCT
2fb70 20 74 68 65 20 6f 6e 6c 79 20 72 65 71 75 69 72   the only requir
2fb80 65 6d 65 6e 74 20 69 73 20 74 68 61 74 0a 2a 2a  ement is that.**
2fb90 20 65 71 75 69 76 61 6c 65 6e 74 20 72 6f 77 73   equivalent rows
2fba0 20 61 70 70 65 61 72 20 69 6d 6d 65 64 69 61 74   appear immediat
2fbb0 65 6c 79 20 61 64 6a 61 63 65 6e 74 20 74 6f 20  ely adjacent to 
2fbc0 6f 6e 65 20 61 6e 6f 74 68 65 72 2e 20 20 47 52  one another.  GR
2fbd0 4f 55 50 20 42 59 0a 2a 2a 20 61 6e 64 20 44 49  OUP BY.** and DI
2fbe0 53 54 49 4e 43 54 20 64 6f 20 6e 6f 74 20 72 65  STINCT do not re
2fbf0 71 75 69 72 65 20 72 6f 77 73 20 74 6f 20 61 70  quire rows to ap
2fc00 70 65 61 72 20 69 6e 20 61 6e 79 20 70 61 72 74  pear in any part
2fc10 69 63 75 6c 61 72 20 6f 72 64 65 72 20 61 73 20  icular order as 
2fc20 6c 6f 6e 67 0a 2a 2a 20 61 73 20 65 71 75 69 76  long.** as equiv
2fc30 61 6c 65 6e 74 20 72 6f 77 73 20 61 72 65 20 67  alent rows are g
2fc40 72 6f 75 70 65 64 20 74 6f 67 65 74 68 65 72 2e  rouped together.
2fc50 20 20 54 68 75 73 20 66 6f 72 20 47 52 4f 55 50    Thus for GROUP
2fc60 20 42 59 20 61 6e 64 20 44 49 53 54 49 4e 43 54   BY and DISTINCT
2fc70 0a 2a 2a 20 74 68 65 20 70 4f 72 64 65 72 42 79  .** the pOrderBy
2fc80 20 74 65 72 6d 73 20 63 61 6e 20 62 65 20 6d 61   terms can be ma
2fc90 74 63 68 65 64 20 69 6e 20 61 6e 79 20 6f 72 64  tched in any ord
2fca0 65 72 2e 20 20 57 69 74 68 20 4f 52 44 45 52 20  er.  With ORDER 
2fcb0 42 59 2c 20 74 68 65 20 0a 2a 2a 20 70 4f 72 64  BY, the .** pOrd
2fcc0 65 72 42 79 20 74 65 72 6d 73 20 6d 75 73 74 20  erBy terms must 
2fcd0 62 65 20 6d 61 74 63 68 65 64 20 69 6e 20 73 74  be matched in st
2fce0 72 69 63 74 20 6c 65 66 74 2d 74 6f 2d 72 69 67  rict left-to-rig
2fcf0 68 74 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61  ht order..*/.sta
2fd00 74 69 63 20 69 38 20 77 68 65 72 65 50 61 74 68  tic i8 wherePath
2fd10 53 61 74 69 73 66 69 65 73 4f 72 64 65 72 42 79  SatisfiesOrderBy
2fd20 28 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  (.  WhereInfo *p
2fd30 57 49 6e 66 6f 2c 20 20 20 20 2f 2a 20 54 68 65  WInfo,    /* The
2fd40 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
2fd50 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72  .  ExprList *pOr
2fd60 64 65 72 42 79 2c 20 20 20 2f 2a 20 4f 52 44 45  derBy,   /* ORDE
2fd70 52 20 42 59 20 6f 72 20 47 52 4f 55 50 20 42 59  R BY or GROUP BY
2fd80 20 6f 72 20 44 49 53 54 49 4e 43 54 20 63 6c 61   or DISTINCT cla
2fd90 75 73 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a  use to check */.
2fda0 20 20 57 68 65 72 65 50 61 74 68 20 2a 70 50 61    WherePath *pPa
2fdb0 74 68 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 57  th,     /* The W
2fdc0 68 65 72 65 50 61 74 68 20 74 6f 20 63 68 65 63  herePath to chec
2fdd0 6b 20 2a 2f 0a 20 20 75 31 36 20 77 63 74 72 6c  k */.  u16 wctrl
2fde0 46 6c 61 67 73 2c 20 20 20 20 20 20 20 2f 2a 20  Flags,       /* 
2fdf0 4d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 57 48  Might contain WH
2fe00 45 52 45 5f 47 52 4f 55 50 42 59 20 6f 72 20 57  ERE_GROUPBY or W
2fe10 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59 20  HERE_DISTINCTBY 
2fe20 2a 2f 0a 20 20 75 31 36 20 6e 4c 6f 6f 70 2c 20  */.  u16 nLoop, 
2fe30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
2fe40 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20  mber of entries 
2fe50 69 6e 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b  in pPath->aLoop[
2fe60 5d 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70  ] */.  WhereLoop
2fe70 20 2a 70 4c 61 73 74 2c 20 20 20 20 20 2f 2a 20   *pLast,     /* 
2fe80 41 64 64 20 74 68 69 73 20 57 68 65 72 65 4c 6f  Add this WhereLo
2fe90 6f 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  op to the end of
2fea0 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b 5d 20   pPath->aLoop[] 
2feb0 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 2a 70 52  */.  Bitmask *pR
2fec0 65 76 4d 61 73 6b 20 20 20 20 20 2f 2a 20 4f 55  evMask     /* OU
2fed0 54 3a 20 4d 61 73 6b 20 6f 66 20 57 68 65 72 65  T: Mask of Where
2fee0 4c 6f 6f 70 73 20 74 6f 20 72 75 6e 20 69 6e 20  Loops to run in 
2fef0 72 65 76 65 72 73 65 20 6f 72 64 65 72 20 2a 2f  reverse order */
2ff00 0a 29 7b 0a 20 20 75 38 20 72 65 76 53 65 74 3b  .){.  u8 revSet;
2ff10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2ff20 72 75 65 20 69 66 20 72 65 76 20 69 73 20 6b 6e  rue if rev is kn
2ff30 6f 77 6e 20 2a 2f 0a 20 20 75 38 20 72 65 76 3b  own */.  u8 rev;
2ff40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2ff50 2a 20 43 6f 6d 70 6f 73 69 74 65 20 73 6f 72 74  * Composite sort
2ff60 20 6f 72 64 65 72 20 2a 2f 0a 20 20 75 38 20 72   order */.  u8 r
2ff70 65 76 49 64 78 3b 20 20 20 20 20 20 20 20 20 20  evIdx;          
2ff80 20 20 2f 2a 20 49 6e 64 65 78 20 73 6f 72 74 20    /* Index sort 
2ff90 6f 72 64 65 72 20 2a 2f 0a 20 20 75 38 20 69 73  order */.  u8 is
2ffa0 4f 72 64 65 72 44 69 73 74 69 6e 63 74 3b 20 20  OrderDistinct;  
2ffb0 20 2f 2a 20 41 6c 6c 20 70 72 69 6f 72 20 57 68   /* All prior Wh
2ffc0 65 72 65 4c 6f 6f 70 73 20 61 72 65 20 6f 72 64  ereLoops are ord
2ffd0 65 72 2d 64 69 73 74 69 6e 63 74 20 2a 2f 0a 20  er-distinct */. 
2ffe0 20 75 38 20 64 69 73 74 69 6e 63 74 43 6f 6c 75   u8 distinctColu
2fff0 6d 6e 73 3b 20 20 20 2f 2a 20 54 72 75 65 20 69  mns;   /* True i
30000 66 20 74 68 65 20 6c 6f 6f 70 20 68 61 73 20 55  f the loop has U
30010 4e 49 51 55 45 20 4e 4f 54 20 4e 55 4c 4c 20 63  NIQUE NOT NULL c
30020 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 75 38 20 69  olumns */.  u8 i
30030 73 4d 61 74 63 68 3b 20 20 20 20 20 20 20 20 20  sMatch;         
30040 20 20 2f 2a 20 69 43 6f 6c 75 6d 6e 20 6d 61 74    /* iColumn mat
30050 63 68 65 73 20 61 20 74 65 72 6d 20 6f 66 20 74  ches a term of t
30060 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
30070 73 65 20 2a 2f 0a 20 20 75 31 36 20 6e 4b 65 79  se */.  u16 nKey
30080 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  Col;          /*
30090 20 4e 75 6d 62 65 72 20 6f 66 20 6b 65 79 20 63   Number of key c
300a0 6f 6c 75 6d 6e 73 20 69 6e 20 70 49 6e 64 65 78  olumns in pIndex
300b0 20 2a 2f 0a 20 20 75 31 36 20 6e 43 6f 6c 75 6d   */.  u16 nColum
300c0 6e 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  n;          /* T
300d0 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6f  otal number of o
300e0 72 64 65 72 65 64 20 63 6f 6c 75 6d 6e 73 20 69  rdered columns i
300f0 6e 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20  n the index */. 
30100 20 75 31 36 20 6e 4f 72 64 65 72 42 79 3b 20 20   u16 nOrderBy;  
30110 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
30120 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 4f 52   terms in the OR
30130 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  DER BY clause */
30140 0a 20 20 69 6e 74 20 69 4c 6f 6f 70 3b 20 20 20  .  int iLoop;   
30150 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
30160 78 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70 20 69  x of WhereLoop i
30170 6e 20 70 50 61 74 68 20 62 65 69 6e 67 20 70 72  n pPath being pr
30180 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20 69 6e 74  ocessed */.  int
30190 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20   i, j;          
301a0 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
301b0 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75  ers */.  int iCu
301c0 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  r;             /
301d0 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  * Cursor number 
301e0 66 6f 72 20 63 75 72 72 65 6e 74 20 57 68 65 72  for current Wher
301f0 65 4c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 69  eLoop */.  int i
30200 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20 20  Column;         
30210 20 2f 2a 20 41 20 63 6f 6c 75 6d 6e 20 6e 75 6d   /* A column num
30220 62 65 72 20 77 69 74 68 69 6e 20 74 61 62 6c 65  ber within table
30230 20 69 43 75 72 20 2a 2f 0a 20 20 57 68 65 72 65   iCur */.  Where
30240 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 20 3d 20 30 3b  Loop *pLoop = 0;
30250 20 2f 2a 20 43 75 72 72 65 6e 74 20 57 68 65 72   /* Current Wher
30260 65 4c 6f 6f 70 20 62 65 69 6e 67 20 70 72 6f 63  eLoop being proc
30270 65 73 73 65 64 2e 20 2a 2f 0a 20 20 57 68 65 72  essed. */.  Wher
30280 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20  eTerm *pTerm;   
30290 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 74 65    /* A single te
302a0 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  rm of the WHERE 
302b0 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72  clause */.  Expr
302c0 20 2a 70 4f 42 45 78 70 72 3b 20 20 20 20 20 20   *pOBExpr;      
302d0 20 20 2f 2a 20 41 6e 20 65 78 70 72 65 73 73 69    /* An expressi
302e0 6f 6e 20 66 72 6f 6d 20 74 68 65 20 4f 52 44 45  on from the ORDE
302f0 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20  R BY clause */. 
30300 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
30310 20 20 20 20 20 20 20 2f 2a 20 43 4f 4c 4c 41 54         /* COLLAT
30320 45 20 66 75 6e 63 74 69 6f 6e 20 66 72 6f 6d 20  E function from 
30330 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
30340 73 65 20 74 65 72 6d 20 2a 2f 0a 20 20 49 6e 64  se term */.  Ind
30350 65 78 20 2a 70 49 6e 64 65 78 3b 20 20 20 20 20  ex *pIndex;     
30360 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20     /* The index 
30370 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
30380 70 4c 6f 6f 70 20 2a 2f 0a 20 20 73 71 6c 69 74  pLoop */.  sqlit
30390 65 33 20 2a 64 62 20 3d 20 70 57 49 6e 66 6f 2d  e3 *db = pWInfo-
303a0 3e 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 2f 2a  >pParse->db;  /*
303b0 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
303c0 74 69 6f 6e 20 2a 2f 0a 20 20 42 69 74 6d 61 73  tion */.  Bitmas
303d0 6b 20 6f 62 53 61 74 20 3d 20 30 3b 20 20 20 20  k obSat = 0;    
303e0 2f 2a 20 4d 61 73 6b 20 6f 66 20 4f 52 44 45 52  /* Mask of ORDER
303f0 20 42 59 20 74 65 72 6d 73 20 73 61 74 69 73 66   BY terms satisf
30400 69 65 64 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20  ied so far */.  
30410 42 69 74 6d 61 73 6b 20 6f 62 44 6f 6e 65 3b 20  Bitmask obDone; 
30420 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
30430 20 61 6c 6c 20 4f 52 44 45 52 20 42 59 20 74 65   all ORDER BY te
30440 72 6d 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  rms */.  Bitmask
30450 20 6f 72 64 65 72 44 69 73 74 69 6e 63 74 4d 61   orderDistinctMa
30460 73 6b 3b 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20  sk;  /* Mask of 
30470 61 6c 6c 20 77 65 6c 6c 2d 6f 72 64 65 72 65 64  all well-ordered
30480 20 6c 6f 6f 70 73 20 2a 2f 0a 20 20 42 69 74 6d   loops */.  Bitm
30490 61 73 6b 20 72 65 61 64 79 3b 20 20 20 20 20 20  ask ready;      
304a0 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
304b0 6f 66 20 69 6e 6e 65 72 20 6c 6f 6f 70 73 20 2a  of inner loops *
304c0 2f 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 57 65 20  /..  /*.  ** We 
304d0 73 61 79 20 74 68 65 20 57 68 65 72 65 4c 6f 6f  say the WhereLoo
304e0 70 20 69 73 20 22 6f 6e 65 2d 72 6f 77 22 20 69  p is "one-row" i
304f0 66 20 69 74 20 67 65 6e 65 72 61 74 65 73 20 6e  f it generates n
30500 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 0a  o more than one.
30510 20 20 2a 2a 20 72 6f 77 20 6f 66 20 6f 75 74 70    ** row of outp
30520 75 74 2e 20 20 41 20 57 68 65 72 65 4c 6f 6f 70  ut.  A WhereLoop
30530 20 69 73 20 6f 6e 65 2d 72 6f 77 20 69 66 20 61   is one-row if a
30540 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ll of the follow
30550 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 20 20  ing are true:.  
30560 2a 2a 20 20 28 61 29 20 41 6c 6c 20 69 6e 64 65  **  (a) All inde
30570 78 20 63 6f 6c 75 6d 6e 73 20 6d 61 74 63 68 20  x columns match 
30580 77 69 74 68 20 57 48 45 52 45 5f 43 4f 4c 55 4d  with WHERE_COLUM
30590 4e 5f 45 51 2e 0a 20 20 2a 2a 20 20 28 62 29 20  N_EQ..  **  (b) 
305a0 54 68 65 20 69 6e 64 65 78 20 69 73 20 75 6e 69  The index is uni
305b0 71 75 65 0a 20 20 2a 2a 20 41 6e 79 20 57 68 65  que.  ** Any Whe
305c0 72 65 4c 6f 6f 70 20 77 69 74 68 20 61 6e 20 57  reLoop with an W
305d0 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 20 63  HERE_COLUMN_EQ c
305e0 6f 6e 73 74 72 61 69 6e 74 20 6f 6e 20 74 68 65  onstraint on the
305f0 20 72 6f 77 69 64 20 69 73 20 6f 6e 65 2d 72 6f   rowid is one-ro
30600 77 2e 0a 20 20 2a 2a 20 45 76 65 72 79 20 6f 6e  w..  ** Every on
30610 65 2d 72 6f 77 20 57 68 65 72 65 4c 6f 6f 70 20  e-row WhereLoop 
30620 77 69 6c 6c 20 68 61 76 65 20 74 68 65 20 57 48  will have the WH
30630 45 52 45 5f 4f 4e 45 52 4f 57 20 62 69 74 20 73  ERE_ONEROW bit s
30640 65 74 20 69 6e 20 77 73 46 6c 61 67 73 2e 0a 20  et in wsFlags.. 
30650 20 2a 2a 0a 20 20 2a 2a 20 57 65 20 73 61 79 20   **.  ** We say 
30660 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 69 73  the WhereLoop is
30670 20 22 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74   "order-distinct
30680 22 20 69 66 20 74 68 65 20 73 65 74 20 6f 66 20  " if the set of 
30690 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 0a 20 20 2a  columns from.  *
306a0 2a 20 74 68 61 74 20 57 68 65 72 65 4c 6f 6f 70  * that WhereLoop
306b0 20 74 68 61 74 20 61 72 65 20 69 6e 20 74 68 65   that are in the
306c0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
306d0 20 61 72 65 20 64 69 66 66 65 72 65 6e 74 20 66   are different f
306e0 6f 72 20 65 76 65 72 79 0a 20 20 2a 2a 20 72 6f  or every.  ** ro
306f0 77 20 6f 66 20 74 68 65 20 57 68 65 72 65 4c 6f  w of the WhereLo
30700 6f 70 2e 20 20 45 76 65 72 79 20 6f 6e 65 2d 72  op.  Every one-r
30710 6f 77 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 20  ow WhereLoop is 
30720 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 0a 20 20  automatically.  
30730 2a 2a 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63  ** order-distinc
30740 74 2e 20 20 20 41 20 57 68 65 72 65 4c 6f 6f 70  t.   A WhereLoop
30750 20 74 68 61 74 20 68 61 73 20 6e 6f 20 63 6f 6c   that has no col
30760 75 6d 6e 73 20 69 6e 20 74 68 65 20 4f 52 44 45  umns in the ORDE
30770 52 20 42 59 20 63 6c 61 75 73 65 0a 20 20 2a 2a  R BY clause.  **
30780 20 69 73 20 6e 6f 74 20 6f 72 64 65 72 2d 64 69   is not order-di
30790 73 74 69 6e 63 74 2e 20 54 6f 20 62 65 20 6f 72  stinct. To be or
307a0 64 65 72 2d 64 69 73 74 69 6e 63 74 20 69 73 20  der-distinct is 
307b0 6e 6f 74 20 71 75 69 74 65 20 74 68 65 20 73 61  not quite the sa
307c0 6d 65 20 61 73 20 62 65 69 6e 67 0a 20 20 2a 2a  me as being.  **
307d0 20 55 4e 49 51 55 45 20 73 69 6e 63 65 20 61 20   UNIQUE since a 
307e0 55 4e 49 51 55 45 20 63 6f 6c 75 6d 6e 20 6f 72  UNIQUE column or
307f0 20 69 6e 64 65 78 20 63 61 6e 20 68 61 76 65 20   index can have 
30800 6d 75 6c 74 69 70 6c 65 20 72 6f 77 73 20 74 68  multiple rows th
30810 61 74 20 0a 20 20 2a 2a 20 61 72 65 20 4e 55 4c  at .  ** are NUL
30820 4c 20 61 6e 64 20 4e 55 4c 4c 20 76 61 6c 75 65  L and NULL value
30830 73 20 61 72 65 20 65 71 75 69 76 61 6c 65 6e 74  s are equivalent
30840 20 66 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65   for the purpose
30850 20 6f 66 20 6f 72 64 65 72 2d 64 69 73 74 69 6e   of order-distin
30860 63 74 2e 0a 20 20 2a 2a 20 54 6f 20 62 65 20 6f  ct..  ** To be o
30870 72 64 65 72 2d 64 69 73 74 69 6e 63 74 2c 20 74  rder-distinct, t
30880 68 65 20 63 6f 6c 75 6d 6e 73 20 6d 75 73 74 20  he columns must 
30890 62 65 20 55 4e 49 51 55 45 20 61 6e 64 20 4e 4f  be UNIQUE and NO
308a0 54 20 4e 55 4c 4c 2e 0a 20 20 2a 2a 0a 20 20 2a  T NULL..  **.  *
308b0 2a 20 54 68 65 20 72 6f 77 69 64 20 66 6f 72 20  * The rowid for 
308c0 61 20 74 61 62 6c 65 20 69 73 20 61 6c 77 61 79  a table is alway
308d0 73 20 55 4e 49 51 55 45 20 61 6e 64 20 4e 4f 54  s UNIQUE and NOT
308e0 20 4e 55 4c 4c 20 73 6f 20 77 68 65 6e 65 76 65   NULL so wheneve
308f0 72 20 74 68 65 0a 20 20 2a 2a 20 72 6f 77 69 64  r the.  ** rowid
30900 20 61 70 70 65 61 72 73 20 69 6e 20 74 68 65 20   appears in the 
30910 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c  ORDER BY clause,
30920 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
30930 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 0a  ng WhereLoop is.
30940 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c    ** automatical
30950 6c 79 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63  ly order-distinc
30960 74 2e 0a 20 20 2a 2f 0a 0a 20 20 61 73 73 65 72  t..  */..  asser
30970 74 28 20 70 4f 72 64 65 72 42 79 21 3d 30 20 29  t( pOrderBy!=0 )
30980 3b 0a 20 20 69 66 28 20 6e 4c 6f 6f 70 20 26 26  ;.  if( nLoop &&
30990 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 44 69 73   OptimizationDis
309a0 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45  abled(db, SQLITE
309b0 5f 4f 72 64 65 72 42 79 49 64 78 4a 6f 69 6e 29  _OrderByIdxJoin)
309c0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20   ) return 0;..  
309d0 6e 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65  nOrderBy = pOrde
309e0 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 74 65  rBy->nExpr;.  te
309f0 73 74 63 61 73 65 28 20 6e 4f 72 64 65 72 42 79  stcase( nOrderBy
30a00 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 69 66 28  ==BMS-1 );.  if(
30a10 20 6e 4f 72 64 65 72 42 79 3e 42 4d 53 2d 31 20   nOrderBy>BMS-1 
30a20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20  ) return 0;  /* 
30a30 43 61 6e 6e 6f 74 20 6f 70 74 69 6d 69 7a 65 20  Cannot optimize 
30a40 6f 76 65 72 6c 79 20 6c 61 72 67 65 20 4f 52 44  overly large ORD
30a50 45 52 20 42 59 73 20 2a 2f 0a 20 20 69 73 4f 72  ER BYs */.  isOr
30a60 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20 31 3b  derDistinct = 1;
30a70 0a 20 20 6f 62 44 6f 6e 65 20 3d 20 4d 41 53 4b  .  obDone = MASK
30a80 42 49 54 28 6e 4f 72 64 65 72 42 79 29 2d 31 3b  BIT(nOrderBy)-1;
30a90 0a 20 20 6f 72 64 65 72 44 69 73 74 69 6e 63 74  .  orderDistinct
30aa0 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 72 65 61 64  Mask = 0;.  read
30ab0 79 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 4c 6f  y = 0;.  for(iLo
30ac0 6f 70 3d 30 3b 20 69 73 4f 72 64 65 72 44 69 73  op=0; isOrderDis
30ad0 74 69 6e 63 74 20 26 26 20 6f 62 53 61 74 3c 6f  tinct && obSat<o
30ae0 62 44 6f 6e 65 20 26 26 20 69 4c 6f 6f 70 3c 3d  bDone && iLoop<=
30af0 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f 70 2b 2b 29 7b  nLoop; iLoop++){
30b00 0a 20 20 20 20 69 66 28 20 69 4c 6f 6f 70 3e 30  .    if( iLoop>0
30b10 20 29 20 72 65 61 64 79 20 7c 3d 20 70 4c 6f 6f   ) ready |= pLoo
30b20 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20  p->maskSelf;.   
30b30 20 70 4c 6f 6f 70 20 3d 20 69 4c 6f 6f 70 3c 6e   pLoop = iLoop<n
30b40 4c 6f 6f 70 20 3f 20 70 50 61 74 68 2d 3e 61 4c  Loop ? pPath->aL
30b50 6f 6f 70 5b 69 4c 6f 6f 70 5d 20 3a 20 70 4c 61  oop[iLoop] : pLa
30b60 73 74 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f  st;.    if( pLoo
30b70 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
30b80 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20  RE_VIRTUALTABLE 
30b90 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 6f  ){.      if( pLo
30ba0 6f 70 2d 3e 75 2e 76 74 61 62 2e 69 73 4f 72 64  op->u.vtab.isOrd
30bb0 65 72 65 64 20 29 20 6f 62 53 61 74 20 3d 20 6f  ered ) obSat = o
30bc0 62 44 6f 6e 65 3b 0a 20 20 20 20 20 20 62 72 65  bDone;.      bre
30bd0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 43  ak;.    }.    iC
30be0 75 72 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61  ur = pWInfo->pTa
30bf0 62 4c 69 73 74 2d 3e 61 5b 70 4c 6f 6f 70 2d 3e  bList->a[pLoop->
30c00 69 54 61 62 5d 2e 69 43 75 72 73 6f 72 3b 0a 0a  iTab].iCursor;..
30c10 20 20 20 20 2f 2a 20 4d 61 72 6b 20 6f 66 66 20      /* Mark off 
30c20 61 6e 79 20 4f 52 44 45 52 20 42 59 20 74 65 72  any ORDER BY ter
30c30 6d 20 58 20 74 68 61 74 20 69 73 20 61 20 63 6f  m X that is a co
30c40 6c 75 6d 6e 20 69 6e 20 74 68 65 20 74 61 62 6c  lumn in the tabl
30c50 65 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20  e of.    ** the 
30c60 63 75 72 72 65 6e 74 20 6c 6f 6f 70 20 66 6f 72  current loop for
30c70 20 77 68 69 63 68 20 74 68 65 72 65 20 69 73 20   which there is 
30c80 74 65 72 6d 20 69 6e 20 74 68 65 20 57 48 45 52  term in the WHER
30c90 45 0a 20 20 20 20 2a 2a 20 63 6c 61 75 73 65 20  E.    ** clause 
30ca0 6f 66 20 74 68 65 20 66 6f 72 6d 20 58 20 49 53  of the form X IS
30cb0 20 4e 55 4c 4c 20 6f 72 20 58 3d 3f 20 74 68 61   NULL or X=? tha
30cc0 74 20 72 65 66 65 72 65 6e 63 65 20 6f 6e 6c 79  t reference only
30cd0 20 6f 75 74 65 72 0a 20 20 20 20 2a 2a 20 6c 6f   outer.    ** lo
30ce0 6f 70 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ops..    */.    
30cf0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65  for(i=0; i<nOrde
30d00 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  rBy; i++){.     
30d10 20 69 66 28 20 4d 41 53 4b 42 49 54 28 69 29 20   if( MASKBIT(i) 
30d20 26 20 6f 62 53 61 74 20 29 20 63 6f 6e 74 69 6e  & obSat ) contin
30d30 75 65 3b 0a 20 20 20 20 20 20 70 4f 42 45 78 70  ue;.      pOBExp
30d40 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53  r = sqlite3ExprS
30d50 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4f 72 64 65  kipCollate(pOrde
30d60 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  rBy->a[i].pExpr)
30d70 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 42 45  ;.      if( pOBE
30d80 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55  xpr->op!=TK_COLU
30d90 4d 4e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  MN ) continue;. 
30da0 20 20 20 20 20 69 66 28 20 70 4f 42 45 78 70 72       if( pOBExpr
30db0 2d 3e 69 54 61 62 6c 65 21 3d 69 43 75 72 20 29  ->iTable!=iCur )
30dc0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
30dd0 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54 65 72   pTerm = findTer
30de0 6d 28 26 70 57 49 6e 66 6f 2d 3e 73 57 43 2c 20  m(&pWInfo->sWC, 
30df0 69 43 75 72 2c 20 70 4f 42 45 78 70 72 2d 3e 69  iCur, pOBExpr->i
30e00 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 20  Column,.        
30e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7e                 ~
30e20 72 65 61 64 79 2c 20 57 4f 5f 45 51 7c 57 4f 5f  ready, WO_EQ|WO_
30e30 49 53 4e 55 4c 4c 2c 20 30 29 3b 0a 20 20 20 20  ISNULL, 0);.    
30e40 20 20 69 66 28 20 70 54 65 72 6d 3d 3d 30 20 29    if( pTerm==0 )
30e50 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
30e60 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70   if( (pTerm->eOp
30e70 65 72 61 74 6f 72 26 57 4f 5f 45 51 29 21 3d 30  erator&WO_EQ)!=0
30e80 20 26 26 20 70 4f 42 45 78 70 72 2d 3e 69 43 6f   && pOBExpr->iCo
30e90 6c 75 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20 20 20  lumn>=0 ){.     
30ea0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
30eb0 31 2c 20 2a 7a 32 3b 0a 20 20 20 20 20 20 20 20  1, *z2;.        
30ec0 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
30ed0 78 70 72 43 6f 6c 6c 53 65 71 28 70 57 49 6e 66  xprCollSeq(pWInf
30ee0 6f 2d 3e 70 50 61 72 73 65 2c 20 70 4f 72 64 65  o->pParse, pOrde
30ef0 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  rBy->a[i].pExpr)
30f00 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70  ;.        if( !p
30f10 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64  Coll ) pColl = d
30f20 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20  b->pDfltColl;.  
30f30 20 20 20 20 20 20 7a 31 20 3d 20 70 43 6f 6c 6c        z1 = pColl
30f40 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ->zName;.       
30f50 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
30f60 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 57 49 6e  ExprCollSeq(pWIn
30f70 66 6f 2d 3e 70 50 61 72 73 65 2c 20 70 54 65 72  fo->pParse, pTer
30f80 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  m->pExpr);.     
30f90 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 20     if( !pColl ) 
30fa0 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c  pColl = db->pDfl
30fb0 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 7a  tColl;.        z
30fc0 32 20 3d 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  2 = pColl->zName
30fd0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  ;.        if( sq
30fe0 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 31 2c  lite3StrICmp(z1,
30ff0 20 7a 32 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e   z2)!=0 ) contin
31000 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ue;.      }.    
31010 20 20 6f 62 53 61 74 20 7c 3d 20 4d 41 53 4b 42    obSat |= MASKB
31020 49 54 28 69 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  IT(i);.    }..  
31030 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73    if( (pLoop->ws
31040 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e  Flags & WHERE_ON
31050 45 52 4f 57 29 3d 3d 30 20 29 7b 0a 20 20 20 20  EROW)==0 ){.    
31060 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46    if( pLoop->wsF
31070 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 50 4b  lags & WHERE_IPK
31080 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 64   ){.        pInd
31090 65 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ex = 0;.        
310a0 6e 4b 65 79 43 6f 6c 20 3d 20 30 3b 0a 20 20 20  nKeyCol = 0;.   
310b0 20 20 20 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 31       nColumn = 1
310c0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
310d0 28 20 28 70 49 6e 64 65 78 20 3d 20 70 4c 6f 6f  ( (pIndex = pLoo
310e0 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
310f0 78 29 3d 3d 30 20 7c 7c 20 70 49 6e 64 65 78 2d  x)==0 || pIndex-
31100 3e 62 55 6e 6f 72 64 65 72 65 64 20 29 7b 0a 20  >bUnordered ){. 
31110 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b         return 0;
31120 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
31130 20 20 20 20 20 20 6e 4b 65 79 43 6f 6c 20 3d 20        nKeyCol = 
31140 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 3b  pIndex->nKeyCol;
31150 0a 20 20 20 20 20 20 20 20 6e 43 6f 6c 75 6d 6e  .        nColumn
31160 20 3d 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75   = pIndex->nColu
31170 6d 6e 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  mn;.        asse
31180 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 6e 4b 65  rt( nColumn==nKe
31190 79 43 6f 6c 2b 31 20 7c 7c 20 21 48 61 73 52 6f  yCol+1 || !HasRo
311a0 77 69 64 28 70 49 6e 64 65 78 2d 3e 70 54 61 62  wid(pIndex->pTab
311b0 6c 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 61  le) );.        a
311c0 73 73 65 72 74 28 20 70 49 6e 64 65 78 2d 3e 61  ssert( pIndex->a
311d0 69 43 6f 6c 75 6d 6e 5b 6e 43 6f 6c 75 6d 6e 2d  iColumn[nColumn-
311e0 31 5d 3d 3d 28 2d 31 29 20 7c 7c 20 21 48 61 73  1]==(-1) || !Has
311f0 52 6f 77 69 64 28 70 49 6e 64 65 78 2d 3e 70 54  Rowid(pIndex->pT
31200 61 62 6c 65 29 29 3b 0a 20 20 20 20 20 20 20 20  able));.        
31210 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20  isOrderDistinct 
31220 3d 20 49 73 55 6e 69 71 75 65 49 6e 64 65 78 28  = IsUniqueIndex(
31230 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 7d  pIndex);.      }
31240 0a 0a 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20  ..      /* Loop 
31250 74 68 72 6f 75 67 68 20 61 6c 6c 20 63 6f 6c 75  through all colu
31260 6d 6e 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78  mns of the index
31270 20 61 6e 64 20 64 65 61 6c 20 77 69 74 68 20 74   and deal with t
31280 68 65 20 6f 6e 65 73 0a 20 20 20 20 20 20 2a 2a  he ones.      **
31290 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20 63 6f   that are not co
312a0 6e 73 74 72 61 69 6e 65 64 20 62 79 20 3d 3d 20  nstrained by == 
312b0 6f 72 20 49 4e 2e 0a 20 20 20 20 20 20 2a 2f 0a  or IN..      */.
312c0 20 20 20 20 20 20 72 65 76 20 3d 20 72 65 76 53        rev = revS
312d0 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 64 69  et = 0;.      di
312e0 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 20 3d 20  stinctColumns = 
312f0 30 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  0;.      for(j=0
31300 3b 20 6a 3c 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b  ; j<nColumn; j++
31310 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20 62 4f  ){.        u8 bO
31320 6e 63 65 3b 20 20 20 2f 2a 20 54 72 75 65 20 74  nce;   /* True t
31330 6f 20 72 75 6e 20 74 68 65 20 4f 52 44 45 52 20  o run the ORDER 
31340 42 59 20 73 65 61 72 63 68 20 6c 6f 6f 70 20 2a  BY search loop *
31350 2f 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 6b  /..        /* Sk
31360 69 70 20 6f 76 65 72 20 3d 3d 20 61 6e 64 20 49  ip over == and I
31370 53 20 4e 55 4c 4c 20 74 65 72 6d 73 20 2a 2f 0a  S NULL terms */.
31380 20 20 20 20 20 20 20 20 69 66 28 20 6a 3c 70 4c          if( j<pL
31390 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  oop->u.btree.nEq
313a0 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 4c 6f  .         && pLo
313b0 6f 70 2d 3e 6e 53 6b 69 70 3d 3d 30 0a 20 20 20  op->nSkip==0.   
313c0 20 20 20 20 20 20 26 26 20 28 28 69 20 3d 20 70        && ((i = p
313d0 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 2d  Loop->aLTerm[j]-
313e0 3e 65 4f 70 65 72 61 74 6f 72 29 20 26 20 28 57  >eOperator) & (W
313f0 4f 5f 45 51 7c 57 4f 5f 49 53 4e 55 4c 4c 29 29  O_EQ|WO_ISNULL))
31400 21 3d 30 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  !=0.        ){. 
31410 20 20 20 20 20 20 20 20 20 69 66 28 20 69 20 26           if( i &
31420 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20   WO_ISNULL ){.  
31430 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
31440 73 65 28 20 69 73 4f 72 64 65 72 44 69 73 74 69  se( isOrderDisti
31450 6e 63 74 20 29 3b 0a 20 20 20 20 20 20 20 20 20  nct );.         
31460 20 20 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e     isOrderDistin
31470 63 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ct = 0;.        
31480 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 63 6f    }.          co
31490 6e 74 69 6e 75 65 3b 20 20 0a 20 20 20 20 20 20  ntinue;  .      
314a0 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20    }..        /* 
314b0 47 65 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  Get the column n
314c0 75 6d 62 65 72 20 69 6e 20 74 68 65 20 74 61 62  umber in the tab
314d0 6c 65 20 28 69 43 6f 6c 75 6d 6e 29 20 61 6e 64  le (iColumn) and
314e0 20 73 6f 72 74 20 6f 72 64 65 72 0a 20 20 20 20   sort order.    
314f0 20 20 20 20 2a 2a 20 28 72 65 76 49 64 78 29 20      ** (revIdx) 
31500 66 6f 72 20 74 68 65 20 6a 2d 74 68 20 63 6f 6c  for the j-th col
31510 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64 65 78  umn of the index
31520 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
31530 20 20 20 20 20 69 66 28 20 70 49 6e 64 65 78 20       if( pIndex 
31540 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 43 6f  ){.          iCo
31550 6c 75 6d 6e 20 3d 20 70 49 6e 64 65 78 2d 3e 61  lumn = pIndex->a
31560 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20  iColumn[j];.    
31570 20 20 20 20 20 20 72 65 76 49 64 78 20 3d 20 70        revIdx = p
31580 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65  Index->aSortOrde
31590 72 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  r[j];.          
315a0 69 66 28 20 69 43 6f 6c 75 6d 6e 3d 3d 70 49 6e  if( iColumn==pIn
315b0 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 69 50 4b  dex->pTable->iPK
315c0 65 79 20 29 20 69 43 6f 6c 75 6d 6e 20 3d 20 2d  ey ) iColumn = -
315d0 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  1;.        }else
315e0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 43 6f 6c  {.          iCol
315f0 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  umn = -1;.      
31600 20 20 20 20 72 65 76 49 64 78 20 3d 20 30 3b 0a      revIdx = 0;.
31610 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
31620 20 20 20 2f 2a 20 41 6e 20 75 6e 63 6f 6e 73 74     /* An unconst
31630 72 61 69 6e 65 64 20 63 6f 6c 75 6d 6e 20 74 68  rained column th
31640 61 74 20 6d 69 67 68 74 20 62 65 20 4e 55 4c 4c  at might be NULL
31650 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 69 73   means that this
31660 0a 20 20 20 20 20 20 20 20 2a 2a 20 57 68 65 72  .        ** Wher
31670 65 4c 6f 6f 70 20 69 73 20 6e 6f 74 20 77 65 6c  eLoop is not wel
31680 6c 2d 6f 72 64 65 72 65 64 0a 20 20 20 20 20 20  l-ordered.      
31690 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
316a0 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74   isOrderDistinct
316b0 0a 20 20 20 20 20 20 20 20 20 26 26 20 69 43 6f  .         && iCo
316c0 6c 75 6d 6e 3e 3d 30 0a 20 20 20 20 20 20 20 20  lumn>=0.        
316d0 20 26 26 20 6a 3e 3d 70 4c 6f 6f 70 2d 3e 75 2e   && j>=pLoop->u.
316e0 62 74 72 65 65 2e 6e 45 71 0a 20 20 20 20 20 20  btree.nEq.      
316f0 20 20 20 26 26 20 70 49 6e 64 65 78 2d 3e 70 54     && pIndex->pT
31700 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 75  able->aCol[iColu
31710 6d 6e 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 0a 20  mn].notNull==0. 
31720 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
31730 20 20 20 20 69 73 4f 72 64 65 72 44 69 73 74 69      isOrderDisti
31740 6e 63 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  nct = 0;.       
31750 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 46   }..        /* F
31760 69 6e 64 20 74 68 65 20 4f 52 44 45 52 20 42 59  ind the ORDER BY
31770 20 74 65 72 6d 20 74 68 61 74 20 63 6f 72 72 65   term that corre
31780 73 70 6f 6e 64 73 20 74 6f 20 74 68 65 20 6a 2d  sponds to the j-
31790 74 68 20 63 6f 6c 75 6d 6e 0a 20 20 20 20 20 20  th column.      
317a0 20 20 2a 2a 20 6f 66 20 74 68 65 20 69 6e 64 65    ** of the inde
317b0 78 20 61 6e 64 20 6d 61 72 6b 20 74 68 61 74 20  x and mark that 
317c0 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20 6f 66  ORDER BY term of
317d0 66 20 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  f .        */.  
317e0 20 20 20 20 20 20 62 4f 6e 63 65 20 3d 20 31 3b        bOnce = 1;
317f0 0a 20 20 20 20 20 20 20 20 69 73 4d 61 74 63 68  .        isMatch
31800 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 66 6f   = 0;.        fo
31810 72 28 69 3d 30 3b 20 62 4f 6e 63 65 20 26 26 20  r(i=0; bOnce && 
31820 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29  i<nOrderBy; i++)
31830 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
31840 4d 41 53 4b 42 49 54 28 69 29 20 26 20 6f 62 53  MASKBIT(i) & obS
31850 61 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  at ) continue;. 
31860 20 20 20 20 20 20 20 20 20 70 4f 42 45 78 70 72           pOBExpr
31870 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b   = sqlite3ExprSk
31880 69 70 43 6f 6c 6c 61 74 65 28 70 4f 72 64 65 72  ipCollate(pOrder
31890 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b  By->a[i].pExpr);
318a0 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
318b0 61 73 65 28 20 77 63 74 72 6c 46 6c 61 67 73 20  ase( wctrlFlags 
318c0 26 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20  & WHERE_GROUPBY 
318d0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73  );.          tes
318e0 74 63 61 73 65 28 20 77 63 74 72 6c 46 6c 61 67  tcase( wctrlFlag
318f0 73 20 26 20 57 48 45 52 45 5f 44 49 53 54 49 4e  s & WHERE_DISTIN
31900 43 54 42 59 20 29 3b 0a 20 20 20 20 20 20 20 20  CTBY );.        
31910 20 20 69 66 28 20 28 77 63 74 72 6c 46 6c 61 67    if( (wctrlFlag
31920 73 20 26 20 28 57 48 45 52 45 5f 47 52 4f 55 50  s & (WHERE_GROUP
31930 42 59 7c 57 48 45 52 45 5f 44 49 53 54 49 4e 43  BY|WHERE_DISTINC
31940 54 42 59 29 29 3d 3d 30 20 29 20 62 4f 6e 63 65  TBY))==0 ) bOnce
31950 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
31960 69 66 28 20 70 4f 42 45 78 70 72 2d 3e 6f 70 21  if( pOBExpr->op!
31970 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 63 6f 6e  =TK_COLUMN ) con
31980 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
31990 20 69 66 28 20 70 4f 42 45 78 70 72 2d 3e 69 54   if( pOBExpr->iT
319a0 61 62 6c 65 21 3d 69 43 75 72 20 29 20 63 6f 6e  able!=iCur ) con
319b0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
319c0 20 69 66 28 20 70 4f 42 45 78 70 72 2d 3e 69 43   if( pOBExpr->iC
319d0 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 75 6d 6e 20 29  olumn!=iColumn )
319e0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
319f0 20 20 20 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e       if( iColumn
31a00 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  >=0 ){.         
31a10 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
31a20 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 57  e3ExprCollSeq(pW
31a30 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2c 20 70 4f  Info->pParse, pO
31a40 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78  rderBy->a[i].pEx
31a50 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  pr);.           
31a60 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 20 70 43   if( !pColl ) pC
31a70 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43  oll = db->pDfltC
31a80 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20  oll;.           
31a90 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
31aa0 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  Cmp(pColl->zName
31ab0 2c 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c  , pIndex->azColl
31ac0 5b 6a 5d 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e  [j])!=0 ) contin
31ad0 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ue;.          }.
31ae0 20 20 20 20 20 20 20 20 20 20 69 73 4d 61 74 63            isMatc
31af0 68 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  h = 1;.         
31b00 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
31b10 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 73  }.        if( is
31b20 4d 61 74 63 68 20 26 26 20 28 77 63 74 72 6c 46  Match && (wctrlF
31b30 6c 61 67 73 20 26 20 57 48 45 52 45 5f 47 52 4f  lags & WHERE_GRO
31b40 55 50 42 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20  UPBY)==0 ){.    
31b50 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75        /* Make su
31b60 72 65 20 74 68 65 20 73 6f 72 74 20 6f 72 64 65  re the sort orde
31b70 72 20 69 73 20 63 6f 6d 70 61 74 69 62 6c 65 20  r is compatible 
31b80 69 6e 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  in an ORDER BY c
31b90 6c 61 75 73 65 2e 0a 20 20 20 20 20 20 20 20 20  lause..         
31ba0 20 2a 2a 20 53 6f 72 74 20 6f 72 64 65 72 20 69   ** Sort order i
31bb0 73 20 69 72 72 65 6c 65 76 61 6e 74 20 66 6f 72  s irrelevant for
31bc0 20 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75   a GROUP BY clau
31bd0 73 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  se. */.         
31be0 20 69 66 28 20 72 65 76 53 65 74 20 29 7b 0a 20   if( revSet ){. 
31bf0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28             if( (
31c00 72 65 76 20 5e 20 72 65 76 49 64 78 29 21 3d 70  rev ^ revIdx)!=p
31c10 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f  OrderBy->a[i].so
31c20 72 74 4f 72 64 65 72 20 29 20 69 73 4d 61 74 63  rtOrder ) isMatc
31c30 68 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  h = 0;.         
31c40 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
31c50 20 20 20 20 72 65 76 20 3d 20 72 65 76 49 64 78      rev = revIdx
31c60 20 5e 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69   ^ pOrderBy->a[i
31c70 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20  ].sortOrder;.   
31c80 20 20 20 20 20 20 20 20 20 69 66 28 20 72 65 76           if( rev
31c90 20 29 20 2a 70 52 65 76 4d 61 73 6b 20 7c 3d 20   ) *pRevMask |= 
31ca0 4d 41 53 4b 42 49 54 28 69 4c 6f 6f 70 29 3b 0a  MASKBIT(iLoop);.
31cb0 20 20 20 20 20 20 20 20 20 20 20 20 72 65 76 53              revS
31cc0 65 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  et = 1;.        
31cd0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
31ce0 20 20 20 20 20 20 69 66 28 20 69 73 4d 61 74 63        if( isMatc
31cf0 68 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  h ){.          i
31d00 66 28 20 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a  f( iColumn<0 ){.
31d10 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
31d20 63 61 73 65 28 20 64 69 73 74 69 6e 63 74 43 6f  case( distinctCo
31d30 6c 75 6d 6e 73 3d 3d 30 20 29 3b 0a 20 20 20 20  lumns==0 );.    
31d40 20 20 20 20 20 20 20 20 64 69 73 74 69 6e 63 74          distinct
31d50 43 6f 6c 75 6d 6e 73 20 3d 20 31 3b 0a 20 20 20  Columns = 1;.   
31d60 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
31d70 20 20 20 6f 62 53 61 74 20 7c 3d 20 4d 41 53 4b     obSat |= MASK
31d80 42 49 54 28 69 29 3b 0a 20 20 20 20 20 20 20 20  BIT(i);.        
31d90 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
31da0 20 2f 2a 20 4e 6f 20 6d 61 74 63 68 20 66 6f 75   /* No match fou
31db0 6e 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  nd */.          
31dc0 69 66 28 20 6a 3d 3d 30 20 7c 7c 20 6a 3c 6e 4b  if( j==0 || j<nK
31dd0 65 79 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20  eyCol ){.       
31de0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
31df0 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 21 3d  sOrderDistinct!=
31e00 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  0 );.           
31e10 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74   isOrderDistinct
31e20 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
31e30 7d 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  }.          brea
31e40 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
31e50 20 20 20 7d 20 2f 2a 20 65 6e 64 20 4c 6f 6f 70     } /* end Loop
31e60 20 6f 76 65 72 20 61 6c 6c 20 69 6e 64 65 78 20   over all index 
31e70 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 20  columns */.     
31e80 20 69 66 28 20 64 69 73 74 69 6e 63 74 43 6f 6c   if( distinctCol
31e90 75 6d 6e 73 20 29 7b 0a 20 20 20 20 20 20 20 20  umns ){.        
31ea0 74 65 73 74 63 61 73 65 28 20 69 73 4f 72 64 65  testcase( isOrde
31eb0 72 44 69 73 74 69 6e 63 74 3d 3d 30 20 29 3b 0a  rDistinct==0 );.
31ec0 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 44          isOrderD
31ed0 69 73 74 69 6e 63 74 20 3d 20 31 3b 0a 20 20 20  istinct = 1;.   
31ee0 20 20 20 7d 0a 20 20 20 20 7d 20 2f 2a 20 65 6e     }.    } /* en
31ef0 64 2d 69 66 20 6e 6f 74 20 6f 6e 65 2d 72 6f 77  d-if not one-row
31f00 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4d 61 72 6b   */..    /* Mark
31f10 20 6f 66 66 20 61 6e 79 20 6f 74 68 65 72 20 4f   off any other O
31f20 52 44 45 52 20 42 59 20 74 65 72 6d 73 20 74 68  RDER BY terms th
31f30 61 74 20 72 65 66 65 72 65 6e 63 65 20 70 4c 6f  at reference pLo
31f40 6f 70 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 73  op */.    if( is
31f50 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 29 7b  OrderDistinct ){
31f60 0a 20 20 20 20 20 20 6f 72 64 65 72 44 69 73 74  .      orderDist
31f70 69 6e 63 74 4d 61 73 6b 20 7c 3d 20 70 4c 6f 6f  inctMask |= pLoo
31f80 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20  p->maskSelf;.   
31f90 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f     for(i=0; i<nO
31fa0 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20  rderBy; i++){.  
31fb0 20 20 20 20 20 20 45 78 70 72 20 2a 70 3b 0a 20        Expr *p;. 
31fc0 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d         Bitmask m
31fd0 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 69 66  Term;.        if
31fe0 28 20 4d 41 53 4b 42 49 54 28 69 29 20 26 20 6f  ( MASKBIT(i) & o
31ff0 62 53 61 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b  bSat ) continue;
32000 0a 20 20 20 20 20 20 20 20 70 20 3d 20 70 4f 72  .        p = pOr
32010 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70  derBy->a[i].pExp
32020 72 3b 0a 20 20 20 20 20 20 20 20 6d 54 65 72 6d  r;.        mTerm
32030 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67   = exprTableUsag
32040 65 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b  e(&pWInfo->sMask
32050 53 65 74 2c 70 29 3b 0a 20 20 20 20 20 20 20 20  Set,p);.        
32060 69 66 28 20 6d 54 65 72 6d 3d 3d 30 20 26 26 20  if( mTerm==0 && 
32070 21 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f  !sqlite3ExprIsCo
32080 6e 73 74 61 6e 74 28 70 29 20 29 20 63 6f 6e 74  nstant(p) ) cont
32090 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66  inue;.        if
320a0 28 20 28 6d 54 65 72 6d 26 7e 6f 72 64 65 72 44  ( (mTerm&~orderD
320b0 69 73 74 69 6e 63 74 4d 61 73 6b 29 3d 3d 30 20  istinctMask)==0 
320c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6f 62 53  ){.          obS
320d0 61 74 20 7c 3d 20 4d 41 53 4b 42 49 54 28 69 29  at |= MASKBIT(i)
320e0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
320f0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20 2f 2a    }.    }.  } /*
32100 20 45 6e 64 20 74 68 65 20 6c 6f 6f 70 20 6f 76   End the loop ov
32110 65 72 20 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70  er all WhereLoop
32120 73 20 66 72 6f 6d 20 6f 75 74 65 72 2d 6d 6f 73  s from outer-mos
32130 74 20 64 6f 77 6e 20 74 6f 20 69 6e 6e 65 72 2d  t down to inner-
32140 6d 6f 73 74 20 2a 2f 0a 20 20 69 66 28 20 6f 62  most */.  if( ob
32150 53 61 74 3d 3d 6f 62 44 6f 6e 65 20 29 20 72 65  Sat==obDone ) re
32160 74 75 72 6e 20 28 69 38 29 6e 4f 72 64 65 72 42  turn (i8)nOrderB
32170 79 3b 0a 20 20 69 66 28 20 21 69 73 4f 72 64 65  y;.  if( !isOrde
32180 72 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20  rDistinct ){.   
32190 20 66 6f 72 28 69 3d 6e 4f 72 64 65 72 42 79 2d   for(i=nOrderBy-
321a0 31 3b 20 69 3e 30 3b 20 69 2d 2d 29 7b 0a 20 20  1; i>0; i--){.  
321b0 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 20 3d 20      Bitmask m = 
321c0 4d 41 53 4b 42 49 54 28 69 29 20 2d 20 31 3b 0a  MASKBIT(i) - 1;.
321d0 20 20 20 20 20 20 69 66 28 20 28 6f 62 53 61 74        if( (obSat
321e0 26 6d 29 3d 3d 6d 20 29 20 72 65 74 75 72 6e 20  &m)==m ) return 
321f0 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  i;.    }.    ret
32200 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 0;.  }.  ret
32210 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn -1;.}.../*.*
32220 2a 20 49 66 20 74 68 65 20 57 48 45 52 45 5f 47  * If the WHERE_G
32230 52 4f 55 50 42 59 20 66 6c 61 67 20 69 73 20 73  ROUPBY flag is s
32240 65 74 20 69 6e 20 74 68 65 20 6d 61 73 6b 20 70  et in the mask p
32250 61 73 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33  assed to sqlite3
32260 57 68 65 72 65 42 65 67 69 6e 28 29 2c 0a 2a 2a  WhereBegin(),.**
32270 20 74 68 65 20 70 6c 61 6e 6e 65 72 20 61 73 73   the planner ass
32280 75 6d 65 73 20 74 68 61 74 20 74 68 65 20 73 70  umes that the sp
32290 65 63 69 66 69 65 64 20 70 4f 72 64 65 72 42 79  ecified pOrderBy
322a0 20 6c 69 73 74 20 69 73 20 61 63 74 75 61 6c 6c   list is actuall
322b0 79 20 61 20 47 52 4f 55 50 0a 2a 2a 20 42 59 20  y a GROUP.** BY 
322c0 63 6c 61 75 73 65 20 2d 20 61 6e 64 20 73 6f 20  clause - and so 
322d0 61 6e 79 20 6f 72 64 65 72 20 74 68 61 74 20 67  any order that g
322e0 72 6f 75 70 73 20 72 6f 77 73 20 61 73 20 72 65  roups rows as re
322f0 71 75 69 72 65 64 20 73 61 74 69 73 66 69 65 73  quired satisfies
32300 20 74 68 65 0a 2a 2a 20 72 65 71 75 65 73 74 2e   the.** request.
32310 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c  .**.** Normally,
32320 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 69 74   in this case it
32330 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
32340 20 66 6f 72 20 74 68 65 20 63 61 6c 6c 65 72 20   for the caller 
32350 74 6f 20 64 65 74 65 72 6d 69 6e 65 0a 2a 2a 20  to determine.** 
32360 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
32370 68 65 20 72 6f 77 73 20 61 72 65 20 72 65 61 6c  he rows are real
32380 6c 79 20 62 65 69 6e 67 20 64 65 6c 69 76 65 72  ly being deliver
32390 65 64 20 69 6e 20 73 6f 72 74 65 64 20 6f 72 64  ed in sorted ord
323a0 65 72 2c 20 6f 72 0a 2a 2a 20 6a 75 73 74 20 69  er, or.** just i
323b0 6e 20 73 6f 6d 65 20 6f 74 68 65 72 20 6f 72 64  n some other ord
323c0 65 72 20 74 68 61 74 20 70 72 6f 76 69 64 65 73  er that provides
323d0 20 74 68 65 20 72 65 71 75 69 72 65 64 20 67 72   the required gr
323e0 6f 75 70 69 6e 67 2e 20 48 6f 77 65 76 65 72 2c  ouping. However,
323f0 0a 2a 2a 20 69 66 20 74 68 65 20 57 48 45 52 45  .** if the WHERE
32400 5f 53 4f 52 54 42 59 47 52 4f 55 50 20 66 6c 61  _SORTBYGROUP fla
32410 67 20 69 73 20 61 6c 73 6f 20 70 61 73 73 65 64  g is also passed
32420 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65   to sqlite3Where
32430 42 65 67 69 6e 28 29 2c 20 74 68 65 6e 0a 2a 2a  Begin(), then.**
32440 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d   this function m
32450 61 79 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20  ay be called on 
32460 74 68 65 20 72 65 74 75 72 6e 65 64 20 57 68 65  the returned Whe
32470 72 65 49 6e 66 6f 20 6f 62 6a 65 63 74 2e 20 49  reInfo object. I
32480 74 20 72 65 74 75 72 6e 73 0a 2a 2a 20 74 72 75  t returns.** tru
32490 65 20 69 66 20 74 68 65 20 72 6f 77 73 20 72 65  e if the rows re
324a0 61 6c 6c 79 20 77 69 6c 6c 20 62 65 20 73 6f 72  ally will be sor
324b0 74 65 64 20 69 6e 20 74 68 65 20 73 70 65 63 69  ted in the speci
324c0 66 69 65 64 20 6f 72 64 65 72 2c 20 6f 72 20 66  fied order, or f
324d0 61 6c 73 65 0a 2a 2a 20 6f 74 68 65 72 77 69 73  alse.** otherwis
324e0 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61  e..**.** For exa
324f0 6d 70 6c 65 2c 20 61 73 73 75 6d 69 6e 67 3a 0a  mple, assuming:.
32500 2a 2a 0a 2a 2a 20 20 20 43 52 45 41 54 45 20 49  **.**   CREATE I
32510 4e 44 45 58 20 69 31 20 4f 4e 20 74 31 28 78 2c  NDEX i1 ON t1(x,
32520 20 59 29 3b 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 0a   Y);.**.** then.
32530 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a  **.**   SELECT *
32540 20 46 52 4f 4d 20 74 31 20 47 52 4f 55 50 20 42   FROM t1 GROUP B
32550 59 20 78 2c 79 20 4f 52 44 45 52 20 42 59 20 78  Y x,y ORDER BY x
32560 2c 79 3b 20 20 20 2d 2d 20 49 73 53 6f 72 74 65  ,y;   -- IsSorte
32570 64 28 29 3d 3d 31 0a 2a 2a 20 20 20 53 45 4c 45  d()==1.**   SELE
32580 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 47 52 4f  CT * FROM t1 GRO
32590 55 50 20 42 59 20 79 2c 78 20 4f 52 44 45 52 20  UP BY y,x ORDER 
325a0 42 59 20 79 2c 78 3b 20 20 20 2d 2d 20 49 73 53  BY y,x;   -- IsS
325b0 6f 72 74 65 64 28 29 3d 3d 30 0a 2a 2f 0a 69 6e  orted()==0.*/.in
325c0 74 20 73 71 6c 69 74 65 33 57 68 65 72 65 49 73  t sqlite3WhereIs
325d0 53 6f 72 74 65 64 28 57 68 65 72 65 49 6e 66 6f  Sorted(WhereInfo
325e0 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 61 73 73   *pWInfo){.  ass
325f0 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 77 63 74  ert( pWInfo->wct
32600 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
32610 47 52 4f 55 50 42 59 20 29 3b 0a 20 20 61 73 73  GROUPBY );.  ass
32620 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 77 63 74  ert( pWInfo->wct
32630 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
32640 53 4f 52 54 42 59 47 52 4f 55 50 20 29 3b 0a 20  SORTBYGROUP );. 
32650 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 2d 3e   return pWInfo->
32660 73 6f 72 74 65 64 3b 0a 7d 0a 0a 23 69 66 64 65  sorted;.}..#ifde
32670 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  f WHERETRACE_ENA
32680 42 4c 45 44 0a 2f 2a 20 46 6f 72 20 64 65 62 75  BLED./* For debu
32690 67 67 69 6e 67 20 75 73 65 20 6f 6e 6c 79 3a 20  gging use only: 
326a0 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
326b0 63 68 61 72 20 2a 77 68 65 72 65 50 61 74 68 4e  char *wherePathN
326c0 61 6d 65 28 57 68 65 72 65 50 61 74 68 20 2a 70  ame(WherePath *p
326d0 50 61 74 68 2c 20 69 6e 74 20 6e 4c 6f 6f 70 2c  Path, int nLoop,
326e0 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 61 73   WhereLoop *pLas
326f0 74 29 7b 0a 20 20 73 74 61 74 69 63 20 63 68 61  t){.  static cha
32700 72 20 7a 4e 61 6d 65 5b 36 35 5d 3b 0a 20 20 69  r zName[65];.  i
32710 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
32720 20 69 3c 6e 4c 6f 6f 70 3b 20 69 2b 2b 29 7b 20   i<nLoop; i++){ 
32730 7a 4e 61 6d 65 5b 69 5d 20 3d 20 70 50 61 74 68  zName[i] = pPath
32740 2d 3e 61 4c 6f 6f 70 5b 69 5d 2d 3e 63 49 64 3b  ->aLoop[i]->cId;
32750 20 7d 0a 20 20 69 66 28 20 70 4c 61 73 74 20 29   }.  if( pLast )
32760 20 7a 4e 61 6d 65 5b 69 2b 2b 5d 20 3d 20 70 4c   zName[i++] = pL
32770 61 73 74 2d 3e 63 49 64 3b 0a 20 20 7a 4e 61 6d  ast->cId;.  zNam
32780 65 5b 69 5d 20 3d 20 30 3b 0a 20 20 72 65 74 75  e[i] = 0;.  retu
32790 72 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a 23 65 6e 64  rn zName;.}.#end
327a0 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  if../*.** Return
327b0 20 74 68 65 20 63 6f 73 74 20 6f 66 20 73 6f 72   the cost of sor
327c0 74 69 6e 67 20 6e 52 6f 77 20 72 6f 77 73 2c 20  ting nRow rows, 
327d0 61 73 73 75 6d 69 6e 67 20 74 68 61 74 20 74 68  assuming that th
327e0 65 20 6b 65 79 73 20 68 61 76 65 20 0a 2a 2a 20  e keys have .** 
327f0 6e 4f 72 64 65 72 62 79 20 63 6f 6c 75 6d 6e 73  nOrderby columns
32800 20 61 6e 64 20 74 68 61 74 20 74 68 65 20 66 69   and that the fi
32810 72 73 74 20 6e 53 6f 72 74 65 64 20 63 6f 6c 75  rst nSorted colu
32820 6d 6e 73 20 61 72 65 20 61 6c 72 65 61 64 79 20  mns are already 
32830 69 6e 0a 2a 2a 20 6f 72 64 65 72 2e 0a 2a 2f 0a  in.** order..*/.
32840 73 74 61 74 69 63 20 4c 6f 67 45 73 74 20 77 68  static LogEst wh
32850 65 72 65 53 6f 72 74 69 6e 67 43 6f 73 74 28 0a  ereSortingCost(.
32860 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
32870 6e 66 6f 2c 0a 20 20 4c 6f 67 45 73 74 20 6e 52  nfo,.  LogEst nR
32880 6f 77 2c 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72  ow,.  int nOrder
32890 42 79 2c 0a 20 20 69 6e 74 20 6e 53 6f 72 74 65  By,.  int nSorte
328a0 64 0a 29 7b 0a 20 20 2f 2a 20 54 55 4e 49 4e 47  d.){.  /* TUNING
328b0 3a 20 45 73 74 69 6d 61 74 65 64 20 63 6f 73 74  : Estimated cost
328c0 20 6f 66 20 61 20 66 75 6c 6c 20 65 78 74 65 72   of a full exter
328d0 6e 61 6c 20 73 6f 72 74 2c 20 77 68 65 72 65 20  nal sort, where 
328e0 4e 20 69 73 20 0a 20 20 2a 2a 20 74 68 65 20 6e  N is .  ** the n
328f0 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74 6f  umber of rows to
32900 20 73 6f 72 74 20 69 73 3a 0a 20 20 2a 2a 0a 20   sort is:.  **. 
32910 20 2a 2a 20 20 20 63 6f 73 74 20 3d 20 28 33 2e   **   cost = (3.
32920 30 20 2a 20 4e 20 2a 20 6c 6f 67 28 4e 29 29 2e  0 * N * log(N)).
32930 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 4f 72 2c 20  .  ** .  ** Or, 
32940 69 66 20 74 68 65 20 6f 72 64 65 72 2d 62 79 20  if the order-by 
32950 63 6c 61 75 73 65 20 68 61 73 20 58 20 74 65 72  clause has X ter
32960 6d 73 20 62 75 74 20 6f 6e 6c 79 20 74 68 65 20  ms but only the 
32970 6c 61 73 74 20 59 20 0a 20 20 2a 2a 20 74 65 72  last Y .  ** ter
32980 6d 73 20 61 72 65 20 6f 75 74 20 6f 66 20 6f 72  ms are out of or
32990 64 65 72 2c 20 74 68 65 6e 20 62 6c 6f 63 6b 2d  der, then block-
329a0 73 6f 72 74 69 6e 67 20 77 69 6c 6c 20 72 65 64  sorting will red
329b0 75 63 65 20 74 68 65 20 0a 20 20 2a 2a 20 73 6f  uce the .  ** so
329c0 72 74 69 6e 67 20 63 6f 73 74 20 74 6f 3a 0a 20  rting cost to:. 
329d0 20 2a 2a 0a 20 20 2a 2a 20 20 20 63 6f 73 74 20   **.  **   cost 
329e0 3d 20 28 33 2e 30 20 2a 20 4e 20 2a 20 6c 6f 67  = (3.0 * N * log
329f0 28 4e 29 29 20 2a 20 28 59 2f 58 29 0a 20 20 2a  (N)) * (Y/X).  *
32a00 2a 0a 20 20 2a 2a 20 54 68 65 20 28 59 2f 58 29  *.  ** The (Y/X)
32a10 20 74 65 72 6d 20 69 73 20 69 6d 70 6c 65 6d 65   term is impleme
32a20 6e 74 65 64 20 75 73 69 6e 67 20 73 74 61 63 6b  nted using stack
32a30 20 76 61 72 69 61 62 6c 65 20 72 53 63 61 6c 65   variable rScale
32a40 0a 20 20 2a 2a 20 62 65 6c 6f 77 2e 20 20 2a 2f  .  ** below.  */
32a50 0a 20 20 4c 6f 67 45 73 74 20 72 53 63 61 6c 65  .  LogEst rScale
32a60 2c 20 72 53 6f 72 74 43 6f 73 74 3b 0a 20 20 61  , rSortCost;.  a
32a70 73 73 65 72 74 28 20 6e 4f 72 64 65 72 42 79 3e  ssert( nOrderBy>
32a80 30 20 26 26 20 36 36 3d 3d 73 71 6c 69 74 65 33  0 && 66==sqlite3
32a90 4c 6f 67 45 73 74 28 31 30 30 29 20 29 3b 0a 20  LogEst(100) );. 
32aa0 20 72 53 63 61 6c 65 20 3d 20 73 71 6c 69 74 65   rScale = sqlite
32ab0 33 4c 6f 67 45 73 74 28 28 6e 4f 72 64 65 72 42  3LogEst((nOrderB
32ac0 79 2d 6e 53 6f 72 74 65 64 29 2a 31 30 30 2f 6e  y-nSorted)*100/n
32ad0 4f 72 64 65 72 42 79 29 20 2d 20 36 36 3b 0a 20  OrderBy) - 66;. 
32ae0 20 72 53 6f 72 74 43 6f 73 74 20 3d 20 6e 52 6f   rSortCost = nRo
32af0 77 20 2b 20 65 73 74 4c 6f 67 28 6e 52 6f 77 29  w + estLog(nRow)
32b00 20 2b 20 72 53 63 61 6c 65 20 2b 20 31 36 3b 0a   + rScale + 16;.
32b10 0a 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 54 68  .  /* TUNING: Th
32b20 65 20 63 6f 73 74 20 6f 66 20 69 6d 70 6c 65 6d  e cost of implem
32b30 65 6e 74 69 6e 67 20 44 49 53 54 49 4e 43 54 20  enting DISTINCT 
32b40 75 73 69 6e 67 20 61 20 42 2d 54 52 45 45 20 69  using a B-TREE i
32b50 73 0a 20 20 2a 2a 20 73 69 6d 69 6c 61 72 20 62  s.  ** similar b
32b60 75 74 20 77 69 74 68 20 61 20 6c 61 72 67 65 72  ut with a larger
32b70 20 63 6f 6e 73 74 61 6e 74 20 6f 66 20 70 72 6f   constant of pro
32b80 70 6f 72 74 69 6f 6e 61 6c 69 74 79 2e 20 0a 20  portionality. . 
32b90 20 2a 2a 20 4d 75 6c 74 69 70 6c 79 20 62 79 20   ** Multiply by 
32ba0 61 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20 66 61  an additional fa
32bb0 63 74 6f 72 20 6f 66 20 33 2e 30 2e 20 20 2a 2f  ctor of 3.0.  */
32bc0 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 77  .  if( pWInfo->w
32bd0 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
32be0 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 20  E_WANT_DISTINCT 
32bf0 29 7b 0a 20 20 20 20 72 53 6f 72 74 43 6f 73 74  ){.    rSortCost
32c00 20 2b 3d 20 31 36 3b 0a 20 20 7d 0a 0a 20 20 72   += 16;.  }..  r
32c10 65 74 75 72 6e 20 72 53 6f 72 74 43 6f 73 74 3b  eturn rSortCost;
32c20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  .}../*.** Given 
32c30 74 68 65 20 6c 69 73 74 20 6f 66 20 57 68 65 72  the list of Wher
32c40 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 61 74  eLoop objects at
32c50 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 2c   pWInfo->pLoops,
32c60 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
32c70 20 61 74 74 65 6d 70 74 73 20 74 6f 20 66 69 6e   attempts to fin
32c80 64 20 74 68 65 20 6c 6f 77 65 73 74 20 63 6f 73  d the lowest cos
32c90 74 20 70 61 74 68 20 74 68 61 74 20 76 69 73 69  t path that visi
32ca0 74 73 20 65 61 63 68 20 57 68 65 72 65 4c 6f 6f  ts each WhereLoo
32cb0 70 0a 2a 2a 20 6f 6e 63 65 2e 20 20 54 68 69 73  p.** once.  This
32cc0 20 70 61 74 68 20 69 73 20 74 68 65 6e 20 6c 6f   path is then lo
32cd0 61 64 65 64 20 69 6e 74 6f 20 74 68 65 20 70 57  aded into the pW
32ce0 49 6e 66 6f 2d 3e 61 5b 5d 2e 70 57 4c 6f 6f 70  Info->a[].pWLoop
32cf0 20 66 69 65 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 41   fields..**.** A
32d00 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 20 74  ssume that the t
32d10 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6f  otal number of o
32d20 75 74 70 75 74 20 72 6f 77 73 20 74 68 61 74 20  utput rows that 
32d30 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 62 65 20  will need to be 
32d40 73 6f 72 74 65 64 0a 2a 2a 20 77 69 6c 6c 20 62  sorted.** will b
32d50 65 20 6e 52 6f 77 45 73 74 20 28 69 6e 20 74 68  e nRowEst (in th
32d60 65 20 31 30 2a 6c 6f 67 32 20 72 65 70 72 65 73  e 10*log2 repres
32d70 65 6e 74 61 74 69 6f 6e 29 2e 20 20 4f 72 2c 20  entation).  Or, 
32d80 69 67 6e 6f 72 65 20 73 6f 72 74 69 6e 67 0a 2a  ignore sorting.*
32d90 2a 20 63 6f 73 74 73 20 69 66 20 6e 52 6f 77 45  * costs if nRowE
32da0 73 74 3d 3d 30 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  st==0..**.** Ret
32db0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
32dc0 20 73 75 63 63 65 73 73 20 6f 72 20 53 51 4c 49   success or SQLI
32dd0 54 45 5f 4e 4f 4d 45 4d 20 6f 66 20 61 20 6d 65  TE_NOMEM of a me
32de0 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a  mory allocation.
32df0 2a 2a 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e  ** error occurs.
32e00 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
32e10 68 65 72 65 50 61 74 68 53 6f 6c 76 65 72 28 57  herePathSolver(W
32e20 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
32e30 2c 20 4c 6f 67 45 73 74 20 6e 52 6f 77 45 73 74  , LogEst nRowEst
32e40 29 7b 0a 20 20 69 6e 74 20 6d 78 43 68 6f 69 63  ){.  int mxChoic
32e50 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e;             /
32e60 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  * Maximum number
32e70 20 6f 66 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73   of simultaneous
32e80 20 70 61 74 68 73 20 74 72 61 63 6b 65 64 20 2a   paths tracked *
32e90 2f 0a 20 20 69 6e 74 20 6e 4c 6f 6f 70 3b 20 20  /.  int nLoop;  
32ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
32eb0 20 4e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73   Number of terms
32ec0 20 69 6e 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a   in the join */.
32ed0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b    Parse *pParse;
32ee0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
32ef0 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
32f00 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  /.  sqlite3 *db;
32f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
32f20 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   The database co
32f30 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  nnection */.  in
32f40 74 20 69 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20  t iLoop;        
32f50 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
32f60 63 6f 75 6e 74 65 72 20 6f 76 65 72 20 74 68 65  counter over the
32f70 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 6a 6f   terms of the jo
32f80 69 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 69 2c 20  in */.  int ii, 
32f90 6a 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  jj;             
32fa0 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
32fb0 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 49 20  rs */.  int mxI 
32fc0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
32fd0 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 6e 65    /* Index of ne
32fe0 78 74 20 65 6e 74 72 79 20 74 6f 20 72 65 70 6c  xt entry to repl
32ff0 61 63 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 72  ace */.  int nOr
33000 64 65 72 42 79 3b 20 20 20 20 20 20 20 20 20 20  derBy;          
33010 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
33020 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
33030 74 65 72 6d 73 20 2a 2f 0a 20 20 4c 6f 67 45 73  terms */.  LogEs
33040 74 20 6d 78 43 6f 73 74 20 3d 20 30 3b 20 20 20  t mxCost = 0;   
33050 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20       /* Maximum 
33060 63 6f 73 74 20 6f 66 20 61 20 73 65 74 20 6f 66  cost of a set of
33070 20 70 61 74 68 73 20 2a 2f 0a 20 20 4c 6f 67 45   paths */.  LogE
33080 73 74 20 6d 78 55 6e 73 6f 72 74 65 64 20 3d 20  st mxUnsorted = 
33090 30 3b 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d  0;    /* Maximum
330a0 20 75 6e 73 6f 72 74 65 64 20 63 6f 73 74 20 6f   unsorted cost o
330b0 66 20 61 20 73 65 74 20 6f 66 20 70 61 74 68 20  f a set of path 
330c0 2a 2f 0a 20 20 69 6e 74 20 6e 54 6f 2c 20 6e 46  */.  int nTo, nF
330d0 72 6f 6d 3b 20 20 20 20 20 20 20 20 20 20 20 2f  rom;           /
330e0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 76 61 6c 69  * Number of vali
330f0 64 20 65 6e 74 72 69 65 73 20 69 6e 20 61 54 6f  d entries in aTo
33100 5b 5d 20 61 6e 64 20 61 46 72 6f 6d 5b 5d 20 2a  [] and aFrom[] *
33110 2f 0a 20 20 57 68 65 72 65 50 61 74 68 20 2a 61  /.  WherePath *a
33120 46 72 6f 6d 3b 20 20 20 20 20 20 20 20 20 2f 2a  From;         /*
33130 20 41 6c 6c 20 6e 46 72 6f 6d 20 70 61 74 68 73   All nFrom paths
33140 20 61 74 20 74 68 65 20 70 72 65 76 69 6f 75 73   at the previous
33150 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 57 68 65 72   level */.  Wher
33160 65 50 61 74 68 20 2a 61 54 6f 3b 20 20 20 20 20  ePath *aTo;     
33170 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 54 6f        /* The nTo
33180 20 62 65 73 74 20 70 61 74 68 73 20 61 74 20 74   best paths at t
33190 68 65 20 63 75 72 72 65 6e 74 20 6c 65 76 65 6c  he current level
331a0 20 2a 2f 0a 20 20 57 68 65 72 65 50 61 74 68 20   */.  WherePath 
331b0 2a 70 46 72 6f 6d 3b 20 20 20 20 20 20 20 20 20  *pFrom;         
331c0 2f 2a 20 41 6e 20 65 6c 65 6d 65 6e 74 20 6f 66  /* An element of
331d0 20 61 46 72 6f 6d 5b 5d 20 74 68 61 74 20 77 65   aFrom[] that we
331e0 20 61 72 65 20 77 6f 72 6b 69 6e 67 20 6f 6e 20   are working on 
331f0 2a 2f 0a 20 20 57 68 65 72 65 50 61 74 68 20 2a  */.  WherePath *
33200 70 54 6f 3b 20 20 20 20 20 20 20 20 20 20 20 2f  pTo;           /
33210 2a 20 41 6e 20 65 6c 65 6d 65 6e 74 20 6f 66 20  * An element of 
33220 61 54 6f 5b 5d 20 74 68 61 74 20 77 65 20 61 72  aTo[] that we ar
33230 65 20 77 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f 0a  e working on */.
33240 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 57 4c    WhereLoop *pWL
33250 6f 6f 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f  oop;        /* O
33260 6e 65 20 6f 66 20 74 68 65 20 57 68 65 72 65 4c  ne of the WhereL
33270 6f 6f 70 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20  oop objects */. 
33280 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a 70 58 3b   WhereLoop **pX;
33290 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73             /* Us
332a0 65 64 20 74 6f 20 64 69 76 79 20 75 70 20 74 68  ed to divy up th
332b0 65 20 70 53 70 61 63 65 20 6d 65 6d 6f 72 79 20  e pSpace memory 
332c0 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 2a 61 53 6f  */.  LogEst *aSo
332d0 72 74 43 6f 73 74 20 3d 20 30 3b 20 20 20 20 2f  rtCost = 0;    /
332e0 2a 20 53 6f 72 74 69 6e 67 20 61 6e 64 20 70 61  * Sorting and pa
332f0 72 74 69 61 6c 20 73 6f 72 74 69 6e 67 20 63 6f  rtial sorting co
33300 73 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70  sts */.  char *p
33310 53 70 61 63 65 3b 20 20 20 20 20 20 20 20 20 20  Space;          
33320 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20     /* Temporary 
33330 6d 65 6d 6f 72 79 20 75 73 65 64 20 62 79 20 74  memory used by t
33340 68 69 73 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20  his routine */. 
33350 20 69 6e 74 20 6e 53 70 61 63 65 3b 20 20 20 20   int nSpace;    
33360 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
33370 74 65 73 20 6f 66 20 73 70 61 63 65 20 61 6c 6c  tes of space all
33380 6f 63 61 74 65 64 20 61 74 20 70 53 70 61 63 65  ocated at pSpace
33390 20 2a 2f 0a 0a 20 20 70 50 61 72 73 65 20 3d 20   */..  pParse = 
333a0 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a  pWInfo->pParse;.
333b0 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64    db = pParse->d
333c0 62 3b 0a 20 20 6e 4c 6f 6f 70 20 3d 20 70 57 49  b;.  nLoop = pWI
333d0 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 0a 20 20 2f  nfo->nLevel;.  /
333e0 2a 20 54 55 4e 49 4e 47 3a 20 46 6f 72 20 73 69  * TUNING: For si
333f0 6d 70 6c 65 20 71 75 65 72 69 65 73 2c 20 6f 6e  mple queries, on
33400 6c 79 20 74 68 65 20 62 65 73 74 20 70 61 74 68  ly the best path
33410 20 69 73 20 74 72 61 63 6b 65 64 2e 0a 20 20 2a   is tracked..  *
33420 2a 20 46 6f 72 20 32 2d 77 61 79 20 6a 6f 69 6e  * For 2-way join
33430 73 2c 20 74 68 65 20 35 20 62 65 73 74 20 70 61  s, the 5 best pa
33440 74 68 73 20 61 72 65 20 66 6f 6c 6c 6f 77 65 64  ths are followed
33450 2e 0a 20 20 2a 2a 20 46 6f 72 20 6a 6f 69 6e 73  ..  ** For joins
33460 20 6f 66 20 33 20 6f 72 20 6d 6f 72 65 20 74 61   of 3 or more ta
33470 62 6c 65 73 2c 20 74 72 61 63 6b 20 74 68 65 20  bles, track the 
33480 31 30 20 62 65 73 74 20 70 61 74 68 73 20 2a 2f  10 best paths */
33490 0a 20 20 6d 78 43 68 6f 69 63 65 20 3d 20 28 6e  .  mxChoice = (n
334a0 4c 6f 6f 70 3c 3d 31 29 20 3f 20 31 20 3a 20 28  Loop<=1) ? 1 : (
334b0 6e 4c 6f 6f 70 3d 3d 32 20 3f 20 35 20 3a 20 31  nLoop==2 ? 5 : 1
334c0 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4c  0);.  assert( nL
334d0 6f 6f 70 3c 3d 70 57 49 6e 66 6f 2d 3e 70 54 61  oop<=pWInfo->pTa
334e0 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29 3b 0a 20  bList->nSrc );. 
334f0 20 57 48 45 52 45 54 52 41 43 45 28 30 78 30 30   WHERETRACE(0x00
33500 32 2c 20 28 22 2d 2d 2d 2d 20 62 65 67 69 6e 20  2, ("---- begin 
33510 73 6f 6c 76 65 72 2e 20 20 28 6e 52 6f 77 45 73  solver.  (nRowEs
33520 74 3d 25 64 29 5c 6e 22 2c 20 6e 52 6f 77 45 73  t=%d)\n", nRowEs
33530 74 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 6e 52  t));..  /* If nR
33540 6f 77 45 73 74 20 69 73 20 7a 65 72 6f 20 61 6e  owEst is zero an
33550 64 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52  d there is an OR
33560 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20 69  DER BY clause, i
33570 67 6e 6f 72 65 20 69 74 2e 20 49 6e 20 74 68 69  gnore it. In thi
33580 73 0a 20 20 2a 2a 20 63 61 73 65 20 74 68 65 20  s.  ** case the 
33590 70 75 72 70 6f 73 65 20 6f 66 20 74 68 69 73 20  purpose of this 
335a0 63 61 6c 6c 20 69 73 20 74 6f 20 65 73 74 69 6d  call is to estim
335b0 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ate the number o
335c0 66 20 72 6f 77 73 20 72 65 74 75 72 6e 65 64 0a  f rows returned.
335d0 20 20 2a 2a 20 62 79 20 74 68 65 20 6f 76 65 72    ** by the over
335e0 61 6c 6c 20 71 75 65 72 79 2e 20 4f 6e 63 65 20  all query. Once 
335f0 74 68 69 73 20 65 73 74 69 6d 61 74 65 20 68 61  this estimate ha
33600 73 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 2c  s been obtained,
33610 20 74 68 65 20 63 61 6c 6c 65 72 0a 20 20 2a 2a   the caller.  **
33620 20 77 69 6c 6c 20 69 6e 76 6f 6b 65 20 74 68 69   will invoke thi
33630 73 20 66 75 6e 63 74 69 6f 6e 20 61 20 73 65 63  s function a sec
33640 6f 6e 64 20 74 69 6d 65 2c 20 70 61 73 73 69 6e  ond time, passin
33650 67 20 74 68 65 20 65 73 74 69 6d 61 74 65 20 61  g the estimate a
33660 73 20 74 68 65 0a 20 20 2a 2a 20 6e 52 6f 77 45  s the.  ** nRowE
33670 73 74 20 70 61 72 61 6d 65 74 65 72 2e 20 20 2a  st parameter.  *
33680 2f 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e  /.  if( pWInfo->
33690 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20 6e  pOrderBy==0 || n
336a0 52 6f 77 45 73 74 3d 3d 30 20 29 7b 0a 20 20 20  RowEst==0 ){.   
336b0 20 6e 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20   nOrderBy = 0;. 
336c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4f 72 64   }else{.    nOrd
336d0 65 72 42 79 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  erBy = pWInfo->p
336e0 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a  OrderBy->nExpr;.
336f0 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61    }..  /* Alloca
33700 74 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a  te and initializ
33710 65 20 73 70 61 63 65 20 66 6f 72 20 61 54 6f 2c  e space for aTo,
33720 20 61 46 72 6f 6d 20 61 6e 64 20 61 53 6f 72 74   aFrom and aSort
33730 43 6f 73 74 5b 5d 20 2a 2f 0a 20 20 6e 53 70 61  Cost[] */.  nSpa
33740 63 65 20 3d 20 28 73 69 7a 65 6f 66 28 57 68 65  ce = (sizeof(Whe
33750 72 65 50 61 74 68 29 2b 73 69 7a 65 6f 66 28 57  rePath)+sizeof(W
33760 68 65 72 65 4c 6f 6f 70 2a 29 2a 6e 4c 6f 6f 70  hereLoop*)*nLoop
33770 29 2a 6d 78 43 68 6f 69 63 65 2a 32 3b 0a 20 20  )*mxChoice*2;.  
33780 6e 53 70 61 63 65 20 2b 3d 20 73 69 7a 65 6f 66  nSpace += sizeof
33790 28 4c 6f 67 45 73 74 29 20 2a 20 6e 4f 72 64 65  (LogEst) * nOrde
337a0 72 42 79 3b 0a 20 20 70 53 70 61 63 65 20 3d 20  rBy;.  pSpace = 
337b0 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
337c0 61 77 28 64 62 2c 20 6e 53 70 61 63 65 29 3b 0a  aw(db, nSpace);.
337d0 20 20 69 66 28 20 70 53 70 61 63 65 3d 3d 30 20    if( pSpace==0 
337e0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
337f0 4e 4f 4d 45 4d 3b 0a 20 20 61 54 6f 20 3d 20 28  NOMEM;.  aTo = (
33800 57 68 65 72 65 50 61 74 68 2a 29 70 53 70 61 63  WherePath*)pSpac
33810 65 3b 0a 20 20 61 46 72 6f 6d 20 3d 20 61 54 6f  e;.  aFrom = aTo
33820 2b 6d 78 43 68 6f 69 63 65 3b 0a 20 20 6d 65 6d  +mxChoice;.  mem
33830 73 65 74 28 61 46 72 6f 6d 2c 20 30 2c 20 73 69  set(aFrom, 0, si
33840 7a 65 6f 66 28 61 46 72 6f 6d 5b 30 5d 29 29 3b  zeof(aFrom[0]));
33850 0a 20 20 70 58 20 3d 20 28 57 68 65 72 65 4c 6f  .  pX = (WhereLo
33860 6f 70 2a 2a 29 28 61 46 72 6f 6d 2b 6d 78 43 68  op**)(aFrom+mxCh
33870 6f 69 63 65 29 3b 0a 20 20 66 6f 72 28 69 69 3d  oice);.  for(ii=
33880 6d 78 43 68 6f 69 63 65 2a 32 2c 20 70 46 72 6f  mxChoice*2, pFro
33890 6d 3d 61 54 6f 3b 20 69 69 3e 30 3b 20 69 69 2d  m=aTo; ii>0; ii-
338a0 2d 2c 20 70 46 72 6f 6d 2b 2b 2c 20 70 58 20 2b  -, pFrom++, pX +
338b0 3d 20 6e 4c 6f 6f 70 29 7b 0a 20 20 20 20 70 46  = nLoop){.    pF
338c0 72 6f 6d 2d 3e 61 4c 6f 6f 70 20 3d 20 70 58 3b  rom->aLoop = pX;
338d0 0a 20 20 7d 0a 20 20 69 66 28 20 6e 4f 72 64 65  .  }.  if( nOrde
338e0 72 42 79 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  rBy ){.    /* If
338f0 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44   there is an ORD
33900 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 6e 64  ER BY clause and
33910 20 69 74 20 69 73 20 6e 6f 74 20 62 65 69 6e 67   it is not being
33920 20 69 67 6e 6f 72 65 64 2c 20 73 65 74 20 75 70   ignored, set up
33930 0a 20 20 20 20 2a 2a 20 73 70 61 63 65 20 66 6f  .    ** space fo
33940 72 20 74 68 65 20 61 53 6f 72 74 43 6f 73 74 5b  r the aSortCost[
33950 5d 20 61 72 72 61 79 2e 20 45 61 63 68 20 65 6c  ] array. Each el
33960 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 61 53 6f  ement of the aSo
33970 72 74 43 6f 73 74 20 61 72 72 61 79 0a 20 20 20  rtCost array.   
33980 20 2a 2a 20 69 73 20 65 69 74 68 65 72 20 7a 65   ** is either ze
33990 72 6f 20 2d 20 6d 65 61 6e 69 6e 67 20 69 74 20  ro - meaning it 
339a0 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e  has not yet been
339b0 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 2d 20 6f   initialized - o
339c0 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 6f 73  r the.    ** cos
339d0 74 20 6f 66 20 73 6f 72 74 69 6e 67 20 6e 52 6f  t of sorting nRo
339e0 77 45 73 74 20 72 6f 77 73 20 6f 66 20 64 61 74  wEst rows of dat
339f0 61 20 77 68 65 72 65 20 74 68 65 20 66 69 72 73  a where the firs
33a00 74 20 58 20 74 65 72 6d 73 20 6f 66 0a 20 20 20  t X terms of.   
33a10 20 2a 2a 20 74 68 65 20 4f 52 44 45 52 20 42 59   ** the ORDER BY
33a20 20 63 6c 61 75 73 65 20 61 72 65 20 61 6c 72 65   clause are alre
33a30 61 64 79 20 69 6e 20 6f 72 64 65 72 2c 20 77 68  ady in order, wh
33a40 65 72 65 20 58 20 69 73 20 74 68 65 20 61 72 72  ere X is the arr
33a50 61 79 20 0a 20 20 20 20 2a 2a 20 69 6e 64 65 78  ay .    ** index
33a60 2e 20 20 2a 2f 0a 20 20 20 20 61 53 6f 72 74 43  .  */.    aSortC
33a70 6f 73 74 20 3d 20 28 4c 6f 67 45 73 74 2a 29 70  ost = (LogEst*)p
33a80 58 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 61 53  X;.    memset(aS
33a90 6f 72 74 43 6f 73 74 2c 20 30 2c 20 73 69 7a 65  ortCost, 0, size
33aa0 6f 66 28 4c 6f 67 45 73 74 29 20 2a 20 6e 4f 72  of(LogEst) * nOr
33ab0 64 65 72 42 79 29 3b 0a 20 20 7d 0a 20 20 61 73  derBy);.  }.  as
33ac0 73 65 72 74 28 20 61 53 6f 72 74 43 6f 73 74 3d  sert( aSortCost=
33ad0 3d 30 20 7c 7c 20 26 70 53 70 61 63 65 5b 6e 53  =0 || &pSpace[nS
33ae0 70 61 63 65 5d 3d 3d 28 63 68 61 72 2a 29 26 61  pace]==(char*)&a
33af0 53 6f 72 74 43 6f 73 74 5b 6e 4f 72 64 65 72 42  SortCost[nOrderB
33b00 79 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  y] );.  assert( 
33b10 61 53 6f 72 74 43 6f 73 74 21 3d 30 20 7c 7c 20  aSortCost!=0 || 
33b20 26 70 53 70 61 63 65 5b 6e 53 70 61 63 65 5d 3d  &pSpace[nSpace]=
33b30 3d 28 63 68 61 72 2a 29 70 58 20 29 3b 0a 0a 20  =(char*)pX );.. 
33b40 20 2f 2a 20 53 65 65 64 20 74 68 65 20 73 65 61   /* Seed the sea
33b50 72 63 68 20 77 69 74 68 20 61 20 73 69 6e 67 6c  rch with a singl
33b60 65 20 57 68 65 72 65 50 61 74 68 20 63 6f 6e 74  e WherePath cont
33b70 61 69 6e 69 6e 67 20 7a 65 72 6f 20 57 68 65 72  aining zero Wher
33b80 65 4c 6f 6f 70 73 2e 0a 20 20 2a 2a 0a 20 20 2a  eLoops..  **.  *
33b90 2a 20 54 55 4e 49 4e 47 3a 20 44 6f 20 6e 6f 74  * TUNING: Do not
33ba0 20 6c 65 74 20 74 68 65 20 6e 75 6d 62 65 72 20   let the number 
33bb0 6f 66 20 69 74 65 72 61 74 69 6f 6e 73 20 67 6f  of iterations go
33bc0 20 61 62 6f 76 65 20 32 35 2e 20 20 49 66 20 74   above 25.  If t
33bd0 68 65 20 63 6f 73 74 0a 20 20 2a 2a 20 6f 66 20  he cost.  ** of 
33be0 63 6f 6d 70 75 74 69 6e 67 20 61 6e 20 61 75 74  computing an aut
33bf0 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 69 73 20  omatic index is 
33c00 6e 6f 74 20 70 61 69 64 20 62 61 63 6b 20 77 69  not paid back wi
33c10 74 68 69 6e 20 74 68 65 20 66 69 72 73 74 20 32  thin the first 2
33c20 35 0a 20 20 2a 2a 20 72 6f 77 73 2c 20 74 68 65  5.  ** rows, the
33c30 6e 20 64 6f 20 6e 6f 74 20 75 73 65 20 74 68 65  n do not use the
33c40 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78   automatic index
33c50 2e 20 2a 2f 0a 20 20 61 46 72 6f 6d 5b 30 5d 2e  . */.  aFrom[0].
33c60 6e 52 6f 77 20 3d 20 4d 49 4e 28 70 50 61 72 73  nRow = MIN(pPars
33c70 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 2c 20 34  e->nQueryLoop, 4
33c80 36 29 3b 20 20 61 73 73 65 72 74 28 20 34 36 3d  6);  assert( 46=
33c90 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 32  =sqlite3LogEst(2
33ca0 35 29 20 29 3b 0a 20 20 6e 46 72 6f 6d 20 3d 20  5) );.  nFrom = 
33cb0 31 3b 0a 20 20 61 73 73 65 72 74 28 20 61 46 72  1;.  assert( aFr
33cc0 6f 6d 5b 30 5d 2e 69 73 4f 72 64 65 72 65 64 3d  om[0].isOrdered=
33cd0 3d 30 20 29 3b 0a 20 20 69 66 28 20 6e 4f 72 64  =0 );.  if( nOrd
33ce0 65 72 42 79 20 29 7b 0a 20 20 20 20 2f 2a 20 49  erBy ){.    /* I
33cf0 66 20 6e 4c 6f 6f 70 20 69 73 20 7a 65 72 6f 2c  f nLoop is zero,
33d00 20 74 68 65 6e 20 74 68 65 72 65 20 61 72 65 20   then there are 
33d10 6e 6f 20 46 52 4f 4d 20 74 65 72 6d 73 20 69 6e  no FROM terms in
33d20 20 74 68 65 20 71 75 65 72 79 2e 20 53 69 6e 63   the query. Sinc
33d30 65 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 69 73  e.    ** in this
33d40 20 63 61 73 65 20 74 68 65 20 71 75 65 72 79 20   case the query 
33d50 6d 61 79 20 72 65 74 75 72 6e 20 61 20 6d 61 78  may return a max
33d60 69 6d 75 6d 20 6f 66 20 6f 6e 65 20 72 6f 77 2c  imum of one row,
33d70 20 74 68 65 20 72 65 73 75 6c 74 73 0a 20 20 20   the results.   
33d80 20 2a 2a 20 61 72 65 20 61 6c 72 65 61 64 79 20   ** are already 
33d90 69 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64  in the requested
33da0 20 6f 72 64 65 72 2e 20 53 65 74 20 69 73 4f 72   order. Set isOr
33db0 64 65 72 65 64 20 74 6f 20 6e 4f 72 64 65 72 42  dered to nOrderB
33dc0 79 20 74 6f 0a 20 20 20 20 2a 2a 20 69 6e 64 69  y to.    ** indi
33dd0 63 61 74 65 20 74 68 69 73 2e 20 4f 72 2c 20 69  cate this. Or, i
33de0 66 20 6e 4c 6f 6f 70 20 69 73 20 67 72 65 61 74  f nLoop is great
33df0 65 72 20 74 68 61 6e 20 7a 65 72 6f 2c 20 73 65  er than zero, se
33e00 74 20 69 73 4f 72 64 65 72 65 64 20 74 6f 0a 20  t isOrdered to. 
33e10 20 20 20 2a 2a 20 2d 31 2c 20 69 6e 64 69 63 61     ** -1, indica
33e20 74 69 6e 67 20 74 68 61 74 20 74 68 65 20 72 65  ting that the re
33e30 73 75 6c 74 20 73 65 74 20 6d 61 79 20 6f 72 20  sult set may or 
33e40 6d 61 79 20 6e 6f 74 20 62 65 20 6f 72 64 65 72  may not be order
33e50 65 64 2c 20 0a 20 20 20 20 2a 2a 20 64 65 70 65  ed, .    ** depe
33e60 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 6c 6f 6f  nding on the loo
33e70 70 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  ps added to the 
33e80 63 75 72 72 65 6e 74 20 70 6c 61 6e 2e 20 20 2a  current plan.  *
33e90 2f 0a 20 20 20 20 61 46 72 6f 6d 5b 30 5d 2e 69  /.    aFrom[0].i
33ea0 73 4f 72 64 65 72 65 64 20 3d 20 6e 4c 6f 6f 70  sOrdered = nLoop
33eb0 3e 30 20 3f 20 2d 31 20 3a 20 6e 4f 72 64 65 72  >0 ? -1 : nOrder
33ec0 42 79 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f  By;.  }..  /* Co
33ed0 6d 70 75 74 65 20 73 75 63 63 65 73 73 69 76 65  mpute successive
33ee0 6c 79 20 6c 6f 6e 67 65 72 20 57 68 65 72 65 50  ly longer WhereP
33ef0 61 74 68 73 20 75 73 69 6e 67 20 74 68 65 20 70  aths using the p
33f00 72 65 76 69 6f 75 73 20 67 65 6e 65 72 61 74 69  revious generati
33f10 6f 6e 0a 20 20 2a 2a 20 6f 66 20 57 68 65 72 65  on.  ** of Where
33f20 50 61 74 68 73 20 61 73 20 74 68 65 20 62 61 73  Paths as the bas
33f30 69 73 20 66 6f 72 20 74 68 65 20 6e 65 78 74 2e  is for the next.
33f40 20 20 4b 65 65 70 20 74 72 61 63 6b 20 6f 66 20    Keep track of 
33f50 74 68 65 20 6d 78 43 68 6f 69 63 65 0a 20 20 2a  the mxChoice.  *
33f60 2a 20 62 65 73 74 20 70 61 74 68 73 20 61 74 20  * best paths at 
33f70 65 61 63 68 20 67 65 6e 65 72 61 74 69 6f 6e 20  each generation 
33f80 2a 2f 0a 20 20 66 6f 72 28 69 4c 6f 6f 70 3d 30  */.  for(iLoop=0
33f90 3b 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70 3b 20 69  ; iLoop<nLoop; i
33fa0 4c 6f 6f 70 2b 2b 29 7b 0a 20 20 20 20 6e 54 6f  Loop++){.    nTo
33fb0 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 69   = 0;.    for(ii
33fc0 3d 30 2c 20 70 46 72 6f 6d 3d 61 46 72 6f 6d 3b  =0, pFrom=aFrom;
33fd0 20 69 69 3c 6e 46 72 6f 6d 3b 20 69 69 2b 2b 2c   ii<nFrom; ii++,
33fe0 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20   pFrom++){.     
33ff0 20 66 6f 72 28 70 57 4c 6f 6f 70 3d 70 57 49 6e   for(pWLoop=pWIn
34000 66 6f 2d 3e 70 4c 6f 6f 70 73 3b 20 70 57 4c 6f  fo->pLoops; pWLo
34010 6f 70 3b 20 70 57 4c 6f 6f 70 3d 70 57 4c 6f 6f  op; pWLoop=pWLoo
34020 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 29 7b 0a 20  p->pNextLoop){. 
34030 20 20 20 20 20 20 20 4c 6f 67 45 73 74 20 6e 4f         LogEst nO
34040 75 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ut;             
34050 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 73           /* Rows
34060 20 76 69 73 69 74 65 64 20 62 79 20 28 70 46 72   visited by (pFr
34070 6f 6d 2b 70 57 4c 6f 6f 70 29 20 2a 2f 0a 20 20  om+pWLoop) */.  
34080 20 20 20 20 20 20 4c 6f 67 45 73 74 20 72 43 6f        LogEst rCo
34090 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
340a0 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 73 74 20          /* Cost 
340b0 6f 66 20 70 61 74 68 20 28 70 46 72 6f 6d 2b 70  of path (pFrom+p
340c0 57 4c 6f 6f 70 29 20 2a 2f 0a 20 20 20 20 20 20  WLoop) */.      
340d0 20 20 4c 6f 67 45 73 74 20 72 55 6e 73 6f 72 74    LogEst rUnsort
340e0 65 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ed;             
340f0 20 20 20 20 2f 2a 20 55 6e 73 6f 72 74 65 64 20      /* Unsorted 
34100 63 6f 73 74 20 6f 66 20 28 70 46 72 6f 6d 2b 70  cost of (pFrom+p
34110 57 4c 6f 6f 70 29 20 2a 2f 0a 20 20 20 20 20 20  WLoop) */.      
34120 20 20 69 38 20 69 73 4f 72 64 65 72 65 64 20 3d    i8 isOrdered =
34130 20 70 46 72 6f 6d 2d 3e 69 73 4f 72 64 65 72 65   pFrom->isOrdere
34140 64 3b 20 20 2f 2a 20 69 73 4f 72 64 65 72 65 64  d;  /* isOrdered
34150 20 66 6f 72 20 28 70 46 72 6f 6d 2b 70 57 4c 6f   for (pFrom+pWLo
34160 6f 70 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 42  op) */.        B
34170 69 74 6d 61 73 6b 20 6d 61 73 6b 4e 65 77 3b 20  itmask maskNew; 
34180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34190 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 73 72 63 20   /* Mask of src 
341a0 76 69 73 69 74 65 64 20 62 79 20 28 2e 2e 29 20  visited by (..) 
341b0 2a 2f 0a 20 20 20 20 20 20 20 20 42 69 74 6d 61  */.        Bitma
341c0 73 6b 20 72 65 76 4d 61 73 6b 20 3d 20 30 3b 20  sk revMask = 0; 
341d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
341e0 4d 61 73 6b 20 6f 66 20 72 65 76 2d 6f 72 64 65  Mask of rev-orde
341f0 72 20 6c 6f 6f 70 73 20 66 6f 72 20 28 2e 2e 29  r loops for (..)
34200 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 69 66 28   */..        if(
34210 20 28 70 57 4c 6f 6f 70 2d 3e 70 72 65 72 65 71   (pWLoop->prereq
34220 20 26 20 7e 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c   & ~pFrom->maskL
34230 6f 6f 70 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e  oop)!=0 ) contin
34240 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ue;.        if( 
34250 28 70 57 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c  (pWLoop->maskSel
34260 66 20 26 20 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c  f & pFrom->maskL
34270 6f 6f 70 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e  oop)!=0 ) contin
34280 75 65 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41  ue;.        /* A
34290 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 70 57  t this point, pW
342a0 4c 6f 6f 70 20 69 73 20 61 20 63 61 6e 64 69 64  Loop is a candid
342b0 61 74 65 20 74 6f 20 62 65 20 74 68 65 20 6e 65  ate to be the ne
342c0 78 74 20 6c 6f 6f 70 2e 20 0a 20 20 20 20 20 20  xt loop. .      
342d0 20 20 2a 2a 20 43 6f 6d 70 75 74 65 20 69 74 73    ** Compute its
342e0 20 63 6f 73 74 20 2a 2f 0a 20 20 20 20 20 20 20   cost */.       
342f0 20 72 55 6e 73 6f 72 74 65 64 20 3d 20 73 71 6c   rUnsorted = sql
34300 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28 70 57  ite3LogEstAdd(pW
34310 4c 6f 6f 70 2d 3e 72 53 65 74 75 70 2c 70 57 4c  Loop->rSetup,pWL
34320 6f 6f 70 2d 3e 72 52 75 6e 20 2b 20 70 46 72 6f  oop->rRun + pFro
34330 6d 2d 3e 6e 52 6f 77 29 3b 0a 20 20 20 20 20 20  m->nRow);.      
34340 20 20 72 55 6e 73 6f 72 74 65 64 20 3d 20 73 71    rUnsorted = sq
34350 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28 72  lite3LogEstAdd(r
34360 55 6e 73 6f 72 74 65 64 2c 20 70 46 72 6f 6d 2d  Unsorted, pFrom-
34370 3e 72 55 6e 73 6f 72 74 65 64 29 3b 0a 20 20 20  >rUnsorted);.   
34380 20 20 20 20 20 6e 4f 75 74 20 3d 20 70 46 72 6f       nOut = pFro
34390 6d 2d 3e 6e 52 6f 77 20 2b 20 70 57 4c 6f 6f 70  m->nRow + pWLoop
343a0 2d 3e 6e 4f 75 74 3b 0a 20 20 20 20 20 20 20 20  ->nOut;.        
343b0 6d 61 73 6b 4e 65 77 20 3d 20 70 46 72 6f 6d 2d  maskNew = pFrom-
343c0 3e 6d 61 73 6b 4c 6f 6f 70 20 7c 20 70 57 4c 6f  >maskLoop | pWLo
343d0 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20  op->maskSelf;.  
343e0 20 20 20 20 20 20 69 66 28 20 69 73 4f 72 64 65        if( isOrde
343f0 72 65 64 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  red<0 ){.       
34400 20 20 20 69 73 4f 72 64 65 72 65 64 20 3d 20 77     isOrdered = w
34410 68 65 72 65 50 61 74 68 53 61 74 69 73 66 69 65  herePathSatisfie
34420 73 4f 72 64 65 72 42 79 28 70 57 49 6e 66 6f 2c  sOrderBy(pWInfo,
34430 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
34440 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e          pWInfo->
34450 70 4f 72 64 65 72 42 79 2c 20 70 46 72 6f 6d 2c  pOrderBy, pFrom,
34460 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c   pWInfo->wctrlFl
34470 61 67 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ags,.           
34480 20 20 20 20 20 20 20 20 20 20 20 20 69 4c 6f 6f              iLoo
34490 70 2c 20 70 57 4c 6f 6f 70 2c 20 26 72 65 76 4d  p, pWLoop, &revM
344a0 61 73 6b 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  ask);.        }e
344b0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72  lse{.          r
344c0 65 76 4d 61 73 6b 20 3d 20 70 46 72 6f 6d 2d 3e  evMask = pFrom->
344d0 72 65 76 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 20  revLoop;.       
344e0 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 69   }.        if( i
344f0 73 4f 72 64 65 72 65 64 3e 3d 30 20 26 26 20 69  sOrdered>=0 && i
34500 73 4f 72 64 65 72 65 64 3c 6e 4f 72 64 65 72 42  sOrdered<nOrderB
34510 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  y ){.          i
34520 66 28 20 61 53 6f 72 74 43 6f 73 74 5b 69 73 4f  f( aSortCost[isO
34530 72 64 65 72 65 64 5d 3d 3d 30 20 29 7b 0a 20 20  rdered]==0 ){.  
34540 20 20 20 20 20 20 20 20 20 20 61 53 6f 72 74 43            aSortC
34550 6f 73 74 5b 69 73 4f 72 64 65 72 65 64 5d 20 3d  ost[isOrdered] =
34560 20 77 68 65 72 65 53 6f 72 74 69 6e 67 43 6f 73   whereSortingCos
34570 74 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t(.             
34580 20 20 20 70 57 49 6e 66 6f 2c 20 6e 52 6f 77 45     pWInfo, nRowE
34590 73 74 2c 20 6e 4f 72 64 65 72 42 79 2c 20 69 73  st, nOrderBy, is
345a0 4f 72 64 65 72 65 64 0a 20 20 20 20 20 20 20 20  Ordered.        
345b0 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 20      );.         
345c0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72 43 6f   }.          rCo
345d0 73 74 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  st = sqlite3LogE
345e0 73 74 41 64 64 28 72 55 6e 73 6f 72 74 65 64 2c  stAdd(rUnsorted,
345f0 20 61 53 6f 72 74 43 6f 73 74 5b 69 73 4f 72 64   aSortCost[isOrd
34600 65 72 65 64 5d 29 3b 0a 0a 20 20 20 20 20 20 20  ered]);..       
34610 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78     WHERETRACE(0x
34620 30 30 32 2c 0a 20 20 20 20 20 20 20 20 20 20 20  002,.           
34630 20 20 20 28 22 2d 2d 2d 2d 20 73 6f 72 74 20 63     ("---- sort c
34640 6f 73 74 3d 25 2d 33 64 20 28 25 64 2f 25 64 29  ost=%-3d (%d/%d)
34650 20 69 6e 63 72 65 61 73 65 73 20 63 6f 73 74 20   increases cost 
34660 25 33 64 20 74 6f 20 25 2d 33 64 5c 6e 22 2c 0a  %3d to %-3d\n",.
34670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
34680 53 6f 72 74 43 6f 73 74 5b 69 73 4f 72 64 65 72  SortCost[isOrder
34690 65 64 5d 2c 20 28 6e 4f 72 64 65 72 42 79 2d 69  ed], (nOrderBy-i
346a0 73 4f 72 64 65 72 65 64 29 2c 20 6e 4f 72 64 65  sOrdered), nOrde
346b0 72 42 79 2c 20 0a 20 20 20 20 20 20 20 20 20 20  rBy, .          
346c0 20 20 20 20 20 72 55 6e 73 6f 72 74 65 64 2c 20       rUnsorted, 
346d0 72 43 6f 73 74 29 29 3b 0a 20 20 20 20 20 20 20  rCost));.       
346e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
346f0 20 20 72 43 6f 73 74 20 3d 20 72 55 6e 73 6f 72    rCost = rUnsor
34700 74 65 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  ted;.        }..
34710 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b          /* Check
34720 20 74 6f 20 73 65 65 20 69 66 20 70 57 4c 6f 6f   to see if pWLoo
34730 70 20 73 68 6f 75 6c 64 20 62 65 20 61 64 64 65  p should be adde
34740 64 20 74 6f 20 74 68 65 20 73 65 74 20 6f 66 0a  d to the set of.
34750 20 20 20 20 20 20 20 20 2a 2a 20 6d 78 43 68 6f          ** mxCho
34760 69 63 65 20 62 65 73 74 2d 73 6f 2d 66 61 72 20  ice best-so-far 
34770 70 61 74 68 73 2e 0a 20 20 20 20 20 20 20 20 2a  paths..        *
34780 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 46 69 72  *.        ** Fir
34790 73 74 20 6c 6f 6f 6b 20 66 6f 72 20 61 6e 20 65  st look for an e
347a0 78 69 73 74 69 6e 67 20 70 61 74 68 20 61 6d 6f  xisting path amo
347b0 6e 67 20 62 65 73 74 2d 73 6f 2d 66 61 72 20 70  ng best-so-far p
347c0 61 74 68 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  aths.        ** 
347d0 74 68 61 74 20 63 6f 76 65 72 73 20 74 68 65 20  that covers the 
347e0 73 61 6d 65 20 73 65 74 20 6f 66 20 6c 6f 6f 70  same set of loop
347f0 73 20 61 6e 64 20 68 61 73 20 74 68 65 20 73 61  s and has the sa
34800 6d 65 20 69 73 4f 72 64 65 72 65 64 0a 20 20 20  me isOrdered.   
34810 20 20 20 20 20 2a 2a 20 73 65 74 74 69 6e 67 20       ** setting 
34820 61 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  as the current p
34830 61 74 68 20 63 61 6e 64 69 64 61 74 65 2e 0a 20  ath candidate.. 
34840 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
34850 20 20 2a 2a 20 54 68 65 20 74 65 72 6d 20 22 28    ** The term "(
34860 28 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 5e  (pTo->isOrdered^
34870 69 73 4f 72 64 65 72 65 64 29 26 30 78 38 30 29  isOrdered)&0x80)
34880 3d 3d 30 22 20 69 73 20 65 71 75 69 76 61 6c 65  ==0" is equivale
34890 6e 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f  nt.        ** to
348a0 20 28 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64   (pTo->isOrdered
348b0 3d 3d 28 2d 31 29 29 3d 3d 28 69 73 4f 72 64 65  ==(-1))==(isOrde
348c0 72 65 64 3d 3d 28 2d 31 29 29 22 20 66 6f 72 20  red==(-1))" for 
348d0 74 68 65 20 72 61 6e 67 65 0a 20 20 20 20 20 20  the range.      
348e0 20 20 2a 2a 20 6f 66 20 6c 65 67 61 6c 20 76 61    ** of legal va
348f0 6c 75 65 73 20 66 6f 72 20 69 73 4f 72 64 65 72  lues for isOrder
34900 65 64 2c 20 2d 31 2e 2e 36 34 2e 0a 20 20 20 20  ed, -1..64..    
34910 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 66      */.        f
34920 6f 72 28 6a 6a 3d 30 2c 20 70 54 6f 3d 61 54 6f  or(jj=0, pTo=aTo
34930 3b 20 6a 6a 3c 6e 54 6f 3b 20 6a 6a 2b 2b 2c 20  ; jj<nTo; jj++, 
34940 70 54 6f 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  pTo++){.        
34950 20 20 69 66 28 20 70 54 6f 2d 3e 6d 61 73 6b 4c    if( pTo->maskL
34960 6f 6f 70 3d 3d 6d 61 73 6b 4e 65 77 0a 20 20 20  oop==maskNew.   
34970 20 20 20 20 20 20 20 20 26 26 20 28 28 70 54 6f          && ((pTo
34980 2d 3e 69 73 4f 72 64 65 72 65 64 5e 69 73 4f 72  ->isOrdered^isOr
34990 64 65 72 65 64 29 26 30 78 38 30 29 3d 3d 30 0a  dered)&0x80)==0.
349a0 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20            ){.   
349b0 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
349c0 65 28 20 6a 6a 3d 3d 6e 54 6f 2d 31 20 29 3b 0a  e( jj==nTo-1 );.
349d0 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
349e0 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
349f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
34a00 20 69 66 28 20 6a 6a 3e 3d 6e 54 6f 20 29 7b 0a   if( jj>=nTo ){.
34a10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 6e            /* Non
34a20 65 20 6f 66 20 74 68 65 20 65 78 69 73 74 69 6e  e of the existin
34a30 67 20 62 65 73 74 2d 73 6f 2d 66 61 72 20 70 61  g best-so-far pa
34a40 74 68 73 20 6d 61 74 63 68 20 74 68 65 20 63 61  ths match the ca
34a50 6e 64 69 64 61 74 65 2e 20 2a 2f 0a 20 20 20 20  ndidate. */.    
34a60 20 20 20 20 20 20 69 66 28 20 6e 54 6f 3e 3d 6d        if( nTo>=m
34a70 78 43 68 6f 69 63 65 0a 20 20 20 20 20 20 20 20  xChoice.        
34a80 20 20 20 26 26 20 28 72 43 6f 73 74 3e 6d 78 43     && (rCost>mxC
34a90 6f 73 74 20 7c 7c 20 28 72 43 6f 73 74 3d 3d 6d  ost || (rCost==m
34aa0 78 43 6f 73 74 20 26 26 20 72 55 6e 73 6f 72 74  xCost && rUnsort
34ab0 65 64 3e 3d 6d 78 55 6e 73 6f 72 74 65 64 29 29  ed>=mxUnsorted))
34ac0 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20  .          ){.  
34ad0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
34ae0 20 63 75 72 72 65 6e 74 20 63 61 6e 64 69 64 61   current candida
34af0 74 65 20 69 73 20 6e 6f 20 62 65 74 74 65 72 20  te is no better 
34b00 74 68 61 6e 20 61 6e 79 20 6f 66 20 74 68 65 20  than any of the 
34b10 6d 78 43 68 6f 69 63 65 0a 20 20 20 20 20 20 20  mxChoice.       
34b20 20 20 20 20 20 2a 2a 20 70 61 74 68 73 20 63 75       ** paths cu
34b30 72 72 65 6e 74 6c 79 20 69 6e 20 74 68 65 20 62  rrently in the b
34b40 65 73 74 2d 73 6f 2d 66 61 72 20 62 75 66 66 65  est-so-far buffe
34b50 72 2e 20 20 53 6f 20 64 69 73 63 61 72 64 0a 20  r.  So discard. 
34b60 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68             ** th
34b70 69 73 20 63 61 6e 64 69 64 61 74 65 20 61 73 20  is candidate as 
34b80 6e 6f 74 20 76 69 61 62 6c 65 2e 20 2a 2f 0a 23  not viable. */.#
34b90 69 66 64 65 66 20 57 48 45 52 45 54 52 41 43 45  ifdef WHERETRACE
34ba0 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78 34 20  _ENABLED /* 0x4 
34bb0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  */.            i
34bc0 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54  f( sqlite3WhereT
34bd0 72 61 63 65 26 30 78 34 20 29 7b 0a 20 20 20 20  race&0x4 ){.    
34be0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
34bf0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 53 6b  3DebugPrintf("Sk
34c00 69 70 20 20 20 25 73 20 63 6f 73 74 3d 25 2d 33  ip   %s cost=%-3
34c10 64 2c 25 33 64 20 6f 72 64 65 72 3d 25 63 5c 6e  d,%3d order=%c\n
34c20 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
34c30 20 20 20 20 20 77 68 65 72 65 50 61 74 68 4e 61       wherePathNa
34c40 6d 65 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c  me(pFrom, iLoop,
34c50 20 70 57 4c 6f 6f 70 29 2c 20 72 43 6f 73 74 2c   pWLoop), rCost,
34c60 20 6e 4f 75 74 2c 0a 20 20 20 20 20 20 20 20 20   nOut,.         
34c70 20 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72           isOrder
34c80 65 64 3e 3d 30 20 3f 20 69 73 4f 72 64 65 72 65  ed>=0 ? isOrdere
34c90 64 2b 27 30 27 20 3a 20 27 3f 27 29 3b 0a 20 20  d+'0' : '?');.  
34ca0 20 20 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64            }.#end
34cb0 69 66 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  if.            c
34cc0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
34cd0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 2f     }.          /
34ce0 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68  * If we reach th
34cf0 69 73 20 70 6f 69 6e 74 73 20 69 74 20 6d 65 61  is points it mea
34d00 6e 73 20 74 68 61 74 20 74 68 65 20 6e 65 77 20  ns that the new 
34d10 63 61 6e 64 69 64 61 74 65 20 70 61 74 68 0a 20  candidate path. 
34d20 20 20 20 20 20 20 20 20 20 2a 2a 20 6e 65 65 64           ** need
34d30 73 20 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f  s to be added to
34d40 20 74 68 65 20 73 65 74 20 6f 66 20 62 65 73 74   the set of best
34d50 2d 73 6f 2d 66 61 72 20 70 61 74 68 73 2e 20 2a  -so-far paths. *
34d60 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
34d70 6e 54 6f 3c 6d 78 43 68 6f 69 63 65 20 29 7b 0a  nTo<mxChoice ){.
34d80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
34d90 6e 63 72 65 61 73 65 20 74 68 65 20 73 69 7a 65  ncrease the size
34da0 20 6f 66 20 74 68 65 20 61 54 6f 20 73 65 74 20   of the aTo set 
34db0 62 79 20 6f 6e 65 20 2a 2f 0a 20 20 20 20 20 20  by one */.      
34dc0 20 20 20 20 20 20 6a 6a 20 3d 20 6e 54 6f 2b 2b        jj = nTo++
34dd0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
34de0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  e{.            /
34df0 2a 20 4e 65 77 20 70 61 74 68 20 72 65 70 6c 61  * New path repla
34e00 63 65 73 20 74 68 65 20 70 72 69 6f 72 20 77 6f  ces the prior wo
34e10 72 73 74 20 74 6f 20 6b 65 65 70 20 63 6f 75 6e  rst to keep coun
34e20 74 20 62 65 6c 6f 77 20 6d 78 43 68 6f 69 63 65  t below mxChoice
34e30 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
34e40 6a 6a 20 3d 20 6d 78 49 3b 0a 20 20 20 20 20 20  jj = mxI;.      
34e50 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
34e60 70 54 6f 20 3d 20 26 61 54 6f 5b 6a 6a 5d 3b 0a  pTo = &aTo[jj];.
34e70 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41 43  #ifdef WHERETRAC
34e80 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78 34  E_ENABLED /* 0x4
34e90 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
34ea0 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72  ( sqlite3WhereTr
34eb0 61 63 65 26 30 78 34 20 29 7b 0a 20 20 20 20 20  ace&0x4 ){.     
34ec0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
34ed0 62 75 67 50 72 69 6e 74 66 28 22 4e 65 77 20 20  bugPrintf("New  
34ee0 20 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25    %s cost=%-3d,%
34ef0 33 64 20 6f 72 64 65 72 3d 25 63 5c 6e 22 2c 0a  3d order=%c\n",.
34f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34f10 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70 46  wherePathName(pF
34f20 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f  rom, iLoop, pWLo
34f30 6f 70 29 2c 20 72 43 6f 73 74 2c 20 6e 4f 75 74  op), rCost, nOut
34f40 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
34f50 20 20 69 73 4f 72 64 65 72 65 64 3e 3d 30 20 3f    isOrdered>=0 ?
34f60 20 69 73 4f 72 64 65 72 65 64 2b 27 30 27 20 3a   isOrdered+'0' :
34f70 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20   '?');.         
34f80 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
34f90 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
34fa0 20 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20 72 65     /* Control re
34fb0 61 63 68 65 73 20 68 65 72 65 20 69 66 20 62 65  aches here if be
34fc0 73 74 2d 73 6f 2d 66 61 72 20 70 61 74 68 20 70  st-so-far path p
34fd0 54 6f 3d 61 54 6f 5b 6a 6a 5d 20 63 6f 76 65 72  To=aTo[jj] cover
34fe0 73 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20  s the.          
34ff0 2a 2a 20 73 61 6d 65 20 73 65 74 20 6f 66 20 6c  ** same set of l
35000 6f 6f 70 73 20 61 6e 64 20 68 61 73 20 74 68 65  oops and has the
35010 20 73 61 6d 20 69 73 4f 72 64 65 72 65 64 20 73   sam isOrdered s
35020 65 74 74 69 6e 67 20 61 73 20 74 68 65 0a 20 20  etting as the.  
35030 20 20 20 20 20 20 20 20 2a 2a 20 63 61 6e 64 69          ** candi
35040 64 61 74 65 20 70 61 74 68 2e 20 20 43 68 65 63  date path.  Chec
35050 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20  k to see if the 
35060 63 61 6e 64 69 64 61 74 65 20 73 68 6f 75 6c 64  candidate should
35070 20 72 65 70 6c 61 63 65 0a 20 20 20 20 20 20 20   replace.       
35080 20 20 20 2a 2a 20 70 54 6f 20 6f 72 20 69 66 20     ** pTo or if 
35090 74 68 65 20 63 61 6e 64 69 64 61 74 65 20 73 68  the candidate sh
350a0 6f 75 6c 64 20 62 65 20 73 6b 69 70 70 65 64 20  ould be skipped 
350b0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
350c0 20 70 54 6f 2d 3e 72 43 6f 73 74 3c 72 43 6f 73   pTo->rCost<rCos
350d0 74 20 7c 7c 20 28 70 54 6f 2d 3e 72 43 6f 73 74  t || (pTo->rCost
350e0 3d 3d 72 43 6f 73 74 20 26 26 20 70 54 6f 2d 3e  ==rCost && pTo->
350f0 6e 52 6f 77 3c 3d 6e 4f 75 74 29 20 29 7b 0a 23  nRow<=nOut) ){.#
35100 69 66 64 65 66 20 57 48 45 52 45 54 52 41 43 45  ifdef WHERETRACE
35110 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78 34 20  _ENABLED /* 0x4 
35120 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  */.            i
35130 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54  f( sqlite3WhereT
35140 72 61 63 65 26 30 78 34 20 29 7b 0a 20 20 20 20  race&0x4 ){.    
35150 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
35160 33 44 65 62 75 67 50 72 69 6e 74 66 28 0a 20 20  3DebugPrintf(.  
35170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35180 22 53 6b 69 70 20 20 20 25 73 20 63 6f 73 74 3d  "Skip   %s cost=
35190 25 2d 33 64 2c 25 33 64 20 6f 72 64 65 72 3d 25  %-3d,%3d order=%
351a0 63 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  c",.            
351b0 20 20 20 20 20 20 77 68 65 72 65 50 61 74 68 4e        wherePathN
351c0 61 6d 65 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70  ame(pFrom, iLoop
351d0 2c 20 70 57 4c 6f 6f 70 29 2c 20 72 43 6f 73 74  , pWLoop), rCost
351e0 2c 20 6e 4f 75 74 2c 0a 20 20 20 20 20 20 20 20  , nOut,.        
351f0 20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64 65            isOrde
35200 72 65 64 3e 3d 30 20 3f 20 69 73 4f 72 64 65 72  red>=0 ? isOrder
35210 65 64 2b 27 30 27 20 3a 20 27 3f 27 29 3b 0a 20  ed+'0' : '?');. 
35220 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
35230 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
35240 22 20 20 20 76 73 20 25 73 20 63 6f 73 74 3d 25  "   vs %s cost=%
35250 2d 33 64 2c 25 64 20 6f 72 64 65 72 3d 25 63 5c  -3d,%d order=%c\
35260 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
35270 20 20 20 20 20 20 77 68 65 72 65 50 61 74 68 4e        wherePathN
35280 61 6d 65 28 70 54 6f 2c 20 69 4c 6f 6f 70 2b 31  ame(pTo, iLoop+1
35290 2c 20 30 29 2c 20 70 54 6f 2d 3e 72 43 6f 73 74  , 0), pTo->rCost
352a0 2c 20 70 54 6f 2d 3e 6e 52 6f 77 2c 0a 20 20 20  , pTo->nRow,.   
352b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
352c0 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 3e 3d 30  To->isOrdered>=0
352d0 20 3f 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65   ? pTo->isOrdere
352e0 64 2b 27 30 27 20 3a 20 27 3f 27 29 3b 0a 20 20  d+'0' : '?');.  
352f0 20 20 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64            }.#end
35300 69 66 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  if.            /
35310 2a 20 44 69 73 63 61 72 64 20 74 68 65 20 63 61  * Discard the ca
35320 6e 64 69 64 61 74 65 20 70 61 74 68 20 66 72 6f  ndidate path fro
35330 6d 20 66 75 72 74 68 65 72 20 63 6f 6e 73 69 64  m further consid
35340 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  eration */.     
35350 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
35360 20 70 54 6f 2d 3e 72 43 6f 73 74 3d 3d 72 43 6f   pTo->rCost==rCo
35370 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  st );.          
35380 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
35390 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
353a0 20 20 74 65 73 74 63 61 73 65 28 20 70 54 6f 2d    testcase( pTo-
353b0 3e 72 43 6f 73 74 3d 3d 72 43 6f 73 74 2b 31 20  >rCost==rCost+1 
353c0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  );.          /* 
353d0 43 6f 6e 74 72 6f 6c 20 72 65 61 63 68 65 73 20  Control reaches 
353e0 68 65 72 65 20 69 66 20 74 68 65 20 63 61 6e 64  here if the cand
353f0 69 64 61 74 65 20 70 61 74 68 20 69 73 20 62 65  idate path is be
35400 74 74 65 72 20 74 68 61 6e 20 74 68 65 0a 20 20  tter than the.  
35410 20 20 20 20 20 20 20 20 2a 2a 20 70 54 6f 20 70          ** pTo p
35420 61 74 68 2e 20 20 52 65 70 6c 61 63 65 20 70 54  ath.  Replace pT
35430 6f 20 77 69 74 68 20 74 68 65 20 63 61 6e 64 69  o with the candi
35440 64 61 74 65 2e 20 2a 2f 0a 23 69 66 64 65 66 20  date. */.#ifdef 
35450 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c  WHERETRACE_ENABL
35460 45 44 20 2f 2a 20 30 78 34 20 2a 2f 0a 20 20 20  ED /* 0x4 */.   
35470 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
35480 65 33 57 68 65 72 65 54 72 61 63 65 26 30 78 34  e3WhereTrace&0x4
35490 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
354a0 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
354b0 74 66 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  tf(.            
354c0 20 20 20 20 22 55 70 64 61 74 65 20 25 73 20 63      "Update %s c
354d0 6f 73 74 3d 25 2d 33 64 2c 25 33 64 20 6f 72 64  ost=%-3d,%3d ord
354e0 65 72 3d 25 63 22 2c 0a 20 20 20 20 20 20 20 20  er=%c",.        
354f0 20 20 20 20 20 20 20 20 77 68 65 72 65 50 61 74          wherePat
35500 68 4e 61 6d 65 28 70 46 72 6f 6d 2c 20 69 4c 6f  hName(pFrom, iLo
35510 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c 20 72 43 6f  op, pWLoop), rCo
35520 73 74 2c 20 6e 4f 75 74 2c 0a 20 20 20 20 20 20  st, nOut,.      
35530 20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64 65            isOrde
35540 72 65 64 3e 3d 30 20 3f 20 69 73 4f 72 64 65 72  red>=0 ? isOrder
35550 65 64 2b 27 30 27 20 3a 20 27 3f 27 29 3b 0a 20  ed+'0' : '?');. 
35560 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
35570 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
35580 20 77 61 73 20 25 73 20 63 6f 73 74 3d 25 2d 33   was %s cost=%-3
35590 64 2c 25 33 64 20 6f 72 64 65 72 3d 25 63 5c 6e  d,%3d order=%c\n
355a0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
355b0 20 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65     wherePathName
355c0 28 70 54 6f 2c 20 69 4c 6f 6f 70 2b 31 2c 20 30  (pTo, iLoop+1, 0
355d0 29 2c 20 70 54 6f 2d 3e 72 43 6f 73 74 2c 20 70  ), pTo->rCost, p
355e0 54 6f 2d 3e 6e 52 6f 77 2c 0a 20 20 20 20 20 20  To->nRow,.      
355f0 20 20 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 69            pTo->i
35600 73 4f 72 64 65 72 65 64 3e 3d 30 20 3f 20 70 54  sOrdered>=0 ? pT
35610 6f 2d 3e 69 73 4f 72 64 65 72 65 64 2b 27 30 27  o->isOrdered+'0'
35620 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20   : '?');.       
35630 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
35640 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a      }.        /*
35650 20 70 57 4c 6f 6f 70 20 69 73 20 61 20 77 69 6e   pWLoop is a win
35660 6e 65 72 2e 20 20 41 64 64 20 69 74 20 74 6f 20  ner.  Add it to 
35670 74 68 65 20 73 65 74 20 6f 66 20 62 65 73 74 20  the set of best 
35680 73 6f 20 66 61 72 20 2a 2f 0a 20 20 20 20 20 20  so far */.      
35690 20 20 70 54 6f 2d 3e 6d 61 73 6b 4c 6f 6f 70 20    pTo->maskLoop 
356a0 3d 20 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f  = pFrom->maskLoo
356b0 70 20 7c 20 70 57 4c 6f 6f 70 2d 3e 6d 61 73 6b  p | pWLoop->mask
356c0 53 65 6c 66 3b 0a 20 20 20 20 20 20 20 20 70 54  Self;.        pT
356d0 6f 2d 3e 72 65 76 4c 6f 6f 70 20 3d 20 72 65 76  o->revLoop = rev
356e0 4d 61 73 6b 3b 0a 20 20 20 20 20 20 20 20 70 54  Mask;.        pT
356f0 6f 2d 3e 6e 52 6f 77 20 3d 20 6e 4f 75 74 3b 0a  o->nRow = nOut;.
35700 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 72 43 6f          pTo->rCo
35710 73 74 20 3d 20 72 43 6f 73 74 3b 0a 20 20 20 20  st = rCost;.    
35720 20 20 20 20 70 54 6f 2d 3e 72 55 6e 73 6f 72 74      pTo->rUnsort
35730 65 64 20 3d 20 72 55 6e 73 6f 72 74 65 64 3b 0a  ed = rUnsorted;.
35740 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 69 73 4f          pTo->isO
35750 72 64 65 72 65 64 20 3d 20 69 73 4f 72 64 65 72  rdered = isOrder
35760 65 64 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63  ed;.        memc
35770 70 79 28 70 54 6f 2d 3e 61 4c 6f 6f 70 2c 20 70  py(pTo->aLoop, p
35780 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 2c 20 73 69 7a  From->aLoop, siz
35790 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70 2a 29 2a  eof(WhereLoop*)*
357a0 69 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 20 20  iLoop);.        
357b0 70 54 6f 2d 3e 61 4c 6f 6f 70 5b 69 4c 6f 6f 70  pTo->aLoop[iLoop
357c0 5d 20 3d 20 70 57 4c 6f 6f 70 3b 0a 20 20 20 20  ] = pWLoop;.    
357d0 20 20 20 20 69 66 28 20 6e 54 6f 3e 3d 6d 78 43      if( nTo>=mxC
357e0 68 6f 69 63 65 20 29 7b 0a 20 20 20 20 20 20 20  hoice ){.       
357f0 20 20 20 6d 78 49 20 3d 20 30 3b 0a 20 20 20 20     mxI = 0;.    
35800 20 20 20 20 20 20 6d 78 43 6f 73 74 20 3d 20 61        mxCost = a
35810 54 6f 5b 30 5d 2e 72 43 6f 73 74 3b 0a 20 20 20  To[0].rCost;.   
35820 20 20 20 20 20 20 20 6d 78 55 6e 73 6f 72 74 65         mxUnsorte
35830 64 20 3d 20 61 54 6f 5b 30 5d 2e 6e 52 6f 77 3b  d = aTo[0].nRow;
35840 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a  .          for(j
35850 6a 3d 31 2c 20 70 54 6f 3d 26 61 54 6f 5b 31 5d  j=1, pTo=&aTo[1]
35860 3b 20 6a 6a 3c 6d 78 43 68 6f 69 63 65 3b 20 6a  ; jj<mxChoice; j
35870 6a 2b 2b 2c 20 70 54 6f 2b 2b 29 7b 0a 20 20 20  j++, pTo++){.   
35880 20 20 20 20 20 20 20 20 20 69 66 28 20 70 54 6f           if( pTo
35890 2d 3e 72 43 6f 73 74 3e 6d 78 43 6f 73 74 20 0a  ->rCost>mxCost .
358a0 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
358b0 28 70 54 6f 2d 3e 72 43 6f 73 74 3d 3d 6d 78 43  (pTo->rCost==mxC
358c0 6f 73 74 20 26 26 20 70 54 6f 2d 3e 72 55 6e 73  ost && pTo->rUns
358d0 6f 72 74 65 64 3e 6d 78 55 6e 73 6f 72 74 65 64  orted>mxUnsorted
358e0 29 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 29  ) .            )
358f0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
35900 6d 78 43 6f 73 74 20 3d 20 70 54 6f 2d 3e 72 43  mxCost = pTo->rC
35910 6f 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ost;.           
35920 20 20 20 6d 78 55 6e 73 6f 72 74 65 64 20 3d 20     mxUnsorted = 
35930 70 54 6f 2d 3e 72 55 6e 73 6f 72 74 65 64 3b 0a  pTo->rUnsorted;.
35940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 78                mx
35950 49 20 3d 20 6a 6a 3b 0a 20 20 20 20 20 20 20 20  I = jj;.        
35960 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
35970 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
35980 20 20 7d 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65    }.    }..#ifde
35990 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  f WHERETRACE_ENA
359a0 42 4c 45 44 20 20 2f 2a 20 3e 3d 32 20 2a 2f 0a  BLED  /* >=2 */.
359b0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57      if( sqlite3W
359c0 68 65 72 65 54 72 61 63 65 20 26 20 30 78 30 32  hereTrace & 0x02
359d0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
359e0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 2d 2d  3DebugPrintf("--
359f0 2d 2d 20 61 66 74 65 72 20 72 6f 75 6e 64 20 25  -- after round %
35a00 64 20 2d 2d 2d 2d 5c 6e 22 2c 20 69 4c 6f 6f 70  d ----\n", iLoop
35a10 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 69 3d  );.      for(ii=
35a20 30 2c 20 70 54 6f 3d 61 54 6f 3b 20 69 69 3c 6e  0, pTo=aTo; ii<n
35a30 54 6f 3b 20 69 69 2b 2b 2c 20 70 54 6f 2b 2b 29  To; ii++, pTo++)
35a40 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
35a50 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 25  3DebugPrintf(" %
35a60 73 20 63 6f 73 74 3d 25 2d 33 64 20 6e 72 6f 77  s cost=%-3d nrow
35a70 3d 25 2d 33 64 20 6f 72 64 65 72 3d 25 63 22 2c  =%-3d order=%c",
35a80 0a 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72  .           wher
35a90 65 50 61 74 68 4e 61 6d 65 28 70 54 6f 2c 20 69  ePathName(pTo, i
35aa0 4c 6f 6f 70 2b 31 2c 20 30 29 2c 20 70 54 6f 2d  Loop+1, 0), pTo-
35ab0 3e 72 43 6f 73 74 2c 20 70 54 6f 2d 3e 6e 52 6f  >rCost, pTo->nRo
35ac0 77 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 54  w,.           pT
35ad0 6f 2d 3e 69 73 4f 72 64 65 72 65 64 3e 3d 30 20  o->isOrdered>=0 
35ae0 3f 20 28 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65  ? (pTo->isOrdere
35af0 64 2b 27 30 27 29 20 3a 20 27 3f 27 29 3b 0a 20  d+'0') : '?');. 
35b00 20 20 20 20 20 20 20 69 66 28 20 70 54 6f 2d 3e         if( pTo->
35b10 69 73 4f 72 64 65 72 65 64 3e 30 20 29 7b 0a 20  isOrdered>0 ){. 
35b20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
35b30 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 72 65  DebugPrintf(" re
35b40 76 3d 30 78 25 6c 6c 78 5c 6e 22 2c 20 70 54 6f  v=0x%llx\n", pTo
35b50 2d 3e 72 65 76 4c 6f 6f 70 29 3b 0a 20 20 20 20  ->revLoop);.    
35b60 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
35b70 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
35b80 67 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20  gPrintf("\n");. 
35b90 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
35ba0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
35bb0 20 20 20 2f 2a 20 53 77 61 70 20 74 68 65 20 72     /* Swap the r
35bc0 6f 6c 65 73 20 6f 66 20 61 46 72 6f 6d 20 61 6e  oles of aFrom an
35bd0 64 20 61 54 6f 20 66 6f 72 20 74 68 65 20 6e 65  d aTo for the ne
35be0 78 74 20 67 65 6e 65 72 61 74 69 6f 6e 20 2a 2f  xt generation */
35bf0 0a 20 20 20 20 70 46 72 6f 6d 20 3d 20 61 54 6f  .    pFrom = aTo
35c00 3b 0a 20 20 20 20 61 54 6f 20 3d 20 61 46 72 6f  ;.    aTo = aFro
35c10 6d 3b 0a 20 20 20 20 61 46 72 6f 6d 20 3d 20 70  m;.    aFrom = p
35c20 46 72 6f 6d 3b 0a 20 20 20 20 6e 46 72 6f 6d 20  From;.    nFrom 
35c30 3d 20 6e 54 6f 3b 0a 20 20 7d 0a 0a 20 20 69 66  = nTo;.  }..  if
35c40 28 20 6e 46 72 6f 6d 3d 3d 30 20 29 7b 0a 20 20  ( nFrom==0 ){.  
35c50 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
35c60 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 71 75  g(pParse, "no qu
35c70 65 72 79 20 73 6f 6c 75 74 69 6f 6e 22 29 3b 0a  ery solution");.
35c80 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
35c90 65 28 64 62 2c 20 70 53 70 61 63 65 29 3b 0a 20  e(db, pSpace);. 
35ca0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
35cb0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 0a 20  _ERROR;.  }.  . 
35cc0 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 6c 6f 77   /* Find the low
35cd0 65 73 74 20 63 6f 73 74 20 70 61 74 68 2e 20 20  est cost path.  
35ce0 70 46 72 6f 6d 20 77 69 6c 6c 20 62 65 20 6c 65  pFrom will be le
35cf0 66 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  ft pointing to t
35d00 68 61 74 20 70 61 74 68 20 2a 2f 0a 20 20 70 46  hat path */.  pF
35d10 72 6f 6d 20 3d 20 61 46 72 6f 6d 3b 0a 20 20 66  rom = aFrom;.  f
35d20 6f 72 28 69 69 3d 31 3b 20 69 69 3c 6e 46 72 6f  or(ii=1; ii<nFro
35d30 6d 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 69 66  m; ii++){.    if
35d40 28 20 70 46 72 6f 6d 2d 3e 72 43 6f 73 74 3e 61  ( pFrom->rCost>a
35d50 46 72 6f 6d 5b 69 69 5d 2e 72 43 6f 73 74 20 29  From[ii].rCost )
35d60 20 70 46 72 6f 6d 20 3d 20 26 61 46 72 6f 6d 5b   pFrom = &aFrom[
35d70 69 69 5d 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  ii];.  }.  asser
35d80 74 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65  t( pWInfo->nLeve
35d90 6c 3d 3d 6e 4c 6f 6f 70 20 29 3b 0a 20 20 2f 2a  l==nLoop );.  /*
35da0 20 4c 6f 61 64 20 74 68 65 20 6c 6f 77 65 73 74   Load the lowest
35db0 20 63 6f 73 74 20 70 61 74 68 20 69 6e 74 6f 20   cost path into 
35dc0 70 57 49 6e 66 6f 20 2a 2f 0a 20 20 66 6f 72 28  pWInfo */.  for(
35dd0 69 4c 6f 6f 70 3d 30 3b 20 69 4c 6f 6f 70 3c 6e  iLoop=0; iLoop<n
35de0 4c 6f 6f 70 3b 20 69 4c 6f 6f 70 2b 2b 29 7b 0a  Loop; iLoop++){.
35df0 20 20 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a      WhereLevel *
35e00 70 4c 65 76 65 6c 20 3d 20 70 57 49 6e 66 6f 2d  pLevel = pWInfo-
35e10 3e 61 20 2b 20 69 4c 6f 6f 70 3b 0a 20 20 20 20  >a + iLoop;.    
35e20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 20 3d  pLevel->pWLoop =
35e30 20 70 57 4c 6f 6f 70 20 3d 20 70 46 72 6f 6d 2d   pWLoop = pFrom-
35e40 3e 61 4c 6f 6f 70 5b 69 4c 6f 6f 70 5d 3b 0a 20  >aLoop[iLoop];. 
35e50 20 20 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d     pLevel->iFrom
35e60 20 3d 20 70 57 4c 6f 6f 70 2d 3e 69 54 61 62 3b   = pWLoop->iTab;
35e70 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 54 61  .    pLevel->iTa
35e80 62 43 75 72 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  bCur = pWInfo->p
35e90 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65  TabList->a[pLeve
35ea0 6c 2d 3e 69 46 72 6f 6d 5d 2e 69 43 75 72 73 6f  l->iFrom].iCurso
35eb0 72 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 57  r;.  }.  if( (pW
35ec0 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
35ed0 20 26 20 57 48 45 52 45 5f 57 41 4e 54 5f 44 49   & WHERE_WANT_DI
35ee0 53 54 49 4e 43 54 29 21 3d 30 0a 20 20 20 26 26  STINCT)!=0.   &&
35ef0 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46   (pWInfo->wctrlF
35f00 6c 61 67 73 20 26 20 57 48 45 52 45 5f 44 49 53  lags & WHERE_DIS
35f10 54 49 4e 43 54 42 59 29 3d 3d 30 0a 20 20 20 26  TINCTBY)==0.   &
35f20 26 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69  & pWInfo->eDisti
35f30 6e 63 74 3d 3d 57 48 45 52 45 5f 44 49 53 54 49  nct==WHERE_DISTI
35f40 4e 43 54 5f 4e 4f 4f 50 0a 20 20 20 26 26 20 6e  NCT_NOOP.   && n
35f50 52 6f 77 45 73 74 0a 20 20 29 7b 0a 20 20 20 20  RowEst.  ){.    
35f60 42 69 74 6d 61 73 6b 20 6e 6f 74 55 73 65 64 3b  Bitmask notUsed;
35f70 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 77 68  .    int rc = wh
35f80 65 72 65 50 61 74 68 53 61 74 69 73 66 69 65 73  erePathSatisfies
35f90 4f 72 64 65 72 42 79 28 70 57 49 6e 66 6f 2c 20  OrderBy(pWInfo, 
35fa0 70 57 49 6e 66 6f 2d 3e 70 52 65 73 75 6c 74 53  pWInfo->pResultS
35fb0 65 74 2c 20 70 46 72 6f 6d 2c 0a 20 20 20 20 20  et, pFrom,.     
35fc0 20 20 20 20 20 20 20 20 20 20 20 20 57 48 45 52              WHER
35fd0 45 5f 44 49 53 54 49 4e 43 54 42 59 2c 20 6e 4c  E_DISTINCTBY, nL
35fe0 6f 6f 70 2d 31 2c 20 70 46 72 6f 6d 2d 3e 61 4c  oop-1, pFrom->aL
35ff0 6f 6f 70 5b 6e 4c 6f 6f 70 2d 31 5d 2c 20 26 6e  oop[nLoop-1], &n
36000 6f 74 55 73 65 64 29 3b 0a 20 20 20 20 69 66 28  otUsed);.    if(
36010 20 72 63 3d 3d 70 57 49 6e 66 6f 2d 3e 70 52 65   rc==pWInfo->pRe
36020 73 75 6c 74 53 65 74 2d 3e 6e 45 78 70 72 20 29  sultSet->nExpr )
36030 7b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e  {.      pWInfo->
36040 65 44 69 73 74 69 6e 63 74 20 3d 20 57 48 45 52  eDistinct = WHER
36050 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44 45 52  E_DISTINCT_ORDER
36060 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ED;.    }.  }.  
36070 69 66 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64  if( pWInfo->pOrd
36080 65 72 42 79 20 29 7b 0a 20 20 20 20 69 66 28 20  erBy ){.    if( 
36090 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
360a0 67 73 20 26 20 57 48 45 52 45 5f 44 49 53 54 49  gs & WHERE_DISTI
360b0 4e 43 54 42 59 20 29 7b 0a 20 20 20 20 20 20 69  NCTBY ){.      i
360c0 66 28 20 70 46 72 6f 6d 2d 3e 69 73 4f 72 64 65  f( pFrom->isOrde
360d0 72 65 64 3d 3d 70 57 49 6e 66 6f 2d 3e 70 4f 72  red==pWInfo->pOr
360e0 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 29 7b 0a  derBy->nExpr ){.
360f0 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e          pWInfo->
36100 65 44 69 73 74 69 6e 63 74 20 3d 20 57 48 45 52  eDistinct = WHER
36110 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44 45 52  E_DISTINCT_ORDER
36120 45 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ED;.      }.    
36130 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 57 49  }else{.      pWI
36140 6e 66 6f 2d 3e 6e 4f 42 53 61 74 20 3d 20 70 46  nfo->nOBSat = pF
36150 72 6f 6d 2d 3e 69 73 4f 72 64 65 72 65 64 3b 0a  rom->isOrdered;.
36160 20 20 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f        if( pWInfo
36170 2d 3e 6e 4f 42 53 61 74 3c 30 20 29 20 70 57 49  ->nOBSat<0 ) pWI
36180 6e 66 6f 2d 3e 6e 4f 42 53 61 74 20 3d 20 30 3b  nfo->nOBSat = 0;
36190 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 72  .      pWInfo->r
361a0 65 76 4d 61 73 6b 20 3d 20 70 46 72 6f 6d 2d 3e  evMask = pFrom->
361b0 72 65 76 4c 6f 6f 70 3b 0a 20 20 20 20 7d 0a 20  revLoop;.    }. 
361c0 20 20 20 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e     if( (pWInfo->
361d0 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
361e0 52 45 5f 53 4f 52 54 42 59 47 52 4f 55 50 29 0a  RE_SORTBYGROUP).
361f0 20 20 20 20 20 20 20 20 26 26 20 70 57 49 6e 66          && pWInf
36200 6f 2d 3e 6e 4f 42 53 61 74 3d 3d 70 57 49 6e 66  o->nOBSat==pWInf
36210 6f 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  o->pOrderBy->nEx
36220 70 72 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  pr.    ){.      
36230 42 69 74 6d 61 73 6b 20 72 65 76 4d 61 73 6b 20  Bitmask revMask 
36240 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  = 0;.      int n
36250 4f 72 64 65 72 20 3d 20 77 68 65 72 65 50 61 74  Order = wherePat
36260 68 53 61 74 69 73 66 69 65 73 4f 72 64 65 72 42  hSatisfiesOrderB
36270 79 28 70 57 49 6e 66 6f 2c 20 70 57 49 6e 66 6f  y(pWInfo, pWInfo
36280 2d 3e 70 4f 72 64 65 72 42 79 2c 20 0a 20 20 20  ->pOrderBy, .   
36290 20 20 20 20 20 20 20 70 46 72 6f 6d 2c 20 30 2c         pFrom, 0,
362a0 20 6e 4c 6f 6f 70 2d 31 2c 20 70 46 72 6f 6d 2d   nLoop-1, pFrom-
362b0 3e 61 4c 6f 6f 70 5b 6e 4c 6f 6f 70 2d 31 5d 2c  >aLoop[nLoop-1],
362c0 20 26 72 65 76 4d 61 73 6b 0a 20 20 20 20 20 20   &revMask.      
362d0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
362e0 20 70 57 49 6e 66 6f 2d 3e 73 6f 72 74 65 64 3d   pWInfo->sorted=
362f0 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =0 );.      if( 
36300 6e 4f 72 64 65 72 3d 3d 70 57 49 6e 66 6f 2d 3e  nOrder==pWInfo->
36310 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20  pOrderBy->nExpr 
36320 29 7b 0a 20 20 20 20 20 20 20 20 70 57 49 6e 66  ){.        pWInf
36330 6f 2d 3e 73 6f 72 74 65 64 20 3d 20 31 3b 0a 20  o->sorted = 1;. 
36340 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 72         pWInfo->r
36350 65 76 4d 61 73 6b 20 3d 20 72 65 76 4d 61 73 6b  evMask = revMask
36360 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
36370 20 20 7d 0a 0a 0a 20 20 70 57 49 6e 66 6f 2d 3e    }...  pWInfo->
36380 6e 52 6f 77 4f 75 74 20 3d 20 70 46 72 6f 6d 2d  nRowOut = pFrom-
36390 3e 6e 52 6f 77 3b 0a 0a 20 20 2f 2a 20 46 72 65  >nRow;..  /* Fre
363a0 65 20 74 65 6d 70 6f 72 61 72 79 20 6d 65 6d 6f  e temporary memo
363b0 72 79 20 61 6e 64 20 72 65 74 75 72 6e 20 73 75  ry and return su
363c0 63 63 65 73 73 20 2a 2f 0a 20 20 73 71 6c 69 74  ccess */.  sqlit
363d0 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 53 70  e3DbFree(db, pSp
363e0 61 63 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  ace);.  return S
363f0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
36400 2a 2a 20 4d 6f 73 74 20 71 75 65 72 69 65 73 20  ** Most queries 
36410 75 73 65 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c  use only a singl
36420 65 20 74 61 62 6c 65 20 28 74 68 65 79 20 61 72  e table (they ar
36430 65 20 6e 6f 74 20 6a 6f 69 6e 73 29 20 61 6e 64  e not joins) and
36440 20 68 61 76 65 0a 2a 2a 20 73 69 6d 70 6c 65 20   have.** simple 
36450 3d 3d 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61  == constraints a
36460 67 61 69 6e 73 74 20 69 6e 64 65 78 65 64 20 66  gainst indexed f
36470 69 65 6c 64 73 2e 20 20 54 68 69 73 20 72 6f 75  ields.  This rou
36480 74 69 6e 65 20 61 74 74 65 6d 70 74 73 0a 2a 2a  tine attempts.**
36490 20 74 6f 20 70 6c 61 6e 20 74 68 6f 73 65 20 73   to plan those s
364a0 69 6d 70 6c 65 20 63 61 73 65 73 20 75 73 69 6e  imple cases usin
364b0 67 20 6d 75 63 68 20 6c 65 73 73 20 63 65 72 65  g much less cere
364c0 6d 6f 6e 79 20 74 68 61 6e 20 74 68 65 0a 2a 2a  mony than the.**
364d0 20 67 65 6e 65 72 61 6c 2d 70 75 72 70 6f 73 65   general-purpose
364e0 20 71 75 65 72 79 20 70 6c 61 6e 6e 65 72 2c 20   query planner, 
364f0 61 6e 64 20 74 68 65 72 65 62 79 20 79 69 65 6c  and thereby yiel
36500 64 20 66 61 73 74 65 72 20 73 71 6c 69 74 65 33  d faster sqlite3
36510 5f 70 72 65 70 61 72 65 28 29 0a 2a 2a 20 74 69  _prepare().** ti
36520 6d 65 73 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d  mes for the comm
36530 6f 6e 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 52  on case..**.** R
36540 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 6f  eturn non-zero o
36550 6e 20 73 75 63 63 65 73 73 2c 20 69 66 20 74 68  n success, if th
36560 69 73 20 71 75 65 72 79 20 63 61 6e 20 62 65 20  is query can be 
36570 68 61 6e 64 6c 65 64 20 62 79 20 74 68 69 73 0a  handled by this.
36580 2a 2a 20 6e 6f 2d 66 72 69 6c 6c 73 20 71 75 65  ** no-frills que
36590 72 79 20 70 6c 61 6e 6e 65 72 2e 20 20 52 65 74  ry planner.  Ret
365a0 75 72 6e 20 7a 65 72 6f 20 69 66 20 74 68 69 73  urn zero if this
365b0 20 71 75 65 72 79 20 6e 65 65 64 73 20 74 68 65   query needs the
365c0 20 0a 2a 2a 20 67 65 6e 65 72 61 6c 2d 70 75 72   .** general-pur
365d0 70 6f 73 65 20 71 75 65 72 79 20 70 6c 61 6e 6e  pose query plann
365e0 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
365f0 74 20 77 68 65 72 65 53 68 6f 72 74 43 75 74 28  t whereShortCut(
36600 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72  WhereLoopBuilder
36610 20 2a 70 42 75 69 6c 64 65 72 29 7b 0a 20 20 57   *pBuilder){.  W
36620 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
36630 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  ;.  struct SrcLi
36640 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
36650 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
36660 57 43 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20  WC;.  WhereTerm 
36670 2a 70 54 65 72 6d 3b 0a 20 20 57 68 65 72 65 4c  *pTerm;.  WhereL
36680 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 0a 20 20 69 6e  oop *pLoop;.  in
36690 74 20 69 43 75 72 3b 0a 20 20 69 6e 74 20 6a 3b  t iCur;.  int j;
366a0 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a  .  Table *pTab;.
366b0 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20    Index *pIdx;. 
366c0 20 0a 20 20 70 57 49 6e 66 6f 20 3d 20 70 42 75   .  pWInfo = pBu
366d0 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20  ilder->pWInfo;. 
366e0 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 77 63 74   if( pWInfo->wct
366f0 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
36700 46 4f 52 43 45 5f 54 41 42 4c 45 20 29 20 72 65  FORCE_TABLE ) re
36710 74 75 72 6e 20 30 3b 0a 20 20 61 73 73 65 72 74  turn 0;.  assert
36720 28 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69  ( pWInfo->pTabLi
36730 73 74 2d 3e 6e 53 72 63 3e 3d 31 20 29 3b 0a 20  st->nSrc>=1 );. 
36740 20 70 49 74 65 6d 20 3d 20 70 57 49 6e 66 6f 2d   pItem = pWInfo-
36750 3e 70 54 61 62 4c 69 73 74 2d 3e 61 3b 0a 20 20  >pTabList->a;.  
36760 70 54 61 62 20 3d 20 70 49 74 65 6d 2d 3e 70 54  pTab = pItem->pT
36770 61 62 3b 0a 20 20 69 66 28 20 49 73 56 69 72 74  ab;.  if( IsVirt
36780 75 61 6c 28 70 54 61 62 29 20 29 20 72 65 74 75  ual(pTab) ) retu
36790 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 49 74 65  rn 0;.  if( pIte
367a0 6d 2d 3e 7a 49 6e 64 65 78 20 29 20 72 65 74 75  m->zIndex ) retu
367b0 72 6e 20 30 3b 0a 20 20 69 43 75 72 20 3d 20 70  rn 0;.  iCur = p
367c0 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20  Item->iCursor;. 
367d0 20 70 57 43 20 3d 20 26 70 57 49 6e 66 6f 2d 3e   pWC = &pWInfo->
367e0 73 57 43 3b 0a 20 20 70 4c 6f 6f 70 20 3d 20 70  sWC;.  pLoop = p
367f0 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20  Builder->pNew;. 
36800 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20   pLoop->wsFlags 
36810 3d 20 30 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 6e 53  = 0;.  pLoop->nS
36820 6b 69 70 20 3d 20 30 3b 0a 20 20 70 54 65 72 6d  kip = 0;.  pTerm
36830 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c   = findTerm(pWC,
36840 20 69 43 75 72 2c 20 2d 31 2c 20 30 2c 20 57 4f   iCur, -1, 0, WO
36850 5f 45 51 2c 20 30 29 3b 0a 20 20 69 66 28 20 70  _EQ, 0);.  if( p
36860 54 65 72 6d 20 29 7b 0a 20 20 20 20 70 4c 6f 6f  Term ){.    pLoo
36870 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45  p->wsFlags = WHE
36880 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 7c 57 48 45  RE_COLUMN_EQ|WHE
36890 52 45 5f 49 50 4b 7c 57 48 45 52 45 5f 4f 4e 45  RE_IPK|WHERE_ONE
368a0 52 4f 57 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e  ROW;.    pLoop->
368b0 61 4c 54 65 72 6d 5b 30 5d 20 3d 20 70 54 65 72  aLTerm[0] = pTer
368c0 6d 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4c  m;.    pLoop->nL
368d0 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 70 4c  Term = 1;.    pL
368e0 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  oop->u.btree.nEq
368f0 20 3d 20 31 3b 0a 20 20 20 20 2f 2a 20 54 55 4e   = 1;.    /* TUN
36900 49 4e 47 3a 20 43 6f 73 74 20 6f 66 20 61 20 72  ING: Cost of a r
36910 6f 77 69 64 20 6c 6f 6f 6b 75 70 20 69 73 20 31  owid lookup is 1
36920 30 20 2a 2f 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e  0 */.    pLoop->
36930 72 52 75 6e 20 3d 20 33 33 3b 20 20 2f 2a 20 33  rRun = 33;  /* 3
36940 33 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  3==sqlite3LogEst
36950 28 31 30 29 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b  (10) */.  }else{
36960 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54  .    for(pIdx=pT
36970 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78  ab->pIndex; pIdx
36980 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65  ; pIdx=pIdx->pNe
36990 78 74 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  xt){.      asser
369a0 74 28 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d  t( pLoop->aLTerm
369b0 53 70 61 63 65 3d 3d 70 4c 6f 6f 70 2d 3e 61 4c  Space==pLoop->aL
369c0 54 65 72 6d 20 29 3b 0a 20 20 20 20 20 20 69 66  Term );.      if
369d0 28 20 21 49 73 55 6e 69 71 75 65 49 6e 64 65 78  ( !IsUniqueIndex
369e0 28 70 49 64 78 29 0a 20 20 20 20 20 20 20 7c 7c  (pIdx).       ||
369f0 20 70 49 64 78 2d 3e 70 50 61 72 74 49 64 78 57   pIdx->pPartIdxW
36a00 68 65 72 65 21 3d 30 20 0a 20 20 20 20 20 20 20  here!=0 .       
36a10 7c 7c 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c  || pIdx->nKeyCol
36a20 3e 41 72 72 61 79 53 69 7a 65 28 70 4c 6f 6f 70  >ArraySize(pLoop
36a30 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 29 20 0a  ->aLTermSpace) .
36a40 20 20 20 20 20 20 29 20 63 6f 6e 74 69 6e 75 65        ) continue
36a50 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ;.      for(j=0;
36a60 20 6a 3c 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c   j<pIdx->nKeyCol
36a70 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
36a80 70 54 65 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d  pTerm = findTerm
36a90 28 70 57 43 2c 20 69 43 75 72 2c 20 70 49 64 78  (pWC, iCur, pIdx
36aa0 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 2c 20 30  ->aiColumn[j], 0
36ab0 2c 20 57 4f 5f 45 51 2c 20 70 49 64 78 29 3b 0a  , WO_EQ, pIdx);.
36ac0 20 20 20 20 20 20 20 20 69 66 28 20 70 54 65 72          if( pTer
36ad0 6d 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  m==0 ) break;.  
36ae0 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 61 4c 54        pLoop->aLT
36af0 65 72 6d 5b 6a 5d 20 3d 20 70 54 65 72 6d 3b 0a  erm[j] = pTerm;.
36b00 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
36b10 28 20 6a 21 3d 70 49 64 78 2d 3e 6e 4b 65 79 43  ( j!=pIdx->nKeyC
36b20 6f 6c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ol ) continue;. 
36b30 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c       pLoop->wsFl
36b40 61 67 73 20 3d 20 57 48 45 52 45 5f 43 4f 4c 55  ags = WHERE_COLU
36b50 4d 4e 5f 45 51 7c 57 48 45 52 45 5f 4f 4e 45 52  MN_EQ|WHERE_ONER
36b60 4f 57 7c 57 48 45 52 45 5f 49 4e 44 45 58 45 44  OW|WHERE_INDEXED
36b70 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 64 78  ;.      if( pIdx
36b80 2d 3e 69 73 43 6f 76 65 72 69 6e 67 20 7c 7c 20  ->isCovering || 
36b90 28 70 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 20  (pItem->colUsed 
36ba0 26 20 7e 63 6f 6c 75 6d 6e 73 49 6e 49 6e 64 65  & ~columnsInInde
36bb0 78 28 70 49 64 78 29 29 3d 3d 30 20 29 7b 0a 20  x(pIdx))==0 ){. 
36bc0 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 77 73         pLoop->ws
36bd0 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 49  Flags |= WHERE_I
36be0 44 58 5f 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d  DX_ONLY;.      }
36bf0 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4c  .      pLoop->nL
36c00 54 65 72 6d 20 3d 20 6a 3b 0a 20 20 20 20 20 20  Term = j;.      
36c10 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e  pLoop->u.btree.n
36c20 45 71 20 3d 20 6a 3b 0a 20 20 20 20 20 20 70 4c  Eq = j;.      pL
36c30 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  oop->u.btree.pIn
36c40 64 65 78 20 3d 20 70 49 64 78 3b 0a 20 20 20 20  dex = pIdx;.    
36c50 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 43 6f 73    /* TUNING: Cos
36c60 74 20 6f 66 20 61 20 75 6e 69 71 75 65 20 69 6e  t of a unique in
36c70 64 65 78 20 6c 6f 6f 6b 75 70 20 69 73 20 31 35  dex lookup is 15
36c80 20 2a 2f 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d   */.      pLoop-
36c90 3e 72 52 75 6e 20 3d 20 33 39 3b 20 20 2f 2a 20  >rRun = 39;  /* 
36ca0 33 39 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73  39==sqlite3LogEs
36cb0 74 28 31 35 29 20 2a 2f 0a 20 20 20 20 20 20 62  t(15) */.      b
36cc0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
36cd0 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46    if( pLoop->wsF
36ce0 6c 61 67 73 20 29 7b 0a 20 20 20 20 70 4c 6f 6f  lags ){.    pLoo
36cf0 70 2d 3e 6e 4f 75 74 20 3d 20 28 4c 6f 67 45 73  p->nOut = (LogEs
36d00 74 29 31 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d  t)1;.    pWInfo-
36d10 3e 61 5b 30 5d 2e 70 57 4c 6f 6f 70 20 3d 20 70  >a[0].pWLoop = p
36d20 4c 6f 6f 70 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d  Loop;.    pLoop-
36d30 3e 6d 61 73 6b 53 65 6c 66 20 3d 20 67 65 74 4d  >maskSelf = getM
36d40 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61  ask(&pWInfo->sMa
36d50 73 6b 53 65 74 2c 20 69 43 75 72 29 3b 0a 20 20  skSet, iCur);.  
36d60 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 69    pWInfo->a[0].i
36d70 54 61 62 43 75 72 20 3d 20 69 43 75 72 3b 0a 20  TabCur = iCur;. 
36d80 20 20 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f     pWInfo->nRowO
36d90 75 74 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20  ut = 1;.    if( 
36da0 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79  pWInfo->pOrderBy
36db0 20 29 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61   ) pWInfo->nOBSa
36dc0 74 20 3d 20 20 70 57 49 6e 66 6f 2d 3e 70 4f 72  t =  pWInfo->pOr
36dd0 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20  derBy->nExpr;.  
36de0 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 77 63    if( pWInfo->wc
36df0 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
36e00 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 20 29  _WANT_DISTINCT )
36e10 7b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e  {.      pWInfo->
36e20 65 44 69 73 74 69 6e 63 74 20 3d 20 57 48 45 52  eDistinct = WHER
36e30 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49 51 55  E_DISTINCT_UNIQU
36e40 45 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20  E;.    }.#ifdef 
36e50 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20  SQLITE_DEBUG.   
36e60 20 70 4c 6f 6f 70 2d 3e 63 49 64 20 3d 20 27 30   pLoop->cId = '0
36e70 27 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65  ';.#endif.    re
36e80 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65  turn 1;.  }.  re
36e90 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
36ea0 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 62 65   Generate the be
36eb0 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 6c  ginning of the l
36ec0 6f 6f 70 20 75 73 65 64 20 66 6f 72 20 57 48 45  oop used for WHE
36ed0 52 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73  RE clause proces
36ee0 73 69 6e 67 2e 0a 2a 2a 20 54 68 65 20 72 65 74  sing..** The ret
36ef0 75 72 6e 20 76 61 6c 75 65 20 69 73 20 61 20 70  urn value is a p
36f00 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f 70 61  ointer to an opa
36f10 71 75 65 20 73 74 72 75 63 74 75 72 65 20 74 68  que structure th
36f20 61 74 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 69  at contains.** i
36f30 6e 66 6f 72 6d 61 74 69 6f 6e 20 6e 65 65 64 65  nformation neede
36f40 64 20 74 6f 20 74 65 72 6d 69 6e 61 74 65 20 74  d to terminate t
36f50 68 65 20 6c 6f 6f 70 2e 20 20 4c 61 74 65 72 2c  he loop.  Later,
36f60 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 72 6f 75   the calling rou
36f70 74 69 6e 65 0a 2a 2a 20 73 68 6f 75 6c 64 20 69  tine.** should i
36f80 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33 57 68 65  nvoke sqlite3Whe
36f90 72 65 45 6e 64 28 29 20 77 69 74 68 20 74 68 65  reEnd() with the
36fa0 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66   return value of
36fb0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a   this function.*
36fc0 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f  * in order to co
36fd0 6d 70 6c 65 74 65 20 74 68 65 20 57 48 45 52 45  mplete the WHERE
36fe0 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69   clause processi
36ff0 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ng..**.** If an 
37000 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68  error occurs, th
37010 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
37020 6e 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54  ns NULL..**.** T
37030 68 65 20 62 61 73 69 63 20 69 64 65 61 20 69 73  he basic idea is
37040 20 74 6f 20 64 6f 20 61 20 6e 65 73 74 65 64 20   to do a nested 
37050 6c 6f 6f 70 2c 20 6f 6e 65 20 6c 6f 6f 70 20 66  loop, one loop f
37060 6f 72 20 65 61 63 68 20 74 61 62 6c 65 20 69 6e  or each table in
37070 0a 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61  .** the FROM cla
37080 75 73 65 20 6f 66 20 61 20 73 65 6c 65 63 74 2e  use of a select.
37090 20 20 28 49 4e 53 45 52 54 20 61 6e 64 20 55 50    (INSERT and UP
370a0 44 41 54 45 20 73 74 61 74 65 6d 65 6e 74 73 20  DATE statements 
370b0 61 72 65 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20  are the.** same 
370c0 61 73 20 61 20 53 45 4c 45 43 54 20 77 69 74 68  as a SELECT with
370d0 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 74   only a single t
370e0 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52 4f 4d  able in the FROM
370f0 20 63 6c 61 75 73 65 2e 29 20 20 46 6f 72 0a 2a   clause.)  For.*
37100 2a 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68  * example, if th
37110 65 20 53 51 4c 20 69 73 20 74 68 69 73 3a 0a 2a  e SQL is this:.*
37120 2a 0a 2a 2a 20 20 20 20 20 20 20 53 45 4c 45 43  *.**       SELEC
37130 54 20 2a 20 46 52 4f 4d 20 74 31 2c 20 74 32 2c  T * FROM t1, t2,
37140 20 74 33 20 57 48 45 52 45 20 2e 2e 2e 3b 0a 2a   t3 WHERE ...;.*
37150 2a 0a 2a 2a 20 54 68 65 6e 20 74 68 65 20 63 6f  *.** Then the co
37160 64 65 20 67 65 6e 65 72 61 74 65 64 20 69 73 20  de generated is 
37170 63 6f 6e 63 65 70 74 75 61 6c 6c 79 20 6c 69 6b  conceptually lik
37180 65 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  e the following:
37190 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 66 6f 72 65  .**.**      fore
371a0 61 63 68 20 72 6f 77 31 20 69 6e 20 74 31 20 64  ach row1 in t1 d
371b0 6f 20 20 20 20 20 20 20 5c 20 20 20 20 43 6f 64  o       \    Cod
371c0 65 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20 20  e generated.**  
371d0 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f        foreach ro
371e0 77 32 20 69 6e 20 74 32 20 64 6f 20 20 20 20 20  w2 in t2 do     
371f0 20 7c 2d 2d 20 62 79 20 73 71 6c 69 74 65 33 57   |-- by sqlite3W
37200 68 65 72 65 42 65 67 69 6e 28 29 0a 2a 2a 20 20  hereBegin().**  
37210 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20          foreach 
37220 72 6f 77 33 20 69 6e 20 74 33 20 64 6f 20 20 20  row3 in t3 do   
37230 2f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  /.**            
37240 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ....**          
37250 65 6e 64 20 20 20 20 20 20 20 20 20 20 20 20 20  end             
37260 20 20 20 20 20 20 20 20 5c 20 20 20 20 43 6f 64          \    Cod
37270 65 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20 20  e generated.**  
37280 20 20 20 20 20 20 65 6e 64 20 20 20 20 20 20 20        end       
37290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
372a0 20 7c 2d 2d 20 62 79 20 73 71 6c 69 74 65 33 57   |-- by sqlite3W
372b0 68 65 72 65 45 6e 64 28 29 0a 2a 2a 20 20 20 20  hereEnd().**    
372c0 20 20 65 6e 64 20 20 20 20 20 20 20 20 20 20 20    end           
372d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 0a                /.
372e0 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
372f0 74 68 65 20 6c 6f 6f 70 73 20 6d 69 67 68 74 20  the loops might 
37300 6e 6f 74 20 62 65 20 6e 65 73 74 65 64 20 69 6e  not be nested in
37310 20 74 68 65 20 6f 72 64 65 72 20 69 6e 20 77 68   the order in wh
37320 69 63 68 20 74 68 65 79 0a 2a 2a 20 61 70 70 65  ich they.** appe
37330 61 72 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  ar in the FROM c
37340 6c 61 75 73 65 20 69 66 20 61 20 64 69 66 66 65  lause if a diffe
37350 72 65 6e 74 20 6f 72 64 65 72 20 69 73 20 62 65  rent order is be
37360 74 74 65 72 20 61 62 6c 65 20 74 6f 20 6d 61 6b  tter able to mak
37370 65 0a 2a 2a 20 75 73 65 20 6f 66 20 69 6e 64 69  e.** use of indi
37380 63 65 73 2e 20 20 4e 6f 74 65 20 61 6c 73 6f 20  ces.  Note also 
37390 74 68 61 74 20 77 68 65 6e 20 74 68 65 20 49 4e  that when the IN
373a0 20 6f 70 65 72 61 74 6f 72 20 61 70 70 65 61 72   operator appear
373b0 73 20 69 6e 0a 2a 2a 20 74 68 65 20 57 48 45 52  s in.** the WHER
373c0 45 20 63 6c 61 75 73 65 2c 20 69 74 20 6d 69 67  E clause, it mig
373d0 68 74 20 72 65 73 75 6c 74 20 69 6e 20 61 64 64  ht result in add
373e0 69 74 69 6f 6e 61 6c 20 6e 65 73 74 65 64 20 6c  itional nested l
373f0 6f 6f 70 73 20 66 6f 72 0a 2a 2a 20 73 63 61 6e  oops for.** scan
37400 6e 69 6e 67 20 74 68 72 6f 75 67 68 20 61 6c 6c  ning through all
37410 20 76 61 6c 75 65 73 20 6f 6e 20 74 68 65 20 72   values on the r
37420 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f  ight-hand side o
37430 66 20 74 68 65 20 49 4e 2e 0a 2a 2a 0a 2a 2a 20  f the IN..**.** 
37440 54 68 65 72 65 20 61 72 65 20 42 74 72 65 65 20  There are Btree 
37450 63 75 72 73 6f 72 73 20 61 73 73 6f 63 69 61 74  cursors associat
37460 65 64 20 77 69 74 68 20 65 61 63 68 20 74 61 62  ed with each tab
37470 6c 65 2e 20 20 74 31 20 75 73 65 73 20 63 75 72  le.  t1 uses cur
37480 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65 72 20 70 54  sor.** number pT
37490 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e 69 43 75  abList->a[0].iCu
374a0 72 73 6f 72 2e 20 20 74 32 20 75 73 65 73 20 74  rsor.  t2 uses t
374b0 68 65 20 63 75 72 73 6f 72 20 70 54 61 62 4c 69  he cursor pTabLi
374c0 73 74 2d 3e 61 5b 31 5d 2e 69 43 75 72 73 6f 72  st->a[1].iCursor
374d0 2e 0a 2a 2a 20 41 6e 64 20 73 6f 20 66 6f 72 74  ..** And so fort
374e0 68 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  h.  This routine
374f0 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20   generates code 
37500 74 6f 20 6f 70 65 6e 20 74 68 6f 73 65 20 56 44  to open those VD
37510 42 45 20 63 75 72 73 6f 72 73 0a 2a 2a 20 61 6e  BE cursors.** an
37520 64 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e  d sqlite3WhereEn
37530 64 28 29 20 67 65 6e 65 72 61 74 65 73 20 74 68  d() generates th
37540 65 20 63 6f 64 65 20 74 6f 20 63 6c 6f 73 65 20  e code to close 
37550 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  them..**.** The 
37560 63 6f 64 65 20 74 68 61 74 20 73 71 6c 69 74 65  code that sqlite
37570 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 67 65  3WhereBegin() ge
37580 6e 65 72 61 74 65 73 20 6c 65 61 76 65 73 20 74  nerates leaves t
37590 68 65 20 63 75 72 73 6f 72 73 20 6e 61 6d 65 64  he cursors named
375a0 0a 2a 2a 20 69 6e 20 70 54 61 62 4c 69 73 74 20  .** in pTabList 
375b0 70 6f 69 6e 74 69 6e 67 20 61 74 20 74 68 65 69  pointing at thei
375c0 72 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 6e  r appropriate en
375d0 74 72 69 65 73 2e 20 20 54 68 65 20 5b 2e 2e 2e  tries.  The [...
375e0 5d 20 63 6f 64 65 0a 2a 2a 20 63 61 6e 20 75 73  ] code.** can us
375f0 65 20 4f 50 5f 43 6f 6c 75 6d 6e 20 61 6e 64 20  e OP_Column and 
37600 4f 50 5f 52 6f 77 69 64 20 6f 70 63 6f 64 65 73  OP_Rowid opcodes
37610 20 6f 6e 20 74 68 65 73 65 20 63 75 72 73 6f 72   on these cursor
37620 73 20 74 6f 20 65 78 74 72 61 63 74 0a 2a 2a 20  s to extract.** 
37630 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 76 61  data from the va
37640 72 69 6f 75 73 20 74 61 62 6c 65 73 20 6f 66 20  rious tables of 
37650 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20  the loop..**.** 
37660 49 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  If the WHERE cla
37670 75 73 65 20 69 73 20 65 6d 70 74 79 2c 20 74 68  use is empty, th
37680 65 20 66 6f 72 65 61 63 68 20 6c 6f 6f 70 73 20  e foreach loops 
37690 6d 75 73 74 20 65 61 63 68 20 73 63 61 6e 20 74  must each scan t
376a0 68 65 69 72 0a 2a 2a 20 65 6e 74 69 72 65 20 74  heir.** entire t
376b0 61 62 6c 65 73 2e 20 20 54 68 75 73 20 61 20 74  ables.  Thus a t
376c0 68 72 65 65 2d 77 61 79 20 6a 6f 69 6e 20 69 73  hree-way join is
376d0 20 61 6e 20 4f 28 4e 5e 33 29 20 6f 70 65 72 61   an O(N^3) opera
376e0 74 69 6f 6e 2e 20 20 42 75 74 20 69 66 0a 2a 2a  tion.  But if.**
376f0 20 74 68 65 20 74 61 62 6c 65 73 20 68 61 76 65   the tables have
37700 20 69 6e 64 69 63 65 73 20 61 6e 64 20 74 68 65   indices and the
37710 72 65 20 61 72 65 20 74 65 72 6d 73 20 69 6e 20  re are terms in 
37720 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
37730 20 74 68 61 74 0a 2a 2a 20 72 65 66 65 72 20 74   that.** refer t
37740 6f 20 74 68 6f 73 65 20 69 6e 64 69 63 65 73 2c  o those indices,
37750 20 61 20 63 6f 6d 70 6c 65 74 65 20 74 61 62 6c   a complete tabl
37760 65 20 73 63 61 6e 20 63 61 6e 20 62 65 20 61 76  e scan can be av
37770 6f 69 64 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a  oided and the.**
37780 20 63 6f 64 65 20 77 69 6c 6c 20 72 75 6e 20 6d   code will run m
37790 75 63 68 20 66 61 73 74 65 72 2e 20 20 4d 6f 73  uch faster.  Mos
377a0 74 20 6f 66 20 74 68 65 20 77 6f 72 6b 20 6f 66  t of the work of
377b0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
377c0 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 74 6f 20   checking.** to 
377d0 73 65 65 20 69 66 20 74 68 65 72 65 20 61 72 65  see if there are
377e0 20 69 6e 64 69 63 65 73 20 74 68 61 74 20 63 61   indices that ca
377f0 6e 20 62 65 20 75 73 65 64 20 74 6f 20 73 70 65  n be used to spe
37800 65 64 20 75 70 20 74 68 65 20 6c 6f 6f 70 2e 0a  ed up the loop..
37810 2a 2a 0a 2a 2a 20 54 65 72 6d 73 20 6f 66 20 74  **.** Terms of t
37820 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
37830 61 72 65 20 61 6c 73 6f 20 75 73 65 64 20 74 6f  are also used to
37840 20 6c 69 6d 69 74 20 77 68 69 63 68 20 72 6f 77   limit which row
37850 73 20 61 63 74 75 61 6c 6c 79 0a 2a 2a 20 6d 61  s actually.** ma
37860 6b 65 20 69 74 20 74 6f 20 74 68 65 20 22 2e 2e  ke it to the "..
37870 2e 22 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65  ." in the middle
37880 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20 20 41   of the loop.  A
37890 66 74 65 72 20 65 61 63 68 20 22 66 6f 72 65 61  fter each "forea
378a0 63 68 22 2c 0a 2a 2a 20 74 65 72 6d 73 20 6f 66  ch",.** terms of
378b0 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
378c0 65 20 74 68 61 74 20 75 73 65 20 6f 6e 6c 79 20  e that use only 
378d0 74 65 72 6d 73 20 69 6e 20 74 68 61 74 20 6c 6f  terms in that lo
378e0 6f 70 20 61 6e 64 20 6f 75 74 65 72 0a 2a 2a 20  op and outer.** 
378f0 6c 6f 6f 70 73 20 61 72 65 20 65 76 61 6c 75 61  loops are evalua
37900 74 65 64 20 61 6e 64 20 69 66 20 66 61 6c 73 65  ted and if false
37910 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 20   a jump is made 
37920 61 72 6f 75 6e 64 20 61 6c 6c 20 73 75 62 73 65  around all subse
37930 71 75 65 6e 74 0a 2a 2a 20 69 6e 6e 65 72 20 6c  quent.** inner l
37940 6f 6f 70 73 20 28 6f 72 20 61 72 6f 75 6e 64 20  oops (or around 
37950 74 68 65 20 22 2e 2e 2e 22 20 69 66 20 74 68 65  the "..." if the
37960 20 74 65 73 74 20 6f 63 63 75 72 73 20 77 69 74   test occurs wit
37970 68 69 6e 20 74 68 65 20 69 6e 6e 65 72 2d 0a 2a  hin the inner-.*
37980 2a 20 6d 6f 73 74 20 6c 6f 6f 70 29 0a 2a 2a 0a  * most loop).**.
37990 2a 2a 20 4f 55 54 45 52 20 4a 4f 49 4e 53 0a 2a  ** OUTER JOINS.*
379a0 2a 0a 2a 2a 20 41 6e 20 6f 75 74 65 72 20 6a 6f  *.** An outer jo
379b0 69 6e 20 6f 66 20 74 61 62 6c 65 73 20 74 31 20  in of tables t1 
379c0 61 6e 64 20 74 32 20 69 73 20 63 6f 6e 63 65 70  and t2 is concep
379d0 74 61 6c 6c 79 20 63 6f 64 65 64 20 61 73 20 66  tally coded as f
379e0 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
379f0 20 66 6f 72 65 61 63 68 20 72 6f 77 31 20 69 6e   foreach row1 in
37a00 20 74 31 20 64 6f 0a 2a 2a 20 20 20 20 20 20 66   t1 do.**      f
37a10 6c 61 67 20 3d 20 30 0a 2a 2a 20 20 20 20 20 20  lag = 0.**      
37a20 66 6f 72 65 61 63 68 20 72 6f 77 32 20 69 6e 20  foreach row2 in 
37a30 74 32 20 64 6f 0a 2a 2a 20 20 20 20 20 20 20 20  t2 do.**        
37a40 73 74 61 72 74 3a 0a 2a 2a 20 20 20 20 20 20 20  start:.**       
37a50 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20     ....**       
37a60 20 20 20 66 6c 61 67 20 3d 20 31 0a 2a 2a 20 20     flag = 1.**  
37a70 20 20 20 20 65 6e 64 0a 2a 2a 20 20 20 20 20 20      end.**      
37a80 69 66 20 66 6c 61 67 3d 3d 30 20 74 68 65 6e 0a  if flag==0 then.
37a90 2a 2a 20 20 20 20 20 20 20 20 6d 6f 76 65 20 74  **        move t
37aa0 68 65 20 72 6f 77 32 20 63 75 72 73 6f 72 20 74  he row2 cursor t
37ab0 6f 20 61 20 6e 75 6c 6c 20 72 6f 77 0a 2a 2a 20  o a null row.** 
37ac0 20 20 20 20 20 20 20 67 6f 74 6f 20 73 74 61 72         goto star
37ad0 74 0a 2a 2a 20 20 20 20 20 20 66 69 0a 2a 2a 20  t.**      fi.** 
37ae0 20 20 20 65 6e 64 0a 2a 2a 0a 2a 2a 20 4f 52 44     end.**.** ORD
37af0 45 52 20 42 59 20 43 4c 41 55 53 45 20 50 52 4f  ER BY CLAUSE PRO
37b00 43 45 53 53 49 4e 47 0a 2a 2a 0a 2a 2a 20 70 4f  CESSING.**.** pO
37b10 72 64 65 72 42 79 20 69 73 20 61 20 70 6f 69 6e  rderBy is a poin
37b20 74 65 72 20 74 6f 20 74 68 65 20 4f 52 44 45 52  ter to the ORDER
37b30 20 42 59 20 63 6c 61 75 73 65 20 28 6f 72 20 74   BY clause (or t
37b40 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75  he GROUP BY clau
37b50 73 65 0a 2a 2a 20 69 66 20 74 68 65 20 57 48 45  se.** if the WHE
37b60 52 45 5f 47 52 4f 55 50 42 59 20 66 6c 61 67 20  RE_GROUPBY flag 
37b70 69 73 20 73 65 74 20 69 6e 20 77 63 74 72 6c 46  is set in wctrlF
37b80 6c 61 67 73 29 20 6f 66 20 61 20 53 45 4c 45 43  lags) of a SELEC
37b90 54 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 69  T statement.** i
37ba0 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65 2e 20  f there is one. 
37bb0 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   If there is no 
37bc0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
37bd0 6f 72 20 69 66 20 74 68 69 73 20 72 6f 75 74 69  or if this routi
37be0 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20  ne.** is called 
37bf0 66 72 6f 6d 20 61 6e 20 55 50 44 41 54 45 20 6f  from an UPDATE o
37c00 72 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65  r DELETE stateme
37c10 6e 74 2c 20 74 68 65 6e 20 70 4f 72 64 65 72 42  nt, then pOrderB
37c20 79 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  y is NULL..**.**
37c30 20 54 68 65 20 69 49 64 78 43 75 72 20 70 61 72   The iIdxCur par
37c40 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 63 75  ameter is the cu
37c50 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 61  rsor number of a
37c60 6e 20 69 6e 64 65 78 2e 20 20 49 66 20 0a 2a 2a  n index.  If .**
37c70 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f   WHERE_ONETABLE_
37c80 4f 4e 4c 59 20 69 73 20 73 65 74 2c 20 69 49 64  ONLY is set, iId
37c90 78 43 75 72 20 69 73 20 74 68 65 20 63 75 72 73  xCur is the curs
37ca0 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 61 6e 20  or number of an 
37cb0 69 6e 64 65 78 0a 2a 2a 20 74 6f 20 75 73 65 20  index.** to use 
37cc0 66 6f 72 20 4f 52 20 63 6c 61 75 73 65 20 70 72  for OR clause pr
37cd0 6f 63 65 73 73 69 6e 67 2e 20 20 54 68 65 20 57  ocessing.  The W
37ce0 48 45 52 45 20 63 6c 61 75 73 65 20 73 68 6f 75  HERE clause shou
37cf0 6c 64 20 75 73 65 20 74 68 69 73 0a 2a 2a 20 73  ld use this.** s
37d00 70 65 63 69 66 69 63 20 63 75 72 73 6f 72 2e 20  pecific cursor. 
37d10 20 49 66 20 57 48 45 52 45 5f 4f 4e 45 50 41 53   If WHERE_ONEPAS
37d20 53 5f 44 45 53 49 52 45 44 20 69 73 20 73 65 74  S_DESIRED is set
37d30 2c 20 74 68 65 6e 20 69 49 64 78 43 75 72 20 69  , then iIdxCur i
37d40 73 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 63  s.** the first c
37d50 75 72 73 6f 72 20 69 6e 20 61 6e 20 61 72 72 61  ursor in an arra
37d60 79 20 6f 66 20 63 75 72 73 6f 72 73 20 66 6f 72  y of cursors for
37d70 20 61 6c 6c 20 69 6e 64 69 63 65 73 2e 20 20 69   all indices.  i
37d80 49 64 78 43 75 72 20 73 68 6f 75 6c 64 0a 2a 2a  IdxCur should.**
37d90 20 62 65 20 75 73 65 64 20 74 6f 20 63 6f 6d 70   be used to comp
37da0 75 74 65 20 74 68 65 20 61 70 70 72 6f 70 72 69  ute the appropri
37db0 61 74 65 20 63 75 72 73 6f 72 20 64 65 70 65 6e  ate cursor depen
37dc0 64 69 6e 67 20 6f 6e 20 77 68 69 63 68 20 69 6e  ding on which in
37dd0 64 65 78 20 69 73 0a 2a 2a 20 75 73 65 64 2e 0a  dex is.** used..
37de0 2a 2f 0a 57 68 65 72 65 49 6e 66 6f 20 2a 73 71  */.WhereInfo *sq
37df0 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
37e00 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
37e10 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ,        /* The 
37e20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  parser context *
37e30 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  /.  SrcList *pTa
37e40 62 4c 69 73 74 2c 20 20 20 20 2f 2a 20 46 52 4f  bList,    /* FRO
37e50 4d 20 63 6c 61 75 73 65 3a 20 41 20 6c 69 73 74  M clause: A list
37e60 20 6f 66 20 61 6c 6c 20 74 61 62 6c 65 73 20 74   of all tables t
37e70 6f 20 62 65 20 73 63 61 6e 6e 65 64 20 2a 2f 0a  o be scanned */.
37e80 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 2c 20    Expr *pWhere, 
37e90 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57          /* The W
37ea0 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
37eb0 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
37ec0 72 42 79 2c 20 20 20 2f 2a 20 41 6e 20 4f 52 44  rBy,   /* An ORD
37ed0 45 52 20 42 59 20 28 6f 72 20 47 52 4f 55 50 20  ER BY (or GROUP 
37ee0 42 59 29 20 63 6c 61 75 73 65 2c 20 6f 72 20 4e  BY) clause, or N
37ef0 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ULL */.  ExprLis
37f00 74 20 2a 70 52 65 73 75 6c 74 53 65 74 2c 20 2f  t *pResultSet, /
37f10 2a 20 52 65 73 75 6c 74 20 73 65 74 20 6f 66 20  * Result set of 
37f20 74 68 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 75  the query */.  u
37f30 31 36 20 77 63 74 72 6c 46 6c 61 67 73 2c 20 20  16 wctrlFlags,  
37f40 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74       /* One of t
37f50 68 65 20 57 48 45 52 45 5f 2a 20 66 6c 61 67 73  he WHERE_* flags
37f60 20 64 65 66 69 6e 65 64 20 69 6e 20 73 71 6c 69   defined in sqli
37f70 74 65 49 6e 74 2e 68 20 2a 2f 0a 20 20 69 6e 74  teInt.h */.  int
37f80 20 69 49 64 78 43 75 72 20 20 20 20 20 20 20 20   iIdxCur        
37f90 20 20 20 2f 2a 20 49 66 20 57 48 45 52 45 5f 4f     /* If WHERE_O
37fa0 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 20 69 73 20  NETABLE_ONLY is 
37fb0 73 65 74 2c 20 69 6e 64 65 78 20 63 75 72 73 6f  set, index curso
37fc0 72 20 6e 75 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20  r number */.){. 
37fd0 20 69 6e 74 20 6e 42 79 74 65 57 49 6e 66 6f 3b   int nByteWInfo;
37fe0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
37ff0 75 6d 2e 20 62 79 74 65 73 20 61 6c 6c 6f 63 61  um. bytes alloca
38000 74 65 64 20 66 6f 72 20 57 68 65 72 65 49 6e 66  ted for WhereInf
38010 6f 20 73 74 72 75 63 74 20 2a 2f 0a 20 20 69 6e  o struct */.  in
38020 74 20 6e 54 61 62 4c 69 73 74 3b 20 20 20 20 20  t nTabList;     
38030 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
38040 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69  er of elements i
38050 6e 20 70 54 61 62 4c 69 73 74 20 2a 2f 0a 20 20  n pTabList */.  
38060 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
38070 6f 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 57 69  o;         /* Wi
38080 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 72 65  ll become the re
38090 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 74 68  turn value of th
380a0 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  is function */. 
380b0 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
380c0 65 2d 3e 70 56 64 62 65 3b 20 20 20 2f 2a 20 54  e->pVdbe;   /* T
380d0 68 65 20 76 69 72 74 75 61 6c 20 64 61 74 61 62  he virtual datab
380e0 61 73 65 20 65 6e 67 69 6e 65 20 2a 2f 0a 20 20  ase engine */.  
380f0 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79  Bitmask notReady
38100 3b 20 20 20 20 20