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

Artifact cb89128d24ddb5fe3ca290166d66968f2dc0c3c8:


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 2a 2f 0a 20  atic index. */. 
25c50 20 20 20 69 66 28 20 28 70 2d 3e 77 73 46 6c 61     if( (p->wsFla
25c60 67 73 20 26 20 57 48 45 52 45 5f 41 55 54 4f 5f  gs & WHERE_AUTO_
25c70 49 4e 44 45 58 29 21 3d 30 0a 20 20 20 20 20 26  INDEX)!=0.     &
25c80 26 20 28 70 54 65 6d 70 6c 61 74 65 2d 3e 77 73  & (pTemplate->ws
25c90 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e  Flags & WHERE_IN
25ca0 44 45 58 45 44 29 21 3d 30 0a 20 20 20 20 20 26  DEXED)!=0.     &
25cb0 26 20 28 70 54 65 6d 70 6c 61 74 65 2d 3e 77 73  & (pTemplate->ws
25cc0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f  Flags & WHERE_CO
25cd0 4c 55 4d 4e 5f 45 51 29 21 3d 30 0a 20 20 20 20  LUMN_EQ)!=0.    
25ce0 20 26 26 20 28 70 2d 3e 70 72 65 72 65 71 20 26   && (p->prereq &
25cf0 20 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72   pTemplate->prer
25d00 65 71 29 3d 3d 70 54 65 6d 70 6c 61 74 65 2d 3e  eq)==pTemplate->
25d10 70 72 65 72 65 71 0a 20 20 20 20 29 7b 0a 20 20  prereq.    ){.  
25d20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
25d30 0a 0a 20 20 20 20 2f 2a 20 49 66 20 65 78 69 73  ..    /* If exis
25d40 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 70  ting WhereLoop p
25d50 20 69 73 20 62 65 74 74 65 72 20 74 68 61 6e 20   is better than 
25d60 70 54 65 6d 70 6c 61 74 65 2c 20 70 54 65 6d 70  pTemplate, pTemp
25d70 6c 61 74 65 20 63 61 6e 20 62 65 0a 20 20 20 20  late can be.    
25d80 2a 2a 20 64 69 73 63 61 72 64 65 64 2e 20 20 57  ** discarded.  W
25d90 68 65 72 65 4c 6f 6f 70 20 70 20 69 73 20 62 65  hereLoop p is be
25da0 74 74 65 72 20 69 66 3a 0a 20 20 20 20 2a 2a 20  tter if:.    ** 
25db0 20 20 28 31 29 20 20 70 20 68 61 73 20 6e 6f 20    (1)  p has no 
25dc0 6d 6f 72 65 20 64 65 70 65 6e 64 65 6e 63 69 65  more dependencie
25dd0 73 20 74 68 61 6e 20 70 54 65 6d 70 6c 61 74 65  s than pTemplate
25de0 2c 20 61 6e 64 0a 20 20 20 20 2a 2a 20 20 20 28  , and.    **   (
25df0 32 29 20 20 70 20 68 61 73 20 61 6e 20 65 71 75  2)  p has an equ
25e00 61 6c 20 6f 72 20 6c 6f 77 65 72 20 63 6f 73 74  al or lower cost
25e10 20 74 68 61 6e 20 70 54 65 6d 70 6c 61 74 65 0a   than pTemplate.
25e20 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28      */.    if( (
25e30 70 2d 3e 70 72 65 72 65 71 20 26 20 70 54 65 6d  p->prereq & pTem
25e40 70 6c 61 74 65 2d 3e 70 72 65 72 65 71 29 3d 3d  plate->prereq)==
25e50 70 2d 3e 70 72 65 72 65 71 20 20 20 20 2f 2a 20  p->prereq    /* 
25e60 28 31 29 20 20 2a 2f 0a 20 20 20 20 20 26 26 20  (1)  */.     && 
25e70 70 2d 3e 72 53 65 74 75 70 3c 3d 70 54 65 6d 70  p->rSetup<=pTemp
25e80 6c 61 74 65 2d 3e 72 53 65 74 75 70 20 20 20 20  late->rSetup    
25e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25ea0 20 28 32 61 29 20 2a 2f 0a 20 20 20 20 20 26 26   (2a) */.     &&
25eb0 20 70 2d 3e 72 52 75 6e 3c 3d 70 54 65 6d 70 6c   p->rRun<=pTempl
25ec0 61 74 65 2d 3e 72 52 75 6e 20 20 20 20 20 20 20  ate->rRun       
25ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25ee0 2a 20 28 32 62 29 20 2a 2f 0a 20 20 20 20 20 26  * (2b) */.     &
25ef0 26 20 70 2d 3e 6e 4f 75 74 3c 3d 70 54 65 6d 70  & p->nOut<=pTemp
25f00 6c 61 74 65 2d 3e 6e 4f 75 74 20 20 20 20 20 20  late->nOut      
25f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25f20 2f 2a 20 28 32 63 29 20 2a 2f 0a 20 20 20 20 29  /* (2c) */.    )
25f30 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  {.      return 0
25f40 3b 20 20 2f 2a 20 44 69 73 63 61 72 64 20 70 54  ;  /* Discard pT
25f50 65 6d 70 6c 61 74 65 20 2a 2f 0a 20 20 20 20 7d  emplate */.    }
25f60 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 54 65 6d  ..    /* If pTem
25f70 70 6c 61 74 65 20 69 73 20 61 6c 77 61 79 73 20  plate is always 
25f80 62 65 74 74 65 72 20 74 68 61 6e 20 70 2c 20 74  better than p, t
25f90 68 65 6e 20 63 61 75 73 65 20 70 20 74 6f 20 62  hen cause p to b
25fa0 65 20 6f 76 65 72 77 72 69 74 74 65 6e 0a 20 20  e overwritten.  
25fb0 20 20 2a 2a 20 77 69 74 68 20 70 54 65 6d 70 6c    ** with pTempl
25fc0 61 74 65 2e 20 20 70 54 65 6d 70 6c 61 74 65 20  ate.  pTemplate 
25fd0 69 73 20 62 65 74 74 65 72 20 74 68 61 6e 20 70  is better than p
25fe0 20 69 66 3a 0a 20 20 20 20 2a 2a 20 20 20 28 31   if:.    **   (1
25ff0 29 20 20 70 54 65 6d 70 6c 61 74 65 20 68 61 73  )  pTemplate has
26000 20 6e 6f 20 6d 6f 72 65 20 64 65 70 65 6e 64 65   no more depende
26010 6e 63 65 73 20 74 68 61 6e 20 70 2c 20 61 6e 64  nces than p, and
26020 0a 20 20 20 20 2a 2a 20 20 20 28 32 29 20 20 70  .    **   (2)  p
26030 54 65 6d 70 6c 61 74 65 20 68 61 73 20 61 6e 20  Template has an 
26040 65 71 75 61 6c 20 6f 72 20 6c 6f 77 65 72 20 63  equal or lower c
26050 6f 73 74 20 74 68 61 6e 20 70 2e 0a 20 20 20 20  ost than p..    
26060 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 70  */.    if( (p->p
26070 72 65 72 65 71 20 26 20 70 54 65 6d 70 6c 61 74  rereq & pTemplat
26080 65 2d 3e 70 72 65 72 65 71 29 3d 3d 70 54 65 6d  e->prereq)==pTem
26090 70 6c 61 74 65 2d 3e 70 72 65 72 65 71 20 20 20  plate->prereq   
260a0 2f 2a 20 28 31 29 20 20 2a 2f 0a 20 20 20 20 20  /* (1)  */.     
260b0 26 26 20 70 2d 3e 72 52 75 6e 3e 3d 70 54 65 6d  && p->rRun>=pTem
260c0 70 6c 61 74 65 2d 3e 72 52 75 6e 20 20 20 20 20  plate->rRun     
260d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
260e0 20 20 20 20 20 20 20 20 2f 2a 20 28 32 61 29 20          /* (2a) 
260f0 2a 2f 0a 20 20 20 20 20 26 26 20 70 2d 3e 6e 4f  */.     && p->nO
26100 75 74 3e 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 6e  ut>=pTemplate->n
26110 4f 75 74 20 20 20 20 20 20 20 20 20 20 20 20 20  Out             
26120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26130 2f 2a 20 28 32 62 29 20 2a 2f 0a 20 20 20 20 29  /* (2b) */.    )
26140 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
26150 70 2d 3e 72 53 65 74 75 70 3e 3d 70 54 65 6d 70  p->rSetup>=pTemp
26160 6c 61 74 65 2d 3e 72 53 65 74 75 70 20 29 3b 20  late->rSetup ); 
26170 2f 2a 20 53 45 54 55 50 2d 49 4e 56 41 52 49 41  /* SETUP-INVARIA
26180 4e 54 20 61 62 6f 76 65 20 2a 2f 0a 20 20 20 20  NT above */.    
26190 20 20 62 72 65 61 6b 3b 20 20 20 2f 2a 20 43 61    break;   /* Ca
261a0 75 73 65 20 70 20 74 6f 20 62 65 20 6f 76 65 72  use p to be over
261b0 77 72 69 74 74 65 6e 20 62 79 20 70 54 65 6d 70  written by pTemp
261c0 6c 61 74 65 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  late */.    }.  
261d0 7d 0a 20 20 72 65 74 75 72 6e 20 70 70 50 72 65  }.  return ppPre
261e0 76 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65  v;.}../*.** Inse
261f0 72 74 20 6f 72 20 72 65 70 6c 61 63 65 20 61 20  rt or replace a 
26200 57 68 65 72 65 4c 6f 6f 70 20 65 6e 74 72 79 20  WhereLoop entry 
26210 75 73 69 6e 67 20 74 68 65 20 74 65 6d 70 6c 61  using the templa
26220 74 65 20 73 75 70 70 6c 69 65 64 2e 0a 2a 2a 0a  te supplied..**.
26230 2a 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20 57  ** An existing W
26240 68 65 72 65 4c 6f 6f 70 20 65 6e 74 72 79 20 6d  hereLoop entry m
26250 69 67 68 74 20 62 65 20 6f 76 65 72 77 72 69 74  ight be overwrit
26260 74 65 6e 20 69 66 20 74 68 65 20 6e 65 77 20 74  ten if the new t
26270 65 6d 70 6c 61 74 65 0a 2a 2a 20 69 73 20 62 65  emplate.** is be
26280 74 74 65 72 20 61 6e 64 20 68 61 73 20 66 65 77  tter and has few
26290 65 72 20 64 65 70 65 6e 64 65 6e 63 69 65 73 2e  er dependencies.
262a0 20 20 4f 72 20 74 68 65 20 74 65 6d 70 6c 61 74    Or the templat
262b0 65 20 77 69 6c 6c 20 62 65 20 69 67 6e 6f 72 65  e will be ignore
262c0 64 0a 2a 2a 20 61 6e 64 20 6e 6f 20 69 6e 73 65  d.** and no inse
262d0 72 74 20 77 69 6c 6c 20 6f 63 63 75 72 20 69 66  rt will occur if
262e0 20 61 6e 20 65 78 69 73 74 69 6e 67 20 57 68 65   an existing Whe
262f0 72 65 4c 6f 6f 70 20 69 73 20 66 61 73 74 65 72  reLoop is faster
26300 20 61 6e 64 20 68 61 73 0a 2a 2a 20 66 65 77 65   and has.** fewe
26310 72 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20 74  r dependencies t
26320 68 61 6e 20 74 68 65 20 74 65 6d 70 6c 61 74 65  han the template
26330 2e 20 20 4f 74 68 65 72 77 69 73 65 20 61 20 6e  .  Otherwise a n
26340 65 77 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 0a  ew WhereLoop is.
26350 2a 2a 20 61 64 64 65 64 20 62 61 73 65 64 20 6f  ** added based o
26360 6e 20 74 68 65 20 74 65 6d 70 6c 61 74 65 2e 0a  n the template..
26370 2a 2a 0a 2a 2a 20 49 66 20 70 42 75 69 6c 64 65  **.** If pBuilde
26380 72 2d 3e 70 4f 72 53 65 74 20 69 73 20 6e 6f 74  r->pOrSet is not
26390 20 4e 55 4c 4c 20 74 68 65 6e 20 77 65 20 63 61   NULL then we ca
263a0 72 65 20 61 62 6f 75 74 20 6f 6e 6c 79 20 74 68  re about only th
263b0 65 0a 2a 2a 20 70 72 65 72 65 71 75 69 73 69 74  e.** prerequisit
263c0 65 73 20 61 6e 64 20 72 52 75 6e 20 61 6e 64 20  es and rRun and 
263d0 6e 4f 75 74 20 63 6f 73 74 73 20 6f 66 20 74 68  nOut costs of th
263e0 65 20 4e 20 62 65 73 74 20 6c 6f 6f 70 73 2e 20  e N best loops. 
263f0 20 54 68 61 74 0a 2a 2a 20 69 6e 66 6f 72 6d 61   That.** informa
26400 74 69 6f 6e 20 69 73 20 67 61 74 68 65 72 65 64  tion is gathered
26410 20 69 6e 20 74 68 65 20 70 42 75 69 6c 64 65 72   in the pBuilder
26420 2d 3e 70 4f 72 53 65 74 20 6f 62 6a 65 63 74 2e  ->pOrSet object.
26430 20 20 54 68 69 73 20 73 70 65 63 69 61 6c 0a 2a    This special.*
26440 2a 20 70 72 6f 63 65 73 73 69 6e 67 20 6d 6f 64  * processing mod
26450 65 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 66  e is used only f
26460 6f 72 20 4f 52 20 63 6c 61 75 73 65 20 70 72 6f  or OR clause pro
26470 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 57  cessing..**.** W
26480 68 65 6e 20 61 63 63 75 6d 75 6c 61 74 69 6e 67  hen accumulating
26490 20 6d 75 6c 74 69 70 6c 65 20 6c 6f 6f 70 73 20   multiple loops 
264a0 28 77 68 65 6e 20 70 42 75 69 6c 64 65 72 2d 3e  (when pBuilder->
264b0 70 4f 72 53 65 74 20 69 73 20 4e 55 4c 4c 29 20  pOrSet is NULL) 
264c0 77 65 0a 2a 2a 20 73 74 69 6c 6c 20 6d 69 67 68  we.** still migh
264d0 74 20 6f 76 65 72 77 72 69 74 65 20 73 69 6d 69  t overwrite simi
264e0 6c 61 72 20 6c 6f 6f 70 73 20 77 69 74 68 20 74  lar loops with t
264f0 68 65 20 6e 65 77 20 74 65 6d 70 6c 61 74 65 20  he new template 
26500 69 66 20 74 68 65 0a 2a 2a 20 6e 65 77 20 74 65  if the.** new te
26510 6d 70 6c 61 74 65 20 69 73 20 62 65 74 74 65 72  mplate is better
26520 2e 20 20 4c 6f 6f 70 73 20 6d 61 79 20 62 65 20  .  Loops may be 
26530 6f 76 65 72 77 72 69 74 74 65 6e 20 69 66 20 74  overwritten if t
26540 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a 2a 2a  he following .**
26550 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61 72 65 20   conditions are 
26560 6d 65 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31  met:.**.**    (1
26570 29 20 20 54 68 65 79 20 68 61 76 65 20 74 68 65  )  They have the
26580 20 73 61 6d 65 20 69 54 61 62 2e 0a 2a 2a 20 20   same iTab..**  
26590 20 20 28 32 29 20 20 54 68 65 79 20 68 61 76 65    (2)  They have
265a0 20 74 68 65 20 73 61 6d 65 20 69 53 6f 72 74 49   the same iSortI
265b0 64 78 2e 0a 2a 2a 20 20 20 20 28 33 29 20 20 54  dx..**    (3)  T
265c0 68 65 20 74 65 6d 70 6c 61 74 65 20 68 61 73 20  he template has 
265d0 73 61 6d 65 20 6f 72 20 66 65 77 65 72 20 64 65  same or fewer de
265e0 70 65 6e 64 65 6e 63 69 65 73 20 74 68 61 6e 20  pendencies than 
265f0 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f 70  the current loop
26600 0a 2a 2a 20 20 20 20 28 34 29 20 20 54 68 65 20  .**    (4)  The 
26610 74 65 6d 70 6c 61 74 65 20 68 61 73 20 74 68 65  template has the
26620 20 73 61 6d 65 20 6f 72 20 6c 6f 77 65 72 20 63   same or lower c
26630 6f 73 74 20 74 68 61 6e 20 74 68 65 20 63 75 72  ost than the cur
26640 72 65 6e 74 20 6c 6f 6f 70 0a 2a 2f 0a 73 74 61  rent loop.*/.sta
26650 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f  tic int whereLoo
26660 70 49 6e 73 65 72 74 28 57 68 65 72 65 4c 6f 6f  pInsert(WhereLoo
26670 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64  pBuilder *pBuild
26680 65 72 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  er, WhereLoop *p
26690 54 65 6d 70 6c 61 74 65 29 7b 0a 20 20 57 68 65  Template){.  Whe
266a0 72 65 4c 6f 6f 70 20 2a 2a 70 70 50 72 65 76 2c  reLoop **ppPrev,
266b0 20 2a 70 3b 0a 20 20 57 68 65 72 65 49 6e 66 6f   *p;.  WhereInfo
266c0 20 2a 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c   *pWInfo = pBuil
266d0 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 73  der->pWInfo;.  s
266e0 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 57 49  qlite3 *db = pWI
266f0 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b  nfo->pParse->db;
26700 0a 0a 20 20 2f 2a 20 49 66 20 70 42 75 69 6c 64  ..  /* If pBuild
26710 65 72 2d 3e 70 4f 72 53 65 74 20 69 73 20 64 65  er->pOrSet is de
26720 66 69 6e 65 64 2c 20 74 68 65 6e 20 6f 6e 6c 79  fined, then only
26730 20 6b 65 65 70 20 74 72 61 63 6b 20 6f 66 20 74   keep track of t
26740 68 65 20 63 6f 73 74 73 0a 20 20 2a 2a 20 61 6e  he costs.  ** an
26750 64 20 70 72 65 72 65 71 73 2e 0a 20 20 2a 2f 0a  d prereqs..  */.
26760 20 20 69 66 28 20 70 42 75 69 6c 64 65 72 2d 3e    if( pBuilder->
26770 70 4f 72 53 65 74 21 3d 30 20 29 7b 0a 23 69 66  pOrSet!=0 ){.#if
26780 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42   WHERETRACE_ENAB
26790 4c 45 44 0a 20 20 20 20 75 31 36 20 6e 20 3d 20  LED.    u16 n = 
267a0 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74  pBuilder->pOrSet
267b0 2d 3e 6e 3b 0a 20 20 20 20 69 6e 74 20 78 20 3d  ->n;.    int x =
267c0 0a 23 65 6e 64 69 66 0a 20 20 20 20 77 68 65 72  .#endif.    wher
267d0 65 4f 72 49 6e 73 65 72 74 28 70 42 75 69 6c 64  eOrInsert(pBuild
267e0 65 72 2d 3e 70 4f 72 53 65 74 2c 20 70 54 65 6d  er->pOrSet, pTem
267f0 70 6c 61 74 65 2d 3e 70 72 65 72 65 71 2c 20 70  plate->prereq, p
26800 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 2c 0a  Template->rRun,.
26810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26830 20 20 20 20 70 54 65 6d 70 6c 61 74 65 2d 3e 6e      pTemplate->n
26840 4f 75 74 29 3b 0a 23 69 66 20 57 48 45 52 45 54  Out);.#if WHERET
26850 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20  RACE_ENABLED /* 
26860 30 78 38 20 2a 2f 0a 20 20 20 20 69 66 28 20 73  0x8 */.    if( s
26870 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65  qlite3WhereTrace
26880 20 26 20 30 78 38 20 29 7b 0a 20 20 20 20 20 20   & 0x8 ){.      
26890 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
268a0 74 66 28 78 3f 22 20 20 20 6f 72 2d 25 64 3a 20  tf(x?"   or-%d: 
268b0 20 22 3a 22 20 20 20 6f 72 2d 58 3a 20 20 22 2c   ":"   or-X:  ",
268c0 20 6e 29 3b 0a 20 20 20 20 20 20 77 68 65 72 65   n);.      where
268d0 4c 6f 6f 70 50 72 69 6e 74 28 70 54 65 6d 70 6c  LoopPrint(pTempl
268e0 61 74 65 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70  ate, pBuilder->p
268f0 57 43 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  WC);.    }.#endi
26900 66 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  f.    return SQL
26910 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f  ITE_OK;.  }..  /
26920 2a 20 4c 6f 6f 6b 20 66 6f 72 20 61 6e 20 65 78  * Look for an ex
26930 69 73 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70  isting WhereLoop
26940 20 74 6f 20 72 65 70 6c 61 63 65 20 77 69 74 68   to replace with
26950 20 70 54 65 6d 70 6c 61 74 65 0a 20 20 2a 2f 0a   pTemplate.  */.
26960 20 20 77 68 65 72 65 4c 6f 6f 70 41 64 6a 75 73    whereLoopAdjus
26970 74 43 6f 73 74 28 70 57 49 6e 66 6f 2d 3e 70 4c  tCost(pWInfo->pL
26980 6f 6f 70 73 2c 20 70 54 65 6d 70 6c 61 74 65 29  oops, pTemplate)
26990 3b 0a 20 20 70 70 50 72 65 76 20 3d 20 77 68 65  ;.  ppPrev = whe
269a0 72 65 4c 6f 6f 70 46 69 6e 64 4c 65 73 73 65 72  reLoopFindLesser
269b0 28 26 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73  (&pWInfo->pLoops
269c0 2c 20 70 54 65 6d 70 6c 61 74 65 29 3b 0a 0a 20  , pTemplate);.. 
269d0 20 69 66 28 20 70 70 50 72 65 76 3d 3d 30 20 29   if( ppPrev==0 )
269e0 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20 61  {.    /* There a
269f0 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 61 20  lready exists a 
26a00 57 68 65 72 65 4c 6f 6f 70 20 6f 6e 20 74 68 65  WhereLoop on the
26a10 20 6c 69 73 74 20 74 68 61 74 20 69 73 20 62 65   list that is be
26a20 74 74 65 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e  tter.    ** than
26a30 20 70 54 65 6d 70 6c 61 74 65 2c 20 73 6f 20 6a   pTemplate, so j
26a40 75 73 74 20 69 67 6e 6f 72 65 20 70 54 65 6d 70  ust ignore pTemp
26a50 6c 61 74 65 20 2a 2f 0a 23 69 66 20 57 48 45 52  late */.#if WHER
26a60 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f  ETRACE_ENABLED /
26a70 2a 20 30 78 38 20 2a 2f 0a 20 20 20 20 69 66 28  * 0x8 */.    if(
26a80 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61   sqlite3WhereTra
26a90 63 65 20 26 20 30 78 38 20 29 7b 0a 20 20 20 20  ce & 0x8 ){.    
26aa0 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
26ab0 69 6e 74 66 28 22 20 20 20 73 6b 69 70 3a 20 22  intf("   skip: "
26ac0 29 3b 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f  );.      whereLo
26ad0 6f 70 50 72 69 6e 74 28 70 54 65 6d 70 6c 61 74  opPrint(pTemplat
26ae0 65 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43  e, pBuilder->pWC
26af0 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
26b00 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
26b10 45 5f 4f 4b 3b 20 20 0a 20 20 7d 65 6c 73 65 7b  E_OK;  .  }else{
26b20 0a 20 20 20 20 70 20 3d 20 2a 70 70 50 72 65 76  .    p = *ppPrev
26b30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77  ;.  }..  /* If w
26b40 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69  e reach this poi
26b50 6e 74 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  nt it means that
26b60 20 65 69 74 68 65 72 20 70 5b 5d 20 73 68 6f 75   either p[] shou
26b70 6c 64 20 62 65 20 6f 76 65 72 77 72 69 74 74 65  ld be overwritte
26b80 6e 0a 20 20 2a 2a 20 77 69 74 68 20 70 54 65 6d  n.  ** with pTem
26b90 70 6c 61 74 65 5b 5d 20 69 66 20 70 5b 5d 20 65  plate[] if p[] e
26ba0 78 69 73 74 73 2c 20 6f 72 20 69 66 20 70 3d 3d  xists, or if p==
26bb0 4e 55 4c 4c 20 74 68 65 6e 20 61 6c 6c 6f 63 61  NULL then alloca
26bc0 74 65 20 61 20 6e 65 77 0a 20 20 2a 2a 20 57 68  te a new.  ** Wh
26bd0 65 72 65 4c 6f 6f 70 20 61 6e 64 20 69 6e 73 65  ereLoop and inse
26be0 72 74 20 69 74 2e 0a 20 20 2a 2f 0a 23 69 66 20  rt it..  */.#if 
26bf0 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c  WHERETRACE_ENABL
26c00 45 44 20 2f 2a 20 30 78 38 20 2a 2f 0a 20 20 69  ED /* 0x8 */.  i
26c10 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54  f( sqlite3WhereT
26c20 72 61 63 65 20 26 20 30 78 38 20 29 7b 0a 20 20  race & 0x8 ){.  
26c30 20 20 69 66 28 20 70 21 3d 30 20 29 7b 0a 20 20    if( p!=0 ){.  
26c40 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
26c50 50 72 69 6e 74 66 28 22 72 65 70 6c 61 63 65 3a  Printf("replace:
26c60 20 22 29 3b 0a 20 20 20 20 20 20 77 68 65 72 65   ");.      where
26c70 4c 6f 6f 70 50 72 69 6e 74 28 70 2c 20 70 42 75  LoopPrint(p, pBu
26c80 69 6c 64 65 72 2d 3e 70 57 43 29 3b 0a 20 20 20  ilder->pWC);.   
26c90 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65   }.    sqlite3De
26ca0 62 75 67 50 72 69 6e 74 66 28 22 20 20 20 20 61  bugPrintf("    a
26cb0 64 64 3a 20 22 29 3b 0a 20 20 20 20 77 68 65 72  dd: ");.    wher
26cc0 65 4c 6f 6f 70 50 72 69 6e 74 28 70 54 65 6d 70  eLoopPrint(pTemp
26cd0 6c 61 74 65 2c 20 70 42 75 69 6c 64 65 72 2d 3e  late, pBuilder->
26ce0 70 57 43 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  pWC);.  }.#endif
26cf0 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20  .  if( p==0 ){. 
26d00 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61     /* Allocate a
26d10 20 6e 65 77 20 57 68 65 72 65 4c 6f 6f 70 20 74   new WhereLoop t
26d20 6f 20 61 64 64 20 74 6f 20 74 68 65 20 65 6e 64  o add to the end
26d30 20 6f 66 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a   of the list */.
26d40 20 20 20 20 2a 70 70 50 72 65 76 20 3d 20 70 20      *ppPrev = p 
26d50 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
26d60 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28  cRaw(db, sizeof(
26d70 57 68 65 72 65 4c 6f 6f 70 29 29 3b 0a 20 20 20  WhereLoop));.   
26d80 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
26d90 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
26da0 0a 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 49 6e  .    whereLoopIn
26db0 69 74 28 70 29 3b 0a 20 20 20 20 70 2d 3e 70 4e  it(p);.    p->pN
26dc0 65 78 74 4c 6f 6f 70 20 3d 20 30 3b 0a 20 20 7d  extLoop = 0;.  }
26dd0 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 57 65 20  else{.    /* We 
26de0 77 69 6c 6c 20 62 65 20 6f 76 65 72 77 72 69 74  will be overwrit
26df0 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 70 5b  ing WhereLoop p[
26e00 5d 2e 20 20 42 75 74 20 62 65 66 6f 72 65 20 77  ].  But before w
26e10 65 20 64 6f 2c 20 66 69 72 73 74 0a 20 20 20 20  e do, first.    
26e20 2a 2a 20 67 6f 20 74 68 72 6f 75 67 68 20 74 68  ** go through th
26e30 65 20 72 65 73 74 20 6f 66 20 74 68 65 20 6c 69  e rest of the li
26e40 73 74 20 61 6e 64 20 64 65 6c 65 74 65 20 61 6e  st and delete an
26e50 79 20 6f 74 68 65 72 20 65 6e 74 72 69 65 73 20  y other entries 
26e60 62 65 73 69 64 65 73 0a 20 20 20 20 2a 2a 20 70  besides.    ** p
26e70 5b 5d 20 74 68 61 74 20 61 72 65 20 61 6c 73 6f  [] that are also
26e80 20 73 75 70 70 6c 61 74 65 64 20 62 79 20 70 54   supplated by pT
26e90 65 6d 70 6c 61 74 65 20 2a 2f 0a 20 20 20 20 57  emplate */.    W
26ea0 68 65 72 65 4c 6f 6f 70 20 2a 2a 70 70 54 61 69  hereLoop **ppTai
26eb0 6c 20 3d 20 26 70 2d 3e 70 4e 65 78 74 4c 6f 6f  l = &p->pNextLoo
26ec0 70 3b 0a 20 20 20 20 57 68 65 72 65 4c 6f 6f 70  p;.    WhereLoop
26ed0 20 2a 70 54 6f 44 65 6c 3b 0a 20 20 20 20 77 68   *pToDel;.    wh
26ee0 69 6c 65 28 20 2a 70 70 54 61 69 6c 20 29 7b 0a  ile( *ppTail ){.
26ef0 20 20 20 20 20 20 70 70 54 61 69 6c 20 3d 20 77        ppTail = w
26f00 68 65 72 65 4c 6f 6f 70 46 69 6e 64 4c 65 73 73  hereLoopFindLess
26f10 65 72 28 70 70 54 61 69 6c 2c 20 70 54 65 6d 70  er(ppTail, pTemp
26f20 6c 61 74 65 29 3b 0a 20 20 20 20 20 20 69 66 28  late);.      if(
26f30 20 70 70 54 61 69 6c 3d 3d 30 20 29 20 62 72 65   ppTail==0 ) bre
26f40 61 6b 3b 0a 20 20 20 20 20 20 70 54 6f 44 65 6c  ak;.      pToDel
26f50 20 3d 20 2a 70 70 54 61 69 6c 3b 0a 20 20 20 20   = *ppTail;.    
26f60 20 20 69 66 28 20 70 54 6f 44 65 6c 3d 3d 30 20    if( pToDel==0 
26f70 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 2a  ) break;.      *
26f80 70 70 54 61 69 6c 20 3d 20 70 54 6f 44 65 6c 2d  ppTail = pToDel-
26f90 3e 70 4e 65 78 74 4c 6f 6f 70 3b 0a 23 69 66 20  >pNextLoop;.#if 
26fa0 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c  WHERETRACE_ENABL
26fb0 45 44 20 2f 2a 20 30 78 38 20 2a 2f 0a 20 20 20  ED /* 0x8 */.   
26fc0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68     if( sqlite3Wh
26fd0 65 72 65 54 72 61 63 65 20 26 20 30 78 38 20 29  ereTrace & 0x8 )
26fe0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
26ff0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 64  3DebugPrintf(" d
27000 65 6c 65 74 65 3a 20 22 29 3b 0a 20 20 20 20 20  elete: ");.     
27010 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e     whereLoopPrin
27020 74 28 70 54 6f 44 65 6c 2c 20 70 42 75 69 6c 64  t(pToDel, pBuild
27030 65 72 2d 3e 70 57 43 29 3b 0a 20 20 20 20 20 20  er->pWC);.      
27040 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 77  }.#endif.      w
27050 68 65 72 65 4c 6f 6f 70 44 65 6c 65 74 65 28 64  hereLoopDelete(d
27060 62 2c 20 70 54 6f 44 65 6c 29 3b 0a 20 20 20 20  b, pToDel);.    
27070 7d 0a 20 20 7d 0a 20 20 77 68 65 72 65 4c 6f 6f  }.  }.  whereLoo
27080 70 58 66 65 72 28 64 62 2c 20 70 2c 20 70 54 65  pXfer(db, p, pTe
27090 6d 70 6c 61 74 65 29 3b 0a 20 20 69 66 28 20 28  mplate);.  if( (
270a0 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
270b0 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  RE_VIRTUALTABLE)
270c0 3d 3d 30 20 29 7b 0a 20 20 20 20 49 6e 64 65 78  ==0 ){.    Index
270d0 20 2a 70 49 6e 64 65 78 20 3d 20 70 2d 3e 75 2e   *pIndex = p->u.
270e0 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20  btree.pIndex;.  
270f0 20 20 69 66 28 20 70 49 6e 64 65 78 20 26 26 20    if( pIndex && 
27100 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 3d 3d 30 20  pIndex->tnum==0 
27110 29 7b 0a 20 20 20 20 20 20 70 2d 3e 75 2e 62 74  ){.      p->u.bt
27120 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 30 3b 0a  ree.pIndex = 0;.
27130 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
27140 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
27150 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20 74 68  ./*.** Adjust th
27160 65 20 57 68 65 72 65 4c 6f 6f 70 2e 6e 4f 75 74  e WhereLoop.nOut
27170 20 76 61 6c 75 65 20 64 6f 77 6e 77 61 72 64 20   value downward 
27180 74 6f 20 61 63 63 6f 75 6e 74 20 66 6f 72 20 74  to account for t
27190 65 72 6d 73 20 6f 66 20 74 68 65 0a 2a 2a 20 57  erms of the.** W
271a0 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74  HERE clause that
271b0 20 72 65 66 65 72 65 6e 63 65 20 74 68 65 20 6c   reference the l
271c0 6f 6f 70 20 62 75 74 20 77 68 69 63 68 20 61 72  oop but which ar
271d0 65 20 6e 6f 74 20 75 73 65 64 20 62 79 20 61 6e  e not used by an
271e0 0a 2a 2a 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a  .** index..**.**
271f0 20 49 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   In the current 
27200 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2c 20  implementation, 
27210 74 68 65 20 66 69 72 73 74 20 65 78 74 72 61 20  the first extra 
27220 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
27230 6d 20 72 65 64 75 63 65 73 0a 2a 2a 20 74 68 65  m reduces.** the
27240 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75   number of outpu
27250 74 20 72 6f 77 73 20 62 79 20 61 20 66 61 63 74  t rows by a fact
27260 6f 72 20 6f 66 20 31 30 20 61 6e 64 20 65 61 63  or of 10 and eac
27270 68 20 61 64 64 69 74 69 6f 6e 61 6c 20 74 65 72  h additional ter
27280 6d 0a 2a 2a 20 72 65 64 75 63 65 73 20 74 68 65  m.** reduces the
27290 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75   number of outpu
272a0 74 20 72 6f 77 73 20 62 79 20 73 71 72 74 28 32  t rows by sqrt(2
272b0 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  )..*/.static voi
272c0 64 20 77 68 65 72 65 4c 6f 6f 70 4f 75 74 70 75  d whereLoopOutpu
272d0 74 41 64 6a 75 73 74 28 0a 20 20 57 68 65 72 65  tAdjust(.  Where
272e0 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20  Clause *pWC,    
272f0 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63    /* The WHERE c
27300 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65  lause */.  Where
27310 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 2c 20 20 20 20  Loop *pLoop,    
27320 20 20 2f 2a 20 54 68 65 20 6c 6f 6f 70 20 74 6f    /* The loop to
27330 20 61 64 6a 75 73 74 20 64 6f 77 6e 77 61 72 64   adjust downward
27340 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 6e 52 6f   */.  LogEst nRo
27350 77 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  w            /* 
27360 4e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69  Number of rows i
27370 6e 20 74 68 65 20 65 6e 74 69 72 65 20 74 61 62  n the entire tab
27380 6c 65 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65  le */.){.  Where
27390 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 2a 70 58  Term *pTerm, *pX
273a0 3b 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 41  ;.  Bitmask notA
273b0 6c 6c 6f 77 65 64 20 3d 20 7e 28 70 4c 6f 6f 70  llowed = ~(pLoop
273c0 2d 3e 70 72 65 72 65 71 7c 70 4c 6f 6f 70 2d 3e  ->prereq|pLoop->
273d0 6d 61 73 6b 53 65 6c 66 29 3b 0a 20 20 69 6e 74  maskSelf);.  int
273e0 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 6e 45 71   i, j;.  int nEq
273f0 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d 62   = 0;    /* Numb
27400 65 72 20 6f 66 20 3d 20 63 6f 6e 73 74 72 61 69  er of = constrai
27410 6e 74 73 20 6e 6f 74 20 77 69 74 68 69 6e 20 6c  nts not within l
27420 69 6b 65 6c 79 28 29 2f 75 6e 6c 69 6b 65 6c 79  ikely()/unlikely
27430 28 29 20 2a 2f 0a 0a 20 20 66 6f 72 28 69 3d 70  () */..  for(i=p
27440 57 43 2d 3e 6e 54 65 72 6d 2c 20 70 54 65 72 6d  WC->nTerm, pTerm
27450 3d 70 57 43 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d  =pWC->a; i>0; i-
27460 2d 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  -, pTerm++){.   
27470 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 77 74 46   if( (pTerm->wtF
27480 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54  lags & TERM_VIRT
27490 55 41 4c 29 21 3d 30 20 29 20 62 72 65 61 6b 3b  UAL)!=0 ) break;
274a0 0a 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d  .    if( (pTerm-
274b0 3e 70 72 65 72 65 71 41 6c 6c 20 26 20 70 4c 6f  >prereqAll & pLo
274c0 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 29 3d 3d 30  op->maskSelf)==0
274d0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
274e0 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65   if( (pTerm->pre
274f0 72 65 71 41 6c 6c 20 26 20 6e 6f 74 41 6c 6c 6f  reqAll & notAllo
27500 77 65 64 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e  wed)!=0 ) contin
27510 75 65 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 70 4c  ue;.    for(j=pL
27520 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 2d 31 3b 20 6a  oop->nLTerm-1; j
27530 3e 3d 30 3b 20 6a 2d 2d 29 7b 0a 20 20 20 20 20  >=0; j--){.     
27540 20 70 58 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54   pX = pLoop->aLT
27550 65 72 6d 5b 6a 5d 3b 0a 20 20 20 20 20 20 69 66  erm[j];.      if
27560 28 20 70 58 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  ( pX==0 ) contin
27570 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70 58  ue;.      if( pX
27580 3d 3d 70 54 65 72 6d 20 29 20 62 72 65 61 6b 3b  ==pTerm ) break;
27590 0a 20 20 20 20 20 20 69 66 28 20 70 58 2d 3e 69  .      if( pX->i
275a0 50 61 72 65 6e 74 3e 3d 30 20 26 26 20 28 26 70  Parent>=0 && (&p
275b0 57 43 2d 3e 61 5b 70 58 2d 3e 69 50 61 72 65 6e  WC->a[pX->iParen
275c0 74 5d 29 3d 3d 70 54 65 72 6d 20 29 20 62 72 65  t])==pTerm ) bre
275d0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ak;.    }.    if
275e0 28 20 6a 3c 30 20 29 7b 0a 20 20 20 20 20 20 69  ( j<0 ){.      i
275f0 66 28 20 70 54 65 72 6d 2d 3e 74 72 75 74 68 50  f( pTerm->truthP
27600 72 6f 62 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20  rob<=0 ){.      
27610 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 2b 3d    pLoop->nOut +=
27620 20 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f   pTerm->truthPro
27630 62 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  b;.      }else{.
27640 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e          pLoop->n
27650 4f 75 74 2d 2d 3b 0a 20 20 20 20 20 20 20 20 69  Out--;.        i
27660 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  f( pTerm->eOpera
27670 74 6f 72 26 57 4f 5f 45 51 20 29 20 6e 45 71 2b  tor&WO_EQ ) nEq+
27680 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  +;.      }.    }
27690 0a 20 20 7d 0a 20 20 2f 2a 20 54 55 4e 49 4e 47  .  }.  /* TUNING
276a0 3a 20 20 49 66 20 74 68 65 72 65 20 69 73 20 61  :  If there is a
276b0 74 20 6c 65 61 73 74 20 6f 6e 65 20 65 71 75 61  t least one equa
276c0 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20  lity constraint 
276d0 69 6e 20 74 68 65 20 57 48 45 52 45 0a 20 20 2a  in the WHERE.  *
276e0 2a 20 63 6c 61 75 73 65 20 74 68 61 74 20 64 6f  * clause that do
276f0 65 73 20 6e 6f 74 20 68 61 76 65 20 61 20 6c 69  es not have a li
27700 6b 65 6c 69 68 6f 6f 64 28 29 20 65 78 70 6c 69  kelihood() expli
27710 63 69 74 6c 79 20 61 73 73 69 67 6e 65 64 20 74  citly assigned t
27720 6f 20 69 74 0a 20 20 2a 2a 20 74 68 65 6e 20 64  o it.  ** then d
27730 6f 20 6e 6f 74 20 6c 65 74 20 74 68 65 20 65 73  o not let the es
27740 74 69 6d 61 74 65 64 20 6e 75 6d 62 65 72 20 6f  timated number o
27750 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20 65 78  f output rows ex
27760 63 65 65 64 20 68 61 6c 66 20 0a 20 20 2a 2a 20  ceed half .  ** 
27770 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
27780 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e  ws in the table.
27790 20 2a 2f 0a 20 20 69 66 28 20 6e 45 71 20 26 26   */.  if( nEq &&
277a0 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 3e 6e 52 6f   pLoop->nOut>nRo
277b0 77 2d 31 30 20 29 7b 0a 20 20 20 20 70 4c 6f 6f  w-10 ){.    pLoo
277c0 70 2d 3e 6e 4f 75 74 20 3d 20 6e 52 6f 77 20 2d  p->nOut = nRow -
277d0 20 31 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a   10;.  }.}../*.*
277e0 2a 20 41 64 6a 75 73 74 20 74 68 65 20 63 6f 73  * Adjust the cos
277f0 74 20 43 20 62 79 20 74 68 65 20 63 6f 73 74 4d  t C by the costM
27800 75 6c 74 20 66 61 63 74 65 72 20 54 2e 20 20 54  ult facter T.  T
27810 68 69 73 20 6f 6e 6c 79 20 6f 63 63 75 72 73 20  his only occurs 
27820 69 66 0a 2a 2a 20 63 6f 6d 70 69 6c 65 64 20 77  if.** compiled w
27830 69 74 68 20 2d 44 53 51 4c 49 54 45 5f 45 4e 41  ith -DSQLITE_ENA
27840 42 4c 45 5f 43 4f 53 54 4d 55 4c 54 0a 2a 2f 0a  BLE_COSTMULT.*/.
27850 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
27860 41 42 4c 45 5f 43 4f 53 54 4d 55 4c 54 0a 23 20  ABLE_COSTMULT.# 
27870 64 65 66 69 6e 65 20 41 70 70 6c 79 43 6f 73 74  define ApplyCost
27880 4d 75 6c 74 69 70 6c 69 65 72 28 43 2c 54 29 20  Multiplier(C,T) 
27890 20 43 20 2b 3d 20 54 0a 23 65 6c 73 65 0a 23 20   C += T.#else.# 
278a0 64 65 66 69 6e 65 20 41 70 70 6c 79 43 6f 73 74  define ApplyCost
278b0 4d 75 6c 74 69 70 6c 69 65 72 28 43 2c 54 29 0a  Multiplier(C,T).
278c0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 65  #endif../*.** We
278d0 20 68 61 76 65 20 73 6f 20 66 61 72 20 6d 61 74   have so far mat
278e0 63 68 65 64 20 70 42 75 69 6c 64 65 72 2d 3e 70  ched pBuilder->p
278f0 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
27900 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 0a 2a   terms of the .*
27910 2a 20 69 6e 64 65 78 20 70 49 6e 64 65 78 2e 20  * index pIndex. 
27920 54 72 79 20 74 6f 20 6d 61 74 63 68 20 6f 6e 65  Try to match one
27930 20 6d 6f 72 65 2e 0a 2a 2a 0a 2a 2a 20 57 68 65   more..**.** Whe
27940 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
27950 69 73 20 63 61 6c 6c 65 64 2c 20 70 42 75 69 6c  is called, pBuil
27960 64 65 72 2d 3e 70 4e 65 77 2d 3e 6e 4f 75 74 20  der->pNew->nOut 
27970 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 0a 2a 2a  contains the .**
27980 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
27990 65 78 70 65 63 74 65 64 20 74 6f 20 62 65 20 76  expected to be v
279a0 69 73 69 74 65 64 20 62 79 20 66 69 6c 74 65 72  isited by filter
279b0 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20 6e 45  ing using the nE
279c0 71 20 0a 2a 2a 20 74 65 72 6d 73 20 6f 6e 6c 79  q .** terms only
279d0 2e 20 49 66 20 69 74 20 69 73 20 6d 6f 64 69 66  . If it is modif
279e0 69 65 64 2c 20 74 68 69 73 20 76 61 6c 75 65 20  ied, this value 
279f0 69 73 20 72 65 73 74 6f 72 65 64 20 62 65 66 6f  is restored befo
27a00 72 65 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63  re this .** func
27a10 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 0a 2a 2a  tion returns..**
27a20 0a 2a 2a 20 49 66 20 70 50 72 6f 62 65 2d 3e 74  .** If pProbe->t
27a30 6e 75 6d 3d 3d 30 2c 20 74 68 61 74 20 6d 65 61  num==0, that mea
27a40 6e 73 20 70 49 6e 64 65 78 20 69 73 20 61 20 66  ns pIndex is a f
27a50 61 6b 65 20 69 6e 64 65 78 20 75 73 65 64 20 66  ake index used f
27a60 6f 72 20 74 68 65 0a 2a 2a 20 49 4e 54 45 47 45  or the.** INTEGE
27a70 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 0a 2a  R PRIMARY KEY..*
27a80 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  /.static int whe
27a90 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 49 6e  reLoopAddBtreeIn
27aa0 64 65 78 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70  dex(.  WhereLoop
27ab0 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65  Builder *pBuilde
27ac0 72 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 57 68  r,     /* The Wh
27ad0 65 72 65 4c 6f 6f 70 20 66 61 63 74 6f 72 79 20  ereLoop factory 
27ae0 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
27af0 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20  ist_item *pSrc, 
27b00 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61       /* FROM cla
27b10 75 73 65 20 74 65 72 6d 20 62 65 69 6e 67 20 61  use term being a
27b20 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 49 6e 64  nalyzed */.  Ind
27b30 65 78 20 2a 70 50 72 6f 62 65 2c 20 20 20 20 20  ex *pProbe,     
27b40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27b50 41 6e 20 69 6e 64 65 78 20 6f 6e 20 70 53 72 63  An index on pSrc
27b60 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 6e 49 6e   */.  LogEst nIn
27b70 4d 75 6c 20 20 20 20 20 20 20 20 20 20 20 20 20  Mul             
27b80 20 20 20 20 20 20 2f 2a 20 6c 6f 67 28 4e 75 6d        /* log(Num
27b90 62 65 72 20 6f 66 20 69 74 65 72 61 74 69 6f 6e  ber of iteration
27ba0 73 20 64 75 65 20 74 6f 20 49 4e 29 20 2a 2f 0a  s due to IN) */.
27bb0 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  ){.  WhereInfo *
27bc0 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65  pWInfo = pBuilde
27bd0 72 2d 3e 70 57 49 6e 66 6f 3b 20 20 2f 2a 20 57  r->pWInfo;  /* W
27be0 48 45 52 45 20 61 6e 61 6c 79 73 65 20 63 6f 6e  HERE analyse con
27bf0 74 65 78 74 20 2a 2f 0a 20 20 50 61 72 73 65 20  text */.  Parse 
27c00 2a 70 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f  *pParse = pWInfo
27c10 2d 3e 70 50 61 72 73 65 3b 20 20 20 20 20 20 20  ->pParse;       
27c20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
27c30 65 78 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ext */.  sqlite3
27c40 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
27c50 62 3b 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61  b;       /* Data
27c60 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
27c70 6d 61 6c 6c 6f 63 20 63 6f 6e 74 65 78 74 20 2a  malloc context *
27c80 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  /.  WhereLoop *p
27c90 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20  New;            
27ca0 20 20 20 20 2f 2a 20 54 65 6d 70 6c 61 74 65 20      /* Template 
27cb0 57 68 65 72 65 4c 6f 6f 70 20 75 6e 64 65 72 20  WhereLoop under 
27cc0 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a  construction */.
27cd0 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
27ce0 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rm;             
27cf0 20 20 2f 2a 20 41 20 57 68 65 72 65 54 65 72 6d    /* A WhereTerm
27d00 20 75 6e 64 65 72 20 63 6f 6e 73 69 64 65 72 61   under considera
27d10 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6f 70  tion */.  int op
27d20 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20  Mask;           
27d30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
27d40 69 64 20 6f 70 65 72 61 74 6f 72 73 20 66 6f 72  id operators for
27d50 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a   constraints */.
27d60 20 20 57 68 65 72 65 53 63 61 6e 20 73 63 61 6e    WhereScan scan
27d70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
27d80 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 66 6f    /* Iterator fo
27d90 72 20 57 48 45 52 45 20 74 65 72 6d 73 20 2a 2f  r WHERE terms */
27da0 0a 20 20 42 69 74 6d 61 73 6b 20 73 61 76 65 64  .  Bitmask saved
27db0 5f 70 72 65 72 65 71 3b 20 20 20 20 20 20 20 20  _prereq;        
27dc0 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76     /* Original v
27dd0 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 70 72  alue of pNew->pr
27de0 65 72 65 71 20 2a 2f 0a 20 20 75 31 36 20 73 61  ereq */.  u16 sa
27df0 76 65 64 5f 6e 4c 54 65 72 6d 3b 20 20 20 20 20  ved_nLTerm;     
27e00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69            /* Ori
27e10 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70  ginal value of p
27e20 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 2a 2f 0a 20  New->nLTerm */. 
27e30 20 75 31 36 20 73 61 76 65 64 5f 6e 45 71 3b 20   u16 saved_nEq; 
27e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27e50 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c   /* Original val
27e60 75 65 20 6f 66 20 70 4e 65 77 2d 3e 75 2e 62 74  ue of pNew->u.bt
27e70 72 65 65 2e 6e 45 71 20 2a 2f 0a 20 20 75 31 36  ree.nEq */.  u16
27e80 20 73 61 76 65 64 5f 6e 53 6b 69 70 3b 20 20 20   saved_nSkip;   
27e90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27ea0 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f  Original value o
27eb0 66 20 70 4e 65 77 2d 3e 6e 53 6b 69 70 20 2a 2f  f pNew->nSkip */
27ec0 0a 20 20 75 33 32 20 73 61 76 65 64 5f 77 73 46  .  u32 saved_wsF
27ed0 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
27ee0 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76     /* Original v
27ef0 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 77 73  alue of pNew->ws
27f00 46 6c 61 67 73 20 2a 2f 0a 20 20 4c 6f 67 45 73  Flags */.  LogEs
27f10 74 20 73 61 76 65 64 5f 6e 4f 75 74 3b 20 20 20  t saved_nOut;   
27f20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72             /* Or
27f30 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20  iginal value of 
27f40 70 4e 65 77 2d 3e 6e 4f 75 74 20 2a 2f 0a 20 20  pNew->nOut */.  
27f50 69 6e 74 20 69 43 6f 6c 3b 20 20 20 20 20 20 20  int iCol;       
27f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27f70 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20  /* Index of the 
27f80 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 74 61  column in the ta
27f90 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  ble */.  int rc 
27fa0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
27fb0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
27fc0 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 4c 6f 67  rn code */.  Log
27fd0 45 73 74 20 72 53 69 7a 65 3b 20 20 20 20 20 20  Est rSize;      
27fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27ff0 4e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69  Number of rows i
28000 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20  n the table */. 
28010 20 4c 6f 67 45 73 74 20 72 4c 6f 67 53 69 7a 65   LogEst rLogSize
28020 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
28030 20 2f 2a 20 4c 6f 67 61 72 69 74 68 6d 20 6f 66   /* Logarithm of
28040 20 74 61 62 6c 65 20 73 69 7a 65 20 2a 2f 0a 20   table size */. 
28050 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 6f 70   WhereTerm *pTop
28060 20 3d 20 30 2c 20 2a 70 42 74 6d 20 3d 20 30 3b   = 0, *pBtm = 0;
28070 20 2f 2a 20 54 6f 70 20 61 6e 64 20 62 6f 74 74   /* Top and bott
28080 6f 6d 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61  om range constra
28090 69 6e 74 73 20 2a 2f 0a 0a 20 20 70 4e 65 77 20  ints */..  pNew 
280a0 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77  = pBuilder->pNew
280b0 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
280c0 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72  ocFailed ) retur
280d0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
280e0 0a 20 20 61 73 73 65 72 74 28 20 28 70 4e 65 77  .  assert( (pNew
280f0 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
28100 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 3d  E_VIRTUALTABLE)=
28110 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
28120 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26  (pNew->wsFlags &
28130 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54   WHERE_TOP_LIMIT
28140 29 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4e  )==0 );.  if( pN
28150 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  ew->wsFlags & WH
28160 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 7b  ERE_BTM_LIMIT ){
28170 0a 20 20 20 20 6f 70 4d 61 73 6b 20 3d 20 57 4f  .    opMask = WO
28180 5f 4c 54 7c 57 4f 5f 4c 45 3b 0a 20 20 7d 65 6c  _LT|WO_LE;.  }el
28190 73 65 20 69 66 28 20 70 50 72 6f 62 65 2d 3e 74  se if( pProbe->t
281a0 6e 75 6d 3c 3d 30 20 7c 7c 20 28 70 53 72 63 2d  num<=0 || (pSrc-
281b0 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c  >jointype & JT_L
281c0 45 46 54 29 21 3d 30 20 29 7b 0a 20 20 20 20 6f  EFT)!=0 ){.    o
281d0 70 4d 61 73 6b 20 3d 20 57 4f 5f 45 51 7c 57 4f  pMask = WO_EQ|WO
281e0 5f 49 4e 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c  _IN|WO_GT|WO_GE|
281f0 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 3b 0a 20 20 7d  WO_LT|WO_LE;.  }
28200 65 6c 73 65 7b 0a 20 20 20 20 6f 70 4d 61 73 6b  else{.    opMask
28210 20 3d 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 7c 57   = WO_EQ|WO_IN|W
28220 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 47 54 7c 57  O_ISNULL|WO_GT|W
28230 4f 5f 47 45 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45  O_GE|WO_LT|WO_LE
28240 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 72 6f  ;.  }.  if( pPro
28250 62 65 2d 3e 62 55 6e 6f 72 64 65 72 65 64 20 29  be->bUnordered )
28260 20 6f 70 4d 61 73 6b 20 26 3d 20 7e 28 57 4f 5f   opMask &= ~(WO_
28270 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4c 54 7c 57  GT|WO_GE|WO_LT|W
28280 4f 5f 4c 45 29 3b 0a 0a 20 20 61 73 73 65 72 74  O_LE);..  assert
28290 28 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e  ( pNew->u.btree.
282a0 6e 45 71 3c 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c  nEq<pProbe->nCol
282b0 75 6d 6e 20 29 3b 0a 20 20 69 43 6f 6c 20 3d 20  umn );.  iCol = 
282c0 70 50 72 6f 62 65 2d 3e 61 69 43 6f 6c 75 6d 6e  pProbe->aiColumn
282d0 5b 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e  [pNew->u.btree.n
282e0 45 71 5d 3b 0a 0a 20 20 70 54 65 72 6d 20 3d 20  Eq];..  pTerm = 
282f0 77 68 65 72 65 53 63 61 6e 49 6e 69 74 28 26 73  whereScanInit(&s
28300 63 61 6e 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70  can, pBuilder->p
28310 57 43 2c 20 70 53 72 63 2d 3e 69 43 75 72 73 6f  WC, pSrc->iCurso
28320 72 2c 20 69 43 6f 6c 2c 0a 20 20 20 20 20 20 20  r, iCol,.       
28330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28340 20 6f 70 4d 61 73 6b 2c 20 70 50 72 6f 62 65 29   opMask, pProbe)
28350 3b 0a 20 20 73 61 76 65 64 5f 6e 45 71 20 3d 20  ;.  saved_nEq = 
28360 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  pNew->u.btree.nE
28370 71 3b 0a 20 20 73 61 76 65 64 5f 6e 53 6b 69 70  q;.  saved_nSkip
28380 20 3d 20 70 4e 65 77 2d 3e 6e 53 6b 69 70 3b 0a   = pNew->nSkip;.
28390 20 20 73 61 76 65 64 5f 6e 4c 54 65 72 6d 20 3d    saved_nLTerm =
283a0 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 3b 0a 20   pNew->nLTerm;. 
283b0 20 73 61 76 65 64 5f 77 73 46 6c 61 67 73 20 3d   saved_wsFlags =
283c0 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 3b 0a   pNew->wsFlags;.
283d0 20 20 73 61 76 65 64 5f 70 72 65 72 65 71 20 3d    saved_prereq =
283e0 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 3b 0a 20   pNew->prereq;. 
283f0 20 73 61 76 65 64 5f 6e 4f 75 74 20 3d 20 70 4e   saved_nOut = pN
28400 65 77 2d 3e 6e 4f 75 74 3b 0a 20 20 70 4e 65 77  ew->nOut;.  pNew
28410 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a 20 20  ->rSetup = 0;.  
28420 72 53 69 7a 65 20 3d 20 70 50 72 6f 62 65 2d 3e  rSize = pProbe->
28430 61 69 52 6f 77 4c 6f 67 45 73 74 5b 30 5d 3b 0a  aiRowLogEst[0];.
28440 20 20 72 4c 6f 67 53 69 7a 65 20 3d 20 65 73 74    rLogSize = est
28450 4c 6f 67 28 72 53 69 7a 65 29 3b 0a 20 20 66 6f  Log(rSize);.  fo
28460 72 28 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  r(; rc==SQLITE_O
28470 4b 20 26 26 20 70 54 65 72 6d 21 3d 30 3b 20 70  K && pTerm!=0; p
28480 54 65 72 6d 20 3d 20 77 68 65 72 65 53 63 61 6e  Term = whereScan
28490 4e 65 78 74 28 26 73 63 61 6e 29 29 7b 0a 20 20  Next(&scan)){.  
284a0 20 20 75 31 36 20 65 4f 70 20 3d 20 70 54 65 72    u16 eOp = pTer
284b0 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3b 20 20 20  m->eOperator;   
284c0 2f 2a 20 53 68 6f 72 74 68 61 6e 64 20 66 6f 72  /* Shorthand for
284d0 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
284e0 72 20 2a 2f 0a 20 20 20 20 4c 6f 67 45 73 74 20  r */.    LogEst 
284f0 72 43 6f 73 74 49 64 78 3b 0a 20 20 20 20 4c 6f  rCostIdx;.    Lo
28500 67 45 73 74 20 6e 4f 75 74 55 6e 61 64 6a 75 73  gEst nOutUnadjus
28510 74 65 64 3b 20 20 20 20 20 20 20 20 2f 2a 20 6e  ted;        /* n
28520 4f 75 74 20 62 65 66 6f 72 65 20 49 4e 28 29 20  Out before IN() 
28530 61 6e 64 20 57 48 45 52 45 20 61 64 6a 75 73 74  and WHERE adjust
28540 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 69 6e 74  ments */.    int
28550 20 6e 49 6e 20 3d 20 30 3b 0a 23 69 66 64 65 66   nIn = 0;.#ifdef
28560 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
28570 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20  TAT3_OR_STAT4.  
28580 20 20 69 6e 74 20 6e 52 65 63 56 61 6c 69 64 20    int nRecValid 
28590 3d 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63  = pBuilder->nRec
285a0 56 61 6c 69 64 3b 0a 23 65 6e 64 69 66 0a 20 20  Valid;.#endif.  
285b0 20 20 69 66 28 20 28 65 4f 70 3d 3d 57 4f 5f 49    if( (eOp==WO_I
285c0 53 4e 55 4c 4c 20 7c 7c 20 28 70 54 65 72 6d 2d  SNULL || (pTerm-
285d0 3e 77 74 46 6c 61 67 73 26 54 45 52 4d 5f 56 4e  >wtFlags&TERM_VN
285e0 55 4c 4c 29 21 3d 30 29 0a 20 20 20 20 20 26 26  ULL)!=0).     &&
285f0 20 28 69 43 6f 6c 3c 30 20 7c 7c 20 70 53 72 63   (iCol<0 || pSrc
28600 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f  ->pTab->aCol[iCo
28610 6c 5d 2e 6e 6f 74 4e 75 6c 6c 29 0a 20 20 20 20  l].notNull).    
28620 29 7b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  ){.      continu
28630 65 3b 20 2f 2a 20 69 67 6e 6f 72 65 20 49 53 20  e; /* ignore IS 
28640 5b 4e 4f 54 5d 20 4e 55 4c 4c 20 63 6f 6e 73 74  [NOT] NULL const
28650 72 61 69 6e 74 73 20 6f 6e 20 4e 4f 54 20 4e 55  raints on NOT NU
28660 4c 4c 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20  LL columns */.  
28670 20 20 7d 0a 20 20 20 20 69 66 28 20 70 54 65 72    }.    if( pTer
28680 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 26  m->prereqRight &
28690 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 20   pNew->maskSelf 
286a0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20  ) continue;..   
286b0 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d   pNew->wsFlags =
286c0 20 73 61 76 65 64 5f 77 73 46 6c 61 67 73 3b 0a   saved_wsFlags;.
286d0 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65      pNew->u.btre
286e0 65 2e 6e 45 71 20 3d 20 73 61 76 65 64 5f 6e 45  e.nEq = saved_nE
286f0 71 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54  q;.    pNew->nLT
28700 65 72 6d 20 3d 20 73 61 76 65 64 5f 6e 4c 54 65  erm = saved_nLTe
28710 72 6d 3b 0a 20 20 20 20 69 66 28 20 77 68 65 72  rm;.    if( wher
28720 65 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62 2c 20  eLoopResize(db, 
28730 70 4e 65 77 2c 20 70 4e 65 77 2d 3e 6e 4c 54 65  pNew, pNew->nLTe
28740 72 6d 2b 31 29 20 29 20 62 72 65 61 6b 3b 20 2f  rm+1) ) break; /
28750 2a 20 4f 4f 4d 20 2a 2f 0a 20 20 20 20 70 4e 65  * OOM */.    pNe
28760 77 2d 3e 61 4c 54 65 72 6d 5b 70 4e 65 77 2d 3e  w->aLTerm[pNew->
28770 6e 4c 54 65 72 6d 2b 2b 5d 20 3d 20 70 54 65 72  nLTerm++] = pTer
28780 6d 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 72 65  m;.    pNew->pre
28790 72 65 71 20 3d 20 28 73 61 76 65 64 5f 70 72 65  req = (saved_pre
287a0 72 65 71 20 7c 20 70 54 65 72 6d 2d 3e 70 72 65  req | pTerm->pre
287b0 72 65 71 52 69 67 68 74 29 20 26 20 7e 70 4e 65  reqRight) & ~pNe
287c0 77 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 0a 20 20  w->maskSelf;..  
287d0 20 20 61 73 73 65 72 74 28 20 6e 49 6e 4d 75 6c    assert( nInMul
287e0 3d 3d 30 0a 20 20 20 20 20 20 20 20 7c 7c 20 28  ==0.        || (
287f0 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20  pNew->wsFlags & 
28800 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c  WHERE_COLUMN_NUL
28810 4c 29 21 3d 30 20 0a 20 20 20 20 20 20 20 20 7c  L)!=0 .        |
28820 7c 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73  | (pNew->wsFlags
28830 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f   & WHERE_COLUMN_
28840 49 4e 29 21 3d 30 20 0a 20 20 20 20 20 20 20 20  IN)!=0 .        
28850 7c 7c 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67  || (pNew->wsFlag
28860 73 20 26 20 57 48 45 52 45 5f 53 4b 49 50 53 43  s & WHERE_SKIPSC
28870 41 4e 29 21 3d 30 20 0a 20 20 20 20 29 3b 0a 0a  AN)!=0 .    );..
28880 20 20 20 20 69 66 28 20 65 4f 70 20 26 20 57 4f      if( eOp & WO
28890 5f 49 4e 20 29 7b 0a 20 20 20 20 20 20 45 78 70  _IN ){.      Exp
288a0 72 20 2a 70 45 78 70 72 20 3d 20 70 54 65 72 6d  r *pExpr = pTerm
288b0 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 70  ->pExpr;.      p
288c0 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20  New->wsFlags |= 
288d0 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 3b  WHERE_COLUMN_IN;
288e0 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48  .      if( ExprH
288f0 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
28900 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
28910 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 22 78  ){.        /* "x
28920 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29   IN (SELECT ...)
28930 22 3a 20 20 54 55 4e 49 4e 47 3a 20 74 68 65 20  ":  TUNING: the 
28940 53 45 4c 45 43 54 20 72 65 74 75 72 6e 73 20 32  SELECT returns 2
28950 35 20 72 6f 77 73 20 2a 2f 0a 20 20 20 20 20 20  5 rows */.      
28960 20 20 6e 49 6e 20 3d 20 34 36 3b 20 20 61 73 73    nIn = 46;  ass
28970 65 72 74 28 20 34 36 3d 3d 73 71 6c 69 74 65 33  ert( 46==sqlite3
28980 4c 6f 67 45 73 74 28 32 35 29 20 29 3b 0a 20 20  LogEst(25) );.  
28990 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 41 4c      }else if( AL
289a0 57 41 59 53 28 70 45 78 70 72 2d 3e 78 2e 70 4c  WAYS(pExpr->x.pL
289b0 69 73 74 20 26 26 20 70 45 78 70 72 2d 3e 78 2e  ist && pExpr->x.
289c0 70 4c 69 73 74 2d 3e 6e 45 78 70 72 29 20 29 7b  pList->nExpr) ){
289d0 0a 20 20 20 20 20 20 20 20 2f 2a 20 22 78 20 49  .        /* "x I
289e0 4e 20 28 76 61 6c 75 65 2c 20 76 61 6c 75 65 2c  N (value, value,
289f0 20 2e 2e 2e 29 22 20 2a 2f 0a 20 20 20 20 20 20   ...)" */.      
28a00 20 20 6e 49 6e 20 3d 20 73 71 6c 69 74 65 33 4c    nIn = sqlite3L
28a10 6f 67 45 73 74 28 70 45 78 70 72 2d 3e 78 2e 70  ogEst(pExpr->x.p
28a20 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20  List->nExpr);.  
28a30 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
28a40 72 74 28 20 6e 49 6e 3e 30 20 29 3b 20 20 2f 2a  rt( nIn>0 );  /*
28a50 20 52 48 53 20 61 6c 77 61 79 73 20 68 61 73 20   RHS always has 
28a60 32 20 6f 72 20 6d 6f 72 65 20 74 65 72 6d 73 2e  2 or more terms.
28a70 2e 2e 20 20 54 68 65 20 70 61 72 73 65 72 0a 20  ..  The parser. 
28a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28a90 20 20 20 20 20 20 20 2a 2a 20 63 68 61 6e 67 65         ** change
28aa0 73 20 22 78 20 49 4e 20 28 3f 29 22 20 69 6e 74  s "x IN (?)" int
28ab0 6f 20 22 78 3d 3f 22 2e 20 2a 2f 0a 0a 20 20 20  o "x=?". */..   
28ac0 20 7d 65 6c 73 65 20 69 66 28 20 65 4f 70 20 26   }else if( eOp &
28ad0 20 28 57 4f 5f 45 51 29 20 29 7b 0a 20 20 20 20   (WO_EQ) ){.    
28ae0 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20    pNew->wsFlags 
28af0 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  |= WHERE_COLUMN_
28b00 45 51 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43  EQ;.      if( iC
28b10 6f 6c 3c 30 20 7c 7c 20 28 6e 49 6e 4d 75 6c 3d  ol<0 || (nInMul=
28b20 3d 30 20 26 26 20 70 4e 65 77 2d 3e 75 2e 62 74  =0 && pNew->u.bt
28b30 72 65 65 2e 6e 45 71 3d 3d 70 50 72 6f 62 65 2d  ree.nEq==pProbe-
28b40 3e 6e 4b 65 79 43 6f 6c 2d 31 29 20 29 7b 0a 20  >nKeyCol-1) ){. 
28b50 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3e         if( iCol>
28b60 3d 30 20 26 26 20 21 49 73 55 6e 69 71 75 65 49  =0 && !IsUniqueI
28b70 6e 64 65 78 28 70 50 72 6f 62 65 29 20 29 7b 0a  ndex(pProbe) ){.
28b80 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
28b90 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45  wsFlags |= WHERE
28ba0 5f 55 4e 51 5f 57 41 4e 54 45 44 3b 0a 20 20 20  _UNQ_WANTED;.   
28bb0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
28bc0 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c        pNew->wsFl
28bd0 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 4f 4e 45  ags |= WHERE_ONE
28be0 52 4f 57 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ROW;.        }. 
28bf0 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
28c00 20 69 66 28 20 65 4f 70 20 26 20 57 4f 5f 49 53   if( eOp & WO_IS
28c10 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 70 4e  NULL ){.      pN
28c20 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57  ew->wsFlags |= W
28c30 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c  HERE_COLUMN_NULL
28c40 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
28c50 65 4f 70 20 26 20 28 57 4f 5f 47 54 7c 57 4f 5f  eOp & (WO_GT|WO_
28c60 47 45 29 20 29 7b 0a 20 20 20 20 20 20 74 65 73  GE) ){.      tes
28c70 74 63 61 73 65 28 20 65 4f 70 20 26 20 57 4f 5f  tcase( eOp & WO_
28c80 47 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  GT );.      test
28c90 63 61 73 65 28 20 65 4f 70 20 26 20 57 4f 5f 47  case( eOp & WO_G
28ca0 45 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  E );.      pNew-
28cb0 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52  >wsFlags |= WHER
28cc0 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c 57  E_COLUMN_RANGE|W
28cd0 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 3b 0a  HERE_BTM_LIMIT;.
28ce0 20 20 20 20 20 20 70 42 74 6d 20 3d 20 70 54 65        pBtm = pTe
28cf0 72 6d 3b 0a 20 20 20 20 20 20 70 54 6f 70 20 3d  rm;.      pTop =
28d00 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
28d10 20 20 20 20 20 61 73 73 65 72 74 28 20 65 4f 70       assert( eOp
28d20 20 26 20 28 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29   & (WO_LT|WO_LE)
28d30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
28d40 73 65 28 20 65 4f 70 20 26 20 57 4f 5f 4c 54 20  se( eOp & WO_LT 
28d50 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
28d60 65 28 20 65 4f 70 20 26 20 57 4f 5f 4c 45 20 29  e( eOp & WO_LE )
28d70 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73  ;.      pNew->ws
28d80 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43  Flags |= WHERE_C
28d90 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c 57 48 45 52  OLUMN_RANGE|WHER
28da0 45 5f 54 4f 50 5f 4c 49 4d 49 54 3b 0a 20 20 20  E_TOP_LIMIT;.   
28db0 20 20 20 70 54 6f 70 20 3d 20 70 54 65 72 6d 3b     pTop = pTerm;
28dc0 0a 20 20 20 20 20 20 70 42 74 6d 20 3d 20 28 70  .      pBtm = (p
28dd0 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  New->wsFlags & W
28de0 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 29 21  HERE_BTM_LIMIT)!
28df0 3d 30 20 3f 0a 20 20 20 20 20 20 20 20 20 20 20  =0 ?.           
28e00 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
28e10 61 4c 54 65 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54  aLTerm[pNew->nLT
28e20 65 72 6d 2d 32 5d 20 3a 20 30 3b 0a 20 20 20 20  erm-2] : 0;.    
28e30 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69  }..    /* At thi
28e40 73 20 70 6f 69 6e 74 20 70 4e 65 77 2d 3e 6e 4f  s point pNew->nO
28e50 75 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  ut is set to the
28e60 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
28e70 65 78 70 65 63 74 65 64 20 74 6f 0a 20 20 20 20  expected to.    
28e80 2a 2a 20 62 65 20 76 69 73 69 74 65 64 20 62 79  ** be visited by
28e90 20 74 68 65 20 69 6e 64 65 78 20 73 63 61 6e 20   the index scan 
28ea0 62 65 66 6f 72 65 20 63 6f 6e 73 69 64 65 72 69  before consideri
28eb0 6e 67 20 74 65 72 6d 20 70 54 65 72 6d 2c 20 6f  ng term pTerm, o
28ec0 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 76 61 6c  r the.    ** val
28ed0 75 65 73 20 6f 66 20 6e 49 6e 20 61 6e 64 20 6e  ues of nIn and n
28ee0 49 6e 4d 75 6c 2e 20 49 6e 20 6f 74 68 65 72 20  InMul. In other 
28ef0 77 6f 72 64 73 2c 20 61 73 73 75 6d 69 6e 67 20  words, assuming 
28f00 74 68 61 74 20 61 6c 6c 20 0a 20 20 20 20 2a 2a  that all .    **
28f10 20 22 78 20 49 4e 28 2e 2e 2e 29 22 20 74 65 72   "x IN(...)" ter
28f20 6d 73 20 61 72 65 20 72 65 70 6c 61 63 65 64 20  ms are replaced 
28f30 77 69 74 68 20 22 78 20 3d 20 3f 22 2e 20 54 68  with "x = ?". Th
28f40 69 73 20 62 6c 6f 63 6b 20 75 70 64 61 74 65 73  is block updates
28f50 0a 20 20 20 20 2a 2a 20 74 68 65 20 76 61 6c 75  .    ** the valu
28f60 65 20 6f 66 20 70 4e 65 77 2d 3e 6e 4f 75 74 20  e of pNew->nOut 
28f70 74 6f 20 61 63 63 6f 75 6e 74 20 66 6f 72 20 70  to account for p
28f80 54 65 72 6d 20 28 62 75 74 20 6e 6f 74 20 6e 49  Term (but not nI
28f90 6e 2f 6e 49 6e 4d 75 6c 29 2e 20 20 2a 2f 0a 20  n/nInMul).  */. 
28fa0 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d     assert( pNew-
28fb0 3e 6e 4f 75 74 3d 3d 73 61 76 65 64 5f 6e 4f 75  >nOut==saved_nOu
28fc0 74 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65  t );.    if( pNe
28fd0 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  w->wsFlags & WHE
28fe0 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 20  RE_COLUMN_RANGE 
28ff0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 64 6a 75  ){.      /* Adju
29000 73 74 20 6e 4f 75 74 20 75 73 69 6e 67 20 73 74  st nOut using st
29010 61 74 33 2f 73 74 61 74 34 20 64 61 74 61 2e 20  at3/stat4 data. 
29020 4f 72 2c 20 69 66 20 74 68 65 72 65 20 69 73 20  Or, if there is 
29030 6e 6f 20 73 74 61 74 33 2f 73 74 61 74 34 0a 20  no stat3/stat4. 
29040 20 20 20 20 20 2a 2a 20 64 61 74 61 2c 20 75 73       ** data, us
29050 69 6e 67 20 73 6f 6d 65 20 6f 74 68 65 72 20 65  ing some other e
29060 73 74 69 6d 61 74 65 2e 20 20 2a 2f 0a 20 20 20  stimate.  */.   
29070 20 20 20 77 68 65 72 65 52 61 6e 67 65 53 63 61     whereRangeSca
29080 6e 45 73 74 28 70 50 61 72 73 65 2c 20 70 42 75  nEst(pParse, pBu
29090 69 6c 64 65 72 2c 20 70 42 74 6d 2c 20 70 54 6f  ilder, pBtm, pTo
290a0 70 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 7d 65  p, pNew);.    }e
290b0 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  lse{.      int n
290c0 45 71 20 3d 20 2b 2b 70 4e 65 77 2d 3e 75 2e 62  Eq = ++pNew->u.b
290d0 74 72 65 65 2e 6e 45 71 3b 0a 20 20 20 20 20 20  tree.nEq;.      
290e0 61 73 73 65 72 74 28 20 65 4f 70 20 26 20 28 57  assert( eOp & (W
290f0 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 45 51 7c 57  O_ISNULL|WO_EQ|W
29100 4f 5f 49 4e 29 20 29 3b 0a 0a 20 20 20 20 20 20  O_IN) );..      
29110 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4f  assert( pNew->nO
29120 75 74 3d 3d 73 61 76 65 64 5f 6e 4f 75 74 20 29  ut==saved_nOut )
29130 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72  ;.      if( pTer
29140 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3c 3d 30 20  m->truthProb<=0 
29150 26 26 20 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20 20  && iCol>=0 ){.  
29160 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 65        assert( (e
29170 4f 70 20 26 20 57 4f 5f 49 4e 29 20 7c 7c 20 6e  Op & WO_IN) || n
29180 49 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  In==0 );.       
29190 20 74 65 73 74 63 61 73 65 28 20 65 4f 70 20 26   testcase( eOp &
291a0 20 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 20 20   WO_IN );.      
291b0 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b 3d 20    pNew->nOut += 
291c0 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62  pTerm->truthProb
291d0 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
291e0 6e 4f 75 74 20 2d 3d 20 6e 49 6e 3b 0a 20 20 20  nOut -= nIn;.   
291f0 20 20 20 7d 65 6c 73 65 7b 0a 23 69 66 64 65 66     }else{.#ifdef
29200 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
29210 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20  TAT3_OR_STAT4.  
29220 20 20 20 20 20 20 74 52 6f 77 63 6e 74 20 6e 4f        tRowcnt nO
29230 75 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ut = 0;.        
29240 69 66 28 20 6e 49 6e 4d 75 6c 3d 3d 30 20 0a 20  if( nInMul==0 . 
29250 20 20 20 20 20 20 20 20 26 26 20 70 50 72 6f 62          && pProb
29260 65 2d 3e 6e 53 61 6d 70 6c 65 20 0a 20 20 20 20  e->nSample .    
29270 20 20 20 20 20 26 26 20 70 4e 65 77 2d 3e 75 2e       && pNew->u.
29280 62 74 72 65 65 2e 6e 45 71 3c 3d 70 50 72 6f 62  btree.nEq<=pProb
29290 65 2d 3e 6e 53 61 6d 70 6c 65 43 6f 6c 0a 20 20  e->nSampleCol.  
292a0 20 20 20 20 20 20 20 26 26 20 28 28 65 4f 70 20         && ((eOp 
292b0 26 20 57 4f 5f 49 4e 29 3d 3d 30 20 7c 7c 20 21  & WO_IN)==0 || !
292c0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
292d0 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50  pTerm->pExpr, EP
292e0 5f 78 49 73 53 65 6c 65 63 74 29 29 0a 20 20 20  _xIsSelect)).   
292f0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
29300 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
29310 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  pTerm->pExpr;.  
29320 20 20 20 20 20 20 20 20 69 66 28 20 28 65 4f 70          if( (eOp
29330 20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 4e   & (WO_EQ|WO_ISN
29340 55 4c 4c 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  ULL))!=0 ){.    
29350 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
29360 28 20 65 4f 70 20 26 20 57 4f 5f 45 51 20 29 3b  ( eOp & WO_EQ );
29370 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73  .            tes
29380 74 63 61 73 65 28 20 65 4f 70 20 26 20 57 4f 5f  tcase( eOp & WO_
29390 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20  ISNULL );.      
293a0 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65        rc = where
293b0 45 71 75 61 6c 53 63 61 6e 45 73 74 28 70 50 61  EqualScanEst(pPa
293c0 72 73 65 2c 20 70 42 75 69 6c 64 65 72 2c 20 70  rse, pBuilder, p
293d0 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 6e  Expr->pRight, &n
293e0 4f 75 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Out);.          
293f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
29400 20 20 20 72 63 20 3d 20 77 68 65 72 65 49 6e 53     rc = whereInS
29410 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c 20 70  canEst(pParse, p
29420 42 75 69 6c 64 65 72 2c 20 70 45 78 70 72 2d 3e  Builder, pExpr->
29430 78 2e 70 4c 69 73 74 2c 20 26 6e 4f 75 74 29 3b  x.pList, &nOut);
29440 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
29450 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
29460 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 29  QLITE_NOTFOUND )
29470 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
29480 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
29490 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 62  c!=SQLITE_OK ) b
294a0 72 65 61 6b 3b 20 20 20 20 20 20 20 20 20 20 2f  reak;          /
294b0 2a 20 4a 75 6d 70 20 6f 75 74 20 6f 66 20 74 68  * Jump out of th
294c0 65 20 70 54 65 72 6d 20 6c 6f 6f 70 20 2a 2f 0a  e pTerm loop */.
294d0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 4f            if( nO
294e0 75 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ut ){.          
294f0 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73    pNew->nOut = s
29500 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 6e 4f 75  qlite3LogEst(nOu
29510 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  t);.            
29520 69 66 28 20 70 4e 65 77 2d 3e 6e 4f 75 74 3e 73  if( pNew->nOut>s
29530 61 76 65 64 5f 6e 4f 75 74 20 29 20 70 4e 65 77  aved_nOut ) pNew
29540 2d 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e  ->nOut = saved_n
29550 4f 75 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Out;.           
29560 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2d 3d 20 6e   pNew->nOut -= n
29570 49 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  In;.          }.
29580 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
29590 20 20 69 66 28 20 6e 4f 75 74 3d 3d 30 20 29 0a    if( nOut==0 ).
295a0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7b  #endif.        {
295b0 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d  .          pNew-
295c0 3e 6e 4f 75 74 20 2b 3d 20 28 70 50 72 6f 62 65  >nOut += (pProbe
295d0 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 6e 45  ->aiRowLogEst[nE
295e0 71 5d 20 2d 20 70 50 72 6f 62 65 2d 3e 61 69 52  q] - pProbe->aiR
295f0 6f 77 4c 6f 67 45 73 74 5b 6e 45 71 2d 31 5d 29  owLogEst[nEq-1])
29600 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
29610 65 4f 70 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20  eOp & WO_ISNULL 
29620 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ){.            /
29630 2a 20 54 55 4e 49 4e 47 3a 20 49 66 20 74 68 65  * TUNING: If the
29640 72 65 20 69 73 20 6e 6f 20 6c 69 6b 65 6c 69 68  re is no likelih
29650 6f 6f 64 28 29 20 76 61 6c 75 65 2c 20 61 73 73  ood() value, ass
29660 75 6d 65 20 74 68 61 74 20 61 20 0a 20 20 20 20  ume that a .    
29670 20 20 20 20 20 20 20 20 2a 2a 20 22 63 6f 6c 20          ** "col 
29680 49 53 20 4e 55 4c 4c 22 20 65 78 70 72 65 73 73  IS NULL" express
29690 69 6f 6e 20 6d 61 74 63 68 65 73 20 74 77 69 63  ion matches twic
296a0 65 20 61 73 20 6d 61 6e 79 20 72 6f 77 73 20 0a  e as many rows .
296b0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61              ** a
296c0 73 20 28 63 6f 6c 3d 3f 29 2e 20 2a 2f 0a 20 20  s (col=?). */.  
296d0 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
296e0 6e 4f 75 74 20 2b 3d 20 31 30 3b 0a 20 20 20 20  nOut += 10;.    
296f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
29700 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
29710 0a 20 20 20 20 2f 2a 20 53 65 74 20 72 43 6f 73  .    /* Set rCos
29720 74 49 64 78 20 74 6f 20 74 68 65 20 63 6f 73 74  tIdx to the cost
29730 20 6f 66 20 76 69 73 69 74 69 6e 67 20 73 65 6c   of visiting sel
29740 65 63 74 65 64 20 72 6f 77 73 20 69 6e 20 69 6e  ected rows in in
29750 64 65 78 2e 20 41 64 64 0a 20 20 20 20 2a 2a 20  dex. Add.    ** 
29760 69 74 20 74 6f 20 70 4e 65 77 2d 3e 72 52 75 6e  it to pNew->rRun
29770 2c 20 77 68 69 63 68 20 69 73 20 63 75 72 72 65  , which is curre
29780 6e 74 6c 79 20 73 65 74 20 74 6f 20 74 68 65 20  ntly set to the 
29790 63 6f 73 74 20 6f 66 20 74 68 65 20 69 6e 64 65  cost of the inde
297a0 78 0a 20 20 20 20 2a 2a 20 73 65 65 6b 20 6f 6e  x.    ** seek on
297b0 6c 79 2e 20 54 68 65 6e 2c 20 69 66 20 74 68 69  ly. Then, if thi
297c0 73 20 69 73 20 61 20 6e 6f 6e 2d 63 6f 76 65 72  s is a non-cover
297d0 69 6e 67 20 69 6e 64 65 78 2c 20 61 64 64 20 74  ing index, add t
297e0 68 65 20 63 6f 73 74 20 6f 66 0a 20 20 20 20 2a  he cost of.    *
297f0 2a 20 76 69 73 69 74 69 6e 67 20 74 68 65 20 72  * visiting the r
29800 6f 77 73 20 69 6e 20 74 68 65 20 6d 61 69 6e 20  ows in the main 
29810 74 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 72  table.  */.    r
29820 43 6f 73 74 49 64 78 20 3d 20 70 4e 65 77 2d 3e  CostIdx = pNew->
29830 6e 4f 75 74 20 2b 20 31 20 2b 20 28 31 35 2a 70  nOut + 1 + (15*p
29840 50 72 6f 62 65 2d 3e 73 7a 49 64 78 52 6f 77 29  Probe->szIdxRow)
29850 2f 70 53 72 63 2d 3e 70 54 61 62 2d 3e 73 7a 54  /pSrc->pTab->szT
29860 61 62 52 6f 77 3b 0a 20 20 20 20 70 4e 65 77 2d  abRow;.    pNew-
29870 3e 72 52 75 6e 20 3d 20 73 71 6c 69 74 65 33 4c  >rRun = sqlite3L
29880 6f 67 45 73 74 41 64 64 28 72 4c 6f 67 53 69 7a  ogEstAdd(rLogSiz
29890 65 2c 20 72 43 6f 73 74 49 64 78 29 3b 0a 20 20  e, rCostIdx);.  
298a0 20 20 69 66 28 20 28 70 4e 65 77 2d 3e 77 73 46    if( (pNew->wsF
298b0 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 49 44  lags & (WHERE_ID
298c0 58 5f 4f 4e 4c 59 7c 57 48 45 52 45 5f 49 50 4b  X_ONLY|WHERE_IPK
298d0 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  ))==0 ){.      p
298e0 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 73 71 6c 69  New->rRun = sqli
298f0 74 65 33 4c 6f 67 45 73 74 41 64 64 28 70 4e 65  te3LogEstAdd(pNe
29900 77 2d 3e 72 52 75 6e 2c 20 70 4e 65 77 2d 3e 6e  w->rRun, pNew->n
29910 4f 75 74 20 2b 20 31 36 29 3b 0a 20 20 20 20 7d  Out + 16);.    }
29920 0a 20 20 20 20 41 70 70 6c 79 43 6f 73 74 4d 75  .    ApplyCostMu
29930 6c 74 69 70 6c 69 65 72 28 70 4e 65 77 2d 3e 72  ltiplier(pNew->r
29940 52 75 6e 2c 20 70 50 72 6f 62 65 2d 3e 70 54 61  Run, pProbe->pTa
29950 62 6c 65 2d 3e 63 6f 73 74 4d 75 6c 74 29 3b 0a  ble->costMult);.
29960 0a 20 20 20 20 6e 4f 75 74 55 6e 61 64 6a 75 73  .    nOutUnadjus
29970 74 65 64 20 3d 20 70 4e 65 77 2d 3e 6e 4f 75 74  ted = pNew->nOut
29980 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e  ;.    pNew->rRun
29990 20 2b 3d 20 6e 49 6e 4d 75 6c 20 2b 20 6e 49 6e   += nInMul + nIn
299a0 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74  ;.    pNew->nOut
299b0 20 2b 3d 20 6e 49 6e 4d 75 6c 20 2b 20 6e 49 6e   += nInMul + nIn
299c0 3b 0a 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 4f  ;.    whereLoopO
299d0 75 74 70 75 74 41 64 6a 75 73 74 28 70 42 75 69  utputAdjust(pBui
299e0 6c 64 65 72 2d 3e 70 57 43 2c 20 70 4e 65 77 2c  lder->pWC, pNew,
299f0 20 72 53 69 7a 65 29 3b 0a 20 20 20 20 72 63 20   rSize);.    rc 
29a00 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72  = whereLoopInser
29a10 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e 65 77  t(pBuilder, pNew
29a20 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 4e 65 77  );..    if( pNew
29a30 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
29a40 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 20 29  E_COLUMN_RANGE )
29a50 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f  {.      pNew->nO
29a60 75 74 20 3d 20 73 61 76 65 64 5f 6e 4f 75 74 3b  ut = saved_nOut;
29a70 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
29a80 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 6e    pNew->nOut = n
29a90 4f 75 74 55 6e 61 64 6a 75 73 74 65 64 3b 0a 20  OutUnadjusted;. 
29aa0 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 28 70     }..    if( (p
29ab0 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  New->wsFlags & W
29ac0 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 3d  HERE_TOP_LIMIT)=
29ad0 3d 30 0a 20 20 20 20 20 26 26 20 70 4e 65 77 2d  =0.     && pNew-
29ae0 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3c 70 50 72  >u.btree.nEq<pPr
29af0 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 0a 20 20 20  obe->nColumn.   
29b00 20 29 7b 0a 20 20 20 20 20 20 77 68 65 72 65 4c   ){.      whereL
29b10 6f 6f 70 41 64 64 42 74 72 65 65 49 6e 64 65 78  oopAddBtreeIndex
29b20 28 70 42 75 69 6c 64 65 72 2c 20 70 53 72 63 2c  (pBuilder, pSrc,
29b30 20 70 50 72 6f 62 65 2c 20 6e 49 6e 4d 75 6c 2b   pProbe, nInMul+
29b40 6e 49 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  nIn);.    }.    
29b50 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76  pNew->nOut = sav
29b60 65 64 5f 6e 4f 75 74 3b 0a 23 69 66 64 65 66 20  ed_nOut;.#ifdef 
29b70 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
29b80 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 20  AT3_OR_STAT4.   
29b90 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56   pBuilder->nRecV
29ba0 61 6c 69 64 20 3d 20 6e 52 65 63 56 61 6c 69 64  alid = nRecValid
29bb0 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 70  ;.#endif.  }.  p
29bc0 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 73 61  New->prereq = sa
29bd0 76 65 64 5f 70 72 65 72 65 71 3b 0a 20 20 70 4e  ved_prereq;.  pN
29be0 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20  ew->u.btree.nEq 
29bf0 3d 20 73 61 76 65 64 5f 6e 45 71 3b 0a 20 20 70  = saved_nEq;.  p
29c00 4e 65 77 2d 3e 6e 53 6b 69 70 20 3d 20 73 61 76  New->nSkip = sav
29c10 65 64 5f 6e 53 6b 69 70 3b 0a 20 20 70 4e 65 77  ed_nSkip;.  pNew
29c20 2d 3e 77 73 46 6c 61 67 73 20 3d 20 73 61 76 65  ->wsFlags = save
29c30 64 5f 77 73 46 6c 61 67 73 3b 0a 20 20 70 4e 65  d_wsFlags;.  pNe
29c40 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64 5f  w->nOut = saved_
29c50 6e 4f 75 74 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4c  nOut;.  pNew->nL
29c60 54 65 72 6d 20 3d 20 73 61 76 65 64 5f 6e 4c 54  Term = saved_nLT
29c70 65 72 6d 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 73 69  erm;..  /* Consi
29c80 64 65 72 20 75 73 69 6e 67 20 61 20 73 6b 69 70  der using a skip
29c90 2d 73 63 61 6e 20 69 66 20 74 68 65 72 65 20 61  -scan if there a
29ca0 72 65 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75  re no WHERE clau
29cb0 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20  se constraints. 
29cc0 20 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20 66 6f   ** available fo
29cd0 72 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20  r the left-most 
29ce0 74 65 72 6d 73 20 6f 66 20 74 68 65 20 69 6e 64  terms of the ind
29cf0 65 78 2c 20 61 6e 64 20 69 66 20 74 68 65 20 61  ex, and if the a
29d00 76 65 72 61 67 65 0a 20 20 2a 2a 20 6e 75 6d 62  verage.  ** numb
29d10 65 72 20 6f 66 20 72 65 70 65 61 74 73 20 69 6e  er of repeats in
29d20 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 74   the left-most t
29d30 65 72 6d 73 20 69 73 20 61 74 20 6c 65 61 73 74  erms is at least
29d40 20 31 38 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20   18. .  **.  ** 
29d50 54 68 65 20 6d 61 67 69 63 20 6e 75 6d 62 65 72  The magic number
29d60 20 31 38 20 69 73 20 73 65 6c 65 63 74 65 64 20   18 is selected 
29d70 6f 6e 20 74 68 65 20 62 61 73 69 73 20 74 68 61  on the basis tha
29d80 74 20 73 63 61 6e 6e 69 6e 67 20 31 37 20 72 6f  t scanning 17 ro
29d90 77 73 0a 20 20 2a 2a 20 69 73 20 61 6c 6d 6f 73  ws.  ** is almos
29da0 74 20 61 6c 77 61 79 73 20 71 75 69 63 6b 65 72  t always quicker
29db0 20 74 68 61 6e 20 61 6e 20 69 6e 64 65 78 20 73   than an index s
29dc0 65 65 6b 20 28 65 76 65 6e 20 74 68 6f 75 67 68  eek (even though
29dd0 20 69 66 20 74 68 65 20 69 6e 64 65 78 0a 20 20   if the index.  
29de0 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 66 65 77 65  ** contains fewe
29df0 72 20 74 68 61 6e 20 32 5e 31 37 20 72 6f 77 73  r than 2^17 rows
29e00 20 77 65 20 61 73 73 75 6d 65 20 6f 74 68 65 72   we assume other
29e10 77 69 73 65 20 69 6e 20 6f 74 68 65 72 20 70 61  wise in other pa
29e20 72 74 73 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20  rts of.  ** the 
29e30 63 6f 64 65 29 2e 20 41 6e 64 2c 20 65 76 65 6e  code). And, even
29e40 20 69 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 69   if it is not, i
29e50 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20  t should not be 
29e60 74 6f 6f 20 6d 75 63 68 20 73 6c 6f 77 65 72 2e  too much slower.
29e70 20 0a 20 20 2a 2a 20 4f 6e 20 74 68 65 20 6f 74   .  ** On the ot
29e80 68 65 72 20 68 61 6e 64 2c 20 74 68 65 20 65 78  her hand, the ex
29e90 74 72 61 20 73 65 65 6b 73 20 63 6f 75 6c 64 20  tra seeks could 
29ea0 65 6e 64 20 75 70 20 62 65 69 6e 67 20 73 69 67  end up being sig
29eb0 6e 69 66 69 63 61 6e 74 6c 79 0a 20 20 2a 2a 20  nificantly.  ** 
29ec0 6d 6f 72 65 20 65 78 70 65 6e 73 69 76 65 2e 20  more expensive. 
29ed0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 34 32   */.  assert( 42
29ee0 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  ==sqlite3LogEst(
29ef0 31 38 29 20 29 3b 0a 20 20 69 66 28 20 73 61 76  18) );.  if( sav
29f00 65 64 5f 6e 45 71 3d 3d 73 61 76 65 64 5f 6e 53  ed_nEq==saved_nS
29f10 6b 69 70 0a 20 20 20 26 26 20 73 61 76 65 64 5f  kip.   && saved_
29f20 6e 45 71 2b 31 3c 70 50 72 6f 62 65 2d 3e 6e 4b  nEq+1<pProbe->nK
29f30 65 79 43 6f 6c 0a 20 20 20 26 26 20 70 50 72 6f  eyCol.   && pPro
29f40 62 65 2d 3e 6e 6f 53 6b 69 70 53 63 61 6e 3d 3d  be->noSkipScan==
29f50 30 0a 20 20 20 26 26 20 70 50 72 6f 62 65 2d 3e  0.   && pProbe->
29f60 61 69 52 6f 77 4c 6f 67 45 73 74 5b 73 61 76 65  aiRowLogEst[save
29f70 64 5f 6e 45 71 2b 31 5d 3e 3d 34 32 20 20 2f 2a  d_nEq+1]>=42  /*
29f80 20 54 55 4e 49 4e 47 3a 20 4d 69 6e 69 6d 75 6d   TUNING: Minimum
29f90 20 66 6f 72 20 73 6b 69 70 2d 73 63 61 6e 20 2a   for skip-scan *
29fa0 2f 0a 20 20 20 26 26 20 28 72 63 20 3d 20 77 68  /.   && (rc = wh
29fb0 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62  ereLoopResize(db
29fc0 2c 20 70 4e 65 77 2c 20 70 4e 65 77 2d 3e 6e 4c  , pNew, pNew->nL
29fd0 54 65 72 6d 2b 31 29 29 3d 3d 53 51 4c 49 54 45  Term+1))==SQLITE
29fe0 5f 4f 4b 0a 20 20 29 7b 0a 20 20 20 20 4c 6f 67  _OK.  ){.    Log
29ff0 45 73 74 20 6e 49 74 65 72 3b 0a 20 20 20 20 70  Est nIter;.    p
2a000 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
2a010 2b 2b 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 53  ++;.    pNew->nS
2a020 6b 69 70 2b 2b 3b 0a 20 20 20 20 70 4e 65 77 2d  kip++;.    pNew-
2a030 3e 61 4c 54 65 72 6d 5b 70 4e 65 77 2d 3e 6e 4c  >aLTerm[pNew->nL
2a040 54 65 72 6d 2b 2b 5d 20 3d 20 30 3b 0a 20 20 20  Term++] = 0;.   
2a050 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c   pNew->wsFlags |
2a060 3d 20 57 48 45 52 45 5f 53 4b 49 50 53 43 41 4e  = WHERE_SKIPSCAN
2a070 3b 0a 20 20 20 20 6e 49 74 65 72 20 3d 20 70 50  ;.    nIter = pP
2a080 72 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73  robe->aiRowLogEs
2a090 74 5b 73 61 76 65 64 5f 6e 45 71 5d 20 2d 20 70  t[saved_nEq] - p
2a0a0 50 72 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45  Probe->aiRowLogE
2a0b0 73 74 5b 73 61 76 65 64 5f 6e 45 71 2b 31 5d 3b  st[saved_nEq+1];
2a0c0 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20  .    pNew->nOut 
2a0d0 2d 3d 20 6e 49 74 65 72 3b 0a 20 20 20 20 2f 2a  -= nIter;.    /*
2a0e0 20 54 55 4e 49 4e 47 3a 20 20 42 65 63 61 75 73   TUNING:  Becaus
2a0f0 65 20 75 6e 63 65 72 74 61 69 6e 74 69 65 73 20  e uncertainties 
2a100 69 6e 20 74 68 65 20 65 73 74 69 6d 61 74 65 73  in the estimates
2a110 20 66 6f 72 20 73 6b 69 70 2d 73 63 61 6e 20 71   for skip-scan q
2a120 75 65 72 69 65 73 2c 0a 20 20 20 20 2a 2a 20 61  ueries,.    ** a
2a130 64 64 20 61 20 31 2e 33 37 35 20 66 75 64 67 65  dd a 1.375 fudge
2a140 20 66 61 63 74 6f 72 20 74 6f 20 6d 61 6b 65 20   factor to make 
2a150 73 6b 69 70 2d 73 63 61 6e 20 73 6c 69 67 68 74  skip-scan slight
2a160 6c 79 20 6c 65 73 73 20 6c 69 6b 65 6c 79 2e 20  ly less likely. 
2a170 2a 2f 0a 20 20 20 20 6e 49 74 65 72 20 2b 3d 20  */.    nIter += 
2a180 35 3b 0a 20 20 20 20 77 68 65 72 65 4c 6f 6f 70  5;.    whereLoop
2a190 41 64 64 42 74 72 65 65 49 6e 64 65 78 28 70 42  AddBtreeIndex(pB
2a1a0 75 69 6c 64 65 72 2c 20 70 53 72 63 2c 20 70 50  uilder, pSrc, pP
2a1b0 72 6f 62 65 2c 20 6e 49 74 65 72 20 2b 20 6e 49  robe, nIter + nI
2a1c0 6e 4d 75 6c 29 3b 0a 20 20 20 20 70 4e 65 77 2d  nMul);.    pNew-
2a1d0 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e 4f  >nOut = saved_nO
2a1e0 75 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e  ut;.    pNew->u.
2a1f0 62 74 72 65 65 2e 6e 45 71 20 3d 20 73 61 76 65  btree.nEq = save
2a200 64 5f 6e 45 71 3b 0a 20 20 20 20 70 4e 65 77 2d  d_nEq;.    pNew-
2a210 3e 6e 53 6b 69 70 20 3d 20 73 61 76 65 64 5f 6e  >nSkip = saved_n
2a220 53 6b 69 70 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  Skip;.    pNew->
2a230 77 73 46 6c 61 67 73 20 3d 20 73 61 76 65 64 5f  wsFlags = saved_
2a240 77 73 46 6c 61 67 73 3b 0a 20 20 7d 0a 0a 20 20  wsFlags;.  }..  
2a250 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2a260 0a 2a 2a 20 52 65 74 75 72 6e 20 54 72 75 65 20  .** Return True 
2a270 69 66 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c  if it is possibl
2a280 65 20 74 68 61 74 20 70 49 6e 64 65 78 20 6d 69  e that pIndex mi
2a290 67 68 74 20 62 65 20 75 73 65 66 75 6c 20 69 6e  ght be useful in
2a2a0 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67  .** implementing
2a2b0 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
2a2c0 61 75 73 65 20 69 6e 20 70 42 75 69 6c 64 65 72  ause in pBuilder
2a2d0 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 46  ..**.** Return F
2a2e0 61 6c 73 65 20 69 66 20 70 42 75 69 6c 64 65 72  alse if pBuilder
2a2f0 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69   does not contai
2a300 6e 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  n an ORDER BY cl
2a310 61 75 73 65 20 6f 72 0a 2a 2a 20 69 66 20 74 68  ause or.** if th
2a320 65 72 65 20 69 73 20 6e 6f 20 77 61 79 20 66 6f  ere is no way fo
2a330 72 20 70 49 6e 64 65 78 20 74 6f 20 62 65 20 75  r pIndex to be u
2a340 73 65 66 75 6c 20 69 6e 20 69 6d 70 6c 65 6d 65  seful in impleme
2a350 6e 74 69 6e 67 20 74 68 61 74 0a 2a 2a 20 4f 52  nting that.** OR
2a360 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 0a 2a  DER BY clause..*
2a370 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 64  /.static int ind
2a380 65 78 4d 69 67 68 74 48 65 6c 70 57 69 74 68 4f  exMightHelpWithO
2a390 72 64 65 72 42 79 28 0a 20 20 57 68 65 72 65 4c  rderBy(.  WhereL
2a3a0 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69  oopBuilder *pBui
2a3b0 6c 64 65 72 2c 0a 20 20 49 6e 64 65 78 20 2a 70  lder,.  Index *p
2a3c0 49 6e 64 65 78 2c 0a 20 20 69 6e 74 20 69 43 75  Index,.  int iCu
2a3d0 72 73 6f 72 0a 29 7b 0a 20 20 45 78 70 72 4c 69  rsor.){.  ExprLi
2a3e0 73 74 20 2a 70 4f 42 3b 0a 20 20 69 6e 74 20 69  st *pOB;.  int i
2a3f0 69 2c 20 6a 6a 3b 0a 0a 20 20 69 66 28 20 70 49  i, jj;..  if( pI
2a400 6e 64 65 78 2d 3e 62 55 6e 6f 72 64 65 72 65 64  ndex->bUnordered
2a410 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
2a420 66 28 20 28 70 4f 42 20 3d 20 70 42 75 69 6c 64  f( (pOB = pBuild
2a430 65 72 2d 3e 70 57 49 6e 66 6f 2d 3e 70 4f 72 64  er->pWInfo->pOrd
2a440 65 72 42 79 29 3d 3d 30 20 29 20 72 65 74 75 72  erBy)==0 ) retur
2a450 6e 20 30 3b 0a 20 20 66 6f 72 28 69 69 3d 30 3b  n 0;.  for(ii=0;
2a460 20 69 69 3c 70 4f 42 2d 3e 6e 45 78 70 72 3b 20   ii<pOB->nExpr; 
2a470 69 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20  ii++){.    Expr 
2a480 2a 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  *pExpr = sqlite3
2a490 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28  ExprSkipCollate(
2a4a0 70 4f 42 2d 3e 61 5b 69 69 5d 2e 70 45 78 70 72  pOB->a[ii].pExpr
2a4b0 29 3b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72  );.    if( pExpr
2a4c0 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op!=TK_COLUMN 
2a4d0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
2a4e0 69 66 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  if( pExpr->iTabl
2a4f0 65 3d 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20 20  e==iCursor ){.  
2a500 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69      if( pExpr->i
2a510 43 6f 6c 75 6d 6e 3c 30 20 29 20 72 65 74 75 72  Column<0 ) retur
2a520 6e 20 31 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  n 1;.      for(j
2a530 6a 3d 30 3b 20 6a 6a 3c 70 49 6e 64 65 78 2d 3e  j=0; jj<pIndex->
2a540 6e 4b 65 79 43 6f 6c 3b 20 6a 6a 2b 2b 29 7b 0a  nKeyCol; jj++){.
2a550 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78 70          if( pExp
2a560 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 49 6e 64  r->iColumn==pInd
2a570 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 6a 5d  ex->aiColumn[jj]
2a580 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20   ) return 1;.   
2a590 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
2a5a0 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
2a5b0 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 62 69 74  .** Return a bit
2a5c0 6d 61 73 6b 20 77 68 65 72 65 20 31 73 20 69 6e  mask where 1s in
2a5d0 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65 20  dicate that the 
2a5e0 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 63 6f  corresponding co
2a5f0 6c 75 6d 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 74  lumn of.** the t
2a600 61 62 6c 65 20 69 73 20 75 73 65 64 20 62 79 20  able is used by 
2a610 61 6e 20 69 6e 64 65 78 2e 20 20 4f 6e 6c 79 20  an index.  Only 
2a620 74 68 65 20 66 69 72 73 74 20 36 33 20 63 6f 6c  the first 63 col
2a630 75 6d 6e 73 20 61 72 65 20 63 6f 6e 73 69 64 65  umns are conside
2a640 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42  red..*/.static B
2a650 69 74 6d 61 73 6b 20 63 6f 6c 75 6d 6e 73 49 6e  itmask columnsIn
2a660 49 6e 64 65 78 28 49 6e 64 65 78 20 2a 70 49 64  Index(Index *pId
2a670 78 29 7b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 20  x){.  Bitmask m 
2a680 3d 20 30 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20  = 0;.  int j;.  
2a690 66 6f 72 28 6a 3d 70 49 64 78 2d 3e 6e 43 6f 6c  for(j=pIdx->nCol
2a6a0 75 6d 6e 2d 31 3b 20 6a 3e 3d 30 3b 20 6a 2d 2d  umn-1; j>=0; j--
2a6b0 29 7b 0a 20 20 20 20 69 6e 74 20 78 20 3d 20 70  ){.    int x = p
2a6c0 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d  Idx->aiColumn[j]
2a6d0 3b 0a 20 20 20 20 69 66 28 20 78 3e 3d 30 20 29  ;.    if( x>=0 )
2a6e0 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
2a6f0 28 20 78 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20  ( x==BMS-1 );.  
2a700 20 20 20 20 74 65 73 74 63 61 73 65 28 20 78 3d      testcase( x=
2a710 3d 42 4d 53 2d 32 20 29 3b 0a 20 20 20 20 20 20  =BMS-2 );.      
2a720 69 66 28 20 78 3c 42 4d 53 2d 31 20 29 20 6d 20  if( x<BMS-1 ) m 
2a730 7c 3d 20 4d 41 53 4b 42 49 54 28 78 29 3b 0a 20  |= MASKBIT(x);. 
2a740 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
2a750 6e 20 6d 3b 0a 7d 0a 0a 2f 2a 20 43 68 65 63 6b  n m;.}../* Check
2a760 20 74 6f 20 73 65 65 20 69 66 20 61 20 70 61 72   to see if a par
2a770 74 69 61 6c 20 69 6e 64 65 78 20 77 69 74 68 20  tial index with 
2a780 70 50 61 72 74 49 6e 64 65 78 57 68 65 72 65 20  pPartIndexWhere 
2a790 63 61 6e 20 62 65 20 75 73 65 64 0a 2a 2a 20 69  can be used.** i
2a7a0 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 71 75  n the current qu
2a7b0 65 72 79 2e 20 20 52 65 74 75 72 6e 20 74 72 75  ery.  Return tru
2a7c0 65 20 69 66 20 69 74 20 63 61 6e 20 62 65 20 61  e if it can be a
2a7d0 6e 64 20 66 61 6c 73 65 20 69 66 20 6e 6f 74 2e  nd false if not.
2a7e0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
2a7f0 68 65 72 65 55 73 61 62 6c 65 50 61 72 74 69 61  hereUsablePartia
2a800 6c 49 6e 64 65 78 28 69 6e 74 20 69 54 61 62 2c  lIndex(int iTab,
2a810 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
2a820 43 2c 20 45 78 70 72 20 2a 70 57 68 65 72 65 29  C, Expr *pWhere)
2a830 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 57 68 65  {.  int i;.  Whe
2a840 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20  reTerm *pTerm;. 
2a850 20 66 6f 72 28 69 3d 30 2c 20 70 54 65 72 6d 3d   for(i=0, pTerm=
2a860 70 57 43 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e  pWC->a; i<pWC->n
2a870 54 65 72 6d 3b 20 69 2b 2b 2c 20 70 54 65 72 6d  Term; i++, pTerm
2a880 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c  ++){.    if( sql
2a890 69 74 65 33 45 78 70 72 49 6d 70 6c 69 65 73 45  ite3ExprImpliesE
2a8a0 78 70 72 28 70 54 65 72 6d 2d 3e 70 45 78 70 72  xpr(pTerm->pExpr
2a8b0 2c 20 70 57 68 65 72 65 2c 20 69 54 61 62 29 20  , pWhere, iTab) 
2a8c0 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a  ) return 1;.  }.
2a8d0 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
2a8e0 2a 0a 2a 2a 20 41 64 64 20 61 6c 6c 20 57 68 65  *.** Add all Whe
2a8f0 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 66  reLoop objects f
2a900 6f 72 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c  or a single tabl
2a910 65 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 77 68  e of the join wh
2a920 65 72 65 20 74 68 65 20 74 61 62 6c 65 0a 2a 2a  ere the table.**
2a930 20 69 73 20 69 64 65 6e 66 69 65 64 20 62 79 20   is idenfied by 
2a940 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e  pBuilder->pNew->
2a950 69 54 61 62 2e 20 20 54 68 61 74 20 74 61 62 6c  iTab.  That tabl
2a960 65 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  e is guaranteed 
2a970 74 6f 20 62 65 0a 2a 2a 20 61 20 62 2d 74 72 65  to be.** a b-tre
2a980 65 20 74 61 62 6c 65 2c 20 6e 6f 74 20 61 20 76  e table, not a v
2a990 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a  irtual table..**
2a9a0 0a 2a 2a 20 54 68 65 20 63 6f 73 74 73 20 28 57  .** The costs (W
2a9b0 68 65 72 65 4c 6f 6f 70 2e 72 52 75 6e 29 20 6f  hereLoop.rRun) o
2a9c0 66 20 74 68 65 20 62 2d 74 72 65 65 20 6c 6f 6f  f the b-tree loo
2a9d0 70 73 20 61 64 64 65 64 20 62 79 20 74 68 69 73  ps added by this
2a9e0 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61 72 65   function.** are
2a9f0 20 63 61 6c 63 75 6c 61 74 65 64 20 61 73 20 66   calculated as f
2aa00 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 46 6f  ollows:.**.** Fo
2aa10 72 20 61 20 66 75 6c 6c 20 73 63 61 6e 2c 20 61  r a full scan, a
2aa20 73 73 75 6d 69 6e 67 20 74 68 65 20 74 61 62 6c  ssuming the tabl
2aa30 65 20 28 6f 72 20 69 6e 64 65 78 29 20 63 6f 6e  e (or index) con
2aa40 74 61 69 6e 73 20 6e 52 6f 77 20 72 6f 77 73 3a  tains nRow rows:
2aa50 0a 2a 2a 0a 2a 2a 20 20 20 20 20 63 6f 73 74 20  .**.**     cost 
2aa60 3d 20 6e 52 6f 77 20 2a 20 33 2e 30 20 20 20 20  = nRow * 3.0    
2aa70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aa80 2f 2f 20 66 75 6c 6c 2d 74 61 62 6c 65 20 73 63  // full-table sc
2aa90 61 6e 0a 2a 2a 20 20 20 20 20 63 6f 73 74 20 3d  an.**     cost =
2aaa0 20 6e 52 6f 77 20 2a 20 4b 20 20 20 20 20 20 20   nRow * K       
2aab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2aac0 2f 20 73 63 61 6e 20 6f 66 20 63 6f 76 65 72 69  / scan of coveri
2aad0 6e 67 20 69 6e 64 65 78 0a 2a 2a 20 20 20 20 20  ng index.**     
2aae0 63 6f 73 74 20 3d 20 6e 52 6f 77 20 2a 20 28 4b  cost = nRow * (K
2aaf0 2b 33 2e 30 29 20 20 20 20 20 20 20 20 20 20 20  +3.0)           
2ab00 20 20 20 20 20 2f 2f 20 73 63 61 6e 20 6f 66 20       // scan of 
2ab10 6e 6f 6e 2d 63 6f 76 65 72 69 6e 67 20 69 6e 64  non-covering ind
2ab20 65 78 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 4b  ex.**.** where K
2ab30 20 69 73 20 61 20 76 61 6c 75 65 20 62 65 74 77   is a value betw
2ab40 65 65 6e 20 31 2e 31 20 61 6e 64 20 33 2e 30 20  een 1.1 and 3.0 
2ab50 73 65 74 20 62 61 73 65 64 20 6f 6e 20 74 68 65  set based on the
2ab60 20 72 65 6c 61 74 69 76 65 20 0a 2a 2a 20 65 73   relative .** es
2ab70 74 69 6d 61 74 65 64 20 61 76 65 72 61 67 65 20  timated average 
2ab80 73 69 7a 65 20 6f 66 20 74 68 65 20 69 6e 64 65  size of the inde
2ab90 78 20 61 6e 64 20 74 61 62 6c 65 20 72 65 63 6f  x and table reco
2aba0 72 64 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61  rds..**.** For a
2abb0 6e 20 69 6e 64 65 78 20 73 63 61 6e 2c 20 77 68  n index scan, wh
2abc0 65 72 65 20 6e 56 69 73 69 74 20 69 73 20 74 68  ere nVisit is th
2abd0 65 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 64 65  e number of inde
2abe0 78 20 72 6f 77 73 20 76 69 73 69 74 65 64 0a 2a  x rows visited.*
2abf0 2a 20 62 79 20 74 68 65 20 73 63 61 6e 2c 20 61  * by the scan, a
2ac00 6e 64 20 6e 53 65 65 6b 20 69 73 20 74 68 65 20  nd nSeek is the 
2ac10 6e 75 6d 62 65 72 20 6f 66 20 73 65 65 6b 20 6f  number of seek o
2ac20 70 65 72 61 74 69 6f 6e 73 20 72 65 71 75 69 72  perations requir
2ac30 65 64 20 6f 6e 20 0a 2a 2a 20 74 68 65 20 69 6e  ed on .** the in
2ac40 64 65 78 20 62 2d 74 72 65 65 3a 0a 2a 2a 0a 2a  dex b-tree:.**.*
2ac50 2a 20 20 20 20 20 63 6f 73 74 20 3d 20 6e 53 65  *     cost = nSe
2ac60 65 6b 20 2a 20 28 6c 6f 67 28 6e 52 6f 77 29 20  ek * (log(nRow) 
2ac70 2b 20 4b 20 2a 20 6e 56 69 73 69 74 29 20 20 20  + K * nVisit)   
2ac80 20 20 20 20 20 20 20 2f 2f 20 63 6f 76 65 72 69         // coveri
2ac90 6e 67 20 69 6e 64 65 78 0a 2a 2a 20 20 20 20 20  ng index.**     
2aca0 63 6f 73 74 20 3d 20 6e 53 65 65 6b 20 2a 20 28  cost = nSeek * (
2acb0 6c 6f 67 28 6e 52 6f 77 29 20 2b 20 28 4b 2b 33  log(nRow) + (K+3
2acc0 2e 30 29 20 2a 20 6e 56 69 73 69 74 29 20 20 20  .0) * nVisit)   
2acd0 20 2f 2f 20 6e 6f 6e 2d 63 6f 76 65 72 69 6e 67   // non-covering
2ace0 20 69 6e 64 65 78 0a 2a 2a 0a 2a 2a 20 4e 6f 72   index.**.** Nor
2acf0 6d 61 6c 6c 79 2c 20 6e 53 65 65 6b 20 69 73 20  mally, nSeek is 
2ad00 31 2e 20 6e 53 65 65 6b 20 76 61 6c 75 65 73 20  1. nSeek values 
2ad10 67 72 65 61 74 65 72 20 74 68 61 6e 20 31 20 63  greater than 1 c
2ad20 6f 6d 65 20 61 62 6f 75 74 20 69 66 20 74 68 65  ome about if the
2ad30 20 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73   .** WHERE claus
2ad40 65 20 69 6e 63 6c 75 64 65 73 20 22 78 20 49 4e  e includes "x IN
2ad50 20 28 2e 2e 2e 2e 29 22 20 74 65 72 6d 73 20 75   (....)" terms u
2ad60 73 65 64 20 69 6e 20 70 6c 61 63 65 20 6f 66 20  sed in place of 
2ad70 22 78 3d 3f 22 2e 20 4f 72 20 77 68 65 6e 20 0a  "x=?". Or when .
2ad80 2a 2a 20 69 6d 70 6c 69 63 69 74 20 22 78 20 49  ** implicit "x I
2ad90 4e 20 28 53 45 4c 45 43 54 20 78 20 46 52 4f 4d  N (SELECT x FROM
2ada0 20 74 62 6c 29 22 20 74 65 72 6d 73 20 61 72 65   tbl)" terms are
2adb0 20 61 64 64 65 64 20 66 6f 72 20 73 6b 69 70 2d   added for skip-
2adc0 73 63 61 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  scans..**.** The
2add0 20 65 73 74 69 6d 61 74 65 64 20 76 61 6c 75 65   estimated value
2ade0 73 20 28 6e 52 6f 77 2c 20 6e 56 69 73 69 74 2c  s (nRow, nVisit,
2adf0 20 6e 53 65 65 6b 29 20 6f 66 74 65 6e 20 63 6f   nSeek) often co
2ae00 6e 74 61 69 6e 20 61 20 6c 61 72 67 65 20 61 6d  ntain a large am
2ae10 6f 75 6e 74 0a 2a 2a 20 6f 66 20 75 6e 63 65 72  ount.** of uncer
2ae20 74 61 69 6e 74 79 2e 20 20 46 6f 72 20 74 68 69  tainty.  For thi
2ae30 73 20 72 65 61 73 6f 6e 2c 20 73 63 6f 72 69 6e  s reason, scorin
2ae40 67 20 69 73 20 64 65 73 69 67 6e 65 64 20 74 6f  g is designed to
2ae50 20 70 69 63 6b 20 70 6c 61 6e 73 20 74 68 61 74   pick plans that
2ae60 0a 2a 2a 20 22 64 6f 20 74 68 65 20 6c 65 61 73  .** "do the leas
2ae70 74 20 68 61 72 6d 22 20 69 66 20 74 68 65 20 65  t harm" if the e
2ae80 73 74 69 6d 61 74 65 73 20 61 72 65 20 69 6e 61  stimates are ina
2ae90 63 63 75 72 61 74 65 2e 20 20 46 6f 72 20 65 78  ccurate.  For ex
2aea0 61 6d 70 6c 65 2c 20 61 0a 2a 2a 20 6c 6f 67 28  ample, a.** log(
2aeb0 6e 52 6f 77 29 20 66 61 63 74 6f 72 20 69 73 20  nRow) factor is 
2aec0 6f 6d 69 74 74 65 64 20 66 72 6f 6d 20 61 20 6e  omitted from a n
2aed0 6f 6e 2d 63 6f 76 65 72 69 6e 67 20 69 6e 64 65  on-covering inde
2aee0 78 20 73 63 61 6e 20 69 6e 20 6f 72 64 65 72 20  x scan in order 
2aef0 74 6f 0a 2a 2a 20 62 69 61 73 20 74 68 65 20 73  to.** bias the s
2af00 63 6f 72 69 6e 67 20 69 6e 20 66 61 76 6f 72 20  coring in favor 
2af10 6f 66 20 75 73 69 6e 67 20 61 6e 20 69 6e 64 65  of using an inde
2af20 78 2c 20 73 69 6e 63 65 20 74 68 65 20 77 6f 72  x, since the wor
2af30 73 74 2d 63 61 73 65 0a 2a 2a 20 70 65 72 66 6f  st-case.** perfo
2af40 72 6d 61 6e 63 65 20 6f 66 20 75 73 69 6e 67 20  rmance of using 
2af50 61 6e 20 69 6e 64 65 78 20 69 73 20 66 61 72 20  an index is far 
2af60 62 65 74 74 65 72 20 74 68 61 6e 20 74 68 65 20  better than the 
2af70 77 6f 72 73 74 2d 63 61 73 65 20 70 65 72 66 6f  worst-case perfo
2af80 72 6d 61 6e 63 65 0a 2a 2a 20 6f 66 20 61 20 66  rmance.** of a f
2af90 75 6c 6c 20 74 61 62 6c 65 20 73 63 61 6e 2e 0a  ull table scan..
2afa0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68  */.static int wh
2afb0 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 28  ereLoopAddBtree(
2afc0 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c  .  WhereLoopBuil
2afd0 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 20 2f  der *pBuilder, /
2afe0 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69  * WHERE clause i
2aff0 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20  nformation */.  
2b000 42 69 74 6d 61 73 6b 20 6d 45 78 74 72 61 20 20  Bitmask mExtra  
2b010 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
2b020 78 74 72 61 20 70 72 65 72 65 71 75 65 73 69 74  xtra prerequesit
2b030 65 73 20 66 6f 72 20 75 73 69 6e 67 20 74 68 69  es for using thi
2b040 73 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20  s table */.){.  
2b050 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
2b060 6f 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  o;          /* W
2b070 48 45 52 45 20 61 6e 61 6c 79 73 69 73 20 63 6f  HERE analysis co
2b080 6e 74 65 78 74 20 2a 2f 0a 20 20 49 6e 64 65 78  ntext */.  Index
2b090 20 2a 70 50 72 6f 62 65 3b 20 20 20 20 20 20 20   *pProbe;       
2b0a0 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64         /* An ind
2b0b0 65 78 20 77 65 20 61 72 65 20 65 76 61 6c 75 61  ex we are evalua
2b0c0 74 69 6e 67 20 2a 2f 0a 20 20 49 6e 64 65 78 20  ting */.  Index 
2b0d0 73 50 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  sPk;            
2b0e0 20 20 20 20 20 20 2f 2a 20 41 20 66 61 6b 65 20        /* A fake 
2b0f0 69 6e 64 65 78 20 6f 62 6a 65 63 74 20 66 6f 72  index object for
2b100 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79   the primary key
2b110 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 61 69 52   */.  LogEst aiR
2b120 6f 77 45 73 74 50 6b 5b 32 5d 3b 20 20 20 20 20  owEstPk[2];     
2b130 20 20 2f 2a 20 54 68 65 20 61 69 52 6f 77 4c 6f    /* The aiRowLo
2b140 67 45 73 74 5b 5d 20 76 61 6c 75 65 20 66 6f 72  gEst[] value for
2b150 20 74 68 65 20 73 50 6b 20 69 6e 64 65 78 20 2a   the sPk index *
2b160 2f 0a 20 20 69 31 36 20 61 69 43 6f 6c 75 6d 6e  /.  i16 aiColumn
2b170 50 6b 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20  Pk = -1;        
2b180 2f 2a 20 54 68 65 20 61 43 6f 6c 75 6d 6e 5b 5d  /* The aColumn[]
2b190 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 73   value for the s
2b1a0 50 6b 20 69 6e 64 65 78 20 2a 2f 0a 20 20 53 72  Pk index */.  Sr
2b1b0 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b  cList *pTabList;
2b1c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2b1d0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a   FROM clause */.
2b1e0 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
2b1f0 5f 69 74 65 6d 20 2a 70 53 72 63 3b 20 20 2f 2a  _item *pSrc;  /*
2b200 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   The FROM clause
2b210 20 62 74 72 65 65 20 74 65 72 6d 20 74 6f 20 61   btree term to a
2b220 64 64 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f  dd */.  WhereLoo
2b230 70 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20  p *pNew;        
2b240 20 20 20 20 2f 2a 20 54 65 6d 70 6c 61 74 65 20      /* Template 
2b250 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
2b260 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
2b270 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
2b280 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
2b290 20 2a 2f 0a 20 20 69 6e 74 20 69 53 6f 72 74 49   */.  int iSortI
2b2a0 64 78 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20  dx = 1;         
2b2b0 20 20 2f 2a 20 49 6e 64 65 78 20 6e 75 6d 62 65    /* Index numbe
2b2c0 72 20 2a 2f 0a 20 20 69 6e 74 20 62 3b 20 20 20  r */.  int b;   
2b2d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b2e0 20 20 20 2f 2a 20 41 20 62 6f 6f 6c 65 61 6e 20     /* A boolean 
2b2f0 76 61 6c 75 65 20 2a 2f 0a 20 20 4c 6f 67 45 73  value */.  LogEs
2b300 74 20 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20  t rSize;        
2b310 20 20 20 20 20 20 20 2f 2a 20 6e 75 6d 62 65 72         /* number
2b320 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20   of rows in the 
2b330 74 61 62 6c 65 20 2a 2f 0a 20 20 4c 6f 67 45 73  table */.  LogEs
2b340 74 20 72 4c 6f 67 53 69 7a 65 3b 20 20 20 20 20  t rLogSize;     
2b350 20 20 20 20 20 20 20 2f 2a 20 4c 6f 67 61 72 69         /* Logari
2b360 74 68 6d 20 6f 66 20 74 68 65 20 6e 75 6d 62 65  thm of the numbe
2b370 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65  r of rows in the
2b380 20 74 61 62 6c 65 20 2a 2f 0a 20 20 57 68 65 72   table */.  Wher
2b390 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 20 20 20  eClause *pWC;   
2b3a0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
2b3b0 61 72 73 65 64 20 57 48 45 52 45 20 63 6c 61 75  arsed WHERE clau
2b3c0 73 65 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70  se */.  Table *p
2b3d0 54 61 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  Tab;            
2b3e0 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 62 65 69      /* Table bei
2b3f0 6e 67 20 71 75 65 72 69 65 64 20 2a 2f 0a 20 20  ng queried */.  
2b400 0a 20 20 70 4e 65 77 20 3d 20 70 42 75 69 6c 64  .  pNew = pBuild
2b410 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 70 57 49 6e  er->pNew;.  pWIn
2b420 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  fo = pBuilder->p
2b430 57 49 6e 66 6f 3b 0a 20 20 70 54 61 62 4c 69 73  WInfo;.  pTabLis
2b440 74 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62  t = pWInfo->pTab
2b450 4c 69 73 74 3b 0a 20 20 70 53 72 63 20 3d 20 70  List;.  pSrc = p
2b460 54 61 62 4c 69 73 74 2d 3e 61 20 2b 20 70 4e 65  TabList->a + pNe
2b470 77 2d 3e 69 54 61 62 3b 0a 20 20 70 54 61 62 20  w->iTab;.  pTab 
2b480 3d 20 70 53 72 63 2d 3e 70 54 61 62 3b 0a 20 20  = pSrc->pTab;.  
2b490 70 57 43 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  pWC = pBuilder->
2b4a0 70 57 43 3b 0a 20 20 61 73 73 65 72 74 28 20 21  pWC;.  assert( !
2b4b0 49 73 56 69 72 74 75 61 6c 28 70 53 72 63 2d 3e  IsVirtual(pSrc->
2b4c0 70 54 61 62 29 20 29 3b 0a 0a 20 20 69 66 28 20  pTab) );..  if( 
2b4d0 70 53 72 63 2d 3e 70 49 6e 64 65 78 20 29 7b 0a  pSrc->pIndex ){.
2b4e0 20 20 20 20 2f 2a 20 41 6e 20 49 4e 44 45 58 45      /* An INDEXE
2b4f0 44 20 42 59 20 63 6c 61 75 73 65 20 73 70 65 63  D BY clause spec
2b500 69 66 69 65 73 20 61 20 70 61 72 74 69 63 75 6c  ifies a particul
2b510 61 72 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20  ar index to use 
2b520 2a 2f 0a 20 20 20 20 70 50 72 6f 62 65 20 3d 20  */.    pProbe = 
2b530 70 53 72 63 2d 3e 70 49 6e 64 65 78 3b 0a 20 20  pSrc->pIndex;.  
2b540 7d 65 6c 73 65 20 69 66 28 20 21 48 61 73 52 6f  }else if( !HasRo
2b550 77 69 64 28 70 54 61 62 29 20 29 7b 0a 20 20 20  wid(pTab) ){.   
2b560 20 70 50 72 6f 62 65 20 3d 20 70 54 61 62 2d 3e   pProbe = pTab->
2b570 70 49 6e 64 65 78 3b 0a 20 20 7d 65 6c 73 65 7b  pIndex;.  }else{
2b580 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20 69 73  .    /* There is
2b590 20 6e 6f 20 49 4e 44 45 58 45 44 20 42 59 20 63   no INDEXED BY c
2b5a0 6c 61 75 73 65 2e 20 20 43 72 65 61 74 65 20 61  lause.  Create a
2b5b0 20 66 61 6b 65 20 49 6e 64 65 78 20 6f 62 6a 65   fake Index obje
2b5c0 63 74 20 69 6e 20 6c 6f 63 61 6c 0a 20 20 20 20  ct in local.    
2b5d0 2a 2a 20 76 61 72 69 61 62 6c 65 20 73 50 6b 20  ** variable sPk 
2b5e0 74 6f 20 72 65 70 72 65 73 65 6e 74 20 74 68 65  to represent the
2b5f0 20 72 6f 77 69 64 20 70 72 69 6d 61 72 79 20 6b   rowid primary k
2b600 65 79 20 69 6e 64 65 78 2e 20 20 4d 61 6b 65 20  ey index.  Make 
2b610 74 68 69 73 0a 20 20 20 20 2a 2a 20 66 61 6b 65  this.    ** fake
2b620 20 69 6e 64 65 78 20 74 68 65 20 66 69 72 73 74   index the first
2b630 20 69 6e 20 61 20 63 68 61 69 6e 20 6f 66 20 49   in a chain of I
2b640 6e 64 65 78 20 6f 62 6a 65 63 74 73 20 77 69 74  ndex objects wit
2b650 68 20 61 6c 6c 20 6f 66 20 74 68 65 20 72 65 61  h all of the rea
2b660 6c 0a 20 20 20 20 2a 2a 20 69 6e 64 69 63 65 73  l.    ** indices
2b670 20 74 6f 20 66 6f 6c 6c 6f 77 20 2a 2f 0a 20 20   to follow */.  
2b680 20 20 49 6e 64 65 78 20 2a 70 46 69 72 73 74 3b    Index *pFirst;
2b690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b6a0 20 20 2f 2a 20 46 69 72 73 74 20 6f 66 20 72 65    /* First of re
2b6b0 61 6c 20 69 6e 64 69 63 65 73 20 6f 6e 20 74 68  al indices on th
2b6c0 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 6d  e table */.    m
2b6d0 65 6d 73 65 74 28 26 73 50 6b 2c 20 30 2c 20 73  emset(&sPk, 0, s
2b6e0 69 7a 65 6f 66 28 49 6e 64 65 78 29 29 3b 0a 20  izeof(Index));. 
2b6f0 20 20 20 73 50 6b 2e 6e 4b 65 79 43 6f 6c 20 3d     sPk.nKeyCol =
2b700 20 31 3b 0a 20 20 20 20 73 50 6b 2e 6e 43 6f 6c   1;.    sPk.nCol
2b710 75 6d 6e 20 3d 20 31 3b 0a 20 20 20 20 73 50 6b  umn = 1;.    sPk
2b720 2e 61 69 43 6f 6c 75 6d 6e 20 3d 20 26 61 69 43  .aiColumn = &aiC
2b730 6f 6c 75 6d 6e 50 6b 3b 0a 20 20 20 20 73 50 6b  olumnPk;.    sPk
2b740 2e 61 69 52 6f 77 4c 6f 67 45 73 74 20 3d 20 61  .aiRowLogEst = a
2b750 69 52 6f 77 45 73 74 50 6b 3b 0a 20 20 20 20 73  iRowEstPk;.    s
2b760 50 6b 2e 6f 6e 45 72 72 6f 72 20 3d 20 4f 45 5f  Pk.onError = OE_
2b770 52 65 70 6c 61 63 65 3b 0a 20 20 20 20 73 50 6b  Replace;.    sPk
2b780 2e 70 54 61 62 6c 65 20 3d 20 70 54 61 62 3b 0a  .pTable = pTab;.
2b790 20 20 20 20 73 50 6b 2e 73 7a 49 64 78 52 6f 77      sPk.szIdxRow
2b7a0 20 3d 20 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f   = pTab->szTabRo
2b7b0 77 3b 0a 20 20 20 20 61 69 52 6f 77 45 73 74 50  w;.    aiRowEstP
2b7c0 6b 5b 30 5d 20 3d 20 70 54 61 62 2d 3e 6e 52 6f  k[0] = pTab->nRo
2b7d0 77 4c 6f 67 45 73 74 3b 0a 20 20 20 20 61 69 52  wLogEst;.    aiR
2b7e0 6f 77 45 73 74 50 6b 5b 31 5d 20 3d 20 30 3b 0a  owEstPk[1] = 0;.
2b7f0 20 20 20 20 70 46 69 72 73 74 20 3d 20 70 53 72      pFirst = pSr
2b800 63 2d 3e 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  c->pTab->pIndex;
2b810 0a 20 20 20 20 69 66 28 20 70 53 72 63 2d 3e 6e  .    if( pSrc->n
2b820 6f 74 49 6e 64 65 78 65 64 3d 3d 30 20 29 7b 0a  otIndexed==0 ){.
2b830 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 61        /* The rea
2b840 6c 20 69 6e 64 69 63 65 73 20 6f 66 20 74 68 65  l indices of the
2b850 20 74 61 62 6c 65 20 61 72 65 20 6f 6e 6c 79 20   table are only 
2b860 63 6f 6e 73 69 64 65 72 65 64 20 69 66 20 74 68  considered if th
2b870 65 0a 20 20 20 20 20 20 2a 2a 20 4e 4f 54 20 49  e.      ** NOT I
2b880 4e 44 45 58 45 44 20 71 75 61 6c 69 66 69 65 72  NDEXED qualifier
2b890 20 69 73 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d   is omitted from
2b8a0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
2b8b0 20 2a 2f 0a 20 20 20 20 20 20 73 50 6b 2e 70 4e   */.      sPk.pN
2b8c0 65 78 74 20 3d 20 70 46 69 72 73 74 3b 0a 20 20  ext = pFirst;.  
2b8d0 20 20 7d 0a 20 20 20 20 70 50 72 6f 62 65 20 3d    }.    pProbe =
2b8e0 20 26 73 50 6b 3b 0a 20 20 7d 0a 20 20 72 53 69   &sPk;.  }.  rSi
2b8f0 7a 65 20 3d 20 70 54 61 62 2d 3e 6e 52 6f 77 4c  ze = pTab->nRowL
2b900 6f 67 45 73 74 3b 0a 20 20 72 4c 6f 67 53 69 7a  ogEst;.  rLogSiz
2b910 65 20 3d 20 65 73 74 4c 6f 67 28 72 53 69 7a 65  e = estLog(rSize
2b920 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
2b930 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49  TE_OMIT_AUTOMATI
2b940 43 5f 49 4e 44 45 58 0a 20 20 2f 2a 20 41 75 74  C_INDEX.  /* Aut
2b950 6f 6d 61 74 69 63 20 69 6e 64 65 78 65 73 20 2a  omatic indexes *
2b960 2f 0a 20 20 69 66 28 20 21 70 42 75 69 6c 64 65  /.  if( !pBuilde
2b970 72 2d 3e 70 4f 72 53 65 74 0a 20 20 20 26 26 20  r->pOrSet.   && 
2b980 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d  (pWInfo->pParse-
2b990 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  >db->flags & SQL
2b9a0 49 54 45 5f 41 75 74 6f 49 6e 64 65 78 29 21 3d  ITE_AutoIndex)!=
2b9b0 30 0a 20 20 20 26 26 20 70 53 72 63 2d 3e 70 49  0.   && pSrc->pI
2b9c0 6e 64 65 78 3d 3d 30 0a 20 20 20 26 26 20 21 70  ndex==0.   && !p
2b9d0 53 72 63 2d 3e 76 69 61 43 6f 72 6f 75 74 69 6e  Src->viaCoroutin
2b9e0 65 0a 20 20 20 26 26 20 21 70 53 72 63 2d 3e 6e  e.   && !pSrc->n
2b9f0 6f 74 49 6e 64 65 78 65 64 0a 20 20 20 26 26 20  otIndexed.   && 
2ba00 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 0a 20  HasRowid(pTab). 
2ba10 20 20 26 26 20 21 70 53 72 63 2d 3e 69 73 43 6f    && !pSrc->isCo
2ba20 72 72 65 6c 61 74 65 64 0a 20 20 20 26 26 20 21  rrelated.   && !
2ba30 70 53 72 63 2d 3e 69 73 52 65 63 75 72 73 69 76  pSrc->isRecursiv
2ba40 65 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20 47 65  e.  ){.    /* Ge
2ba50 6e 65 72 61 74 65 20 61 75 74 6f 2d 69 6e 64 65  nerate auto-inde
2ba60 78 20 57 68 65 72 65 4c 6f 6f 70 73 20 2a 2f 0a  x WhereLoops */.
2ba70 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
2ba80 54 65 72 6d 3b 0a 20 20 20 20 57 68 65 72 65 54  Term;.    WhereT
2ba90 65 72 6d 20 2a 70 57 43 45 6e 64 20 3d 20 70 57  erm *pWCEnd = pW
2baa0 43 2d 3e 61 20 2b 20 70 57 43 2d 3e 6e 54 65 72  C->a + pWC->nTer
2bab0 6d 3b 0a 20 20 20 20 66 6f 72 28 70 54 65 72 6d  m;.    for(pTerm
2bac0 3d 70 57 43 2d 3e 61 3b 20 72 63 3d 3d 53 51 4c  =pWC->a; rc==SQL
2bad0 49 54 45 5f 4f 4b 20 26 26 20 70 54 65 72 6d 3c  ITE_OK && pTerm<
2bae0 70 57 43 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29  pWCEnd; pTerm++)
2baf0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72  {.      if( pTer
2bb00 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 26  m->prereqRight &
2bb10 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 20   pNew->maskSelf 
2bb20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
2bb30 20 20 69 66 28 20 74 65 72 6d 43 61 6e 44 72 69    if( termCanDri
2bb40 76 65 49 6e 64 65 78 28 70 54 65 72 6d 2c 20 70  veIndex(pTerm, p
2bb50 53 72 63 2c 20 30 29 20 29 7b 0a 20 20 20 20 20  Src, 0) ){.     
2bb60 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65     pNew->u.btree
2bb70 2e 6e 45 71 20 3d 20 31 3b 0a 20 20 20 20 20 20  .nEq = 1;.      
2bb80 20 20 70 4e 65 77 2d 3e 6e 53 6b 69 70 20 3d 20    pNew->nSkip = 
2bb90 30 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  0;.        pNew-
2bba0 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20  >u.btree.pIndex 
2bbb0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  = 0;.        pNe
2bbc0 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 31 3b 0a 20  w->nLTerm = 1;. 
2bbd0 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54         pNew->aLT
2bbe0 65 72 6d 5b 30 5d 20 3d 20 70 54 65 72 6d 3b 0a  erm[0] = pTerm;.
2bbf0 20 20 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e          /* TUNIN
2bc00 47 3a 20 4f 6e 65 2d 74 69 6d 65 20 63 6f 73 74  G: One-time cost
2bc10 20 66 6f 72 20 63 6f 6d 70 75 74 69 6e 67 20 74   for computing t
2bc20 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64  he automatic ind
2bc30 65 78 20 69 73 0a 20 20 20 20 20 20 20 20 2a 2a  ex is.        **
2bc40 20 65 73 74 69 6d 61 74 65 64 20 74 6f 20 62 65   estimated to be
2bc50 20 58 2a 4e 2a 6c 6f 67 32 28 4e 29 20 77 68 65   X*N*log2(N) whe
2bc60 72 65 20 4e 20 69 73 20 74 68 65 20 6e 75 6d 62  re N is the numb
2bc70 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 0a 20 20  er of rows in.  
2bc80 20 20 20 20 20 20 2a 2a 20 74 68 65 20 74 61 62        ** the tab
2bc90 6c 65 20 62 65 69 6e 67 20 69 6e 64 65 78 65 64  le being indexed
2bca0 20 61 6e 64 20 77 68 65 72 65 20 58 20 69 73 20   and where X is 
2bcb0 37 20 28 4c 6f 67 45 73 74 3d 32 38 29 20 66 6f  7 (LogEst=28) fo
2bcc0 72 20 6e 6f 72 6d 61 6c 0a 20 20 20 20 20 20 20  r normal.       
2bcd0 20 2a 2a 20 74 61 62 6c 65 73 20 6f 72 20 31 2e   ** tables or 1.
2bce0 33 37 35 20 28 4c 6f 67 45 73 74 3d 34 29 20 66  375 (LogEst=4) f
2bcf0 6f 72 20 76 69 65 77 73 20 61 6e 64 20 73 75 62  or views and sub
2bd00 71 75 65 72 69 65 73 2e 20 20 54 68 65 20 76 61  queries.  The va
2bd10 6c 75 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  lue.        ** o
2bd20 66 20 58 20 69 73 20 73 6d 61 6c 6c 65 72 20 66  f X is smaller f
2bd30 6f 72 20 76 69 65 77 73 20 61 6e 64 20 73 75 62  or views and sub
2bd40 71 75 65 72 69 65 73 20 73 6f 20 74 68 61 74 20  queries so that 
2bd50 74 68 65 20 71 75 65 72 79 20 70 6c 61 6e 6e 65  the query planne
2bd60 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 69 6c  r.        ** wil
2bd70 6c 20 62 65 20 6d 6f 72 65 20 61 67 67 72 65 73  l be more aggres
2bd80 73 69 76 65 20 61 62 6f 75 74 20 67 65 6e 65 72  sive about gener
2bd90 61 74 69 6e 67 20 61 75 74 6f 6d 61 74 69 63 20  ating automatic 
2bda0 69 6e 64 65 78 65 73 20 66 6f 72 0a 20 20 20 20  indexes for.    
2bdb0 20 20 20 20 2a 2a 20 74 68 6f 73 65 20 6f 62 6a      ** those obj
2bdc0 65 63 74 73 2c 20 73 69 6e 63 65 20 74 68 65 72  ects, since ther
2bdd0 65 20 69 73 20 6e 6f 20 6f 70 70 6f 72 74 75 6e  e is no opportun
2bde0 69 74 79 20 74 6f 20 61 64 64 20 73 63 68 65 6d  ity to add schem
2bdf0 61 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 64  a.        ** ind
2be00 65 78 65 73 20 6f 6e 20 73 75 62 71 75 65 72 69  exes on subqueri
2be10 65 73 20 61 6e 64 20 76 69 65 77 73 2e 20 2a 2f  es and views. */
2be20 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72  .        pNew->r
2be30 53 65 74 75 70 20 3d 20 72 4c 6f 67 53 69 7a 65  Setup = rLogSize
2be40 20 2b 20 72 53 69 7a 65 20 2b 20 34 3b 0a 20 20   + rSize + 4;.  
2be50 20 20 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e        if( pTab->
2be60 70 53 65 6c 65 63 74 3d 3d 30 20 26 26 20 28 70  pSelect==0 && (p
2be70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20  Tab->tabFlags & 
2be80 54 46 5f 45 70 68 65 6d 65 72 61 6c 29 3d 3d 30  TF_Ephemeral)==0
2be90 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e   ){.          pN
2bea0 65 77 2d 3e 72 53 65 74 75 70 20 2b 3d 20 32 34  ew->rSetup += 24
2beb0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2bec0 20 20 20 20 41 70 70 6c 79 43 6f 73 74 4d 75 6c      ApplyCostMul
2bed0 74 69 70 6c 69 65 72 28 70 4e 65 77 2d 3e 72 53  tiplier(pNew->rS
2bee0 65 74 75 70 2c 20 70 54 61 62 2d 3e 63 6f 73 74  etup, pTab->cost
2bef0 4d 75 6c 74 29 3b 0a 20 20 20 20 20 20 20 20 2f  Mult);.        /
2bf00 2a 20 54 55 4e 49 4e 47 3a 20 45 61 63 68 20 69  * TUNING: Each i
2bf10 6e 64 65 78 20 6c 6f 6f 6b 75 70 20 79 69 65 6c  ndex lookup yiel
2bf20 64 73 20 32 30 20 72 6f 77 73 20 69 6e 20 74 68  ds 20 rows in th
2bf30 65 20 74 61 62 6c 65 2e 20 20 54 68 69 73 0a 20  e table.  This. 
2bf40 20 20 20 20 20 20 20 2a 2a 20 69 73 20 6d 6f 72         ** is mor
2bf50 65 20 74 68 61 6e 20 74 68 65 20 75 73 75 61 6c  e than the usual
2bf60 20 67 75 65 73 73 20 6f 66 20 31 30 20 72 6f 77   guess of 10 row
2bf70 73 2c 20 73 69 6e 63 65 20 77 65 20 68 61 76 65  s, since we have
2bf80 20 6e 6f 20 77 61 79 0a 20 20 20 20 20 20 20 20   no way.        
2bf90 2a 2a 20 6f 66 20 6b 6e 6f 77 69 6e 67 20 68 6f  ** of knowing ho
2bfa0 77 20 73 65 6c 65 63 74 69 76 65 20 74 68 65 20  w selective the 
2bfb0 69 6e 64 65 78 20 77 69 6c 6c 20 75 6c 74 69 6d  index will ultim
2bfc0 61 74 65 6c 79 20 62 65 2e 20 20 49 74 20 77 6f  ately be.  It wo
2bfd0 75 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e  uld.        ** n
2bfe0 6f 74 20 62 65 20 75 6e 72 65 61 73 6f 6e 61 62  ot be unreasonab
2bff0 6c 65 20 74 6f 20 6d 61 6b 65 20 74 68 69 73 20  le to make this 
2c000 76 61 6c 75 65 20 6d 75 63 68 20 6c 61 72 67 65  value much large
2c010 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e  r. */.        pN
2c020 65 77 2d 3e 6e 4f 75 74 20 3d 20 34 33 3b 20 20  ew->nOut = 43;  
2c030 61 73 73 65 72 74 28 20 34 33 3d 3d 73 71 6c 69  assert( 43==sqli
2c040 74 65 33 4c 6f 67 45 73 74 28 32 30 29 20 29 3b  te3LogEst(20) );
2c050 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72  .        pNew->r
2c060 52 75 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  Run = sqlite3Log
2c070 45 73 74 41 64 64 28 72 4c 6f 67 53 69 7a 65 2c  EstAdd(rLogSize,
2c080 70 4e 65 77 2d 3e 6e 4f 75 74 29 3b 0a 20 20 20  pNew->nOut);.   
2c090 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61       pNew->wsFla
2c0a0 67 73 20 3d 20 57 48 45 52 45 5f 41 55 54 4f 5f  gs = WHERE_AUTO_
2c0b0 49 4e 44 45 58 3b 0a 20 20 20 20 20 20 20 20 70  INDEX;.        p
2c0c0 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 6d 45  New->prereq = mE
2c0d0 78 74 72 61 20 7c 20 70 54 65 72 6d 2d 3e 70 72  xtra | pTerm->pr
2c0e0 65 72 65 71 52 69 67 68 74 3b 0a 20 20 20 20 20  ereqRight;.     
2c0f0 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f     rc = whereLoo
2c100 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72  pInsert(pBuilder
2c110 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 7d  , pNew);.      }
2c120 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
2c130 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
2c140 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58  _AUTOMATIC_INDEX
2c150 20 2a 2f 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20 6f   */..  /* Loop o
2c160 76 65 72 20 61 6c 6c 20 69 6e 64 69 63 65 73 0a  ver all indices.
2c170 20 20 2a 2f 0a 20 20 66 6f 72 28 3b 20 72 63 3d    */.  for(; rc=
2c180 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50  =SQLITE_OK && pP
2c190 72 6f 62 65 3b 20 70 50 72 6f 62 65 3d 70 50 72  robe; pProbe=pPr
2c1a0 6f 62 65 2d 3e 70 4e 65 78 74 2c 20 69 53 6f 72  obe->pNext, iSor
2c1b0 74 49 64 78 2b 2b 29 7b 0a 20 20 20 20 69 66 28  tIdx++){.    if(
2c1c0 20 70 50 72 6f 62 65 2d 3e 70 50 61 72 74 49 64   pProbe->pPartId
2c1d0 78 57 68 65 72 65 21 3d 30 0a 20 20 20 20 20 26  xWhere!=0.     &
2c1e0 26 20 21 77 68 65 72 65 55 73 61 62 6c 65 50 61  & !whereUsablePa
2c1f0 72 74 69 61 6c 49 6e 64 65 78 28 70 53 72 63 2d  rtialIndex(pSrc-
2c200 3e 69 43 75 72 73 6f 72 2c 20 70 57 43 2c 20 70  >iCursor, pWC, p
2c210 50 72 6f 62 65 2d 3e 70 50 61 72 74 49 64 78 57  Probe->pPartIdxW
2c220 68 65 72 65 29 20 29 7b 0a 20 20 20 20 20 20 74  here) ){.      t
2c230 65 73 74 63 61 73 65 28 20 70 4e 65 77 2d 3e 69  estcase( pNew->i
2c240 54 61 62 21 3d 70 53 72 63 2d 3e 69 43 75 72 73  Tab!=pSrc->iCurs
2c250 6f 72 20 29 3b 20 20 2f 2a 20 53 65 65 20 74 69  or );  /* See ti
2c260 63 6b 65 74 20 5b 39 38 64 39 37 33 62 38 66 35  cket [98d973b8f5
2c270 5d 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 74 69  ] */.      conti
2c280 6e 75 65 3b 20 20 2f 2a 20 50 61 72 74 69 61 6c  nue;  /* Partial
2c290 20 69 6e 64 65 78 20 69 6e 61 70 70 72 6f 70 72   index inappropr
2c2a0 69 61 74 65 20 66 6f 72 20 74 68 69 73 20 71 75  iate for this qu
2c2b0 65 72 79 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20  ery */.    }.   
2c2c0 20 72 53 69 7a 65 20 3d 20 70 50 72 6f 62 65 2d   rSize = pProbe-
2c2d0 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 30 5d 3b  >aiRowLogEst[0];
2c2e0 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72  .    pNew->u.btr
2c2f0 65 65 2e 6e 45 71 20 3d 20 30 3b 0a 20 20 20 20  ee.nEq = 0;.    
2c300 70 4e 65 77 2d 3e 6e 53 6b 69 70 20 3d 20 30 3b  pNew->nSkip = 0;
2c310 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72  .    pNew->nLTer
2c320 6d 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d  m = 0;.    pNew-
2c330 3e 69 53 6f 72 74 49 64 78 20 3d 20 30 3b 0a 20  >iSortIdx = 0;. 
2c340 20 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20     pNew->rSetup 
2c350 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70  = 0;.    pNew->p
2c360 72 65 72 65 71 20 3d 20 6d 45 78 74 72 61 3b 0a  rereq = mExtra;.
2c370 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d      pNew->nOut =
2c380 20 72 53 69 7a 65 3b 0a 20 20 20 20 70 4e 65 77   rSize;.    pNew
2c390 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
2c3a0 20 3d 20 70 50 72 6f 62 65 3b 0a 20 20 20 20 62   = pProbe;.    b
2c3b0 20 3d 20 69 6e 64 65 78 4d 69 67 68 74 48 65 6c   = indexMightHel
2c3c0 70 57 69 74 68 4f 72 64 65 72 42 79 28 70 42 75  pWithOrderBy(pBu
2c3d0 69 6c 64 65 72 2c 20 70 50 72 6f 62 65 2c 20 70  ilder, pProbe, p
2c3e0 53 72 63 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20  Src->iCursor);. 
2c3f0 20 20 20 2f 2a 20 54 68 65 20 4f 4e 45 50 41 53     /* The ONEPAS
2c400 53 5f 44 45 53 49 52 45 44 20 66 6c 61 67 73 20  S_DESIRED flags 
2c410 6e 65 76 65 72 20 6f 63 63 75 72 73 20 74 6f 67  never occurs tog
2c420 65 74 68 65 72 20 77 69 74 68 20 4f 52 44 45 52  ether with ORDER
2c430 20 42 59 20 2a 2f 0a 20 20 20 20 61 73 73 65 72   BY */.    asser
2c440 74 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72  t( (pWInfo->wctr
2c450 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  lFlags & WHERE_O
2c460 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44 29 3d  NEPASS_DESIRED)=
2c470 3d 30 20 7c 7c 20 62 3d 3d 30 20 29 3b 0a 20 20  =0 || b==0 );.  
2c480 20 20 69 66 28 20 70 50 72 6f 62 65 2d 3e 74 6e    if( pProbe->tn
2c490 75 6d 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  um<=0 ){.      /
2c4a0 2a 20 49 6e 74 65 67 65 72 20 70 72 69 6d 61 72  * Integer primar
2c4b0 79 20 6b 65 79 20 69 6e 64 65 78 20 2a 2f 0a 20  y key index */. 
2c4c0 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61       pNew->wsFla
2c4d0 67 73 20 3d 20 57 48 45 52 45 5f 49 50 4b 3b 0a  gs = WHERE_IPK;.
2c4e0 0a 20 20 20 20 20 20 2f 2a 20 46 75 6c 6c 20 74  .      /* Full t
2c4f0 61 62 6c 65 20 73 63 61 6e 20 2a 2f 0a 20 20 20  able scan */.   
2c500 20 20 20 70 4e 65 77 2d 3e 69 53 6f 72 74 49 64     pNew->iSortId
2c510 78 20 3d 20 62 20 3f 20 69 53 6f 72 74 49 64 78  x = b ? iSortIdx
2c520 20 3a 20 30 3b 0a 20 20 20 20 20 20 2f 2a 20 54   : 0;.      /* T
2c530 55 4e 49 4e 47 3a 20 43 6f 73 74 20 6f 66 20 66  UNING: Cost of f
2c540 75 6c 6c 20 74 61 62 6c 65 20 73 63 61 6e 20 69  ull table scan i
2c550 73 20 28 4e 2a 33 2e 30 29 2e 20 2a 2f 0a 20 20  s (N*3.0). */.  
2c560 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d      pNew->rRun =
2c570 20 72 53 69 7a 65 20 2b 20 31 36 3b 0a 20 20 20   rSize + 16;.   
2c580 20 20 20 41 70 70 6c 79 43 6f 73 74 4d 75 6c 74     ApplyCostMult
2c590 69 70 6c 69 65 72 28 70 4e 65 77 2d 3e 72 52 75  iplier(pNew->rRu
2c5a0 6e 2c 20 70 54 61 62 2d 3e 63 6f 73 74 4d 75 6c  n, pTab->costMul
2c5b0 74 29 3b 0a 20 20 20 20 20 20 77 68 65 72 65 4c  t);.      whereL
2c5c0 6f 6f 70 4f 75 74 70 75 74 41 64 6a 75 73 74 28  oopOutputAdjust(
2c5d0 70 57 43 2c 20 70 4e 65 77 2c 20 72 53 69 7a 65  pWC, pNew, rSize
2c5e0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68  );.      rc = wh
2c5f0 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42  ereLoopInsert(pB
2c600 75 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20  uilder, pNew);. 
2c610 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20       pNew->nOut 
2c620 3d 20 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 69  = rSize;.      i
2c630 66 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20  f( rc ) break;. 
2c640 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2c650 42 69 74 6d 61 73 6b 20 6d 3b 0a 20 20 20 20 20  Bitmask m;.     
2c660 20 69 66 28 20 70 50 72 6f 62 65 2d 3e 69 73 43   if( pProbe->isC
2c670 6f 76 65 72 69 6e 67 20 29 7b 0a 20 20 20 20 20  overing ){.     
2c680 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73     pNew->wsFlags
2c690 20 3d 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c   = WHERE_IDX_ONL
2c6a0 59 20 7c 20 57 48 45 52 45 5f 49 4e 44 45 58 45  Y | WHERE_INDEXE
2c6b0 44 3b 0a 20 20 20 20 20 20 20 20 6d 20 3d 20 30  D;.        m = 0
2c6c0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
2c6d0 20 20 20 20 20 20 20 6d 20 3d 20 70 53 72 63 2d         m = pSrc-
2c6e0 3e 63 6f 6c 55 73 65 64 20 26 20 7e 63 6f 6c 75  >colUsed & ~colu
2c6f0 6d 6e 73 49 6e 49 6e 64 65 78 28 70 50 72 6f 62  mnsInIndex(pProb
2c700 65 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  e);.        pNew
2c710 2d 3e 77 73 46 6c 61 67 73 20 3d 20 28 6d 3d 3d  ->wsFlags = (m==
2c720 30 29 20 3f 20 28 57 48 45 52 45 5f 49 44 58 5f  0) ? (WHERE_IDX_
2c730 4f 4e 4c 59 7c 57 48 45 52 45 5f 49 4e 44 45 58  ONLY|WHERE_INDEX
2c740 45 44 29 20 3a 20 57 48 45 52 45 5f 49 4e 44 45  ED) : WHERE_INDE
2c750 58 45 44 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  XED;.      }..  
2c760 20 20 20 20 2f 2a 20 46 75 6c 6c 20 73 63 61 6e      /* Full scan
2c770 20 76 69 61 20 69 6e 64 65 78 20 2a 2f 0a 20 20   via index */.  
2c780 20 20 20 20 69 66 28 20 62 0a 20 20 20 20 20 20      if( b.      
2c790 20 7c 7c 20 21 48 61 73 52 6f 77 69 64 28 70 54   || !HasRowid(pT
2c7a0 61 62 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 20  ab).       || ( 
2c7b0 6d 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26  m==0.         &&
2c7c0 20 70 50 72 6f 62 65 2d 3e 62 55 6e 6f 72 64 65   pProbe->bUnorde
2c7d0 72 65 64 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  red==0.         
2c7e0 26 26 20 28 70 50 72 6f 62 65 2d 3e 73 7a 49 64  && (pProbe->szId
2c7f0 78 52 6f 77 3c 70 54 61 62 2d 3e 73 7a 54 61 62  xRow<pTab->szTab
2c800 52 6f 77 29 0a 20 20 20 20 20 20 20 20 20 26 26  Row).         &&
2c810 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46   (pWInfo->wctrlF
2c820 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45  lags & WHERE_ONE
2c830 50 41 53 53 5f 44 45 53 49 52 45 44 29 3d 3d 30  PASS_DESIRED)==0
2c840 0a 20 20 20 20 20 20 20 20 20 26 26 20 73 71 6c  .         && sql
2c850 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2c860 2e 62 55 73 65 43 69 73 0a 20 20 20 20 20 20 20  .bUseCis.       
2c870 20 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f    && Optimizatio
2c880 6e 45 6e 61 62 6c 65 64 28 70 57 49 6e 66 6f 2d  nEnabled(pWInfo-
2c890 3e 70 50 61 72 73 65 2d 3e 64 62 2c 20 53 51 4c  >pParse->db, SQL
2c8a0 49 54 45 5f 43 6f 76 65 72 49 64 78 53 63 61 6e  ITE_CoverIdxScan
2c8b0 29 0a 20 20 20 20 20 20 20 20 20 20 29 0a 20 20  ).          ).  
2c8c0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 70      ){.        p
2c8d0 4e 65 77 2d 3e 69 53 6f 72 74 49 64 78 20 3d 20  New->iSortIdx = 
2c8e0 62 20 3f 20 69 53 6f 72 74 49 64 78 20 3a 20 30  b ? iSortIdx : 0
2c8f0 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ;..        /* Th
2c900 65 20 63 6f 73 74 20 6f 66 20 76 69 73 69 74 69  e cost of visiti
2c910 6e 67 20 74 68 65 20 69 6e 64 65 78 20 72 6f 77  ng the index row
2c920 73 20 69 73 20 4e 2a 4b 2c 20 77 68 65 72 65 20  s is N*K, where 
2c930 4b 20 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  K is.        ** 
2c940 62 65 74 77 65 65 6e 20 31 2e 31 20 61 6e 64 20  between 1.1 and 
2c950 33 2e 30 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f  3.0, depending o
2c960 6e 20 74 68 65 20 72 65 6c 61 74 69 76 65 20 73  n the relative s
2c970 69 7a 65 73 20 6f 66 20 74 68 65 0a 20 20 20 20  izes of the.    
2c980 20 20 20 20 2a 2a 20 69 6e 64 65 78 20 61 6e 64      ** index and
2c990 20 74 61 62 6c 65 20 72 6f 77 73 2e 20 49 66 20   table rows. If 
2c9a0 74 68 69 73 20 69 73 20 61 20 6e 6f 6e 2d 63 6f  this is a non-co
2c9b0 76 65 72 69 6e 67 20 69 6e 64 65 78 20 73 63 61  vering index sca
2c9c0 6e 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c  n,.        ** al
2c9d0 73 6f 20 61 64 64 20 74 68 65 20 63 6f 73 74 20  so add the cost 
2c9e0 6f 66 20 76 69 73 69 74 69 6e 67 20 74 61 62 6c  of visiting tabl
2c9f0 65 20 72 6f 77 73 20 28 4e 2a 33 2e 30 29 2e 20  e rows (N*3.0). 
2ca00 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77   */.        pNew
2ca10 2d 3e 72 52 75 6e 20 3d 20 72 53 69 7a 65 20 2b  ->rRun = rSize +
2ca20 20 31 20 2b 20 28 31 35 2a 70 50 72 6f 62 65 2d   1 + (15*pProbe-
2ca30 3e 73 7a 49 64 78 52 6f 77 29 2f 70 54 61 62 2d  >szIdxRow)/pTab-
2ca40 3e 73 7a 54 61 62 52 6f 77 3b 0a 20 20 20 20 20  >szTabRow;.     
2ca50 20 20 20 69 66 28 20 6d 21 3d 30 20 29 7b 0a 20     if( m!=0 ){. 
2ca60 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72           pNew->r
2ca70 52 75 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  Run = sqlite3Log
2ca80 45 73 74 41 64 64 28 70 4e 65 77 2d 3e 72 52 75  EstAdd(pNew->rRu
2ca90 6e 2c 20 72 53 69 7a 65 2b 31 36 29 3b 0a 20 20  n, rSize+16);.  
2caa0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2cab0 41 70 70 6c 79 43 6f 73 74 4d 75 6c 74 69 70 6c  ApplyCostMultipl
2cac0 69 65 72 28 70 4e 65 77 2d 3e 72 52 75 6e 2c 20  ier(pNew->rRun, 
2cad0 70 54 61 62 2d 3e 63 6f 73 74 4d 75 6c 74 29 3b  pTab->costMult);
2cae0 0a 20 20 20 20 20 20 20 20 77 68 65 72 65 4c 6f  .        whereLo
2caf0 6f 70 4f 75 74 70 75 74 41 64 6a 75 73 74 28 70  opOutputAdjust(p
2cb00 57 43 2c 20 70 4e 65 77 2c 20 72 53 69 7a 65 29  WC, pNew, rSize)
2cb10 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77  ;.        rc = w
2cb20 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70  hereLoopInsert(p
2cb30 42 75 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a  Builder, pNew);.
2cb40 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f          pNew->nO
2cb50 75 74 20 3d 20 72 53 69 7a 65 3b 0a 20 20 20 20  ut = rSize;.    
2cb60 20 20 20 20 69 66 28 20 72 63 20 29 20 62 72 65      if( rc ) bre
2cb70 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
2cb80 7d 0a 0a 20 20 20 20 72 63 20 3d 20 77 68 65 72  }..    rc = wher
2cb90 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 49 6e 64  eLoopAddBtreeInd
2cba0 65 78 28 70 42 75 69 6c 64 65 72 2c 20 70 53 72  ex(pBuilder, pSr
2cbb0 63 2c 20 70 50 72 6f 62 65 2c 20 30 29 3b 0a 23  c, pProbe, 0);.#
2cbc0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
2cbd0 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41  BLE_STAT3_OR_STA
2cbe0 54 34 0a 20 20 20 20 73 71 6c 69 74 65 33 53 74  T4.    sqlite3St
2cbf0 61 74 34 50 72 6f 62 65 46 72 65 65 28 70 42 75  at4ProbeFree(pBu
2cc00 69 6c 64 65 72 2d 3e 70 52 65 63 29 3b 0a 20 20  ilder->pRec);.  
2cc10 20 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63    pBuilder->nRec
2cc20 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20 20 20 70  Valid = 0;.    p
2cc30 42 75 69 6c 64 65 72 2d 3e 70 52 65 63 20 3d 20  Builder->pRec = 
2cc40 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f  0;.#endif..    /
2cc50 2a 20 49 66 20 74 68 65 72 65 20 77 61 73 20 61  * If there was a
2cc60 6e 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61  n INDEXED BY cla
2cc70 75 73 65 2c 20 74 68 65 6e 20 6f 6e 6c 79 20 74  use, then only t
2cc80 68 61 74 20 6f 6e 65 20 69 6e 64 65 78 20 69 73  hat one index is
2cc90 0a 20 20 20 20 2a 2a 20 63 6f 6e 73 69 64 65 72  .    ** consider
2cca0 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  ed. */.    if( p
2ccb0 53 72 63 2d 3e 70 49 6e 64 65 78 20 29 20 62 72  Src->pIndex ) br
2ccc0 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  eak;.  }.  retur
2ccd0 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  n rc;.}..#ifndef
2cce0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
2ccf0 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20  TUALTABLE./*.** 
2cd00 41 64 64 20 61 6c 6c 20 57 68 65 72 65 4c 6f 6f  Add all WhereLoo
2cd10 70 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 61 20  p objects for a 
2cd20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 6a 6f 69  table of the joi
2cd30 6e 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 0a  n identified by.
2cd40 2a 2a 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65  ** pBuilder->pNe
2cd50 77 2d 3e 69 54 61 62 2e 20 20 54 68 61 74 20 74  w->iTab.  That t
2cd60 61 62 6c 65 20 69 73 20 67 75 61 72 61 6e 74 65  able is guarante
2cd70 65 64 20 74 6f 20 62 65 20 61 20 76 69 72 74 75  ed to be a virtu
2cd80 61 6c 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61  al table..*/.sta
2cd90 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f  tic int whereLoo
2cda0 70 41 64 64 56 69 72 74 75 61 6c 28 0a 20 20 57  pAddVirtual(.  W
2cdb0 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20  hereLoopBuilder 
2cdc0 2a 70 42 75 69 6c 64 65 72 2c 20 20 2f 2a 20 57  *pBuilder,  /* W
2cdd0 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e 66 6f  HERE clause info
2cde0 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 42 69 74  rmation */.  Bit
2cdf0 6d 61 73 6b 20 6d 45 78 74 72 61 0a 29 7b 0a 20  mask mExtra.){. 
2ce00 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e   WhereInfo *pWIn
2ce10 66 6f 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  fo;           /*
2ce20 20 57 48 45 52 45 20 61 6e 61 6c 79 73 69 73 20   WHERE analysis 
2ce30 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 50 61 72  context */.  Par
2ce40 73 65 20 2a 70 50 61 72 73 65 3b 20 20 20 20 20  se *pParse;     
2ce50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2ce60 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   parsing context
2ce70 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
2ce80 65 20 2a 70 57 43 3b 20 20 20 20 20 20 20 20 20  e *pWC;         
2ce90 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
2cea0 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75  clause */.  stru
2ceb0 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
2cec0 2a 70 53 72 63 3b 20 20 20 2f 2a 20 54 68 65 20  *pSrc;   /* The 
2ced0 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d  FROM clause term
2cee0 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20   to search */.  
2cef0 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 73  Table *pTab;.  s
2cf00 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 73 71  qlite3 *db;.  sq
2cf10 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
2cf20 20 2a 70 49 64 78 49 6e 66 6f 3b 0a 20 20 73 74   *pIdxInfo;.  st
2cf30 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
2cf40 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 20 2a 70  ex_constraint *p
2cf50 49 64 78 43 6f 6e 73 3b 0a 20 20 73 74 72 75 63  IdxCons;.  struc
2cf60 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  t sqlite3_index_
2cf70 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61 67 65  constraint_usage
2cf80 20 2a 70 55 73 61 67 65 3b 0a 20 20 57 68 65 72   *pUsage;.  Wher
2cf90 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20  eTerm *pTerm;.  
2cfa0 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20  int i, j;.  int 
2cfb0 69 54 65 72 6d 2c 20 6d 78 54 65 72 6d 3b 0a 20  iTerm, mxTerm;. 
2cfc0 20 69 6e 74 20 6e 43 6f 6e 73 74 72 61 69 6e 74   int nConstraint
2cfd0 3b 0a 20 20 69 6e 74 20 73 65 65 6e 49 6e 20 3d  ;.  int seenIn =
2cfe0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
2cff0 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 20 49   /* True if an I
2d000 4e 20 6f 70 65 72 61 74 6f 72 20 69 73 20 73 65  N operator is se
2d010 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 73 65 65 6e  en */.  int seen
2d020 56 61 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Var = 0;        
2d030 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
2d040 61 20 6e 6f 6e 2d 63 6f 6e 73 74 61 6e 74 20 63  a non-constant c
2d050 6f 6e 73 74 72 61 69 6e 74 20 69 73 20 73 65 65  onstraint is see
2d060 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 50 68 61 73  n */.  int iPhas
2d070 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
2d080 20 20 20 20 2f 2a 20 30 3a 20 63 6f 6e 73 74 20      /* 0: const 
2d090 77 2f 6f 20 49 4e 2c 20 31 3a 20 63 6f 6e 73 74  w/o IN, 1: const
2d0a0 2c 20 32 3a 20 6e 6f 20 49 4e 2c 20 20 32 3a 20  , 2: no IN,  2: 
2d0b0 49 4e 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f  IN */.  WhereLoo
2d0c0 70 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 72  p *pNew;.  int r
2d0d0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
2d0e0 20 20 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c    pWInfo = pBuil
2d0f0 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 70  der->pWInfo;.  p
2d100 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e  Parse = pWInfo->
2d110 70 50 61 72 73 65 3b 0a 20 20 64 62 20 3d 20 70  pParse;.  db = p
2d120 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 57 43  Parse->db;.  pWC
2d130 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43   = pBuilder->pWC
2d140 3b 0a 20 20 70 4e 65 77 20 3d 20 70 42 75 69 6c  ;.  pNew = pBuil
2d150 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 70 53 72  der->pNew;.  pSr
2d160 63 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 70 54 61  c = &pWInfo->pTa
2d170 62 4c 69 73 74 2d 3e 61 5b 70 4e 65 77 2d 3e 69  bList->a[pNew->i
2d180 54 61 62 5d 3b 0a 20 20 70 54 61 62 20 3d 20 70  Tab];.  pTab = p
2d190 53 72 63 2d 3e 70 54 61 62 3b 0a 20 20 61 73 73  Src->pTab;.  ass
2d1a0 65 72 74 28 20 49 73 56 69 72 74 75 61 6c 28 70  ert( IsVirtual(p
2d1b0 54 61 62 29 20 29 3b 0a 20 20 70 49 64 78 49 6e  Tab) );.  pIdxIn
2d1c0 66 6f 20 3d 20 61 6c 6c 6f 63 61 74 65 49 6e 64  fo = allocateInd
2d1d0 65 78 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70  exInfo(pParse, p
2d1e0 57 43 2c 20 70 53 72 63 2c 20 70 42 75 69 6c 64  WC, pSrc, pBuild
2d1f0 65 72 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20  er->pOrderBy);. 
2d200 20 69 66 28 20 70 49 64 78 49 6e 66 6f 3d 3d 30   if( pIdxInfo==0
2d210 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
2d220 5f 4e 4f 4d 45 4d 3b 0a 20 20 70 4e 65 77 2d 3e  _NOMEM;.  pNew->
2d230 70 72 65 72 65 71 20 3d 20 30 3b 0a 20 20 70 4e  prereq = 0;.  pN
2d240 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a  ew->rSetup = 0;.
2d250 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20    pNew->wsFlags 
2d260 3d 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54  = WHERE_VIRTUALT
2d270 41 42 4c 45 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4c  ABLE;.  pNew->nL
2d280 54 65 72 6d 20 3d 20 30 3b 0a 20 20 70 4e 65 77  Term = 0;.  pNew
2d290 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65  ->u.vtab.needFre
2d2a0 65 20 3d 20 30 3b 0a 20 20 70 55 73 61 67 65 20  e = 0;.  pUsage 
2d2b0 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e  = pIdxInfo->aCon
2d2c0 73 74 72 61 69 6e 74 55 73 61 67 65 3b 0a 20 20  straintUsage;.  
2d2d0 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 70 49  nConstraint = pI
2d2e0 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61  dxInfo->nConstra
2d2f0 69 6e 74 3b 0a 20 20 69 66 28 20 77 68 65 72 65  int;.  if( where
2d300 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62 2c 20 70  LoopResize(db, p
2d310 4e 65 77 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74  New, nConstraint
2d320 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
2d330 44 62 46 72 65 65 28 64 62 2c 20 70 49 64 78 49  DbFree(db, pIdxI
2d340 6e 66 6f 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  nfo);.    return
2d350 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
2d360 20 7d 0a 0a 20 20 66 6f 72 28 69 50 68 61 73 65   }..  for(iPhase
2d370 3d 30 3b 20 69 50 68 61 73 65 3c 3d 33 3b 20 69  =0; iPhase<=3; i
2d380 50 68 61 73 65 2b 2b 29 7b 0a 20 20 20 20 69 66  Phase++){.    if
2d390 28 20 21 73 65 65 6e 49 6e 20 26 26 20 28 69 50  ( !seenIn && (iP
2d3a0 68 61 73 65 26 31 29 21 3d 30 20 29 7b 0a 20 20  hase&1)!=0 ){.  
2d3b0 20 20 20 20 69 50 68 61 73 65 2b 2b 3b 0a 20 20      iPhase++;.  
2d3c0 20 20 20 20 69 66 28 20 69 50 68 61 73 65 3e 33      if( iPhase>3
2d3d0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a   ) break;.    }.
2d3e0 20 20 20 20 69 66 28 20 21 73 65 65 6e 56 61 72      if( !seenVar
2d3f0 20 26 26 20 69 50 68 61 73 65 3e 31 20 29 20 62   && iPhase>1 ) b
2d400 72 65 61 6b 3b 0a 20 20 20 20 70 49 64 78 43 6f  reak;.    pIdxCo
2d410 6e 73 20 3d 20 2a 28 73 74 72 75 63 74 20 73 71  ns = *(struct sq
2d420 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
2d430 74 72 61 69 6e 74 2a 2a 29 26 70 49 64 78 49 6e  traint**)&pIdxIn
2d440 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 3b  fo->aConstraint;
2d450 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
2d460 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74  pIdxInfo->nConst
2d470 72 61 69 6e 74 3b 20 69 2b 2b 2c 20 70 49 64 78  raint; i++, pIdx
2d480 43 6f 6e 73 2b 2b 29 7b 0a 20 20 20 20 20 20 6a  Cons++){.      j
2d490 20 3d 20 70 49 64 78 43 6f 6e 73 2d 3e 69 54 65   = pIdxCons->iTe
2d4a0 72 6d 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  rmOffset;.      
2d4b0 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b  pTerm = &pWC->a[
2d4c0 6a 5d 3b 0a 20 20 20 20 20 20 73 77 69 74 63 68  j];.      switch
2d4d0 28 20 69 50 68 61 73 65 20 29 7b 0a 20 20 20 20  ( iPhase ){.    
2d4e0 20 20 20 20 63 61 73 65 20 30 3a 20 20 20 20 2f      case 0:    /
2d4f0 2a 20 43 6f 6e 73 74 61 6e 74 73 20 77 69 74 68  * Constants with
2d500 6f 75 74 20 49 4e 20 6f 70 65 72 61 74 6f 72 20  out IN operator 
2d510 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70 49 64  */.          pId
2d520 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20  xCons->usable = 
2d530 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  0;.          if(
2d540 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74   (pTerm->eOperat
2d550 6f 72 20 26 20 57 4f 5f 49 4e 29 21 3d 30 20 29  or & WO_IN)!=0 )
2d560 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65  {.            se
2d570 65 6e 49 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20  enIn = 1;.      
2d580 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2d590 69 66 28 20 70 54 65 72 6d 2d 3e 70 72 65 72 65  if( pTerm->prere
2d5a0 71 52 69 67 68 74 21 3d 30 20 29 7b 0a 20 20 20  qRight!=0 ){.   
2d5b0 20 20 20 20 20 20 20 20 20 73 65 65 6e 56 61 72           seenVar
2d5c0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
2d5d0 7d 65 6c 73 65 20 69 66 28 20 28 70 54 65 72 6d  }else if( (pTerm
2d5e0 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
2d5f0 5f 49 4e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  _IN)==0 ){.     
2d600 20 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73 2d         pIdxCons-
2d610 3e 75 73 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20  >usable = 1;.   
2d620 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2d630 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
2d640 20 20 63 61 73 65 20 31 3a 20 20 20 20 2f 2a 20    case 1:    /* 
2d650 43 6f 6e 73 74 61 6e 74 73 20 77 69 74 68 20 49  Constants with I
2d660 4e 20 6f 70 65 72 61 74 6f 72 73 20 2a 2f 0a 20  N operators */. 
2d670 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
2d680 20 73 65 65 6e 49 6e 20 29 3b 0a 20 20 20 20 20   seenIn );.     
2d690 20 20 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e 75       pIdxCons->u
2d6a0 73 61 62 6c 65 20 3d 20 28 70 54 65 72 6d 2d 3e  sable = (pTerm->
2d6b0 70 72 65 72 65 71 52 69 67 68 74 3d 3d 30 29 3b  prereqRight==0);
2d6c0 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
2d6d0 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 32  ;.        case 2
2d6e0 3a 20 20 20 20 2f 2a 20 56 61 72 69 61 62 6c 65  :    /* Variable
2d6f0 73 20 77 69 74 68 6f 75 74 20 49 4e 20 2a 2f 0a  s without IN */.
2d700 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
2d710 28 20 73 65 65 6e 56 61 72 20 29 3b 0a 20 20 20  ( seenVar );.   
2d720 20 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73 2d         pIdxCons-
2d730 3e 75 73 61 62 6c 65 20 3d 20 28 70 54 65 72 6d  >usable = (pTerm
2d740 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
2d750 5f 49 4e 29 3d 3d 30 3b 0a 20 20 20 20 20 20 20  _IN)==0;.       
2d760 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
2d770 20 20 64 65 66 61 75 6c 74 3a 20 20 20 2f 2a 20    default:   /* 
2d780 56 61 72 69 61 62 6c 65 73 20 77 69 74 68 20 49  Variables with I
2d790 4e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61  N */.          a
2d7a0 73 73 65 72 74 28 20 73 65 65 6e 56 61 72 20 26  ssert( seenVar &
2d7b0 26 20 73 65 65 6e 49 6e 20 29 3b 0a 20 20 20 20  & seenIn );.    
2d7c0 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e        pIdxCons->
2d7d0 75 73 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20  usable = 1;.    
2d7e0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2d7f0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6d     }.    }.    m
2d800 65 6d 73 65 74 28 70 55 73 61 67 65 2c 20 30 2c  emset(pUsage, 0,
2d810 20 73 69 7a 65 6f 66 28 70 55 73 61 67 65 5b 30   sizeof(pUsage[0
2d820 5d 29 2a 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f  ])*pIdxInfo->nCo
2d830 6e 73 74 72 61 69 6e 74 29 3b 0a 20 20 20 20 69  nstraint);.    i
2d840 66 28 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65  f( pIdxInfo->nee
2d850 64 54 6f 46 72 65 65 49 64 78 53 74 72 20 29 20  dToFreeIdxStr ) 
2d860 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49 64  sqlite3_free(pId
2d870 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72 29 3b 0a  xInfo->idxStr);.
2d880 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64      pIdxInfo->id
2d890 78 53 74 72 20 3d 20 30 3b 0a 20 20 20 20 70 49  xStr = 0;.    pI
2d8a0 64 78 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d 20 3d  dxInfo->idxNum =
2d8b0 20 30 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f   0;.    pIdxInfo
2d8c0 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53  ->needToFreeIdxS
2d8d0 74 72 20 3d 20 30 3b 0a 20 20 20 20 70 49 64 78  tr = 0;.    pIdx
2d8e0 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f 6e  Info->orderByCon
2d8f0 73 75 6d 65 64 20 3d 20 30 3b 0a 20 20 20 20 70  sumed = 0;.    p
2d900 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74  IdxInfo->estimat
2d910 65 64 43 6f 73 74 20 3d 20 53 51 4c 49 54 45 5f  edCost = SQLITE_
2d920 42 49 47 5f 44 42 4c 20 2f 20 28 64 6f 75 62 6c  BIG_DBL / (doubl
2d930 65 29 32 3b 0a 20 20 20 20 70 49 64 78 49 6e 66  e)2;.    pIdxInf
2d940 6f 2d 3e 65 73 74 69 6d 61 74 65 64 52 6f 77 73  o->estimatedRows
2d950 20 3d 20 32 35 3b 0a 20 20 20 20 72 63 20 3d 20   = 25;.    rc = 
2d960 76 74 61 62 42 65 73 74 49 6e 64 65 78 28 70 50  vtabBestIndex(pP
2d970 61 72 73 65 2c 20 70 54 61 62 2c 20 70 49 64 78  arse, pTab, pIdx
2d980 49 6e 66 6f 29 3b 0a 20 20 20 20 69 66 28 20 72  Info);.    if( r
2d990 63 20 29 20 67 6f 74 6f 20 77 68 65 72 65 4c 6f  c ) goto whereLo
2d9a0 6f 70 41 64 64 56 74 61 62 5f 65 78 69 74 3b 0a  opAddVtab_exit;.
2d9b0 20 20 20 20 70 49 64 78 43 6f 6e 73 20 3d 20 2a      pIdxCons = *
2d9c0 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f  (struct sqlite3_
2d9d0 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
2d9e0 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43  **)&pIdxInfo->aC
2d9f0 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 20 20 70  onstraint;.    p
2da00 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 6d 45  New->prereq = mE
2da10 78 74 72 61 3b 0a 20 20 20 20 6d 78 54 65 72 6d  xtra;.    mxTerm
2da20 20 3d 20 2d 31 3b 0a 20 20 20 20 61 73 73 65 72   = -1;.    asser
2da30 74 28 20 70 4e 65 77 2d 3e 6e 4c 53 6c 6f 74 3e  t( pNew->nLSlot>
2da40 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 20 29 3b 0a  =nConstraint );.
2da50 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
2da60 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29  Constraint; i++)
2da70 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 69 5d   pNew->aLTerm[i]
2da80 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e   = 0;.    pNew->
2da90 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 20  u.vtab.omitMask 
2daa0 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  = 0;.    for(i=0
2dab0 3b 20 69 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 3b  ; i<nConstraint;
2dac0 20 69 2b 2b 2c 20 70 49 64 78 43 6f 6e 73 2b 2b   i++, pIdxCons++
2dad0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 69 54  ){.      if( (iT
2dae0 65 72 6d 20 3d 20 70 55 73 61 67 65 5b 69 5d 2e  erm = pUsage[i].
2daf0 61 72 67 76 49 6e 64 65 78 20 2d 20 31 29 3e 3d  argvIndex - 1)>=
2db00 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6a 20 3d  0 ){.        j =
2db10 20 70 49 64 78 43 6f 6e 73 2d 3e 69 54 65 72 6d   pIdxCons->iTerm
2db20 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20  Offset;.        
2db30 69 66 28 20 69 54 65 72 6d 3e 3d 6e 43 6f 6e 73  if( iTerm>=nCons
2db40 74 72 61 69 6e 74 0a 20 20 20 20 20 20 20 20 20  traint.         
2db50 7c 7c 20 6a 3c 30 0a 20 20 20 20 20 20 20 20 20  || j<0.         
2db60 7c 7c 20 6a 3e 3d 70 57 43 2d 3e 6e 54 65 72 6d  || j>=pWC->nTerm
2db70 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 4e 65  .         || pNe
2db80 77 2d 3e 61 4c 54 65 72 6d 5b 69 54 65 72 6d 5d  w->aLTerm[iTerm]
2db90 21 3d 30 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  !=0.        ){. 
2dba0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
2dbb0 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
2dbc0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
2dbd0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25  orMsg(pParse, "%
2dbe0 73 2e 78 42 65 73 74 49 6e 64 65 78 28 29 20 6d  s.xBestIndex() m
2dbf0 61 6c 66 75 6e 63 74 69 6f 6e 22 2c 20 70 54 61  alfunction", pTa
2dc00 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  b->zName);.     
2dc10 20 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65 4c       goto whereL
2dc20 6f 6f 70 41 64 64 56 74 61 62 5f 65 78 69 74 3b  oopAddVtab_exit;
2dc30 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2dc40 20 20 20 74 65 73 74 63 61 73 65 28 20 69 54 65     testcase( iTe
2dc50 72 6d 3d 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 2d  rm==nConstraint-
2dc60 31 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  1 );.        tes
2dc70 74 63 61 73 65 28 20 6a 3d 3d 30 20 29 3b 0a 20  tcase( j==0 );. 
2dc80 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
2dc90 20 6a 3d 3d 70 57 43 2d 3e 6e 54 65 72 6d 2d 31   j==pWC->nTerm-1
2dca0 20 29 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72   );.        pTer
2dcb0 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 6a 5d 3b 0a  m = &pWC->a[j];.
2dcc0 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 72          pNew->pr
2dcd0 65 72 65 71 20 7c 3d 20 70 54 65 72 6d 2d 3e 70  ereq |= pTerm->p
2dce0 72 65 72 65 71 52 69 67 68 74 3b 0a 20 20 20 20  rereqRight;.    
2dcf0 20 20 20 20 61 73 73 65 72 74 28 20 69 54 65 72      assert( iTer
2dd00 6d 3c 70 4e 65 77 2d 3e 6e 4c 53 6c 6f 74 20 29  m<pNew->nLSlot )
2dd10 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
2dd20 61 4c 54 65 72 6d 5b 69 54 65 72 6d 5d 20 3d 20  aLTerm[iTerm] = 
2dd30 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 69  pTerm;.        i
2dd40 66 28 20 69 54 65 72 6d 3e 6d 78 54 65 72 6d 20  f( iTerm>mxTerm 
2dd50 29 20 6d 78 54 65 72 6d 20 3d 20 69 54 65 72 6d  ) mxTerm = iTerm
2dd60 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
2dd70 73 65 28 20 69 54 65 72 6d 3d 3d 31 35 20 29 3b  se( iTerm==15 );
2dd80 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
2dd90 65 28 20 69 54 65 72 6d 3d 3d 31 36 20 29 3b 0a  e( iTerm==16 );.
2dda0 20 20 20 20 20 20 20 20 69 66 28 20 69 54 65 72          if( iTer
2ddb0 6d 3c 31 36 20 26 26 20 70 55 73 61 67 65 5b 69  m<16 && pUsage[i
2ddc0 5d 2e 6f 6d 69 74 20 29 20 70 4e 65 77 2d 3e 75  ].omit ) pNew->u
2ddd0 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 20 7c  .vtab.omitMask |
2dde0 3d 20 31 3c 3c 69 54 65 72 6d 3b 0a 20 20 20 20  = 1<<iTerm;.    
2ddf0 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e      if( (pTerm->
2de00 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49  eOperator & WO_I
2de10 4e 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  N)!=0 ){.       
2de20 20 20 20 69 66 28 20 70 55 73 61 67 65 5b 69 5d     if( pUsage[i]
2de30 2e 6f 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20  .omit==0 ){.    
2de40 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f          /* Do no
2de50 74 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65  t attempt to use
2de60 20 61 6e 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e   an IN constrain
2de70 74 20 69 66 20 74 68 65 20 76 69 72 74 75 61 6c  t if the virtual
2de80 20 74 61 62 6c 65 0a 20 20 20 20 20 20 20 20 20   table.         
2de90 20 20 20 2a 2a 20 73 61 79 73 20 74 68 61 74 20     ** says that 
2dea0 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74 20 45  the equivalent E
2deb0 51 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 61 6e  Q constraint can
2dec0 6e 6f 74 20 62 65 20 73 61 66 65 6c 79 20 6f 6d  not be safely om
2ded0 69 74 74 65 64 2e 0a 20 20 20 20 20 20 20 20 20  itted..         
2dee0 20 20 20 2a 2a 20 49 66 20 77 65 20 64 6f 20 61     ** If we do a
2def0 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20 73 75  ttempt to use su
2df00 63 68 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 2c  ch a constraint,
2df10 20 73 6f 6d 65 20 72 6f 77 73 20 6d 69 67 68 74   some rows might
2df20 20 62 65 0a 20 20 20 20 20 20 20 20 20 20 20 20   be.            
2df30 2a 2a 20 72 65 70 65 61 74 65 64 20 69 6e 20 74  ** repeated in t
2df40 68 65 20 6f 75 74 70 75 74 2e 20 2a 2f 0a 20 20  he output. */.  
2df50 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
2df60 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2df70 20 20 20 20 20 20 20 2f 2a 20 41 20 76 69 72 74         /* A virt
2df80 75 61 6c 20 74 61 62 6c 65 20 74 68 61 74 20 69  ual table that i
2df90 73 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 62 79  s constrained by
2dfa0 20 61 6e 20 49 4e 20 63 6c 61 75 73 65 20 6d 61   an IN clause ma
2dfb0 79 20 6e 6f 74 0a 20 20 20 20 20 20 20 20 20 20  y not.          
2dfc0 2a 2a 20 63 6f 6e 73 75 6d 65 20 74 68 65 20 4f  ** consume the O
2dfd0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 62  RDER BY clause b
2dfe0 65 63 61 75 73 65 20 28 31 29 20 74 68 65 20 6f  ecause (1) the o
2dff0 72 64 65 72 20 6f 66 20 49 4e 20 74 65 72 6d 73  rder of IN terms
2e000 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 73  .          ** is
2e010 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79   not necessarily
2e020 20 72 65 6c 61 74 65 64 20 74 6f 20 74 68 65 20   related to the 
2e030 6f 72 64 65 72 20 6f 66 20 6f 75 74 70 75 74 20  order of output 
2e040 74 65 72 6d 73 20 61 6e 64 0a 20 20 20 20 20 20  terms and.      
2e050 20 20 20 20 2a 2a 20 28 32 29 20 4d 75 6c 74 69      ** (2) Multi
2e060 70 6c 65 20 6f 75 74 70 75 74 73 20 66 72 6f 6d  ple outputs from
2e070 20 61 20 73 69 6e 67 6c 65 20 49 4e 20 76 61 6c   a single IN val
2e080 75 65 20 77 69 6c 6c 20 6e 6f 74 20 6d 65 72 67  ue will not merg
2e090 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74  e.          ** t
2e0a0 6f 67 65 74 68 65 72 2e 20 20 2a 2f 0a 20 20 20  ogether.  */.   
2e0b0 20 20 20 20 20 20 20 70 49 64 78 49 6e 66 6f 2d         pIdxInfo-
2e0c0 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64  >orderByConsumed
2e0d0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
2e0e0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2e0f0 20 20 69 66 28 20 69 3e 3d 6e 43 6f 6e 73 74 72    if( i>=nConstr
2e100 61 69 6e 74 20 29 7b 0a 20 20 20 20 20 20 70 4e  aint ){.      pN
2e110 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 6d 78 54  ew->nLTerm = mxT
2e120 65 72 6d 2b 31 3b 0a 20 20 20 20 20 20 61 73 73  erm+1;.      ass
2e130 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4c 54 65 72  ert( pNew->nLTer
2e140 6d 3c 3d 70 4e 65 77 2d 3e 6e 4c 53 6c 6f 74 20  m<=pNew->nLSlot 
2e150 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 75  );.      pNew->u
2e160 2e 76 74 61 62 2e 69 64 78 4e 75 6d 20 3d 20 70  .vtab.idxNum = p
2e170 49 64 78 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d 3b  IdxInfo->idxNum;
2e180 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76  .      pNew->u.v
2e190 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3d 20 70  tab.needFree = p
2e1a0 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46  IdxInfo->needToF
2e1b0 72 65 65 49 64 78 53 74 72 3b 0a 20 20 20 20 20  reeIdxStr;.     
2e1c0 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54   pIdxInfo->needT
2e1d0 6f 46 72 65 65 49 64 78 53 74 72 20 3d 20 30 3b  oFreeIdxStr = 0;
2e1e0 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76  .      pNew->u.v
2e1f0 74 61 62 2e 69 64 78 53 74 72 20 3d 20 70 49 64  tab.idxStr = pId
2e200 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72 3b 0a 20  xInfo->idxStr;. 
2e210 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61       pNew->u.vta
2e220 62 2e 69 73 4f 72 64 65 72 65 64 20 3d 20 28 69  b.isOrdered = (i
2e230 38 29 28 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64  8)(pIdxInfo->ord
2e240 65 72 42 79 43 6f 6e 73 75 6d 65 64 20 3f 0a 20  erByConsumed ?. 
2e250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e270 20 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6e       pIdxInfo->n
2e280 4f 72 64 65 72 42 79 20 3a 20 30 29 3b 0a 20 20  OrderBy : 0);.  
2e290 20 20 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70      pNew->rSetup
2e2a0 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4e 65 77   = 0;.      pNew
2e2b0 2d 3e 72 52 75 6e 20 3d 20 73 71 6c 69 74 65 33  ->rRun = sqlite3
2e2c0 4c 6f 67 45 73 74 46 72 6f 6d 44 6f 75 62 6c 65  LogEstFromDouble
2e2d0 28 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d  (pIdxInfo->estim
2e2e0 61 74 65 64 43 6f 73 74 29 3b 0a 20 20 20 20 20  atedCost);.     
2e2f0 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 71   pNew->nOut = sq
2e300 6c 69 74 65 33 4c 6f 67 45 73 74 28 70 49 64 78  lite3LogEst(pIdx
2e310 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 52  Info->estimatedR
2e320 6f 77 73 29 3b 0a 20 20 20 20 20 20 77 68 65 72  ows);.      wher
2e330 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69  eLoopInsert(pBui
2e340 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20  lder, pNew);.   
2e350 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 75 2e 76     if( pNew->u.v
2e360 74 61 62 2e 6e 65 65 64 46 72 65 65 20 29 7b 0a  tab.needFree ){.
2e370 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
2e380 66 72 65 65 28 70 4e 65 77 2d 3e 75 2e 76 74 61  free(pNew->u.vta
2e390 62 2e 69 64 78 53 74 72 29 3b 0a 20 20 20 20 20  b.idxStr);.     
2e3a0 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e     pNew->u.vtab.
2e3b0 6e 65 65 64 46 72 65 65 20 3d 20 30 3b 0a 20 20  needFree = 0;.  
2e3c0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20      }.    }.  } 
2e3d0 20 0a 0a 77 68 65 72 65 4c 6f 6f 70 41 64 64 56   ..whereLoopAddV
2e3e0 74 61 62 5f 65 78 69 74 3a 0a 20 20 69 66 28 20  tab_exit:.  if( 
2e3f0 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f  pIdxInfo->needTo
2e400 46 72 65 65 49 64 78 53 74 72 20 29 20 73 71 6c  FreeIdxStr ) sql
2e410 69 74 65 33 5f 66 72 65 65 28 70 49 64 78 49 6e  ite3_free(pIdxIn
2e420 66 6f 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20 73  fo->idxStr);.  s
2e430 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
2e440 20 70 49 64 78 49 6e 66 6f 29 3b 0a 20 20 72 65   pIdxInfo);.  re
2e450 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  turn rc;.}.#endi
2e460 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
2e470 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f  _VIRTUALTABLE */
2e480 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 57 68 65 72  ../*.** Add Wher
2e490 65 4c 6f 6f 70 20 65 6e 74 72 69 65 73 20 74 6f  eLoop entries to
2e4a0 20 68 61 6e 64 6c 65 20 4f 52 20 74 65 72 6d 73   handle OR terms
2e4b0 2e 20 20 54 68 69 73 20 77 6f 72 6b 73 20 66 6f  .  This works fo
2e4c0 72 20 65 69 74 68 65 72 0a 2a 2a 20 62 74 72 65  r either.** btre
2e4d0 65 73 20 6f 72 20 76 69 72 74 75 61 6c 20 74 61  es or virtual ta
2e4e0 62 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  bles..*/.static 
2e4f0 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  int whereLoopAdd
2e500 4f 72 28 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c  Or(WhereLoopBuil
2e510 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 20 42  der *pBuilder, B
2e520 69 74 6d 61 73 6b 20 6d 45 78 74 72 61 29 7b 0a  itmask mExtra){.
2e530 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
2e540 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  nfo = pBuilder->
2e550 70 57 49 6e 66 6f 3b 0a 20 20 57 68 65 72 65 43  pWInfo;.  WhereC
2e560 6c 61 75 73 65 20 2a 70 57 43 3b 0a 20 20 57 68  lause *pWC;.  Wh
2e570 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a 20  ereLoop *pNew;. 
2e580 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
2e590 6d 2c 20 2a 70 57 43 45 6e 64 3b 0a 20 20 69 6e  m, *pWCEnd;.  in
2e5a0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
2e5b0 3b 0a 20 20 69 6e 74 20 69 43 75 72 3b 0a 20 20  ;.  int iCur;.  
2e5c0 57 68 65 72 65 43 6c 61 75 73 65 20 74 65 6d 70  WhereClause temp
2e5d0 57 43 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42  WC;.  WhereLoopB
2e5e0 75 69 6c 64 65 72 20 73 53 75 62 42 75 69 6c 64  uilder sSubBuild
2e5f0 3b 0a 20 20 57 68 65 72 65 4f 72 53 65 74 20 73  ;.  WhereOrSet s
2e600 53 75 6d 2c 20 73 43 75 72 3b 0a 20 20 73 74 72  Sum, sCur;.  str
2e610 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
2e620 20 2a 70 49 74 65 6d 3b 0a 20 20 0a 20 20 70 57   *pItem;.  .  pW
2e630 43 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57  C = pBuilder->pW
2e640 43 3b 0a 20 20 70 57 43 45 6e 64 20 3d 20 70 57  C;.  pWCEnd = pW
2e650 43 2d 3e 61 20 2b 20 70 57 43 2d 3e 6e 54 65 72  C->a + pWC->nTer
2e660 6d 3b 0a 20 20 70 4e 65 77 20 3d 20 70 42 75 69  m;.  pNew = pBui
2e670 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 6d 65  lder->pNew;.  me
2e680 6d 73 65 74 28 26 73 53 75 6d 2c 20 30 2c 20 73  mset(&sSum, 0, s
2e690 69 7a 65 6f 66 28 73 53 75 6d 29 29 3b 0a 20 20  izeof(sSum));.  
2e6a0 70 49 74 65 6d 20 3d 20 70 57 49 6e 66 6f 2d 3e  pItem = pWInfo->
2e6b0 70 54 61 62 4c 69 73 74 2d 3e 61 20 2b 20 70 4e  pTabList->a + pN
2e6c0 65 77 2d 3e 69 54 61 62 3b 0a 20 20 69 43 75 72  ew->iTab;.  iCur
2e6d0 20 3d 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f   = pItem->iCurso
2e6e0 72 3b 0a 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d  r;..  for(pTerm=
2e6f0 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 57  pWC->a; pTerm<pW
2e700 43 45 6e 64 20 26 26 20 72 63 3d 3d 53 51 4c 49  CEnd && rc==SQLI
2e710 54 45 5f 4f 4b 3b 20 70 54 65 72 6d 2b 2b 29 7b  TE_OK; pTerm++){
2e720 0a 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d  .    if( (pTerm-
2e730 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
2e740 4f 52 29 21 3d 30 0a 20 20 20 20 20 26 26 20 28  OR)!=0.     && (
2e750 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f  pTerm->u.pOrInfo
2e760 2d 3e 69 6e 64 65 78 61 62 6c 65 20 26 20 70 4e  ->indexable & pN
2e770 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 29 21 3d 30  ew->maskSelf)!=0
2e780 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 57   .    ){.      W
2e790 68 65 72 65 43 6c 61 75 73 65 20 2a 20 63 6f 6e  hereClause * con
2e7a0 73 74 20 70 4f 72 57 43 20 3d 20 26 70 54 65 72  st pOrWC = &pTer
2e7b0 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 77 63  m->u.pOrInfo->wc
2e7c0 3b 0a 20 20 20 20 20 20 57 68 65 72 65 54 65 72  ;.      WhereTer
2e7d0 6d 20 2a 20 63 6f 6e 73 74 20 70 4f 72 57 43 45  m * const pOrWCE
2e7e0 6e 64 20 3d 20 26 70 4f 72 57 43 2d 3e 61 5b 70  nd = &pOrWC->a[p
2e7f0 4f 72 57 43 2d 3e 6e 54 65 72 6d 5d 3b 0a 20 20  OrWC->nTerm];.  
2e800 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
2e810 4f 72 54 65 72 6d 3b 0a 20 20 20 20 20 20 69 6e  OrTerm;.      in
2e820 74 20 6f 6e 63 65 20 3d 20 31 3b 0a 20 20 20 20  t once = 1;.    
2e830 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20    int i, j;.    
2e840 0a 20 20 20 20 20 20 73 53 75 62 42 75 69 6c 64  .      sSubBuild
2e850 20 3d 20 2a 70 42 75 69 6c 64 65 72 3b 0a 20 20   = *pBuilder;.  
2e860 20 20 20 20 73 53 75 62 42 75 69 6c 64 2e 70 4f      sSubBuild.pO
2e870 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20  rderBy = 0;.    
2e880 20 20 73 53 75 62 42 75 69 6c 64 2e 70 4f 72 53    sSubBuild.pOrS
2e890 65 74 20 3d 20 26 73 43 75 72 3b 0a 0a 20 20 20  et = &sCur;..   
2e8a0 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78     WHERETRACE(0x
2e8b0 32 30 30 2c 20 28 22 42 65 67 69 6e 20 70 72 6f  200, ("Begin pro
2e8c0 63 65 73 73 69 6e 67 20 4f 52 2d 63 6c 61 75 73  cessing OR-claus
2e8d0 65 20 25 70 5c 6e 22 2c 20 70 54 65 72 6d 29 29  e %p\n", pTerm))
2e8e0 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 4f 72 54  ;.      for(pOrT
2e8f0 65 72 6d 3d 70 4f 72 57 43 2d 3e 61 3b 20 70 4f  erm=pOrWC->a; pO
2e900 72 54 65 72 6d 3c 70 4f 72 57 43 45 6e 64 3b 20  rTerm<pOrWCEnd; 
2e910 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  pOrTerm++){.    
2e920 20 20 20 20 69 66 28 20 28 70 4f 72 54 65 72 6d      if( (pOrTerm
2e930 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
2e940 5f 41 4e 44 29 21 3d 30 20 29 7b 0a 20 20 20 20  _AND)!=0 ){.    
2e950 20 20 20 20 20 20 73 53 75 62 42 75 69 6c 64 2e        sSubBuild.
2e960 70 57 43 20 3d 20 26 70 4f 72 54 65 72 6d 2d 3e  pWC = &pOrTerm->
2e970 75 2e 70 41 6e 64 49 6e 66 6f 2d 3e 77 63 3b 0a  u.pAndInfo->wc;.
2e980 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
2e990 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43  ( pOrTerm->leftC
2e9a0 75 72 73 6f 72 3d 3d 69 43 75 72 20 29 7b 0a 20  ursor==iCur ){. 
2e9b0 20 20 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e           tempWC.
2e9c0 70 57 49 6e 66 6f 20 3d 20 70 57 43 2d 3e 70 57  pWInfo = pWC->pW
2e9d0 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 20 20  Info;.          
2e9e0 74 65 6d 70 57 43 2e 70 4f 75 74 65 72 20 3d 20  tempWC.pOuter = 
2e9f0 70 57 43 3b 0a 20 20 20 20 20 20 20 20 20 20 74  pWC;.          t
2ea00 65 6d 70 57 43 2e 6f 70 20 3d 20 54 4b 5f 41 4e  empWC.op = TK_AN
2ea10 44 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 6d  D;.          tem
2ea20 70 57 43 2e 6e 54 65 72 6d 20 3d 20 31 3b 0a 20  pWC.nTerm = 1;. 
2ea30 20 20 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e           tempWC.
2ea40 61 20 3d 20 70 4f 72 54 65 72 6d 3b 0a 20 20 20  a = pOrTerm;.   
2ea50 20 20 20 20 20 20 20 73 53 75 62 42 75 69 6c 64         sSubBuild
2ea60 2e 70 57 43 20 3d 20 26 74 65 6d 70 57 43 3b 0a  .pWC = &tempWC;.
2ea70 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
2ea80 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
2ea90 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
2eaa0 20 20 20 20 20 73 43 75 72 2e 6e 20 3d 20 30 3b       sCur.n = 0;
2eab0 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41  .#ifdef WHERETRA
2eac0 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20 20  CE_ENABLED.     
2ead0 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78     WHERETRACE(0x
2eae0 32 30 30 2c 20 28 22 4f 52 2d 74 65 72 6d 20 25  200, ("OR-term %
2eaf0 64 20 6f 66 20 25 70 20 68 61 73 20 25 64 20 73  d of %p has %d s
2eb00 75 62 74 65 72 6d 73 3a 5c 6e 22 2c 20 0a 20 20  ubterms:\n", .  
2eb10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2eb20 20 28 69 6e 74 29 28 70 4f 72 54 65 72 6d 2d 70   (int)(pOrTerm-p
2eb30 4f 72 57 43 2d 3e 61 29 2c 20 70 54 65 72 6d 2c  OrWC->a), pTerm,
2eb40 20 73 53 75 62 42 75 69 6c 64 2e 70 57 43 2d 3e   sSubBuild.pWC->
2eb50 6e 54 65 72 6d 29 29 3b 0a 20 20 20 20 20 20 20  nTerm));.       
2eb60 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72   if( sqlite3Wher
2eb70 65 54 72 61 63 65 20 26 20 30 78 34 30 30 20 29  eTrace & 0x400 )
2eb80 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  {.          for(
2eb90 69 3d 30 3b 20 69 3c 73 53 75 62 42 75 69 6c 64  i=0; i<sSubBuild
2eba0 2e 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b  .pWC->nTerm; i++
2ebb0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 77  ){.            w
2ebc0 68 65 72 65 54 65 72 6d 50 72 69 6e 74 28 26 73  hereTermPrint(&s
2ebd0 53 75 62 42 75 69 6c 64 2e 70 57 43 2d 3e 61 5b  SubBuild.pWC->a[
2ebe0 69 5d 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20  i], i);.        
2ebf0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 23 65    }.        }.#e
2ec00 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c  ndif.#ifndef SQL
2ec10 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
2ec20 54 41 42 4c 45 0a 20 20 20 20 20 20 20 20 69 66  TABLE.        if
2ec30 28 20 49 73 56 69 72 74 75 61 6c 28 70 49 74 65  ( IsVirtual(pIte
2ec40 6d 2d 3e 70 54 61 62 29 20 29 7b 0a 20 20 20 20  m->pTab) ){.    
2ec50 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65        rc = where
2ec60 4c 6f 6f 70 41 64 64 56 69 72 74 75 61 6c 28 26  LoopAddVirtual(&
2ec70 73 53 75 62 42 75 69 6c 64 2c 20 6d 45 78 74 72  sSubBuild, mExtr
2ec80 61 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  a);.        }els
2ec90 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20  e.#endif.       
2eca0 20 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20   {.          rc 
2ecb0 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74  = whereLoopAddBt
2ecc0 72 65 65 28 26 73 53 75 62 42 75 69 6c 64 2c 20  ree(&sSubBuild, 
2ecd0 6d 45 78 74 72 61 29 3b 0a 20 20 20 20 20 20 20  mExtra);.       
2ece0 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72   }.        if( r
2ecf0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2ed00 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 77            rc = w
2ed10 68 65 72 65 4c 6f 6f 70 41 64 64 4f 72 28 26 73  hereLoopAddOr(&s
2ed20 53 75 62 42 75 69 6c 64 2c 20 6d 45 78 74 72 61  SubBuild, mExtra
2ed30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
2ed40 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d       assert( rc=
2ed50 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 43  =SQLITE_OK || sC
2ed60 75 72 2e 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ur.n==0 );.     
2ed70 20 20 20 69 66 28 20 73 43 75 72 2e 6e 3d 3d 30     if( sCur.n==0
2ed80 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 53   ){.          sS
2ed90 75 6d 2e 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  um.n = 0;.      
2eda0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
2edb0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 6e 63     }else if( onc
2edc0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 77  e ){.          w
2edd0 68 65 72 65 4f 72 4d 6f 76 65 28 26 73 53 75 6d  hereOrMove(&sSum
2ede0 2c 20 26 73 43 75 72 29 3b 0a 20 20 20 20 20 20  , &sCur);.      
2edf0 20 20 20 20 6f 6e 63 65 20 3d 20 30 3b 0a 20 20      once = 0;.  
2ee00 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2ee10 20 20 20 20 20 20 20 57 68 65 72 65 4f 72 53 65         WhereOrSe
2ee20 74 20 73 50 72 65 76 3b 0a 20 20 20 20 20 20 20  t sPrev;.       
2ee30 20 20 20 77 68 65 72 65 4f 72 4d 6f 76 65 28 26     whereOrMove(&
2ee40 73 50 72 65 76 2c 20 26 73 53 75 6d 29 3b 0a 20  sPrev, &sSum);. 
2ee50 20 20 20 20 20 20 20 20 20 73 53 75 6d 2e 6e 20           sSum.n 
2ee60 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 66  = 0;.          f
2ee70 6f 72 28 69 3d 30 3b 20 69 3c 73 50 72 65 76 2e  or(i=0; i<sPrev.
2ee80 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  n; i++){.       
2ee90 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
2eea0 73 43 75 72 2e 6e 3b 20 6a 2b 2b 29 7b 0a 20 20  sCur.n; j++){.  
2eeb0 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72              wher
2eec0 65 4f 72 49 6e 73 65 72 74 28 26 73 53 75 6d 2c  eOrInsert(&sSum,
2eed0 20 73 50 72 65 76 2e 61 5b 69 5d 2e 70 72 65 72   sPrev.a[i].prer
2eee0 65 71 20 7c 20 73 43 75 72 2e 61 5b 6a 5d 2e 70  eq | sCur.a[j].p
2eef0 72 65 72 65 71 2c 0a 20 20 20 20 20 20 20 20 20  rereq,.         
2ef00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ef10 20 20 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74     sqlite3LogEst
2ef20 41 64 64 28 73 50 72 65 76 2e 61 5b 69 5d 2e 72  Add(sPrev.a[i].r
2ef30 52 75 6e 2c 20 73 43 75 72 2e 61 5b 6a 5d 2e 72  Run, sCur.a[j].r
2ef40 52 75 6e 29 2c 0a 20 20 20 20 20 20 20 20 20 20  Run),.          
2ef50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ef60 20 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41    sqlite3LogEstA
2ef70 64 64 28 73 50 72 65 76 2e 61 5b 69 5d 2e 6e 4f  dd(sPrev.a[i].nO
2ef80 75 74 2c 20 73 43 75 72 2e 61 5b 6a 5d 2e 6e 4f  ut, sCur.a[j].nO
2ef90 75 74 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ut));.          
2efa0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
2efb0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2efc0 7d 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4c  }.      pNew->nL
2efd0 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20  Term = 1;.      
2efe0 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 30 5d 20  pNew->aLTerm[0] 
2eff0 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 70  = pTerm;.      p
2f000 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57  New->wsFlags = W
2f010 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 3b 0a 20  HERE_MULTI_OR;. 
2f020 20 20 20 20 20 70 4e 65 77 2d 3e 72 53 65 74 75       pNew->rSetu
2f030 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4e 65  p = 0;.      pNe
2f040 77 2d 3e 69 53 6f 72 74 49 64 78 20 3d 20 30 3b  w->iSortIdx = 0;
2f050 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 70  .      memset(&p
2f060 4e 65 77 2d 3e 75 2c 20 30 2c 20 73 69 7a 65 6f  New->u, 0, sizeo
2f070 66 28 70 4e 65 77 2d 3e 75 29 29 3b 0a 20 20 20  f(pNew->u));.   
2f080 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d     for(i=0; rc==
2f090 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 73  SQLITE_OK && i<s
2f0a0 53 75 6d 2e 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  Sum.n; i++){.   
2f0b0 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20       /* TUNING: 
2f0c0 43 75 72 72 65 6e 74 6c 79 20 73 53 75 6d 2e 61  Currently sSum.a
2f0d0 5b 69 5d 2e 72 52 75 6e 20 69 73 20 73 65 74 20  [i].rRun is set 
2f0e0 74 6f 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68  to the sum of th
2f0f0 65 20 63 6f 73 74 73 0a 20 20 20 20 20 20 20 20  e costs.        
2f100 2a 2a 20 6f 66 20 61 6c 6c 20 73 75 62 2d 73 63  ** of all sub-sc
2f110 61 6e 73 20 72 65 71 75 69 72 65 64 20 62 79 20  ans required by 
2f120 74 68 65 20 4f 52 2d 73 63 61 6e 2e 20 48 6f 77  the OR-scan. How
2f130 65 76 65 72 2c 20 64 75 65 20 74 6f 20 72 6f 75  ever, due to rou
2f140 6e 64 69 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a  nding.        **
2f150 20 65 72 72 6f 72 73 2c 20 69 74 20 6d 61 79 20   errors, it may 
2f160 62 65 20 74 68 61 74 20 74 68 65 20 63 6f 73 74  be that the cost
2f170 20 6f 66 20 74 68 65 20 4f 52 2d 73 63 61 6e 20   of the OR-scan 
2f180 69 73 20 65 71 75 61 6c 20 74 6f 20 69 74 73 0a  is equal to its.
2f190 20 20 20 20 20 20 20 20 2a 2a 20 6d 6f 73 74 20          ** most 
2f1a0 65 78 70 65 6e 73 69 76 65 20 73 75 62 2d 73 63  expensive sub-sc
2f1b0 61 6e 2e 20 41 64 64 20 74 68 65 20 73 6d 61 6c  an. Add the smal
2f1c0 6c 65 73 74 20 70 6f 73 73 69 62 6c 65 20 70 65  lest possible pe
2f1d0 6e 61 6c 74 79 20 0a 20 20 20 20 20 20 20 20 2a  nalty .        *
2f1e0 2a 20 28 65 71 75 69 76 61 6c 65 6e 74 20 74 6f  * (equivalent to
2f1f0 20 6d 75 6c 74 69 70 6c 79 69 6e 67 20 74 68 65   multiplying the
2f200 20 63 6f 73 74 20 62 79 20 31 2e 30 37 29 20 74   cost by 1.07) t
2f210 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 0a 20  o ensure that . 
2f220 20 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 64         ** this d
2f230 6f 65 73 20 6e 6f 74 20 68 61 70 70 65 6e 2e 20  oes not happen. 
2f240 4f 74 68 65 72 77 69 73 65 2c 20 66 6f 72 20 57  Otherwise, for W
2f250 48 45 52 45 20 63 6c 61 75 73 65 73 20 73 75 63  HERE clauses suc
2f260 68 20 61 73 20 74 68 65 0a 20 20 20 20 20 20 20  h as the.       
2f270 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 77 68   ** following wh
2f280 65 72 65 20 74 68 65 72 65 20 69 73 20 61 6e 20  ere there is an 
2f290 69 6e 64 65 78 20 6f 6e 20 22 79 22 3a 0a 20 20  index on "y":.  
2f2a0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
2f2b0 20 2a 2a 20 20 20 20 20 57 48 45 52 45 20 6c 69   **     WHERE li
2f2c0 6b 65 6c 69 68 6f 6f 64 28 78 3d 3f 2c 20 30 2e  kelihood(x=?, 0.
2f2d0 39 39 29 20 4f 52 20 79 3d 3f 0a 20 20 20 20 20  99) OR y=?.     
2f2e0 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
2f2f0 20 74 68 65 20 70 6c 61 6e 6e 65 72 20 6d 61 79   the planner may
2f300 20 65 6c 65 63 74 20 74 6f 20 22 4f 52 22 20 74   elect to "OR" t
2f310 6f 67 65 74 68 65 72 20 61 20 66 75 6c 6c 2d 74  ogether a full-t
2f320 61 62 6c 65 20 73 63 61 6e 20 61 6e 64 20 61 6e  able scan and an
2f330 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 64 65  .        ** inde
2f340 78 20 6c 6f 6f 6b 75 70 2e 20 41 6e 64 20 6f 74  x lookup. And ot
2f350 68 65 72 20 73 69 6d 69 6c 61 72 6c 79 20 6f 64  her similarly od
2f360 64 20 72 65 73 75 6c 74 73 2e 20 20 2a 2f 0a 20  d results.  */. 
2f370 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75         pNew->rRu
2f380 6e 20 3d 20 73 53 75 6d 2e 61 5b 69 5d 2e 72 52  n = sSum.a[i].rR
2f390 75 6e 20 2b 20 31 3b 0a 20 20 20 20 20 20 20 20  un + 1;.        
2f3a0 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 53 75  pNew->nOut = sSu
2f3b0 6d 2e 61 5b 69 5d 2e 6e 4f 75 74 3b 0a 20 20 20  m.a[i].nOut;.   
2f3c0 20 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65       pNew->prere
2f3d0 71 20 3d 20 73 53 75 6d 2e 61 5b 69 5d 2e 70 72  q = sSum.a[i].pr
2f3e0 65 72 65 71 3b 0a 20 20 20 20 20 20 20 20 72 63  ereq;.        rc
2f3f0 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65   = whereLoopInse
2f400 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e 65  rt(pBuilder, pNe
2f410 77 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  w);.      }.    
2f420 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78 32    WHERETRACE(0x2
2f430 30 30 2c 20 28 22 45 6e 64 20 70 72 6f 63 65 73  00, ("End proces
2f440 73 69 6e 67 20 4f 52 2d 63 6c 61 75 73 65 20 25  sing OR-clause %
2f450 70 5c 6e 22 2c 20 70 54 65 72 6d 29 29 3b 0a 20  p\n", pTerm));. 
2f460 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
2f470 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
2f480 64 64 20 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70  dd all WhereLoop
2f490 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 61 6c 6c   objects for all
2f4a0 20 74 61 62 6c 65 73 20 0a 2a 2f 0a 73 74 61 74   tables .*/.stat
2f4b0 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70  ic int whereLoop
2f4c0 41 64 64 41 6c 6c 28 57 68 65 72 65 4c 6f 6f 70  AddAll(WhereLoop
2f4d0 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65  Builder *pBuilde
2f4e0 72 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20  r){.  WhereInfo 
2f4f0 2a 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64  *pWInfo = pBuild
2f500 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 42 69  er->pWInfo;.  Bi
2f510 74 6d 61 73 6b 20 6d 45 78 74 72 61 20 3d 20 30  tmask mExtra = 0
2f520 3b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 50 72 69  ;.  Bitmask mPri
2f530 6f 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 54  or = 0;.  int iT
2f540 61 62 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  ab;.  SrcList *p
2f550 54 61 62 4c 69 73 74 20 3d 20 70 57 49 6e 66 6f  TabList = pWInfo
2f560 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20 20 73 74  ->pTabList;.  st
2f570 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
2f580 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 73 71 6c 69  m *pItem;.  sqli
2f590 74 65 33 20 2a 64 62 20 3d 20 70 57 49 6e 66 6f  te3 *db = pWInfo
2f5a0 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  ->pParse->db;.  
2f5b0 69 6e 74 20 6e 54 61 62 4c 69 73 74 20 3d 20 70  int nTabList = p
2f5c0 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 0a 20  WInfo->nLevel;. 
2f5d0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
2f5e0 5f 4f 4b 3b 0a 20 20 75 38 20 70 72 69 6f 72 4a  _OK;.  u8 priorJ
2f5f0 6f 69 6e 54 79 70 65 20 3d 20 30 3b 0a 20 20 57  oinType = 0;.  W
2f600 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a  hereLoop *pNew;.
2f610 0a 20 20 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72 20  .  /* Loop over 
2f620 74 68 65 20 74 61 62 6c 65 73 20 69 6e 20 74 68  the tables in th
2f630 65 20 6a 6f 69 6e 2c 20 66 72 6f 6d 20 6c 65 66  e join, from lef
2f640 74 20 74 6f 20 72 69 67 68 74 20 2a 2f 0a 20 20  t to right */.  
2f650 70 4e 65 77 20 3d 20 70 42 75 69 6c 64 65 72 2d  pNew = pBuilder-
2f660 3e 70 4e 65 77 3b 0a 20 20 77 68 65 72 65 4c 6f  >pNew;.  whereLo
2f670 6f 70 49 6e 69 74 28 70 4e 65 77 29 3b 0a 20 20  opInit(pNew);.  
2f680 66 6f 72 28 69 54 61 62 3d 30 2c 20 70 49 74 65  for(iTab=0, pIte
2f690 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69  m=pTabList->a; i
2f6a0 54 61 62 3c 6e 54 61 62 4c 69 73 74 3b 20 69 54  Tab<nTabList; iT
2f6b0 61 62 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a  ab++, pItem++){.
2f6c0 20 20 20 20 70 4e 65 77 2d 3e 69 54 61 62 20 3d      pNew->iTab =
2f6d0 20 69 54 61 62 3b 0a 20 20 20 20 70 4e 65 77 2d   iTab;.    pNew-
2f6e0 3e 6d 61 73 6b 53 65 6c 66 20 3d 20 67 65 74 4d  >maskSelf = getM
2f6f0 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61  ask(&pWInfo->sMa
2f700 73 6b 53 65 74 2c 20 70 49 74 65 6d 2d 3e 69 43  skSet, pItem->iC
2f710 75 72 73 6f 72 29 3b 0a 20 20 20 20 69 66 28 20  ursor);.    if( 
2f720 28 28 70 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70  ((pItem->jointyp
2f730 65 7c 70 72 69 6f 72 4a 6f 69 6e 54 79 70 65 29  e|priorJoinType)
2f740 20 26 20 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f 43   & (JT_LEFT|JT_C
2f750 52 4f 53 53 29 29 21 3d 30 20 29 7b 0a 20 20 20  ROSS))!=0 ){.   
2f760 20 20 20 6d 45 78 74 72 61 20 3d 20 6d 50 72 69     mExtra = mPri
2f770 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 72  or;.    }.    pr
2f780 69 6f 72 4a 6f 69 6e 54 79 70 65 20 3d 20 70 49  iorJoinType = pI
2f790 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 3b 0a 20  tem->jointype;. 
2f7a0 20 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c     if( IsVirtual
2f7b0 28 70 49 74 65 6d 2d 3e 70 54 61 62 29 20 29 7b  (pItem->pTab) ){
2f7c0 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72  .      rc = wher
2f7d0 65 4c 6f 6f 70 41 64 64 56 69 72 74 75 61 6c 28  eLoopAddVirtual(
2f7e0 70 42 75 69 6c 64 65 72 2c 20 6d 45 78 74 72 61  pBuilder, mExtra
2f7f0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
2f800 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f      rc = whereLo
2f810 6f 70 41 64 64 42 74 72 65 65 28 70 42 75 69 6c  opAddBtree(pBuil
2f820 64 65 72 2c 20 6d 45 78 74 72 61 29 3b 0a 20 20  der, mExtra);.  
2f830 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
2f840 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2f850 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f     rc = whereLoo
2f860 70 41 64 64 4f 72 28 70 42 75 69 6c 64 65 72 2c  pAddOr(pBuilder,
2f870 20 6d 45 78 74 72 61 29 3b 0a 20 20 20 20 7d 0a   mExtra);.    }.
2f880 20 20 20 20 6d 50 72 69 6f 72 20 7c 3d 20 70 4e      mPrior |= pN
2f890 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20  ew->maskSelf;.  
2f8a0 20 20 69 66 28 20 72 63 20 7c 7c 20 64 62 2d 3e    if( rc || db->
2f8b0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 62  mallocFailed ) b
2f8c0 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 77 68 65 72  reak;.  }.  wher
2f8d0 65 4c 6f 6f 70 43 6c 65 61 72 28 64 62 2c 20 70  eLoopClear(db, p
2f8e0 4e 65 77 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  New);.  return r
2f8f0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 61 6d  c;.}../*.** Exam
2f900 69 6e 65 20 61 20 57 68 65 72 65 50 61 74 68 20  ine a WherePath 
2f910 28 77 69 74 68 20 74 68 65 20 61 64 64 69 74 69  (with the additi
2f920 6f 6e 20 6f 66 20 74 68 65 20 65 78 74 72 61 20  on of the extra 
2f930 57 68 65 72 65 4c 6f 6f 70 20 6f 66 20 74 68 65  WhereLoop of the
2f940 20 35 74 68 0a 2a 2a 20 70 61 72 61 6d 65 74 65   5th.** paramete
2f950 72 73 29 20 74 6f 20 73 65 65 20 69 66 20 69 74  rs) to see if it
2f960 20 6f 75 74 70 75 74 73 20 72 6f 77 73 20 69 6e   outputs rows in
2f970 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 4f   the requested O
2f980 52 44 45 52 20 42 59 0a 2a 2a 20 28 6f 72 20 47  RDER BY.** (or G
2f990 52 4f 55 50 20 42 59 29 20 77 69 74 68 6f 75 74  ROUP BY) without
2f9a0 20 72 65 71 75 69 72 69 6e 67 20 61 20 73 65 70   requiring a sep
2f9b0 61 72 61 74 65 20 73 6f 72 74 20 6f 70 65 72 61  arate sort opera
2f9c0 74 69 6f 6e 2e 20 20 52 65 74 75 72 6e 20 4e 3a  tion.  Return N:
2f9d0 0a 2a 2a 20 0a 2a 2a 20 20 20 4e 3e 30 3a 20 20  .** .**   N>0:  
2f9e0 20 4e 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20   N terms of the 
2f9f0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
2fa00 61 72 65 20 73 61 74 69 73 66 69 65 64 0a 2a 2a  are satisfied.**
2fa10 20 20 20 4e 3d 3d 30 3a 20 20 4e 6f 20 74 65 72     N==0:  No ter
2fa20 6d 73 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20  ms of the ORDER 
2fa30 42 59 20 63 6c 61 75 73 65 20 61 72 65 20 73 61  BY clause are sa
2fa40 74 69 73 66 69 65 64 0a 2a 2a 20 20 20 4e 3c 30  tisfied.**   N<0
2fa50 3a 20 20 20 55 6e 6b 6e 6f 77 6e 20 79 65 74 20  :   Unknown yet 
2fa60 68 6f 77 20 6d 61 6e 79 20 74 65 72 6d 73 20 6f  how many terms o
2fa70 66 20 4f 52 44 45 52 20 42 59 20 6d 69 67 68 74  f ORDER BY might
2fa80 20 62 65 20 73 61 74 69 73 66 69 65 64 2e 20 20   be satisfied.  
2fa90 20 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61   .**.** Note tha
2faa0 74 20 70 72 6f 63 65 73 73 69 6e 67 20 66 6f 72  t processing for
2fab0 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20 61   WHERE_GROUPBY a
2fac0 6e 64 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43  nd WHERE_DISTINC
2fad0 54 42 59 20 69 73 20 6e 6f 74 20 61 73 0a 2a 2a  TBY is not as.**
2fae0 20 73 74 72 69 63 74 2e 20 20 57 69 74 68 20 47   strict.  With G
2faf0 52 4f 55 50 20 42 59 20 61 6e 64 20 44 49 53 54  ROUP BY and DIST
2fb00 49 4e 43 54 20 74 68 65 20 6f 6e 6c 79 20 72 65  INCT the only re
2fb10 71 75 69 72 65 6d 65 6e 74 20 69 73 20 74 68 61  quirement is tha
2fb20 74 0a 2a 2a 20 65 71 75 69 76 61 6c 65 6e 74 20  t.** equivalent 
2fb30 72 6f 77 73 20 61 70 70 65 61 72 20 69 6d 6d 65  rows appear imme
2fb40 64 69 61 74 65 6c 79 20 61 64 6a 61 63 65 6e 74  diately adjacent
2fb50 20 74 6f 20 6f 6e 65 20 61 6e 6f 74 68 65 72 2e   to one another.
2fb60 20 20 47 52 4f 55 50 20 42 59 0a 2a 2a 20 61 6e    GROUP BY.** an
2fb70 64 20 44 49 53 54 49 4e 43 54 20 64 6f 20 6e 6f  d DISTINCT do no
2fb80 74 20 72 65 71 75 69 72 65 20 72 6f 77 73 20 74  t require rows t
2fb90 6f 20 61 70 70 65 61 72 20 69 6e 20 61 6e 79 20  o appear in any 
2fba0 70 61 72 74 69 63 75 6c 61 72 20 6f 72 64 65 72  particular order
2fbb0 20 61 73 20 6c 6f 6e 67 0a 2a 2a 20 61 73 20 65   as long.** as e
2fbc0 71 75 69 76 61 6c 65 6e 74 20 72 6f 77 73 20 61  quivalent rows a
2fbd0 72 65 20 67 72 6f 75 70 65 64 20 74 6f 67 65 74  re grouped toget
2fbe0 68 65 72 2e 20 20 54 68 75 73 20 66 6f 72 20 47  her.  Thus for G
2fbf0 52 4f 55 50 20 42 59 20 61 6e 64 20 44 49 53 54  ROUP BY and DIST
2fc00 49 4e 43 54 0a 2a 2a 20 74 68 65 20 70 4f 72 64  INCT.** the pOrd
2fc10 65 72 42 79 20 74 65 72 6d 73 20 63 61 6e 20 62  erBy terms can b
2fc20 65 20 6d 61 74 63 68 65 64 20 69 6e 20 61 6e 79  e matched in any
2fc30 20 6f 72 64 65 72 2e 20 20 57 69 74 68 20 4f 52   order.  With OR
2fc40 44 45 52 20 42 59 2c 20 74 68 65 20 0a 2a 2a 20  DER BY, the .** 
2fc50 70 4f 72 64 65 72 42 79 20 74 65 72 6d 73 20 6d  pOrderBy terms m
2fc60 75 73 74 20 62 65 20 6d 61 74 63 68 65 64 20 69  ust be matched i
2fc70 6e 20 73 74 72 69 63 74 20 6c 65 66 74 2d 74 6f  n strict left-to
2fc80 2d 72 69 67 68 74 20 6f 72 64 65 72 2e 0a 2a 2f  -right order..*/
2fc90 0a 73 74 61 74 69 63 20 69 38 20 77 68 65 72 65  .static i8 where
2fca0 50 61 74 68 53 61 74 69 73 66 69 65 73 4f 72 64  PathSatisfiesOrd
2fcb0 65 72 42 79 28 0a 20 20 57 68 65 72 65 49 6e 66  erBy(.  WhereInf
2fcc0 6f 20 2a 70 57 49 6e 66 6f 2c 20 20 20 20 2f 2a  o *pWInfo,    /*
2fcd0 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
2fce0 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  e */.  ExprList 
2fcf0 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a 20  *pOrderBy,   /* 
2fd00 4f 52 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55  ORDER BY or GROU
2fd10 50 20 42 59 20 6f 72 20 44 49 53 54 49 4e 43 54  P BY or DISTINCT
2fd20 20 63 6c 61 75 73 65 20 74 6f 20 63 68 65 63 6b   clause to check
2fd30 20 2a 2f 0a 20 20 57 68 65 72 65 50 61 74 68 20   */.  WherePath 
2fd40 2a 70 50 61 74 68 2c 20 20 20 20 20 2f 2a 20 54  *pPath,     /* T
2fd50 68 65 20 57 68 65 72 65 50 61 74 68 20 74 6f 20  he WherePath to 
2fd60 63 68 65 63 6b 20 2a 2f 0a 20 20 75 31 36 20 77  check */.  u16 w
2fd70 63 74 72 6c 46 6c 61 67 73 2c 20 20 20 20 20 20  ctrlFlags,      
2fd80 20 2f 2a 20 4d 69 67 68 74 20 63 6f 6e 74 61 69   /* Might contai
2fd90 6e 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20  n WHERE_GROUPBY 
2fda0 6f 72 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43  or WHERE_DISTINC
2fdb0 54 42 59 20 2a 2f 0a 20 20 75 31 36 20 6e 4c 6f  TBY */.  u16 nLo
2fdc0 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  op,            /
2fdd0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72  * Number of entr
2fde0 69 65 73 20 69 6e 20 70 50 61 74 68 2d 3e 61 4c  ies in pPath->aL
2fdf0 6f 6f 70 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65  oop[] */.  Where
2fe00 4c 6f 6f 70 20 2a 70 4c 61 73 74 2c 20 20 20 20  Loop *pLast,    
2fe10 20 2f 2a 20 41 64 64 20 74 68 69 73 20 57 68 65   /* Add this Whe
2fe20 72 65 4c 6f 6f 70 20 74 6f 20 74 68 65 20 65 6e  reLoop to the en
2fe30 64 20 6f 66 20 70 50 61 74 68 2d 3e 61 4c 6f 6f  d of pPath->aLoo
2fe40 70 5b 5d 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  p[] */.  Bitmask
2fe50 20 2a 70 52 65 76 4d 61 73 6b 20 20 20 20 20 2f   *pRevMask     /
2fe60 2a 20 4f 55 54 3a 20 4d 61 73 6b 20 6f 66 20 57  * OUT: Mask of W
2fe70 68 65 72 65 4c 6f 6f 70 73 20 74 6f 20 72 75 6e  hereLoops to run
2fe80 20 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65   in reverse orde
2fe90 72 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 72 65 76  r */.){.  u8 rev
2fea0 53 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  Set;            
2feb0 2f 2a 20 54 72 75 65 20 69 66 20 72 65 76 20 69  /* True if rev i
2fec0 73 20 6b 6e 6f 77 6e 20 2a 2f 0a 20 20 75 38 20  s known */.  u8 
2fed0 72 65 76 3b 20 20 20 20 20 20 20 20 20 20 20 20  rev;            
2fee0 20 20 20 2f 2a 20 43 6f 6d 70 6f 73 69 74 65 20     /* Composite 
2fef0 73 6f 72 74 20 6f 72 64 65 72 20 2a 2f 0a 20 20  sort order */.  
2ff00 75 38 20 72 65 76 49 64 78 3b 20 20 20 20 20 20  u8 revIdx;      
2ff10 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 73        /* Index s
2ff20 6f 72 74 20 6f 72 64 65 72 20 2a 2f 0a 20 20 75  ort order */.  u
2ff30 38 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63  8 isOrderDistinc
2ff40 74 3b 20 20 20 2f 2a 20 41 6c 6c 20 70 72 69 6f  t;   /* All prio
2ff50 72 20 57 68 65 72 65 4c 6f 6f 70 73 20 61 72 65  r WhereLoops are
2ff60 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74 20   order-distinct 
2ff70 2a 2f 0a 20 20 75 38 20 64 69 73 74 69 6e 63 74  */.  u8 distinct
2ff80 43 6f 6c 75 6d 6e 73 3b 20 20 20 2f 2a 20 54 72  Columns;   /* Tr
2ff90 75 65 20 69 66 20 74 68 65 20 6c 6f 6f 70 20 68  ue if the loop h
2ffa0 61 73 20 55 4e 49 51 55 45 20 4e 4f 54 20 4e 55  as UNIQUE NOT NU
2ffb0 4c 4c 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20  LL columns */.  
2ffc0 75 38 20 69 73 4d 61 74 63 68 3b 20 20 20 20 20  u8 isMatch;     
2ffd0 20 20 20 20 20 20 2f 2a 20 69 43 6f 6c 75 6d 6e        /* iColumn
2ffe0 20 6d 61 74 63 68 65 73 20 61 20 74 65 72 6d 20   matches a term 
2fff0 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  of the ORDER BY 
30000 63 6c 61 75 73 65 20 2a 2f 0a 20 20 75 31 36 20  clause */.  u16 
30010 6e 4b 65 79 43 6f 6c 3b 20 20 20 20 20 20 20 20  nKeyCol;        
30020 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6b    /* Number of k
30030 65 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 70 49  ey columns in pI
30040 6e 64 65 78 20 2a 2f 0a 20 20 75 31 36 20 6e 43  ndex */.  u16 nC
30050 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20 20 20  olumn;          
30060 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20  /* Total number 
30070 6f 66 20 6f 72 64 65 72 65 64 20 63 6f 6c 75 6d  of ordered colum
30080 6e 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78 20  ns in the index 
30090 2a 2f 0a 20 20 75 31 36 20 6e 4f 72 64 65 72 42  */.  u16 nOrderB
300a0 79 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  y;         /* Nu
300b0 6d 62 65 72 20 74 65 72 6d 73 20 69 6e 20 74 68  mber terms in th
300c0 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
300d0 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 6f 6f 70  e */.  int iLoop
300e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
300f0 49 6e 64 65 78 20 6f 66 20 57 68 65 72 65 4c 6f  Index of WhereLo
30100 6f 70 20 69 6e 20 70 50 61 74 68 20 62 65 69 6e  op in pPath bein
30110 67 20 70 72 6f 63 65 73 73 65 64 20 2a 2f 0a 20  g processed */. 
30120 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20   int i, j;      
30130 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
30140 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74  ounters */.  int
30150 20 69 43 75 72 3b 20 20 20 20 20 20 20 20 20 20   iCur;          
30160 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d     /* Cursor num
30170 62 65 72 20 66 6f 72 20 63 75 72 72 65 6e 74 20  ber for current 
30180 57 68 65 72 65 4c 6f 6f 70 20 2a 2f 0a 20 20 69  WhereLoop */.  i
30190 6e 74 20 69 43 6f 6c 75 6d 6e 3b 20 20 20 20 20  nt iColumn;     
301a0 20 20 20 20 20 2f 2a 20 41 20 63 6f 6c 75 6d 6e       /* A column
301b0 20 6e 75 6d 62 65 72 20 77 69 74 68 69 6e 20 74   number within t
301c0 61 62 6c 65 20 69 43 75 72 20 2a 2f 0a 20 20 57  able iCur */.  W
301d0 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 20  hereLoop *pLoop 
301e0 3d 20 30 3b 20 2f 2a 20 43 75 72 72 65 6e 74 20  = 0; /* Current 
301f0 57 68 65 72 65 4c 6f 6f 70 20 62 65 69 6e 67 20  WhereLoop being 
30200 70 72 6f 63 65 73 73 65 64 2e 20 2a 2f 0a 20 20  processed. */.  
30210 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
30220 3b 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c  ;     /* A singl
30230 65 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48  e term of the WH
30240 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
30250 45 78 70 72 20 2a 70 4f 42 45 78 70 72 3b 20 20  Expr *pOBExpr;  
30260 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 70 72        /* An expr
30270 65 73 73 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20  ession from the 
30280 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
30290 2a 2f 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  */.  CollSeq *pC
302a0 6f 6c 6c 3b 20 20 20 20 20 20 20 2f 2a 20 43 4f  oll;       /* CO
302b0 4c 4c 41 54 45 20 66 75 6e 63 74 69 6f 6e 20 66  LLATE function f
302c0 72 6f 6d 20 61 6e 20 4f 52 44 45 52 20 42 59 20  rom an ORDER BY 
302d0 63 6c 61 75 73 65 20 74 65 72 6d 20 2a 2f 0a 20  clause term */. 
302e0 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 20   Index *pIndex; 
302f0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e         /* The in
30300 64 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77  dex associated w
30310 69 74 68 20 70 4c 6f 6f 70 20 2a 2f 0a 20 20 73  ith pLoop */.  s
30320 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 57 49  qlite3 *db = pWI
30330 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b  nfo->pParse->db;
30340 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f    /* Database co
30350 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 42 69  nnection */.  Bi
30360 74 6d 61 73 6b 20 6f 62 53 61 74 20 3d 20 30 3b  tmask obSat = 0;
30370 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 4f      /* Mask of O
30380 52 44 45 52 20 42 59 20 74 65 72 6d 73 20 73 61  RDER BY terms sa
30390 74 69 73 66 69 65 64 20 73 6f 20 66 61 72 20 2a  tisfied so far *
303a0 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6f 62 44 6f  /.  Bitmask obDo
303b0 6e 65 3b 20 20 20 20 20 20 20 2f 2a 20 4d 61 73  ne;       /* Mas
303c0 6b 20 6f 66 20 61 6c 6c 20 4f 52 44 45 52 20 42  k of all ORDER B
303d0 59 20 74 65 72 6d 73 20 2a 2f 0a 20 20 42 69 74  Y terms */.  Bit
303e0 6d 61 73 6b 20 6f 72 64 65 72 44 69 73 74 69 6e  mask orderDistin
303f0 63 74 4d 61 73 6b 3b 20 20 2f 2a 20 4d 61 73 6b  ctMask;  /* Mask
30400 20 6f 66 20 61 6c 6c 20 77 65 6c 6c 2d 6f 72 64   of all well-ord
30410 65 72 65 64 20 6c 6f 6f 70 73 20 2a 2f 0a 20 20  ered loops */.  
30420 42 69 74 6d 61 73 6b 20 72 65 61 64 79 3b 20 20  Bitmask ready;  
30430 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
30440 61 73 6b 20 6f 66 20 69 6e 6e 65 72 20 6c 6f 6f  ask of inner loo
30450 70 73 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ps */..  /*.  **
30460 20 57 65 20 73 61 79 20 74 68 65 20 57 68 65 72   We say the Wher
30470 65 4c 6f 6f 70 20 69 73 20 22 6f 6e 65 2d 72 6f  eLoop is "one-ro
30480 77 22 20 69 66 20 69 74 20 67 65 6e 65 72 61 74  w" if it generat
30490 65 73 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20  es no more than 
304a0 6f 6e 65 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20  one.  ** row of 
304b0 6f 75 74 70 75 74 2e 20 20 41 20 57 68 65 72 65  output.  A Where
304c0 4c 6f 6f 70 20 69 73 20 6f 6e 65 2d 72 6f 77 20  Loop is one-row 
304d0 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f  if all of the fo
304e0 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65  llowing are true
304f0 3a 0a 20 20 2a 2a 20 20 28 61 29 20 41 6c 6c 20  :.  **  (a) All 
30500 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20 6d 61  index columns ma
30510 74 63 68 20 77 69 74 68 20 57 48 45 52 45 5f 43  tch with WHERE_C
30520 4f 4c 55 4d 4e 5f 45 51 2e 0a 20 20 2a 2a 20 20  OLUMN_EQ..  **  
30530 28 62 29 20 54 68 65 20 69 6e 64 65 78 20 69 73  (b) The index is
30540 20 75 6e 69 71 75 65 0a 20 20 2a 2a 20 41 6e 79   unique.  ** Any
30550 20 57 68 65 72 65 4c 6f 6f 70 20 77 69 74 68 20   WhereLoop with 
30560 61 6e 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  an WHERE_COLUMN_
30570 45 51 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e  EQ constraint on
30580 20 74 68 65 20 72 6f 77 69 64 20 69 73 20 6f 6e   the rowid is on
30590 65 2d 72 6f 77 2e 0a 20 20 2a 2a 20 45 76 65 72  e-row..  ** Ever
305a0 79 20 6f 6e 65 2d 72 6f 77 20 57 68 65 72 65 4c  y one-row WhereL
305b0 6f 6f 70 20 77 69 6c 6c 20 68 61 76 65 20 74 68  oop will have th
305c0 65 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 20 62  e WHERE_ONEROW b
305d0 69 74 20 73 65 74 20 69 6e 20 77 73 46 6c 61 67  it set in wsFlag
305e0 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 65 20  s..  **.  ** We 
305f0 73 61 79 20 74 68 65 20 57 68 65 72 65 4c 6f 6f  say the WhereLoo
30600 70 20 69 73 20 22 6f 72 64 65 72 2d 64 69 73 74  p is "order-dist
30610 69 6e 63 74 22 20 69 66 20 74 68 65 20 73 65 74  inct" if the set
30620 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d   of columns from
30630 0a 20 20 2a 2a 20 74 68 61 74 20 57 68 65 72 65  .  ** that Where
30640 4c 6f 6f 70 20 74 68 61 74 20 61 72 65 20 69 6e  Loop that are in
30650 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
30660 61 75 73 65 20 61 72 65 20 64 69 66 66 65 72 65  ause are differe
30670 6e 74 20 66 6f 72 20 65 76 65 72 79 0a 20 20 2a  nt for every.  *
30680 2a 20 72 6f 77 20 6f 66 20 74 68 65 20 57 68 65  * row of the Whe
30690 72 65 4c 6f 6f 70 2e 20 20 45 76 65 72 79 20 6f  reLoop.  Every o
306a0 6e 65 2d 72 6f 77 20 57 68 65 72 65 4c 6f 6f 70  ne-row WhereLoop
306b0 20 69 73 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c   is automaticall
306c0 79 0a 20 20 2a 2a 20 6f 72 64 65 72 2d 64 69 73  y.  ** order-dis
306d0 74 69 6e 63 74 2e 20 20 20 41 20 57 68 65 72 65  tinct.   A Where
306e0 4c 6f 6f 70 20 74 68 61 74 20 68 61 73 20 6e 6f  Loop that has no
306f0 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
30700 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 0a  ORDER BY clause.
30710 20 20 2a 2a 20 69 73 20 6e 6f 74 20 6f 72 64 65    ** is not orde
30720 72 2d 64 69 73 74 69 6e 63 74 2e 20 54 6f 20 62  r-distinct. To b
30730 65 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74  e order-distinct
30740 20 69 73 20 6e 6f 74 20 71 75 69 74 65 20 74 68   is not quite th
30750 65 20 73 61 6d 65 20 61 73 20 62 65 69 6e 67 0a  e same as being.
30760 20 20 2a 2a 20 55 4e 49 51 55 45 20 73 69 6e 63    ** UNIQUE sinc
30770 65 20 61 20 55 4e 49 51 55 45 20 63 6f 6c 75 6d  e a UNIQUE colum
30780 6e 20 6f 72 20 69 6e 64 65 78 20 63 61 6e 20 68  n or index can h
30790 61 76 65 20 6d 75 6c 74 69 70 6c 65 20 72 6f 77  ave multiple row
307a0 73 20 74 68 61 74 20 0a 20 20 2a 2a 20 61 72 65  s that .  ** are
307b0 20 4e 55 4c 4c 20 61 6e 64 20 4e 55 4c 4c 20 76   NULL and NULL v
307c0 61 6c 75 65 73 20 61 72 65 20 65 71 75 69 76 61  alues are equiva
307d0 6c 65 6e 74 20 66 6f 72 20 74 68 65 20 70 75 72  lent for the pur
307e0 70 6f 73 65 20 6f 66 20 6f 72 64 65 72 2d 64 69  pose of order-di
307f0 73 74 69 6e 63 74 2e 0a 20 20 2a 2a 20 54 6f 20  stinct..  ** To 
30800 62 65 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63  be order-distinc
30810 74 2c 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6d  t, the columns m
30820 75 73 74 20 62 65 20 55 4e 49 51 55 45 20 61 6e  ust be UNIQUE an
30830 64 20 4e 4f 54 20 4e 55 4c 4c 2e 0a 20 20 2a 2a  d NOT NULL..  **
30840 0a 20 20 2a 2a 20 54 68 65 20 72 6f 77 69 64 20  .  ** The rowid 
30850 66 6f 72 20 61 20 74 61 62 6c 65 20 69 73 20 61  for a table is a
30860 6c 77 61 79 73 20 55 4e 49 51 55 45 20 61 6e 64  lways UNIQUE and
30870 20 4e 4f 54 20 4e 55 4c 4c 20 73 6f 20 77 68 65   NOT NULL so whe
30880 6e 65 76 65 72 20 74 68 65 0a 20 20 2a 2a 20 72  never the.  ** r
30890 6f 77 69 64 20 61 70 70 65 61 72 73 20 69 6e 20  owid appears in 
308a0 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
308b0 75 73 65 2c 20 74 68 65 20 63 6f 72 72 65 73 70  use, the corresp
308c0 6f 6e 64 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70  onding WhereLoop
308d0 20 69 73 0a 20 20 2a 2a 20 61 75 74 6f 6d 61 74   is.  ** automat
308e0 69 63 61 6c 6c 79 20 6f 72 64 65 72 2d 64 69 73  ically order-dis
308f0 74 69 6e 63 74 2e 0a 20 20 2a 2f 0a 0a 20 20 61  tinct..  */..  a
30900 73 73 65 72 74 28 20 70 4f 72 64 65 72 42 79 21  ssert( pOrderBy!
30910 3d 30 20 29 3b 0a 20 20 69 66 28 20 6e 4c 6f 6f  =0 );.  if( nLoo
30920 70 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f  p && Optimizatio
30930 6e 44 69 73 61 62 6c 65 64 28 64 62 2c 20 53 51  nDisabled(db, SQ
30940 4c 49 54 45 5f 4f 72 64 65 72 42 79 49 64 78 4a  LITE_OrderByIdxJ
30950 6f 69 6e 29 20 29 20 72 65 74 75 72 6e 20 30 3b  oin) ) return 0;
30960 0a 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 70  ..  nOrderBy = p
30970 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a  OrderBy->nExpr;.
30980 20 20 74 65 73 74 63 61 73 65 28 20 6e 4f 72 64    testcase( nOrd
30990 65 72 42 79 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20  erBy==BMS-1 );. 
309a0 20 69 66 28 20 6e 4f 72 64 65 72 42 79 3e 42 4d   if( nOrderBy>BM
309b0 53 2d 31 20 29 20 72 65 74 75 72 6e 20 30 3b 20  S-1 ) return 0; 
309c0 20 2f 2a 20 43 61 6e 6e 6f 74 20 6f 70 74 69 6d   /* Cannot optim
309d0 69 7a 65 20 6f 76 65 72 6c 79 20 6c 61 72 67 65  ize overly large
309e0 20 4f 52 44 45 52 20 42 59 73 20 2a 2f 0a 20 20   ORDER BYs */.  
309f0 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20  isOrderDistinct 
30a00 3d 20 31 3b 0a 20 20 6f 62 44 6f 6e 65 20 3d 20  = 1;.  obDone = 
30a10 4d 41 53 4b 42 49 54 28 6e 4f 72 64 65 72 42 79  MASKBIT(nOrderBy
30a20 29 2d 31 3b 0a 20 20 6f 72 64 65 72 44 69 73 74  )-1;.  orderDist
30a30 69 6e 63 74 4d 61 73 6b 20 3d 20 30 3b 0a 20 20  inctMask = 0;.  
30a40 72 65 61 64 79 20 3d 20 30 3b 0a 20 20 66 6f 72  ready = 0;.  for
30a50 28 69 4c 6f 6f 70 3d 30 3b 20 69 73 4f 72 64 65  (iLoop=0; isOrde
30a60 72 44 69 73 74 69 6e 63 74 20 26 26 20 6f 62 53  rDistinct && obS
30a70 61 74 3c 6f 62 44 6f 6e 65 20 26 26 20 69 4c 6f  at<obDone && iLo
30a80 6f 70 3c 3d 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f 70  op<=nLoop; iLoop
30a90 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 4c 6f  ++){.    if( iLo
30aa0 6f 70 3e 30 20 29 20 72 65 61 64 79 20 7c 3d 20  op>0 ) ready |= 
30ab0 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b  pLoop->maskSelf;
30ac0 0a 20 20 20 20 70 4c 6f 6f 70 20 3d 20 69 4c 6f  .    pLoop = iLo
30ad0 6f 70 3c 6e 4c 6f 6f 70 20 3f 20 70 50 61 74 68  op<nLoop ? pPath
30ae0 2d 3e 61 4c 6f 6f 70 5b 69 4c 6f 6f 70 5d 20 3a  ->aLoop[iLoop] :
30af0 20 70 4c 61 73 74 3b 0a 20 20 20 20 69 66 28 20   pLast;.    if( 
30b00 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
30b10 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41   WHERE_VIRTUALTA
30b20 42 4c 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28  BLE ){.      if(
30b30 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 69   pLoop->u.vtab.i
30b40 73 4f 72 64 65 72 65 64 20 29 20 6f 62 53 61 74  sOrdered ) obSat
30b50 20 3d 20 6f 62 44 6f 6e 65 3b 0a 20 20 20 20 20   = obDone;.     
30b60 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
30b70 20 20 69 43 75 72 20 3d 20 70 57 49 6e 66 6f 2d    iCur = pWInfo-
30b80 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 6f  >pTabList->a[pLo
30b90 6f 70 2d 3e 69 54 61 62 5d 2e 69 43 75 72 73 6f  op->iTab].iCurso
30ba0 72 3b 0a 0a 20 20 20 20 2f 2a 20 4d 61 72 6b 20  r;..    /* Mark 
30bb0 6f 66 66 20 61 6e 79 20 4f 52 44 45 52 20 42 59  off any ORDER BY
30bc0 20 74 65 72 6d 20 58 20 74 68 61 74 20 69 73 20   term X that is 
30bd0 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20  a column in the 
30be0 74 61 62 6c 65 20 6f 66 0a 20 20 20 20 2a 2a 20  table of.    ** 
30bf0 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f 70  the current loop
30c00 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 72 65   for which there
30c10 20 69 73 20 74 65 72 6d 20 69 6e 20 74 68 65 20   is term in the 
30c20 57 48 45 52 45 0a 20 20 20 20 2a 2a 20 63 6c 61  WHERE.    ** cla
30c30 75 73 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  use of the form 
30c40 58 20 49 53 20 4e 55 4c 4c 20 6f 72 20 58 3d 3f  X IS NULL or X=?
30c50 20 74 68 61 74 20 72 65 66 65 72 65 6e 63 65 20   that reference 
30c60 6f 6e 6c 79 20 6f 75 74 65 72 0a 20 20 20 20 2a  only outer.    *
30c70 2a 20 6c 6f 6f 70 73 2e 0a 20 20 20 20 2a 2f 0a  * loops..    */.
30c80 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
30c90 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20  OrderBy; i++){. 
30ca0 20 20 20 20 20 69 66 28 20 4d 41 53 4b 42 49 54       if( MASKBIT
30cb0 28 69 29 20 26 20 6f 62 53 61 74 20 29 20 63 6f  (i) & obSat ) co
30cc0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 4f  ntinue;.      pO
30cd0 42 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45  BExpr = sqlite3E
30ce0 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70  xprSkipCollate(p
30cf0 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45  OrderBy->a[i].pE
30d00 78 70 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  xpr);.      if( 
30d10 70 4f 42 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  pOBExpr->op!=TK_
30d20 43 4f 4c 55 4d 4e 20 29 20 63 6f 6e 74 69 6e 75  COLUMN ) continu
30d30 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 42  e;.      if( pOB
30d40 45 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d 69 43  Expr->iTable!=iC
30d50 75 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ur ) continue;. 
30d60 20 20 20 20 20 70 54 65 72 6d 20 3d 20 66 69 6e       pTerm = fin
30d70 64 54 65 72 6d 28 26 70 57 49 6e 66 6f 2d 3e 73  dTerm(&pWInfo->s
30d80 57 43 2c 20 69 43 75 72 2c 20 70 4f 42 45 78 70  WC, iCur, pOBExp
30d90 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20  r->iColumn,.    
30da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30db0 20 20 20 7e 72 65 61 64 79 2c 20 57 4f 5f 45 51     ~ready, WO_EQ
30dc0 7c 57 4f 5f 49 53 4e 55 4c 4c 2c 20 30 29 3b 0a  |WO_ISNULL, 0);.
30dd0 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 3d        if( pTerm=
30de0 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
30df0 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d       if( (pTerm-
30e00 3e 65 4f 70 65 72 61 74 6f 72 26 57 4f 5f 45 51  >eOperator&WO_EQ
30e10 29 21 3d 30 20 26 26 20 70 4f 42 45 78 70 72 2d  )!=0 && pOBExpr-
30e20 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 29 7b 0a 20  >iColumn>=0 ){. 
30e30 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
30e40 72 20 2a 7a 31 2c 20 2a 7a 32 3b 0a 20 20 20 20  r *z1, *z2;.    
30e50 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
30e60 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
30e70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2c 20 70  WInfo->pParse, p
30e80 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45  OrderBy->a[i].pE
30e90 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66  xpr);.        if
30ea0 28 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c  ( !pColl ) pColl
30eb0 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c   = db->pDfltColl
30ec0 3b 0a 20 20 20 20 20 20 20 20 7a 31 20 3d 20 70  ;.        z1 = p
30ed0 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20  Coll->zName;.   
30ee0 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c       pColl = sql
30ef0 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
30f00 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2c 20  pWInfo->pParse, 
30f10 70 54 65 72 6d 2d 3e 70 45 78 70 72 29 3b 0a 20  pTerm->pExpr);. 
30f20 20 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c         if( !pCol
30f30 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e  l ) pColl = db->
30f40 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20  pDfltColl;.     
30f50 20 20 20 7a 32 20 3d 20 70 43 6f 6c 6c 2d 3e 7a     z2 = pColl->z
30f60 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 69 66  Name;.        if
30f70 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
30f80 28 7a 31 2c 20 7a 32 29 21 3d 30 20 29 20 63 6f  (z1, z2)!=0 ) co
30f90 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a  ntinue;.      }.
30fa0 20 20 20 20 20 20 6f 62 53 61 74 20 7c 3d 20 4d        obSat |= M
30fb0 41 53 4b 42 49 54 28 69 29 3b 0a 20 20 20 20 7d  ASKBIT(i);.    }
30fc0 0a 0a 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70  ..    if( (pLoop
30fd0 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
30fe0 45 5f 4f 4e 45 52 4f 57 29 3d 3d 30 20 29 7b 0a  E_ONEROW)==0 ){.
30ff0 20 20 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d        if( pLoop-
31000 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
31010 5f 49 50 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  _IPK ){.        
31020 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20 20  pIndex = 0;.    
31030 20 20 20 20 6e 4b 65 79 43 6f 6c 20 3d 20 30 3b      nKeyCol = 0;
31040 0a 20 20 20 20 20 20 20 20 6e 43 6f 6c 75 6d 6e  .        nColumn
31050 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 1;.      }els
31060 65 20 69 66 28 20 28 70 49 6e 64 65 78 20 3d 20  e if( (pIndex = 
31070 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70  pLoop->u.btree.p
31080 49 6e 64 65 78 29 3d 3d 30 20 7c 7c 20 70 49 6e  Index)==0 || pIn
31090 64 65 78 2d 3e 62 55 6e 6f 72 64 65 72 65 64 20  dex->bUnordered 
310a0 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
310b0 6e 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  n 0;.      }else
310c0 7b 0a 20 20 20 20 20 20 20 20 6e 4b 65 79 43 6f  {.        nKeyCo
310d0 6c 20 3d 20 70 49 6e 64 65 78 2d 3e 6e 4b 65 79  l = pIndex->nKey
310e0 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 6e 43 6f  Col;.        nCo
310f0 6c 75 6d 6e 20 3d 20 70 49 6e 64 65 78 2d 3e 6e  lumn = pIndex->n
31100 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20  Column;.        
31110 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d  assert( nColumn=
31120 3d 6e 4b 65 79 43 6f 6c 2b 31 20 7c 7c 20 21 48  =nKeyCol+1 || !H
31130 61 73 52 6f 77 69 64 28 70 49 6e 64 65 78 2d 3e  asRowid(pIndex->
31140 70 54 61 62 6c 65 29 20 29 3b 0a 20 20 20 20 20  pTable) );.     
31150 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 64 65     assert( pInde
31160 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 43 6f 6c  x->aiColumn[nCol
31170 75 6d 6e 2d 31 5d 3d 3d 28 2d 31 29 20 7c 7c 20  umn-1]==(-1) || 
31180 21 48 61 73 52 6f 77 69 64 28 70 49 6e 64 65 78  !HasRowid(pIndex
31190 2d 3e 70 54 61 62 6c 65 29 29 3b 0a 20 20 20 20  ->pTable));.    
311a0 20 20 20 20 69 73 4f 72 64 65 72 44 69 73 74 69      isOrderDisti
311b0 6e 63 74 20 3d 20 49 73 55 6e 69 71 75 65 49 6e  nct = IsUniqueIn
311c0 64 65 78 28 70 49 6e 64 65 78 29 3b 0a 20 20 20  dex(pIndex);.   
311d0 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 4c     }..      /* L
311e0 6f 6f 70 20 74 68 72 6f 75 67 68 20 61 6c 6c 20  oop through all 
311f0 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 69  columns of the i
31200 6e 64 65 78 20 61 6e 64 20 64 65 61 6c 20 77 69  ndex and deal wi
31210 74 68 20 74 68 65 20 6f 6e 65 73 0a 20 20 20 20  th the ones.    
31220 20 20 2a 2a 20 74 68 61 74 20 61 72 65 20 6e 6f    ** that are no
31230 74 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 62 79  t constrained by
31240 20 3d 3d 20 6f 72 20 49 4e 2e 0a 20 20 20 20 20   == or IN..     
31250 20 2a 2f 0a 20 20 20 20 20 20 72 65 76 20 3d 20   */.      rev = 
31260 72 65 76 53 65 74 20 3d 20 30 3b 0a 20 20 20 20  revSet = 0;.    
31270 20 20 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e    distinctColumn
31280 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 66 6f 72  s = 0;.      for
31290 28 6a 3d 30 3b 20 6a 3c 6e 43 6f 6c 75 6d 6e 3b  (j=0; j<nColumn;
312a0 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 75   j++){.        u
312b0 38 20 62 4f 6e 63 65 3b 20 20 20 2f 2a 20 54 72  8 bOnce;   /* Tr
312c0 75 65 20 74 6f 20 72 75 6e 20 74 68 65 20 4f 52  ue to run the OR
312d0 44 45 52 20 42 59 20 73 65 61 72 63 68 20 6c 6f  DER BY search lo
312e0 6f 70 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 2f  op */..        /
312f0 2a 20 53 6b 69 70 20 6f 76 65 72 20 3d 3d 20 61  * Skip over == a
31300 6e 64 20 49 53 20 4e 55 4c 4c 20 74 65 72 6d 73  nd IS NULL terms
31310 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
31320 6a 3c 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  j<pLoop->u.btree
31330 2e 6e 45 71 0a 20 20 20 20 20 20 20 20 20 26 26  .nEq.         &&
31340 20 70 4c 6f 6f 70 2d 3e 6e 53 6b 69 70 3d 3d 30   pLoop->nSkip==0
31350 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 28 69  .         && ((i
31360 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d   = pLoop->aLTerm
31370 5b 6a 5d 2d 3e 65 4f 70 65 72 61 74 6f 72 29 20  [j]->eOperator) 
31380 26 20 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 4e 55  & (WO_EQ|WO_ISNU
31390 4c 4c 29 29 21 3d 30 0a 20 20 20 20 20 20 20 20  LL))!=0.        
313a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
313b0 20 69 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29   i & WO_ISNULL )
313c0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65  {.            te
313d0 73 74 63 61 73 65 28 20 69 73 4f 72 64 65 72 44  stcase( isOrderD
313e0 69 73 74 69 6e 63 74 20 29 3b 0a 20 20 20 20 20  istinct );.     
313f0 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 44 69         isOrderDi
31400 73 74 69 6e 63 74 20 3d 20 30 3b 0a 20 20 20 20  stinct = 0;.    
31410 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
31420 20 20 63 6f 6e 74 69 6e 75 65 3b 20 20 0a 20 20    continue;  .  
31430 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
31440 20 2f 2a 20 47 65 74 20 74 68 65 20 63 6f 6c 75   /* Get the colu
31450 6d 6e 20 6e 75 6d 62 65 72 20 69 6e 20 74 68 65  mn number in the
31460 20 74 61 62 6c 65 20 28 69 43 6f 6c 75 6d 6e 29   table (iColumn)
31470 20 61 6e 64 20 73 6f 72 74 20 6f 72 64 65 72 0a   and sort order.
31480 20 20 20 20 20 20 20 20 2a 2a 20 28 72 65 76 49          ** (revI
31490 64 78 29 20 66 6f 72 20 74 68 65 20 6a 2d 74 68  dx) for the j-th
314a0 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69   column of the i
314b0 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ndex..        */
314c0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49 6e  .        if( pIn
314d0 64 65 78 20 29 7b 0a 20 20 20 20 20 20 20 20 20  dex ){.         
314e0 20 69 43 6f 6c 75 6d 6e 20 3d 20 70 49 6e 64 65   iColumn = pInde
314f0 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a  x->aiColumn[j];.
31500 20 20 20 20 20 20 20 20 20 20 72 65 76 49 64 78            revIdx
31510 20 3d 20 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74   = pIndex->aSort
31520 4f 72 64 65 72 5b 6a 5d 3b 0a 20 20 20 20 20 20  Order[j];.      
31530 20 20 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3d      if( iColumn=
31540 3d 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d  =pIndex->pTable-
31550 3e 69 50 4b 65 79 20 29 20 69 43 6f 6c 75 6d 6e  >iPKey ) iColumn
31560 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d   = -1;.        }
31570 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
31580 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20  iColumn = -1;.  
31590 20 20 20 20 20 20 20 20 72 65 76 49 64 78 20 3d          revIdx =
315a0 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20   0;.        }.. 
315b0 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 75 6e 63         /* An unc
315c0 6f 6e 73 74 72 61 69 6e 65 64 20 63 6f 6c 75 6d  onstrained colum
315d0 6e 20 74 68 61 74 20 6d 69 67 68 74 20 62 65 20  n that might be 
315e0 4e 55 4c 4c 20 6d 65 61 6e 73 20 74 68 61 74 20  NULL means that 
315f0 74 68 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  this.        ** 
31600 57 68 65 72 65 4c 6f 6f 70 20 69 73 20 6e 6f 74  WhereLoop is not
31610 20 77 65 6c 6c 2d 6f 72 64 65 72 65 64 0a 20 20   well-ordered.  
31620 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
31630 20 69 66 28 20 69 73 4f 72 64 65 72 44 69 73 74   if( isOrderDist
31640 69 6e 63 74 0a 20 20 20 20 20 20 20 20 20 26 26  inct.         &&
31650 20 69 43 6f 6c 75 6d 6e 3e 3d 30 0a 20 20 20 20   iColumn>=0.    
31660 20 20 20 20 20 26 26 20 6a 3e 3d 70 4c 6f 6f 70       && j>=pLoop
31670 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 0a 20 20  ->u.btree.nEq.  
31680 20 20 20 20 20 20 20 26 26 20 70 49 6e 64 65 78         && pIndex
31690 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69  ->pTable->aCol[i
316a0 43 6f 6c 75 6d 6e 5d 2e 6e 6f 74 4e 75 6c 6c 3d  Column].notNull=
316b0 3d 30 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  =0.        ){.  
316c0 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 44          isOrderD
316d0 69 73 74 69 6e 63 74 20 3d 20 30 3b 0a 20 20 20  istinct = 0;.   
316e0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
316f0 2f 2a 20 46 69 6e 64 20 74 68 65 20 4f 52 44 45  /* Find the ORDE
31700 52 20 42 59 20 74 65 72 6d 20 74 68 61 74 20 63  R BY term that c
31710 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 74 68  orresponds to th
31720 65 20 6a 2d 74 68 20 63 6f 6c 75 6d 6e 0a 20 20  e j-th column.  
31730 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20        ** of the 
31740 69 6e 64 65 78 20 61 6e 64 20 6d 61 72 6b 20 74  index and mark t
31750 68 61 74 20 4f 52 44 45 52 20 42 59 20 74 65 72  hat ORDER BY ter
31760 6d 20 6f 66 66 20 0a 20 20 20 20 20 20 20 20 2a  m off .        *
31770 2f 0a 20 20 20 20 20 20 20 20 62 4f 6e 63 65 20  /.        bOnce 
31780 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 69 73 4d  = 1;.        isM
31790 61 74 63 68 20 3d 20 30 3b 0a 20 20 20 20 20 20  atch = 0;.      
317a0 20 20 66 6f 72 28 69 3d 30 3b 20 62 4f 6e 63 65    for(i=0; bOnce
317b0 20 26 26 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20   && i<nOrderBy; 
317c0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
317d0 69 66 28 20 4d 41 53 4b 42 49 54 28 69 29 20 26  if( MASKBIT(i) &
317e0 20 6f 62 53 61 74 20 29 20 63 6f 6e 74 69 6e 75   obSat ) continu
317f0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 42  e;.          pOB
31800 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78  Expr = sqlite3Ex
31810 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4f  prSkipCollate(pO
31820 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78  rderBy->a[i].pEx
31830 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 74  pr);.          t
31840 65 73 74 63 61 73 65 28 20 77 63 74 72 6c 46 6c  estcase( wctrlFl
31850 61 67 73 20 26 20 57 48 45 52 45 5f 47 52 4f 55  ags & WHERE_GROU
31860 50 42 59 20 29 3b 0a 20 20 20 20 20 20 20 20 20  PBY );.         
31870 20 74 65 73 74 63 61 73 65 28 20 77 63 74 72 6c   testcase( wctrl
31880 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 44 49  Flags & WHERE_DI
31890 53 54 49 4e 43 54 42 59 20 29 3b 0a 20 20 20 20  STINCTBY );.    
318a0 20 20 20 20 20 20 69 66 28 20 28 77 63 74 72 6c        if( (wctrl
318b0 46 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 47  Flags & (WHERE_G
318c0 52 4f 55 50 42 59 7c 57 48 45 52 45 5f 44 49 53  ROUPBY|WHERE_DIS
318d0 54 49 4e 43 54 42 59 29 29 3d 3d 30 20 29 20 62  TINCTBY))==0 ) b
318e0 4f 6e 63 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Once = 0;.      
318f0 20 20 20 20 69 66 28 20 70 4f 42 45 78 70 72 2d      if( pOBExpr-
31900 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op!=TK_COLUMN )
31910 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
31920 20 20 20 20 20 69 66 28 20 70 4f 42 45 78 70 72       if( pOBExpr
31930 2d 3e 69 54 61 62 6c 65 21 3d 69 43 75 72 20 29  ->iTable!=iCur )
31940 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
31950 20 20 20 20 20 69 66 28 20 70 4f 42 45 78 70 72       if( pOBExpr
31960 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 75  ->iColumn!=iColu
31970 6d 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  mn ) continue;. 
31980 20 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f           if( iCo
31990 6c 75 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20 20 20  lumn>=0 ){.     
319a0 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73         pColl = s
319b0 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
319c0 71 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65  q(pWInfo->pParse
319d0 2c 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  , pOrderBy->a[i]
319e0 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20  .pExpr);.       
319f0 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20       if( !pColl 
31a00 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44  ) pColl = db->pD
31a10 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20  fltColl;.       
31a20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
31a30 53 74 72 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a  StrICmp(pColl->z
31a40 4e 61 6d 65 2c 20 70 49 6e 64 65 78 2d 3e 61 7a  Name, pIndex->az
31a50 43 6f 6c 6c 5b 6a 5d 29 21 3d 30 20 29 20 63 6f  Coll[j])!=0 ) co
31a60 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
31a70 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 73    }.          is
31a80 4d 61 74 63 68 20 3d 20 31 3b 0a 20 20 20 20 20  Match = 1;.     
31a90 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
31aa0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
31ab0 28 20 69 73 4d 61 74 63 68 20 26 26 20 28 77 63  ( isMatch && (wc
31ac0 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
31ad0 5f 47 52 4f 55 50 42 59 29 3d 3d 30 20 29 7b 0a  _GROUPBY)==0 ){.
31ae0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b            /* Mak
31af0 65 20 73 75 72 65 20 74 68 65 20 73 6f 72 74 20  e sure the sort 
31b00 6f 72 64 65 72 20 69 73 20 63 6f 6d 70 61 74 69  order is compati
31b10 62 6c 65 20 69 6e 20 61 6e 20 4f 52 44 45 52 20  ble in an ORDER 
31b20 42 59 20 63 6c 61 75 73 65 2e 0a 20 20 20 20 20  BY clause..     
31b30 20 20 20 20 20 2a 2a 20 53 6f 72 74 20 6f 72 64       ** Sort ord
31b40 65 72 20 69 73 20 69 72 72 65 6c 65 76 61 6e 74  er is irrelevant
31b50 20 66 6f 72 20 61 20 47 52 4f 55 50 20 42 59 20   for a GROUP BY 
31b60 63 6c 61 75 73 65 2e 20 2a 2f 0a 20 20 20 20 20  clause. */.     
31b70 20 20 20 20 20 69 66 28 20 72 65 76 53 65 74 20       if( revSet 
31b80 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
31b90 66 28 20 28 72 65 76 20 5e 20 72 65 76 49 64 78  f( (rev ^ revIdx
31ba0 29 21 3d 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69  )!=pOrderBy->a[i
31bb0 5d 2e 73 6f 72 74 4f 72 64 65 72 20 29 20 69 73  ].sortOrder ) is
31bc0 4d 61 74 63 68 20 3d 20 30 3b 0a 20 20 20 20 20  Match = 0;.     
31bd0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
31be0 20 20 20 20 20 20 20 20 72 65 76 20 3d 20 72 65          rev = re
31bf0 76 49 64 78 20 5e 20 70 4f 72 64 65 72 42 79 2d  vIdx ^ pOrderBy-
31c00 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b  >a[i].sortOrder;
31c10 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
31c20 20 72 65 76 20 29 20 2a 70 52 65 76 4d 61 73 6b   rev ) *pRevMask
31c30 20 7c 3d 20 4d 41 53 4b 42 49 54 28 69 4c 6f 6f   |= MASKBIT(iLoo
31c40 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  p);.            
31c50 72 65 76 53 65 74 20 3d 20 31 3b 0a 20 20 20 20  revSet = 1;.    
31c60 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
31c70 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 73  }.        if( is
31c80 4d 61 74 63 68 20 29 7b 0a 20 20 20 20 20 20 20  Match ){.       
31c90 20 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3c 30     if( iColumn<0
31ca0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
31cb0 74 65 73 74 63 61 73 65 28 20 64 69 73 74 69 6e  testcase( distin
31cc0 63 74 43 6f 6c 75 6d 6e 73 3d 3d 30 20 29 3b 0a  ctColumns==0 );.
31cd0 20 20 20 20 20 20 20 20 20 20 20 20 64 69 73 74              dist
31ce0 69 6e 63 74 43 6f 6c 75 6d 6e 73 20 3d 20 31 3b  inctColumns = 1;
31cf0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
31d00 20 20 20 20 20 20 20 6f 62 53 61 74 20 7c 3d 20         obSat |= 
31d10 4d 41 53 4b 42 49 54 28 69 29 3b 0a 20 20 20 20  MASKBIT(i);.    
31d20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
31d30 20 20 20 20 20 2f 2a 20 4e 6f 20 6d 61 74 63 68       /* No match
31d40 20 66 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20   found */.      
31d50 20 20 20 20 69 66 28 20 6a 3d 3d 30 20 7c 7c 20      if( j==0 || 
31d60 6a 3c 6e 4b 65 79 43 6f 6c 20 29 7b 0a 20 20 20  j<nKeyCol ){.   
31d70 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
31d80 65 28 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e  e( isOrderDistin
31d90 63 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  ct!=0 );.       
31da0 20 20 20 20 20 69 73 4f 72 64 65 72 44 69 73 74       isOrderDist
31db0 69 6e 63 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  inct = 0;.      
31dc0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
31dd0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
31de0 0a 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64 20  .      } /* end 
31df0 4c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20 69 6e  Loop over all in
31e00 64 65 78 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20  dex columns */. 
31e10 20 20 20 20 20 69 66 28 20 64 69 73 74 69 6e 63       if( distinc
31e20 74 43 6f 6c 75 6d 6e 73 20 29 7b 0a 20 20 20 20  tColumns ){.    
31e30 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 73      testcase( is
31e40 4f 72 64 65 72 44 69 73 74 69 6e 63 74 3d 3d 30  OrderDistinct==0
31e50 20 29 3b 0a 20 20 20 20 20 20 20 20 69 73 4f 72   );.        isOr
31e60 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20 31 3b  derDistinct = 1;
31e70 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 2f  .      }.    } /
31e80 2a 20 65 6e 64 2d 69 66 20 6e 6f 74 20 6f 6e 65  * end-if not one
31e90 2d 72 6f 77 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  -row */..    /* 
31ea0 4d 61 72 6b 20 6f 66 66 20 61 6e 79 20 6f 74 68  Mark off any oth
31eb0 65 72 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d  er ORDER BY term
31ec0 73 20 74 68 61 74 20 72 65 66 65 72 65 6e 63 65  s that reference
31ed0 20 70 4c 6f 6f 70 20 2a 2f 0a 20 20 20 20 69 66   pLoop */.    if
31ee0 28 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63  ( isOrderDistinc
31ef0 74 20 29 7b 0a 20 20 20 20 20 20 6f 72 64 65 72  t ){.      order
31f00 44 69 73 74 69 6e 63 74 4d 61 73 6b 20 7c 3d 20  DistinctMask |= 
31f10 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b  pLoop->maskSelf;
31f20 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
31f30 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29  i<nOrderBy; i++)
31f40 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a  {.        Expr *
31f50 70 3b 0a 20 20 20 20 20 20 20 20 42 69 74 6d 61  p;.        Bitma
31f60 73 6b 20 6d 54 65 72 6d 3b 0a 20 20 20 20 20 20  sk mTerm;.      
31f70 20 20 69 66 28 20 4d 41 53 4b 42 49 54 28 69 29    if( MASKBIT(i)
31f80 20 26 20 6f 62 53 61 74 20 29 20 63 6f 6e 74 69   & obSat ) conti
31f90 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 70 20 3d  nue;.        p =
31fa0 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
31fb0 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 6d  pExpr;.        m
31fc0 54 65 72 6d 20 3d 20 65 78 70 72 54 61 62 6c 65  Term = exprTable
31fd0 55 73 61 67 65 28 26 70 57 49 6e 66 6f 2d 3e 73  Usage(&pWInfo->s
31fe0 4d 61 73 6b 53 65 74 2c 70 29 3b 0a 20 20 20 20  MaskSet,p);.    
31ff0 20 20 20 20 69 66 28 20 6d 54 65 72 6d 3d 3d 30      if( mTerm==0
32000 20 26 26 20 21 73 71 6c 69 74 65 33 45 78 70 72   && !sqlite3Expr
32010 49 73 43 6f 6e 73 74 61 6e 74 28 70 29 20 29 20  IsConstant(p) ) 
32020 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
32030 20 20 69 66 28 20 28 6d 54 65 72 6d 26 7e 6f 72    if( (mTerm&~or
32040 64 65 72 44 69 73 74 69 6e 63 74 4d 61 73 6b 29  derDistinctMask)
32050 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
32060 20 6f 62 53 61 74 20 7c 3d 20 4d 41 53 4b 42 49   obSat |= MASKBI
32070 54 28 69 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  T(i);.        }.
32080 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
32090 7d 20 2f 2a 20 45 6e 64 20 74 68 65 20 6c 6f 6f  } /* End the loo
320a0 70 20 6f 76 65 72 20 61 6c 6c 20 57 68 65 72 65  p over all Where
320b0 4c 6f 6f 70 73 20 66 72 6f 6d 20 6f 75 74 65 72  Loops from outer
320c0 2d 6d 6f 73 74 20 64 6f 77 6e 20 74 6f 20 69 6e  -most down to in
320d0 6e 65 72 2d 6d 6f 73 74 20 2a 2f 0a 20 20 69 66  ner-most */.  if
320e0 28 20 6f 62 53 61 74 3d 3d 6f 62 44 6f 6e 65 20  ( obSat==obDone 
320f0 29 20 72 65 74 75 72 6e 20 28 69 38 29 6e 4f 72  ) return (i8)nOr
32100 64 65 72 42 79 3b 0a 20 20 69 66 28 20 21 69 73  derBy;.  if( !is
32110 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 29 7b  OrderDistinct ){
32120 0a 20 20 20 20 66 6f 72 28 69 3d 6e 4f 72 64 65  .    for(i=nOrde
32130 72 42 79 2d 31 3b 20 69 3e 30 3b 20 69 2d 2d 29  rBy-1; i>0; i--)
32140 7b 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20  {.      Bitmask 
32150 6d 20 3d 20 4d 41 53 4b 42 49 54 28 69 29 20 2d  m = MASKBIT(i) -
32160 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20 28 6f   1;.      if( (o
32170 62 53 61 74 26 6d 29 3d 3d 6d 20 29 20 72 65 74  bSat&m)==m ) ret
32180 75 72 6e 20 69 3b 0a 20 20 20 20 7d 0a 20 20 20  urn i;.    }.   
32190 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
321a0 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 0a   return -1;.}...
321b0 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 57 48 45  /*.** If the WHE
321c0 52 45 5f 47 52 4f 55 50 42 59 20 66 6c 61 67 20  RE_GROUPBY flag 
321d0 69 73 20 73 65 74 20 69 6e 20 74 68 65 20 6d 61  is set in the ma
321e0 73 6b 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c  sk passed to sql
321f0 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
32200 2c 0a 2a 2a 20 74 68 65 20 70 6c 61 6e 6e 65 72  ,.** the planner
32210 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 74 68   assumes that th
32220 65 20 73 70 65 63 69 66 69 65 64 20 70 4f 72 64  e specified pOrd
32230 65 72 42 79 20 6c 69 73 74 20 69 73 20 61 63 74  erBy list is act
32240 75 61 6c 6c 79 20 61 20 47 52 4f 55 50 0a 2a 2a  ually a GROUP.**
32250 20 42 59 20 63 6c 61 75 73 65 20 2d 20 61 6e 64   BY clause - and
32260 20 73 6f 20 61 6e 79 20 6f 72 64 65 72 20 74 68   so any order th
32270 61 74 20 67 72 6f 75 70 73 20 72 6f 77 73 20 61  at groups rows a
32280 73 20 72 65 71 75 69 72 65 64 20 73 61 74 69 73  s required satis
32290 66 69 65 73 20 74 68 65 0a 2a 2a 20 72 65 71 75  fies the.** requ
322a0 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61  est..**.** Norma
322b0 6c 6c 79 2c 20 69 6e 20 74 68 69 73 20 63 61 73  lly, in this cas
322c0 65 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73  e it is not poss
322d0 69 62 6c 65 20 66 6f 72 20 74 68 65 20 63 61 6c  ible for the cal
322e0 6c 65 72 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  ler to determine
322f0 0a 2a 2a 20 77 68 65 74 68 65 72 20 6f 72 20 6e  .** whether or n
32300 6f 74 20 74 68 65 20 72 6f 77 73 20 61 72 65 20  ot the rows are 
32310 72 65 61 6c 6c 79 20 62 65 69 6e 67 20 64 65 6c  really being del
32320 69 76 65 72 65 64 20 69 6e 20 73 6f 72 74 65 64  ivered in sorted
32330 20 6f 72 64 65 72 2c 20 6f 72 0a 2a 2a 20 6a 75   order, or.** ju
32340 73 74 20 69 6e 20 73 6f 6d 65 20 6f 74 68 65 72  st in some other
32350 20 6f 72 64 65 72 20 74 68 61 74 20 70 72 6f 76   order that prov
32360 69 64 65 73 20 74 68 65 20 72 65 71 75 69 72 65  ides the require
32370 64 20 67 72 6f 75 70 69 6e 67 2e 20 48 6f 77 65  d grouping. Howe
32380 76 65 72 2c 0a 2a 2a 20 69 66 20 74 68 65 20 57  ver,.** if the W
32390 48 45 52 45 5f 53 4f 52 54 42 59 47 52 4f 55 50  HERE_SORTBYGROUP
323a0 20 66 6c 61 67 20 69 73 20 61 6c 73 6f 20 70 61   flag is also pa
323b0 73 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33 57  ssed to sqlite3W
323c0 68 65 72 65 42 65 67 69 6e 28 29 2c 20 74 68 65  hereBegin(), the
323d0 6e 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69  n.** this functi
323e0 6f 6e 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64  on may be called
323f0 20 6f 6e 20 74 68 65 20 72 65 74 75 72 6e 65 64   on the returned
32400 20 57 68 65 72 65 49 6e 66 6f 20 6f 62 6a 65 63   WhereInfo objec
32410 74 2e 20 49 74 20 72 65 74 75 72 6e 73 0a 2a 2a  t. It returns.**
32420 20 74 72 75 65 20 69 66 20 74 68 65 20 72 6f 77   true if the row
32430 73 20 72 65 61 6c 6c 79 20 77 69 6c 6c 20 62 65  s really will be
32440 20 73 6f 72 74 65 64 20 69 6e 20 74 68 65 20 73   sorted in the s
32450 70 65 63 69 66 69 65 64 20 6f 72 64 65 72 2c 20  pecified order, 
32460 6f 72 20 66 61 6c 73 65 0a 2a 2a 20 6f 74 68 65  or false.** othe
32470 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  rwise..**.** For
32480 20 65 78 61 6d 70 6c 65 2c 20 61 73 73 75 6d 69   example, assumi
32490 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 43 52 45 41  ng:.**.**   CREA
324a0 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74  TE INDEX i1 ON t
324b0 31 28 78 2c 20 59 29 3b 0a 2a 2a 0a 2a 2a 20 74  1(x, Y);.**.** t
324c0 68 65 6e 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45  hen.**.**   SELE
324d0 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 47 52 4f  CT * FROM t1 GRO
324e0 55 50 20 42 59 20 78 2c 79 20 4f 52 44 45 52 20  UP BY x,y ORDER 
324f0 42 59 20 78 2c 79 3b 20 20 20 2d 2d 20 49 73 53  BY x,y;   -- IsS
32500 6f 72 74 65 64 28 29 3d 3d 31 0a 2a 2a 20 20 20  orted()==1.**   
32510 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
32520 20 47 52 4f 55 50 20 42 59 20 79 2c 78 20 4f 52   GROUP BY y,x OR
32530 44 45 52 20 42 59 20 79 2c 78 3b 20 20 20 2d 2d  DER BY y,x;   --
32540 20 49 73 53 6f 72 74 65 64 28 29 3d 3d 30 0a 2a   IsSorted()==0.*
32550 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65  /.int sqlite3Whe
32560 72 65 49 73 53 6f 72 74 65 64 28 57 68 65 72 65  reIsSorted(Where
32570 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20  Info *pWInfo){. 
32580 20 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d   assert( pWInfo-
32590 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  >wctrlFlags & WH
325a0 45 52 45 5f 47 52 4f 55 50 42 59 20 29 3b 0a 20  ERE_GROUPBY );. 
325b0 20 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d   assert( pWInfo-
325c0 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  >wctrlFlags & WH
325d0 45 52 45 5f 53 4f 52 54 42 59 47 52 4f 55 50 20  ERE_SORTBYGROUP 
325e0 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 57 49 6e  );.  return pWIn
325f0 66 6f 2d 3e 73 6f 72 74 65 64 3b 0a 7d 0a 0a 23  fo->sorted;.}..#
32600 69 66 64 65 66 20 57 48 45 52 45 54 52 41 43 45  ifdef WHERETRACE
32610 5f 45 4e 41 42 4c 45 44 0a 2f 2a 20 46 6f 72 20  _ENABLED./* For 
32620 64 65 62 75 67 67 69 6e 67 20 75 73 65 20 6f 6e  debugging use on
32630 6c 79 3a 20 2a 2f 0a 73 74 61 74 69 63 20 63 6f  ly: */.static co
32640 6e 73 74 20 63 68 61 72 20 2a 77 68 65 72 65 50  nst char *whereP
32650 61 74 68 4e 61 6d 65 28 57 68 65 72 65 50 61 74  athName(WherePat
32660 68 20 2a 70 50 61 74 68 2c 20 69 6e 74 20 6e 4c  h *pPath, int nL
32670 6f 6f 70 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a  oop, WhereLoop *
32680 70 4c 61 73 74 29 7b 0a 20 20 73 74 61 74 69 63  pLast){.  static
32690 20 63 68 61 72 20 7a 4e 61 6d 65 5b 36 35 5d 3b   char zName[65];
326a0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
326b0 69 3d 30 3b 20 69 3c 6e 4c 6f 6f 70 3b 20 69 2b  i=0; i<nLoop; i+
326c0 2b 29 7b 20 7a 4e 61 6d 65 5b 69 5d 20 3d 20 70  +){ zName[i] = p
326d0 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b 69 5d 2d 3e  Path->aLoop[i]->
326e0 63 49 64 3b 20 7d 0a 20 20 69 66 28 20 70 4c 61  cId; }.  if( pLa
326f0 73 74 20 29 20 7a 4e 61 6d 65 5b 69 2b 2b 5d 20  st ) zName[i++] 
32700 3d 20 70 4c 61 73 74 2d 3e 63 49 64 3b 0a 20 20  = pLast->cId;.  
32710 7a 4e 61 6d 65 5b 69 5d 20 3d 20 30 3b 0a 20 20  zName[i] = 0;.  
32720 72 65 74 75 72 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a  return zName;.}.
32730 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
32740 74 75 72 6e 20 74 68 65 20 63 6f 73 74 20 6f 66  turn the cost of
32750 20 73 6f 72 74 69 6e 67 20 6e 52 6f 77 20 72 6f   sorting nRow ro
32760 77 73 2c 20 61 73 73 75 6d 69 6e 67 20 74 68 61  ws, assuming tha
32770 74 20 74 68 65 20 6b 65 79 73 20 68 61 76 65 20  t the keys have 
32780 0a 2a 2a 20 6e 4f 72 64 65 72 62 79 20 63 6f 6c  .** nOrderby col
32790 75 6d 6e 73 20 61 6e 64 20 74 68 61 74 20 74 68  umns and that th
327a0 65 20 66 69 72 73 74 20 6e 53 6f 72 74 65 64 20  e first nSorted 
327b0 63 6f 6c 75 6d 6e 73 20 61 72 65 20 61 6c 72 65  columns are alre
327c0 61 64 79 20 69 6e 0a 2a 2a 20 6f 72 64 65 72 2e  ady in.** order.
327d0 0a 2a 2f 0a 73 74 61 74 69 63 20 4c 6f 67 45 73  .*/.static LogEs
327e0 74 20 77 68 65 72 65 53 6f 72 74 69 6e 67 43 6f  t whereSortingCo
327f0 73 74 28 0a 20 20 57 68 65 72 65 49 6e 66 6f 20  st(.  WhereInfo 
32800 2a 70 57 49 6e 66 6f 2c 0a 20 20 4c 6f 67 45 73  *pWInfo,.  LogEs
32810 74 20 6e 52 6f 77 2c 0a 20 20 69 6e 74 20 6e 4f  t nRow,.  int nO
32820 72 64 65 72 42 79 2c 0a 20 20 69 6e 74 20 6e 53  rderBy,.  int nS
32830 6f 72 74 65 64 0a 29 7b 0a 20 20 2f 2a 20 54 55  orted.){.  /* TU
32840 4e 49 4e 47 3a 20 45 73 74 69 6d 61 74 65 64 20  NING: Estimated 
32850 63 6f 73 74 20 6f 66 20 61 20 66 75 6c 6c 20 65  cost of a full e
32860 78 74 65 72 6e 61 6c 20 73 6f 72 74 2c 20 77 68  xternal sort, wh
32870 65 72 65 20 4e 20 69 73 20 0a 20 20 2a 2a 20 74  ere N is .  ** t
32880 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
32890 73 20 74 6f 20 73 6f 72 74 20 69 73 3a 0a 20 20  s to sort is:.  
328a0 2a 2a 0a 20 20 2a 2a 20 20 20 63 6f 73 74 20 3d  **.  **   cost =
328b0 20 28 33 2e 30 20 2a 20 4e 20 2a 20 6c 6f 67 28   (3.0 * N * log(
328c0 4e 29 29 2e 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20  N))..  ** .  ** 
328d0 4f 72 2c 20 69 66 20 74 68 65 20 6f 72 64 65 72  Or, if the order
328e0 2d 62 79 20 63 6c 61 75 73 65 20 68 61 73 20 58  -by clause has X
328f0 20 74 65 72 6d 73 20 62 75 74 20 6f 6e 6c 79 20   terms but only 
32900 74 68 65 20 6c 61 73 74 20 59 20 0a 20 20 2a 2a  the last Y .  **
32910 20 74 65 72 6d 73 20 61 72 65 20 6f 75 74 20 6f   terms are out o
32920 66 20 6f 72 64 65 72 2c 20 74 68 65 6e 20 62 6c  f order, then bl
32930 6f 63 6b 2d 73 6f 72 74 69 6e 67 20 77 69 6c 6c  ock-sorting will
32940 20 72 65 64 75 63 65 20 74 68 65 20 0a 20 20 2a   reduce the .  *
32950 2a 20 73 6f 72 74 69 6e 67 20 63 6f 73 74 20 74  * sorting cost t
32960 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 63  o:.  **.  **   c
32970 6f 73 74 20 3d 20 28 33 2e 30 20 2a 20 4e 20 2a  ost = (3.0 * N *
32980 20 6c 6f 67 28 4e 29 29 20 2a 20 28 59 2f 58 29   log(N)) * (Y/X)
32990 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 28  .  **.  ** The (
329a0 59 2f 58 29 20 74 65 72 6d 20 69 73 20 69 6d 70  Y/X) term is imp
329b0 6c 65 6d 65 6e 74 65 64 20 75 73 69 6e 67 20 73  lemented using s
329c0 74 61 63 6b 20 76 61 72 69 61 62 6c 65 20 72 53  tack variable rS
329d0 63 61 6c 65 0a 20 20 2a 2a 20 62 65 6c 6f 77 2e  cale.  ** below.
329e0 20 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 72 53    */.  LogEst rS
329f0 63 61 6c 65 2c 20 72 53 6f 72 74 43 6f 73 74 3b  cale, rSortCost;
32a00 0a 20 20 61 73 73 65 72 74 28 20 6e 4f 72 64 65  .  assert( nOrde
32a10 72 42 79 3e 30 20 26 26 20 36 36 3d 3d 73 71 6c  rBy>0 && 66==sql
32a20 69 74 65 33 4c 6f 67 45 73 74 28 31 30 30 29 20  ite3LogEst(100) 
32a30 29 3b 0a 20 20 72 53 63 61 6c 65 20 3d 20 73 71  );.  rScale = sq
32a40 6c 69 74 65 33 4c 6f 67 45 73 74 28 28 6e 4f 72  lite3LogEst((nOr
32a50 64 65 72 42 79 2d 6e 53 6f 72 74 65 64 29 2a 31  derBy-nSorted)*1
32a60 30 30 2f 6e 4f 72 64 65 72 42 79 29 20 2d 20 36  00/nOrderBy) - 6
32a70 36 3b 0a 20 20 72 53 6f 72 74 43 6f 73 74 20 3d  6;.  rSortCost =
32a80 20 6e 52 6f 77 20 2b 20 65 73 74 4c 6f 67 28 6e   nRow + estLog(n
32a90 52 6f 77 29 20 2b 20 72 53 63 61 6c 65 20 2b 20  Row) + rScale + 
32aa0 31 36 3b 0a 0a 20 20 2f 2a 20 54 55 4e 49 4e 47  16;..  /* TUNING
32ab0 3a 20 54 68 65 20 63 6f 73 74 20 6f 66 20 69 6d  : The cost of im
32ac0 70 6c 65 6d 65 6e 74 69 6e 67 20 44 49 53 54 49  plementing DISTI
32ad0 4e 43 54 20 75 73 69 6e 67 20 61 20 42 2d 54 52  NCT using a B-TR
32ae0 45 45 20 69 73 0a 20 20 2a 2a 20 73 69 6d 69 6c  EE is.  ** simil
32af0 61 72 20 62 75 74 20 77 69 74 68 20 61 20 6c 61  ar but with a la
32b00 72 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 6f 66  rger constant of
32b10 20 70 72 6f 70 6f 72 74 69 6f 6e 61 6c 69 74 79   proportionality
32b20 2e 20 0a 20 20 2a 2a 20 4d 75 6c 74 69 70 6c 79  . .  ** Multiply
32b30 20 62 79 20 61 6e 20 61 64 64 69 74 69 6f 6e 61   by an additiona
32b40 6c 20 66 61 63 74 6f 72 20 6f 66 20 33 2e 30 2e  l factor of 3.0.
32b50 20 20 2a 2f 0a 20 20 69 66 28 20 70 57 49 6e 66    */.  if( pWInf
32b60 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20  o->wctrlFlags & 
32b70 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49  WHERE_WANT_DISTI
32b80 4e 43 54 20 29 7b 0a 20 20 20 20 72 53 6f 72 74  NCT ){.    rSort
32b90 43 6f 73 74 20 2b 3d 20 31 36 3b 0a 20 20 7d 0a  Cost += 16;.  }.
32ba0 0a 20 20 72 65 74 75 72 6e 20 72 53 6f 72 74 43  .  return rSortC
32bb0 6f 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69  ost;.}../*.** Gi
32bc0 76 65 6e 20 74 68 65 20 6c 69 73 74 20 6f 66 20  ven the list of 
32bd0 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
32be0 73 20 61 74 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f  s at pWInfo->pLo
32bf0 6f 70 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ops, this routin
32c00 65 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 74 6f  e.** attempts to
32c10 20 66 69 6e 64 20 74 68 65 20 6c 6f 77 65 73 74   find the lowest
32c20 20 63 6f 73 74 20 70 61 74 68 20 74 68 61 74 20   cost path that 
32c30 76 69 73 69 74 73 20 65 61 63 68 20 57 68 65 72  visits each Wher
32c40 65 4c 6f 6f 70 0a 2a 2a 20 6f 6e 63 65 2e 20 20  eLoop.** once.  
32c50 54 68 69 73 20 70 61 74 68 20 69 73 20 74 68 65  This path is the
32c60 6e 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20 74 68  n loaded into th
32c70 65 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 70 57  e pWInfo->a[].pW
32c80 4c 6f 6f 70 20 66 69 65 6c 64 73 2e 0a 2a 2a 0a  Loop fields..**.
32c90 2a 2a 20 41 73 73 75 6d 65 20 74 68 61 74 20 74  ** Assume that t
32ca0 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
32cb0 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20 74  of output rows t
32cc0 68 61 74 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f  hat will need to
32cd0 20 62 65 20 73 6f 72 74 65 64 0a 2a 2a 20 77 69   be sorted.** wi
32ce0 6c 6c 20 62 65 20 6e 52 6f 77 45 73 74 20 28 69  ll be nRowEst (i
32cf0 6e 20 74 68 65 20 31 30 2a 6c 6f 67 32 20 72 65  n the 10*log2 re
32d00 70 72 65 73 65 6e 74 61 74 69 6f 6e 29 2e 20 20  presentation).  
32d10 4f 72 2c 20 69 67 6e 6f 72 65 20 73 6f 72 74 69  Or, ignore sorti
32d20 6e 67 0a 2a 2a 20 63 6f 73 74 73 20 69 66 20 6e  ng.** costs if n
32d30 52 6f 77 45 73 74 3d 3d 30 2e 0a 2a 2a 0a 2a 2a  RowEst==0..**.**
32d40 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
32d50 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20  K on success or 
32d60 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6f 66 20  SQLITE_NOMEM of 
32d70 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  a memory allocat
32d80 69 6f 6e 0a 2a 2a 20 65 72 72 6f 72 20 6f 63 63  ion.** error occ
32d90 75 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  urs..*/.static i
32da0 6e 74 20 77 68 65 72 65 50 61 74 68 53 6f 6c 76  nt wherePathSolv
32db0 65 72 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  er(WhereInfo *pW
32dc0 49 6e 66 6f 2c 20 4c 6f 67 45 73 74 20 6e 52 6f  Info, LogEst nRo
32dd0 77 45 73 74 29 7b 0a 20 20 69 6e 74 20 6d 78 43  wEst){.  int mxC
32de0 68 6f 69 63 65 3b 20 20 20 20 20 20 20 20 20 20  hoice;          
32df0 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75     /* Maximum nu
32e00 6d 62 65 72 20 6f 66 20 73 69 6d 75 6c 74 61 6e  mber of simultan
32e10 65 6f 75 73 20 70 61 74 68 73 20 74 72 61 63 6b  eous paths track
32e20 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f 6f  ed */.  int nLoo
32e30 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
32e40 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74    /* Number of t
32e50 65 72 6d 73 20 69 6e 20 74 68 65 20 6a 6f 69 6e  erms in the join
32e60 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61   */.  Parse *pPa
32e70 72 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  rse;            
32e80 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
32e90 78 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  xt */.  sqlite3 
32ea0 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  *db;            
32eb0 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
32ec0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
32ed0 20 20 69 6e 74 20 69 4c 6f 6f 70 3b 20 20 20 20    int iLoop;    
32ee0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
32ef0 6f 6f 70 20 63 6f 75 6e 74 65 72 20 6f 76 65 72  oop counter over
32f00 20 74 68 65 20 74 65 72 6d 73 20 6f 66 20 74 68   the terms of th
32f10 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20 69 6e 74 20  e join */.  int 
32f20 69 69 2c 20 6a 6a 3b 20 20 20 20 20 20 20 20 20  ii, jj;         
32f30 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
32f40 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20  unters */.  int 
32f50 6d 78 49 20 3d 20 30 3b 20 20 20 20 20 20 20 20  mxI = 0;        
32f60 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
32f70 66 20 6e 65 78 74 20 65 6e 74 72 79 20 74 6f 20  f next entry to 
32f80 72 65 70 6c 61 63 65 20 2a 2f 0a 20 20 69 6e 74  replace */.  int
32f90 20 6e 4f 72 64 65 72 42 79 3b 20 20 20 20 20 20   nOrderBy;      
32fa0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
32fb0 20 6f 66 20 4f 52 44 45 52 20 42 59 20 63 6c 61   of ORDER BY cla
32fc0 75 73 65 20 74 65 72 6d 73 20 2a 2f 0a 20 20 4c  use terms */.  L
32fd0 6f 67 45 73 74 20 6d 78 43 6f 73 74 20 3d 20 30  ogEst mxCost = 0
32fe0 3b 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69  ;        /* Maxi
32ff0 6d 75 6d 20 63 6f 73 74 20 6f 66 20 61 20 73 65  mum cost of a se
33000 74 20 6f 66 20 70 61 74 68 73 20 2a 2f 0a 20 20  t of paths */.  
33010 4c 6f 67 45 73 74 20 6d 78 55 6e 73 6f 72 74 65  LogEst mxUnsorte
33020 64 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4d 61 78  d = 0;    /* Max
33030 69 6d 75 6d 20 75 6e 73 6f 72 74 65 64 20 63 6f  imum unsorted co
33040 73 74 20 6f 66 20 61 20 73 65 74 20 6f 66 20 70  st of a set of p
33050 61 74 68 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 6f  ath */.  int nTo
33060 2c 20 6e 46 72 6f 6d 3b 20 20 20 20 20 20 20 20  , nFrom;        
33070 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
33080 76 61 6c 69 64 20 65 6e 74 72 69 65 73 20 69 6e  valid entries in
33090 20 61 54 6f 5b 5d 20 61 6e 64 20 61 46 72 6f 6d   aTo[] and aFrom
330a0 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65 50 61 74  [] */.  WherePat
330b0 68 20 2a 61 46 72 6f 6d 3b 20 20 20 20 20 20 20  h *aFrom;       
330c0 20 20 2f 2a 20 41 6c 6c 20 6e 46 72 6f 6d 20 70    /* All nFrom p
330d0 61 74 68 73 20 61 74 20 74 68 65 20 70 72 65 76  aths at the prev
330e0 69 6f 75 73 20 6c 65 76 65 6c 20 2a 2f 0a 20 20  ious level */.  
330f0 57 68 65 72 65 50 61 74 68 20 2a 61 54 6f 3b 20  WherePath *aTo; 
33100 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
33110 20 6e 54 6f 20 62 65 73 74 20 70 61 74 68 73 20   nTo best paths 
33120 61 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  at the current l
33130 65 76 65 6c 20 2a 2f 0a 20 20 57 68 65 72 65 50  evel */.  WhereP
33140 61 74 68 20 2a 70 46 72 6f 6d 3b 20 20 20 20 20  ath *pFrom;     
33150 20 20 20 20 2f 2a 20 41 6e 20 65 6c 65 6d 65 6e      /* An elemen
33160 74 20 6f 66 20 61 46 72 6f 6d 5b 5d 20 74 68 61  t of aFrom[] tha
33170 74 20 77 65 20 61 72 65 20 77 6f 72 6b 69 6e 67  t we are working
33180 20 6f 6e 20 2a 2f 0a 20 20 57 68 65 72 65 50 61   on */.  WherePa
33190 74 68 20 2a 70 54 6f 3b 20 20 20 20 20 20 20 20  th *pTo;        
331a0 20 20 20 2f 2a 20 41 6e 20 65 6c 65 6d 65 6e 74     /* An element
331b0 20 6f 66 20 61 54 6f 5b 5d 20 74 68 61 74 20 77   of aTo[] that w
331c0 65 20 61 72 65 20 77 6f 72 6b 69 6e 67 20 6f 6e  e are working on
331d0 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20   */.  WhereLoop 
331e0 2a 70 57 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20  *pWLoop;        
331f0 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 57 68  /* One of the Wh
33200 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20  ereLoop objects 
33210 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  */.  WhereLoop *
33220 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20 20 2f  *pX;           /
33230 2a 20 55 73 65 64 20 74 6f 20 64 69 76 79 20 75  * Used to divy u
33240 70 20 74 68 65 20 70 53 70 61 63 65 20 6d 65 6d  p the pSpace mem
33250 6f 72 79 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20  ory */.  LogEst 
33260 2a 61 53 6f 72 74 43 6f 73 74 20 3d 20 30 3b 20  *aSortCost = 0; 
33270 20 20 20 2f 2a 20 53 6f 72 74 69 6e 67 20 61 6e     /* Sorting an
33280 64 20 70 61 72 74 69 61 6c 20 73 6f 72 74 69 6e  d partial sortin
33290 67 20 63 6f 73 74 73 20 2a 2f 0a 20 20 63 68 61  g costs */.  cha
332a0 72 20 2a 70 53 70 61 63 65 3b 20 20 20 20 20 20  r *pSpace;      
332b0 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72         /* Tempor
332c0 61 72 79 20 6d 65 6d 6f 72 79 20 75 73 65 64 20  ary memory used 
332d0 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  by this routine 
332e0 2a 2f 0a 20 20 69 6e 74 20 6e 53 70 61 63 65 3b  */.  int nSpace;
332f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
33300 2a 20 42 79 74 65 73 20 6f 66 20 73 70 61 63 65  * Bytes of space
33310 20 61 6c 6c 6f 63 61 74 65 64 20 61 74 20 70 53   allocated at pS
33320 70 61 63 65 20 2a 2f 0a 0a 20 20 70 50 61 72 73  pace */..  pPars
33330 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72  e = pWInfo->pPar
33340 73 65 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73  se;.  db = pPars
33350 65 2d 3e 64 62 3b 0a 20 20 6e 4c 6f 6f 70 20 3d  e->db;.  nLoop =
33360 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b   pWInfo->nLevel;
33370 0a 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 46 6f  .  /* TUNING: Fo
33380 72 20 73 69 6d 70 6c 65 20 71 75 65 72 69 65 73  r simple queries
33390 2c 20 6f 6e 6c 79 20 74 68 65 20 62 65 73 74 20  , only the best 
333a0 70 61 74 68 20 69 73 20 74 72 61 63 6b 65 64 2e  path is tracked.
333b0 0a 20 20 2a 2a 20 46 6f 72 20 32 2d 77 61 79 20  .  ** For 2-way 
333c0 6a 6f 69 6e 73 2c 20 74 68 65 20 35 20 62 65 73  joins, the 5 bes
333d0 74 20 70 61 74 68 73 20 61 72 65 20 66 6f 6c 6c  t paths are foll
333e0 6f 77 65 64 2e 0a 20 20 2a 2a 20 46 6f 72 20 6a  owed..  ** For j
333f0 6f 69 6e 73 20 6f 66 20 33 20 6f 72 20 6d 6f 72  oins of 3 or mor
33400 65 20 74 61 62 6c 65 73 2c 20 74 72 61 63 6b 20  e tables, track 
33410 74 68 65 20 31 30 20 62 65 73 74 20 70 61 74 68  the 10 best path
33420 73 20 2a 2f 0a 20 20 6d 78 43 68 6f 69 63 65 20  s */.  mxChoice 
33430 3d 20 28 6e 4c 6f 6f 70 3c 3d 31 29 20 3f 20 31  = (nLoop<=1) ? 1
33440 20 3a 20 28 6e 4c 6f 6f 70 3d 3d 32 20 3f 20 35   : (nLoop==2 ? 5
33450 20 3a 20 31 30 29 3b 0a 20 20 61 73 73 65 72 74   : 10);.  assert
33460 28 20 6e 4c 6f 6f 70 3c 3d 70 57 49 6e 66 6f 2d  ( nLoop<=pWInfo-
33470 3e 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20  >pTabList->nSrc 
33480 29 3b 0a 20 20 57 48 45 52 45 54 52 41 43 45 28  );.  WHERETRACE(
33490 30 78 30 30 32 2c 20 28 22 2d 2d 2d 2d 20 62 65  0x002, ("---- be
334a0 67 69 6e 20 73 6f 6c 76 65 72 2e 20 20 28 6e 52  gin solver.  (nR
334b0 6f 77 45 73 74 3d 25 64 29 5c 6e 22 2c 20 6e 52  owEst=%d)\n", nR
334c0 6f 77 45 73 74 29 29 3b 0a 0a 20 20 2f 2a 20 49  owEst));..  /* I
334d0 66 20 6e 52 6f 77 45 73 74 20 69 73 20 7a 65 72  f nRowEst is zer
334e0 6f 20 61 6e 64 20 74 68 65 72 65 20 69 73 20 61  o and there is a
334f0 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
33500 65 2c 20 69 67 6e 6f 72 65 20 69 74 2e 20 49 6e  e, ignore it. In
33510 20 74 68 69 73 0a 20 20 2a 2a 20 63 61 73 65 20   this.  ** case 
33520 74 68 65 20 70 75 72 70 6f 73 65 20 6f 66 20 74  the purpose of t
33530 68 69 73 20 63 61 6c 6c 20 69 73 20 74 6f 20 65  his call is to e
33540 73 74 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62  stimate the numb
33550 65 72 20 6f 66 20 72 6f 77 73 20 72 65 74 75 72  er of rows retur
33560 6e 65 64 0a 20 20 2a 2a 20 62 79 20 74 68 65 20  ned.  ** by the 
33570 6f 76 65 72 61 6c 6c 20 71 75 65 72 79 2e 20 4f  overall query. O
33580 6e 63 65 20 74 68 69 73 20 65 73 74 69 6d 61 74  nce this estimat
33590 65 20 68 61 73 20 62 65 65 6e 20 6f 62 74 61 69  e has been obtai
335a0 6e 65 64 2c 20 74 68 65 20 63 61 6c 6c 65 72 0a  ned, the caller.
335b0 20 20 2a 2a 20 77 69 6c 6c 20 69 6e 76 6f 6b 65    ** will invoke
335c0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   this function a
335d0 20 73 65 63 6f 6e 64 20 74 69 6d 65 2c 20 70 61   second time, pa
335e0 73 73 69 6e 67 20 74 68 65 20 65 73 74 69 6d 61  ssing the estima
335f0 74 65 20 61 73 20 74 68 65 0a 20 20 2a 2a 20 6e  te as the.  ** n
33600 52 6f 77 45 73 74 20 70 61 72 61 6d 65 74 65 72  RowEst parameter
33610 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 57 49 6e  .  */.  if( pWIn
33620 66 6f 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20  fo->pOrderBy==0 
33630 7c 7c 20 6e 52 6f 77 45 73 74 3d 3d 30 20 29 7b  || nRowEst==0 ){
33640 0a 20 20 20 20 6e 4f 72 64 65 72 42 79 20 3d 20  .    nOrderBy = 
33650 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
33660 6e 4f 72 64 65 72 42 79 20 3d 20 70 57 49 6e 66  nOrderBy = pWInf
33670 6f 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  o->pOrderBy->nEx
33680 70 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c  pr;.  }..  /* Al
33690 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69  locate and initi
336a0 61 6c 69 7a 65 20 73 70 61 63 65 20 66 6f 72 20  alize space for 
336b0 61 54 6f 2c 20 61 46 72 6f 6d 20 61 6e 64 20 61  aTo, aFrom and a
336c0 53 6f 72 74 43 6f 73 74 5b 5d 20 2a 2f 0a 20 20  SortCost[] */.  
336d0 6e 53 70 61 63 65 20 3d 20 28 73 69 7a 65 6f 66  nSpace = (sizeof
336e0 28 57 68 65 72 65 50 61 74 68 29 2b 73 69 7a 65  (WherePath)+size
336f0 6f 66 28 57 68 65 72 65 4c 6f 6f 70 2a 29 2a 6e  of(WhereLoop*)*n
33700 4c 6f 6f 70 29 2a 6d 78 43 68 6f 69 63 65 2a 32  Loop)*mxChoice*2
33710 3b 0a 20 20 6e 53 70 61 63 65 20 2b 3d 20 73 69  ;.  nSpace += si
33720 7a 65 6f 66 28 4c 6f 67 45 73 74 29 20 2a 20 6e  zeof(LogEst) * n
33730 4f 72 64 65 72 42 79 3b 0a 20 20 70 53 70 61 63  OrderBy;.  pSpac
33740 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  e = sqlite3DbMal
33750 6c 6f 63 52 61 77 28 64 62 2c 20 6e 53 70 61 63  locRaw(db, nSpac
33760 65 29 3b 0a 20 20 69 66 28 20 70 53 70 61 63 65  e);.  if( pSpace
33770 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
33780 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 61 54 6f  ITE_NOMEM;.  aTo
33790 20 3d 20 28 57 68 65 72 65 50 61 74 68 2a 29 70   = (WherePath*)p
337a0 53 70 61 63 65 3b 0a 20 20 61 46 72 6f 6d 20 3d  Space;.  aFrom =
337b0 20 61 54 6f 2b 6d 78 43 68 6f 69 63 65 3b 0a 20   aTo+mxChoice;. 
337c0 20 6d 65 6d 73 65 74 28 61 46 72 6f 6d 2c 20 30   memset(aFrom, 0
337d0 2c 20 73 69 7a 65 6f 66 28 61 46 72 6f 6d 5b 30  , sizeof(aFrom[0
337e0 5d 29 29 3b 0a 20 20 70 58 20 3d 20 28 57 68 65  ]));.  pX = (Whe
337f0 72 65 4c 6f 6f 70 2a 2a 29 28 61 46 72 6f 6d 2b  reLoop**)(aFrom+
33800 6d 78 43 68 6f 69 63 65 29 3b 0a 20 20 66 6f 72  mxChoice);.  for
33810 28 69 69 3d 6d 78 43 68 6f 69 63 65 2a 32 2c 20  (ii=mxChoice*2, 
33820 70 46 72 6f 6d 3d 61 54 6f 3b 20 69 69 3e 30 3b  pFrom=aTo; ii>0;
33830 20 69 69 2d 2d 2c 20 70 46 72 6f 6d 2b 2b 2c 20   ii--, pFrom++, 
33840 70 58 20 2b 3d 20 6e 4c 6f 6f 70 29 7b 0a 20 20  pX += nLoop){.  
33850 20 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 20 3d    pFrom->aLoop =
33860 20 70 58 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e   pX;.  }.  if( n
33870 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 2f  OrderBy ){.    /
33880 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e  * If there is an
33890 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
338a0 20 61 6e 64 20 69 74 20 69 73 20 6e 6f 74 20 62   and it is not b
338b0 65 69 6e 67 20 69 67 6e 6f 72 65 64 2c 20 73 65  eing ignored, se
338c0 74 20 75 70 0a 20 20 20 20 2a 2a 20 73 70 61 63  t up.    ** spac
338d0 65 20 66 6f 72 20 74 68 65 20 61 53 6f 72 74 43  e for the aSortC
338e0 6f 73 74 5b 5d 20 61 72 72 61 79 2e 20 45 61 63  ost[] array. Eac
338f0 68 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65  h element of the
33900 20 61 53 6f 72 74 43 6f 73 74 20 61 72 72 61 79   aSortCost array
33910 0a 20 20 20 20 2a 2a 20 69 73 20 65 69 74 68 65  .    ** is eithe
33920 72 20 7a 65 72 6f 20 2d 20 6d 65 61 6e 69 6e 67  r zero - meaning
33930 20 69 74 20 68 61 73 20 6e 6f 74 20 79 65 74 20   it has not yet 
33940 62 65 65 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64  been initialized
33950 20 2d 20 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a   - or the.    **
33960 20 63 6f 73 74 20 6f 66 20 73 6f 72 74 69 6e 67   cost of sorting
33970 20 6e 52 6f 77 45 73 74 20 72 6f 77 73 20 6f 66   nRowEst rows of
33980 20 64 61 74 61 20 77 68 65 72 65 20 74 68 65 20   data where the 
33990 66 69 72 73 74 20 58 20 74 65 72 6d 73 20 6f 66  first X terms of
339a0 0a 20 20 20 20 2a 2a 20 74 68 65 20 4f 52 44 45  .    ** the ORDE
339b0 52 20 42 59 20 63 6c 61 75 73 65 20 61 72 65 20  R BY clause are 
339c0 61 6c 72 65 61 64 79 20 69 6e 20 6f 72 64 65 72  already in order
339d0 2c 20 77 68 65 72 65 20 58 20 69 73 20 74 68 65  , where X is the
339e0 20 61 72 72 61 79 20 0a 20 20 20 20 2a 2a 20 69   array .    ** i
339f0 6e 64 65 78 2e 20 20 2a 2f 0a 20 20 20 20 61 53  ndex.  */.    aS
33a00 6f 72 74 43 6f 73 74 20 3d 20 28 4c 6f 67 45 73  ortCost = (LogEs
33a10 74 2a 29 70 58 3b 0a 20 20 20 20 6d 65 6d 73 65  t*)pX;.    memse
33a20 74 28 61 53 6f 72 74 43 6f 73 74 2c 20 30 2c 20  t(aSortCost, 0, 
33a30 73 69 7a 65 6f 66 28 4c 6f 67 45 73 74 29 20 2a  sizeof(LogEst) *
33a40 20 6e 4f 72 64 65 72 42 79 29 3b 0a 20 20 7d 0a   nOrderBy);.  }.
33a50 20 20 61 73 73 65 72 74 28 20 61 53 6f 72 74 43    assert( aSortC
33a60 6f 73 74 3d 3d 30 20 7c 7c 20 26 70 53 70 61 63  ost==0 || &pSpac
33a70 65 5b 6e 53 70 61 63 65 5d 3d 3d 28 63 68 61 72  e[nSpace]==(char
33a80 2a 29 26 61 53 6f 72 74 43 6f 73 74 5b 6e 4f 72  *)&aSortCost[nOr
33a90 64 65 72 42 79 5d 20 29 3b 0a 20 20 61 73 73 65  derBy] );.  asse
33aa0 72 74 28 20 61 53 6f 72 74 43 6f 73 74 21 3d 30  rt( aSortCost!=0
33ab0 20 7c 7c 20 26 70 53 70 61 63 65 5b 6e 53 70 61   || &pSpace[nSpa
33ac0 63 65 5d 3d 3d 28 63 68 61 72 2a 29 70 58 20 29  ce]==(char*)pX )
33ad0 3b 0a 0a 20 20 2f 2a 20 53 65 65 64 20 74 68 65  ;..  /* Seed the
33ae0 20 73 65 61 72 63 68 20 77 69 74 68 20 61 20 73   search with a s
33af0 69 6e 67 6c 65 20 57 68 65 72 65 50 61 74 68 20  ingle WherePath 
33b00 63 6f 6e 74 61 69 6e 69 6e 67 20 7a 65 72 6f 20  containing zero 
33b10 57 68 65 72 65 4c 6f 6f 70 73 2e 0a 20 20 2a 2a  WhereLoops..  **
33b20 0a 20 20 2a 2a 20 54 55 4e 49 4e 47 3a 20 44 6f  .  ** TUNING: Do
33b30 20 6e 6f 74 20 6c 65 74 20 74 68 65 20 6e 75 6d   not let the num
33b40 62 65 72 20 6f 66 20 69 74 65 72 61 74 69 6f 6e  ber of iteration
33b50 73 20 67 6f 20 61 62 6f 76 65 20 32 35 2e 20 20  s go above 25.  
33b60 49 66 20 74 68 65 20 63 6f 73 74 0a 20 20 2a 2a  If the cost.  **
33b70 20 6f 66 20 63 6f 6d 70 75 74 69 6e 67 20 61 6e   of computing an
33b80 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78   automatic index
33b90 20 69 73 20 6e 6f 74 20 70 61 69 64 20 62 61 63   is not paid bac
33ba0 6b 20 77 69 74 68 69 6e 20 74 68 65 20 66 69 72  k within the fir
33bb0 73 74 20 32 35 0a 20 20 2a 2a 20 72 6f 77 73 2c  st 25.  ** rows,
33bc0 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 75 73 65   then do not use
33bd0 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69   the automatic i
33be0 6e 64 65 78 2e 20 2a 2f 0a 20 20 61 46 72 6f 6d  ndex. */.  aFrom
33bf0 5b 30 5d 2e 6e 52 6f 77 20 3d 20 4d 49 4e 28 70  [0].nRow = MIN(p
33c00 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f  Parse->nQueryLoo
33c10 70 2c 20 34 36 29 3b 20 20 61 73 73 65 72 74 28  p, 46);  assert(
33c20 20 34 36 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45   46==sqlite3LogE
33c30 73 74 28 32 35 29 20 29 3b 0a 20 20 6e 46 72 6f  st(25) );.  nFro
33c40 6d 20 3d 20 31 3b 0a 20 20 61 73 73 65 72 74 28  m = 1;.  assert(
33c50 20 61 46 72 6f 6d 5b 30 5d 2e 69 73 4f 72 64 65   aFrom[0].isOrde
33c60 72 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  red==0 );.  if( 
33c70 6e 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  nOrderBy ){.    
33c80 2f 2a 20 49 66 20 6e 4c 6f 6f 70 20 69 73 20 7a  /* If nLoop is z
33c90 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 72 65 20  ero, then there 
33ca0 61 72 65 20 6e 6f 20 46 52 4f 4d 20 74 65 72 6d  are no FROM term
33cb0 73 20 69 6e 20 74 68 65 20 71 75 65 72 79 2e 20  s in the query. 
33cc0 53 69 6e 63 65 0a 20 20 20 20 2a 2a 20 69 6e 20  Since.    ** in 
33cd0 74 68 69 73 20 63 61 73 65 20 74 68 65 20 71 75  this case the qu
33ce0 65 72 79 20 6d 61 79 20 72 65 74 75 72 6e 20 61  ery may return a
33cf0 20 6d 61 78 69 6d 75 6d 20 6f 66 20 6f 6e 65 20   maximum of one 
33d00 72 6f 77 2c 20 74 68 65 20 72 65 73 75 6c 74 73  row, the results
33d10 0a 20 20 20 20 2a 2a 20 61 72 65 20 61 6c 72 65  .    ** are alre
33d20 61 64 79 20 69 6e 20 74 68 65 20 72 65 71 75 65  ady in the reque
33d30 73 74 65 64 20 6f 72 64 65 72 2e 20 53 65 74 20  sted order. Set 
33d40 69 73 4f 72 64 65 72 65 64 20 74 6f 20 6e 4f 72  isOrdered to nOr
33d50 64 65 72 42 79 20 74 6f 0a 20 20 20 20 2a 2a 20  derBy to.    ** 
33d60 69 6e 64 69 63 61 74 65 20 74 68 69 73 2e 20 4f  indicate this. O
33d70 72 2c 20 69 66 20 6e 4c 6f 6f 70 20 69 73 20 67  r, if nLoop is g
33d80 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f  reater than zero
33d90 2c 20 73 65 74 20 69 73 4f 72 64 65 72 65 64 20  , set isOrdered 
33da0 74 6f 0a 20 20 20 20 2a 2a 20 2d 31 2c 20 69 6e  to.    ** -1, in
33db0 64 69 63 61 74 69 6e 67 20 74 68 61 74 20 74 68  dicating that th
33dc0 65 20 72 65 73 75 6c 74 20 73 65 74 20 6d 61 79  e result set may
33dd0 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f   or may not be o
33de0 72 64 65 72 65 64 2c 20 0a 20 20 20 20 2a 2a 20  rdered, .    ** 
33df0 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65  depending on the
33e00 20 6c 6f 6f 70 73 20 61 64 64 65 64 20 74 6f 20   loops added to 
33e10 74 68 65 20 63 75 72 72 65 6e 74 20 70 6c 61 6e  the current plan
33e20 2e 20 20 2a 2f 0a 20 20 20 20 61 46 72 6f 6d 5b  .  */.    aFrom[
33e30 30 5d 2e 69 73 4f 72 64 65 72 65 64 20 3d 20 6e  0].isOrdered = n
33e40 4c 6f 6f 70 3e 30 20 3f 20 2d 31 20 3a 20 6e 4f  Loop>0 ? -1 : nO
33e50 72 64 65 72 42 79 3b 0a 20 20 7d 0a 0a 20 20 2f  rderBy;.  }..  /
33e60 2a 20 43 6f 6d 70 75 74 65 20 73 75 63 63 65 73  * Compute succes
33e70 73 69 76 65 6c 79 20 6c 6f 6e 67 65 72 20 57 68  sively longer Wh
33e80 65 72 65 50 61 74 68 73 20 75 73 69 6e 67 20 74  erePaths using t
33e90 68 65 20 70 72 65 76 69 6f 75 73 20 67 65 6e 65  he previous gene
33ea0 72 61 74 69 6f 6e 0a 20 20 2a 2a 20 6f 66 20 57  ration.  ** of W
33eb0 68 65 72 65 50 61 74 68 73 20 61 73 20 74 68 65  herePaths as the
33ec0 20 62 61 73 69 73 20 66 6f 72 20 74 68 65 20 6e   basis for the n
33ed0 65 78 74 2e 20 20 4b 65 65 70 20 74 72 61 63 6b  ext.  Keep track
33ee0 20 6f 66 20 74 68 65 20 6d 78 43 68 6f 69 63 65   of the mxChoice
33ef0 0a 20 20 2a 2a 20 62 65 73 74 20 70 61 74 68 73  .  ** best paths
33f00 20 61 74 20 65 61 63 68 20 67 65 6e 65 72 61 74   at each generat
33f10 69 6f 6e 20 2a 2f 0a 20 20 66 6f 72 28 69 4c 6f  ion */.  for(iLo
33f20 6f 70 3d 30 3b 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f  op=0; iLoop<nLoo
33f30 70 3b 20 69 4c 6f 6f 70 2b 2b 29 7b 0a 20 20 20  p; iLoop++){.   
33f40 20 6e 54 6f 20 3d 20 30 3b 0a 20 20 20 20 66 6f   nTo = 0;.    fo
33f50 72 28 69 69 3d 30 2c 20 70 46 72 6f 6d 3d 61 46  r(ii=0, pFrom=aF
33f60 72 6f 6d 3b 20 69 69 3c 6e 46 72 6f 6d 3b 20 69  rom; ii<nFrom; i
33f70 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20  i++, pFrom++){. 
33f80 20 20 20 20 20 66 6f 72 28 70 57 4c 6f 6f 70 3d       for(pWLoop=
33f90 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 3b 20  pWInfo->pLoops; 
33fa0 70 57 4c 6f 6f 70 3b 20 70 57 4c 6f 6f 70 3d 70  pWLoop; pWLoop=p
33fb0 57 4c 6f 6f 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70  WLoop->pNextLoop
33fc0 29 7b 0a 20 20 20 20 20 20 20 20 4c 6f 67 45 73  ){.        LogEs
33fd0 74 20 6e 4f 75 74 3b 20 20 20 20 20 20 20 20 20  t nOut;         
33fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
33ff0 52 6f 77 73 20 76 69 73 69 74 65 64 20 62 79 20  Rows visited by 
34000 28 70 46 72 6f 6d 2b 70 57 4c 6f 6f 70 29 20 2a  (pFrom+pWLoop) *
34010 2f 0a 20 20 20 20 20 20 20 20 4c 6f 67 45 73 74  /.        LogEst
34020 20 72 43 6f 73 74 3b 20 20 20 20 20 20 20 20 20   rCost;         
34030 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
34040 6f 73 74 20 6f 66 20 70 61 74 68 20 28 70 46 72  ost of path (pFr
34050 6f 6d 2b 70 57 4c 6f 6f 70 29 20 2a 2f 0a 20 20  om+pWLoop) */.  
34060 20 20 20 20 20 20 4c 6f 67 45 73 74 20 72 55 6e        LogEst rUn
34070 73 6f 72 74 65 64 3b 20 20 20 20 20 20 20 20 20  sorted;         
34080 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 6f 72          /* Unsor
34090 74 65 64 20 63 6f 73 74 20 6f 66 20 28 70 46 72  ted cost of (pFr
340a0 6f 6d 2b 70 57 4c 6f 6f 70 29 20 2a 2f 0a 20 20  om+pWLoop) */.  
340b0 20 20 20 20 20 20 69 38 20 69 73 4f 72 64 65 72        i8 isOrder
340c0 65 64 20 3d 20 70 46 72 6f 6d 2d 3e 69 73 4f 72  ed = pFrom->isOr
340d0 64 65 72 65 64 3b 20 20 2f 2a 20 69 73 4f 72 64  dered;  /* isOrd
340e0 65 72 65 64 20 66 6f 72 20 28 70 46 72 6f 6d 2b  ered for (pFrom+
340f0 70 57 4c 6f 6f 70 29 20 2a 2f 0a 20 20 20 20 20  pWLoop) */.     
34100 20 20 20 42 69 74 6d 61 73 6b 20 6d 61 73 6b 4e     Bitmask maskN
34110 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ew;             
34120 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
34130 73 72 63 20 76 69 73 69 74 65 64 20 62 79 20 28  src visited by (
34140 2e 2e 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 42  ..) */.        B
34150 69 74 6d 61 73 6b 20 72 65 76 4d 61 73 6b 20 3d  itmask revMask =
34160 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
34170 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 72 65 76 2d   /* Mask of rev-
34180 6f 72 64 65 72 20 6c 6f 6f 70 73 20 66 6f 72 20  order loops for 
34190 28 2e 2e 29 20 2a 2f 0a 0a 20 20 20 20 20 20 20  (..) */..       
341a0 20 69 66 28 20 28 70 57 4c 6f 6f 70 2d 3e 70 72   if( (pWLoop->pr
341b0 65 72 65 71 20 26 20 7e 70 46 72 6f 6d 2d 3e 6d  ereq & ~pFrom->m
341c0 61 73 6b 4c 6f 6f 70 29 21 3d 30 20 29 20 63 6f  askLoop)!=0 ) co
341d0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
341e0 69 66 28 20 28 70 57 4c 6f 6f 70 2d 3e 6d 61 73  if( (pWLoop->mas
341f0 6b 53 65 6c 66 20 26 20 70 46 72 6f 6d 2d 3e 6d  kSelf & pFrom->m
34200 61 73 6b 4c 6f 6f 70 29 21 3d 30 20 29 20 63 6f  askLoop)!=0 ) co
34210 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
34220 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  /* At this point
34230 2c 20 70 57 4c 6f 6f 70 20 69 73 20 61 20 63 61  , pWLoop is a ca
34240 6e 64 69 64 61 74 65 20 74 6f 20 62 65 20 74 68  ndidate to be th
34250 65 20 6e 65 78 74 20 6c 6f 6f 70 2e 20 0a 20 20  e next loop. .  
34260 20 20 20 20 20 20 2a 2a 20 43 6f 6d 70 75 74 65        ** Compute
34270 20 69 74 73 20 63 6f 73 74 20 2a 2f 0a 20 20 20   its cost */.   
34280 20 20 20 20 20 72 55 6e 73 6f 72 74 65 64 20 3d       rUnsorted =
34290 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64   sqlite3LogEstAd
342a0 64 28 70 57 4c 6f 6f 70 2d 3e 72 53 65 74 75 70  d(pWLoop->rSetup
342b0 2c 70 57 4c 6f 6f 70 2d 3e 72 52 75 6e 20 2b 20  ,pWLoop->rRun + 
342c0 70 46 72 6f 6d 2d 3e 6e 52 6f 77 29 3b 0a 20 20  pFrom->nRow);.  
342d0 20 20 20 20 20 20 72 55 6e 73 6f 72 74 65 64 20        rUnsorted 
342e0 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41  = sqlite3LogEstA
342f0 64 64 28 72 55 6e 73 6f 72 74 65 64 2c 20 70 46  dd(rUnsorted, pF
34300 72 6f 6d 2d 3e 72 55 6e 73 6f 72 74 65 64 29 3b  rom->rUnsorted);
34310 0a 20 20 20 20 20 20 20 20 6e 4f 75 74 20 3d 20  .        nOut = 
34320 70 46 72 6f 6d 2d 3e 6e 52 6f 77 20 2b 20 70 57  pFrom->nRow + pW
34330 4c 6f 6f 70 2d 3e 6e 4f 75 74 3b 0a 20 20 20 20  Loop->nOut;.    
34340 20 20 20 20 6d 61 73 6b 4e 65 77 20 3d 20 70 46      maskNew = pF
34350 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 20 7c 20  rom->maskLoop | 
34360 70 57 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66  pWLoop->maskSelf
34370 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 73  ;.        if( is
34380 4f 72 64 65 72 65 64 3c 30 20 29 7b 0a 20 20 20  Ordered<0 ){.   
34390 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 65 64         isOrdered
343a0 20 3d 20 77 68 65 72 65 50 61 74 68 53 61 74 69   = wherePathSati
343b0 73 66 69 65 73 4f 72 64 65 72 42 79 28 70 57 49  sfiesOrderBy(pWI
343c0 6e 66 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  nfo,.           
343d0 20 20 20 20 20 20 20 20 20 20 20 20 70 57 49 6e              pWIn
343e0 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2c 20 70 46  fo->pOrderBy, pF
343f0 72 6f 6d 2c 20 70 57 49 6e 66 6f 2d 3e 77 63 74  rom, pWInfo->wct
34400 72 6c 46 6c 61 67 73 2c 0a 20 20 20 20 20 20 20  rlFlags,.       
34410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34420 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 2c 20 26  iLoop, pWLoop, &
34430 72 65 76 4d 61 73 6b 29 3b 0a 20 20 20 20 20 20  revMask);.      
34440 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
34450 20 20 20 72 65 76 4d 61 73 6b 20 3d 20 70 46 72     revMask = pFr
34460 6f 6d 2d 3e 72 65 76 4c 6f 6f 70 3b 0a 20 20 20  om->revLoop;.   
34470 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
34480 66 28 20 69 73 4f 72 64 65 72 65 64 3e 3d 30 20  f( isOrdered>=0 
34490 26 26 20 69 73 4f 72 64 65 72 65 64 3c 6e 4f 72  && isOrdered<nOr
344a0 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20  derBy ){.       
344b0 20 20 20 69 66 28 20 61 53 6f 72 74 43 6f 73 74     if( aSortCost
344c0 5b 69 73 4f 72 64 65 72 65 64 5d 3d 3d 30 20 29  [isOrdered]==0 )
344d0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 53  {.            aS
344e0 6f 72 74 43 6f 73 74 5b 69 73 4f 72 64 65 72 65  ortCost[isOrdere
344f0 64 5d 20 3d 20 77 68 65 72 65 53 6f 72 74 69 6e  d] = whereSortin
34500 67 43 6f 73 74 28 0a 20 20 20 20 20 20 20 20 20  gCost(.         
34510 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2c 20 6e         pWInfo, n
34520 52 6f 77 45 73 74 2c 20 6e 4f 72 64 65 72 42 79  RowEst, nOrderBy
34530 2c 20 69 73 4f 72 64 65 72 65 64 0a 20 20 20 20  , isOrdered.    
34540 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
34550 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
34560 20 72 43 6f 73 74 20 3d 20 73 71 6c 69 74 65 33   rCost = sqlite3
34570 4c 6f 67 45 73 74 41 64 64 28 72 55 6e 73 6f 72  LogEstAdd(rUnsor
34580 74 65 64 2c 20 61 53 6f 72 74 43 6f 73 74 5b 69  ted, aSortCost[i
34590 73 4f 72 64 65 72 65 64 5d 29 3b 0a 0a 20 20 20  sOrdered]);..   
345a0 20 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43         WHERETRAC
345b0 45 28 30 78 30 30 32 2c 0a 20 20 20 20 20 20 20  E(0x002,.       
345c0 20 20 20 20 20 20 20 28 22 2d 2d 2d 2d 20 73 6f         ("---- so
345d0 72 74 20 63 6f 73 74 3d 25 2d 33 64 20 28 25 64  rt cost=%-3d (%d
345e0 2f 25 64 29 20 69 6e 63 72 65 61 73 65 73 20 63  /%d) increases c
345f0 6f 73 74 20 25 33 64 20 74 6f 20 25 2d 33 64 5c  ost %3d to %-3d\
34600 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
34610 20 20 20 61 53 6f 72 74 43 6f 73 74 5b 69 73 4f     aSortCost[isO
34620 72 64 65 72 65 64 5d 2c 20 28 6e 4f 72 64 65 72  rdered], (nOrder
34630 42 79 2d 69 73 4f 72 64 65 72 65 64 29 2c 20 6e  By-isOrdered), n
34640 4f 72 64 65 72 42 79 2c 20 0a 20 20 20 20 20 20  OrderBy, .      
34650 20 20 20 20 20 20 20 20 20 72 55 6e 73 6f 72 74           rUnsort
34660 65 64 2c 20 72 43 6f 73 74 29 29 3b 0a 20 20 20  ed, rCost));.   
34670 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
34680 20 20 20 20 20 20 72 43 6f 73 74 20 3d 20 72 55        rCost = rU
34690 6e 73 6f 72 74 65 64 3b 0a 20 20 20 20 20 20 20  nsorted;.       
346a0 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 43   }..        /* C
346b0 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 70  heck to see if p
346c0 57 4c 6f 6f 70 20 73 68 6f 75 6c 64 20 62 65 20  WLoop should be 
346d0 61 64 64 65 64 20 74 6f 20 74 68 65 20 73 65 74  added to the set
346e0 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d   of.        ** m
346f0 78 43 68 6f 69 63 65 20 62 65 73 74 2d 73 6f 2d  xChoice best-so-
34700 66 61 72 20 70 61 74 68 73 2e 0a 20 20 20 20 20  far paths..     
34710 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
34720 20 46 69 72 73 74 20 6c 6f 6f 6b 20 66 6f 72 20   First look for 
34730 61 6e 20 65 78 69 73 74 69 6e 67 20 70 61 74 68  an existing path
34740 20 61 6d 6f 6e 67 20 62 65 73 74 2d 73 6f 2d 66   among best-so-f
34750 61 72 20 70 61 74 68 73 0a 20 20 20 20 20 20 20  ar paths.       
34760 20 2a 2a 20 74 68 61 74 20 63 6f 76 65 72 73 20   ** that covers 
34770 74 68 65 20 73 61 6d 65 20 73 65 74 20 6f 66 20  the same set of 
34780 6c 6f 6f 70 73 20 61 6e 64 20 68 61 73 20 74 68  loops and has th
34790 65 20 73 61 6d 65 20 69 73 4f 72 64 65 72 65 64  e same isOrdered
347a0 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 65 74 74  .        ** sett
347b0 69 6e 67 20 61 73 20 74 68 65 20 63 75 72 72 65  ing as the curre
347c0 6e 74 20 70 61 74 68 20 63 61 6e 64 69 64 61 74  nt path candidat
347d0 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  e..        **.  
347e0 20 20 20 20 20 20 2a 2a 20 54 68 65 20 74 65 72        ** The ter
347f0 6d 20 22 28 28 70 54 6f 2d 3e 69 73 4f 72 64 65  m "((pTo->isOrde
34800 72 65 64 5e 69 73 4f 72 64 65 72 65 64 29 26 30  red^isOrdered)&0
34810 78 38 30 29 3d 3d 30 22 20 69 73 20 65 71 75 69  x80)==0" is equi
34820 76 61 6c 65 6e 74 0a 20 20 20 20 20 20 20 20 2a  valent.        *
34830 2a 20 74 6f 20 28 70 54 6f 2d 3e 69 73 4f 72 64  * to (pTo->isOrd
34840 65 72 65 64 3d 3d 28 2d 31 29 29 3d 3d 28 69 73  ered==(-1))==(is
34850 4f 72 64 65 72 65 64 3d 3d 28 2d 31 29 29 22 20  Ordered==(-1))" 
34860 66 6f 72 20 74 68 65 20 72 61 6e 67 65 0a 20 20  for the range.  
34870 20 20 20 20 20 20 2a 2a 20 6f 66 20 6c 65 67 61        ** of lega
34880 6c 20 76 61 6c 75 65 73 20 66 6f 72 20 69 73 4f  l values for isO
34890 72 64 65 72 65 64 2c 20 2d 31 2e 2e 36 34 2e 0a  rdered, -1..64..
348a0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
348b0 20 20 20 66 6f 72 28 6a 6a 3d 30 2c 20 70 54 6f     for(jj=0, pTo
348c0 3d 61 54 6f 3b 20 6a 6a 3c 6e 54 6f 3b 20 6a 6a  =aTo; jj<nTo; jj
348d0 2b 2b 2c 20 70 54 6f 2b 2b 29 7b 0a 20 20 20 20  ++, pTo++){.    
348e0 20 20 20 20 20 20 69 66 28 20 70 54 6f 2d 3e 6d        if( pTo->m
348f0 61 73 6b 4c 6f 6f 70 3d 3d 6d 61 73 6b 4e 65 77  askLoop==maskNew
34900 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28  .           && (
34910 28 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 5e  (pTo->isOrdered^
34920 69 73 4f 72 64 65 72 65 64 29 26 30 78 38 30 29  isOrdered)&0x80)
34930 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 29 7b  ==0.          ){
34940 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73  .            tes
34950 74 63 61 73 65 28 20 6a 6a 3d 3d 6e 54 6f 2d 31  tcase( jj==nTo-1
34960 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
34970 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
34980 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
34990 20 20 20 20 20 69 66 28 20 6a 6a 3e 3d 6e 54 6f       if( jj>=nTo
349a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
349b0 20 4e 6f 6e 65 20 6f 66 20 74 68 65 20 65 78 69   None of the exi
349c0 73 74 69 6e 67 20 62 65 73 74 2d 73 6f 2d 66 61  sting best-so-fa
349d0 72 20 70 61 74 68 73 20 6d 61 74 63 68 20 74 68  r paths match th
349e0 65 20 63 61 6e 64 69 64 61 74 65 2e 20 2a 2f 0a  e candidate. */.
349f0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 54            if( nT
34a00 6f 3e 3d 6d 78 43 68 6f 69 63 65 0a 20 20 20 20  o>=mxChoice.    
34a10 20 20 20 20 20 20 20 26 26 20 28 72 43 6f 73 74         && (rCost
34a20 3e 6d 78 43 6f 73 74 20 7c 7c 20 28 72 43 6f 73  >mxCost || (rCos
34a30 74 3d 3d 6d 78 43 6f 73 74 20 26 26 20 72 55 6e  t==mxCost && rUn
34a40 73 6f 72 74 65 64 3e 3d 6d 78 55 6e 73 6f 72 74  sorted>=mxUnsort
34a50 65 64 29 29 0a 20 20 20 20 20 20 20 20 20 20 29  ed)).          )
34a60 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  {.            /*
34a70 20 54 68 65 20 63 75 72 72 65 6e 74 20 63 61 6e   The current can
34a80 64 69 64 61 74 65 20 69 73 20 6e 6f 20 62 65 74  didate is no bet
34a90 74 65 72 20 74 68 61 6e 20 61 6e 79 20 6f 66 20  ter than any of 
34aa0 74 68 65 20 6d 78 43 68 6f 69 63 65 0a 20 20 20  the mxChoice.   
34ab0 20 20 20 20 20 20 20 20 20 2a 2a 20 70 61 74 68           ** path
34ac0 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 74  s currently in t
34ad0 68 65 20 62 65 73 74 2d 73 6f 2d 66 61 72 20 62  he best-so-far b
34ae0 75 66 66 65 72 2e 20 20 53 6f 20 64 69 73 63 61  uffer.  So disca
34af0 72 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  rd.            *
34b00 2a 20 74 68 69 73 20 63 61 6e 64 69 64 61 74 65  * this candidate
34b10 20 61 73 20 6e 6f 74 20 76 69 61 62 6c 65 2e 20   as not viable. 
34b20 2a 2f 0a 23 69 66 64 65 66 20 57 48 45 52 45 54  */.#ifdef WHERET
34b30 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20  RACE_ENABLED /* 
34b40 30 78 34 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  0x4 */.         
34b50 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68     if( sqlite3Wh
34b60 65 72 65 54 72 61 63 65 26 30 78 34 20 29 7b 0a  ereTrace&0x4 ){.
34b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
34b80 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
34b90 28 22 53 6b 69 70 20 20 20 25 73 20 63 6f 73 74  ("Skip   %s cost
34ba0 3d 25 2d 33 64 2c 25 33 64 20 6f 72 64 65 72 3d  =%-3d,%3d order=
34bb0 25 63 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %c\n",.         
34bc0 20 20 20 20 20 20 20 20 20 77 68 65 72 65 50 61           wherePa
34bd0 74 68 4e 61 6d 65 28 70 46 72 6f 6d 2c 20 69 4c  thName(pFrom, iL
34be0 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c 20 72 43  oop, pWLoop), rC
34bf0 6f 73 74 2c 20 6e 4f 75 74 2c 0a 20 20 20 20 20  ost, nOut,.     
34c00 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f               isO
34c10 72 64 65 72 65 64 3e 3d 30 20 3f 20 69 73 4f 72  rdered>=0 ? isOr
34c20 64 65 72 65 64 2b 27 30 27 20 3a 20 27 3f 27 29  dered+'0' : '?')
34c30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
34c40 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20  #endif.         
34c50 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
34c60 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
34c70 20 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63     /* If we reac
34c80 68 20 74 68 69 73 20 70 6f 69 6e 74 73 20 69 74  h this points it
34c90 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
34ca0 6e 65 77 20 63 61 6e 64 69 64 61 74 65 20 70 61  new candidate pa
34cb0 74 68 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  th.          ** 
34cc0 6e 65 65 64 73 20 74 6f 20 62 65 20 61 64 64 65  needs to be adde
34cd0 64 20 74 6f 20 74 68 65 20 73 65 74 20 6f 66 20  d to the set of 
34ce0 62 65 73 74 2d 73 6f 2d 66 61 72 20 70 61 74 68  best-so-far path
34cf0 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  s. */.          
34d00 69 66 28 20 6e 54 6f 3c 6d 78 43 68 6f 69 63 65  if( nTo<mxChoice
34d10 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
34d20 2f 2a 20 49 6e 63 72 65 61 73 65 20 74 68 65 20  /* Increase the 
34d30 73 69 7a 65 20 6f 66 20 74 68 65 20 61 54 6f 20  size of the aTo 
34d40 73 65 74 20 62 79 20 6f 6e 65 20 2a 2f 0a 20 20  set by one */.  
34d50 20 20 20 20 20 20 20 20 20 20 6a 6a 20 3d 20 6e            jj = n
34d60 54 6f 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  To++;.          
34d70 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
34d80 20 20 20 2f 2a 20 4e 65 77 20 70 61 74 68 20 72     /* New path r
34d90 65 70 6c 61 63 65 73 20 74 68 65 20 70 72 69 6f  eplaces the prio
34da0 72 20 77 6f 72 73 74 20 74 6f 20 6b 65 65 70 20  r worst to keep 
34db0 63 6f 75 6e 74 20 62 65 6c 6f 77 20 6d 78 43 68  count below mxCh
34dc0 6f 69 63 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  oice */.        
34dd0 20 20 20 20 6a 6a 20 3d 20 6d 78 49 3b 0a 20 20      jj = mxI;.  
34de0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
34df0 20 20 20 20 70 54 6f 20 3d 20 26 61 54 6f 5b 6a      pTo = &aTo[j
34e00 6a 5d 3b 0a 23 69 66 64 65 66 20 57 48 45 52 45  j];.#ifdef WHERE
34e10 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a  TRACE_ENABLED /*
34e20 20 30 78 34 20 2a 2f 0a 20 20 20 20 20 20 20 20   0x4 */.        
34e30 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65    if( sqlite3Whe
34e40 72 65 54 72 61 63 65 26 30 78 34 20 29 7b 0a 20  reTrace&0x4 ){. 
34e50 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
34e60 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 4e  e3DebugPrintf("N
34e70 65 77 20 20 20 20 25 73 20 63 6f 73 74 3d 25 2d  ew    %s cost=%-
34e80 33 64 2c 25 33 64 20 6f 72 64 65 72 3d 25 63 5c  3d,%3d order=%c\
34e90 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
34ea0 20 20 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d      wherePathNam
34eb0 65 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20  e(pFrom, iLoop, 
34ec0 70 57 4c 6f 6f 70 29 2c 20 72 43 6f 73 74 2c 20  pWLoop), rCost, 
34ed0 6e 4f 75 74 2c 0a 20 20 20 20 20 20 20 20 20 20  nOut,.          
34ee0 20 20 20 20 20 20 69 73 4f 72 64 65 72 65 64 3e        isOrdered>
34ef0 3d 30 20 3f 20 69 73 4f 72 64 65 72 65 64 2b 27  =0 ? isOrdered+'
34f00 30 27 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20  0' : '?');.     
34f10 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
34f20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
34f30 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 72 6f         /* Contro
34f40 6c 20 72 65 61 63 68 65 73 20 68 65 72 65 20 69  l reaches here i
34f50 66 20 62 65 73 74 2d 73 6f 2d 66 61 72 20 70 61  f best-so-far pa
34f60 74 68 20 70 54 6f 3d 61 54 6f 5b 6a 6a 5d 20 63  th pTo=aTo[jj] c
34f70 6f 76 65 72 73 20 74 68 65 0a 20 20 20 20 20 20  overs the.      
34f80 20 20 20 20 2a 2a 20 73 61 6d 65 20 73 65 74 20      ** same set 
34f90 6f 66 20 6c 6f 6f 70 73 20 61 6e 64 20 68 61 73  of loops and has
34fa0 20 74 68 65 20 73 61 6d 20 69 73 4f 72 64 65 72   the sam isOrder
34fb0 65 64 20 73 65 74 74 69 6e 67 20 61 73 20 74 68  ed setting as th
34fc0 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63  e.          ** c
34fd0 61 6e 64 69 64 61 74 65 20 70 61 74 68 2e 20 20  andidate path.  
34fe0 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
34ff0 74 68 65 20 63 61 6e 64 69 64 61 74 65 20 73 68  the candidate sh
35000 6f 75 6c 64 20 72 65 70 6c 61 63 65 0a 20 20 20  ould replace.   
35010 20 20 20 20 20 20 20 2a 2a 20 70 54 6f 20 6f 72         ** pTo or
35020 20 69 66 20 74 68 65 20 63 61 6e 64 69 64 61 74   if the candidat
35030 65 20 73 68 6f 75 6c 64 20 62 65 20 73 6b 69 70  e should be skip
35040 70 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ped */.         
35050 20 69 66 28 20 70 54 6f 2d 3e 72 43 6f 73 74 3c   if( pTo->rCost<
35060 72 43 6f 73 74 20 7c 7c 20 28 70 54 6f 2d 3e 72  rCost || (pTo->r
35070 43 6f 73 74 3d 3d 72 43 6f 73 74 20 26 26 20 70  Cost==rCost && p
35080 54 6f 2d 3e 6e 52 6f 77 3c 3d 6e 4f 75 74 29 20  To->nRow<=nOut) 
35090 29 7b 0a 23 69 66 64 65 66 20 57 48 45 52 45 54  ){.#ifdef WHERET
350a0 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20  RACE_ENABLED /* 
350b0 30 78 34 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  0x4 */.         
350c0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68     if( sqlite3Wh
350d0 65 72 65 54 72 61 63 65 26 30 78 34 20 29 7b 0a  ereTrace&0x4 ){.
350e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
350f0 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
35100 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  (.              
35110 20 20 20 20 22 53 6b 69 70 20 20 20 25 73 20 63      "Skip   %s c
35120 6f 73 74 3d 25 2d 33 64 2c 25 33 64 20 6f 72 64  ost=%-3d,%3d ord
35130 65 72 3d 25 63 22 2c 0a 20 20 20 20 20 20 20 20  er=%c",.        
35140 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65 50            whereP
35150 61 74 68 4e 61 6d 65 28 70 46 72 6f 6d 2c 20 69  athName(pFrom, i
35160 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c 20 72  Loop, pWLoop), r
35170 43 6f 73 74 2c 20 6e 4f 75 74 2c 0a 20 20 20 20  Cost, nOut,.    
35180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73                is
35190 4f 72 64 65 72 65 64 3e 3d 30 20 3f 20 69 73 4f  Ordered>=0 ? isO
351a0 72 64 65 72 65 64 2b 27 30 27 20 3a 20 27 3f 27  rdered+'0' : '?'
351b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
351c0 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
351d0 6e 74 66 28 22 20 20 20 76 73 20 25 73 20 63 6f  ntf("   vs %s co
351e0 73 74 3d 25 2d 33 64 2c 25 64 20 6f 72 64 65 72  st=%-3d,%d order
351f0 3d 25 63 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%c\n",.        
35200 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65 50            whereP
35210 61 74 68 4e 61 6d 65 28 70 54 6f 2c 20 69 4c 6f  athName(pTo, iLo
35220 6f 70 2b 31 2c 20 30 29 2c 20 70 54 6f 2d 3e 72  op+1, 0), pTo->r
35230 43 6f 73 74 2c 20 70 54 6f 2d 3e 6e 52 6f 77 2c  Cost, pTo->nRow,
35240 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
35250 20 20 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65     pTo->isOrdere
35260 64 3e 3d 30 20 3f 20 70 54 6f 2d 3e 69 73 4f 72  d>=0 ? pTo->isOr
35270 64 65 72 65 64 2b 27 30 27 20 3a 20 27 3f 27 29  dered+'0' : '?')
35280 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
35290 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20  #endif.         
352a0 20 20 20 2f 2a 20 44 69 73 63 61 72 64 20 74 68     /* Discard th
352b0 65 20 63 61 6e 64 69 64 61 74 65 20 70 61 74 68  e candidate path
352c0 20 66 72 6f 6d 20 66 75 72 74 68 65 72 20 63 6f   from further co
352d0 6e 73 69 64 65 72 61 74 69 6f 6e 20 2a 2f 0a 20  nsideration */. 
352e0 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63             testc
352f0 61 73 65 28 20 70 54 6f 2d 3e 72 43 6f 73 74 3d  ase( pTo->rCost=
35300 3d 72 43 6f 73 74 20 29 3b 0a 20 20 20 20 20 20  =rCost );.      
35310 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
35320 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
35330 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
35340 70 54 6f 2d 3e 72 43 6f 73 74 3d 3d 72 43 6f 73  pTo->rCost==rCos
35350 74 2b 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20  t+1 );.         
35360 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20 72 65 61 63   /* Control reac
35370 68 65 73 20 68 65 72 65 20 69 66 20 74 68 65 20  hes here if the 
35380 63 61 6e 64 69 64 61 74 65 20 70 61 74 68 20 69  candidate path i
35390 73 20 62 65 74 74 65 72 20 74 68 61 6e 20 74 68  s better than th
353a0 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70  e.          ** p
353b0 54 6f 20 70 61 74 68 2e 20 20 52 65 70 6c 61 63  To path.  Replac
353c0 65 20 70 54 6f 20 77 69 74 68 20 74 68 65 20 63  e pTo with the c
353d0 61 6e 64 69 64 61 74 65 2e 20 2a 2f 0a 23 69 66  andidate. */.#if
353e0 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45  def WHERETRACE_E
353f0 4e 41 42 4c 45 44 20 2f 2a 20 30 78 34 20 2a 2f  NABLED /* 0x4 */
35400 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73  .          if( s
35410 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65  qlite3WhereTrace
35420 26 30 78 34 20 29 7b 0a 20 20 20 20 20 20 20 20  &0x4 ){.        
35430 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
35440 50 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20  Printf(.        
35450 20 20 20 20 20 20 20 20 22 55 70 64 61 74 65 20          "Update 
35460 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25 33 64  %s cost=%-3d,%3d
35470 20 6f 72 64 65 72 3d 25 63 22 2c 0a 20 20 20 20   order=%c",.    
35480 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72              wher
35490 65 50 61 74 68 4e 61 6d 65 28 70 46 72 6f 6d 2c  ePathName(pFrom,
354a0 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c   iLoop, pWLoop),
354b0 20 72 43 6f 73 74 2c 20 6e 4f 75 74 2c 0a 20 20   rCost, nOut,.  
354c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73                is
354d0 4f 72 64 65 72 65 64 3e 3d 30 20 3f 20 69 73 4f  Ordered>=0 ? isO
354e0 72 64 65 72 65 64 2b 27 30 27 20 3a 20 27 3f 27  rdered+'0' : '?'
354f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
35500 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
35510 66 28 22 20 20 77 61 73 20 25 73 20 63 6f 73 74  f("  was %s cost
35520 3d 25 2d 33 64 2c 25 33 64 20 6f 72 64 65 72 3d  =%-3d,%3d order=
35530 25 63 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %c\n",.         
35540 20 20 20 20 20 20 20 77 68 65 72 65 50 61 74 68         wherePath
35550 4e 61 6d 65 28 70 54 6f 2c 20 69 4c 6f 6f 70 2b  Name(pTo, iLoop+
35560 31 2c 20 30 29 2c 20 70 54 6f 2d 3e 72 43 6f 73  1, 0), pTo->rCos
35570 74 2c 20 70 54 6f 2d 3e 6e 52 6f 77 2c 0a 20 20  t, pTo->nRow,.  
35580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54                pT
35590 6f 2d 3e 69 73 4f 72 64 65 72 65 64 3e 3d 30 20  o->isOrdered>=0 
355a0 3f 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64  ? pTo->isOrdered
355b0 2b 27 30 27 20 3a 20 27 3f 27 29 3b 0a 20 20 20  +'0' : '?');.   
355c0 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a         }.#endif.
355d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
355e0 20 20 2f 2a 20 70 57 4c 6f 6f 70 20 69 73 20 61    /* pWLoop is a
355f0 20 77 69 6e 6e 65 72 2e 20 20 41 64 64 20 69 74   winner.  Add it
35600 20 74 6f 20 74 68 65 20 73 65 74 20 6f 66 20 62   to the set of b
35610 65 73 74 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20  est so far */.  
35620 20 20 20 20 20 20 70 54 6f 2d 3e 6d 61 73 6b 4c        pTo->maskL
35630 6f 6f 70 20 3d 20 70 46 72 6f 6d 2d 3e 6d 61 73  oop = pFrom->mas
35640 6b 4c 6f 6f 70 20 7c 20 70 57 4c 6f 6f 70 2d 3e  kLoop | pWLoop->
35650 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20 20 20  maskSelf;.      
35660 20 20 70 54 6f 2d 3e 72 65 76 4c 6f 6f 70 20 3d    pTo->revLoop =
35670 20 72 65 76 4d 61 73 6b 3b 0a 20 20 20 20 20 20   revMask;.      
35680 20 20 70 54 6f 2d 3e 6e 52 6f 77 20 3d 20 6e 4f    pTo->nRow = nO
35690 75 74 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 2d  ut;.        pTo-
356a0 3e 72 43 6f 73 74 20 3d 20 72 43 6f 73 74 3b 0a  >rCost = rCost;.
356b0 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 72 55 6e          pTo->rUn
356c0 73 6f 72 74 65 64 20 3d 20 72 55 6e 73 6f 72 74  sorted = rUnsort
356d0 65 64 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 2d  ed;.        pTo-
356e0 3e 69 73 4f 72 64 65 72 65 64 20 3d 20 69 73 4f  >isOrdered = isO
356f0 72 64 65 72 65 64 3b 0a 20 20 20 20 20 20 20 20  rdered;.        
35700 6d 65 6d 63 70 79 28 70 54 6f 2d 3e 61 4c 6f 6f  memcpy(pTo->aLoo
35710 70 2c 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 2c  p, pFrom->aLoop,
35720 20 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f   sizeof(WhereLoo
35730 70 2a 29 2a 69 4c 6f 6f 70 29 3b 0a 20 20 20 20  p*)*iLoop);.    
35740 20 20 20 20 70 54 6f 2d 3e 61 4c 6f 6f 70 5b 69      pTo->aLoop[i
35750 4c 6f 6f 70 5d 20 3d 20 70 57 4c 6f 6f 70 3b 0a  Loop] = pWLoop;.
35760 20 20 20 20 20 20 20 20 69 66 28 20 6e 54 6f 3e          if( nTo>
35770 3d 6d 78 43 68 6f 69 63 65 20 29 7b 0a 20 20 20  =mxChoice ){.   
35780 20 20 20 20 20 20 20 6d 78 49 20 3d 20 30 3b 0a         mxI = 0;.
35790 20 20 20 20 20 20 20 20 20 20 6d 78 43 6f 73 74            mxCost
357a0 20 3d 20 61 54 6f 5b 30 5d 2e 72 43 6f 73 74 3b   = aTo[0].rCost;
357b0 0a 20 20 20 20 20 20 20 20 20 20 6d 78 55 6e 73  .          mxUns
357c0 6f 72 74 65 64 20 3d 20 61 54 6f 5b 30 5d 2e 6e  orted = aTo[0].n
357d0 52 6f 77 3b 0a 20 20 20 20 20 20 20 20 20 20 66  Row;.          f
357e0 6f 72 28 6a 6a 3d 31 2c 20 70 54 6f 3d 26 61 54  or(jj=1, pTo=&aT
357f0 6f 5b 31 5d 3b 20 6a 6a 3c 6d 78 43 68 6f 69 63  o[1]; jj<mxChoic
35800 65 3b 20 6a 6a 2b 2b 2c 20 70 54 6f 2b 2b 29 7b  e; jj++, pTo++){
35810 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
35820 20 70 54 6f 2d 3e 72 43 6f 73 74 3e 6d 78 43 6f   pTo->rCost>mxCo
35830 73 74 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  st .            
35840 20 7c 7c 20 28 70 54 6f 2d 3e 72 43 6f 73 74 3d   || (pTo->rCost=
35850 3d 6d 78 43 6f 73 74 20 26 26 20 70 54 6f 2d 3e  =mxCost && pTo->
35860 72 55 6e 73 6f 72 74 65 64 3e 6d 78 55 6e 73 6f  rUnsorted>mxUnso
35870 72 74 65 64 29 20 0a 20 20 20 20 20 20 20 20 20  rted) .         
35880 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
35890 20 20 20 20 6d 78 43 6f 73 74 20 3d 20 70 54 6f      mxCost = pTo
358a0 2d 3e 72 43 6f 73 74 3b 0a 20 20 20 20 20 20 20  ->rCost;.       
358b0 20 20 20 20 20 20 20 6d 78 55 6e 73 6f 72 74 65         mxUnsorte
358c0 64 20 3d 20 70 54 6f 2d 3e 72 55 6e 73 6f 72 74  d = pTo->rUnsort
358d0 65 64 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ed;.            
358e0 20 20 6d 78 49 20 3d 20 6a 6a 3b 0a 20 20 20 20    mxI = jj;.    
358f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
35900 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
35910 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 23        }.    }..#
35920 69 66 64 65 66 20 57 48 45 52 45 54 52 41 43 45  ifdef WHERETRACE
35930 5f 45 4e 41 42 4c 45 44 20 20 2f 2a 20 3e 3d 32  _ENABLED  /* >=2
35940 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69   */.    if( sqli
35950 74 65 33 57 68 65 72 65 54 72 61 63 65 20 26 20  te3WhereTrace & 
35960 30 78 30 32 20 29 7b 0a 20 20 20 20 20 20 73 71  0x02 ){.      sq
35970 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
35980 28 22 2d 2d 2d 2d 20 61 66 74 65 72 20 72 6f 75  ("---- after rou
35990 6e 64 20 25 64 20 2d 2d 2d 2d 5c 6e 22 2c 20 69  nd %d ----\n", i
359a0 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 66 6f 72  Loop);.      for
359b0 28 69 69 3d 30 2c 20 70 54 6f 3d 61 54 6f 3b 20  (ii=0, pTo=aTo; 
359c0 69 69 3c 6e 54 6f 3b 20 69 69 2b 2b 2c 20 70 54  ii<nTo; ii++, pT
359d0 6f 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71  o++){.        sq
359e0 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
359f0 28 22 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 20  (" %s cost=%-3d 
35a00 6e 72 6f 77 3d 25 2d 33 64 20 6f 72 64 65 72 3d  nrow=%-3d order=
35a10 25 63 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %c",.           
35a20 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70 54  wherePathName(pT
35a30 6f 2c 20 69 4c 6f 6f 70 2b 31 2c 20 30 29 2c 20  o, iLoop+1, 0), 
35a40 70 54 6f 2d 3e 72 43 6f 73 74 2c 20 70 54 6f 2d  pTo->rCost, pTo-
35a50 3e 6e 52 6f 77 2c 0a 20 20 20 20 20 20 20 20 20  >nRow,.         
35a60 20 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64    pTo->isOrdered
35a70 3e 3d 30 20 3f 20 28 70 54 6f 2d 3e 69 73 4f 72  >=0 ? (pTo->isOr
35a80 64 65 72 65 64 2b 27 30 27 29 20 3a 20 27 3f 27  dered+'0') : '?'
35a90 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
35aa0 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 3e 30 20  To->isOrdered>0 
35ab0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
35ac0 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
35ad0 22 20 72 65 76 3d 30 78 25 6c 6c 78 5c 6e 22 2c  " rev=0x%llx\n",
35ae0 20 70 54 6f 2d 3e 72 65 76 4c 6f 6f 70 29 3b 0a   pTo->revLoop);.
35af0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
35b00 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
35b10 44 65 62 75 67 50 72 69 6e 74 66 28 22 5c 6e 22  DebugPrintf("\n"
35b20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
35b30 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69     }.    }.#endi
35b40 66 0a 0a 20 20 20 20 2f 2a 20 53 77 61 70 20 74  f..    /* Swap t
35b50 68 65 20 72 6f 6c 65 73 20 6f 66 20 61 46 72 6f  he roles of aFro
35b60 6d 20 61 6e 64 20 61 54 6f 20 66 6f 72 20 74 68  m and aTo for th
35b70 65 20 6e 65 78 74 20 67 65 6e 65 72 61 74 69 6f  e next generatio
35b80 6e 20 2a 2f 0a 20 20 20 20 70 46 72 6f 6d 20 3d  n */.    pFrom =
35b90 20 61 54 6f 3b 0a 20 20 20 20 61 54 6f 20 3d 20   aTo;.    aTo = 
35ba0 61 46 72 6f 6d 3b 0a 20 20 20 20 61 46 72 6f 6d  aFrom;.    aFrom
35bb0 20 3d 20 70 46 72 6f 6d 3b 0a 20 20 20 20 6e 46   = pFrom;.    nF
35bc0 72 6f 6d 20 3d 20 6e 54 6f 3b 0a 20 20 7d 0a 0a  rom = nTo;.  }..
35bd0 20 20 69 66 28 20 6e 46 72 6f 6d 3d 3d 30 20 29    if( nFrom==0 )
35be0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
35bf0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e  orMsg(pParse, "n
35c00 6f 20 71 75 65 72 79 20 73 6f 6c 75 74 69 6f 6e  o query solution
35c10 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  ");.    sqlite3D
35c20 62 46 72 65 65 28 64 62 2c 20 70 53 70 61 63 65  bFree(db, pSpace
35c30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
35c40 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
35c50 20 20 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68 65    .  /* Find the
35c60 20 6c 6f 77 65 73 74 20 63 6f 73 74 20 70 61 74   lowest cost pat
35c70 68 2e 20 20 70 46 72 6f 6d 20 77 69 6c 6c 20 62  h.  pFrom will b
35c80 65 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20  e left pointing 
35c90 74 6f 20 74 68 61 74 20 70 61 74 68 20 2a 2f 0a  to that path */.
35ca0 20 20 70 46 72 6f 6d 20 3d 20 61 46 72 6f 6d 3b    pFrom = aFrom;
35cb0 0a 20 20 66 6f 72 28 69 69 3d 31 3b 20 69 69 3c  .  for(ii=1; ii<
35cc0 6e 46 72 6f 6d 3b 20 69 69 2b 2b 29 7b 0a 20 20  nFrom; ii++){.  
35cd0 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 72 43 6f    if( pFrom->rCo
35ce0 73 74 3e 61 46 72 6f 6d 5b 69 69 5d 2e 72 43 6f  st>aFrom[ii].rCo
35cf0 73 74 20 29 20 70 46 72 6f 6d 20 3d 20 26 61 46  st ) pFrom = &aF
35d00 72 6f 6d 5b 69 69 5d 3b 0a 20 20 7d 0a 20 20 61  rom[ii];.  }.  a
35d10 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 6e  ssert( pWInfo->n
35d20 4c 65 76 65 6c 3d 3d 6e 4c 6f 6f 70 20 29 3b 0a  Level==nLoop );.
35d30 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 6c 6f    /* Load the lo
35d40 77 65 73 74 20 63 6f 73 74 20 70 61 74 68 20 69  west cost path i
35d50 6e 74 6f 20 70 57 49 6e 66 6f 20 2a 2f 0a 20 20  nto pWInfo */.  
35d60 66 6f 72 28 69 4c 6f 6f 70 3d 30 3b 20 69 4c 6f  for(iLoop=0; iLo
35d70 6f 70 3c 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f 70 2b  op<nLoop; iLoop+
35d80 2b 29 7b 0a 20 20 20 20 57 68 65 72 65 4c 65 76  +){.    WhereLev
35d90 65 6c 20 2a 70 4c 65 76 65 6c 20 3d 20 70 57 49  el *pLevel = pWI
35da0 6e 66 6f 2d 3e 61 20 2b 20 69 4c 6f 6f 70 3b 0a  nfo->a + iLoop;.
35db0 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f      pLevel->pWLo
35dc0 6f 70 20 3d 20 70 57 4c 6f 6f 70 20 3d 20 70 46  op = pWLoop = pF
35dd0 72 6f 6d 2d 3e 61 4c 6f 6f 70 5b 69 4c 6f 6f 70  rom->aLoop[iLoop
35de0 5d 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69  ];.    pLevel->i
35df0 46 72 6f 6d 20 3d 20 70 57 4c 6f 6f 70 2d 3e 69  From = pWLoop->i
35e00 54 61 62 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  Tab;.    pLevel-
35e10 3e 69 54 61 62 43 75 72 20 3d 20 70 57 49 6e 66  >iTabCur = pWInf
35e20 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70  o->pTabList->a[p
35e30 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 2e 69 43  Level->iFrom].iC
35e40 75 72 73 6f 72 3b 0a 20 20 7d 0a 20 20 69 66 28  ursor;.  }.  if(
35e50 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46   (pWInfo->wctrlF
35e60 6c 61 67 73 20 26 20 57 48 45 52 45 5f 57 41 4e  lags & WHERE_WAN
35e70 54 5f 44 49 53 54 49 4e 43 54 29 21 3d 30 0a 20  T_DISTINCT)!=0. 
35e80 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63    && (pWInfo->wc
35e90 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
35ea0 5f 44 49 53 54 49 4e 43 54 42 59 29 3d 3d 30 0a  _DISTINCTBY)==0.
35eb0 20 20 20 26 26 20 70 57 49 6e 66 6f 2d 3e 65 44     && pWInfo->eD
35ec0 69 73 74 69 6e 63 74 3d 3d 57 48 45 52 45 5f 44  istinct==WHERE_D
35ed0 49 53 54 49 4e 43 54 5f 4e 4f 4f 50 0a 20 20 20  ISTINCT_NOOP.   
35ee0 26 26 20 6e 52 6f 77 45 73 74 0a 20 20 29 7b 0a  && nRowEst.  ){.
35ef0 20 20 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 55      Bitmask notU
35f00 73 65 64 3b 0a 20 20 20 20 69 6e 74 20 72 63 20  sed;.    int rc 
35f10 3d 20 77 68 65 72 65 50 61 74 68 53 61 74 69 73  = wherePathSatis
35f20 66 69 65 73 4f 72 64 65 72 42 79 28 70 57 49 6e  fiesOrderBy(pWIn
35f30 66 6f 2c 20 70 57 49 6e 66 6f 2d 3e 70 52 65 73  fo, pWInfo->pRes
35f40 75 6c 74 53 65 74 2c 20 70 46 72 6f 6d 2c 0a 20  ultSet, pFrom,. 
35f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35f60 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59  WHERE_DISTINCTBY
35f70 2c 20 6e 4c 6f 6f 70 2d 31 2c 20 70 46 72 6f 6d  , nLoop-1, pFrom
35f80 2d 3e 61 4c 6f 6f 70 5b 6e 4c 6f 6f 70 2d 31 5d  ->aLoop[nLoop-1]
35f90 2c 20 26 6e 6f 74 55 73 65 64 29 3b 0a 20 20 20  , &notUsed);.   
35fa0 20 69 66 28 20 72 63 3d 3d 70 57 49 6e 66 6f 2d   if( rc==pWInfo-
35fb0 3e 70 52 65 73 75 6c 74 53 65 74 2d 3e 6e 45 78  >pResultSet->nEx
35fc0 70 72 20 29 7b 0a 20 20 20 20 20 20 70 57 49 6e  pr ){.      pWIn
35fd0 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d 20  fo->eDistinct = 
35fe0 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f  WHERE_DISTINCT_O
35ff0 52 44 45 52 45 44 3b 0a 20 20 20 20 7d 0a 20 20  RDERED;.    }.  
36000 7d 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e  }.  if( pWInfo->
36010 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
36020 69 66 28 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72  if( pWInfo->wctr
36030 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 44  lFlags & WHERE_D
36040 49 53 54 49 4e 43 54 42 59 20 29 7b 0a 20 20 20  ISTINCTBY ){.   
36050 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 69 73     if( pFrom->is
36060 4f 72 64 65 72 65 64 3d 3d 70 57 49 6e 66 6f 2d  Ordered==pWInfo-
36070 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  >pOrderBy->nExpr
36080 20 29 7b 0a 20 20 20 20 20 20 20 20 70 57 49 6e   ){.        pWIn
36090 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d 20  fo->eDistinct = 
360a0 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f  WHERE_DISTINCT_O
360b0 52 44 45 52 45 44 3b 0a 20 20 20 20 20 20 7d 0a  RDERED;.      }.
360c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
360d0 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 20   pWInfo->nOBSat 
360e0 3d 20 70 46 72 6f 6d 2d 3e 69 73 4f 72 64 65 72  = pFrom->isOrder
360f0 65 64 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57  ed;.      if( pW
36100 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 3c 30 20 29  Info->nOBSat<0 )
36110 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 20   pWInfo->nOBSat 
36120 3d 20 30 3b 0a 20 20 20 20 20 20 70 57 49 6e 66  = 0;.      pWInf
36130 6f 2d 3e 72 65 76 4d 61 73 6b 20 3d 20 70 46 72  o->revMask = pFr
36140 6f 6d 2d 3e 72 65 76 4c 6f 6f 70 3b 0a 20 20 20  om->revLoop;.   
36150 20 7d 0a 20 20 20 20 69 66 28 20 28 70 57 49 6e   }.    if( (pWIn
36160 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26  fo->wctrlFlags &
36170 20 57 48 45 52 45 5f 53 4f 52 54 42 59 47 52 4f   WHERE_SORTBYGRO
36180 55 50 29 0a 20 20 20 20 20 20 20 20 26 26 20 70  UP).        && p
36190 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 3d 3d 70  WInfo->nOBSat==p
361a0 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2d  WInfo->pOrderBy-
361b0 3e 6e 45 78 70 72 0a 20 20 20 20 29 7b 0a 20 20  >nExpr.    ){.  
361c0 20 20 20 20 42 69 74 6d 61 73 6b 20 72 65 76 4d      Bitmask revM
361d0 61 73 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  ask = 0;.      i
361e0 6e 74 20 6e 4f 72 64 65 72 20 3d 20 77 68 65 72  nt nOrder = wher
361f0 65 50 61 74 68 53 61 74 69 73 66 69 65 73 4f 72  ePathSatisfiesOr
36200 64 65 72 42 79 28 70 57 49 6e 66 6f 2c 20 70 57  derBy(pWInfo, pW
36210 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2c 20  Info->pOrderBy, 
36220 0a 20 20 20 20 20 20 20 20 20 20 70 46 72 6f 6d  .          pFrom
36230 2c 20 30 2c 20 6e 4c 6f 6f 70 2d 31 2c 20 70 46  , 0, nLoop-1, pF
36240 72 6f 6d 2d 3e 61 4c 6f 6f 70 5b 6e 4c 6f 6f 70  rom->aLoop[nLoop
36250 2d 31 5d 2c 20 26 72 65 76 4d 61 73 6b 0a 20 20  -1], &revMask.  
36260 20 20 20 20 29 3b 0a 20 20 20 20 20 20 61 73 73      );.      ass
36270 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 73 6f 72  ert( pWInfo->sor
36280 74 65 64 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ted==0 );.      
36290 69 66 28 20 6e 4f 72 64 65 72 3d 3d 70 57 49 6e  if( nOrder==pWIn
362a0 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45  fo->pOrderBy->nE
362b0 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 70  xpr ){.        p
362c0 57 49 6e 66 6f 2d 3e 73 6f 72 74 65 64 20 3d 20  WInfo->sorted = 
362d0 31 3b 0a 20 20 20 20 20 20 20 20 70 57 49 6e 66  1;.        pWInf
362e0 6f 2d 3e 72 65 76 4d 61 73 6b 20 3d 20 72 65 76  o->revMask = rev
362f0 4d 61 73 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Mask;.      }.  
36300 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20 70 57 49 6e    }.  }...  pWIn
36310 66 6f 2d 3e 6e 52 6f 77 4f 75 74 20 3d 20 70 46  fo->nRowOut = pF
36320 72 6f 6d 2d 3e 6e 52 6f 77 3b 0a 0a 20 20 2f 2a  rom->nRow;..  /*
36330 20 46 72 65 65 20 74 65 6d 70 6f 72 61 72 79 20   Free temporary 
36340 6d 65 6d 6f 72 79 20 61 6e 64 20 72 65 74 75 72  memory and retur
36350 6e 20 73 75 63 63 65 73 73 20 2a 2f 0a 20 20 73  n success */.  s
36360 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
36370 20 70 53 70 61 63 65 29 3b 0a 20 20 72 65 74 75   pSpace);.  retu
36380 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
36390 0a 2f 2a 0a 2a 2a 20 4d 6f 73 74 20 71 75 65 72  ./*.** Most quer
363a0 69 65 73 20 75 73 65 20 6f 6e 6c 79 20 61 20 73  ies use only a s
363b0 69 6e 67 6c 65 20 74 61 62 6c 65 20 28 74 68 65  ingle table (the
363c0 79 20 61 72 65 20 6e 6f 74 20 6a 6f 69 6e 73 29  y are not joins)
363d0 20 61 6e 64 20 68 61 76 65 0a 2a 2a 20 73 69 6d   and have.** sim
363e0 70 6c 65 20 3d 3d 20 63 6f 6e 73 74 72 61 69 6e  ple == constrain
363f0 74 73 20 61 67 61 69 6e 73 74 20 69 6e 64 65 78  ts against index
36400 65 64 20 66 69 65 6c 64 73 2e 20 20 54 68 69 73  ed fields.  This
36410 20 72 6f 75 74 69 6e 65 20 61 74 74 65 6d 70 74   routine attempt
36420 73 0a 2a 2a 20 74 6f 20 70 6c 61 6e 20 74 68 6f  s.** to plan tho
36430 73 65 20 73 69 6d 70 6c 65 20 63 61 73 65 73 20  se simple cases 
36440 75 73 69 6e 67 20 6d 75 63 68 20 6c 65 73 73 20  using much less 
36450 63 65 72 65 6d 6f 6e 79 20 74 68 61 6e 20 74 68  ceremony than th
36460 65 0a 2a 2a 20 67 65 6e 65 72 61 6c 2d 70 75 72  e.** general-pur
36470 70 6f 73 65 20 71 75 65 72 79 20 70 6c 61 6e 6e  pose query plann
36480 65 72 2c 20 61 6e 64 20 74 68 65 72 65 62 79 20  er, and thereby 
36490 79 69 65 6c 64 20 66 61 73 74 65 72 20 73 71 6c  yield faster sql
364a0 69 74 65 33 5f 70 72 65 70 61 72 65 28 29 0a 2a  ite3_prepare().*
364b0 2a 20 74 69 6d 65 73 20 66 6f 72 20 74 68 65 20  * times for the 
364c0 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e 0a 2a 2a 0a  common case..**.
364d0 2a 2a 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65  ** Return non-ze
364e0 72 6f 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 69  ro on success, i
364f0 66 20 74 68 69 73 20 71 75 65 72 79 20 63 61 6e  f this query can
36500 20 62 65 20 68 61 6e 64 6c 65 64 20 62 79 20 74   be handled by t
36510 68 69 73 0a 2a 2a 20 6e 6f 2d 66 72 69 6c 6c 73  his.** no-frills
36520 20 71 75 65 72 79 20 70 6c 61 6e 6e 65 72 2e 20   query planner. 
36530 20 52 65 74 75 72 6e 20 7a 65 72 6f 20 69 66 20   Return zero if 
36540 74 68 69 73 20 71 75 65 72 79 20 6e 65 65 64 73  this query needs
36550 20 74 68 65 20 0a 2a 2a 20 67 65 6e 65 72 61 6c   the .** general
36560 2d 70 75 72 70 6f 73 65 20 71 75 65 72 79 20 70  -purpose query p
36570 6c 61 6e 6e 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  lanner..*/.stati
36580 63 20 69 6e 74 20 77 68 65 72 65 53 68 6f 72 74  c int whereShort
36590 43 75 74 28 57 68 65 72 65 4c 6f 6f 70 42 75 69  Cut(WhereLoopBui
365a0 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 29 7b  lder *pBuilder){
365b0 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  .  WhereInfo *pW
365c0 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74 20 53  Info;.  struct S
365d0 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
365e0 65 6d 3b 0a 20 20 57 68 65 72 65 43 6c 61 75 73  em;.  WhereClaus
365f0 65 20 2a 70 57 43 3b 0a 20 20 57 68 65 72 65 54  e *pWC;.  WhereT
36600 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 57 68  erm *pTerm;.  Wh
36610 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 0a  ereLoop *pLoop;.
36620 20 20 69 6e 74 20 69 43 75 72 3b 0a 20 20 69 6e    int iCur;.  in
36630 74 20 6a 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54  t j;.  Table *pT
36640 61 62 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49 64  ab;.  Index *pId
36650 78 3b 0a 20 20 0a 20 20 70 57 49 6e 66 6f 20 3d  x;.  .  pWInfo =
36660 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66   pBuilder->pWInf
36670 6f 3b 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 2d  o;.  if( pWInfo-
36680 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  >wctrlFlags & WH
36690 45 52 45 5f 46 4f 52 43 45 5f 54 41 42 4c 45 20  ERE_FORCE_TABLE 
366a0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 61 73  ) return 0;.  as
366b0 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 70 54  sert( pWInfo->pT
366c0 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 3d 31 20  abList->nSrc>=1 
366d0 29 3b 0a 20 20 70 49 74 65 6d 20 3d 20 70 57 49  );.  pItem = pWI
366e0 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61  nfo->pTabList->a
366f0 3b 0a 20 20 70 54 61 62 20 3d 20 70 49 74 65 6d  ;.  pTab = pItem
36700 2d 3e 70 54 61 62 3b 0a 20 20 69 66 28 20 49 73  ->pTab;.  if( Is
36710 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 20  Virtual(pTab) ) 
36720 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
36730 70 49 74 65 6d 2d 3e 7a 49 6e 64 65 78 20 29 20  pItem->zIndex ) 
36740 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 43 75 72  return 0;.  iCur
36750 20 3d 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f   = pItem->iCurso
36760 72 3b 0a 20 20 70 57 43 20 3d 20 26 70 57 49 6e  r;.  pWC = &pWIn
36770 66 6f 2d 3e 73 57 43 3b 0a 20 20 70 4c 6f 6f 70  fo->sWC;.  pLoop
36780 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65   = pBuilder->pNe
36790 77 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c  w;.  pLoop->wsFl
367a0 61 67 73 20 3d 20 30 3b 0a 20 20 70 4c 6f 6f 70  ags = 0;.  pLoop
367b0 2d 3e 6e 53 6b 69 70 20 3d 20 30 3b 0a 20 20 70  ->nSkip = 0;.  p
367c0 54 65 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28  Term = findTerm(
367d0 70 57 43 2c 20 69 43 75 72 2c 20 2d 31 2c 20 30  pWC, iCur, -1, 0
367e0 2c 20 57 4f 5f 45 51 2c 20 30 29 3b 0a 20 20 69  , WO_EQ, 0);.  i
367f0 66 28 20 70 54 65 72 6d 20 29 7b 0a 20 20 20 20  f( pTerm ){.    
36800 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 3d  pLoop->wsFlags =
36810 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51   WHERE_COLUMN_EQ
36820 7c 57 48 45 52 45 5f 49 50 4b 7c 57 48 45 52 45  |WHERE_IPK|WHERE
36830 5f 4f 4e 45 52 4f 57 3b 0a 20 20 20 20 70 4c 6f  _ONEROW;.    pLo
36840 6f 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d 20 3d 20  op->aLTerm[0] = 
36850 70 54 65 72 6d 3b 0a 20 20 20 20 70 4c 6f 6f 70  pTerm;.    pLoop
36860 2d 3e 6e 4c 54 65 72 6d 20 3d 20 31 3b 0a 20 20  ->nLTerm = 1;.  
36870 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65    pLoop->u.btree
36880 2e 6e 45 71 20 3d 20 31 3b 0a 20 20 20 20 2f 2a  .nEq = 1;.    /*
36890 20 54 55 4e 49 4e 47 3a 20 43 6f 73 74 20 6f 66   TUNING: Cost of
368a0 20 61 20 72 6f 77 69 64 20 6c 6f 6f 6b 75 70 20   a rowid lookup 
368b0 69 73 20 31 30 20 2a 2f 0a 20 20 20 20 70 4c 6f  is 10 */.    pLo
368c0 6f 70 2d 3e 72 52 75 6e 20 3d 20 33 33 3b 20 20  op->rRun = 33;  
368d0 2f 2a 20 33 33 3d 3d 73 71 6c 69 74 65 33 4c 6f  /* 33==sqlite3Lo
368e0 67 45 73 74 28 31 30 29 20 2a 2f 0a 20 20 7d 65  gEst(10) */.  }e
368f0 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 70 49 64  lse{.    for(pId
36900 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20  x=pTab->pIndex; 
36910 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d  pIdx; pIdx=pIdx-
36920 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 61  >pNext){.      a
36930 73 73 65 72 74 28 20 70 4c 6f 6f 70 2d 3e 61 4c  ssert( pLoop->aL
36940 54 65 72 6d 53 70 61 63 65 3d 3d 70 4c 6f 6f 70  TermSpace==pLoop
36950 2d 3e 61 4c 54 65 72 6d 20 29 3b 0a 20 20 20 20  ->aLTerm );.    
36960 20 20 69 66 28 20 21 49 73 55 6e 69 71 75 65 49    if( !IsUniqueI
36970 6e 64 65 78 28 70 49 64 78 29 0a 20 20 20 20 20  ndex(pIdx).     
36980 20 20 7c 7c 20 70 49 64 78 2d 3e 70 50 61 72 74    || pIdx->pPart
36990 49 64 78 57 68 65 72 65 21 3d 30 20 0a 20 20 20  IdxWhere!=0 .   
369a0 20 20 20 20 7c 7c 20 70 49 64 78 2d 3e 6e 4b 65      || pIdx->nKe
369b0 79 43 6f 6c 3e 41 72 72 61 79 53 69 7a 65 28 70  yCol>ArraySize(p
369c0 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63  Loop->aLTermSpac
369d0 65 29 20 0a 20 20 20 20 20 20 29 20 63 6f 6e 74  e) .      ) cont
369e0 69 6e 75 65 3b 0a 20 20 20 20 20 20 66 6f 72 28  inue;.      for(
369f0 6a 3d 30 3b 20 6a 3c 70 49 64 78 2d 3e 6e 4b 65  j=0; j<pIdx->nKe
36a00 79 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  yCol; j++){.    
36a10 20 20 20 20 70 54 65 72 6d 20 3d 20 66 69 6e 64      pTerm = find
36a20 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20  Term(pWC, iCur, 
36a30 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a  pIdx->aiColumn[j
36a40 5d 2c 20 30 2c 20 57 4f 5f 45 51 2c 20 70 49 64  ], 0, WO_EQ, pId
36a50 78 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  x);.        if( 
36a60 70 54 65 72 6d 3d 3d 30 20 29 20 62 72 65 61 6b  pTerm==0 ) break
36a70 3b 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d  ;.        pLoop-
36a80 3e 61 4c 54 65 72 6d 5b 6a 5d 20 3d 20 70 54 65  >aLTerm[j] = pTe
36a90 72 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rm;.      }.    
36aa0 20 20 69 66 28 20 6a 21 3d 70 49 64 78 2d 3e 6e    if( j!=pIdx->n
36ab0 4b 65 79 43 6f 6c 20 29 20 63 6f 6e 74 69 6e 75  KeyCol ) continu
36ac0 65 3b 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e  e;.      pLoop->
36ad0 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f  wsFlags = WHERE_
36ae0 43 4f 4c 55 4d 4e 5f 45 51 7c 57 48 45 52 45 5f  COLUMN_EQ|WHERE_
36af0 4f 4e 45 52 4f 57 7c 57 48 45 52 45 5f 49 4e 44  ONEROW|WHERE_IND
36b00 45 58 45 44 3b 0a 20 20 20 20 20 20 69 66 28 20  EXED;.      if( 
36b10 70 49 64 78 2d 3e 69 73 43 6f 76 65 72 69 6e 67  pIdx->isCovering
36b20 20 7c 7c 20 28 70 49 74 65 6d 2d 3e 63 6f 6c 55   || (pItem->colU
36b30 73 65 64 20 26 20 7e 63 6f 6c 75 6d 6e 73 49 6e  sed & ~columnsIn
36b40 49 6e 64 65 78 28 70 49 64 78 29 29 3d 3d 30 20  Index(pIdx))==0 
36b50 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f 70  ){.        pLoop
36b60 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45  ->wsFlags |= WHE
36b70 52 45 5f 49 44 58 5f 4f 4e 4c 59 3b 0a 20 20 20  RE_IDX_ONLY;.   
36b80 20 20 20 7d 0a 20 20 20 20 20 20 70 4c 6f 6f 70     }.      pLoop
36b90 2d 3e 6e 4c 54 65 72 6d 20 3d 20 6a 3b 0a 20 20  ->nLTerm = j;.  
36ba0 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72      pLoop->u.btr
36bb0 65 65 2e 6e 45 71 20 3d 20 6a 3b 0a 20 20 20 20  ee.nEq = j;.    
36bc0 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65    pLoop->u.btree
36bd0 2e 70 49 6e 64 65 78 20 3d 20 70 49 64 78 3b 0a  .pIndex = pIdx;.
36be0 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a        /* TUNING:
36bf0 20 43 6f 73 74 20 6f 66 20 61 20 75 6e 69 71 75   Cost of a uniqu
36c00 65 20 69 6e 64 65 78 20 6c 6f 6f 6b 75 70 20 69  e index lookup i
36c10 73 20 31 35 20 2a 2f 0a 20 20 20 20 20 20 70 4c  s 15 */.      pL
36c20 6f 6f 70 2d 3e 72 52 75 6e 20 3d 20 33 39 3b 20  oop->rRun = 39; 
36c30 20 2f 2a 20 33 39 3d 3d 73 71 6c 69 74 65 33 4c   /* 39==sqlite3L
36c40 6f 67 45 73 74 28 31 35 29 20 2a 2f 0a 20 20 20  ogEst(15) */.   
36c50 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
36c60 20 20 7d 0a 20 20 69 66 28 20 70 4c 6f 6f 70 2d    }.  if( pLoop-
36c70 3e 77 73 46 6c 61 67 73 20 29 7b 0a 20 20 20 20  >wsFlags ){.    
36c80 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 3d 20 28 4c  pLoop->nOut = (L
36c90 6f 67 45 73 74 29 31 3b 0a 20 20 20 20 70 57 49  ogEst)1;.    pWI
36ca0 6e 66 6f 2d 3e 61 5b 30 5d 2e 70 57 4c 6f 6f 70  nfo->a[0].pWLoop
36cb0 20 3d 20 70 4c 6f 6f 70 3b 0a 20 20 20 20 70 4c   = pLoop;.    pL
36cc0 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 20 3d 20  oop->maskSelf = 
36cd0 67 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d  getMask(&pWInfo-
36ce0 3e 73 4d 61 73 6b 53 65 74 2c 20 69 43 75 72 29  >sMaskSet, iCur)
36cf0 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b  ;.    pWInfo->a[
36d00 30 5d 2e 69 54 61 62 43 75 72 20 3d 20 69 43 75  0].iTabCur = iCu
36d10 72 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 6e  r;.    pWInfo->n
36d20 52 6f 77 4f 75 74 20 3d 20 31 3b 0a 20 20 20 20  RowOut = 1;.    
36d30 69 66 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64  if( pWInfo->pOrd
36d40 65 72 42 79 20 29 20 70 57 49 6e 66 6f 2d 3e 6e  erBy ) pWInfo->n
36d50 4f 42 53 61 74 20 3d 20 20 70 57 49 6e 66 6f 2d  OBSat =  pWInfo-
36d60 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  >pOrderBy->nExpr
36d70 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f  ;.    if( pWInfo
36d80 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ->wctrlFlags & W
36d90 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e  HERE_WANT_DISTIN
36da0 43 54 20 29 7b 0a 20 20 20 20 20 20 70 57 49 6e  CT ){.      pWIn
36db0 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d 20  fo->eDistinct = 
36dc0 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55  WHERE_DISTINCT_U
36dd0 4e 49 51 55 45 3b 0a 20 20 20 20 7d 0a 23 69 66  NIQUE;.    }.#if
36de0 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
36df0 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 63 49 64 20  .    pLoop->cId 
36e00 3d 20 27 30 27 3b 0a 23 65 6e 64 69 66 0a 20 20  = '0';.#endif.  
36e10 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
36e20 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
36e30 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 74 68  *.** Generate th
36e40 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
36e50 68 65 20 6c 6f 6f 70 20 75 73 65 64 20 66 6f 72  he loop used for
36e60 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 70 72   WHERE clause pr
36e70 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 20 54 68 65  ocessing..** The
36e80 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73   return value is
36e90 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
36ea0 20 6f 70 61 71 75 65 20 73 74 72 75 63 74 75 72   opaque structur
36eb0 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 0a  e that contains.
36ec0 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6e  ** information n
36ed0 65 65 64 65 64 20 74 6f 20 74 65 72 6d 69 6e 61  eeded to termina
36ee0 74 65 20 74 68 65 20 6c 6f 6f 70 2e 20 20 4c 61  te the loop.  La
36ef0 74 65 72 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67  ter, the calling
36f00 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 73 68 6f 75   routine.** shou
36f10 6c 64 20 69 6e 76 6f 6b 65 20 73 71 6c 69 74 65  ld invoke sqlite
36f20 33 57 68 65 72 65 45 6e 64 28 29 20 77 69 74 68  3WhereEnd() with
36f30 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
36f40 65 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  e of this functi
36f50 6f 6e 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74  on.** in order t
36f60 6f 20 63 6f 6d 70 6c 65 74 65 20 74 68 65 20 57  o complete the W
36f70 48 45 52 45 20 63 6c 61 75 73 65 20 70 72 6f 63  HERE clause proc
36f80 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66  essing..**.** If
36f90 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
36fa0 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  , this routine r
36fb0 65 74 75 72 6e 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a  eturns NULL..**.
36fc0 2a 2a 20 54 68 65 20 62 61 73 69 63 20 69 64 65  ** The basic ide
36fd0 61 20 69 73 20 74 6f 20 64 6f 20 61 20 6e 65 73  a is to do a nes
36fe0 74 65 64 20 6c 6f 6f 70 2c 20 6f 6e 65 20 6c 6f  ted loop, one lo
36ff0 6f 70 20 66 6f 72 20 65 61 63 68 20 74 61 62 6c  op for each tabl
37000 65 20 69 6e 0a 2a 2a 20 74 68 65 20 46 52 4f 4d  e in.** the FROM
37010 20 63 6c 61 75 73 65 20 6f 66 20 61 20 73 65 6c   clause of a sel
37020 65 63 74 2e 20 20 28 49 4e 53 45 52 54 20 61 6e  ect.  (INSERT an
37030 64 20 55 50 44 41 54 45 20 73 74 61 74 65 6d 65  d UPDATE stateme
37040 6e 74 73 20 61 72 65 20 74 68 65 0a 2a 2a 20 73  nts are the.** s
37050 61 6d 65 20 61 73 20 61 20 53 45 4c 45 43 54 20  ame as a SELECT 
37060 77 69 74 68 20 6f 6e 6c 79 20 61 20 73 69 6e 67  with only a sing
37070 6c 65 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20  le table in the 
37080 46 52 4f 4d 20 63 6c 61 75 73 65 2e 29 20 20 46  FROM clause.)  F
37090 6f 72 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 69  or.** example, i
370a0 66 20 74 68 65 20 53 51 4c 20 69 73 20 74 68 69  f the SQL is thi
370b0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 53  s:.**.**       S
370c0 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 2c  ELECT * FROM t1,
370d0 20 74 32 2c 20 74 33 20 57 48 45 52 45 20 2e 2e   t2, t3 WHERE ..
370e0 2e 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 74 68  .;.**.** Then th
370f0 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64  e code generated
37100 20 69 73 20 63 6f 6e 63 65 70 74 75 61 6c 6c 79   is conceptually
37110 20 6c 69 6b 65 20 74 68 65 20 66 6f 6c 6c 6f 77   like the follow
37120 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  ing:.**.**      
37130 66 6f 72 65 61 63 68 20 72 6f 77 31 20 69 6e 20  foreach row1 in 
37140 74 31 20 64 6f 20 20 20 20 20 20 20 5c 20 20 20  t1 do       \   
37150 20 43 6f 64 65 20 67 65 6e 65 72 61 74 65 64 0a   Code generated.
37160 2a 2a 20 20 20 20 20 20 20 20 66 6f 72 65 61 63  **        foreac
37170 68 20 72 6f 77 32 20 69 6e 20 74 32 20 64 6f 20  h row2 in t2 do 
37180 20 20 20 20 20 7c 2d 2d 20 62 79 20 73 71 6c 69       |-- by sqli
37190 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 0a  te3WhereBegin().
371a0 2a 2a 20 20 20 20 20 20 20 20 20 20 66 6f 72 65  **          fore
371b0 61 63 68 20 72 6f 77 33 20 69 6e 20 74 33 20 64  ach row3 in t3 d
371c0 6f 20 20 20 2f 0a 2a 2a 20 20 20 20 20 20 20 20  o   /.**        
371d0 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20      ....**      
371e0 20 20 20 20 65 6e 64 20 20 20 20 20 20 20 20 20      end         
371f0 20 20 20 20 20 20 20 20 20 20 20 20 5c 20 20 20              \   
37200 20 43 6f 64 65 20 67 65 6e 65 72 61 74 65 64 0a   Code generated.
37210 2a 2a 20 20 20 20 20 20 20 20 65 6e 64 20 20 20  **        end   
37220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37230 20 20 20 20 20 7c 2d 2d 20 62 79 20 73 71 6c 69       |-- by sqli
37240 74 65 33 57 68 65 72 65 45 6e 64 28 29 0a 2a 2a  te3WhereEnd().**
37250 20 20 20 20 20 20 65 6e 64 20 20 20 20 20 20 20        end       
37260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37270 20 20 2f 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74    /.**.** Note t
37280 68 61 74 20 74 68 65 20 6c 6f 6f 70 73 20 6d 69  hat the loops mi
37290 67 68 74 20 6e 6f 74 20 62 65 20 6e 65 73 74 65  ght not be neste
372a0 64 20 69 6e 20 74 68 65 20 6f 72 64 65 72 20 69  d in the order i
372b0 6e 20 77 68 69 63 68 20 74 68 65 79 0a 2a 2a 20  n which they.** 
372c0 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 46 52  appear in the FR
372d0 4f 4d 20 63 6c 61 75 73 65 20 69 66 20 61 20 64  OM clause if a d
372e0 69 66 66 65 72 65 6e 74 20 6f 72 64 65 72 20 69  ifferent order i
372f0 73 20 62 65 74 74 65 72 20 61 62 6c 65 20 74 6f  s better able to
37300 20 6d 61 6b 65 0a 2a 2a 20 75 73 65 20 6f 66 20   make.** use of 
37310 69 6e 64 69 63 65 73 2e 20 20 4e 6f 74 65 20 61  indices.  Note a
37320 6c 73 6f 20 74 68 61 74 20 77 68 65 6e 20 74 68  lso that when th
37330 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 61 70  e IN operator ap
37340 70 65 61 72 73 20 69 6e 0a 2a 2a 20 74 68 65 20  pears in.** the 
37350 57 48 45 52 45 20 63 6c 61 75 73 65 2c 20 69 74  WHERE clause, it
37360 20 6d 69 67 68 74 20 72 65 73 75 6c 74 20 69 6e   might result in
37370 20 61 64 64 69 74 69 6f 6e 61 6c 20 6e 65 73 74   additional nest
37380 65 64 20 6c 6f 6f 70 73 20 66 6f 72 0a 2a 2a 20  ed loops for.** 
37390 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67 68  scanning through
373a0 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f 6e 20 74   all values on t
373b0 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69  he right-hand si
373c0 64 65 20 6f 66 20 74 68 65 20 49 4e 2e 0a 2a 2a  de of the IN..**
373d0 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 20 42 74  .** There are Bt
373e0 72 65 65 20 63 75 72 73 6f 72 73 20 61 73 73 6f  ree cursors asso
373f0 63 69 61 74 65 64 20 77 69 74 68 20 65 61 63 68  ciated with each
37400 20 74 61 62 6c 65 2e 20 20 74 31 20 75 73 65 73   table.  t1 uses
37410 20 63 75 72 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65   cursor.** numbe
37420 72 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d  r pTabList->a[0]
37430 2e 69 43 75 72 73 6f 72 2e 20 20 74 32 20 75 73  .iCursor.  t2 us
37440 65 73 20 74 68 65 20 63 75 72 73 6f 72 20 70 54  es the cursor pT
37450 61 62 4c 69 73 74 2d 3e 61 5b 31 5d 2e 69 43 75  abList->a[1].iCu
37460 72 73 6f 72 2e 0a 2a 2a 20 41 6e 64 20 73 6f 20  rsor..** And so 
37470 66 6f 72 74 68 2e 20 20 54 68 69 73 20 72 6f 75  forth.  This rou
37480 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 63  tine generates c
37490 6f 64 65 20 74 6f 20 6f 70 65 6e 20 74 68 6f 73  ode to open thos
374a0 65 20 56 44 42 45 20 63 75 72 73 6f 72 73 0a 2a  e VDBE cursors.*
374b0 2a 20 61 6e 64 20 73 71 6c 69 74 65 33 57 68 65  * and sqlite3Whe
374c0 72 65 45 6e 64 28 29 20 67 65 6e 65 72 61 74 65  reEnd() generate
374d0 73 20 74 68 65 20 63 6f 64 65 20 74 6f 20 63 6c  s the code to cl
374e0 6f 73 65 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a 20  ose them..**.** 
374f0 54 68 65 20 63 6f 64 65 20 74 68 61 74 20 73 71  The code that sq
37500 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
37510 29 20 67 65 6e 65 72 61 74 65 73 20 6c 65 61 76  ) generates leav
37520 65 73 20 74 68 65 20 63 75 72 73 6f 72 73 20 6e  es the cursors n
37530 61 6d 65 64 0a 2a 2a 20 69 6e 20 70 54 61 62 4c  amed.** in pTabL
37540 69 73 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  ist pointing at 
37550 74 68 65 69 72 20 61 70 70 72 6f 70 72 69 61 74  their appropriat
37560 65 20 65 6e 74 72 69 65 73 2e 20 20 54 68 65 20  e entries.  The 
37570 5b 2e 2e 2e 5d 20 63 6f 64 65 0a 2a 2a 20 63 61  [...] code.** ca
37580 6e 20 75 73 65 20 4f 50 5f 43 6f 6c 75 6d 6e 20  n use OP_Column 
37590 61 6e 64 20 4f 50 5f 52 6f 77 69 64 20 6f 70 63  and OP_Rowid opc
375a0 6f 64 65 73 20 6f 6e 20 74 68 65 73 65 20 63 75  odes on these cu
375b0 72 73 6f 72 73 20 74 6f 20 65 78 74 72 61 63 74  rsors to extract
375c0 0a 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20 74 68  .** data from th
375d0 65 20 76 61 72 69 6f 75 73 20 74 61 62 6c 65 73  e various tables
375e0 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a   of the loop..**
375f0 0a 2a 2a 20 49 66 20 74 68 65 20 57 48 45 52 45  .** If the WHERE
37600 20 63 6c 61 75 73 65 20 69 73 20 65 6d 70 74 79   clause is empty
37610 2c 20 74 68 65 20 66 6f 72 65 61 63 68 20 6c 6f  , the foreach lo
37620 6f 70 73 20 6d 75 73 74 20 65 61 63 68 20 73 63  ops must each sc
37630 61 6e 20 74 68 65 69 72 0a 2a 2a 20 65 6e 74 69  an their.** enti
37640 72 65 20 74 61 62 6c 65 73 2e 20 20 54 68 75 73  re tables.  Thus
37650 20 61 20 74 68 72 65 65 2d 77 61 79 20 6a 6f 69   a three-way joi
37660 6e 20 69 73 20 61 6e 20 4f 28 4e 5e 33 29 20 6f  n is an O(N^3) o
37670 70 65 72 61 74 69 6f 6e 2e 20 20 42 75 74 20 69  peration.  But i
37680 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 73 20  f.** the tables 
37690 68 61 76 65 20 69 6e 64 69 63 65 73 20 61 6e 64  have indices and
376a0 20 74 68 65 72 65 20 61 72 65 20 74 65 72 6d 73   there are terms
376b0 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c   in the WHERE cl
376c0 61 75 73 65 20 74 68 61 74 0a 2a 2a 20 72 65 66  ause that.** ref
376d0 65 72 20 74 6f 20 74 68 6f 73 65 20 69 6e 64 69  er to those indi
376e0 63 65 73 2c 20 61 20 63 6f 6d 70 6c 65 74 65 20  ces, a complete 
376f0 74 61 62 6c 65 20 73 63 61 6e 20 63 61 6e 20 62  table scan can b
37700 65 20 61 76 6f 69 64 65 64 20 61 6e 64 20 74 68  e avoided and th
37710 65 0a 2a 2a 20 63 6f 64 65 20 77 69 6c 6c 20 72  e.** code will r
37720 75 6e 20 6d 75 63 68 20 66 61 73 74 65 72 2e 20  un much faster. 
37730 20 4d 6f 73 74 20 6f 66 20 74 68 65 20 77 6f 72   Most of the wor
37740 6b 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e  k of this routin
37750 65 20 69 73 20 63 68 65 63 6b 69 6e 67 0a 2a 2a  e is checking.**
37760 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 72 65   to see if there
37770 20 61 72 65 20 69 6e 64 69 63 65 73 20 74 68 61   are indices tha
37780 74 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f  t can be used to
37790 20 73 70 65 65 64 20 75 70 20 74 68 65 20 6c 6f   speed up the lo
377a0 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 65 72 6d 73 20  op..**.** Terms 
377b0 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
377c0 75 73 65 20 61 72 65 20 61 6c 73 6f 20 75 73 65  use are also use
377d0 64 20 74 6f 20 6c 69 6d 69 74 20 77 68 69 63 68  d to limit which
377e0 20 72 6f 77 73 20 61 63 74 75 61 6c 6c 79 0a 2a   rows actually.*
377f0 2a 20 6d 61 6b 65 20 69 74 20 74 6f 20 74 68 65  * make it to the
37800 20 22 2e 2e 2e 22 20 69 6e 20 74 68 65 20 6d 69   "..." in the mi
37810 64 64 6c 65 20 6f 66 20 74 68 65 20 6c 6f 6f 70  ddle of the loop
37820 2e 20 20 41 66 74 65 72 20 65 61 63 68 20 22 66  .  After each "f
37830 6f 72 65 61 63 68 22 2c 0a 2a 2a 20 74 65 72 6d  oreach",.** term
37840 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  s of the WHERE c
37850 6c 61 75 73 65 20 74 68 61 74 20 75 73 65 20 6f  lause that use o
37860 6e 6c 79 20 74 65 72 6d 73 20 69 6e 20 74 68 61  nly terms in tha
37870 74 20 6c 6f 6f 70 20 61 6e 64 20 6f 75 74 65 72  t loop and outer
37880 0a 2a 2a 20 6c 6f 6f 70 73 20 61 72 65 20 65 76  .** loops are ev
37890 61 6c 75 61 74 65 64 20 61 6e 64 20 69 66 20 66  aluated and if f
378a0 61 6c 73 65 20 61 20 6a 75 6d 70 20 69 73 20 6d  alse a jump is m
378b0 61 64 65 20 61 72 6f 75 6e 64 20 61 6c 6c 20 73  ade around all s
378c0 75 62 73 65 71 75 65 6e 74 0a 2a 2a 20 69 6e 6e  ubsequent.** inn
378d0 65 72 20 6c 6f 6f 70 73 20 28 6f 72 20 61 72 6f  er loops (or aro
378e0 75 6e 64 20 74 68 65 20 22 2e 2e 2e 22 20 69 66  und the "..." if
378f0 20 74 68 65 20 74 65 73 74 20 6f 63 63 75 72 73   the test occurs
37900 20 77 69 74 68 69 6e 20 74 68 65 20 69 6e 6e 65   within the inne
37910 72 2d 0a 2a 2a 20 6d 6f 73 74 20 6c 6f 6f 70 29  r-.** most loop)
37920 0a 2a 2a 0a 2a 2a 20 4f 55 54 45 52 20 4a 4f 49  .**.** OUTER JOI
37930 4e 53 0a 2a 2a 0a 2a 2a 20 41 6e 20 6f 75 74 65  NS.**.** An oute
37940 72 20 6a 6f 69 6e 20 6f 66 20 74 61 62 6c 65 73  r join of tables
37950 20 74 31 20 61 6e 64 20 74 32 20 69 73 20 63 6f   t1 and t2 is co
37960 6e 63 65 70 74 61 6c 6c 79 20 63 6f 64 65 64 20  nceptally coded 
37970 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
37980 2a 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77  *    foreach row
37990 31 20 69 6e 20 74 31 20 64 6f 0a 2a 2a 20 20 20  1 in t1 do.**   
379a0 20 20 20 66 6c 61 67 20 3d 20 30 0a 2a 2a 20 20     flag = 0.**  
379b0 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 32      foreach row2
379c0 20 69 6e 20 74 32 20 64 6f 0a 2a 2a 20 20 20 20   in t2 do.**    
379d0 20 20 20 20 73 74 61 72 74 3a 0a 2a 2a 20 20 20      start:.**   
379e0 20 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20         ....**   
379f0 20 20 20 20 20 20 20 66 6c 61 67 20 3d 20 31 0a         flag = 1.
37a00 2a 2a 20 20 20 20 20 20 65 6e 64 0a 2a 2a 20 20  **      end.**  
37a10 20 20 20 20 69 66 20 66 6c 61 67 3d 3d 30 20 74      if flag==0 t
37a20 68 65 6e 0a 2a 2a 20 20 20 20 20 20 20 20 6d 6f  hen.**        mo
37a30 76 65 20 74 68 65 20 72 6f 77 32 20 63 75 72 73  ve the row2 curs
37a40 6f 72 20 74 6f 20 61 20 6e 75 6c 6c 20 72 6f 77  or to a null row
37a50 0a 2a 2a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .**        goto 
37a60 73 74 61 72 74 0a 2a 2a 20 20 20 20 20 20 66 69  start.**      fi
37a70 0a 2a 2a 20 20 20 20 65 6e 64 0a 2a 2a 0a 2a 2a  .**    end.**.**
37a80 20 4f 52 44 45 52 20 42 59 20 43 4c 41 55 53 45   ORDER BY CLAUSE
37a90 20 50 52 4f 43 45 53 53 49 4e 47 0a 2a 2a 0a 2a   PROCESSING.**.*
37aa0 2a 20 70 4f 72 64 65 72 42 79 20 69 73 20 61 20  * pOrderBy is a 
37ab0 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 4f  pointer to the O
37ac0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 28  RDER BY clause (
37ad0 6f 72 20 74 68 65 20 47 52 4f 55 50 20 42 59 20  or the GROUP BY 
37ae0 63 6c 61 75 73 65 0a 2a 2a 20 69 66 20 74 68 65  clause.** if the
37af0 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20 66   WHERE_GROUPBY f
37b00 6c 61 67 20 69 73 20 73 65 74 20 69 6e 20 77 63  lag is set in wc
37b10 74 72 6c 46 6c 61 67 73 29 20 6f 66 20 61 20 53  trlFlags) of a S
37b20 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a  ELECT statement.
37b30 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73 20 6f  ** if there is o
37b40 6e 65 2e 20 20 49 66 20 74 68 65 72 65 20 69 73  ne.  If there is
37b50 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 63 6c 61   no ORDER BY cla
37b60 75 73 65 20 6f 72 20 69 66 20 74 68 69 73 20 72  use or if this r
37b70 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c  outine.** is cal
37b80 6c 65 64 20 66 72 6f 6d 20 61 6e 20 55 50 44 41  led from an UPDA
37b90 54 45 20 6f 72 20 44 45 4c 45 54 45 20 73 74 61  TE or DELETE sta
37ba0 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20 70 4f 72  tement, then pOr
37bb0 64 65 72 42 79 20 69 73 20 4e 55 4c 4c 2e 0a 2a  derBy is NULL..*
37bc0 2a 0a 2a 2a 20 54 68 65 20 69 49 64 78 43 75 72  *.** The iIdxCur
37bd0 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68   parameter is th
37be0 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  e cursor number 
37bf0 6f 66 20 61 6e 20 69 6e 64 65 78 2e 20 20 49 66  of an index.  If
37c00 20 0a 2a 2a 20 57 48 45 52 45 5f 4f 4e 45 54 41   .** WHERE_ONETA
37c10 42 4c 45 5f 4f 4e 4c 59 20 69 73 20 73 65 74 2c  BLE_ONLY is set,
37c20 20 69 49 64 78 43 75 72 20 69 73 20 74 68 65 20   iIdxCur is the 
37c30 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66  cursor number of
37c40 20 61 6e 20 69 6e 64 65 78 0a 2a 2a 20 74 6f 20   an index.** to 
37c50 75 73 65 20 66 6f 72 20 4f 52 20 63 6c 61 75 73  use for OR claus
37c60 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 54  e processing.  T
37c70 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
37c80 73 68 6f 75 6c 64 20 75 73 65 20 74 68 69 73 0a  should use this.
37c90 2a 2a 20 73 70 65 63 69 66 69 63 20 63 75 72 73  ** specific curs
37ca0 6f 72 2e 20 20 49 66 20 57 48 45 52 45 5f 4f 4e  or.  If WHERE_ON
37cb0 45 50 41 53 53 5f 44 45 53 49 52 45 44 20 69 73  EPASS_DESIRED is
37cc0 20 73 65 74 2c 20 74 68 65 6e 20 69 49 64 78 43   set, then iIdxC
37cd0 75 72 20 69 73 0a 2a 2a 20 74 68 65 20 66 69 72  ur is.** the fir
37ce0 73 74 20 63 75 72 73 6f 72 20 69 6e 20 61 6e 20  st cursor in an 
37cf0 61 72 72 61 79 20 6f 66 20 63 75 72 73 6f 72 73  array of cursors
37d00 20 66 6f 72 20 61 6c 6c 20 69 6e 64 69 63 65 73   for all indices
37d10 2e 20 20 69 49 64 78 43 75 72 20 73 68 6f 75 6c  .  iIdxCur shoul
37d20 64 0a 2a 2a 20 62 65 20 75 73 65 64 20 74 6f 20  d.** be used to 
37d30 63 6f 6d 70 75 74 65 20 74 68 65 20 61 70 70 72  compute the appr
37d40 6f 70 72 69 61 74 65 20 63 75 72 73 6f 72 20 64  opriate cursor d
37d50 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 69 63  epending on whic
37d60 68 20 69 6e 64 65 78 20 69 73 0a 2a 2a 20 75 73  h index is.** us
37d70 65 64 2e 0a 2a 2f 0a 57 68 65 72 65 49 6e 66 6f  ed..*/.WhereInfo
37d80 20 2a 73 71 6c 69 74 65 33 57 68 65 72 65 42 65   *sqlite3WhereBe
37d90 67 69 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50  gin(.  Parse *pP
37da0 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  arse,        /* 
37db0 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65  The parser conte
37dc0 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  xt */.  SrcList 
37dd0 2a 70 54 61 62 4c 69 73 74 2c 20 20 20 20 2f 2a  *pTabList,    /*
37de0 20 46 52 4f 4d 20 63 6c 61 75 73 65 3a 20 41 20   FROM clause: A 
37df0 6c 69 73 74 20 6f 66 20 61 6c 6c 20 74 61 62 6c  list of all tabl
37e00 65 73 20 74 6f 20 62 65 20 73 63 61 6e 6e 65 64  es to be scanned
37e10 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65   */.  Expr *pWhe
37e20 72 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54  re,         /* T
37e30 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
37e40 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
37e50 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a 20 41 6e  OrderBy,   /* An
37e60 20 4f 52 44 45 52 20 42 59 20 28 6f 72 20 47 52   ORDER BY (or GR
37e70 4f 55 50 20 42 59 29 20 63 6c 61 75 73 65 2c 20  OUP BY) clause, 
37e80 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70  or NULL */.  Exp
37e90 72 4c 69 73 74 20 2a 70 52 65 73 75 6c 74 53 65  rList *pResultSe
37ea0 74 2c 20 2f 2a 20 52 65 73 75 6c 74 20 73 65 74  t, /* Result set
37eb0 20 6f 66 20 74 68 65 20 71 75 65 72 79 20 2a 2f   of the query */
37ec0 0a 20 20 75 31 36 20 77 63 74 72 6c 46 6c 61 67  .  u16 wctrlFlag
37ed0 73 2c 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20  s,       /* One 
37ee0 6f 66 20 74 68 65 20 57 48 45 52 45 5f 2a 20 66  of the WHERE_* f
37ef0 6c 61 67 73 20 64 65 66 69 6e 65 64 20 69 6e 20  lags defined in 
37f00 73 71 6c 69 74 65 49 6e 74 2e 68 20 2a 2f 0a 20  sqliteInt.h */. 
37f10 20 69 6e 74 20 69 49 64 78 43 75 72 20 20 20 20   int iIdxCur    
37f20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 57 48 45         /* If WHE
37f30 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59  RE_ONETABLE_ONLY
37f40 20 69 73 20 73 65 74 2c 20 69 6e 64 65 78 20 63   is set, index c
37f50 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 2a 2f 0a  ursor number */.
37f60 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 57 49  ){.  int nByteWI
37f70 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20  nfo;            
37f80 2f 2a 20 4e 75 6d 2e 20 62 79 74 65 73 20 61 6c  /* Num. bytes al
37f90 6c 6f 63 61 74 65 64 20 66 6f 72 20 57 68 65 72  located for Wher
37fa0 65 49 6e 66 6f 20 73 74 72 75 63 74 20 2a 2f 0a  eInfo struct */.
37fb0 20 20 69 6e 74 20 6e 54 61 62 4c 69 73 74 3b 20    int nTabList; 
37fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
37fd0 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e  Number of elemen
37fe0 74 73 20 69 6e 20 70 54 61 62 4c 69 73 74 20 2a  ts in pTabList *
37ff0 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  /.  WhereInfo *p
38000 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 2f  WInfo;         /
38010 2a 20 57 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68  * Will become th
38020 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f  e return value o
38030 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  f this function 
38040 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  */.  Vdbe *v = p
38050 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20  Parse->pVdbe;   
38060 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20 64  /* The virtual d
38070 61 74 61 62 61 73 65 20 65 6e 67 69 6e 65 20 2a  atabase engine *
38080 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52  /.  Bitmask notR
38090 65 61 64 79 3b 20 20 20 20 20 20 20 20 20 20 2f  eady;          /
380a0 2a 20 43 75 72 73 6f 72 73 20 74 68 61 74 20 61  * Cursors that a
380b0 72 65 20 6e 6f 74 20 79 65 74 20 70 6f 73 69 74  re not yet posit
380c0 69 6f 6e 65 64 20 2a 2f 0a 20 20 57 68 65 72 65  ioned */.  Where
380d0 4c 6f 6f 70 42 75 69 6c 64 65 72 20 73 57 4c 42  LoopBuilder sWLB
380e0 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 57 68 65  ;     /* The Whe
380f0 72 65 4c 6f 6f 70 20 62 75 69 6c 64 65 72 20 2a  reLoop builder *
38100 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b 53 65 74  /.  WhereMaskSet
38110 20 2a 70 4d 61 73 6b 53