/ Hex Artifact Content
Login

Artifact b879a02e59c27f1447224fa2e79a7f2c7c345fd5:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d  ******.** This m
0180: 6f 64 75 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43  odule contains C
0190: 20 63 6f 64 65 20 74 68 61 74 20 67 65 6e 65 72   code that gener
01a0: 61 74 65 73 20 56 44 42 45 20 63 6f 64 65 20 75  ates VDBE code u
01b0: 73 65 64 20 74 6f 20 70 72 6f 63 65 73 73 0a 2a  sed to process.*
01c0: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
01d0: 73 65 20 6f 66 20 53 51 4c 20 73 74 61 74 65 6d  se of SQL statem
01e0: 65 6e 74 73 2e 20 20 54 68 69 73 20 6d 6f 64 75  ents.  This modu
01f0: 6c 65 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  le is responsibl
0200: 65 20 66 6f 72 0a 2a 2a 20 67 65 6e 65 72 61 74  e for.** generat
0210: 69 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68 61  ing the code tha
0220: 74 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20  t loops through 
0230: 61 20 74 61 62 6c 65 20 6c 6f 6f 6b 69 6e 67 20  a table looking 
0240: 66 6f 72 20 61 70 70 6c 69 63 61 62 6c 65 0a 2a  for applicable.*
0250: 2a 20 72 6f 77 73 2e 20 20 49 6e 64 69 63 65 73  * rows.  Indices
0260: 20 61 72 65 20 73 65 6c 65 63 74 65 64 20 61 6e   are selected an
0270: 64 20 75 73 65 64 20 74 6f 20 73 70 65 65 64 20  d used to speed 
0280: 74 68 65 20 73 65 61 72 63 68 20 77 68 65 6e 20  the search when 
0290: 64 6f 69 6e 67 0a 2a 2a 20 73 6f 20 69 73 20 61  doing.** so is a
02a0: 70 70 6c 69 63 61 62 6c 65 2e 20 20 42 65 63 61  pplicable.  Beca
02b0: 75 73 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 20  use this module 
02c0: 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
02d0: 6f 72 20 73 65 6c 65 63 74 69 6e 67 0a 2a 2a 20  or selecting.** 
02e0: 69 6e 64 69 63 65 73 2c 20 79 6f 75 20 6d 69 67  indices, you mig
02f0: 68 74 20 61 6c 73 6f 20 74 68 69 6e 6b 20 6f 66  ht also think of
0300: 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 61 73 20   this module as 
0310: 74 68 65 20 22 71 75 65 72 79 20 6f 70 74 69 6d  the "query optim
0320: 69 7a 65 72 22 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  izer"..*/.#inclu
0330: 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22  de "sqliteInt.h"
0340: 0a 23 69 6e 63 6c 75 64 65 20 22 77 68 65 72 65  .#include "where
0350: 49 6e 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 52 65  Int.h"../*.** Re
0360: 74 75 72 6e 20 74 68 65 20 65 73 74 69 6d 61 74  turn the estimat
0370: 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74  ed number of out
0380: 70 75 74 20 72 6f 77 73 20 66 72 6f 6d 20 61 20  put rows from a 
0390: 57 48 45 52 45 20 63 6c 61 75 73 65 0a 2a 2f 0a  WHERE clause.*/.
03a0: 75 36 34 20 73 71 6c 69 74 65 33 57 68 65 72 65  u64 sqlite3Where
03b0: 4f 75 74 70 75 74 52 6f 77 43 6f 75 6e 74 28 57  OutputRowCount(W
03c0: 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
03d0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
03e0: 74 65 33 4c 6f 67 45 73 74 54 6f 49 6e 74 28 70  te3LogEstToInt(p
03f0: 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 29 3b  WInfo->nRowOut);
0400: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
0410: 20 6f 6e 65 20 6f 66 20 74 68 65 20 57 48 45 52   one of the WHER
0420: 45 5f 44 49 53 54 49 4e 43 54 5f 78 78 78 78 78  E_DISTINCT_xxxxx
0430: 20 76 61 6c 75 65 73 20 74 6f 20 69 6e 64 69 63   values to indic
0440: 61 74 65 20 68 6f 77 20 74 68 69 73 0a 2a 2a 20  ate how this.** 
0450: 57 48 45 52 45 20 63 6c 61 75 73 65 20 72 65 74  WHERE clause ret
0460: 75 72 6e 73 20 6f 75 74 70 75 74 73 20 66 6f 72  urns outputs for
0470: 20 44 49 53 54 49 4e 43 54 20 70 72 6f 63 65 73   DISTINCT proces
0480: 73 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  sing..*/.int sql
0490: 69 74 65 33 57 68 65 72 65 49 73 44 69 73 74 69  ite3WhereIsDisti
04a0: 6e 63 74 28 57 68 65 72 65 49 6e 66 6f 20 2a 70  nct(WhereInfo *p
04b0: 57 49 6e 66 6f 29 7b 0a 20 20 72 65 74 75 72 6e  WInfo){.  return
04c0: 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e   pWInfo->eDistin
04d0: 63 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ct;.}../*.** Ret
04e0: 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
04f0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 72 65 74  WHERE clause ret
0500: 75 72 6e 73 20 72 6f 77 73 20 69 6e 20 4f 52 44  urns rows in ORD
0510: 45 52 20 42 59 20 6f 72 64 65 72 2e 0a 2a 2a 20  ER BY order..** 
0520: 52 65 74 75 72 6e 20 46 41 4c 53 45 20 69 66 20  Return FALSE if 
0530: 74 68 65 20 6f 75 74 70 75 74 20 6e 65 65 64 73  the output needs
0540: 20 74 6f 20 62 65 20 73 6f 72 74 65 64 2e 0a 2a   to be sorted..*
0550: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65  /.int sqlite3Whe
0560: 72 65 49 73 4f 72 64 65 72 65 64 28 57 68 65 72  reIsOrdered(Wher
0570: 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a  eInfo *pWInfo){.
0580: 20 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 2d    return pWInfo-
0590: 3e 6e 4f 42 53 61 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  >nOBSat;.}../*.*
05a0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 56 44 42  * Return the VDB
05b0: 45 20 61 64 64 72 65 73 73 20 6f 72 20 6c 61 62  E address or lab
05c0: 65 6c 20 74 6f 20 6a 75 6d 70 20 74 6f 20 69 6e  el to jump to in
05d0: 20 6f 72 64 65 72 20 74 6f 20 63 6f 6e 74 69 6e   order to contin
05e0: 75 65 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c  ue.** immediatel
05f0: 79 20 77 69 74 68 20 74 68 65 20 6e 65 78 74 20  y with the next 
0600: 72 6f 77 20 6f 66 20 61 20 57 48 45 52 45 20 63  row of a WHERE c
0610: 6c 61 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  lause..*/.int sq
0620: 6c 69 74 65 33 57 68 65 72 65 43 6f 6e 74 69 6e  lite3WhereContin
0630: 75 65 4c 61 62 65 6c 28 57 68 65 72 65 49 6e 66  ueLabel(WhereInf
0640: 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 61 73  o *pWInfo){.  as
0650: 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 69 43  sert( pWInfo->iC
0660: 6f 6e 74 69 6e 75 65 21 3d 30 20 29 3b 0a 20 20  ontinue!=0 );.  
0670: 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 69  return pWInfo->i
0680: 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a  Continue;.}../*.
0690: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 56 44  ** Return the VD
06a0: 42 45 20 61 64 64 72 65 73 73 20 6f 72 20 6c 61  BE address or la
06b0: 62 65 6c 20 74 6f 20 6a 75 6d 70 20 74 6f 20 69  bel to jump to i
06c0: 6e 20 6f 72 64 65 72 20 74 6f 20 62 72 65 61 6b  n order to break
06d0: 0a 2a 2a 20 6f 75 74 20 6f 66 20 61 20 57 48 45  .** out of a WHE
06e0: 52 45 20 6c 6f 6f 70 2e 0a 2a 2f 0a 69 6e 74 20  RE loop..*/.int 
06f0: 73 71 6c 69 74 65 33 57 68 65 72 65 42 72 65 61  sqlite3WhereBrea
0700: 6b 4c 61 62 65 6c 28 57 68 65 72 65 49 6e 66 6f  kLabel(WhereInfo
0710: 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 72 65 74   *pWInfo){.  ret
0720: 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65  urn pWInfo->iBre
0730: 61 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ak;.}../*.** Ret
0740: 75 72 6e 20 54 52 55 45 20 69 66 20 61 6e 20 55  urn TRUE if an U
0750: 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20  PDATE or DELETE 
0760: 73 74 61 74 65 6d 65 6e 74 20 63 61 6e 20 6f 70  statement can op
0770: 65 72 61 74 65 20 64 69 72 65 63 74 6c 79 20 6f  erate directly o
0780: 6e 0a 2a 2a 20 74 68 65 20 72 6f 77 69 64 73 20  n.** the rowids 
0790: 72 65 74 75 72 6e 65 64 20 62 79 20 61 20 57 48  returned by a WH
07a0: 45 52 45 20 63 6c 61 75 73 65 2e 20 20 52 65 74  ERE clause.  Ret
07b0: 75 72 6e 20 46 41 4c 53 45 20 69 66 20 64 6f 69  urn FALSE if doi
07c0: 6e 67 20 61 6e 0a 2a 2a 20 55 50 44 41 54 45 20  ng an.** UPDATE 
07d0: 6f 72 20 44 45 4c 45 54 45 20 6d 69 67 68 74 20  or DELETE might 
07e0: 63 68 61 6e 67 65 20 73 75 62 73 65 71 75 65 6e  change subsequen
07f0: 74 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 72  t WHERE clause r
0800: 65 73 75 6c 74 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  esults..**.** If
0810: 20 74 68 65 20 4f 4e 45 50 41 53 53 20 6f 70 74   the ONEPASS opt
0820: 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 75 73 65  imization is use
0830: 64 20 28 69 66 20 74 68 69 73 20 72 6f 75 74 69  d (if this routi
0840: 6e 65 20 72 65 74 75 72 6e 73 20 74 72 75 65 29  ne returns true)
0850: 0a 2a 2a 20 74 68 65 6e 20 61 6c 73 6f 20 77 72  .** then also wr
0860: 69 74 65 20 74 68 65 20 69 6e 64 69 63 65 73 20  ite the indices 
0870: 6f 66 20 6f 70 65 6e 20 63 75 72 73 6f 72 73 20  of open cursors 
0880: 75 73 65 64 20 62 79 20 4f 4e 45 50 41 53 53 0a  used by ONEPASS.
0890: 2a 2a 20 69 6e 74 6f 20 61 69 43 75 72 5b 30 5d  ** into aiCur[0]
08a0: 20 61 6e 64 20 61 69 43 75 72 5b 31 5d 2e 20 20   and aiCur[1].  
08b0: 69 61 43 75 72 5b 30 5d 20 67 65 74 73 20 74 68  iaCur[0] gets th
08c0: 65 20 63 75 72 73 6f 72 20 6f 66 20 74 68 65 20  e cursor of the 
08d0: 64 61 74 61 0a 2a 2a 20 74 61 62 6c 65 20 61 6e  data.** table an
08e0: 64 20 69 61 43 75 72 5b 31 5d 20 67 65 74 73 20  d iaCur[1] gets 
08f0: 74 68 65 20 63 75 72 73 6f 72 20 75 73 65 64 20  the cursor used 
0900: 62 79 20 61 6e 20 61 75 78 69 6c 69 61 72 79 20  by an auxiliary 
0910: 69 6e 64 65 78 2e 0a 2a 2a 20 45 69 74 68 65 72  index..** Either
0920: 20 76 61 6c 75 65 20 6d 61 79 20 62 65 20 2d 31   value may be -1
0930: 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61  , indicating tha
0940: 74 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20  t cursor is not 
0950: 75 73 65 64 2e 0a 2a 2a 20 41 6e 79 20 63 75 72  used..** Any cur
0960: 73 6f 72 73 20 72 65 74 75 72 6e 65 64 20 77 69  sors returned wi
0970: 6c 6c 20 68 61 76 65 20 62 65 65 6e 20 6f 70 65  ll have been ope
0980: 6e 65 64 20 66 6f 72 20 77 72 69 74 69 6e 67 2e  ned for writing.
0990: 0a 2a 2a 0a 2a 2a 20 61 69 43 75 72 5b 30 5d 20  .**.** aiCur[0] 
09a0: 61 6e 64 20 61 69 43 75 72 5b 31 5d 20 62 6f 74  and aiCur[1] bot
09b0: 68 20 67 65 74 20 2d 31 20 69 66 20 74 68 65 20  h get -1 if the 
09c0: 77 68 65 72 65 2d 63 6c 61 75 73 65 20 6c 6f 67  where-clause log
09d0: 69 63 20 69 73 0a 2a 2a 20 75 6e 61 62 6c 65 20  ic is.** unable 
09e0: 74 6f 20 75 73 65 20 74 68 65 20 4f 4e 45 50 41  to use the ONEPA
09f0: 53 53 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e  SS optimization.
0a00: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 57  .*/.int sqlite3W
0a10: 68 65 72 65 4f 6b 4f 6e 65 50 61 73 73 28 57 68  hereOkOnePass(Wh
0a20: 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c  ereInfo *pWInfo,
0a30: 20 69 6e 74 20 2a 61 69 43 75 72 29 7b 0a 20 20   int *aiCur){.  
0a40: 6d 65 6d 63 70 79 28 61 69 43 75 72 2c 20 70 57  memcpy(aiCur, pW
0a50: 49 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e 65 50 61  Info->aiCurOnePa
0a60: 73 73 2c 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a  ss, sizeof(int)*
0a70: 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 57 49  2);.  return pWI
0a80: 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 3b 0a  nfo->okOnePass;.
0a90: 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  }../*.** Move th
0aa0: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 53 72  e content of pSr
0ab0: 63 20 69 6e 74 6f 20 70 44 65 73 74 0a 2a 2f 0a  c into pDest.*/.
0ac0: 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72  static void wher
0ad0: 65 4f 72 4d 6f 76 65 28 57 68 65 72 65 4f 72 53  eOrMove(WhereOrS
0ae0: 65 74 20 2a 70 44 65 73 74 2c 20 57 68 65 72 65  et *pDest, Where
0af0: 4f 72 53 65 74 20 2a 70 53 72 63 29 7b 0a 20 20  OrSet *pSrc){.  
0b00: 70 44 65 73 74 2d 3e 6e 20 3d 20 70 53 72 63 2d  pDest->n = pSrc-
0b10: 3e 6e 3b 0a 20 20 6d 65 6d 63 70 79 28 70 44 65  >n;.  memcpy(pDe
0b20: 73 74 2d 3e 61 2c 20 70 53 72 63 2d 3e 61 2c 20  st->a, pSrc->a, 
0b30: 70 44 65 73 74 2d 3e 6e 2a 73 69 7a 65 6f 66 28  pDest->n*sizeof(
0b40: 70 44 65 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 7d  pDest->a[0]));.}
0b50: 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 69  ../*.** Try to i
0b60: 6e 73 65 72 74 20 61 20 6e 65 77 20 70 72 65 72  nsert a new prer
0b70: 65 71 75 69 73 69 74 65 2f 63 6f 73 74 20 65 6e  equisite/cost en
0b80: 74 72 79 20 69 6e 74 6f 20 74 68 65 20 57 68 65  try into the Whe
0b90: 72 65 4f 72 53 65 74 20 70 53 65 74 2e 0a 2a 2a  reOrSet pSet..**
0ba0: 0a 2a 2a 20 54 68 65 20 6e 65 77 20 65 6e 74 72  .** The new entr
0bb0: 79 20 6d 69 67 68 74 20 6f 76 65 72 77 72 69 74  y might overwrit
0bc0: 65 20 61 6e 20 65 78 69 73 74 69 6e 67 20 65 6e  e an existing en
0bd0: 74 72 79 2c 20 6f 72 20 69 74 20 6d 69 67 68 74  try, or it might
0be0: 20 62 65 0a 2a 2a 20 61 70 70 65 6e 64 65 64 2c   be.** appended,
0bf0: 20 6f 72 20 69 74 20 6d 69 67 68 74 20 62 65 20   or it might be 
0c00: 64 69 73 63 61 72 64 65 64 2e 20 20 44 6f 20 77  discarded.  Do w
0c10: 68 61 74 65 76 65 72 20 69 73 20 74 68 65 20 72  hatever is the r
0c20: 69 67 68 74 20 74 68 69 6e 67 0a 2a 2a 20 73 6f  ight thing.** so
0c30: 20 74 68 61 74 20 70 53 65 74 20 6b 65 65 70 73   that pSet keeps
0c40: 20 74 68 65 20 4e 5f 4f 52 5f 43 4f 53 54 20 62   the N_OR_COST b
0c50: 65 73 74 20 65 6e 74 72 69 65 73 20 73 65 65 6e  est entries seen
0c60: 20 73 6f 20 66 61 72 2e 0a 2a 2f 0a 73 74 61 74   so far..*/.stat
0c70: 69 63 20 69 6e 74 20 77 68 65 72 65 4f 72 49 6e  ic int whereOrIn
0c80: 73 65 72 74 28 0a 20 20 57 68 65 72 65 4f 72 53  sert(.  WhereOrS
0c90: 65 74 20 2a 70 53 65 74 2c 20 20 20 20 20 20 2f  et *pSet,      /
0ca0: 2a 20 54 68 65 20 57 68 65 72 65 4f 72 53 65 74  * The WhereOrSet
0cb0: 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 20 2a   to be updated *
0cc0: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 70 72 65 72  /.  Bitmask prer
0cd0: 65 71 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 72  eq,        /* Pr
0ce0: 65 72 65 71 75 69 73 69 74 65 73 20 6f 66 20 74  erequisites of t
0cf0: 68 65 20 6e 65 77 20 65 6e 74 72 79 20 2a 2f 0a  he new entry */.
0d00: 20 20 4c 6f 67 45 73 74 20 72 52 75 6e 2c 20 20    LogEst rRun,  
0d10: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 75 6e 2d           /* Run-
0d20: 63 6f 73 74 20 6f 66 20 74 68 65 20 6e 65 77 20  cost of the new 
0d30: 65 6e 74 72 79 20 2a 2f 0a 20 20 4c 6f 67 45 73  entry */.  LogEs
0d40: 74 20 6e 4f 75 74 20 20 20 20 20 20 20 20 20 20  t nOut          
0d50: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f    /* Number of o
0d60: 75 74 70 75 74 73 20 66 6f 72 20 74 68 65 20 6e  utputs for the n
0d70: 65 77 20 65 6e 74 72 79 20 2a 2f 0a 29 7b 0a 20  ew entry */.){. 
0d80: 20 75 31 36 20 69 3b 0a 20 20 57 68 65 72 65 4f   u16 i;.  WhereO
0d90: 72 43 6f 73 74 20 2a 70 3b 0a 20 20 66 6f 72 28  rCost *p;.  for(
0da0: 69 3d 70 53 65 74 2d 3e 6e 2c 20 70 3d 70 53 65  i=pSet->n, p=pSe
0db0: 74 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20  t->a; i>0; i--, 
0dc0: 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 72 52  p++){.    if( rR
0dd0: 75 6e 3c 3d 70 2d 3e 72 52 75 6e 20 26 26 20 28  un<=p->rRun && (
0de0: 70 72 65 72 65 71 20 26 20 70 2d 3e 70 72 65 72  prereq & p->prer
0df0: 65 71 29 3d 3d 70 72 65 72 65 71 20 29 7b 0a 20  eq)==prereq ){. 
0e00: 20 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65 4f       goto whereO
0e10: 72 49 6e 73 65 72 74 5f 64 6f 6e 65 3b 0a 20 20  rInsert_done;.  
0e20: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 72    }.    if( p->r
0e30: 52 75 6e 3c 3d 72 52 75 6e 20 26 26 20 28 70 2d  Run<=rRun && (p-
0e40: 3e 70 72 65 72 65 71 20 26 20 70 72 65 72 65 71  >prereq & prereq
0e50: 29 3d 3d 70 2d 3e 70 72 65 72 65 71 20 29 7b 0a  )==p->prereq ){.
0e60: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
0e70: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
0e80: 70 53 65 74 2d 3e 6e 3c 4e 5f 4f 52 5f 43 4f 53  pSet->n<N_OR_COS
0e90: 54 20 29 7b 0a 20 20 20 20 70 20 3d 20 26 70 53  T ){.    p = &pS
0ea0: 65 74 2d 3e 61 5b 70 53 65 74 2d 3e 6e 2b 2b 5d  et->a[pSet->n++]
0eb0: 3b 0a 20 20 20 20 70 2d 3e 6e 4f 75 74 20 3d 20  ;.    p->nOut = 
0ec0: 6e 4f 75 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  nOut;.  }else{. 
0ed0: 20 20 20 70 20 3d 20 70 53 65 74 2d 3e 61 3b 0a     p = pSet->a;.
0ee0: 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 70      for(i=1; i<p
0ef0: 53 65 74 2d 3e 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Set->n; i++){.  
0f00: 20 20 20 20 69 66 28 20 70 2d 3e 72 52 75 6e 3e      if( p->rRun>
0f10: 70 53 65 74 2d 3e 61 5b 69 5d 2e 72 52 75 6e 20  pSet->a[i].rRun 
0f20: 29 20 70 20 3d 20 70 53 65 74 2d 3e 61 20 2b 20  ) p = pSet->a + 
0f30: 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  i;.    }.    if(
0f40: 20 70 2d 3e 72 52 75 6e 3c 3d 72 52 75 6e 20 29   p->rRun<=rRun )
0f50: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 77   return 0;.  }.w
0f60: 68 65 72 65 4f 72 49 6e 73 65 72 74 5f 64 6f 6e  hereOrInsert_don
0f70: 65 3a 0a 20 20 70 2d 3e 70 72 65 72 65 71 20 3d  e:.  p->prereq =
0f80: 20 70 72 65 72 65 71 3b 0a 20 20 70 2d 3e 72 52   prereq;.  p->rR
0f90: 75 6e 20 3d 20 72 52 75 6e 3b 0a 20 20 69 66 28  un = rRun;.  if(
0fa0: 20 70 2d 3e 6e 4f 75 74 3e 6e 4f 75 74 20 29 20   p->nOut>nOut ) 
0fb0: 70 2d 3e 6e 4f 75 74 20 3d 20 6e 4f 75 74 3b 0a  p->nOut = nOut;.
0fc0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f    return 1;.}../
0fd0: 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
0fe0: 61 20 70 72 65 61 6c 6c 6f 63 61 74 65 64 20 57  a preallocated W
0ff0: 68 65 72 65 43 6c 61 75 73 65 20 73 74 72 75 63  hereClause struc
1000: 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ture..*/.static 
1010: 76 6f 69 64 20 77 68 65 72 65 43 6c 61 75 73 65  void whereClause
1020: 49 6e 69 74 28 0a 20 20 57 68 65 72 65 43 6c 61  Init(.  WhereCla
1030: 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20  use *pWC,       
1040: 20 2f 2a 20 54 68 65 20 57 68 65 72 65 43 6c 61   /* The WhereCla
1050: 75 73 65 20 74 6f 20 62 65 20 69 6e 69 74 69 61  use to be initia
1060: 6c 69 7a 65 64 20 2a 2f 0a 20 20 57 68 65 72 65  lized */.  Where
1070: 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 20 20 20  Info *pWInfo    
1080: 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
1090: 20 70 72 6f 63 65 73 73 69 6e 67 20 63 6f 6e 74   processing cont
10a0: 65 78 74 20 2a 2f 0a 29 7b 0a 20 20 70 57 43 2d  ext */.){.  pWC-
10b0: 3e 70 57 49 6e 66 6f 20 3d 20 70 57 49 6e 66 6f  >pWInfo = pWInfo
10c0: 3b 0a 20 20 70 57 43 2d 3e 70 4f 75 74 65 72 20  ;.  pWC->pOuter 
10d0: 3d 20 30 3b 0a 20 20 70 57 43 2d 3e 6e 54 65 72  = 0;.  pWC->nTer
10e0: 6d 20 3d 20 30 3b 0a 20 20 70 57 43 2d 3e 6e 53  m = 0;.  pWC->nS
10f0: 6c 6f 74 20 3d 20 41 72 72 61 79 53 69 7a 65 28  lot = ArraySize(
1100: 70 57 43 2d 3e 61 53 74 61 74 69 63 29 3b 0a 20  pWC->aStatic);. 
1110: 20 70 57 43 2d 3e 61 20 3d 20 70 57 43 2d 3e 61   pWC->a = pWC->a
1120: 53 74 61 74 69 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f  Static;.}../* Fo
1130: 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20  rward reference 
1140: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
1150: 68 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28  hereClauseClear(
1160: 57 68 65 72 65 43 6c 61 75 73 65 2a 29 3b 0a 0a  WhereClause*);..
1170: 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65  /*.** Deallocate
1180: 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 73 73 6f   all memory asso
1190: 63 69 61 74 65 64 20 77 69 74 68 20 61 20 57 68  ciated with a Wh
11a0: 65 72 65 4f 72 49 6e 66 6f 20 6f 62 6a 65 63 74  ereOrInfo object
11b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
11c0: 20 77 68 65 72 65 4f 72 49 6e 66 6f 44 65 6c 65   whereOrInfoDele
11d0: 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  te(sqlite3 *db, 
11e0: 57 68 65 72 65 4f 72 49 6e 66 6f 20 2a 70 29 7b  WhereOrInfo *p){
11f0: 0a 20 20 77 68 65 72 65 43 6c 61 75 73 65 43 6c  .  whereClauseCl
1200: 65 61 72 28 26 70 2d 3e 77 63 29 3b 0a 20 20 73  ear(&p->wc);.  s
1210: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
1220: 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65   p);.}../*.** De
1230: 61 6c 6c 6f 63 61 74 65 20 61 6c 6c 20 6d 65 6d  allocate all mem
1240: 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77  ory associated w
1250: 69 74 68 20 61 20 57 68 65 72 65 41 6e 64 49 6e  ith a WhereAndIn
1260: 66 6f 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74  fo object..*/.st
1270: 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 41  atic void whereA
1280: 6e 64 49 6e 66 6f 44 65 6c 65 74 65 28 73 71 6c  ndInfoDelete(sql
1290: 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 41  ite3 *db, WhereA
12a0: 6e 64 49 6e 66 6f 20 2a 70 29 7b 0a 20 20 77 68  ndInfo *p){.  wh
12b0: 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28 26  ereClauseClear(&
12c0: 70 2d 3e 77 63 29 3b 0a 20 20 73 71 6c 69 74 65  p->wc);.  sqlite
12d0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a  3DbFree(db, p);.
12e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63  }../*.** Dealloc
12f0: 61 74 65 20 61 20 57 68 65 72 65 43 6c 61 75 73  ate a WhereClaus
1300: 65 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68  e structure.  Th
1310: 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 73 74  e WhereClause st
1320: 72 75 63 74 75 72 65 0a 2a 2a 20 69 74 73 65 6c  ructure.** itsel
1330: 66 20 69 73 20 6e 6f 74 20 66 72 65 65 64 2e 20  f is not freed. 
1340: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
1350: 20 74 68 65 20 69 6e 76 65 72 73 65 20 6f 66 20   the inverse of 
1360: 77 68 65 72 65 43 6c 61 75 73 65 49 6e 69 74 28  whereClauseInit(
1370: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  )..*/.static voi
1380: 64 20 77 68 65 72 65 43 6c 61 75 73 65 43 6c 65  d whereClauseCle
1390: 61 72 28 57 68 65 72 65 43 6c 61 75 73 65 20 2a  ar(WhereClause *
13a0: 70 57 43 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  pWC){.  int i;. 
13b0: 20 57 68 65 72 65 54 65 72 6d 20 2a 61 3b 0a 20   WhereTerm *a;. 
13c0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
13d0: 57 43 2d 3e 70 57 49 6e 66 6f 2d 3e 70 50 61 72  WC->pWInfo->pPar
13e0: 73 65 2d 3e 64 62 3b 0a 20 20 66 6f 72 28 69 3d  se->db;.  for(i=
13f0: 70 57 43 2d 3e 6e 54 65 72 6d 2d 31 2c 20 61 3d  pWC->nTerm-1, a=
1400: 70 57 43 2d 3e 61 3b 20 69 3e 3d 30 3b 20 69 2d  pWC->a; i>=0; i-
1410: 2d 2c 20 61 2b 2b 29 7b 0a 20 20 20 20 69 66 28  -, a++){.    if(
1420: 20 61 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45   a->wtFlags & TE
1430: 52 4d 5f 44 59 4e 41 4d 49 43 20 29 7b 0a 20 20  RM_DYNAMIC ){.  
1440: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
1450: 65 6c 65 74 65 28 64 62 2c 20 61 2d 3e 70 45 78  elete(db, a->pEx
1460: 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  pr);.    }.    i
1470: 66 28 20 61 2d 3e 77 74 46 6c 61 67 73 20 26 20  f( a->wtFlags & 
1480: 54 45 52 4d 5f 4f 52 49 4e 46 4f 20 29 7b 0a 20  TERM_ORINFO ){. 
1490: 20 20 20 20 20 77 68 65 72 65 4f 72 49 6e 66 6f       whereOrInfo
14a0: 44 65 6c 65 74 65 28 64 62 2c 20 61 2d 3e 75 2e  Delete(db, a->u.
14b0: 70 4f 72 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 65  pOrInfo);.    }e
14c0: 6c 73 65 20 69 66 28 20 61 2d 3e 77 74 46 6c 61  lse if( a->wtFla
14d0: 67 73 20 26 20 54 45 52 4d 5f 41 4e 44 49 4e 46  gs & TERM_ANDINF
14e0: 4f 20 29 7b 0a 20 20 20 20 20 20 77 68 65 72 65  O ){.      where
14f0: 41 6e 64 49 6e 66 6f 44 65 6c 65 74 65 28 64 62  AndInfoDelete(db
1500: 2c 20 61 2d 3e 75 2e 70 41 6e 64 49 6e 66 6f 29  , a->u.pAndInfo)
1510: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
1520: 28 20 70 57 43 2d 3e 61 21 3d 70 57 43 2d 3e 61  ( pWC->a!=pWC->a
1530: 53 74 61 74 69 63 20 29 7b 0a 20 20 20 20 73 71  Static ){.    sq
1540: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
1550: 70 57 43 2d 3e 61 29 3b 0a 20 20 7d 0a 7d 0a 0a  pWC->a);.  }.}..
1560: 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 73 69 6e 67  /*.** Add a sing
1570: 6c 65 20 6e 65 77 20 57 68 65 72 65 54 65 72 6d  le new WhereTerm
1580: 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20 57 68   entry to the Wh
1590: 65 72 65 43 6c 61 75 73 65 20 6f 62 6a 65 63 74  ereClause object
15a0: 20 70 57 43 2e 0a 2a 2a 20 54 68 65 20 6e 65 77   pWC..** The new
15b0: 20 57 68 65 72 65 54 65 72 6d 20 6f 62 6a 65 63   WhereTerm objec
15c0: 74 20 69 73 20 63 6f 6e 73 74 72 75 63 74 65 64  t is constructed
15d0: 20 66 72 6f 6d 20 45 78 70 72 20 70 20 61 6e 64   from Expr p and
15e0: 20 77 69 74 68 20 77 74 46 6c 61 67 73 2e 0a 2a   with wtFlags..*
15f0: 2a 20 54 68 65 20 69 6e 64 65 78 20 69 6e 20 70  * The index in p
1600: 57 43 2d 3e 61 5b 5d 20 6f 66 20 74 68 65 20 6e  WC->a[] of the n
1610: 65 77 20 57 68 65 72 65 54 65 72 6d 20 69 73 20  ew WhereTerm is 
1620: 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63  returned on succ
1630: 65 73 73 2e 0a 2a 2a 20 30 20 69 73 20 72 65 74  ess..** 0 is ret
1640: 75 72 6e 65 64 20 69 66 20 74 68 65 20 6e 65 77  urned if the new
1650: 20 57 68 65 72 65 54 65 72 6d 20 63 6f 75 6c 64   WhereTerm could
1660: 20 6e 6f 74 20 62 65 20 61 64 64 65 64 20 64 75   not be added du
1670: 65 20 74 6f 20 61 20 6d 65 6d 6f 72 79 0a 2a 2a  e to a memory.**
1680: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f   allocation erro
1690: 72 2e 20 20 54 68 65 20 6d 65 6d 6f 72 79 20 61  r.  The memory a
16a0: 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 75 72  llocation failur
16b0: 65 20 77 69 6c 6c 20 62 65 20 72 65 63 6f 72 64  e will be record
16c0: 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 64 62 2d  ed in.** the db-
16d0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c  >mallocFailed fl
16e0: 61 67 20 73 6f 20 74 68 61 74 20 68 69 67 68 65  ag so that highe
16f0: 72 2d 6c 65 76 65 6c 20 66 75 6e 63 74 69 6f 6e  r-level function
1700: 73 20 63 61 6e 20 64 65 74 65 63 74 20 69 74 2e  s can detect it.
1710: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
1720: 69 6e 65 20 77 69 6c 6c 20 69 6e 63 72 65 61 73  ine will increas
1730: 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  e the size of th
1740: 65 20 70 57 43 2d 3e 61 5b 5d 20 61 72 72 61 79  e pWC->a[] array
1750: 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a   as necessary..*
1760: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 77 74 46 6c  *.** If the wtFl
1770: 61 67 73 20 61 72 67 75 6d 65 6e 74 20 69 6e 63  ags argument inc
1780: 6c 75 64 65 73 20 54 45 52 4d 5f 44 59 4e 41 4d  ludes TERM_DYNAM
1790: 49 43 2c 20 74 68 65 6e 20 72 65 73 70 6f 6e 73  IC, then respons
17a0: 69 62 69 6c 69 74 79 0a 2a 2a 20 66 6f 72 20 66  ibility.** for f
17b0: 72 65 65 69 6e 67 20 74 68 65 20 65 78 70 72 65  reeing the expre
17c0: 73 73 69 6f 6e 20 70 20 69 73 20 61 73 73 75 6d  ssion p is assum
17d0: 65 64 20 62 79 20 74 68 65 20 57 68 65 72 65 43  ed by the WhereC
17e0: 6c 61 75 73 65 20 6f 62 6a 65 63 74 20 70 57 43  lause object pWC
17f0: 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 72 75  ..** This is tru
1800: 65 20 65 76 65 6e 20 69 66 20 74 68 69 73 20 72  e even if this r
1810: 6f 75 74 69 6e 65 20 66 61 69 6c 73 20 74 6f 20  outine fails to 
1820: 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 57  allocate a new W
1830: 68 65 72 65 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20  hereTerm..**.** 
1840: 57 41 52 4e 49 4e 47 3a 20 20 54 68 69 73 20 72  WARNING:  This r
1850: 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 72 65 61  outine might rea
1860: 6c 6c 6f 63 61 74 65 20 74 68 65 20 73 70 61 63  llocate the spac
1870: 65 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a  e used to store.
1880: 2a 2a 20 57 68 65 72 65 54 65 72 6d 73 2e 20 20  ** WhereTerms.  
1890: 41 6c 6c 20 70 6f 69 6e 74 65 72 73 20 74 6f 20  All pointers to 
18a0: 57 68 65 72 65 54 65 72 6d 73 20 73 68 6f 75 6c  WhereTerms shoul
18b0: 64 20 62 65 20 69 6e 76 61 6c 69 64 61 74 65 64  d be invalidated
18c0: 20 61 66 74 65 72 0a 2a 2a 20 63 61 6c 6c 69 6e   after.** callin
18d0: 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20  g this routine. 
18e0: 20 53 75 63 68 20 70 6f 69 6e 74 65 72 73 20 6d   Such pointers m
18f0: 61 79 20 62 65 20 72 65 69 6e 69 74 69 61 6c 69  ay be reinitiali
1900: 7a 65 64 20 62 79 20 72 65 66 65 72 65 6e 63 69  zed by referenci
1910: 6e 67 0a 2a 2a 20 74 68 65 20 70 57 43 2d 3e 61  ng.** the pWC->a
1920: 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a 73 74 61  [] array..*/.sta
1930: 74 69 63 20 69 6e 74 20 77 68 65 72 65 43 6c 61  tic int whereCla
1940: 75 73 65 49 6e 73 65 72 74 28 57 68 65 72 65 43  useInsert(WhereC
1950: 6c 61 75 73 65 20 2a 70 57 43 2c 20 45 78 70 72  lause *pWC, Expr
1960: 20 2a 70 2c 20 75 31 36 20 77 74 46 6c 61 67 73   *p, u16 wtFlags
1970: 29 7b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  ){.  WhereTerm *
1980: 70 54 65 72 6d 3b 0a 20 20 69 6e 74 20 69 64 78  pTerm;.  int idx
1990: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 77 74  ;.  testcase( wt
19a0: 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52  Flags & TERM_VIR
19b0: 54 55 41 4c 20 29 3b 0a 20 20 69 66 28 20 70 57  TUAL );.  if( pW
19c0: 43 2d 3e 6e 54 65 72 6d 3e 3d 70 57 43 2d 3e 6e  C->nTerm>=pWC->n
19d0: 53 6c 6f 74 20 29 7b 0a 20 20 20 20 57 68 65 72  Slot ){.    Wher
19e0: 65 54 65 72 6d 20 2a 70 4f 6c 64 20 3d 20 70 57  eTerm *pOld = pW
19f0: 43 2d 3e 61 3b 0a 20 20 20 20 73 71 6c 69 74 65  C->a;.    sqlite
1a00: 33 20 2a 64 62 20 3d 20 70 57 43 2d 3e 70 57 49  3 *db = pWC->pWI
1a10: 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b  nfo->pParse->db;
1a20: 0a 20 20 20 20 70 57 43 2d 3e 61 20 3d 20 73 71  .    pWC->a = sq
1a30: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
1a40: 28 64 62 2c 20 73 69 7a 65 6f 66 28 70 57 43 2d  (db, sizeof(pWC-
1a50: 3e 61 5b 30 5d 29 2a 70 57 43 2d 3e 6e 53 6c 6f  >a[0])*pWC->nSlo
1a60: 74 2a 32 20 29 3b 0a 20 20 20 20 69 66 28 20 70  t*2 );.    if( p
1a70: 57 43 2d 3e 61 3d 3d 30 20 29 7b 0a 20 20 20 20  WC->a==0 ){.    
1a80: 20 20 69 66 28 20 77 74 46 6c 61 67 73 20 26 20    if( wtFlags & 
1a90: 54 45 52 4d 5f 44 59 4e 41 4d 49 43 20 29 7b 0a  TERM_DYNAMIC ){.
1aa0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1ab0: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 29  xprDelete(db, p)
1ac0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1ad0: 70 57 43 2d 3e 61 20 3d 20 70 4f 6c 64 3b 0a 20  pWC->a = pOld;. 
1ae0: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
1af0: 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28     }.    memcpy(
1b00: 70 57 43 2d 3e 61 2c 20 70 4f 6c 64 2c 20 73 69  pWC->a, pOld, si
1b10: 7a 65 6f 66 28 70 57 43 2d 3e 61 5b 30 5d 29 2a  zeof(pWC->a[0])*
1b20: 70 57 43 2d 3e 6e 54 65 72 6d 29 3b 0a 20 20 20  pWC->nTerm);.   
1b30: 20 69 66 28 20 70 4f 6c 64 21 3d 70 57 43 2d 3e   if( pOld!=pWC->
1b40: 61 53 74 61 74 69 63 20 29 7b 0a 20 20 20 20 20  aStatic ){.     
1b50: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
1b60: 62 2c 20 70 4f 6c 64 29 3b 0a 20 20 20 20 7d 0a  b, pOld);.    }.
1b70: 20 20 20 20 70 57 43 2d 3e 6e 53 6c 6f 74 20 3d      pWC->nSlot =
1b80: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
1b90: 53 69 7a 65 28 64 62 2c 20 70 57 43 2d 3e 61 29  Size(db, pWC->a)
1ba0: 2f 73 69 7a 65 6f 66 28 70 57 43 2d 3e 61 5b 30  /sizeof(pWC->a[0
1bb0: 5d 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26  ]);.    memset(&
1bc0: 70 57 43 2d 3e 61 5b 70 57 43 2d 3e 6e 54 65 72  pWC->a[pWC->nTer
1bd0: 6d 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 57  m], 0, sizeof(pW
1be0: 43 2d 3e 61 5b 30 5d 29 2a 28 70 57 43 2d 3e 6e  C->a[0])*(pWC->n
1bf0: 53 6c 6f 74 2d 70 57 43 2d 3e 6e 54 65 72 6d 29  Slot-pWC->nTerm)
1c00: 29 3b 0a 20 20 7d 0a 20 20 70 54 65 72 6d 20 3d  );.  }.  pTerm =
1c10: 20 26 70 57 43 2d 3e 61 5b 69 64 78 20 3d 20 70   &pWC->a[idx = p
1c20: 57 43 2d 3e 6e 54 65 72 6d 2b 2b 5d 3b 0a 20 20  WC->nTerm++];.  
1c30: 69 66 28 20 70 20 26 26 20 45 78 70 72 48 61 73  if( p && ExprHas
1c40: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 55  Property(p, EP_U
1c50: 6e 6c 69 6b 65 6c 79 29 20 29 7b 0a 20 20 20 20  nlikely) ){.    
1c60: 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62  pTerm->truthProb
1c70: 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
1c80: 28 70 2d 3e 69 54 61 62 6c 65 29 20 2d 20 32 37  (p->iTable) - 27
1c90: 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
1ca0: 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62  pTerm->truthProb
1cb0: 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 70 54 65 72   = 1;.  }.  pTer
1cc0: 6d 2d 3e 70 45 78 70 72 20 3d 20 73 71 6c 69 74  m->pExpr = sqlit
1cd0: 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74  e3ExprSkipCollat
1ce0: 65 28 70 29 3b 0a 20 20 70 54 65 72 6d 2d 3e 77  e(p);.  pTerm->w
1cf0: 74 46 6c 61 67 73 20 3d 20 77 74 46 6c 61 67 73  tFlags = wtFlags
1d00: 3b 0a 20 20 70 54 65 72 6d 2d 3e 70 57 43 20 3d  ;.  pTerm->pWC =
1d10: 20 70 57 43 3b 0a 20 20 70 54 65 72 6d 2d 3e 69   pWC;.  pTerm->i
1d20: 50 61 72 65 6e 74 20 3d 20 2d 31 3b 0a 20 20 72  Parent = -1;.  r
1d30: 65 74 75 72 6e 20 69 64 78 3b 0a 7d 0a 0a 2f 2a  eturn idx;.}../*
1d40: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1d50: 20 69 64 65 6e 74 69 66 69 65 73 20 73 75 62 65   identifies sube
1d60: 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68  xpressions in th
1d70: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 77  e WHERE clause w
1d80: 68 65 72 65 0a 2a 2a 20 65 61 63 68 20 73 75 62  here.** each sub
1d90: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 73 65  expression is se
1da0: 70 61 72 61 74 65 64 20 62 79 20 74 68 65 20 41  parated by the A
1db0: 4e 44 20 6f 70 65 72 61 74 6f 72 20 6f 72 20 73  ND operator or s
1dc0: 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 6f 70 65  ome other.** ope
1dd0: 72 61 74 6f 72 20 73 70 65 63 69 66 69 65 64 20  rator specified 
1de0: 69 6e 20 74 68 65 20 6f 70 20 70 61 72 61 6d 65  in the op parame
1df0: 74 65 72 2e 20 20 54 68 65 20 57 68 65 72 65 43  ter.  The WhereC
1e00: 6c 61 75 73 65 20 73 74 72 75 63 74 75 72 65 0a  lause structure.
1e10: 2a 2a 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74  ** is filled wit
1e20: 68 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 73 75  h pointers to su
1e30: 62 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 20 46  bexpressions.  F
1e40: 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a  or example:.**.*
1e50: 2a 20 20 20 20 57 48 45 52 45 20 20 61 3d 3d 27  *    WHERE  a=='
1e60: 68 65 6c 6c 6f 27 20 41 4e 44 20 63 6f 61 6c 65  hello' AND coale
1e70: 73 63 65 28 62 2c 31 31 29 3c 31 30 20 41 4e 44  sce(b,11)<10 AND
1e80: 20 28 63 2b 31 32 21 3d 64 20 4f 52 20 63 3d 3d   (c+12!=d OR c==
1e90: 32 32 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  22).**          
1ea0: 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20   \________/     
1eb0: 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  \_______________
1ec0: 2f 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f  /     \_________
1ed0: 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 20 20 20 20 20  _______/.**     
1ee0: 20 20 20 20 20 20 20 73 6c 6f 74 5b 30 5d 20 20         slot[0]  
1ef0: 20 20 20 20 20 20 20 20 20 20 73 6c 6f 74 5b 31            slot[1
1f00: 5d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ]               
1f10: 73 6c 6f 74 5b 32 5d 0a 2a 2a 0a 2a 2a 20 54 68  slot[2].**.** Th
1f20: 65 20 6f 72 69 67 69 6e 61 6c 20 57 48 45 52 45  e original WHERE
1f30: 20 63 6c 61 75 73 65 20 69 6e 20 70 45 78 70 72   clause in pExpr
1f40: 20 69 73 20 75 6e 61 6c 74 65 72 65 64 2e 20 20   is unaltered.  
1f50: 41 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  All this routine
1f60: 0a 2a 2a 20 64 6f 65 73 20 69 73 20 6d 61 6b 65  .** does is make
1f70: 20 73 6c 6f 74 5b 5d 20 65 6e 74 72 69 65 73 20   slot[] entries 
1f80: 70 6f 69 6e 74 20 74 6f 20 73 75 62 73 74 72 75  point to substru
1f90: 63 74 75 72 65 20 77 69 74 68 69 6e 20 70 45 78  cture within pEx
1fa0: 70 72 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65  pr..**.** In the
1fb0: 20 70 72 65 76 69 6f 75 73 20 73 65 6e 74 65 6e   previous senten
1fc0: 63 65 20 61 6e 64 20 69 6e 20 74 68 65 20 64 69  ce and in the di
1fd0: 61 67 72 61 6d 2c 20 22 73 6c 6f 74 5b 5d 22 20  agram, "slot[]" 
1fe0: 72 65 66 65 72 73 20 74 6f 0a 2a 2a 20 74 68 65  refers to.** the
1ff0: 20 57 68 65 72 65 43 6c 61 75 73 65 2e 61 5b 5d   WhereClause.a[]
2000: 20 61 72 72 61 79 2e 20 20 54 68 65 20 73 6c 6f   array.  The slo
2010: 74 5b 5d 20 61 72 72 61 79 20 67 72 6f 77 73 20  t[] array grows 
2020: 61 73 20 6e 65 65 64 65 64 20 74 6f 20 63 6f 6e  as needed to con
2030: 74 61 69 6e 0a 2a 2a 20 61 6c 6c 20 74 65 72 6d  tain.** all term
2040: 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  s of the WHERE c
2050: 6c 61 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  lause..*/.static
2060: 20 76 6f 69 64 20 77 68 65 72 65 53 70 6c 69 74   void whereSplit
2070: 28 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57  (WhereClause *pW
2080: 43 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  C, Expr *pExpr, 
2090: 75 38 20 6f 70 29 7b 0a 20 20 70 57 43 2d 3e 6f  u8 op){.  pWC->o
20a0: 70 20 3d 20 6f 70 3b 0a 20 20 69 66 28 20 70 45  p = op;.  if( pE
20b0: 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  xpr==0 ) return;
20c0: 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  .  if( pExpr->op
20d0: 21 3d 6f 70 20 29 7b 0a 20 20 20 20 77 68 65 72  !=op ){.    wher
20e0: 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57  eClauseInsert(pW
20f0: 43 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20  C, pExpr, 0);.  
2100: 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 65 72 65  }else{.    where
2110: 53 70 6c 69 74 28 70 57 43 2c 20 70 45 78 70 72  Split(pWC, pExpr
2120: 2d 3e 70 4c 65 66 74 2c 20 6f 70 29 3b 0a 20 20  ->pLeft, op);.  
2130: 20 20 77 68 65 72 65 53 70 6c 69 74 28 70 57 43    whereSplit(pWC
2140: 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
2150: 20 6f 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   op);.  }.}../*.
2160: 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 20  ** Initialize a 
2170: 57 68 65 72 65 4d 61 73 6b 53 65 74 20 6f 62 6a  WhereMaskSet obj
2180: 65 63 74 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 69  ect.*/.#define i
2190: 6e 69 74 4d 61 73 6b 53 65 74 28 50 29 20 20 28  nitMaskSet(P)  (
21a0: 50 29 2d 3e 6e 3d 30 0a 0a 2f 2a 0a 2a 2a 20 52  P)->n=0../*.** R
21b0: 65 74 75 72 6e 20 74 68 65 20 62 69 74 6d 61 73  eturn the bitmas
21c0: 6b 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20  k for the given 
21d0: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 2e 20 20  cursor number.  
21e0: 52 65 74 75 72 6e 20 30 20 69 66 0a 2a 2a 20 69  Return 0 if.** i
21f0: 43 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 69 6e  Cursor is not in
2200: 20 74 68 65 20 73 65 74 2e 0a 2a 2f 0a 73 74 61   the set..*/.sta
2210: 74 69 63 20 42 69 74 6d 61 73 6b 20 67 65 74 4d  tic Bitmask getM
2220: 61 73 6b 28 57 68 65 72 65 4d 61 73 6b 53 65 74  ask(WhereMaskSet
2230: 20 2a 70 4d 61 73 6b 53 65 74 2c 20 69 6e 74 20   *pMaskSet, int 
2240: 69 43 75 72 73 6f 72 29 7b 0a 20 20 69 6e 74 20  iCursor){.  int 
2250: 69 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4d 61  i;.  assert( pMa
2260: 73 6b 53 65 74 2d 3e 6e 3c 3d 28 69 6e 74 29 73  skSet->n<=(int)s
2270: 69 7a 65 6f 66 28 42 69 74 6d 61 73 6b 29 2a 38  izeof(Bitmask)*8
2280: 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   );.  for(i=0; i
2290: 3c 70 4d 61 73 6b 53 65 74 2d 3e 6e 3b 20 69 2b  <pMaskSet->n; i+
22a0: 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 4d 61 73  +){.    if( pMas
22b0: 6b 53 65 74 2d 3e 69 78 5b 69 5d 3d 3d 69 43 75  kSet->ix[i]==iCu
22c0: 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 72 65  rsor ){.      re
22d0: 74 75 72 6e 20 4d 41 53 4b 42 49 54 28 69 29 3b  turn MASKBIT(i);
22e0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
22f0: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
2300: 43 72 65 61 74 65 20 61 20 6e 65 77 20 6d 61 73  Create a new mas
2310: 6b 20 66 6f 72 20 63 75 72 73 6f 72 20 69 43 75  k for cursor iCu
2320: 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72  rsor..**.** Ther
2330: 65 20 69 73 20 6f 6e 65 20 63 75 72 73 6f 72 20  e is one cursor 
2340: 70 65 72 20 74 61 62 6c 65 20 69 6e 20 74 68 65  per table in the
2350: 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 54   FROM clause.  T
2360: 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  he number of.** 
2370: 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52  tables in the FR
2380: 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 6c 69 6d  OM clause is lim
2390: 69 74 65 64 20 62 79 20 61 20 74 65 73 74 20 65  ited by a test e
23a0: 61 72 6c 79 20 69 6e 20 74 68 65 0a 2a 2a 20 73  arly in the.** s
23b0: 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
23c0: 28 29 20 72 6f 75 74 69 6e 65 2e 20 20 53 6f 20  () routine.  So 
23d0: 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65  we know that the
23e0: 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 5d 0a   pMaskSet->ix[].
23f0: 2a 2a 20 61 72 72 61 79 20 77 69 6c 6c 20 6e 65  ** array will ne
2400: 76 65 72 20 6f 76 65 72 66 6c 6f 77 2e 0a 2a 2f  ver overflow..*/
2410: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 72 65  .static void cre
2420: 61 74 65 4d 61 73 6b 28 57 68 65 72 65 4d 61 73  ateMask(WhereMas
2430: 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20  kSet *pMaskSet, 
2440: 69 6e 74 20 69 43 75 72 73 6f 72 29 7b 0a 20 20  int iCursor){.  
2450: 61 73 73 65 72 74 28 20 70 4d 61 73 6b 53 65 74  assert( pMaskSet
2460: 2d 3e 6e 20 3c 20 41 72 72 61 79 53 69 7a 65 28  ->n < ArraySize(
2470: 70 4d 61 73 6b 53 65 74 2d 3e 69 78 29 20 29 3b  pMaskSet->ix) );
2480: 0a 20 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b  .  pMaskSet->ix[
2490: 70 4d 61 73 6b 53 65 74 2d 3e 6e 2b 2b 5d 20 3d  pMaskSet->n++] =
24a0: 20 69 43 75 72 73 6f 72 3b 0a 7d 0a 0a 2f 2a 0a   iCursor;.}../*.
24b0: 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65  ** These routine
24c0: 73 20 77 61 6c 6b 20 28 72 65 63 75 72 73 69 76  s walk (recursiv
24d0: 65 6c 79 29 20 61 6e 20 65 78 70 72 65 73 73 69  ely) an expressi
24e0: 6f 6e 20 74 72 65 65 20 61 6e 64 20 67 65 6e 65  on tree and gene
24f0: 72 61 74 65 0a 2a 2a 20 61 20 62 69 74 6d 61 73  rate.** a bitmas
2500: 6b 20 69 6e 64 69 63 61 74 69 6e 67 20 77 68 69  k indicating whi
2510: 63 68 20 74 61 62 6c 65 73 20 61 72 65 20 75 73  ch tables are us
2520: 65 64 20 69 6e 20 74 68 61 74 20 65 78 70 72 65  ed in that expre
2530: 73 73 69 6f 6e 0a 2a 2a 20 74 72 65 65 2e 0a 2a  ssion.** tree..*
2540: 2f 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b  /.static Bitmask
2550: 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73   exprListTableUs
2560: 61 67 65 28 57 68 65 72 65 4d 61 73 6b 53 65 74  age(WhereMaskSet
2570: 2a 2c 20 45 78 70 72 4c 69 73 74 2a 29 3b 0a 73  *, ExprList*);.s
2580: 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20 65 78  tatic Bitmask ex
2590: 70 72 53 65 6c 65 63 74 54 61 62 6c 65 55 73 61  prSelectTableUsa
25a0: 67 65 28 57 68 65 72 65 4d 61 73 6b 53 65 74 2a  ge(WhereMaskSet*
25b0: 2c 20 53 65 6c 65 63 74 2a 29 3b 0a 73 74 61 74  , Select*);.stat
25c0: 69 63 20 42 69 74 6d 61 73 6b 20 65 78 70 72 54  ic Bitmask exprT
25d0: 61 62 6c 65 55 73 61 67 65 28 57 68 65 72 65 4d  ableUsage(WhereM
25e0: 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74  askSet *pMaskSet
25f0: 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 42 69  , Expr *p){.  Bi
2600: 74 6d 61 73 6b 20 6d 61 73 6b 20 3d 20 30 3b 0a  tmask mask = 0;.
2610: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
2620: 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e  urn 0;.  if( p->
2630: 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b  op==TK_COLUMN ){
2640: 0a 20 20 20 20 6d 61 73 6b 20 3d 20 67 65 74 4d  .    mask = getM
2650: 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d  ask(pMaskSet, p-
2660: 3e 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 72 65  >iTable);.    re
2670: 74 75 72 6e 20 6d 61 73 6b 3b 0a 20 20 7d 0a 20  turn mask;.  }. 
2680: 20 6d 61 73 6b 20 3d 20 65 78 70 72 54 61 62 6c   mask = exprTabl
2690: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
26a0: 20 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 6d   p->pRight);.  m
26b0: 61 73 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c 65  ask |= exprTable
26c0: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
26d0: 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66 28  p->pLeft);.  if(
26e0: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
26f0: 28 70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  (p, EP_xIsSelect
2700: 29 20 29 7b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d  ) ){.    mask |=
2710: 20 65 78 70 72 53 65 6c 65 63 74 54 61 62 6c 65   exprSelectTable
2720: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
2730: 70 2d 3e 78 2e 70 53 65 6c 65 63 74 29 3b 0a 20  p->x.pSelect);. 
2740: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 61 73 6b   }else{.    mask
2750: 20 7c 3d 20 65 78 70 72 4c 69 73 74 54 61 62 6c   |= exprListTabl
2760: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
2770: 20 70 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20   p->x.pList);.  
2780: 7d 0a 20 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b  }.  return mask;
2790: 0a 7d 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73  .}.static Bitmas
27a0: 6b 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55  k exprListTableU
27b0: 73 61 67 65 28 57 68 65 72 65 4d 61 73 6b 53 65  sage(WhereMaskSe
27c0: 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 45 78 70  t *pMaskSet, Exp
27d0: 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20  rList *pList){. 
27e0: 20 69 6e 74 20 69 3b 0a 20 20 42 69 74 6d 61 73   int i;.  Bitmas
27f0: 6b 20 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 69 66  k mask = 0;.  if
2800: 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 66  ( pList ){.    f
2810: 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  or(i=0; i<pList-
2820: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
2830: 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72      mask |= expr
2840: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
2850: 53 65 74 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d  Set, pList->a[i]
2860: 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20  .pExpr);.    }. 
2870: 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d 61 73 6b   }.  return mask
2880: 3b 0a 7d 0a 73 74 61 74 69 63 20 42 69 74 6d 61  ;.}.static Bitma
2890: 73 6b 20 65 78 70 72 53 65 6c 65 63 74 54 61 62  sk exprSelectTab
28a0: 6c 65 55 73 61 67 65 28 57 68 65 72 65 4d 61 73  leUsage(WhereMas
28b0: 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20  kSet *pMaskSet, 
28c0: 53 65 6c 65 63 74 20 2a 70 53 29 7b 0a 20 20 42  Select *pS){.  B
28d0: 69 74 6d 61 73 6b 20 6d 61 73 6b 20 3d 20 30 3b  itmask mask = 0;
28e0: 0a 20 20 77 68 69 6c 65 28 20 70 53 20 29 7b 0a  .  while( pS ){.
28f0: 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72      SrcList *pSr
2900: 63 20 3d 20 70 53 2d 3e 70 53 72 63 3b 0a 20 20  c = pS->pSrc;.  
2910: 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69    mask |= exprLi
2920: 73 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  stTableUsage(pMa
2930: 73 6b 53 65 74 2c 20 70 53 2d 3e 70 45 4c 69 73  skSet, pS->pELis
2940: 74 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20  t);.    mask |= 
2950: 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61  exprListTableUsa
2960: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d  ge(pMaskSet, pS-
2970: 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20  >pGroupBy);.    
2980: 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69 73 74  mask |= exprList
2990: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
29a0: 53 65 74 2c 20 70 53 2d 3e 70 4f 72 64 65 72 42  Set, pS->pOrderB
29b0: 79 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20  y);.    mask |= 
29c0: 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70  exprTableUsage(p
29d0: 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70 57 68  MaskSet, pS->pWh
29e0: 65 72 65 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c  ere);.    mask |
29f0: 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65  = exprTableUsage
2a00: 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70  (pMaskSet, pS->p
2a10: 48 61 76 69 6e 67 29 3b 0a 20 20 20 20 69 66 28  Having);.    if(
2a20: 20 41 4c 57 41 59 53 28 70 53 72 63 21 3d 30 29   ALWAYS(pSrc!=0)
2a30: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   ){.      int i;
2a40: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
2a50: 69 3c 70 53 72 63 2d 3e 6e 53 72 63 3b 20 69 2b  i<pSrc->nSrc; i+
2a60: 2b 29 7b 0a 20 20 20 20 20 20 20 20 6d 61 73 6b  +){.        mask
2a70: 20 7c 3d 20 65 78 70 72 53 65 6c 65 63 74 54 61   |= exprSelectTa
2a80: 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65  bleUsage(pMaskSe
2a90: 74 2c 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 53  t, pSrc->a[i].pS
2aa0: 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20  elect);.        
2ab0: 6d 61 73 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c  mask |= exprTabl
2ac0: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
2ad0: 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 4f 6e 29   pSrc->a[i].pOn)
2ae0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2af0: 20 20 20 20 70 53 20 3d 20 70 53 2d 3e 70 50 72      pS = pS->pPr
2b00: 69 6f 72 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ior;.  }.  retur
2b10: 6e 20 6d 61 73 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n mask;.}../*.**
2b20: 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
2b30: 74 68 65 20 67 69 76 65 6e 20 6f 70 65 72 61 74  the given operat
2b40: 6f 72 20 69 73 20 6f 6e 65 20 6f 66 20 74 68 65  or is one of the
2b50: 20 6f 70 65 72 61 74 6f 72 73 20 74 68 61 74 20   operators that 
2b60: 69 73 0a 2a 2a 20 61 6c 6c 6f 77 65 64 20 66 6f  is.** allowed fo
2b70: 72 20 61 6e 20 69 6e 64 65 78 61 62 6c 65 20 57  r an indexable W
2b80: 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d  HERE clause term
2b90: 2e 20 20 54 68 65 20 61 6c 6c 6f 77 65 64 20 6f  .  The allowed o
2ba0: 70 65 72 61 74 6f 72 73 20 61 72 65 0a 2a 2a 20  perators are.** 
2bb0: 22 3d 22 2c 20 22 3c 22 2c 20 22 3e 22 2c 20 22  "=", "<", ">", "
2bc0: 3c 3d 22 2c 20 22 3e 3d 22 2c 20 22 49 4e 22 2c  <=", ">=", "IN",
2bd0: 20 61 6e 64 20 22 49 53 20 4e 55 4c 4c 22 0a 2a   and "IS NULL".*
2be0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c  /.static int all
2bf0: 6f 77 65 64 4f 70 28 69 6e 74 20 6f 70 29 7b 0a  owedOp(int op){.
2c00: 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 54 3e    assert( TK_GT>
2c10: 54 4b 5f 45 51 20 26 26 20 54 4b 5f 47 54 3c 54  TK_EQ && TK_GT<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 4c 54 3e 54 4b 5f 45 51 20 26 26  ( TK_LT>TK_EQ &&
2c40: 20 54 4b 5f 4c 54 3c 54 4b 5f 47 45 20 29 3b 0a   TK_LT<TK_GE );.
2c50: 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 45 3e    assert( TK_LE>
2c60: 54 4b 5f 45 51 20 26 26 20 54 4b 5f 4c 45 3c 54  TK_EQ && TK_LE<T
2c70: 4b 5f 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74  K_GE );.  assert
2c80: 28 20 54 4b 5f 47 45 3d 3d 54 4b 5f 45 51 2b 34  ( TK_GE==TK_EQ+4
2c90: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 6f 70 3d   );.  return op=
2ca0: 3d 54 4b 5f 49 4e 20 7c 7c 20 28 6f 70 3e 3d 54  =TK_IN || (op>=T
2cb0: 4b 5f 45 51 20 26 26 20 6f 70 3c 3d 54 4b 5f 47  K_EQ && op<=TK_G
2cc0: 45 29 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 53 4e  E) || op==TK_ISN
2cd0: 55 4c 4c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  ULL;.}../*.** Co
2ce0: 6d 6d 75 74 65 20 61 20 63 6f 6d 70 61 72 69 73  mmute a comparis
2cf0: 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 20 20 45 78  on operator.  Ex
2d00: 70 72 65 73 73 69 6f 6e 73 20 6f 66 20 74 68 65  pressions of the
2d10: 20 66 6f 72 6d 20 22 58 20 6f 70 20 59 22 0a 2a   form "X op Y".*
2d20: 2a 20 61 72 65 20 63 6f 6e 76 65 72 74 65 64 20  * are converted 
2d30: 69 6e 74 6f 20 22 59 20 6f 70 20 58 22 2e 0a 2a  into "Y op X"..*
2d40: 2a 0a 2a 2a 20 49 66 20 6c 65 66 74 2f 72 69 67  *.** If left/rig
2d50: 68 74 20 70 72 65 63 65 64 65 6e 63 65 20 72 75  ht precedence ru
2d60: 6c 65 73 20 63 6f 6d 65 20 69 6e 74 6f 20 70 6c  les come into pl
2d70: 61 79 20 77 68 65 6e 20 64 65 74 65 72 6d 69 6e  ay when determin
2d80: 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 6c 6c 61  ing the.** colla
2d90: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2c 20 74  ting sequence, t
2da0: 68 65 6e 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72  hen COLLATE oper
2db0: 61 74 6f 72 73 20 61 72 65 20 61 64 6a 75 73 74  ators are adjust
2dc0: 65 64 20 74 6f 20 65 6e 73 75 72 65 0a 2a 2a 20  ed to ensure.** 
2dd0: 74 68 61 74 20 74 68 65 20 63 6f 6c 6c 61 74 69  that the collati
2de0: 6e 67 20 73 65 71 75 65 6e 63 65 20 64 6f 65 73  ng sequence does
2df0: 20 6e 6f 74 20 63 68 61 6e 67 65 2e 20 20 46 6f   not change.  Fo
2e00: 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 20 22 59  r example:.** "Y
2e10: 20 63 6f 6c 6c 61 74 65 20 4e 4f 43 41 53 45 20   collate NOCASE 
2e20: 6f 70 20 58 22 20 62 65 63 6f 6d 65 73 20 22 58  op X" becomes "X
2e30: 20 6f 70 20 59 22 20 62 65 63 61 75 73 65 20 61   op Y" because a
2e40: 6e 79 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  ny collation seq
2e50: 75 65 6e 63 65 20 6f 6e 0a 2a 2a 20 74 68 65 20  uence on.** the 
2e60: 6c 65 66 74 20 68 61 6e 64 20 73 69 64 65 20 6f  left hand side o
2e70: 66 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f  f a comparison o
2e80: 76 65 72 72 69 64 65 73 20 61 6e 79 20 63 6f 6c  verrides any col
2e90: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
2ea0: 0a 2a 2a 20 61 74 74 61 63 68 65 64 20 74 6f 20  .** attached to 
2eb0: 74 68 65 20 72 69 67 68 74 2e 20 46 6f 72 20 74  the right. For t
2ec0: 68 65 20 73 61 6d 65 20 72 65 61 73 6f 6e 20 74  he same reason t
2ed0: 68 65 20 45 50 5f 43 6f 6c 6c 61 74 65 20 66 6c  he EP_Collate fl
2ee0: 61 67 0a 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6d  ag.** is not com
2ef0: 6d 75 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  muted..*/.static
2f00: 20 76 6f 69 64 20 65 78 70 72 43 6f 6d 6d 75 74   void exprCommut
2f10: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
2f20: 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20   Expr *pExpr){. 
2f30: 20 75 31 36 20 65 78 70 52 69 67 68 74 20 3d 20   u16 expRight = 
2f40: 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2d 3e  (pExpr->pRight->
2f50: 66 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61  flags & EP_Colla
2f60: 74 65 29 3b 0a 20 20 75 31 36 20 65 78 70 4c 65  te);.  u16 expLe
2f70: 66 74 20 3d 20 28 70 45 78 70 72 2d 3e 70 4c 65  ft = (pExpr->pLe
2f80: 66 74 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 43  ft->flags & EP_C
2f90: 6f 6c 6c 61 74 65 29 3b 0a 20 20 61 73 73 65 72  ollate);.  asser
2fa0: 74 28 20 61 6c 6c 6f 77 65 64 4f 70 28 70 45 78  t( allowedOp(pEx
2fb0: 70 72 2d 3e 6f 70 29 20 26 26 20 70 45 78 70 72  pr->op) && pExpr
2fc0: 2d 3e 6f 70 21 3d 54 4b 5f 49 4e 20 29 3b 0a 20  ->op!=TK_IN );. 
2fd0: 20 69 66 28 20 65 78 70 52 69 67 68 74 3d 3d 65   if( expRight==e
2fe0: 78 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 2f 2a  xpLeft ){.    /*
2ff0: 20 45 69 74 68 65 72 20 58 20 61 6e 64 20 59 20   Either X and Y 
3000: 62 6f 74 68 20 68 61 76 65 20 43 4f 4c 4c 41 54  both have COLLAT
3010: 45 20 6f 70 65 72 61 74 6f 72 20 6f 72 20 6e 65  E operator or ne
3020: 69 74 68 65 72 20 64 6f 20 2a 2f 0a 20 20 20 20  ither do */.    
3030: 69 66 28 20 65 78 70 52 69 67 68 74 20 29 7b 0a  if( expRight ){.
3040: 20 20 20 20 20 20 2f 2a 20 42 6f 74 68 20 58 20        /* Both X 
3050: 61 6e 64 20 59 20 68 61 76 65 20 43 4f 4c 4c 41  and Y have COLLA
3060: 54 45 20 6f 70 65 72 61 74 6f 72 73 2e 20 20 4d  TE operators.  M
3070: 61 6b 65 20 73 75 72 65 20 58 20 69 73 20 61 6c  ake sure X is al
3080: 77 61 79 73 0a 20 20 20 20 20 20 2a 2a 20 75 73  ways.      ** us
3090: 65 64 20 62 79 20 63 6c 65 61 72 69 6e 67 20 74  ed by clearing t
30a0: 68 65 20 45 50 5f 43 6f 6c 6c 61 74 65 20 66 6c  he EP_Collate fl
30b0: 61 67 20 66 72 6f 6d 20 59 2e 20 2a 2f 0a 20 20  ag from Y. */.  
30c0: 20 20 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68      pExpr->pRigh
30d0: 74 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 45 50 5f  t->flags &= ~EP_
30e0: 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 7d 65 6c  Collate;.    }el
30f0: 73 65 20 69 66 28 20 73 71 6c 69 74 65 33 45 78  se if( sqlite3Ex
3100: 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
3110: 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 21  , pExpr->pLeft)!
3120: 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4e  =0 ){.      /* N
3130: 65 69 74 68 65 72 20 58 20 6e 6f 72 20 59 20 68  either X nor Y h
3140: 61 76 65 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72  ave COLLATE oper
3150: 61 74 6f 72 73 2c 20 62 75 74 20 58 20 68 61 73  ators, but X has
3160: 20 61 20 6e 6f 6e 2d 64 65 66 61 75 6c 74 0a 20   a non-default. 
3170: 20 20 20 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6e       ** collatin
3180: 67 20 73 65 71 75 65 6e 63 65 2e 20 20 53 6f 20  g sequence.  So 
3190: 61 64 64 20 74 68 65 20 45 50 5f 43 6f 6c 6c 61  add the EP_Colla
31a0: 74 65 20 6d 61 72 6b 65 72 20 6f 6e 20 58 20 74  te marker on X t
31b0: 6f 20 63 61 75 73 65 0a 20 20 20 20 20 20 2a 2a  o cause.      **
31c0: 20 69 74 20 74 6f 20 62 65 20 73 65 61 72 63 68   it to be search
31d0: 65 64 20 66 69 72 73 74 2e 20 2a 2f 0a 20 20 20  ed first. */.   
31e0: 20 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d     pExpr->pLeft-
31f0: 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 43 6f 6c  >flags |= EP_Col
3200: 6c 61 74 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  late;.    }.  }.
3210: 20 20 53 57 41 50 28 45 78 70 72 2a 2c 70 45 78    SWAP(Expr*,pEx
3220: 70 72 2d 3e 70 52 69 67 68 74 2c 70 45 78 70 72  pr->pRight,pExpr
3230: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66 28 20  ->pLeft);.  if( 
3240: 70 45 78 70 72 2d 3e 6f 70 3e 3d 54 4b 5f 47 54  pExpr->op>=TK_GT
3250: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
3260: 54 4b 5f 4c 54 3d 3d 54 4b 5f 47 54 2b 32 20 29  TK_LT==TK_GT+2 )
3270: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 54 4b  ;.    assert( TK
3280: 5f 47 45 3d 3d 54 4b 5f 4c 45 2b 32 20 29 3b 0a  _GE==TK_LE+2 );.
3290: 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47      assert( TK_G
32a0: 54 3e 54 4b 5f 45 51 20 29 3b 0a 20 20 20 20 61  T>TK_EQ );.    a
32b0: 73 73 65 72 74 28 20 54 4b 5f 47 54 3c 54 4b 5f  ssert( TK_GT<TK_
32c0: 4c 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  LE );.    assert
32d0: 28 20 70 45 78 70 72 2d 3e 6f 70 3e 3d 54 4b 5f  ( pExpr->op>=TK_
32e0: 47 54 20 26 26 20 70 45 78 70 72 2d 3e 6f 70 3c  GT && pExpr->op<
32f0: 3d 54 4b 5f 47 45 20 29 3b 0a 20 20 20 20 70 45  =TK_GE );.    pE
3300: 78 70 72 2d 3e 6f 70 20 3d 20 28 28 70 45 78 70  xpr->op = ((pExp
3310: 72 2d 3e 6f 70 2d 54 4b 5f 47 54 29 5e 32 29 2b  r->op-TK_GT)^2)+
3320: 54 4b 5f 47 54 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  TK_GT;.  }.}../*
3330: 0a 2a 2a 20 54 72 61 6e 73 6c 61 74 65 20 66 72  .** Translate fr
3340: 6f 6d 20 54 4b 5f 78 78 20 6f 70 65 72 61 74 6f  om TK_xx operato
3350: 72 20 74 6f 20 57 4f 5f 78 78 20 62 69 74 6d 61  r to WO_xx bitma
3360: 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 31  sk..*/.static u1
3370: 36 20 6f 70 65 72 61 74 6f 72 4d 61 73 6b 28 69  6 operatorMask(i
3380: 6e 74 20 6f 70 29 7b 0a 20 20 75 31 36 20 63 3b  nt op){.  u16 c;
3390: 0a 20 20 61 73 73 65 72 74 28 20 61 6c 6c 6f 77  .  assert( allow
33a0: 65 64 4f 70 28 6f 70 29 20 29 3b 0a 20 20 69 66  edOp(op) );.  if
33b0: 28 20 6f 70 3d 3d 54 4b 5f 49 4e 20 29 7b 0a 20  ( op==TK_IN ){. 
33c0: 20 20 20 63 20 3d 20 57 4f 5f 49 4e 3b 0a 20 20     c = WO_IN;.  
33d0: 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b  }else if( op==TK
33e0: 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 63  _ISNULL ){.    c
33f0: 20 3d 20 57 4f 5f 49 53 4e 55 4c 4c 3b 0a 20 20   = WO_ISNULL;.  
3400: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
3410: 74 28 20 28 57 4f 5f 45 51 3c 3c 28 6f 70 2d 54  t( (WO_EQ<<(op-T
3420: 4b 5f 45 51 29 29 20 3c 20 30 78 37 66 66 66 20  K_EQ)) < 0x7fff 
3430: 29 3b 0a 20 20 20 20 63 20 3d 20 28 75 31 36 29  );.    c = (u16)
3440: 28 57 4f 5f 45 51 3c 3c 28 6f 70 2d 54 4b 5f 45  (WO_EQ<<(op-TK_E
3450: 51 29 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  Q));.  }.  asser
3460: 74 28 20 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c  t( op!=TK_ISNULL
3470: 20 7c 7c 20 63 3d 3d 57 4f 5f 49 53 4e 55 4c 4c   || c==WO_ISNULL
3480: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70   );.  assert( op
3490: 21 3d 54 4b 5f 49 4e 20 7c 7c 20 63 3d 3d 57 4f  !=TK_IN || c==WO
34a0: 5f 49 4e 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _IN );.  assert(
34b0: 20 6f 70 21 3d 54 4b 5f 45 51 20 7c 7c 20 63 3d   op!=TK_EQ || c=
34c0: 3d 57 4f 5f 45 51 20 29 3b 0a 20 20 61 73 73 65  =WO_EQ );.  asse
34d0: 72 74 28 20 6f 70 21 3d 54 4b 5f 4c 54 20 7c 7c  rt( op!=TK_LT ||
34e0: 20 63 3d 3d 57 4f 5f 4c 54 20 29 3b 0a 20 20 61   c==WO_LT );.  a
34f0: 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 4c 45  ssert( op!=TK_LE
3500: 20 7c 7c 20 63 3d 3d 57 4f 5f 4c 45 20 29 3b 0a   || c==WO_LE );.
3510: 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b    assert( op!=TK
3520: 5f 47 54 20 7c 7c 20 63 3d 3d 57 4f 5f 47 54 20  _GT || c==WO_GT 
3530: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21  );.  assert( op!
3540: 3d 54 4b 5f 47 45 20 7c 7c 20 63 3d 3d 57 4f 5f  =TK_GE || c==WO_
3550: 47 45 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 63  GE );.  return c
3560: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e  ;.}../*.** Advan
3570: 63 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20 57  ce to the next W
3580: 68 65 72 65 54 65 72 6d 20 74 68 61 74 20 6d 61  hereTerm that ma
3590: 74 63 68 65 73 20 61 63 63 6f 72 64 69 6e 67 20  tches according 
35a0: 74 6f 20 74 68 65 20 63 72 69 74 65 72 69 61 0a  to the criteria.
35b0: 2a 2a 20 65 73 74 61 62 6c 69 73 68 65 64 20 77  ** established w
35c0: 68 65 6e 20 74 68 65 20 70 53 63 61 6e 20 6f 62  hen the pScan ob
35d0: 6a 65 63 74 20 77 61 73 20 69 6e 69 74 69 61 6c  ject was initial
35e0: 69 7a 65 64 20 62 79 20 77 68 65 72 65 53 63 61  ized by whereSca
35f0: 6e 49 6e 69 74 28 29 2e 0a 2a 2a 20 52 65 74 75  nInit()..** Retu
3600: 72 6e 20 4e 55 4c 4c 20 69 66 20 74 68 65 72 65  rn NULL if there
3610: 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20 6d 61 74   are no more mat
3620: 63 68 69 6e 67 20 57 68 65 72 65 54 65 72 6d 73  ching WhereTerms
3630: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 57 68 65 72  ..*/.static Wher
3640: 65 54 65 72 6d 20 2a 77 68 65 72 65 53 63 61 6e  eTerm *whereScan
3650: 4e 65 78 74 28 57 68 65 72 65 53 63 61 6e 20 2a  Next(WhereScan *
3660: 70 53 63 61 6e 29 7b 0a 20 20 69 6e 74 20 69 43  pScan){.  int iC
3670: 75 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ur;            /
3680: 2a 20 54 68 65 20 63 75 72 73 6f 72 20 6f 6e 20  * The cursor on 
3690: 74 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20 74  the LHS of the t
36a0: 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f  erm */.  int iCo
36b0: 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a  lumn;         /*
36c0: 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6f 6e 20 74   The column on t
36d0: 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20 74 65  he LHS of the te
36e0: 72 6d 2e 20 20 2d 31 20 66 6f 72 20 49 50 4b 20  rm.  -1 for IPK 
36f0: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 58 3b 20 20  */.  Expr *pX;  
3700: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20            /* An 
3710: 65 78 70 72 65 73 73 69 6f 6e 20 62 65 69 6e 67  expression being
3720: 20 74 65 73 74 65 64 20 2a 2f 0a 20 20 57 68 65   tested */.  Whe
3730: 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 20 20  reClause *pWC;  
3740: 20 20 2f 2a 20 53 68 6f 72 74 68 61 6e 64 20 66    /* Shorthand f
3750: 6f 72 20 70 53 63 61 6e 2d 3e 70 57 43 20 2a 2f  or pScan->pWC */
3760: 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
3770: 65 72 6d 3b 20 20 20 20 2f 2a 20 54 68 65 20 74  erm;    /* The t
3780: 65 72 6d 20 62 65 69 6e 67 20 74 65 73 74 65 64  erm being tested
3790: 20 2a 2f 0a 20 20 69 6e 74 20 6b 20 3d 20 70 53   */.  int k = pS
37a0: 63 61 6e 2d 3e 6b 3b 20 20 20 20 2f 2a 20 57 68  can->k;    /* Wh
37b0: 65 72 65 20 74 6f 20 73 74 61 72 74 20 73 63 61  ere to start sca
37c0: 6e 6e 69 6e 67 20 2a 2f 0a 0a 20 20 77 68 69 6c  nning */..  whil
37d0: 65 28 20 70 53 63 61 6e 2d 3e 69 45 71 75 69 76  e( pScan->iEquiv
37e0: 3c 3d 70 53 63 61 6e 2d 3e 6e 45 71 75 69 76 20  <=pScan->nEquiv 
37f0: 29 7b 0a 20 20 20 20 69 43 75 72 20 3d 20 70 53  ){.    iCur = pS
3800: 63 61 6e 2d 3e 61 45 71 75 69 76 5b 70 53 63 61  can->aEquiv[pSca
3810: 6e 2d 3e 69 45 71 75 69 76 2d 32 5d 3b 0a 20 20  n->iEquiv-2];.  
3820: 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 70 53 63 61    iColumn = pSca
3830: 6e 2d 3e 61 45 71 75 69 76 5b 70 53 63 61 6e 2d  n->aEquiv[pScan-
3840: 3e 69 45 71 75 69 76 2d 31 5d 3b 0a 20 20 20 20  >iEquiv-1];.    
3850: 77 68 69 6c 65 28 20 28 70 57 43 20 3d 20 70 53  while( (pWC = pS
3860: 63 61 6e 2d 3e 70 57 43 29 21 3d 30 20 29 7b 0a  can->pWC)!=0 ){.
3870: 20 20 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d        for(pTerm=
3880: 70 57 43 2d 3e 61 2b 6b 3b 20 6b 3c 70 57 43 2d  pWC->a+k; k<pWC-
3890: 3e 6e 54 65 72 6d 3b 20 6b 2b 2b 2c 20 70 54 65  >nTerm; k++, pTe
38a0: 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69  rm++){.        i
38b0: 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75  f( pTerm->leftCu
38c0: 72 73 6f 72 3d 3d 69 43 75 72 0a 20 20 20 20 20  rsor==iCur.     
38d0: 20 20 20 20 26 26 20 70 54 65 72 6d 2d 3e 75 2e      && pTerm->u.
38e0: 6c 65 66 74 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c  leftColumn==iCol
38f0: 75 6d 6e 0a 20 20 20 20 20 20 20 20 20 26 26 20  umn.         && 
3900: 28 70 53 63 61 6e 2d 3e 69 45 71 75 69 76 3c 3d  (pScan->iEquiv<=
3910: 32 20 7c 7c 20 21 45 78 70 72 48 61 73 50 72 6f  2 || !ExprHasPro
3920: 70 65 72 74 79 28 70 54 65 72 6d 2d 3e 70 45 78  perty(pTerm->pEx
3930: 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  pr, EP_FromJoin)
3940: 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20  ).        ){.   
3950: 20 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72         if( (pTer
3960: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
3970: 4f 5f 45 51 55 49 56 29 21 3d 30 0a 20 20 20 20  O_EQUIV)!=0.    
3980: 20 20 20 20 20 20 20 26 26 20 70 53 63 61 6e 2d         && pScan-
3990: 3e 6e 45 71 75 69 76 3c 41 72 72 61 79 53 69 7a  >nEquiv<ArraySiz
39a0: 65 28 70 53 63 61 6e 2d 3e 61 45 71 75 69 76 29  e(pScan->aEquiv)
39b0: 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20  .          ){.  
39c0: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b            int j;
39d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 58 20  .            pX 
39e0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69  = sqlite3ExprSki
39f0: 70 43 6f 6c 6c 61 74 65 28 70 54 65 72 6d 2d 3e  pCollate(pTerm->
3a00: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a  pExpr->pRight);.
3a10: 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
3a20: 72 74 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 43  rt( pX->op==TK_C
3a30: 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 20  OLUMN );.       
3a40: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
3a50: 70 53 63 61 6e 2d 3e 6e 45 71 75 69 76 3b 20 6a  pScan->nEquiv; j
3a60: 2b 3d 32 29 7b 0a 20 20 20 20 20 20 20 20 20 20  +=2){.          
3a70: 20 20 20 20 69 66 28 20 70 53 63 61 6e 2d 3e 61      if( pScan->a
3a80: 45 71 75 69 76 5b 6a 5d 3d 3d 70 58 2d 3e 69 54  Equiv[j]==pX->iT
3a90: 61 62 6c 65 0a 20 20 20 20 20 20 20 20 20 20 20  able.           
3aa0: 20 20 20 20 26 26 20 70 53 63 61 6e 2d 3e 61 45      && pScan->aE
3ab0: 71 75 69 76 5b 6a 2b 31 5d 3d 3d 70 58 2d 3e 69  quiv[j+1]==pX->i
3ac0: 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20  Column ){.      
3ad0: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
3ae0: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  k;.             
3af0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d   }.            }
3b00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
3b10: 20 6a 3d 3d 70 53 63 61 6e 2d 3e 6e 45 71 75 69   j==pScan->nEqui
3b20: 76 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  v ){.           
3b30: 20 20 20 70 53 63 61 6e 2d 3e 61 45 71 75 69 76     pScan->aEquiv
3b40: 5b 6a 5d 20 3d 20 70 58 2d 3e 69 54 61 62 6c 65  [j] = pX->iTable
3b50: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
3b60: 70 53 63 61 6e 2d 3e 61 45 71 75 69 76 5b 6a 2b  pScan->aEquiv[j+
3b70: 31 5d 20 3d 20 70 58 2d 3e 69 43 6f 6c 75 6d 6e  1] = pX->iColumn
3b80: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
3b90: 70 53 63 61 6e 2d 3e 6e 45 71 75 69 76 20 2b 3d  pScan->nEquiv +=
3ba0: 20 32 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   2;.            
3bb0: 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
3bc0: 20 20 20 20 20 20 20 20 69 66 28 20 28 70 54 65          if( (pTe
3bd0: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
3be0: 70 53 63 61 6e 2d 3e 6f 70 4d 61 73 6b 29 21 3d  pScan->opMask)!=
3bf0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
3c00: 20 2f 2a 20 56 65 72 69 66 79 20 74 68 65 20 61   /* Verify the a
3c10: 66 66 69 6e 69 74 79 20 61 6e 64 20 63 6f 6c 6c  ffinity and coll
3c20: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 6d  ating sequence m
3c30: 61 74 63 68 20 2a 2f 0a 20 20 20 20 20 20 20 20  atch */.        
3c40: 20 20 20 20 69 66 28 20 70 53 63 61 6e 2d 3e 7a      if( pScan->z
3c50: 43 6f 6c 6c 4e 61 6d 65 20 26 26 20 28 70 54 65  CollName && (pTe
3c60: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
3c70: 57 4f 5f 49 53 4e 55 4c 4c 29 3d 3d 30 20 29 7b  WO_ISNULL)==0 ){
3c80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 43  .              C
3c90: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20  ollSeq *pColl;. 
3ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 50 61 72               Par
3cb0: 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 43  se *pParse = pWC
3cc0: 2d 3e 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65  ->pWInfo->pParse
3cd0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
3ce0: 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70  pX = pTerm->pExp
3cf0: 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r;.             
3d00: 20 69 66 28 20 21 73 71 6c 69 74 65 33 49 6e 64   if( !sqlite3Ind
3d10: 65 78 41 66 66 69 6e 69 74 79 4f 6b 28 70 58 2c  exAffinityOk(pX,
3d20: 20 70 53 63 61 6e 2d 3e 69 64 78 61 66 66 29 20   pScan->idxaff) 
3d30: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
3d40: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
3d50: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
3d60: 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
3d70: 74 28 70 58 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  t(pX->pLeft);.  
3d80: 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
3d90: 6c 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72  l = sqlite3Binar
3da0: 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28  yCompareCollSeq(
3db0: 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20  pParse,.        
3dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3de0: 20 20 20 20 20 20 20 20 20 20 70 58 2d 3e 70 4c            pX->pL
3df0: 65 66 74 2c 20 70 58 2d 3e 70 52 69 67 68 74 29  eft, pX->pRight)
3e00: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
3e10: 69 66 28 20 70 43 6f 6c 6c 3d 3d 30 20 29 20 70  if( pColl==0 ) p
3e20: 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64  Coll = pParse->d
3e30: 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20  b->pDfltColl;.  
3e40: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
3e50: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
3e60: 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 70 53 63  Coll->zName, pSc
3e70: 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65 29 20 29  an->zCollName) )
3e80: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
3e90: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
3ea0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
3eb0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
3ec0: 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d        if( (pTerm
3ed0: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
3ee0: 5f 45 51 29 21 3d 30 0a 20 20 20 20 20 20 20 20  _EQ)!=0.        
3ef0: 20 20 20 20 20 26 26 20 28 70 58 20 3d 20 70 54       && (pX = pT
3f00: 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67  erm->pExpr->pRig
3f10: 68 74 29 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  ht)->op==TK_COLU
3f20: 4d 4e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  MN.             
3f30: 26 26 20 70 58 2d 3e 69 54 61 62 6c 65 3d 3d 70  && pX->iTable==p
3f40: 53 63 61 6e 2d 3e 61 45 71 75 69 76 5b 30 5d 0a  Scan->aEquiv[0].
3f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
3f60: 70 58 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 53 63  pX->iColumn==pSc
3f70: 61 6e 2d 3e 61 45 71 75 69 76 5b 31 5d 0a 20 20  an->aEquiv[1].  
3f80: 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20            ){.   
3f90: 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
3fa0: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nue;.           
3fb0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70   }.            p
3fc0: 53 63 61 6e 2d 3e 6b 20 3d 20 6b 2b 31 3b 0a 20  Scan->k = k+1;. 
3fd0: 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
3fe0: 6e 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 20  n pTerm;.       
3ff0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
4000: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 53 63       }.      pSc
4010: 61 6e 2d 3e 70 57 43 20 3d 20 70 53 63 61 6e 2d  an->pWC = pScan-
4020: 3e 70 57 43 2d 3e 70 4f 75 74 65 72 3b 0a 20 20  >pWC->pOuter;.  
4030: 20 20 20 20 6b 20 3d 20 30 3b 0a 20 20 20 20 7d      k = 0;.    }
4040: 0a 20 20 20 20 70 53 63 61 6e 2d 3e 70 57 43 20  .    pScan->pWC 
4050: 3d 20 70 53 63 61 6e 2d 3e 70 4f 72 69 67 57 43  = pScan->pOrigWC
4060: 3b 0a 20 20 20 20 6b 20 3d 20 30 3b 0a 20 20 20  ;.    k = 0;.   
4070: 20 70 53 63 61 6e 2d 3e 69 45 71 75 69 76 20 2b   pScan->iEquiv +
4080: 3d 20 32 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 2;.  }.  retur
4090: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  n 0;.}../*.** In
40a0: 69 74 69 61 6c 69 7a 65 20 61 20 57 48 45 52 45  itialize a WHERE
40b0: 20 63 6c 61 75 73 65 20 73 63 61 6e 6e 65 72 20   clause scanner 
40c0: 6f 62 6a 65 63 74 2e 20 20 52 65 74 75 72 6e 20  object.  Return 
40d0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
40e0: 0a 2a 2a 20 66 69 72 73 74 20 6d 61 74 63 68 2e  .** first match.
40f0: 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66    Return NULL if
4100: 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 61   there are no ma
4110: 74 63 68 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  tches..**.** The
4120: 20 73 63 61 6e 6e 65 72 20 77 69 6c 6c 20 62 65   scanner will be
4130: 20 73 65 61 72 63 68 69 6e 67 20 74 68 65 20 57   searching the W
4140: 48 45 52 45 20 63 6c 61 75 73 65 20 70 57 43 2e  HERE clause pWC.
4150: 20 20 49 74 20 77 69 6c 6c 20 6c 6f 6f 6b 0a 2a    It will look.*
4160: 2a 20 66 6f 72 20 74 65 72 6d 73 20 6f 66 20 74  * for terms of t
4170: 68 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20  he form "X <op> 
4180: 3c 65 78 70 72 3e 22 20 77 68 65 72 65 20 58 20  <expr>" where X 
4190: 69 73 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 75 6d  is column iColum
41a0: 6e 20 6f 66 20 74 61 62 6c 65 0a 2a 2a 20 69 43  n of table.** iC
41b0: 75 72 2e 20 20 54 68 65 20 3c 6f 70 3e 20 6d 75  ur.  The <op> mu
41c0: 73 74 20 62 65 20 6f 6e 65 20 6f 66 20 74 68 65  st be one of the
41d0: 20 6f 70 65 72 61 74 6f 72 73 20 64 65 73 63 72   operators descr
41e0: 69 62 65 64 20 62 79 20 6f 70 4d 61 73 6b 2e 0a  ibed by opMask..
41f0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 65 61  **.** If the sea
4200: 72 63 68 20 69 73 20 66 6f 72 20 58 20 61 6e 64  rch is for X and
4210: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
4220: 65 20 63 6f 6e 74 61 69 6e 73 20 74 65 72 6d 73  e contains terms
4230: 20 6f 66 20 74 68 65 0a 2a 2a 20 66 6f 72 6d 20   of the.** form 
4240: 58 3d 59 20 74 68 65 6e 20 74 68 69 73 20 72 6f  X=Y then this ro
4250: 75 74 69 6e 65 20 6d 69 67 68 74 20 61 6c 73 6f  utine might also
4260: 20 72 65 74 75 72 6e 20 74 65 72 6d 73 20 6f 66   return terms of
4270: 20 74 68 65 20 66 6f 72 6d 0a 2a 2a 20 22 59 20   the form.** "Y 
4280: 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 2e 20 20 54  <op> <expr>".  T
4290: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65 76  he number of lev
42a0: 65 6c 73 20 6f 66 20 74 72 61 6e 73 69 74 69 76  els of transitiv
42b0: 69 74 79 20 69 73 20 6c 69 6d 69 74 65 64 2c 0a  ity is limited,.
42c0: 2a 2a 20 62 75 74 20 69 73 20 65 6e 6f 75 67 68  ** but is enough
42d0: 20 74 6f 20 68 61 6e 64 6c 65 20 6d 6f 73 74 20   to handle most 
42e0: 63 6f 6d 6d 6f 6e 6c 79 20 6f 63 63 75 72 72 69  commonly occurri
42f0: 6e 67 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  ng SQL statement
4300: 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 58 20 69 73  s..**.** If X is
4310: 20 6e 6f 74 20 74 68 65 20 49 4e 54 45 47 45 52   not the INTEGER
4320: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 74 68 65   PRIMARY KEY the
4330: 6e 20 58 20 6d 75 73 74 20 62 65 20 63 6f 6d 70  n X must be comp
4340: 61 74 69 62 6c 65 20 77 69 74 68 0a 2a 2a 20 69  atible with.** i
4350: 6e 64 65 78 20 70 49 64 78 2e 0a 2a 2f 0a 73 74  ndex pIdx..*/.st
4360: 61 74 69 63 20 57 68 65 72 65 54 65 72 6d 20 2a  atic WhereTerm *
4370: 77 68 65 72 65 53 63 61 6e 49 6e 69 74 28 0a 20  whereScanInit(. 
4380: 20 57 68 65 72 65 53 63 61 6e 20 2a 70 53 63 61   WhereScan *pSca
4390: 6e 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  n,       /* The 
43a0: 57 68 65 72 65 53 63 61 6e 20 6f 62 6a 65 63 74  WhereScan object
43b0: 20 62 65 69 6e 67 20 69 6e 69 74 69 61 6c 69 7a   being initializ
43c0: 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61  ed */.  WhereCla
43d0: 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20  use *pWC,       
43e0: 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
43f0: 75 73 65 20 74 6f 20 62 65 20 73 63 61 6e 6e 65  use to be scanne
4400: 64 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 2c  d */.  int iCur,
4410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4420: 2a 20 43 75 72 73 6f 72 20 74 6f 20 73 63 61 6e  * Cursor to scan
4430: 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 43   for */.  int iC
4440: 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 20 20 20 20  olumn,          
4450: 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 74 6f 20 73    /* Column to s
4460: 63 61 6e 20 66 6f 72 20 2a 2f 0a 20 20 75 33 32  can for */.  u32
4470: 20 6f 70 4d 61 73 6b 2c 20 20 20 20 20 20 20 20   opMask,        
4480: 20 20 20 20 20 2f 2a 20 4f 70 65 72 61 74 6f 72       /* Operator
4490: 28 73 29 20 74 6f 20 73 63 61 6e 20 66 6f 72 20  (s) to scan for 
44a0: 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  */.  Index *pIdx
44b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
44c0: 4d 75 73 74 20 62 65 20 63 6f 6d 70 61 74 69 62  Must be compatib
44d0: 6c 65 20 77 69 74 68 20 74 68 69 73 20 69 6e 64  le with this ind
44e0: 65 78 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6a  ex */.){.  int j
44f0: 3b 0a 0a 20 20 2f 2a 20 6d 65 6d 73 65 74 28 70  ;..  /* memset(p
4500: 53 63 61 6e 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Scan, 0, sizeof(
4510: 2a 70 53 63 61 6e 29 29 3b 20 2a 2f 0a 20 20 70  *pScan)); */.  p
4520: 53 63 61 6e 2d 3e 70 4f 72 69 67 57 43 20 3d 20  Scan->pOrigWC = 
4530: 70 57 43 3b 0a 20 20 70 53 63 61 6e 2d 3e 70 57  pWC;.  pScan->pW
4540: 43 20 3d 20 70 57 43 3b 0a 20 20 69 66 28 20 70  C = pWC;.  if( p
4550: 49 64 78 20 26 26 20 69 43 6f 6c 75 6d 6e 3e 3d  Idx && iColumn>=
4560: 30 20 29 7b 0a 20 20 20 20 70 53 63 61 6e 2d 3e  0 ){.    pScan->
4570: 69 64 78 61 66 66 20 3d 20 70 49 64 78 2d 3e 70  idxaff = pIdx->p
4580: 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43 6f 6c  Table->aCol[iCol
4590: 75 6d 6e 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20  umn].affinity;. 
45a0: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 70 49 64 78     for(j=0; pIdx
45b0: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 21 3d 69  ->aiColumn[j]!=i
45c0: 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20  Column; j++){.  
45d0: 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 6a 3e      if( NEVER(j>
45e0: 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 20 29  pIdx->nColumn) )
45f0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
4600: 0a 20 20 20 20 70 53 63 61 6e 2d 3e 7a 43 6f 6c  .    pScan->zCol
4610: 6c 4e 61 6d 65 20 3d 20 70 49 64 78 2d 3e 61 7a  lName = pIdx->az
4620: 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 7d 65 6c 73 65  Coll[j];.  }else
4630: 7b 0a 20 20 20 20 70 53 63 61 6e 2d 3e 69 64 78  {.    pScan->idx
4640: 61 66 66 20 3d 20 30 3b 0a 20 20 20 20 70 53 63  aff = 0;.    pSc
4650: 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65 20 3d 20  an->zCollName = 
4660: 30 3b 0a 20 20 7d 0a 20 20 70 53 63 61 6e 2d 3e  0;.  }.  pScan->
4670: 6f 70 4d 61 73 6b 20 3d 20 6f 70 4d 61 73 6b 3b  opMask = opMask;
4680: 0a 20 20 70 53 63 61 6e 2d 3e 6b 20 3d 20 30 3b  .  pScan->k = 0;
4690: 0a 20 20 70 53 63 61 6e 2d 3e 61 45 71 75 69 76  .  pScan->aEquiv
46a0: 5b 30 5d 20 3d 20 69 43 75 72 3b 0a 20 20 70 53  [0] = iCur;.  pS
46b0: 63 61 6e 2d 3e 61 45 71 75 69 76 5b 31 5d 20 3d  can->aEquiv[1] =
46c0: 20 69 43 6f 6c 75 6d 6e 3b 0a 20 20 70 53 63 61   iColumn;.  pSca
46d0: 6e 2d 3e 6e 45 71 75 69 76 20 3d 20 32 3b 0a 20  n->nEquiv = 2;. 
46e0: 20 70 53 63 61 6e 2d 3e 69 45 71 75 69 76 20 3d   pScan->iEquiv =
46f0: 20 32 3b 0a 20 20 72 65 74 75 72 6e 20 77 68 65   2;.  return whe
4700: 72 65 53 63 61 6e 4e 65 78 74 28 70 53 63 61 6e  reScanNext(pScan
4710: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72  );.}../*.** Sear
4720: 63 68 20 66 6f 72 20 61 20 74 65 72 6d 20 69 6e  ch for a term in
4730: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
4740: 65 20 74 68 61 74 20 69 73 20 6f 66 20 74 68 65  e that is of the
4750: 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 3c 65   form "X <op> <e
4760: 78 70 72 3e 22 0a 2a 2a 20 77 68 65 72 65 20 58  xpr>".** where X
4770: 20 69 73 20 61 20 72 65 66 65 72 65 6e 63 65 20   is a reference 
4780: 74 6f 20 74 68 65 20 69 43 6f 6c 75 6d 6e 20 6f  to the iColumn o
4790: 66 20 74 61 62 6c 65 20 69 43 75 72 20 61 6e 64  f table iCur and
47a0: 20 3c 6f 70 3e 20 69 73 20 6f 6e 65 20 6f 66 0a   <op> is one of.
47b0: 2a 2a 20 74 68 65 20 57 4f 5f 78 78 20 6f 70 65  ** the WO_xx ope
47c0: 72 61 74 6f 72 20 63 6f 64 65 73 20 73 70 65 63  rator codes spec
47d0: 69 66 69 65 64 20 62 79 20 74 68 65 20 6f 70 20  ified by the op 
47e0: 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 20 52 65  parameter..** Re
47f0: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
4800: 6f 20 74 68 65 20 74 65 72 6d 2e 20 20 52 65 74  o the term.  Ret
4810: 75 72 6e 20 30 20 69 66 20 6e 6f 74 20 66 6f 75  urn 0 if not fou
4820: 6e 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 65  nd..**.** The te
4830: 72 6d 20 72 65 74 75 72 6e 65 64 20 6d 69 67 68  rm returned migh
4840: 74 20 62 79 20 59 3d 3c 65 78 70 72 3e 20 69 66  t by Y=<expr> if
4850: 20 74 68 65 72 65 20 69 73 20 61 6e 6f 74 68 65   there is anothe
4860: 72 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 6e 0a  r constraint in.
4870: 2a 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  ** the WHERE cla
4880: 75 73 65 20 74 68 61 74 20 73 70 65 63 69 66 69  use that specifi
4890: 65 73 20 74 68 61 74 20 58 3d 59 2e 20 20 41 6e  es that X=Y.  An
48a0: 79 20 73 75 63 68 20 63 6f 6e 73 74 72 61 69 6e  y such constrain
48b0: 74 73 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 69 64  ts will be.** id
48c0: 65 6e 74 69 66 69 65 64 20 62 79 20 74 68 65 20  entified by the 
48d0: 57 4f 5f 45 51 55 49 56 20 62 69 74 20 69 6e 20  WO_EQUIV bit in 
48e0: 74 68 65 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  the pTerm->eOper
48f0: 61 74 6f 72 20 66 69 65 6c 64 2e 20 20 54 68 65  ator field.  The
4900: 0a 2a 2a 20 61 45 71 75 69 76 5b 5d 20 61 72 72  .** aEquiv[] arr
4910: 61 79 20 68 6f 6c 64 73 20 58 20 61 6e 64 20 61  ay holds X and a
4920: 6c 6c 20 69 74 73 20 65 71 75 69 76 61 6c 65 6e  ll its equivalen
4930: 74 73 2c 20 77 69 74 68 20 65 61 63 68 20 53 51  ts, with each SQ
4940: 4c 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 74 61  L variable.** ta
4950: 6b 69 6e 67 20 75 70 20 74 77 6f 20 73 6c 6f 74  king up two slot
4960: 73 20 69 6e 20 61 45 71 75 69 76 5b 5d 2e 20 20  s in aEquiv[].  
4970: 54 68 65 20 66 69 72 73 74 20 73 6c 6f 74 20 69  The first slot i
4980: 73 20 66 6f 72 20 74 68 65 20 63 75 72 73 6f 72  s for the cursor
4990: 20 6e 75 6d 62 65 72 0a 2a 2a 20 61 6e 64 20 74   number.** and t
49a0: 68 65 20 73 65 63 6f 6e 64 20 69 73 20 66 6f 72  he second is for
49b0: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62   the column numb
49c0: 65 72 2e 20 20 54 68 65 72 65 20 61 72 65 20 32  er.  There are 2
49d0: 32 20 73 6c 6f 74 73 20 69 6e 20 61 45 71 75 69  2 slots in aEqui
49e0: 76 5b 5d 0a 2a 2a 20 73 6f 20 74 68 61 74 20 6d  v[].** so that m
49f0: 65 61 6e 73 20 77 65 20 63 61 6e 20 6c 6f 6f 6b  eans we can look
4a00: 20 66 6f 72 20 58 20 70 6c 75 73 20 75 70 20 74   for X plus up t
4a10: 6f 20 31 30 20 6f 74 68 65 72 20 65 71 75 69 76  o 10 other equiv
4a20: 61 6c 65 6e 74 20 76 61 6c 75 65 73 2e 0a 2a 2a  alent values..**
4a30: 20 48 65 6e 63 65 20 61 20 73 65 61 72 63 68 20   Hence a search 
4a40: 66 6f 72 20 58 20 77 69 6c 6c 20 72 65 74 75 72  for X will retur
4a50: 6e 20 3c 65 78 70 72 3e 20 69 66 20 58 3d 41 31  n <expr> if X=A1
4a60: 20 61 6e 64 20 41 31 3d 41 32 20 61 6e 64 20 41   and A1=A2 and A
4a70: 32 3d 41 33 0a 2a 2a 20 61 6e 64 20 2e 2e 2e 20  2=A3.** and ... 
4a80: 61 6e 64 20 41 39 3d 41 31 30 20 61 6e 64 20 41  and A9=A10 and A
4a90: 31 30 3d 3c 65 78 70 72 3e 2e 0a 2a 2a 0a 2a 2a  10=<expr>..**.**
4aa0: 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6d 75   If there are mu
4ab0: 6c 74 69 70 6c 65 20 74 65 72 6d 73 20 69 6e 20  ltiple terms in 
4ac0: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
4ad0: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 58 20   of the form "X 
4ae0: 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 0a 2a 2a 20  <op> <expr>".** 
4af0: 74 68 65 6e 20 74 72 79 20 66 6f 72 20 74 68 65  then try for the
4b00: 20 6f 6e 65 20 77 69 74 68 20 6e 6f 20 64 65 70   one with no dep
4b10: 65 6e 64 65 6e 63 69 65 73 20 6f 6e 20 3c 65 78  endencies on <ex
4b20: 70 72 3e 20 2d 20 69 6e 20 6f 74 68 65 72 20 77  pr> - in other w
4b30: 6f 72 64 73 20 77 68 65 72 65 0a 2a 2a 20 3c 65  ords where.** <e
4b40: 78 70 72 3e 20 69 73 20 61 20 63 6f 6e 73 74 61  xpr> is a consta
4b50: 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 66  nt expression of
4b60: 20 73 6f 6d 65 20 6b 69 6e 64 2e 20 20 4f 6e 6c   some kind.  Onl
4b70: 79 20 72 65 74 75 72 6e 20 65 6e 74 72 69 65 73  y return entries
4b80: 20 6f 66 0a 2a 2a 20 74 68 65 20 66 6f 72 6d 20   of.** the form 
4b90: 22 58 20 3c 6f 70 3e 20 59 22 20 77 68 65 72 65  "X <op> Y" where
4ba0: 20 59 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 69   Y is a column i
4bb0: 6e 20 61 6e 6f 74 68 65 72 20 74 61 62 6c 65 20  n another table 
4bc0: 69 66 20 6e 6f 20 74 65 72 6d 73 20 6f 66 0a 2a  if no terms of.*
4bd0: 2a 20 74 68 65 20 66 6f 72 6d 20 22 58 20 3c 6f  * the form "X <o
4be0: 70 3e 20 3c 63 6f 6e 73 74 2d 65 78 70 72 3e 22  p> <const-expr>"
4bf0: 20 65 78 69 73 74 2e 20 20 20 49 66 20 6e 6f 20   exist.   If no 
4c00: 74 65 72 6d 73 20 77 69 74 68 20 61 20 63 6f 6e  terms with a con
4c10: 73 74 61 6e 74 20 52 48 53 0a 2a 2a 20 65 78 69  stant RHS.** exi
4c20: 73 74 2c 20 74 72 79 20 74 6f 20 72 65 74 75 72  st, try to retur
4c30: 6e 20 61 20 74 65 72 6d 20 74 68 61 74 20 64 6f  n a term that do
4c40: 65 73 20 6e 6f 74 20 75 73 65 20 57 4f 5f 45 51  es not use WO_EQ
4c50: 55 49 56 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 57  UIV..*/.static W
4c60: 68 65 72 65 54 65 72 6d 20 2a 66 69 6e 64 54 65  hereTerm *findTe
4c70: 72 6d 28 0a 20 20 57 68 65 72 65 43 6c 61 75 73  rm(.  WhereClaus
4c80: 65 20 2a 70 57 43 2c 20 20 20 20 20 2f 2a 20 54  e *pWC,     /* T
4c90: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
4ca0: 74 6f 20 62 65 20 73 65 61 72 63 68 65 64 20 2a  to be searched *
4cb0: 2f 0a 20 20 69 6e 74 20 69 43 75 72 2c 20 20 20  /.  int iCur,   
4cc0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
4cd0: 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 4c 48  sor number of LH
4ce0: 53 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75  S */.  int iColu
4cf0: 6d 6e 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  mn,          /* 
4d00: 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 6f 66  Column number of
4d10: 20 4c 48 53 20 2a 2f 0a 20 20 42 69 74 6d 61 73   LHS */.  Bitmas
4d20: 6b 20 6e 6f 74 52 65 61 64 79 2c 20 20 20 20 20  k notReady,     
4d30: 2f 2a 20 52 48 53 20 6d 75 73 74 20 6e 6f 74 20  /* RHS must not 
4d40: 6f 76 65 72 6c 61 70 20 77 69 74 68 20 74 68 69  overlap with thi
4d50: 73 20 6d 61 73 6b 20 2a 2f 0a 20 20 75 33 32 20  s mask */.  u32 
4d60: 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  op,             
4d70: 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 57 4f 5f    /* Mask of WO_
4d80: 78 78 20 76 61 6c 75 65 73 20 64 65 73 63 72 69  xx values descri
4d90: 62 69 6e 67 20 6f 70 65 72 61 74 6f 72 20 2a 2f  bing operator */
4da0: 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 20  .  Index *pIdx  
4db0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 75 73 74           /* Must
4dc0: 20 62 65 20 63 6f 6d 70 61 74 69 62 6c 65 20 77   be compatible w
4dd0: 69 74 68 20 74 68 69 73 20 69 6e 64 65 78 2c 20  ith this index, 
4de0: 69 66 20 6e 6f 74 20 4e 55 4c 4c 20 2a 2f 0a 29  if not NULL */.)
4df0: 7b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  {.  WhereTerm *p
4e00: 52 65 73 75 6c 74 20 3d 20 30 3b 0a 20 20 57 68  Result = 0;.  Wh
4e10: 65 72 65 54 65 72 6d 20 2a 70 3b 0a 20 20 57 68  ereTerm *p;.  Wh
4e20: 65 72 65 53 63 61 6e 20 73 63 61 6e 3b 0a 0a 20  ereScan scan;.. 
4e30: 20 70 20 3d 20 77 68 65 72 65 53 63 61 6e 49 6e   p = whereScanIn
4e40: 69 74 28 26 73 63 61 6e 2c 20 70 57 43 2c 20 69  it(&scan, pWC, i
4e50: 43 75 72 2c 20 69 43 6f 6c 75 6d 6e 2c 20 6f 70  Cur, iColumn, op
4e60: 2c 20 70 49 64 78 29 3b 0a 20 20 77 68 69 6c 65  , pIdx);.  while
4e70: 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28 20 28  ( p ){.    if( (
4e80: 70 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 26  p->prereqRight &
4e90: 20 6e 6f 74 52 65 61 64 79 29 3d 3d 30 20 29 7b   notReady)==0 ){
4ea0: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 72  .      if( p->pr
4eb0: 65 72 65 71 52 69 67 68 74 3d 3d 30 20 26 26 20  ereqRight==0 && 
4ec0: 28 70 2d 3e 65 4f 70 65 72 61 74 6f 72 26 57 4f  (p->eOperator&WO
4ed0: 5f 45 51 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  _EQ)!=0 ){.     
4ee0: 20 20 20 72 65 74 75 72 6e 20 70 3b 0a 20 20 20     return p;.   
4ef0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
4f00: 52 65 73 75 6c 74 3d 3d 30 20 29 20 70 52 65 73  Result==0 ) pRes
4f10: 75 6c 74 20 3d 20 70 3b 0a 20 20 20 20 7d 0a 20  ult = p;.    }. 
4f20: 20 20 20 70 20 3d 20 77 68 65 72 65 53 63 61 6e     p = whereScan
4f30: 4e 65 78 74 28 26 73 63 61 6e 29 3b 0a 20 20 7d  Next(&scan);.  }
4f40: 0a 20 20 72 65 74 75 72 6e 20 70 52 65 73 75 6c  .  return pResul
4f50: 74 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  t;.}../* Forward
4f60: 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74   reference */.st
4f70: 61 74 69 63 20 76 6f 69 64 20 65 78 70 72 41 6e  atic void exprAn
4f80: 61 6c 79 7a 65 28 53 72 63 4c 69 73 74 2a 2c 20  alyze(SrcList*, 
4f90: 57 68 65 72 65 43 6c 61 75 73 65 2a 2c 20 69 6e  WhereClause*, in
4fa0: 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20  t);../*.** Call 
4fb0: 65 78 70 72 41 6e 61 6c 79 7a 65 20 6f 6e 20 61  exprAnalyze on a
4fc0: 6c 6c 20 74 65 72 6d 73 20 69 6e 20 61 20 57 48  ll terms in a WH
4fd0: 45 52 45 20 63 6c 61 75 73 65 2e 20 20 0a 2a 2f  ERE clause.  .*/
4fe0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
4ff0: 72 41 6e 61 6c 79 7a 65 41 6c 6c 28 0a 20 20 53  rAnalyzeAll(.  S
5000: 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
5010: 2c 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20 46  ,       /* the F
5020: 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ROM clause */.  
5030: 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
5040: 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20           /* the 
5050: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20  WHERE clause to 
5060: 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 29  be analyzed */.)
5070: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  {.  int i;.  for
5080: 28 69 3d 70 57 43 2d 3e 6e 54 65 72 6d 2d 31 3b  (i=pWC->nTerm-1;
5090: 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20   i>=0; i--){.   
50a0: 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 54 61   exprAnalyze(pTa
50b0: 62 4c 69 73 74 2c 20 70 57 43 2c 20 69 29 3b 0a  bList, pWC, i);.
50c0: 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53    }.}..#ifndef S
50d0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f  QLITE_OMIT_LIKE_
50e0: 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 2f 2a 0a  OPTIMIZATION./*.
50f0: 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  ** Check to see 
5100: 69 66 20 74 68 65 20 67 69 76 65 6e 20 65 78 70  if the given exp
5110: 72 65 73 73 69 6f 6e 20 69 73 20 61 20 4c 49 4b  ression is a LIK
5120: 45 20 6f 72 20 47 4c 4f 42 20 6f 70 65 72 61 74  E or GLOB operat
5130: 6f 72 20 74 68 61 74 0a 2a 2a 20 63 61 6e 20 62  or that.** can b
5140: 65 20 6f 70 74 69 6d 69 7a 65 64 20 75 73 69 6e  e optimized usin
5150: 67 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e  g inequality con
5160: 73 74 72 61 69 6e 74 73 2e 20 20 52 65 74 75 72  straints.  Retur
5170: 6e 20 54 52 55 45 20 69 66 20 69 74 20 69 73 0a  n TRUE if it is.
5180: 2a 2a 20 73 6f 20 61 6e 64 20 66 61 6c 73 65 20  ** so and false 
5190: 69 66 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e  if not..**.** In
51a0: 20 6f 72 64 65 72 20 66 6f 72 20 74 68 65 20 6f   order for the o
51b0: 70 65 72 61 74 6f 72 20 74 6f 20 62 65 20 6f 70  perator to be op
51c0: 74 69 6d 69 7a 69 62 6c 65 2c 20 74 68 65 20 52  timizible, the R
51d0: 48 53 20 6d 75 73 74 20 62 65 20 61 20 73 74 72  HS must be a str
51e0: 69 6e 67 0a 2a 2a 20 6c 69 74 65 72 61 6c 20 74  ing.** literal t
51f0: 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 62 65 67  hat does not beg
5200: 69 6e 20 77 69 74 68 20 61 20 77 69 6c 64 63 61  in with a wildca
5210: 72 64 2e 20 20 54 68 65 20 4c 48 53 20 6d 75 73  rd.  The LHS mus
5220: 74 20 62 65 20 61 20 63 6f 6c 75 6d 6e 0a 2a 2a  t be a column.**
5230: 20 74 68 61 74 20 6d 61 79 20 6f 6e 6c 79 20 62   that may only b
5240: 65 20 4e 55 4c 4c 2c 20 61 20 73 74 72 69 6e 67  e NULL, a string
5250: 2c 20 6f 72 20 61 20 42 4c 4f 42 2c 20 6e 65 76  , or a BLOB, nev
5260: 65 72 20 61 20 6e 75 6d 62 65 72 2e 20 28 54 68  er a number. (Th
5270: 69 73 20 6d 65 61 6e 73 0a 2a 2a 20 74 68 61 74  is means.** that
5280: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 20   virtual tables 
5290: 63 61 6e 6e 6f 74 20 70 61 72 74 69 63 69 70 61  cannot participa
52a0: 74 65 20 69 6e 20 74 68 65 20 4c 49 4b 45 20 6f  te in the LIKE o
52b0: 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 29 20 20 49  ptimization.)  I
52c0: 66 20 74 68 65 0a 2a 2a 20 63 6f 6c 6c 61 74 69  f the.** collati
52d0: 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20  ng sequence for 
52e0: 74 68 65 20 63 6f 6c 75 6d 6e 20 6f 6e 20 74 68  the column on th
52f0: 65 20 4c 48 53 20 6d 75 73 74 20 62 65 20 61 70  e LHS must be ap
5300: 70 72 6f 70 72 69 61 74 65 20 66 6f 72 0a 2a 2a  propriate for.**
5310: 20 74 68 65 20 6f 70 65 72 61 74 6f 72 2e 0a 2a   the operator..*
5320: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73 4c  /.static int isL
5330: 69 6b 65 4f 72 47 6c 6f 62 28 0a 20 20 50 61 72  ikeOrGlob(.  Par
5340: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f  se *pParse,    /
5350: 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f  * Parsing and co
5360: 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f  de generating co
5370: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20  ntext */.  Expr 
5380: 2a 70 45 78 70 72 2c 20 20 20 20 20 20 2f 2a 20  *pExpr,      /* 
5390: 54 65 73 74 20 74 68 69 73 20 65 78 70 72 65 73  Test this expres
53a0: 73 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a  sion */.  Expr *
53b0: 2a 70 70 50 72 65 66 69 78 2c 20 20 2f 2a 20 50  *ppPrefix,  /* P
53c0: 6f 69 6e 74 65 72 20 74 6f 20 54 4b 5f 53 54 52  ointer to TK_STR
53d0: 49 4e 47 20 65 78 70 72 65 73 73 69 6f 6e 20 77  ING expression w
53e0: 69 74 68 20 70 61 74 74 65 72 6e 20 70 72 65 66  ith pattern pref
53f0: 69 78 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 73  ix */.  int *pis
5400: 43 6f 6d 70 6c 65 74 65 2c 20 2f 2a 20 54 72 75  Complete, /* Tru
5410: 65 20 69 66 20 74 68 65 20 6f 6e 6c 79 20 77 69  e if the only wi
5420: 6c 64 63 61 72 64 20 69 73 20 25 20 69 6e 20 74  ldcard is % in t
5430: 68 65 20 6c 61 73 74 20 63 68 61 72 61 63 74 65  he last characte
5440: 72 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 6f 43  r */.  int *pnoC
5450: 61 73 65 20 20 20 20 20 20 2f 2a 20 54 72 75 65  ase      /* True
5460: 20 69 66 20 75 70 70 65 72 63 61 73 65 20 69 73   if uppercase is
5470: 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 6c   equivalent to l
5480: 6f 77 65 72 63 61 73 65 20 2a 2f 0a 29 7b 0a 20  owercase */.){. 
5490: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d   const char *z =
54a0: 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53   0;         /* S
54b0: 74 72 69 6e 67 20 6f 6e 20 52 48 53 20 6f 66 20  tring on RHS of 
54c0: 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72 20 2a 2f  LIKE operator */
54d0: 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c  .  Expr *pRight,
54e0: 20 2a 70 4c 65 66 74 3b 20 20 20 20 20 20 2f 2a   *pLeft;      /*
54f0: 20 52 69 67 68 74 20 61 6e 64 20 6c 65 66 74 20   Right and left 
5500: 73 69 7a 65 20 6f 66 20 4c 49 4b 45 20 6f 70 65  size of LIKE ope
5510: 72 61 74 6f 72 20 2a 2f 0a 20 20 45 78 70 72 4c  rator */.  ExprL
5520: 69 73 74 20 2a 70 4c 69 73 74 3b 20 20 20 20 20  ist *pList;     
5530: 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
5540: 20 6f 70 65 72 61 6e 64 73 20 74 6f 20 74 68 65   operands to the
5550: 20 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72 20 2a   LIKE operator *
5560: 2f 0a 20 20 69 6e 74 20 63 3b 20 20 20 20 20 20  /.  int c;      
5570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5580: 2a 20 4f 6e 65 20 63 68 61 72 61 63 74 65 72 20  * One character 
5590: 69 6e 20 7a 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  in z[] */.  int 
55a0: 63 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  cnt;            
55b0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
55c0: 20 6f 66 20 6e 6f 6e 2d 77 69 6c 64 63 61 72 64   of non-wildcard
55d0: 20 70 72 65 66 69 78 20 63 68 61 72 61 63 74 65   prefix characte
55e0: 72 73 20 2a 2f 0a 20 20 63 68 61 72 20 77 63 5b  rs */.  char wc[
55f0: 33 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  3];             
5600: 20 20 20 2f 2a 20 57 69 6c 64 63 61 72 64 20 63     /* Wildcard c
5610: 68 61 72 61 63 74 65 72 73 20 2a 2f 0a 20 20 73  haracters */.  s
5620: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
5630: 72 73 65 2d 3e 64 62 3b 20 20 2f 2a 20 44 61 74  rse->db;  /* Dat
5640: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
5650: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61   */.  sqlite3_va
5660: 6c 75 65 20 2a 70 56 61 6c 20 3d 20 30 3b 0a 20  lue *pVal = 0;. 
5670: 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20   int op;        
5680: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
5690: 70 63 6f 64 65 20 6f 66 20 70 52 69 67 68 74 20  pcode of pRight 
56a0: 2a 2f 0a 0a 20 20 69 66 28 20 21 73 71 6c 69 74  */..  if( !sqlit
56b0: 65 33 49 73 4c 69 6b 65 46 75 6e 63 74 69 6f 6e  e3IsLikeFunction
56c0: 28 64 62 2c 20 70 45 78 70 72 2c 20 70 6e 6f 43  (db, pExpr, pnoC
56d0: 61 73 65 2c 20 77 63 29 20 29 7b 0a 20 20 20 20  ase, wc) ){.    
56e0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 69  return 0;.  }.#i
56f0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 42 43 44  fdef SQLITE_EBCD
5700: 49 43 0a 20 20 69 66 28 20 2a 70 6e 6f 43 61 73  IC.  if( *pnoCas
5710: 65 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 23 65  e ) return 0;.#e
5720: 6e 64 69 66 0a 20 20 70 4c 69 73 74 20 3d 20 70  ndif.  pList = p
5730: 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20  Expr->x.pList;. 
5740: 20 70 4c 65 66 74 20 3d 20 70 4c 69 73 74 2d 3e   pLeft = pList->
5750: 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 69 66  a[1].pExpr;.  if
5760: 28 20 70 4c 65 66 74 2d 3e 6f 70 21 3d 54 4b 5f  ( pLeft->op!=TK_
5770: 43 4f 4c 55 4d 4e 20 0a 20 20 20 7c 7c 20 73 71  COLUMN .   || sq
5780: 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74  lite3ExprAffinit
5790: 79 28 70 4c 65 66 74 29 21 3d 53 51 4c 49 54 45  y(pLeft)!=SQLITE
57a0: 5f 41 46 46 5f 54 45 58 54 20 0a 20 20 20 7c 7c  _AFF_TEXT .   ||
57b0: 20 49 73 56 69 72 74 75 61 6c 28 70 4c 65 66 74   IsVirtual(pLeft
57c0: 2d 3e 70 54 61 62 29 20 20 2f 2a 20 56 61 6c 75  ->pTab)  /* Valu
57d0: 65 20 6d 69 67 68 74 20 62 65 20 6e 75 6d 65 72  e might be numer
57e0: 69 63 20 2a 2f 0a 20 20 29 7b 0a 20 20 20 20 2f  ic */.  ){.    /
57f0: 2a 20 49 4d 50 3a 20 52 2d 30 32 30 36 35 2d 34  * IMP: R-02065-4
5800: 39 34 36 35 20 54 68 65 20 6c 65 66 74 2d 68 61  9465 The left-ha
5810: 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65 20 4c  nd side of the L
5820: 49 4b 45 20 6f 72 20 47 4c 4f 42 20 6f 70 65 72  IKE or GLOB oper
5830: 61 74 6f 72 20 6d 75 73 74 0a 20 20 20 20 2a 2a  ator must.    **
5840: 20 62 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   be the name of 
5850: 61 6e 20 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d  an indexed colum
5860: 6e 20 77 69 74 68 20 54 45 58 54 20 61 66 66 69  n with TEXT affi
5870: 6e 69 74 79 2e 20 2a 2f 0a 20 20 20 20 72 65 74  nity. */.    ret
5880: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73  urn 0;.  }.  ass
5890: 65 72 74 28 20 70 4c 65 66 74 2d 3e 69 43 6f 6c  ert( pLeft->iCol
58a0: 75 6d 6e 21 3d 28 2d 31 29 20 29 3b 20 2f 2a 20  umn!=(-1) ); /* 
58b0: 42 65 63 61 75 73 65 20 49 50 4b 20 6e 65 76 65  Because IPK neve
58c0: 72 20 68 61 73 20 41 46 46 5f 54 45 58 54 20 2a  r has AFF_TEXT *
58d0: 2f 0a 0a 20 20 70 52 69 67 68 74 20 3d 20 73 71  /..  pRight = sq
58e0: 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c  lite3ExprSkipCol
58f0: 6c 61 74 65 28 70 4c 69 73 74 2d 3e 61 5b 30 5d  late(pList->a[0]
5900: 2e 70 45 78 70 72 29 3b 0a 20 20 6f 70 20 3d 20  .pExpr);.  op = 
5910: 70 52 69 67 68 74 2d 3e 6f 70 3b 0a 20 20 69 66  pRight->op;.  if
5920: 28 20 6f 70 3d 3d 54 4b 5f 56 41 52 49 41 42 4c  ( op==TK_VARIABL
5930: 45 20 29 7b 0a 20 20 20 20 56 64 62 65 20 2a 70  E ){.    Vdbe *p
5940: 52 65 70 72 65 70 61 72 65 20 3d 20 70 50 61 72  Reprepare = pPar
5950: 73 65 2d 3e 70 52 65 70 72 65 70 61 72 65 3b 0a  se->pReprepare;.
5960: 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70      int iCol = p
5970: 52 69 67 68 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a  Right->iColumn;.
5980: 20 20 20 20 70 56 61 6c 20 3d 20 73 71 6c 69 74      pVal = sqlit
5990: 65 33 56 64 62 65 47 65 74 42 6f 75 6e 64 56 61  e3VdbeGetBoundVa
59a0: 6c 75 65 28 70 52 65 70 72 65 70 61 72 65 2c 20  lue(pReprepare, 
59b0: 69 43 6f 6c 2c 20 53 51 4c 49 54 45 5f 41 46 46  iCol, SQLITE_AFF
59c0: 5f 4e 4f 4e 45 29 3b 0a 20 20 20 20 69 66 28 20  _NONE);.    if( 
59d0: 70 56 61 6c 20 26 26 20 73 71 6c 69 74 65 33 5f  pVal && sqlite3_
59e0: 76 61 6c 75 65 5f 74 79 70 65 28 70 56 61 6c 29  value_type(pVal)
59f0: 3d 3d 53 51 4c 49 54 45 5f 54 45 58 54 20 29 7b  ==SQLITE_TEXT ){
5a00: 0a 20 20 20 20 20 20 7a 20 3d 20 28 63 68 61 72  .      z = (char
5a10: 20 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   *)sqlite3_value
5a20: 5f 74 65 78 74 28 70 56 61 6c 29 3b 0a 20 20 20  _text(pVal);.   
5a30: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64   }.    sqlite3Vd
5a40: 62 65 53 65 74 56 61 72 6d 61 73 6b 28 70 50 61  beSetVarmask(pPa
5a50: 72 73 65 2d 3e 70 56 64 62 65 2c 20 69 43 6f 6c  rse->pVdbe, iCol
5a60: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
5a70: 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 56 41  Right->op==TK_VA
5a80: 52 49 41 42 4c 45 20 7c 7c 20 70 52 69 67 68 74  RIABLE || pRight
5a90: 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45  ->op==TK_REGISTE
5aa0: 52 20 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  R );.  }else if(
5ab0: 20 6f 70 3d 3d 54 4b 5f 53 54 52 49 4e 47 20 29   op==TK_STRING )
5ac0: 7b 0a 20 20 20 20 7a 20 3d 20 70 52 69 67 68 74  {.    z = pRight
5ad0: 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 7d 0a  ->u.zToken;.  }.
5ae0: 20 20 69 66 28 20 7a 20 29 7b 0a 20 20 20 20 63    if( z ){.    c
5af0: 6e 74 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c  nt = 0;.    whil
5b00: 65 28 20 28 63 3d 7a 5b 63 6e 74 5d 29 21 3d 30  e( (c=z[cnt])!=0
5b10: 20 26 26 20 63 21 3d 77 63 5b 30 5d 20 26 26 20   && c!=wc[0] && 
5b20: 63 21 3d 77 63 5b 31 5d 20 26 26 20 63 21 3d 77  c!=wc[1] && c!=w
5b30: 63 5b 32 5d 20 29 7b 0a 20 20 20 20 20 20 63 6e  c[2] ){.      cn
5b40: 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  t++;.    }.    i
5b50: 66 28 20 63 6e 74 21 3d 30 20 26 26 20 32 35 35  f( cnt!=0 && 255
5b60: 21 3d 28 75 38 29 7a 5b 63 6e 74 2d 31 5d 20 29  !=(u8)z[cnt-1] )
5b70: 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 50  {.      Expr *pP
5b80: 72 65 66 69 78 3b 0a 20 20 20 20 20 20 2a 70 69  refix;.      *pi
5b90: 73 43 6f 6d 70 6c 65 74 65 20 3d 20 63 3d 3d 77  sComplete = c==w
5ba0: 63 5b 30 5d 20 26 26 20 7a 5b 63 6e 74 2b 31 5d  c[0] && z[cnt+1]
5bb0: 3d 3d 30 3b 0a 20 20 20 20 20 20 70 50 72 65 66  ==0;.      pPref
5bc0: 69 78 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ix = sqlite3Expr
5bd0: 28 64 62 2c 20 54 4b 5f 53 54 52 49 4e 47 2c 20  (db, TK_STRING, 
5be0: 7a 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50  z);.      if( pP
5bf0: 72 65 66 69 78 20 29 20 70 50 72 65 66 69 78 2d  refix ) pPrefix-
5c00: 3e 75 2e 7a 54 6f 6b 65 6e 5b 63 6e 74 5d 20 3d  >u.zToken[cnt] =
5c10: 20 30 3b 0a 20 20 20 20 20 20 2a 70 70 50 72 65   0;.      *ppPre
5c20: 66 69 78 20 3d 20 70 50 72 65 66 69 78 3b 0a 20  fix = pPrefix;. 
5c30: 20 20 20 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f       if( op==TK_
5c40: 56 41 52 49 41 42 4c 45 20 29 7b 0a 20 20 20 20  VARIABLE ){.    
5c50: 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50      Vdbe *v = pP
5c60: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 20  arse->pVdbe;.   
5c70: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
5c80: 53 65 74 56 61 72 6d 61 73 6b 28 76 2c 20 70 52  SetVarmask(v, pR
5c90: 69 67 68 74 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a  ight->iColumn);.
5ca0: 20 20 20 20 20 20 20 20 69 66 28 20 2a 70 69 73          if( *pis
5cb0: 43 6f 6d 70 6c 65 74 65 20 26 26 20 70 52 69 67  Complete && pRig
5cc0: 68 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 31 5d 20  ht->u.zToken[1] 
5cd0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
5ce0: 49 66 20 74 68 65 20 72 68 73 20 6f 66 20 74 68  If the rhs of th
5cf0: 65 20 4c 49 4b 45 20 65 78 70 72 65 73 73 69 6f  e LIKE expressio
5d00: 6e 20 69 73 20 61 20 76 61 72 69 61 62 6c 65 2c  n is a variable,
5d10: 20 61 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74   and the current
5d20: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 76 61  .          ** va
5d30: 6c 75 65 20 6f 66 20 74 68 65 20 76 61 72 69 61  lue of the varia
5d40: 62 6c 65 20 6d 65 61 6e 73 20 74 68 65 72 65 20  ble means there 
5d50: 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 69 6e  is no need to in
5d60: 76 6f 6b 65 20 74 68 65 20 4c 49 4b 45 0a 20 20  voke the LIKE.  
5d70: 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74          ** funct
5d80: 69 6f 6e 2c 20 74 68 65 6e 20 6e 6f 20 4f 50 5f  ion, then no OP_
5d90: 56 61 72 69 61 62 6c 65 20 77 69 6c 6c 20 62 65  Variable will be
5da0: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 70 72   added to the pr
5db0: 6f 67 72 61 6d 2e 0a 20 20 20 20 20 20 20 20 20  ogram..         
5dc0: 20 2a 2a 20 54 68 69 73 20 63 61 75 73 65 73 20   ** This causes 
5dd0: 70 72 6f 62 6c 65 6d 73 20 66 6f 72 20 74 68 65  problems for the
5de0: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61   sqlite3_bind_pa
5df0: 72 61 6d 65 74 65 72 5f 6e 61 6d 65 28 29 0a 20  rameter_name(). 
5e00: 20 20 20 20 20 20 20 20 20 2a 2a 20 41 50 49 2e           ** API.
5e10: 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20   To work around 
5e20: 74 68 65 6d 2c 20 61 64 64 20 61 20 64 75 6d 6d  them, add a dumm
5e30: 79 20 4f 50 5f 56 61 72 69 61 62 6c 65 20 68 65  y OP_Variable he
5e40: 72 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  re..          */
5e50: 20 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20   .          int 
5e60: 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r1 = sqlite3GetT
5e70: 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
5e80: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
5e90: 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28  3ExprCodeTarget(
5ea0: 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 2c 20  pParse, pRight, 
5eb0: 72 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  r1);.          s
5ec0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
5ed0: 50 33 28 76 2c 20 73 71 6c 69 74 65 33 56 64 62  P3(v, sqlite3Vdb
5ee0: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2d  eCurrentAddr(v)-
5ef0: 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  1, 0);.         
5f00: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
5f10: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
5f20: 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  1);.        }.  
5f30: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
5f40: 0a 20 20 20 20 20 20 7a 20 3d 20 30 3b 0a 20 20  .      z = 0;.  
5f50: 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74    }.  }..  sqlit
5f60: 65 33 56 61 6c 75 65 46 72 65 65 28 70 56 61 6c  e3ValueFree(pVal
5f70: 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 7a 21 3d  );.  return (z!=
5f80: 30 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  0);.}.#endif /* 
5f90: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45  SQLITE_OMIT_LIKE
5fa0: 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f  _OPTIMIZATION */
5fb0: 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ...#ifndef SQLIT
5fc0: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
5fd0: 42 4c 45 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20  BLE./*.** Check 
5fe0: 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 67 69  to see if the gi
5ff0: 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69  ven expression i
6000: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a 2a 2a  s of the form.**
6010: 0a 2a 2a 20 20 20 20 20 20 20 20 20 63 6f 6c 75  .**         colu
6020: 6d 6e 20 4d 41 54 43 48 20 65 78 70 72 0a 2a 2a  mn MATCH expr.**
6030: 0a 2a 2a 20 49 66 20 69 74 20 69 73 20 74 68 65  .** If it is the
6040: 6e 20 72 65 74 75 72 6e 20 54 52 55 45 2e 20 20  n return TRUE.  
6050: 49 66 20 6e 6f 74 2c 20 72 65 74 75 72 6e 20 46  If not, return F
6060: 41 4c 53 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ALSE..*/.static 
6070: 69 6e 74 20 69 73 4d 61 74 63 68 4f 66 43 6f 6c  int isMatchOfCol
6080: 75 6d 6e 28 0a 20 20 45 78 70 72 20 2a 70 45 78  umn(.  Expr *pEx
6090: 70 72 20 20 20 20 20 20 2f 2a 20 54 65 73 74 20  pr      /* Test 
60a0: 74 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20  this expression 
60b0: 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 4c 69 73 74  */.){.  ExprList
60c0: 20 2a 70 4c 69 73 74 3b 0a 0a 20 20 69 66 28 20   *pList;..  if( 
60d0: 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 46 55  pExpr->op!=TK_FU
60e0: 4e 43 54 49 4f 4e 20 29 7b 0a 20 20 20 20 72 65  NCTION ){.    re
60f0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66  turn 0;.  }.  if
6100: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
6110: 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e  (pExpr->u.zToken
6120: 2c 22 6d 61 74 63 68 22 29 21 3d 30 20 29 7b 0a  ,"match")!=0 ){.
6130: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
6140: 7d 0a 20 20 70 4c 69 73 74 20 3d 20 70 45 78 70  }.  pList = pExp
6150: 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 69 66  r->x.pList;.  if
6160: 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d  ( pList->nExpr!=
6170: 32 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  2 ){.    return 
6180: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 69  0;.  }.  if( pLi
6190: 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 2d 3e  st->a[1].pExpr->
61a0: 6f 70 20 21 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 20  op != TK_COLUMN 
61b0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
61c0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b  .  }.  return 1;
61d0: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
61e0: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
61f0: 54 41 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  TABLE */../*.** 
6200: 49 66 20 74 68 65 20 70 42 61 73 65 20 65 78 70  If the pBase exp
6210: 72 65 73 73 69 6f 6e 20 6f 72 69 67 69 6e 61 74  ression originat
6220: 65 64 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20  ed in the ON or 
6230: 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 0a  USING clause of.
6240: 2a 2a 20 61 20 6a 6f 69 6e 2c 20 74 68 65 6e 20  ** a join, then 
6250: 74 72 61 6e 73 66 65 72 20 74 68 65 20 61 70 70  transfer the app
6260: 72 6f 70 72 69 61 74 65 20 6d 61 72 6b 69 6e 67  ropriate marking
6270: 73 20 6f 76 65 72 20 74 6f 20 64 65 72 69 76 65  s over to derive
6280: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
6290: 64 20 74 72 61 6e 73 66 65 72 4a 6f 69 6e 4d 61  d transferJoinMa
62a0: 72 6b 69 6e 67 73 28 45 78 70 72 20 2a 70 44 65  rkings(Expr *pDe
62b0: 72 69 76 65 64 2c 20 45 78 70 72 20 2a 70 42 61  rived, Expr *pBa
62c0: 73 65 29 7b 0a 20 20 69 66 28 20 70 44 65 72 69  se){.  if( pDeri
62d0: 76 65 64 20 29 7b 0a 20 20 20 20 70 44 65 72 69  ved ){.    pDeri
62e0: 76 65 64 2d 3e 66 6c 61 67 73 20 7c 3d 20 70 42  ved->flags |= pB
62f0: 61 73 65 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  ase->flags & EP_
6300: 46 72 6f 6d 4a 6f 69 6e 3b 0a 20 20 20 20 70 44  FromJoin;.    pD
6310: 65 72 69 76 65 64 2d 3e 69 52 69 67 68 74 4a 6f  erived->iRightJo
6320: 69 6e 54 61 62 6c 65 20 3d 20 70 42 61 73 65 2d  inTable = pBase-
6330: 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65  >iRightJoinTable
6340: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  ;.  }.}../*.** M
6350: 61 72 6b 20 74 65 72 6d 20 69 43 68 69 6c 64 20  ark term iChild 
6360: 61 73 20 62 65 69 6e 67 20 61 20 63 68 69 6c 64  as being a child
6370: 20 6f 66 20 74 65 72 6d 20 69 50 61 72 65 6e 74   of term iParent
6380: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
6390: 6d 61 72 6b 54 65 72 6d 41 73 43 68 69 6c 64 28  markTermAsChild(
63a0: 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
63b0: 2c 20 69 6e 74 20 69 43 68 69 6c 64 2c 20 69 6e  , int iChild, in
63c0: 74 20 69 50 61 72 65 6e 74 29 7b 0a 20 20 70 57  t iParent){.  pW
63d0: 43 2d 3e 61 5b 69 43 68 69 6c 64 5d 2e 69 50 61  C->a[iChild].iPa
63e0: 72 65 6e 74 20 3d 20 69 50 61 72 65 6e 74 3b 0a  rent = iParent;.
63f0: 20 20 70 57 43 2d 3e 61 5b 69 43 68 69 6c 64 5d    pWC->a[iChild]
6400: 2e 74 72 75 74 68 50 72 6f 62 20 3d 20 70 57 43  .truthProb = pWC
6410: 2d 3e 61 5b 69 50 61 72 65 6e 74 5d 2e 74 72 75  ->a[iParent].tru
6420: 74 68 50 72 6f 62 3b 0a 20 20 70 57 43 2d 3e 61  thProb;.  pWC->a
6430: 5b 69 50 61 72 65 6e 74 5d 2e 6e 43 68 69 6c 64  [iParent].nChild
6440: 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ++;.}../*.** Ret
6450: 75 72 6e 20 74 68 65 20 4e 2d 74 68 20 41 4e 44  urn the N-th AND
6460: 2d 63 6f 6e 6e 65 63 74 65 64 20 73 75 62 74 65  -connected subte
6470: 72 6d 20 6f 66 20 70 54 65 72 6d 2e 20 20 4f 72  rm of pTerm.  Or
6480: 20 69 66 20 70 54 65 72 6d 20 69 73 20 6e 6f 74   if pTerm is not
6490: 0a 2a 2a 20 61 20 63 6f 6e 6a 75 6e 63 74 69 6f  .** a conjunctio
64a0: 6e 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 6a  n, then return j
64b0: 75 73 74 20 70 54 65 72 6d 20 77 68 65 6e 20 4e  ust pTerm when N
64c0: 3d 3d 30 2e 20 20 49 66 20 4e 20 69 73 20 65 78  ==0.  If N is ex
64d0: 63 65 65 64 73 0a 2a 2a 20 74 68 65 20 6e 75 6d  ceeds.** the num
64e0: 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65  ber of available
64f0: 20 73 75 62 74 65 72 6d 73 2c 20 72 65 74 75 72   subterms, retur
6500: 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69  n NULL..*/.stati
6510: 63 20 57 68 65 72 65 54 65 72 6d 20 2a 77 68 65  c WhereTerm *whe
6520: 72 65 4e 74 68 53 75 62 74 65 72 6d 28 57 68 65  reNthSubterm(Whe
6530: 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 69  reTerm *pTerm, i
6540: 6e 74 20 4e 29 7b 0a 20 20 69 66 28 20 70 54 65  nt N){.  if( pTe
6550: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 21 3d 57  rm->eOperator!=W
6560: 4f 5f 41 4e 44 20 29 7b 0a 20 20 20 20 72 65 74  O_AND ){.    ret
6570: 75 72 6e 20 4e 3d 3d 30 20 3f 20 70 54 65 72 6d  urn N==0 ? pTerm
6580: 20 3a 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20   : 0;.  }.  if( 
6590: 4e 3c 70 54 65 72 6d 2d 3e 75 2e 70 41 6e 64 49  N<pTerm->u.pAndI
65a0: 6e 66 6f 2d 3e 77 63 2e 6e 54 65 72 6d 20 29 7b  nfo->wc.nTerm ){
65b0: 0a 20 20 20 20 72 65 74 75 72 6e 20 26 70 54 65  .    return &pTe
65c0: 72 6d 2d 3e 75 2e 70 41 6e 64 49 6e 66 6f 2d 3e  rm->u.pAndInfo->
65d0: 77 63 2e 61 5b 4e 5d 3b 0a 20 20 7d 0a 20 20 72  wc.a[N];.  }.  r
65e0: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
65f0: 2a 20 53 75 62 74 65 72 6d 73 20 70 4f 6e 65 20  * Subterms pOne 
6600: 61 6e 64 20 70 54 77 6f 20 61 72 65 20 63 6f 6e  and pTwo are con
6610: 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20 57 48  tained within WH
6620: 45 52 45 20 63 6c 61 75 73 65 20 70 57 43 2e 20  ERE clause pWC. 
6630: 20 54 68 65 0a 2a 2a 20 74 77 6f 20 73 75 62 74   The.** two subt
6640: 65 72 6d 73 20 61 72 65 20 69 6e 20 64 69 73 6a  erms are in disj
6650: 75 6e 63 74 69 6f 6e 20 2d 20 74 68 65 79 20 61  unction - they a
6660: 72 65 20 4f 52 2d 65 64 20 74 6f 67 65 74 68 65  re OR-ed togethe
6670: 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 73  r..**.** If thes
6680: 65 20 74 77 6f 20 74 65 72 6d 73 20 61 72 65 20  e two terms are 
6690: 62 6f 74 68 20 6f 66 20 74 68 65 20 66 6f 72 6d  both of the form
66a0: 3a 20 20 22 41 20 6f 70 20 42 22 20 77 69 74 68  :  "A op B" with
66b0: 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 41 20 61   the same.** A a
66c0: 6e 64 20 42 20 76 61 6c 75 65 73 20 62 75 74 20  nd B values but 
66d0: 64 69 66 66 65 72 65 6e 74 20 6f 70 65 72 61 74  different operat
66e0: 6f 72 73 20 61 6e 64 20 69 66 20 74 68 65 20 6f  ors and if the o
66f0: 70 65 72 61 74 6f 72 73 20 61 72 65 0a 2a 2a 20  perators are.** 
6700: 63 6f 6d 70 61 74 69 62 6c 65 20 28 69 66 20 6f  compatible (if o
6710: 6e 65 20 69 73 20 3d 20 61 6e 64 20 74 68 65 20  ne is = and the 
6720: 6f 74 68 65 72 20 69 73 20 3c 2c 20 66 6f 72 20  other is <, for 
6730: 65 78 61 6d 70 6c 65 29 20 74 68 65 6e 0a 2a 2a  example) then.**
6740: 20 61 64 64 20 61 20 6e 65 77 20 76 69 72 74 75   add a new virtu
6750: 61 6c 20 74 65 72 6d 20 74 6f 20 70 57 43 20 74  al term to pWC t
6760: 68 61 74 20 69 73 20 74 68 65 20 63 6f 6d 62 69  hat is the combi
6770: 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a  nation of the.**
6780: 20 74 77 6f 2e 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65   two..**.** Some
6790: 20 65 78 61 6d 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a   examples:.**.**
67a0: 20 20 20 20 78 3c 79 20 4f 52 20 78 3d 79 20 20      x<y OR x=y  
67b0: 20 20 2d 2d 3e 20 20 20 20 20 78 3c 3d 79 0a 2a    -->     x<=y.*
67c0: 2a 20 20 20 20 78 3d 79 20 4f 52 20 78 3d 79 20  *    x=y OR x=y 
67d0: 20 20 20 2d 2d 3e 20 20 20 20 20 78 3d 79 0a 2a     -->     x=y.*
67e0: 2a 20 20 20 20 78 3c 3d 79 20 4f 52 20 78 3c 79  *    x<=y OR x<y
67f0: 20 20 20 2d 2d 3e 20 20 20 20 20 78 3c 3d 79 0a     -->     x<=y.
6800: 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  **.** The follow
6810: 69 6e 67 20 69 73 20 4e 4f 54 20 67 65 6e 65 72  ing is NOT gener
6820: 61 74 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 78  ated:.**.**    x
6830: 3c 79 20 4f 52 20 78 3e 79 20 20 20 20 2d 2d 3e  <y OR x>y    -->
6840: 20 20 20 20 20 78 21 3d 79 20 20 20 20 20 0a 2a       x!=y     .*
6850: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68  /.static void wh
6860: 65 72 65 43 6f 6d 62 69 6e 65 44 69 73 6a 75 6e  ereCombineDisjun
6870: 63 74 73 28 0a 20 20 53 72 63 4c 69 73 74 20 2a  cts(.  SrcList *
6880: 70 53 72 63 2c 20 20 20 20 20 20 20 20 20 2f 2a  pSrc,         /*
6890: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
68a0: 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
68b0: 65 20 2a 70 57 43 2c 20 20 20 20 20 20 2f 2a 20  e *pWC,      /* 
68c0: 54 68 65 20 63 6f 6d 70 6c 65 74 65 20 57 48 45  The complete WHE
68d0: 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57  RE clause */.  W
68e0: 68 65 72 65 54 65 72 6d 20 2a 70 4f 6e 65 2c 20  hereTerm *pOne, 
68f0: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 64        /* First d
6900: 69 73 6a 75 6e 63 74 20 2a 2f 0a 20 20 57 68 65  isjunct */.  Whe
6910: 72 65 54 65 72 6d 20 2a 70 54 77 6f 20 20 20 20  reTerm *pTwo    
6920: 20 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20 64 69      /* Second di
6930: 73 6a 75 6e 63 74 20 2a 2f 0a 29 7b 0a 20 20 75  sjunct */.){.  u
6940: 31 36 20 65 4f 70 20 3d 20 70 4f 6e 65 2d 3e 65  16 eOp = pOne->e
6950: 4f 70 65 72 61 74 6f 72 20 7c 20 70 54 77 6f 2d  Operator | pTwo-
6960: 3e 65 4f 70 65 72 61 74 6f 72 3b 0a 20 20 73 71  >eOperator;.  sq
6970: 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20  lite3 *db;      
6980: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
6990: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 28 66 6f 72   connection (for
69a0: 20 6d 61 6c 6c 6f 63 29 20 2a 2f 0a 20 20 45 78   malloc) */.  Ex
69b0: 70 72 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20  pr *pNew;       
69c0: 20 20 20 20 20 2f 2a 20 4e 65 77 20 76 69 72 74       /* New virt
69d0: 75 61 6c 20 65 78 70 72 65 73 73 69 6f 6e 20 2a  ual expression *
69e0: 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20  /.  int op;     
69f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70             /* Op
6a00: 65 72 61 74 6f 72 20 66 6f 72 20 74 68 65 20 63  erator for the c
6a10: 6f 6d 62 69 6e 65 64 20 65 78 70 72 65 73 73 69  ombined expressi
6a20: 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78 4e  on */.  int idxN
6a30: 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ew;            /
6a40: 2a 20 49 6e 64 65 78 20 69 6e 20 70 57 43 20 6f  * Index in pWC o
6a50: 66 20 74 68 65 20 6e 65 78 74 20 76 69 72 74 75  f the next virtu
6a60: 61 6c 20 74 65 72 6d 20 2a 2f 0a 0a 20 20 69 66  al term */..  if
6a70: 28 20 28 70 4f 6e 65 2d 3e 65 4f 70 65 72 61 74  ( (pOne->eOperat
6a80: 6f 72 20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f 4c  or & (WO_EQ|WO_L
6a90: 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c 57 4f  T|WO_LE|WO_GT|WO
6aa0: 5f 47 45 29 29 3d 3d 30 20 29 20 72 65 74 75 72  _GE))==0 ) retur
6ab0: 6e 3b 0a 20 20 69 66 28 20 28 70 54 77 6f 2d 3e  n;.  if( (pTwo->
6ac0: 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f  eOperator & (WO_
6ad0: 45 51 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57  EQ|WO_LT|WO_LE|W
6ae0: 4f 5f 47 54 7c 57 4f 5f 47 45 29 29 3d 3d 30 20  O_GT|WO_GE))==0 
6af0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
6b00: 28 65 4f 70 20 26 20 28 57 4f 5f 45 51 7c 57 4f  (eOp & (WO_EQ|WO
6b10: 5f 4c 54 7c 57 4f 5f 4c 45 29 29 21 3d 65 4f 70  _LT|WO_LE))!=eOp
6b20: 0a 20 20 20 26 26 20 28 65 4f 70 20 26 20 28 57  .   && (eOp & (W
6b30: 4f 5f 45 51 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45  O_EQ|WO_GT|WO_GE
6b40: 29 29 21 3d 65 4f 70 20 29 20 72 65 74 75 72 6e  ))!=eOp ) return
6b50: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 6e 65  ;.  assert( pOne
6b60: 2d 3e 70 45 78 70 72 2d 3e 70 4c 65 66 74 21 3d  ->pExpr->pLeft!=
6b70: 30 20 26 26 20 70 4f 6e 65 2d 3e 70 45 78 70 72  0 && pOne->pExpr
6b80: 2d 3e 70 52 69 67 68 74 21 3d 30 20 29 3b 0a 20  ->pRight!=0 );. 
6b90: 20 61 73 73 65 72 74 28 20 70 54 77 6f 2d 3e 70   assert( pTwo->p
6ba0: 45 78 70 72 2d 3e 70 4c 65 66 74 21 3d 30 20 26  Expr->pLeft!=0 &
6bb0: 26 20 70 54 77 6f 2d 3e 70 45 78 70 72 2d 3e 70  & pTwo->pExpr->p
6bc0: 52 69 67 68 74 21 3d 30 20 29 3b 0a 20 20 69 66  Right!=0 );.  if
6bd0: 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  ( sqlite3ExprCom
6be0: 70 61 72 65 28 70 4f 6e 65 2d 3e 70 45 78 70 72  pare(pOne->pExpr
6bf0: 2d 3e 70 4c 65 66 74 2c 20 70 54 77 6f 2d 3e 70  ->pLeft, pTwo->p
6c00: 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 2d 31 29  Expr->pLeft, -1)
6c10: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
6c20: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70   sqlite3ExprComp
6c30: 61 72 65 28 70 4f 6e 65 2d 3e 70 45 78 70 72 2d  are(pOne->pExpr-
6c40: 3e 70 52 69 67 68 74 2c 20 70 54 77 6f 2d 3e 70  >pRight, pTwo->p
6c50: 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 2d 31  Expr->pRight, -1
6c60: 29 20 29 72 65 74 75 72 6e 3b 0a 20 20 2f 2a 20  ) )return;.  /* 
6c70: 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73  If we reach this
6c80: 20 70 6f 69 6e 74 2c 20 69 74 20 6d 65 61 6e 73   point, it means
6c90: 20 74 68 65 20 74 77 6f 20 73 75 62 74 65 72 6d   the two subterm
6ca0: 73 20 63 61 6e 20 62 65 20 63 6f 6d 62 69 6e 65  s can be combine
6cb0: 64 20 2a 2f 0a 20 20 69 66 28 20 28 65 4f 70 20  d */.  if( (eOp 
6cc0: 26 20 28 65 4f 70 2d 31 29 29 21 3d 30 20 29 7b  & (eOp-1))!=0 ){
6cd0: 0a 20 20 20 20 69 66 28 20 65 4f 70 20 26 20 28  .    if( eOp & (
6ce0: 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 20 29 7b 0a  WO_LT|WO_LE) ){.
6cf0: 20 20 20 20 20 20 65 4f 70 20 3d 20 57 4f 5f 4c        eOp = WO_L
6d00: 45 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  E;.    }else{.  
6d10: 20 20 20 20 61 73 73 65 72 74 28 20 65 4f 70 20      assert( eOp 
6d20: 26 20 28 57 4f 5f 47 54 7c 57 4f 5f 47 45 29 20  & (WO_GT|WO_GE) 
6d30: 29 3b 0a 20 20 20 20 20 20 65 4f 70 20 3d 20 57  );.      eOp = W
6d40: 4f 5f 47 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  O_GE;.    }.  }.
6d50: 20 20 64 62 20 3d 20 70 57 43 2d 3e 70 57 49 6e    db = pWC->pWIn
6d60: 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a  fo->pParse->db;.
6d70: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
6d80: 45 78 70 72 44 75 70 28 64 62 2c 20 70 4f 6e 65  ExprDup(db, pOne
6d90: 2d 3e 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 69  ->pExpr, 0);.  i
6da0: 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74  f( pNew==0 ) ret
6db0: 75 72 6e 3b 0a 20 20 66 6f 72 28 6f 70 3d 54 4b  urn;.  for(op=TK
6dc0: 5f 45 51 3b 20 65 4f 70 21 3d 28 57 4f 5f 45 51  _EQ; eOp!=(WO_EQ
6dd0: 3c 3c 28 6f 70 2d 54 4b 5f 45 51 29 29 3b 20 6f  <<(op-TK_EQ)); o
6de0: 70 2b 2b 29 7b 20 61 73 73 65 72 74 28 20 6f 70  p++){ assert( op
6df0: 3c 54 4b 5f 47 45 20 29 3b 20 7d 0a 20 20 70 4e  <TK_GE ); }.  pN
6e00: 65 77 2d 3e 6f 70 20 3d 20 6f 70 3b 0a 20 20 69  ew->op = op;.  i
6e10: 64 78 4e 65 77 20 3d 20 77 68 65 72 65 43 6c 61  dxNew = whereCla
6e20: 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70  useInsert(pWC, p
6e30: 4e 65 77 2c 20 54 45 52 4d 5f 56 49 52 54 55 41  New, TERM_VIRTUA
6e40: 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b  L|TERM_DYNAMIC);
6e50: 0a 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 70  .  exprAnalyze(p
6e60: 53 72 63 2c 20 70 57 43 2c 20 69 64 78 4e 65 77  Src, pWC, idxNew
6e70: 29 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e  );.}..#if !defin
6e80: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f  ed(SQLITE_OMIT_O
6e90: 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 29 20  R_OPTIMIZATION) 
6ea0: 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
6eb0: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
6ec0: 29 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20  )./*.** Analyze 
6ed0: 61 20 74 65 72 6d 20 74 68 61 74 20 63 6f 6e 73  a term that cons
6ee0: 69 73 74 73 20 6f 66 20 74 77 6f 20 6f 72 20 6d  ists of two or m
6ef0: 6f 72 65 20 4f 52 2d 63 6f 6e 6e 65 63 74 65 64  ore OR-connected
6f00: 0a 2a 2a 20 73 75 62 74 65 72 6d 73 2e 20 20 53  .** subterms.  S
6f10: 6f 20 69 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  o in:.**.**     
6f20: 2e 2e 2e 20 57 48 45 52 45 20 20 28 61 3d 35 29  ... WHERE  (a=5)
6f30: 20 41 4e 44 20 28 62 3d 37 20 4f 52 20 63 3d 39   AND (b=7 OR c=9
6f40: 20 4f 52 20 64 3d 31 33 29 20 41 4e 44 20 28 64   OR d=13) AND (d
6f50: 3d 31 33 29 0a 2a 2a 20 20 20 20 20 20 20 20 20  =13).**         
6f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6f70: 20 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e   ^^^^^^^^^^^^^^^
6f80: 5e 5e 5e 5e 5e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ^^^^^.**.** This
6f90: 20 72 6f 75 74 69 6e 65 20 61 6e 61 6c 79 7a 65   routine analyze
6fa0: 73 20 74 65 72 6d 73 20 73 75 63 68 20 61 73 20  s terms such as 
6fb0: 74 68 65 20 6d 69 64 64 6c 65 20 74 65 72 6d 20  the middle term 
6fc0: 69 6e 20 74 68 65 20 61 62 6f 76 65 20 65 78 61  in the above exa
6fd0: 6d 70 6c 65 2e 0a 2a 2a 20 41 20 57 68 65 72 65  mple..** A Where
6fe0: 4f 72 54 65 72 6d 20 6f 62 6a 65 63 74 20 69 73  OrTerm object is
6ff0: 20 63 6f 6d 70 75 74 65 64 20 61 6e 64 20 61 74   computed and at
7000: 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 74 65  tached to the te
7010: 72 6d 20 75 6e 64 65 72 0a 2a 2a 20 61 6e 61 6c  rm under.** anal
7020: 79 73 69 73 2c 20 72 65 67 61 72 64 6c 65 73 73  ysis, regardless
7030: 20 6f 66 20 74 68 65 20 6f 75 74 63 6f 6d 65 20   of the outcome 
7040: 6f 66 20 74 68 65 20 61 6e 61 6c 79 73 69 73 2e  of the analysis.
7050: 20 20 48 65 6e 63 65 3a 0a 2a 2a 0a 2a 2a 20 20    Hence:.**.**  
7060: 20 20 20 57 68 65 72 65 54 65 72 6d 2e 77 74 46     WhereTerm.wtF
7070: 6c 61 67 73 20 20 20 7c 3d 20 20 54 45 52 4d 5f  lags   |=  TERM_
7080: 4f 52 49 4e 46 4f 0a 2a 2a 20 20 20 20 20 57 68  ORINFO.**     Wh
7090: 65 72 65 54 65 72 6d 2e 75 2e 70 4f 72 49 6e 66  ereTerm.u.pOrInf
70a0: 6f 20 20 3d 20 20 61 20 64 79 6e 61 6d 69 63 61  o  =  a dynamica
70b0: 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 57 68  lly allocated Wh
70c0: 65 72 65 4f 72 54 65 72 6d 20 6f 62 6a 65 63 74  ereOrTerm object
70d0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 65 72 6d 20  .**.** The term 
70e0: 62 65 69 6e 67 20 61 6e 61 6c 79 7a 65 64 20 6d  being analyzed m
70f0: 75 73 74 20 68 61 76 65 20 74 77 6f 20 6f 72 20  ust have two or 
7100: 6d 6f 72 65 20 6f 66 20 4f 52 2d 63 6f 6e 6e 65  more of OR-conne
7110: 63 74 65 64 20 73 75 62 74 65 72 6d 73 2e 0a 2a  cted subterms..*
7120: 2a 20 41 20 73 69 6e 67 6c 65 20 73 75 62 74 65  * A single subte
7130: 72 6d 20 6d 69 67 68 74 20 62 65 20 61 20 73 65  rm might be a se
7140: 74 20 6f 66 20 41 4e 44 2d 63 6f 6e 6e 65 63 74  t of AND-connect
7150: 65 64 20 73 75 62 2d 73 75 62 74 65 72 6d 73 2e  ed sub-subterms.
7160: 0a 2a 2a 20 45 78 61 6d 70 6c 65 73 20 6f 66 20  .** Examples of 
7170: 74 65 72 6d 73 20 75 6e 64 65 72 20 61 6e 61 6c  terms under anal
7180: 79 73 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ysis:.**.**     
7190: 28 41 29 20 20 20 20 20 74 31 2e 78 3d 74 32 2e  (A)     t1.x=t2.
71a0: 79 20 4f 52 20 74 31 2e 78 3d 74 32 2e 7a 20 4f  y OR t1.x=t2.z O
71b0: 52 20 74 31 2e 79 3d 31 35 20 4f 52 20 74 31 2e  R t1.y=15 OR t1.
71c0: 7a 3d 74 33 2e 61 2b 35 0a 2a 2a 20 20 20 20 20  z=t3.a+5.**     
71d0: 28 42 29 20 20 20 20 20 78 3d 65 78 70 72 31 20  (B)     x=expr1 
71e0: 4f 52 20 65 78 70 72 32 3d 78 20 4f 52 20 78 3d  OR expr2=x OR x=
71f0: 65 78 70 72 33 0a 2a 2a 20 20 20 20 20 28 43 29  expr3.**     (C)
7200: 20 20 20 20 20 74 31 2e 78 3d 74 32 2e 79 20 4f       t1.x=t2.y O
7210: 52 20 28 74 31 2e 78 3d 74 32 2e 7a 20 41 4e 44  R (t1.x=t2.z AND
7220: 20 74 31 2e 79 3d 31 35 29 0a 2a 2a 20 20 20 20   t1.y=15).**    
7230: 20 28 44 29 20 20 20 20 20 78 3d 65 78 70 72 31   (D)     x=expr1
7240: 20 4f 52 20 28 79 3e 31 31 20 41 4e 44 20 79 3c   OR (y>11 AND y<
7250: 32 32 20 41 4e 44 20 7a 20 4c 49 4b 45 20 27 2a  22 AND z LIKE '*
7260: 68 65 6c 6c 6f 2a 27 29 0a 2a 2a 20 20 20 20 20  hello*').**     
7270: 28 45 29 20 20 20 20 20 28 70 2e 61 3d 31 20 41  (E)     (p.a=1 A
7280: 4e 44 20 71 2e 62 3d 32 20 41 4e 44 20 72 2e 63  ND q.b=2 AND r.c
7290: 3d 33 29 20 4f 52 20 28 70 2e 78 3d 34 20 41 4e  =3) OR (p.x=4 AN
72a0: 44 20 71 2e 79 3d 35 20 41 4e 44 20 72 2e 7a 3d  D q.y=5 AND r.z=
72b0: 36 29 0a 2a 2a 20 20 20 20 20 28 46 29 20 20 20  6).**     (F)   
72c0: 20 20 78 3e 41 20 4f 52 20 28 78 3d 41 20 41 4e    x>A OR (x=A AN
72d0: 44 20 79 3e 3d 42 29 0a 2a 2a 0a 2a 2a 20 43 41  D y>=B).**.** CA
72e0: 53 45 20 31 3a 0a 2a 2a 0a 2a 2a 20 49 66 20 61  SE 1:.**.** If a
72f0: 6c 6c 20 73 75 62 74 65 72 6d 73 20 61 72 65 20  ll subterms are 
7300: 6f 66 20 74 68 65 20 66 6f 72 6d 20 54 2e 43 3d  of the form T.C=
7310: 65 78 70 72 20 66 6f 72 20 73 6f 6d 65 20 73 69  expr for some si
7320: 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 43  ngle column of C
7330: 20 61 6e 64 0a 2a 2a 20 61 20 73 69 6e 67 6c 65   and.** a single
7340: 20 74 61 62 6c 65 20 54 20 28 61 73 20 73 68 6f   table T (as sho
7350: 77 6e 20 69 6e 20 65 78 61 6d 70 6c 65 20 42 20  wn in example B 
7360: 61 62 6f 76 65 29 20 74 68 65 6e 20 63 72 65 61  above) then crea
7370: 74 65 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c  te a new virtual
7380: 0a 2a 2a 20 74 65 72 6d 20 74 68 61 74 20 69 73  .** term that is
7390: 20 61 6e 20 65 71 75 69 76 61 6c 65 6e 74 20 49   an equivalent I
73a0: 4e 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 49  N expression.  I
73b0: 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69  n other words, i
73c0: 66 20 74 68 65 20 74 65 72 6d 0a 2a 2a 20 62 65  f the term.** be
73d0: 69 6e 67 20 61 6e 61 6c 79 7a 65 64 20 69 73 3a  ing analyzed is:
73e0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 78 20 3d 20  .**.**      x = 
73f0: 65 78 70 72 31 20 20 4f 52 20 20 65 78 70 72 32  expr1  OR  expr2
7400: 20 3d 20 78 20 20 4f 52 20 20 78 20 3d 20 65 78   = x  OR  x = ex
7410: 70 72 33 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 63  pr3.**.** then c
7420: 72 65 61 74 65 20 61 20 6e 65 77 20 76 69 72 74  reate a new virt
7430: 75 61 6c 20 74 65 72 6d 20 6c 69 6b 65 20 74 68  ual term like th
7440: 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 78  is:.**.**      x
7450: 20 49 4e 20 28 65 78 70 72 31 2c 65 78 70 72 32   IN (expr1,expr2
7460: 2c 65 78 70 72 33 29 0a 2a 2a 0a 2a 2a 20 43 41  ,expr3).**.** CA
7470: 53 45 20 32 3a 0a 2a 2a 0a 2a 2a 20 49 66 20 74  SE 2:.**.** If t
7480: 68 65 72 65 20 69 73 20 61 20 74 77 6f 2d 77 61  here is a two-wa
7490: 79 20 4f 52 20 61 6e 64 20 6f 6e 65 20 73 69 64  y OR and one sid
74a0: 65 20 68 61 73 20 78 3e 41 20 61 6e 64 20 74 68  e has x>A and th
74b0: 65 20 6f 74 68 65 72 20 73 69 64 65 0a 2a 2a 20  e other side.** 
74c0: 68 61 73 20 78 3d 41 20 28 66 6f 72 20 74 68 65  has x=A (for the
74d0: 20 73 61 6d 65 20 78 20 61 6e 64 20 41 29 20 74   same x and A) t
74e0: 68 65 6e 20 61 64 64 20 61 20 6e 65 77 20 76 69  hen add a new vi
74f0: 72 74 75 61 6c 20 74 65 72 6d 20 74 6f 20 74 68  rtual term to th
7500: 65 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73  e.** WHERE claus
7510: 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 78  e of the form "x
7520: 3e 3d 41 22 2e 0a 2a 2a 0a 2a 2a 20 43 41 53 45  >=A"..**.** CASE
7530: 20 33 3a 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6c 6c   3:.**.** If all
7540: 20 73 75 62 74 65 72 6d 73 20 61 72 65 20 69 6e   subterms are in
7550: 64 65 78 61 62 6c 65 20 62 79 20 61 20 73 69 6e  dexable by a sin
7560: 67 6c 65 20 74 61 62 6c 65 20 54 2c 20 74 68 65  gle table T, the
7570: 6e 20 73 65 74 0a 2a 2a 0a 2a 2a 20 20 20 20 20  n set.**.**     
7580: 57 68 65 72 65 54 65 72 6d 2e 65 4f 70 65 72 61  WhereTerm.eOpera
7590: 74 6f 72 20 20 20 20 20 20 20 20 20 20 20 20 20  tor             
75a0: 20 3d 20 20 57 4f 5f 4f 52 0a 2a 2a 20 20 20 20   =  WO_OR.**    
75b0: 20 57 68 65 72 65 54 65 72 6d 2e 75 2e 70 4f 72   WhereTerm.u.pOr
75c0: 49 6e 66 6f 2d 3e 69 6e 64 65 78 61 62 6c 65 20  Info->indexable 
75d0: 20 7c 3d 20 20 74 68 65 20 63 75 72 73 6f 72 20   |=  the cursor 
75e0: 6e 75 6d 62 65 72 20 66 6f 72 20 74 61 62 6c 65  number for table
75f0: 20 54 0a 2a 2a 0a 2a 2a 20 41 20 73 75 62 74 65   T.**.** A subte
7600: 72 6d 20 69 73 20 22 69 6e 64 65 78 61 62 6c 65  rm is "indexable
7610: 22 20 69 66 20 69 74 20 69 73 20 6f 66 20 74 68  " if it is of th
7620: 65 20 66 6f 72 6d 0a 2a 2a 20 22 54 2e 43 20 3c  e form.** "T.C <
7630: 6f 70 3e 20 3c 65 78 70 72 3e 22 20 77 68 65 72  op> <expr>" wher
7640: 65 20 43 20 69 73 20 61 6e 79 20 63 6f 6c 75 6d  e C is any colum
7650: 6e 20 6f 66 20 74 61 62 6c 65 20 54 20 61 6e 64  n of table T and
7660: 20 0a 2a 2a 20 3c 6f 70 3e 20 69 73 20 6f 6e 65   .** <op> is one
7670: 20 6f 66 20 22 3d 22 2c 20 22 3c 22 2c 20 22 3c   of "=", "<", "<
7680: 3d 22 2c 20 22 3e 22 2c 20 22 3e 3d 22 2c 20 22  =", ">", ">=", "
7690: 49 53 20 4e 55 4c 4c 22 2c 20 6f 72 20 22 49 4e  IS NULL", or "IN
76a0: 22 2e 0a 2a 2a 20 41 20 73 75 62 74 65 72 6d 20  "..** A subterm 
76b0: 69 73 20 61 6c 73 6f 20 69 6e 64 65 78 61 62 6c  is also indexabl
76c0: 65 20 69 66 20 69 74 20 69 73 20 61 6e 20 41 4e  e if it is an AN
76d0: 44 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65  D of two or more
76e0: 0a 2a 2a 20 73 75 62 73 75 62 74 65 72 6d 73 20  .** subsubterms 
76f0: 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 66 20  at least one of 
7700: 77 68 69 63 68 20 69 73 20 69 6e 64 65 78 61 62  which is indexab
7710: 6c 65 2e 20 20 49 6e 64 65 78 61 62 6c 65 20 41  le.  Indexable A
7720: 4e 44 20 0a 2a 2a 20 73 75 62 74 65 72 6d 73 20  ND .** subterms 
7730: 68 61 76 65 20 74 68 65 69 72 20 65 4f 70 65 72  have their eOper
7740: 61 74 6f 72 20 73 65 74 20 74 6f 20 57 4f 5f 41  ator set to WO_A
7750: 4e 44 20 61 6e 64 20 74 68 65 79 20 68 61 76 65  ND and they have
7760: 0a 2a 2a 20 75 2e 70 41 6e 64 49 6e 66 6f 20 73  .** u.pAndInfo s
7770: 65 74 20 74 6f 20 61 20 64 79 6e 61 6d 69 63 61  et to a dynamica
7780: 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 57 68  lly allocated Wh
7790: 65 72 65 41 6e 64 54 65 72 6d 20 6f 62 6a 65 63  ereAndTerm objec
77a0: 74 2e 0a 2a 2a 0a 2a 2a 20 46 72 6f 6d 20 61 6e  t..**.** From an
77b0: 6f 74 68 65 72 20 70 6f 69 6e 74 20 6f 66 20 76  other point of v
77c0: 69 65 77 2c 20 22 69 6e 64 65 78 61 62 6c 65 22  iew, "indexable"
77d0: 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
77e0: 73 75 62 74 65 72 6d 20 63 6f 75 6c 64 0a 2a 2a  subterm could.**
77f0: 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20 62 65 20   potentially be 
7800: 75 73 65 64 20 77 69 74 68 20 61 6e 20 69 6e 64  used with an ind
7810: 65 78 20 69 66 20 61 6e 20 61 70 70 72 6f 70 72  ex if an appropr
7820: 69 61 74 65 20 69 6e 64 65 78 20 65 78 69 73 74  iate index exist
7830: 73 2e 0a 2a 2a 20 54 68 69 73 20 61 6e 61 6c 79  s..** This analy
7840: 73 69 73 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e  sis does not con
7850: 73 69 64 65 72 20 77 68 65 74 68 65 72 20 6f 72  sider whether or
7860: 20 6e 6f 74 20 74 68 65 20 69 6e 64 65 78 20 65   not the index e
7870: 78 69 73 74 73 3b 20 74 68 61 74 0a 2a 2a 20 69  xists; that.** i
7880: 73 20 64 65 63 69 64 65 64 20 65 6c 73 65 77 68  s decided elsewh
7890: 65 72 65 2e 20 20 54 68 69 73 20 61 6e 61 6c 79  ere.  This analy
78a0: 73 69 73 20 6f 6e 6c 79 20 6c 6f 6f 6b 73 20 61  sis only looks a
78b0: 74 20 77 68 65 74 68 65 72 20 73 75 62 74 65 72  t whether subter
78c0: 6d 73 0a 2a 2a 20 61 70 70 72 6f 70 72 69 61 74  ms.** appropriat
78d0: 65 20 66 6f 72 20 69 6e 64 65 78 69 6e 67 20 65  e for indexing e
78e0: 78 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20  xist..**.** All 
78f0: 65 78 61 6d 70 6c 65 73 20 41 20 74 68 72 6f 75  examples A throu
7900: 67 68 20 45 20 61 62 6f 76 65 20 73 61 74 69 73  gh E above satis
7910: 66 79 20 63 61 73 65 20 32 2e 20 20 42 75 74 20  fy case 2.  But 
7920: 69 66 20 61 20 74 65 72 6d 0a 2a 2a 20 61 6c 73  if a term.** als
7930: 6f 20 73 61 74 69 73 66 69 65 73 20 63 61 73 65  o satisfies case
7940: 20 31 20 28 73 75 63 68 20 61 73 20 42 29 20 77   1 (such as B) w
7950: 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20  e know that the 
7960: 6f 70 74 69 6d 69 7a 65 72 20 77 69 6c 6c 0a 2a  optimizer will.*
7970: 2a 20 61 6c 77 61 79 73 20 70 72 65 66 65 72 20  * always prefer 
7980: 63 61 73 65 20 31 2c 20 73 6f 20 69 6e 20 74 68  case 1, so in th
7990: 61 74 20 63 61 73 65 20 77 65 20 70 72 65 74 65  at case we prete
79a0: 6e 64 20 74 68 61 74 20 63 61 73 65 20 32 20 69  nd that case 2 i
79b0: 73 20 6e 6f 74 0a 2a 2a 20 73 61 74 69 73 66 69  s not.** satisfi
79c0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 6d 69 67  ed..**.** It mig
79d0: 68 74 20 62 65 20 74 68 65 20 63 61 73 65 20 74  ht be the case t
79e0: 68 61 74 20 6d 75 6c 74 69 70 6c 65 20 74 61 62  hat multiple tab
79f0: 6c 65 73 20 61 72 65 20 69 6e 64 65 78 61 62 6c  les are indexabl
7a00: 65 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  e.  For example,
7a10: 0a 2a 2a 20 28 45 29 20 61 62 6f 76 65 20 69 73  .** (E) above is
7a20: 20 69 6e 64 65 78 61 62 6c 65 20 6f 6e 20 74 61   indexable on ta
7a30: 62 6c 65 73 20 50 2c 20 51 2c 20 61 6e 64 20 52  bles P, Q, and R
7a40: 2e 0a 2a 2a 0a 2a 2a 20 54 65 72 6d 73 20 74 68  ..**.** Terms th
7a50: 61 74 20 73 61 74 69 73 66 79 20 63 61 73 65 20  at satisfy case 
7a60: 32 20 61 72 65 20 63 61 6e 64 69 64 61 74 65 73  2 are candidates
7a70: 20 66 6f 72 20 6c 6f 6f 6b 75 70 20 62 79 20 75   for lookup by u
7a80: 73 69 6e 67 0a 2a 2a 20 73 65 70 61 72 61 74 65  sing.** separate
7a90: 20 69 6e 64 69 63 65 73 20 74 6f 20 66 69 6e 64   indices to find
7aa0: 20 72 6f 77 69 64 73 20 66 6f 72 20 65 61 63 68   rowids for each
7ab0: 20 73 75 62 74 65 72 6d 20 61 6e 64 20 63 6f 6d   subterm and com
7ac0: 70 6f 73 69 6e 67 0a 2a 2a 20 74 68 65 20 75 6e  posing.** the un
7ad0: 69 6f 6e 20 6f 66 20 61 6c 6c 20 72 6f 77 69 64  ion of all rowid
7ae0: 73 20 75 73 69 6e 67 20 61 20 52 6f 77 53 65 74  s using a RowSet
7af0: 20 6f 62 6a 65 63 74 2e 20 20 54 68 69 73 20 69   object.  This i
7b00: 73 20 73 69 6d 69 6c 61 72 0a 2a 2a 20 74 6f 20  s similar.** to 
7b10: 22 62 69 74 6d 61 70 20 69 6e 64 69 63 65 73 22  "bitmap indices"
7b20: 20 69 6e 20 6f 74 68 65 72 20 64 61 74 61 62 61   in other databa
7b30: 73 65 20 65 6e 67 69 6e 65 73 2e 0a 2a 2a 0a 2a  se engines..**.*
7b40: 2a 20 4f 54 48 45 52 57 49 53 45 3a 0a 2a 2a 0a  * OTHERWISE:.**.
7b50: 2a 2a 20 49 66 20 6e 65 69 74 68 65 72 20 63 61  ** If neither ca
7b60: 73 65 20 31 20 6e 6f 72 20 63 61 73 65 20 32 20  se 1 nor case 2 
7b70: 61 70 70 6c 79 2c 20 74 68 65 6e 20 6c 65 61 76  apply, then leav
7b80: 65 20 74 68 65 20 65 4f 70 65 72 61 74 6f 72 20  e the eOperator 
7b90: 73 65 74 20 74 6f 0a 2a 2a 20 7a 65 72 6f 2e 20  set to.** zero. 
7ba0: 20 54 68 69 73 20 74 65 72 6d 20 69 73 20 6e 6f   This term is no
7bb0: 74 20 75 73 65 66 75 6c 20 66 6f 72 20 73 65 61  t useful for sea
7bc0: 72 63 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  rch..*/.static v
7bd0: 6f 69 64 20 65 78 70 72 41 6e 61 6c 79 7a 65 4f  oid exprAnalyzeO
7be0: 72 54 65 72 6d 28 0a 20 20 53 72 63 4c 69 73 74  rTerm(.  SrcList
7bf0: 20 2a 70 53 72 63 2c 20 20 20 20 20 20 20 20 20   *pSrc,         
7c00: 20 20 20 2f 2a 20 74 68 65 20 46 52 4f 4d 20 63     /* the FROM c
7c10: 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65  lause */.  Where
7c20: 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20  Clause *pWC,    
7c30: 20 20 20 20 20 2f 2a 20 74 68 65 20 63 6f 6d 70       /* the comp
7c40: 6c 65 74 65 20 57 48 45 52 45 20 63 6c 61 75 73  lete WHERE claus
7c50: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78 54 65  e */.  int idxTe
7c60: 72 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20  rm              
7c70: 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65   /* Index of the
7c80: 20 4f 52 2d 74 65 72 6d 20 74 6f 20 62 65 20 61   OR-term to be a
7c90: 6e 61 6c 79 7a 65 64 20 2a 2f 0a 29 7b 0a 20 20  nalyzed */.){.  
7ca0: 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
7cb0: 6f 20 3d 20 70 57 43 2d 3e 70 57 49 6e 66 6f 3b  o = pWC->pWInfo;
7cc0: 20 20 20 20 20 20 20 20 2f 2a 20 57 48 45 52 45          /* WHERE
7cd0: 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69   clause processi
7ce0: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
7cf0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20  Parse *pParse = 
7d00: 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 20  pWInfo->pParse; 
7d10: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65          /* Parse
7d20: 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73  r context */.  s
7d30: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
7d40: 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 20 20 20  rse->db;        
7d50: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
7d60: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
7d70: 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
7d80: 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64  erm = &pWC->a[id
7d90: 78 54 65 72 6d 5d 3b 20 20 20 20 2f 2a 20 54 68  xTerm];    /* Th
7da0: 65 20 74 65 72 6d 20 74 6f 20 62 65 20 61 6e 61  e term to be ana
7db0: 6c 79 7a 65 64 20 2a 2f 0a 20 20 45 78 70 72 20  lyzed */.  Expr 
7dc0: 2a 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e  *pExpr = pTerm->
7dd0: 70 45 78 70 72 3b 20 20 20 20 20 20 20 20 20 20  pExpr;          
7de0: 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73     /* The expres
7df0: 73 69 6f 6e 20 6f 66 20 74 68 65 20 74 65 72 6d  sion of the term
7e00: 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20   */.  int i;    
7e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7e30: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a   Loop counters *
7e40: 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  /.  WhereClause 
7e50: 2a 70 4f 72 57 63 3b 20 20 20 20 20 20 20 2f 2a  *pOrWc;       /*
7e60: 20 42 72 65 61 6b 75 70 20 6f 66 20 70 54 65 72   Breakup of pTer
7e70: 6d 20 69 6e 74 6f 20 73 75 62 74 65 72 6d 73 20  m into subterms 
7e80: 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  */.  WhereTerm *
7e90: 70 4f 72 54 65 72 6d 3b 20 20 20 20 20 20 20 2f  pOrTerm;       /
7ea0: 2a 20 41 20 53 75 62 2d 74 65 72 6d 20 77 69 74  * A Sub-term wit
7eb0: 68 69 6e 20 74 68 65 20 70 4f 72 57 63 20 2a 2f  hin the pOrWc */
7ec0: 0a 20 20 57 68 65 72 65 4f 72 49 6e 66 6f 20 2a  .  WhereOrInfo *
7ed0: 70 4f 72 49 6e 66 6f 3b 20 20 20 20 20 2f 2a 20  pOrInfo;     /* 
7ee0: 41 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  Additional infor
7ef0: 6d 61 74 69 6f 6e 20 61 73 73 6f 63 69 61 74 65  mation associate
7f00: 64 20 77 69 74 68 20 70 54 65 72 6d 20 2a 2f 0a  d with pTerm */.
7f10: 20 20 42 69 74 6d 61 73 6b 20 63 68 6e 67 54 6f    Bitmask chngTo
7f20: 49 4e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54  IN;         /* T
7f30: 61 62 6c 65 73 20 74 68 61 74 20 6d 69 67 68 74  ables that might
7f40: 20 73 61 74 69 73 66 79 20 63 61 73 65 20 31 20   satisfy case 1 
7f50: 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 69 6e 64  */.  Bitmask ind
7f60: 65 78 61 62 6c 65 3b 20 20 20 20 20 20 20 20 2f  exable;        /
7f70: 2a 20 54 61 62 6c 65 73 20 74 68 61 74 20 61 72  * Tables that ar
7f80: 65 20 69 6e 64 65 78 61 62 6c 65 2c 20 73 61 74  e indexable, sat
7f90: 69 73 66 79 69 6e 67 20 63 61 73 65 20 32 20 2a  isfying case 2 *
7fa0: 2f 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 42 72 65  /..  /*.  ** Bre
7fb0: 61 6b 20 74 68 65 20 4f 52 20 63 6c 61 75 73 65  ak the OR clause
7fc0: 20 69 6e 74 6f 20 69 74 73 20 73 65 70 61 72 61   into its separa
7fd0: 74 65 20 73 75 62 74 65 72 6d 73 2e 20 20 54 68  te subterms.  Th
7fe0: 65 20 73 75 62 74 65 72 6d 73 20 61 72 65 0a 20  e subterms are. 
7ff0: 20 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 61 20   ** stored in a 
8000: 57 68 65 72 65 43 6c 61 75 73 65 20 73 74 72 75  WhereClause stru
8010: 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 69 6e 67  cture containing
8020: 20 77 69 74 68 69 6e 20 74 68 65 20 57 68 65 72   within the Wher
8030: 65 4f 72 49 6e 66 6f 0a 20 20 2a 2a 20 6f 62 6a  eOrInfo.  ** obj
8040: 65 63 74 20 74 68 61 74 20 69 73 20 61 74 74 61  ect that is atta
8050: 63 68 65 64 20 74 6f 20 74 68 65 20 6f 72 69 67  ched to the orig
8060: 69 6e 61 6c 20 4f 52 20 63 6c 61 75 73 65 20 74  inal OR clause t
8070: 65 72 6d 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  erm..  */.  asse
8080: 72 74 28 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c  rt( (pTerm->wtFl
8090: 61 67 73 20 26 20 28 54 45 52 4d 5f 44 59 4e 41  ags & (TERM_DYNA
80a0: 4d 49 43 7c 54 45 52 4d 5f 4f 52 49 4e 46 4f 7c  MIC|TERM_ORINFO|
80b0: 54 45 52 4d 5f 41 4e 44 49 4e 46 4f 29 29 3d 3d  TERM_ANDINFO))==
80c0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
80d0: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52 20  Expr->op==TK_OR 
80e0: 29 3b 0a 20 20 70 54 65 72 6d 2d 3e 75 2e 70 4f  );.  pTerm->u.pO
80f0: 72 49 6e 66 6f 20 3d 20 70 4f 72 49 6e 66 6f 20  rInfo = pOrInfo 
8100: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
8110: 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66  cZero(db, sizeof
8120: 28 2a 70 4f 72 49 6e 66 6f 29 29 3b 0a 20 20 69  (*pOrInfo));.  i
8130: 66 28 20 70 4f 72 49 6e 66 6f 3d 3d 30 20 29 20  f( pOrInfo==0 ) 
8140: 72 65 74 75 72 6e 3b 0a 20 20 70 54 65 72 6d 2d  return;.  pTerm-
8150: 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d  >wtFlags |= TERM
8160: 5f 4f 52 49 4e 46 4f 3b 0a 20 20 70 4f 72 57 63  _ORINFO;.  pOrWc
8170: 20 3d 20 26 70 4f 72 49 6e 66 6f 2d 3e 77 63 3b   = &pOrInfo->wc;
8180: 0a 20 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e  .  whereClauseIn
8190: 69 74 28 70 4f 72 57 63 2c 20 70 57 49 6e 66 6f  it(pOrWc, pWInfo
81a0: 29 3b 0a 20 20 77 68 65 72 65 53 70 6c 69 74 28  );.  whereSplit(
81b0: 70 4f 72 57 63 2c 20 70 45 78 70 72 2c 20 54 4b  pOrWc, pExpr, TK
81c0: 5f 4f 52 29 3b 0a 20 20 65 78 70 72 41 6e 61 6c  _OR);.  exprAnal
81d0: 79 7a 65 41 6c 6c 28 70 53 72 63 2c 20 70 4f 72  yzeAll(pSrc, pOr
81e0: 57 63 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d  Wc);.  if( db->m
81f0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65  allocFailed ) re
8200: 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20  turn;.  assert( 
8210: 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 3e 3d 32 20  pOrWc->nTerm>=2 
8220: 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 43 6f  );..  /*.  ** Co
8230: 6d 70 75 74 65 20 74 68 65 20 73 65 74 20 6f 66  mpute the set of
8240: 20 74 61 62 6c 65 73 20 74 68 61 74 20 6d 69 67   tables that mig
8250: 68 74 20 73 61 74 69 73 66 79 20 63 61 73 65 73  ht satisfy cases
8260: 20 31 20 6f 72 20 32 2e 0a 20 20 2a 2f 0a 20 20   1 or 2..  */.  
8270: 69 6e 64 65 78 61 62 6c 65 20 3d 20 7e 28 42 69  indexable = ~(Bi
8280: 74 6d 61 73 6b 29 30 3b 0a 20 20 63 68 6e 67 54  tmask)0;.  chngT
8290: 6f 49 4e 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29  oIN = ~(Bitmask)
82a0: 30 3b 0a 20 20 66 6f 72 28 69 3d 70 4f 72 57 63  0;.  for(i=pOrWc
82b0: 2d 3e 6e 54 65 72 6d 2d 31 2c 20 70 4f 72 54 65  ->nTerm-1, pOrTe
82c0: 72 6d 3d 70 4f 72 57 63 2d 3e 61 3b 20 69 3e 3d  rm=pOrWc->a; i>=
82d0: 30 20 26 26 20 69 6e 64 65 78 61 62 6c 65 3b 20  0 && indexable; 
82e0: 69 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b 29 7b  i--, pOrTerm++){
82f0: 0a 20 20 20 20 69 66 28 20 28 70 4f 72 54 65 72  .    if( (pOrTer
8300: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
8310: 4f 5f 53 49 4e 47 4c 45 29 3d 3d 30 20 29 7b 0a  O_SINGLE)==0 ){.
8320: 20 20 20 20 20 20 57 68 65 72 65 41 6e 64 49 6e        WhereAndIn
8330: 66 6f 20 2a 70 41 6e 64 49 6e 66 6f 3b 0a 20 20  fo *pAndInfo;.  
8340: 20 20 20 20 61 73 73 65 72 74 28 20 28 70 4f 72      assert( (pOr
8350: 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
8360: 28 54 45 52 4d 5f 41 4e 44 49 4e 46 4f 7c 54 45  (TERM_ANDINFO|TE
8370: 52 4d 5f 4f 52 49 4e 46 4f 29 29 3d 3d 30 20 29  RM_ORINFO))==0 )
8380: 3b 0a 20 20 20 20 20 20 63 68 6e 67 54 6f 49 4e  ;.      chngToIN
8390: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 41 6e 64   = 0;.      pAnd
83a0: 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62  Info = sqlite3Db
83b0: 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69  MallocRaw(db, si
83c0: 7a 65 6f 66 28 2a 70 41 6e 64 49 6e 66 6f 29 29  zeof(*pAndInfo))
83d0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 41 6e 64  ;.      if( pAnd
83e0: 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 20 20  Info ){.        
83f0: 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 41 6e  WhereClause *pAn
8400: 64 57 43 3b 0a 20 20 20 20 20 20 20 20 57 68 65  dWC;.        Whe
8410: 72 65 54 65 72 6d 20 2a 70 41 6e 64 54 65 72 6d  reTerm *pAndTerm
8420: 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b  ;.        int j;
8430: 0a 20 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b  .        Bitmask
8440: 20 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20   b = 0;.        
8450: 70 4f 72 54 65 72 6d 2d 3e 75 2e 70 41 6e 64 49  pOrTerm->u.pAndI
8460: 6e 66 6f 20 3d 20 70 41 6e 64 49 6e 66 6f 3b 0a  nfo = pAndInfo;.
8470: 20 20 20 20 20 20 20 20 70 4f 72 54 65 72 6d 2d          pOrTerm-
8480: 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d  >wtFlags |= TERM
8490: 5f 41 4e 44 49 4e 46 4f 3b 0a 20 20 20 20 20 20  _ANDINFO;.      
84a0: 20 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72    pOrTerm->eOper
84b0: 61 74 6f 72 20 3d 20 57 4f 5f 41 4e 44 3b 0a 20  ator = WO_AND;. 
84c0: 20 20 20 20 20 20 20 70 41 6e 64 57 43 20 3d 20         pAndWC = 
84d0: 26 70 41 6e 64 49 6e 66 6f 2d 3e 77 63 3b 0a 20  &pAndInfo->wc;. 
84e0: 20 20 20 20 20 20 20 77 68 65 72 65 43 6c 61 75         whereClau
84f0: 73 65 49 6e 69 74 28 70 41 6e 64 57 43 2c 20 70  seInit(pAndWC, p
8500: 57 43 2d 3e 70 57 49 6e 66 6f 29 3b 0a 20 20 20  WC->pWInfo);.   
8510: 20 20 20 20 20 77 68 65 72 65 53 70 6c 69 74 28       whereSplit(
8520: 70 41 6e 64 57 43 2c 20 70 4f 72 54 65 72 6d 2d  pAndWC, pOrTerm-
8530: 3e 70 45 78 70 72 2c 20 54 4b 5f 41 4e 44 29 3b  >pExpr, TK_AND);
8540: 0a 20 20 20 20 20 20 20 20 65 78 70 72 41 6e 61  .        exprAna
8550: 6c 79 7a 65 41 6c 6c 28 70 53 72 63 2c 20 70 41  lyzeAll(pSrc, pA
8560: 6e 64 57 43 29 3b 0a 20 20 20 20 20 20 20 20 70  ndWC);.        p
8570: 41 6e 64 57 43 2d 3e 70 4f 75 74 65 72 20 3d 20  AndWC->pOuter = 
8580: 70 57 43 3b 0a 20 20 20 20 20 20 20 20 74 65 73  pWC;.        tes
8590: 74 63 61 73 65 28 20 64 62 2d 3e 6d 61 6c 6c 6f  tcase( db->mallo
85a0: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20  cFailed );.     
85b0: 20 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c     if( !db->mall
85c0: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
85d0: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70        for(j=0, p
85e0: 41 6e 64 54 65 72 6d 3d 70 41 6e 64 57 43 2d 3e  AndTerm=pAndWC->
85f0: 61 3b 20 6a 3c 70 41 6e 64 57 43 2d 3e 6e 54 65  a; j<pAndWC->nTe
8600: 72 6d 3b 20 6a 2b 2b 2c 20 70 41 6e 64 54 65 72  rm; j++, pAndTer
8610: 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  m++){.          
8620: 20 20 61 73 73 65 72 74 28 20 70 41 6e 64 54 65    assert( pAndTe
8630: 72 6d 2d 3e 70 45 78 70 72 20 29 3b 0a 20 20 20  rm->pExpr );.   
8640: 20 20 20 20 20 20 20 20 20 69 66 28 20 61 6c 6c           if( all
8650: 6f 77 65 64 4f 70 28 70 41 6e 64 54 65 72 6d 2d  owedOp(pAndTerm-
8660: 3e 70 45 78 70 72 2d 3e 6f 70 29 20 29 7b 0a 20  >pExpr->op) ){. 
8670: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 20 7c               b |
8680: 3d 20 67 65 74 4d 61 73 6b 28 26 70 57 49 6e 66  = getMask(&pWInf
8690: 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 70 41 6e  o->sMaskSet, pAn
86a0: 64 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  dTerm->leftCurso
86b0: 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  r);.            
86c0: 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
86d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
86e0: 69 6e 64 65 78 61 62 6c 65 20 26 3d 20 62 3b 0a  indexable &= b;.
86f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
8700: 65 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 77  e if( pOrTerm->w
8710: 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f  tFlags & TERM_CO
8720: 50 49 45 44 20 29 7b 0a 20 20 20 20 20 20 2f 2a  PIED ){.      /*
8730: 20 53 6b 69 70 20 74 68 69 73 20 74 65 72 6d 20   Skip this term 
8740: 66 6f 72 20 6e 6f 77 2e 20 20 57 65 20 72 65 76  for now.  We rev
8750: 69 73 69 74 20 69 74 20 77 68 65 6e 20 77 65 20  isit it when we 
8760: 70 72 6f 63 65 73 73 20 74 68 65 0a 20 20 20 20  process the.    
8770: 20 20 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69    ** correspondi
8780: 6e 67 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20  ng TERM_VIRTUAL 
8790: 74 65 72 6d 20 2a 2f 0a 20 20 20 20 7d 65 6c 73  term */.    }els
87a0: 65 7b 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b  e{.      Bitmask
87b0: 20 62 3b 0a 20 20 20 20 20 20 62 20 3d 20 67 65   b;.      b = ge
87c0: 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73  tMask(&pWInfo->s
87d0: 4d 61 73 6b 53 65 74 2c 20 70 4f 72 54 65 72 6d  MaskSet, pOrTerm
87e0: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 29 3b 0a 20  ->leftCursor);. 
87f0: 20 20 20 20 20 69 66 28 20 70 4f 72 54 65 72 6d       if( pOrTerm
8800: 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
8810: 5f 56 49 52 54 55 41 4c 20 29 7b 0a 20 20 20 20  _VIRTUAL ){.    
8820: 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
8830: 4f 74 68 65 72 20 3d 20 26 70 4f 72 57 63 2d 3e  Other = &pOrWc->
8840: 61 5b 70 4f 72 54 65 72 6d 2d 3e 69 50 61 72 65  a[pOrTerm->iPare
8850: 6e 74 5d 3b 0a 20 20 20 20 20 20 20 20 62 20 7c  nt];.        b |
8860: 3d 20 67 65 74 4d 61 73 6b 28 26 70 57 49 6e 66  = getMask(&pWInf
8870: 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 70 4f 74  o->sMaskSet, pOt
8880: 68 65 72 2d 3e 6c 65 66 74 43 75 72 73 6f 72 29  her->leftCursor)
8890: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
88a0: 69 6e 64 65 78 61 62 6c 65 20 26 3d 20 62 3b 0a  indexable &= b;.
88b0: 20 20 20 20 20 20 69 66 28 20 28 70 4f 72 54 65        if( (pOrTe
88c0: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
88d0: 57 4f 5f 45 51 29 3d 3d 30 20 29 7b 0a 20 20 20  WO_EQ)==0 ){.   
88e0: 20 20 20 20 20 63 68 6e 67 54 6f 49 4e 20 3d 20       chngToIN = 
88f0: 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  0;.      }else{.
8900: 20 20 20 20 20 20 20 20 63 68 6e 67 54 6f 49 4e          chngToIN
8910: 20 26 3d 20 62 3b 0a 20 20 20 20 20 20 7d 0a 20   &= b;.      }. 
8920: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20     }.  }..  /*. 
8930: 20 2a 2a 20 52 65 63 6f 72 64 20 74 68 65 20 73   ** Record the s
8940: 65 74 20 6f 66 20 74 61 62 6c 65 73 20 74 68 61  et of tables tha
8950: 74 20 73 61 74 69 73 66 79 20 63 61 73 65 20 33  t satisfy case 3
8960: 2e 20 20 54 68 65 20 73 65 74 20 6d 69 67 68 74  .  The set might
8970: 20 62 65 0a 20 20 2a 2a 20 65 6d 70 74 79 2e 0a   be.  ** empty..
8980: 20 20 2a 2f 0a 20 20 70 4f 72 49 6e 66 6f 2d 3e    */.  pOrInfo->
8990: 69 6e 64 65 78 61 62 6c 65 20 3d 20 69 6e 64 65  indexable = inde
89a0: 78 61 62 6c 65 3b 0a 20 20 70 54 65 72 6d 2d 3e  xable;.  pTerm->
89b0: 65 4f 70 65 72 61 74 6f 72 20 3d 20 69 6e 64 65  eOperator = inde
89c0: 78 61 62 6c 65 3d 3d 30 20 3f 20 30 20 3a 20 57  xable==0 ? 0 : W
89d0: 4f 5f 4f 52 3b 0a 0a 20 20 2f 2a 20 46 6f 72 20  O_OR;..  /* For 
89e0: 61 20 74 77 6f 2d 77 61 79 20 4f 52 2c 20 61 74  a two-way OR, at
89f0: 74 65 6d 70 74 20 74 6f 20 69 6d 70 6c 65 6d 65  tempt to impleme
8a00: 6e 74 61 74 69 6f 6e 20 63 61 73 65 20 32 2e 0a  ntation case 2..
8a10: 20 20 2a 2f 0a 20 20 69 66 28 20 69 6e 64 65 78    */.  if( index
8a20: 61 62 6c 65 20 26 26 20 70 4f 72 57 63 2d 3e 6e  able && pOrWc->n
8a30: 54 65 72 6d 3d 3d 32 20 29 7b 0a 20 20 20 20 69  Term==2 ){.    i
8a40: 6e 74 20 69 4f 6e 65 20 3d 20 30 3b 0a 20 20 20  nt iOne = 0;.   
8a50: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 6e 65   WhereTerm *pOne
8a60: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 70 4f  ;.    while( (pO
8a70: 6e 65 20 3d 20 77 68 65 72 65 4e 74 68 53 75 62  ne = whereNthSub
8a80: 74 65 72 6d 28 26 70 4f 72 57 63 2d 3e 61 5b 30  term(&pOrWc->a[0
8a90: 5d 2c 69 4f 6e 65 2b 2b 29 29 21 3d 30 20 29 7b  ],iOne++))!=0 ){
8aa0: 0a 20 20 20 20 20 20 69 6e 74 20 69 54 77 6f 20  .      int iTwo 
8ab0: 3d 20 30 3b 0a 20 20 20 20 20 20 57 68 65 72 65  = 0;.      Where
8ac0: 54 65 72 6d 20 2a 70 54 77 6f 3b 0a 20 20 20 20  Term *pTwo;.    
8ad0: 20 20 77 68 69 6c 65 28 20 28 70 54 77 6f 20 3d    while( (pTwo =
8ae0: 20 77 68 65 72 65 4e 74 68 53 75 62 74 65 72 6d   whereNthSubterm
8af0: 28 26 70 4f 72 57 63 2d 3e 61 5b 31 5d 2c 69 54  (&pOrWc->a[1],iT
8b00: 77 6f 2b 2b 29 29 21 3d 30 20 29 7b 0a 20 20 20  wo++))!=0 ){.   
8b10: 20 20 20 20 20 77 68 65 72 65 43 6f 6d 62 69 6e       whereCombin
8b20: 65 44 69 73 6a 75 6e 63 74 73 28 70 53 72 63 2c  eDisjuncts(pSrc,
8b30: 20 70 57 43 2c 20 70 4f 6e 65 2c 20 70 54 77 6f   pWC, pOne, pTwo
8b40: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
8b50: 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
8b60: 63 68 6e 67 54 6f 49 4e 20 68 6f 6c 64 73 20 61  chngToIN holds a
8b70: 20 73 65 74 20 6f 66 20 74 61 62 6c 65 73 20 74   set of tables t
8b80: 68 61 74 20 2a 6d 69 67 68 74 2a 20 73 61 74 69  hat *might* sati
8b90: 73 66 79 20 63 61 73 65 20 31 2e 20 20 42 75 74  sfy case 1.  But
8ba0: 0a 20 20 2a 2a 20 77 65 20 68 61 76 65 20 74 6f  .  ** we have to
8bb0: 20 64 6f 20 73 6f 6d 65 20 61 64 64 69 74 69 6f   do some additio
8bc0: 6e 61 6c 20 63 68 65 63 6b 69 6e 67 20 74 6f 20  nal checking to 
8bd0: 73 65 65 20 69 66 20 63 61 73 65 20 31 20 72 65  see if case 1 re
8be0: 61 6c 6c 79 0a 20 20 2a 2a 20 69 73 20 73 61 74  ally.  ** is sat
8bf0: 69 73 66 69 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a  isfied..  **.  *
8c00: 2a 20 63 68 6e 67 54 6f 49 4e 20 77 69 6c 6c 20  * chngToIN will 
8c10: 68 6f 6c 64 20 65 69 74 68 65 72 20 30 2c 20 31  hold either 0, 1
8c20: 2c 20 6f 72 20 32 20 62 69 74 73 2e 20 20 54 68  , or 2 bits.  Th
8c30: 65 20 30 2d 62 69 74 20 63 61 73 65 20 6d 65 61  e 0-bit case mea
8c40: 6e 73 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65  ns.  ** that the
8c50: 72 65 20 69 73 20 6e 6f 20 70 6f 73 73 69 62 69  re is no possibi
8c60: 6c 69 74 79 20 6f 66 20 74 72 61 6e 73 66 6f 72  lity of transfor
8c70: 6d 69 6e 67 20 74 68 65 20 4f 52 20 63 6c 61 75  ming the OR clau
8c80: 73 65 20 69 6e 74 6f 20 61 6e 0a 20 20 2a 2a 20  se into an.  ** 
8c90: 49 4e 20 6f 70 65 72 61 74 6f 72 20 62 65 63 61  IN operator beca
8ca0: 75 73 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  use one or more 
8cb0: 74 65 72 6d 73 20 69 6e 20 74 68 65 20 4f 52 20  terms in the OR 
8cc0: 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 0a 20  clause contain. 
8cd0: 20 2a 2a 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74   ** something ot
8ce0: 68 65 72 20 74 68 61 6e 20 3d 3d 20 6f 6e 20 61  her than == on a
8cf0: 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 73   column in the s
8d00: 69 6e 67 6c 65 20 74 61 62 6c 65 2e 20 20 54 68  ingle table.  Th
8d10: 65 20 31 2d 62 69 74 0a 20 20 2a 2a 20 63 61 73  e 1-bit.  ** cas
8d20: 65 20 6d 65 61 6e 73 20 74 68 61 74 20 65 76 65  e means that eve
8d30: 72 79 20 74 65 72 6d 20 6f 66 20 74 68 65 20 4f  ry term of the O
8d40: 52 20 63 6c 61 75 73 65 20 69 73 20 6f 66 20 74  R clause is of t
8d50: 68 65 20 66 6f 72 6d 0a 20 20 2a 2a 20 22 74 61  he form.  ** "ta
8d60: 62 6c 65 2e 63 6f 6c 75 6d 6e 3d 65 78 70 72 22  ble.column=expr"
8d70: 20 66 6f 72 20 73 6f 6d 65 20 73 69 6e 67 6c 65   for some single
8d80: 20 74 61 62 6c 65 2e 20 20 54 68 65 20 6f 6e 65   table.  The one
8d90: 20 62 69 74 20 74 68 61 74 20 69 73 20 73 65 74   bit that is set
8da0: 0a 20 20 2a 2a 20 77 69 6c 6c 20 63 6f 72 72 65  .  ** will corre
8db0: 73 70 6f 6e 64 20 74 6f 20 74 68 65 20 63 6f 6d  spond to the com
8dc0: 6d 6f 6e 20 74 61 62 6c 65 2e 20 20 57 65 20 73  mon table.  We s
8dd0: 74 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63 68 65  till need to che
8de0: 63 6b 20 74 6f 20 6d 61 6b 65 0a 20 20 2a 2a 20  ck to make.  ** 
8df0: 73 75 72 65 20 74 68 65 20 73 61 6d 65 20 63 6f  sure the same co
8e00: 6c 75 6d 6e 20 69 73 20 75 73 65 64 20 6f 6e 20  lumn is used on 
8e10: 61 6c 6c 20 74 65 72 6d 73 2e 20 20 54 68 65 20  all terms.  The 
8e20: 32 2d 62 69 74 20 63 61 73 65 20 69 73 20 77 68  2-bit case is wh
8e30: 65 6e 0a 20 20 2a 2a 20 74 68 65 20 61 6c 6c 20  en.  ** the all 
8e40: 74 65 72 6d 73 20 61 72 65 20 6f 66 20 74 68 65  terms are of the
8e50: 20 66 6f 72 6d 20 22 74 61 62 6c 65 31 2e 63 6f   form "table1.co
8e60: 6c 75 6d 6e 3d 74 61 62 6c 65 32 2e 63 6f 6c 75  lumn=table2.colu
8e70: 6d 6e 22 2e 20 20 49 74 0a 20 20 2a 2a 20 6d 69  mn".  It.  ** mi
8e80: 67 68 74 20 62 65 20 70 6f 73 73 69 62 6c 65 20  ght be possible 
8e90: 74 6f 20 66 6f 72 6d 20 61 6e 20 49 4e 20 6f 70  to form an IN op
8ea0: 65 72 61 74 6f 72 20 77 69 74 68 20 65 69 74 68  erator with eith
8eb0: 65 72 20 74 61 62 6c 65 31 2e 63 6f 6c 75 6d 6e  er table1.column
8ec0: 0a 20 20 2a 2a 20 6f 72 20 74 61 62 6c 65 32 2e  .  ** or table2.
8ed0: 63 6f 6c 75 6d 6e 20 61 73 20 74 68 65 20 4c 48  column as the LH
8ee0: 53 20 69 66 20 65 69 74 68 65 72 20 69 73 20 63  S if either is c
8ef0: 6f 6d 6d 6f 6e 20 74 6f 20 65 76 65 72 79 20 74  ommon to every t
8f00: 65 72 6d 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20  erm of.  ** the 
8f10: 4f 52 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 0a  OR clause..  **.
8f20: 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74    ** Note that t
8f30: 65 72 6d 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  erms of the form
8f40: 20 22 74 61 62 6c 65 2e 63 6f 6c 75 6d 6e 31 3d   "table.column1=
8f50: 74 61 62 6c 65 2e 63 6f 6c 75 6d 6e 32 22 20 28  table.column2" (
8f60: 74 68 65 0a 20 20 2a 2a 20 73 61 6d 65 20 74 61  the.  ** same ta
8f70: 62 6c 65 20 6f 6e 20 62 6f 74 68 20 73 69 7a 65  ble on both size
8f80: 73 20 6f 66 20 74 68 65 20 3d 3d 29 20 63 61 6e  s of the ==) can
8f90: 6e 6f 74 20 62 65 20 6f 70 74 69 6d 69 7a 65 64  not be optimized
8fa0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 68 6e  ..  */.  if( chn
8fb0: 67 54 6f 49 4e 20 29 7b 0a 20 20 20 20 69 6e 74  gToIN ){.    int
8fc0: 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 3d 20   okToChngToIN = 
8fd0: 30 3b 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69  0;     /* True i
8fe0: 66 20 74 68 65 20 63 6f 6e 76 65 72 73 69 6f 6e  f the conversion
8ff0: 20 74 6f 20 49 4e 20 69 73 20 76 61 6c 69 64 20   to IN is valid 
9000: 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 75  */.    int iColu
9010: 6d 6e 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20  mn = -1;        
9020: 20 2f 2a 20 43 6f 6c 75 6d 6e 20 69 6e 64 65 78   /* Column index
9030: 20 6f 6e 20 6c 68 73 20 6f 66 20 49 4e 20 6f 70   on lhs of IN op
9040: 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 69 6e  erator */.    in
9050: 74 20 69 43 75 72 73 6f 72 20 3d 20 2d 31 3b 20  t iCursor = -1; 
9060: 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
9070: 20 63 75 72 73 6f 72 20 63 6f 6d 6d 6f 6e 20 74   cursor common t
9080: 6f 20 61 6c 6c 20 74 65 72 6d 73 20 2a 2f 0a 20  o all terms */. 
9090: 20 20 20 69 6e 74 20 6a 20 3d 20 30 3b 20 20 20     int j = 0;   
90a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
90b0: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
90c0: 0a 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66  .    /* Search f
90d0: 6f 72 20 61 20 74 61 62 6c 65 20 61 6e 64 20 63  or a table and c
90e0: 6f 6c 75 6d 6e 20 74 68 61 74 20 61 70 70 65 61  olumn that appea
90f0: 72 73 20 6f 6e 20 6f 6e 65 20 73 69 64 65 20 6f  rs on one side o
9100: 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 74 68  r the.    ** oth
9110: 65 72 20 6f 66 20 74 68 65 20 3d 3d 20 6f 70 65  er of the == ope
9120: 72 61 74 6f 72 20 69 6e 20 65 76 65 72 79 20 73  rator in every s
9130: 75 62 74 65 72 6d 2e 20 20 54 68 61 74 20 74 61  ubterm.  That ta
9140: 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 0a 20  ble and column. 
9150: 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65     ** will be re
9160: 63 6f 72 64 65 64 20 69 6e 20 69 43 75 72 73 6f  corded in iCurso
9170: 72 20 61 6e 64 20 69 43 6f 6c 75 6d 6e 2e 20 20  r and iColumn.  
9180: 54 68 65 72 65 20 6d 69 67 68 74 20 6e 6f 74 20  There might not 
9190: 62 65 20 61 6e 79 0a 20 20 20 20 2a 2a 20 73 75  be any.    ** su
91a0: 63 68 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c  ch table and col
91b0: 75 6d 6e 2e 20 20 53 65 74 20 6f 6b 54 6f 43 68  umn.  Set okToCh
91c0: 6e 67 54 6f 49 4e 20 69 66 20 61 6e 20 61 70 70  ngToIN if an app
91d0: 72 6f 70 72 69 61 74 65 20 74 61 62 6c 65 0a 20  ropriate table. 
91e0: 20 20 20 2a 2a 20 61 6e 64 20 63 6f 6c 75 6d 6e     ** and column
91f0: 20 69 73 20 66 6f 75 6e 64 20 62 75 74 20 6c 65   is found but le
9200: 61 76 65 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e  ave okToChngToIN
9210: 20 66 61 6c 73 65 20 69 66 20 6e 6f 74 20 66 6f   false if not fo
9220: 75 6e 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  und..    */.    
9230: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 32 20 26 26 20  for(j=0; j<2 && 
9240: 21 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 3b 20 6a  !okToChngToIN; j
9250: 2b 2b 29 7b 0a 20 20 20 20 20 20 70 4f 72 54 65  ++){.      pOrTe
9260: 72 6d 20 3d 20 70 4f 72 57 63 2d 3e 61 3b 0a 20  rm = pOrWc->a;. 
9270: 20 20 20 20 20 66 6f 72 28 69 3d 70 4f 72 57 63       for(i=pOrWc
9280: 2d 3e 6e 54 65 72 6d 2d 31 3b 20 69 3e 3d 30 3b  ->nTerm-1; i>=0;
9290: 20 69 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b 29   i--, pOrTerm++)
92a0: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
92b0: 28 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72  ( pOrTerm->eOper
92c0: 61 74 6f 72 20 26 20 57 4f 5f 45 51 20 29 3b 0a  ator & WO_EQ );.
92d0: 20 20 20 20 20 20 20 20 70 4f 72 54 65 72 6d 2d          pOrTerm-
92e0: 3e 77 74 46 6c 61 67 73 20 26 3d 20 7e 54 45 52  >wtFlags &= ~TER
92f0: 4d 5f 4f 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  M_OR_OK;.       
9300: 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65   if( pOrTerm->le
9310: 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 73 6f  ftCursor==iCurso
9320: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  r ){.          /
9330: 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 32 2d  * This is the 2-
9340: 62 69 74 20 63 61 73 65 20 61 6e 64 20 77 65 20  bit case and we 
9350: 61 72 65 20 6f 6e 20 74 68 65 20 73 65 63 6f 6e  are on the secon
9360: 64 20 69 74 65 72 61 74 69 6f 6e 20 61 6e 64 0a  d iteration and.
9370: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 75 72            ** cur
9380: 72 65 6e 74 20 74 65 72 6d 20 69 73 20 66 72 6f  rent term is fro
9390: 6d 20 74 68 65 20 66 69 72 73 74 20 69 74 65 72  m the first iter
93a0: 61 74 69 6f 6e 2e 20 20 53 6f 20 73 6b 69 70 20  ation.  So skip 
93b0: 74 68 69 73 20 74 65 72 6d 2e 20 2a 2f 0a 20 20  this term. */.  
93c0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
93d0: 6a 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20  j==1 );.        
93e0: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
93f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
9400: 28 20 28 63 68 6e 67 54 6f 49 4e 20 26 20 67 65  ( (chngToIN & ge
9410: 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73  tMask(&pWInfo->s
9420: 4d 61 73 6b 53 65 74 2c 20 70 4f 72 54 65 72 6d  MaskSet, pOrTerm
9430: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 29 29 3d 3d  ->leftCursor))==
9440: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  0 ){.          /
9450: 2a 20 54 68 69 73 20 74 65 72 6d 20 6d 75 73 74  * This term must
9460: 20 62 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20   be of the form 
9470: 74 31 2e 61 3d 3d 74 32 2e 62 20 77 68 65 72 65  t1.a==t2.b where
9480: 20 74 32 20 69 73 20 69 6e 20 74 68 65 0a 20 20   t2 is in the.  
9490: 20 20 20 20 20 20 20 20 2a 2a 20 63 68 6e 67 54          ** chngT
94a0: 6f 49 4e 20 73 65 74 20 62 75 74 20 74 31 20 69  oIN set but t1 i
94b0: 73 20 6e 6f 74 2e 20 20 54 68 69 73 20 74 65 72  s not.  This ter
94c0: 6d 20 77 69 6c 6c 20 62 65 20 65 69 74 68 65 72  m will be either
94d0: 20 70 72 65 63 65 64 65 64 0a 20 20 20 20 20 20   preceded.      
94e0: 20 20 20 20 2a 2a 20 6f 72 20 66 6f 6c 6c 77 65      ** or follwe
94f0: 64 20 62 79 20 61 6e 20 69 6e 76 65 72 74 65 64  d by an inverted
9500: 20 63 6f 70 79 20 28 74 32 2e 62 3d 3d 74 31 2e   copy (t2.b==t1.
9510: 61 29 2e 20 20 53 6b 69 70 20 74 68 69 73 20 74  a).  Skip this t
9520: 65 72 6d 20 0a 20 20 20 20 20 20 20 20 20 20 2a  erm .          *
9530: 2a 20 61 6e 64 20 75 73 65 20 69 74 73 20 69 6e  * and use its in
9540: 76 65 72 73 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20  version. */.    
9550: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
9560: 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  pOrTerm->wtFlags
9570: 20 26 20 54 45 52 4d 5f 43 4f 50 49 45 44 20 29   & TERM_COPIED )
9580: 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  ;.          test
9590: 63 61 73 65 28 20 70 4f 72 54 65 72 6d 2d 3e 77  case( pOrTerm->w
95a0: 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49  tFlags & TERM_VI
95b0: 52 54 55 41 4c 20 29 3b 0a 20 20 20 20 20 20 20  RTUAL );.       
95c0: 20 20 20 61 73 73 65 72 74 28 20 70 4f 72 54 65     assert( pOrTe
95d0: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54  rm->wtFlags & (T
95e0: 45 52 4d 5f 43 4f 50 49 45 44 7c 54 45 52 4d 5f  ERM_COPIED|TERM_
95f0: 56 49 52 54 55 41 4c 29 20 29 3b 0a 20 20 20 20  VIRTUAL) );.    
9600: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
9610: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
9620: 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 70 4f 72 54    iColumn = pOrT
9630: 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d  erm->u.leftColum
9640: 6e 3b 0a 20 20 20 20 20 20 20 20 69 43 75 72 73  n;.        iCurs
9650: 6f 72 20 3d 20 70 4f 72 54 65 72 6d 2d 3e 6c 65  or = pOrTerm->le
9660: 66 74 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20  ftCursor;.      
9670: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
9680: 0a 20 20 20 20 20 20 69 66 28 20 69 3c 30 20 29  .      if( i<0 )
9690: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20  {.        /* No 
96a0: 63 61 6e 64 69 64 61 74 65 20 74 61 62 6c 65 2b  candidate table+
96b0: 63 6f 6c 75 6d 6e 20 77 61 73 20 66 6f 75 6e 64  column was found
96c0: 2e 20 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79  .  This can only
96d0: 20 6f 63 63 75 72 0a 20 20 20 20 20 20 20 20 2a   occur.        *
96e0: 2a 20 6f 6e 20 74 68 65 20 73 65 63 6f 6e 64 20  * on the second 
96f0: 69 74 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 20  iteration */.   
9700: 20 20 20 20 20 61 73 73 65 72 74 28 20 6a 3d 3d       assert( j==
9710: 31 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  1 );.        ass
9720: 65 72 74 28 20 49 73 50 6f 77 65 72 4f 66 54 77  ert( IsPowerOfTw
9730: 6f 28 63 68 6e 67 54 6f 49 4e 29 20 29 3b 0a 20  o(chngToIN) );. 
9740: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 63         assert( c
9750: 68 6e 67 54 6f 49 4e 3d 3d 67 65 74 4d 61 73 6b  hngToIN==getMask
9760: 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53  (&pWInfo->sMaskS
9770: 65 74 2c 20 69 43 75 72 73 6f 72 29 20 29 3b 0a  et, iCursor) );.
9780: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
9790: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 74 65 73       }.      tes
97a0: 74 63 61 73 65 28 20 6a 3d 3d 31 20 29 3b 0a 0a  tcase( j==1 );..
97b0: 20 20 20 20 20 20 2f 2a 20 57 65 20 68 61 76 65        /* We have
97c0: 20 66 6f 75 6e 64 20 61 20 63 61 6e 64 69 64 61   found a candida
97d0: 74 65 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c  te table and col
97e0: 75 6d 6e 2e 20 20 43 68 65 63 6b 20 74 6f 20 73  umn.  Check to s
97f0: 65 65 20 69 66 20 74 68 61 74 0a 20 20 20 20 20  ee if that.     
9800: 20 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20 63 6f   ** table and co
9810: 6c 75 6d 6e 20 69 73 20 63 6f 6d 6d 6f 6e 20 74  lumn is common t
9820: 6f 20 65 76 65 72 79 20 74 65 72 6d 20 69 6e 20  o every term in 
9830: 74 68 65 20 4f 52 20 63 6c 61 75 73 65 20 2a 2f  the OR clause */
9840: 0a 20 20 20 20 20 20 6f 6b 54 6f 43 68 6e 67 54  .      okToChngT
9850: 6f 49 4e 20 3d 20 31 3b 0a 20 20 20 20 20 20 66  oIN = 1;.      f
9860: 6f 72 28 3b 20 69 3e 3d 30 20 26 26 20 6f 6b 54  or(; i>=0 && okT
9870: 6f 43 68 6e 67 54 6f 49 4e 3b 20 69 2d 2d 2c 20  oChngToIN; i--, 
9880: 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  pOrTerm++){.    
9890: 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 72 54      assert( pOrT
98a0: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
98b0: 20 57 4f 5f 45 51 20 29 3b 0a 20 20 20 20 20 20   WO_EQ );.      
98c0: 20 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c    if( pOrTerm->l
98d0: 65 66 74 43 75 72 73 6f 72 21 3d 69 43 75 72 73  eftCursor!=iCurs
98e0: 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  or ){.          
98f0: 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  pOrTerm->wtFlags
9900: 20 26 3d 20 7e 54 45 52 4d 5f 4f 52 5f 4f 4b 3b   &= ~TERM_OR_OK;
9910: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
9920: 66 28 20 70 4f 72 54 65 72 6d 2d 3e 75 2e 6c 65  f( pOrTerm->u.le
9930: 66 74 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 75 6d  ftColumn!=iColum
9940: 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6f  n ){.          o
9950: 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 3d 20 30 3b  kToChngToIN = 0;
9960: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
9970: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 61 66            int af
9980: 66 4c 65 66 74 2c 20 61 66 66 52 69 67 68 74 3b  fLeft, affRight;
9990: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66  .          /* If
99a0: 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20   the right-hand 
99b0: 73 69 64 65 20 69 73 20 61 6c 73 6f 20 61 20 63  side is also a c
99c0: 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20 74 68 65 20  olumn, then the 
99d0: 61 66 66 69 6e 69 74 69 65 73 0a 20 20 20 20 20  affinities.     
99e0: 20 20 20 20 20 2a 2a 20 6f 66 20 62 6f 74 68 20       ** of both 
99f0: 72 69 67 68 74 20 61 6e 64 20 6c 65 66 74 20 73  right and left s
9a00: 69 64 65 73 20 6d 75 73 74 20 62 65 20 73 75 63  ides must be suc
9a10: 68 20 74 68 61 74 20 6e 6f 20 74 79 70 65 0a 20  h that no type. 
9a20: 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 76           ** conv
9a30: 65 72 73 69 6f 6e 73 20 61 72 65 20 72 65 71 75  ersions are requ
9a40: 69 72 65 64 20 6f 6e 20 74 68 65 20 72 69 67 68  ired on the righ
9a50: 74 2e 20 20 28 54 69 63 6b 65 74 20 23 32 32 34  t.  (Ticket #224
9a60: 39 29 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  9).          */.
9a70: 20 20 20 20 20 20 20 20 20 20 61 66 66 52 69 67            affRig
9a80: 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ht = sqlite3Expr
9a90: 41 66 66 69 6e 69 74 79 28 70 4f 72 54 65 72 6d  Affinity(pOrTerm
9aa0: 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29  ->pExpr->pRight)
9ab0: 3b 0a 20 20 20 20 20 20 20 20 20 20 61 66 66 4c  ;.          affL
9ac0: 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  eft = sqlite3Exp
9ad0: 72 41 66 66 69 6e 69 74 79 28 70 4f 72 54 65 72  rAffinity(pOrTer
9ae0: 6d 2d 3e 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  m->pExpr->pLeft)
9af0: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
9b00: 61 66 66 52 69 67 68 74 21 3d 30 20 26 26 20 61  affRight!=0 && a
9b10: 66 66 52 69 67 68 74 21 3d 61 66 66 4c 65 66 74  ffRight!=affLeft
9b20: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
9b30: 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 3d 20 30  okToChngToIN = 0
9b40: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
9b50: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  e{.            p
9b60: 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20  OrTerm->wtFlags 
9b70: 7c 3d 20 54 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a 20  |= TERM_OR_OK;. 
9b80: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
9b90: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
9ba0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74 68   }..    /* At th
9bb0: 69 73 20 70 6f 69 6e 74 2c 20 6f 6b 54 6f 43 68  is point, okToCh
9bc0: 6e 67 54 6f 49 4e 20 69 73 20 74 72 75 65 20 69  ngToIN is true i
9bd0: 66 20 6f 72 69 67 69 6e 61 6c 20 70 54 65 72 6d  f original pTerm
9be0: 20 73 61 74 69 73 66 69 65 73 0a 20 20 20 20 2a   satisfies.    *
9bf0: 2a 20 63 61 73 65 20 31 2e 20 20 49 6e 20 74 68  * case 1.  In th
9c00: 61 74 20 63 61 73 65 2c 20 63 6f 6e 73 74 72 75  at case, constru
9c10: 63 74 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c  ct a new virtual
9c20: 20 74 65 72 6d 20 74 68 61 74 20 69 73 20 0a 20   term that is . 
9c30: 20 20 20 2a 2a 20 70 54 65 72 6d 20 63 6f 6e 76     ** pTerm conv
9c40: 65 72 74 65 64 20 69 6e 74 6f 20 61 6e 20 49 4e  erted into an IN
9c50: 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 20 20 2a   operator..    *
9c60: 2f 0a 20 20 20 20 69 66 28 20 6f 6b 54 6f 43 68  /.    if( okToCh
9c70: 6e 67 54 6f 49 4e 20 29 7b 0a 20 20 20 20 20 20  ngToIN ){.      
9c80: 45 78 70 72 20 2a 70 44 75 70 3b 20 20 20 20 20  Expr *pDup;     
9c90: 20 20 20 20 20 20 20 2f 2a 20 41 20 74 72 61 6e         /* A tran
9ca0: 73 69 65 6e 74 20 64 75 70 6c 69 63 61 74 65 20  sient duplicate 
9cb0: 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20  expression */.  
9cc0: 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c      ExprList *pL
9cd0: 69 73 74 20 3d 20 30 3b 20 20 20 2f 2a 20 54 68  ist = 0;   /* Th
9ce0: 65 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20  e RHS of the IN 
9cf0: 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20  operator */.    
9d00: 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20    Expr *pLeft = 
9d10: 30 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  0;       /* The 
9d20: 4c 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70  LHS of the IN op
9d30: 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20  erator */.      
9d40: 45 78 70 72 20 2a 70 4e 65 77 3b 20 20 20 20 20  Expr *pNew;     
9d50: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f         /* The co
9d60: 6d 70 6c 65 74 65 20 49 4e 20 6f 70 65 72 61 74  mplete IN operat
9d70: 6f 72 20 2a 2f 0a 0a 20 20 20 20 20 20 66 6f 72  or */..      for
9d80: 28 69 3d 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d  (i=pOrWc->nTerm-
9d90: 31 2c 20 70 4f 72 54 65 72 6d 3d 70 4f 72 57 63  1, pOrTerm=pOrWc
9da0: 2d 3e 61 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20  ->a; i>=0; i--, 
9db0: 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  pOrTerm++){.    
9dc0: 20 20 20 20 69 66 28 20 28 70 4f 72 54 65 72 6d      if( (pOrTerm
9dd0: 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
9de0: 5f 4f 52 5f 4f 4b 29 3d 3d 30 20 29 20 63 6f 6e  _OR_OK)==0 ) con
9df0: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 61  tinue;.        a
9e00: 73 73 65 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e  ssert( pOrTerm->
9e10: 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45  eOperator & WO_E
9e20: 51 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  Q );.        ass
9e30: 65 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65  ert( pOrTerm->le
9e40: 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 73 6f  ftCursor==iCurso
9e50: 72 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  r );.        ass
9e60: 65 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e 75 2e  ert( pOrTerm->u.
9e70: 6c 65 66 74 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c  leftColumn==iCol
9e80: 75 6d 6e 20 29 3b 0a 20 20 20 20 20 20 20 20 70  umn );.        p
9e90: 44 75 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Dup = sqlite3Exp
9ea0: 72 44 75 70 28 64 62 2c 20 70 4f 72 54 65 72 6d  rDup(db, pOrTerm
9eb0: 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  ->pExpr->pRight,
9ec0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 69   0);.        pLi
9ed0: 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  st = sqlite3Expr
9ee0: 4c 69 73 74 41 70 70 65 6e 64 28 70 57 49 6e 66  ListAppend(pWInf
9ef0: 6f 2d 3e 70 50 61 72 73 65 2c 20 70 4c 69 73 74  o->pParse, pList
9f00: 2c 20 70 44 75 70 29 3b 0a 20 20 20 20 20 20 20  , pDup);.       
9f10: 20 70 4c 65 66 74 20 3d 20 70 4f 72 54 65 72 6d   pLeft = pOrTerm
9f20: 2d 3e 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a  ->pExpr->pLeft;.
9f30: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
9f40: 73 65 72 74 28 20 70 4c 65 66 74 21 3d 30 20 29  sert( pLeft!=0 )
9f50: 3b 0a 20 20 20 20 20 20 70 44 75 70 20 3d 20 73  ;.      pDup = s
9f60: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
9f70: 2c 20 70 4c 65 66 74 2c 20 30 29 3b 0a 20 20 20  , pLeft, 0);.   
9f80: 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65     pNew = sqlite
9f90: 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
9fa0: 4b 5f 49 4e 2c 20 70 44 75 70 2c 20 30 2c 20 30  K_IN, pDup, 0, 0
9fb0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65  );.      if( pNe
9fc0: 77 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  w ){.        int
9fd0: 20 69 64 78 4e 65 77 3b 0a 20 20 20 20 20 20 20   idxNew;.       
9fe0: 20 74 72 61 6e 73 66 65 72 4a 6f 69 6e 4d 61 72   transferJoinMar
9ff0: 6b 69 6e 67 73 28 70 4e 65 77 2c 20 70 45 78 70  kings(pNew, pExp
a000: 72 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  r);.        asse
a010: 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
a020: 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 78 49  erty(pNew, EP_xI
a030: 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20  sSelect) );.    
a040: 20 20 20 20 70 4e 65 77 2d 3e 78 2e 70 4c 69 73      pNew->x.pLis
a050: 74 20 3d 20 70 4c 69 73 74 3b 0a 20 20 20 20 20  t = pList;.     
a060: 20 20 20 69 64 78 4e 65 77 20 3d 20 77 68 65 72     idxNew = wher
a070: 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57  eClauseInsert(pW
a080: 43 2c 20 70 4e 65 77 2c 20 54 45 52 4d 5f 56 49  C, pNew, TERM_VI
a090: 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d  RTUAL|TERM_DYNAM
a0a0: 49 43 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  IC);.        tes
a0b0: 74 63 61 73 65 28 20 69 64 78 4e 65 77 3d 3d 30  tcase( idxNew==0
a0c0: 20 29 3b 0a 20 20 20 20 20 20 20 20 65 78 70 72   );.        expr
a0d0: 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20 70 57  Analyze(pSrc, pW
a0e0: 43 2c 20 69 64 78 4e 65 77 29 3b 0a 20 20 20 20  C, idxNew);.    
a0f0: 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43      pTerm = &pWC
a100: 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20  ->a[idxTerm];.  
a110: 20 20 20 20 20 20 6d 61 72 6b 54 65 72 6d 41 73        markTermAs
a120: 43 68 69 6c 64 28 70 57 43 2c 20 69 64 78 4e 65  Child(pWC, idxNe
a130: 77 2c 20 69 64 78 54 65 72 6d 29 3b 0a 20 20 20  w, idxTerm);.   
a140: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
a150: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
a160: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69 73  tDelete(db, pLis
a170: 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
a180: 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74    pTerm->eOperat
a190: 6f 72 20 3d 20 57 4f 5f 4e 4f 4f 50 3b 20 20 2f  or = WO_NOOP;  /
a1a0: 2a 20 63 61 73 65 20 31 20 74 72 75 6d 70 73 20  * case 1 trumps 
a1b0: 63 61 73 65 20 33 20 2a 2f 0a 20 20 20 20 7d 0a  case 3 */.    }.
a1c0: 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20    }.}.#endif /* 
a1d0: 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f  !SQLITE_OMIT_OR_
a1e0: 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 26 26 20  OPTIMIZATION && 
a1f0: 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42  !SQLITE_OMIT_SUB
a200: 51 55 45 52 59 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  QUERY */../*.** 
a210: 54 68 65 20 69 6e 70 75 74 20 74 6f 20 74 68 69  The input to thi
a220: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 6e 20  s routine is an 
a230: 57 68 65 72 65 54 65 72 6d 20 73 74 72 75 63 74  WhereTerm struct
a240: 75 72 65 20 77 69 74 68 20 6f 6e 6c 79 20 74 68  ure with only th
a250: 65 0a 2a 2a 20 22 70 45 78 70 72 22 20 66 69 65  e.** "pExpr" fie
a260: 6c 64 20 66 69 6c 6c 65 64 20 69 6e 2e 20 20 54  ld filled in.  T
a270: 68 65 20 6a 6f 62 20 6f 66 20 74 68 69 73 20 72  he job of this r
a280: 6f 75 74 69 6e 65 20 69 73 20 74 6f 20 61 6e 61  outine is to ana
a290: 6c 79 7a 65 20 74 68 65 0a 2a 2a 20 73 75 62 65  lyze the.** sube
a2a0: 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 70 6f  xpression and po
a2b0: 70 75 6c 61 74 65 20 61 6c 6c 20 74 68 65 20 6f  pulate all the o
a2c0: 74 68 65 72 20 66 69 65 6c 64 73 20 6f 66 20 74  ther fields of t
a2d0: 68 65 20 57 68 65 72 65 54 65 72 6d 0a 2a 2a 20  he WhereTerm.** 
a2e0: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a  structure..**.**
a2f0: 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69   If the expressi
a300: 6f 6e 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72  on is of the for
a310: 6d 20 22 3c 65 78 70 72 3e 20 3c 6f 70 3e 20 58  m "<expr> <op> X
a320: 22 20 69 74 20 67 65 74 73 20 63 6f 6d 6d 75 74  " it gets commut
a330: 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 73 74 61  ed.** to the sta
a340: 6e 64 61 72 64 20 66 6f 72 6d 20 6f 66 20 22 58  ndard form of "X
a350: 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 2e 0a 2a   <op> <expr>"..*
a360: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72  *.** If the expr
a370: 65 73 73 69 6f 6e 20 69 73 20 6f 66 20 74 68 65  ession is of the
a380: 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 59 22   form "X <op> Y"
a390: 20 77 68 65 72 65 20 62 6f 74 68 20 58 20 61 6e   where both X an
a3a0: 64 20 59 20 61 72 65 0a 2a 2a 20 63 6f 6c 75 6d  d Y are.** colum
a3b0: 6e 73 2c 20 74 68 65 6e 20 74 68 65 20 6f 72 69  ns, then the ori
a3c0: 67 69 6e 61 6c 20 65 78 70 72 65 73 73 69 6f 6e  ginal expression
a3d0: 20 69 73 20 75 6e 63 68 61 6e 67 65 64 20 61 6e   is unchanged an
a3e0: 64 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c 0a  d a new virtual.
a3f0: 2a 2a 20 74 65 72 6d 20 6f 66 20 74 68 65 20 66  ** term of the f
a400: 6f 72 6d 20 22 59 20 3c 6f 70 3e 20 58 22 20 69  orm "Y <op> X" i
a410: 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 57  s added to the W
a420: 48 45 52 45 20 63 6c 61 75 73 65 20 61 6e 64 0a  HERE clause and.
a430: 2a 2a 20 61 6e 61 6c 79 7a 65 64 20 73 65 70 61  ** analyzed sepa
a440: 72 61 74 65 6c 79 2e 20 20 54 68 65 20 6f 72 69  rately.  The ori
a450: 67 69 6e 61 6c 20 74 65 72 6d 20 69 73 20 6d 61  ginal term is ma
a460: 72 6b 65 64 20 77 69 74 68 20 54 45 52 4d 5f 43  rked with TERM_C
a470: 4f 50 49 45 44 0a 2a 2a 20 61 6e 64 20 74 68 65  OPIED.** and the
a480: 20 6e 65 77 20 74 65 72 6d 20 69 73 20 6d 61 72   new term is mar
a490: 6b 65 64 20 77 69 74 68 20 54 45 52 4d 5f 44 59  ked with TERM_DY
a4a0: 4e 41 4d 49 43 20 28 62 65 63 61 75 73 65 20 69  NAMIC (because i
a4b0: 74 27 73 20 70 45 78 70 72 0a 2a 2a 20 6e 65 65  t's pExpr.** nee
a4c0: 64 73 20 74 6f 20 62 65 20 66 72 65 65 64 20 77  ds to be freed w
a4d0: 69 74 68 20 74 68 65 20 57 68 65 72 65 43 6c 61  ith the WhereCla
a4e0: 75 73 65 29 20 61 6e 64 20 54 45 52 4d 5f 56 49  use) and TERM_VI
a4f0: 52 54 55 41 4c 20 28 62 65 63 61 75 73 65 20 69  RTUAL (because i
a500: 74 0a 2a 2a 20 69 73 20 61 20 63 6f 6d 6d 75 74  t.** is a commut
a510: 65 64 20 63 6f 70 79 20 6f 66 20 61 20 70 72 69  ed copy of a pri
a520: 6f 72 20 74 65 72 6d 2e 29 20 20 54 68 65 20 6f  or term.)  The o
a530: 72 69 67 69 6e 61 6c 20 74 65 72 6d 20 68 61 73  riginal term has
a540: 20 6e 43 68 69 6c 64 3d 31 0a 2a 2a 20 61 6e 64   nChild=1.** and
a550: 20 74 68 65 20 63 6f 70 79 20 68 61 73 20 69 64   the copy has id
a560: 78 50 61 72 65 6e 74 20 73 65 74 20 74 6f 20 74  xParent set to t
a570: 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20  he index of the 
a580: 6f 72 69 67 69 6e 61 6c 20 74 65 72 6d 2e 0a 2a  original term..*
a590: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78  /.static void ex
a5a0: 70 72 41 6e 61 6c 79 7a 65 28 0a 20 20 53 72 63  prAnalyze(.  Src
a5b0: 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20 20  List *pSrc,     
a5c0: 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20 46 52         /* the FR
a5d0: 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57  OM clause */.  W
a5e0: 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c  hereClause *pWC,
a5f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20           /* the 
a600: 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
a610: 20 20 69 6e 74 20 69 64 78 54 65 72 6d 20 20 20    int idxTerm   
a620: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
a630: 6e 64 65 78 20 6f 66 20 74 68 65 20 74 65 72 6d  ndex of the term
a640: 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 20   to be analyzed 
a650: 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 49 6e 66  */.){.  WhereInf
a660: 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70 57 43 2d  o *pWInfo = pWC-
a670: 3e 70 57 49 6e 66 6f 3b 20 2f 2a 20 57 48 45 52  >pWInfo; /* WHER
a680: 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73  E clause process
a690: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
a6a0: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
a6b0: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
a6c0: 20 20 2f 2a 20 54 68 65 20 74 65 72 6d 20 74 6f    /* The term to
a6d0: 20 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a   be analyzed */.
a6e0: 20 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a    WhereMaskSet *
a6f0: 70 4d 61 73 6b 53 65 74 3b 20 20 20 20 20 20 20  pMaskSet;       
a700: 20 20 20 2f 2a 20 53 65 74 20 6f 66 20 74 61 62     /* Set of tab
a710: 6c 65 20 69 6e 64 65 78 20 6d 61 73 6b 73 20 2a  le index masks *
a720: 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b  /.  Expr *pExpr;
a730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a740: 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72       /* The expr
a750: 65 73 73 69 6f 6e 20 74 6f 20 62 65 20 61 6e 61  ession to be ana
a760: 6c 79 7a 65 64 20 2a 2f 0a 20 20 42 69 74 6d 61  lyzed */.  Bitma
a770: 73 6b 20 70 72 65 72 65 71 4c 65 66 74 3b 20 20  sk prereqLeft;  
a780: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
a790: 72 65 72 65 71 75 65 73 69 74 65 73 20 6f 66 20  rerequesites of 
a7a0: 74 68 65 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  the pExpr->pLeft
a7b0: 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 70 72   */.  Bitmask pr
a7c0: 65 72 65 71 41 6c 6c 3b 20 20 20 20 20 20 20 20  ereqAll;        
a7d0: 20 20 20 20 20 20 20 2f 2a 20 50 72 65 72 65 71         /* Prereq
a7e0: 75 65 73 69 74 65 73 20 6f 66 20 70 45 78 70 72  uesites of pExpr
a7f0: 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 65 78   */.  Bitmask ex
a800: 74 72 61 52 69 67 68 74 20 3d 20 30 3b 20 20 20  traRight = 0;   
a810: 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20         /* Extra 
a820: 64 65 70 65 6e 64 65 6e 63 69 65 73 20 6f 6e 20  dependencies on 
a830: 4c 45 46 54 20 4a 4f 49 4e 20 2a 2f 0a 20 20 45  LEFT JOIN */.  E
a840: 78 70 72 20 2a 70 53 74 72 31 20 3d 20 30 3b 20  xpr *pStr1 = 0; 
a850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a860: 2f 2a 20 52 48 53 20 6f 66 20 4c 49 4b 45 2f 47  /* RHS of LIKE/G
a870: 4c 4f 42 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a  LOB operator */.
a880: 20 20 69 6e 74 20 69 73 43 6f 6d 70 6c 65 74 65    int isComplete
a890: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
a8a0: 20 20 20 2f 2a 20 52 48 53 20 6f 66 20 4c 49 4b     /* RHS of LIK
a8b0: 45 2f 47 4c 4f 42 20 65 6e 64 73 20 77 69 74 68  E/GLOB ends with
a8c0: 20 77 69 6c 64 63 61 72 64 20 2a 2f 0a 20 20 69   wildcard */.  i
a8d0: 6e 74 20 6e 6f 43 61 73 65 20 3d 20 30 3b 20 20  nt noCase = 0;  
a8e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a8f0: 2f 2a 20 75 70 70 65 72 63 61 73 65 20 65 71 75  /* uppercase equ
a900: 69 76 61 6c 65 6e 74 20 74 6f 20 6c 6f 77 65 72  ivalent to lower
a910: 63 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 70  case */.  int op
a920: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
a930: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f             /* To
a940: 70 2d 6c 65 76 65 6c 20 6f 70 65 72 61 74 6f 72  p-level operator
a950: 2e 20 20 70 45 78 70 72 2d 3e 6f 70 20 2a 2f 0a  .  pExpr->op */.
a960: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20    Parse *pParse 
a970: 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65  = pWInfo->pParse
a980: 3b 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f  ;  /* Parsing co
a990: 6e 74 65 78 74 20 2a 2f 0a 20 20 73 71 6c 69 74  ntext */.  sqlit
a9a0: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
a9b0: 3e 64 62 3b 20 20 20 20 20 20 20 20 2f 2a 20 44  >db;        /* D
a9c0: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
a9d0: 6f 6e 20 2a 2f 0a 0a 20 20 69 66 28 20 64 62 2d  on */..  if( db-
a9e0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
a9f0: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
aa00: 0a 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d  .  pTerm = &pWC-
aa10: 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 70  >a[idxTerm];.  p
aa20: 4d 61 73 6b 53 65 74 20 3d 20 26 70 57 49 6e 66  MaskSet = &pWInf
aa30: 6f 2d 3e 73 4d 61 73 6b 53 65 74 3b 0a 20 20 70  o->sMaskSet;.  p
aa40: 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45  Expr = pTerm->pE
aa50: 78 70 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70  xpr;.  assert( p
aa60: 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 53 20  Expr->op!=TK_AS 
aa70: 26 26 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  && pExpr->op!=TK
aa80: 5f 43 4f 4c 4c 41 54 45 20 29 3b 0a 20 20 70 72  _COLLATE );.  pr
aa90: 65 72 65 71 4c 65 66 74 20 3d 20 65 78 70 72 54  ereqLeft = exprT
aaa0: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
aab0: 65 74 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  et, pExpr->pLeft
aac0: 29 3b 0a 20 20 6f 70 20 3d 20 70 45 78 70 72 2d  );.  op = pExpr-
aad0: 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54  >op;.  if( op==T
aae0: 4b 5f 49 4e 20 29 7b 0a 20 20 20 20 61 73 73 65  K_IN ){.    asse
aaf0: 72 74 28 20 70 45 78 70 72 2d 3e 70 52 69 67 68  rt( pExpr->pRigh
ab00: 74 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  t==0 );.    if( 
ab10: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
ab20: 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
ab30: 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20 70 54  ect) ){.      pT
ab40: 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
ab50: 20 3d 20 65 78 70 72 53 65 6c 65 63 74 54 61 62   = exprSelectTab
ab60: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
ab70: 2c 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65  , pExpr->x.pSele
ab80: 63 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ct);.    }else{.
ab90: 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 70 72 65        pTerm->pre
aba0: 72 65 71 52 69 67 68 74 20 3d 20 65 78 70 72 4c  reqRight = exprL
abb0: 69 73 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d  istTableUsage(pM
abc0: 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 78  askSet, pExpr->x
abd0: 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20  .pList);.    }. 
abe0: 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54   }else if( op==T
abf0: 4b 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20  K_ISNULL ){.    
ac00: 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
ac10: 68 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  ht = 0;.  }else{
ac20: 0a 20 20 20 20 70 54 65 72 6d 2d 3e 70 72 65 72  .    pTerm->prer
ac30: 65 71 52 69 67 68 74 20 3d 20 65 78 70 72 54 61  eqRight = exprTa
ac40: 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65  bleUsage(pMaskSe
ac50: 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  t, pExpr->pRight
ac60: 29 3b 0a 20 20 7d 0a 20 20 70 72 65 72 65 71 41  );.  }.  prereqA
ac70: 6c 6c 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73  ll = exprTableUs
ac80: 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 45  age(pMaskSet, pE
ac90: 78 70 72 29 3b 0a 20 20 69 66 28 20 45 78 70 72  xpr);.  if( Expr
aca0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
acb0: 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20  r, EP_FromJoin) 
acc0: 29 7b 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 78  ){.    Bitmask x
acd0: 20 3d 20 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b   = getMask(pMask
ace0: 53 65 74 2c 20 70 45 78 70 72 2d 3e 69 52 69 67  Set, pExpr->iRig
acf0: 68 74 4a 6f 69 6e 54 61 62 6c 65 29 3b 0a 20 20  htJoinTable);.  
ad00: 20 20 70 72 65 72 65 71 41 6c 6c 20 7c 3d 20 78    prereqAll |= x
ad10: 3b 0a 20 20 20 20 65 78 74 72 61 52 69 67 68 74  ;.    extraRight
ad20: 20 3d 20 78 2d 31 3b 20 20 2f 2a 20 4f 4e 20 63   = x-1;  /* ON c
ad30: 6c 61 75 73 65 20 74 65 72 6d 73 20 6d 61 79 20  lause terms may 
ad40: 6e 6f 74 20 62 65 20 75 73 65 64 20 77 69 74 68  not be used with
ad50: 20 61 6e 20 69 6e 64 65 78 0a 20 20 20 20 20 20   an index.      
ad60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ad70: 20 2a 2a 20 6f 6e 20 6c 65 66 74 20 74 61 62 6c   ** on left tabl
ad80: 65 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e  e of a LEFT JOIN
ad90: 2e 20 20 54 69 63 6b 65 74 20 23 33 30 31 35 20  .  Ticket #3015 
ada0: 2a 2f 0a 20 20 7d 0a 20 20 70 54 65 72 6d 2d 3e  */.  }.  pTerm->
adb0: 70 72 65 72 65 71 41 6c 6c 20 3d 20 70 72 65 72  prereqAll = prer
adc0: 65 71 41 6c 6c 3b 0a 20 20 70 54 65 72 6d 2d 3e  eqAll;.  pTerm->
add0: 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 2d 31 3b  leftCursor = -1;
ade0: 0a 20 20 70 54 65 72 6d 2d 3e 69 50 61 72 65 6e  .  pTerm->iParen
adf0: 74 20 3d 20 2d 31 3b 0a 20 20 70 54 65 72 6d 2d  t = -1;.  pTerm-
ae00: 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 30 3b 0a  >eOperator = 0;.
ae10: 20 20 69 66 28 20 61 6c 6c 6f 77 65 64 4f 70 28    if( allowedOp(
ae20: 6f 70 29 20 29 7b 0a 20 20 20 20 45 78 70 72 20  op) ){.    Expr 
ae30: 2a 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33  *pLeft = sqlite3
ae40: 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28  ExprSkipCollate(
ae50: 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
ae60: 20 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 20     Expr *pRight 
ae70: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69  = sqlite3ExprSki
ae80: 70 43 6f 6c 6c 61 74 65 28 70 45 78 70 72 2d 3e  pCollate(pExpr->
ae90: 70 52 69 67 68 74 29 3b 0a 20 20 20 20 75 31 36  pRight);.    u16
aea0: 20 6f 70 4d 61 73 6b 20 3d 20 28 70 54 65 72 6d   opMask = (pTerm
aeb0: 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20  ->prereqRight & 
aec0: 70 72 65 72 65 71 4c 65 66 74 29 3d 3d 30 20 3f  prereqLeft)==0 ?
aed0: 20 57 4f 5f 41 4c 4c 20 3a 20 57 4f 5f 45 51 55   WO_ALL : WO_EQU
aee0: 49 56 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 66  IV;.    if( pLef
aef0: 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  t->op==TK_COLUMN
af00: 20 29 7b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d   ){.      pTerm-
af10: 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 70 4c  >leftCursor = pL
af20: 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20  eft->iTable;.   
af30: 20 20 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74     pTerm->u.left
af40: 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66 74 2d 3e  Column = pLeft->
af50: 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 70  iColumn;.      p
af60: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
af70: 3d 20 6f 70 65 72 61 74 6f 72 4d 61 73 6b 28 6f  = operatorMask(o
af80: 70 29 20 26 20 6f 70 4d 61 73 6b 3b 0a 20 20 20  p) & opMask;.   
af90: 20 7d 0a 20 20 20 20 69 66 28 20 70 52 69 67 68   }.    if( pRigh
afa0: 74 20 26 26 20 70 52 69 67 68 74 2d 3e 6f 70 3d  t && pRight->op=
afb0: 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20  =TK_COLUMN ){.  
afc0: 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
afd0: 4e 65 77 3b 0a 20 20 20 20 20 20 45 78 70 72 20  New;.      Expr 
afe0: 2a 70 44 75 70 3b 0a 20 20 20 20 20 20 75 31 36  *pDup;.      u16
aff0: 20 65 45 78 74 72 61 4f 70 20 3d 20 30 3b 20 20   eExtraOp = 0;  
b000: 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 62        /* Extra b
b010: 69 74 73 20 66 6f 72 20 70 4e 65 77 2d 3e 65 4f  its for pNew->eO
b020: 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20  perator */.     
b030: 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74   if( pTerm->left
b040: 43 75 72 73 6f 72 3e 3d 30 20 29 7b 0a 20 20 20  Cursor>=0 ){.   
b050: 20 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77 3b       int idxNew;
b060: 0a 20 20 20 20 20 20 20 20 70 44 75 70 20 3d 20  .        pDup = 
b070: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
b080: 62 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20  b, pExpr, 0);.  
b090: 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61        if( db->ma
b0a0: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
b0b0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
b0c0: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 44  xprDelete(db, pD
b0d0: 75 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  up);.          r
b0e0: 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 7d  eturn;.        }
b0f0: 0a 20 20 20 20 20 20 20 20 69 64 78 4e 65 77 20  .        idxNew 
b100: 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73  = whereClauseIns
b110: 65 72 74 28 70 57 43 2c 20 70 44 75 70 2c 20 54  ert(pWC, pDup, T
b120: 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d  ERM_VIRTUAL|TERM
b130: 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20  _DYNAMIC);.     
b140: 20 20 20 69 66 28 20 69 64 78 4e 65 77 3d 3d 30     if( idxNew==0
b150: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20   ) return;.     
b160: 20 20 20 70 4e 65 77 20 3d 20 26 70 57 43 2d 3e     pNew = &pWC->
b170: 61 5b 69 64 78 4e 65 77 5d 3b 0a 20 20 20 20 20  a[idxNew];.     
b180: 20 20 20 6d 61 72 6b 54 65 72 6d 41 73 43 68 69     markTermAsChi
b190: 6c 64 28 70 57 43 2c 20 69 64 78 4e 65 77 2c 20  ld(pWC, idxNew, 
b1a0: 69 64 78 54 65 72 6d 29 3b 0a 20 20 20 20 20 20  idxTerm);.      
b1b0: 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e    pTerm = &pWC->
b1c0: 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20  a[idxTerm];.    
b1d0: 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61      pTerm->wtFla
b1e0: 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 50 49 45  gs |= TERM_COPIE
b1f0: 44 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  D;.        if( p
b200: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 0a  Expr->op==TK_EQ.
b210: 20 20 20 20 20 20 20 20 20 26 26 20 21 45 78 70           && !Exp
b220: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
b230: 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  pr, EP_FromJoin)
b240: 0a 20 20 20 20 20 20 20 20 20 26 26 20 4f 70 74  .         && Opt
b250: 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64  imizationEnabled
b260: 28 64 62 2c 20 53 51 4c 49 54 45 5f 54 72 61 6e  (db, SQLITE_Tran
b270: 73 69 74 69 76 65 29 0a 20 20 20 20 20 20 20 20  sitive).        
b280: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 54 65  ){.          pTe
b290: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 7c 3d  rm->eOperator |=
b2a0: 20 57 4f 5f 45 51 55 49 56 3b 0a 20 20 20 20 20   WO_EQUIV;.     
b2b0: 20 20 20 20 20 65 45 78 74 72 61 4f 70 20 3d 20       eExtraOp = 
b2c0: 57 4f 5f 45 51 55 49 56 3b 0a 20 20 20 20 20 20  WO_EQUIV;.      
b2d0: 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
b2e0: 0a 20 20 20 20 20 20 20 20 70 44 75 70 20 3d 20  .        pDup = 
b2f0: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 70  pExpr;.        p
b300: 4e 65 77 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20  New = pTerm;.   
b310: 20 20 20 7d 0a 20 20 20 20 20 20 65 78 70 72 43     }.      exprC
b320: 6f 6d 6d 75 74 65 28 70 50 61 72 73 65 2c 20 70  ommute(pParse, p
b330: 44 75 70 29 3b 0a 20 20 20 20 20 20 70 4c 65 66  Dup);.      pLef
b340: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53  t = sqlite3ExprS
b350: 6b 69 70 43 6f 6c 6c 61 74 65 28 70 44 75 70 2d  kipCollate(pDup-
b360: 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 70  >pLeft);.      p
b370: 4e 65 77 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20  New->leftCursor 
b380: 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3b  = pLeft->iTable;
b390: 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 6c  .      pNew->u.l
b3a0: 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66  eftColumn = pLef
b3b0: 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  t->iColumn;.    
b3c0: 20 20 74 65 73 74 63 61 73 65 28 20 28 70 72 65    testcase( (pre
b3d0: 72 65 71 4c 65 66 74 20 7c 20 65 78 74 72 61 52  reqLeft | extraR
b3e0: 69 67 68 74 29 20 21 3d 20 70 72 65 72 65 71 4c  ight) != prereqL
b3f0: 65 66 74 20 29 3b 0a 20 20 20 20 20 20 70 4e 65  eft );.      pNe
b400: 77 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d  w->prereqRight =
b410: 20 70 72 65 72 65 71 4c 65 66 74 20 7c 20 65 78   prereqLeft | ex
b420: 74 72 61 52 69 67 68 74 3b 0a 20 20 20 20 20 20  traRight;.      
b430: 70 4e 65 77 2d 3e 70 72 65 72 65 71 41 6c 6c 20  pNew->prereqAll 
b440: 3d 20 70 72 65 72 65 71 41 6c 6c 3b 0a 20 20 20  = prereqAll;.   
b450: 20 20 20 70 4e 65 77 2d 3e 65 4f 70 65 72 61 74     pNew->eOperat
b460: 6f 72 20 3d 20 28 6f 70 65 72 61 74 6f 72 4d 61  or = (operatorMa
b470: 73 6b 28 70 44 75 70 2d 3e 6f 70 29 20 2b 20 65  sk(pDup->op) + e
b480: 45 78 74 72 61 4f 70 29 20 26 20 6f 70 4d 61 73  ExtraOp) & opMas
b490: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69  k;.    }.  }..#i
b4a0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
b4b0: 54 5f 42 45 54 57 45 45 4e 5f 4f 50 54 49 4d 49  T_BETWEEN_OPTIMI
b4c0: 5a 41 54 49 4f 4e 0a 20 20 2f 2a 20 49 66 20 61  ZATION.  /* If a
b4d0: 20 74 65 72 6d 20 69 73 20 74 68 65 20 42 45 54   term is the BET
b4e0: 57 45 45 4e 20 6f 70 65 72 61 74 6f 72 2c 20 63  WEEN operator, c
b4f0: 72 65 61 74 65 20 74 77 6f 20 6e 65 77 20 76 69  reate two new vi
b500: 72 74 75 61 6c 20 74 65 72 6d 73 0a 20 20 2a 2a  rtual terms.  **
b510: 20 74 68 61 74 20 64 65 66 69 6e 65 20 74 68 65   that define the
b520: 20 72 61 6e 67 65 20 74 68 61 74 20 74 68 65 20   range that the 
b530: 42 45 54 57 45 45 4e 20 69 6d 70 6c 65 6d 65 6e  BETWEEN implemen
b540: 74 73 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65  ts.  For example
b550: 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
b560: 20 61 20 42 45 54 57 45 45 4e 20 62 20 41 4e 44   a BETWEEN b AND
b570: 20 63 0a 20 20 2a 2a 0a 20 20 2a 2a 20 69 73 20   c.  **.  ** is 
b580: 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 3a 0a  converted into:.
b590: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 28    **.  **      (
b5a0: 61 20 42 45 54 57 45 45 4e 20 62 20 41 4e 44 20  a BETWEEN b AND 
b5b0: 63 29 20 41 4e 44 20 28 61 3e 3d 62 29 20 41 4e  c) AND (a>=b) AN
b5c0: 44 20 28 61 3c 3d 63 29 0a 20 20 2a 2a 0a 20 20  D (a<=c).  **.  
b5d0: 2a 2a 20 54 68 65 20 74 77 6f 20 6e 65 77 20 74  ** The two new t
b5e0: 65 72 6d 73 20 61 72 65 20 61 64 64 65 64 20 6f  erms are added o
b5f0: 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74  nto the end of t
b600: 68 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 6f  he WhereClause o
b610: 62 6a 65 63 74 2e 0a 20 20 2a 2a 20 54 68 65 20  bject..  ** The 
b620: 6e 65 77 20 74 65 72 6d 73 20 61 72 65 20 22 64  new terms are "d
b630: 79 6e 61 6d 69 63 22 20 61 6e 64 20 61 72 65 20  ynamic" and are 
b640: 63 68 69 6c 64 72 65 6e 20 6f 66 20 74 68 65 20  children of the 
b650: 6f 72 69 67 69 6e 61 6c 20 42 45 54 57 45 45 4e  original BETWEEN
b660: 0a 20 20 2a 2a 20 74 65 72 6d 2e 20 20 54 68 61  .  ** term.  Tha
b670: 74 20 6d 65 61 6e 73 20 74 68 61 74 20 69 66 20  t means that if 
b680: 74 68 65 20 42 45 54 57 45 45 4e 20 74 65 72 6d  the BETWEEN term
b690: 20 69 73 20 63 6f 64 65 64 2c 20 74 68 65 20 63   is coded, the c
b6a0: 68 69 6c 64 72 65 6e 20 61 72 65 0a 20 20 2a 2a  hildren are.  **
b6b0: 20 73 6b 69 70 70 65 64 2e 20 20 4f 72 2c 20 69   skipped.  Or, i
b6c0: 66 20 74 68 65 20 63 68 69 6c 64 72 65 6e 20 61  f the children a
b6d0: 72 65 20 73 61 74 69 73 66 69 65 64 20 62 79 20  re satisfied by 
b6e0: 61 6e 20 69 6e 64 65 78 2c 20 74 68 65 20 6f 72  an index, the or
b6f0: 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 42 45 54 57  iginal.  ** BETW
b700: 45 45 4e 20 74 65 72 6d 20 69 73 20 73 6b 69 70  EEN term is skip
b710: 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65  ped..  */.  else
b720: 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d   if( pExpr->op==
b730: 54 4b 5f 42 45 54 57 45 45 4e 20 26 26 20 70 57  TK_BETWEEN && pW
b740: 43 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 7b  C->op==TK_AND ){
b750: 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70  .    ExprList *p
b760: 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e  List = pExpr->x.
b770: 70 4c 69 73 74 3b 0a 20 20 20 20 69 6e 74 20 69  pList;.    int i
b780: 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e  ;.    static con
b790: 73 74 20 75 38 20 6f 70 73 5b 5d 20 3d 20 7b 54  st u8 ops[] = {T
b7a0: 4b 5f 47 45 2c 20 54 4b 5f 4c 45 7d 3b 0a 20 20  K_GE, TK_LE};.  
b7b0: 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 21    assert( pList!
b7c0: 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
b7d0: 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d  ( pList->nExpr==
b7e0: 32 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  2 );.    for(i=0
b7f0: 3b 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<2; i++){.   
b800: 20 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70     Expr *pNewExp
b810: 72 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 64 78  r;.      int idx
b820: 4e 65 77 3b 0a 20 20 20 20 20 20 70 4e 65 77 45  New;.      pNewE
b830: 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78  xpr = sqlite3PEx
b840: 70 72 28 70 50 61 72 73 65 2c 20 6f 70 73 5b 69  pr(pParse, ops[i
b850: 5d 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  ], .            
b860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b870: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
b880: 64 62 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  db, pExpr->pLeft
b890: 2c 20 30 29 2c 0a 20 20 20 20 20 20 20 20 20 20  , 0),.          
b8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b8b0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 75     sqlite3ExprDu
b8c0: 70 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61 5b 69  p(db, pList->a[i
b8d0: 5d 2e 70 45 78 70 72 2c 20 30 29 2c 20 30 29 3b  ].pExpr, 0), 0);
b8e0: 0a 20 20 20 20 20 20 74 72 61 6e 73 66 65 72 4a  .      transferJ
b8f0: 6f 69 6e 4d 61 72 6b 69 6e 67 73 28 70 4e 65 77  oinMarkings(pNew
b900: 45 78 70 72 2c 20 70 45 78 70 72 29 3b 0a 20 20  Expr, pExpr);.  
b910: 20 20 20 20 69 64 78 4e 65 77 20 3d 20 77 68 65      idxNew = whe
b920: 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70  reClauseInsert(p
b930: 57 43 2c 20 70 4e 65 77 45 78 70 72 2c 20 54 45  WC, pNewExpr, TE
b940: 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f  RM_VIRTUAL|TERM_
b950: 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20  DYNAMIC);.      
b960: 74 65 73 74 63 61 73 65 28 20 69 64 78 4e 65 77  testcase( idxNew
b970: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 65 78 70  ==0 );.      exp
b980: 72 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20 70  rAnalyze(pSrc, p
b990: 57 43 2c 20 69 64 78 4e 65 77 29 3b 0a 20 20 20  WC, idxNew);.   
b9a0: 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d     pTerm = &pWC-
b9b0: 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20  >a[idxTerm];.   
b9c0: 20 20 20 6d 61 72 6b 54 65 72 6d 41 73 43 68 69     markTermAsChi
b9d0: 6c 64 28 70 57 43 2c 20 69 64 78 4e 65 77 2c 20  ld(pWC, idxNew, 
b9e0: 69 64 78 54 65 72 6d 29 3b 0a 20 20 20 20 7d 0a  idxTerm);.    }.
b9f0: 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
ba00: 4c 49 54 45 5f 4f 4d 49 54 5f 42 45 54 57 45 45  LITE_OMIT_BETWEE
ba10: 4e 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a  N_OPTIMIZATION *
ba20: 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  /..#if !defined(
ba30: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f  SQLITE_OMIT_OR_O
ba40: 50 54 49 4d 49 5a 41 54 49 4f 4e 29 20 26 26 20  PTIMIZATION) && 
ba50: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
ba60: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 0a 20  OMIT_SUBQUERY). 
ba70: 20 2f 2a 20 41 6e 61 6c 79 7a 65 20 61 20 74 65   /* Analyze a te
ba80: 72 6d 20 74 68 61 74 20 69 73 20 63 6f 6d 70 6f  rm that is compo
ba90: 73 65 64 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f  sed of two or mo
baa0: 72 65 20 73 75 62 74 65 72 6d 73 20 63 6f 6e 6e  re subterms conn
bab0: 65 63 74 65 64 20 62 79 0a 20 20 2a 2a 20 61 6e  ected by.  ** an
bac0: 20 4f 52 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20   OR operator..  
bad0: 2a 2f 0a 20 20 65 6c 73 65 20 69 66 28 20 70 45  */.  else if( pE
bae0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52 20 29  xpr->op==TK_OR )
baf0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 57  {.    assert( pW
bb00: 43 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 3b  C->op==TK_AND );
bb10: 0a 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65  .    exprAnalyze
bb20: 4f 72 54 65 72 6d 28 70 53 72 63 2c 20 70 57 43  OrTerm(pSrc, pWC
bb30: 2c 20 69 64 78 54 65 72 6d 29 3b 0a 20 20 20 20  , idxTerm);.    
bb40: 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b  pTerm = &pWC->a[
bb50: 69 64 78 54 65 72 6d 5d 3b 0a 20 20 7d 0a 23 65  idxTerm];.  }.#e
bb60: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
bb70: 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54  MIT_OR_OPTIMIZAT
bb80: 49 4f 4e 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  ION */..#ifndef 
bb90: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45  SQLITE_OMIT_LIKE
bba0: 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 20 20  _OPTIMIZATION.  
bbb0: 2f 2a 20 41 64 64 20 63 6f 6e 73 74 72 61 69 6e  /* Add constrain
bbc0: 74 73 20 74 6f 20 72 65 64 75 63 65 20 74 68 65  ts to reduce the
bbd0: 20 73 65 61 72 63 68 20 73 70 61 63 65 20 6f 6e   search space on
bbe0: 20 61 20 4c 49 4b 45 20 6f 72 20 47 4c 4f 42 0a   a LIKE or GLOB.
bbf0: 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72 2e 0a 20    ** operator.. 
bc00: 20 2a 2a 0a 20 20 2a 2a 20 41 20 6c 69 6b 65 20   **.  ** A like 
bc10: 70 61 74 74 65 72 6e 20 6f 66 20 74 68 65 20 66  pattern of the f
bc20: 6f 72 6d 20 22 78 20 4c 49 4b 45 20 27 61 42 63  orm "x LIKE 'aBc
bc30: 25 27 22 20 69 73 20 63 68 61 6e 67 65 64 20 69  %'" is changed i
bc40: 6e 74 6f 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a  nto constraints.
bc50: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20    **.  **       
bc60: 20 20 20 78 3e 3d 27 41 42 43 27 20 41 4e 44 20     x>='ABC' AND 
bc70: 78 3c 27 61 62 64 27 20 41 4e 44 20 78 20 4c 49  x<'abd' AND x LI
bc80: 4b 45 20 27 61 42 63 25 27 0a 20 20 2a 2a 0a 20  KE 'aBc%'.  **. 
bc90: 20 2a 2a 20 54 68 65 20 6c 61 73 74 20 63 68 61   ** The last cha
bca0: 72 61 63 74 65 72 20 6f 66 20 74 68 65 20 70 72  racter of the pr
bcb0: 65 66 69 78 20 22 61 62 63 22 20 69 73 20 69 6e  efix "abc" is in
bcc0: 63 72 65 6d 65 6e 74 65 64 20 74 6f 20 66 6f 72  cremented to for
bcd0: 6d 20 74 68 65 0a 20 20 2a 2a 20 74 65 72 6d 69  m the.  ** termi
bce0: 6e 61 74 69 6f 6e 20 63 6f 6e 64 69 74 69 6f 6e  nation condition
bcf0: 20 22 61 62 64 22 2e 20 20 49 66 20 63 61 73 65   "abd".  If case
bd00: 20 69 73 20 6e 6f 74 20 73 69 67 6e 69 66 69 63   is not signific
bd10: 61 6e 74 20 28 74 68 65 20 64 65 66 61 75 6c 74  ant (the default
bd20: 0a 20 20 2a 2a 20 66 6f 72 20 4c 49 4b 45 29 20  .  ** for LIKE) 
bd30: 74 68 65 6e 20 74 68 65 20 6c 6f 77 65 72 2d 62  then the lower-b
bd40: 6f 75 6e 64 20 69 73 20 6d 61 64 65 20 61 6c 6c  ound is made all
bd50: 20 75 70 70 65 72 63 61 73 65 20 61 6e 64 20 74   uppercase and t
bd60: 68 65 20 75 70 70 65 72 2d 0a 20 20 2a 2a 20 62  he upper-.  ** b
bd70: 6f 75 6e 64 20 69 73 20 6d 61 64 65 20 61 6c 6c  ound is made all
bd80: 20 6c 6f 77 65 72 63 61 73 65 20 73 6f 20 74 68   lowercase so th
bd90: 61 74 20 74 68 65 20 62 6f 75 6e 64 73 20 61 6c  at the bounds al
bda0: 73 6f 20 77 6f 72 6b 20 77 68 65 6e 20 63 6f 6d  so work when com
bdb0: 70 61 72 69 6e 67 0a 20 20 2a 2a 20 42 4c 4f 42  paring.  ** BLOB
bdc0: 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 57  s..  */.  if( pW
bdd0: 43 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 0a 20  C->op==TK_AND . 
bde0: 20 20 26 26 20 69 73 4c 69 6b 65 4f 72 47 6c 6f    && isLikeOrGlo
bdf0: 62 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  b(pParse, pExpr,
be00: 20 26 70 53 74 72 31 2c 20 26 69 73 43 6f 6d 70   &pStr1, &isComp
be10: 6c 65 74 65 2c 20 26 6e 6f 43 61 73 65 29 0a 20  lete, &noCase). 
be20: 20 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 4c   ){.    Expr *pL
be30: 65 66 74 3b 20 20 20 20 20 20 20 2f 2a 20 4c 48  eft;       /* LH
be40: 53 20 6f 66 20 4c 49 4b 45 2f 47 4c 4f 42 20 6f  S of LIKE/GLOB o
be50: 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 45  perator */.    E
be60: 78 70 72 20 2a 70 53 74 72 32 3b 20 20 20 20 20  xpr *pStr2;     
be70: 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20 70 53 74    /* Copy of pSt
be80: 72 31 20 2d 20 52 48 53 20 6f 66 20 4c 49 4b 45  r1 - RHS of LIKE
be90: 2f 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72 20 2a  /GLOB operator *
bea0: 2f 0a 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77  /.    Expr *pNew
beb0: 45 78 70 72 31 3b 0a 20 20 20 20 45 78 70 72 20  Expr1;.    Expr 
bec0: 2a 70 4e 65 77 45 78 70 72 32 3b 0a 20 20 20 20  *pNewExpr2;.    
bed0: 69 6e 74 20 69 64 78 4e 65 77 31 3b 0a 20 20 20  int idxNew1;.   
bee0: 20 69 6e 74 20 69 64 78 4e 65 77 32 3b 0a 20 20   int idxNew2;.  
bef0: 20 20 54 6f 6b 65 6e 20 73 43 6f 6c 6c 53 65 71    Token sCollSeq
bf00: 4e 61 6d 65 3b 20 20 2f 2a 20 4e 61 6d 65 20 6f  Name;  /* Name o
bf10: 66 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  f collating sequ
bf20: 65 6e 63 65 20 2a 2f 0a 20 20 20 20 63 6f 6e 73  ence */.    cons
bf30: 74 20 75 31 36 20 77 74 46 6c 61 67 73 20 3d 20  t u16 wtFlags = 
bf40: 54 45 52 4d 5f 4c 49 4b 45 4f 50 54 20 7c 20 54  TERM_LIKEOPT | T
bf50: 45 52 4d 5f 56 49 52 54 55 41 4c 20 7c 20 54 45  ERM_VIRTUAL | TE
bf60: 52 4d 5f 44 59 4e 41 4d 49 43 3b 0a 0a 20 20 20  RM_DYNAMIC;..   
bf70: 20 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e   pLeft = pExpr->
bf80: 78 2e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45  x.pList->a[1].pE
bf90: 78 70 72 3b 0a 20 20 20 20 70 53 74 72 32 20 3d  xpr;.    pStr2 =
bfa0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
bfb0: 64 62 2c 20 70 53 74 72 31 2c 20 30 29 3b 0a 0a  db, pStr1, 0);..
bfc0: 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74      /* Convert t
bfd0: 68 65 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20 74  he lower bound t
bfe0: 6f 20 75 70 70 65 72 2d 63 61 73 65 20 61 6e 64  o upper-case and
bff0: 20 74 68 65 20 75 70 70 65 72 20 62 6f 75 6e 64   the upper bound
c000: 20 74 6f 0a 20 20 20 20 2a 2a 20 6c 6f 77 65 72   to.    ** lower
c010: 2d 63 61 73 65 20 28 75 70 70 65 72 2d 63 61 73  -case (upper-cas
c020: 65 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6c  e is less than l
c030: 6f 77 65 72 2d 63 61 73 65 20 69 6e 20 41 53 43  ower-case in ASC
c040: 49 49 29 20 73 6f 20 74 68 61 74 0a 20 20 20 20  II) so that.    
c050: 2a 2a 20 74 68 65 20 72 61 6e 67 65 20 63 6f 6e  ** the range con
c060: 73 74 72 61 69 6e 74 73 20 61 6c 73 6f 20 77 6f  straints also wo
c070: 72 6b 20 66 6f 72 20 42 4c 4f 42 73 0a 20 20 20  rk for BLOBs.   
c080: 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 6f 43 61   */.    if( noCa
c090: 73 65 20 26 26 20 21 70 50 61 72 73 65 2d 3e 64  se && !pParse->d
c0a0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
c0b0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  ){.      int i;.
c0c0: 20 20 20 20 20 20 63 68 61 72 20 63 3b 0a 20 20        char c;.  
c0d0: 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61      pTerm->wtFla
c0e0: 67 73 20 7c 3d 20 54 45 52 4d 5f 4c 49 4b 45 3b  gs |= TERM_LIKE;
c0f0: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
c100: 28 63 20 3d 20 70 53 74 72 31 2d 3e 75 2e 7a 54  (c = pStr1->u.zT
c110: 6f 6b 65 6e 5b 69 5d 29 21 3d 30 3b 20 69 2b 2b  oken[i])!=0; i++
c120: 29 7b 0a 20 20 20 20 20 20 20 20 70 53 74 72 31  ){.        pStr1
c130: 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 69 5d 20 3d 20  ->u.zToken[i] = 
c140: 73 71 6c 69 74 65 33 54 6f 75 70 70 65 72 28 63  sqlite3Toupper(c
c150: 29 3b 0a 20 20 20 20 20 20 20 20 70 53 74 72 32  );.        pStr2
c160: 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 69 5d 20 3d 20  ->u.zToken[i] = 
c170: 73 71 6c 69 74 65 33 54 6f 6c 6f 77 65 72 28 63  sqlite3Tolower(c
c180: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
c190: 0a 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e 6d  ..    if( !db->m
c1a0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
c1b0: 20 20 20 20 20 75 38 20 63 2c 20 2a 70 43 3b 20       u8 c, *pC; 
c1c0: 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 63 68        /* Last ch
c1d0: 61 72 61 63 74 65 72 20 62 65 66 6f 72 65 20 74  aracter before t
c1e0: 68 65 20 66 69 72 73 74 20 77 69 6c 64 63 61 72  he first wildcar
c1f0: 64 20 2a 2f 0a 20 20 20 20 20 20 70 43 20 3d 20  d */.      pC = 
c200: 28 75 38 2a 29 26 70 53 74 72 32 2d 3e 75 2e 7a  (u8*)&pStr2->u.z
c210: 54 6f 6b 65 6e 5b 73 71 6c 69 74 65 33 53 74 72  Token[sqlite3Str
c220: 6c 65 6e 33 30 28 70 53 74 72 32 2d 3e 75 2e 7a  len30(pStr2->u.z
c230: 54 6f 6b 65 6e 29 2d 31 5d 3b 0a 20 20 20 20 20  Token)-1];.     
c240: 20 63 20 3d 20 2a 70 43 3b 0a 20 20 20 20 20 20   c = *pC;.      
c250: 69 66 28 20 6e 6f 43 61 73 65 20 29 7b 0a 20 20  if( noCase ){.  
c260: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69        /* The poi
c270: 6e 74 20 69 73 20 74 6f 20 69 6e 63 72 65 6d 65  nt is to increme
c280: 6e 74 20 74 68 65 20 6c 61 73 74 20 63 68 61 72  nt the last char
c290: 61 63 74 65 72 20 62 65 66 6f 72 65 20 74 68 65  acter before the
c2a0: 20 66 69 72 73 74 0a 20 20 20 20 20 20 20 20 2a   first.        *
c2b0: 2a 20 77 69 6c 64 63 61 72 64 2e 20 20 42 75 74  * wildcard.  But
c2c0: 20 69 66 20 77 65 20 69 6e 63 72 65 6d 65 6e 74   if we increment
c2d0: 20 27 40 27 2c 20 74 68 61 74 20 77 69 6c 6c 20   '@', that will 
c2e0: 70 75 73 68 20 69 74 20 69 6e 74 6f 20 74 68 65  push it into the
c2f0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 70 68  .        ** alph
c300: 61 62 65 74 69 63 20 72 61 6e 67 65 20 77 68 65  abetic range whe
c310: 72 65 20 63 61 73 65 20 63 6f 6e 76 65 72 73 69  re case conversi
c320: 6f 6e 73 20 77 69 6c 6c 20 6d 65 73 73 20 75 70  ons will mess up
c330: 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a   the .        **
c340: 20 69 6e 65 71 75 61 6c 69 74 79 2e 20 20 54 6f   inequality.  To
c350: 20 61 76 6f 69 64 20 74 68 69 73 2c 20 6d 61 6b   avoid this, mak
c360: 65 20 73 75 72 65 20 74 6f 20 61 6c 73 6f 20 72  e sure to also r
c370: 75 6e 20 74 68 65 20 66 75 6c 6c 0a 20 20 20 20  un the full.    
c380: 20 20 20 20 2a 2a 20 4c 49 4b 45 20 6f 6e 20 61      ** LIKE on a
c390: 6c 6c 20 63 61 6e 64 69 64 61 74 65 20 65 78 70  ll candidate exp
c3a0: 72 65 73 73 69 6f 6e 73 20 62 79 20 63 6c 65 61  ressions by clea
c3b0: 72 69 6e 67 20 74 68 65 20 69 73 43 6f 6d 70 6c  ring the isCompl
c3c0: 65 74 65 20 66 6c 61 67 0a 20 20 20 20 20 20 20  ete flag.       
c3d0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
c3e0: 63 3d 3d 27 41 27 2d 31 20 29 20 69 73 43 6f 6d  c=='A'-1 ) isCom
c3f0: 70 6c 65 74 65 20 3d 20 30 3b 0a 20 20 20 20 20  plete = 0;.     
c400: 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33 55 70     c = sqlite3Up
c410: 70 65 72 54 6f 4c 6f 77 65 72 5b 63 5d 3b 0a 20  perToLower[c];. 
c420: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 70 43       }.      *pC
c430: 20 3d 20 63 20 2b 20 31 3b 0a 20 20 20 20 7d 0a   = c + 1;.    }.
c440: 20 20 20 20 73 43 6f 6c 6c 53 65 71 4e 61 6d 65      sCollSeqName
c450: 2e 7a 20 3d 20 6e 6f 43 61 73 65 20 3f 20 22 4e  .z = noCase ? "N
c460: 4f 43 41 53 45 22 20 3a 20 22 42 49 4e 41 52 59  OCASE" : "BINARY
c470: 22 3b 0a 20 20 20 20 73 43 6f 6c 6c 53 65 71 4e  ";.    sCollSeqN
c480: 61 6d 65 2e 6e 20 3d 20 36 3b 0a 20 20 20 20 70  ame.n = 6;.    p
c490: 4e 65 77 45 78 70 72 31 20 3d 20 73 71 6c 69 74  NewExpr1 = sqlit
c4a0: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4c  e3ExprDup(db, pL
c4b0: 65 66 74 2c 20 30 29 3b 0a 20 20 20 20 70 4e 65  eft, 0);.    pNe
c4c0: 77 45 78 70 72 31 20 3d 20 73 71 6c 69 74 65 33  wExpr1 = sqlite3
c4d0: 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
c4e0: 5f 47 45 2c 0a 20 20 20 20 20 20 20 20 20 20 20  _GE,.           
c4f0: 73 71 6c 69 74 65 33 45 78 70 72 41 64 64 43 6f  sqlite3ExprAddCo
c500: 6c 6c 61 74 65 54 6f 6b 65 6e 28 70 50 61 72 73  llateToken(pPars
c510: 65 2c 70 4e 65 77 45 78 70 72 31 2c 26 73 43 6f  e,pNewExpr1,&sCo
c520: 6c 6c 53 65 71 4e 61 6d 65 29 2c 0a 20 20 20 20  llSeqName),.    
c530: 20 20 20 20 20 20 20 70 53 74 72 31 2c 20 30 29         pStr1, 0)
c540: 3b 0a 20 20 20 20 74 72 61 6e 73 66 65 72 4a 6f  ;.    transferJo
c550: 69 6e 4d 61 72 6b 69 6e 67 73 28 70 4e 65 77 45  inMarkings(pNewE
c560: 78 70 72 31 2c 20 70 45 78 70 72 29 3b 0a 20 20  xpr1, pExpr);.  
c570: 20 20 69 64 78 4e 65 77 31 20 3d 20 77 68 65 72    idxNew1 = wher
c580: 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57  eClauseInsert(pW
c590: 43 2c 20 70 4e 65 77 45 78 70 72 31 2c 20 77 74  C, pNewExpr1, wt
c5a0: 46 6c 61 67 73 29 3b 0a 20 20 20 20 74 65 73 74  Flags);.    test
c5b0: 63 61 73 65 28 20 69 64 78 4e 65 77 31 3d 3d 30  case( idxNew1==0
c5c0: 20 29 3b 0a 20 20 20 20 65 78 70 72 41 6e 61 6c   );.    exprAnal
c5d0: 79 7a 65 28 70 53 72 63 2c 20 70 57 43 2c 20 69  yze(pSrc, pWC, i
c5e0: 64 78 4e 65 77 31 29 3b 0a 20 20 20 20 70 4e 65  dxNew1);.    pNe
c5f0: 77 45 78 70 72 32 20 3d 20 73 71 6c 69 74 65 33  wExpr2 = sqlite3
c600: 45 78 70 72 44 75 70 28 64 62 2c 20 70 4c 65 66  ExprDup(db, pLef
c610: 74 2c 20 30 29 3b 0a 20 20 20 20 70 4e 65 77 45  t, 0);.    pNewE
c620: 78 70 72 32 20 3d 20 73 71 6c 69 74 65 33 50 45  xpr2 = sqlite3PE
c630: 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 4c  xpr(pParse, TK_L
c640: 54 2c 0a 20 20 20 20 20 20 20 20 20 20 20 73 71  T,.           sq
c650: 6c 69 74 65 33 45 78 70 72 41 64 64 43 6f 6c 6c  lite3ExprAddColl
c660: 61 74 65 54 6f 6b 65 6e 28 70 50 61 72 73 65 2c  ateToken(pParse,
c670: 70 4e 65 77 45 78 70 72 32 2c 26 73 43 6f 6c 6c  pNewExpr2,&sColl
c680: 53 65 71 4e 61 6d 65 29 2c 0a 20 20 20 20 20 20  SeqName),.      
c690: 20 20 20 20 20 70 53 74 72 32 2c 20 30 29 3b 0a       pStr2, 0);.
c6a0: 20 20 20 20 74 72 61 6e 73 66 65 72 4a 6f 69 6e      transferJoin
c6b0: 4d 61 72 6b 69 6e 67 73 28 70 4e 65 77 45 78 70  Markings(pNewExp
c6c0: 72 32 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20  r2, pExpr);.    
c6d0: 69 64 78 4e 65 77 32 20 3d 20 77 68 65 72 65 43  idxNew2 = whereC
c6e0: 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c  lauseInsert(pWC,
c6f0: 20 70 4e 65 77 45 78 70 72 32 2c 20 77 74 46 6c   pNewExpr2, wtFl
c700: 61 67 73 29 3b 0a 20 20 20 20 74 65 73 74 63 61  ags);.    testca
c710: 73 65 28 20 69 64 78 4e 65 77 32 3d 3d 30 20 29  se( idxNew2==0 )
c720: 3b 0a 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a  ;.    exprAnalyz
c730: 65 28 70 53 72 63 2c 20 70 57 43 2c 20 69 64 78  e(pSrc, pWC, idx
c740: 4e 65 77 32 29 3b 0a 20 20 20 20 70 54 65 72 6d  New2);.    pTerm
c750: 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65   = &pWC->a[idxTe
c760: 72 6d 5d 3b 0a 20 20 20 20 69 66 28 20 69 73 43  rm];.    if( isC
c770: 6f 6d 70 6c 65 74 65 20 29 7b 0a 20 20 20 20 20  omplete ){.     
c780: 20 6d 61 72 6b 54 65 72 6d 41 73 43 68 69 6c 64   markTermAsChild
c790: 28 70 57 43 2c 20 69 64 78 4e 65 77 31 2c 20 69  (pWC, idxNew1, i
c7a0: 64 78 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 6d  dxTerm);.      m
c7b0: 61 72 6b 54 65 72 6d 41 73 43 68 69 6c 64 28 70  arkTermAsChild(p
c7c0: 57 43 2c 20 69 64 78 4e 65 77 32 2c 20 69 64 78  WC, idxNew2, idx
c7d0: 54 65 72 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Term);.    }.  }
c7e0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
c7f0: 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54 49  E_OMIT_LIKE_OPTI
c800: 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66  MIZATION */..#if
c810: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
c820: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
c830: 2f 2a 20 41 64 64 20 61 20 57 4f 5f 4d 41 54 43  /* Add a WO_MATC
c840: 48 20 61 75 78 69 6c 69 61 72 79 20 74 65 72 6d  H auxiliary term
c850: 20 74 6f 20 74 68 65 20 63 6f 6e 73 74 72 61 69   to the constrai
c860: 6e 74 20 73 65 74 20 69 66 20 74 68 65 0a 20 20  nt set if the.  
c870: 2a 2a 20 63 75 72 72 65 6e 74 20 65 78 70 72 65  ** current expre
c880: 73 73 69 6f 6e 20 69 73 20 6f 66 20 74 68 65 20  ssion is of the 
c890: 66 6f 72 6d 3a 20 20 63 6f 6c 75 6d 6e 20 4d 41  form:  column MA
c8a0: 54 43 48 20 65 78 70 72 2e 0a 20 20 2a 2a 20 54  TCH expr..  ** T
c8b0: 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  his information 
c8c0: 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20 78  is used by the x
c8d0: 42 65 73 74 49 6e 64 65 78 20 6d 65 74 68 6f 64  BestIndex method
c8e0: 73 20 6f 66 0a 20 20 2a 2a 20 76 69 72 74 75 61  s of.  ** virtua
c8f0: 6c 20 74 61 62 6c 65 73 2e 20 20 54 68 65 20 6e  l tables.  The n
c900: 61 74 69 76 65 20 71 75 65 72 79 20 6f 70 74 69  ative query opti
c910: 6d 69 7a 65 72 20 64 6f 65 73 20 6e 6f 74 20 61  mizer does not a
c920: 74 74 65 6d 70 74 0a 20 20 2a 2a 20 74 6f 20 64  ttempt.  ** to d
c930: 6f 20 61 6e 79 74 68 69 6e 67 20 77 69 74 68 20  o anything with 
c940: 4d 41 54 43 48 20 66 75 6e 63 74 69 6f 6e 73 2e  MATCH functions.
c950: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 4d 61  .  */.  if( isMa
c960: 74 63 68 4f 66 43 6f 6c 75 6d 6e 28 70 45 78 70  tchOfColumn(pExp
c970: 72 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 64  r) ){.    int id
c980: 78 4e 65 77 3b 0a 20 20 20 20 45 78 70 72 20 2a  xNew;.    Expr *
c990: 70 52 69 67 68 74 2c 20 2a 70 4c 65 66 74 3b 0a  pRight, *pLeft;.
c9a0: 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
c9b0: 4e 65 77 54 65 72 6d 3b 0a 20 20 20 20 42 69 74  NewTerm;.    Bit
c9c0: 6d 61 73 6b 20 70 72 65 72 65 71 43 6f 6c 75 6d  mask prereqColum
c9d0: 6e 2c 20 70 72 65 72 65 71 45 78 70 72 3b 0a 0a  n, prereqExpr;..
c9e0: 20 20 20 20 70 52 69 67 68 74 20 3d 20 70 45 78      pRight = pEx
c9f0: 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 30  pr->x.pList->a[0
ca00: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 4c 65  ].pExpr;.    pLe
ca10: 66 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c  ft = pExpr->x.pL
ca20: 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b  ist->a[1].pExpr;
ca30: 0a 20 20 20 20 70 72 65 72 65 71 45 78 70 72 20  .    prereqExpr 
ca40: 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65  = exprTableUsage
ca50: 28 70 4d 61 73 6b 53 65 74 2c 20 70 52 69 67 68  (pMaskSet, pRigh
ca60: 74 29 3b 0a 20 20 20 20 70 72 65 72 65 71 43 6f  t);.    prereqCo
ca70: 6c 75 6d 6e 20 3d 20 65 78 70 72 54 61 62 6c 65  lumn = exprTable
ca80: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
ca90: 70 4c 65 66 74 29 3b 0a 20 20 20 20 69 66 28 20  pLeft);.    if( 
caa0: 28 70 72 65 72 65 71 45 78 70 72 20 26 20 70 72  (prereqExpr & pr
cab0: 65 72 65 71 43 6f 6c 75 6d 6e 29 3d 3d 30 20 29  ereqColumn)==0 )
cac0: 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e  {.      Expr *pN
cad0: 65 77 45 78 70 72 3b 0a 20 20 20 20 20 20 70 4e  ewExpr;.      pN
cae0: 65 77 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  ewExpr = sqlite3
caf0: 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
cb00: 5f 4d 41 54 43 48 2c 20 0a 20 20 20 20 20 20 20  _MATCH, .       
cb10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cb20: 20 20 20 20 20 20 20 30 2c 20 73 71 6c 69 74 65         0, sqlite
cb30: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 52 69  3ExprDup(db, pRi
cb40: 67 68 74 2c 20 30 29 2c 20 30 29 3b 0a 20 20 20  ght, 0), 0);.   
cb50: 20 20 20 69 64 78 4e 65 77 20 3d 20 77 68 65 72     idxNew = wher
cb60: 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57  eClauseInsert(pW
cb70: 43 2c 20 70 4e 65 77 45 78 70 72 2c 20 54 45 52  C, pNewExpr, TER
cb80: 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44  M_VIRTUAL|TERM_D
cb90: 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 74  YNAMIC);.      t
cba0: 65 73 74 63 61 73 65 28 20 69 64 78 4e 65 77 3d  estcase( idxNew=
cbb0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77  =0 );.      pNew
cbc0: 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69  Term = &pWC->a[i
cbd0: 64 78 4e 65 77 5d 3b 0a 20 20 20 20 20 20 70 4e  dxNew];.      pN
cbe0: 65 77 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69  ewTerm->prereqRi
cbf0: 67 68 74 20 3d 20 70 72 65 72 65 71 45 78 70 72  ght = prereqExpr
cc00: 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d  ;.      pNewTerm
cc10: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 70  ->leftCursor = p
cc20: 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20 20  Left->iTable;.  
cc30: 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 75 2e      pNewTerm->u.
cc40: 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65  leftColumn = pLe
cc50: 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  ft->iColumn;.   
cc60: 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 65 4f 70     pNewTerm->eOp
cc70: 65 72 61 74 6f 72 20 3d 20 57 4f 5f 4d 41 54 43  erator = WO_MATC
cc80: 48 3b 0a 20 20 20 20 20 20 6d 61 72 6b 54 65 72  H;.      markTer
cc90: 6d 41 73 43 68 69 6c 64 28 70 57 43 2c 20 69 64  mAsChild(pWC, id
cca0: 78 4e 65 77 2c 20 69 64 78 54 65 72 6d 29 3b 0a  xNew, idxTerm);.
ccb0: 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70        pTerm = &p
ccc0: 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a  WC->a[idxTerm];.
ccd0: 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46        pTerm->wtF
cce0: 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 50  lags |= TERM_COP
ccf0: 49 45 44 3b 0a 20 20 20 20 20 20 70 4e 65 77 54  IED;.      pNewT
cd00: 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d  erm->prereqAll =
cd10: 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c   pTerm->prereqAl
cd20: 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  l;.    }.  }.#en
cd30: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
cd40: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20  IT_VIRTUALTABLE 
cd50: 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
cd60: 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f  E_ENABLE_STAT3_O
cd70: 52 5f 53 54 41 54 34 0a 20 20 2f 2a 20 57 68 65  R_STAT4.  /* Whe
cd80: 6e 20 73 71 6c 69 74 65 5f 73 74 61 74 33 20 68  n sqlite_stat3 h
cd90: 69 73 74 6f 67 72 61 6d 20 64 61 74 61 20 69 73  istogram data is
cda0: 20 61 76 61 69 6c 61 62 6c 65 20 61 6e 20 6f 70   available an op
cdb0: 65 72 61 74 6f 72 20 6f 66 20 74 68 65 0a 20 20  erator of the.  
cdc0: 2a 2a 20 66 6f 72 6d 20 22 78 20 49 53 20 4e 4f  ** form "x IS NO
cdd0: 54 20 4e 55 4c 4c 22 20 63 61 6e 20 73 6f 6d 65  T NULL" can some
cde0: 74 69 6d 65 73 20 62 65 20 65 76 61 6c 75 61 74  times be evaluat
cdf0: 65 64 20 6d 6f 72 65 20 65 66 66 69 63 69 65 6e  ed more efficien
ce00: 74 6c 79 0a 20 20 2a 2a 20 61 73 20 22 78 3e 4e  tly.  ** as "x>N
ce10: 55 4c 4c 22 20 69 66 20 78 20 69 73 20 6e 6f 74  ULL" if x is not
ce20: 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d   an INTEGER PRIM
ce30: 41 52 59 20 4b 45 59 2e 20 20 53 6f 20 63 6f 6e  ARY KEY.  So con
ce40: 73 74 72 75 63 74 20 61 0a 20 20 2a 2a 20 76 69  struct a.  ** vi
ce50: 72 74 75 61 6c 20 74 65 72 6d 20 6f 66 20 74 68  rtual term of th
ce60: 61 74 20 66 6f 72 6d 2e 0a 20 20 2a 2a 0a 20 20  at form..  **.  
ce70: 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65  ** Note that the
ce80: 20 76 69 72 74 75 61 6c 20 74 65 72 6d 20 6d 75   virtual term mu
ce90: 73 74 20 62 65 20 74 61 67 67 65 64 20 77 69 74  st be tagged wit
cea0: 68 20 54 45 52 4d 5f 56 4e 55 4c 4c 2e 20 20 54  h TERM_VNULL.  T
ceb0: 68 69 73 0a 20 20 2a 2a 20 54 45 52 4d 5f 56 4e  his.  ** TERM_VN
cec0: 55 4c 4c 20 74 61 67 20 77 69 6c 6c 20 73 75 70  ULL tag will sup
ced0: 70 72 65 73 73 20 74 68 65 20 6e 6f 74 2d 6e 75  press the not-nu
cee0: 6c 6c 20 63 68 65 63 6b 20 61 74 20 74 68 65 20  ll check at the 
cef0: 62 65 67 69 6e 6e 69 6e 67 0a 20 20 2a 2a 20 6f  beginning.  ** o
cf00: 66 20 74 68 65 20 6c 6f 6f 70 2e 20 20 57 69 74  f the loop.  Wit
cf10: 68 6f 75 74 20 74 68 65 20 54 45 52 4d 5f 56 4e  hout the TERM_VN
cf20: 55 4c 4c 20 66 6c 61 67 2c 20 74 68 65 20 6e 6f  ULL flag, the no
cf30: 74 2d 6e 75 6c 6c 20 63 68 65 63 6b 20 61 74 0a  t-null check at.
cf40: 20 20 2a 2a 20 74 68 65 20 73 74 61 72 74 20 6f    ** the start o
cf50: 66 20 74 68 65 20 6c 6f 6f 70 20 77 69 6c 6c 20  f the loop will 
cf60: 70 72 65 76 65 6e 74 20 61 6e 79 20 72 65 73 75  prevent any resu
cf70: 6c 74 73 20 66 72 6f 6d 20 62 65 69 6e 67 20 72  lts from being r
cf80: 65 74 75 72 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20  eturned..  */.  
cf90: 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  if( pExpr->op==T
cfa0: 4b 5f 4e 4f 54 4e 55 4c 4c 0a 20 20 20 26 26 20  K_NOTNULL.   && 
cfb0: 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 6f 70  pExpr->pLeft->op
cfc0: 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20 26  ==TK_COLUMN.   &
cfd0: 26 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e  & pExpr->pLeft->
cfe0: 69 43 6f 6c 75 6d 6e 3e 3d 30 0a 20 20 20 26 26  iColumn>=0.   &&
cff0: 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61   OptimizationEna
d000: 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f  bled(db, SQLITE_
d010: 53 74 61 74 33 34 29 0a 20 20 29 7b 0a 20 20 20  Stat34).  ){.   
d020: 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72 3b   Expr *pNewExpr;
d030: 0a 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74  .    Expr *pLeft
d040: 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b   = pExpr->pLeft;
d050: 0a 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77 3b  .    int idxNew;
d060: 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a  .    WhereTerm *
d070: 70 4e 65 77 54 65 72 6d 3b 0a 0a 20 20 20 20 70  pNewTerm;..    p
d080: 4e 65 77 45 78 70 72 20 3d 20 73 71 6c 69 74 65  NewExpr = sqlite
d090: 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
d0a0: 4b 5f 47 54 2c 0a 20 20 20 20 20 20 20 20 20 20  K_GT,.          
d0b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d0c0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70    sqlite3ExprDup
d0d0: 28 64 62 2c 20 70 4c 65 66 74 2c 20 30 29 2c 0a  (db, pLeft, 0),.
d0e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d0f0: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
d100: 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
d110: 20 54 4b 5f 4e 55 4c 4c 2c 20 30 2c 20 30 2c 20   TK_NULL, 0, 0, 
d120: 30 29 2c 20 30 29 3b 0a 0a 20 20 20 20 69 64 78  0), 0);..    idx
d130: 4e 65 77 20 3d 20 77 68 65 72 65 43 6c 61 75 73  New = whereClaus
d140: 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e 65  eInsert(pWC, pNe
d150: 77 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20  wExpr,.         
d160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d170: 20 20 20 20 20 54 45 52 4d 5f 56 49 52 54 55 41       TERM_VIRTUA
d180: 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 7c 54  L|TERM_DYNAMIC|T
d190: 45 52 4d 5f 56 4e 55 4c 4c 29 3b 0a 20 20 20 20  ERM_VNULL);.    
d1a0: 69 66 28 20 69 64 78 4e 65 77 20 29 7b 0a 20 20  if( idxNew ){.  
d1b0: 20 20 20 20 70 4e 65 77 54 65 72 6d 20 3d 20 26      pNewTerm = &
d1c0: 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 3b 0a  pWC->a[idxNew];.
d1d0: 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e        pNewTerm->
d1e0: 70 72 65 72 65 71 52 69 67 68 74 20 3d 20 30 3b  prereqRight = 0;
d1f0: 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d  .      pNewTerm-
d200: 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 70 4c  >leftCursor = pL
d210: 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20  eft->iTable;.   
d220: 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 75 2e 6c     pNewTerm->u.l
d230: 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66  eftColumn = pLef
d240: 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  t->iColumn;.    
d250: 20 20 70 4e 65 77 54 65 72 6d 2d 3e 65 4f 70 65    pNewTerm->eOpe
d260: 72 61 74 6f 72 20 3d 20 57 4f 5f 47 54 3b 0a 20  rator = WO_GT;. 
d270: 20 20 20 20 20 6d 61 72 6b 54 65 72 6d 41 73 43       markTermAsC
d280: 68 69 6c 64 28 70 57 43 2c 20 69 64 78 4e 65 77  hild(pWC, idxNew
d290: 2c 20 69 64 78 54 65 72 6d 29 3b 0a 20 20 20 20  , idxTerm);.    
d2a0: 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e    pTerm = &pWC->
d2b0: 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20  a[idxTerm];.    
d2c0: 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73    pTerm->wtFlags
d2d0: 20 7c 3d 20 54 45 52 4d 5f 43 4f 50 49 45 44 3b   |= TERM_COPIED;
d2e0: 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d  .      pNewTerm-
d2f0: 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20 70 54 65  >prereqAll = pTe
d300: 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 3b 0a 20  rm->prereqAll;. 
d310: 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20     }.  }.#endif 
d320: 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
d330: 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 20  _STAT3_OR_STAT4 
d340: 2a 2f 0a 0a 20 20 2f 2a 20 50 72 65 76 65 6e 74  */..  /* Prevent
d350: 20 4f 4e 20 63 6c 61 75 73 65 20 74 65 72 6d 73   ON clause terms
d360: 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20   of a LEFT JOIN 
d370: 66 72 6f 6d 20 62 65 69 6e 67 20 75 73 65 64 20  from being used 
d380: 74 6f 20 64 72 69 76 65 0a 20 20 2a 2a 20 61 6e  to drive.  ** an
d390: 20 69 6e 64 65 78 20 66 6f 72 20 74 61 62 6c 65   index for table
d3a0: 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66  s to the left of
d3b0: 20 74 68 65 20 6a 6f 69 6e 2e 0a 20 20 2a 2f 0a   the join..  */.
d3c0: 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52    pTerm->prereqR
d3d0: 69 67 68 74 20 7c 3d 20 65 78 74 72 61 52 69 67  ight |= extraRig
d3e0: 68 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ht;.}../*.** Thi
d3f0: 73 20 66 75 6e 63 74 69 6f 6e 20 73 65 61 72 63  s function searc
d400: 68 65 73 20 70 4c 69 73 74 20 66 6f 72 20 61 6e  hes pList for an
d410: 20 65 6e 74 72 79 20 74 68 61 74 20 6d 61 74 63   entry that matc
d420: 68 65 73 20 74 68 65 20 69 43 6f 6c 2d 74 68 20  hes the iCol-th 
d430: 63 6f 6c 75 6d 6e 0a 2a 2a 20 6f 66 20 69 6e 64  column.** of ind
d440: 65 78 20 70 49 64 78 2e 0a 2a 2a 0a 2a 2a 20 49  ex pIdx..**.** I
d450: 66 20 73 75 63 68 20 61 6e 20 65 78 70 72 65 73  f such an expres
d460: 73 69 6f 6e 20 69 73 20 66 6f 75 6e 64 2c 20 69  sion is found, i
d470: 74 73 20 69 6e 64 65 78 20 69 6e 20 70 4c 69 73  ts index in pLis
d480: 74 2d 3e 61 5b 5d 20 69 73 20 72 65 74 75 72 6e  t->a[] is return
d490: 65 64 2e 20 49 66 0a 2a 2a 20 6e 6f 20 65 78 70  ed. If.** no exp
d4a0: 72 65 73 73 69 6f 6e 20 69 73 20 66 6f 75 6e 64  ression is found
d4b0: 2c 20 2d 31 20 69 73 20 72 65 74 75 72 6e 65 64  , -1 is returned
d4c0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
d4d0: 66 69 6e 64 49 6e 64 65 78 43 6f 6c 28 0a 20 20  findIndexCol(.  
d4e0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
d4f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d500: 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74  /* Parse context
d510: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
d520: 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20 20 20  pList,          
d530: 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73        /* Express
d540: 69 6f 6e 20 6c 69 73 74 20 74 6f 20 73 65 61 72  ion list to sear
d550: 63 68 20 2a 2f 0a 20 20 69 6e 74 20 69 42 61 73  ch */.  int iBas
d560: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
d570: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f          /* Curso
d580: 72 20 66 6f 72 20 74 61 62 6c 65 20 61 73 73 6f  r for table asso
d590: 63 69 61 74 65 64 20 77 69 74 68 20 70 49 64 78  ciated with pIdx
d5a0: 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64   */.  Index *pId
d5b0: 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x,              
d5c0: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 74        /* Index t
d5d0: 6f 20 6d 61 74 63 68 20 63 6f 6c 75 6d 6e 20 6f  o match column o
d5e0: 66 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 20  f */.  int iCol 
d5f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d600: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e         /* Column
d610: 20 6f 66 20 69 6e 64 65 78 20 74 6f 20 6d 61 74   of index to mat
d620: 63 68 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  ch */.){.  int i
d630: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
d640: 7a 43 6f 6c 6c 20 3d 20 70 49 64 78 2d 3e 61 7a  zColl = pIdx->az
d650: 43 6f 6c 6c 5b 69 43 6f 6c 5d 3b 0a 0a 20 20 66  Coll[iCol];..  f
d660: 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  or(i=0; i<pList-
d670: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
d680: 20 20 45 78 70 72 20 2a 70 20 3d 20 73 71 6c 69    Expr *p = sqli
d690: 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61  te3ExprSkipColla
d6a0: 74 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  te(pList->a[i].p
d6b0: 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20 70  Expr);.    if( p
d6c0: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a  ->op==TK_COLUMN.
d6d0: 20 20 20 20 20 26 26 20 70 2d 3e 69 43 6f 6c 75       && p->iColu
d6e0: 6d 6e 3d 3d 70 49 64 78 2d 3e 61 69 43 6f 6c 75  mn==pIdx->aiColu
d6f0: 6d 6e 5b 69 43 6f 6c 5d 0a 20 20 20 20 20 26 26  mn[iCol].     &&
d700: 20 70 2d 3e 69 54 61 62 6c 65 3d 3d 69 42 61 73   p->iTable==iBas
d710: 65 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 43  e.    ){.      C
d720: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20  ollSeq *pColl = 
d730: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
d740: 65 71 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74  eq(pParse, pList
d750: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[i].pExpr);. 
d760: 20 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28       if( ALWAYS(
d770: 70 43 6f 6c 6c 29 20 26 26 20 30 3d 3d 73 71 6c  pColl) && 0==sql
d780: 69 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c  ite3StrICmp(pCol
d790: 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 6c 29  l->zName, zColl)
d7a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
d7b0: 72 6e 20 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn i;.      }.  
d7c0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
d7d0: 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n -1;.}../*.** R
d7e0: 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68  eturn true if th
d7f0: 65 20 44 49 53 54 49 4e 43 54 20 65 78 70 72 65  e DISTINCT expre
d800: 73 73 69 6f 6e 2d 6c 69 73 74 20 70 61 73 73 65  ssion-list passe
d810: 64 20 61 73 20 74 68 65 20 74 68 69 72 64 20 61  d as the third a
d820: 72 67 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 72 65  rgument.** is re
d830: 64 75 6e 64 61 6e 74 2e 0a 2a 2a 0a 2a 2a 20 41  dundant..**.** A
d840: 20 44 49 53 54 49 4e 43 54 20 6c 69 73 74 20 69   DISTINCT list i
d850: 73 20 72 65 64 75 6e 64 61 6e 74 20 69 66 20 74  s redundant if t
d860: 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74  he database cont
d870: 61 69 6e 73 20 73 6f 6d 65 20 73 75 62 73 65 74  ains some subset
d880: 20 6f 66 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 20 74   of.** columns t
d890: 68 61 74 20 61 72 65 20 75 6e 69 71 75 65 20 61  hat are unique a
d8a0: 6e 64 20 6e 6f 6e 2d 6e 75 6c 6c 2e 0a 2a 2f 0a  nd non-null..*/.
d8b0: 73 74 61 74 69 63 20 69 6e 74 20 69 73 44 69 73  static int isDis
d8c0: 74 69 6e 63 74 52 65 64 75 6e 64 61 6e 74 28 0a  tinctRedundant(.
d8d0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
d8e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
d8f0: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
d900: 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  /.  SrcList *pTa
d910: 62 4c 69 73 74 2c 20 20 20 20 20 20 20 20 2f 2a  bList,        /*
d920: 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   The FROM clause
d930: 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
d940: 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20  e *pWC,         
d950: 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
d960: 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  use */.  ExprLis
d970: 74 20 2a 70 44 69 73 74 69 6e 63 74 20 20 20 20  t *pDistinct    
d980: 20 20 20 2f 2a 20 54 68 65 20 72 65 73 75 6c 74     /* The result
d990: 20 73 65 74 20 74 68 61 74 20 6e 65 65 64 73 20   set that needs 
d9a0: 74 6f 20 62 65 20 44 49 53 54 49 4e 43 54 20 2a  to be DISTINCT *
d9b0: 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54  /.){.  Table *pT
d9c0: 61 62 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49 64  ab;.  Index *pId
d9d0: 78 3b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  x;.  int i;     
d9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d9f0: 20 20 20 20 20 0a 20 20 69 6e 74 20 69 42 61 73       .  int iBas
da00: 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72  e;..  /* If ther
da10: 65 20 69 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f  e is more than o
da20: 6e 65 20 74 61 62 6c 65 20 6f 72 20 73 75 62 2d  ne table or sub-
da30: 73 65 6c 65 63 74 20 69 6e 20 74 68 65 20 46 52  select in the FR
da40: 4f 4d 20 63 6c 61 75 73 65 20 6f 66 0a 20 20 2a  OM clause of.  *
da50: 2a 20 74 68 69 73 20 71 75 65 72 79 2c 20 74 68  * this query, th
da60: 65 6e 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62  en it will not b
da70: 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 73 68  e possible to sh
da80: 6f 77 20 74 68 61 74 20 74 68 65 20 44 49 53 54  ow that the DIST
da90: 49 4e 43 54 20 0a 20 20 2a 2a 20 63 6c 61 75 73  INCT .  ** claus
daa0: 65 20 69 73 20 72 65 64 75 6e 64 61 6e 74 2e 20  e is redundant. 
dab0: 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 4c 69 73  */.  if( pTabLis
dac0: 74 2d 3e 6e 53 72 63 21 3d 31 20 29 20 72 65 74  t->nSrc!=1 ) ret
dad0: 75 72 6e 20 30 3b 0a 20 20 69 42 61 73 65 20 3d  urn 0;.  iBase =
dae0: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e   pTabList->a[0].
daf0: 69 43 75 72 73 6f 72 3b 0a 20 20 70 54 61 62 20  iCursor;.  pTab 
db00: 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d  = pTabList->a[0]
db10: 2e 70 54 61 62 3b 0a 0a 20 20 2f 2a 20 49 66 20  .pTab;..  /* If 
db20: 61 6e 79 20 6f 66 20 74 68 65 20 65 78 70 72 65  any of the expre
db30: 73 73 69 6f 6e 73 20 69 73 20 61 6e 20 49 50 4b  ssions is an IPK
db40: 20 63 6f 6c 75 6d 6e 20 6f 6e 20 74 61 62 6c 65   column on table
db50: 20 69 42 61 73 65 2c 20 74 68 65 6e 20 72 65 74   iBase, then ret
db60: 75 72 6e 20 0a 20 20 2a 2a 20 74 72 75 65 2e 20  urn .  ** true. 
db70: 4e 6f 74 65 3a 20 54 68 65 20 28 70 2d 3e 69 54  Note: The (p->iT
db80: 61 62 6c 65 3d 3d 69 42 61 73 65 29 20 70 61 72  able==iBase) par
db90: 74 20 6f 66 20 74 68 69 73 20 74 65 73 74 20 6d  t of this test m
dba0: 61 79 20 62 65 20 66 61 6c 73 65 20 69 66 20 74  ay be false if t
dbb0: 68 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74 20  he.  ** current 
dbc0: 53 45 4c 45 43 54 20 69 73 20 61 20 63 6f 72 72  SELECT is a corr
dbd0: 65 6c 61 74 65 64 20 73 75 62 2d 71 75 65 72 79  elated sub-query
dbe0: 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ..  */.  for(i=0
dbf0: 3b 20 69 3c 70 44 69 73 74 69 6e 63 74 2d 3e 6e  ; i<pDistinct->n
dc00: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
dc10: 45 78 70 72 20 2a 70 20 3d 20 73 71 6c 69 74 65  Expr *p = sqlite
dc20: 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65  3ExprSkipCollate
dc30: 28 70 44 69 73 74 69 6e 63 74 2d 3e 61 5b 69 5d  (pDistinct->a[i]
dc40: 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28  .pExpr);.    if(
dc50: 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d   p->op==TK_COLUM
dc60: 4e 20 26 26 20 70 2d 3e 69 54 61 62 6c 65 3d 3d  N && p->iTable==
dc70: 69 42 61 73 65 20 26 26 20 70 2d 3e 69 43 6f 6c  iBase && p->iCol
dc80: 75 6d 6e 3c 30 20 29 20 72 65 74 75 72 6e 20 31  umn<0 ) return 1
dc90: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 6f 70  ;.  }..  /* Loop
dca0: 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 69 6e 64   through all ind
dcb0: 69 63 65 73 20 6f 6e 20 74 68 65 20 74 61 62 6c  ices on the tabl
dcc0: 65 2c 20 63 68 65 63 6b 69 6e 67 20 65 61 63 68  e, checking each
dcd0: 20 74 6f 20 73 65 65 20 69 66 20 69 74 20 6d 61   to see if it ma
dce0: 6b 65 73 0a 20 20 2a 2a 20 74 68 65 20 44 49 53  kes.  ** the DIS
dcf0: 54 49 4e 43 54 20 71 75 61 6c 69 66 69 65 72 20  TINCT qualifier 
dd00: 72 65 64 75 6e 64 61 6e 74 2e 20 49 74 20 64 6f  redundant. It do
dd10: 65 73 20 73 6f 20 69 66 3a 0a 20 20 2a 2a 0a 20  es so if:.  **. 
dd20: 20 2a 2a 20 20 20 31 2e 20 54 68 65 20 69 6e 64   **   1. The ind
dd30: 65 78 20 69 73 20 69 74 73 65 6c 66 20 55 4e 49  ex is itself UNI
dd40: 51 55 45 2c 20 61 6e 64 0a 20 20 2a 2a 0a 20 20  QUE, and.  **.  
dd50: 2a 2a 20 20 20 32 2e 20 41 6c 6c 20 6f 66 20 74  **   2. All of t
dd60: 68 65 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  he columns in th
dd70: 65 20 69 6e 64 65 78 20 61 72 65 20 65 69 74 68  e index are eith
dd80: 65 72 20 70 61 72 74 20 6f 66 20 74 68 65 20 70  er part of the p
dd90: 44 69 73 74 69 6e 63 74 0a 20 20 2a 2a 20 20 20  Distinct.  **   
dda0: 20 20 20 6c 69 73 74 2c 20 6f 72 20 65 6c 73 65     list, or else
ddb0: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
ddc0: 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 74 65 72  e contains a ter
ddd0: 6d 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 63  m of the form "c
dde0: 6f 6c 3d 58 22 2c 0a 20 20 2a 2a 20 20 20 20 20  ol=X",.  **     
ddf0: 20 77 68 65 72 65 20 58 20 69 73 20 61 20 63 6f   where X is a co
de00: 6e 73 74 61 6e 74 20 76 61 6c 75 65 2e 20 54 68  nstant value. Th
de10: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  e collation sequ
de20: 65 6e 63 65 73 20 6f 66 20 74 68 65 0a 20 20 2a  ences of the.  *
de30: 2a 20 20 20 20 20 20 63 6f 6d 70 61 72 69 73 6f  *      compariso
de40: 6e 20 61 6e 64 20 73 65 6c 65 63 74 2d 6c 69 73  n and select-lis
de50: 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6d 75  t expressions mu
de60: 73 74 20 6d 61 74 63 68 20 74 68 6f 73 65 20 6f  st match those o
de70: 66 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 2a  f the index..  *
de80: 2a 0a 20 20 2a 2a 20 20 20 33 2e 20 41 6c 6c 20  *.  **   3. All 
de90: 6f 66 20 74 68 6f 73 65 20 69 6e 64 65 78 20 63  of those index c
dea0: 6f 6c 75 6d 6e 73 20 66 6f 72 20 77 68 69 63 68  olumns for which
deb0: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
dec0: 65 20 64 6f 65 73 20 6e 6f 74 0a 20 20 2a 2a 20  e does not.  ** 
ded0: 20 20 20 20 20 63 6f 6e 74 61 69 6e 20 61 20 22       contain a "
dee0: 63 6f 6c 3d 58 22 20 74 65 72 6d 20 61 72 65 20  col=X" term are 
def0: 73 75 62 6a 65 63 74 20 74 6f 20 61 20 4e 4f 54  subject to a NOT
df00: 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74   NULL constraint
df10: 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 49 64  ..  */.  for(pId
df20: 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20  x=pTab->pIndex; 
df30: 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d  pIdx; pIdx=pIdx-
df40: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
df50: 20 21 49 73 55 6e 69 71 75 65 49 6e 64 65 78 28   !IsUniqueIndex(
df60: 70 49 64 78 29 20 29 20 63 6f 6e 74 69 6e 75 65  pIdx) ) continue
df70: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
df80: 3c 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20  <pIdx->nKeyCol; 
df90: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 31 36 20  i++){.      i16 
dfa0: 69 43 6f 6c 20 3d 20 70 49 64 78 2d 3e 61 69 43  iCol = pIdx->aiC
dfb0: 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20 20  olumn[i];.      
dfc0: 69 66 28 20 30 3d 3d 66 69 6e 64 54 65 72 6d 28  if( 0==findTerm(
dfd0: 70 57 43 2c 20 69 42 61 73 65 2c 20 69 43 6f 6c  pWC, iBase, iCol
dfe0: 2c 20 7e 28 42 69 74 6d 61 73 6b 29 30 2c 20 57  , ~(Bitmask)0, W
dff0: 4f 5f 45 51 2c 20 70 49 64 78 29 20 29 7b 0a 20  O_EQ, pIdx) ){. 
e000: 20 20 20 20 20 20 20 69 6e 74 20 69 49 64 78 43         int iIdxC
e010: 6f 6c 20 3d 20 66 69 6e 64 49 6e 64 65 78 43 6f  ol = findIndexCo
e020: 6c 28 70 50 61 72 73 65 2c 20 70 44 69 73 74 69  l(pParse, pDisti
e030: 6e 63 74 2c 20 69 42 61 73 65 2c 20 70 49 64 78  nct, iBase, pIdx
e040: 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , i);.        if
e050: 28 20 69 49 64 78 43 6f 6c 3c 30 20 7c 7c 20 70  ( iIdxCol<0 || p
e060: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
e070: 6e 6f 74 4e 75 6c 6c 3d 3d 30 20 29 7b 0a 20 20  notNull==0 ){.  
e080: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
e090: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
e0a0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
e0b0: 3d 3d 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 20  ==pIdx->nKeyCol 
e0c0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73  ){.      /* This
e0d0: 20 69 6e 64 65 78 20 69 6d 70 6c 69 65 73 20 74   index implies t
e0e0: 68 61 74 20 74 68 65 20 44 49 53 54 49 4e 43 54  hat the DISTINCT
e0f0: 20 71 75 61 6c 69 66 69 65 72 20 69 73 20 72 65   qualifier is re
e100: 64 75 6e 64 61 6e 74 2e 20 2a 2f 0a 20 20 20 20  dundant. */.    
e110: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
e120: 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
e130: 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45 73 74  0;.}.../*.** Est
e140: 69 6d 61 74 65 20 74 68 65 20 6c 6f 67 61 72 69  imate the logari
e150: 74 68 6d 20 6f 66 20 74 68 65 20 69 6e 70 75 74  thm of the input
e160: 20 76 61 6c 75 65 20 74 6f 20 62 61 73 65 20 32   value to base 2
e170: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4c 6f 67 45  ..*/.static LogE
e180: 73 74 20 65 73 74 4c 6f 67 28 4c 6f 67 45 73 74  st estLog(LogEst
e190: 20 4e 29 7b 0a 20 20 72 65 74 75 72 6e 20 4e 3c   N){.  return N<
e1a0: 3d 31 30 20 3f 20 30 20 3a 20 73 71 6c 69 74 65  =10 ? 0 : sqlite
e1b0: 33 4c 6f 67 45 73 74 28 4e 29 20 2d 20 33 33 3b  3LogEst(N) - 33;
e1c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 77 6f 20 72 6f  .}../*.** Two ro
e1d0: 75 74 69 6e 65 73 20 66 6f 72 20 70 72 69 6e 74  utines for print
e1e0: 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  ing the content 
e1f0: 6f 66 20 61 6e 20 73 71 6c 69 74 65 33 5f 69 6e  of an sqlite3_in
e200: 64 65 78 5f 69 6e 66 6f 0a 2a 2a 20 73 74 72 75  dex_info.** stru
e210: 63 74 75 72 65 2e 20 20 55 73 65 64 20 66 6f 72  cture.  Used for
e220: 20 74 65 73 74 69 6e 67 20 61 6e 64 20 64 65 62   testing and deb
e230: 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 20 20 49 66  ugging only.  If
e240: 20 6e 65 69 74 68 65 72 0a 2a 2a 20 53 51 4c 49   neither.** SQLI
e250: 54 45 5f 54 45 53 54 20 6f 72 20 53 51 4c 49 54  TE_TEST or SQLIT
e260: 45 5f 44 45 42 55 47 20 61 72 65 20 64 65 66 69  E_DEBUG are defi
e270: 6e 65 64 2c 20 74 68 65 6e 20 74 68 65 73 65 20  ned, then these 
e280: 72 6f 75 74 69 6e 65 73 0a 2a 2a 20 61 72 65 20  routines.** are 
e290: 6e 6f 2d 6f 70 73 2e 0a 2a 2f 0a 23 69 66 20 21  no-ops..*/.#if !
e2a0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
e2b0: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
e2c0: 29 20 26 26 20 64 65 66 69 6e 65 64 28 57 48 45  ) && defined(WHE
e2d0: 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 29  RETRACE_ENABLED)
e2e0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 54 52 41  .static void TRA
e2f0: 43 45 5f 49 44 58 5f 49 4e 50 55 54 53 28 73 71  CE_IDX_INPUTS(sq
e300: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
e310: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   *p){.  int i;. 
e320: 20 69 66 28 20 21 73 71 6c 69 74 65 33 57 68 65   if( !sqlite3Whe
e330: 72 65 54 72 61 63 65 20 29 20 72 65 74 75 72 6e  reTrace ) return
e340: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
e350: 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69  ->nConstraint; i
e360: 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
e370: 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 63  DebugPrintf("  c
e380: 6f 6e 73 74 72 61 69 6e 74 5b 25 64 5d 3a 20 63  onstraint[%d]: c
e390: 6f 6c 3d 25 64 20 74 65 72 6d 69 64 3d 25 64 20  ol=%d termid=%d 
e3a0: 6f 70 3d 25 64 20 75 73 61 62 6c 65 64 3d 25 64  op=%d usabled=%d
e3b0: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69 2c 0a 20  \n",.       i,. 
e3c0: 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72        p->aConstr
e3d0: 61 69 6e 74 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 2c  aint[i].iColumn,
e3e0: 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73  .       p->aCons
e3f0: 74 72 61 69 6e 74 5b 69 5d 2e 69 54 65 72 6d 4f  traint[i].iTermO
e400: 66 66 73 65 74 2c 0a 20 20 20 20 20 20 20 70 2d  ffset,.       p-
e410: 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e  >aConstraint[i].
e420: 6f 70 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43  op,.       p->aC
e430: 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 75 73 61  onstraint[i].usa
e440: 62 6c 65 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  ble);.  }.  for(
e450: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 72 64 65 72  i=0; i<p->nOrder
e460: 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71  By; i++){.    sq
e470: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
e480: 28 22 20 20 6f 72 64 65 72 62 79 5b 25 64 5d 3a  ("  orderby[%d]:
e490: 20 63 6f 6c 3d 25 64 20 64 65 73 63 3d 25 64 5c   col=%d desc=%d\
e4a0: 6e 22 2c 0a 20 20 20 20 20 20 20 69 2c 0a 20 20  n",.       i,.  
e4b0: 20 20 20 20 20 70 2d 3e 61 4f 72 64 65 72 42 79       p->aOrderBy
e4c0: 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20  [i].iColumn,.   
e4d0: 20 20 20 20 70 2d 3e 61 4f 72 64 65 72 42 79 5b      p->aOrderBy[
e4e0: 69 5d 2e 64 65 73 63 29 3b 0a 20 20 7d 0a 7d 0a  i].desc);.  }.}.
e4f0: 73 74 61 74 69 63 20 76 6f 69 64 20 54 52 41 43  static void TRAC
e500: 45 5f 49 44 58 5f 4f 55 54 50 55 54 53 28 73 71  E_IDX_OUTPUTS(sq
e510: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
e520: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   *p){.  int i;. 
e530: 20 69 66 28 20 21 73 71 6c 69 74 65 33 57 68 65   if( !sqlite3Whe
e540: 72 65 54 72 61 63 65 20 29 20 72 65 74 75 72 6e  reTrace ) return
e550: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
e560: 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69  ->nConstraint; i
e570: 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
e580: 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 75  DebugPrintf("  u
e590: 73 61 67 65 5b 25 64 5d 3a 20 61 72 67 76 49 64  sage[%d]: argvId
e5a0: 78 3d 25 64 20 6f 6d 69 74 3d 25 64 5c 6e 22 2c  x=%d omit=%d\n",
e5b0: 0a 20 20 20 20 20 20 20 69 2c 0a 20 20 20 20 20  .       i,.     
e5c0: 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74    p->aConstraint
e5d0: 55 73 61 67 65 5b 69 5d 2e 61 72 67 76 49 6e 64  Usage[i].argvInd
e5e0: 65 78 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43  ex,.       p->aC
e5f0: 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69  onstraintUsage[i
e600: 5d 2e 6f 6d 69 74 29 3b 0a 20 20 7d 0a 20 20 73  ].omit);.  }.  s
e610: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
e620: 66 28 22 20 20 69 64 78 4e 75 6d 3d 25 64 5c 6e  f("  idxNum=%d\n
e630: 22 2c 20 70 2d 3e 69 64 78 4e 75 6d 29 3b 0a 20  ", p->idxNum);. 
e640: 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
e650: 6e 74 66 28 22 20 20 69 64 78 53 74 72 3d 25 73  ntf("  idxStr=%s
e660: 5c 6e 22 2c 20 70 2d 3e 69 64 78 53 74 72 29 3b  \n", p->idxStr);
e670: 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50  .  sqlite3DebugP
e680: 72 69 6e 74 66 28 22 20 20 6f 72 64 65 72 42 79  rintf("  orderBy
e690: 43 6f 6e 73 75 6d 65 64 3d 25 64 5c 6e 22 2c 20  Consumed=%d\n", 
e6a0: 70 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d  p->orderByConsum
e6b0: 65 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65  ed);.  sqlite3De
e6c0: 62 75 67 50 72 69 6e 74 66 28 22 20 20 65 73 74  bugPrintf("  est
e6d0: 69 6d 61 74 65 64 43 6f 73 74 3d 25 67 5c 6e 22  imatedCost=%g\n"
e6e0: 2c 20 70 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f  , p->estimatedCo
e6f0: 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65  st);.  sqlite3De
e700: 62 75 67 50 72 69 6e 74 66 28 22 20 20 65 73 74  bugPrintf("  est
e710: 69 6d 61 74 65 64 52 6f 77 73 3d 25 6c 6c 64 5c  imatedRows=%lld\
e720: 6e 22 2c 20 70 2d 3e 65 73 74 69 6d 61 74 65 64  n", p->estimated
e730: 52 6f 77 73 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23  Rows);.}.#else.#
e740: 64 65 66 69 6e 65 20 54 52 41 43 45 5f 49 44 58  define TRACE_IDX
e750: 5f 49 4e 50 55 54 53 28 41 29 0a 23 64 65 66 69  _INPUTS(A).#defi
e760: 6e 65 20 54 52 41 43 45 5f 49 44 58 5f 4f 55 54  ne TRACE_IDX_OUT
e770: 50 55 54 53 28 41 29 0a 23 65 6e 64 69 66 0a 0a  PUTS(A).#endif..
e780: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
e790: 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e  MIT_AUTOMATIC_IN
e7a0: 44 45 58 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  DEX./*.** Return
e7b0: 20 54 52 55 45 20 69 66 20 74 68 65 20 57 48 45   TRUE if the WHE
e7c0: 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20 70  RE clause term p
e7d0: 54 65 72 6d 20 69 73 20 6f 66 20 61 20 66 6f 72  Term is of a for
e7e0: 6d 20 77 68 65 72 65 20 69 74 0a 2a 2a 20 63 6f  m where it.** co
e7f0: 75 6c 64 20 62 65 20 75 73 65 64 20 77 69 74 68  uld be used with
e800: 20 61 6e 20 69 6e 64 65 78 20 74 6f 20 61 63 63   an index to acc
e810: 65 73 73 20 70 53 72 63 2c 20 61 73 73 75 6d 69  ess pSrc, assumi
e820: 6e 67 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74  ng an appropriat
e830: 65 0a 2a 2a 20 69 6e 64 65 78 20 65 78 69 73 74  e.** index exist
e840: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
e850: 74 20 74 65 72 6d 43 61 6e 44 72 69 76 65 49 6e  t termCanDriveIn
e860: 64 65 78 28 0a 20 20 57 68 65 72 65 54 65 72 6d  dex(.  WhereTerm
e870: 20 2a 70 54 65 72 6d 2c 20 20 20 20 20 20 20 20   *pTerm,        
e880: 20 20 20 20 20 20 2f 2a 20 57 48 45 52 45 20 63        /* WHERE c
e890: 6c 61 75 73 65 20 74 65 72 6d 20 74 6f 20 63 68  lause term to ch
e8a0: 65 63 6b 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  eck */.  struct 
e8b0: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53  SrcList_item *pS
e8c0: 72 63 2c 20 20 20 20 20 2f 2a 20 54 61 62 6c 65  rc,     /* Table
e8d0: 20 77 65 20 61 72 65 20 74 72 79 69 6e 67 20 74   we are trying t
e8e0: 6f 20 61 63 63 65 73 73 20 2a 2f 0a 20 20 42 69  o access */.  Bi
e8f0: 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 20 20  tmask notReady  
e900: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e910: 54 61 62 6c 65 73 20 69 6e 20 6f 75 74 65 72 20  Tables in outer 
e920: 6c 6f 6f 70 73 20 6f 66 20 74 68 65 20 6a 6f 69  loops of the joi
e930: 6e 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 61  n */.){.  char a
e940: 66 66 3b 0a 20 20 69 66 28 20 70 54 65 72 6d 2d  ff;.  if( pTerm-
e950: 3e 6c 65 66 74 43 75 72 73 6f 72 21 3d 70 53 72  >leftCursor!=pSr
e960: 63 2d 3e 69 43 75 72 73 6f 72 20 29 20 72 65 74  c->iCursor ) ret
e970: 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 70 54  urn 0;.  if( (pT
e980: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
e990: 20 57 4f 5f 45 51 29 3d 3d 30 20 29 20 72 65 74   WO_EQ)==0 ) ret
e9a0: 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 70 54  urn 0;.  if( (pT
e9b0: 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
e9c0: 20 26 20 6e 6f 74 52 65 61 64 79 29 21 3d 30 20   & notReady)!=0 
e9d0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
e9e0: 28 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43  ( pTerm->u.leftC
e9f0: 6f 6c 75 6d 6e 3c 30 20 29 20 72 65 74 75 72 6e  olumn<0 ) return
ea00: 20 30 3b 0a 20 20 61 66 66 20 3d 20 70 53 72 63   0;.  aff = pSrc
ea10: 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 65  ->pTab->aCol[pTe
ea20: 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e  rm->u.leftColumn
ea30: 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 69 66  ].affinity;.  if
ea40: 28 20 21 73 71 6c 69 74 65 33 49 6e 64 65 78 41  ( !sqlite3IndexA
ea50: 66 66 69 6e 69 74 79 4f 6b 28 70 54 65 72 6d 2d  ffinityOk(pTerm-
ea60: 3e 70 45 78 70 72 2c 20 61 66 66 29 20 29 20 72  >pExpr, aff) ) r
ea70: 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75 72  eturn 0;.  retur
ea80: 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a  n 1;.}.#endif...
ea90: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
eaa0: 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e  MIT_AUTOMATIC_IN
eab0: 44 45 58 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  DEX./*.** Genera
eac0: 74 65 20 63 6f 64 65 20 74 6f 20 63 6f 6e 73 74  te code to const
ead0: 72 75 63 74 20 74 68 65 20 49 6e 64 65 78 20 6f  ruct the Index o
eae0: 62 6a 65 63 74 20 66 6f 72 20 61 6e 20 61 75 74  bject for an aut
eaf0: 6f 6d 61 74 69 63 20 69 6e 64 65 78 0a 2a 2a 20  omatic index.** 
eb00: 61 6e 64 20 74 6f 20 73 65 74 20 75 70 20 74 68  and to set up th
eb10: 65 20 57 68 65 72 65 4c 65 76 65 6c 20 6f 62 6a  e WhereLevel obj
eb20: 65 63 74 20 70 4c 65 76 65 6c 20 73 6f 20 74 68  ect pLevel so th
eb30: 61 74 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65  at the code gene
eb40: 72 61 74 6f 72 0a 2a 2a 20 6d 61 6b 65 73 20 75  rator.** makes u
eb50: 73 65 20 6f 66 20 74 68 65 20 61 75 74 6f 6d 61  se of the automa
eb60: 74 69 63 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74  tic index..*/.st
eb70: 61 74 69 63 20 76 6f 69 64 20 63 6f 6e 73 74 72  atic void constr
eb80: 75 63 74 41 75 74 6f 6d 61 74 69 63 49 6e 64 65  uctAutomaticInde
eb90: 78 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  x(.  Parse *pPar
eba0: 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
ebb0: 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20   /* The parsing 
ebc0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65  context */.  Whe
ebd0: 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20  reClause *pWC,  
ebe0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
ebf0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
ec00: 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
ec10: 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20 20 2f 2a  _item *pSrc,  /*
ec20: 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   The FROM clause
ec30: 20 74 65 72 6d 20 74 6f 20 67 65 74 20 74 68 65   term to get the
ec40: 20 6e 65 78 74 20 69 6e 64 65 78 20 2a 2f 0a 20   next index */. 
ec50: 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64   Bitmask notRead
ec60: 79 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  y,           /* 
ec70: 4d 61 73 6b 20 6f 66 20 63 75 72 73 6f 72 73 20  Mask of cursors 
ec80: 74 68 61 74 20 61 72 65 20 6e 6f 74 20 61 76 61  that are not ava
ec90: 69 6c 61 62 6c 65 20 2a 2f 0a 20 20 57 68 65 72  ilable */.  Wher
eca0: 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 20 20  eLevel *pLevel  
ecb0: 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
ecc0: 20 6e 65 77 20 69 6e 64 65 78 20 68 65 72 65 20   new index here 
ecd0: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 4b 65 79  */.){.  int nKey
ece0: 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Col;            
ecf0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
ed00: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
ed10: 63 6f 6e 73 74 72 75 63 74 65 64 20 69 6e 64 65  constructed inde
ed20: 78 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  x */.  WhereTerm
ed30: 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20   *pTerm;        
ed40: 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 74     /* A single t
ed50: 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45  erm of the WHERE
ed60: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65   clause */.  Whe
ed70: 72 65 54 65 72 6d 20 2a 70 57 43 45 6e 64 3b 20  reTerm *pWCEnd; 
ed80: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20           /* End 
ed90: 6f 66 20 70 57 43 2d 3e 61 5b 5d 20 2a 2f 0a 20  of pWC->a[] */. 
eda0: 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20   Index *pIdx;   
edb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
edc0: 4f 62 6a 65 63 74 20 64 65 73 63 72 69 62 69 6e  Object describin
edd0: 67 20 74 68 65 20 74 72 61 6e 73 69 65 6e 74 20  g the transient 
ede0: 69 6e 64 65 78 20 2a 2f 0a 20 20 56 64 62 65 20  index */.  Vdbe 
edf0: 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *v;             
ee00: 20 20 20 20 20 20 20 2f 2a 20 50 72 65 70 61 72         /* Prepar
ee10: 65 64 20 73 74 61 74 65 6d 65 6e 74 20 75 6e 64  ed statement und
ee20: 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  er construction 
ee30: 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 49 6e 69  */.  int addrIni
ee40: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
ee50: 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
ee60: 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  he initializatio
ee70: 6e 20 62 79 70 61 73 73 20 6a 75 6d 70 20 2a 2f  n bypass jump */
ee80: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65  .  Table *pTable
ee90: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
eea0: 2a 20 54 68 65 20 74 61 62 6c 65 20 62 65 69 6e  * The table bein
eeb0: 67 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69  g indexed */.  i
eec0: 6e 74 20 61 64 64 72 54 6f 70 3b 20 20 20 20 20  nt addrTop;     
eed0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f             /* To
eee0: 70 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 66  p of the index f
eef0: 69 6c 6c 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e  ill loop */.  in
ef00: 74 20 72 65 67 52 65 63 6f 72 64 3b 20 20 20 20  t regRecord;    
ef10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67            /* Reg
ef20: 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 61 6e  ister holding an
ef30: 20 69 6e 64 65 78 20 72 65 63 6f 72 64 20 2a 2f   index record */
ef40: 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20  .  int n;       
ef50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ef60: 2a 20 43 6f 6c 75 6d 6e 20 63 6f 75 6e 74 65 72  * Column counter
ef70: 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20   */.  int i;    
ef80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ef90: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
efa0: 72 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 42 69 74  r */.  int mxBit
efb0: 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Col;            
efc0: 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 63 6f     /* Maximum co
efd0: 6c 75 6d 6e 20 69 6e 20 70 53 72 63 2d 3e 63 6f  lumn in pSrc->co
efe0: 6c 55 73 65 64 20 2a 2f 0a 20 20 43 6f 6c 6c 53  lUsed */.  CollS
eff0: 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 20 20  eq *pColl;      
f000: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74         /* Collat
f010: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 74 6f 20  ing sequence to 
f020: 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20  on a column */. 
f030: 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f   WhereLoop *pLoo
f040: 70 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  p;           /* 
f050: 54 68 65 20 4c 6f 6f 70 20 6f 62 6a 65 63 74 20  The Loop object 
f060: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 6f 74 55  */.  char *zNotU
f070: 73 65 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  sed;            
f080: 20 2f 2a 20 45 78 74 72 61 20 73 70 61 63 65 20   /* Extra space 
f090: 6f 6e 20 74 68 65 20 65 6e 64 20 6f 66 20 70 49  on the end of pI
f0a0: 64 78 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  dx */.  Bitmask 
f0b0: 69 64 78 43 6f 6c 73 3b 20 20 20 20 20 20 20 20  idxCols;        
f0c0: 20 20 20 20 2f 2a 20 42 69 74 6d 61 70 20 6f 66      /* Bitmap of
f0d0: 20 63 6f 6c 75 6d 6e 73 20 75 73 65 64 20 66 6f   columns used fo
f0e0: 72 20 69 6e 64 65 78 69 6e 67 20 2a 2f 0a 20 20  r indexing */.  
f0f0: 42 69 74 6d 61 73 6b 20 65 78 74 72 61 43 6f 6c  Bitmask extraCol
f100: 73 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42  s;          /* B
f110: 69 74 6d 61 70 20 6f 66 20 61 64 64 69 74 69 6f  itmap of additio
f120: 6e 61 6c 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20  nal columns */. 
f130: 20 75 38 20 73 65 6e 74 57 61 72 6e 69 6e 67 20   u8 sentWarning 
f140: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  = 0;         /* 
f150: 54 72 75 65 20 69 66 20 61 20 77 61 72 6e 6e 69  True if a warnni
f160: 6e 67 20 68 61 73 20 62 65 65 6e 20 69 73 73 75  ng has been issu
f170: 65 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 50  ed */.  Expr *pP
f180: 61 72 74 69 61 6c 20 3d 20 30 3b 20 20 20 20 20  artial = 0;     
f190: 20 20 20 20 2f 2a 20 50 61 72 74 69 61 6c 20 49      /* Partial I
f1a0: 6e 64 65 78 20 45 78 70 72 65 73 73 69 6f 6e 20  ndex Expression 
f1b0: 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e  */.  int iContin
f1c0: 75 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ue = 0;         
f1d0: 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f   /* Jump here to
f1e0: 20 73 6b 69 70 20 65 78 63 6c 75 64 65 64 20 72   skip excluded r
f1f0: 6f 77 73 20 2a 2f 0a 0a 20 20 2f 2a 20 47 65 6e  ows */..  /* Gen
f200: 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 73 6b  erate code to sk
f210: 69 70 20 6f 76 65 72 20 74 68 65 20 63 72 65 61  ip over the crea
f220: 74 69 6f 6e 20 61 6e 64 20 69 6e 69 74 69 61 6c  tion and initial
f230: 69 7a 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a 20  ization of the. 
f240: 20 2a 2a 20 74 72 61 6e 73 69 65 6e 74 20 69 6e   ** transient in
f250: 64 65 78 20 6f 6e 20 32 6e 64 20 61 6e 64 20 73  dex on 2nd and s
f260: 75 62 73 65 71 75 65 6e 74 20 69 74 65 72 61 74  ubsequent iterat
f270: 69 6f 6e 73 20 6f 66 20 74 68 65 20 6c 6f 6f 70  ions of the loop
f280: 2e 20 2a 2f 0a 20 20 76 20 3d 20 70 50 61 72 73  . */.  v = pPars
f290: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65  e->pVdbe;.  asse
f2a0: 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 61 64  rt( v!=0 );.  ad
f2b0: 64 72 49 6e 69 74 20 3d 20 73 71 6c 69 74 65 33  drInit = sqlite3
f2c0: 43 6f 64 65 4f 6e 63 65 28 70 50 61 72 73 65 29  CodeOnce(pParse)
f2d0: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
f2e0: 29 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 74  );..  /* Count t
f2f0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  he number of col
f300: 75 6d 6e 73 20 74 68 61 74 20 77 69 6c 6c 20 62  umns that will b
f310: 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 69  e added to the i
f320: 6e 64 65 78 0a 20 20 2a 2a 20 61 6e 64 20 75 73  ndex.  ** and us
f330: 65 64 20 74 6f 20 6d 61 74 63 68 20 57 48 45 52  ed to match WHER
f340: 45 20 63 6c 61 75 73 65 20 63 6f 6e 73 74 72 61  E clause constra
f350: 69 6e 74 73 20 2a 2f 0a 20 20 6e 4b 65 79 43 6f  ints */.  nKeyCo
f360: 6c 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65 20  l = 0;.  pTable 
f370: 3d 20 70 53 72 63 2d 3e 70 54 61 62 3b 0a 20 20  = pSrc->pTab;.  
f380: 70 57 43 45 6e 64 20 3d 20 26 70 57 43 2d 3e 61  pWCEnd = &pWC->a
f390: 5b 70 57 43 2d 3e 6e 54 65 72 6d 5d 3b 0a 20 20  [pWC->nTerm];.  
f3a0: 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e  pLoop = pLevel->
f3b0: 70 57 4c 6f 6f 70 3b 0a 20 20 69 64 78 43 6f 6c  pWLoop;.  idxCol
f3c0: 73 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 54 65  s = 0;.  for(pTe
f3d0: 72 6d 3d 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d  rm=pWC->a; pTerm
f3e0: 3c 70 57 43 45 6e 64 3b 20 70 54 65 72 6d 2b 2b  <pWCEnd; pTerm++
f3f0: 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78  ){.    Expr *pEx
f400: 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70  pr = pTerm->pExp
f410: 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  r;.    assert( !
f420: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
f430: 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f  pExpr, EP_FromJo
f440: 69 6e 29 20 20 20 20 2f 2a 20 70 72 65 72 65 71  in)    /* prereq
f450: 20 61 6c 77 61 79 73 20 6e 6f 6e 2d 7a 65 72 6f   always non-zero
f460: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 7c 7c 20   */.         || 
f470: 70 45 78 70 72 2d 3e 69 52 69 67 68 74 4a 6f 69  pExpr->iRightJoi
f480: 6e 54 61 62 6c 65 21 3d 70 53 72 63 2d 3e 69 43  nTable!=pSrc->iC
f490: 75 72 73 6f 72 20 20 20 2f 2a 20 20 20 66 6f 72  ursor   /*   for
f4a0: 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20   the right-hand 
f4b0: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 7c 7c    */.         ||
f4c0: 20 70 4c 6f 6f 70 2d 3e 70 72 65 72 65 71 21 3d   pLoop->prereq!=
f4d0: 30 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  0 );            
f4e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20 74 61           /*   ta
f4f0: 62 6c 65 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f  ble of a LEFT JO
f500: 49 4e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c  IN */.    if( pL
f510: 6f 6f 70 2d 3e 70 72 65 72 65 71 3d 3d 30 0a 20  oop->prereq==0. 
f520: 20 20 20 20 26 26 20 28 70 54 65 72 6d 2d 3e 77      && (pTerm->w
f530: 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49  tFlags & TERM_VI
f540: 52 54 55 41 4c 29 3d 3d 30 0a 20 20 20 20 20 26  RTUAL)==0.     &
f550: 26 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  & !ExprHasProper
f560: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f  ty(pExpr, EP_Fro
f570: 6d 4a 6f 69 6e 29 0a 20 20 20 20 20 26 26 20 73  mJoin).     && s
f580: 71 6c 69 74 65 33 45 78 70 72 49 73 54 61 62 6c  qlite3ExprIsTabl
f590: 65 43 6f 6e 73 74 61 6e 74 28 70 45 78 70 72 2c  eConstant(pExpr,
f5a0: 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 29 20   pSrc->iCursor) 
f5b0: 29 7b 0a 20 20 20 20 20 20 70 50 61 72 74 69 61  ){.      pPartia
f5c0: 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  l = sqlite3ExprA
f5d0: 6e 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  nd(pParse->db, p
f5e0: 50 61 72 74 69 61 6c 2c 0a 20 20 20 20 20 20 20  Partial,.       
f5f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f600: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
f610: 45 78 70 72 44 75 70 28 70 50 61 72 73 65 2d 3e  ExprDup(pParse->
f620: 64 62 2c 20 70 45 78 70 72 2c 20 30 29 29 3b 0a  db, pExpr, 0));.
f630: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 74 65      }.    if( te
f640: 72 6d 43 61 6e 44 72 69 76 65 49 6e 64 65 78 28  rmCanDriveIndex(
f650: 70 54 65 72 6d 2c 20 70 53 72 63 2c 20 6e 6f 74  pTerm, pSrc, not
f660: 52 65 61 64 79 29 20 29 7b 0a 20 20 20 20 20 20  Ready) ){.      
f670: 69 6e 74 20 69 43 6f 6c 20 3d 20 70 54 65 72 6d  int iCol = pTerm
f680: 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a  ->u.leftColumn;.
f690: 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 63 4d        Bitmask cM
f6a0: 61 73 6b 20 3d 20 69 43 6f 6c 3e 3d 42 4d 53 20  ask = iCol>=BMS 
f6b0: 3f 20 4d 41 53 4b 42 49 54 28 42 4d 53 2d 31 29  ? MASKBIT(BMS-1)
f6c0: 20 3a 20 4d 41 53 4b 42 49 54 28 69 43 6f 6c 29   : MASKBIT(iCol)
f6d0: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
f6e0: 28 20 69 43 6f 6c 3d 3d 42 4d 53 20 29 3b 0a 20  ( iCol==BMS );. 
f6f0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
f700: 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20  Col==BMS-1 );.  
f710: 20 20 20 20 69 66 28 20 21 73 65 6e 74 57 61 72      if( !sentWar
f720: 6e 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 20 20  ning ){.        
f730: 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49  sqlite3_log(SQLI
f740: 54 45 5f 57 41 52 4e 49 4e 47 5f 41 55 54 4f 49  TE_WARNING_AUTOI
f750: 4e 44 45 58 2c 0a 20 20 20 20 20 20 20 20 20 20  NDEX,.          
f760: 20 20 22 61 75 74 6f 6d 61 74 69 63 20 69 6e 64    "automatic ind
f770: 65 78 20 6f 6e 20 25 73 28 25 73 29 22 2c 20 70  ex on %s(%s)", p
f780: 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 2c 0a 20 20  Table->zName,.  
f790: 20 20 20 20 20 20 20 20 20 20 70 54 61 62 6c 65            pTable
f7a0: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61  ->aCol[iCol].zNa
f7b0: 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 73 65 6e  me);.        sen
f7c0: 74 57 61 72 6e 69 6e 67 20 3d 20 31 3b 0a 20 20  tWarning = 1;.  
f7d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
f7e0: 28 69 64 78 43 6f 6c 73 20 26 20 63 4d 61 73 6b  (idxCols & cMask
f7f0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
f800: 69 66 28 20 77 68 65 72 65 4c 6f 6f 70 52 65 73  if( whereLoopRes
f810: 69 7a 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ize(pParse->db, 
f820: 70 4c 6f 6f 70 2c 20 6e 4b 65 79 43 6f 6c 2b 31  pLoop, nKeyCol+1
f830: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  ) ){.          g
f840: 6f 74 6f 20 65 6e 64 5f 61 75 74 6f 5f 69 6e 64  oto end_auto_ind
f850: 65 78 5f 63 72 65 61 74 65 3b 0a 20 20 20 20 20  ex_create;.     
f860: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 4c 6f     }.        pLo
f870: 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6e 4b 65 79 43  op->aLTerm[nKeyC
f880: 6f 6c 2b 2b 5d 20 3d 20 70 54 65 72 6d 3b 0a 20  ol++] = pTerm;. 
f890: 20 20 20 20 20 20 20 69 64 78 43 6f 6c 73 20 7c         idxCols |
f8a0: 3d 20 63 4d 61 73 6b 3b 0a 20 20 20 20 20 20 7d  = cMask;.      }
f8b0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73  .    }.  }.  ass
f8c0: 65 72 74 28 20 6e 4b 65 79 43 6f 6c 3e 30 20 29  ert( nKeyCol>0 )
f8d0: 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72  ;.  pLoop->u.btr
f8e0: 65 65 2e 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e  ee.nEq = pLoop->
f8f0: 6e 4c 54 65 72 6d 20 3d 20 6e 4b 65 79 43 6f 6c  nLTerm = nKeyCol
f900: 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  ;.  pLoop->wsFla
f910: 67 73 20 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d  gs = WHERE_COLUM
f920: 4e 5f 45 51 20 7c 20 57 48 45 52 45 5f 49 44 58  N_EQ | WHERE_IDX
f930: 5f 4f 4e 4c 59 20 7c 20 57 48 45 52 45 5f 49 4e  _ONLY | WHERE_IN
f940: 44 45 58 45 44 0a 20 20 20 20 20 20 20 20 20 20  DEXED.          
f950: 20 20 20 20 20 20 20 20 20 20 20 7c 20 57 48 45             | WHE
f960: 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 3b 0a 0a  RE_AUTO_INDEX;..
f970: 20 20 2f 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e    /* Count the n
f980: 75 6d 62 65 72 20 6f 66 20 61 64 64 69 74 69 6f  umber of additio
f990: 6e 61 6c 20 63 6f 6c 75 6d 6e 73 20 6e 65 65 64  nal columns need
f9a0: 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 0a 20  ed to create a. 
f9b0: 20 2a 2a 20 63 6f 76 65 72 69 6e 67 20 69 6e 64   ** covering ind
f9c0: 65 78 2e 20 20 41 20 22 63 6f 76 65 72 69 6e 67  ex.  A "covering
f9d0: 20 69 6e 64 65 78 22 20 69 73 20 61 6e 20 69 6e   index" is an in
f9e0: 64 65 78 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  dex that contain
f9f0: 73 20 61 6c 6c 0a 20 20 2a 2a 20 63 6f 6c 75 6d  s all.  ** colum
fa00: 6e 73 20 74 68 61 74 20 61 72 65 20 6e 65 65 64  ns that are need
fa10: 65 64 20 62 79 20 74 68 65 20 71 75 65 72 79 2e  ed by the query.
fa20: 20 20 57 69 74 68 20 61 20 63 6f 76 65 72 69 6e    With a coverin
fa30: 67 20 69 6e 64 65 78 2c 20 74 68 65 0a 20 20 2a  g index, the.  *
fa40: 2a 20 6f 72 69 67 69 6e 61 6c 20 74 61 62 6c 65  * original table
fa50: 20 6e 65 76 65 72 20 6e 65 65 64 73 20 74 6f 20   never needs to 
fa60: 62 65 20 61 63 63 65 73 73 65 64 2e 20 20 41 75  be accessed.  Au
fa70: 74 6f 6d 61 74 69 63 20 69 6e 64 69 63 65 73 20  tomatic indices 
fa80: 6d 75 73 74 0a 20 20 2a 2a 20 62 65 20 61 20 63  must.  ** be a c
fa90: 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20 62 65  overing index be
faa0: 63 61 75 73 65 20 74 68 65 20 69 6e 64 65 78 20  cause the index 
fab0: 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75 70 64 61  will not be upda
fac0: 74 65 64 20 69 66 20 74 68 65 0a 20 20 2a 2a 20  ted if the.  ** 
fad0: 6f 72 69 67 69 6e 61 6c 20 74 61 62 6c 65 20 63  original table c
fae0: 68 61 6e 67 65 73 20 61 6e 64 20 74 68 65 20 69  hanges and the i
faf0: 6e 64 65 78 20 61 6e 64 20 74 61 62 6c 65 20 63  ndex and table c
fb00: 61 6e 6e 6f 74 20 62 6f 74 68 20 62 65 20 75 73  annot both be us
fb10: 65 64 0a 20 20 2a 2a 20 69 66 20 74 68 65 79 20  ed.  ** if they 
fb20: 67 6f 20 6f 75 74 20 6f 66 20 73 79 6e 63 2e 0a  go out of sync..
fb30: 20 20 2a 2f 0a 20 20 65 78 74 72 61 43 6f 6c 73    */.  extraCols
fb40: 20 3d 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64   = pSrc->colUsed
fb50: 20 26 20 28 7e 69 64 78 43 6f 6c 73 20 7c 20 4d   & (~idxCols | M
fb60: 41 53 4b 42 49 54 28 42 4d 53 2d 31 29 29 3b 0a  ASKBIT(BMS-1));.
fb70: 20 20 6d 78 42 69 74 43 6f 6c 20 3d 20 4d 49 4e    mxBitCol = MIN
fb80: 28 42 4d 53 2d 31 2c 70 54 61 62 6c 65 2d 3e 6e  (BMS-1,pTable->n
fb90: 43 6f 6c 29 3b 0a 20 20 74 65 73 74 63 61 73 65  Col);.  testcase
fba0: 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3d 3d  ( pTable->nCol==
fbb0: 42 4d 53 2d 31 20 29 3b 0a 20 20 74 65 73 74 63  BMS-1 );.  testc
fbc0: 61 73 65 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f  ase( pTable->nCo
fbd0: 6c 3d 3d 42 4d 53 2d 32 20 29 3b 0a 20 20 66 6f  l==BMS-2 );.  fo
fbe0: 72 28 69 3d 30 3b 20 69 3c 6d 78 42 69 74 43 6f  r(i=0; i<mxBitCo
fbf0: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  l; i++){.    if(
fc00: 20 65 78 74 72 61 43 6f 6c 73 20 26 20 4d 41 53   extraCols & MAS
fc10: 4b 42 49 54 28 69 29 20 29 20 6e 4b 65 79 43 6f  KBIT(i) ) nKeyCo
fc20: 6c 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  l++;.  }.  if( p
fc30: 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20 26 20 4d  Src->colUsed & M
fc40: 41 53 4b 42 49 54 28 42 4d 53 2d 31 29 20 29 7b  ASKBIT(BMS-1) ){
fc50: 0a 20 20 20 20 6e 4b 65 79 43 6f 6c 20 2b 3d 20  .    nKeyCol += 
fc60: 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 2d 20 42  pTable->nCol - B
fc70: 4d 53 20 2b 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f  MS + 1;.  }..  /
fc80: 2a 20 43 6f 6e 73 74 72 75 63 74 20 74 68 65 20  * Construct the 
fc90: 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 74 6f 20  Index object to 
fca0: 64 65 73 63 72 69 62 65 20 74 68 69 73 20 69 6e  describe this in
fcb0: 64 65 78 20 2a 2f 0a 20 20 70 49 64 78 20 3d 20  dex */.  pIdx = 
fcc0: 73 71 6c 69 74 65 33 41 6c 6c 6f 63 61 74 65 49  sqlite3AllocateI
fcd0: 6e 64 65 78 4f 62 6a 65 63 74 28 70 50 61 72 73  ndexObject(pPars
fce0: 65 2d 3e 64 62 2c 20 6e 4b 65 79 43 6f 6c 2b 31  e->db, nKeyCol+1
fcf0: 2c 20 30 2c 20 26 7a 4e 6f 74 55 73 65 64 29 3b  , 0, &zNotUsed);
fd00: 0a 20 20 69 66 28 20 70 49 64 78 3d 3d 30 20 29  .  if( pIdx==0 )
fd10: 20 67 6f 74 6f 20 65 6e 64 5f 61 75 74 6f 5f 69   goto end_auto_i
fd20: 6e 64 65 78 5f 63 72 65 61 74 65 3b 0a 20 20 70  ndex_create;.  p
fd30: 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49  Loop->u.btree.pI
fd40: 6e 64 65 78 20 3d 20 70 49 64 78 3b 0a 20 20 70  ndex = pIdx;.  p
fd50: 49 64 78 2d 3e 7a 4e 61 6d 65 20 3d 20 22 61 75  Idx->zName = "au
fd60: 74 6f 2d 69 6e 64 65 78 22 3b 0a 20 20 70 49 64  to-index";.  pId
fd70: 78 2d 3e 70 54 61 62 6c 65 20 3d 20 70 54 61 62  x->pTable = pTab
fd80: 6c 65 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 69  le;.  n = 0;.  i
fd90: 64 78 43 6f 6c 73 20 3d 20 30 3b 0a 20 20 66 6f  dxCols = 0;.  fo
fda0: 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20  r(pTerm=pWC->a; 
fdb0: 70 54 65 72 6d 3c 70 57 43 45 6e 64 3b 20 70 54  pTerm<pWCEnd; pT
fdc0: 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  erm++){.    if( 
fdd0: 74 65 72 6d 43 61 6e 44 72 69 76 65 49 6e 64 65  termCanDriveInde
fde0: 78 28 70 54 65 72 6d 2c 20 70 53 72 63 2c 20 6e  x(pTerm, pSrc, n
fdf0: 6f 74 52 65 61 64 79 29 20 29 7b 0a 20 20 20 20  otReady) ){.    
fe00: 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 54 65    int iCol = pTe
fe10: 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e  rm->u.leftColumn
fe20: 3b 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20  ;.      Bitmask 
fe30: 63 4d 61 73 6b 20 3d 20 69 43 6f 6c 3e 3d 42 4d  cMask = iCol>=BM
fe40: 53 20 3f 20 4d 41 53 4b 42 49 54 28 42 4d 53 2d  S ? MASKBIT(BMS-
fe50: 31 29 20 3a 20 4d 41 53 4b 42 49 54 28 69 43 6f  1) : MASKBIT(iCo
fe60: 6c 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  l);.      testca
fe70: 73 65 28 20 69 43 6f 6c 3d 3d 42 4d 53 2d 31 20  se( iCol==BMS-1 
fe80: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
fe90: 65 28 20 69 43 6f 6c 3d 3d 42 4d 53 20 29 3b 0a  e( iCol==BMS );.
fea0: 20 20 20 20 20 20 69 66 28 20 28 69 64 78 43 6f        if( (idxCo
feb0: 6c 73 20 26 20 63 4d 61 73 6b 29 3d 3d 30 20 29  ls & cMask)==0 )
fec0: 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a  {.        Expr *
fed0: 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70  pX = pTerm->pExp
fee0: 72 3b 0a 20 20 20 20 20 20 20 20 69 64 78 43 6f  r;.        idxCo
fef0: 6c 73 20 7c 3d 20 63 4d 61 73 6b 3b 0a 20 20 20  ls |= cMask;.   
ff00: 20 20 20 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c       pIdx->aiCol
ff10: 75 6d 6e 5b 6e 5d 20 3d 20 70 54 65 72 6d 2d 3e  umn[n] = pTerm->
ff20: 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20  u.leftColumn;.  
ff30: 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71        pColl = sq
ff40: 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61  lite3BinaryCompa
ff50: 72 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  reCollSeq(pParse
ff60: 2c 20 70 58 2d 3e 70 4c 65 66 74 2c 20 70 58 2d  , pX->pLeft, pX-
ff70: 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20  >pRight);.      
ff80: 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e    pIdx->azColl[n
ff90: 5d 20 3d 20 41 4c 57 41 59 53 28 70 43 6f 6c 6c  ] = ALWAYS(pColl
ffa0: 29 20 3f 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  ) ? pColl->zName
ffb0: 20 3a 20 22 42 49 4e 41 52 59 22 3b 0a 20 20 20   : "BINARY";.   
ffc0: 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 20 20       n++;.      
ffd0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73  }.    }.  }.  as
ffe0: 73 65 72 74 28 20 28 75 33 32 29 6e 3d 3d 70 4c  sert( (u32)n==pL
fff0: 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  oop->u.btree.nEq
10000 20 29 3b 0a 0a 20 20 2f 2a 20 41 64 64 20 61 64   );..  /* Add ad
10010 64 69 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 73  ditional columns
10020 20 6e 65 65 64 65 64 20 74 6f 20 6d 61 6b 65 20   needed to make 
10030 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e  the automatic in
10040 64 65 78 20 69 6e 74 6f 0a 20 20 2a 2a 20 61 20  dex into.  ** a 
10050 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20 2a  covering index *
10060 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6d  /.  for(i=0; i<m
10070 78 42 69 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  xBitCol; i++){. 
10080 20 20 20 69 66 28 20 65 78 74 72 61 43 6f 6c 73     if( extraCols
10090 20 26 20 4d 41 53 4b 42 49 54 28 69 29 20 29 7b   & MASKBIT(i) ){
100a0 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 61 69 43  .      pIdx->aiC
100b0 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 69 3b 0a 20 20  olumn[n] = i;.  
100c0 20 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c      pIdx->azColl
100d0 5b 6e 5d 20 3d 20 22 42 49 4e 41 52 59 22 3b 0a  [n] = "BINARY";.
100e0 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 7d        n++;.    }
100f0 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 72 63 2d  .  }.  if( pSrc-
10100 3e 63 6f 6c 55 73 65 64 20 26 20 4d 41 53 4b 42  >colUsed & MASKB
10110 49 54 28 42 4d 53 2d 31 29 20 29 7b 0a 20 20 20  IT(BMS-1) ){.   
10120 20 66 6f 72 28 69 3d 42 4d 53 2d 31 3b 20 69 3c   for(i=BMS-1; i<
10130 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 20 69 2b  pTable->nCol; i+
10140 2b 29 7b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e  +){.      pIdx->
10150 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 69 3b  aiColumn[n] = i;
10160 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a 43  .      pIdx->azC
10170 6f 6c 6c 5b 6e 5d 20 3d 20 22 42 49 4e 41 52 59  oll[n] = "BINARY
10180 22 3b 0a 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20  ";.      n++;.  
10190 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74    }.  }.  assert
101a0 28 20 6e 3d 3d 6e 4b 65 79 43 6f 6c 20 29 3b 0a  ( n==nKeyCol );.
101b0 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e    pIdx->aiColumn
101c0 5b 6e 5d 20 3d 20 2d 31 3b 0a 20 20 70 49 64 78  [n] = -1;.  pIdx
101d0 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 22 42  ->azColl[n] = "B
101e0 49 4e 41 52 59 22 3b 0a 0a 20 20 2f 2a 20 43 72  INARY";..  /* Cr
101f0 65 61 74 65 20 74 68 65 20 61 75 74 6f 6d 61 74  eate the automat
10200 69 63 20 69 6e 64 65 78 20 2a 2f 0a 20 20 61 73  ic index */.  as
10210 73 65 72 74 28 20 70 4c 65 76 65 6c 2d 3e 69 49  sert( pLevel->iI
10220 64 78 43 75 72 3e 3d 30 20 29 3b 0a 20 20 70 4c  dxCur>=0 );.  pL
10230 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 20 3d 20  evel->iIdxCur = 
10240 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
10250 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
10260 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 41 75  Op2(v, OP_OpenAu
10270 74 6f 69 6e 64 65 78 2c 20 70 4c 65 76 65 6c 2d  toindex, pLevel-
10280 3e 69 49 64 78 43 75 72 2c 20 6e 4b 65 79 43 6f  >iIdxCur, nKeyCo
10290 6c 2b 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  l+1);.  sqlite3V
102a0 64 62 65 53 65 74 50 34 4b 65 79 49 6e 66 6f 28  dbeSetP4KeyInfo(
102b0 70 50 61 72 73 65 2c 20 70 49 64 78 29 3b 0a 20  pParse, pIdx);. 
102c0 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
102d0 20 22 66 6f 72 20 25 73 22 2c 20 70 54 61 62 6c   "for %s", pTabl
102e0 65 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 0a 20 20 2f  e->zName));..  /
102f0 2a 20 46 69 6c 6c 20 74 68 65 20 61 75 74 6f 6d  * Fill the autom
10300 61 74 69 63 20 69 6e 64 65 78 20 77 69 74 68 20  atic index with 
10310 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 73 71 6c  content */.  sql
10320 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73  ite3ExprCachePus
10330 68 28 70 50 61 72 73 65 29 3b 0a 20 20 61 64 64  h(pParse);.  add
10340 72 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64  rTop = sqlite3Vd
10350 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52  beAddOp1(v, OP_R
10360 65 77 69 6e 64 2c 20 70 4c 65 76 65 6c 2d 3e 69  ewind, pLevel->i
10370 54 61 62 43 75 72 29 3b 20 56 64 62 65 43 6f 76  TabCur); VdbeCov
10380 65 72 61 67 65 28 76 29 3b 0a 20 20 69 66 28 20  erage(v);.  if( 
10390 70 50 61 72 74 69 61 6c 20 29 7b 0a 20 20 20 20  pPartial ){.    
103a0 69 43 6f 6e 74 69 6e 75 65 20 3d 20 73 71 6c 69  iContinue = sqli
103b0 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
103c0 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (v);.    sqlite3
103d0 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
103e0 73 65 2c 20 70 50 61 72 74 69 61 6c 2c 20 69 43  se, pPartial, iC
103f0 6f 6e 74 69 6e 75 65 2c 20 53 51 4c 49 54 45 5f  ontinue, SQLITE_
10400 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20  JUMPIFNULL);.   
10410 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20   pLoop->wsFlags 
10420 7c 3d 20 57 48 45 52 45 5f 50 41 52 54 49 41 4c  |= WHERE_PARTIAL
10430 49 44 58 3b 0a 20 20 7d 0a 20 20 72 65 67 52 65  IDX;.  }.  regRe
10440 63 6f 72 64 20 3d 20 73 71 6c 69 74 65 33 47 65  cord = sqlite3Ge
10450 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
10460 3b 0a 20 20 73 71 6c 69 74 65 33 47 65 6e 65 72  ;.  sqlite3Gener
10470 61 74 65 49 6e 64 65 78 4b 65 79 28 70 50 61 72  ateIndexKey(pPar
10480 73 65 2c 20 70 49 64 78 2c 20 70 4c 65 76 65 6c  se, pIdx, pLevel
10490 2d 3e 69 54 61 62 43 75 72 2c 20 72 65 67 52 65  ->iTabCur, regRe
104a0 63 6f 72 64 2c 20 30 2c 20 30 2c 20 30 2c 20 30  cord, 0, 0, 0, 0
104b0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
104c0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78  AddOp2(v, OP_Idx
104d0 49 6e 73 65 72 74 2c 20 70 4c 65 76 65 6c 2d 3e  Insert, pLevel->
104e0 69 49 64 78 43 75 72 2c 20 72 65 67 52 65 63 6f  iIdxCur, regReco
104f0 72 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  rd);.  sqlite3Vd
10500 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50  beChangeP5(v, OP
10510 46 4c 41 47 5f 55 53 45 53 45 45 4b 52 45 53 55  FLAG_USESEEKRESU
10520 4c 54 29 3b 0a 20 20 69 66 28 20 70 50 61 72 74  LT);.  if( pPart
10530 69 61 6c 20 29 20 73 71 6c 69 74 65 33 56 64 62  ial ) sqlite3Vdb
10540 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
10550 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 73   iContinue);.  s
10560 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
10570 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 70 4c 65  (v, OP_Next, pLe
10580 76 65 6c 2d 3e 69 54 61 62 43 75 72 2c 20 61 64  vel->iTabCur, ad
10590 64 72 54 6f 70 2b 31 29 3b 20 56 64 62 65 43 6f  drTop+1); VdbeCo
105a0 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c  verage(v);.  sql
105b0 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
105c0 28 76 2c 20 53 51 4c 49 54 45 5f 53 54 4d 54 53  (v, SQLITE_STMTS
105d0 54 41 54 55 53 5f 41 55 54 4f 49 4e 44 45 58 29  TATUS_AUTOINDEX)
105e0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a  ;.  sqlite3VdbeJ
105f0 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 54  umpHere(v, addrT
10600 6f 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65  op);.  sqlite3Re
10610 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
10620 72 73 65 2c 20 72 65 67 52 65 63 6f 72 64 29 3b  rse, regRecord);
10630 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  .  sqlite3ExprCa
10640 63 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a  chePop(pParse);.
10650 20 20 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72    .  /* Jump her
10660 65 20 77 68 65 6e 20 73 6b 69 70 70 69 6e 67 20  e when skipping 
10670 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  the initializati
10680 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  on */.  sqlite3V
10690 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
106a0 64 64 72 49 6e 69 74 29 3b 0a 0a 65 6e 64 5f 61  ddrInit);..end_a
106b0 75 74 6f 5f 69 6e 64 65 78 5f 63 72 65 61 74 65  uto_index_create
106c0 3a 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  :.  sqlite3ExprD
106d0 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62  elete(pParse->db
106e0 2c 20 70 50 61 72 74 69 61 6c 29 3b 0a 7d 0a 23  , pPartial);.}.#
106f0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
10700 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49  OMIT_AUTOMATIC_I
10710 4e 44 45 58 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  NDEX */..#ifndef
10720 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
10730 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20  TUALTABLE./*.** 
10740 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 70 6f 70  Allocate and pop
10750 75 6c 61 74 65 20 61 6e 20 73 71 6c 69 74 65 33  ulate an sqlite3
10760 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75  _index_info stru
10770 63 74 75 72 65 2e 20 49 74 20 69 73 20 74 68 65  cture. It is the
10780 20 0a 2a 2a 20 72 65 73 70 6f 6e 73 69 62 69 6c   .** responsibil
10790 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65  ity of the calle
107a0 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20  r to eventually 
107b0 72 65 6c 65 61 73 65 20 74 68 65 20 73 74 72 75  release the stru
107c0 63 74 75 72 65 0a 2a 2a 20 62 79 20 70 61 73 73  cture.** by pass
107d0 69 6e 67 20 74 68 65 20 70 6f 69 6e 74 65 72 20  ing the pointer 
107e0 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 69 73  returned by this
107f0 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 73 71 6c   function to sql
10800 69 74 65 33 5f 66 72 65 65 28 29 2e 0a 2a 2f 0a  ite3_free()..*/.
10810 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f 69  static sqlite3_i
10820 6e 64 65 78 5f 69 6e 66 6f 20 2a 61 6c 6c 6f 63  ndex_info *alloc
10830 61 74 65 49 6e 64 65 78 49 6e 66 6f 28 0a 20 20  ateIndexInfo(.  
10840 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 0a 20  Parse *pParse,. 
10850 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
10860 43 2c 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  C,.  struct SrcL
10870 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 0a  ist_item *pSrc,.
10880 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
10890 65 72 42 79 0a 29 7b 0a 20 20 69 6e 74 20 69 2c  erBy.){.  int i,
108a0 20 6a 3b 0a 20 20 69 6e 74 20 6e 54 65 72 6d 3b   j;.  int nTerm;
108b0 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69 74 65  .  struct sqlite
108c0 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69  3_index_constrai
108d0 6e 74 20 2a 70 49 64 78 43 6f 6e 73 3b 0a 20 20  nt *pIdxCons;.  
108e0 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
108f0 6e 64 65 78 5f 6f 72 64 65 72 62 79 20 2a 70 49  ndex_orderby *pI
10900 64 78 4f 72 64 65 72 42 79 3b 0a 20 20 73 74 72  dxOrderBy;.  str
10910 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
10920 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61  x_constraint_usa
10930 67 65 20 2a 70 55 73 61 67 65 3b 0a 20 20 57 68  ge *pUsage;.  Wh
10940 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a  ereTerm *pTerm;.
10950 20 20 69 6e 74 20 6e 4f 72 64 65 72 42 79 3b 0a    int nOrderBy;.
10960 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f    sqlite3_index_
10970 69 6e 66 6f 20 2a 70 49 64 78 49 6e 66 6f 3b 0a  info *pIdxInfo;.
10980 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 74 68 65 20  .  /* Count the 
10990 6e 75 6d 62 65 72 20 6f 66 20 70 6f 73 73 69 62  number of possib
109a0 6c 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  le WHERE clause 
109b0 63 6f 6e 73 74 72 61 69 6e 74 73 20 72 65 66 65  constraints refe
109c0 72 72 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 74 68  rring.  ** to th
109d0 69 73 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  is virtual table
109e0 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6e 54 65 72   */.  for(i=nTer
109f0 6d 3d 30 2c 20 70 54 65 72 6d 3d 70 57 43 2d 3e  m=0, pTerm=pWC->
10a00 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b  a; i<pWC->nTerm;
10a10 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a   i++, pTerm++){.
10a20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c      if( pTerm->l
10a30 65 66 74 43 75 72 73 6f 72 20 21 3d 20 70 53 72  eftCursor != pSr
10a40 63 2d 3e 69 43 75 72 73 6f 72 20 29 20 63 6f 6e  c->iCursor ) con
10a50 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72  tinue;.    asser
10a60 74 28 20 49 73 50 6f 77 65 72 4f 66 54 77 6f 28  t( IsPowerOfTwo(
10a70 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
10a80 20 26 20 7e 57 4f 5f 45 51 55 49 56 29 20 29 3b   & ~WO_EQUIV) );
10a90 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
10aa0 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
10ab0 26 20 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 74  & WO_IN );.    t
10ac0 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
10ad0 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49  eOperator & WO_I
10ae0 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 74 65 73  SNULL );.    tes
10af0 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f  tcase( pTerm->eO
10b00 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 41 4c 4c  perator & WO_ALL
10b10 20 29 3b 0a 20 20 20 20 69 66 28 20 28 70 54 65   );.    if( (pTe
10b20 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
10b30 7e 28 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 45  ~(WO_ISNULL|WO_E
10b40 51 55 49 56 29 29 3d 3d 30 20 29 20 63 6f 6e 74  QUIV))==0 ) cont
10b50 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 54  inue;.    if( pT
10b60 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  erm->wtFlags & T
10b70 45 52 4d 5f 56 4e 55 4c 4c 20 29 20 63 6f 6e 74  ERM_VNULL ) cont
10b80 69 6e 75 65 3b 0a 20 20 20 20 6e 54 65 72 6d 2b  inue;.    nTerm+
10b90 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  +;.  }..  /* If 
10ba0 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
10bb0 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 6c  use contains onl
10bc0 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  y columns in the
10bd0 20 63 75 72 72 65 6e 74 20 0a 20 20 2a 2a 20 76   current .  ** v
10be0 69 72 74 75 61 6c 20 74 61 62 6c 65 20 74 68 65  irtual table the
10bf0 6e 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65  n allocate space
10c00 20 66 6f 72 20 74 68 65 20 61 4f 72 64 65 72 42   for the aOrderB
10c10 79 20 70 61 72 74 20 6f 66 0a 20 20 2a 2a 20 74  y part of.  ** t
10c20 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  he sqlite3_index
10c30 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e  _info structure.
10c40 0a 20 20 2a 2f 0a 20 20 6e 4f 72 64 65 72 42 79  .  */.  nOrderBy
10c50 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 4f 72 64   = 0;.  if( pOrd
10c60 65 72 42 79 20 29 7b 0a 20 20 20 20 69 6e 74 20  erBy ){.    int 
10c70 6e 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45  n = pOrderBy->nE
10c80 78 70 72 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  xpr;.    for(i=0
10c90 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<n; i++){.   
10ca0 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d     Expr *pExpr =
10cb0 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
10cc0 70 45 78 70 72 3b 0a 20 20 20 20 20 20 69 66 28  pExpr;.      if(
10cd0 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43   pExpr->op!=TK_C
10ce0 4f 4c 55 4d 4e 20 7c 7c 20 70 45 78 70 72 2d 3e  OLUMN || pExpr->
10cf0 69 54 61 62 6c 65 21 3d 70 53 72 63 2d 3e 69 43  iTable!=pSrc->iC
10d00 75 72 73 6f 72 20 29 20 62 72 65 61 6b 3b 0a 20  ursor ) break;. 
10d10 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3d 3d     }.    if( i==
10d20 6e 29 7b 0a 20 20 20 20 20 20 6e 4f 72 64 65 72  n){.      nOrder
10d30 42 79 20 3d 20 6e 3b 0a 20 20 20 20 7d 0a 20 20  By = n;.    }.  
10d40 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  }..  /* Allocate
10d50 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64   the sqlite3_ind
10d60 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72  ex_info structur
10d70 65 0a 20 20 2a 2f 0a 20 20 70 49 64 78 49 6e 66  e.  */.  pIdxInf
10d80 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  o = sqlite3DbMal
10d90 6c 6f 63 5a 65 72 6f 28 70 50 61 72 73 65 2d 3e  locZero(pParse->
10da0 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 49 64 78  db, sizeof(*pIdx
10db0 49 6e 66 6f 29 0a 20 20 20 20 20 20 20 20 20 20  Info).          
10dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10dd0 20 2b 20 28 73 69 7a 65 6f 66 28 2a 70 49 64 78   + (sizeof(*pIdx
10de0 43 6f 6e 73 29 20 2b 20 73 69 7a 65 6f 66 28 2a  Cons) + sizeof(*
10df0 70 55 73 61 67 65 29 29 2a 6e 54 65 72 6d 0a 20  pUsage))*nTerm. 
10e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e10 20 20 20 20 20 20 20 20 20 20 2b 20 73 69 7a 65            + size
10e20 6f 66 28 2a 70 49 64 78 4f 72 64 65 72 42 79 29  of(*pIdxOrderBy)
10e30 2a 6e 4f 72 64 65 72 42 79 20 29 3b 0a 20 20 69  *nOrderBy );.  i
10e40 66 28 20 70 49 64 78 49 6e 66 6f 3d 3d 30 20 29  f( pIdxInfo==0 )
10e50 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
10e60 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6f  orMsg(pParse, "o
10e70 75 74 20 6f 66 20 6d 65 6d 6f 72 79 22 29 3b 0a  ut of memory");.
10e80 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
10e90 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69  }..  /* Initiali
10ea0 7a 65 20 74 68 65 20 73 74 72 75 63 74 75 72 65  ze the structure
10eb0 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33 5f 69  .  The sqlite3_i
10ec0 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74  ndex_info struct
10ed0 75 72 65 20 63 6f 6e 74 61 69 6e 73 0a 20 20 2a  ure contains.  *
10ee0 2a 20 6d 61 6e 79 20 66 69 65 6c 64 73 20 74 68  * many fields th
10ef0 61 74 20 61 72 65 20 64 65 63 6c 61 72 65 64 20  at are declared 
10f00 22 63 6f 6e 73 74 22 20 74 6f 20 70 72 65 76 65  "const" to preve
10f10 6e 74 20 78 42 65 73 74 49 6e 64 65 78 20 66 72  nt xBestIndex fr
10f20 6f 6d 0a 20 20 2a 2a 20 63 68 61 6e 67 69 6e 67  om.  ** changing
10f30 20 74 68 65 6d 2e 20 20 57 65 20 68 61 76 65 20   them.  We have 
10f40 74 6f 20 64 6f 20 73 6f 6d 65 20 66 75 6e 6b 79  to do some funky
10f50 20 63 61 73 74 69 6e 67 20 69 6e 20 6f 72 64 65   casting in orde
10f60 72 20 74 6f 0a 20 20 2a 2a 20 69 6e 69 74 69 61  r to.  ** initia
10f70 6c 69 7a 65 20 74 68 6f 73 65 20 66 69 65 6c 64  lize those field
10f80 73 2e 0a 20 20 2a 2f 0a 20 20 70 49 64 78 43 6f  s..  */.  pIdxCo
10f90 6e 73 20 3d 20 28 73 74 72 75 63 74 20 73 71 6c  ns = (struct sql
10fa0 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
10fb0 72 61 69 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f  raint*)&pIdxInfo
10fc0 5b 31 5d 3b 0a 20 20 70 49 64 78 4f 72 64 65 72  [1];.  pIdxOrder
10fd0 42 79 20 3d 20 28 73 74 72 75 63 74 20 73 71 6c  By = (struct sql
10fe0 69 74 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65 72  ite3_index_order
10ff0 62 79 2a 29 26 70 49 64 78 43 6f 6e 73 5b 6e 54  by*)&pIdxCons[nT
11000 65 72 6d 5d 3b 0a 20 20 70 55 73 61 67 65 20 3d  erm];.  pUsage =
11010 20 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33   (struct sqlite3
11020 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e  _index_constrain
11030 74 5f 75 73 61 67 65 2a 29 26 70 49 64 78 4f 72  t_usage*)&pIdxOr
11040 64 65 72 42 79 5b 6e 4f 72 64 65 72 42 79 5d 3b  derBy[nOrderBy];
11050 0a 20 20 2a 28 69 6e 74 2a 29 26 70 49 64 78 49  .  *(int*)&pIdxI
11060 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74  nfo->nConstraint
11070 20 3d 20 6e 54 65 72 6d 3b 0a 20 20 2a 28 69 6e   = nTerm;.  *(in
11080 74 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f  t*)&pIdxInfo->nO
11090 72 64 65 72 42 79 20 3d 20 6e 4f 72 64 65 72 42  rderBy = nOrderB
110a0 79 3b 0a 20 20 2a 28 73 74 72 75 63 74 20 73 71  y;.  *(struct sq
110b0 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
110c0 74 72 61 69 6e 74 2a 2a 29 26 70 49 64 78 49 6e  traint**)&pIdxIn
110d0 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 20  fo->aConstraint 
110e0 3d 20 70 49 64 78 43 6f 6e 73 3b 0a 20 20 2a 28  = pIdxCons;.  *(
110f0 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
11100 6e 64 65 78 5f 6f 72 64 65 72 62 79 2a 2a 29 26  ndex_orderby**)&
11110 70 49 64 78 49 6e 66 6f 2d 3e 61 4f 72 64 65 72  pIdxInfo->aOrder
11120 42 79 20 3d 20 70 49 64 78 4f 72 64 65 72 42 79  By = pIdxOrderBy
11130 3b 0a 20 20 2a 28 73 74 72 75 63 74 20 73 71 6c  ;.  *(struct sql
11140 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
11150 72 61 69 6e 74 5f 75 73 61 67 65 2a 2a 29 26 70  raint_usage**)&p
11160 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72  IdxInfo->aConstr
11170 61 69 6e 74 55 73 61 67 65 20 3d 0a 20 20 20 20  aintUsage =.    
11180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
111a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
111b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
111c0 55 73 61 67 65 3b 0a 0a 20 20 66 6f 72 28 69 3d  Usage;..  for(i=
111d0 6a 3d 30 2c 20 70 54 65 72 6d 3d 70 57 43 2d 3e  j=0, pTerm=pWC->
111e0 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b  a; i<pWC->nTerm;
111f0 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a   i++, pTerm++){.
11200 20 20 20 20 75 38 20 6f 70 3b 0a 20 20 20 20 69      u8 op;.    i
11210 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75  f( pTerm->leftCu
11220 72 73 6f 72 20 21 3d 20 70 53 72 63 2d 3e 69 43  rsor != pSrc->iC
11230 75 72 73 6f 72 20 29 20 63 6f 6e 74 69 6e 75 65  ursor ) continue
11240 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 49 73  ;.    assert( Is
11250 50 6f 77 65 72 4f 66 54 77 6f 28 70 54 65 72 6d  PowerOfTwo(pTerm
11260 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 7e 57  ->eOperator & ~W
11270 4f 5f 45 51 55 49 56 29 20 29 3b 0a 20 20 20 20  O_EQUIV) );.    
11280 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
11290 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
112a0 49 4e 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  IN );.    testca
112b0 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  se( pTerm->eOper
112c0 61 74 6f 72 20 26 20 57 4f 5f 49 53 4e 55 4c 4c  ator & WO_ISNULL
112d0 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
112e0 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
112f0 6f 72 20 26 20 57 4f 5f 41 4c 4c 20 29 3b 0a 20  or & WO_ALL );. 
11300 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65     if( (pTerm->e
11310 4f 70 65 72 61 74 6f 72 20 26 20 7e 28 57 4f 5f  Operator & ~(WO_
11320 49 53 4e 55 4c 4c 7c 57 4f 5f 45 51 55 49 56 29  ISNULL|WO_EQUIV)
11330 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  )==0 ) continue;
11340 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e  .    if( pTerm->
11350 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
11360 4e 55 4c 4c 20 29 20 63 6f 6e 74 69 6e 75 65 3b  NULL ) continue;
11370 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d  .    pIdxCons[j]
11380 2e 69 43 6f 6c 75 6d 6e 20 3d 20 70 54 65 72 6d  .iColumn = pTerm
11390 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a  ->u.leftColumn;.
113a0 20 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e      pIdxCons[j].
113b0 69 54 65 72 6d 4f 66 66 73 65 74 20 3d 20 69 3b  iTermOffset = i;
113c0 0a 20 20 20 20 6f 70 20 3d 20 28 75 38 29 70 54  .    op = (u8)pT
113d0 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
113e0 20 57 4f 5f 41 4c 4c 3b 0a 20 20 20 20 69 66 28   WO_ALL;.    if(
113f0 20 6f 70 3d 3d 57 4f 5f 49 4e 20 29 20 6f 70 20   op==WO_IN ) op 
11400 3d 20 57 4f 5f 45 51 3b 0a 20 20 20 20 70 49 64  = WO_EQ;.    pId
11410 78 43 6f 6e 73 5b 6a 5d 2e 6f 70 20 3d 20 6f 70  xCons[j].op = op
11420 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20 64 69 72  ;.    /* The dir
11430 65 63 74 20 61 73 73 69 67 6e 6d 65 6e 74 20 69  ect assignment i
11440 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 6c  n the previous l
11450 69 6e 65 20 69 73 20 70 6f 73 73 69 62 6c 65 20  ine is possible 
11460 6f 6e 6c 79 20 62 65 63 61 75 73 65 0a 20 20 20  only because.   
11470 20 2a 2a 20 74 68 65 20 57 4f 5f 20 61 6e 64 20   ** the WO_ and 
11480 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e  SQLITE_INDEX_CON
11490 53 54 52 41 49 4e 54 5f 20 63 6f 64 65 73 20 61  STRAINT_ codes a
114a0 72 65 20 69 64 65 6e 74 69 63 61 6c 2e 20 20 54  re identical.  T
114b0 68 65 0a 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77  he.    ** follow
114c0 69 6e 67 20 61 73 73 65 72 74 73 20 76 65 72 69  ing asserts veri
114d0 66 79 20 74 68 69 73 20 66 61 63 74 2e 20 2a 2f  fy this fact. */
114e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f  .    assert( WO_
114f0 45 51 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58  EQ==SQLITE_INDEX
11500 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 45 51 20 29  _CONSTRAINT_EQ )
11510 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 57 4f  ;.    assert( WO
11520 5f 4c 54 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45  _LT==SQLITE_INDE
11530 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4c 54 20  X_CONSTRAINT_LT 
11540 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 57  );.    assert( W
11550 4f 5f 4c 45 3d 3d 53 51 4c 49 54 45 5f 49 4e 44  O_LE==SQLITE_IND
11560 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4c 45  EX_CONSTRAINT_LE
11570 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
11580 57 4f 5f 47 54 3d 3d 53 51 4c 49 54 45 5f 49 4e  WO_GT==SQLITE_IN
11590 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 47  DEX_CONSTRAINT_G
115a0 54 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  T );.    assert(
115b0 20 57 4f 5f 47 45 3d 3d 53 51 4c 49 54 45 5f 49   WO_GE==SQLITE_I
115c0 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  NDEX_CONSTRAINT_
115d0 47 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  GE );.    assert
115e0 28 20 57 4f 5f 4d 41 54 43 48 3d 3d 53 51 4c 49  ( WO_MATCH==SQLI
115f0 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41  TE_INDEX_CONSTRA
11600 49 4e 54 5f 4d 41 54 43 48 20 29 3b 0a 20 20 20  INT_MATCH );.   
11610 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e   assert( pTerm->
11620 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f  eOperator & (WO_
11630 49 4e 7c 57 4f 5f 45 51 7c 57 4f 5f 4c 54 7c 57  IN|WO_EQ|WO_LT|W
11640 4f 5f 4c 45 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45  O_LE|WO_GT|WO_GE
11650 7c 57 4f 5f 4d 41 54 43 48 29 20 29 3b 0a 20 20  |WO_MATCH) );.  
11660 20 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20 66 6f 72    j++;.  }.  for
11670 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79  (i=0; i<nOrderBy
11680 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  ; i++){.    Expr
11690 20 2a 70 45 78 70 72 20 3d 20 70 4f 72 64 65 72   *pExpr = pOrder
116a0 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  By->a[i].pExpr;.
116b0 20 20 20 20 70 49 64 78 4f 72 64 65 72 42 79 5b      pIdxOrderBy[
116c0 69 5d 2e 69 43 6f 6c 75 6d 6e 20 3d 20 70 45 78  i].iColumn = pEx
116d0 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  pr->iColumn;.   
116e0 20 70 49 64 78 4f 72 64 65 72 42 79 5b 69 5d 2e   pIdxOrderBy[i].
116f0 64 65 73 63 20 3d 20 70 4f 72 64 65 72 42 79 2d  desc = pOrderBy-
11700 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b  >a[i].sortOrder;
11710 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70  .  }..  return p
11720 49 64 78 49 6e 66 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a  IdxInfo;.}../*.*
11730 2a 20 54 68 65 20 74 61 62 6c 65 20 6f 62 6a 65  * The table obje
11740 63 74 20 72 65 66 65 72 65 6e 63 65 20 70 61 73  ct reference pas
11750 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
11760 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  d argument to th
11770 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d  is function.** m
11780 75 73 74 20 72 65 70 72 65 73 65 6e 74 20 61 20  ust represent a 
11790 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20 54  virtual table. T
117a0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 6e 76  his function inv
117b0 6f 6b 65 73 20 74 68 65 20 78 42 65 73 74 49 6e  okes the xBestIn
117c0 64 65 78 28 29 0a 2a 2a 20 6d 65 74 68 6f 64 20  dex().** method 
117d0 6f 66 20 74 68 65 20 76 69 72 74 75 61 6c 20 74  of the virtual t
117e0 61 62 6c 65 20 77 69 74 68 20 74 68 65 20 73 71  able with the sq
117f0 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
11800 20 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a 2a 20   object that.** 
11810 63 6f 6d 65 73 20 69 6e 20 61 73 20 74 68 65 20  comes in as the 
11820 33 72 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  3rd argument to 
11830 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  this function..*
11840 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
11850 20 6f 63 63 75 72 73 2c 20 70 50 61 72 73 65 20   occurs, pParse 
11860 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74  is populated wit
11870 68 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  h an error messa
11880 67 65 20 61 6e 64 20 61 0a 2a 2a 20 6e 6f 6e 2d  ge and a.** non-
11890 7a 65 72 6f 20 76 61 6c 75 65 20 69 73 20 72 65  zero value is re
118a0 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73  turned. Otherwis
118b0 65 2c 20 30 20 69 73 20 72 65 74 75 72 6e 65 64  e, 0 is returned
118c0 20 61 6e 64 20 74 68 65 20 6f 75 74 70 75 74 0a   and the output.
118d0 2a 2a 20 70 61 72 74 20 6f 66 20 74 68 65 20 73  ** part of the s
118e0 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
118f0 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20 6c  o structure is l
11900 65 66 74 20 70 6f 70 75 6c 61 74 65 64 2e 0a 2a  eft populated..*
11910 2a 0a 2a 2a 20 57 68 65 74 68 65 72 20 6f 72 20  *.** Whether or 
11920 6e 6f 74 20 61 6e 20 65 72 72 6f 72 20 69 73 20  not an error is 
11930 72 65 74 75 72 6e 65 64 2c 20 69 74 20 69 73 20  returned, it is 
11940 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69  the responsibili
11950 74 79 20 6f 66 20 74 68 65 0a 2a 2a 20 63 61 6c  ty of the.** cal
11960 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c  ler to eventuall
11970 79 20 66 72 65 65 20 70 2d 3e 69 64 78 53 74 72  y free p->idxStr
11980 20 69 66 20 70 2d 3e 6e 65 65 64 54 6f 46 72 65   if p->needToFre
11990 65 49 64 78 53 74 72 20 69 6e 64 69 63 61 74 65  eIdxStr indicate
119a0 73 0a 2a 2a 20 74 68 61 74 20 74 68 69 73 20 69  s.** that this i
119b0 73 20 72 65 71 75 69 72 65 64 2e 0a 2a 2f 0a 73  s required..*/.s
119c0 74 61 74 69 63 20 69 6e 74 20 76 74 61 62 42 65  tatic int vtabBe
119d0 73 74 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70  stIndex(Parse *p
119e0 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54  Parse, Table *pT
119f0 61 62 2c 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  ab, sqlite3_inde
11a00 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 73 71  x_info *p){.  sq
11a10 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61  lite3_vtab *pVta
11a20 62 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 54  b = sqlite3GetVT
11a30 61 62 6c 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  able(pParse->db,
11a40 20 70 54 61 62 29 2d 3e 70 56 74 61 62 3b 0a 20   pTab)->pVtab;. 
11a50 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 63   int i;.  int rc
11a60 3b 0a 0a 20 20 54 52 41 43 45 5f 49 44 58 5f 49  ;..  TRACE_IDX_I
11a70 4e 50 55 54 53 28 70 29 3b 0a 20 20 72 63 20 3d  NPUTS(p);.  rc =
11a80 20 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 2d   pVtab->pModule-
11a90 3e 78 42 65 73 74 49 6e 64 65 78 28 70 56 74 61  >xBestIndex(pVta
11aa0 62 2c 20 70 29 3b 0a 20 20 54 52 41 43 45 5f 49  b, p);.  TRACE_I
11ab0 44 58 5f 4f 55 54 50 55 54 53 28 70 29 3b 0a 0a  DX_OUTPUTS(p);..
11ac0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
11ad0 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 72  _OK ){.    if( r
11ae0 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
11af0 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  ){.      pParse-
11b00 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
11b10 64 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  d = 1;.    }else
11b20 20 69 66 28 20 21 70 56 74 61 62 2d 3e 7a 45 72   if( !pVtab->zEr
11b30 72 4d 73 67 20 29 7b 0a 20 20 20 20 20 20 73 71  rMsg ){.      sq
11b40 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
11b50 61 72 73 65 2c 20 22 25 73 22 2c 20 73 71 6c 69  arse, "%s", sqli
11b60 74 65 33 45 72 72 53 74 72 28 72 63 29 29 3b 0a  te3ErrStr(rc));.
11b70 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
11b80 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
11b90 28 70 50 61 72 73 65 2c 20 22 25 73 22 2c 20 70  (pParse, "%s", p
11ba0 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a  Vtab->zErrMsg);.
11bb0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
11bc0 74 65 33 5f 66 72 65 65 28 70 56 74 61 62 2d 3e  te3_free(pVtab->
11bd0 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70 56 74 61  zErrMsg);.  pVta
11be0 62 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a  b->zErrMsg = 0;.
11bf0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
11c00 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b  >nConstraint; i+
11c10 2b 29 7b 0a 20 20 20 20 69 66 28 20 21 70 2d 3e  +){.    if( !p->
11c20 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 75  aConstraint[i].u
11c30 73 61 62 6c 65 20 26 26 20 70 2d 3e 61 43 6f 6e  sable && p->aCon
11c40 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e  straintUsage[i].
11c50 61 72 67 76 49 6e 64 65 78 3e 30 20 29 7b 0a 20  argvIndex>0 ){. 
11c60 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
11c70 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20  rMsg(pParse, .  
11c80 20 20 20 20 20 20 20 20 22 74 61 62 6c 65 20 25          "table %
11c90 73 3a 20 78 42 65 73 74 49 6e 64 65 78 20 72 65  s: xBestIndex re
11ca0 74 75 72 6e 65 64 20 61 6e 20 69 6e 76 61 6c 69  turned an invali
11cb0 64 20 70 6c 61 6e 22 2c 20 70 54 61 62 2d 3e 7a  d plan", pTab->z
11cc0 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Name);.    }.  }
11cd0 0a 0a 20 20 72 65 74 75 72 6e 20 70 50 61 72 73  ..  return pPars
11ce0 65 2d 3e 6e 45 72 72 3b 0a 7d 0a 23 65 6e 64 69  e->nErr;.}.#endi
11cf0 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51  f /* !defined(SQ
11d00 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
11d10 4c 54 41 42 4c 45 29 20 2a 2f 0a 0a 23 69 66 64  LTABLE) */..#ifd
11d20 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
11d30 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a  _STAT3_OR_STAT4.
11d40 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20 74  /*.** Estimate t
11d50 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 61  he location of a
11d60 20 70 61 72 74 69 63 75 6c 61 72 20 6b 65 79 20   particular key 
11d70 61 6d 6f 6e 67 20 61 6c 6c 20 6b 65 79 73 20 69  among all keys i
11d80 6e 20 61 6e 0a 2a 2a 20 69 6e 64 65 78 2e 20 20  n an.** index.  
11d90 53 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  Store the result
11da0 73 20 69 6e 20 61 53 74 61 74 20 61 73 20 66 6f  s in aStat as fo
11db0 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  llows:.**.**    
11dc0 61 53 74 61 74 5b 30 5d 20 20 20 20 20 20 45 73  aStat[0]      Es
11dd0 74 2e 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  t. number of row
11de0 73 20 6c 65 73 73 20 74 68 61 6e 20 70 56 61 6c  s less than pVal
11df0 0a 2a 2a 20 20 20 20 61 53 74 61 74 5b 31 5d 20  .**    aStat[1] 
11e00 20 20 20 20 20 45 73 74 2e 20 6e 75 6d 62 65 72       Est. number
11e10 20 6f 66 20 72 6f 77 73 20 65 71 75 61 6c 20 74   of rows equal t
11e20 6f 20 70 56 61 6c 0a 2a 2a 0a 2a 2a 20 52 65 74  o pVal.**.** Ret
11e30 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66  urn the index of
11e40 20 74 68 65 20 73 61 6d 70 6c 65 20 74 68 61 74   the sample that
11e50 20 69 73 20 74 68 65 20 73 6d 61 6c 6c 65 73 74   is the smallest
11e60 20 73 61 6d 70 6c 65 20 74 68 61 74 0a 2a 2a 20   sample that.** 
11e70 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
11e80 6f 72 20 65 71 75 61 6c 20 74 6f 20 70 52 65 63  or equal to pRec
11e90 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
11ea0 77 68 65 72 65 4b 65 79 53 74 61 74 73 28 0a 20  whereKeyStats(. 
11eb0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
11ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11ed0 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
11ee0 69 6f 6e 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  ion */.  Index *
11ef0 70 49 64 78 2c 20 20 20 20 20 20 20 20 20 20 20  pIdx,           
11f00 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f       /* Index to
11f10 20 63 6f 6e 73 69 64 65 72 20 64 6f 6d 61 69 6e   consider domain
11f20 20 6f 66 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65   of */.  Unpacke
11f30 64 52 65 63 6f 72 64 20 2a 70 52 65 63 2c 20 20  dRecord *pRec,  
11f40 20 20 20 20 20 2f 2a 20 56 65 63 74 6f 72 20 6f       /* Vector o
11f50 66 20 76 61 6c 75 65 73 20 74 6f 20 63 6f 6e 73  f values to cons
11f60 69 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 6f  ider */.  int ro
11f70 75 6e 64 55 70 2c 20 20 20 20 20 20 20 20 20 20  undUp,          
11f80 20 20 20 20 20 20 2f 2a 20 52 6f 75 6e 64 20 75        /* Round u
11f90 70 20 69 66 20 74 72 75 65 2e 20 20 52 6f 75 6e  p if true.  Roun
11fa0 64 20 64 6f 77 6e 20 69 66 20 66 61 6c 73 65 20  d down if false 
11fb0 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 2a 61 53  */.  tRowcnt *aS
11fc0 74 61 74 20 20 20 20 20 20 20 20 20 20 20 20 20  tat             
11fd0 20 2f 2a 20 4f 55 54 3a 20 73 74 61 74 73 20 77   /* OUT: stats w
11fe0 72 69 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a 29  ritten here */.)
11ff0 7b 0a 20 20 49 6e 64 65 78 53 61 6d 70 6c 65 20  {.  IndexSample 
12000 2a 61 53 61 6d 70 6c 65 20 3d 20 70 49 64 78 2d  *aSample = pIdx-
12010 3e 61 53 61 6d 70 6c 65 3b 0a 20 20 69 6e 74 20  >aSample;.  int 
12020 69 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20  iCol;           
12030 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
12040 20 6f 66 20 72 65 71 75 69 72 65 64 20 73 74 61   of required sta
12050 74 73 20 69 6e 20 61 6e 45 71 5b 5d 20 65 74 63  ts in anEq[] etc
12060 2e 20 2a 2f 0a 20 20 69 6e 74 20 69 4d 69 6e 20  . */.  int iMin 
12070 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
12080 20 20 20 2f 2a 20 53 6d 61 6c 6c 65 73 74 20 73     /* Smallest s
12090 61 6d 70 6c 65 20 6e 6f 74 20 79 65 74 20 74 65  ample not yet te
120a0 73 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 20  sted */.  int i 
120b0 3d 20 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 3b  = pIdx->nSample;
120c0 20 20 20 20 20 20 2f 2a 20 53 6d 61 6c 6c 65 73        /* Smalles
120d0 74 20 73 61 6d 70 6c 65 20 6c 61 72 67 65 72 20  t sample larger 
120e0 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
120f0 20 70 52 65 63 20 2a 2f 0a 20 20 69 6e 74 20 69   pRec */.  int i
12100 54 65 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  Test;           
12110 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 73         /* Next s
12120 61 6d 70 6c 65 20 74 6f 20 74 65 73 74 20 2a 2f  ample to test */
12130 0a 20 20 69 6e 74 20 72 65 73 3b 20 20 20 20 20  .  int res;     
12140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12150 2a 20 52 65 73 75 6c 74 20 6f 66 20 63 6f 6d 70  * Result of comp
12160 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 69 6f 6e  arison operation
12170 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
12180 49 54 45 5f 44 45 42 55 47 0a 20 20 55 4e 55 53  ITE_DEBUG.  UNUS
12190 45 44 5f 50 41 52 41 4d 45 54 45 52 28 20 70 50  ED_PARAMETER( pP
121a0 61 72 73 65 20 29 3b 0a 23 65 6e 64 69 66 0a 20  arse );.#endif. 
121b0 20 61 73 73 65 72 74 28 20 70 52 65 63 21 3d 30   assert( pRec!=0
121c0 20 29 3b 0a 20 20 69 43 6f 6c 20 3d 20 70 52 65   );.  iCol = pRe
121d0 63 2d 3e 6e 46 69 65 6c 64 20 2d 20 31 3b 0a 20  c->nField - 1;. 
121e0 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6e   assert( pIdx->n
121f0 53 61 6d 70 6c 65 3e 30 20 29 3b 0a 20 20 61 73  Sample>0 );.  as
12200 73 65 72 74 28 20 70 52 65 63 2d 3e 6e 46 69 65  sert( pRec->nFie
12210 6c 64 3e 30 20 26 26 20 69 43 6f 6c 3c 70 49 64  ld>0 && iCol<pId
12220 78 2d 3e 6e 53 61 6d 70 6c 65 43 6f 6c 20 29 3b  x->nSampleCol );
12230 0a 20 20 64 6f 7b 0a 20 20 20 20 69 54 65 73 74  .  do{.    iTest
12240 20 3d 20 28 69 4d 69 6e 2b 69 29 2f 32 3b 0a 20   = (iMin+i)/2;. 
12250 20 20 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33     res = sqlite3
12260 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
12270 65 28 61 53 61 6d 70 6c 65 5b 69 54 65 73 74 5d  e(aSample[iTest]
12280 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b 69 54 65 73  .n, aSample[iTes
12290 74 5d 2e 70 2c 20 70 52 65 63 29 3b 0a 20 20 20  t].p, pRec);.   
122a0 20 69 66 28 20 72 65 73 3c 30 20 29 7b 0a 20 20   if( res<0 ){.  
122b0 20 20 20 20 69 4d 69 6e 20 3d 20 69 54 65 73 74      iMin = iTest
122c0 2b 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  +1;.    }else{. 
122d0 20 20 20 20 20 69 20 3d 20 69 54 65 73 74 3b 0a       i = iTest;.
122e0 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20      }.  }while( 
122f0 72 65 73 20 26 26 20 69 4d 69 6e 3c 69 20 29 3b  res && iMin<i );
12300 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
12310 44 45 42 55 47 0a 20 20 2f 2a 20 54 68 65 20 66  DEBUG.  /* The f
12320 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 20  ollowing assert 
12330 73 74 61 74 65 6d 65 6e 74 73 20 63 68 65 63 6b  statements check
12340 20 74 68 61 74 20 74 68 65 20 62 69 6e 61 72 79   that the binary
12350 20 73 65 61 72 63 68 20 63 6f 64 65 0a 20 20 2a   search code.  *
12360 2a 20 61 62 6f 76 65 20 66 6f 75 6e 64 20 74 68  * above found th
12370 65 20 72 69 67 68 74 20 61 6e 73 77 65 72 2e 20  e right answer. 
12380 54 68 69 73 20 62 6c 6f 63 6b 20 73 65 72 76 65  This block serve
12390 73 20 6e 6f 20 70 75 72 70 6f 73 65 20 6f 74 68  s no purpose oth
123a0 65 72 0a 20 20 2a 2a 20 74 68 61 6e 20 74 6f 20  er.  ** than to 
123b0 69 6e 76 6f 6b 65 20 74 68 65 20 61 73 73 65 72  invoke the asser
123c0 74 73 2e 20 20 2a 2f 0a 20 20 69 66 28 20 72 65  ts.  */.  if( re
123d0 73 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49  s==0 ){.    /* I
123e0 66 20 28 72 65 73 3d 3d 30 29 20 69 73 20 74 72  f (res==0) is tr
123f0 75 65 2c 20 74 68 65 6e 20 73 61 6d 70 6c 65 20  ue, then sample 
12400 24 69 20 6d 75 73 74 20 62 65 20 65 71 75 61 6c  $i must be equal
12410 20 74 6f 20 70 52 65 63 20 2a 2f 0a 20 20 20 20   to pRec */.    
12420 61 73 73 65 72 74 28 20 69 3c 70 49 64 78 2d 3e  assert( i<pIdx->
12430 6e 53 61 6d 70 6c 65 20 29 3b 0a 20 20 20 20 61  nSample );.    a
12440 73 73 65 72 74 28 20 30 3d 3d 73 71 6c 69 74 65  ssert( 0==sqlite
12450 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
12460 72 65 28 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e 2c  re(aSample[i].n,
12470 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 70 2c 20 70   aSample[i].p, p
12480 52 65 63 29 0a 20 20 20 20 20 20 20 20 20 7c 7c  Rec).         ||
12490 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
124a0 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 7d  locFailed );.  }
124b0 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4f 74 68  else{.    /* Oth
124c0 65 72 77 69 73 65 2c 20 70 52 65 63 20 6d 75 73  erwise, pRec mus
124d0 74 20 62 65 20 73 6d 61 6c 6c 65 72 20 74 68 61  t be smaller tha
124e0 6e 20 73 61 6d 70 6c 65 20 24 69 20 61 6e 64 20  n sample $i and 
124f0 6c 61 72 67 65 72 20 74 68 61 6e 0a 20 20 20 20  larger than.    
12500 2a 2a 20 73 61 6d 70 6c 65 20 28 24 69 2d 31 29  ** sample ($i-1)
12510 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  .  */.    assert
12520 28 20 69 3d 3d 70 49 64 78 2d 3e 6e 53 61 6d 70  ( i==pIdx->nSamp
12530 6c 65 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  le .         || 
12540 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
12550 64 43 6f 6d 70 61 72 65 28 61 53 61 6d 70 6c 65  dCompare(aSample
12560 5b 69 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b 69  [i].n, aSample[i
12570 5d 2e 70 2c 20 70 52 65 63 29 3e 30 0a 20 20 20  ].p, pRec)>0.   
12580 20 20 20 20 20 20 7c 7c 20 70 50 61 72 73 65 2d        || pParse-
12590 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
125a0 64 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  d );.    assert(
125b0 20 69 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 7c   i==0.         |
125c0 7c 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  | sqlite3VdbeRec
125d0 6f 72 64 43 6f 6d 70 61 72 65 28 61 53 61 6d 70  ordCompare(aSamp
125e0 6c 65 5b 69 2d 31 5d 2e 6e 2c 20 61 53 61 6d 70  le[i-1].n, aSamp
125f0 6c 65 5b 69 2d 31 5d 2e 70 2c 20 70 52 65 63 29  le[i-1].p, pRec)
12600 3c 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70  <0.         || p
12610 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
12620 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 7d 0a 23  cFailed );.  }.#
12630 65 6e 64 69 66 20 2f 2a 20 69 66 64 65 66 20 53  endif /* ifdef S
12640 51 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a 0a  QLITE_DEBUG */..
12650 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69    /* At this poi
12660 6e 74 2c 20 61 53 61 6d 70 6c 65 5b 69 5d 20 69  nt, aSample[i] i
12670 73 20 74 68 65 20 66 69 72 73 74 20 73 61 6d 70  s the first samp
12680 6c 65 20 74 68 61 74 20 69 73 20 67 72 65 61 74  le that is great
12690 65 72 20 74 68 61 6e 0a 20 20 2a 2a 20 6f 72 20  er than.  ** or 
126a0 65 71 75 61 6c 20 74 6f 20 70 56 61 6c 2e 20 20  equal to pVal.  
126b0 4f 72 20 69 66 20 69 3d 3d 70 49 64 78 2d 3e 6e  Or if i==pIdx->n
126c0 53 61 6d 70 6c 65 2c 20 74 68 65 6e 20 61 6c 6c  Sample, then all
126d0 20 73 61 6d 70 6c 65 73 20 61 72 65 20 6c 65 73   samples are les
126e0 73 0a 20 20 2a 2a 20 74 68 61 6e 20 70 56 61 6c  s.  ** than pVal
126f0 2e 20 20 49 66 20 61 53 61 6d 70 6c 65 5b 69 5d  .  If aSample[i]
12700 3d 3d 70 56 61 6c 2c 20 74 68 65 6e 20 72 65 73  ==pVal, then res
12710 3d 3d 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ==0..  */.  if( 
12720 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 61 53  res==0 ){.    aS
12730 74 61 74 5b 30 5d 20 3d 20 61 53 61 6d 70 6c 65  tat[0] = aSample
12740 5b 69 5d 2e 61 6e 4c 74 5b 69 43 6f 6c 5d 3b 0a  [i].anLt[iCol];.
12750 20 20 20 20 61 53 74 61 74 5b 31 5d 20 3d 20 61      aStat[1] = a
12760 53 61 6d 70 6c 65 5b 69 5d 2e 61 6e 45 71 5b 69  Sample[i].anEq[i
12770 43 6f 6c 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Col];.  }else{. 
12780 20 20 20 74 52 6f 77 63 6e 74 20 69 4c 6f 77 65     tRowcnt iLowe
12790 72 2c 20 69 55 70 70 65 72 2c 20 69 47 61 70 3b  r, iUpper, iGap;
127a0 0a 20 20 20 20 69 66 28 20 69 3d 3d 30 20 29 7b  .    if( i==0 ){
127b0 0a 20 20 20 20 20 20 69 4c 6f 77 65 72 20 3d 20  .      iLower = 
127c0 30 3b 0a 20 20 20 20 20 20 69 55 70 70 65 72 20  0;.      iUpper 
127d0 3d 20 61 53 61 6d 70 6c 65 5b 30 5d 2e 61 6e 4c  = aSample[0].anL
127e0 74 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 7d 65 6c  t[iCol];.    }el
127f0 73 65 7b 0a 20 20 20 20 20 20 69 36 34 20 6e 52  se{.      i64 nR
12800 6f 77 30 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  ow0 = sqlite3Log
12810 45 73 74 54 6f 49 6e 74 28 70 49 64 78 2d 3e 61  EstToInt(pIdx->a
12820 69 52 6f 77 4c 6f 67 45 73 74 5b 30 5d 29 3b 0a  iRowLogEst[0]);.
12830 20 20 20 20 20 20 69 55 70 70 65 72 20 3d 20 69        iUpper = i
12840 3e 3d 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20  >=pIdx->nSample 
12850 3f 20 6e 52 6f 77 30 20 3a 20 61 53 61 6d 70 6c  ? nRow0 : aSampl
12860 65 5b 69 5d 2e 61 6e 4c 74 5b 69 43 6f 6c 5d 3b  e[i].anLt[iCol];
12870 0a 20 20 20 20 20 20 69 4c 6f 77 65 72 20 3d 20  .      iLower = 
12880 61 53 61 6d 70 6c 65 5b 69 2d 31 5d 2e 61 6e 45  aSample[i-1].anE
12890 71 5b 69 43 6f 6c 5d 20 2b 20 61 53 61 6d 70 6c  q[iCol] + aSampl
128a0 65 5b 69 2d 31 5d 2e 61 6e 4c 74 5b 69 43 6f 6c  e[i-1].anLt[iCol
128b0 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 53 74  ];.    }.    aSt
128c0 61 74 5b 31 5d 20 3d 20 70 49 64 78 2d 3e 61 41  at[1] = pIdx->aA
128d0 76 67 45 71 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20  vgEq[iCol];.    
128e0 69 66 28 20 69 4c 6f 77 65 72 3e 3d 69 55 70 70  if( iLower>=iUpp
128f0 65 72 20 29 7b 0a 20 20 20 20 20 20 69 47 61 70  er ){.      iGap
12900 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
12910 0a 20 20 20 20 20 20 69 47 61 70 20 3d 20 69 55  .      iGap = iU
12920 70 70 65 72 20 2d 20 69 4c 6f 77 65 72 3b 0a 20  pper - iLower;. 
12930 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 6f 75     }.    if( rou
12940 6e 64 55 70 20 29 7b 0a 20 20 20 20 20 20 69 47  ndUp ){.      iG
12950 61 70 20 3d 20 28 69 47 61 70 2a 32 29 2f 33 3b  ap = (iGap*2)/3;
12960 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
12970 20 20 69 47 61 70 20 3d 20 69 47 61 70 2f 33 3b    iGap = iGap/3;
12980 0a 20 20 20 20 7d 0a 20 20 20 20 61 53 74 61 74  .    }.    aStat
12990 5b 30 5d 20 3d 20 69 4c 6f 77 65 72 20 2b 20 69  [0] = iLower + i
129a0 47 61 70 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  Gap;.  }.  retur
129b0 6e 20 69 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  n i;.}.#endif /*
129c0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
129d0 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 20 2a 2f  TAT3_OR_STAT4 */
129e0 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 69 74 20 69 73  ../*.** If it is
129f0 20 6e 6f 74 20 4e 55 4c 4c 2c 20 70 54 65 72 6d   not NULL, pTerm
12a00 20 69 73 20 61 20 74 65 72 6d 20 74 68 61 74 20   is a term that 
12a10 70 72 6f 76 69 64 65 73 20 61 6e 20 75 70 70 65  provides an uppe
12a20 72 20 6f 72 20 6c 6f 77 65 72 0a 2a 2a 20 62 6f  r or lower.** bo
12a30 75 6e 64 20 6f 6e 20 61 20 72 61 6e 67 65 20 73  und on a range s
12a40 63 61 6e 2e 20 57 69 74 68 6f 75 74 20 63 6f 6e  can. Without con
12a50 73 69 64 65 72 69 6e 67 20 70 54 65 72 6d 2c 20  sidering pTerm, 
12a60 69 74 20 69 73 20 65 73 74 69 6d 61 74 65 64 20  it is estimated 
12a70 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 73 63 61  .** that the sca
12a80 6e 20 77 69 6c 6c 20 76 69 73 69 74 20 6e 4e 65  n will visit nNe
12a90 77 20 72 6f 77 73 2e 20 54 68 69 73 20 66 75 6e  w rows. This fun
12aa0 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68  ction returns th
12ab0 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 65 73 74 69  e number.** esti
12ac0 6d 61 74 65 64 20 74 6f 20 62 65 20 76 69 73 69  mated to be visi
12ad0 74 65 64 20 61 66 74 65 72 20 74 61 6b 69 6e 67  ted after taking
12ae0 20 70 54 65 72 6d 20 69 6e 74 6f 20 61 63 63 6f   pTerm into acco
12af0 75 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  unt..**.** If th
12b00 65 20 75 73 65 72 20 65 78 70 6c 69 63 69 74 6c  e user explicitl
12b10 79 20 73 70 65 63 69 66 69 65 64 20 61 20 6c 69  y specified a li
12b20 6b 65 6c 69 68 6f 6f 64 28 29 20 76 61 6c 75 65  kelihood() value
12b30 20 66 6f 72 20 74 68 69 73 20 74 65 72 6d 2c 0a   for this term,.
12b40 2a 2a 20 74 68 65 6e 20 74 68 65 20 72 65 74 75  ** then the retu
12b50 72 6e 20 76 61 6c 75 65 20 69 73 20 74 68 65 20  rn value is the 
12b60 6c 69 6b 65 6c 69 68 6f 6f 64 20 6d 75 6c 74 69  likelihood multi
12b70 70 6c 69 65 64 20 62 79 20 74 68 65 20 6e 75 6d  plied by the num
12b80 62 65 72 20 6f 66 0a 2a 2a 20 69 6e 70 75 74 20  ber of.** input 
12b90 72 6f 77 73 2e 20 4f 74 68 65 72 77 69 73 65 2c  rows. Otherwise,
12ba0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   this function a
12bb0 73 73 75 6d 65 73 20 74 68 61 74 20 61 6e 20 22  ssumes that an "
12bc0 49 53 20 4e 4f 54 20 4e 55 4c 4c 22 20 74 65 72  IS NOT NULL" ter
12bd0 6d 0a 2a 2a 20 68 61 73 20 61 20 6c 69 6b 65 6c  m.** has a likel
12be0 69 68 6f 6f 64 20 6f 66 20 30 2e 35 30 2c 20 61  ihood of 0.50, a
12bf0 6e 64 20 61 6e 79 20 6f 74 68 65 72 20 74 65 72  nd any other ter
12c00 6d 20 61 20 6c 69 6b 65 6c 69 68 6f 6f 64 20 6f  m a likelihood o
12c10 66 20 30 2e 32 35 2e 0a 2a 2f 0a 73 74 61 74 69  f 0.25..*/.stati
12c20 63 20 4c 6f 67 45 73 74 20 77 68 65 72 65 52 61  c LogEst whereRa
12c30 6e 67 65 41 64 6a 75 73 74 28 57 68 65 72 65 54  ngeAdjust(WhereT
12c40 65 72 6d 20 2a 70 54 65 72 6d 2c 20 4c 6f 67 45  erm *pTerm, LogE
12c50 73 74 20 6e 4e 65 77 29 7b 0a 20 20 4c 6f 67 45  st nNew){.  LogE
12c60 73 74 20 6e 52 65 74 20 3d 20 6e 4e 65 77 3b 0a  st nRet = nNew;.
12c70 20 20 69 66 28 20 70 54 65 72 6d 20 29 7b 0a 20    if( pTerm ){. 
12c80 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 74 72     if( pTerm->tr
12c90 75 74 68 50 72 6f 62 3c 3d 30 20 29 7b 0a 20 20  uthProb<=0 ){.  
12ca0 20 20 20 20 6e 52 65 74 20 2b 3d 20 70 54 65 72      nRet += pTer
12cb0 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3b 0a 20 20  m->truthProb;.  
12cc0 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 54 65    }else if( (pTe
12cd0 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
12ce0 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29 7b 0a  RM_VNULL)==0 ){.
12cf0 20 20 20 20 20 20 6e 52 65 74 20 2d 3d 20 32 30        nRet -= 20
12d00 3b 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  ;        assert(
12d10 20 32 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45   20==sqlite3LogE
12d20 73 74 28 34 29 20 29 3b 0a 20 20 20 20 7d 0a 20  st(4) );.    }. 
12d30 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 52 65 74   }.  return nRet
12d40 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
12d50 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f  TE_ENABLE_STAT3_
12d60 4f 52 5f 53 54 41 54 34 0a 2f 2a 20 0a 2a 2a 20  OR_STAT4./* .** 
12d70 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
12d80 20 63 61 6c 6c 65 64 20 74 6f 20 65 73 74 69 6d   called to estim
12d90 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ate the number o
12da0 66 20 72 6f 77 73 20 76 69 73 69 74 65 64 20 62  f rows visited b
12db0 79 20 61 0a 2a 2a 20 72 61 6e 67 65 2d 73 63 61  y a.** range-sca
12dc0 6e 20 6f 6e 20 61 20 73 6b 69 70 2d 73 63 61 6e  n on a skip-scan
12dd0 20 69 6e 64 65 78 2e 20 46 6f 72 20 65 78 61 6d   index. For exam
12de0 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 43 52 45  ple:.**.**   CRE
12df0 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20  ATE INDEX i1 ON 
12e00 74 31 28 61 2c 20 62 2c 20 63 29 3b 0a 2a 2a 20  t1(a, b, c);.** 
12e10 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
12e20 74 31 20 57 48 45 52 45 20 61 3d 3f 20 41 4e 44  t1 WHERE a=? AND
12e30 20 63 20 42 45 54 57 45 45 4e 20 3f 20 41 4e 44   c BETWEEN ? AND
12e40 20 3f 3b 0a 2a 2a 0a 2a 2a 20 56 61 6c 75 65 20   ?;.**.** Value 
12e50 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 69 73 20 63  pLoop->nOut is c
12e60 75 72 72 65 6e 74 6c 79 20 73 65 74 20 74 6f 20  urrently set to 
12e70 74 68 65 20 65 73 74 69 6d 61 74 65 64 20 6e 75  the estimated nu
12e80 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 0a 2a 2a  mber of rows .**
12e90 20 76 69 73 69 74 65 64 20 66 6f 72 20 73 63 61   visited for sca
12ea0 6e 6e 69 6e 67 20 28 61 3d 3f 20 41 4e 44 20 62  nning (a=? AND b
12eb0 3d 3f 29 2e 20 54 68 69 73 20 66 75 6e 63 74 69  =?). This functi
12ec0 6f 6e 20 72 65 64 75 63 65 73 20 74 68 61 74 20  on reduces that 
12ed0 65 73 74 69 6d 61 74 65 20 0a 2a 2a 20 62 79 20  estimate .** by 
12ee0 73 6f 6d 65 20 66 61 63 74 6f 72 20 74 6f 20 61  some factor to a
12ef0 63 63 6f 75 6e 74 20 66 6f 72 20 74 68 65 20 28  ccount for the (
12f00 63 20 42 45 54 57 45 45 4e 20 3f 20 41 4e 44 20  c BETWEEN ? AND 
12f10 3f 29 20 65 78 70 72 65 73 73 69 6f 6e 20 62 61  ?) expression ba
12f20 73 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 74  sed.** on the st
12f30 61 74 34 20 64 61 74 61 20 66 6f 72 20 74 68 65  at4 data for the
12f40 20 69 6e 64 65 78 2e 20 74 68 69 73 20 73 63 61   index. this sca
12f50 6e 20 77 69 6c 6c 20 62 65 20 70 65 66 6f 72 6d  n will be peform
12f60 65 64 20 6d 75 6c 74 69 70 6c 65 20 0a 2a 2a 20  ed multiple .** 
12f70 74 69 6d 65 73 20 28 6f 6e 63 65 20 66 6f 72 20  times (once for 
12f80 65 61 63 68 20 28 61 2c 62 29 20 63 6f 6d 62 69  each (a,b) combi
12f90 6e 61 74 69 6f 6e 20 74 68 61 74 20 6d 61 74 63  nation that matc
12fa0 68 65 73 20 61 3d 3f 29 20 69 73 20 64 65 61 6c  hes a=?) is deal
12fb0 74 20 77 69 74 68 20 0a 2a 2a 20 62 79 20 74 68  t with .** by th
12fc0 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20  e caller..**.** 
12fd0 49 74 20 64 6f 65 73 20 74 68 69 73 20 62 79 20  It does this by 
12fe0 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67 68  scanning through
12ff0 20 61 6c 6c 20 73 74 61 74 34 20 73 61 6d 70 6c   all stat4 sampl
13000 65 73 2c 20 63 6f 6d 70 61 72 69 6e 67 20 76 61  es, comparing va
13010 6c 75 65 73 0a 2a 2a 20 65 78 74 72 61 63 74 65  lues.** extracte
13020 64 20 66 72 6f 6d 20 70 4c 6f 77 65 72 20 61 6e  d from pLower an
13030 64 20 70 55 70 70 65 72 20 77 69 74 68 20 74 68  d pUpper with th
13040 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
13050 63 6f 6c 75 6d 6e 20 69 6e 20 65 61 63 68 0a 2a  column in each.*
13060 2a 20 73 61 6d 70 6c 65 2e 20 49 66 20 4c 20 61  * sample. If L a
13070 6e 64 20 55 20 61 72 65 20 74 68 65 20 6e 75 6d  nd U are the num
13080 62 65 72 20 6f 66 20 73 61 6d 70 6c 65 73 20 66  ber of samples f
13090 6f 75 6e 64 20 74 6f 20 62 65 20 6c 65 73 73 20  ound to be less 
130a0 74 68 61 6e 20 6f 72 0a 2a 2a 20 65 71 75 61 6c  than or.** equal
130b0 20 74 6f 20 74 68 65 20 76 61 6c 75 65 73 20 65   to the values e
130c0 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 70 4c  xtracted from pL
130d0 6f 77 65 72 20 61 6e 64 20 70 55 70 70 65 72 20  ower and pUpper 
130e0 72 65 73 70 65 63 74 69 76 65 6c 79 2c 20 61 6e  respectively, an
130f0 64 0a 2a 2a 20 4e 20 69 73 20 74 68 65 20 74 6f  d.** N is the to
13100 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73 61  tal number of sa
13110 6d 70 6c 65 73 2c 20 74 68 65 20 70 4c 6f 6f 70  mples, the pLoop
13120 2d 3e 6e 4f 75 74 20 76 61 6c 75 65 20 69 73 20  ->nOut value is 
13130 61 64 6a 75 73 74 65 64 0a 2a 2a 20 61 73 20 66  adjusted.** as f
13140 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
13150 6e 4f 75 74 20 3d 20 6e 4f 75 74 20 2a 20 28 20  nOut = nOut * ( 
13160 6d 69 6e 28 55 20 2d 20 4c 2c 20 31 29 20 2f 20  min(U - L, 1) / 
13170 4e 20 29 0a 2a 2a 0a 2a 2a 20 49 66 20 70 4c 6f  N ).**.** If pLo
13180 77 65 72 20 69 73 20 4e 55 4c 4c 2c 20 6f 72 20  wer is NULL, or 
13190 61 20 76 61 6c 75 65 20 63 61 6e 6e 6f 74 20 62  a value cannot b
131a0 65 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  e extracted from
131b0 20 74 68 65 20 74 65 72 6d 2c 20 4c 20 69 73 0a   the term, L is.
131c0 2a 2a 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20  ** set to zero. 
131d0 49 66 20 70 55 70 70 65 72 20 69 73 20 4e 55 4c  If pUpper is NUL
131e0 4c 2c 20 6f 72 20 61 20 76 61 6c 75 65 20 63 61  L, or a value ca
131f0 6e 6e 6f 74 20 62 65 20 65 78 74 72 61 63 74 65  nnot be extracte
13200 64 20 66 72 6f 6d 20 69 74 2c 0a 2a 2a 20 55 20  d from it,.** U 
13210 69 73 20 73 65 74 20 74 6f 20 4e 2e 0a 2a 2a 0a  is set to N..**.
13220 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 74 68 69  ** Normally, thi
13230 73 20 66 75 6e 63 74 69 6f 6e 20 73 65 74 73 20  s function sets 
13240 2a 70 62 44 6f 6e 65 20 74 6f 20 31 20 62 65 66  *pbDone to 1 bef
13250 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 48  ore returning. H
13260 6f 77 65 76 65 72 2c 0a 2a 2a 20 69 66 20 6e 6f  owever,.** if no
13270 20 76 61 6c 75 65 20 63 61 6e 20 62 65 20 65 78   value can be ex
13280 74 72 61 63 74 65 64 20 66 72 6f 6d 20 65 69 74  tracted from eit
13290 68 65 72 20 70 4c 6f 77 65 72 20 6f 72 20 70 55  her pLower or pU
132a0 70 70 65 72 20 28 61 6e 64 20 73 6f 20 74 68 65  pper (and so the
132b0 0a 2a 2a 20 65 73 74 69 6d 61 74 65 20 6f 66 20  .** estimate of 
132c0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
132d0 77 73 20 64 65 6c 69 76 65 72 65 64 20 72 65 6d  ws delivered rem
132e0 61 69 6e 73 20 75 6e 63 68 61 6e 67 65 64 29 2c  ains unchanged),
132f0 20 2a 70 62 44 6f 6e 65 0a 2a 2a 20 69 73 20 6c   *pbDone.** is l
13300 65 66 74 20 61 73 20 69 73 2e 0a 2a 2a 0a 2a 2a  eft as is..**.**
13310 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
13320 75 72 73 2c 20 61 6e 20 53 51 4c 69 74 65 20 65  urs, an SQLite e
13330 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
13340 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urned. Otherwise
13350 2c 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 2e  , .** SQLITE_OK.
13360 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
13370 68 65 72 65 52 61 6e 67 65 53 6b 69 70 53 63 61  hereRangeSkipSca
13380 6e 45 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70  nEst(.  Parse *p
13390 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20  Parse,       /* 
133a0 50 61 72 73 69 6e 67 20 26 20 63 6f 64 65 20 67  Parsing & code g
133b0 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78  enerating contex
133c0 74 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  t */.  WhereTerm
133d0 20 2a 70 4c 6f 77 65 72 2c 20 20 20 2f 2a 20 4c   *pLower,   /* L
133e0 6f 77 65 72 20 62 6f 75 6e 64 20 6f 6e 20 74 68  ower bound on th
133f0 65 20 72 61 6e 67 65 2e 20 65 78 3a 20 22 78 3e  e range. ex: "x>
13400 31 32 33 22 20 4d 69 67 68 74 20 62 65 20 4e 55  123" Might be NU
13410 4c 4c 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  LL */.  WhereTer
13420 6d 20 2a 70 55 70 70 65 72 2c 20 20 20 2f 2a 20  m *pUpper,   /* 
13430 55 70 70 65 72 20 62 6f 75 6e 64 20 6f 6e 20 74  Upper bound on t
13440 68 65 20 72 61 6e 67 65 2e 20 65 78 3a 20 22 78  he range. ex: "x
13450 3c 34 35 35 22 20 4d 69 67 68 74 20 62 65 20 4e  <455" Might be N
13460 55 4c 4c 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f  ULL */.  WhereLo
13470 6f 70 20 2a 70 4c 6f 6f 70 2c 20 20 20 20 2f 2a  op *pLoop,    /*
13480 20 55 70 64 61 74 65 20 74 68 65 20 2e 6e 4f 75   Update the .nOu
13490 74 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20  t value of this 
134a0 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  loop */.  int *p
134b0 62 44 6f 6e 65 20 20 20 20 20 20 20 20 20 20 2f  bDone          /
134c0 2a 20 53 65 74 20 74 6f 20 74 72 75 65 20 69 66  * Set to true if
134d0 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 65 78   at least one ex
134e0 70 72 2e 20 76 61 6c 75 65 20 65 78 74 72 61 63  pr. value extrac
134f0 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65  ted */.){.  Inde
13500 78 20 2a 70 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e  x *p = pLoop->u.
13510 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20  btree.pIndex;.  
13520 69 6e 74 20 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d  int nEq = pLoop-
13530 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20  >u.btree.nEq;.  
13540 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
13550 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20  arse->db;.  int 
13560 6e 4c 6f 77 65 72 20 3d 20 2d 31 3b 0a 20 20 69  nLower = -1;.  i
13570 6e 74 20 6e 55 70 70 65 72 20 3d 20 70 2d 3e 6e  nt nUpper = p->n
13580 53 61 6d 70 6c 65 2b 31 3b 0a 20 20 69 6e 74 20  Sample+1;.  int 
13590 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
135a0 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e    int iCol = p->
135b0 61 69 43 6f 6c 75 6d 6e 5b 6e 45 71 5d 3b 0a 20  aiColumn[nEq];. 
135c0 20 75 38 20 61 66 66 20 3d 20 69 43 6f 6c 3e 3d   u8 aff = iCol>=
135d0 30 20 3f 20 70 2d 3e 70 54 61 62 6c 65 2d 3e 61  0 ? p->pTable->a
135e0 43 6f 6c 5b 69 43 6f 6c 5d 2e 61 66 66 69 6e 69  Col[iCol].affini
135f0 74 79 20 3a 20 53 51 4c 49 54 45 5f 41 46 46 5f  ty : SQLITE_AFF_
13600 49 4e 54 45 47 45 52 3b 0a 20 20 43 6f 6c 6c 53  INTEGER;.  CollS
13610 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 0a 20 20  eq *pColl;.  .  
13620 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70  sqlite3_value *p
13630 31 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  1 = 0;          
13640 2f 2a 20 56 61 6c 75 65 20 65 78 74 72 61 63 74  /* Value extract
13650 65 64 20 66 72 6f 6d 20 70 4c 6f 77 65 72 20 2a  ed from pLower *
13660 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  /.  sqlite3_valu
13670 65 20 2a 70 32 20 3d 20 30 3b 20 20 20 20 20 20  e *p2 = 0;      
13680 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 65 78 74      /* Value ext
13690 72 61 63 74 65 64 20 66 72 6f 6d 20 70 55 70 70  racted from pUpp
136a0 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  er */.  sqlite3_
136b0 76 61 6c 75 65 20 2a 70 56 61 6c 20 3d 20 30 3b  value *pVal = 0;
136c0 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
136d0 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
136e0 72 65 63 6f 72 64 20 2a 2f 0a 0a 20 20 70 43 6f  record */..  pCo
136f0 6c 6c 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61  ll = sqlite3Loca
13700 74 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  teCollSeq(pParse
13710 2c 20 70 2d 3e 61 7a 43 6f 6c 6c 5b 6e 45 71 5d  , p->azColl[nEq]
13720 29 3b 0a 20 20 69 66 28 20 70 4c 6f 77 65 72 20  );.  if( pLower 
13730 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
13740 74 65 33 53 74 61 74 34 56 61 6c 75 65 46 72 6f  te3Stat4ValueFro
13750 6d 45 78 70 72 28 70 50 61 72 73 65 2c 20 70 4c  mExpr(pParse, pL
13760 6f 77 65 72 2d 3e 70 45 78 70 72 2d 3e 70 52 69  ower->pExpr->pRi
13770 67 68 74 2c 20 61 66 66 2c 20 26 70 31 29 3b 0a  ght, aff, &p1);.
13780 20 20 20 20 6e 4c 6f 77 65 72 20 3d 20 30 3b 0a      nLower = 0;.
13790 20 20 7d 0a 20 20 69 66 28 20 70 55 70 70 65 72    }.  if( pUpper
137a0 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
137b0 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  K ){.    rc = sq
137c0 6c 69 74 65 33 53 74 61 74 34 56 61 6c 75 65 46  lite3Stat4ValueF
137d0 72 6f 6d 45 78 70 72 28 70 50 61 72 73 65 2c 20  romExpr(pParse, 
137e0 70 55 70 70 65 72 2d 3e 70 45 78 70 72 2d 3e 70  pUpper->pExpr->p
137f0 52 69 67 68 74 2c 20 61 66 66 2c 20 26 70 32 29  Right, aff, &p2)
13800 3b 0a 20 20 20 20 6e 55 70 70 65 72 20 3d 20 70  ;.    nUpper = p
13810 32 20 3f 20 30 20 3a 20 70 2d 3e 6e 53 61 6d 70  2 ? 0 : p->nSamp
13820 6c 65 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  le;.  }..  if( p
13830 31 20 7c 7c 20 70 32 20 29 7b 0a 20 20 20 20 69  1 || p2 ){.    i
13840 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 6e 44  nt i;.    int nD
13850 69 66 66 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  iff;.    for(i=0
13860 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
13870 26 26 20 69 3c 70 2d 3e 6e 53 61 6d 70 6c 65 3b  && i<p->nSample;
13880 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63 20   i++){.      rc 
13890 3d 20 73 71 6c 69 74 65 33 53 74 61 74 34 43 6f  = sqlite3Stat4Co
138a0 6c 75 6d 6e 28 64 62 2c 20 70 2d 3e 61 53 61 6d  lumn(db, p->aSam
138b0 70 6c 65 5b 69 5d 2e 70 2c 20 70 2d 3e 61 53 61  ple[i].p, p->aSa
138c0 6d 70 6c 65 5b 69 5d 2e 6e 2c 20 6e 45 71 2c 20  mple[i].n, nEq, 
138d0 26 70 56 61 6c 29 3b 0a 20 20 20 20 20 20 69 66  &pVal);.      if
138e0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
138f0 26 26 20 70 31 20 29 7b 0a 20 20 20 20 20 20 20  && p1 ){.       
13900 20 69 6e 74 20 72 65 73 20 3d 20 73 71 6c 69 74   int res = sqlit
13910 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 70 31 2c  e3MemCompare(p1,
13920 20 70 56 61 6c 2c 20 70 43 6f 6c 6c 29 3b 0a 20   pVal, pColl);. 
13930 20 20 20 20 20 20 20 69 66 28 20 72 65 73 3e 3d         if( res>=
13940 30 20 29 20 6e 4c 6f 77 65 72 2b 2b 3b 0a 20 20  0 ) nLower++;.  
13950 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
13960 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
13970 20 70 32 20 29 7b 0a 20 20 20 20 20 20 20 20 69   p2 ){.        i
13980 6e 74 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33  nt res = sqlite3
13990 4d 65 6d 43 6f 6d 70 61 72 65 28 70 32 2c 20 70  MemCompare(p2, p
139a0 56 61 6c 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20 20  Val, pColl);.   
139b0 20 20 20 20 20 69 66 28 20 72 65 73 3e 3d 30 20       if( res>=0 
139c0 29 20 6e 55 70 70 65 72 2b 2b 3b 0a 20 20 20 20  ) nUpper++;.    
139d0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6e 44    }.    }.    nD
139e0 69 66 66 20 3d 20 28 6e 55 70 70 65 72 20 2d 20  iff = (nUpper - 
139f0 6e 4c 6f 77 65 72 29 3b 0a 20 20 20 20 69 66 28  nLower);.    if(
13a00 20 6e 44 69 66 66 3c 3d 30 20 29 20 6e 44 69 66   nDiff<=0 ) nDif
13a10 66 20 3d 20 31 3b 0a 0a 20 20 20 20 2f 2a 20 49  f = 1;..    /* I
13a20 66 20 74 68 65 72 65 20 69 73 20 62 6f 74 68 20  f there is both 
13a30 61 6e 20 75 70 70 65 72 20 61 6e 64 20 6c 6f 77  an upper and low
13a40 65 72 20 62 6f 75 6e 64 20 73 70 65 63 69 66 69  er bound specifi
13a50 65 64 2c 20 61 6e 64 20 74 68 65 20 0a 20 20 20  ed, and the .   
13a60 20 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 73 20   ** comparisons 
13a70 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68  indicate that th
13a80 65 79 20 61 72 65 20 63 6c 6f 73 65 20 74 6f 67  ey are close tog
13a90 65 74 68 65 72 2c 20 75 73 65 20 74 68 65 20 66  ether, use the f
13aa0 61 6c 6c 62 61 63 6b 0a 20 20 20 20 2a 2a 20 6d  allback.    ** m
13ab0 65 74 68 6f 64 20 28 61 73 73 75 6d 65 20 74 68  ethod (assume th
13ac0 61 74 20 74 68 65 20 73 63 61 6e 20 76 69 73 69  at the scan visi
13ad0 74 73 20 31 2f 36 34 20 6f 66 20 74 68 65 20 72  ts 1/64 of the r
13ae0 6f 77 73 29 20 66 6f 72 20 65 73 74 69 6d 61 74  ows) for estimat
13af0 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65 20 6e  ing.    ** the n
13b00 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 76 69  umber of rows vi
13b10 73 69 74 65 64 2e 20 4f 74 68 65 72 77 69 73 65  sited. Otherwise
13b20 2c 20 65 73 74 69 6d 61 74 65 20 74 68 65 20 6e  , estimate the n
13b30 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 0a 20 20  umber of rows.  
13b40 20 20 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 6d    ** using the m
13b50 65 74 68 6f 64 20 64 65 73 63 72 69 62 65 64 20  ethod described 
13b60 69 6e 20 74 68 65 20 68 65 61 64 65 72 20 63 6f  in the header co
13b70 6d 6d 65 6e 74 20 66 6f 72 20 74 68 69 73 20 66  mment for this f
13b80 75 6e 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20  unction. */.    
13b90 69 66 28 20 6e 44 69 66 66 21 3d 31 20 7c 7c 20  if( nDiff!=1 || 
13ba0 70 55 70 70 65 72 3d 3d 30 20 7c 7c 20 70 4c 6f  pUpper==0 || pLo
13bb0 77 65 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  wer==0 ){.      
13bc0 69 6e 74 20 6e 41 64 6a 75 73 74 20 3d 20 28 73  int nAdjust = (s
13bd0 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 70 2d 3e  qlite3LogEst(p->
13be0 6e 53 61 6d 70 6c 65 29 20 2d 20 73 71 6c 69 74  nSample) - sqlit
13bf0 65 33 4c 6f 67 45 73 74 28 6e 44 69 66 66 29 29  e3LogEst(nDiff))
13c00 3b 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e  ;.      pLoop->n
13c10 4f 75 74 20 2d 3d 20 6e 41 64 6a 75 73 74 3b 0a  Out -= nAdjust;.
13c20 20 20 20 20 20 20 2a 70 62 44 6f 6e 65 20 3d 20        *pbDone = 
13c30 31 3b 0a 20 20 20 20 20 20 57 48 45 52 45 54 52  1;.      WHERETR
13c40 41 43 45 28 30 78 31 30 2c 20 28 22 72 61 6e 67  ACE(0x10, ("rang
13c50 65 20 73 6b 69 70 2d 73 63 61 6e 20 72 65 67 69  e skip-scan regi
13c60 6f 6e 73 3a 20 25 75 2e 2e 25 75 20 20 61 64 6a  ons: %u..%u  adj
13c70 75 73 74 3d 25 64 20 65 73 74 3d 25 64 5c 6e 22  ust=%d est=%d\n"
13c80 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
13c90 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 4c 6f               nLo
13ca0 77 65 72 2c 20 6e 55 70 70 65 72 2c 20 6e 41 64  wer, nUpper, nAd
13cb0 6a 75 73 74 2a 2d 31 2c 20 70 4c 6f 6f 70 2d 3e  just*-1, pLoop->
13cc0 6e 4f 75 74 29 29 3b 0a 20 20 20 20 7d 0a 0a 20  nOut));.    }.. 
13cd0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
13ce0 72 74 28 20 2a 70 62 44 6f 6e 65 3d 3d 30 20 29  rt( *pbDone==0 )
13cf0 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33  ;.  }..  sqlite3
13d00 56 61 6c 75 65 46 72 65 65 28 70 31 29 3b 0a 20  ValueFree(p1);. 
13d10 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65   sqlite3ValueFre
13d20 65 28 70 32 29 3b 0a 20 20 73 71 6c 69 74 65 33  e(p2);.  sqlite3
13d30 56 61 6c 75 65 46 72 65 65 28 70 56 61 6c 29 3b  ValueFree(pVal);
13d40 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
13d50 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
13d60 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f  E_ENABLE_STAT3_O
13d70 52 5f 53 54 41 54 34 20 2a 2f 0a 0a 2f 2a 0a 2a  R_STAT4 */../*.*
13d80 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
13d90 69 73 20 75 73 65 64 20 74 6f 20 65 73 74 69 6d  is used to estim
13da0 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ate the number o
13db0 66 20 72 6f 77 73 20 74 68 61 74 20 77 69 6c 6c  f rows that will
13dc0 20 62 65 20 76 69 73 69 74 65 64 0a 2a 2a 20 62   be visited.** b
13dd0 79 20 73 63 61 6e 6e 69 6e 67 20 61 6e 20 69 6e  y scanning an in
13de0 64 65 78 20 66 6f 72 20 61 20 72 61 6e 67 65 20  dex for a range 
13df0 6f 66 20 76 61 6c 75 65 73 2e 20 54 68 65 20 72  of values. The r
13e00 61 6e 67 65 20 6d 61 79 20 68 61 76 65 20 61 6e  ange may have an
13e10 20 75 70 70 65 72 0a 2a 2a 20 62 6f 75 6e 64 2c   upper.** bound,
13e20 20 61 20 6c 6f 77 65 72 20 62 6f 75 6e 64 2c 20   a lower bound, 
13e30 6f 72 20 62 6f 74 68 2e 20 54 68 65 20 57 48 45  or both. The WHE
13e40 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20  RE clause terms 
13e50 74 68 61 74 20 73 65 74 20 74 68 65 20 75 70 70  that set the upp
13e60 65 72 0a 2a 2a 20 61 6e 64 20 6c 6f 77 65 72 20  er.** and lower 
13e70 62 6f 75 6e 64 73 20 61 72 65 20 72 65 70 72 65  bounds are repre
13e80 73 65 6e 74 65 64 20 62 79 20 70 4c 6f 77 65 72  sented by pLower
13e90 20 61 6e 64 20 70 55 70 70 65 72 20 72 65 73 70   and pUpper resp
13ea0 65 63 74 69 76 65 6c 79 2e 20 46 6f 72 0a 2a 2a  ectively. For.**
13eb0 20 65 78 61 6d 70 6c 65 2c 20 61 73 73 75 6d 69   example, assumi
13ec0 6e 67 20 74 68 61 74 20 69 6e 64 65 78 20 70 20  ng that index p 
13ed0 69 73 20 6f 6e 20 74 31 28 61 29 3a 0a 2a 2a 0a  is on t1(a):.**.
13ee0 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d 20 74 31  **   ... FROM t1
13ef0 20 57 48 45 52 45 20 61 20 3e 20 3f 20 41 4e 44   WHERE a > ? AND
13f00 20 61 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 20 20 20   a < ? ....**   
13f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f20 20 7c 5f 5f 5f 5f 5f 7c 20 20 20 7c 5f 5f 5f 5f   |_____|   |____
13f30 5f 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  _|.**           
13f40 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20              |   
13f50 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20        |.**      
13f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
13f70 4c 6f 77 65 72 20 20 20 20 70 55 70 70 65 72 0a  Lower    pUpper.
13f80 2a 2a 0a 2a 2a 20 49 66 20 65 69 74 68 65 72 20  **.** If either 
13f90 6f 66 20 74 68 65 20 75 70 70 65 72 20 6f 72 20  of the upper or 
13fa0 6c 6f 77 65 72 20 62 6f 75 6e 64 20 69 73 20 6e  lower bound is n
13fb0 6f 74 20 70 72 65 73 65 6e 74 2c 20 74 68 65 6e  ot present, then
13fc0 20 4e 55 4c 4c 20 69 73 20 70 61 73 73 65 64 20   NULL is passed 
13fd0 69 6e 0a 2a 2a 20 70 6c 61 63 65 20 6f 66 20 74  in.** place of t
13fe0 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
13ff0 20 57 68 65 72 65 54 65 72 6d 2e 0a 2a 2a 0a 2a   WhereTerm..**.*
14000 2a 20 54 68 65 20 76 61 6c 75 65 20 69 6e 20 28  * The value in (
14010 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e  pBuilder->pNew->
14020 75 2e 62 74 72 65 65 2e 6e 45 71 29 20 69 73 20  u.btree.nEq) is 
14030 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  the number of th
14040 65 20 69 6e 64 65 78 0a 2a 2a 20 63 6f 6c 75 6d  e index.** colum
14050 6e 20 73 75 62 6a 65 63 74 20 74 6f 20 74 68 65  n subject to the
14060 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e   range constrain
14070 74 2e 20 4f 72 2c 20 65 71 75 69 76 61 6c 65 6e  t. Or, equivalen
14080 74 6c 79 2c 20 74 68 65 20 6e 75 6d 62 65 72 20  tly, the number 
14090 6f 66 0a 2a 2a 20 65 71 75 61 6c 69 74 79 20 63  of.** equality c
140a0 6f 6e 73 74 72 61 69 6e 74 73 20 6f 70 74 69 6d  onstraints optim
140b0 69 7a 65 64 20 62 79 20 74 68 65 20 70 72 6f 70  ized by the prop
140c0 6f 73 65 64 20 69 6e 64 65 78 20 73 63 61 6e 2e  osed index scan.
140d0 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 0a 2a 2a   For example,.**
140e0 20 61 73 73 75 6d 69 6e 67 20 69 6e 64 65 78 20   assuming index 
140f0 70 20 69 73 20 6f 6e 20 74 31 28 61 2c 20 62 29  p is on t1(a, b)
14100 2c 20 61 6e 64 20 74 68 65 20 53 51 4c 20 71 75  , and the SQL qu
14110 65 72 79 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ery is:.**.**   
14120 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 57 48 45 52  ... FROM t1 WHER
14130 45 20 61 20 3d 20 3f 20 41 4e 44 20 62 20 3e 20  E a = ? AND b > 
14140 3f 20 41 4e 44 20 62 20 3c 20 3f 20 2e 2e 2e 0a  ? AND b < ? ....
14150 2a 2a 0a 2a 2a 20 74 68 65 6e 20 6e 45 71 20 69  **.** then nEq i
14160 73 20 73 65 74 20 74 6f 20 31 20 28 61 73 20 74  s set to 1 (as t
14170 68 65 20 72 61 6e 67 65 20 72 65 73 74 72 69 63  he range restric
14180 74 65 64 20 63 6f 6c 75 6d 6e 2c 20 62 2c 20 69  ted column, b, i
14190 73 20 74 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a  s the second .**
141a0 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d   left-most colum
141b0 6e 20 6f 66 20 74 68 65 20 69 6e 64 65 78 29 2e  n of the index).
141c0 20 4f 72 2c 20 69 66 20 74 68 65 20 71 75 65 72   Or, if the quer
141d0 79 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e  y is:.**.**   ..
141e0 2e 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  . FROM t1 WHERE 
141f0 61 20 3e 20 3f 20 41 4e 44 20 61 20 3c 20 3f 20  a > ? AND a < ? 
14200 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 6e  ....**.** then n
14210 45 71 20 69 73 20 73 65 74 20 74 6f 20 30 2e 0a  Eq is set to 0..
14220 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20  **.** When this 
14230 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
14240 65 64 2c 20 2a 70 6e 4f 75 74 20 69 73 20 73 65  ed, *pnOut is se
14250 74 20 74 6f 20 74 68 65 20 73 71 6c 69 74 65 33  t to the sqlite3
14260 4c 6f 67 45 73 74 28 29 20 6f 66 20 74 68 65 0a  LogEst() of the.
14270 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  ** number of row
14280 73 20 74 68 61 74 20 74 68 65 20 69 6e 64 65 78  s that the index
14290 20 73 63 61 6e 20 69 73 20 65 78 70 65 63 74 65   scan is expecte
142a0 64 20 74 6f 20 76 69 73 69 74 20 77 69 74 68 6f  d to visit witho
142b0 75 74 20 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 69  ut .** consideri
142c0 6e 67 20 74 68 65 20 72 61 6e 67 65 20 63 6f 6e  ng the range con
142d0 73 74 72 61 69 6e 74 73 2e 20 49 66 20 6e 45 71  straints. If nEq
142e0 20 69 73 20 30 2c 20 74 68 65 6e 20 2a 70 6e 4f   is 0, then *pnO
142f0 75 74 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  ut is the number
14300 20 6f 66 20 0a 2a 2a 20 72 6f 77 73 20 69 6e 20   of .** rows in 
14310 74 68 65 20 69 6e 64 65 78 2e 20 41 73 73 75 6d  the index. Assum
14320 69 6e 67 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63  ing no error occ
14330 75 72 73 2c 20 2a 70 6e 4f 75 74 20 69 73 20 61  urs, *pnOut is a
14340 64 6a 75 73 74 65 64 20 28 72 65 64 75 63 65 64  djusted (reduced
14350 29 0a 2a 2a 20 74 6f 20 61 63 63 6f 75 6e 74 20  ).** to account 
14360 66 6f 72 20 74 68 65 20 72 61 6e 67 65 20 63 6f  for the range co
14370 6e 73 74 72 61 69 6e 74 73 20 70 4c 6f 77 65 72  nstraints pLower
14380 20 61 6e 64 20 70 55 70 70 65 72 2e 0a 2a 2a 20   and pUpper..** 
14390 0a 2a 2a 20 49 6e 20 74 68 65 20 61 62 73 65 6e  .** In the absen
143a0 63 65 20 6f 66 20 73 71 6c 69 74 65 5f 73 74 61  ce of sqlite_sta
143b0 74 34 20 41 4e 41 4c 59 5a 45 20 64 61 74 61 2c  t4 ANALYZE data,
143c0 20 6f 72 20 69 66 20 73 75 63 68 20 64 61 74 61   or if such data
143d0 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 75 73   cannot be.** us
143e0 65 64 2c 20 61 20 73 69 6e 67 6c 65 20 72 61 6e  ed, a single ran
143f0 67 65 20 69 6e 65 71 75 61 6c 69 74 79 20 72 65  ge inequality re
14400 64 75 63 65 73 20 74 68 65 20 73 65 61 72 63 68  duces the search
14410 20 73 70 61 63 65 20 62 79 20 61 20 66 61 63 74   space by a fact
14420 6f 72 20 6f 66 20 34 2e 20 0a 2a 2a 20 61 6e 64  or of 4. .** and
14430 20 61 20 70 61 69 72 20 6f 66 20 63 6f 6e 73 74   a pair of const
14440 72 61 69 6e 74 73 20 28 78 3e 3f 20 41 4e 44 20  raints (x>? AND 
14450 78 3c 3f 29 20 72 65 64 75 63 65 73 20 74 68 65  x<?) reduces the
14460 20 65 78 70 65 63 74 65 64 20 6e 75 6d 62 65 72   expected number
14470 20 6f 66 0a 2a 2a 20 72 6f 77 73 20 76 69 73 69   of.** rows visi
14480 74 65 64 20 62 79 20 61 20 66 61 63 74 6f 72 20  ted by a factor 
14490 6f 66 20 36 34 2e 0a 2a 2f 0a 73 74 61 74 69 63  of 64..*/.static
144a0 20 69 6e 74 20 77 68 65 72 65 52 61 6e 67 65 53   int whereRangeS
144b0 63 61 6e 45 73 74 28 0a 20 20 50 61 72 73 65 20  canEst(.  Parse 
144c0 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f  *pParse,       /
144d0 2a 20 50 61 72 73 69 6e 67 20 26 20 63 6f 64 65  * Parsing & code
144e0 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74   generating cont
144f0 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f  ext */.  WhereLo
14500 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c  opBuilder *pBuil
14510 64 65 72 2c 0a 20 20 57 68 65 72 65 54 65 72 6d  der,.  WhereTerm
14520 20 2a 70 4c 6f 77 65 72 2c 20 20 20 2f 2a 20 4c   *pLower,   /* L
14530 6f 77 65 72 20 62 6f 75 6e 64 20 6f 6e 20 74 68  ower bound on th
14540 65 20 72 61 6e 67 65 2e 20 65 78 3a 20 22 78 3e  e range. ex: "x>
14550 31 32 33 22 20 4d 69 67 68 74 20 62 65 20 4e 55  123" Might be NU
14560 4c 4c 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  LL */.  WhereTer
14570 6d 20 2a 70 55 70 70 65 72 2c 20 20 20 2f 2a 20  m *pUpper,   /* 
14580 55 70 70 65 72 20 62 6f 75 6e 64 20 6f 6e 20 74  Upper bound on t
14590 68 65 20 72 61 6e 67 65 2e 20 65 78 3a 20 22 78  he range. ex: "x
145a0 3c 34 35 35 22 20 4d 69 67 68 74 20 62 65 20 4e  <455" Might be N
145b0 55 4c 4c 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f  ULL */.  WhereLo
145c0 6f 70 20 2a 70 4c 6f 6f 70 20 20 20 20 20 2f 2a  op *pLoop     /*
145d0 20 4d 6f 64 69 66 79 20 74 68 65 20 2e 6e 4f 75   Modify the .nOu
145e0 74 20 61 6e 64 20 6d 61 79 62 65 20 2e 72 52 75  t and maybe .rRu
145f0 6e 20 66 69 65 6c 64 73 20 2a 2f 0a 29 7b 0a 20  n fields */.){. 
14600 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
14610 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 4f 75 74 20  _OK;.  int nOut 
14620 3d 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 3b 0a 20  = pLoop->nOut;. 
14630 20 4c 6f 67 45 73 74 20 6e 4e 65 77 3b 0a 0a 23   LogEst nNew;..#
14640 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
14650 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41  BLE_STAT3_OR_STA
14660 54 34 0a 20 20 49 6e 64 65 78 20 2a 70 20 3d 20  T4.  Index *p = 
14670 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70  pLoop->u.btree.p
14680 49 6e 64 65 78 3b 0a 20 20 69 6e 74 20 6e 45 71  Index;.  int nEq
14690 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65   = pLoop->u.btre
146a0 65 2e 6e 45 71 3b 0a 0a 20 20 69 66 28 20 70 2d  e.nEq;..  if( p-
146b0 3e 6e 53 61 6d 70 6c 65 3e 30 20 26 26 20 6e 45  >nSample>0 && nE
146c0 71 3c 70 2d 3e 6e 53 61 6d 70 6c 65 43 6f 6c 20  q<p->nSampleCol 
146d0 29 7b 0a 20 20 20 20 69 66 28 20 6e 45 71 3d 3d  ){.    if( nEq==
146e0 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61  pBuilder->nRecVa
146f0 6c 69 64 20 29 7b 0a 20 20 20 20 20 20 55 6e 70  lid ){.      Unp
14700 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 52 65  ackedRecord *pRe
14710 63 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 52  c = pBuilder->pR
14720 65 63 3b 0a 20 20 20 20 20 20 74 52 6f 77 63 6e  ec;.      tRowcn
14730 74 20 61 5b 32 5d 3b 0a 20 20 20 20 20 20 75 38  t a[2];.      u8
14740 20 61 66 66 3b 0a 0a 20 20 20 20 20 20 2f 2a 20   aff;..      /* 
14750 56 61 72 69 61 62 6c 65 20 69 4c 6f 77 65 72 20  Variable iLower 
14760 77 69 6c 6c 20 62 65 20 73 65 74 20 74 6f 20 74  will be set to t
14770 68 65 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74  he estimate of t
14780 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
14790 73 20 69 6e 20 0a 20 20 20 20 20 20 2a 2a 20 74  s in .      ** t
147a0 68 65 20 69 6e 64 65 78 20 74 68 61 74 20 61 72  he index that ar
147b0 65 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20  e less than the 
147c0 6c 6f 77 65 72 20 62 6f 75 6e 64 20 6f 66 20 74  lower bound of t
147d0 68 65 20 72 61 6e 67 65 20 71 75 65 72 79 2e 20  he range query. 
147e0 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 77  The.      ** low
147f0 65 72 20 62 6f 75 6e 64 20 62 65 69 6e 67 20 74  er bound being t
14800 68 65 20 63 6f 6e 63 61 74 65 6e 61 74 69 6f 6e  he concatenation
14810 20 6f 66 20 24 50 20 61 6e 64 20 24 4c 2c 20 77   of $P and $L, w
14820 68 65 72 65 20 24 50 20 69 73 20 74 68 65 0a 20  here $P is the. 
14830 20 20 20 20 20 2a 2a 20 6b 65 79 2d 70 72 65 66       ** key-pref
14840 69 78 20 66 6f 72 6d 65 64 20 62 79 20 74 68 65  ix formed by the
14850 20 6e 45 71 20 76 61 6c 75 65 73 20 6d 61 74 63   nEq values matc
14860 68 65 64 20 61 67 61 69 6e 73 74 20 74 68 65 20  hed against the 
14870 6e 45 71 20 6c 65 66 74 2d 6d 6f 73 74 0a 20 20  nEq left-most.  
14880 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20 6f      ** columns o
14890 66 20 74 68 65 20 69 6e 64 65 78 2c 20 61 6e 64  f the index, and
148a0 20 24 4c 20 69 73 20 74 68 65 20 76 61 6c 75 65   $L is the value
148b0 20 69 6e 20 70 4c 6f 77 65 72 2e 0a 20 20 20 20   in pLower..    
148c0 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4f 72    **.      ** Or
148d0 2c 20 69 66 20 70 4c 6f 77 65 72 20 69 73 20 4e  , if pLower is N
148e0 55 4c 4c 20 6f 72 20 24 4c 20 63 61 6e 6e 6f 74  ULL or $L cannot
148f0 20 62 65 20 65 78 74 72 61 63 74 65 64 20 66 72   be extracted fr
14900 6f 6d 20 69 74 20 28 62 65 63 61 75 73 65 20 69  om it (because i
14910 74 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 6e 6f  t.      ** is no
14920 74 20 61 20 73 69 6d 70 6c 65 20 76 61 72 69 61  t a simple varia
14930 62 6c 65 20 6f 72 20 6c 69 74 65 72 61 6c 20 76  ble or literal v
14940 61 6c 75 65 29 2c 20 74 68 65 20 6c 6f 77 65 72  alue), the lower
14950 20 62 6f 75 6e 64 20 6f 66 20 74 68 65 0a 20 20   bound of the.  
14960 20 20 20 20 2a 2a 20 72 61 6e 67 65 20 69 73 20      ** range is 
14970 24 50 2e 20 44 75 65 20 74 6f 20 61 20 71 75 69  $P. Due to a qui
14980 72 6b 20 69 6e 20 74 68 65 20 77 61 79 20 77 68  rk in the way wh
14990 65 72 65 4b 65 79 53 74 61 74 73 28 29 20 77 6f  ereKeyStats() wo
149a0 72 6b 73 2c 20 65 76 65 6e 0a 20 20 20 20 20 20  rks, even.      
149b0 2a 2a 20 69 66 20 24 4c 20 69 73 20 61 76 61 69  ** if $L is avai
149c0 6c 61 62 6c 65 2c 20 77 68 65 72 65 4b 65 79 53  lable, whereKeyS
149d0 74 61 74 73 28 29 20 69 73 20 63 61 6c 6c 65 64  tats() is called
149e0 20 66 6f 72 20 62 6f 74 68 20 28 24 50 29 20 61   for both ($P) a
149f0 6e 64 20 0a 20 20 20 20 20 20 2a 2a 20 28 24 50  nd .      ** ($P
14a00 3a 24 4c 29 20 61 6e 64 20 74 68 65 20 6c 61 72  :$L) and the lar
14a10 67 65 72 20 6f 66 20 74 68 65 20 74 77 6f 20 72  ger of the two r
14a20 65 74 75 72 6e 65 64 20 76 61 6c 75 65 73 20 69  eturned values i
14a30 73 20 75 73 65 64 2e 0a 20 20 20 20 20 20 2a 2a  s used..      **
14a40 0a 20 20 20 20 20 20 2a 2a 20 53 69 6d 69 6c 61  .      ** Simila
14a50 72 6c 79 2c 20 69 55 70 70 65 72 20 69 73 20 74  rly, iUpper is t
14a60 6f 20 62 65 20 73 65 74 20 74 6f 20 74 68 65 20  o be set to the 
14a70 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20  estimate of the 
14a80 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 0a 20  number of rows. 
14a90 20 20 20 20 20 2a 2a 20 6c 65 73 73 20 74 68 61       ** less tha
14aa0 6e 20 74 68 65 20 75 70 70 65 72 20 62 6f 75 6e  n the upper boun
14ab0 64 20 6f 66 20 74 68 65 20 72 61 6e 67 65 20 71  d of the range q
14ac0 75 65 72 79 2e 20 57 68 65 72 65 20 74 68 65 20  uery. Where the 
14ad0 75 70 70 65 72 20 62 6f 75 6e 64 0a 20 20 20 20  upper bound.    
14ae0 20 20 2a 2a 20 69 73 20 65 69 74 68 65 72 20 28    ** is either (
14af0 24 50 29 20 6f 72 20 28 24 50 3a 24 55 29 2e 20  $P) or ($P:$U). 
14b00 41 67 61 69 6e 2c 20 65 76 65 6e 20 69 66 20 24  Again, even if $
14b10 55 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20  U is available, 
14b20 62 6f 74 68 20 76 61 6c 75 65 73 0a 20 20 20 20  both values.    
14b30 20 20 2a 2a 20 6f 66 20 69 55 70 70 65 72 20 61    ** of iUpper a
14b40 72 65 20 72 65 71 75 65 73 74 65 64 20 6f 66 20  re requested of 
14b50 77 68 65 72 65 4b 65 79 53 74 61 74 73 28 29 20  whereKeyStats() 
14b60 61 6e 64 20 74 68 65 20 73 6d 61 6c 6c 65 72 20  and the smaller 
14b70 75 73 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  used..      **. 
14b80 20 20 20 20 20 2a 2a 20 54 68 65 20 6e 75 6d 62       ** The numb
14b90 65 72 20 6f 66 20 72 6f 77 73 20 62 65 74 77 65  er of rows betwe
14ba0 65 6e 20 74 68 65 20 74 77 6f 20 62 6f 75 6e 64  en the two bound
14bb0 73 20 69 73 20 74 68 65 6e 20 6a 75 73 74 20 69  s is then just i
14bc0 55 70 70 65 72 2d 69 4c 6f 77 65 72 2e 0a 20 20  Upper-iLower..  
14bd0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 74 52 6f      */.      tRo
14be0 77 63 6e 74 20 69 4c 6f 77 65 72 3b 20 20 20 20  wcnt iLower;    
14bf0 20 2f 2a 20 52 6f 77 73 20 6c 65 73 73 20 74 68   /* Rows less th
14c00 61 6e 20 74 68 65 20 6c 6f 77 65 72 20 62 6f 75  an the lower bou
14c10 6e 64 20 2a 2f 0a 20 20 20 20 20 20 74 52 6f 77  nd */.      tRow
14c20 63 6e 74 20 69 55 70 70 65 72 3b 20 20 20 20 20  cnt iUpper;     
14c30 2f 2a 20 52 6f 77 73 20 6c 65 73 73 20 74 68 61  /* Rows less tha
14c40 6e 20 74 68 65 20 75 70 70 65 72 20 62 6f 75 6e  n the upper boun
14c50 64 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69  d */.      int i
14c60 4c 77 72 49 64 78 20 3d 20 2d 32 3b 20 20 20 2f  LwrIdx = -2;   /
14c70 2a 20 61 53 61 6d 70 6c 65 5b 5d 20 66 6f 72 20  * aSample[] for 
14c80 74 68 65 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20  the lower bound 
14c90 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 55 70  */.      int iUp
14ca0 72 49 64 78 20 3d 20 2d 31 3b 20 20 20 2f 2a 20  rIdx = -1;   /* 
14cb0 61 53 61 6d 70 6c 65 5b 5d 20 66 6f 72 20 74 68  aSample[] for th
14cc0 65 20 75 70 70 65 72 20 62 6f 75 6e 64 20 2a 2f  e upper bound */
14cd0 0a 0a 20 20 20 20 20 20 69 66 28 20 70 52 65 63  ..      if( pRec
14ce0 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74   ){.        test
14cf0 63 61 73 65 28 20 70 52 65 63 2d 3e 6e 46 69 65  case( pRec->nFie
14d00 6c 64 21 3d 70 42 75 69 6c 64 65 72 2d 3e 6e 52  ld!=pBuilder->nR
14d10 65 63 56 61 6c 69 64 20 29 3b 0a 20 20 20 20 20  ecValid );.     
14d20 20 20 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 20     pRec->nField 
14d30 3d 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63  = pBuilder->nRec
14d40 56 61 6c 69 64 3b 0a 20 20 20 20 20 20 7d 0a 20  Valid;.      }. 
14d50 20 20 20 20 20 69 66 28 20 6e 45 71 3d 3d 70 2d       if( nEq==p-
14d60 3e 6e 4b 65 79 43 6f 6c 20 29 7b 0a 20 20 20 20  >nKeyCol ){.    
14d70 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45      aff = SQLITE
14d80 5f 41 46 46 5f 49 4e 54 45 47 45 52 3b 0a 20 20  _AFF_INTEGER;.  
14d90 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
14da0 20 20 20 61 66 66 20 3d 20 70 2d 3e 70 54 61 62     aff = p->pTab
14db0 6c 65 2d 3e 61 43 6f 6c 5b 70 2d 3e 61 69 43 6f  le->aCol[p->aiCo
14dc0 6c 75 6d 6e 5b 6e 45 71 5d 5d 2e 61 66 66 69 6e  lumn[nEq]].affin
14dd0 69 74 79 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ity;.      }.   
14de0 20 20 20 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20     /* Determine 
14df0 69 4c 6f 77 65 72 20 61 6e 64 20 69 55 70 70 65  iLower and iUppe
14e00 72 20 75 73 69 6e 67 20 28 24 50 29 20 6f 6e 6c  r using ($P) onl
14e10 79 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  y. */.      if( 
14e20 6e 45 71 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  nEq==0 ){.      
14e30 20 20 69 4c 6f 77 65 72 20 3d 20 30 3b 0a 20 20    iLower = 0;.  
14e40 20 20 20 20 20 20 69 55 70 70 65 72 20 3d 20 70        iUpper = p
14e50 2d 3e 6e 52 6f 77 45 73 74 30 3b 0a 20 20 20 20  ->nRowEst0;.    
14e60 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
14e70 20 2f 2a 20 4e 6f 74 65 3a 20 74 68 69 73 20 63   /* Note: this c
14e80 61 6c 6c 20 63 6f 75 6c 64 20 62 65 20 6f 70 74  all could be opt
14e90 69 6d 69 7a 65 64 20 61 77 61 79 20 2d 20 73 69  imized away - si
14ea0 6e 63 65 20 74 68 65 20 73 61 6d 65 20 76 61 6c  nce the same val
14eb0 75 65 73 20 6d 75 73 74 20 0a 20 20 20 20 20 20  ues must .      
14ec0 20 20 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 72    ** have been r
14ed0 65 71 75 65 73 74 65 64 20 77 68 65 6e 20 74 65  equested when te
14ee0 73 74 69 6e 67 20 6b 65 79 20 24 50 20 69 6e 20  sting key $P in 
14ef0 77 68 65 72 65 45 71 75 61 6c 53 63 61 6e 45 73  whereEqualScanEs
14f00 74 28 29 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  t().  */.       
14f10 20 77 68 65 72 65 4b 65 79 53 74 61 74 73 28 70   whereKeyStats(p
14f20 50 61 72 73 65 2c 20 70 2c 20 70 52 65 63 2c 20  Parse, p, pRec, 
14f30 30 2c 20 61 29 3b 0a 20 20 20 20 20 20 20 20 69  0, a);.        i
14f40 4c 6f 77 65 72 20 3d 20 61 5b 30 5d 3b 0a 20 20  Lower = a[0];.  
14f50 20 20 20 20 20 20 69 55 70 70 65 72 20 3d 20 61        iUpper = a
14f60 5b 30 5d 20 2b 20 61 5b 31 5d 3b 0a 20 20 20 20  [0] + a[1];.    
14f70 20 20 7d 0a 0a 20 20 20 20 20 20 61 73 73 65 72    }..      asser
14f80 74 28 20 70 4c 6f 77 65 72 3d 3d 30 20 7c 7c 20  t( pLower==0 || 
14f90 28 70 4c 6f 77 65 72 2d 3e 65 4f 70 65 72 61 74  (pLower->eOperat
14fa0 6f 72 20 26 20 28 57 4f 5f 47 54 7c 57 4f 5f 47  or & (WO_GT|WO_G
14fb0 45 29 29 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  E))!=0 );.      
14fc0 61 73 73 65 72 74 28 20 70 55 70 70 65 72 3d 3d  assert( pUpper==
14fd0 30 20 7c 7c 20 28 70 55 70 70 65 72 2d 3e 65 4f  0 || (pUpper->eO
14fe0 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 4c 54  perator & (WO_LT
14ff0 7c 57 4f 5f 4c 45 29 29 21 3d 30 20 29 3b 0a 20  |WO_LE))!=0 );. 
15000 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
15010 61 53 6f 72 74 4f 72 64 65 72 21 3d 30 20 29 3b  aSortOrder!=0 );
15020 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61 53  .      if( p->aS
15030 6f 72 74 4f 72 64 65 72 5b 6e 45 71 5d 20 29 7b  ortOrder[nEq] ){
15040 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
15050 72 6f 6c 65 73 20 6f 66 20 70 4c 6f 77 65 72 20  roles of pLower 
15060 61 6e 64 20 70 55 70 70 65 72 20 61 72 65 20 73  and pUpper are s
15070 77 61 70 70 65 64 20 66 6f 72 20 61 20 44 45 53  wapped for a DES
15080 43 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20  C index */.     
15090 20 20 20 53 57 41 50 28 57 68 65 72 65 54 65 72     SWAP(WhereTer
150a0 6d 2a 2c 20 70 4c 6f 77 65 72 2c 20 70 55 70 70  m*, pLower, pUpp
150b0 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  er);.      }..  
150c0 20 20 20 20 2f 2a 20 49 66 20 70 6f 73 73 69 62      /* If possib
150d0 6c 65 2c 20 69 6d 70 72 6f 76 65 20 6f 6e 20 74  le, improve on t
150e0 68 65 20 69 4c 6f 77 65 72 20 65 73 74 69 6d 61  he iLower estima
150f0 74 65 20 75 73 69 6e 67 20 28 24 50 3a 24 4c 29  te using ($P:$L)
15100 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70  . */.      if( p
15110 4c 6f 77 65 72 20 29 7b 0a 20 20 20 20 20 20 20  Lower ){.       
15120 20 69 6e 74 20 62 4f 6b 3b 20 20 20 20 20 20 20   int bOk;       
15130 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15140 54 72 75 65 20 69 66 20 76 61 6c 75 65 20 69 73  True if value is
15150 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
15160 70 45 78 70 72 20 2a 2f 0a 20 20 20 20 20 20 20  pExpr */.       
15170 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70   Expr *pExpr = p
15180 4c 6f 77 65 72 2d 3e 70 45 78 70 72 2d 3e 70 52  Lower->pExpr->pR
15190 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 72 63  ight;.        rc
151a0 20 3d 20 73 71 6c 69 74 65 33 53 74 61 74 34 50   = sqlite3Stat4P
151b0 72 6f 62 65 53 65 74 56 61 6c 75 65 28 70 50 61  robeSetValue(pPa
151c0 72 73 65 2c 20 70 2c 20 26 70 52 65 63 2c 20 70  rse, p, &pRec, p
151d0 45 78 70 72 2c 20 61 66 66 2c 20 6e 45 71 2c 20  Expr, aff, nEq, 
151e0 26 62 4f 6b 29 3b 0a 20 20 20 20 20 20 20 20 69  &bOk);.        i
151f0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
15200 20 26 26 20 62 4f 6b 20 29 7b 0a 20 20 20 20 20   && bOk ){.     
15210 20 20 20 20 20 74 52 6f 77 63 6e 74 20 69 4e 65       tRowcnt iNe
15220 77 3b 0a 20 20 20 20 20 20 20 20 20 20 69 4c 77  w;.          iLw
15230 72 49 64 78 20 3d 20 77 68 65 72 65 4b 65 79 53  rIdx = whereKeyS
15240 74 61 74 73 28 70 50 61 72 73 65 2c 20 70 2c 20  tats(pParse, p, 
15250 70 52 65 63 2c 20 30 2c 20 61 29 3b 0a 20 20 20  pRec, 0, a);.   
15260 20 20 20 20 20 20 20 69 4e 65 77 20 3d 20 61 5b         iNew = a[
15270 30 5d 20 2b 20 28 28 70 4c 6f 77 65 72 2d 3e 65  0] + ((pLower->e
15280 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 47  Operator & (WO_G
15290 54 7c 57 4f 5f 4c 45 29 29 20 3f 20 61 5b 31 5d  T|WO_LE)) ? a[1]
152a0 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20   : 0);.         
152b0 20 69 66 28 20 69 4e 65 77 3e 69 4c 6f 77 65 72   if( iNew>iLower
152c0 20 29 20 69 4c 6f 77 65 72 20 3d 20 69 4e 65 77   ) iLower = iNew
152d0 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 4f 75 74  ;.          nOut
152e0 2d 2d 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4c  --;.          pL
152f0 6f 77 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  ower = 0;.      
15300 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20    }.      }..   
15310 20 20 20 2f 2a 20 49 66 20 70 6f 73 73 69 62 6c     /* If possibl
15320 65 2c 20 69 6d 70 72 6f 76 65 20 6f 6e 20 74 68  e, improve on th
15330 65 20 69 55 70 70 65 72 20 65 73 74 69 6d 61 74  e iUpper estimat
15340 65 20 75 73 69 6e 67 20 28 24 50 3a 24 55 29 2e  e using ($P:$U).
15350 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 55   */.      if( pU
15360 70 70 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20  pper ){.        
15370 69 6e 74 20 62 4f 6b 3b 20 20 20 20 20 20 20 20  int bOk;        
15380 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
15390 72 75 65 20 69 66 20 76 61 6c 75 65 20 69 73 20  rue if value is 
153a0 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 70  extracted from p
153b0 45 78 70 72 20 2a 2f 0a 20 20 20 20 20 20 20 20  Expr */.        
153c0 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 55  Expr *pExpr = pU
153d0 70 70 65 72 2d 3e 70 45 78 70 72 2d 3e 70 52 69  pper->pExpr->pRi
153e0 67 68 74 3b 0a 20 20 20 20 20 20 20 20 72 63 20  ght;.        rc 
153f0 3d 20 73 71 6c 69 74 65 33 53 74 61 74 34 50 72  = sqlite3Stat4Pr
15400 6f 62 65 53 65 74 56 61 6c 75 65 28 70 50 61 72  obeSetValue(pPar
15410 73 65 2c 20 70 2c 20 26 70 52 65 63 2c 20 70 45  se, p, &pRec, pE
15420 78 70 72 2c 20 61 66 66 2c 20 6e 45 71 2c 20 26  xpr, aff, nEq, &
15430 62 4f 6b 29 3b 0a 20 20 20 20 20 20 20 20 69 66  bOk);.        if
15440 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
15450 26 26 20 62 4f 6b 20 29 7b 0a 20 20 20 20 20 20  && bOk ){.      
15460 20 20 20 20 74 52 6f 77 63 6e 74 20 69 4e 65 77      tRowcnt iNew
15470 3b 0a 20 20 20 20 20 20 20 20 20 20 69 55 70 72  ;.          iUpr
15480 49 64 78 20 3d 20 77 68 65 72 65 4b 65 79 53 74  Idx = whereKeySt
15490 61 74 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70  ats(pParse, p, p
154a0 52 65 63 2c 20 31 2c 20 61 29 3b 0a 20 20 20 20  Rec, 1, a);.    
154b0 20 20 20 20 20 20 69 4e 65 77 20 3d 20 61 5b 30        iNew = a[0
154c0 5d 20 2b 20 28 28 70 55 70 70 65 72 2d 3e 65 4f  ] + ((pUpper->eO
154d0 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 47 54  perator & (WO_GT
154e0 7c 57 4f 5f 4c 45 29 29 20 3f 20 61 5b 31 5d 20  |WO_LE)) ? a[1] 
154f0 3a 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  : 0);.          
15500 69 66 28 20 69 4e 65 77 3c 69 55 70 70 65 72 20  if( iNew<iUpper 
15510 29 20 69 55 70 70 65 72 20 3d 20 69 4e 65 77 3b  ) iUpper = iNew;
15520 0a 20 20 20 20 20 20 20 20 20 20 6e 4f 75 74 2d  .          nOut-
15530 2d 3b 0a 20 20 20 20 20 20 20 20 20 20 70 55 70  -;.          pUp
15540 70 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  per = 0;.       
15550 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20   }.      }..    
15560 20 20 70 42 75 69 6c 64 65 72 2d 3e 70 52 65 63    pBuilder->pRec
15570 20 3d 20 70 52 65 63 3b 0a 20 20 20 20 20 20 69   = pRec;.      i
15580 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
15590 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
155a0 69 55 70 70 65 72 3e 69 4c 6f 77 65 72 20 29 7b  iUpper>iLower ){
155b0 0a 20 20 20 20 20 20 20 20 20 20 6e 4e 65 77 20  .          nNew 
155c0 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  = sqlite3LogEst(
155d0 69 55 70 70 65 72 20 2d 20 69 4c 6f 77 65 72 29  iUpper - iLower)
155e0 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ;.          /* T
155f0 55 4e 49 4e 47 3a 20 20 49 66 20 62 6f 74 68 20  UNING:  If both 
15600 69 55 70 70 65 72 20 61 6e 64 20 69 4c 6f 77 65  iUpper and iLowe
15610 72 20 61 72 65 20 64 65 72 69 76 65 64 20 66 72  r are derived fr
15620 6f 6d 20 74 68 65 20 73 61 6d 65 0a 20 20 20 20  om the same.    
15630 20 20 20 20 20 20 2a 2a 20 73 61 6d 70 6c 65 2c        ** sample,
15640 20 74 68 65 6e 20 61 73 73 75 6d 65 20 74 68 65   then assume the
15650 79 20 61 72 65 20 34 78 20 6d 6f 72 65 20 73 65  y are 4x more se
15660 6c 65 63 74 69 76 65 2e 20 20 54 68 69 73 20 62  lective.  This b
15670 72 69 6e 67 73 0a 20 20 20 20 20 20 20 20 20 20  rings.          
15680 2a 2a 20 74 68 65 20 65 73 74 69 6d 61 74 65 64  ** the estimated
15690 20 73 65 6c 65 63 74 69 76 69 74 79 20 6d 6f 72   selectivity mor
156a0 65 20 69 6e 20 6c 69 6e 65 20 77 69 74 68 20 77  e in line with w
156b0 68 61 74 20 69 74 20 77 6f 75 6c 64 20 62 65 0a  hat it would be.
156c0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 66 20            ** if 
156d0 65 73 74 69 6d 61 74 65 64 20 77 69 74 68 6f 75  estimated withou
156e0 74 20 74 68 65 20 75 73 65 20 6f 66 20 53 54 41  t the use of STA
156f0 54 33 2f 34 20 74 61 62 6c 65 73 2e 20 2a 2f 0a  T3/4 tables. */.
15700 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 4c            if( iL
15710 77 72 49 64 78 3d 3d 69 55 70 72 49 64 78 20 29  wrIdx==iUprIdx )
15720 20 6e 4e 65 77 20 2d 3d 20 32 30 3b 20 20 61 73   nNew -= 20;  as
15730 73 65 72 74 28 20 32 30 3d 3d 73 71 6c 69 74 65  sert( 20==sqlite
15740 33 4c 6f 67 45 73 74 28 34 29 20 29 3b 0a 20 20  3LogEst(4) );.  
15750 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
15760 20 20 20 20 20 20 20 6e 4e 65 77 20 3d 20 31 30         nNew = 10
15770 3b 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  ;        assert(
15780 20 31 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45   10==sqlite3LogE
15790 73 74 28 32 29 20 29 3b 0a 20 20 20 20 20 20 20  st(2) );.       
157a0 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e   }.        if( n
157b0 4e 65 77 3c 6e 4f 75 74 20 29 7b 0a 20 20 20 20  New<nOut ){.    
157c0 20 20 20 20 20 20 6e 4f 75 74 20 3d 20 6e 4e 65        nOut = nNe
157d0 77 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  w;.        }.   
157e0 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28       WHERETRACE(
157f0 30 78 31 30 2c 20 28 22 53 54 41 54 34 20 72 61  0x10, ("STAT4 ra
15800 6e 67 65 20 73 63 61 6e 3a 20 25 75 2e 2e 25 75  nge scan: %u..%u
15810 20 20 65 73 74 3d 25 64 5c 6e 22 2c 0a 20 20 20    est=%d\n",.   
15820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15830 20 20 20 20 20 20 20 20 28 75 33 32 29 69 4c 6f          (u32)iLo
15840 77 65 72 2c 20 28 75 33 32 29 69 55 70 70 65 72  wer, (u32)iUpper
15850 2c 20 6e 4f 75 74 29 29 3b 0a 20 20 20 20 20 20  , nOut));.      
15860 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
15870 20 20 20 69 6e 74 20 62 44 6f 6e 65 20 3d 20 30     int bDone = 0
15880 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68 65  ;.      rc = whe
15890 72 65 52 61 6e 67 65 53 6b 69 70 53 63 61 6e 45  reRangeSkipScanE
158a0 73 74 28 70 50 61 72 73 65 2c 20 70 4c 6f 77 65  st(pParse, pLowe
158b0 72 2c 20 70 55 70 70 65 72 2c 20 70 4c 6f 6f 70  r, pUpper, pLoop
158c0 2c 20 26 62 44 6f 6e 65 29 3b 0a 20 20 20 20 20  , &bDone);.     
158d0 20 69 66 28 20 62 44 6f 6e 65 20 29 20 72 65 74   if( bDone ) ret
158e0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
158f0 7d 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44  }.#else.  UNUSED
15900 5f 50 41 52 41 4d 45 54 45 52 28 70 50 61 72 73  _PARAMETER(pPars
15910 65 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  e);.  UNUSED_PAR
15920 41 4d 45 54 45 52 28 70 42 75 69 6c 64 65 72 29  AMETER(pBuilder)
15930 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 6f 77  ;.  assert( pLow
15940 65 72 20 7c 7c 20 70 55 70 70 65 72 20 29 3b 0a  er || pUpper );.
15950 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28  #endif.  assert(
15960 20 70 55 70 70 65 72 3d 3d 30 20 7c 7c 20 28 70   pUpper==0 || (p
15970 55 70 70 65 72 2d 3e 77 74 46 6c 61 67 73 20 26  Upper->wtFlags &
15980 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20   TERM_VNULL)==0 
15990 29 3b 0a 20 20 6e 4e 65 77 20 3d 20 77 68 65 72  );.  nNew = wher
159a0 65 52 61 6e 67 65 41 64 6a 75 73 74 28 70 4c 6f  eRangeAdjust(pLo
159b0 77 65 72 2c 20 6e 4f 75 74 29 3b 0a 20 20 6e 4e  wer, nOut);.  nN
159c0 65 77 20 3d 20 77 68 65 72 65 52 61 6e 67 65 41  ew = whereRangeA
159d0 64 6a 75 73 74 28 70 55 70 70 65 72 2c 20 6e 4e  djust(pUpper, nN
159e0 65 77 29 3b 0a 0a 20 20 2f 2a 20 54 55 4e 49 4e  ew);..  /* TUNIN
159f0 47 3a 20 49 66 20 74 68 65 72 65 20 69 73 20 62  G: If there is b
15a00 6f 74 68 20 61 6e 20 75 70 70 65 72 20 61 6e 64  oth an upper and
15a10 20 6c 6f 77 65 72 20 6c 69 6d 69 74 20 61 6e 64   lower limit and
15a20 20 6e 65 69 74 68 65 72 20 6c 69 6d 69 74 0a 20   neither limit. 
15a30 20 2a 2a 20 68 61 73 20 61 6e 20 61 70 70 6c 69   ** has an appli
15a40 63 61 74 69 6f 6e 2d 64 65 66 69 6e 65 64 20 6c  cation-defined l
15a50 69 6b 65 6c 69 68 6f 6f 64 28 29 2c 20 61 73 73  ikelihood(), ass
15a60 75 6d 65 20 74 68 65 20 72 61 6e 67 65 20 69 73  ume the range is
15a70 0a 20 20 2a 2a 20 72 65 64 75 63 65 64 20 62 79  .  ** reduced by
15a80 20 61 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20 37   an additional 7
15a90 35 25 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74  5%. This means t
15aa0 68 61 74 2c 20 62 79 20 64 65 66 61 75 6c 74 2c  hat, by default,
15ab0 20 61 6e 20 6f 70 65 6e 2d 65 6e 64 65 64 0a 20   an open-ended. 
15ac0 20 2a 2a 20 72 61 6e 67 65 20 71 75 65 72 79 20   ** range query 
15ad0 28 65 2e 67 2e 20 63 6f 6c 20 3e 20 3f 29 20 69  (e.g. col > ?) i
15ae0 73 20 61 73 73 75 6d 65 64 20 74 6f 20 6d 61 74  s assumed to mat
15af0 63 68 20 31 2f 34 20 6f 66 20 74 68 65 20 72 6f  ch 1/4 of the ro
15b00 77 73 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 69  ws in the.  ** i
15b10 6e 64 65 78 2e 20 57 68 69 6c 65 20 61 20 63 6c  ndex. While a cl
15b20 6f 73 65 64 20 72 61 6e 67 65 20 28 65 2e 67 2e  osed range (e.g.
15b30 20 63 6f 6c 20 42 45 54 57 45 45 4e 20 3f 20 41   col BETWEEN ? A
15b40 4e 44 20 3f 29 20 69 73 20 65 73 74 69 6d 61 74  ND ?) is estimat
15b50 65 64 20 74 6f 0a 20 20 2a 2a 20 6d 61 74 63 68  ed to.  ** match
15b60 20 31 2f 36 34 20 6f 66 20 74 68 65 20 69 6e 64   1/64 of the ind
15b70 65 78 2e 20 2a 2f 20 0a 20 20 69 66 28 20 70 4c  ex. */ .  if( pL
15b80 6f 77 65 72 20 26 26 20 70 4c 6f 77 65 72 2d 3e  ower && pLower->
15b90 74 72 75 74 68 50 72 6f 62 3e 30 20 26 26 20 70  truthProb>0 && p
15ba0 55 70 70 65 72 20 26 26 20 70 55 70 70 65 72 2d  Upper && pUpper-
15bb0 3e 74 72 75 74 68 50 72 6f 62 3e 30 20 29 7b 0a  >truthProb>0 ){.
15bc0 20 20 20 20 6e 4e 65 77 20 2d 3d 20 32 30 3b 0a      nNew -= 20;.
15bd0 20 20 7d 0a 0a 20 20 6e 4f 75 74 20 2d 3d 20 28    }..  nOut -= (
15be0 70 4c 6f 77 65 72 21 3d 30 29 20 2b 20 28 70 55  pLower!=0) + (pU
15bf0 70 70 65 72 21 3d 30 29 3b 0a 20 20 69 66 28 20  pper!=0);.  if( 
15c00 6e 4e 65 77 3c 31 30 20 29 20 6e 4e 65 77 20 3d  nNew<10 ) nNew =
15c10 20 31 30 3b 0a 20 20 69 66 28 20 6e 4e 65 77 3c   10;.  if( nNew<
15c20 6e 4f 75 74 20 29 20 6e 4f 75 74 20 3d 20 6e 4e  nOut ) nOut = nN
15c30 65 77 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28  ew;.#if defined(
15c40 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c  WHERETRACE_ENABL
15c50 45 44 29 0a 20 20 69 66 28 20 70 4c 6f 6f 70 2d  ED).  if( pLoop-
15c60 3e 6e 4f 75 74 3e 6e 4f 75 74 20 29 7b 0a 20 20  >nOut>nOut ){.  
15c70 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78 31    WHERETRACE(0x1
15c80 30 2c 28 22 52 61 6e 67 65 20 73 63 61 6e 20 6c  0,("Range scan l
15c90 6f 77 65 72 73 20 6e 4f 75 74 20 66 72 6f 6d 20  owers nOut from 
15ca0 25 64 20 74 6f 20 25 64 5c 6e 22 2c 0a 20 20 20  %d to %d\n",.   
15cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15cc0 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 2c 20 6e 4f   pLoop->nOut, nO
15cd0 75 74 29 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  ut));.  }.#endif
15ce0 0a 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 3d  .  pLoop->nOut =
15cf0 20 28 4c 6f 67 45 73 74 29 6e 4f 75 74 3b 0a 20   (LogEst)nOut;. 
15d00 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
15d10 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
15d20 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41  BLE_STAT3_OR_STA
15d30 54 34 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74  T4./*.** Estimat
15d40 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
15d50 72 6f 77 73 20 74 68 61 74 20 77 69 6c 6c 20 62  rows that will b
15d60 65 20 72 65 74 75 72 6e 65 64 20 62 61 73 65 64  e returned based
15d70 20 6f 6e 0a 2a 2a 20 61 6e 20 65 71 75 61 6c 69   on.** an equali
15d80 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 78 3d  ty constraint x=
15d90 56 41 4c 55 45 20 61 6e 64 20 77 68 65 72 65 20  VALUE and where 
15da0 74 68 61 74 20 56 41 4c 55 45 20 6f 63 63 75 72  that VALUE occur
15db0 73 20 69 6e 0a 2a 2a 20 74 68 65 20 68 69 73 74  s in.** the hist
15dc0 6f 67 72 61 6d 20 64 61 74 61 2e 20 20 54 68 69  ogram data.  Thi
15dd0 73 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 77 68 65  s only works whe
15de0 6e 20 78 20 69 73 20 74 68 65 20 6c 65 66 74 2d  n x is the left-
15df0 6d 6f 73 74 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 6f  most.** column o
15e00 66 20 61 6e 20 69 6e 64 65 78 20 61 6e 64 20 73  f an index and s
15e10 71 6c 69 74 65 5f 73 74 61 74 33 20 68 69 73 74  qlite_stat3 hist
15e20 6f 67 72 61 6d 20 64 61 74 61 20 69 73 20 61 76  ogram data is av
15e30 61 69 6c 61 62 6c 65 0a 2a 2a 20 66 6f 72 20 74  ailable.** for t
15e40 68 61 74 20 69 6e 64 65 78 2e 20 20 57 68 65 6e  hat index.  When
15e50 20 70 45 78 70 72 3d 3d 4e 55 4c 4c 20 74 68 61   pExpr==NULL tha
15e60 74 20 6d 65 61 6e 73 20 74 68 65 20 63 6f 6e 73  t means the cons
15e70 74 72 61 69 6e 74 20 69 73 0a 2a 2a 20 22 78 20  traint is.** "x 
15e80 49 53 20 4e 55 4c 4c 22 20 69 6e 73 74 65 61 64  IS NULL" instead
15e90 20 6f 66 20 22 78 3d 56 41 4c 55 45 22 2e 0a 2a   of "x=VALUE"..*
15ea0 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 65  *.** Write the e
15eb0 73 74 69 6d 61 74 65 64 20 72 6f 77 20 63 6f 75  stimated row cou
15ec0 6e 74 20 69 6e 74 6f 20 2a 70 6e 52 6f 77 20 61  nt into *pnRow a
15ed0 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  nd return SQLITE
15ee0 5f 4f 4b 2e 20 0a 2a 2a 20 49 66 20 75 6e 61 62  _OK. .** If unab
15ef0 6c 65 20 74 6f 20 6d 61 6b 65 20 61 6e 20 65 73  le to make an es
15f00 74 69 6d 61 74 65 2c 20 6c 65 61 76 65 20 2a 70  timate, leave *p
15f10 6e 52 6f 77 20 75 6e 63 68 61 6e 67 65 64 20 61  nRow unchanged a
15f20 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e  nd return.** non
15f30 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  -zero..**.** Thi
15f40 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 66 61  s routine can fa
15f50 69 6c 20 69 66 20 69 74 20 69 73 20 75 6e 61 62  il if it is unab
15f60 6c 65 20 74 6f 20 6c 6f 61 64 20 61 20 63 6f 6c  le to load a col
15f70 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 0a  lating sequence.
15f80 2a 2a 20 72 65 71 75 69 72 65 64 20 66 6f 72 20  ** required for 
15f90 73 74 72 69 6e 67 20 63 6f 6d 70 61 72 69 73 6f  string compariso
15fa0 6e 2c 20 6f 72 20 69 66 20 75 6e 61 62 6c 65 20  n, or if unable 
15fb0 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f  to allocate memo
15fc0 72 79 0a 2a 2a 20 66 6f 72 20 61 20 55 54 46 20  ry.** for a UTF 
15fd0 63 6f 6e 76 65 72 73 69 6f 6e 20 72 65 71 75 69  conversion requi
15fe0 72 65 64 20 66 6f 72 20 63 6f 6d 70 61 72 69 73  red for comparis
15ff0 6f 6e 2e 20 20 54 68 65 20 65 72 72 6f 72 20 69  on.  The error i
16000 73 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 74  s stored.** in t
16010 68 65 20 70 50 61 72 73 65 20 73 74 72 75 63 74  he pParse struct
16020 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ure..*/.static i
16030 6e 74 20 77 68 65 72 65 45 71 75 61 6c 53 63 61  nt whereEqualSca
16040 6e 45 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70  nEst(.  Parse *p
16050 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20  Parse,       /* 
16060 50 61 72 73 69 6e 67 20 26 20 63 6f 64 65 20 67  Parsing & code g
16070 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78  enerating contex
16080 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70  t */.  WhereLoop
16090 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65  Builder *pBuilde
160a0 72 2c 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  r,.  Expr *pExpr
160b0 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70  ,         /* Exp
160c0 72 65 73 73 69 6f 6e 20 66 6f 72 20 56 41 4c 55  ression for VALU
160d0 45 20 69 6e 20 74 68 65 20 78 3d 56 41 4c 55 45  E in the x=VALUE
160e0 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20   constraint */. 
160f0 20 74 52 6f 77 63 6e 74 20 2a 70 6e 52 6f 77 20   tRowcnt *pnRow 
16100 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
16110 68 65 20 72 65 76 69 73 65 64 20 72 6f 77 20 65  he revised row e
16120 73 74 69 6d 61 74 65 20 68 65 72 65 20 2a 2f 0a  stimate here */.
16130 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 20 3d 20  ){.  Index *p = 
16140 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e  pBuilder->pNew->
16150 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a  u.btree.pIndex;.
16160 20 20 69 6e 74 20 6e 45 71 20 3d 20 70 42 75 69    int nEq = pBui
16170 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74  lder->pNew->u.bt
16180 72 65 65 2e 6e 45 71 3b 0a 20 20 55 6e 70 61 63  ree.nEq;.  Unpac
16190 6b 65 64 52 65 63 6f 72 64 20 2a 70 52 65 63 20  kedRecord *pRec 
161a0 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 52 65 63  = pBuilder->pRec
161b0 3b 0a 20 20 75 38 20 61 66 66 3b 20 20 20 20 20  ;.  u8 aff;     
161c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
161d0 20 43 6f 6c 75 6d 6e 20 61 66 66 69 6e 69 74 79   Column affinity
161e0 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
161f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16200 2f 2a 20 53 75 62 66 75 6e 63 74 69 6f 6e 20 72  /* Subfunction r
16210 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
16220 74 52 6f 77 63 6e 74 20 61 5b 32 5d 3b 20 20 20  tRowcnt a[2];   
16230 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61            /* Sta
16240 74 69 73 74 69 63 73 20 2a 2f 0a 20 20 69 6e 74  tistics */.  int
16250 20 62 4f 6b 3b 0a 0a 20 20 61 73 73 65 72 74 28   bOk;..  assert(
16260 20 6e 45 71 3e 3d 31 20 29 3b 0a 20 20 61 73 73   nEq>=1 );.  ass
16270 65 72 74 28 20 6e 45 71 3c 3d 70 2d 3e 6e 43 6f  ert( nEq<=p->nCo
16280 6c 75 6d 6e 20 29 3b 0a 20 20 61 73 73 65 72 74  lumn );.  assert
16290 28 20 70 2d 3e 61 53 61 6d 70 6c 65 21 3d 30 20  ( p->aSample!=0 
162a0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
162b0 6e 53 61 6d 70 6c 65 3e 30 20 29 3b 0a 20 20 61  nSample>0 );.  a
162c0 73 73 65 72 74 28 20 70 42 75 69 6c 64 65 72 2d  ssert( pBuilder-
162d0 3e 6e 52 65 63 56 61 6c 69 64 3c 6e 45 71 20 29  >nRecValid<nEq )
162e0 3b 0a 0a 20 20 2f 2a 20 49 66 20 76 61 6c 75 65  ;..  /* If value
162f0 73 20 61 72 65 20 6e 6f 74 20 61 76 61 69 6c 61  s are not availa
16300 62 6c 65 20 66 6f 72 20 61 6c 6c 20 66 69 65 6c  ble for all fiel
16310 64 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  ds of the index 
16320 74 6f 20 74 68 65 20 6c 65 66 74 0a 20 20 2a 2a  to the left.  **
16330 20 6f 66 20 74 68 69 73 20 6f 6e 65 2c 20 6e 6f   of this one, no
16340 20 65 73 74 69 6d 61 74 65 20 63 61 6e 20 62 65   estimate can be
16350 20 6d 61 64 65 2e 20 52 65 74 75 72 6e 20 53 51   made. Return SQ
16360 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 2e 20 2a  LITE_NOTFOUND. *
16370 2f 0a 20 20 69 66 28 20 70 42 75 69 6c 64 65 72  /.  if( pBuilder
16380 2d 3e 6e 52 65 63 56 61 6c 69 64 3c 28 6e 45 71  ->nRecValid<(nEq
16390 2d 31 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  -1) ){.    retur
163a0 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e  n SQLITE_NOTFOUN
163b0 44 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 69  D;.  }..  /* Thi
163c0 73 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61  s is an optimiza
163d0 74 69 6f 6e 20 6f 6e 6c 79 2e 20 54 68 65 20 63  tion only. The c
163e0 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 53 74  all to sqlite3St
163f0 61 74 34 50 72 6f 62 65 53 65 74 56 61 6c 75 65  at4ProbeSetValue
16400 28 29 0a 20 20 2a 2a 20 62 65 6c 6f 77 20 77 6f  ().  ** below wo
16410 75 6c 64 20 72 65 74 75 72 6e 20 74 68 65 20 73  uld return the s
16420 61 6d 65 20 76 61 6c 75 65 2e 20 20 2a 2f 0a 20  ame value.  */. 
16430 20 69 66 28 20 6e 45 71 3e 3d 70 2d 3e 6e 43 6f   if( nEq>=p->nCo
16440 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 2a 70 6e 52  lumn ){.    *pnR
16450 6f 77 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75  ow = 1;.    retu
16460 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
16470 7d 0a 0a 20 20 61 66 66 20 3d 20 70 2d 3e 70 54  }..  aff = p->pT
16480 61 62 6c 65 2d 3e 61 43 6f 6c 5b 70 2d 3e 61 69  able->aCol[p->ai
16490 43 6f 6c 75 6d 6e 5b 6e 45 71 2d 31 5d 5d 2e 61  Column[nEq-1]].a
164a0 66 66 69 6e 69 74 79 3b 0a 20 20 72 63 20 3d 20  ffinity;.  rc = 
164b0 73 71 6c 69 74 65 33 53 74 61 74 34 50 72 6f 62  sqlite3Stat4Prob
164c0 65 53 65 74 56 61 6c 75 65 28 70 50 61 72 73 65  eSetValue(pParse
164d0 2c 20 70 2c 20 26 70 52 65 63 2c 20 70 45 78 70  , p, &pRec, pExp
164e0 72 2c 20 61 66 66 2c 20 6e 45 71 2d 31 2c 20 26  r, aff, nEq-1, &
164f0 62 4f 6b 29 3b 0a 20 20 70 42 75 69 6c 64 65 72  bOk);.  pBuilder
16500 2d 3e 70 52 65 63 20 3d 20 70 52 65 63 3b 0a 20  ->pRec = pRec;. 
16510 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
16520 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
16530 20 20 69 66 28 20 62 4f 6b 3d 3d 30 20 29 20 72    if( bOk==0 ) r
16540 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54  eturn SQLITE_NOT
16550 46 4f 55 4e 44 3b 0a 20 20 70 42 75 69 6c 64 65  FOUND;.  pBuilde
16560 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20 3d 20 6e  r->nRecValid = n
16570 45 71 3b 0a 0a 20 20 77 68 65 72 65 4b 65 79 53  Eq;..  whereKeyS
16580 74 61 74 73 28 70 50 61 72 73 65 2c 20 70 2c 20  tats(pParse, p, 
16590 70 52 65 63 2c 20 30 2c 20 61 29 3b 0a 20 20 57  pRec, 0, a);.  W
165a0 48 45 52 45 54 52 41 43 45 28 30 78 31 30 2c 28  HERETRACE(0x10,(
165b0 22 65 71 75 61 6c 69 74 79 20 73 63 61 6e 20 72  "equality scan r
165c0 65 67 69 6f 6e 73 3a 20 25 64 5c 6e 22 2c 20 28  egions: %d\n", (
165d0 69 6e 74 29 61 5b 31 5d 29 29 3b 0a 20 20 2a 70  int)a[1]));.  *p
165e0 6e 52 6f 77 20 3d 20 61 5b 31 5d 3b 0a 20 20 0a  nRow = a[1];.  .
165f0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
16600 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
16610 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f  ENABLE_STAT3_OR_
16620 53 54 41 54 34 20 2a 2f 0a 0a 23 69 66 64 65 66  STAT4 */..#ifdef
16630 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
16640 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 2f 2a  TAT3_OR_STAT4./*
16650 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65  .** Estimate the
16660 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
16670 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65 74  that will be ret
16680 75 72 6e 65 64 20 62 61 73 65 64 20 6f 6e 0a 2a  urned based on.*
16690 2a 20 61 6e 20 49 4e 20 63 6f 6e 73 74 72 61 69  * an IN constrai
166a0 6e 74 20 77 68 65 72 65 20 74 68 65 20 72 69 67  nt where the rig
166b0 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20  ht-hand side of 
166c0 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 0a  the IN operator.
166d0 2a 2a 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20  ** is a list of 
166e0 76 61 6c 75 65 73 2e 20 20 45 78 61 6d 70 6c 65  values.  Example
166f0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 57  :.**.**        W
16700 48 45 52 45 20 78 20 49 4e 20 28 31 2c 32 2c 33  HERE x IN (1,2,3
16710 2c 34 29 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20  ,4).**.** Write 
16720 74 68 65 20 65 73 74 69 6d 61 74 65 64 20 72 6f  the estimated ro
16730 77 20 63 6f 75 6e 74 20 69 6e 74 6f 20 2a 70 6e  w count into *pn
16740 52 6f 77 20 61 6e 64 20 72 65 74 75 72 6e 20 53  Row and return S
16750 51 4c 49 54 45 5f 4f 4b 2e 20 0a 2a 2a 20 49 66  QLITE_OK. .** If
16760 20 75 6e 61 62 6c 65 20 74 6f 20 6d 61 6b 65 20   unable to make 
16770 61 6e 20 65 73 74 69 6d 61 74 65 2c 20 6c 65 61  an estimate, lea
16780 76 65 20 2a 70 6e 52 6f 77 20 75 6e 63 68 61 6e  ve *pnRow unchan
16790 67 65 64 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a  ged and return.*
167a0 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a  * non-zero..**.*
167b0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
167c0 61 6e 20 66 61 69 6c 20 69 66 20 69 74 20 69 73  an fail if it is
167d0 20 75 6e 61 62 6c 65 20 74 6f 20 6c 6f 61 64 20   unable to load 
167e0 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  a collating sequ
167f0 65 6e 63 65 0a 2a 2a 20 72 65 71 75 69 72 65 64  ence.** required
16800 20 66 6f 72 20 73 74 72 69 6e 67 20 63 6f 6d 70   for string comp
16810 61 72 69 73 6f 6e 2c 20 6f 72 20 69 66 20 75 6e  arison, or if un
16820 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65  able to allocate
16830 20 6d 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20 61   memory.** for a
16840 20 55 54 46 20 63 6f 6e 76 65 72 73 69 6f 6e 20   UTF conversion 
16850 72 65 71 75 69 72 65 64 20 66 6f 72 20 63 6f 6d  required for com
16860 70 61 72 69 73 6f 6e 2e 20 20 54 68 65 20 65 72  parison.  The er
16870 72 6f 72 20 69 73 20 73 74 6f 72 65 64 0a 2a 2a  ror is stored.**
16880 20 69 6e 20 74 68 65 20 70 50 61 72 73 65 20 73   in the pParse s
16890 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61  tructure..*/.sta
168a0 74 69 63 20 69 6e 74 20 77 68 65 72 65 49 6e 53  tic int whereInS
168b0 63 61 6e 45 73 74 28 0a 20 20 50 61 72 73 65 20  canEst(.  Parse 
168c0 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f  *pParse,       /
168d0 2a 20 50 61 72 73 69 6e 67 20 26 20 63 6f 64 65  * Parsing & code
168e0 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74   generating cont
168f0 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f  ext */.  WhereLo
16900 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c  opBuilder *pBuil
16910 64 65 72 2c 0a 20 20 45 78 70 72 4c 69 73 74 20  der,.  ExprList 
16920 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 54  *pList,     /* T
16930 68 65 20 76 61 6c 75 65 20 6c 69 73 74 20 6f 6e  he value list on
16940 20 74 68 65 20 52 48 53 20 6f 66 20 22 78 20 49   the RHS of "x I
16950 4e 20 28 76 31 2c 76 32 2c 76 33 2c 2e 2e 2e 29  N (v1,v2,v3,...)
16960 22 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 2a  " */.  tRowcnt *
16970 70 6e 52 6f 77 20 20 20 20 20 20 20 2f 2a 20 57  pnRow       /* W
16980 72 69 74 65 20 74 68 65 20 72 65 76 69 73 65 64  rite the revised
16990 20 72 6f 77 20 65 73 74 69 6d 61 74 65 20 68 65   row estimate he
169a0 72 65 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78  re */.){.  Index
169b0 20 2a 70 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e   *p = pBuilder->
169c0 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 70 49  pNew->u.btree.pI
169d0 6e 64 65 78 3b 0a 20 20 69 36 34 20 6e 52 6f 77  ndex;.  i64 nRow
169e0 30 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  0 = sqlite3LogEs
169f0 74 54 6f 49 6e 74 28 70 2d 3e 61 69 52 6f 77 4c  tToInt(p->aiRowL
16a00 6f 67 45 73 74 5b 30 5d 29 3b 0a 20 20 69 6e 74  ogEst[0]);.  int
16a10 20 6e 52 65 63 56 61 6c 69 64 20 3d 20 70 42 75   nRecValid = pBu
16a20 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64  ilder->nRecValid
16a30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
16a40 49 54 45 5f 4f 4b 3b 20 20 20 20 20 2f 2a 20 53  ITE_OK;     /* S
16a50 75 62 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  ubfunction retur
16a60 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 74 52 6f 77  n code */.  tRow
16a70 63 6e 74 20 6e 45 73 74 3b 20 20 20 20 20 20 20  cnt nEst;       
16a80 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
16a90 20 72 6f 77 73 20 66 6f 72 20 61 20 73 69 6e 67   rows for a sing
16aa0 6c 65 20 74 65 72 6d 20 2a 2f 0a 20 20 74 52 6f  le term */.  tRo
16ab0 77 63 6e 74 20 6e 52 6f 77 45 73 74 20 3d 20 30  wcnt nRowEst = 0
16ac0 3b 20 20 20 20 2f 2a 20 4e 65 77 20 65 73 74 69  ;    /* New esti
16ad0 6d 61 74 65 20 6f 66 20 74 68 65 20 6e 75 6d 62  mate of the numb
16ae0 65 72 20 6f 66 20 72 6f 77 73 20 2a 2f 0a 20 20  er of rows */.  
16af0 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
16b00 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
16b10 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 61 73  counter */..  as
16b20 73 65 72 74 28 20 70 2d 3e 61 53 61 6d 70 6c 65  sert( p->aSample
16b30 21 3d 30 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30  !=0 );.  for(i=0
16b40 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
16b50 26 26 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  && i<pList->nExp
16b60 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 6e 45 73  r; i++){.    nEs
16b70 74 20 3d 20 6e 52 6f 77 30 3b 0a 20 20 20 20 72  t = nRow0;.    r
16b80 63 20 3d 20 77 68 65 72 65 45 71 75 61 6c 53 63  c = whereEqualSc
16b90 61 6e 45 73 74 28 70 50 61 72 73 65 2c 20 70 42  anEst(pParse, pB
16ba0 75 69 6c 64 65 72 2c 20 70 4c 69 73 74 2d 3e 61  uilder, pList->a
16bb0 5b 69 5d 2e 70 45 78 70 72 2c 20 26 6e 45 73 74  [i].pExpr, &nEst
16bc0 29 3b 0a 20 20 20 20 6e 52 6f 77 45 73 74 20 2b  );.    nRowEst +
16bd0 3d 20 6e 45 73 74 3b 0a 20 20 20 20 70 42 75 69  = nEst;.    pBui
16be0 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20  lder->nRecValid 
16bf0 3d 20 6e 52 65 63 56 61 6c 69 64 3b 0a 20 20 7d  = nRecValid;.  }
16c00 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
16c10 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
16c20 20 6e 52 6f 77 45 73 74 20 3e 20 6e 52 6f 77 30   nRowEst > nRow0
16c30 20 29 20 6e 52 6f 77 45 73 74 20 3d 20 6e 52 6f   ) nRowEst = nRo
16c40 77 30 3b 0a 20 20 20 20 2a 70 6e 52 6f 77 20 3d  w0;.    *pnRow =
16c50 20 6e 52 6f 77 45 73 74 3b 0a 20 20 20 20 57 48   nRowEst;.    WH
16c60 45 52 45 54 52 41 43 45 28 30 78 31 30 2c 28 22  ERETRACE(0x10,("
16c70 49 4e 20 72 6f 77 20 65 73 74 69 6d 61 74 65 3a  IN row estimate:
16c80 20 65 73 74 3d 25 64 5c 6e 22 2c 20 6e 52 6f 77   est=%d\n", nRow
16c90 45 73 74 29 29 3b 0a 20 20 7d 0a 20 20 61 73 73  Est));.  }.  ass
16ca0 65 72 74 28 20 70 42 75 69 6c 64 65 72 2d 3e 6e  ert( pBuilder->n
16cb0 52 65 63 56 61 6c 69 64 3d 3d 6e 52 65 63 56 61  RecValid==nRecVa
16cc0 6c 69 64 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  lid );.  return 
16cd0 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  rc;.}.#endif /* 
16ce0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
16cf0 41 54 33 5f 4f 52 5f 53 54 41 54 34 20 2a 2f 0a  AT3_OR_STAT4 */.
16d00 0a 2f 2a 0a 2a 2a 20 44 69 73 61 62 6c 65 20 61  ./*.** Disable a
16d10 20 74 65 72 6d 20 69 6e 20 74 68 65 20 57 48 45   term in the WHE
16d20 52 45 20 63 6c 61 75 73 65 2e 20 20 45 78 63 65  RE clause.  Exce
16d30 70 74 2c 20 64 6f 20 6e 6f 74 20 64 69 73 61 62  pt, do not disab
16d40 6c 65 20 74 68 65 20 74 65 72 6d 0a 2a 2a 20 69  le the term.** i
16d50 66 20 69 74 20 63 6f 6e 74 72 6f 6c 73 20 61 20  f it controls a 
16d60 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20  LEFT OUTER JOIN 
16d70 61 6e 64 20 69 74 20 64 69 64 20 6e 6f 74 20 6f  and it did not o
16d80 72 69 67 69 6e 61 74 65 20 69 6e 20 74 68 65 20  riginate in the 
16d90 4f 4e 0a 2a 2a 20 6f 72 20 55 53 49 4e 47 20 63  ON.** or USING c
16da0 6c 61 75 73 65 20 6f 66 20 74 68 61 74 20 6a 6f  lause of that jo
16db0 69 6e 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e 73 69 64  in..**.** Consid
16dc0 65 72 20 74 68 65 20 74 65 72 6d 20 74 32 2e 7a  er the term t2.z
16dd0 3d 27 6f 6b 27 20 69 6e 20 74 68 65 20 66 6f 6c  ='ok' in the fol
16de0 6c 6f 77 69 6e 67 20 71 75 65 72 69 65 73 3a 0a  lowing queries:.
16df0 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 20 53 45 4c  **.**   (1)  SEL
16e00 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4c 45  ECT * FROM t1 LE
16e10 46 54 20 4a 4f 49 4e 20 74 32 20 4f 4e 20 74 31  FT JOIN t2 ON t1
16e20 2e 61 3d 74 32 2e 78 20 57 48 45 52 45 20 74 32  .a=t2.x WHERE t2
16e30 2e 7a 3d 27 6f 6b 27 0a 2a 2a 20 20 20 28 32 29  .z='ok'.**   (2)
16e40 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
16e50 74 31 20 4c 45 46 54 20 4a 4f 49 4e 20 74 32 20  t1 LEFT JOIN t2 
16e60 4f 4e 20 74 31 2e 61 3d 74 32 2e 78 20 41 4e 44  ON t1.a=t2.x AND
16e70 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 20 20 20   t2.z='ok'.**   
16e80 28 33 29 20 20 53 45 4c 45 43 54 20 2a 20 46 52  (3)  SELECT * FR
16e90 4f 4d 20 74 31 2c 20 74 32 20 57 48 45 52 45 20  OM t1, t2 WHERE 
16ea0 74 31 2e 61 3d 74 32 2e 78 20 41 4e 44 20 74 32  t1.a=t2.x AND t2
16eb0 2e 7a 3d 27 6f 6b 27 0a 2a 2a 0a 2a 2a 20 54 68  .z='ok'.**.** Th
16ec0 65 20 74 32 2e 7a 3d 27 6f 6b 27 20 69 73 20 64  e t2.z='ok' is d
16ed0 69 73 61 62 6c 65 64 20 69 6e 20 74 68 65 20 69  isabled in the i
16ee0 6e 20 28 32 29 20 62 65 63 61 75 73 65 20 69 74  n (2) because it
16ef0 20 6f 72 69 67 69 6e 61 74 65 73 0a 2a 2a 20 69   originates.** i
16f00 6e 20 74 68 65 20 4f 4e 20 63 6c 61 75 73 65 2e  n the ON clause.
16f10 20 20 54 68 65 20 74 65 72 6d 20 69 73 20 64 69    The term is di
16f20 73 61 62 6c 65 64 20 69 6e 20 28 33 29 20 62 65  sabled in (3) be
16f30 63 61 75 73 65 20 69 74 20 69 73 20 6e 6f 74 20  cause it is not 
16f40 70 61 72 74 0a 2a 2a 20 6f 66 20 61 20 4c 45 46  part.** of a LEF
16f50 54 20 4f 55 54 45 52 20 4a 4f 49 4e 2e 20 20 49  T OUTER JOIN.  I
16f60 6e 20 28 31 29 2c 20 74 68 65 20 74 65 72 6d 20  n (1), the term 
16f70 69 73 20 6e 6f 74 20 64 69 73 61 62 6c 65 64 2e  is not disabled.
16f80 0a 2a 2a 0a 2a 2a 20 44 69 73 61 62 6c 69 6e 67  .**.** Disabling
16f90 20 61 20 74 65 72 6d 20 63 61 75 73 65 73 20 74   a term causes t
16fa0 68 61 74 20 74 65 72 6d 20 74 6f 20 6e 6f 74 20  hat term to not 
16fb0 62 65 20 74 65 73 74 65 64 20 69 6e 20 74 68 65  be tested in the
16fc0 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a 2a 2a 20 6f   inner loop.** o
16fd0 66 20 74 68 65 20 6a 6f 69 6e 2e 20 20 44 69 73  f the join.  Dis
16fe0 61 62 6c 69 6e 67 20 69 73 20 61 6e 20 6f 70 74  abling is an opt
16ff0 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 57 68 65 6e  imization.  When
17000 20 74 65 72 6d 73 20 61 72 65 20 73 61 74 69 73   terms are satis
17010 66 69 65 64 0a 2a 2a 20 62 79 20 69 6e 64 69 63  fied.** by indic
17020 65 73 2c 20 77 65 20 64 69 73 61 62 6c 65 20 74  es, we disable t
17030 68 65 6d 20 74 6f 20 70 72 65 76 65 6e 74 20 72  hem to prevent r
17040 65 64 75 6e 64 61 6e 74 20 74 65 73 74 73 20 69  edundant tests i
17050 6e 20 74 68 65 20 69 6e 6e 65 72 0a 2a 2a 20 6c  n the inner.** l
17060 6f 6f 70 2e 20 20 57 65 20 77 6f 75 6c 64 20 67  oop.  We would g
17070 65 74 20 74 68 65 20 63 6f 72 72 65 63 74 20 72  et the correct r
17080 65 73 75 6c 74 73 20 69 66 20 6e 6f 74 68 69 6e  esults if nothin
17090 67 20 77 65 72 65 20 65 76 65 72 20 64 69 73 61  g were ever disa
170a0 62 6c 65 64 2c 0a 2a 2a 20 62 75 74 20 6a 6f 69  bled,.** but joi
170b0 6e 73 20 6d 69 67 68 74 20 72 75 6e 20 61 20 6c  ns might run a l
170c0 69 74 74 6c 65 20 73 6c 6f 77 65 72 2e 20 20 54  ittle slower.  T
170d0 68 65 20 74 72 69 63 6b 20 69 73 20 74 6f 20 64  he trick is to d
170e0 69 73 61 62 6c 65 20 61 73 20 6d 75 63 68 0a 2a  isable as much.*
170f0 2a 20 61 73 20 77 65 20 63 61 6e 20 77 69 74 68  * as we can with
17100 6f 75 74 20 64 69 73 61 62 6c 69 6e 67 20 74 6f  out disabling to
17110 6f 20 6d 75 63 68 2e 20 20 49 66 20 77 65 20 64  o much.  If we d
17120 69 73 61 62 6c 65 64 20 69 6e 20 28 31 29 2c 20  isabled in (1), 
17130 77 65 27 64 20 67 65 74 0a 2a 2a 20 74 68 65 20  we'd get.** the 
17140 77 72 6f 6e 67 20 61 6e 73 77 65 72 2e 20 20 53  wrong answer.  S
17150 65 65 20 74 69 63 6b 65 74 20 23 38 31 33 2e 0a  ee ticket #813..
17160 2a 2a 0a 2a 2a 20 49 66 20 61 6c 6c 20 74 68 65  **.** If all the
17170 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 61 20 74   children of a t
17180 65 72 6d 20 61 72 65 20 64 69 73 61 62 6c 65 64  erm are disabled
17190 2c 20 74 68 65 6e 20 74 68 61 74 20 74 65 72 6d  , then that term
171a0 20 69 73 20 61 6c 73 6f 0a 2a 2a 20 61 75 74 6f   is also.** auto
171b0 6d 61 74 69 63 61 6c 6c 79 20 64 69 73 61 62 6c  matically disabl
171c0 65 64 2e 20 20 49 6e 20 74 68 69 73 20 77 61 79  ed.  In this way
171d0 2c 20 74 65 72 6d 73 20 67 65 74 20 64 69 73 61  , terms get disa
171e0 62 6c 65 64 20 69 66 20 64 65 72 69 76 65 64 0a  bled if derived.
171f0 2a 2a 20 76 69 72 74 75 61 6c 20 74 65 72 6d 73  ** virtual terms
17200 20 61 72 65 20 74 65 73 74 65 64 20 66 69 72 73   are tested firs
17210 74 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a  t.  For example:
17220 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 78 20 47 4c  .**.**      x GL
17230 4f 42 20 27 61 62 63 2a 27 20 41 4e 44 20 78 3e  OB 'abc*' AND x>
17240 3d 27 61 62 63 27 20 41 4e 44 20 78 3c 27 61 63  ='abc' AND x<'ac
17250 64 27 0a 2a 2a 20 20 20 20 20 20 5c 5f 5f 5f 5f  d'.**      \____
17260 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 5c 5f 5f  _______/     \__
17270 5f 5f 5f 5f 2f 20 20 20 20 20 5c 5f 5f 5f 5f 5f  ____/     \_____
17280 2f 0a 2a 2a 20 20 20 20 20 20 20 20 20 70 61 72  /.**         par
17290 65 6e 74 20 20 20 20 20 20 20 20 20 20 63 68 69  ent          chi
172a0 6c 64 31 20 20 20 20 20 20 20 63 68 69 6c 64 32  ld1       child2
172b0 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 74 68 65 20  .**.** Only the 
172c0 70 61 72 65 6e 74 20 74 65 72 6d 20 77 61 73 20  parent term was 
172d0 69 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  in the original 
172e0 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 54  WHERE clause.  T
172f0 68 65 20 63 68 69 6c 64 31 0a 2a 2a 20 61 6e 64  he child1.** and
17300 20 63 68 69 6c 64 32 20 74 65 72 6d 73 20 77 65   child2 terms we
17310 72 65 20 61 64 64 65 64 20 62 79 20 74 68 65 20  re added by the 
17320 4c 49 4b 45 20 6f 70 74 69 6d 69 7a 61 74 69 6f  LIKE optimizatio
17330 6e 2e 20 20 49 66 20 62 6f 74 68 20 6f 66 0a 2a  n.  If both of.*
17340 2a 20 74 68 65 20 76 69 72 74 75 61 6c 20 63 68  * the virtual ch
17350 69 6c 64 20 74 65 72 6d 73 20 61 72 65 20 76 61  ild terms are va
17360 6c 69 64 2c 20 74 68 65 6e 20 74 65 73 74 69 6e  lid, then testin
17370 67 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20  g of the parent 
17380 63 61 6e 20 62 65 20 0a 2a 2a 20 73 6b 69 70 70  can be .** skipp
17390 65 64 2e 0a 2a 2a 0a 2a 2a 20 55 73 75 61 6c 6c  ed..**.** Usuall
173a0 79 20 74 68 65 20 70 61 72 65 6e 74 20 74 65 72  y the parent ter
173b0 6d 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 54  m is marked as T
173c0 45 52 4d 5f 43 4f 44 45 44 2e 20 20 42 75 74 20  ERM_CODED.  But 
173d0 69 66 20 74 68 65 20 70 61 72 65 6e 74 0a 2a 2a  if the parent.**
173e0 20 74 65 72 6d 20 77 61 73 20 6f 72 69 67 69 6e   term was origin
173f0 61 6c 6c 79 20 54 45 52 4d 5f 4c 49 4b 45 2c 20  ally TERM_LIKE, 
17400 74 68 65 6e 20 74 68 65 20 70 61 72 65 6e 74 20  then the parent 
17410 67 65 74 73 20 54 45 52 4d 5f 4c 49 4b 45 43 4f  gets TERM_LIKECO
17420 4e 44 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 20 54  ND instead..** T
17430 68 65 20 54 45 52 4d 5f 4c 49 4b 45 43 4f 4e 44  he TERM_LIKECOND
17440 20 6d 61 72 6b 69 6e 67 20 69 6e 64 69 63 61 74   marking indicat
17450 65 73 20 74 68 61 74 20 74 68 65 20 74 65 72 6d  es that the term
17460 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 64 65 64   should be coded
17470 20 69 6e 73 69 64 65 0a 2a 2a 20 61 20 63 6f 6e   inside.** a con
17480 64 69 74 69 6f 6e 61 6c 20 73 75 63 68 20 74 68  ditional such th
17490 61 74 20 69 73 20 6f 6e 6c 79 20 65 76 61 6c 75  at is only evalu
174a0 61 74 65 64 20 6f 6e 20 74 68 65 20 73 65 63 6f  ated on the seco
174b0 6e 64 20 70 61 73 73 20 6f 66 20 61 0a 2a 2a 20  nd pass of a.** 
174c0 4c 49 4b 45 2d 6f 70 74 69 6d 69 7a 61 74 69 6f  LIKE-optimizatio
174d0 6e 20 6c 6f 6f 70 2c 20 77 68 65 6e 20 73 63 61  n loop, when sca
174e0 6e 6e 69 6e 67 20 42 4c 4f 42 73 20 69 6e 73 74  nning BLOBs inst
174f0 65 61 64 20 6f 66 20 73 74 72 69 6e 67 73 2e 0a  ead of strings..
17500 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64  */.static void d
17510 69 73 61 62 6c 65 54 65 72 6d 28 57 68 65 72 65  isableTerm(Where
17520 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 57  Level *pLevel, W
17530 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 29  hereTerm *pTerm)
17540 7b 0a 20 20 69 6e 74 20 6e 4c 6f 6f 70 20 3d 20  {.  int nLoop = 
17550 30 3b 0a 20 20 77 68 69 6c 65 28 20 70 54 65 72  0;.  while( pTer
17560 6d 0a 20 20 20 20 20 20 26 26 20 28 70 54 65 72  m.      && (pTer
17570 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
17580 4d 5f 43 4f 44 45 44 29 3d 3d 30 0a 20 20 20 20  M_CODED)==0.    
17590 20 20 26 26 20 28 70 4c 65 76 65 6c 2d 3e 69 4c    && (pLevel->iL
175a0 65 66 74 4a 6f 69 6e 3d 3d 30 20 7c 7c 20 45 78  eftJoin==0 || Ex
175b0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 54  prHasProperty(pT
175c0 65 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f 46  erm->pExpr, EP_F
175d0 72 6f 6d 4a 6f 69 6e 29 29 0a 20 20 20 20 20 20  romJoin)).      
175e0 26 26 20 28 70 4c 65 76 65 6c 2d 3e 6e 6f 74 52  && (pLevel->notR
175f0 65 61 64 79 20 26 20 70 54 65 72 6d 2d 3e 70 72  eady & pTerm->pr
17600 65 72 65 71 41 6c 6c 29 3d 3d 30 0a 20 20 29 7b  ereqAll)==0.  ){
17610 0a 20 20 20 20 69 66 28 20 6e 4c 6f 6f 70 20 26  .    if( nLoop &
17620 26 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  & (pTerm->wtFlag
17630 73 20 26 20 54 45 52 4d 5f 4c 49 4b 45 29 21 3d  s & TERM_LIKE)!=
17640 30 20 29 7b 0a 20 20 20 20 20 20 70 54 65 72 6d  0 ){.      pTerm
17650 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52  ->wtFlags |= TER
17660 4d 5f 4c 49 4b 45 43 4f 4e 44 3b 0a 20 20 20 20  M_LIKECOND;.    
17670 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 54 65  }else{.      pTe
17680 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54  rm->wtFlags |= T
17690 45 52 4d 5f 43 4f 44 45 44 3b 0a 20 20 20 20 7d  ERM_CODED;.    }
176a0 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e  .    if( pTerm->
176b0 69 50 61 72 65 6e 74 3c 30 20 29 20 62 72 65 61  iParent<0 ) brea
176c0 6b 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 26  k;.    pTerm = &
176d0 70 54 65 72 6d 2d 3e 70 57 43 2d 3e 61 5b 70 54  pTerm->pWC->a[pT
176e0 65 72 6d 2d 3e 69 50 61 72 65 6e 74 5d 3b 0a 20  erm->iParent];. 
176f0 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64     pTerm->nChild
17700 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72  --;.    if( pTer
17710 6d 2d 3e 6e 43 68 69 6c 64 21 3d 30 20 29 20 62  m->nChild!=0 ) b
17720 72 65 61 6b 3b 0a 20 20 20 20 6e 4c 6f 6f 70 2b  reak;.    nLoop+
17730 2b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  +;.  }.}../*.** 
17740 43 6f 64 65 20 61 6e 20 4f 50 5f 41 66 66 69 6e  Code an OP_Affin
17750 69 74 79 20 6f 70 63 6f 64 65 20 74 6f 20 61 70  ity opcode to ap
17760 70 6c 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61  ply the column a
17770 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20 7a  ffinity string z
17780 41 66 66 0a 2a 2a 20 74 6f 20 74 68 65 20 6e 20  Aff.** to the n 
17790 72 65 67 69 73 74 65 72 73 20 73 74 61 72 74 69  registers starti
177a0 6e 67 20 61 74 20 62 61 73 65 2e 20 0a 2a 2a 0a  ng at base. .**.
177b0 2a 2a 20 41 73 20 61 6e 20 6f 70 74 69 6d 69 7a  ** As an optimiz
177c0 61 74 69 6f 6e 2c 20 53 51 4c 49 54 45 5f 41 46  ation, SQLITE_AF
177d0 46 5f 4e 4f 4e 45 20 65 6e 74 72 69 65 73 20 28  F_NONE entries (
177e0 77 68 69 63 68 20 61 72 65 20 6e 6f 2d 6f 70 73  which are no-ops
177f0 29 20 61 74 20 74 68 65 0a 2a 2a 20 62 65 67 69  ) at the.** begi
17800 6e 6e 69 6e 67 20 61 6e 64 20 65 6e 64 20 6f 66  nning and end of
17810 20 7a 41 66 66 20 61 72 65 20 69 67 6e 6f 72 65   zAff are ignore
17820 64 2e 20 20 49 66 20 61 6c 6c 20 65 6e 74 72 69  d.  If all entri
17830 65 73 20 69 6e 20 7a 41 66 66 20 61 72 65 0a 2a  es in zAff are.*
17840 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  * SQLITE_AFF_NON
17850 45 2c 20 74 68 65 6e 20 6e 6f 20 63 6f 64 65 20  E, then no code 
17860 67 65 74 73 20 67 65 6e 65 72 61 74 65 64 2e 0a  gets generated..
17870 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
17880 6e 65 20 6d 61 6b 65 73 20 69 74 73 20 6f 77 6e  ne makes its own
17890 20 63 6f 70 79 20 6f 66 20 7a 41 66 66 20 73 6f   copy of zAff so
178a0 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72   that the caller
178b0 20 69 73 20 66 72 65 65 0a 2a 2a 20 74 6f 20 6d   is free.** to m
178c0 6f 64 69 66 79 20 7a 41 66 66 20 61 66 74 65 72  odify zAff after
178d0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
178e0 74 75 72 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  turns..*/.static
178f0 20 76 6f 69 64 20 63 6f 64 65 41 70 70 6c 79 41   void codeApplyA
17900 66 66 69 6e 69 74 79 28 50 61 72 73 65 20 2a 70  ffinity(Parse *p
17910 50 61 72 73 65 2c 20 69 6e 74 20 62 61 73 65 2c  Parse, int base,
17920 20 69 6e 74 20 6e 2c 20 63 68 61 72 20 2a 7a 41   int n, char *zA
17930 66 66 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  ff){.  Vdbe *v =
17940 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
17950 20 20 69 66 28 20 7a 41 66 66 3d 3d 30 20 29 7b    if( zAff==0 ){
17960 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
17970 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
17980 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 72 65 74  ailed );.    ret
17990 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  urn;.  }.  asser
179a0 74 28 20 76 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a  t( v!=0 );..  /*
179b0 20 41 64 6a 75 73 74 20 62 61 73 65 20 61 6e 64   Adjust base and
179c0 20 6e 20 74 6f 20 73 6b 69 70 20 6f 76 65 72 20   n to skip over 
179d0 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20  SQLITE_AFF_NONE 
179e0 65 6e 74 72 69 65 73 20 61 74 20 74 68 65 20 62  entries at the b
179f0 65 67 69 6e 6e 69 6e 67 0a 20 20 2a 2a 20 61 6e  eginning.  ** an
17a00 64 20 65 6e 64 20 6f 66 20 74 68 65 20 61 66 66  d end of the aff
17a10 69 6e 69 74 79 20 73 74 72 69 6e 67 2e 0a 20 20  inity string..  
17a20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 6e 3e 30 20  */.  while( n>0 
17a30 26 26 20 7a 41 66 66 5b 30 5d 3d 3d 53 51 4c 49  && zAff[0]==SQLI
17a40 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 29 7b 0a 20  TE_AFF_NONE ){. 
17a50 20 20 20 6e 2d 2d 3b 0a 20 20 20 20 62 61 73 65     n--;.    base
17a60 2b 2b 3b 0a 20 20 20 20 7a 41 66 66 2b 2b 3b 0a  ++;.    zAff++;.
17a70 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 6e 3e 31    }.  while( n>1
17a80 20 26 26 20 7a 41 66 66 5b 6e 2d 31 5d 3d 3d 53   && zAff[n-1]==S
17a90 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 29  QLITE_AFF_NONE )
17aa0 7b 0a 20 20 20 20 6e 2d 2d 3b 0a 20 20 7d 0a 0a  {.    n--;.  }..
17ab0 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 4f 50    /* Code the OP
17ac0 5f 41 66 66 69 6e 69 74 79 20 6f 70 63 6f 64 65  _Affinity opcode
17ad0 20 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 79   if there is any
17ae0 74 68 69 6e 67 20 6c 65 66 74 20 74 6f 20 64 6f  thing left to do
17af0 2e 20 2a 2f 0a 20 20 69 66 28 20 6e 3e 30 20 29  . */.  if( n>0 )
17b00 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
17b10 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 66  eAddOp2(v, OP_Af
17b20 66 69 6e 69 74 79 2c 20 62 61 73 65 2c 20 6e 29  finity, base, n)
17b30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
17b40 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c  eChangeP4(v, -1,
17b50 20 7a 41 66 66 2c 20 6e 29 3b 0a 20 20 20 20 73   zAff, n);.    s
17b60 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41  qlite3ExprCacheA
17b70 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50  ffinityChange(pP
17b80 61 72 73 65 2c 20 62 61 73 65 2c 20 6e 29 3b 0a  arse, base, n);.
17b90 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65    }.}.../*.** Ge
17ba0 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
17bb0 61 20 73 69 6e 67 6c 65 20 65 71 75 61 6c 69 74  a single equalit
17bc0 79 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48  y term of the WH
17bd0 45 52 45 20 63 6c 61 75 73 65 2e 20 20 41 6e 20  ERE clause.  An 
17be0 65 71 75 61 6c 69 74 79 0a 2a 2a 20 74 65 72 6d  equality.** term
17bf0 20 63 61 6e 20 62 65 20 65 69 74 68 65 72 20 58   can be either X
17c00 3d 65 78 70 72 20 6f 72 20 58 20 49 4e 20 28 2e  =expr or X IN (.
17c10 2e 2e 29 2e 20 20 20 70 54 65 72 6d 20 69 73 20  ..).   pTerm is 
17c20 74 68 65 20 74 65 72 6d 20 74 6f 20 62 65 20 0a  the term to be .
17c30 2a 2a 20 63 6f 64 65 64 2e 0a 2a 2a 0a 2a 2a 20  ** coded..**.** 
17c40 54 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75  The current valu
17c50 65 20 66 6f 72 20 74 68 65 20 63 6f 6e 73 74 72  e for the constr
17c60 61 69 6e 74 20 69 73 20 6c 65 66 74 20 69 6e 20  aint is left in 
17c70 72 65 67 69 73 74 65 72 20 69 52 65 67 2e 0a 2a  register iReg..*
17c80 2a 0a 2a 2a 20 46 6f 72 20 61 20 63 6f 6e 73 74  *.** For a const
17c90 72 61 69 6e 74 20 6f 66 20 74 68 65 20 66 6f 72  raint of the for
17ca0 6d 20 58 3d 65 78 70 72 2c 20 74 68 65 20 65 78  m X=expr, the ex
17cb0 70 72 65 73 73 69 6f 6e 20 69 73 20 65 76 61 6c  pression is eval
17cc0 75 61 74 65 64 20 61 6e 64 20 69 74 73 0a 2a 2a  uated and its.**
17cd0 20 72 65 73 75 6c 74 20 69 73 20 6c 65 66 74 20   result is left 
17ce0 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20 46  on the stack.  F
17cf0 6f 72 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f  or constraints o
17d00 66 20 74 68 65 20 66 6f 72 6d 20 58 20 49 4e 20  f the form X IN 
17d10 28 2e 2e 2e 29 0a 2a 2a 20 74 68 69 73 20 72 6f  (...).** this ro
17d20 75 74 69 6e 65 20 73 65 74 73 20 75 70 20 61 20  utine sets up a 
17d30 6c 6f 6f 70 20 74 68 61 74 20 77 69 6c 6c 20 69  loop that will i
17d40 74 65 72 61 74 65 20 6f 76 65 72 20 61 6c 6c 20  terate over all 
17d50 76 61 6c 75 65 73 20 6f 66 20 58 2e 0a 2a 2f 0a  values of X..*/.
17d60 73 74 61 74 69 63 20 69 6e 74 20 63 6f 64 65 45  static int codeE
17d70 71 75 61 6c 69 74 79 54 65 72 6d 28 0a 20 20 50  qualityTerm(.  P
17d80 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
17d90 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e     /* The parsin
17da0 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57  g context */.  W
17db0 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c  hereTerm *pTerm,
17dc0 20 20 20 2f 2a 20 54 68 65 20 74 65 72 6d 20 6f     /* The term o
17dd0 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
17de0 73 65 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a  se to be coded *
17df0 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a  /.  WhereLevel *
17e00 70 4c 65 76 65 6c 2c 20 2f 2a 20 54 68 65 20 6c  pLevel, /* The l
17e10 65 76 65 6c 20 6f 66 20 74 68 65 20 46 52 4f 4d  evel of the FROM
17e20 20 63 6c 61 75 73 65 20 77 65 20 61 72 65 20 77   clause we are w
17e30 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20 69  orking on */.  i
17e40 6e 74 20 69 45 71 2c 20 20 20 20 20 20 20 20 20  nt iEq,         
17e50 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74     /* Index of t
17e60 68 65 20 65 71 75 61 6c 69 74 79 20 74 65 72 6d  he equality term
17e70 20 77 69 74 68 69 6e 20 74 68 69 73 20 6c 65 76   within this lev
17e80 65 6c 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65 76  el */.  int bRev
17e90 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ,           /* T
17ea0 72 75 65 20 66 6f 72 20 72 65 76 65 72 73 65 2d  rue for reverse-
17eb0 6f 72 64 65 72 20 49 4e 20 6f 70 65 72 61 74 69  order IN operati
17ec0 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  ons */.  int iTa
17ed0 72 67 65 74 20 20 20 20 20 20 20 20 20 2f 2a 20  rget         /* 
17ee0 41 74 74 65 6d 70 74 20 74 6f 20 6c 65 61 76 65  Attempt to leave
17ef0 20 72 65 73 75 6c 74 73 20 69 6e 20 74 68 69 73   results in this
17f00 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 29 7b 0a   register */.){.
17f10 20 20 45 78 70 72 20 2a 70 58 20 3d 20 70 54 65    Expr *pX = pTe
17f20 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 56 64 62  rm->pExpr;.  Vdb
17f30 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
17f40 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 52 65 67  Vdbe;.  int iReg
17f50 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
17f60 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68     /* Register h
17f70 6f 6c 64 69 6e 67 20 72 65 73 75 6c 74 73 20 2a  olding results *
17f80 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69 54 61  /..  assert( iTa
17f90 72 67 65 74 3e 30 20 29 3b 0a 20 20 69 66 28 20  rget>0 );.  if( 
17fa0 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20 29 7b  pX->op==TK_EQ ){
17fb0 0a 20 20 20 20 69 52 65 67 20 3d 20 73 71 6c 69  .    iReg = sqli
17fc0 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65  te3ExprCodeTarge
17fd0 74 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 52  t(pParse, pX->pR
17fe0 69 67 68 74 2c 20 69 54 61 72 67 65 74 29 3b 0a  ight, iTarget);.
17ff0 20 20 7d 65 6c 73 65 20 69 66 28 20 70 58 2d 3e    }else if( pX->
18000 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b  op==TK_ISNULL ){
18010 0a 20 20 20 20 69 52 65 67 20 3d 20 69 54 61 72  .    iReg = iTar
18020 67 65 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  get;.    sqlite3
18030 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
18040 5f 4e 75 6c 6c 2c 20 30 2c 20 69 52 65 67 29 3b  _Null, 0, iReg);
18050 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
18060 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
18070 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 65  }else{.    int e
18080 54 79 70 65 3b 0a 20 20 20 20 69 6e 74 20 69 54  Type;.    int iT
18090 61 62 3b 0a 20 20 20 20 73 74 72 75 63 74 20 49  ab;.    struct I
180a0 6e 4c 6f 6f 70 20 2a 70 49 6e 3b 0a 20 20 20 20  nLoop *pIn;.    
180b0 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70  WhereLoop *pLoop
180c0 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f   = pLevel->pWLoo
180d0 70 3b 0a 0a 20 20 20 20 69 66 28 20 28 70 4c 6f  p;..    if( (pLo
180e0 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
180f0 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  ERE_VIRTUALTABLE
18100 29 3d 3d 30 0a 20 20 20 20 20 20 26 26 20 70 4c  )==0.      && pL
18110 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  oop->u.btree.pIn
18120 64 65 78 21 3d 30 0a 20 20 20 20 20 20 26 26 20  dex!=0.      && 
18130 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70  pLoop->u.btree.p
18140 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65  Index->aSortOrde
18150 72 5b 69 45 71 5d 0a 20 20 20 20 29 7b 0a 20 20  r[iEq].    ){.  
18160 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 45      testcase( iE
18170 71 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65  q==0 );.      te
18180 73 74 63 61 73 65 28 20 62 52 65 76 20 29 3b 0a  stcase( bRev );.
18190 20 20 20 20 20 20 62 52 65 76 20 3d 20 21 62 52        bRev = !bR
181a0 65 76 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  ev;.    }.    as
181b0 73 65 72 74 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b  sert( pX->op==TK
181c0 5f 49 4e 20 29 3b 0a 20 20 20 20 69 52 65 67 20  _IN );.    iReg 
181d0 3d 20 69 54 61 72 67 65 74 3b 0a 20 20 20 20 65  = iTarget;.    e
181e0 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33 46 69  Type = sqlite3Fi
181f0 6e 64 49 6e 49 6e 64 65 78 28 70 50 61 72 73 65  ndInIndex(pParse
18200 2c 20 70 58 2c 20 49 4e 5f 49 4e 44 45 58 5f 4c  , pX, IN_INDEX_L
18210 4f 4f 50 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  OOP, 0);.    if(
18220 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58   eType==IN_INDEX
18230 5f 49 4e 44 45 58 5f 44 45 53 43 20 29 7b 0a 20  _INDEX_DESC ){. 
18240 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 62       testcase( b
18250 52 65 76 20 29 3b 0a 20 20 20 20 20 20 62 52 65  Rev );.      bRe
18260 76 20 3d 20 21 62 52 65 76 3b 0a 20 20 20 20 7d  v = !bRev;.    }
18270 0a 20 20 20 20 69 54 61 62 20 3d 20 70 58 2d 3e  .    iTab = pX->
18280 69 54 61 62 6c 65 3b 0a 20 20 20 20 73 71 6c 69  iTable;.    sqli
18290 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
182a0 20 62 52 65 76 20 3f 20 4f 50 5f 4c 61 73 74 20   bRev ? OP_Last 
182b0 3a 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 54 61  : OP_Rewind, iTa
182c0 62 2c 20 30 29 3b 0a 20 20 20 20 56 64 62 65 43  b, 0);.    VdbeC
182d0 6f 76 65 72 61 67 65 49 66 28 76 2c 20 62 52 65  overageIf(v, bRe
182e0 76 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65  v);.    VdbeCove
182f0 72 61 67 65 49 66 28 76 2c 20 21 62 52 65 76 29  rageIf(v, !bRev)
18300 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  ;.    assert( (p
18310 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
18320 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 29 3d  WHERE_MULTI_OR)=
18330 3d 30 20 29 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d  =0 );.    pLoop-
18340 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52  >wsFlags |= WHER
18350 45 5f 49 4e 5f 41 42 4c 45 3b 0a 20 20 20 20 69  E_IN_ABLE;.    i
18360 66 28 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e  f( pLevel->u.in.
18370 6e 49 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  nIn==0 ){.      
18380 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 20  pLevel->addrNxt 
18390 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
183a0 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 7d  eLabel(v);.    }
183b0 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 75 2e 69  .    pLevel->u.i
183c0 6e 2e 6e 49 6e 2b 2b 3b 0a 20 20 20 20 70 4c 65  n.nIn++;.    pLe
183d0 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f  vel->u.in.aInLoo
183e0 70 20 3d 0a 20 20 20 20 20 20 20 73 71 6c 69 74  p =.       sqlit
183f0 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72 65  e3DbReallocOrFre
18400 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c  e(pParse->db, pL
18410 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f  evel->u.in.aInLo
18420 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  op,.            
18430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18440 20 20 73 69 7a 65 6f 66 28 70 4c 65 76 65 6c 2d    sizeof(pLevel-
18450 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 5b 30 5d  >u.in.aInLoop[0]
18460 29 2a 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e  )*pLevel->u.in.n
18470 49 6e 29 3b 0a 20 20 20 20 70 49 6e 20 3d 20 70  In);.    pIn = p
18480 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c  Level->u.in.aInL
18490 6f 6f 70 3b 0a 20 20 20 20 69 66 28 20 70 49 6e  oop;.    if( pIn
184a0 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 20 2b 3d   ){.      pIn +=
184b0 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49   pLevel->u.in.nI
184c0 6e 20 2d 20 31 3b 0a 20 20 20 20 20 20 70 49 6e  n - 1;.      pIn
184d0 2d 3e 69 43 75 72 20 3d 20 69 54 61 62 3b 0a 20  ->iCur = iTab;. 
184e0 20 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d       if( eType==
184f0 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 20 29  IN_INDEX_ROWID )
18500 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 2d 3e 61  {.        pIn->a
18510 64 64 72 49 6e 54 6f 70 20 3d 20 73 71 6c 69 74  ddrInTop = sqlit
18520 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
18530 4f 50 5f 52 6f 77 69 64 2c 20 69 54 61 62 2c 20  OP_Rowid, iTab, 
18540 69 52 65 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c  iReg);.      }el
18550 73 65 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 2d  se{.        pIn-
18560 3e 61 64 64 72 49 6e 54 6f 70 20 3d 20 73 71 6c  >addrInTop = sql
18570 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
18580 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 54 61  , OP_Column, iTa
18590 62 2c 20 30 2c 20 69 52 65 67 29 3b 0a 20 20 20  b, 0, iReg);.   
185a0 20 20 20 7d 0a 20 20 20 20 20 20 70 49 6e 2d 3e     }.      pIn->
185b0 65 45 6e 64 4c 6f 6f 70 4f 70 20 3d 20 62 52 65  eEndLoopOp = bRe
185c0 76 20 3f 20 4f 50 5f 50 72 65 76 49 66 4f 70 65  v ? OP_PrevIfOpe
185d0 6e 20 3a 20 4f 50 5f 4e 65 78 74 49 66 4f 70 65  n : OP_NextIfOpe
185e0 6e 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  n;.      sqlite3
185f0 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
18600 5f 49 73 4e 75 6c 6c 2c 20 69 52 65 67 29 3b 20  _IsNull, iReg); 
18610 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
18620 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
18630 20 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e    pLevel->u.in.n
18640 49 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 23 65  In = 0;.    }.#e
18650 6e 64 69 66 0a 20 20 7d 0a 20 20 64 69 73 61 62  ndif.  }.  disab
18660 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70  leTerm(pLevel, p
18670 54 65 72 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20  Term);.  return 
18680 69 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  iReg;.}../*.** G
18690 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
186a0 74 20 77 69 6c 6c 20 65 76 61 6c 75 61 74 65 20  t will evaluate 
186b0 61 6c 6c 20 3d 3d 20 61 6e 64 20 49 4e 20 63 6f  all == and IN co
186c0 6e 73 74 72 61 69 6e 74 73 20 66 6f 72 20 61 6e  nstraints for an
186d0 0a 2a 2a 20 69 6e 64 65 78 20 73 63 61 6e 2e 0a  .** index scan..
186e0 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c  **.** For exampl
186f0 65 2c 20 63 6f 6e 73 69 64 65 72 20 74 61 62 6c  e, consider tabl
18700 65 20 74 31 28 61 2c 62 2c 63 2c 64 2c 65 2c 66  e t1(a,b,c,d,e,f
18710 29 20 77 69 74 68 20 69 6e 64 65 78 20 69 31 28  ) with index i1(
18720 61 2c 62 2c 63 29 2e 0a 2a 2a 20 53 75 70 70 6f  a,b,c)..** Suppo
18730 73 65 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  se the WHERE cla
18740 75 73 65 20 69 73 20 74 68 69 73 3a 20 20 61 3d  use is this:  a=
18750 3d 35 20 41 4e 44 20 62 20 49 4e 20 28 31 2c 32  =5 AND b IN (1,2
18760 2c 33 29 20 41 4e 44 20 63 3e 35 20 41 4e 44 20  ,3) AND c>5 AND 
18770 63 3c 31 30 0a 2a 2a 20 54 68 65 20 69 6e 64 65  c<10.** The inde
18780 78 20 68 61 73 20 61 73 20 6d 61 6e 79 20 61 73  x has as many as
18790 20 74 68 72 65 65 20 65 71 75 61 6c 69 74 79 20   three equality 
187a0 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20 62 75 74  constraints, but
187b0 20 69 6e 20 74 68 69 73 0a 2a 2a 20 65 78 61 6d   in this.** exam
187c0 70 6c 65 2c 20 74 68 65 20 74 68 69 72 64 20 22  ple, the third "
187d0 63 22 20 76 61 6c 75 65 20 69 73 20 61 6e 20 69  c" value is an i
187e0 6e 65 71 75 61 6c 69 74 79 2e 20 20 53 6f 20 6f  nequality.  So o
187f0 6e 6c 79 20 74 77 6f 20 0a 2a 2a 20 63 6f 6e 73  nly two .** cons
18800 74 72 61 69 6e 74 73 20 61 72 65 20 63 6f 64 65  traints are code
18810 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  d.  This routine
18820 20 77 69 6c 6c 20 67 65 6e 65 72 61 74 65 20 63   will generate c
18830 6f 64 65 20 74 6f 20 65 76 61 6c 75 61 74 65 0a  ode to evaluate.
18840 2a 2a 20 61 3d 3d 35 20 61 6e 64 20 62 20 49 4e  ** a==5 and b IN
18850 20 28 31 2c 32 2c 33 29 2e 20 20 54 68 65 20 63   (1,2,3).  The c
18860 75 72 72 65 6e 74 20 76 61 6c 75 65 73 20 66 6f  urrent values fo
18870 72 20 61 20 61 6e 64 20 62 20 77 69 6c 6c 20 62  r a and b will b
18880 65 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 63  e stored.** in c
18890 6f 6e 73 65 63 75 74 69 76 65 20 72 65 67 69 73  onsecutive regis
188a0 74 65 72 73 20 61 6e 64 20 74 68 65 20 69 6e 64  ters and the ind
188b0 65 78 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  ex of the first 
188c0 72 65 67 69 73 74 65 72 20 69 73 20 72 65 74 75  register is retu
188d0 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74  rned..**.** In t
188e0 68 65 20 65 78 61 6d 70 6c 65 20 61 62 6f 76 65  he example above
188f0 20 6e 45 71 3d 3d 32 2e 20 20 42 75 74 20 74 68   nEq==2.  But th
18900 69 73 20 73 75 62 72 6f 75 74 69 6e 65 20 77 6f  is subroutine wo
18910 72 6b 73 20 66 6f 72 20 61 6e 79 20 76 61 6c 75  rks for any valu
18920 65 0a 2a 2a 20 6f 66 20 6e 45 71 20 69 6e 63 6c  e.** of nEq incl
18930 75 64 69 6e 67 20 30 2e 20 20 49 66 20 6e 45 71  uding 0.  If nEq
18940 3d 3d 30 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ==0, this routin
18950 65 20 69 73 20 6e 65 61 72 6c 79 20 61 20 6e 6f  e is nearly a no
18960 2d 6f 70 2e 0a 2a 2a 20 54 68 65 20 6f 6e 6c 79  -op..** The only
18970 20 74 68 69 6e 67 20 69 74 20 64 6f 65 73 20 69   thing it does i
18980 73 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 70  s allocate the p
18990 4c 65 76 65 6c 2d 3e 69 4d 65 6d 20 6d 65 6d 6f  Level->iMem memo
189a0 72 79 20 63 65 6c 6c 20 61 6e 64 0a 2a 2a 20 63  ry cell and.** c
189b0 6f 6d 70 75 74 65 20 74 68 65 20 61 66 66 69 6e  ompute the affin
189c0 69 74 79 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a  ity string..**.*
189d0 2a 20 54 68 65 20 6e 45 78 74 72 61 52 65 67 20  * The nExtraReg 
189e0 70 61 72 61 6d 65 74 65 72 20 69 73 20 30 20 6f  parameter is 0 o
189f0 72 20 31 2e 20 20 49 74 20 69 73 20 30 20 69 66  r 1.  It is 0 if
18a00 20 61 6c 6c 20 57 48 45 52 45 20 63 6c 61 75 73   all WHERE claus
18a10 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 2a 2a  e constraints.**
18a20 20 61 72 65 20 3d 3d 20 6f 72 20 49 4e 20 61 6e   are == or IN an
18a30 64 20 61 72 65 20 63 6f 76 65 72 65 64 20 62 79  d are covered by
18a40 20 74 68 65 20 6e 45 71 2e 20 20 6e 45 78 74 72   the nEq.  nExtr
18a50 61 52 65 67 20 69 73 20 31 20 69 66 20 74 68 65  aReg is 1 if the
18a60 72 65 20 69 73 0a 2a 2a 20 61 6e 20 69 6e 65 71  re is.** an ineq
18a70 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
18a80 74 20 28 73 75 63 68 20 61 73 20 74 68 65 20 22  t (such as the "
18a90 63 3e 3d 35 20 41 4e 44 20 63 3c 31 30 22 20 69  c>=5 AND c<10" i
18aa0 6e 20 74 68 65 20 65 78 61 6d 70 6c 65 29 20 74  n the example) t
18ab0 68 61 74 0a 2a 2a 20 6f 63 63 75 72 73 20 61 66  hat.** occurs af
18ac0 74 65 72 20 74 68 65 20 6e 45 71 20 71 75 61 6c  ter the nEq qual
18ad0 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e  ity constraints.
18ae0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
18af0 69 6e 65 20 61 6c 6c 6f 63 61 74 65 73 20 61 20  ine allocates a 
18b00 72 61 6e 67 65 20 6f 66 20 6e 45 71 2b 6e 45 78  range of nEq+nEx
18b10 74 72 61 52 65 67 20 6d 65 6d 6f 72 79 20 63 65  traReg memory ce
18b20 6c 6c 73 20 61 6e 64 20 72 65 74 75 72 6e 73 0a  lls and returns.
18b30 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  ** the index of 
18b40 74 68 65 20 66 69 72 73 74 20 6d 65 6d 6f 72 79  the first memory
18b50 20 63 65 6c 6c 20 69 6e 20 74 68 61 74 20 72 61   cell in that ra
18b60 6e 67 65 2e 20 54 68 65 20 63 6f 64 65 20 74 68  nge. The code th
18b70 61 74 0a 2a 2a 20 63 61 6c 6c 73 20 74 68 69 73  at.** calls this
18b80 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 75 73   routine will us
18b90 65 20 74 68 61 74 20 6d 65 6d 6f 72 79 20 72 61  e that memory ra
18ba0 6e 67 65 20 74 6f 20 73 74 6f 72 65 20 6b 65 79  nge to store key
18bb0 73 20 66 6f 72 0a 2a 2a 20 73 74 61 72 74 20 61  s for.** start a
18bc0 6e 64 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20 63  nd termination c
18bd0 6f 6e 64 69 74 69 6f 6e 73 20 6f 66 20 74 68 65  onditions of the
18be0 20 6c 6f 6f 70 2e 0a 2a 2a 20 6b 65 79 20 76 61   loop..** key va
18bf0 6c 75 65 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e  lue of the loop.
18c00 20 20 49 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65    If one or more
18c10 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 20 61 70   IN operators ap
18c20 70 65 61 72 2c 20 74 68 65 6e 0a 2a 2a 20 74 68  pear, then.** th
18c30 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 6c 6f 63  is routine alloc
18c40 61 74 65 73 20 61 6e 20 61 64 64 69 74 69 6f 6e  ates an addition
18c50 61 6c 20 6e 45 71 20 6d 65 6d 6f 72 79 20 63 65  al nEq memory ce
18c60 6c 6c 73 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c  lls for internal
18c70 0a 2a 2a 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 42  .** use..**.** B
18c80 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2c  efore returning,
18c90 20 2a 70 7a 41 66 66 20 69 73 20 73 65 74 20 74   *pzAff is set t
18ca0 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66  o point to a buf
18cb0 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61  fer containing a
18cc0 0a 2a 2a 20 63 6f 70 79 20 6f 66 20 74 68 65 20  .** copy of the 
18cd0 63 6f 6c 75 6d 6e 20 61 66 66 69 6e 69 74 79 20  column affinity 
18ce0 73 74 72 69 6e 67 20 6f 66 20 74 68 65 20 69 6e  string of the in
18cf0 64 65 78 20 61 6c 6c 6f 63 61 74 65 64 20 75 73  dex allocated us
18d00 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 44 62  ing.** sqlite3Db
18d10 4d 61 6c 6c 6f 63 28 29 2e 20 45 78 63 65 70 74  Malloc(). Except
18d20 2c 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65  , entries in the
18d30 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73 74 72   copy of the str
18d40 69 6e 67 20 61 73 73 6f 63 69 61 74 65 64 0a 2a  ing associated.*
18d50 2a 20 77 69 74 68 20 65 71 75 61 6c 69 74 79 20  * with equality 
18d60 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 68 61 74  constraints that
18d70 20 75 73 65 20 4e 4f 4e 45 20 61 66 66 69 6e 69   use NONE affini
18d80 74 79 20 61 72 65 20 73 65 74 20 74 6f 0a 2a 2a  ty are set to.**
18d90 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45   SQLITE_AFF_NONE
18da0 2e 20 54 68 69 73 20 69 73 20 74 6f 20 64 65 61  . This is to dea
18db0 6c 20 77 69 74 68 20 53 51 4c 20 73 75 63 68 20  l with SQL such 
18dc0 61 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  as the following
18dd0 3a 0a 2a 2a 0a 2a 2a 20 20 20 43 52 45 41 54 45  :.**.**   CREATE
18de0 20 54 41 42 4c 45 20 74 31 28 61 20 54 45 58 54   TABLE t1(a TEXT
18df0 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 29   PRIMARY KEY, b)
18e00 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 2e 2e  ;.**   SELECT ..
18e10 2e 20 46 52 4f 4d 20 74 31 20 41 53 20 74 32 2c  . FROM t1 AS t2,
18e20 20 74 31 20 57 48 45 52 45 20 74 31 2e 61 20 3d   t1 WHERE t1.a =
18e30 20 74 32 2e 62 3b 0a 2a 2a 0a 2a 2a 20 49 6e 20   t2.b;.**.** In 
18e40 74 68 65 20 65 78 61 6d 70 6c 65 20 61 62 6f 76  the example abov
18e50 65 2c 20 74 68 65 20 69 6e 64 65 78 20 6f 6e 20  e, the index on 
18e60 74 31 28 61 29 20 68 61 73 20 54 45 58 54 20 61  t1(a) has TEXT a
18e70 66 66 69 6e 69 74 79 2e 20 42 75 74 20 73 69 6e  ffinity. But sin
18e80 63 65 0a 2a 2a 20 74 68 65 20 72 69 67 68 74 20  ce.** the right 
18e90 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65  hand side of the
18ea0 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72   equality constr
18eb0 61 69 6e 74 20 28 74 32 2e 62 29 20 68 61 73 20  aint (t2.b) has 
18ec0 4e 4f 4e 45 20 61 66 66 69 6e 69 74 79 2c 0a 2a  NONE affinity,.*
18ed0 2a 20 6e 6f 20 63 6f 6e 76 65 72 73 69 6f 6e 20  * no conversion 
18ee0 73 68 6f 75 6c 64 20 62 65 20 61 74 74 65 6d 70  should be attemp
18ef0 74 65 64 20 62 65 66 6f 72 65 20 75 73 69 6e 67  ted before using
18f00 20 61 20 74 32 2e 62 20 76 61 6c 75 65 20 61 73   a t2.b value as
18f10 20 70 61 72 74 20 6f 66 0a 2a 2a 20 61 20 6b 65   part of.** a ke
18f20 79 20 74 6f 20 73 65 61 72 63 68 20 74 68 65 20  y to search the 
18f30 69 6e 64 65 78 2e 20 48 65 6e 63 65 20 74 68 65  index. Hence the
18f40 20 66 69 72 73 74 20 62 79 74 65 20 69 6e 20 74   first byte in t
18f50 68 65 20 72 65 74 75 72 6e 65 64 20 61 66 66 69  he returned affi
18f60 6e 69 74 79 0a 2a 2a 20 73 74 72 69 6e 67 20 69  nity.** string i
18f70 6e 20 74 68 69 73 20 65 78 61 6d 70 6c 65 20 77  n this example w
18f80 6f 75 6c 64 20 62 65 20 73 65 74 20 74 6f 20 53  ould be set to S
18f90 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 2e 0a  QLITE_AFF_NONE..
18fa0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f  */.static int co
18fb0 64 65 41 6c 6c 45 71 75 61 6c 69 74 79 54 65 72  deAllEqualityTer
18fc0 6d 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ms(.  Parse *pPa
18fd0 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  rse,        /* P
18fe0 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
18ff0 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a  /.  WhereLevel *
19000 70 4c 65 76 65 6c 2c 20 20 20 2f 2a 20 57 68 69  pLevel,   /* Whi
19010 63 68 20 6e 65 73 74 65 64 20 6c 6f 6f 70 20 6f  ch nested loop o
19020 66 20 74 68 65 20 46 52 4f 4d 20 77 65 20 61 72  f the FROM we ar
19030 65 20 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 69 6e  e coding */.  in
19040 74 20 62 52 65 76 2c 20 20 20 20 20 20 20 20 20  t bRev,         
19050 20 20 20 20 2f 2a 20 52 65 76 65 72 73 65 20 74      /* Reverse t
19060 68 65 20 6f 72 64 65 72 20 6f 66 20 49 4e 20 6f  he order of IN o
19070 70 65 72 61 74 6f 72 73 20 2a 2f 0a 20 20 69 6e  perators */.  in
19080 74 20 6e 45 78 74 72 61 52 65 67 2c 20 20 20 20  t nExtraReg,    
19090 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
190a0 20 65 78 74 72 61 20 72 65 67 69 73 74 65 72 73   extra registers
190b0 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a   to allocate */.
190c0 20 20 63 68 61 72 20 2a 2a 70 7a 41 66 66 20 20    char **pzAff  
190d0 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
190e0 53 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  Set to point to 
190f0 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20  affinity string 
19100 2a 2f 0a 29 7b 0a 20 20 75 31 36 20 6e 45 71 3b  */.){.  u16 nEq;
19110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19120 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d        /* The num
19130 62 65 72 20 6f 66 20 3d 3d 20 6f 72 20 49 4e 20  ber of == or IN 
19140 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f 20 63  constraints to c
19150 6f 64 65 20 2a 2f 0a 20 20 75 31 36 20 6e 53 6b  ode */.  u16 nSk
19160 69 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ip;             
19170 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
19180 20 6f 66 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f   of left-most co
19190 6c 75 6d 6e 73 20 74 6f 20 73 6b 69 70 20 2a 2f  lumns to skip */
191a0 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
191b0 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 20 20  rse->pVdbe;     
191c0 20 2f 2a 20 54 68 65 20 76 6d 20 75 6e 64 65 72   /* The vm under
191d0 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f   construction */
191e0 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20  .  Index *pIdx; 
191f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19200 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 62 65   /* The index be
19210 69 6e 67 20 75 73 65 64 20 66 6f 72 20 74 68 69  ing used for thi
19220 73 20 6c 6f 6f 70 20 2a 2f 0a 20 20 57 68 65 72  s loop */.  Wher
19230 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20  eTerm *pTerm;   
19240 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73            /* A s
19250 69 6e 67 6c 65 20 63 6f 6e 73 74 72 61 69 6e 74  ingle constraint
19260 20 74 65 72 6d 20 2a 2f 0a 20 20 57 68 65 72 65   term */.  Where
19270 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20 20 20  Loop *pLoop;    
19280 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
19290 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
192a0 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b 20 20 20 20   */.  int j;    
192b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
192c0 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
192d0 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  ter */.  int reg
192e0 42 61 73 65 3b 20 20 20 20 20 20 20 20 20 20 20  Base;           
192f0 20 20 20 20 20 20 20 2f 2a 20 42 61 73 65 20 72         /* Base r
19300 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74  egister */.  int
19310 20 6e 52 65 67 3b 20 20 20 20 20 20 20 20 20 20   nReg;          
19320 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
19330 6d 62 65 72 20 6f 66 20 72 65 67 69 73 74 65 72  mber of register
19340 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f  s to allocate */
19350 0a 20 20 63 68 61 72 20 2a 7a 41 66 66 3b 20 20  .  char *zAff;  
19360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19370 20 2f 2a 20 41 66 66 69 6e 69 74 79 20 73 74 72   /* Affinity str
19380 69 6e 67 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f  ing to return */
19390 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6d 6f 64 75  ..  /* This modu
193a0 6c 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65  le is only calle
193b0 64 20 6f 6e 20 71 75 65 72 79 20 70 6c 61 6e 73  d on query plans
193c0 20 74 68 61 74 20 75 73 65 20 61 6e 20 69 6e 64   that use an ind
193d0 65 78 2e 20 2a 2f 0a 20 20 70 4c 6f 6f 70 20 3d  ex. */.  pLoop =
193e0 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b   pLevel->pWLoop;
193f0 0a 20 20 61 73 73 65 72 74 28 20 28 70 4c 6f 6f  .  assert( (pLoo
19400 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
19410 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  RE_VIRTUALTABLE)
19420 3d 3d 30 20 29 3b 0a 20 20 6e 45 71 20 3d 20 70  ==0 );.  nEq = p
19430 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  Loop->u.btree.nE
19440 71 3b 0a 20 20 6e 53 6b 69 70 20 3d 20 70 4c 6f  q;.  nSkip = pLo
19450 6f 70 2d 3e 6e 53 6b 69 70 3b 0a 20 20 70 49 64  op->nSkip;.  pId
19460 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72  x = pLoop->u.btr
19470 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 61 73 73  ee.pIndex;.  ass
19480 65 72 74 28 20 70 49 64 78 21 3d 30 20 29 3b 0a  ert( pIdx!=0 );.
19490 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74  .  /* Figure out
194a0 20 68 6f 77 20 6d 61 6e 79 20 6d 65 6d 6f 72 79   how many memory
194b0 20 63 65 6c 6c 73 20 77 65 20 77 69 6c 6c 20 6e   cells we will n
194c0 65 65 64 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74  eed then allocat
194d0 65 20 74 68 65 6d 2e 0a 20 20 2a 2f 0a 20 20 72  e them..  */.  r
194e0 65 67 42 61 73 65 20 3d 20 70 50 61 72 73 65 2d  egBase = pParse-
194f0 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 6e 52 65  >nMem + 1;.  nRe
19500 67 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72  g = pLoop->u.btr
19510 65 65 2e 6e 45 71 20 2b 20 6e 45 78 74 72 61 52  ee.nEq + nExtraR
19520 65 67 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4d  eg;.  pParse->nM
19530 65 6d 20 2b 3d 20 6e 52 65 67 3b 0a 0a 20 20 7a  em += nReg;..  z
19540 41 66 66 20 3d 20 73 71 6c 69 74 65 33 44 62 53  Aff = sqlite3DbS
19550 74 72 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62  trDup(pParse->db
19560 2c 20 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66  , sqlite3IndexAf
19570 66 69 6e 69 74 79 53 74 72 28 76 2c 20 70 49 64  finityStr(v, pId
19580 78 29 29 3b 0a 20 20 69 66 28 20 21 7a 41 66 66  x));.  if( !zAff
19590 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   ){.    pParse->
195a0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
195b0 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 69 66 28   = 1;.  }..  if(
195c0 20 6e 53 6b 69 70 20 29 7b 0a 20 20 20 20 69 6e   nSkip ){.    in
195d0 74 20 69 49 64 78 43 75 72 20 3d 20 70 4c 65 76  t iIdxCur = pLev
195e0 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20 20  el->iIdxCur;.   
195f0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
19600 70 31 28 76 2c 20 28 62 52 65 76 3f 4f 50 5f 4c  p1(v, (bRev?OP_L
19610 61 73 74 3a 4f 50 5f 52 65 77 69 6e 64 29 2c 20  ast:OP_Rewind), 
19620 69 49 64 78 43 75 72 29 3b 0a 20 20 20 20 56 64  iIdxCur);.    Vd
19630 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
19640 62 52 65 76 3d 3d 30 29 3b 0a 20 20 20 20 56 64  bRev==0);.    Vd
19650 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
19660 62 52 65 76 21 3d 30 29 3b 0a 20 20 20 20 56 64  bRev!=0);.    Vd
19670 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 62  beComment((v, "b
19680 65 67 69 6e 20 73 6b 69 70 2d 73 63 61 6e 20 6f  egin skip-scan o
19690 6e 20 25 73 22 2c 20 70 49 64 78 2d 3e 7a 4e 61  n %s", pIdx->zNa
196a0 6d 65 29 29 3b 0a 20 20 20 20 6a 20 3d 20 73 71  me));.    j = sq
196b0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28  lite3VdbeAddOp0(
196c0 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20 20  v, OP_Goto);.   
196d0 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 53 6b 69   pLevel->addrSki
196e0 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  p = sqlite3VdbeA
196f0 64 64 4f 70 34 49 6e 74 28 76 2c 20 28 62 52 65  ddOp4Int(v, (bRe
19700 76 3f 4f 50 5f 53 65 65 6b 4c 54 3a 4f 50 5f 53  v?OP_SeekLT:OP_S
19710 65 65 6b 47 54 29 2c 0a 20 20 20 20 20 20 20 20  eekGT),.        
19720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19730 20 20 20 20 69 49 64 78 43 75 72 2c 20 30 2c 20      iIdxCur, 0, 
19740 72 65 67 42 61 73 65 2c 20 6e 53 6b 69 70 29 3b  regBase, nSkip);
19750 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67  .    VdbeCoverag
19760 65 49 66 28 76 2c 20 62 52 65 76 3d 3d 30 29 3b  eIf(v, bRev==0);
19770 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67  .    VdbeCoverag
19780 65 49 66 28 76 2c 20 62 52 65 76 21 3d 30 29 3b  eIf(v, bRev!=0);
19790 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
197a0 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 29 3b 0a  JumpHere(v, j);.
197b0 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e      for(j=0; j<n
197c0 53 6b 69 70 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  Skip; j++){.    
197d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
197e0 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  Op3(v, OP_Column
197f0 2c 20 69 49 64 78 43 75 72 2c 20 6a 2c 20 72 65  , iIdxCur, j, re
19800 67 42 61 73 65 2b 6a 29 3b 0a 20 20 20 20 20 20  gBase+j);.      
19810 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 61 69  assert( pIdx->ai
19820 43 6f 6c 75 6d 6e 5b 6a 5d 3e 3d 30 20 29 3b 0a  Column[j]>=0 );.
19830 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
19840 74 28 28 76 2c 20 22 25 73 22 2c 20 70 49 64 78  t((v, "%s", pIdx
19850 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 70  ->pTable->aCol[p
19860 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d  Idx->aiColumn[j]
19870 5d 2e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 7d  ].zName));.    }
19880 0a 20 20 7d 20 20 20 20 0a 0a 20 20 2f 2a 20 45  .  }    ..  /* E
19890 76 61 6c 75 61 74 65 20 74 68 65 20 65 71 75 61  valuate the equa
198a0 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73  lity constraints
198b0 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
198c0 7a 41 66 66 3d 3d 30 20 7c 7c 20 28 69 6e 74 29  zAff==0 || (int)
198d0 73 74 72 6c 65 6e 28 7a 41 66 66 29 3e 3d 6e 45  strlen(zAff)>=nE
198e0 71 20 29 3b 0a 20 20 66 6f 72 28 6a 3d 6e 53 6b  q );.  for(j=nSk
198f0 69 70 3b 20 6a 3c 6e 45 71 3b 20 6a 2b 2b 29 7b  ip; j<nEq; j++){
19900 0a 20 20 20 20 69 6e 74 20 72 31 3b 0a 20 20 20  .    int r1;.   
19910 20 70 54 65 72 6d 20 3d 20 70 4c 6f 6f 70 2d 3e   pTerm = pLoop->
19920 61 4c 54 65 72 6d 5b 6a 5d 3b 0a 20 20 20 20 61  aLTerm[j];.    a
19930 73 73 65 72 74 28 20 70 54 65 72 6d 21 3d 30 20  ssert( pTerm!=0 
19940 29 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 6f  );.    /* The fo
19950 6c 6c 6f 77 69 6e 67 20 74 65 73 74 63 61 73 65  llowing testcase
19960 20 69 73 20 74 72 75 65 20 66 6f 72 20 69 6e 64   is true for ind
19970 69 63 65 73 20 77 69 74 68 20 72 65 64 75 6e 64  ices with redund
19980 61 6e 74 20 63 6f 6c 75 6d 6e 73 2e 20 0a 20 20  ant columns. .  
19990 20 20 2a 2a 20 45 78 3a 20 43 52 45 41 54 45 20    ** Ex: CREATE 
199a0 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31 28 61  INDEX i1 ON t1(a
199b0 2c 62 2c 61 29 3b 20 53 45 4c 45 43 54 20 2a 20  ,b,a); SELECT * 
199c0 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3d  FROM t1 WHERE a=
199d0 30 20 41 4e 44 20 62 3d 30 3b 20 2a 2f 0a 20 20  0 AND b=0; */.  
199e0 20 20 74 65 73 74 63 61 73 65 28 20 28 70 54 65    testcase( (pTe
199f0 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
19a00 52 4d 5f 43 4f 44 45 44 29 21 3d 30 20 29 3b 0a  RM_CODED)!=0 );.
19a10 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
19a20 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  erm->wtFlags & T
19a30 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20  ERM_VIRTUAL );. 
19a40 20 20 20 72 31 20 3d 20 63 6f 64 65 45 71 75 61     r1 = codeEqua
19a50 6c 69 74 79 54 65 72 6d 28 70 50 61 72 73 65 2c  lityTerm(pParse,
19a60 20 70 54 65 72 6d 2c 20 70 4c 65 76 65 6c 2c 20   pTerm, pLevel, 
19a70 6a 2c 20 62 52 65 76 2c 20 72 65 67 42 61 73 65  j, bRev, regBase
19a80 2b 6a 29 3b 0a 20 20 20 20 69 66 28 20 72 31 21  +j);.    if( r1!
19a90 3d 72 65 67 42 61 73 65 2b 6a 20 29 7b 0a 20 20  =regBase+j ){.  
19aa0 20 20 20 20 69 66 28 20 6e 52 65 67 3d 3d 31 20      if( nReg==1 
19ab0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
19ac0 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
19ad0 28 70 50 61 72 73 65 2c 20 72 65 67 42 61 73 65  (pParse, regBase
19ae0 29 3b 0a 20 20 20 20 20 20 20 20 72 65 67 42 61  );.        regBa
19af0 73 65 20 3d 20 72 31 3b 0a 20 20 20 20 20 20 7d  se = r1;.      }
19b00 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
19b10 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
19b20 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 72 31 2c  v, OP_SCopy, r1,
19b30 20 72 65 67 42 61 73 65 2b 6a 29 3b 0a 20 20 20   regBase+j);.   
19b40 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 74     }.    }.    t
19b50 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
19b60 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49  eOperator & WO_I
19b70 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 74 65 73  SNULL );.    tes
19b80 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f  tcase( pTerm->eO
19b90 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20  perator & WO_IN 
19ba0 29 3b 0a 20 20 20 20 69 66 28 20 28 70 54 65 72  );.    if( (pTer
19bb0 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28  m->eOperator & (
19bc0 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 49 4e 29  WO_ISNULL|WO_IN)
19bd0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 45 78  )==0 ){.      Ex
19be0 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70 54 65  pr *pRight = pTe
19bf0 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68  rm->pExpr->pRigh
19c00 74 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  t;.      if( sql
19c10 69 74 65 33 45 78 70 72 43 61 6e 42 65 4e 75 6c  ite3ExprCanBeNul
19c20 6c 28 70 52 69 67 68 74 29 20 29 7b 0a 20 20 20  l(pRight) ){.   
19c30 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
19c40 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e  AddOp2(v, OP_IsN
19c50 75 6c 6c 2c 20 72 65 67 42 61 73 65 2b 6a 2c 20  ull, regBase+j, 
19c60 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b 29  pLevel->addrBrk)
19c70 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
19c80 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
19c90 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 41 66   }.      if( zAf
19ca0 66 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  f ){.        if(
19cb0 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41   sqlite3CompareA
19cc0 66 66 69 6e 69 74 79 28 70 52 69 67 68 74 2c 20  ffinity(pRight, 
19cd0 7a 41 66 66 5b 6a 5d 29 3d 3d 53 51 4c 49 54 45  zAff[j])==SQLITE
19ce0 5f 41 46 46 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20  _AFF_NONE ){.   
19cf0 20 20 20 20 20 20 20 7a 41 66 66 5b 6a 5d 20 3d         zAff[j] =
19d00 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45   SQLITE_AFF_NONE
19d10 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
19d20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
19d30 78 70 72 4e 65 65 64 73 4e 6f 41 66 66 69 6e 69  xprNeedsNoAffini
19d40 74 79 43 68 61 6e 67 65 28 70 52 69 67 68 74 2c  tyChange(pRight,
19d50 20 7a 41 66 66 5b 6a 5d 29 20 29 7b 0a 20 20 20   zAff[j]) ){.   
19d60 20 20 20 20 20 20 20 7a 41 66 66 5b 6a 5d 20 3d         zAff[j] =
19d70 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45   SQLITE_AFF_NONE
19d80 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
19d90 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
19da0 2a 70 7a 41 66 66 20 3d 20 7a 41 66 66 3b 0a 20  *pzAff = zAff;. 
19db0 20 72 65 74 75 72 6e 20 72 65 67 42 61 73 65 3b   return regBase;
19dc0 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
19dd0 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a  TE_OMIT_EXPLAIN.
19de0 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
19df0 6e 65 20 69 73 20 61 20 68 65 6c 70 65 72 20 66  ne is a helper f
19e00 6f 72 20 65 78 70 6c 61 69 6e 49 6e 64 65 78 52  or explainIndexR
19e10 61 6e 67 65 28 29 20 62 65 6c 6f 77 0a 2a 2a 0a  ange() below.**.
19e20 2a 2a 20 70 53 74 72 20 68 6f 6c 64 73 20 74 68  ** pStr holds th
19e30 65 20 74 65 78 74 20 6f 66 20 61 6e 20 65 78 70  e text of an exp
19e40 72 65 73 73 69 6f 6e 20 74 68 61 74 20 77 65 20  ression that we 
19e50 61 72 65 20 62 75 69 6c 64 69 6e 67 20 75 70 20  are building up 
19e60 6f 6e 65 20 74 65 72 6d 0a 2a 2a 20 61 74 20 61  one term.** at a
19e70 20 74 69 6d 65 2e 20 20 54 68 69 73 20 72 6f 75   time.  This rou
19e80 74 69 6e 65 20 61 64 64 73 20 61 20 6e 65 77 20  tine adds a new 
19e90 74 65 72 6d 20 74 6f 20 74 68 65 20 65 6e 64 20  term to the end 
19ea0 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  of the expressio
19eb0 6e 2e 0a 2a 2a 20 54 65 72 6d 73 20 61 72 65 20  n..** Terms are 
19ec0 73 65 70 61 72 61 74 65 64 20 62 79 20 41 4e 44  separated by AND
19ed0 20 73 6f 20 61 64 64 20 74 68 65 20 22 41 4e 44   so add the "AND
19ee0 22 20 74 65 78 74 20 66 6f 72 20 73 65 63 6f 6e  " text for secon
19ef0 64 20 61 6e 64 20 73 75 62 73 65 71 75 65 6e 74  d and subsequent
19f00 0a 2a 2a 20 74 65 72 6d 73 20 6f 6e 6c 79 2e 0a  .** terms only..
19f10 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
19f20 78 70 6c 61 69 6e 41 70 70 65 6e 64 54 65 72 6d  xplainAppendTerm
19f30 28 0a 20 20 53 74 72 41 63 63 75 6d 20 2a 70 53  (.  StrAccum *pS
19f40 74 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  tr,             
19f50 2f 2a 20 54 68 65 20 74 65 78 74 20 65 78 70 72  /* The text expr
19f60 65 73 73 69 6f 6e 20 62 65 69 6e 67 20 62 75 69  ession being bui
19f70 6c 74 20 2a 2f 0a 20 20 69 6e 74 20 69 54 65 72  lt */.  int iTer
19f80 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m,              
19f90 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
19fa0 74 68 69 73 20 74 65 72 6d 2e 20 20 46 69 72 73  this term.  Firs
19fb0 74 20 69 73 20 7a 65 72 6f 20 2a 2f 0a 20 20 63  t is zero */.  c
19fc0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 75  onst char *zColu
19fd0 6d 6e 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 61  mn,        /* Na
19fe0 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  me of the column
19ff0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
1a000 20 2a 7a 4f 70 20 20 20 20 20 20 20 20 20 20 20   *zOp           
1a010 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
1a020 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 29 7b 0a   operator */.){.
1a030 20 20 69 66 28 20 69 54 65 72 6d 20 29 20 73 71    if( iTerm ) sq
1a040 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70  lite3StrAccumApp
1a050 65 6e 64 28 70 53 74 72 2c 20 22 20 41 4e 44 20  end(pStr, " AND 
1a060 22 2c 20 35 29 3b 0a 20 20 73 71 6c 69 74 65 33  ", 5);.  sqlite3
1a070 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 41 6c  StrAccumAppendAl
1a080 6c 28 70 53 74 72 2c 20 7a 43 6f 6c 75 6d 6e 29  l(pStr, zColumn)
1a090 3b 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41 63  ;.  sqlite3StrAc
1a0a0 63 75 6d 41 70 70 65 6e 64 28 70 53 74 72 2c 20  cumAppend(pStr, 
1a0b0 7a 4f 70 2c 20 31 29 3b 0a 20 20 73 71 6c 69 74  zOp, 1);.  sqlit
1a0c0 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64  e3StrAccumAppend
1a0d0 28 70 53 74 72 2c 20 22 3f 22 2c 20 31 29 3b 0a  (pStr, "?", 1);.
1a0e0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e  }../*.** Argumen
1a0f0 74 20 70 4c 65 76 65 6c 20 64 65 73 63 72 69 62  t pLevel describ
1a100 65 73 20 61 20 73 74 72 61 74 65 67 79 20 66 6f  es a strategy fo
1a110 72 20 73 63 61 6e 6e 69 6e 67 20 74 61 62 6c 65  r scanning table
1a120 20 70 54 61 62 2e 20 54 68 69 73 20 0a 2a 2a 20   pTab. This .** 
1a130 66 75 6e 63 74 69 6f 6e 20 61 70 70 65 6e 64 73  function appends
1a140 20 74 65 78 74 20 74 6f 20 70 53 74 72 20 74 68   text to pStr th
1a150 61 74 20 64 65 73 63 72 69 62 65 73 20 74 68 65  at describes the
1a160 20 73 75 62 73 65 74 20 6f 66 20 74 61 62 6c 65   subset of table
1a170 0a 2a 2a 20 72 6f 77 73 20 73 63 61 6e 6e 65 64  .** rows scanned
1a180 20 62 79 20 74 68 65 20 73 74 72 61 74 65 67 79   by the strategy
1a190 20 69 6e 20 74 68 65 20 66 6f 72 6d 20 6f 66 20   in the form of 
1a1a0 61 6e 20 53 51 4c 20 65 78 70 72 65 73 73 69 6f  an SQL expressio
1a1b0 6e 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61  n..**.** For exa
1a1c0 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 71 75 65  mple, if the que
1a1d0 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45  ry:.**.**   SELE
1a1e0 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45  CT * FROM t1 WHE
1a1f0 52 45 20 61 3d 31 20 41 4e 44 20 62 3e 32 3b 0a  RE a=1 AND b>2;.
1a200 2a 2a 0a 2a 2a 20 69 73 20 72 75 6e 20 61 6e 64  **.** is run and
1a210 20 74 68 65 72 65 20 69 73 20 61 6e 20 69 6e 64   there is an ind
1a220 65 78 20 6f 6e 20 28 61 2c 20 62 29 2c 20 74 68  ex on (a, b), th
1a230 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
1a240 20 72 65 74 75 72 6e 73 20 61 0a 2a 2a 20 73 74   returns a.** st
1a250 72 69 6e 67 20 73 69 6d 69 6c 61 72 20 74 6f 3a  ring similar to:
1a260 0a 2a 2a 0a 2a 2a 20 20 20 22 61 3d 3f 20 41 4e  .**.**   "a=? AN
1a270 44 20 62 3e 3f 22 0a 2a 2f 0a 73 74 61 74 69 63  D b>?".*/.static
1a280 20 76 6f 69 64 20 65 78 70 6c 61 69 6e 49 6e 64   void explainInd
1a290 65 78 52 61 6e 67 65 28 53 74 72 41 63 63 75 6d  exRange(StrAccum
1a2a0 20 2a 70 53 74 72 2c 20 57 68 65 72 65 4c 6f 6f   *pStr, WhereLoo
1a2b0 70 20 2a 70 4c 6f 6f 70 2c 20 54 61 62 6c 65 20  p *pLoop, Table 
1a2c0 2a 70 54 61 62 29 7b 0a 20 20 49 6e 64 65 78 20  *pTab){.  Index 
1a2d0 2a 70 49 6e 64 65 78 20 3d 20 70 4c 6f 6f 70 2d  *pIndex = pLoop-
1a2e0 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b  >u.btree.pIndex;
1a2f0 0a 20 20 75 31 36 20 6e 45 71 20 3d 20 70 4c 6f  .  u16 nEq = pLo
1a300 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b  op->u.btree.nEq;
1a310 0a 20 20 75 31 36 20 6e 53 6b 69 70 20 3d 20 70  .  u16 nSkip = p
1a320 4c 6f 6f 70 2d 3e 6e 53 6b 69 70 3b 0a 20 20 69  Loop->nSkip;.  i
1a330 6e 74 20 69 2c 20 6a 3b 0a 20 20 43 6f 6c 75 6d  nt i, j;.  Colum
1a340 6e 20 2a 61 43 6f 6c 20 3d 20 70 54 61 62 2d 3e  n *aCol = pTab->
1a350 61 43 6f 6c 3b 0a 20 20 69 31 36 20 2a 61 69 43  aCol;.  i16 *aiC
1a360 6f 6c 75 6d 6e 20 3d 20 70 49 6e 64 65 78 2d 3e  olumn = pIndex->
1a370 61 69 43 6f 6c 75 6d 6e 3b 0a 0a 20 20 69 66 28  aiColumn;..  if(
1a380 20 6e 45 71 3d 3d 30 20 26 26 20 28 70 4c 6f 6f   nEq==0 && (pLoo
1a390 70 2d 3e 77 73 46 6c 61 67 73 26 28 57 48 45 52  p->wsFlags&(WHER
1a3a0 45 5f 42 54 4d 5f 4c 49 4d 49 54 7c 57 48 45 52  E_BTM_LIMIT|WHER
1a3b0 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 29 3d 3d 30  E_TOP_LIMIT))==0
1a3c0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c   ) return;.  sql
1a3d0 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65  ite3StrAccumAppe
1a3e0 6e 64 28 70 53 74 72 2c 20 22 20 28 22 2c 20 32  nd(pStr, " (", 2
1a3f0 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
1a400 6e 45 71 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63  nEq; i++){.    c
1a410 68 61 72 20 2a 7a 20 3d 20 61 69 43 6f 6c 75 6d  har *z = aiColum
1a420 6e 5b 69 5d 20 3c 20 30 20 3f 20 22 72 6f 77 69  n[i] < 0 ? "rowi
1a430 64 22 20 3a 20 61 43 6f 6c 5b 61 69 43 6f 6c 75  d" : aCol[aiColu
1a440 6d 6e 5b 69 5d 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  mn[i]].zName;.  
1a450 20 20 69 66 28 20 69 3e 3d 6e 53 6b 69 70 20 29    if( i>=nSkip )
1a460 7b 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e 41  {.      explainA
1a470 70 70 65 6e 64 54 65 72 6d 28 70 53 74 72 2c 20  ppendTerm(pStr, 
1a480 69 2c 20 7a 2c 20 22 3d 22 29 3b 0a 20 20 20 20  i, z, "=");.    
1a490 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28  }else{.      if(
1a4a0 20 69 20 29 20 73 71 6c 69 74 65 33 53 74 72 41   i ) sqlite3StrA
1a4b0 63 63 75 6d 41 70 70 65 6e 64 28 70 53 74 72 2c  ccumAppend(pStr,
1a4c0 20 22 20 41 4e 44 20 22 2c 20 35 29 3b 0a 20 20   " AND ", 5);.  
1a4d0 20 20 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e      sqlite3XPrin
1a4e0 74 66 28 70 53 74 72 2c 20 30 2c 20 22 41 4e 59  tf(pStr, 0, "ANY
1a4f0 28 25 73 29 22 2c 20 7a 29 3b 0a 20 20 20 20 7d  (%s)", z);.    }
1a500 0a 20 20 7d 0a 0a 20 20 6a 20 3d 20 69 3b 0a 20  .  }..  j = i;. 
1a510 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c   if( pLoop->wsFl
1a520 61 67 73 26 57 48 45 52 45 5f 42 54 4d 5f 4c 49  ags&WHERE_BTM_LI
1a530 4d 49 54 20 29 7b 0a 20 20 20 20 63 68 61 72 20  MIT ){.    char 
1a540 2a 7a 20 3d 20 61 69 43 6f 6c 75 6d 6e 5b 6a 5d  *z = aiColumn[j]
1a550 20 3c 20 30 20 3f 20 22 72 6f 77 69 64 22 20 3a   < 0 ? "rowid" :
1a560 20 61 43 6f 6c 5b 61 69 43 6f 6c 75 6d 6e 5b 6a   aCol[aiColumn[j
1a570 5d 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 65 78  ]].zName;.    ex
1a580 70 6c 61 69 6e 41 70 70 65 6e 64 54 65 72 6d 28  plainAppendTerm(
1a590 70 53 74 72 2c 20 69 2b 2b 2c 20 7a 2c 20 22 3e  pStr, i++, z, ">
1a5a0 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c  ");.  }.  if( pL
1a5b0 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 26 57 48 45  oop->wsFlags&WHE
1a5c0 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20 29 7b 0a  RE_TOP_LIMIT ){.
1a5d0 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 61 69      char *z = ai
1a5e0 43 6f 6c 75 6d 6e 5b 6a 5d 20 3c 20 30 20 3f 20  Column[j] < 0 ? 
1a5f0 22 72 6f 77 69 64 22 20 3a 20 61 43 6f 6c 5b 61  "rowid" : aCol[a
1a600 69 43 6f 6c 75 6d 6e 5b 6a 5d 5d 2e 7a 4e 61 6d  iColumn[j]].zNam
1a610 65 3b 0a 20 20 20 20 65 78 70 6c 61 69 6e 41 70  e;.    explainAp
1a620 70 65 6e 64 54 65 72 6d 28 70 53 74 72 2c 20 69  pendTerm(pStr, i
1a630 2c 20 7a 2c 20 22 3c 22 29 3b 0a 20 20 7d 0a 20  , z, "<");.  }. 
1a640 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
1a650 41 70 70 65 6e 64 28 70 53 74 72 2c 20 22 29 22  Append(pStr, ")"
1a660 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  , 1);.}../*.** T
1a670 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1a680 61 20 6e 6f 2d 6f 70 20 75 6e 6c 65 73 73 20 63  a no-op unless c
1a690 75 72 72 65 6e 74 6c 79 20 70 72 6f 63 65 73 73  urrently process
1a6a0 69 6e 67 20 61 6e 20 45 58 50 4c 41 49 4e 20 51  ing an EXPLAIN Q
1a6b0 55 45 52 59 20 50 4c 41 4e 0a 2a 2a 20 63 6f 6d  UERY PLAN.** com
1a6c0 6d 61 6e 64 2c 20 6f 72 20 69 66 20 65 69 74 68  mand, or if eith
1a6d0 65 72 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  er SQLITE_DEBUG 
1a6e0 6f 72 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  or SQLITE_ENABLE
1a6f0 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41 54 55 53  _STMT_SCANSTATUS
1a700 20 77 61 73 0a 2a 2a 20 64 65 66 69 6e 65 64 20   was.** defined 
1a710 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 2e  at compile-time.
1a720 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 61 20   If it is not a 
1a730 6e 6f 2d 6f 70 2c 20 61 20 73 69 6e 67 6c 65 20  no-op, a single 
1a740 4f 50 5f 45 78 70 6c 61 69 6e 20 6f 70 63 6f 64  OP_Explain opcod
1a750 65 20 0a 2a 2a 20 69 73 20 61 64 64 65 64 20 74  e .** is added t
1a760 6f 20 74 68 65 20 6f 75 74 70 75 74 20 74 6f 20  o the output to 
1a770 64 65 73 63 72 69 62 65 20 74 68 65 20 74 61 62  describe the tab
1a780 6c 65 20 73 63 61 6e 20 73 74 72 61 74 65 67 79  le scan strategy
1a790 20 69 6e 20 70 4c 65 76 65 6c 2e 0a 2a 2a 0a 2a   in pLevel..**.*
1a7a0 2a 20 49 66 20 61 6e 20 4f 50 5f 45 78 70 6c 61  * If an OP_Expla
1a7b0 69 6e 20 6f 70 63 6f 64 65 20 69 73 20 61 64 64  in opcode is add
1a7c0 65 64 20 74 6f 20 74 68 65 20 56 4d 2c 20 69 74  ed to the VM, it
1a7d0 73 20 61 64 64 72 65 73 73 20 69 73 20 72 65 74  s address is ret
1a7e0 75 72 6e 65 64 2e 0a 2a 2a 20 4f 74 68 65 72 77  urned..** Otherw
1a7f0 69 73 65 2c 20 69 66 20 6e 6f 20 4f 50 5f 45 78  ise, if no OP_Ex
1a800 70 6c 61 69 6e 20 69 73 20 63 6f 64 65 64 2c 20  plain is coded, 
1a810 7a 65 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64  zero is returned
1a820 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1a830 65 78 70 6c 61 69 6e 4f 6e 65 53 63 61 6e 28 0a  explainOneScan(.
1a840 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
1a850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a860 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65    /* Parse conte
1a870 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  xt */.  SrcList 
1a880 2a 70 54 61 62 4c 69 73 74 2c 20 20 20 20 20 20  *pTabList,      
1a890 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
1a8a0 20 6c 69 73 74 20 74 68 69 73 20 6c 6f 6f 70 20   list this loop 
1a8b0 72 65 66 65 72 73 20 74 6f 20 2a 2f 0a 20 20 57  refers to */.  W
1a8c0 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65  hereLevel *pLeve
1a8d0 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  l,             /
1a8e0 2a 20 53 63 61 6e 20 74 6f 20 77 72 69 74 65 20  * Scan to write 
1a8f0 4f 50 5f 45 78 70 6c 61 69 6e 20 6f 70 63 6f 64  OP_Explain opcod
1a900 65 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69  e for */.  int i
1a910 4c 65 76 65 6c 2c 20 20 20 20 20 20 20 20 20 20  Level,          
1a920 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
1a930 6c 75 65 20 66 6f 72 20 22 6c 65 76 65 6c 22 20  lue for "level" 
1a940 63 6f 6c 75 6d 6e 20 6f 66 20 6f 75 74 70 75 74  column of output
1a950 20 2a 2f 0a 20 20 69 6e 74 20 69 46 72 6f 6d 2c   */.  int iFrom,
1a960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a970 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 66        /* Value f
1a980 6f 72 20 22 66 72 6f 6d 22 20 63 6f 6c 75 6d 6e  or "from" column
1a990 20 6f 66 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20   of output */.  
1a9a0 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73 20 20  u16 wctrlFlags  
1a9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a9c0 2f 2a 20 46 6c 61 67 73 20 70 61 73 73 65 64 20  /* Flags passed 
1a9d0 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  to sqlite3WhereB
1a9e0 65 67 69 6e 28 29 20 2a 2f 0a 29 7b 0a 20 20 69  egin() */.){.  i
1a9f0 6e 74 20 72 65 74 20 3d 20 30 3b 0a 23 69 66 20  nt ret = 0;.#if 
1aa00 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
1aa10 44 45 42 55 47 29 20 26 26 20 21 64 65 66 69 6e  DEBUG) && !defin
1aa20 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
1aa30 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41 54 55 53  _STMT_SCANSTATUS
1aa40 29 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ).  if( pParse->
1aa50 65 78 70 6c 61 69 6e 3d 3d 32 20 29 0a 23 65 6e  explain==2 ).#en
1aa60 64 69 66 0a 20 20 7b 0a 20 20 20 20 73 74 72 75  dif.  {.    stru
1aa70 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
1aa80 2a 70 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69  *pItem = &pTabLi
1aa90 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46  st->a[pLevel->iF
1aaa0 72 6f 6d 5d 3b 0a 20 20 20 20 56 64 62 65 20 2a  rom];.    Vdbe *
1aab0 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
1aac0 65 3b 20 20 20 20 20 20 2f 2a 20 56 4d 20 62 65  e;      /* VM be
1aad0 69 6e 67 20 63 6f 6e 73 74 72 75 63 74 65 64 20  ing constructed 
1aae0 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a  */.    sqlite3 *
1aaf0 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
1ab00 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
1ab10 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 20 20 69   handle */.    i
1ab20 6e 74 20 69 49 64 20 3d 20 70 50 61 72 73 65 2d  nt iId = pParse-
1ab30 3e 69 53 65 6c 65 63 74 49 64 3b 20 20 2f 2a 20  >iSelectId;  /* 
1ab40 53 65 6c 65 63 74 20 69 64 20 28 6c 65 66 74 2d  Select id (left-
1ab50 6d 6f 73 74 20 6f 75 74 70 75 74 20 63 6f 6c 75  most output colu
1ab60 6d 6e 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  mn) */.    int i
1ab70 73 53 65 61 72 63 68 3b 20 20 20 20 20 20 20 20  sSearch;        
1ab80 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
1ab90 20 66 6f 72 20 61 20 53 45 41 52 43 48 2e 20 46   for a SEARCH. F
1aba0 61 6c 73 65 20 66 6f 72 20 53 43 41 4e 2e 20 2a  alse for SCAN. *
1abb0 2f 0a 20 20 20 20 57 68 65 72 65 4c 6f 6f 70 20  /.    WhereLoop 
1abc0 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20  *pLoop;         
1abd0 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 74 72      /* The contr
1abe0 6f 6c 6c 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70  olling WhereLoop
1abf0 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20 75   object */.    u
1ac00 33 32 20 66 6c 61 67 73 3b 20 20 20 20 20 20 20  32 flags;       
1ac10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ac20 46 6c 61 67 73 20 74 68 61 74 20 64 65 73 63 72  Flags that descr
1ac30 69 62 65 20 74 68 69 73 20 6c 6f 6f 70 20 2a 2f  ibe this loop */
1ac40 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 73 67 3b  .    char *zMsg;
1ac50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ac60 20 20 20 2f 2a 20 54 65 78 74 20 74 6f 20 61 64     /* Text to ad
1ac70 64 20 74 6f 20 45 51 50 20 6f 75 74 70 75 74 20  d to EQP output 
1ac80 2a 2f 0a 20 20 20 20 53 74 72 41 63 63 75 6d 20  */.    StrAccum 
1ac90 73 74 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  str;            
1aca0 20 20 20 20 20 2f 2a 20 45 51 50 20 6f 75 74 70       /* EQP outp
1acb0 75 74 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 20  ut string */.   
1acc0 20 63 68 61 72 20 7a 42 75 66 5b 31 30 30 5d 3b   char zBuf[100];
1acd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1ace0 2a 20 49 6e 69 74 69 61 6c 20 73 70 61 63 65 20  * Initial space 
1acf0 66 6f 72 20 45 51 50 20 6f 75 74 70 75 74 20 73  for EQP output s
1ad00 74 72 69 6e 67 20 2a 2f 0a 0a 20 20 20 20 70 4c  tring */..    pL
1ad10 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57  oop = pLevel->pW
1ad20 4c 6f 6f 70 3b 0a 20 20 20 20 66 6c 61 67 73 20  Loop;.    flags 
1ad30 3d 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  = pLoop->wsFlags
1ad40 3b 0a 20 20 20 20 69 66 28 20 28 66 6c 61 67 73  ;.    if( (flags
1ad50 26 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 29  &WHERE_MULTI_OR)
1ad60 20 7c 7c 20 28 77 63 74 72 6c 46 6c 61 67 73 26   || (wctrlFlags&
1ad70 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f  WHERE_ONETABLE_O
1ad80 4e 4c 59 29 20 29 20 72 65 74 75 72 6e 20 30 3b  NLY) ) return 0;
1ad90 0a 0a 20 20 20 20 69 73 53 65 61 72 63 68 20 3d  ..    isSearch =
1ada0 20 28 66 6c 61 67 73 26 28 57 48 45 52 45 5f 42   (flags&(WHERE_B
1adb0 54 4d 5f 4c 49 4d 49 54 7c 57 48 45 52 45 5f 54  TM_LIMIT|WHERE_T
1adc0 4f 50 5f 4c 49 4d 49 54 29 29 21 3d 30 0a 20 20  OP_LIMIT))!=0.  
1add0 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 28 66            || ((f
1ade0 6c 61 67 73 26 57 48 45 52 45 5f 56 49 52 54 55  lags&WHERE_VIRTU
1adf0 41 4c 54 41 42 4c 45 29 3d 3d 30 20 26 26 20 28  ALTABLE)==0 && (
1ae00 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e  pLoop->u.btree.n
1ae10 45 71 3e 30 29 29 0a 20 20 20 20 20 20 20 20 20  Eq>0)).         
1ae20 20 20 20 7c 7c 20 28 77 63 74 72 6c 46 6c 61 67     || (wctrlFlag
1ae30 73 26 28 57 48 45 52 45 5f 4f 52 44 45 52 42 59  s&(WHERE_ORDERBY
1ae40 5f 4d 49 4e 7c 57 48 45 52 45 5f 4f 52 44 45 52  _MIN|WHERE_ORDER
1ae50 42 59 5f 4d 41 58 29 29 3b 0a 0a 20 20 20 20 73  BY_MAX));..    s
1ae60 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 49 6e  qlite3StrAccumIn
1ae70 69 74 28 26 73 74 72 2c 20 7a 42 75 66 2c 20 73  it(&str, zBuf, s
1ae80 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20 53 51 4c  izeof(zBuf), SQL
1ae90 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 29 3b  ITE_MAX_LENGTH);
1aea0 0a 20 20 20 20 73 74 72 2e 64 62 20 3d 20 64 62  .    str.db = db
1aeb0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 74 72  ;.    sqlite3Str
1aec0 41 63 63 75 6d 41 70 70 65 6e 64 41 6c 6c 28 26  AccumAppendAll(&
1aed0 73 74 72 2c 20 69 73 53 65 61 72 63 68 20 3f 20  str, isSearch ? 
1aee0 22 53 45 41 52 43 48 22 20 3a 20 22 53 43 41 4e  "SEARCH" : "SCAN
1aef0 22 29 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65  ");.    if( pIte
1af00 6d 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  m->pSelect ){.  
1af10 20 20 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e      sqlite3XPrin
1af20 74 66 28 26 73 74 72 2c 20 30 2c 20 22 20 53 55  tf(&str, 0, " SU
1af30 42 51 55 45 52 59 20 25 64 22 2c 20 70 49 74 65  BQUERY %d", pIte
1af40 6d 2d 3e 69 53 65 6c 65 63 74 49 64 29 3b 0a 20  m->iSelectId);. 
1af50 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1af60 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28 26  sqlite3XPrintf(&
1af70 73 74 72 2c 20 30 2c 20 22 20 54 41 42 4c 45 20  str, 0, " TABLE 
1af80 25 73 22 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d  %s", pItem->zNam
1af90 65 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  e);.    }..    i
1afa0 66 28 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73  f( pItem->zAlias
1afb0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
1afc0 33 58 50 72 69 6e 74 66 28 26 73 74 72 2c 20 30  3XPrintf(&str, 0
1afd0 2c 20 22 20 41 53 20 25 73 22 2c 20 70 49 74 65  , " AS %s", pIte
1afe0 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20  m->zAlias);.    
1aff0 7d 0a 20 20 20 20 69 66 28 20 28 66 6c 61 67 73  }.    if( (flags
1b000 20 26 20 28 57 48 45 52 45 5f 49 50 4b 7c 57 48   & (WHERE_IPK|WH
1b010 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  ERE_VIRTUALTABLE
1b020 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 63  ))==0 ){.      c
1b030 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6d 74 20  onst char *zFmt 
1b040 3d 20 30 3b 0a 20 20 20 20 20 20 49 6e 64 65 78  = 0;.      Index
1b050 20 2a 70 49 64 78 3b 0a 0a 20 20 20 20 20 20 61   *pIdx;..      a
1b060 73 73 65 72 74 28 20 70 4c 6f 6f 70 2d 3e 75 2e  ssert( pLoop->u.
1b070 62 74 72 65 65 2e 70 49 6e 64 65 78 21 3d 30 20  btree.pIndex!=0 
1b080 29 3b 0a 20 20 20 20 20 20 70 49 64 78 20 3d 20  );.      pIdx = 
1b090 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70  pLoop->u.btree.p
1b0a0 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 61 73 73  Index;.      ass
1b0b0 65 72 74 28 20 21 28 66 6c 61 67 73 26 57 48 45  ert( !(flags&WHE
1b0c0 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 20 7c  RE_AUTO_INDEX) |
1b0d0 7c 20 28 66 6c 61 67 73 26 57 48 45 52 45 5f 49  | (flags&WHERE_I
1b0e0 44 58 5f 4f 4e 4c 59 29 20 29 3b 0a 20 20 20 20  DX_ONLY) );.    
1b0f0 20 20 69 66 28 20 21 48 61 73 52 6f 77 69 64 28    if( !HasRowid(
1b100 70 49 74 65 6d 2d 3e 70 54 61 62 29 20 26 26 20  pItem->pTab) && 
1b110 49 73 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65  IsPrimaryKeyInde
1b120 78 28 70 49 64 78 29 20 29 7b 0a 20 20 20 20 20  x(pIdx) ){.     
1b130 20 20 20 69 66 28 20 69 73 53 65 61 72 63 68 20     if( isSearch 
1b140 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 46 6d  ){.          zFm
1b150 74 20 3d 20 22 50 52 49 4d 41 52 59 20 4b 45 59  t = "PRIMARY KEY
1b160 22 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  ";.        }.   
1b170 20 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61     }else if( fla
1b180 67 73 20 26 20 57 48 45 52 45 5f 50 41 52 54 49  gs & WHERE_PARTI
1b190 41 4c 49 44 58 20 29 7b 0a 20 20 20 20 20 20 20  ALIDX ){.       
1b1a0 20 7a 46 6d 74 20 3d 20 22 41 55 54 4f 4d 41 54   zFmt = "AUTOMAT
1b1b0 49 43 20 50 41 52 54 49 41 4c 20 43 4f 56 45 52  IC PARTIAL COVER
1b1c0 49 4e 47 20 49 4e 44 45 58 22 3b 0a 20 20 20 20  ING INDEX";.    
1b1d0 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67    }else if( flag
1b1e0 73 20 26 20 57 48 45 52 45 5f 41 55 54 4f 5f 49  s & WHERE_AUTO_I
1b1f0 4e 44 45 58 20 29 7b 0a 20 20 20 20 20 20 20 20  NDEX ){.        
1b200 7a 46 6d 74 20 3d 20 22 41 55 54 4f 4d 41 54 49  zFmt = "AUTOMATI
1b210 43 20 43 4f 56 45 52 49 4e 47 20 49 4e 44 45 58  C COVERING INDEX
1b220 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  ";.      }else i
1b230 66 28 20 66 6c 61 67 73 20 26 20 57 48 45 52 45  f( flags & WHERE
1b240 5f 49 44 58 5f 4f 4e 4c 59 20 29 7b 0a 20 20 20  _IDX_ONLY ){.   
1b250 20 20 20 20 20 7a 46 6d 74 20 3d 20 22 43 4f 56       zFmt = "COV
1b260 45 52 49 4e 47 20 49 4e 44 45 58 20 25 73 22 3b  ERING INDEX %s";
1b270 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1b280 20 20 20 20 20 20 7a 46 6d 74 20 3d 20 22 49 4e        zFmt = "IN
1b290 44 45 58 20 25 73 22 3b 0a 20 20 20 20 20 20 7d  DEX %s";.      }
1b2a0 0a 20 20 20 20 20 20 69 66 28 20 7a 46 6d 74 20  .      if( zFmt 
1b2b0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1b2c0 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64  e3StrAccumAppend
1b2d0 28 26 73 74 72 2c 20 22 20 55 53 49 4e 47 20 22  (&str, " USING "
1b2e0 2c 20 37 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 7);.        sq
1b2f0 6c 69 74 65 33 58 50 72 69 6e 74 66 28 26 73 74  lite3XPrintf(&st
1b300 72 2c 20 30 2c 20 7a 46 6d 74 2c 20 70 49 64 78  r, 0, zFmt, pIdx
1b310 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
1b320 20 20 65 78 70 6c 61 69 6e 49 6e 64 65 78 52 61    explainIndexRa
1b330 6e 67 65 28 26 73 74 72 2c 20 70 4c 6f 6f 70 2c  nge(&str, pLoop,
1b340 20 70 49 74 65 6d 2d 3e 70 54 61 62 29 3b 0a 20   pItem->pTab);. 
1b350 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
1b360 20 69 66 28 20 28 66 6c 61 67 73 20 26 20 57 48   if( (flags & WH
1b370 45 52 45 5f 49 50 4b 29 21 3d 30 20 26 26 20 28  ERE_IPK)!=0 && (
1b380 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f  flags & WHERE_CO
1b390 4e 53 54 52 41 49 4e 54 29 21 3d 30 20 29 7b 0a  NSTRAINT)!=0 ){.
1b3a0 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
1b3b0 20 2a 7a 52 61 6e 67 65 3b 0a 20 20 20 20 20 20   *zRange;.      
1b3c0 69 66 28 20 66 6c 61 67 73 26 28 57 48 45 52 45  if( flags&(WHERE
1b3d0 5f 43 4f 4c 55 4d 4e 5f 45 51 7c 57 48 45 52 45  _COLUMN_EQ|WHERE
1b3e0 5f 43 4f 4c 55 4d 4e 5f 49 4e 29 20 29 7b 0a 20  _COLUMN_IN) ){. 
1b3f0 20 20 20 20 20 20 20 7a 52 61 6e 67 65 20 3d 20         zRange = 
1b400 22 28 72 6f 77 69 64 3d 3f 29 22 3b 0a 20 20 20  "(rowid=?)";.   
1b410 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 66 6c     }else if( (fl
1b420 61 67 73 26 57 48 45 52 45 5f 42 4f 54 48 5f 4c  ags&WHERE_BOTH_L
1b430 49 4d 49 54 29 3d 3d 57 48 45 52 45 5f 42 4f 54  IMIT)==WHERE_BOT
1b440 48 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 20  H_LIMIT ){.     
1b450 20 20 20 7a 52 61 6e 67 65 20 3d 20 22 28 72 6f     zRange = "(ro
1b460 77 69 64 3e 3f 20 41 4e 44 20 72 6f 77 69 64 3c  wid>? AND rowid<
1b470 3f 29 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ?)";.      }else
1b480 20 69 66 28 20 66 6c 61 67 73 26 57 48 45 52 45   if( flags&WHERE
1b490 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20 20  _BTM_LIMIT ){.  
1b4a0 20 20 20 20 20 20 7a 52 61 6e 67 65 20 3d 20 22        zRange = "
1b4b0 28 72 6f 77 69 64 3e 3f 29 22 3b 0a 20 20 20 20  (rowid>?)";.    
1b4c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1b4d0 20 61 73 73 65 72 74 28 20 66 6c 61 67 73 26 57   assert( flags&W
1b4e0 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 3b  HERE_TOP_LIMIT);
1b4f0 0a 20 20 20 20 20 20 20 20 7a 52 61 6e 67 65 20  .        zRange 
1b500 3d 20 22 28 72 6f 77 69 64 3c 3f 29 22 3b 0a 20  = "(rowid<?)";. 
1b510 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
1b520 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65  ite3StrAccumAppe
1b530 6e 64 41 6c 6c 28 26 73 74 72 2c 20 22 20 55 53  ndAll(&str, " US
1b540 49 4e 47 20 49 4e 54 45 47 45 52 20 50 52 49 4d  ING INTEGER PRIM
1b550 41 52 59 20 4b 45 59 20 22 29 3b 0a 20 20 20 20  ARY KEY ");.    
1b560 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75    sqlite3StrAccu
1b570 6d 41 70 70 65 6e 64 41 6c 6c 28 26 73 74 72 2c  mAppendAll(&str,
1b580 20 7a 52 61 6e 67 65 29 3b 0a 20 20 20 20 7d 0a   zRange);.    }.
1b590 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1b5a0 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
1b5b0 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20 28 66  .    else if( (f
1b5c0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52  lags & WHERE_VIR
1b5d0 54 55 41 4c 54 41 42 4c 45 29 21 3d 30 20 29 7b  TUALTABLE)!=0 ){
1b5e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 58 50  .      sqlite3XP
1b5f0 72 69 6e 74 66 28 26 73 74 72 2c 20 30 2c 20 22  rintf(&str, 0, "
1b600 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 49   VIRTUAL TABLE I
1b610 4e 44 45 58 20 25 64 3a 25 73 22 2c 0a 20 20 20  NDEX %d:%s",.   
1b620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1b630 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78  Loop->u.vtab.idx
1b640 4e 75 6d 2c 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74  Num, pLoop->u.vt
1b650 61 62 2e 69 64 78 53 74 72 29 3b 0a 20 20 20 20  ab.idxStr);.    
1b660 7d 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  }.#endif.#ifdef 
1b670 53 51 4c 49 54 45 5f 45 58 50 4c 41 49 4e 5f 45  SQLITE_EXPLAIN_E
1b680 53 54 49 4d 41 54 45 44 5f 52 4f 57 53 0a 20 20  STIMATED_ROWS.  
1b690 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 6e 4f 75    if( pLoop->nOu
1b6a0 74 3e 3d 31 30 20 29 7b 0a 20 20 20 20 20 20 73  t>=10 ){.      s
1b6b0 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28 26 73  qlite3XPrintf(&s
1b6c0 74 72 2c 20 30 2c 20 22 20 28 7e 25 6c 6c 75 20  tr, 0, " (~%llu 
1b6d0 72 6f 77 73 29 22 2c 20 73 71 6c 69 74 65 33 4c  rows)", sqlite3L
1b6e0 6f 67 45 73 74 54 6f 49 6e 74 28 70 4c 6f 6f 70  ogEstToInt(pLoop
1b6f0 2d 3e 6e 4f 75 74 29 29 3b 0a 20 20 20 20 7d 65  ->nOut));.    }e
1b700 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
1b710 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64  e3StrAccumAppend
1b720 28 26 73 74 72 2c 20 22 20 28 7e 31 20 72 6f 77  (&str, " (~1 row
1b730 29 22 2c 20 39 29 3b 0a 20 20 20 20 7d 0a 23 65  )", 9);.    }.#e
1b740 6e 64 69 66 0a 20 20 20 20 7a 4d 73 67 20 3d 20  ndif.    zMsg = 
1b750 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 46  sqlite3StrAccumF
1b760 69 6e 69 73 68 28 26 73 74 72 29 3b 0a 20 20 20  inish(&str);.   
1b770 20 72 65 74 20 3d 20 73 71 6c 69 74 65 33 56 64   ret = sqlite3Vd
1b780 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45  beAddOp4(v, OP_E
1b790 78 70 6c 61 69 6e 2c 20 69 49 64 2c 20 69 4c 65  xplain, iId, iLe
1b7a0 76 65 6c 2c 20 69 46 72 6f 6d 2c 20 7a 4d 73 67  vel, iFrom, zMsg
1b7b0 2c 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20  ,P4_DYNAMIC);.  
1b7c0 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 74 3b 0a  }.  return ret;.
1b7d0 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
1b7e0 20 65 78 70 6c 61 69 6e 4f 6e 65 53 63 61 6e 28   explainOneScan(
1b7f0 75 2c 76 2c 77 2c 78 2c 79 2c 7a 29 20 30 0a 23  u,v,w,x,y,z) 0.#
1b800 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
1b810 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 2a 2f 0a  OMIT_EXPLAIN */.
1b820 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
1b830 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53  NABLE_STMT_SCANS
1b840 54 41 54 55 53 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66  TATUS./*.** Conf
1b850 69 67 75 72 65 20 74 68 65 20 56 4d 20 70 61 73  igure the VM pas
1b860 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74  sed as the first
1b870 20 61 72 67 75 6d 65 6e 74 20 77 69 74 68 20 61   argument with a
1b880 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 73 74 6d  n.** sqlite3_stm
1b890 74 5f 73 63 61 6e 73 74 61 74 75 73 28 29 20 65  t_scanstatus() e
1b8a0 6e 74 72 79 20 63 6f 72 72 65 73 70 6f 6e 64 69  ntry correspondi
1b8b0 6e 67 20 74 6f 20 74 68 65 20 73 63 61 6e 20 75  ng to the scan u
1b8c0 73 65 64 20 74 6f 20 0a 2a 2a 20 69 6d 70 6c 65  sed to .** imple
1b8d0 6d 65 6e 74 20 6c 65 76 65 6c 20 70 4c 76 6c 2e  ment level pLvl.
1b8e0 20 41 72 67 75 6d 65 6e 74 20 70 53 72 63 6c 69   Argument pSrcli
1b8f0 73 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  st is a pointer 
1b900 74 6f 20 74 68 65 20 46 52 4f 4d 20 0a 2a 2a 20  to the FROM .** 
1b910 63 6c 61 75 73 65 20 74 68 61 74 20 74 68 65 20  clause that the 
1b920 73 63 61 6e 20 72 65 61 64 73 20 64 61 74 61 20  scan reads data 
1b930 66 72 6f 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  from..**.** If a
1b940 72 67 75 6d 65 6e 74 20 61 64 64 72 45 78 70 6c  rgument addrExpl
1b950 61 69 6e 20 69 73 20 6e 6f 74 20 30 2c 20 69 74  ain is not 0, it
1b960 20 6d 75 73 74 20 62 65 20 74 68 65 20 61 64 64   must be the add
1b970 72 65 73 73 20 6f 66 20 61 6e 20 0a 2a 2a 20 4f  ress of an .** O
1b980 50 5f 45 78 70 6c 61 69 6e 20 69 6e 73 74 72 75  P_Explain instru
1b990 63 74 69 6f 6e 20 74 68 61 74 20 64 65 73 63 72  ction that descr
1b9a0 69 62 65 73 20 74 68 65 20 73 61 6d 65 20 6c 6f  ibes the same lo
1b9b0 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  op..*/.static vo
1b9c0 69 64 20 61 64 64 53 63 61 6e 53 74 61 74 75 73  id addScanStatus
1b9d0 28 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20  (.  Vdbe *v,    
1b9e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b9f0 20 20 20 20 2f 2a 20 56 64 62 65 20 74 6f 20 61      /* Vdbe to a
1ba00 64 64 20 73 63 61 6e 73 74 61 74 75 73 20 65 6e  dd scanstatus en
1ba10 74 72 79 20 74 6f 20 2a 2f 0a 20 20 53 72 63 4c  try to */.  SrcL
1ba20 69 73 74 20 2a 70 53 72 63 6c 69 73 74 2c 20 20  ist *pSrclist,  
1ba30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1ba40 52 4f 4d 20 63 6c 61 75 73 65 20 70 4c 76 6c 20  ROM clause pLvl 
1ba50 72 65 61 64 73 20 64 61 74 61 20 66 72 6f 6d 20  reads data from 
1ba60 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20  */.  WhereLevel 
1ba70 2a 70 4c 76 6c 2c 20 20 20 20 20 20 20 20 20 20  *pLvl,          
1ba80 20 20 20 20 20 2f 2a 20 4c 65 76 65 6c 20 74 6f       /* Level to
1ba90 20 61 64 64 20 73 63 61 6e 73 74 61 74 75 73 28   add scanstatus(
1baa0 29 20 65 6e 74 72 79 20 66 6f 72 20 2a 2f 0a 20  ) entry for */. 
1bab0 20 69 6e 74 20 61 64 64 72 45 78 70 6c 61 69 6e   int addrExplain
1bac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bad0 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 4f   /* Address of O
1bae0 50 5f 45 78 70 6c 61 69 6e 20 28 6f 72 20 30 29  P_Explain (or 0)
1baf0 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63   */.){.  const c
1bb00 68 61 72 20 2a 7a 4f 62 6a 20 3d 20 30 3b 0a 20  har *zObj = 0;. 
1bb10 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f   WhereLoop *pLoo
1bb20 70 20 3d 20 70 4c 76 6c 2d 3e 70 57 4c 6f 6f 70  p = pLvl->pWLoop
1bb30 3b 0a 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e  ;.  if( (pLoop->
1bb40 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
1bb50 56 49 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30  VIRTUALTABLE)==0
1bb60 20 20 26 26 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62    &&  pLoop->u.b
1bb70 74 72 65 65 2e 70 49 6e 64 65 78 21 3d 30 20 29  tree.pIndex!=0 )
1bb80 7b 0a 20 20 20 20 7a 4f 62 6a 20 3d 20 70 4c 6f  {.    zObj = pLo
1bb90 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  op->u.btree.pInd
1bba0 65 78 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 7d 65 6c  ex->zName;.  }el
1bbb0 73 65 7b 0a 20 20 20 20 7a 4f 62 6a 20 3d 20 70  se{.    zObj = p
1bbc0 53 72 63 6c 69 73 74 2d 3e 61 5b 70 4c 76 6c 2d  Srclist->a[pLvl-
1bbd0 3e 69 46 72 6f 6d 5d 2e 7a 4e 61 6d 65 3b 0a 20  >iFrom].zName;. 
1bbe0 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
1bbf0 53 63 61 6e 53 74 61 74 75 73 28 0a 20 20 20 20  ScanStatus(.    
1bc00 20 20 76 2c 20 61 64 64 72 45 78 70 6c 61 69 6e    v, addrExplain
1bc10 2c 20 70 4c 76 6c 2d 3e 61 64 64 72 42 6f 64 79  , pLvl->addrBody
1bc20 2c 20 70 4c 76 6c 2d 3e 61 64 64 72 56 69 73 69  , pLvl->addrVisi
1bc30 74 2c 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 2c 20  t, pLoop->nOut, 
1bc40 7a 4f 62 6a 0a 20 20 29 3b 0a 7d 0a 23 65 6c 73  zObj.  );.}.#els
1bc50 65 0a 23 20 64 65 66 69 6e 65 20 61 64 64 53 63  e.# define addSc
1bc60 61 6e 53 74 61 74 75 73 28 61 2c 20 62 2c 20 63  anStatus(a, b, c
1bc70 2c 20 64 29 20 28 28 76 6f 69 64 29 64 29 0a 23  , d) ((void)d).#
1bc80 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  endif../*.** If 
1bc90 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
1bca0 79 20 63 6f 64 65 64 20 69 6e 73 74 72 75 63 74  y coded instruct
1bcb0 69 6f 6e 20 69 73 20 61 20 63 6f 6e 73 74 61 6e  ion is a constan
1bcc0 74 20 72 61 6e 67 65 20 63 6f 6e 74 72 61 69 6e  t range contrain
1bcd0 74 0a 2a 2a 20 74 68 61 74 20 6f 72 69 67 69 6e  t.** that origin
1bce0 61 74 65 64 20 66 72 6f 6d 20 74 68 65 20 4c 49  ated from the LI
1bcf0 4b 45 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c  KE optimization,
1bd00 20 74 68 65 6e 20 63 68 61 6e 67 65 20 74 68 65   then change the
1bd10 20 50 33 20 74 6f 20 62 65 0a 2a 2a 20 70 4c 6f   P3 to be.** pLo
1bd20 6f 70 2d 3e 69 4c 69 6b 65 52 65 70 43 6e 74 72  op->iLikeRepCntr
1bd30 20 61 6e 64 20 73 65 74 20 50 35 2e 0a 2a 2a 0a   and set P5..**.
1bd40 2a 2a 20 54 68 65 20 4c 49 4b 45 20 6f 70 74 69  ** The LIKE opti
1bd50 6d 69 7a 61 74 69 6f 6e 20 74 72 79 73 20 74 6f  mization trys to
1bd60 20 65 76 61 6c 75 61 74 65 20 22 78 20 4c 49 4b   evaluate "x LIK
1bd70 45 20 27 61 62 63 25 27 22 20 61 73 20 61 20 72  E 'abc%'" as a r
1bd80 61 6e 67 65 0a 2a 2a 20 65 78 70 72 65 73 73 69  ange.** expressi
1bd90 6f 6e 3a 20 22 78 3e 3d 27 41 42 43 27 20 41 4e  on: "x>='ABC' AN
1bda0 44 20 78 3c 27 61 62 64 27 22 2e 20 20 42 75 74  D x<'abd'".  But
1bdb0 20 74 68 69 73 20 72 65 71 75 69 72 65 73 20 74   this requires t
1bdc0 68 61 74 20 74 68 65 20 72 61 6e 67 65 0a 2a 2a  hat the range.**
1bdd0 20 73 63 61 6e 20 6c 6f 6f 70 20 72 75 6e 20 74   scan loop run t
1bde0 77 69 63 65 2c 20 6f 6e 63 65 20 66 6f 72 20 73  wice, once for s
1bdf0 74 72 69 6e 67 73 20 61 6e 64 20 61 20 73 65 63  trings and a sec
1be00 6f 6e 64 20 74 69 6d 65 20 66 6f 72 20 42 4c 4f  ond time for BLO
1be10 42 73 2e 0a 2a 2a 20 54 68 65 20 4f 50 5f 53 74  Bs..** The OP_St
1be20 72 69 6e 67 20 6f 70 63 6f 64 65 73 20 6f 6e 20  ring opcodes on 
1be30 74 68 65 20 73 65 63 6f 6e 64 20 70 61 73 73 20  the second pass 
1be40 63 6f 6e 76 65 72 74 20 74 68 65 20 75 70 70 65  convert the uppe
1be50 72 20 61 6e 64 20 6c 6f 77 65 72 0a 2a 2a 20 62  r and lower.** b
1be60 6f 75 6e 64 20 73 74 72 69 6e 67 20 63 6f 6e 74  ound string cont
1be70 61 6e 74 73 20 74 6f 20 62 6c 6f 62 73 2e 20 20  ants to blobs.  
1be80 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 6b  This routine mak
1be90 65 73 20 74 68 65 20 6e 65 63 65 73 73 61 72 79  es the necessary
1bea0 20 63 68 61 6e 67 65 73 0a 2a 2a 20 74 6f 20 74   changes.** to t
1beb0 68 65 20 4f 50 5f 53 74 72 69 6e 67 20 6f 70 63  he OP_String opc
1bec0 6f 64 65 73 20 66 6f 72 20 74 68 61 74 20 74 6f  odes for that to
1bed0 20 68 61 70 70 65 6e 2e 0a 2a 2f 0a 73 74 61 74   happen..*/.stat
1bee0 69 63 20 76 6f 69 64 20 77 68 65 72 65 4c 69 6b  ic void whereLik
1bef0 65 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 53 74 72  eOptimizationStr
1bf00 69 6e 67 46 69 78 75 70 28 0a 20 20 56 64 62 65  ingFixup(.  Vdbe
1bf10 20 2a 76 2c 20 20 20 20 20 20 20 20 20 20 20 20   *v,            
1bf20 20 20 20 20 2f 2a 20 70 72 65 70 61 72 65 64 20      /* prepared 
1bf30 73 74 61 74 65 6d 65 6e 74 20 75 6e 64 65 72 20  statement under 
1bf40 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a  construction */.
1bf50 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c    WhereLevel *pL
1bf60 65 76 65 6c 2c 20 20 20 20 20 2f 2a 20 54 68 65  evel,     /* The
1bf70 20 6c 6f 6f 70 20 74 68 61 74 20 63 6f 6e 74 61   loop that conta
1bf80 69 6e 73 20 74 68 65 20 4c 49 4b 45 20 6f 70 65  ins the LIKE ope
1bf90 72 61 74 6f 72 20 2a 2f 0a 20 20 57 68 65 72 65  rator */.  Where
1bfa0 54 65 72 6d 20 2a 70 54 65 72 6d 20 20 20 20 20  Term *pTerm     
1bfb0 20 20 20 2f 2a 20 54 68 65 20 75 70 70 65 72 20     /* The upper 
1bfc0 6f 72 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20 6a  or lower bound j
1bfd0 75 73 74 20 63 6f 64 65 64 20 2a 2f 0a 29 7b 0a  ust coded */.){.
1bfe0 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46    if( pTerm->wtF
1bff0 6c 61 67 73 20 26 20 54 45 52 4d 5f 4c 49 4b 45  lags & TERM_LIKE
1c000 4f 50 54 20 29 7b 0a 20 20 20 20 56 64 62 65 4f  OPT ){.    VdbeO
1c010 70 20 2a 70 4f 70 3b 0a 20 20 20 20 61 73 73 65  p *pOp;.    asse
1c020 72 74 28 20 70 4c 65 76 65 6c 2d 3e 69 4c 69 6b  rt( pLevel->iLik
1c030 65 52 65 70 43 6e 74 72 3e 30 20 29 3b 0a 20 20  eRepCntr>0 );.  
1c040 20 20 70 4f 70 20 3d 20 73 71 6c 69 74 65 33 56    pOp = sqlite3V
1c050 64 62 65 47 65 74 4f 70 28 76 2c 20 2d 31 29 3b  dbeGetOp(v, -1);
1c060 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70  .    assert( pOp
1c070 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  !=0 );.    asser
1c080 74 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d  t( pOp->opcode==
1c090 4f 50 5f 53 74 72 69 6e 67 38 20 0a 20 20 20 20  OP_String8 .    
1c0a0 20 20 20 20 20 20 20 20 7c 7c 20 70 54 65 72 6d          || pTerm
1c0b0 2d 3e 70 57 43 2d 3e 70 57 49 6e 66 6f 2d 3e 70  ->pWC->pWInfo->p
1c0c0 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
1c0d0 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 70  cFailed );.    p
1c0e0 4f 70 2d 3e 70 33 20 3d 20 70 4c 65 76 65 6c 2d  Op->p3 = pLevel-
1c0f0 3e 69 4c 69 6b 65 52 65 70 43 6e 74 72 3b 0a 20  >iLikeRepCntr;. 
1c100 20 20 20 70 4f 70 2d 3e 70 35 20 3d 20 31 3b 0a     pOp->p5 = 1;.
1c110 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e    }.}../*.** Gen
1c120 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74  erate code for t
1c130 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
1c140 69 4c 65 76 65 6c 2d 74 68 20 6c 6f 6f 70 20 69  iLevel-th loop i
1c150 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  n the WHERE clau
1c160 73 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61  se.** implementa
1c170 74 69 6f 6e 20 64 65 73 63 72 69 62 65 64 20 62  tion described b
1c180 79 20 70 57 49 6e 66 6f 2e 0a 2a 2f 0a 73 74 61  y pWInfo..*/.sta
1c190 74 69 63 20 42 69 74 6d 61 73 6b 20 63 6f 64 65  tic Bitmask code
1c1a0 4f 6e 65 4c 6f 6f 70 53 74 61 72 74 28 0a 20 20  OneLoopStart(.  
1c1b0 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
1c1c0 6f 2c 20 20 20 2f 2a 20 43 6f 6d 70 6c 65 74 65  o,   /* Complete
1c1d0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f   information abo
1c1e0 75 74 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  ut the WHERE cla
1c1f0 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65  use */.  int iLe
1c200 76 65 6c 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  vel,          /*
1c210 20 57 68 69 63 68 20 6c 65 76 65 6c 20 6f 66 20   Which level of 
1c220 70 57 49 6e 66 6f 2d 3e 61 5b 5d 20 73 68 6f 75  pWInfo->a[] shou
1c230 6c 64 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20  ld be coded */. 
1c240 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64   Bitmask notRead
1c250 79 20 20 20 20 20 2f 2a 20 57 68 69 63 68 20 74  y     /* Which t
1c260 61 62 6c 65 73 20 61 72 65 20 63 75 72 72 65 6e  ables are curren
1c270 74 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f  tly available */
1c280 0a 29 7b 0a 20 20 69 6e 74 20 6a 2c 20 6b 3b 20  .){.  int j, k; 
1c290 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
1c2a0 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20  op counters */. 
1c2b0 20 69 6e 74 20 69 43 75 72 3b 20 20 20 20 20 20   int iCur;      
1c2c0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42        /* The VDB
1c2d0 45 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65  E cursor for the
1c2e0 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
1c2f0 61 64 64 72 4e 78 74 3b 20 20 20 20 20 20 20 20  addrNxt;        
1c300 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 6a 75 6d   /* Where to jum
1c310 70 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69  p to continue wi
1c320 74 68 20 74 68 65 20 6e 65 78 74 20 49 4e 20 63  th the next IN c
1c330 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 6d 69  ase */.  int omi
1c340 74 54 61 62 6c 65 3b 20 20 20 20 20 20 20 2f 2a  tTable;       /*
1c350 20 54 72 75 65 20 69 66 20 77 65 20 75 73 65 20   True if we use 
1c360 74 68 65 20 69 6e 64 65 78 20 6f 6e 6c 79 20 2a  the index only *
1c370 2f 0a 20 20 69 6e 74 20 62 52 65 76 3b 20 20 20  /.  int bRev;   
1c380 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
1c390 20 69 66 20 77 65 20 6e 65 65 64 20 74 6f 20 73   if we need to s
1c3a0 63 61 6e 20 69 6e 20 72 65 76 65 72 73 65 20 6f  can in reverse o
1c3b0 72 64 65 72 20 2a 2f 0a 20 20 57 68 65 72 65 4c  rder */.  WhereL
1c3c0 65 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 20 20 2f  evel *pLevel;  /
1c3d0 2a 20 54 68 65 20 77 68 65 72 65 20 6c 65 76 65  * The where leve
1c3e0 6c 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f  l to be coded */
1c3f0 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c  .  WhereLoop *pL
1c400 6f 6f 70 3b 20 20 20 20 2f 2a 20 54 68 65 20 57  oop;    /* The W
1c410 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20  hereLoop object 
1c420 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20  being coded */. 
1c430 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
1c440 43 3b 20 20 20 20 2f 2a 20 44 65 63 6f 6d 70 6f  C;    /* Decompo
1c450 73 69 74 69 6f 6e 20 6f 66 20 74 68 65 20 65 6e  sition of the en
1c460 74 69 72 65 20 57 48 45 52 45 20 63 6c 61 75 73  tire WHERE claus
1c470 65 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  e */.  WhereTerm
1c480 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20   *pTerm;        
1c490 20 20 20 20 20 20 20 2f 2a 20 41 20 57 48 45 52         /* A WHER
1c4a0 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20 2a 2f  E clause term */
1c4b0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
1c4c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1c4d0 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
1c4e0 6e 74 65 78 74 20 2a 2f 0a 20 20 73 71 6c 69 74  ntext */.  sqlit
1c4f0 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20  e3 *db;         
1c500 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
1c510 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
1c520 6e 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20  n */.  Vdbe *v; 
1c530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c540 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 72         /* The pr
1c550 65 70 61 72 65 64 20 73 74 6d 74 20 75 6e 64 65  epared stmt unde
1c560 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 73 20  r constructions 
1c570 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
1c580 69 73 74 5f 69 74 65 6d 20 2a 70 54 61 62 49 74  ist_item *pTabIt
1c590 65 6d 3b 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61  em;  /* FROM cla
1c5a0 75 73 65 20 74 65 72 6d 20 62 65 69 6e 67 20 63  use term being c
1c5b0 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 61 64  oded */.  int ad
1c5c0 64 72 42 72 6b 3b 20 20 20 20 20 20 20 20 20 20  drBrk;          
1c5d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d            /* Jum
1c5e0 70 20 68 65 72 65 20 74 6f 20 62 72 65 61 6b 20  p here to break 
1c5f0 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  out of the loop 
1c600 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 43 6f 6e  */.  int addrCon
1c610 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
1c620 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72       /* Jump her
1c630 65 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69  e to continue wi
1c640 74 68 20 6e 65 78 74 20 63 79 63 6c 65 20 2a 2f  th next cycle */
1c650 0a 20 20 69 6e 74 20 69 52 6f 77 69 64 52 65 67  .  int iRowidReg
1c660 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20   = 0;        /* 
1c670 52 6f 77 69 64 20 69 73 20 73 74 6f 72 65 64 20  Rowid is stored 
1c680 69 6e 20 74 68 69 73 20 72 65 67 69 73 74 65 72  in this register
1c690 2c 20 69 66 20 6e 6f 74 20 7a 65 72 6f 20 2a 2f  , if not zero */
1c6a0 0a 20 20 69 6e 74 20 69 52 65 6c 65 61 73 65 52  .  int iReleaseR
1c6b0 65 67 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20  eg = 0;      /* 
1c6c0 54 65 6d 70 20 72 65 67 69 73 74 65 72 20 74 6f  Temp register to
1c6d0 20 66 72 65 65 20 62 65 66 6f 72 65 20 72 65 74   free before ret
1c6e0 75 72 6e 69 6e 67 20 2a 2f 0a 0a 20 20 70 50 61  urning */..  pPa
1c6f0 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50  rse = pWInfo->pP
1c700 61 72 73 65 3b 0a 20 20 76 20 3d 20 70 50 61 72  arse;.  v = pPar
1c710 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 70 57 43  se->pVdbe;.  pWC
1c720 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43 3b   = &pWInfo->sWC;
1c730 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  .  db = pParse->
1c740 64 62 3b 0a 20 20 70 4c 65 76 65 6c 20 3d 20 26  db;.  pLevel = &
1c750 70 57 49 6e 66 6f 2d 3e 61 5b 69 4c 65 76 65 6c  pWInfo->a[iLevel
1c760 5d 3b 0a 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65  ];.  pLoop = pLe
1c770 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 70  vel->pWLoop;.  p
1c780 54 61 62 49 74 65 6d 20 3d 20 26 70 57 49 6e 66  TabItem = &pWInf
1c790 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70  o->pTabList->a[p
1c7a0 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20  Level->iFrom];. 
1c7b0 20 69 43 75 72 20 3d 20 70 54 61 62 49 74 65 6d   iCur = pTabItem
1c7c0 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 70 4c 65  ->iCursor;.  pLe
1c7d0 76 65 6c 2d 3e 6e 6f 74 52 65 61 64 79 20 3d 20  vel->notReady = 
1c7e0 6e 6f 74 52 65 61 64 79 20 26 20 7e 67 65 74 4d  notReady & ~getM
1c7f0 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61  ask(&pWInfo->sMa
1c800 73 6b 53 65 74 2c 20 69 43 75 72 29 3b 0a 20 20  skSet, iCur);.  
1c810 62 52 65 76 20 3d 20 28 70 57 49 6e 66 6f 2d 3e  bRev = (pWInfo->
1c820 72 65 76 4d 61 73 6b 3e 3e 69 4c 65 76 65 6c 29  revMask>>iLevel)
1c830 26 31 3b 0a 20 20 6f 6d 69 74 54 61 62 6c 65 20  &1;.  omitTable 
1c840 3d 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  = (pLoop->wsFlag
1c850 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e  s & WHERE_IDX_ON
1c860 4c 59 29 21 3d 30 20 0a 20 20 20 20 20 20 20 20  LY)!=0 .        
1c870 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77     && (pWInfo->w
1c880 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
1c890 45 5f 46 4f 52 43 45 5f 54 41 42 4c 45 29 3d 3d  E_FORCE_TABLE)==
1c8a0 30 3b 0a 20 20 56 64 62 65 4d 6f 64 75 6c 65 43  0;.  VdbeModuleC
1c8b0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 42 65 67 69  omment((v, "Begi
1c8c0 6e 20 57 48 45 52 45 2d 6c 6f 6f 70 25 64 3a 20  n WHERE-loop%d: 
1c8d0 25 73 22 2c 69 4c 65 76 65 6c 2c 70 54 61 62 49  %s",iLevel,pTabI
1c8e0 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65  tem->pTab->zName
1c8f0 29 29 3b 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65  ));..  /* Create
1c900 20 6c 61 62 65 6c 73 20 66 6f 72 20 74 68 65 20   labels for the 
1c910 22 62 72 65 61 6b 22 20 61 6e 64 20 22 63 6f 6e  "break" and "con
1c920 74 69 6e 75 65 22 20 69 6e 73 74 72 75 63 74 69  tinue" instructi
1c930 6f 6e 73 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65  ons.  ** for the
1c940 20 63 75 72 72 65 6e 74 20 6c 6f 6f 70 2e 20 20   current loop.  
1c950 4a 75 6d 70 20 74 6f 20 61 64 64 72 42 72 6b 20  Jump to addrBrk 
1c960 74 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20  to break out of 
1c970 61 20 6c 6f 6f 70 2e 0a 20 20 2a 2a 20 4a 75 6d  a loop..  ** Jum
1c980 70 20 74 6f 20 63 6f 6e 74 20 74 6f 20 67 6f 20  p to cont to go 
1c990 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 74  immediately to t
1c9a0 68 65 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f  he next iteratio
1c9b0 6e 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 6c 6f  n of the.  ** lo
1c9c0 6f 70 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68  op..  **.  ** Wh
1c9d0 65 6e 20 74 68 65 72 65 20 69 73 20 61 6e 20 49  en there is an I
1c9e0 4e 20 6f 70 65 72 61 74 6f 72 2c 20 77 65 20 61  N operator, we a
1c9f0 6c 73 6f 20 68 61 76 65 20 61 20 22 61 64 64 72  lso have a "addr
1ca00 4e 78 74 22 20 6c 61 62 65 6c 20 74 68 61 74 0a  Nxt" label that.
1ca10 20 20 2a 2a 20 6d 65 61 6e 73 20 74 6f 20 63 6f    ** means to co
1ca20 6e 74 69 6e 75 65 20 77 69 74 68 20 74 68 65 20  ntinue with the 
1ca30 6e 65 78 74 20 49 4e 20 76 61 6c 75 65 20 63 6f  next IN value co
1ca40 6d 62 69 6e 61 74 69 6f 6e 2e 20 20 57 68 65 6e  mbination.  When
1ca50 0a 20 20 2a 2a 20 74 68 65 72 65 20 61 72 65 20  .  ** there are 
1ca60 6e 6f 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 20  no IN operators 
1ca70 69 6e 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e  in the constrain
1ca80 74 73 2c 20 74 68 65 20 22 61 64 64 72 4e 78 74  ts, the "addrNxt
1ca90 22 20 6c 61 62 65 6c 0a 20 20 2a 2a 20 69 73 20  " label.  ** is 
1caa0 74 68 65 20 73 61 6d 65 20 61 73 20 22 61 64 64  the same as "add
1cab0 72 42 72 6b 22 2e 0a 20 20 2a 2f 0a 20 20 61 64  rBrk"..  */.  ad
1cac0 64 72 42 72 6b 20 3d 20 70 4c 65 76 65 6c 2d 3e  drBrk = pLevel->
1cad0 61 64 64 72 42 72 6b 20 3d 20 70 4c 65 76 65 6c  addrBrk = pLevel
1cae0 2d 3e 61 64 64 72 4e 78 74 20 3d 20 73 71 6c 69  ->addrNxt = sqli
1caf0 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
1cb00 28 76 29 3b 0a 20 20 61 64 64 72 43 6f 6e 74 20  (v);.  addrCont 
1cb10 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 43 6f  = pLevel->addrCo
1cb20 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  nt = sqlite3Vdbe
1cb30 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20  MakeLabel(v);.. 
1cb40 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 74   /* If this is t
1cb50 68 65 20 72 69 67 68 74 20 74 61 62 6c 65 20 6f  he right table o
1cb60 66 20 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a  f a LEFT OUTER J
1cb70 4f 49 4e 2c 20 61 6c 6c 6f 63 61 74 65 20 61 6e  OIN, allocate an
1cb80 64 0a 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a  d.  ** initializ
1cb90 65 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20  e a memory cell 
1cba0 74 68 61 74 20 72 65 63 6f 72 64 73 20 69 66 20  that records if 
1cbb0 74 68 69 73 20 74 61 62 6c 65 20 6d 61 74 63 68  this table match
1cbc0 65 73 20 61 6e 79 0a 20 20 2a 2a 20 72 6f 77 20  es any.  ** row 
1cbd0 6f 66 20 74 68 65 20 6c 65 66 74 20 74 61 62 6c  of the left tabl
1cbe0 65 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 0a 20  e of the join.. 
1cbf0 20 2a 2f 0a 20 20 69 66 28 20 70 4c 65 76 65 6c   */.  if( pLevel
1cc00 2d 3e 69 46 72 6f 6d 3e 30 20 26 26 20 28 70 54  ->iFrom>0 && (pT
1cc10 61 62 49 74 65 6d 5b 30 5d 2e 6a 6f 69 6e 74 79  abItem[0].jointy
1cc20 70 65 20 26 20 4a 54 5f 4c 45 46 54 29 21 3d 30  pe & JT_LEFT)!=0
1cc30 20 29 7b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e   ){.    pLevel->
1cc40 69 4c 65 66 74 4a 6f 69 6e 20 3d 20 2b 2b 70 50  iLeftJoin = ++pP
1cc50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
1cc60 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1cc70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
1cc80 20 30 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66   0, pLevel->iLef
1cc90 74 4a 6f 69 6e 29 3b 0a 20 20 20 20 56 64 62 65  tJoin);.    Vdbe
1cca0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 69 6e 69  Comment((v, "ini
1ccb0 74 20 4c 45 46 54 20 4a 4f 49 4e 20 6e 6f 2d 6d  t LEFT JOIN no-m
1ccc0 61 74 63 68 20 66 6c 61 67 22 29 29 3b 0a 20 20  atch flag"));.  
1ccd0 7d 0a 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c 20  }..  /* Special 
1cce0 63 61 73 65 20 6f 66 20 61 20 46 52 4f 4d 20 63  case of a FROM c
1ccf0 6c 61 75 73 65 20 73 75 62 71 75 65 72 79 20 69  lause subquery i
1cd00 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 20  mplemented as a 
1cd10 63 6f 2d 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  co-routine */.  
1cd20 69 66 28 20 70 54 61 62 49 74 65 6d 2d 3e 76 69  if( pTabItem->vi
1cd30 61 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20  aCoroutine ){.  
1cd40 20 20 69 6e 74 20 72 65 67 59 69 65 6c 64 20 3d    int regYield =
1cd50 20 70 54 61 62 49 74 65 6d 2d 3e 72 65 67 52 65   pTabItem->regRe
1cd60 74 75 72 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65  turn;.    sqlite
1cd70 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
1cd80 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 2c  P_InitCoroutine,
1cd90 20 72 65 67 59 69 65 6c 64 2c 20 30 2c 20 70 54   regYield, 0, pT
1cda0 61 62 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c  abItem->addrFill
1cdb0 53 75 62 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c  Sub);.    pLevel
1cdc0 2d 3e 70 32 20 3d 20 20 73 71 6c 69 74 65 33 56  ->p2 =  sqlite3V
1cdd0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1cde0 59 69 65 6c 64 2c 20 72 65 67 59 69 65 6c 64 2c  Yield, regYield,
1cdf0 20 61 64 64 72 42 72 6b 29 3b 0a 20 20 20 20 56   addrBrk);.    V
1ce00 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
1ce10 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
1ce20 28 76 2c 20 22 6e 65 78 74 20 72 6f 77 20 6f 66  (v, "next row of
1ce30 20 5c 22 25 73 5c 22 22 2c 20 70 54 61 62 49 74   \"%s\"", pTabIt
1ce40 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  em->pTab->zName)
1ce50 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f  );.    pLevel->o
1ce60 70 20 3d 20 4f 50 5f 47 6f 74 6f 3b 0a 20 20 7d  p = OP_Goto;.  }
1ce70 65 6c 73 65 0a 0a 23 69 66 6e 64 65 66 20 53 51  else..#ifndef SQ
1ce80 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
1ce90 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 20 28 70  LTABLE.  if(  (p
1cea0 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
1ceb0 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42  WHERE_VIRTUALTAB
1cec0 4c 45 29 21 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  LE)!=0 ){.    /*
1ced0 20 43 61 73 65 20 31 3a 20 20 54 68 65 20 74 61   Case 1:  The ta
1cee0 62 6c 65 20 69 73 20 61 20 76 69 72 74 75 61 6c  ble is a virtual
1cef0 2d 74 61 62 6c 65 2e 20 20 55 73 65 20 74 68 65  -table.  Use the
1cf00 20 56 46 69 6c 74 65 72 20 61 6e 64 20 56 4e 65   VFilter and VNe
1cf10 78 74 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  xt.    **       
1cf20 20 20 20 74 6f 20 61 63 63 65 73 73 20 74 68 65     to access the
1cf30 20 64 61 74 61 2e 0a 20 20 20 20 2a 2f 0a 20 20   data..    */.  
1cf40 20 20 69 6e 74 20 69 52 65 67 3b 20 20 20 2f 2a    int iReg;   /*
1cf50 20 50 33 20 56 61 6c 75 65 20 66 6f 72 20 4f 50   P3 Value for OP
1cf60 5f 56 46 69 6c 74 65 72 20 2a 2f 0a 20 20 20 20  _VFilter */.    
1cf70 69 6e 74 20 61 64 64 72 4e 6f 74 46 6f 75 6e 64  int addrNotFound
1cf80 3b 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6e 73 74  ;.    int nConst
1cf90 72 61 69 6e 74 20 3d 20 70 4c 6f 6f 70 2d 3e 6e  raint = pLoop->n
1cfa0 4c 54 65 72 6d 3b 0a 0a 20 20 20 20 73 71 6c 69  LTerm;..    sqli
1cfb0 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68  te3ExprCachePush
1cfc0 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 52  (pParse);.    iR
1cfd0 65 67 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  eg = sqlite3GetT
1cfe0 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
1cff0 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 32 29 3b   nConstraint+2);
1d000 0a 20 20 20 20 61 64 64 72 4e 6f 74 46 6f 75 6e  .    addrNotFoun
1d010 64 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72  d = pLevel->addr
1d020 42 72 6b 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30  Brk;.    for(j=0
1d030 3b 20 6a 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 3b  ; j<nConstraint;
1d040 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74   j++){.      int
1d050 20 69 54 61 72 67 65 74 20 3d 20 69 52 65 67 2b   iTarget = iReg+
1d060 6a 2b 32 3b 0a 20 20 20 20 20 20 70 54 65 72 6d  j+2;.      pTerm
1d070 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d   = pLoop->aLTerm
1d080 5b 6a 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70  [j];.      if( p
1d090 54 65 72 6d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  Term==0 ) contin
1d0a0 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54  ue;.      if( pT
1d0b0 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
1d0c0 20 57 4f 5f 49 4e 20 29 7b 0a 20 20 20 20 20 20   WO_IN ){.      
1d0d0 20 20 63 6f 64 65 45 71 75 61 6c 69 74 79 54 65    codeEqualityTe
1d0e0 72 6d 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d  rm(pParse, pTerm
1d0f0 2c 20 70 4c 65 76 65 6c 2c 20 6a 2c 20 62 52 65  , pLevel, j, bRe
1d100 76 2c 20 69 54 61 72 67 65 74 29 3b 0a 20 20 20  v, iTarget);.   
1d110 20 20 20 20 20 61 64 64 72 4e 6f 74 46 6f 75 6e       addrNotFoun
1d120 64 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72  d = pLevel->addr
1d130 4e 78 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  Nxt;.      }else
1d140 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1d150 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
1d160 2c 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e  , pTerm->pExpr->
1d170 70 52 69 67 68 74 2c 20 69 54 61 72 67 65 74 29  pRight, iTarget)
1d180 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1d190 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1d1a0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
1d1b0 67 65 72 2c 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74  ger, pLoop->u.vt
1d1c0 61 62 2e 69 64 78 4e 75 6d 2c 20 69 52 65 67 29  ab.idxNum, iReg)
1d1d0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1d1e0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
1d1f0 74 65 67 65 72 2c 20 6e 43 6f 6e 73 74 72 61 69  teger, nConstrai
1d200 6e 74 2c 20 69 52 65 67 2b 31 29 3b 0a 20 20 20  nt, iReg+1);.   
1d210 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1d220 70 34 28 76 2c 20 4f 50 5f 56 46 69 6c 74 65 72  p4(v, OP_VFilter
1d230 2c 20 69 43 75 72 2c 20 61 64 64 72 4e 6f 74 46  , iCur, addrNotF
1d240 6f 75 6e 64 2c 20 69 52 65 67 2c 0a 20 20 20 20  ound, iReg,.    
1d250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d260 20 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e    pLoop->u.vtab.
1d270 69 64 78 53 74 72 2c 0a 20 20 20 20 20 20 20 20  idxStr,.        
1d280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4c                pL
1d290 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64  oop->u.vtab.need
1d2a0 46 72 65 65 20 3f 20 50 34 5f 4d 50 52 49 4e 54  Free ? P4_MPRINT
1d2b0 46 20 3a 20 50 34 5f 53 54 41 54 49 43 29 3b 0a  F : P4_STATIC);.
1d2c0 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
1d2d0 28 76 29 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e  (v);.    pLoop->
1d2e0 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20  u.vtab.needFree 
1d2f0 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30  = 0;.    for(j=0
1d300 3b 20 6a 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 20  ; j<nConstraint 
1d310 26 26 20 6a 3c 31 36 3b 20 6a 2b 2b 29 7b 0a 20  && j<16; j++){. 
1d320 20 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d       if( (pLoop-
1d330 3e 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b  >u.vtab.omitMask
1d340 3e 3e 6a 29 26 31 20 29 7b 0a 20 20 20 20 20 20  >>j)&1 ){.      
1d350 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c    disableTerm(pL
1d360 65 76 65 6c 2c 20 70 4c 6f 6f 70 2d 3e 61 4c 54  evel, pLoop->aLT
1d370 65 72 6d 5b 6a 5d 29 3b 0a 20 20 20 20 20 20 7d  erm[j]);.      }
1d380 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 65 76 65  .    }.    pLeve
1d390 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 56 4e 65 78 74  l->op = OP_VNext
1d3a0 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31  ;.    pLevel->p1
1d3b0 20 3d 20 69 43 75 72 3b 0a 20 20 20 20 70 4c 65   = iCur;.    pLe
1d3c0 76 65 6c 2d 3e 70 32 20 3d 20 73 71 6c 69 74 65  vel->p2 = sqlite
1d3d0 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
1d3e0 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (v);.    sqlite3
1d3f0 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65  ReleaseTempRange
1d400 28 70 50 61 72 73 65 2c 20 69 52 65 67 2c 20 6e  (pParse, iReg, n
1d410 43 6f 6e 73 74 72 61 69 6e 74 2b 32 29 3b 0a 20  Constraint+2);. 
1d420 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
1d430 63 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a  chePop(pParse);.
1d440 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f    }else.#endif /
1d450 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  * SQLITE_OMIT_VI
1d460 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 20  RTUALTABLE */.. 
1d470 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46   if( (pLoop->wsF
1d480 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 50 4b  lags & WHERE_IPK
1d490 29 21 3d 30 0a 20 20 20 26 26 20 28 70 4c 6f 6f  )!=0.   && (pLoo
1d4a0 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 28 57 48  p->wsFlags & (WH
1d4b0 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 7c 57 48  ERE_COLUMN_IN|WH
1d4c0 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 29 29 21  ERE_COLUMN_EQ))!
1d4d0 3d 30 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20 43  =0.  ){.    /* C
1d4e0 61 73 65 20 32 3a 20 20 57 65 20 63 61 6e 20 64  ase 2:  We can d
1d4f0 69 72 65 63 74 6c 79 20 72 65 66 65 72 65 6e 63  irectly referenc
1d500 65 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 75  e a single row u
1d510 73 69 6e 67 20 61 6e 0a 20 20 20 20 2a 2a 20 20  sing an.    **  
1d520 20 20 20 20 20 20 20 20 65 71 75 61 6c 69 74 79          equality
1d530 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61 67 61 69   comparison agai
1d540 6e 73 74 20 74 68 65 20 52 4f 57 49 44 20 66 69  nst the ROWID fi
1d550 65 6c 64 2e 20 20 4f 72 0a 20 20 20 20 2a 2a 20  eld.  Or.    ** 
1d560 20 20 20 20 20 20 20 20 20 77 65 20 72 65 66 65           we refe
1d570 72 65 6e 63 65 20 6d 75 6c 74 69 70 6c 65 20 72  rence multiple r
1d580 6f 77 73 20 75 73 69 6e 67 20 61 20 22 72 6f 77  ows using a "row
1d590 69 64 20 49 4e 20 28 2e 2e 2e 29 22 0a 20 20 20  id IN (...)".   
1d5a0 20 2a 2a 20 20 20 20 20 20 20 20 20 20 63 6f 6e   **          con
1d5b0 73 74 72 75 63 74 2e 0a 20 20 20 20 2a 2f 0a 20  struct..    */. 
1d5c0 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 6f 70     assert( pLoop
1d5d0 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3d 3d 31  ->u.btree.nEq==1
1d5e0 20 29 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d 20   );.    pTerm = 
1d5f0 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d  pLoop->aLTerm[0]
1d600 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54  ;.    assert( pT
1d610 65 72 6d 21 3d 30 20 29 3b 0a 20 20 20 20 61 73  erm!=0 );.    as
1d620 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 70 45 78  sert( pTerm->pEx
1d630 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  pr!=0 );.    ass
1d640 65 72 74 28 20 6f 6d 69 74 54 61 62 6c 65 3d 3d  ert( omitTable==
1d650 30 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  0 );.    testcas
1d660 65 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  e( pTerm->wtFlag
1d670 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  s & TERM_VIRTUAL
1d680 20 29 3b 0a 20 20 20 20 69 52 65 6c 65 61 73 65   );.    iRelease
1d690 52 65 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  Reg = ++pParse->
1d6a0 6e 4d 65 6d 3b 0a 20 20 20 20 69 52 6f 77 69 64  nMem;.    iRowid
1d6b0 52 65 67 20 3d 20 63 6f 64 65 45 71 75 61 6c 69  Reg = codeEquali
1d6c0 74 79 54 65 72 6d 28 70 50 61 72 73 65 2c 20 70  tyTerm(pParse, p
1d6d0 54 65 72 6d 2c 20 70 4c 65 76 65 6c 2c 20 30 2c  Term, pLevel, 0,
1d6e0 20 62 52 65 76 2c 20 69 52 65 6c 65 61 73 65 52   bRev, iReleaseR
1d6f0 65 67 29 3b 0a 20 20 20 20 69 66 28 20 69 52 6f  eg);.    if( iRo
1d700 77 69 64 52 65 67 21 3d 69 52 65 6c 65 61 73 65  widReg!=iRelease
1d710 52 65 67 20 29 20 73 71 6c 69 74 65 33 52 65 6c  Reg ) sqlite3Rel
1d720 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
1d730 73 65 2c 20 69 52 65 6c 65 61 73 65 52 65 67 29  se, iReleaseReg)
1d740 3b 0a 20 20 20 20 61 64 64 72 4e 78 74 20 3d 20  ;.    addrNxt = 
1d750 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 3b  pLevel->addrNxt;
1d760 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1d770 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4d 75 73  AddOp2(v, OP_Mus
1d780 74 42 65 49 6e 74 2c 20 69 52 6f 77 69 64 52 65  tBeInt, iRowidRe
1d790 67 2c 20 61 64 64 72 4e 78 74 29 3b 20 56 64 62  g, addrNxt); Vdb
1d7a0 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
1d7b0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1d7c0 4f 70 33 28 76 2c 20 4f 50 5f 4e 6f 74 45 78 69  Op3(v, OP_NotExi
1d7d0 73 74 73 2c 20 69 43 75 72 2c 20 61 64 64 72 4e  sts, iCur, addrN
1d7e0 78 74 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a  xt, iRowidReg);.
1d7f0 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
1d800 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (v);.    sqlite3
1d810 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74  ExprCacheAffinit
1d820 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20  yChange(pParse, 
1d830 69 52 6f 77 69 64 52 65 67 2c 20 31 29 3b 0a 20  iRowidReg, 1);. 
1d840 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
1d850 63 68 65 53 74 6f 72 65 28 70 50 61 72 73 65 2c  cheStore(pParse,
1d860 20 69 43 75 72 2c 20 2d 31 2c 20 69 52 6f 77 69   iCur, -1, iRowi
1d870 64 52 65 67 29 3b 0a 20 20 20 20 56 64 62 65 43  dReg);.    VdbeC
1d880 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 70 6b 22 29  omment((v, "pk")
1d890 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f  );.    pLevel->o
1d8a0 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 7d  p = OP_Noop;.  }
1d8b0 65 6c 73 65 20 69 66 28 20 28 70 4c 6f 6f 70 2d  else if( (pLoop-
1d8c0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
1d8d0 5f 49 50 4b 29 21 3d 30 0a 20 20 20 20 20 20 20  _IPK)!=0.       
1d8e0 20 20 26 26 20 28 70 4c 6f 6f 70 2d 3e 77 73 46    && (pLoop->wsF
1d8f0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c  lags & WHERE_COL
1d900 55 4d 4e 5f 52 41 4e 47 45 29 21 3d 30 0a 20 20  UMN_RANGE)!=0.  
1d910 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 33  ){.    /* Case 3
1d920 3a 20 20 57 65 20 68 61 76 65 20 61 6e 20 69 6e  :  We have an in
1d930 65 71 75 61 6c 69 74 79 20 63 6f 6d 70 61 72 69  equality compari
1d940 73 6f 6e 20 61 67 61 69 6e 73 74 20 74 68 65 20  son against the 
1d950 52 4f 57 49 44 20 66 69 65 6c 64 2e 0a 20 20 20  ROWID field..   
1d960 20 2a 2f 0a 20 20 20 20 69 6e 74 20 74 65 73 74   */.    int test
1d970 4f 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20  Op = OP_Noop;.  
1d980 20 20 69 6e 74 20 73 74 61 72 74 3b 0a 20 20 20    int start;.   
1d990 20 69 6e 74 20 6d 65 6d 45 6e 64 56 61 6c 75 65   int memEndValue
1d9a0 20 3d 20 30 3b 0a 20 20 20 20 57 68 65 72 65 54   = 0;.    WhereT
1d9b0 65 72 6d 20 2a 70 53 74 61 72 74 2c 20 2a 70 45  erm *pStart, *pE
1d9c0 6e 64 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28  nd;..    assert(
1d9d0 20 6f 6d 69 74 54 61 62 6c 65 3d 3d 30 20 29 3b   omitTable==0 );
1d9e0 0a 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20  .    j = 0;.    
1d9f0 70 53 74 61 72 74 20 3d 20 70 45 6e 64 20 3d 20  pStart = pEnd = 
1da00 30 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70  0;.    if( pLoop
1da10 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
1da20 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 20 70 53  E_BTM_LIMIT ) pS
1da30 74 61 72 74 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c  tart = pLoop->aL
1da40 54 65 72 6d 5b 6a 2b 2b 5d 3b 0a 20 20 20 20 69  Term[j++];.    i
1da50 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  f( pLoop->wsFlag
1da60 73 20 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49  s & WHERE_TOP_LI
1da70 4d 49 54 20 29 20 70 45 6e 64 20 3d 20 70 4c 6f  MIT ) pEnd = pLo
1da80 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 2b 2b 5d 3b  op->aLTerm[j++];
1da90 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 53 74  .    assert( pSt
1daa0 61 72 74 21 3d 30 20 7c 7c 20 70 45 6e 64 21 3d  art!=0 || pEnd!=
1dab0 30 20 29 3b 0a 20 20 20 20 69 66 28 20 62 52 65  0 );.    if( bRe
1dac0 76 20 29 7b 0a 20 20 20 20 20 20 70 54 65 72 6d  v ){.      pTerm
1dad0 20 3d 20 70 53 74 61 72 74 3b 0a 20 20 20 20 20   = pStart;.     
1dae0 20 70 53 74 61 72 74 20 3d 20 70 45 6e 64 3b 0a   pStart = pEnd;.
1daf0 20 20 20 20 20 20 70 45 6e 64 20 3d 20 70 54 65        pEnd = pTe
1db00 72 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  rm;.    }.    if
1db10 28 20 70 53 74 61 72 74 20 29 7b 0a 20 20 20 20  ( pStart ){.    
1db20 20 20 45 78 70 72 20 2a 70 58 3b 20 20 20 20 20    Expr *pX;     
1db30 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65          /* The e
1db40 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 64  xpression that d
1db50 65 66 69 6e 65 73 20 74 68 65 20 73 74 61 72 74  efines the start
1db60 20 62 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20   bound */.      
1db70 69 6e 74 20 72 31 2c 20 72 54 65 6d 70 3b 20 20  int r1, rTemp;  
1db80 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
1db90 72 73 20 66 6f 72 20 68 6f 6c 64 69 6e 67 20 74  rs for holding t
1dba0 68 65 20 73 74 61 72 74 20 62 6f 75 6e 64 61 72  he start boundar
1dbb0 79 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 54  y */..      /* T
1dbc0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6e  he following con
1dbd0 73 74 61 6e 74 20 6d 61 70 73 20 54 4b 5f 78 78  stant maps TK_xx
1dbe0 20 63 6f 64 65 73 20 69 6e 74 6f 20 63 6f 72 72   codes into corr
1dbf0 65 73 70 6f 6e 64 69 6e 67 20 0a 20 20 20 20 20  esponding .     
1dc00 20 2a 2a 20 73 65 65 6b 20 6f 70 63 6f 64 65 73   ** seek opcodes
1dc10 2e 20 20 49 74 20 64 65 70 65 6e 64 73 20 6f 6e  .  It depends on
1dc20 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 6f 72   a particular or
1dc30 64 65 72 69 6e 67 20 6f 66 20 54 4b 5f 78 78 0a  dering of TK_xx.
1dc40 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63        */.      c
1dc50 6f 6e 73 74 20 75 38 20 61 4d 6f 76 65 4f 70 5b  onst u8 aMoveOp[
1dc60 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 20 20  ] = {.          
1dc70 20 2f 2a 20 54 4b 5f 47 54 20 2a 2f 20 20 4f 50   /* TK_GT */  OP
1dc80 5f 53 65 65 6b 47 54 2c 0a 20 20 20 20 20 20 20  _SeekGT,.       
1dc90 20 20 20 20 2f 2a 20 54 4b 5f 4c 45 20 2a 2f 20      /* TK_LE */ 
1dca0 20 4f 50 5f 53 65 65 6b 4c 45 2c 0a 20 20 20 20   OP_SeekLE,.    
1dcb0 20 20 20 20 20 20 20 2f 2a 20 54 4b 5f 4c 54 20         /* TK_LT 
1dcc0 2a 2f 20 20 4f 50 5f 53 65 65 6b 4c 54 2c 0a 20  */  OP_SeekLT,. 
1dcd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 4b 5f            /* TK_
1dce0 47 45 20 2a 2f 20 20 4f 50 5f 53 65 65 6b 47 45  GE */  OP_SeekGE
1dcf0 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20  .      };.      
1dd00 61 73 73 65 72 74 28 20 54 4b 5f 4c 45 3d 3d 54  assert( TK_LE==T
1dd10 4b 5f 47 54 2b 31 20 29 3b 20 20 20 20 20 20 2f  K_GT+1 );      /
1dd20 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
1dd30 6f 72 64 65 72 69 6e 67 2e 2e 20 2a 2f 0a 20 20  ordering.. */.  
1dd40 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c      assert( TK_L
1dd50 54 3d 3d 54 4b 5f 47 54 2b 32 20 29 3b 20 20 20  T==TK_GT+2 );   
1dd60 20 20 20 2f 2a 20 20 2e 2e 2e 20 6f 66 20 74 68     /*  ... of th
1dd70 65 20 54 4b 5f 78 78 20 76 61 6c 75 65 73 2e 2e  e TK_xx values..
1dd80 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  . */.      asser
1dd90 74 28 20 54 4b 5f 47 45 3d 3d 54 4b 5f 47 54 2b  t( TK_GE==TK_GT+
1dda0 33 20 29 3b 20 20 20 20 20 20 2f 2a 20 20 2e 2e  3 );      /*  ..
1ddb0 2e 20 69 73 20 63 6f 72 72 65 63 63 74 2e 20 2a  . is correcct. *
1ddc0 2f 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  /..      assert(
1ddd0 20 28 70 53 74 61 72 74 2d 3e 77 74 46 6c 61 67   (pStart->wtFlag
1dde0 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d  s & TERM_VNULL)=
1ddf0 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  =0 );.      test
1de00 63 61 73 65 28 20 70 53 74 61 72 74 2d 3e 77 74  case( pStart->wt
1de10 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52  Flags & TERM_VIR
1de20 54 55 41 4c 20 29 3b 0a 20 20 20 20 20 20 70 58  TUAL );.      pX
1de30 20 3d 20 70 53 74 61 72 74 2d 3e 70 45 78 70 72   = pStart->pExpr
1de40 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1de50 70 58 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 74  pX!=0 );.      t
1de60 65 73 74 63 61 73 65 28 20 70 53 74 61 72 74 2d  estcase( pStart-
1de70 3e 6c 65 66 74 43 75 72 73 6f 72 21 3d 69 43 75  >leftCursor!=iCu
1de80 72 20 29 3b 20 2f 2a 20 74 72 61 6e 73 69 74 69  r ); /* transiti
1de90 76 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a  ve constraints *
1dea0 2f 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  /.      r1 = sql
1deb0 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
1dec0 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 52 69  (pParse, pX->pRi
1ded0 67 68 74 2c 20 26 72 54 65 6d 70 29 3b 0a 20 20  ght, &rTemp);.  
1dee0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1def0 64 64 4f 70 33 28 76 2c 20 61 4d 6f 76 65 4f 70  ddOp3(v, aMoveOp
1df00 5b 70 58 2d 3e 6f 70 2d 54 4b 5f 47 54 5d 2c 20  [pX->op-TK_GT], 
1df10 69 43 75 72 2c 20 61 64 64 72 42 72 6b 2c 20 72  iCur, addrBrk, r
1df20 31 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  1);.      VdbeCo
1df30 6d 6d 65 6e 74 28 28 76 2c 20 22 70 6b 22 29 29  mment((v, "pk"))
1df40 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
1df50 72 61 67 65 49 66 28 76 2c 20 70 58 2d 3e 6f 70  rageIf(v, pX->op
1df60 3d 3d 54 4b 5f 47 54 29 3b 0a 20 20 20 20 20 20  ==TK_GT);.      
1df70 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
1df80 2c 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45 29  , pX->op==TK_LE)
1df90 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
1dfa0 72 61 67 65 49 66 28 76 2c 20 70 58 2d 3e 6f 70  rageIf(v, pX->op
1dfb0 3d 3d 54 4b 5f 4c 54 29 3b 0a 20 20 20 20 20 20  ==TK_LT);.      
1dfc0 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
1dfd0 2c 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 47 45 29  , pX->op==TK_GE)
1dfe0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1dff0 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79  xprCacheAffinity
1e000 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72  Change(pParse, r
1e010 31 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  1, 1);.      sql
1e020 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
1e030 65 67 28 70 50 61 72 73 65 2c 20 72 54 65 6d 70  eg(pParse, rTemp
1e040 29 3b 0a 20 20 20 20 20 20 64 69 73 61 62 6c 65  );.      disable
1e050 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 53 74  Term(pLevel, pSt
1e060 61 72 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  art);.    }else{
1e070 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1e080 62 65 41 64 64 4f 70 32 28 76 2c 20 62 52 65 76  beAddOp2(v, bRev
1e090 20 3f 20 4f 50 5f 4c 61 73 74 20 3a 20 4f 50 5f   ? OP_Last : OP_
1e0a0 52 65 77 69 6e 64 2c 20 69 43 75 72 2c 20 61 64  Rewind, iCur, ad
1e0b0 64 72 42 72 6b 29 3b 0a 20 20 20 20 20 20 56 64  drBrk);.      Vd
1e0c0 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
1e0d0 62 52 65 76 3d 3d 30 29 3b 0a 20 20 20 20 20 20  bRev==0);.      
1e0e0 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
1e0f0 2c 20 62 52 65 76 21 3d 30 29 3b 0a 20 20 20 20  , bRev!=0);.    
1e100 7d 0a 20 20 20 20 69 66 28 20 70 45 6e 64 20 29  }.    if( pEnd )
1e110 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 58  {.      Expr *pX
1e120 3b 0a 20 20 20 20 20 20 70 58 20 3d 20 70 45 6e  ;.      pX = pEn
1e130 64 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  d->pExpr;.      
1e140 61 73 73 65 72 74 28 20 70 58 21 3d 30 20 29 3b  assert( pX!=0 );
1e150 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28  .      assert( (
1e160 70 45 6e 64 2d 3e 77 74 46 6c 61 67 73 20 26 20  pEnd->wtFlags & 
1e170 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29  TERM_VNULL)==0 )
1e180 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1e190 28 20 70 45 6e 64 2d 3e 6c 65 66 74 43 75 72 73  ( pEnd->leftCurs
1e1a0 6f 72 21 3d 69 43 75 72 20 29 3b 20 2f 2a 20 54  or!=iCur ); /* T
1e1b0 72 61 6e 73 69 74 69 76 65 20 63 6f 6e 73 74 72  ransitive constr
1e1c0 61 69 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 74  aints */.      t
1e1d0 65 73 74 63 61 73 65 28 20 70 45 6e 64 2d 3e 77  estcase( pEnd->w
1e1e0 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49  tFlags & TERM_VI
1e1f0 52 54 55 41 4c 20 29 3b 0a 20 20 20 20 20 20 6d  RTUAL );.      m
1e200 65 6d 45 6e 64 56 61 6c 75 65 20 3d 20 2b 2b 70  emEndValue = ++p
1e210 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
1e220 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
1e230 64 65 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70  de(pParse, pX->p
1e240 52 69 67 68 74 2c 20 6d 65 6d 45 6e 64 56 61 6c  Right, memEndVal
1e250 75 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ue);.      if( p
1e260 58 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 20  X->op==TK_LT || 
1e270 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20 29 7b  pX->op==TK_GT ){
1e280 0a 20 20 20 20 20 20 20 20 74 65 73 74 4f 70 20  .        testOp 
1e290 3d 20 62 52 65 76 20 3f 20 4f 50 5f 4c 65 20 3a  = bRev ? OP_Le :
1e2a0 20 4f 50 5f 47 65 3b 0a 20 20 20 20 20 20 7d 65   OP_Ge;.      }e
1e2b0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 74 65 73  lse{.        tes
1e2c0 74 4f 70 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f  tOp = bRev ? OP_
1e2d0 4c 74 20 3a 20 4f 50 5f 47 74 3b 0a 20 20 20 20  Lt : OP_Gt;.    
1e2e0 20 20 7d 0a 20 20 20 20 20 20 64 69 73 61 62 6c    }.      disabl
1e2f0 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 45  eTerm(pLevel, pE
1e300 6e 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  nd);.    }.    s
1e310 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64  tart = sqlite3Vd
1e320 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
1e330 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70  ;.    pLevel->op
1e340 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f 50 72 65   = bRev ? OP_Pre
1e350 76 20 3a 20 4f 50 5f 4e 65 78 74 3b 0a 20 20 20  v : OP_Next;.   
1e360 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69 43   pLevel->p1 = iC
1e370 75 72 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  ur;.    pLevel->
1e380 70 32 20 3d 20 73 74 61 72 74 3b 0a 20 20 20 20  p2 = start;.    
1e390 61 73 73 65 72 74 28 20 70 4c 65 76 65 6c 2d 3e  assert( pLevel->
1e3a0 70 35 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  p5==0 );.    if(
1e3b0 20 74 65 73 74 4f 70 21 3d 4f 50 5f 4e 6f 6f 70   testOp!=OP_Noop
1e3c0 20 29 7b 0a 20 20 20 20 20 20 69 52 6f 77 69 64   ){.      iRowid
1e3d0 52 65 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  Reg = ++pParse->
1e3e0 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69  nMem;.      sqli
1e3f0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1e400 20 4f 50 5f 52 6f 77 69 64 2c 20 69 43 75 72 2c   OP_Rowid, iCur,
1e410 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20   iRowidReg);.   
1e420 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
1e430 63 68 65 53 74 6f 72 65 28 70 50 61 72 73 65 2c  cheStore(pParse,
1e440 20 69 43 75 72 2c 20 2d 31 2c 20 69 52 6f 77 69   iCur, -1, iRowi
1e450 64 52 65 67 29 3b 0a 20 20 20 20 20 20 73 71 6c  dReg);.      sql
1e460 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
1e470 2c 20 74 65 73 74 4f 70 2c 20 6d 65 6d 45 6e 64  , testOp, memEnd
1e480 56 61 6c 75 65 2c 20 61 64 64 72 42 72 6b 2c 20  Value, addrBrk, 
1e490 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20  iRowidReg);.    
1e4a0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
1e4b0 28 76 2c 20 74 65 73 74 4f 70 3d 3d 4f 50 5f 4c  (v, testOp==OP_L
1e4c0 65 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  e);.      VdbeCo
1e4d0 76 65 72 61 67 65 49 66 28 76 2c 20 74 65 73 74  verageIf(v, test
1e4e0 4f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20 20 20  Op==OP_Lt);.    
1e4f0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
1e500 28 76 2c 20 74 65 73 74 4f 70 3d 3d 4f 50 5f 47  (v, testOp==OP_G
1e510 65 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  e);.      VdbeCo
1e520 76 65 72 61 67 65 49 66 28 76 2c 20 74 65 73 74  verageIf(v, test
1e530 4f 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20 20 20  Op==OP_Gt);.    
1e540 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
1e550 6e 67 65 50 35 28 76 2c 20 53 51 4c 49 54 45 5f  ngeP5(v, SQLITE_
1e560 41 46 46 5f 4e 55 4d 45 52 49 43 20 7c 20 53 51  AFF_NUMERIC | SQ
1e570 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29  LITE_JUMPIFNULL)
1e580 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  ;.    }.  }else 
1e590 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  if( pLoop->wsFla
1e5a0 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58  gs & WHERE_INDEX
1e5b0 45 44 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73  ED ){.    /* Cas
1e5c0 65 20 34 3a 20 41 20 73 63 61 6e 20 75 73 69 6e  e 4: A scan usin
1e5d0 67 20 61 6e 20 69 6e 64 65 78 2e 0a 20 20 20 20  g an index..    
1e5e0 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  **.    **       
1e5f0 20 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75    The WHERE clau
1e600 73 65 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 7a  se may contain z
1e610 65 72 6f 20 6f 72 20 6d 6f 72 65 20 65 71 75 61  ero or more equa
1e620 6c 69 74 79 20 0a 20 20 20 20 2a 2a 20 20 20 20  lity .    **    
1e630 20 20 20 20 20 74 65 72 6d 73 20 28 22 3d 3d 22       terms ("=="
1e640 20 6f 72 20 22 49 4e 22 20 6f 70 65 72 61 74 6f   or "IN" operato
1e650 72 73 29 20 74 68 61 74 20 72 65 66 65 72 20 74  rs) that refer t
1e660 6f 20 74 68 65 20 4e 0a 20 20 20 20 2a 2a 20 20  o the N.    **  
1e670 20 20 20 20 20 20 20 6c 65 66 74 2d 6d 6f 73 74         left-most
1e680 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20   columns of the 
1e690 69 6e 64 65 78 2e 20 49 74 20 6d 61 79 20 61 6c  index. It may al
1e6a0 73 6f 20 63 6f 6e 74 61 69 6e 0a 20 20 20 20 2a  so contain.    *
1e6b0 2a 20 20 20 20 20 20 20 20 20 69 6e 65 71 75 61  *         inequa
1e6c0 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73  lity constraints
1e6d0 20 28 3e 2c 20 3c 2c 20 3e 3d 20 6f 72 20 3c 3d   (>, <, >= or <=
1e6e0 29 20 6f 6e 20 74 68 65 20 69 6e 64 65 78 65 64  ) on the indexed
1e6f0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
1e700 63 6f 6c 75 6d 6e 20 74 68 61 74 20 69 6d 6d 65  column that imme
1e710 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 73 20  diately follows 
1e720 74 68 65 20 4e 20 65 71 75 61 6c 69 74 69 65 73  the N equalities
1e730 2e 20 4f 6e 6c 79 20 0a 20 20 20 20 2a 2a 20 20  . Only .    **  
1e740 20 20 20 20 20 20 20 74 68 65 20 72 69 67 68 74         the right
1e750 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 63 61 6e  -most column can
1e760 20 62 65 20 61 6e 20 69 6e 65 71 75 61 6c 69 74   be an inequalit
1e770 79 20 2d 20 74 68 65 20 72 65 73 74 20 6d 75 73  y - the rest mus
1e780 74 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  t.    **        
1e790 20 75 73 65 20 74 68 65 20 22 3d 3d 22 20 61 6e   use the "==" an
1e7a0 64 20 22 49 4e 22 20 6f 70 65 72 61 74 6f 72 73  d "IN" operators
1e7b0 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69  . For example, i
1e7c0 66 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 20 20  f the .    **   
1e7d0 20 20 20 20 20 20 69 6e 64 65 78 20 69 73 20 6f        index is o
1e7e0 6e 20 28 78 2c 79 2c 7a 29 2c 20 74 68 65 6e 20  n (x,y,z), then 
1e7f0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6c  the following cl
1e800 61 75 73 65 73 20 61 72 65 20 61 6c 6c 20 0a 20  auses are all . 
1e810 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 6f 70     **         op
1e820 74 69 6d 69 7a 65 64 3a 0a 20 20 20 20 2a 2a 0a  timized:.    **.
1e830 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
1e840 20 20 78 3d 35 0a 20 20 20 20 2a 2a 20 20 20 20    x=5.    **    
1e850 20 20 20 20 20 20 20 20 78 3d 35 20 41 4e 44 20          x=5 AND 
1e860 79 3d 31 30 0a 20 20 20 20 2a 2a 20 20 20 20 20  y=10.    **     
1e870 20 20 20 20 20 20 20 78 3d 35 20 41 4e 44 20 79         x=5 AND y
1e880 3c 31 30 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  <10.    **      
1e890 20 20 20 20 20 20 78 3d 35 20 41 4e 44 20 79 3e        x=5 AND y>
1e8a0 35 20 41 4e 44 20 79 3c 31 30 0a 20 20 20 20 2a  5 AND y<10.    *
1e8b0 2a 20 20 20 20 20 20 20 20 20 20 20 20 78 3d 35  *            x=5
1e8c0 20 41 4e 44 20 79 3d 35 20 41 4e 44 20 7a 3c 3d   AND y=5 AND z<=
1e8d0 31 30 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  10.    **.    **
1e8e0 20 20 20 20 20 20 20 20 20 54 68 65 20 7a 3c 31           The z<1
1e8f0 30 20 74 65 72 6d 20 6f 66 20 74 68 65 20 66 6f  0 term of the fo
1e900 6c 6c 6f 77 69 6e 67 20 63 61 6e 6e 6f 74 20 62  llowing cannot b
1e910 65 20 75 73 65 64 2c 20 6f 6e 6c 79 0a 20 20 20  e used, only.   
1e920 20 2a 2a 20 20 20 20 20 20 20 20 20 74 68 65 20   **         the 
1e930 78 3d 35 20 74 65 72 6d 3a 0a 20 20 20 20 2a 2a  x=5 term:.    **
1e940 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
1e950 20 20 20 78 3d 35 20 41 4e 44 20 7a 3c 31 30 0a     x=5 AND z<10.
1e960 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
1e970 20 20 20 20 20 20 4e 20 6d 61 79 20 62 65 20 7a        N may be z
1e980 65 72 6f 20 69 66 20 74 68 65 72 65 20 61 72 65  ero if there are
1e990 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73   inequality cons
1e9a0 74 72 61 69 6e 74 73 2e 0a 20 20 20 20 2a 2a 20  traints..    ** 
1e9b0 20 20 20 20 20 20 20 20 49 66 20 74 68 65 72 65          If there
1e9c0 20 61 72 65 20 6e 6f 20 69 6e 65 71 75 61 6c 69   are no inequali
1e9d0 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20  ty constraints, 
1e9e0 74 68 65 6e 20 4e 20 69 73 20 61 74 0a 20 20 20  then N is at.   
1e9f0 20 2a 2a 20 20 20 20 20 20 20 20 20 6c 65 61 73   **         leas
1ea00 74 20 6f 6e 65 2e 0a 20 20 20 20 2a 2a 0a 20 20  t one..    **.  
1ea10 20 20 2a 2a 20 20 20 20 20 20 20 20 20 54 68 69    **         Thi
1ea20 73 20 63 61 73 65 20 69 73 20 61 6c 73 6f 20 75  s case is also u
1ea30 73 65 64 20 77 68 65 6e 20 74 68 65 72 65 20 61  sed when there a
1ea40 72 65 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75  re no WHERE clau
1ea50 73 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  se.    **       
1ea60 20 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 62 75    constraints bu
1ea70 74 20 61 6e 20 69 6e 64 65 78 20 69 73 20 73 65  t an index is se
1ea80 6c 65 63 74 65 64 20 61 6e 79 77 61 79 2c 20 69  lected anyway, i
1ea90 6e 20 6f 72 64 65 72 0a 20 20 20 20 2a 2a 20 20  n order.    **  
1eaa0 20 20 20 20 20 20 20 74 6f 20 66 6f 72 63 65 20         to force 
1eab0 74 68 65 20 6f 75 74 70 75 74 20 6f 72 64 65 72  the output order
1eac0 20 74 6f 20 63 6f 6e 66 6f 72 6d 20 74 6f 20 61   to conform to a
1ead0 6e 20 4f 52 44 45 52 20 42 59 2e 0a 20 20 20 20  n ORDER BY..    
1eae0 2a 2f 20 20 0a 20 20 20 20 73 74 61 74 69 63 20  */  .    static 
1eaf0 63 6f 6e 73 74 20 75 38 20 61 53 74 61 72 74 4f  const u8 aStartO
1eb00 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 30 2c  p[] = {.      0,
1eb10 0a 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20  .      0,.      
1eb20 4f 50 5f 52 65 77 69 6e 64 2c 20 20 20 20 20 20  OP_Rewind,      
1eb30 20 20 20 20 20 2f 2a 20 32 3a 20 28 21 73 74 61       /* 2: (!sta
1eb40 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 26  rt_constraints &
1eb50 26 20 73 74 61 72 74 45 71 20 26 26 20 20 21 62  & startEq &&  !b
1eb60 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50  Rev) */.      OP
1eb70 5f 4c 61 73 74 2c 20 20 20 20 20 20 20 20 20 20  _Last,          
1eb80 20 20 20 2f 2a 20 33 3a 20 28 21 73 74 61 72 74     /* 3: (!start
1eb90 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 26 26 20  _constraints && 
1eba0 73 74 61 72 74 45 71 20 26 26 20 20 20 62 52 65  startEq &&   bRe
1ebb0 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 53  v) */.      OP_S
1ebc0 65 65 6b 47 54 2c 20 20 20 20 20 20 20 20 20 20  eekGT,          
1ebd0 20 2f 2a 20 34 3a 20 28 73 74 61 72 74 5f 63 6f   /* 4: (start_co
1ebe0 6e 73 74 72 61 69 6e 74 73 20 20 26 26 20 21 73  nstraints  && !s
1ebf0 74 61 72 74 45 71 20 26 26 20 21 62 52 65 76 29  tartEq && !bRev)
1ec00 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 53 65 65   */.      OP_See
1ec10 6b 4c 54 2c 20 20 20 20 20 20 20 20 20 20 20 2f  kLT,           /
1ec20 2a 20 35 3a 20 28 73 74 61 72 74 5f 63 6f 6e 73  * 5: (start_cons
1ec30 74 72 61 69 6e 74 73 20 20 26 26 20 21 73 74 61  traints  && !sta
1ec40 72 74 45 71 20 26 26 20 20 62 52 65 76 29 20 2a  rtEq &&  bRev) *
1ec50 2f 0a 20 20 20 20 20 20 4f 50 5f 53 65 65 6b 47  /.      OP_SeekG
1ec60 45 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  E,           /* 
1ec70 36 3a 20 28 73 74 61 72 74 5f 63 6f 6e 73 74 72  6: (start_constr
1ec80 61 69 6e 74 73 20 20 26 26 20 20 73 74 61 72 74  aints  &&  start
1ec90 45 71 20 26 26 20 21 62 52 65 76 29 20 2a 2f 0a  Eq && !bRev) */.
1eca0 20 20 20 20 20 20 4f 50 5f 53 65 65 6b 4c 45 20        OP_SeekLE 
1ecb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 37 3a             /* 7:
1ecc0 20 28 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69   (start_constrai
1ecd0 6e 74 73 20 20 26 26 20 20 73 74 61 72 74 45 71  nts  &&  startEq
1ece0 20 26 26 20 20 62 52 65 76 29 20 2a 2f 0a 20 20   &&  bRev) */.  
1ecf0 20 20 7d 3b 0a 20 20 20 20 73 74 61 74 69 63 20    };.    static 
1ed00 63 6f 6e 73 74 20 75 38 20 61 45 6e 64 4f 70 5b  const u8 aEndOp[
1ed10 5d 20 3d 20 7b 0a 20 20 20 20 20 20 4f 50 5f 49  ] = {.      OP_I
1ed20 64 78 47 45 2c 20 20 20 20 20 20 20 20 20 20 20  dxGE,           
1ed30 20 2f 2a 20 30 3a 20 28 65 6e 64 5f 63 6f 6e 73   /* 0: (end_cons
1ed40 74 72 61 69 6e 74 73 20 26 26 20 21 62 52 65 76  traints && !bRev
1ed50 20 26 26 20 21 65 6e 64 45 71 29 20 2a 2f 0a 20   && !endEq) */. 
1ed60 20 20 20 20 20 4f 50 5f 49 64 78 47 54 2c 20 20       OP_IdxGT,  
1ed70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 3a 20            /* 1: 
1ed80 28 65 6e 64 5f 63 6f 6e 73 74 72 61 69 6e 74 73  (end_constraints
1ed90 20 26 26 20 21 62 52 65 76 20 26 26 20 20 65 6e   && !bRev &&  en
1eda0 64 45 71 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50  dEq) */.      OP
1edb0 5f 49 64 78 4c 45 2c 20 20 20 20 20 20 20 20 20  _IdxLE,         
1edc0 20 20 20 2f 2a 20 32 3a 20 28 65 6e 64 5f 63 6f     /* 2: (end_co
1edd0 6e 73 74 72 61 69 6e 74 73 20 26 26 20 20 62 52  nstraints &&  bR
1ede0 65 76 20 26 26 20 21 65 6e 64 45 71 29 20 2a 2f  ev && !endEq) */
1edf0 0a 20 20 20 20 20 20 4f 50 5f 49 64 78 4c 54 2c  .      OP_IdxLT,
1ee00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 33              /* 3
1ee10 3a 20 28 65 6e 64 5f 63 6f 6e 73 74 72 61 69 6e  : (end_constrain
1ee20 74 73 20 26 26 20 20 62 52 65 76 20 26 26 20 20  ts &&  bRev &&  
1ee30 65 6e 64 45 71 29 20 2a 2f 0a 20 20 20 20 7d 3b  endEq) */.    };
1ee40 0a 20 20 20 20 75 31 36 20 6e 45 71 20 3d 20 70  .    u16 nEq = p
1ee50 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  Loop->u.btree.nE
1ee60 71 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  q;     /* Number
1ee70 20 6f 66 20 3d 3d 20 6f 72 20 49 4e 20 74 65 72   of == or IN ter
1ee80 6d 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65  ms */.    int re
1ee90 67 42 61 73 65 3b 20 20 20 20 20 20 20 20 20 20  gBase;          
1eea0 20 20 20 20 20 20 20 2f 2a 20 42 61 73 65 20 72         /* Base r
1eeb0 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20  egister holding 
1eec0 63 6f 6e 73 74 72 61 69 6e 74 20 76 61 6c 75 65  constraint value
1eed0 73 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 54 65  s */.    WhereTe
1eee0 72 6d 20 2a 70 52 61 6e 67 65 53 74 61 72 74 20  rm *pRangeStart 
1eef0 3d 20 30 3b 20 20 2f 2a 20 49 6e 65 71 75 61 6c  = 0;  /* Inequal
1ef00 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 61  ity constraint a
1ef10 74 20 72 61 6e 67 65 20 73 74 61 72 74 20 2a 2f  t range start */
1ef20 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a  .    WhereTerm *
1ef30 70 52 61 6e 67 65 45 6e 64 20 3d 20 30 3b 20 20  pRangeEnd = 0;  
1ef40 20 20 2f 2a 20 49 6e 65 71 75 61 6c 69 74 79 20    /* Inequality 
1ef50 63 6f 6e 73 74 72 61 69 6e 74 20 61 74 20 72 61  constraint at ra
1ef60 6e 67 65 20 65 6e 64 20 2a 2f 0a 20 20 20 20 69  nge end */.    i
1ef70 6e 74 20 73 74 61 72 74 45 71 3b 20 20 20 20 20  nt startEq;     
1ef80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1ef90 72 75 65 20 69 66 20 72 61 6e 67 65 20 73 74 61  rue if range sta
1efa0 72 74 20 75 73 65 73 20 3d 3d 2c 20 3e 3d 20 6f  rt uses ==, >= o
1efb0 72 20 3c 3d 20 2a 2f 0a 20 20 20 20 69 6e 74 20  r <= */.    int 
1efc0 65 6e 64 45 71 3b 20 20 20 20 20 20 20 20 20 20  endEq;          
1efd0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
1efe0 20 69 66 20 72 61 6e 67 65 20 65 6e 64 20 75 73   if range end us
1eff0 65 73 20 3d 3d 2c 20 3e 3d 20 6f 72 20 3c 3d 20  es ==, >= or <= 
1f000 2a 2f 0a 20 20 20 20 69 6e 74 20 73 74 61 72 74  */.    int start
1f010 5f 63 6f 6e 73 74 72 61 69 6e 74 73 3b 20 20 20  _constraints;   
1f020 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20      /* Start of 
1f030 72 61 6e 67 65 20 69 73 20 63 6f 6e 73 74 72 61  range is constra
1f040 69 6e 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ined */.    int 
1f050 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 20 20 20  nConstraint;    
1f060 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1f070 65 72 20 6f 66 20 63 6f 6e 73 74 72 61 69 6e 74  er of constraint
1f080 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 49 6e   terms */.    In
1f090 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20  dex *pIdx;      
1f0a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1f0b0 65 20 69 6e 64 65 78 20 77 65 20 77 69 6c 6c 20  e index we will 
1f0c0 62 65 20 75 73 69 6e 67 20 2a 2f 0a 20 20 20 20  be using */.    
1f0d0 69 6e 74 20 69 49 64 78 43 75 72 3b 20 20 20 20  int iIdxCur;    
1f0e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f0f0 54 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20  The VDBE cursor 
1f100 66 6f 72 20 74 68 65 20 69 6e 64 65 78 20 2a 2f  for the index */
1f110 0a 20 20 20 20 69 6e 74 20 6e 45 78 74 72 61 52  .    int nExtraR
1f120 65 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  eg = 0;         
1f130 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
1f140 78 74 72 61 20 72 65 67 69 73 74 65 72 73 20 6e  xtra registers n
1f150 65 65 64 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74  eeded */.    int
1f160 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   op;            
1f170 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 73            /* Ins
1f180 74 72 75 63 74 69 6f 6e 20 6f 70 63 6f 64 65 20  truction opcode 
1f190 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 74  */.    char *zSt
1f1a0 61 72 74 41 66 66 3b 20 20 20 20 20 20 20 20 20  artAff;         
1f1b0 20 20 20 20 2f 2a 20 41 66 66 69 6e 69 74 79 20      /* Affinity 
1f1c0 66 6f 72 20 73 74 61 72 74 20 6f 66 20 72 61 6e  for start of ran
1f1d0 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f  ge constraint */
1f1e0 0a 20 20 20 20 63 68 61 72 20 63 45 6e 64 41 66  .    char cEndAf
1f1f0 66 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  f = 0;          
1f200 20 20 2f 2a 20 41 66 66 69 6e 69 74 79 20 66 6f    /* Affinity fo
1f210 72 20 65 6e 64 20 6f 66 20 72 61 6e 67 65 20 63  r end of range c
1f220 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20  onstraint */.   
1f230 20 75 38 20 62 53 65 65 6b 50 61 73 74 4e 75 6c   u8 bSeekPastNul
1f240 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a  l = 0;        /*
1f250 20 54 72 75 65 20 74 6f 20 73 65 65 6b 20 70 61   True to seek pa
1f260 73 74 20 69 6e 69 74 69 61 6c 20 6e 75 6c 6c 73  st initial nulls
1f270 20 2a 2f 0a 20 20 20 20 75 38 20 62 53 74 6f 70   */.    u8 bStop
1f280 41 74 4e 75 6c 6c 20 3d 20 30 3b 20 20 20 20 20  AtNull = 0;     
1f290 20 20 20 20 20 2f 2a 20 41 64 64 20 63 6f 6e 64       /* Add cond
1f2a0 69 74 69 6f 6e 20 74 6f 20 74 65 72 6d 69 6e 61  ition to termina
1f2b0 74 65 20 61 74 20 4e 55 4c 4c 73 20 2a 2f 0a 0a  te at NULLs */..
1f2c0 20 20 20 20 70 49 64 78 20 3d 20 70 4c 6f 6f 70      pIdx = pLoop
1f2d0 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
1f2e0 3b 0a 20 20 20 20 69 49 64 78 43 75 72 20 3d 20  ;.    iIdxCur = 
1f2f0 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b  pLevel->iIdxCur;
1f300 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 45 71  .    assert( nEq
1f310 3e 3d 70 4c 6f 6f 70 2d 3e 6e 53 6b 69 70 20 29  >=pLoop->nSkip )
1f320 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  ;..    /* If thi
1f330 73 20 6c 6f 6f 70 20 73 61 74 69 73 66 69 65 73  s loop satisfies
1f340 20 61 20 73 6f 72 74 20 6f 72 64 65 72 20 28 70   a sort order (p
1f350 4f 72 64 65 72 42 79 29 20 72 65 71 75 65 73 74  OrderBy) request
1f360 20 74 68 61 74 20 0a 20 20 20 20 2a 2a 20 77 61   that .    ** wa
1f370 73 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73  s passed to this
1f380 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 69 6d 70   function to imp
1f390 6c 65 6d 65 6e 74 20 61 20 22 53 45 4c 45 43 54  lement a "SELECT
1f3a0 20 6d 69 6e 28 78 29 20 2e 2e 2e 22 20 0a 20 20   min(x) ..." .  
1f3b0 20 20 2a 2a 20 71 75 65 72 79 2c 20 74 68 65 6e    ** query, then
1f3c0 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c   the caller will
1f3d0 20 6f 6e 6c 79 20 61 6c 6c 6f 77 20 74 68 65 20   only allow the 
1f3e0 6c 6f 6f 70 20 74 6f 20 72 75 6e 20 66 6f 72 0a  loop to run for.
1f3f0 20 20 20 20 2a 2a 20 61 20 73 69 6e 67 6c 65 20      ** a single 
1f400 69 74 65 72 61 74 69 6f 6e 2e 20 54 68 69 73 20  iteration. This 
1f410 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 66  means that the f
1f420 69 72 73 74 20 72 6f 77 20 72 65 74 75 72 6e 65  irst row returne
1f430 64 0a 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20  d.    ** should 
1f440 6e 6f 74 20 68 61 76 65 20 61 20 4e 55 4c 4c 20  not have a NULL 
1f450 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20  value stored in 
1f460 27 78 27 2e 20 49 66 20 63 6f 6c 75 6d 6e 20 27  'x'. If column '
1f470 78 27 20 69 73 0a 20 20 20 20 2a 2a 20 74 68 65  x' is.    ** the
1f480 20 66 69 72 73 74 20 6f 6e 65 20 61 66 74 65 72   first one after
1f490 20 74 68 65 20 6e 45 71 20 65 71 75 61 6c 69 74   the nEq equalit
1f4a0 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 69 6e  y constraints in
1f4b0 20 74 68 65 20 69 6e 64 65 78 2c 0a 20 20 20 20   the index,.    
1f4c0 2a 2a 20 74 68 69 73 20 72 65 71 75 69 72 65 73  ** this requires
1f4d0 20 73 6f 6d 65 20 73 70 65 63 69 61 6c 20 68 61   some special ha
1f4e0 6e 64 6c 69 6e 67 2e 0a 20 20 20 20 2a 2f 0a 20  ndling..    */. 
1f4f0 20 20 20 61 73 73 65 72 74 28 20 70 57 49 6e 66     assert( pWInf
1f500 6f 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 0a 20  o->pOrderBy==0. 
1f510 20 20 20 20 20 20 20 20 7c 7c 20 70 57 49 6e 66          || pWInf
1f520 6f 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  o->pOrderBy->nEx
1f530 70 72 3d 3d 31 0a 20 20 20 20 20 20 20 20 20 7c  pr==1.         |
1f540 7c 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  | (pWInfo->wctrl
1f550 46 6c 61 67 73 26 57 48 45 52 45 5f 4f 52 44 45  Flags&WHERE_ORDE
1f560 52 42 59 5f 4d 49 4e 29 3d 3d 30 20 29 3b 0a 20  RBY_MIN)==0 );. 
1f570 20 20 20 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e     if( (pWInfo->
1f580 77 63 74 72 6c 46 6c 61 67 73 26 57 48 45 52 45  wctrlFlags&WHERE
1f590 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 29 21 3d 30  _ORDERBY_MIN)!=0
1f5a0 0a 20 20 20 20 20 26 26 20 70 57 49 6e 66 6f 2d  .     && pWInfo-
1f5b0 3e 6e 4f 42 53 61 74 3e 30 0a 20 20 20 20 20 26  >nOBSat>0.     &
1f5c0 26 20 28 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c  & (pIdx->nKeyCol
1f5d0 3e 6e 45 71 29 0a 20 20 20 20 29 7b 0a 20 20 20  >nEq).    ){.   
1f5e0 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 6f 70     assert( pLoop
1f5f0 2d 3e 6e 53 6b 69 70 3d 3d 30 20 29 3b 0a 20 20  ->nSkip==0 );.  
1f600 20 20 20 20 62 53 65 65 6b 50 61 73 74 4e 75 6c      bSeekPastNul
1f610 6c 20 3d 20 31 3b 0a 20 20 20 20 20 20 6e 45 78  l = 1;.      nEx
1f620 74 72 61 52 65 67 20 3d 20 31 3b 0a 20 20 20 20  traReg = 1;.    
1f630 7d 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20 61  }..    /* Find a
1f640 6e 79 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f  ny inequality co
1f650 6e 73 74 72 61 69 6e 74 20 74 65 72 6d 73 20 66  nstraint terms f
1f660 6f 72 20 74 68 65 20 73 74 61 72 74 20 61 6e 64  or the start and
1f670 20 65 6e 64 20 0a 20 20 20 20 2a 2a 20 6f 66 20   end .    ** of 
1f680 74 68 65 20 72 61 6e 67 65 2e 20 0a 20 20 20 20  the range. .    
1f690 2a 2f 0a 20 20 20 20 6a 20 3d 20 6e 45 71 3b 0a  */.    j = nEq;.
1f6a0 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77      if( pLoop->w
1f6b0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 42  sFlags & WHERE_B
1f6c0 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20  TM_LIMIT ){.    
1f6d0 20 20 70 52 61 6e 67 65 53 74 61 72 74 20 3d 20    pRangeStart = 
1f6e0 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 2b  pLoop->aLTerm[j+
1f6f0 2b 5d 3b 0a 20 20 20 20 20 20 6e 45 78 74 72 61  +];.      nExtra
1f700 52 65 67 20 3d 20 31 3b 0a 20 20 20 20 20 20 2f  Reg = 1;.      /
1f710 2a 20 4c 69 6b 65 20 6f 70 74 69 6d 69 7a 61 74  * Like optimizat
1f720 69 6f 6e 20 72 61 6e 67 65 20 63 6f 6e 73 74 72  ion range constr
1f730 61 69 6e 74 73 20 61 6c 77 61 79 73 20 6f 63 63  aints always occ
1f740 75 72 20 69 6e 20 70 61 69 72 73 20 2a 2f 0a 20  ur in pairs */. 
1f750 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 52       assert( (pR
1f760 61 6e 67 65 53 74 61 72 74 2d 3e 77 74 46 6c 61  angeStart->wtFla
1f770 67 73 20 26 20 54 45 52 4d 5f 4c 49 4b 45 4f 50  gs & TERM_LIKEOP
1f780 54 29 3d 3d 30 20 7c 7c 20 0a 20 20 20 20 20 20  T)==0 || .      
1f790 20 20 20 20 20 20 20 20 28 70 4c 6f 6f 70 2d 3e          (pLoop->
1f7a0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
1f7b0 54 4f 50 5f 4c 49 4d 49 54 29 21 3d 30 20 29 3b  TOP_LIMIT)!=0 );
1f7c0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
1f7d0 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
1f7e0 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20  WHERE_TOP_LIMIT 
1f7f0 29 7b 0a 20 20 20 20 20 20 70 52 61 6e 67 65 45  ){.      pRangeE
1f800 6e 64 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65  nd = pLoop->aLTe
1f810 72 6d 5b 6a 2b 2b 5d 3b 0a 20 20 20 20 20 20 6e  rm[j++];.      n
1f820 45 78 74 72 61 52 65 67 20 3d 20 31 3b 0a 20 20  ExtraReg = 1;.  
1f830 20 20 20 20 69 66 28 20 28 70 52 61 6e 67 65 45      if( (pRangeE
1f840 6e 64 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  nd->wtFlags & TE
1f850 52 4d 5f 4c 49 4b 45 4f 50 54 29 21 3d 30 20 29  RM_LIKEOPT)!=0 )
1f860 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
1f870 28 20 70 52 61 6e 67 65 53 74 61 72 74 21 3d 30  ( pRangeStart!=0
1f880 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   );             
1f890 20 20 20 20 20 20 20 20 2f 2a 20 4c 49 4b 45 20          /* LIKE 
1f8a0 6f 70 74 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  opt constraints 
1f8b0 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
1f8c0 74 28 20 70 52 61 6e 67 65 53 74 61 72 74 2d 3e  t( pRangeStart->
1f8d0 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 4c  wtFlags & TERM_L
1f8e0 49 4b 45 4f 50 54 20 29 3b 20 20 20 2f 2a 20 6f  IKEOPT );   /* o
1f8f0 63 63 75 72 20 69 6e 20 70 61 69 72 73 20 2a 2f  ccur in pairs */
1f900 0a 20 20 20 20 20 20 20 20 70 4c 65 76 65 6c 2d  .        pLevel-
1f910 3e 69 4c 69 6b 65 52 65 70 43 6e 74 72 20 3d 20  >iLikeRepCntr = 
1f920 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
1f930 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
1f940 28 20 62 52 65 76 20 29 3b 0a 20 20 20 20 20 20  ( bRev );.      
1f950 20 20 74 65 73 74 63 61 73 65 28 20 70 49 64 78    testcase( pIdx
1f960 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6e 45 71  ->aSortOrder[nEq
1f970 5d 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 44 45 53  ]==SQLITE_SO_DES
1f980 43 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  C );.        sql
1f990 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1f9a0 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 0a 20 20  , OP_Integer,.  
1f9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f9c0 20 20 20 20 20 20 20 20 62 52 65 76 20 5e 20 28          bRev ^ (
1f9d0 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72  pIdx->aSortOrder
1f9e0 5b 6e 45 71 5d 3d 3d 53 51 4c 49 54 45 5f 53 4f  [nEq]==SQLITE_SO
1f9f0 5f 44 45 53 43 29 2c 0a 20 20 20 20 20 20 20 20  _DESC),.        
1fa00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fa10 20 20 70 4c 65 76 65 6c 2d 3e 69 4c 69 6b 65 52    pLevel->iLikeR
1fa20 65 70 43 6e 74 72 29 3b 0a 20 20 20 20 20 20 20  epCntr);.       
1fa30 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
1fa40 20 22 4c 49 4b 45 20 6c 6f 6f 70 20 63 6f 75 6e   "LIKE loop coun
1fa50 74 65 72 22 29 29 3b 0a 20 20 20 20 20 20 20 20  ter"));.        
1fa60 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4c 69 6b 65  pLevel->addrLike
1fa70 52 65 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Rep = sqlite3Vdb
1fa80 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
1fa90 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1faa0 66 28 20 70 52 61 6e 67 65 53 74 61 72 74 3d 3d  f( pRangeStart==
1fab0 30 0a 20 20 20 20 20 20 20 26 26 20 28 6a 20 3d  0.       && (j =
1fac0 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
1fad0 6e 45 71 5d 29 3e 3d 30 20 0a 20 20 20 20 20 20  nEq])>=0 .      
1fae0 20 26 26 20 70 49 64 78 2d 3e 70 54 61 62 6c 65   && pIdx->pTable
1faf0 2d 3e 61 43 6f 6c 5b 6a 5d 2e 6e 6f 74 4e 75 6c  ->aCol[j].notNul
1fb00 6c 3d 3d 30 0a 20 20 20 20 20 20 29 7b 0a 20 20  l==0.      ){.  
1fb10 20 20 20 20 20 20 62 53 65 65 6b 50 61 73 74 4e        bSeekPastN
1fb20 75 6c 6c 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  ull = 1;.      }
1fb30 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
1fb40 74 28 20 70 52 61 6e 67 65 45 6e 64 3d 3d 30 20  t( pRangeEnd==0 
1fb50 7c 7c 20 28 70 52 61 6e 67 65 45 6e 64 2d 3e 77  || (pRangeEnd->w
1fb60 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e  tFlags & TERM_VN
1fb70 55 4c 4c 29 3d 3d 30 20 29 3b 0a 0a 20 20 20 20  ULL)==0 );..    
1fb80 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
1fb90 20 74 6f 20 65 76 61 6c 75 61 74 65 20 61 6c 6c   to evaluate all
1fba0 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 65 72 6d   constraint term
1fbb0 73 20 75 73 69 6e 67 20 3d 3d 20 6f 72 20 49 4e  s using == or IN
1fbc0 0a 20 20 20 20 2a 2a 20 61 6e 64 20 73 74 6f 72  .    ** and stor
1fbd0 65 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66 20  e the values of 
1fbe0 74 68 6f 73 65 20 74 65 72 6d 73 20 69 6e 20 61  those terms in a
1fbf0 6e 20 61 72 72 61 79 20 6f 66 20 72 65 67 69 73  n array of regis
1fc00 74 65 72 73 0a 20 20 20 20 2a 2a 20 73 74 61 72  ters.    ** star
1fc10 74 69 6e 67 20 61 74 20 72 65 67 42 61 73 65 2e  ting at regBase.
1fc20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 65 67 42  .    */.    regB
1fc30 61 73 65 20 3d 20 63 6f 64 65 41 6c 6c 45 71 75  ase = codeAllEqu
1fc40 61 6c 69 74 79 54 65 72 6d 73 28 70 50 61 72 73  alityTerms(pPars
1fc50 65 2c 70 4c 65 76 65 6c 2c 62 52 65 76 2c 6e 45  e,pLevel,bRev,nE
1fc60 78 74 72 61 52 65 67 2c 26 7a 53 74 61 72 74 41  xtraReg,&zStartA
1fc70 66 66 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ff);.    assert(
1fc80 20 7a 53 74 61 72 74 41 66 66 3d 3d 30 20 7c 7c   zStartAff==0 ||
1fc90 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
1fca0 28 7a 53 74 61 72 74 41 66 66 29 3e 3d 6e 45 71  (zStartAff)>=nEq
1fcb0 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 53 74 61   );.    if( zSta
1fcc0 72 74 41 66 66 20 29 20 63 45 6e 64 41 66 66 20  rtAff ) cEndAff 
1fcd0 3d 20 7a 53 74 61 72 74 41 66 66 5b 6e 45 71 5d  = zStartAff[nEq]
1fce0 3b 0a 20 20 20 20 61 64 64 72 4e 78 74 20 3d 20  ;.    addrNxt = 
1fcf0 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 3b  pLevel->addrNxt;
1fd00 0a 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61  ..    /* If we a
1fd10 72 65 20 64 6f 69 6e 67 20 61 20 72 65 76 65 72  re doing a rever
1fd20 73 65 20 6f 72 64 65 72 20 73 63 61 6e 20 6f 6e  se order scan on
1fd30 20 61 6e 20 61 73 63 65 6e 64 69 6e 67 20 69 6e   an ascending in
1fd40 64 65 78 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 61  dex, or.    ** a
1fd50 20 66 6f 72 77 61 72 64 20 6f 72 64 65 72 20 73   forward order s
1fd60 63 61 6e 20 6f 6e 20 61 20 64 65 73 63 65 6e 64  can on a descend
1fd70 69 6e 67 20 69 6e 64 65 78 2c 20 69 6e 74 65 72  ing index, inter
1fd80 63 68 61 6e 67 65 20 74 68 65 20 0a 20 20 20 20  change the .    
1fd90 2a 2a 20 73 74 61 72 74 20 61 6e 64 20 65 6e 64  ** start and end
1fda0 20 74 65 72 6d 73 20 28 70 52 61 6e 67 65 53 74   terms (pRangeSt
1fdb0 61 72 74 20 61 6e 64 20 70 52 61 6e 67 65 45 6e  art and pRangeEn
1fdc0 64 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  d)..    */.    i
1fdd0 66 28 20 28 6e 45 71 3c 70 49 64 78 2d 3e 6e 4b  f( (nEq<pIdx->nK
1fde0 65 79 43 6f 6c 20 26 26 20 62 52 65 76 3d 3d 28  eyCol && bRev==(
1fdf0 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72  pIdx->aSortOrder
1fe00 5b 6e 45 71 5d 3d 3d 53 51 4c 49 54 45 5f 53 4f  [nEq]==SQLITE_SO
1fe10 5f 41 53 43 29 29 0a 20 20 20 20 20 7c 7c 20 28  _ASC)).     || (
1fe20 62 52 65 76 20 26 26 20 70 49 64 78 2d 3e 6e 4b  bRev && pIdx->nK
1fe30 65 79 43 6f 6c 3d 3d 6e 45 71 29 0a 20 20 20 20  eyCol==nEq).    
1fe40 29 7b 0a 20 20 20 20 20 20 53 57 41 50 28 57 68  ){.      SWAP(Wh
1fe50 65 72 65 54 65 72 6d 20 2a 2c 20 70 52 61 6e 67  ereTerm *, pRang
1fe60 65 45 6e 64 2c 20 70 52 61 6e 67 65 53 74 61 72  eEnd, pRangeStar
1fe70 74 29 3b 0a 20 20 20 20 20 20 53 57 41 50 28 75  t);.      SWAP(u
1fe80 38 2c 20 62 53 65 65 6b 50 61 73 74 4e 75 6c 6c  8, bSeekPastNull
1fe90 2c 20 62 53 74 6f 70 41 74 4e 75 6c 6c 29 3b 0a  , bStopAtNull);.
1fea0 20 20 20 20 7d 0a 0a 20 20 20 20 74 65 73 74 63      }..    testc
1feb0 61 73 65 28 20 70 52 61 6e 67 65 53 74 61 72 74  ase( pRangeStart
1fec0 20 26 26 20 28 70 52 61 6e 67 65 53 74 61 72 74   && (pRangeStart
1fed0 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
1fee0 5f 4c 45 29 21 3d 30 20 29 3b 0a 20 20 20 20 74  _LE)!=0 );.    t
1fef0 65 73 74 63 61 73 65 28 20 70 52 61 6e 67 65 53  estcase( pRangeS
1ff00 74 61 72 74 20 26 26 20 28 70 52 61 6e 67 65 53  tart && (pRangeS
1ff10 74 61 72 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20  tart->eOperator 
1ff20 26 20 57 4f 5f 47 45 29 21 3d 30 20 29 3b 0a 20  & WO_GE)!=0 );. 
1ff30 20 20 20 74 65 73 74 63 61 73 65 28 20 70 52 61     testcase( pRa
1ff40 6e 67 65 45 6e 64 20 26 26 20 28 70 52 61 6e 67  ngeEnd && (pRang
1ff50 65 45 6e 64 2d 3e 65 4f 70 65 72 61 74 6f 72 20  eEnd->eOperator 
1ff60 26 20 57 4f 5f 4c 45 29 21 3d 30 20 29 3b 0a 20  & WO_LE)!=0 );. 
1ff70 20 20 20 74 65 73 74 63 61 73 65 28 20 70 52 61     testcase( pRa
1ff80 6e 67 65 45 6e 64 20 26 26 20 28 70 52 61 6e 67  ngeEnd && (pRang
1ff90 65 45 6e 64 2d 3e 65 4f 70 65 72 61 74 6f 72 20  eEnd->eOperator 
1ffa0 26 20 57 4f 5f 47 45 29 21 3d 30 20 29 3b 0a 20  & WO_GE)!=0 );. 
1ffb0 20 20 20 73 74 61 72 74 45 71 20 3d 20 21 70 52     startEq = !pR
1ffc0 61 6e 67 65 53 74 61 72 74 20 7c 7c 20 70 52 61  angeStart || pRa
1ffd0 6e 67 65 53 74 61 72 74 2d 3e 65 4f 70 65 72 61  ngeStart->eOpera
1ffe0 74 6f 72 20 26 20 28 57 4f 5f 4c 45 7c 57 4f 5f  tor & (WO_LE|WO_
1fff0 47 45 29 3b 0a 20 20 20 20 65 6e 64 45 71 20 3d  GE);.    endEq =
20000 20 20 20 21 70 52 61 6e 67 65 45 6e 64 20 7c 7c     !pRangeEnd ||
20010 20 70 52 61 6e 67 65 45 6e 64 2d 3e 65 4f 70 65   pRangeEnd->eOpe
20020 72 61 74 6f 72 20 26 20 28 57 4f 5f 4c 45 7c 57  rator & (WO_LE|W
20030 4f 5f 47 45 29 3b 0a 20 20 20 20 73 74 61 72 74  O_GE);.    start
20040 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 3d 20 70  _constraints = p
20050 52 61 6e 67 65 53 74 61 72 74 20 7c 7c 20 6e 45  RangeStart || nE
20060 71 3e 30 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 65  q>0;..    /* See
20070 6b 20 74 68 65 20 69 6e 64 65 78 20 63 75 72 73  k the index curs
20080 6f 72 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  or to the start 
20090 6f 66 20 74 68 65 20 72 61 6e 67 65 2e 20 2a 2f  of the range. */
200a0 0a 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74  .    nConstraint
200b0 20 3d 20 6e 45 71 3b 0a 20 20 20 20 69 66 28 20   = nEq;.    if( 
200c0 70 52 61 6e 67 65 53 74 61 72 74 20 29 7b 0a 20  pRangeStart ){. 
200d0 20 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68       Expr *pRigh
200e0 74 20 3d 20 70 52 61 6e 67 65 53 74 61 72 74 2d  t = pRangeStart-
200f0 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a  >pExpr->pRight;.
20100 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
20110 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 52  rCode(pParse, pR
20120 69 67 68 74 2c 20 72 65 67 42 61 73 65 2b 6e 45  ight, regBase+nE
20130 71 29 3b 0a 20 20 20 20 20 20 77 68 65 72 65 4c  q);.      whereL
20140 69 6b 65 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 53  ikeOptimizationS
20150 74 72 69 6e 67 46 69 78 75 70 28 76 2c 20 70 4c  tringFixup(v, pL
20160 65 76 65 6c 2c 20 70 52 61 6e 67 65 53 74 61 72  evel, pRangeStar
20170 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70  t);.      if( (p
20180 52 61 6e 67 65 53 74 61 72 74 2d 3e 77 74 46 6c  RangeStart->wtFl
20190 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c  ags & TERM_VNULL
201a0 29 3d 3d 30 0a 20 20 20 20 20 20 20 26 26 20 73  )==0.       && s
201b0 71 6c 69 74 65 33 45 78 70 72 43 61 6e 42 65 4e  qlite3ExprCanBeN
201c0 75 6c 6c 28 70 52 69 67 68 74 29 0a 20 20 20 20  ull(pRight).    
201d0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c    ){.        sql
201e0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
201f0 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 65 67  , OP_IsNull, reg
20200 42 61 73 65 2b 6e 45 71 2c 20 61 64 64 72 4e 78  Base+nEq, addrNx
20210 74 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  t);.        Vdbe
20220 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
20230 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a     }.      if( z
20240 53 74 61 72 74 41 66 66 20 29 7b 0a 20 20 20 20  StartAff ){.    
20250 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 43      if( sqlite3C
20260 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 70  ompareAffinity(p
20270 52 69 67 68 74 2c 20 7a 53 74 61 72 74 41 66 66  Right, zStartAff
20280 5b 6e 45 71 5d 29 3d 3d 53 51 4c 49 54 45 5f 41  [nEq])==SQLITE_A
20290 46 46 5f 4e 4f 4e 45 29 7b 0a 20 20 20 20 20 20  FF_NONE){.      
202a0 20 20 20 20 2f 2a 20 53 69 6e 63 65 20 74 68 65      /* Since the
202b0 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 74   comparison is t
202c0 6f 20 62 65 20 70 65 72 66 6f 72 6d 65 64 20 77  o be performed w
202d0 69 74 68 20 6e 6f 20 63 6f 6e 76 65 72 73 69 6f  ith no conversio
202e0 6e 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ns.          ** 
202f0 61 70 70 6c 69 65 64 20 74 6f 20 74 68 65 20 6f  applied to the o
20300 70 65 72 61 6e 64 73 2c 20 73 65 74 20 74 68 65  perands, set the
20310 20 61 66 66 69 6e 69 74 79 20 74 6f 20 61 70 70   affinity to app
20320 6c 79 20 74 6f 20 70 52 69 67 68 74 20 74 6f 20  ly to pRight to 
20330 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 53 51  .          ** SQ
20340 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 2e 20 20  LITE_AFF_NONE.  
20350 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 7a 53 74  */.          zSt
20360 61 72 74 41 66 66 5b 6e 45 71 5d 20 3d 20 53 51  artAff[nEq] = SQ
20370 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20  LITE_AFF_NONE;. 
20380 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
20390 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
203a0 4e 65 65 64 73 4e 6f 41 66 66 69 6e 69 74 79 43  NeedsNoAffinityC
203b0 68 61 6e 67 65 28 70 52 69 67 68 74 2c 20 7a 53  hange(pRight, zS
203c0 74 61 72 74 41 66 66 5b 6e 45 71 5d 29 20 29 7b  tartAff[nEq]) ){
203d0 0a 20 20 20 20 20 20 20 20 20 20 7a 53 74 61 72  .          zStar
203e0 74 41 66 66 5b 6e 45 71 5d 20 3d 20 53 51 4c 49  tAff[nEq] = SQLI
203f0 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20  TE_AFF_NONE;.   
20400 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 20       }.      }  
20410 0a 20 20 20 20 20 20 6e 43 6f 6e 73 74 72 61 69  .      nConstrai
20420 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 74 65 73 74  nt++;.      test
20430 63 61 73 65 28 20 70 52 61 6e 67 65 53 74 61 72  case( pRangeStar
20440 74 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  t->wtFlags & TER
20450 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20 20 20  M_VIRTUAL );.   
20460 20 7d 65 6c 73 65 20 69 66 28 20 62 53 65 65 6b   }else if( bSeek
20470 50 61 73 74 4e 75 6c 6c 20 29 7b 0a 20 20 20 20  PastNull ){.    
20480 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
20490 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  Op2(v, OP_Null, 
204a0 30 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 29 3b  0, regBase+nEq);
204b0 0a 20 20 20 20 20 20 6e 43 6f 6e 73 74 72 61 69  .      nConstrai
204c0 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 73 74 61 72  nt++;.      star
204d0 74 45 71 20 3d 20 30 3b 0a 20 20 20 20 20 20 73  tEq = 0;.      s
204e0 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73  tart_constraints
204f0 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 1;.    }.    
20500 63 6f 64 65 41 70 70 6c 79 41 66 66 69 6e 69 74  codeApplyAffinit
20510 79 28 70 50 61 72 73 65 2c 20 72 65 67 42 61 73  y(pParse, regBas
20520 65 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20 2d  e, nConstraint -
20530 20 62 53 65 65 6b 50 61 73 74 4e 75 6c 6c 2c 20   bSeekPastNull, 
20540 7a 53 74 61 72 74 41 66 66 29 3b 0a 20 20 20 20  zStartAff);.    
20550 6f 70 20 3d 20 61 53 74 61 72 74 4f 70 5b 28 73  op = aStartOp[(s
20560 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73  tart_constraints
20570 3c 3c 32 29 20 2b 20 28 73 74 61 72 74 45 71 3c  <<2) + (startEq<
20580 3c 31 29 20 2b 20 62 52 65 76 5d 3b 0a 20 20 20  <1) + bRev];.   
20590 20 61 73 73 65 72 74 28 20 6f 70 21 3d 30 20 29   assert( op!=0 )
205a0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
205b0 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 6f 70  eAddOp4Int(v, op
205c0 2c 20 69 49 64 78 43 75 72 2c 20 61 64 64 72 4e  , iIdxCur, addrN
205d0 78 74 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f  xt, regBase, nCo
205e0 6e 73 74 72 61 69 6e 74 29 3b 0a 20 20 20 20 56  nstraint);.    V
205f0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
20600 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
20610 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 52 65 77  If(v, op==OP_Rew
20620 69 6e 64 29 3b 20 20 74 65 73 74 63 61 73 65 28  ind);  testcase(
20630 20 6f 70 3d 3d 4f 50 5f 52 65 77 69 6e 64 20 29   op==OP_Rewind )
20640 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61  ;.    VdbeCovera
20650 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 4c  geIf(v, op==OP_L
20660 61 73 74 29 3b 20 20 20 20 74 65 73 74 63 61 73  ast);    testcas
20670 65 28 20 6f 70 3d 3d 4f 50 5f 4c 61 73 74 20 29  e( op==OP_Last )
20680 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61  ;.    VdbeCovera
20690 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 53  geIf(v, op==OP_S
206a0 65 65 6b 47 54 29 3b 20 20 74 65 73 74 63 61 73  eekGT);  testcas
206b0 65 28 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 47 54  e( op==OP_SeekGT
206c0 20 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65   );.    VdbeCove
206d0 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50  rageIf(v, op==OP
206e0 5f 53 65 65 6b 47 45 29 3b 20 20 74 65 73 74 63  _SeekGE);  testc
206f0 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b  ase( op==OP_Seek
20700 47 45 20 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  GE );.    VdbeCo
20710 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
20720 4f 50 5f 53 65 65 6b 4c 45 29 3b 20 20 74 65 73  OP_SeekLE);  tes
20730 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 53 65  tcase( op==OP_Se
20740 65 6b 4c 45 20 29 3b 0a 20 20 20 20 56 64 62 65  ekLE );.    Vdbe
20750 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70  CoverageIf(v, op
20760 3d 3d 4f 50 5f 53 65 65 6b 4c 54 29 3b 20 20 74  ==OP_SeekLT);  t
20770 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f  estcase( op==OP_
20780 53 65 65 6b 4c 54 20 29 3b 0a 0a 20 20 20 20 2f  SeekLT );..    /
20790 2a 20 4c 6f 61 64 20 74 68 65 20 76 61 6c 75 65  * Load the value
207a0 20 66 6f 72 20 74 68 65 20 69 6e 65 71 75 61 6c   for the inequal
207b0 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 61  ity constraint a
207c0 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
207d0 0a 20 20 20 20 2a 2a 20 72 61 6e 67 65 20 28 69  .    ** range (i
207e0 66 20 61 6e 79 29 2e 0a 20 20 20 20 2a 2f 0a 20  f any)..    */. 
207f0 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d     nConstraint =
20800 20 6e 45 71 3b 0a 20 20 20 20 69 66 28 20 70 52   nEq;.    if( pR
20810 61 6e 67 65 45 6e 64 20 29 7b 0a 20 20 20 20 20  angeEnd ){.     
20820 20 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20   Expr *pRight = 
20830 70 52 61 6e 67 65 45 6e 64 2d 3e 70 45 78 70 72  pRangeEnd->pExpr
20840 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  ->pRight;.      
20850 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
20860 52 65 6d 6f 76 65 28 70 50 61 72 73 65 2c 20 72  Remove(pParse, r
20870 65 67 42 61 73 65 2b 6e 45 71 2c 20 31 29 3b 0a  egBase+nEq, 1);.
20880 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
20890 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 52  rCode(pParse, pR
208a0 69 67 68 74 2c 20 72 65 67 42 61 73 65 2b 6e 45  ight, regBase+nE
208b0 71 29 3b 0a 20 20 20 20 20 20 77 68 65 72 65 4c  q);.      whereL
208c0 69 6b 65 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 53  ikeOptimizationS
208d0 74 72 69 6e 67 46 69 78 75 70 28 76 2c 20 70 4c  tringFixup(v, pL
208e0 65 76 65 6c 2c 20 70 52 61 6e 67 65 45 6e 64 29  evel, pRangeEnd)
208f0 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 52 61  ;.      if( (pRa
20900 6e 67 65 45 6e 64 2d 3e 77 74 46 6c 61 67 73 20  ngeEnd->wtFlags 
20910 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30  & TERM_VNULL)==0
20920 0a 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74  .       && sqlit
20930 65 33 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28  e3ExprCanBeNull(
20940 70 52 69 67 68 74 29 0a 20 20 20 20 20 20 29 7b  pRight).      ){
20950 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
20960 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
20970 5f 49 73 4e 75 6c 6c 2c 20 72 65 67 42 61 73 65  _IsNull, regBase
20980 2b 6e 45 71 2c 20 61 64 64 72 4e 78 74 29 3b 0a  +nEq, addrNxt);.
20990 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
209a0 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 7d  rage(v);.      }
209b0 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
209c0 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74  e3CompareAffinit
209d0 79 28 70 52 69 67 68 74 2c 20 63 45 6e 64 41 66  y(pRight, cEndAf
209e0 66 29 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  f)!=SQLITE_AFF_N
209f0 4f 4e 45 0a 20 20 20 20 20 20 20 26 26 20 21 73  ONE.       && !s
20a00 71 6c 69 74 65 33 45 78 70 72 4e 65 65 64 73 4e  qlite3ExprNeedsN
20a10 6f 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  oAffinityChange(
20a20 70 52 69 67 68 74 2c 20 63 45 6e 64 41 66 66 29  pRight, cEndAff)
20a30 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
20a40 20 20 63 6f 64 65 41 70 70 6c 79 41 66 66 69 6e    codeApplyAffin
20a50 69 74 79 28 70 50 61 72 73 65 2c 20 72 65 67 42  ity(pParse, regB
20a60 61 73 65 2b 6e 45 71 2c 20 31 2c 20 26 63 45 6e  ase+nEq, 1, &cEn
20a70 64 41 66 66 29 3b 0a 20 20 20 20 20 20 7d 0a 20  dAff);.      }. 
20a80 20 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74       nConstraint
20a90 2b 2b 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  ++;.      testca
20aa0 73 65 28 20 70 52 61 6e 67 65 45 6e 64 2d 3e 77  se( pRangeEnd->w
20ab0 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49  tFlags & TERM_VI
20ac0 52 54 55 41 4c 20 29 3b 0a 20 20 20 20 7d 65 6c  RTUAL );.    }el
20ad0 73 65 20 69 66 28 20 62 53 74 6f 70 41 74 4e 75  se if( bStopAtNu
20ae0 6c 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ll ){.      sqli
20af0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
20b00 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65 67   OP_Null, 0, reg
20b10 42 61 73 65 2b 6e 45 71 29 3b 0a 20 20 20 20 20  Base+nEq);.     
20b20 20 65 6e 64 45 71 20 3d 20 30 3b 0a 20 20 20 20   endEq = 0;.    
20b30 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b    nConstraint++;
20b40 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
20b50 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 53 74  e3DbFree(db, zSt
20b60 61 72 74 41 66 66 29 3b 0a 0a 20 20 20 20 2f 2a  artAff);..    /*
20b70 20 54 6f 70 20 6f 66 20 74 68 65 20 6c 6f 6f 70   Top of the loop
20b80 20 62 6f 64 79 20 2a 2f 0a 20 20 20 20 70 4c 65   body */.    pLe
20b90 76 65 6c 2d 3e 70 32 20 3d 20 73 71 6c 69 74 65  vel->p2 = sqlite
20ba0 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
20bb0 28 76 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65  (v);..    /* Che
20bc0 63 6b 20 69 66 20 74 68 65 20 69 6e 64 65 78 20  ck if the index 
20bd0 63 75 72 73 6f 72 20 69 73 20 70 61 73 74 20 74  cursor is past t
20be0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 72 61  he end of the ra
20bf0 6e 67 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  nge. */.    if( 
20c00 6e 43 6f 6e 73 74 72 61 69 6e 74 20 29 7b 0a 20  nConstraint ){. 
20c10 20 20 20 20 20 6f 70 20 3d 20 61 45 6e 64 4f 70       op = aEndOp
20c20 5b 62 52 65 76 2a 32 20 2b 20 65 6e 64 45 71 5d  [bRev*2 + endEq]
20c30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
20c40 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
20c50 6f 70 2c 20 69 49 64 78 43 75 72 2c 20 61 64 64  op, iIdxCur, add
20c60 72 4e 78 74 2c 20 72 65 67 42 61 73 65 2c 20 6e  rNxt, regBase, n
20c70 43 6f 6e 73 74 72 61 69 6e 74 29 3b 0a 20 20 20  Constraint);.   
20c80 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
20c90 3d 4f 50 5f 49 64 78 47 54 20 29 3b 20 20 56 64  =OP_IdxGT );  Vd
20ca0 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
20cb0 6f 70 3d 3d 4f 50 5f 49 64 78 47 54 20 29 3b 0a  op==OP_IdxGT );.
20cc0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
20cd0 6f 70 3d 3d 4f 50 5f 49 64 78 47 45 20 29 3b 20  op==OP_IdxGE ); 
20ce0 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
20cf0 76 2c 20 6f 70 3d 3d 4f 50 5f 49 64 78 47 45 20  v, op==OP_IdxGE 
20d00 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
20d10 65 28 20 6f 70 3d 3d 4f 50 5f 49 64 78 4c 54 20  e( op==OP_IdxLT 
20d20 29 3b 20 20 56 64 62 65 43 6f 76 65 72 61 67 65  );  VdbeCoverage
20d30 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 49 64 78  If(v, op==OP_Idx
20d40 4c 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  LT );.      test
20d50 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 49 64 78  case( op==OP_Idx
20d60 4c 45 20 29 3b 20 20 56 64 62 65 43 6f 76 65 72  LE );  VdbeCover
20d70 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f  ageIf(v, op==OP_
20d80 49 64 78 4c 45 20 29 3b 0a 20 20 20 20 7d 0a 0a  IdxLE );.    }..
20d90 20 20 20 20 2f 2a 20 53 65 65 6b 20 74 68 65 20      /* Seek the 
20da0 74 61 62 6c 65 20 63 75 72 73 6f 72 2c 20 69 66  table cursor, if
20db0 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 20   required */.   
20dc0 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65   disableTerm(pLe
20dd0 76 65 6c 2c 20 70 52 61 6e 67 65 53 74 61 72 74  vel, pRangeStart
20de0 29 3b 0a 20 20 20 20 64 69 73 61 62 6c 65 54 65  );.    disableTe
20df0 72 6d 28 70 4c 65 76 65 6c 2c 20 70 52 61 6e 67  rm(pLevel, pRang
20e00 65 45 6e 64 29 3b 0a 20 20 20 20 69 66 28 20 6f  eEnd);.    if( o
20e10 6d 69 74 54 61 62 6c 65 20 29 7b 0a 20 20 20 20  mitTable ){.    
20e20 20 20 2f 2a 20 70 49 64 78 20 69 73 20 61 20 63    /* pIdx is a c
20e30 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 2e 20 20  overing index.  
20e40 4e 6f 20 6e 65 65 64 20 74 6f 20 61 63 63 65 73  No need to acces
20e50 73 20 74 68 65 20 6d 61 69 6e 20 74 61 62 6c 65  s the main table
20e60 2e 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 20 69  . */.    }else i
20e70 66 28 20 48 61 73 52 6f 77 69 64 28 70 49 64 78  f( HasRowid(pIdx
20e80 2d 3e 70 54 61 62 6c 65 29 20 29 7b 0a 20 20 20  ->pTable) ){.   
20e90 20 20 20 69 52 6f 77 69 64 52 65 67 20 3d 20 2b     iRowidReg = +
20ea0 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
20eb0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
20ec0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78  AddOp2(v, OP_Idx
20ed0 52 6f 77 69 64 2c 20 69 49 64 78 43 75 72 2c 20  Rowid, iIdxCur, 
20ee0 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20  iRowidReg);.    
20ef0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
20f00 68 65 53 74 6f 72 65 28 70 50 61 72 73 65 2c 20  heStore(pParse, 
20f10 69 43 75 72 2c 20 2d 31 2c 20 69 52 6f 77 69 64  iCur, -1, iRowid
20f20 52 65 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Reg);.      sqli
20f30 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
20f40 20 4f 50 5f 53 65 65 6b 2c 20 69 43 75 72 2c 20   OP_Seek, iCur, 
20f50 69 52 6f 77 69 64 52 65 67 29 3b 20 20 2f 2a 20  iRowidReg);  /* 
20f60 44 65 66 65 72 72 65 64 20 73 65 65 6b 20 2a 2f  Deferred seek */
20f70 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69  .    }else if( i
20f80 43 75 72 21 3d 69 49 64 78 43 75 72 20 29 7b 0a  Cur!=iIdxCur ){.
20f90 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 50 6b        Index *pPk
20fa0 20 3d 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72   = sqlite3Primar
20fb0 79 4b 65 79 49 6e 64 65 78 28 70 49 64 78 2d 3e  yKeyIndex(pIdx->
20fc0 70 54 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 69  pTable);.      i
20fd0 52 6f 77 69 64 52 65 67 20 3d 20 73 71 6c 69 74  RowidReg = sqlit
20fe0 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70  e3GetTempRange(p
20ff0 50 61 72 73 65 2c 20 70 50 6b 2d 3e 6e 4b 65 79  Parse, pPk->nKey
21000 43 6f 6c 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  Col);.      for(
21010 6a 3d 30 3b 20 6a 3c 70 50 6b 2d 3e 6e 4b 65 79  j=0; j<pPk->nKey
21020 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  Col; j++){.     
21030 20 20 20 6b 20 3d 20 73 71 6c 69 74 65 33 43 6f     k = sqlite3Co
21040 6c 75 6d 6e 4f 66 49 6e 64 65 78 28 70 49 64 78  lumnOfIndex(pIdx
21050 2c 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  , pPk->aiColumn[
21060 6a 5d 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  j]);.        sql
21070 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
21080 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 49 64  , OP_Column, iId
21090 78 43 75 72 2c 20 6b 2c 20 69 52 6f 77 69 64 52  xCur, k, iRowidR
210a0 65 67 2b 6a 29 3b 0a 20 20 20 20 20 20 7d 0a 20  eg+j);.      }. 
210b0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
210c0 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f  AddOp4Int(v, OP_
210d0 4e 6f 74 46 6f 75 6e 64 2c 20 69 43 75 72 2c 20  NotFound, iCur, 
210e0 61 64 64 72 43 6f 6e 74 2c 0a 20 20 20 20 20 20  addrCont,.      
210f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21100 20 20 20 20 20 69 52 6f 77 69 64 52 65 67 2c 20       iRowidReg, 
21110 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 29 3b 20 56  pPk->nKeyCol); V
21120 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
21130 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65      }..    /* Re
21140 63 6f 72 64 20 74 68 65 20 69 6e 73 74 72 75 63  cord the instruc
21150 74 69 6f 6e 20 75 73 65 64 20 74 6f 20 74 65 72  tion used to ter
21160 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 2e  minate the loop.
21170 20 44 69 73 61 62 6c 65 20 0a 20 20 20 20 2a 2a   Disable .    **
21180 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65   WHERE clause te
21190 72 6d 73 20 6d 61 64 65 20 72 65 64 75 6e 64 61  rms made redunda
211a0 6e 74 20 62 79 20 74 68 65 20 69 6e 64 65 78 20  nt by the index 
211b0 72 61 6e 67 65 20 73 63 61 6e 2e 0a 20 20 20 20  range scan..    
211c0 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70  */.    if( pLoop
211d0 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
211e0 45 5f 4f 4e 45 52 4f 57 20 29 7b 0a 20 20 20 20  E_ONEROW ){.    
211f0 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f    pLevel->op = O
21200 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 7d 65 6c 73  P_Noop;.    }els
21210 65 20 69 66 28 20 62 52 65 76 20 29 7b 0a 20 20  e if( bRev ){.  
21220 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d      pLevel->op =
21230 20 4f 50 5f 50 72 65 76 3b 0a 20 20 20 20 7d 65   OP_Prev;.    }e
21240 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 65 76 65  lse{.      pLeve
21250 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 65 78 74 3b  l->op = OP_Next;
21260 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 65 76 65  .    }.    pLeve
21270 6c 2d 3e 70 31 20 3d 20 69 49 64 78 43 75 72 3b  l->p1 = iIdxCur;
21280 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 33 20  .    pLevel->p3 
21290 3d 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  = (pLoop->wsFlag
212a0 73 26 57 48 45 52 45 5f 55 4e 51 5f 57 41 4e 54  s&WHERE_UNQ_WANT
212b0 45 44 29 21 3d 30 20 3f 20 31 3a 30 3b 0a 20 20  ED)!=0 ? 1:0;.  
212c0 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73    if( (pLoop->ws
212d0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f  Flags & WHERE_CO
212e0 4e 53 54 52 41 49 4e 54 29 3d 3d 30 20 29 7b 0a  NSTRAINT)==0 ){.
212f0 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 35        pLevel->p5
21300 20 3d 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54   = SQLITE_STMTST
21310 41 54 55 53 5f 46 55 4c 4c 53 43 41 4e 5f 53 54  ATUS_FULLSCAN_ST
21320 45 50 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  EP;.    }else{. 
21330 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 65       assert( pLe
21340 76 65 6c 2d 3e 70 35 3d 3d 30 20 29 3b 0a 20 20  vel->p5==0 );.  
21350 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 23 69 66    }.  }else..#if
21360 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
21370 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e  _OR_OPTIMIZATION
21380 0a 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73  .  if( pLoop->ws
21390 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4d 55  Flags & WHERE_MU
213a0 4c 54 49 5f 4f 52 20 29 7b 0a 20 20 20 20 2f 2a  LTI_OR ){.    /*
213b0 20 43 61 73 65 20 35 3a 20 20 54 77 6f 20 6f 72   Case 5:  Two or
213c0 20 6d 6f 72 65 20 73 65 70 61 72 61 74 65 6c 79   more separately
213d0 20 69 6e 64 65 78 65 64 20 74 65 72 6d 73 20 63   indexed terms c
213e0 6f 6e 6e 65 63 74 65 64 20 62 79 20 4f 52 0a 20  onnected by OR. 
213f0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 78 61     **.    ** Exa
21400 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  mple:.    **.   
21410 20 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41 42   **   CREATE TAB
21420 4c 45 20 74 31 28 61 2c 62 2c 63 2c 64 29 3b 0a  LE t1(a,b,c,d);.
21430 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20      **   CREATE 
21440 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31 28 61  INDEX i1 ON t1(a
21450 29 3b 0a 20 20 20 20 2a 2a 20 20 20 43 52 45 41  );.    **   CREA
21460 54 45 20 49 4e 44 45 58 20 69 32 20 4f 4e 20 74  TE INDEX i2 ON t
21470 31 28 62 29 3b 0a 20 20 20 20 2a 2a 20 20 20 43  1(b);.    **   C
21480 52 45 41 54 45 20 49 4e 44 45 58 20 69 33 20 4f  REATE INDEX i3 O
21490 4e 20 74 31 28 63 29 3b 0a 20 20 20 20 2a 2a 0a  N t1(c);.    **.
214a0 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20      **   SELECT 
214b0 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  * FROM t1 WHERE 
214c0 61 3d 35 20 4f 52 20 62 3d 37 20 4f 52 20 28 63  a=5 OR b=7 OR (c
214d0 3d 31 31 20 41 4e 44 20 64 3d 31 33 29 0a 20 20  =11 AND d=13).  
214e0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 6e 20 74    **.    ** In t
214f0 68 65 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 72  he example, ther
21500 65 20 61 72 65 20 74 68 72 65 65 20 69 6e 64 65  e are three inde
21510 78 65 64 20 74 65 72 6d 73 20 63 6f 6e 6e 65 63  xed terms connec
21520 74 65 64 20 62 79 20 4f 52 2e 0a 20 20 20 20 2a  ted by OR..    *
21530 2a 20 54 68 65 20 74 6f 70 20 6f 66 20 74 68 65  * The top of the
21540 20 6c 6f 6f 70 20 6c 6f 6f 6b 73 20 6c 69 6b 65   loop looks like
21550 20 74 68 69 73 3a 0a 20 20 20 20 2a 2a 0a 20 20   this:.    **.  
21560 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 4e 75    **          Nu
21570 6c 6c 20 20 20 20 20 20 20 31 20 20 20 20 20 20  ll       1      
21580 20 20 20 20 20 20 20 20 20 20 23 20 5a 65 72 6f            # Zero
21590 20 74 68 65 20 72 6f 77 73 65 74 20 69 6e 20 72   the rowset in r
215a0 65 67 20 31 0a 20 20 20 20 2a 2a 0a 20 20 20 20  eg 1.    **.    
215b0 2a 2a 20 54 68 65 6e 2c 20 66 6f 72 20 65 61 63  ** Then, for eac
215c0 68 20 69 6e 64 65 78 65 64 20 74 65 72 6d 2c 20  h indexed term, 
215d0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 2e 20 54  the following. T
215e0 68 65 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 0a  he arguments to.
215f0 20 20 20 20 2a 2a 20 52 6f 77 53 65 74 54 65 73      ** RowSetTes
21600 74 20 61 72 65 20 73 75 63 68 20 74 68 61 74 20  t are such that 
21610 74 68 65 20 72 6f 77 69 64 20 6f 66 20 74 68 65  the rowid of the
21620 20 63 75 72 72 65 6e 74 20 72 6f 77 20 69 73 20   current row is 
21630 69 6e 73 65 72 74 65 64 0a 20 20 20 20 2a 2a 20  inserted.    ** 
21640 69 6e 74 6f 20 74 68 65 20 52 6f 77 53 65 74 2e  into the RowSet.
21650 20 49 66 20 69 74 20 69 73 20 61 6c 72 65 61 64   If it is alread
21660 79 20 70 72 65 73 65 6e 74 2c 20 63 6f 6e 74 72  y present, contr
21670 6f 6c 20 73 6b 69 70 73 20 74 68 65 0a 20 20 20  ol skips the.   
21680 20 2a 2a 20 47 6f 73 75 62 20 6f 70 63 6f 64 65   ** Gosub opcode
21690 20 61 6e 64 20 6a 75 6d 70 73 20 73 74 72 61 69   and jumps strai
216a0 67 68 74 20 74 6f 20 74 68 65 20 63 6f 64 65 20  ght to the code 
216b0 67 65 6e 65 72 61 74 65 64 20 62 79 20 57 68 65  generated by Whe
216c0 72 65 45 6e 64 28 29 2e 0a 20 20 20 20 2a 2a 0a  reEnd()..    **.
216d0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 73 71      **        sq
216e0 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
216f0 3c 74 65 72 6d 3e 29 0a 20 20 20 20 2a 2a 20 20  <term>).    **  
21700 20 20 20 20 20 20 20 20 52 6f 77 53 65 74 54 65          RowSetTe
21710 73 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  st              
21720 20 20 20 20 23 20 49 6e 73 65 72 74 20 72 6f 77      # Insert row
21730 69 64 20 69 6e 74 6f 20 72 6f 77 73 65 74 0a 20  id into rowset. 
21740 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 47     **          G
21750 6f 73 75 62 20 20 20 20 20 20 32 20 41 0a 20 20  osub      2 A.  
21760 20 20 2a 2a 20 20 20 20 20 20 20 20 73 71 6c 69    **        sqli
21770 74 65 33 57 68 65 72 65 45 6e 64 28 29 0a 20 20  te3WhereEnd().  
21780 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 6c 6c    **.    ** Foll
21790 6f 77 69 6e 67 20 74 68 65 20 61 62 6f 76 65 2c  owing the above,
217a0 20 63 6f 64 65 20 74 6f 20 74 65 72 6d 69 6e 61   code to termina
217b0 74 65 20 74 68 65 20 6c 6f 6f 70 2e 20 4c 61 62  te the loop. Lab
217c0 65 6c 20 41 2c 20 74 68 65 20 74 61 72 67 65 74  el A, the target
217d0 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 47  .    ** of the G
217e0 6f 73 75 62 20 61 62 6f 76 65 2c 20 6a 75 6d 70  osub above, jump
217f0 73 20 74 6f 20 74 68 65 20 69 6e 73 74 72 75 63  s to the instruc
21800 74 69 6f 6e 20 72 69 67 68 74 20 61 66 74 65 72  tion right after
21810 20 74 68 65 20 47 6f 74 6f 2e 0a 20 20 20 20 2a   the Goto..    *
21820 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  *.    **        
21830 20 20 4e 75 6c 6c 20 20 20 20 20 20 20 31 20 20    Null       1  
21840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
21850 5a 65 72 6f 20 74 68 65 20 72 6f 77 73 65 74 20  Zero the rowset 
21860 69 6e 20 72 65 67 20 31 0a 20 20 20 20 2a 2a 20  in reg 1.    ** 
21870 20 20 20 20 20 20 20 20 20 47 6f 74 6f 20 20 20           Goto   
21880 20 20 20 20 42 20 20 20 20 20 20 20 20 20 20 20      B           
21890 20 20 20 20 20 23 20 54 68 65 20 6c 6f 6f 70 20       # The loop 
218a0 69 73 20 66 69 6e 69 73 68 65 64 2e 0a 20 20 20  is finished..   
218b0 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   **.    **      
218c0 20 41 3a 20 3c 6c 6f 6f 70 20 62 6f 64 79 3e 20   A: <loop body> 
218d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
218e0 23 20 52 65 74 75 72 6e 20 64 61 74 61 2c 20 77  # Return data, w
218f0 68 61 74 65 76 65 72 2e 0a 20 20 20 20 2a 2a 0a  hatever..    **.
21900 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
21910 52 65 74 75 72 6e 20 20 20 20 20 32 20 20 20 20  Return     2    
21920 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4a 75              # Ju
21930 6d 70 20 62 61 63 6b 20 74 6f 20 74 68 65 20 47  mp back to the G
21940 6f 73 75 62 0a 20 20 20 20 2a 2a 0a 20 20 20 20  osub.    **.    
21950 2a 2a 20 20 20 20 20 20 20 42 3a 20 3c 61 66 74  **       B: <aft
21960 65 72 20 74 68 65 20 6c 6f 6f 70 3e 0a 20 20 20  er the loop>.   
21970 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 64 64 65 64   **.    ** Added
21980 20 32 30 31 34 2d 30 35 2d 32 36 3a 20 49 66 20   2014-05-26: If 
21990 74 68 65 20 74 61 62 6c 65 20 69 73 20 61 20 57  the table is a W
219a0 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62  ITHOUT ROWID tab
219b0 6c 65 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20  le, then.    ** 
219c0 75 73 65 20 61 6e 20 65 70 68 65 6d 65 72 61 6c  use an ephemeral
219d0 20 69 6e 64 65 78 20 69 6e 73 74 65 61 64 20 6f   index instead o
219e0 66 20 61 20 52 6f 77 53 65 74 20 74 6f 20 72 65  f a RowSet to re
219f0 63 6f 72 64 20 74 68 65 20 70 72 69 6d 61 72 79  cord the primary
21a00 0a 20 20 20 20 2a 2a 20 6b 65 79 73 20 6f 66 20  .    ** keys of 
21a10 74 68 65 20 72 6f 77 73 20 77 65 20 68 61 76 65  the rows we have
21a20 20 61 6c 72 65 61 64 79 20 73 65 65 6e 2e 0a 20   already seen.. 
21a30 20 20 20 2a 2a 0a 20 20 20 20 2a 2f 0a 20 20 20     **.    */.   
21a40 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 4f   WhereClause *pO
21a50 72 57 63 3b 20 20 20 20 2f 2a 20 54 68 65 20 4f  rWc;    /* The O
21a60 52 2d 63 6c 61 75 73 65 20 62 72 6f 6b 65 6e 20  R-clause broken 
21a70 6f 75 74 20 69 6e 74 6f 20 73 75 62 74 65 72 6d  out into subterm
21a80 73 20 2a 2f 0a 20 20 20 20 53 72 63 4c 69 73 74  s */.    SrcList
21a90 20 2a 70 4f 72 54 61 62 3b 20 20 20 20 20 20 20   *pOrTab;       
21aa0 2f 2a 20 53 68 6f 72 74 65 6e 65 64 20 74 61 62  /* Shortened tab
21ab0 6c 65 20 6c 69 73 74 20 6f 72 20 4f 52 2d 63 6c  le list or OR-cl
21ac0 61 75 73 65 20 67 65 6e 65 72 61 74 69 6f 6e 20  ause generation 
21ad0 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 43  */.    Index *pC
21ae0 6f 76 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ov = 0;         
21af0 20 20 20 20 2f 2a 20 50 6f 74 65 6e 74 69 61 6c      /* Potential
21b00 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20   covering index 
21b10 28 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 20  (or NULL) */.   
21b20 20 69 6e 74 20 69 43 6f 76 43 75 72 20 3d 20 70   int iCovCur = p
21b30 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20  Parse->nTab++;  
21b40 2f 2a 20 43 75 72 73 6f 72 20 75 73 65 64 20 66  /* Cursor used f
21b50 6f 72 20 69 6e 64 65 78 20 73 63 61 6e 73 20 28  or index scans (
21b60 69 66 20 61 6e 79 29 20 2a 2f 0a 0a 20 20 20 20  if any) */..    
21b70 69 6e 74 20 72 65 67 52 65 74 75 72 6e 20 3d 20  int regReturn = 
21b80 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 20  ++pParse->nMem; 
21b90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67            /* Reg
21ba0 69 73 74 65 72 20 75 73 65 64 20 77 69 74 68 20  ister used with 
21bb0 4f 50 5f 47 6f 73 75 62 20 2a 2f 0a 20 20 20 20  OP_Gosub */.    
21bc0 69 6e 74 20 72 65 67 52 6f 77 73 65 74 20 3d 20  int regRowset = 
21bd0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
21be0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67            /* Reg
21bf0 69 73 74 65 72 20 66 6f 72 20 52 6f 77 53 65 74  ister for RowSet
21c00 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20 69   object */.    i
21c10 6e 74 20 72 65 67 52 6f 77 69 64 20 3d 20 30 3b  nt regRowid = 0;
21c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21c30 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69           /* Regi
21c40 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 72 6f 77  ster holding row
21c50 69 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 4c  id */.    int iL
21c60 6f 6f 70 42 6f 64 79 20 3d 20 73 71 6c 69 74 65  oopBody = sqlite
21c70 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
21c80 29 3b 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20  );  /* Start of 
21c90 6c 6f 6f 70 20 62 6f 64 79 20 2a 2f 0a 20 20 20  loop body */.   
21ca0 20 69 6e 74 20 69 52 65 74 49 6e 69 74 3b 20 20   int iRetInit;  
21cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21cc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
21cd0 64 72 65 73 73 20 6f 66 20 72 65 67 52 65 74 75  dress of regRetu
21ce0 72 6e 20 69 6e 69 74 20 2a 2f 0a 20 20 20 20 69  rn init */.    i
21cf0 6e 74 20 75 6e 74 65 73 74 65 64 54 65 72 6d 73  nt untestedTerms
21d00 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
21d10 20 20 2f 2a 20 53 6f 6d 65 20 74 65 72 6d 73 20    /* Some terms 
21d20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 74  not completely t
21d30 65 73 74 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74  ested */.    int
21d40 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20   ii;            
21d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21d60 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
21d70 2a 2f 0a 20 20 20 20 75 31 36 20 77 63 74 72 6c  */.    u16 wctrl
21d80 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20  Flags;          
21d90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
21da0 67 73 20 66 6f 72 20 73 75 62 2d 57 48 45 52 45  gs for sub-WHERE
21db0 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 45   clause */.    E
21dc0 78 70 72 20 2a 70 41 6e 64 45 78 70 72 20 3d 20  xpr *pAndExpr = 
21dd0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
21de0 20 20 2f 2a 20 41 6e 20 22 2e 2e 20 41 4e 44 20    /* An ".. AND 
21df0 28 2e 2e 2e 29 22 20 65 78 70 72 65 73 73 69 6f  (...)" expressio
21e00 6e 20 2a 2f 0a 20 20 20 20 54 61 62 6c 65 20 2a  n */.    Table *
21e10 70 54 61 62 20 3d 20 70 54 61 62 49 74 65 6d 2d  pTab = pTabItem-
21e20 3e 70 54 61 62 3b 0a 20 20 20 0a 20 20 20 20 70  >pTab;.   .    p
21e30 54 65 72 6d 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c  Term = pLoop->aL
21e40 54 65 72 6d 5b 30 5d 3b 0a 20 20 20 20 61 73 73  Term[0];.    ass
21e50 65 72 74 28 20 70 54 65 72 6d 21 3d 30 20 29 3b  ert( pTerm!=0 );
21e60 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65  .    assert( pTe
21e70 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
21e80 57 4f 5f 4f 52 20 29 3b 0a 20 20 20 20 61 73 73  WO_OR );.    ass
21e90 65 72 74 28 20 28 70 54 65 72 6d 2d 3e 77 74 46  ert( (pTerm->wtF
21ea0 6c 61 67 73 20 26 20 54 45 52 4d 5f 4f 52 49 4e  lags & TERM_ORIN
21eb0 46 4f 29 21 3d 30 20 29 3b 0a 20 20 20 20 70 4f  FO)!=0 );.    pO
21ec0 72 57 63 20 3d 20 26 70 54 65 72 6d 2d 3e 75 2e  rWc = &pTerm->u.
21ed0 70 4f 72 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20  pOrInfo->wc;.   
21ee0 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50   pLevel->op = OP
21ef0 5f 52 65 74 75 72 6e 3b 0a 20 20 20 20 70 4c 65  _Return;.    pLe
21f00 76 65 6c 2d 3e 70 31 20 3d 20 72 65 67 52 65 74  vel->p1 = regRet
21f10 75 72 6e 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74  urn;..    /* Set
21f20 20 75 70 20 61 20 6e 65 77 20 53 72 63 4c 69 73   up a new SrcLis
21f30 74 20 69 6e 20 70 4f 72 54 61 62 20 63 6f 6e 74  t in pOrTab cont
21f40 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62 6c 65  aining the table
21f50 20 62 65 69 6e 67 20 73 63 61 6e 6e 65 64 0a 20   being scanned. 
21f60 20 20 20 2a 2a 20 62 79 20 74 68 69 73 20 6c 6f     ** by this lo
21f70 6f 70 20 69 6e 20 74 68 65 20 61 5b 30 5d 20 73  op in the a[0] s
21f80 6c 6f 74 20 61 6e 64 20 61 6c 6c 20 6e 6f 74 52  lot and all notR
21f90 65 61 64 79 20 74 61 62 6c 65 73 20 69 6e 20 61  eady tables in a
21fa0 5b 31 2e 2e 5d 20 73 6c 6f 74 73 2e 0a 20 20 20  [1..] slots..   
21fb0 20 2a 2a 20 54 68 69 73 20 62 65 63 6f 6d 65 73   ** This becomes
21fc0 20 74 68 65 20 53 72 63 4c 69 73 74 20 69 6e 20   the SrcList in 
21fd0 74 68 65 20 72 65 63 75 72 73 69 76 65 20 63 61  the recursive ca
21fe0 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65  ll to sqlite3Whe
21ff0 72 65 42 65 67 69 6e 28 29 2e 0a 20 20 20 20 2a  reBegin()..    *
22000 2f 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f  /.    if( pWInfo
22010 2d 3e 6e 4c 65 76 65 6c 3e 31 20 29 7b 0a 20 20  ->nLevel>1 ){.  
22020 20 20 20 20 69 6e 74 20 6e 4e 6f 74 52 65 61 64      int nNotRead
22030 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y;              
22040 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72     /* The number
22050 20 6f 66 20 6e 6f 74 52 65 61 64 79 20 74 61 62   of notReady tab
22060 6c 65 73 20 2a 2f 0a 20 20 20 20 20 20 73 74 72  les */.      str
22070 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
22080 20 2a 6f 72 69 67 53 72 63 3b 20 20 20 20 20 2f   *origSrc;     /
22090 2a 20 4f 72 69 67 69 6e 61 6c 20 6c 69 73 74 20  * Original list 
220a0 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 20  of tables */.   
220b0 20 20 20 6e 4e 6f 74 52 65 61 64 79 20 3d 20 70     nNotReady = p
220c0 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 20 2d 20  WInfo->nLevel - 
220d0 69 4c 65 76 65 6c 20 2d 20 31 3b 0a 20 20 20 20  iLevel - 1;.    
220e0 20 20 70 4f 72 54 61 62 20 3d 20 73 71 6c 69 74    pOrTab = sqlit
220f0 65 33 53 74 61 63 6b 41 6c 6c 6f 63 52 61 77 28  e3StackAllocRaw(
22100 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  db,.            
22110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22120 73 69 7a 65 6f 66 28 2a 70 4f 72 54 61 62 29 2b  sizeof(*pOrTab)+
22130 20 6e 4e 6f 74 52 65 61 64 79 2a 73 69 7a 65 6f   nNotReady*sizeo
22140 66 28 70 4f 72 54 61 62 2d 3e 61 5b 30 5d 29 29  f(pOrTab->a[0]))
22150 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 54  ;.      if( pOrT
22160 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 6e  ab==0 ) return n
22170 6f 74 52 65 61 64 79 3b 0a 20 20 20 20 20 20 70  otReady;.      p
22180 4f 72 54 61 62 2d 3e 6e 41 6c 6c 6f 63 20 3d 20  OrTab->nAlloc = 
22190 28 75 38 29 28 6e 4e 6f 74 52 65 61 64 79 20 2b  (u8)(nNotReady +
221a0 20 31 29 3b 0a 20 20 20 20 20 20 70 4f 72 54 61   1);.      pOrTa
221b0 62 2d 3e 6e 53 72 63 20 3d 20 70 4f 72 54 61 62  b->nSrc = pOrTab
221c0 2d 3e 6e 41 6c 6c 6f 63 3b 0a 20 20 20 20 20 20  ->nAlloc;.      
221d0 6d 65 6d 63 70 79 28 70 4f 72 54 61 62 2d 3e 61  memcpy(pOrTab->a
221e0 2c 20 70 54 61 62 49 74 65 6d 2c 20 73 69 7a 65  , pTabItem, size
221f0 6f 66 28 2a 70 54 61 62 49 74 65 6d 29 29 3b 0a  of(*pTabItem));.
22200 20 20 20 20 20 20 6f 72 69 67 53 72 63 20 3d 20        origSrc = 
22210 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
22220 2d 3e 61 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b  ->a;.      for(k
22230 3d 31 3b 20 6b 3c 3d 6e 4e 6f 74 52 65 61 64 79  =1; k<=nNotReady
22240 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; k++){.        
22250 6d 65 6d 63 70 79 28 26 70 4f 72 54 61 62 2d 3e  memcpy(&pOrTab->
22260 61 5b 6b 5d 2c 20 26 6f 72 69 67 53 72 63 5b 70  a[k], &origSrc[p
22270 4c 65 76 65 6c 5b 6b 5d 2e 69 46 72 6f 6d 5d 2c  Level[k].iFrom],
22280 20 73 69 7a 65 6f 66 28 70 4f 72 54 61 62 2d 3e   sizeof(pOrTab->
22290 61 5b 6b 5d 29 29 3b 0a 20 20 20 20 20 20 7d 0a  a[k]));.      }.
222a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
222b0 20 70 4f 72 54 61 62 20 3d 20 70 57 49 6e 66 6f   pOrTab = pWInfo
222c0 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20 20 20 20  ->pTabList;.    
222d0 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61  }..    /* Initia
222e0 6c 69 7a 65 20 74 68 65 20 72 6f 77 73 65 74 20  lize the rowset 
222f0 72 65 67 69 73 74 65 72 20 74 6f 20 63 6f 6e 74  register to cont
22300 61 69 6e 20 4e 55 4c 4c 2e 20 41 6e 20 53 51 4c  ain NULL. An SQL
22310 20 4e 55 4c 4c 20 69 73 20 0a 20 20 20 20 2a 2a   NULL is .    **
22320 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 61   equivalent to a
22330 6e 20 65 6d 70 74 79 20 72 6f 77 73 65 74 2e 20  n empty rowset. 
22340 20 4f 72 2c 20 63 72 65 61 74 65 20 61 6e 20 65   Or, create an e
22350 70 68 65 6d 65 72 61 6c 20 69 6e 64 65 78 0a 20  phemeral index. 
22360 20 20 20 2a 2a 20 63 61 70 61 62 6c 65 20 6f 66     ** capable of
22370 20 68 6f 6c 64 69 6e 67 20 70 72 69 6d 61 72 79   holding primary
22380 20 6b 65 79 73 20 69 6e 20 74 68 65 20 63 61 73   keys in the cas
22390 65 20 6f 66 20 61 20 57 49 54 48 4f 55 54 20 52  e of a WITHOUT R
223a0 4f 57 49 44 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  OWID..    **.   
223b0 20 2a 2a 20 41 6c 73 6f 20 69 6e 69 74 69 61 6c   ** Also initial
223c0 69 7a 65 20 72 65 67 52 65 74 75 72 6e 20 74 6f  ize regReturn to
223d0 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 61 64 64   contain the add
223e0 72 65 73 73 20 6f 66 20 74 68 65 20 69 6e 73 74  ress of the inst
223f0 72 75 63 74 69 6f 6e 20 0a 20 20 20 20 2a 2a 20  ruction .    ** 
22400 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c  immediately foll
22410 6f 77 69 6e 67 20 74 68 65 20 4f 50 5f 52 65 74  owing the OP_Ret
22420 75 72 6e 20 61 74 20 74 68 65 20 62 6f 74 74 6f  urn at the botto
22430 6d 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20 54  m of the loop. T
22440 68 69 73 0a 20 20 20 20 2a 2a 20 69 73 20 72 65  his.    ** is re
22450 71 75 69 72 65 64 20 69 6e 20 61 20 66 65 77 20  quired in a few 
22460 6f 62 73 63 75 72 65 20 4c 45 46 54 20 4a 4f 49  obscure LEFT JOI
22470 4e 20 63 61 73 65 73 20 77 68 65 72 65 20 63 6f  N cases where co
22480 6e 74 72 6f 6c 20 6a 75 6d 70 73 0a 20 20 20 20  ntrol jumps.    
22490 2a 2a 20 6f 76 65 72 20 74 68 65 20 74 6f 70 20  ** over the top 
224a0 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69 6e 74 6f  of the loop into
224b0 20 74 68 65 20 62 6f 64 79 20 6f 66 20 69 74 2e   the body of it.
224c0 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
224d0 65 20 0a 20 20 20 20 2a 2a 20 63 6f 72 72 65 63  e .    ** correc
224e0 74 20 72 65 73 70 6f 6e 73 65 20 66 6f 72 20 74  t response for t
224f0 68 65 20 65 6e 64 2d 6f 66 2d 6c 6f 6f 70 20 63  he end-of-loop c
22500 6f 64 65 20 28 74 68 65 20 4f 50 5f 52 65 74 75  ode (the OP_Retu
22510 72 6e 29 20 69 73 20 74 6f 20 0a 20 20 20 20 2a  rn) is to .    *
22520 2a 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 74  * fall through t
22530 6f 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72  o the next instr
22540 75 63 74 69 6f 6e 2c 20 6a 75 73 74 20 61 73 20  uction, just as 
22550 61 6e 20 4f 50 5f 4e 65 78 74 20 64 6f 65 73 20  an OP_Next does 
22560 69 66 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 65 64  if.    ** called
22570 20 6f 6e 20 61 6e 20 75 6e 69 6e 69 74 69 61 6c   on an uninitial
22580 69 7a 65 64 20 63 75 72 73 6f 72 2e 0a 20 20 20  ized cursor..   
22590 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 57 49   */.    if( (pWI
225a0 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
225b0 26 20 57 48 45 52 45 5f 44 55 50 4c 49 43 41 54  & WHERE_DUPLICAT
225c0 45 53 5f 4f 4b 29 3d 3d 30 20 29 7b 0a 20 20 20  ES_OK)==0 ){.   
225d0 20 20 20 69 66 28 20 48 61 73 52 6f 77 69 64 28     if( HasRowid(
225e0 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20  pTab) ){.       
225f0 20 72 65 67 52 6f 77 73 65 74 20 3d 20 2b 2b 70   regRowset = ++p
22600 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
22610 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
22620 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp2(v, OP_Nul
22630 6c 2c 20 30 2c 20 72 65 67 52 6f 77 73 65 74 29  l, 0, regRowset)
22640 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
22650 20 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 50         Index *pP
22660 6b 20 3d 20 73 71 6c 69 74 65 33 50 72 69 6d 61  k = sqlite3Prima
22670 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29  ryKeyIndex(pTab)
22680 3b 0a 20 20 20 20 20 20 20 20 72 65 67 52 6f 77  ;.        regRow
22690 73 65 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  set = pParse->nT
226a0 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 73 71  ab++;.        sq
226b0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
226c0 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
226d0 72 61 6c 2c 20 72 65 67 52 6f 77 73 65 74 2c 20  ral, regRowset, 
226e0 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 29 3b 0a 20  pPk->nKeyCol);. 
226f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
22700 62 65 53 65 74 50 34 4b 65 79 49 6e 66 6f 28 70  beSetP4KeyInfo(p
22710 50 61 72 73 65 2c 20 70 50 6b 29 3b 0a 20 20 20  Parse, pPk);.   
22720 20 20 20 7d 0a 20 20 20 20 20 20 72 65 67 52 6f     }.      regRo
22730 77 69 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  wid = ++pParse->
22740 6e 4d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  nMem;.    }.    
22750 69 52 65 74 49 6e 69 74 20 3d 20 73 71 6c 69 74  iRetInit = sqlit
22760 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
22770 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72  OP_Integer, 0, r
22780 65 67 52 65 74 75 72 6e 29 3b 0a 0a 20 20 20 20  egReturn);..    
22790 2f 2a 20 49 66 20 74 68 65 20 6f 72 69 67 69 6e  /* If the origin
227a0 61 6c 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  al WHERE clause 
227b0 69 73 20 7a 20 6f 66 20 74 68 65 20 66 6f 72 6d  is z of the form
227c0 3a 20 20 28 78 31 20 4f 52 20 78 32 20 4f 52 20  :  (x1 OR x2 OR 
227d0 2e 2e 2e 29 20 41 4e 44 20 79 0a 20 20 20 20 2a  ...) AND y.    *
227e0 2a 20 54 68 65 6e 20 66 6f 72 20 65 76 65 72 79  * Then for every
227f0 20 74 65 72 6d 20 78 4e 2c 20 65 76 61 6c 75 61   term xN, evalua
22800 74 65 20 61 73 20 74 68 65 20 73 75 62 65 78 70  te as the subexp
22810 72 65 73 73 69 6f 6e 3a 20 78 4e 20 41 4e 44 20  ression: xN AND 
22820 7a 0a 20 20 20 20 2a 2a 20 54 68 61 74 20 77 61  z.    ** That wa
22830 79 2c 20 74 65 72 6d 73 20 69 6e 20 79 20 74 68  y, terms in y th
22840 61 74 20 61 72 65 20 66 61 63 74 6f 72 65 64 20  at are factored 
22850 69 6e 74 6f 20 74 68 65 20 64 69 73 6a 75 6e 63  into the disjunc
22860 74 69 6f 6e 20 77 69 6c 6c 0a 20 20 20 20 2a 2a  tion will.    **
22870 20 62 65 20 70 69 63 6b 65 64 20 75 70 20 62 79   be picked up by
22880 20 74 68 65 20 72 65 63 75 72 73 69 76 65 20 63   the recursive c
22890 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 57  alls to sqlite3W
228a0 68 65 72 65 42 65 67 69 6e 28 29 20 62 65 6c 6f  hereBegin() belo
228b0 77 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  w..    **.    **
228c0 20 41 63 74 75 61 6c 6c 79 2c 20 65 61 63 68 20   Actually, each 
228d0 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 69 73  subexpression is
228e0 20 63 6f 6e 76 65 72 74 65 64 20 74 6f 20 22 78   converted to "x
228f0 4e 20 41 4e 44 20 77 22 20 77 68 65 72 65 20 77  N AND w" where w
22900 20 69 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 22   is.    ** the "
22910 69 6e 74 65 72 65 73 74 69 6e 67 22 20 74 65 72  interesting" ter
22920 6d 73 20 6f 66 20 7a 20 2d 20 74 65 72 6d 73 20  ms of z - terms 
22930 74 68 61 74 20 64 69 64 20 6e 6f 74 20 6f 72 69  that did not ori
22940 67 69 6e 61 74 65 20 69 6e 20 74 68 65 0a 20 20  ginate in the.  
22950 20 20 2a 2a 20 4f 4e 20 6f 72 20 55 53 49 4e 47    ** ON or USING
22960 20 63 6c 61 75 73 65 20 6f 66 20 61 20 4c 45 46   clause of a LEF
22970 54 20 4a 4f 49 4e 2c 20 61 6e 64 20 74 65 72 6d  T JOIN, and term
22980 73 20 74 68 61 74 20 61 72 65 20 75 73 61 62 6c  s that are usabl
22990 65 20 61 73 20 0a 20 20 20 20 2a 2a 20 69 6e 64  e as .    ** ind
229a0 69 63 65 73 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  ices..    **.   
229b0 20 2a 2a 20 54 68 69 73 20 6f 70 74 69 6d 69 7a   ** This optimiz
229c0 61 74 69 6f 6e 20 61 6c 73 6f 20 6f 6e 6c 79 20  ation also only 
229d0 61 70 70 6c 69 65 73 20 69 66 20 74 68 65 20 28  applies if the (
229e0 78 31 20 4f 52 20 78 32 20 4f 52 20 2e 2e 2e 29  x1 OR x2 OR ...)
229f0 20 74 65 72 6d 0a 20 20 20 20 2a 2a 20 69 73 20   term.    ** is 
22a00 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e  not contained in
22a10 20 74 68 65 20 4f 4e 20 63 6c 61 75 73 65 20 6f   the ON clause o
22a20 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2e 0a 20  f a LEFT JOIN.. 
22a30 20 20 20 2a 2a 20 53 65 65 20 74 69 63 6b 65 74     ** See ticket
22a40 20 68 74 74 70 3a 2f 2f 77 77 77 2e 73 71 6c 69   http://www.sqli
22a50 74 65 2e 6f 72 67 2f 73 72 63 2f 69 6e 66 6f 2f  te.org/src/info/
22a60 66 32 33 36 39 33 30 34 65 34 0a 20 20 20 20 2a  f2369304e4.    *
22a70 2f 0a 20 20 20 20 69 66 28 20 70 57 43 2d 3e 6e  /.    if( pWC->n
22a80 54 65 72 6d 3e 31 20 29 7b 0a 20 20 20 20 20 20  Term>1 ){.      
22a90 69 6e 74 20 69 54 65 72 6d 3b 0a 20 20 20 20 20  int iTerm;.     
22aa0 20 66 6f 72 28 69 54 65 72 6d 3d 30 3b 20 69 54   for(iTerm=0; iT
22ab0 65 72 6d 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20  erm<pWC->nTerm; 
22ac0 69 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  iTerm++){.      
22ad0 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
22ae0 70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d 2e 70 45  pWC->a[iTerm].pE
22af0 78 70 72 3b 0a 20 20 20 20 20 20 20 20 69 66 28  xpr;.        if(
22b00 20 26 70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d 20   &pWC->a[iTerm] 
22b10 3d 3d 20 70 54 65 72 6d 20 29 20 63 6f 6e 74 69  == pTerm ) conti
22b20 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  nue;.        if(
22b30 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
22b40 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a  (pExpr, EP_FromJ
22b50 6f 69 6e 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  oin) ) continue;
22b60 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70 57  .        if( (pW
22b70 43 2d 3e 61 5b 69 54 65 72 6d 5d 2e 77 74 46 6c  C->a[iTerm].wtFl
22b80 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55  ags & TERM_VIRTU
22b90 41 4c 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75  AL)!=0 ) continu
22ba0 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  e;.        if( (
22bb0 70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d 2e 65 4f  pWC->a[iTerm].eO
22bc0 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 41 4c 4c  perator & WO_ALL
22bd0 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  )==0 ) continue;
22be0 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
22bf0 65 28 20 70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d  e( pWC->a[iTerm]
22c00 2e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  .wtFlags & TERM_
22c10 4f 52 49 4e 46 4f 20 29 3b 0a 20 20 20 20 20 20  ORINFO );.      
22c20 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65    pExpr = sqlite
22c30 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 45 78  3ExprDup(db, pEx
22c40 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  pr, 0);.        
22c50 70 41 6e 64 45 78 70 72 20 3d 20 73 71 6c 69 74  pAndExpr = sqlit
22c60 65 33 45 78 70 72 41 6e 64 28 64 62 2c 20 70 41  e3ExprAnd(db, pA
22c70 6e 64 45 78 70 72 2c 20 70 45 78 70 72 29 3b 0a  ndExpr, pExpr);.
22c80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
22c90 28 20 70 41 6e 64 45 78 70 72 20 29 7b 0a 20 20  ( pAndExpr ){.  
22ca0 20 20 20 20 20 20 70 41 6e 64 45 78 70 72 20 3d        pAndExpr =
22cb0 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
22cc0 61 72 73 65 2c 20 54 4b 5f 41 4e 44 2c 20 30 2c  arse, TK_AND, 0,
22cd0 20 70 41 6e 64 45 78 70 72 2c 20 30 29 3b 0a 20   pAndExpr, 0);. 
22ce0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
22cf0 20 20 2f 2a 20 52 75 6e 20 61 20 73 65 70 61 72    /* Run a separ
22d00 61 74 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  ate WHERE clause
22d10 20 66 6f 72 20 65 61 63 68 20 74 65 72 6d 20 6f   for each term o
22d20 66 20 74 68 65 20 4f 52 20 63 6c 61 75 73 65 2e  f the OR clause.
22d30 20 20 41 66 74 65 72 0a 20 20 20 20 2a 2a 20 65    After.    ** e
22d40 6c 69 6d 69 6e 61 74 69 6e 67 20 64 75 70 6c 69  liminating dupli
22d50 63 61 74 65 73 20 66 72 6f 6d 20 6f 74 68 65 72  cates from other
22d60 20 57 48 45 52 45 20 63 6c 61 75 73 65 73 2c 20   WHERE clauses, 
22d70 74 68 65 20 61 63 74 69 6f 6e 20 66 6f 72 20 65  the action for e
22d80 61 63 68 0a 20 20 20 20 2a 2a 20 73 75 62 2d 57  ach.    ** sub-W
22d90 48 45 52 45 20 63 6c 61 75 73 65 20 69 73 20 74  HERE clause is t
22da0 6f 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20  o to invoke the 
22db0 6d 61 69 6e 20 6c 6f 6f 70 20 62 6f 64 79 20 61  main loop body a
22dc0 73 20 61 20 73 75 62 72 6f 75 74 69 6e 65 2e 0a  s a subroutine..
22dd0 20 20 20 20 2a 2f 0a 20 20 20 20 77 63 74 72 6c      */.    wctrl
22de0 46 6c 61 67 73 20 3d 20 20 57 48 45 52 45 5f 4f  Flags =  WHERE_O
22df0 4d 49 54 5f 4f 50 45 4e 5f 43 4c 4f 53 45 0a 20  MIT_OPEN_CLOSE. 
22e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
22e10 20 57 48 45 52 45 5f 46 4f 52 43 45 5f 54 41 42   WHERE_FORCE_TAB
22e20 4c 45 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  LE.             
22e30 20 20 20 7c 20 57 48 45 52 45 5f 4f 4e 45 54 41     | WHERE_ONETA
22e40 42 4c 45 5f 4f 4e 4c 59 0a 20 20 20 20 20 20 20  BLE_ONLY.       
22e50 20 20 20 20 20 20 20 20 20 7c 20 57 48 45 52 45           | WHERE
22e60 5f 4e 4f 5f 41 55 54 4f 49 4e 44 45 58 3b 0a 20  _NO_AUTOINDEX;. 
22e70 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c     for(ii=0; ii<
22e80 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 3b 20 69 69  pOrWc->nTerm; ii
22e90 2b 2b 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65  ++){.      Where
22ea0 54 65 72 6d 20 2a 70 4f 72 54 65 72 6d 20 3d 20  Term *pOrTerm = 
22eb0 26 70 4f 72 57 63 2d 3e 61 5b 69 69 5d 3b 0a 20  &pOrWc->a[ii];. 
22ec0 20 20 20 20 20 69 66 28 20 70 4f 72 54 65 72 6d       if( pOrTerm
22ed0 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43  ->leftCursor==iC
22ee0 75 72 20 7c 7c 20 28 70 4f 72 54 65 72 6d 2d 3e  ur || (pOrTerm->
22ef0 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 41  eOperator & WO_A
22f00 4e 44 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ND)!=0 ){.      
22f10 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 53 75    WhereInfo *pSu
22f20 62 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20  bWInfo;         
22f30 20 20 2f 2a 20 49 6e 66 6f 20 66 6f 72 20 73 69    /* Info for si
22f40 6e 67 6c 65 20 4f 52 2d 74 65 72 6d 20 73 63 61  ngle OR-term sca
22f50 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 45 78 70  n */.        Exp
22f60 72 20 2a 70 4f 72 45 78 70 72 20 3d 20 70 4f 72  r *pOrExpr = pOr
22f70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 20 2f 2a 20  Term->pExpr; /* 
22f80 43 75 72 72 65 6e 74 20 4f 52 20 63 6c 61 75 73  Current OR claus
22f90 65 20 74 65 72 6d 20 2a 2f 0a 20 20 20 20 20 20  e term */.      
22fa0 20 20 69 6e 74 20 6a 31 20 3d 20 30 3b 20 20 20    int j1 = 0;   
22fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22fc0 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
22fd0 6a 75 6d 70 20 6f 70 65 72 61 74 69 6f 6e 20 2a  jump operation *
22fe0 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 41  /.        if( pA
22ff0 6e 64 45 78 70 72 20 26 26 20 21 45 78 70 72 48  ndExpr && !ExprH
23000 61 73 50 72 6f 70 65 72 74 79 28 70 4f 72 45 78  asProperty(pOrEx
23010 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  pr, EP_FromJoin)
23020 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 41   ){.          pA
23030 6e 64 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20  ndExpr->pLeft = 
23040 70 4f 72 45 78 70 72 3b 0a 20 20 20 20 20 20 20  pOrExpr;.       
23050 20 20 20 70 4f 72 45 78 70 72 20 3d 20 70 41 6e     pOrExpr = pAn
23060 64 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 7d  dExpr;.        }
23070 0a 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70  .        /* Loop
23080 20 74 68 72 6f 75 67 68 20 74 61 62 6c 65 20 65   through table e
23090 6e 74 72 69 65 73 20 74 68 61 74 20 6d 61 74 63  ntries that matc
230a0 68 20 74 65 72 6d 20 70 4f 72 54 65 72 6d 2e 20  h term pOrTerm. 
230b0 2a 2f 0a 20 20 20 20 20 20 20 20 57 48 45 52 45  */.        WHERE
230c0 54 52 41 43 45 28 30 78 66 66 66 66 2c 20 28 22  TRACE(0xffff, ("
230d0 53 75 62 70 6c 61 6e 20 66 6f 72 20 4f 52 2d 63  Subplan for OR-c
230e0 6c 61 75 73 65 3a 5c 6e 22 29 29 3b 0a 20 20 20  lause:\n"));.   
230f0 20 20 20 20 20 70 53 75 62 57 49 6e 66 6f 20 3d       pSubWInfo =
23100 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
23110 69 6e 28 70 50 61 72 73 65 2c 20 70 4f 72 54 61  in(pParse, pOrTa
23120 62 2c 20 70 4f 72 45 78 70 72 2c 20 30 2c 20 30  b, pOrExpr, 0, 0
23130 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
23140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23150 20 20 20 20 20 20 20 20 77 63 74 72 6c 46 6c 61          wctrlFla
23160 67 73 2c 20 69 43 6f 76 43 75 72 29 3b 0a 20 20  gs, iCovCur);.  
23170 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53        assert( pS
23180 75 62 57 49 6e 66 6f 20 7c 7c 20 70 50 61 72 73  ubWInfo || pPars
23190 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d  e->nErr || db->m
231a0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
231b0 20 20 20 20 20 20 20 69 66 28 20 70 53 75 62 57         if( pSubW
231c0 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 20 20  Info ){.        
231d0 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 53 75    WhereLoop *pSu
231e0 62 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20 20  bLoop;.         
231f0 20 69 6e 74 20 61 64 64 72 45 78 70 6c 61 69 6e   int addrExplain
23200 20 3d 20 65 78 70 6c 61 69 6e 4f 6e 65 53 63 61   = explainOneSca
23210 6e 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n(.             
23220 20 70 50 61 72 73 65 2c 20 70 4f 72 54 61 62 2c   pParse, pOrTab,
23230 20 26 70 53 75 62 57 49 6e 66 6f 2d 3e 61 5b 30   &pSubWInfo->a[0
23240 5d 2c 20 69 4c 65 76 65 6c 2c 20 70 4c 65 76 65  ], iLevel, pLeve
23250 6c 2d 3e 69 46 72 6f 6d 2c 20 30 0a 20 20 20 20  l->iFrom, 0.    
23260 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
23270 20 20 20 61 64 64 53 63 61 6e 53 74 61 74 75 73     addScanStatus
23280 28 76 2c 20 70 4f 72 54 61 62 2c 20 26 70 53 75  (v, pOrTab, &pSu
23290 62 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2c 20 61 64  bWInfo->a[0], ad
232a0 64 72 45 78 70 6c 61 69 6e 29 3b 0a 0a 20 20 20  drExplain);..   
232b0 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 69         /* This i
232c0 73 20 74 68 65 20 73 75 62 2d 57 48 45 52 45 20  s the sub-WHERE 
232d0 63 6c 61 75 73 65 20 62 6f 64 79 2e 20 20 46 69  clause body.  Fi
232e0 72 73 74 20 73 6b 69 70 20 6f 76 65 72 0a 20 20  rst skip over.  
232f0 20 20 20 20 20 20 20 20 2a 2a 20 64 75 70 6c 69          ** dupli
23300 63 61 74 65 20 72 6f 77 73 20 66 72 6f 6d 20 70  cate rows from p
23310 72 69 6f 72 20 73 75 62 2d 57 48 45 52 45 20 63  rior sub-WHERE c
23320 6c 61 75 73 65 73 2c 20 61 6e 64 20 72 65 63 6f  lauses, and reco
23330 72 64 20 74 68 65 0a 20 20 20 20 20 20 20 20 20  rd the.         
23340 20 2a 2a 20 72 6f 77 69 64 20 28 6f 72 20 50 52   ** rowid (or PR
23350 49 4d 41 52 59 20 4b 45 59 29 20 66 6f 72 20 74  IMARY KEY) for t
23360 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20 73  he current row s
23370 6f 20 74 68 61 74 20 74 68 65 20 73 61 6d 65 0a  o that the same.
23380 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72 6f 77            ** row
23390 20 77 69 6c 6c 20 62 65 20 73 6b 69 70 70 65 64   will be skipped
233a0 20 69 6e 20 73 75 62 73 65 71 75 65 6e 74 20 73   in subsequent s
233b0 75 62 2d 57 48 45 52 45 20 63 6c 61 75 73 65 73  ub-WHERE clauses
233c0 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
233d0 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70 57           if( (pW
233e0 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
233f0 20 26 20 57 48 45 52 45 5f 44 55 50 4c 49 43 41   & WHERE_DUPLICA
23400 54 45 53 5f 4f 4b 29 3d 3d 30 20 29 7b 0a 20 20  TES_OK)==0 ){.  
23410 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 72 3b            int r;
23420 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
23430 20 69 53 65 74 20 3d 20 28 28 69 69 3d 3d 70 4f   iSet = ((ii==pO
23440 72 57 63 2d 3e 6e 54 65 72 6d 2d 31 29 3f 2d 31  rWc->nTerm-1)?-1
23450 3a 69 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20  :ii);.          
23460 20 20 69 66 28 20 48 61 73 52 6f 77 69 64 28 70    if( HasRowid(p
23470 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Tab) ){.        
23480 20 20 20 20 20 20 72 20 3d 20 73 71 6c 69 74 65        r = sqlite
23490 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75  3ExprCodeGetColu
234a0 6d 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c  mn(pParse, pTab,
234b0 20 2d 31 2c 20 69 43 75 72 2c 20 72 65 67 52 6f   -1, iCur, regRo
234c0 77 69 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  wid, 0);.       
234d0 20 20 20 20 20 20 20 6a 31 20 3d 20 73 71 6c 69         j1 = sqli
234e0 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
234f0 28 76 2c 20 4f 50 5f 52 6f 77 53 65 74 54 65 73  (v, OP_RowSetTes
23500 74 2c 20 72 65 67 52 6f 77 73 65 74 2c 20 30 2c  t, regRowset, 0,
23510 20 72 2c 69 53 65 74 29 3b 0a 20 20 20 20 20 20   r,iSet);.      
23520 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
23530 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
23540 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
23550 20 20 20 20 20 20 20 20 20 20 49 6e 64 65 78 20            Index 
23560 2a 70 50 6b 20 3d 20 73 71 6c 69 74 65 33 50 72  *pPk = sqlite3Pr
23570 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54  imaryKeyIndex(pT
23580 61 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ab);.           
23590 20 20 20 69 6e 74 20 6e 50 6b 20 3d 20 70 50 6b     int nPk = pPk
235a0 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20 20 20 20  ->nKeyCol;.     
235b0 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 50 6b           int iPk
235c0 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ;..             
235d0 20 2f 2a 20 52 65 61 64 20 74 68 65 20 50 4b 20   /* Read the PK 
235e0 69 6e 74 6f 20 61 6e 20 61 72 72 61 79 20 6f 66  into an array of
235f0 20 74 65 6d 70 20 72 65 67 69 73 74 65 72 73 2e   temp registers.
23600 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
23610 20 20 72 20 3d 20 73 71 6c 69 74 65 33 47 65 74    r = sqlite3Get
23620 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
23630 2c 20 6e 50 6b 29 3b 0a 20 20 20 20 20 20 20 20  , nPk);.        
23640 20 20 20 20 20 20 66 6f 72 28 69 50 6b 3d 30 3b        for(iPk=0;
23650 20 69 50 6b 3c 6e 50 6b 3b 20 69 50 6b 2b 2b 29   iPk<nPk; iPk++)
23660 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
23670 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 50 6b    int iCol = pPk
23680 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 50 6b 5d 3b  ->aiColumn[iPk];
23690 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
236a0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
236b0 47 65 74 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65  GetColumn(pParse
236c0 2c 20 70 54 61 62 2c 20 69 43 6f 6c 2c 20 69 43  , pTab, iCol, iC
236d0 75 72 2c 20 72 2b 69 50 6b 2c 20 30 29 3b 0a 20  ur, r+iPk, 0);. 
236e0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 0a               }..
236f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23700 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 74 65   Check if the te
23710 6d 70 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79  mp table already
23720 20 63 6f 6e 74 61 69 6e 73 20 74 68 69 73 20 6b   contains this k
23730 65 79 2e 20 49 66 20 73 6f 2c 0a 20 20 20 20 20  ey. If so,.     
23740 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20           ** the 
23750 72 6f 77 20 68 61 73 20 61 6c 72 65 61 64 79 20  row has already 
23760 62 65 65 6e 20 69 6e 63 6c 75 64 65 64 20 69 6e  been included in
23770 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
23780 61 6e 64 0a 20 20 20 20 20 20 20 20 20 20 20 20  and.            
23790 20 20 2a 2a 20 63 61 6e 20 62 65 20 69 67 6e 6f    ** can be igno
237a0 72 65 64 20 28 62 79 20 6a 75 6d 70 69 6e 67 20  red (by jumping 
237b0 70 61 73 74 20 74 68 65 20 47 6f 73 75 62 20 62  past the Gosub b
237c0 65 6c 6f 77 29 2e 20 4f 74 68 65 72 77 69 73 65  elow). Otherwise
237d0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
237e0 2a 2a 20 69 6e 73 65 72 74 20 74 68 65 20 6b 65  ** insert the ke
237f0 79 20 69 6e 74 6f 20 74 68 65 20 74 65 6d 70 20  y into the temp 
23800 74 61 62 6c 65 20 61 6e 64 20 70 72 6f 63 65 65  table and procee
23810 64 20 77 69 74 68 20 70 72 6f 63 65 73 73 69 6e  d with processin
23820 67 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g.              
23830 2a 2a 20 74 68 65 20 72 6f 77 2e 0a 20 20 20 20  ** the row..    
23840 20 20 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20            **.   
23850 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 55 73             ** Us
23860 65 20 73 6f 6d 65 20 6f 66 20 74 68 65 20 73 61  e some of the sa
23870 6d 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73  me optimizations
23880 20 61 73 20 4f 50 5f 52 6f 77 53 65 74 54 65 73   as OP_RowSetTes
23890 74 3a 20 49 66 20 69 53 65 74 0a 20 20 20 20 20  t: If iSet.     
238a0 20 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 7a           ** is z
238b0 65 72 6f 2c 20 61 73 73 75 6d 65 20 74 68 61 74  ero, assume that
238c0 20 74 68 65 20 6b 65 79 20 63 61 6e 6e 6f 74 20   the key cannot 
238d0 61 6c 72 65 61 64 79 20 62 65 20 70 72 65 73 65  already be prese
238e0 6e 74 20 69 6e 0a 20 20 20 20 20 20 20 20 20 20  nt in.          
238f0 20 20 20 20 2a 2a 20 74 68 65 20 74 65 6d 70 20      ** the temp 
23900 74 61 62 6c 65 2e 20 41 6e 64 20 69 66 20 69 53  table. And if iS
23910 65 74 20 69 73 20 2d 31 2c 20 61 73 73 75 6d 65  et is -1, assume
23920 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20 6e   that there is n
23930 6f 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o .             
23940 20 2a 2a 20 6e 65 65 64 20 74 6f 20 69 6e 73 65   ** need to inse
23950 72 74 20 74 68 65 20 6b 65 79 20 69 6e 74 6f 20  rt the key into 
23960 74 68 65 20 74 65 6d 70 20 74 61 62 6c 65 2c 20  the temp table, 
23970 61 73 20 69 74 20 77 69 6c 6c 20 6e 65 76 65 72  as it will never
23980 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
23990 2a 2a 20 62 65 20 74 65 73 74 65 64 20 66 6f 72  ** be tested for
239a0 2e 20 20 2a 2f 20 0a 20 20 20 20 20 20 20 20 20  .  */ .         
239b0 20 20 20 20 20 69 66 28 20 69 53 65 74 20 29 7b       if( iSet ){
239c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
239d0 20 6a 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62   j1 = sqlite3Vdb
239e0 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
239f0 5f 46 6f 75 6e 64 2c 20 72 65 67 52 6f 77 73 65  _Found, regRowse
23a00 74 2c 20 30 2c 20 72 2c 20 6e 50 6b 29 3b 0a 20  t, 0, r, nPk);. 
23a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 56                 V
23a20 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
23a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
23a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
23a50 28 20 69 53 65 74 3e 3d 30 20 29 7b 0a 20 20 20  ( iSet>=0 ){.   
23a60 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
23a70 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
23a80 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
23a90 20 72 2c 20 6e 50 6b 2c 20 72 65 67 52 6f 77 69   r, nPk, regRowi
23aa0 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  d);.            
23ab0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
23ac0 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 64 78 49  ddOp3(v, OP_IdxI
23ad0 6e 73 65 72 74 2c 20 72 65 67 52 6f 77 73 65 74  nsert, regRowset
23ae0 2c 20 72 65 67 52 6f 77 69 64 2c 20 30 29 3b 0a  , regRowid, 0);.
23af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23b00 69 66 28 20 69 53 65 74 20 29 20 73 71 6c 69 74  if( iSet ) sqlit
23b10 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
23b20 2c 20 4f 50 46 4c 41 47 5f 55 53 45 53 45 45 4b  , OPFLAG_USESEEK
23b30 52 45 53 55 4c 54 29 3b 0a 20 20 20 20 20 20 20  RESULT);.       
23b40 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
23b50 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6c 65 61          /* Relea
23b60 73 65 20 74 68 65 20 61 72 72 61 79 20 6f 66 20  se the array of 
23b70 74 65 6d 70 20 72 65 67 69 73 74 65 72 73 20 2a  temp registers *
23b80 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
23b90 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
23ba0 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
23bb0 72 2c 20 6e 50 6b 29 3b 0a 20 20 20 20 20 20 20  r, nPk);.       
23bc0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
23bd0 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   }..          /*
23be0 20 49 6e 76 6f 6b 65 20 74 68 65 20 6d 61 69 6e   Invoke the main
23bf0 20 6c 6f 6f 70 20 62 6f 64 79 20 61 73 20 61 20   loop body as a 
23c00 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
23c10 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
23c20 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
23c30 47 6f 73 75 62 2c 20 72 65 67 52 65 74 75 72 6e  Gosub, regReturn
23c40 2c 20 69 4c 6f 6f 70 42 6f 64 79 29 3b 0a 0a 20  , iLoopBody);.. 
23c50 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70           /* Jump
23c60 20 68 65 72 65 20 28 73 6b 69 70 70 69 6e 67 20   here (skipping 
23c70 74 68 65 20 6d 61 69 6e 20 6c 6f 6f 70 20 62 6f  the main loop bo
23c80 64 79 20 73 75 62 72 6f 75 74 69 6e 65 29 20 69  dy subroutine) i
23c90 66 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20  f the.          
23ca0 2a 2a 20 63 75 72 72 65 6e 74 20 73 75 62 2d 57  ** current sub-W
23cb0 48 45 52 45 20 72 6f 77 20 69 73 20 61 20 64 75  HERE row is a du
23cc0 70 6c 69 63 61 74 65 20 66 72 6f 6d 20 70 72 69  plicate from pri
23cd0 6f 72 20 73 75 62 2d 57 48 45 52 45 73 2e 20 2a  or sub-WHEREs. *
23ce0 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
23cf0 6a 31 20 29 20 73 71 6c 69 74 65 33 56 64 62 65  j1 ) sqlite3Vdbe
23d00 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 31 29 3b  JumpHere(v, j1);
23d10 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ..          /* T
23d20 68 65 20 70 53 75 62 57 49 6e 66 6f 2d 3e 75 6e  he pSubWInfo->un
23d30 74 65 73 74 65 64 54 65 72 6d 73 20 66 6c 61 67  testedTerms flag
23d40 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 69 73   means that this
23d50 20 4f 52 20 74 65 72 6d 0a 20 20 20 20 20 20 20   OR term.       
23d60 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 65 64 20     ** contained 
23d70 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 41 4e 44 20  one or more AND 
23d80 74 65 72 6d 20 66 72 6f 6d 20 61 20 6e 6f 74 52  term from a notR
23d90 65 61 64 79 20 74 61 62 6c 65 2e 20 20 54 68 65  eady table.  The
23da0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 65  .          ** te
23db0 72 6d 73 20 66 72 6f 6d 20 74 68 65 20 6e 6f 74  rms from the not
23dc0 52 65 61 64 79 20 74 61 62 6c 65 20 63 6f 75 6c  Ready table coul
23dd0 64 20 6e 6f 74 20 62 65 20 74 65 73 74 65 64 20  d not be tested 
23de0 61 6e 64 20 77 69 6c 6c 0a 20 20 20 20 20 20 20  and will.       
23df0 20 20 20 2a 2a 20 6e 65 65 64 20 74 6f 20 62 65     ** need to be
23e00 20 74 65 73 74 65 64 20 6c 61 74 65 72 2e 0a 20   tested later.. 
23e10 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
23e20 20 20 20 20 20 20 69 66 28 20 70 53 75 62 57 49        if( pSubWI
23e30 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54 65 72  nfo->untestedTer
23e40 6d 73 20 29 20 75 6e 74 65 73 74 65 64 54 65 72  ms ) untestedTer
23e50 6d 73 20 3d 20 31 3b 0a 0a 20 20 20 20 20 20 20  ms = 1;..       
23e60 20 20 20 2f 2a 20 49 66 20 61 6c 6c 20 6f 66 20     /* If all of 
23e70 74 68 65 20 4f 52 2d 63 6f 6e 6e 65 63 74 65 64  the OR-connected
23e80 20 74 65 72 6d 73 20 61 72 65 20 6f 70 74 69 6d   terms are optim
23e90 69 7a 65 64 20 75 73 69 6e 67 20 74 68 65 20 73  ized using the s
23ea0 61 6d 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ame.          **
23eb0 20 69 6e 64 65 78 2c 20 61 6e 64 20 74 68 65 20   index, and the 
23ec0 69 6e 64 65 78 20 69 73 20 6f 70 65 6e 65 64 20  index is opened 
23ed0 75 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20 63  using the same c
23ee0 75 72 73 6f 72 20 6e 75 6d 62 65 72 0a 20 20 20  ursor number.   
23ef0 20 20 20 20 20 20 20 2a 2a 20 62 79 20 65 61 63         ** by eac
23f00 68 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  h call to sqlite
23f10 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 6d 61  3WhereBegin() ma
23f20 64 65 20 62 79 20 74 68 69 73 20 6c 6f 6f 70 2c  de by this loop,
23f30 20 69 74 20 6d 61 79 0a 20 20 20 20 20 20 20 20   it may.        
23f40 20 20 2a 2a 20 62 65 20 70 6f 73 73 69 62 6c 65    ** be possible
23f50 20 74 6f 20 75 73 65 20 74 68 61 74 20 69 6e 64   to use that ind
23f60 65 78 20 61 73 20 61 20 63 6f 76 65 72 69 6e 67  ex as a covering
23f70 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20   index..        
23f80 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 20 20 2a    **.          *
23f90 2a 20 49 66 20 74 68 65 20 63 61 6c 6c 20 74 6f  * If the call to
23fa0 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
23fb0 69 6e 28 29 20 61 62 6f 76 65 20 72 65 73 75 6c  in() above resul
23fc0 74 65 64 20 69 6e 20 61 20 73 63 61 6e 20 74 68  ted in a scan th
23fd0 61 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  at.          ** 
23fe0 75 73 65 73 20 61 6e 20 69 6e 64 65 78 2c 20 61  uses an index, a
23ff0 6e 64 20 74 68 69 73 20 69 73 20 65 69 74 68 65  nd this is eithe
24000 72 20 74 68 65 20 66 69 72 73 74 20 4f 52 2d 63  r the first OR-c
24010 6f 6e 6e 65 63 74 65 64 20 74 65 72 6d 0a 20 20  onnected term.  
24020 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65          ** proce
24030 73 73 65 64 20 6f 72 20 74 68 65 20 69 6e 64 65  ssed or the inde
24040 78 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73  x is the same as
24050 20 74 68 61 74 20 75 73 65 64 20 62 79 20 61 6c   that used by al
24060 6c 20 70 72 65 76 69 6f 75 73 0a 20 20 20 20 20  l previous.     
24070 20 20 20 20 20 2a 2a 20 74 65 72 6d 73 2c 20 73       ** terms, s
24080 65 74 20 70 43 6f 76 20 74 6f 20 74 68 65 20 63  et pCov to the c
24090 61 6e 64 69 64 61 74 65 20 63 6f 76 65 72 69 6e  andidate coverin
240a0 67 20 69 6e 64 65 78 2e 20 4f 74 68 65 72 77 69  g index. Otherwi
240b0 73 65 2c 20 73 65 74 20 0a 20 20 20 20 20 20 20  se, set .       
240c0 20 20 20 2a 2a 20 70 43 6f 76 20 74 6f 20 4e 55     ** pCov to NU
240d0 4c 4c 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74  LL to indicate t
240e0 68 61 74 20 6e 6f 20 63 61 6e 64 69 64 61 74 65  hat no candidate
240f0 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20   covering index 
24100 77 69 6c 6c 20 0a 20 20 20 20 20 20 20 20 20 20  will .          
24110 2a 2a 20 62 65 20 61 76 61 69 6c 61 62 6c 65 2e  ** be available.
24120 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
24130 20 20 20 20 20 20 20 20 70 53 75 62 4c 6f 6f 70          pSubLoop
24140 20 3d 20 70 53 75 62 57 49 6e 66 6f 2d 3e 61 5b   = pSubWInfo->a[
24150 30 5d 2e 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 20  0].pWLoop;.     
24160 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 53       assert( (pS
24170 75 62 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  ubLoop->wsFlags 
24180 26 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44  & WHERE_AUTO_IND
24190 45 58 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  EX)==0 );.      
241a0 20 20 20 20 69 66 28 20 28 70 53 75 62 4c 6f 6f      if( (pSubLoo
241b0 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
241c0 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 0a 20  RE_INDEXED)!=0. 
241d0 20 20 20 20 20 20 20 20 20 20 26 26 20 28 69 69            && (ii
241e0 3d 3d 30 20 7c 7c 20 70 53 75 62 4c 6f 6f 70 2d  ==0 || pSubLoop-
241f0 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3d  >u.btree.pIndex=
24200 3d 70 43 6f 76 29 0a 20 20 20 20 20 20 20 20 20  =pCov).         
24210 20 20 26 26 20 28 48 61 73 52 6f 77 69 64 28 70    && (HasRowid(p
24220 54 61 62 29 20 7c 7c 20 21 49 73 50 72 69 6d 61  Tab) || !IsPrima
24230 72 79 4b 65 79 49 6e 64 65 78 28 70 53 75 62 4c  ryKeyIndex(pSubL
24240 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  oop->u.btree.pIn
24250 64 65 78 29 29 0a 20 20 20 20 20 20 20 20 20 20  dex)).          
24260 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  ){.            a
24270 73 73 65 72 74 28 20 70 53 75 62 57 49 6e 66 6f  ssert( pSubWInfo
24280 2d 3e 61 5b 30 5d 2e 69 49 64 78 43 75 72 3d 3d  ->a[0].iIdxCur==
24290 69 43 6f 76 43 75 72 20 29 3b 0a 20 20 20 20 20  iCovCur );.     
242a0 20 20 20 20 20 20 20 70 43 6f 76 20 3d 20 70 53         pCov = pS
242b0 75 62 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e  ubLoop->u.btree.
242c0 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 20 20  pIndex;.        
242d0 20 20 20 20 77 63 74 72 6c 46 6c 61 67 73 20 7c      wctrlFlags |
242e0 3d 20 57 48 45 52 45 5f 52 45 4f 50 45 4e 5f 49  = WHERE_REOPEN_I
242f0 44 58 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  DX;.          }e
24300 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
24310 20 70 43 6f 76 20 3d 20 30 3b 0a 20 20 20 20 20   pCov = 0;.     
24320 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
24330 20 20 2f 2a 20 46 69 6e 69 73 68 20 74 68 65 20    /* Finish the 
24340 6c 6f 6f 70 20 74 68 72 6f 75 67 68 20 74 61 62  loop through tab
24350 6c 65 20 65 6e 74 72 69 65 73 20 74 68 61 74 20  le entries that 
24360 6d 61 74 63 68 20 74 65 72 6d 20 70 4f 72 54 65  match term pOrTe
24370 72 6d 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  rm. */.         
24380 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
24390 28 70 53 75 62 57 49 6e 66 6f 29 3b 0a 20 20 20  (pSubWInfo);.   
243a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
243b0 20 20 20 7d 0a 20 20 20 20 70 4c 65 76 65 6c 2d     }.    pLevel-
243c0 3e 75 2e 70 43 6f 76 69 64 78 20 3d 20 70 43 6f  >u.pCovidx = pCo
243d0 76 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 76 20  v;.    if( pCov 
243e0 29 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75  ) pLevel->iIdxCu
243f0 72 20 3d 20 69 43 6f 76 43 75 72 3b 0a 20 20 20  r = iCovCur;.   
24400 20 69 66 28 20 70 41 6e 64 45 78 70 72 20 29 7b   if( pAndExpr ){
24410 0a 20 20 20 20 20 20 70 41 6e 64 45 78 70 72 2d  .      pAndExpr-
24420 3e 70 4c 65 66 74 20 3d 20 30 3b 0a 20 20 20 20  >pLeft = 0;.    
24430 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
24440 65 74 65 28 64 62 2c 20 70 41 6e 64 45 78 70 72  ete(db, pAndExpr
24450 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
24460 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 31  ite3VdbeChangeP1
24470 28 76 2c 20 69 52 65 74 49 6e 69 74 2c 20 73 71  (v, iRetInit, sq
24480 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
24490 41 64 64 72 28 76 29 29 3b 0a 20 20 20 20 73 71  Addr(v));.    sq
244a0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
244b0 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70  v, OP_Goto, 0, p
244c0 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b 29 3b  Level->addrBrk);
244d0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
244e0 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
244f0 69 4c 6f 6f 70 42 6f 64 79 29 3b 0a 0a 20 20 20  iLoopBody);..   
24500 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65   if( pWInfo->nLe
24510 76 65 6c 3e 31 20 29 20 73 71 6c 69 74 65 33 53  vel>1 ) sqlite3S
24520 74 61 63 6b 46 72 65 65 28 64 62 2c 20 70 4f 72  tackFree(db, pOr
24530 54 61 62 29 3b 0a 20 20 20 20 69 66 28 20 21 75  Tab);.    if( !u
24540 6e 74 65 73 74 65 64 54 65 72 6d 73 20 29 20 64  ntestedTerms ) d
24550 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65  isableTerm(pLeve
24560 6c 2c 20 70 54 65 72 6d 29 3b 0a 20 20 7d 65 6c  l, pTerm);.  }el
24570 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  se.#endif /* SQL
24580 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49  ITE_OMIT_OR_OPTI
24590 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 20 20 7b  MIZATION */..  {
245a0 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 36 3a 20  .    /* Case 6: 
245b0 20 54 68 65 72 65 20 69 73 20 6e 6f 20 75 73 61   There is no usa
245c0 62 6c 65 20 69 6e 64 65 78 2e 20 20 57 65 20 6d  ble index.  We m
245d0 75 73 74 20 64 6f 20 61 20 63 6f 6d 70 6c 65 74  ust do a complet
245e0 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  e.    **        
245f0 20 20 73 63 61 6e 20 6f 66 20 74 68 65 20 65 6e    scan of the en
24600 74 69 72 65 20 74 61 62 6c 65 2e 0a 20 20 20 20  tire table..    
24610 2a 2f 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f  */.    static co
24620 6e 73 74 20 75 38 20 61 53 74 65 70 5b 5d 20 3d  nst u8 aStep[] =
24630 20 7b 20 4f 50 5f 4e 65 78 74 2c 20 4f 50 5f 50   { OP_Next, OP_P
24640 72 65 76 20 7d 3b 0a 20 20 20 20 73 74 61 74 69  rev };.    stati
24650 63 20 63 6f 6e 73 74 20 75 38 20 61 53 74 61 72  c const u8 aStar
24660 74 5b 5d 20 3d 20 7b 20 4f 50 5f 52 65 77 69 6e  t[] = { OP_Rewin
24670 64 2c 20 4f 50 5f 4c 61 73 74 20 7d 3b 0a 20 20  d, OP_Last };.  
24680 20 20 61 73 73 65 72 74 28 20 62 52 65 76 3d 3d    assert( bRev==
24690 30 20 7c 7c 20 62 52 65 76 3d 3d 31 20 29 3b 0a  0 || bRev==1 );.
246a0 20 20 20 20 69 66 28 20 70 54 61 62 49 74 65 6d      if( pTabItem
246b0 2d 3e 69 73 52 65 63 75 72 73 69 76 65 20 29 7b  ->isRecursive ){
246c0 0a 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 73  .      /* Tables
246d0 20 6d 61 72 6b 65 64 20 69 73 52 65 63 75 72 73   marked isRecurs
246e0 69 76 65 20 68 61 76 65 20 6f 6e 6c 79 20 61 20  ive have only a 
246f0 73 69 6e 67 6c 65 20 72 6f 77 20 74 68 61 74 20  single row that 
24700 69 73 20 73 74 6f 72 65 64 20 69 6e 0a 20 20 20  is stored in.   
24710 20 20 20 2a 2a 20 61 20 70 73 65 75 64 6f 2d 63     ** a pseudo-c
24720 75 72 73 6f 72 2e 20 20 4e 6f 20 6e 65 65 64 20  ursor.  No need 
24730 74 6f 20 52 65 77 69 6e 64 20 6f 72 20 4e 65 78  to Rewind or Nex
24740 74 20 73 75 63 68 20 63 75 72 73 6f 72 73 2e 20  t such cursors. 
24750 2a 2f 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d  */.      pLevel-
24760 3e 6f 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20  >op = OP_Noop;. 
24770 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
24780 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 61 53 74  pLevel->op = aSt
24790 65 70 5b 62 52 65 76 5d 3b 0a 20 20 20 20 20 20  ep[bRev];.      
247a0 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69 43 75  pLevel->p1 = iCu
247b0 72 3b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d  r;.      pLevel-
247c0 3e 70 32 20 3d 20 31 20 2b 20 73 71 6c 69 74 65  >p2 = 1 + sqlite
247d0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 61  3VdbeAddOp2(v, a
247e0 53 74 61 72 74 5b 62 52 65 76 5d 2c 20 69 43 75  Start[bRev], iCu
247f0 72 2c 20 61 64 64 72 42 72 6b 29 3b 0a 20 20 20  r, addrBrk);.   
24800 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
24810 66 28 76 2c 20 62 52 65 76 3d 3d 30 29 3b 0a 20  f(v, bRev==0);. 
24820 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
24830 65 49 66 28 76 2c 20 62 52 65 76 21 3d 30 29 3b  eIf(v, bRev!=0);
24840 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  .      pLevel->p
24850 35 20 3d 20 53 51 4c 49 54 45 5f 53 54 4d 54 53  5 = SQLITE_STMTS
24860 54 41 54 55 53 5f 46 55 4c 4c 53 43 41 4e 5f 53  TATUS_FULLSCAN_S
24870 54 45 50 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  TEP;.    }.  }..
24880 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
24890 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54  ABLE_STMT_SCANST
248a0 41 54 55 53 0a 20 20 70 4c 65 76 65 6c 2d 3e 61  ATUS.  pLevel->a
248b0 64 64 72 56 69 73 69 74 20 3d 20 73 71 6c 69 74  ddrVisit = sqlit
248c0 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
248d0 72 28 76 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  r(v);.#endif..  
248e0 2f 2a 20 49 6e 73 65 72 74 20 63 6f 64 65 20 74  /* Insert code t
248f0 6f 20 74 65 73 74 20 65 76 65 72 79 20 73 75 62  o test every sub
24900 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20  expression that 
24910 63 61 6e 20 62 65 20 63 6f 6d 70 6c 65 74 65 6c  can be completel
24920 79 0a 20 20 2a 2a 20 63 6f 6d 70 75 74 65 64 20  y.  ** computed 
24930 75 73 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e  using the curren
24940 74 20 73 65 74 20 6f 66 20 74 61 62 6c 65 73 2e  t set of tables.
24950 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 54 65 72  .  */.  for(pTer
24960 6d 3d 70 57 43 2d 3e 61 2c 20 6a 3d 70 57 43 2d  m=pWC->a, j=pWC-
24970 3e 6e 54 65 72 6d 3b 20 6a 3e 30 3b 20 6a 2d 2d  >nTerm; j>0; j--
24980 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  , pTerm++){.    
24990 45 78 70 72 20 2a 70 45 3b 0a 20 20 20 20 69 6e  Expr *pE;.    in
249a0 74 20 73 6b 69 70 4c 69 6b 65 41 64 64 72 20 3d  t skipLikeAddr =
249b0 20 30 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   0;.    testcase
249c0 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  ( pTerm->wtFlags
249d0 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20   & TERM_VIRTUAL 
249e0 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
249f0 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
24a00 26 20 54 45 52 4d 5f 43 4f 44 45 44 20 29 3b 0a  & TERM_CODED );.
24a10 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77      if( pTerm->w
24a20 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 56  tFlags & (TERM_V
24a30 49 52 54 55 41 4c 7c 54 45 52 4d 5f 43 4f 44 45  IRTUAL|TERM_CODE
24a40 44 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  D) ) continue;. 
24a50 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70     if( (pTerm->p
24a60 72 65 72 65 71 41 6c 6c 20 26 20 70 4c 65 76 65  rereqAll & pLeve
24a70 6c 2d 3e 6e 6f 74 52 65 61 64 79 29 21 3d 30 20  l->notReady)!=0 
24a80 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  ){.      testcas
24a90 65 28 20 70 57 49 6e 66 6f 2d 3e 75 6e 74 65 73  e( pWInfo->untes
24aa0 74 65 64 54 65 72 6d 73 3d 3d 30 0a 20 20 20 20  tedTerms==0.    
24ab0 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28 70             && (p
24ac0 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67  WInfo->wctrlFlag
24ad0 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 54 41 42  s & WHERE_ONETAB
24ae0 4c 45 5f 4f 4e 4c 59 29 21 3d 30 20 29 3b 0a 20  LE_ONLY)!=0 );. 
24af0 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 75 6e 74       pWInfo->unt
24b00 65 73 74 65 64 54 65 72 6d 73 20 3d 20 31 3b 0a  estedTerms = 1;.
24b10 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
24b20 20 20 20 20 7d 0a 20 20 20 20 70 45 20 3d 20 70      }.    pE = p
24b30 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Term->pExpr;.   
24b40 20 61 73 73 65 72 74 28 20 70 45 21 3d 30 20 29   assert( pE!=0 )
24b50 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c  ;.    if( pLevel
24b60 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 26 26 20 21  ->iLeftJoin && !
24b70 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
24b80 70 45 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  pE, EP_FromJoin)
24b90 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e   ){.      contin
24ba0 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ue;.    }.    if
24bb0 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  ( pTerm->wtFlags
24bc0 20 26 20 54 45 52 4d 5f 4c 49 4b 45 43 4f 4e 44   & TERM_LIKECOND
24bd0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
24be0 28 20 70 4c 65 76 65 6c 2d 3e 69 4c 69 6b 65 52  ( pLevel->iLikeR
24bf0 65 70 43 6e 74 72 3e 30 20 29 3b 0a 20 20 20 20  epCntr>0 );.    
24c00 20 20 73 6b 69 70 4c 69 6b 65 41 64 64 72 20 3d    skipLikeAddr =
24c10 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
24c20 70 31 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20  p1(v, OP_IfNot, 
24c30 70 4c 65 76 65 6c 2d 3e 69 4c 69 6b 65 52 65 70  pLevel->iLikeRep
24c40 43 6e 74 72 29 3b 0a 20 20 20 20 20 20 56 64 62  Cntr);.      Vdb
24c50 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
24c60 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45    }.    sqlite3E
24c70 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
24c80 65 2c 20 70 45 2c 20 61 64 64 72 43 6f 6e 74 2c  e, pE, addrCont,
24c90 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55   SQLITE_JUMPIFNU
24ca0 4c 4c 29 3b 0a 20 20 20 20 69 66 28 20 73 6b 69  LL);.    if( ski
24cb0 70 4c 69 6b 65 41 64 64 72 20 29 20 73 71 6c 69  pLikeAddr ) sqli
24cc0 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
24cd0 76 2c 20 73 6b 69 70 4c 69 6b 65 41 64 64 72 29  v, skipLikeAddr)
24ce0 3b 0a 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46  ;.    pTerm->wtF
24cf0 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44  lags |= TERM_COD
24d00 45 44 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e  ED;.  }..  /* In
24d10 73 65 72 74 20 63 6f 64 65 20 74 6f 20 74 65 73  sert code to tes
24d20 74 20 66 6f 72 20 69 6d 70 6c 69 65 64 20 63 6f  t for implied co
24d30 6e 73 74 72 61 69 6e 74 73 20 62 61 73 65 64 20  nstraints based 
24d40 6f 6e 20 74 72 61 6e 73 69 74 69 76 69 74 79 0a  on transitivity.
24d50 20 20 2a 2a 20 6f 66 20 74 68 65 20 22 3d 3d 22    ** of the "=="
24d60 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 2a 2a 0a   operator..  **.
24d70 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 20 49 66    ** Example: If
24d80 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
24d90 65 20 63 6f 6e 74 61 69 6e 73 20 22 74 31 2e 61  e contains "t1.a
24da0 3d 74 32 2e 62 22 20 61 6e 64 20 22 74 32 2e 62  =t2.b" and "t2.b
24db0 3d 31 32 33 22 0a 20 20 2a 2a 20 61 6e 64 20 77  =123".  ** and w
24dc0 65 20 61 72 65 20 63 6f 64 69 6e 67 20 74 68 65  e are coding the
24dd0 20 74 31 20 6c 6f 6f 70 20 61 6e 64 20 74 68 65   t1 loop and the
24de0 20 74 32 20 6c 6f 6f 70 20 68 61 73 20 6e 6f 74   t2 loop has not
24df0 20 79 65 74 20 63 6f 64 65 64 2c 0a 20 20 2a 2a   yet coded,.  **
24e00 20 74 68 65 6e 20 77 65 20 63 61 6e 6e 6f 74 20   then we cannot 
24e10 75 73 65 20 74 68 65 20 22 74 31 2e 61 3d 74 32  use the "t1.a=t2
24e20 2e 62 22 20 63 6f 6e 73 74 72 61 69 6e 74 2c 20  .b" constraint, 
24e30 62 75 74 20 77 65 20 63 61 6e 20 63 6f 64 65 0a  but we can code.
24e40 20 20 2a 2a 20 74 68 65 20 69 6d 70 6c 69 65 64    ** the implied
24e50 20 22 74 31 2e 61 3d 31 32 33 22 20 63 6f 6e 73   "t1.a=123" cons
24e60 74 72 61 69 6e 74 2e 0a 20 20 2a 2f 0a 20 20 66  traint..  */.  f
24e70 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 2c  or(pTerm=pWC->a,
24e80 20 6a 3d 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 6a   j=pWC->nTerm; j
24e90 3e 30 3b 20 6a 2d 2d 2c 20 70 54 65 72 6d 2b 2b  >0; j--, pTerm++
24ea0 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 2c  ){.    Expr *pE,
24eb0 20 2a 70 45 41 6c 74 3b 0a 20 20 20 20 57 68 65   *pEAlt;.    Whe
24ec0 72 65 54 65 72 6d 20 2a 70 41 6c 74 3b 0a 20 20  reTerm *pAlt;.  
24ed0 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46    if( pTerm->wtF
24ee0 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 56 49 52  lags & (TERM_VIR
24ef0 54 55 41 4c 7c 54 45 52 4d 5f 43 4f 44 45 44 29  TUAL|TERM_CODED)
24f00 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
24f10 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65   if( pTerm->eOpe
24f20 72 61 74 6f 72 21 3d 28 57 4f 5f 45 51 55 49 56  rator!=(WO_EQUIV
24f30 7c 57 4f 5f 45 51 29 20 29 20 63 6f 6e 74 69 6e  |WO_EQ) ) contin
24f40 75 65 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72  ue;.    if( pTer
24f50 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 21 3d 69  m->leftCursor!=i
24f60 43 75 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  Cur ) continue;.
24f70 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e      if( pLevel->
24f80 69 4c 65 66 74 4a 6f 69 6e 20 29 20 63 6f 6e 74  iLeftJoin ) cont
24f90 69 6e 75 65 3b 0a 20 20 20 20 70 45 20 3d 20 70  inue;.    pE = p
24fa0 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Term->pExpr;.   
24fb0 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
24fc0 73 50 72 6f 70 65 72 74 79 28 70 45 2c 20 45 50  sProperty(pE, EP
24fd0 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 3b 0a 20 20  _FromJoin) );.  
24fe0 20 20 61 73 73 65 72 74 28 20 28 70 54 65 72 6d    assert( (pTerm
24ff0 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20  ->prereqRight & 
25000 70 4c 65 76 65 6c 2d 3e 6e 6f 74 52 65 61 64 79  pLevel->notReady
25010 29 21 3d 30 20 29 3b 0a 20 20 20 20 70 41 6c 74  )!=0 );.    pAlt
25020 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c   = findTerm(pWC,
25030 20 69 43 75 72 2c 20 70 54 65 72 6d 2d 3e 75 2e   iCur, pTerm->u.
25040 6c 65 66 74 43 6f 6c 75 6d 6e 2c 20 6e 6f 74 52  leftColumn, notR
25050 65 61 64 79 2c 20 57 4f 5f 45 51 7c 57 4f 5f 49  eady, WO_EQ|WO_I
25060 4e 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70  N, 0);.    if( p
25070 41 6c 74 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  Alt==0 ) continu
25080 65 3b 0a 20 20 20 20 69 66 28 20 70 41 6c 74 2d  e;.    if( pAlt-
25090 3e 77 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d  >wtFlags & (TERM
250a0 5f 43 4f 44 45 44 29 20 29 20 63 6f 6e 74 69 6e  _CODED) ) contin
250b0 75 65 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  ue;.    testcase
250c0 28 20 70 41 6c 74 2d 3e 65 4f 70 65 72 61 74 6f  ( pAlt->eOperato
250d0 72 20 26 20 57 4f 5f 45 51 20 29 3b 0a 20 20 20  r & WO_EQ );.   
250e0 20 74 65 73 74 63 61 73 65 28 20 70 41 6c 74 2d   testcase( pAlt-
250f0 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
25100 49 4e 20 29 3b 0a 20 20 20 20 56 64 62 65 4d 6f  IN );.    VdbeMo
25110 64 75 6c 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  duleComment((v, 
25120 22 62 65 67 69 6e 20 74 72 61 6e 73 69 74 69 76  "begin transitiv
25130 65 20 63 6f 6e 73 74 72 61 69 6e 74 22 29 29 3b  e constraint"));
25140 0a 20 20 20 20 70 45 41 6c 74 20 3d 20 73 71 6c  .    pEAlt = sql
25150 69 74 65 33 53 74 61 63 6b 41 6c 6c 6f 63 52 61  ite3StackAllocRa
25160 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 45  w(db, sizeof(*pE
25170 41 6c 74 29 29 3b 0a 20 20 20 20 69 66 28 20 70  Alt));.    if( p
25180 45 41 6c 74 20 29 7b 0a 20 20 20 20 20 20 2a 70  EAlt ){.      *p
25190 45 41 6c 74 20 3d 20 2a 70 41 6c 74 2d 3e 70 45  EAlt = *pAlt->pE
251a0 78 70 72 3b 0a 20 20 20 20 20 20 70 45 41 6c 74  xpr;.      pEAlt
251b0 2d 3e 70 4c 65 66 74 20 3d 20 70 45 2d 3e 70 4c  ->pLeft = pE->pL
251c0 65 66 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  eft;.      sqlit
251d0 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
251e0 61 72 73 65 2c 20 70 45 41 6c 74 2c 20 61 64 64  arse, pEAlt, add
251f0 72 43 6f 6e 74 2c 20 53 51 4c 49 54 45 5f 4a 55  rCont, SQLITE_JU
25200 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  MPIFNULL);.     
25210 20 73 71 6c 69 74 65 33 53 74 61 63 6b 46 72 65   sqlite3StackFre
25220 65 28 64 62 2c 20 70 45 41 6c 74 29 3b 0a 20 20  e(db, pEAlt);.  
25230 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 6f    }.  }..  /* Fo
25240 72 20 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a  r a LEFT OUTER J
25250 4f 49 4e 2c 20 67 65 6e 65 72 61 74 65 20 63 6f  OIN, generate co
25260 64 65 20 74 68 61 74 20 77 69 6c 6c 20 72 65 63  de that will rec
25270 6f 72 64 20 74 68 65 20 66 61 63 74 20 74 68 61  ord the fact tha
25280 74 0a 20 20 2a 2a 20 61 74 20 6c 65 61 73 74 20  t.  ** at least 
25290 6f 6e 65 20 72 6f 77 20 6f 66 20 74 68 65 20 72  one row of the r
252a0 69 67 68 74 20 74 61 62 6c 65 20 68 61 73 20 6d  ight table has m
252b0 61 74 63 68 65 64 20 74 68 65 20 6c 65 66 74 20  atched the left 
252c0 74 61 62 6c 65 2e 20 20 0a 20 20 2a 2f 0a 20 20  table.  .  */.  
252d0 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66  if( pLevel->iLef
252e0 74 4a 6f 69 6e 20 29 7b 0a 20 20 20 20 70 4c 65  tJoin ){.    pLe
252f0 76 65 6c 2d 3e 61 64 64 72 46 69 72 73 74 20 3d  vel->addrFirst =
25300 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
25310 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
25320 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
25330 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
25340 20 31 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66   1, pLevel->iLef
25350 74 4a 6f 69 6e 29 3b 0a 20 20 20 20 56 64 62 65  tJoin);.    Vdbe
25360 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 72 65 63  Comment((v, "rec
25370 6f 72 64 20 4c 45 46 54 20 4a 4f 49 4e 20 68 69  ord LEFT JOIN hi
25380 74 22 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  t"));.    sqlite
25390 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28  3ExprCacheClear(
253a0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 66 6f 72  pParse);.    for
253b0 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 2c 20 6a  (pTerm=pWC->a, j
253c0 3d 30 3b 20 6a 3c 70 57 43 2d 3e 6e 54 65 72 6d  =0; j<pWC->nTerm
253d0 3b 20 6a 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b  ; j++, pTerm++){
253e0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
253f0 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
25400 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29  & TERM_VIRTUAL )
25410 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
25420 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  ( pTerm->wtFlags
25430 20 26 20 54 45 52 4d 5f 43 4f 44 45 44 20 29 3b   & TERM_CODED );
25440 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d  .      if( pTerm
25450 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54 45 52  ->wtFlags & (TER
25460 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 43  M_VIRTUAL|TERM_C
25470 4f 44 45 44 29 20 29 20 63 6f 6e 74 69 6e 75 65  ODED) ) continue
25480 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 54 65  ;.      if( (pTe
25490 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26 20  rm->prereqAll & 
254a0 70 4c 65 76 65 6c 2d 3e 6e 6f 74 52 65 61 64 79  pLevel->notReady
254b0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
254c0 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e  assert( pWInfo->
254d0 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20 29 3b  untestedTerms );
254e0 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  .        continu
254f0 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  e;.      }.     
25500 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e   assert( pTerm->
25510 70 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20 73  pExpr );.      s
25520 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
25530 65 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2d  e(pParse, pTerm-
25540 3e 70 45 78 70 72 2c 20 61 64 64 72 43 6f 6e 74  >pExpr, addrCont
25550 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  , SQLITE_JUMPIFN
25560 55 4c 4c 29 3b 0a 20 20 20 20 20 20 70 54 65 72  ULL);.      pTer
25570 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45  m->wtFlags |= TE
25580 52 4d 5f 43 4f 44 45 44 3b 0a 20 20 20 20 7d 0a  RM_CODED;.    }.
25590 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 4c    }..  return pL
255a0 65 76 65 6c 2d 3e 6e 6f 74 52 65 61 64 79 3b 0a  evel->notReady;.
255b0 7d 0a 0a 23 69 66 64 65 66 20 57 48 45 52 45 54  }..#ifdef WHERET
255c0 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 2f 2a 0a  RACE_ENABLED./*.
255d0 2a 2a 20 50 72 69 6e 74 20 74 68 65 20 63 6f 6e  ** Print the con
255e0 74 65 6e 74 20 6f 66 20 61 20 57 68 65 72 65 54  tent of a WhereT
255f0 65 72 6d 20 6f 62 6a 65 63 74 0a 2a 2f 0a 73 74  erm object.*/.st
25600 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 54  atic void whereT
25610 65 72 6d 50 72 69 6e 74 28 57 68 65 72 65 54 65  ermPrint(WhereTe
25620 72 6d 20 2a 70 54 65 72 6d 2c 20 69 6e 74 20 69  rm *pTerm, int i
25630 54 65 72 6d 29 7b 0a 20 20 69 66 28 20 70 54 65  Term){.  if( pTe
25640 72 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  rm==0 ){.    sql
25650 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
25660 22 54 45 52 4d 2d 25 2d 33 64 20 4e 55 4c 4c 5c  "TERM-%-3d NULL\
25670 6e 22 2c 20 69 54 65 72 6d 29 3b 0a 20 20 7d 65  n", iTerm);.  }e
25680 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20 7a 54  lse{.    char zT
25690 79 70 65 5b 34 5d 3b 0a 20 20 20 20 6d 65 6d 63  ype[4];.    memc
256a0 70 79 28 7a 54 79 70 65 2c 20 22 2e 2e 2e 22 2c  py(zType, "...",
256b0 20 34 29 3b 0a 20 20 20 20 69 66 28 20 70 54 65   4);.    if( pTe
256c0 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
256d0 52 4d 5f 56 49 52 54 55 41 4c 20 29 20 7a 54 79  RM_VIRTUAL ) zTy
256e0 70 65 5b 30 5d 20 3d 20 27 56 27 3b 0a 20 20 20  pe[0] = 'V';.   
256f0 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65   if( pTerm->eOpe
25700 72 61 74 6f 72 20 26 20 57 4f 5f 45 51 55 49 56  rator & WO_EQUIV
25710 20 20 29 20 7a 54 79 70 65 5b 31 5d 20 3d 20 27    ) zType[1] = '
25720 45 27 3b 0a 20 20 20 20 69 66 28 20 45 78 70 72  E';.    if( Expr
25730 48 61 73 50 72 6f 70 65 72 74 79 28 70 54 65 72  HasProperty(pTer
25740 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f 46 72 6f  m->pExpr, EP_Fro
25750 6d 4a 6f 69 6e 29 20 29 20 7a 54 79 70 65 5b 32  mJoin) ) zType[2
25760 5d 20 3d 20 27 4c 27 3b 0a 20 20 20 20 73 71 6c  ] = 'L';.    sql
25770 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
25780 22 54 45 52 4d 2d 25 2d 33 64 20 25 70 20 25 73  "TERM-%-3d %p %s
25790 20 63 75 72 73 6f 72 3d 25 2d 33 64 20 70 72 6f   cursor=%-3d pro
257a0 62 3d 25 2d 33 64 20 6f 70 3d 30 78 25 30 33 78  b=%-3d op=0x%03x
257b0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
257c0 20 20 20 20 20 20 20 20 20 20 20 20 69 54 65 72              iTer
257d0 6d 2c 20 70 54 65 72 6d 2c 20 7a 54 79 70 65 2c  m, pTerm, zType,
257e0 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73   pTerm->leftCurs
257f0 6f 72 2c 20 70 54 65 72 6d 2d 3e 74 72 75 74 68  or, pTerm->truth
25800 50 72 6f 62 2c 0a 20 20 20 20 20 20 20 20 20 20  Prob,.          
25810 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54 65               pTe
25820 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 29 3b 0a  rm->eOperator);.
25830 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56      sqlite3TreeV
25840 69 65 77 45 78 70 72 28 30 2c 20 70 54 65 72 6d  iewExpr(0, pTerm
25850 2d 3e 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 7d  ->pExpr, 0);.  }
25860 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65  .}.#endif..#ifde
25870 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  f WHERETRACE_ENA
25880 42 4c 45 44 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74  BLED./*.** Print
25890 20 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a   a WhereLoop obj
258a0 65 63 74 20 66 6f 72 20 64 65 62 75 67 67 69 6e  ect for debuggin
258b0 67 20 70 75 72 70 6f 73 65 73 0a 2a 2f 0a 73 74  g purposes.*/.st
258c0 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 4c  atic void whereL
258d0 6f 6f 70 50 72 69 6e 74 28 57 68 65 72 65 4c 6f  oopPrint(WhereLo
258e0 6f 70 20 2a 70 2c 20 57 68 65 72 65 43 6c 61 75  op *p, WhereClau
258f0 73 65 20 2a 70 57 43 29 7b 0a 20 20 57 68 65 72  se *pWC){.  Wher
25900 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20  eInfo *pWInfo = 
25910 70 57 43 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 69  pWC->pWInfo;.  i
25920 6e 74 20 6e 62 20 3d 20 31 2b 28 70 57 49 6e 66  nt nb = 1+(pWInf
25930 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  o->pTabList->nSr
25940 63 2b 37 29 2f 38 3b 0a 20 20 73 74 72 75 63 74  c+7)/8;.  struct
25950 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
25960 49 74 65 6d 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  Item = pWInfo->p
25970 54 61 62 4c 69 73 74 2d 3e 61 20 2b 20 70 2d 3e  TabList->a + p->
25980 69 54 61 62 3b 0a 20 20 54 61 62 6c 65 20 2a 70  iTab;.  Table *p
25990 54 61 62 20 3d 20 70 49 74 65 6d 2d 3e 70 54 61  Tab = pItem->pTa
259a0 62 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75  b;.  sqlite3Debu
259b0 67 50 72 69 6e 74 66 28 22 25 63 25 32 64 2e 25  gPrintf("%c%2d.%
259c0 30 2a 6c 6c 78 2e 25 30 2a 6c 6c 78 22 2c 20 70  0*llx.%0*llx", p
259d0 2d 3e 63 49 64 2c 0a 20 20 20 20 20 20 20 20 20  ->cId,.         
259e0 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 69              p->i
259f0 54 61 62 2c 20 6e 62 2c 20 70 2d 3e 6d 61 73 6b  Tab, nb, p->mask
25a00 53 65 6c 66 2c 20 6e 62 2c 20 70 2d 3e 70 72 65  Self, nb, p->pre
25a10 72 65 71 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  req);.  sqlite3D
25a20 65 62 75 67 50 72 69 6e 74 66 28 22 20 25 31 32  ebugPrintf(" %12
25a30 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  s",.            
25a40 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e           pItem->
25a50 7a 41 6c 69 61 73 20 3f 20 70 49 74 65 6d 2d 3e  zAlias ? pItem->
25a60 7a 41 6c 69 61 73 20 3a 20 70 54 61 62 2d 3e 7a  zAlias : pTab->z
25a70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 28 70 2d  Name);.  if( (p-
25a80 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
25a90 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d  _VIRTUALTABLE)==
25aa0 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  0 ){.    const c
25ab0 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20  har *zName;.    
25ac0 69 66 28 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70  if( p->u.btree.p
25ad0 49 6e 64 65 78 20 26 26 20 28 7a 4e 61 6d 65 20  Index && (zName 
25ae0 3d 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  = p->u.btree.pIn
25af0 64 65 78 2d 3e 7a 4e 61 6d 65 29 21 3d 30 20 29  dex->zName)!=0 )
25b00 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 6e  {.      if( strn
25b10 63 6d 70 28 7a 4e 61 6d 65 2c 20 22 73 71 6c 69  cmp(zName, "sqli
25b20 74 65 5f 61 75 74 6f 69 6e 64 65 78 5f 22 2c 20  te_autoindex_", 
25b30 31 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  17)==0 ){.      
25b40 20 20 69 6e 74 20 69 20 3d 20 73 71 6c 69 74 65    int i = sqlite
25b50 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29  3Strlen30(zName)
25b60 20 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 77 68   - 1;.        wh
25b70 69 6c 65 28 20 7a 4e 61 6d 65 5b 69 5d 21 3d 27  ile( zName[i]!='
25b80 5f 27 20 29 20 69 2d 2d 3b 0a 20 20 20 20 20 20  _' ) i--;.      
25b90 20 20 7a 4e 61 6d 65 20 2b 3d 20 69 3b 0a 20 20    zName += i;.  
25ba0 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
25bb0 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
25bc0 2e 25 2d 31 36 73 20 25 32 64 22 2c 20 7a 4e 61  .%-16s %2d", zNa
25bd0 6d 65 2c 20 70 2d 3e 75 2e 62 74 72 65 65 2e 6e  me, p->u.btree.n
25be0 45 71 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  Eq);.    }else{.
25bf0 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
25c00 75 67 50 72 69 6e 74 66 28 22 25 32 30 73 22 2c  ugPrintf("%20s",
25c10 22 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  "");.    }.  }el
25c20 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 3b  se{.    char *z;
25c30 0a 20 20 20 20 69 66 28 20 70 2d 3e 75 2e 76 74  .    if( p->u.vt
25c40 61 62 2e 69 64 78 53 74 72 20 29 7b 0a 20 20 20  ab.idxStr ){.   
25c50 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d     z = sqlite3_m
25c60 70 72 69 6e 74 66 28 22 28 25 64 2c 5c 22 25 73  printf("(%d,\"%s
25c70 5c 22 2c 25 78 29 22 2c 0a 20 20 20 20 20 20 20  \",%x)",.       
25c80 20 20 20 20 20 20 20 20 20 70 2d 3e 75 2e 76 74           p->u.vt
25c90 61 62 2e 69 64 78 4e 75 6d 2c 20 70 2d 3e 75 2e  ab.idxNum, p->u.
25ca0 76 74 61 62 2e 69 64 78 53 74 72 2c 20 70 2d 3e  vtab.idxStr, p->
25cb0 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 29  u.vtab.omitMask)
25cc0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
25cd0 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d     z = sqlite3_m
25ce0 70 72 69 6e 74 66 28 22 28 25 64 2c 25 78 29 22  printf("(%d,%x)"
25cf0 2c 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 4e  , p->u.vtab.idxN
25d00 75 6d 2c 20 70 2d 3e 75 2e 76 74 61 62 2e 6f 6d  um, p->u.vtab.om
25d10 69 74 4d 61 73 6b 29 3b 0a 20 20 20 20 7d 0a 20  itMask);.    }. 
25d20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
25d30 72 69 6e 74 66 28 22 20 25 2d 31 39 73 22 2c 20  rintf(" %-19s", 
25d40 7a 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  z);.    sqlite3_
25d50 66 72 65 65 28 7a 29 3b 0a 20 20 7d 0a 20 20 69  free(z);.  }.  i
25d60 66 28 20 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  f( p->wsFlags & 
25d70 57 48 45 52 45 5f 53 4b 49 50 53 43 41 4e 20 29  WHERE_SKIPSCAN )
25d80 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  {.    sqlite3Deb
25d90 75 67 50 72 69 6e 74 66 28 22 20 66 20 25 30 35  ugPrintf(" f %05
25da0 78 20 25 64 2d 25 64 22 2c 20 70 2d 3e 77 73 46  x %d-%d", p->wsF
25db0 6c 61 67 73 2c 20 70 2d 3e 6e 4c 54 65 72 6d 2c  lags, p->nLTerm,
25dc0 70 2d 3e 6e 53 6b 69 70 29 3b 0a 20 20 7d 65 6c  p->nSkip);.  }el
25dd0 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  se{.    sqlite3D
25de0 65 62 75 67 50 72 69 6e 74 66 28 22 20 66 20 25  ebugPrintf(" f %
25df0 30 35 78 20 4e 20 25 64 22 2c 20 70 2d 3e 77 73  05x N %d", p->ws
25e00 46 6c 61 67 73 2c 20 70 2d 3e 6e 4c 54 65 72 6d  Flags, p->nLTerm
25e10 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
25e20 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 63 6f  DebugPrintf(" co
25e30 73 74 20 25 64 2c 25 64 2c 25 64 5c 6e 22 2c 20  st %d,%d,%d\n", 
25e40 70 2d 3e 72 53 65 74 75 70 2c 20 70 2d 3e 72 52  p->rSetup, p->rR
25e50 75 6e 2c 20 70 2d 3e 6e 4f 75 74 29 3b 0a 20 20  un, p->nOut);.  
25e60 69 66 28 20 70 2d 3e 6e 4c 54 65 72 6d 20 26 26  if( p->nLTerm &&
25e70 20 28 73 71 6c 69 74 65 33 57 68 65 72 65 54 72   (sqlite3WhereTr
25e80 61 63 65 20 26 20 30 78 31 30 30 29 21 3d 30 20  ace & 0x100)!=0 
25e90 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
25ea0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
25eb0 6e 4c 54 65 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20  nLTerm; i++){.  
25ec0 20 20 20 20 77 68 65 72 65 54 65 72 6d 50 72 69      whereTermPri
25ed0 6e 74 28 70 2d 3e 61 4c 54 65 72 6d 5b 69 5d 2c  nt(p->aLTerm[i],
25ee0 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d   i);.    }.  }.}
25ef0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43  .#endif../*.** C
25f00 6f 6e 76 65 72 74 20 62 75 6c 6b 20 6d 65 6d 6f  onvert bulk memo
25f10 72 79 20 69 6e 74 6f 20 61 20 76 61 6c 69 64 20  ry into a valid 
25f20 57 68 65 72 65 4c 6f 6f 70 20 74 68 61 74 20 63  WhereLoop that c
25f30 61 6e 20 62 65 20 70 61 73 73 65 64 0a 2a 2a 20  an be passed.** 
25f40 74 6f 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61  to whereLoopClea
25f50 72 20 68 61 72 6d 6c 65 73 73 6c 79 2e 0a 2a 2f  r harmlessly..*/
25f60 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65  .static void whe
25f70 72 65 4c 6f 6f 70 49 6e 69 74 28 57 68 65 72 65  reLoopInit(Where
25f80 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20 70 2d 3e 61  Loop *p){.  p->a
25f90 4c 54 65 72 6d 20 3d 20 70 2d 3e 61 4c 54 65 72  LTerm = p->aLTer
25fa0 6d 53 70 61 63 65 3b 0a 20 20 70 2d 3e 6e 4c 54  mSpace;.  p->nLT
25fb0 65 72 6d 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e 4c  erm = 0;.  p->nL
25fc0 53 6c 6f 74 20 3d 20 41 72 72 61 79 53 69 7a 65  Slot = ArraySize
25fd0 28 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 29  (p->aLTermSpace)
25fe0 3b 0a 20 20 70 2d 3e 77 73 46 6c 61 67 73 20 3d  ;.  p->wsFlags =
25ff0 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65   0;.}../*.** Cle
26000 61 72 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70  ar the WhereLoop
26010 2e 75 20 75 6e 69 6f 6e 2e 20 20 4c 65 61 76 65  .u union.  Leave
26020 20 57 68 65 72 65 4c 6f 6f 70 2e 70 4c 54 65 72   WhereLoop.pLTer
26030 6d 20 69 6e 74 61 63 74 2e 0a 2a 2f 0a 73 74 61  m intact..*/.sta
26040 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 4c 6f  tic void whereLo
26050 6f 70 43 6c 65 61 72 55 6e 69 6f 6e 28 73 71 6c  opClearUnion(sql
26060 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c  ite3 *db, WhereL
26070 6f 6f 70 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  oop *p){.  if( p
26080 2d 3e 77 73 46 6c 61 67 73 20 26 20 28 57 48 45  ->wsFlags & (WHE
26090 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 7c  RE_VIRTUALTABLE|
260a0 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58  WHERE_AUTO_INDEX
260b0 29 20 29 7b 0a 20 20 20 20 69 66 28 20 28 70 2d  ) ){.    if( (p-
260c0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
260d0 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 21 3d  _VIRTUALTABLE)!=
260e0 30 20 26 26 20 70 2d 3e 75 2e 76 74 61 62 2e 6e  0 && p->u.vtab.n
260f0 65 65 64 46 72 65 65 20 29 7b 0a 20 20 20 20 20  eedFree ){.     
26100 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d   sqlite3_free(p-
26110 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72 29 3b  >u.vtab.idxStr);
26120 0a 20 20 20 20 20 20 70 2d 3e 75 2e 76 74 61 62  .      p->u.vtab
26130 2e 6e 65 65 64 46 72 65 65 20 3d 20 30 3b 0a 20  .needFree = 0;. 
26140 20 20 20 20 20 70 2d 3e 75 2e 76 74 61 62 2e 69       p->u.vtab.i
26150 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 20 20 7d  dxStr = 0;.    }
26160 65 6c 73 65 20 69 66 28 20 28 70 2d 3e 77 73 46  else if( (p->wsF
26170 6c 61 67 73 20 26 20 57 48 45 52 45 5f 41 55 54  lags & WHERE_AUT
26180 4f 5f 49 4e 44 45 58 29 21 3d 30 20 26 26 20 70  O_INDEX)!=0 && p
26190 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
261a0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  !=0 ){.      sql
261b0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
261c0 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
261d0 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 20 20  ->zColAff);.    
261e0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
261f0 64 62 2c 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70  db, p->u.btree.p
26200 49 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 70 2d  Index);.      p-
26210 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20  >u.btree.pIndex 
26220 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  = 0;.    }.  }.}
26230 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61  ../*.** Dealloca
26240 74 65 20 69 6e 74 65 72 6e 61 6c 20 6d 65 6d 6f  te internal memo
26250 72 79 20 75 73 65 64 20 62 79 20 61 20 57 68 65  ry used by a Whe
26260 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 0a 2a 2f  reLoop object.*/
26270 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65  .static void whe
26280 72 65 4c 6f 6f 70 43 6c 65 61 72 28 73 71 6c 69  reLoopClear(sqli
26290 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f  te3 *db, WhereLo
262a0 6f 70 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d  op *p){.  if( p-
262b0 3e 61 4c 54 65 72 6d 21 3d 70 2d 3e 61 4c 54 65  >aLTerm!=p->aLTe
262c0 72 6d 53 70 61 63 65 20 29 20 73 71 6c 69 74 65  rmSpace ) sqlite
262d0 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61  3DbFree(db, p->a
262e0 4c 54 65 72 6d 29 3b 0a 20 20 77 68 65 72 65 4c  LTerm);.  whereL
262f0 6f 6f 70 43 6c 65 61 72 55 6e 69 6f 6e 28 64 62  oopClearUnion(db
26300 2c 20 70 29 3b 0a 20 20 77 68 65 72 65 4c 6f 6f  , p);.  whereLoo
26310 70 49 6e 69 74 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a  pInit(p);.}../*.
26320 2a 2a 20 49 6e 63 72 65 61 73 65 20 74 68 65 20  ** Increase the 
26330 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
26340 6e 20 66 6f 72 20 70 4c 6f 6f 70 2d 3e 61 4c 54  n for pLoop->aLT
26350 65 72 6d 5b 5d 20 74 6f 20 62 65 20 61 74 20 6c  erm[] to be at l
26360 65 61 73 74 20 6e 2e 0a 2a 2f 0a 73 74 61 74 69  east n..*/.stati
26370 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 52  c int whereLoopR
26380 65 73 69 7a 65 28 73 71 6c 69 74 65 33 20 2a 64  esize(sqlite3 *d
26390 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 2c  b, WhereLoop *p,
263a0 20 69 6e 74 20 6e 29 7b 0a 20 20 57 68 65 72 65   int n){.  Where
263b0 54 65 72 6d 20 2a 2a 70 61 4e 65 77 3b 0a 20 20  Term **paNew;.  
263c0 69 66 28 20 70 2d 3e 6e 4c 53 6c 6f 74 3e 3d 6e  if( p->nLSlot>=n
263d0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
263e0 5f 4f 4b 3b 0a 20 20 6e 20 3d 20 28 6e 2b 37 29  _OK;.  n = (n+7)
263f0 26 7e 37 3b 0a 20 20 70 61 4e 65 77 20 3d 20 73  &~7;.  paNew = s
26400 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
26410 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 70 2d 3e  w(db, sizeof(p->
26420 61 4c 54 65 72 6d 5b 30 5d 29 2a 6e 29 3b 0a 20  aLTerm[0])*n);. 
26430 20 69 66 28 20 70 61 4e 65 77 3d 3d 30 20 29 20   if( paNew==0 ) 
26440 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
26450 4d 45 4d 3b 0a 20 20 6d 65 6d 63 70 79 28 70 61  MEM;.  memcpy(pa
26460 4e 65 77 2c 20 70 2d 3e 61 4c 54 65 72 6d 2c 20  New, p->aLTerm, 
26470 73 69 7a 65 6f 66 28 70 2d 3e 61 4c 54 65 72 6d  sizeof(p->aLTerm
26480 5b 30 5d 29 2a 70 2d 3e 6e 4c 53 6c 6f 74 29 3b  [0])*p->nLSlot);
26490 0a 20 20 69 66 28 20 70 2d 3e 61 4c 54 65 72 6d  .  if( p->aLTerm
264a0 21 3d 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65  !=p->aLTermSpace
264b0 20 29 20 73 71 6c 69 74 65 33 44 62 46 72 65 65   ) sqlite3DbFree
264c0 28 64 62 2c 20 70 2d 3e 61 4c 54 65 72 6d 29 3b  (db, p->aLTerm);
264d0 0a 20 20 70 2d 3e 61 4c 54 65 72 6d 20 3d 20 70  .  p->aLTerm = p
264e0 61 4e 65 77 3b 0a 20 20 70 2d 3e 6e 4c 53 6c 6f  aNew;.  p->nLSlo
264f0 74 20 3d 20 6e 3b 0a 20 20 72 65 74 75 72 6e 20  t = n;.  return 
26500 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
26510 0a 2a 2a 20 54 72 61 6e 73 66 65 72 20 63 6f 6e  .** Transfer con
26520 74 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 73 65  tent from the se
26530 63 6f 6e 64 20 70 4c 6f 6f 70 20 69 6e 74 6f 20  cond pLoop into 
26540 74 68 65 20 66 69 72 73 74 2e 0a 2a 2f 0a 73 74  the first..*/.st
26550 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f  atic int whereLo
26560 6f 70 58 66 65 72 28 73 71 6c 69 74 65 33 20 2a  opXfer(sqlite3 *
26570 64 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  db, WhereLoop *p
26580 54 6f 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  To, WhereLoop *p
26590 46 72 6f 6d 29 7b 0a 20 20 77 68 65 72 65 4c 6f  From){.  whereLo
265a0 6f 70 43 6c 65 61 72 55 6e 69 6f 6e 28 64 62 2c  opClearUnion(db,
265b0 20 70 54 6f 29 3b 0a 20 20 69 66 28 20 77 68 65   pTo);.  if( whe
265c0 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62 2c  reLoopResize(db,
265d0 20 70 54 6f 2c 20 70 46 72 6f 6d 2d 3e 6e 4c 54   pTo, pFrom->nLT
265e0 65 72 6d 29 20 29 7b 0a 20 20 20 20 6d 65 6d 73  erm) ){.    mems
265f0 65 74 28 26 70 54 6f 2d 3e 75 2c 20 30 2c 20 73  et(&pTo->u, 0, s
26600 69 7a 65 6f 66 28 70 54 6f 2d 3e 75 29 29 3b 0a  izeof(pTo->u));.
26610 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
26620 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 6d  E_NOMEM;.  }.  m
26630 65 6d 63 70 79 28 70 54 6f 2c 20 70 46 72 6f 6d  emcpy(pTo, pFrom
26640 2c 20 57 48 45 52 45 5f 4c 4f 4f 50 5f 58 46 45  , WHERE_LOOP_XFE
26650 52 5f 53 5a 29 3b 0a 20 20 6d 65 6d 63 70 79 28  R_SZ);.  memcpy(
26660 70 54 6f 2d 3e 61 4c 54 65 72 6d 2c 20 70 46 72  pTo->aLTerm, pFr
26670 6f 6d 2d 3e 61 4c 54 65 72 6d 2c 20 70 54 6f 2d  om->aLTerm, pTo-
26680 3e 6e 4c 54 65 72 6d 2a 73 69 7a 65 6f 66 28 70  >nLTerm*sizeof(p
26690 54 6f 2d 3e 61 4c 54 65 72 6d 5b 30 5d 29 29 3b  To->aLTerm[0]));
266a0 0a 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 77 73  .  if( pFrom->ws
266b0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49  Flags & WHERE_VI
266c0 52 54 55 41 4c 54 41 42 4c 45 20 29 7b 0a 20 20  RTUALTABLE ){.  
266d0 20 20 70 46 72 6f 6d 2d 3e 75 2e 76 74 61 62 2e    pFrom->u.vtab.
266e0 6e 65 65 64 46 72 65 65 20 3d 20 30 3b 0a 20 20  needFree = 0;.  
266f0 7d 65 6c 73 65 20 69 66 28 20 28 70 46 72 6f 6d  }else if( (pFrom
26700 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
26710 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 21 3d 30  E_AUTO_INDEX)!=0
26720 20 29 7b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 75   ){.    pFrom->u
26730 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20  .btree.pIndex = 
26740 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
26750 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
26760 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 57 68 65  .** Delete a Whe
26770 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 0a 2a 2f  reLoop object.*/
26780 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65  .static void whe
26790 72 65 4c 6f 6f 70 44 65 6c 65 74 65 28 73 71 6c  reLoopDelete(sql
267a0 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c  ite3 *db, WhereL
267b0 6f 6f 70 20 2a 70 29 7b 0a 20 20 77 68 65 72 65  oop *p){.  where
267c0 4c 6f 6f 70 43 6c 65 61 72 28 64 62 2c 20 70 29  LoopClear(db, p)
267d0 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
267e0 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a  e(db, p);.}../*.
267f0 2a 2a 20 46 72 65 65 20 61 20 57 68 65 72 65 49  ** Free a WhereI
26800 6e 66 6f 20 73 74 72 75 63 74 75 72 65 0a 2a 2f  nfo structure.*/
26810 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65  .static void whe
26820 72 65 49 6e 66 6f 46 72 65 65 28 73 71 6c 69 74  reInfoFree(sqlit
26830 65 33 20 2a 64 62 2c 20 57 68 65 72 65 49 6e 66  e3 *db, WhereInf
26840 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 69 66  o *pWInfo){.  if
26850 28 20 41 4c 57 41 59 53 28 70 57 49 6e 66 6f 29  ( ALWAYS(pWInfo)
26860 20 29 7b 0a 20 20 20 20 77 68 65 72 65 43 6c 61   ){.    whereCla
26870 75 73 65 43 6c 65 61 72 28 26 70 57 49 6e 66 6f  useClear(&pWInfo
26880 2d 3e 73 57 43 29 3b 0a 20 20 20 20 77 68 69 6c  ->sWC);.    whil
26890 65 28 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70  e( pWInfo->pLoop
268a0 73 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65  s ){.      Where
268b0 4c 6f 6f 70 20 2a 70 20 3d 20 70 57 49 6e 66 6f  Loop *p = pWInfo
268c0 2d 3e 70 4c 6f 6f 70 73 3b 0a 20 20 20 20 20 20  ->pLoops;.      
268d0 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 20 3d  pWInfo->pLoops =
268e0 20 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 3b 0a 20   p->pNextLoop;. 
268f0 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 44 65       whereLoopDe
26900 6c 65 74 65 28 64 62 2c 20 70 29 3b 0a 20 20 20  lete(db, p);.   
26910 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62   }.    sqlite3Db
26920 46 72 65 65 28 64 62 2c 20 70 57 49 6e 66 6f 29  Free(db, pWInfo)
26930 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
26940 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 61 6c  eturn TRUE if al
26950 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  l of the followi
26960 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a  ng are true:.**.
26970 2a 2a 20 20 20 28 31 29 20 20 58 20 68 61 73 20  **   (1)  X has 
26980 74 68 65 20 73 61 6d 65 20 6f 72 20 6c 6f 77 65  the same or lowe
26990 72 20 63 6f 73 74 20 74 68 61 74 20 59 0a 2a 2a  r cost that Y.**
269a0 20 20 20 28 32 29 20 20 58 20 69 73 20 61 20 70     (2)  X is a p
269b0 72 6f 70 65 72 20 73 75 62 73 65 74 20 6f 66 20  roper subset of 
269c0 59 0a 2a 2a 20 20 20 28 33 29 20 20 58 20 73 6b  Y.**   (3)  X sk
269d0 69 70 73 20 61 74 20 6c 65 61 73 74 20 61 73 20  ips at least as 
269e0 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 61 73 20  many columns as 
269f0 59 0a 2a 2a 0a 2a 2a 20 42 79 20 22 70 72 6f 70  Y.**.** By "prop
26a00 65 72 20 73 75 62 73 65 74 22 20 77 65 20 6d 65  er subset" we me
26a10 61 6e 20 74 68 61 74 20 58 20 75 73 65 73 20 66  an that X uses f
26a20 65 77 65 72 20 57 48 45 52 45 20 63 6c 61 75 73  ewer WHERE claus
26a30 65 20 74 65 72 6d 73 0a 2a 2a 20 74 68 61 6e 20  e terms.** than 
26a40 59 20 61 6e 64 20 74 68 61 74 20 65 76 65 72 79  Y and that every
26a50 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65   WHERE clause te
26a60 72 6d 20 75 73 65 64 20 62 79 20 58 20 69 73 20  rm used by X is 
26a70 61 6c 73 6f 20 75 73 65 64 0a 2a 2a 20 62 79 20  also used.** by 
26a80 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 58 20 69 73  Y..**.** If X is
26a90 20 61 20 70 72 6f 70 65 72 20 73 75 62 73 65 74   a proper subset
26aa0 20 6f 66 20 59 20 74 68 65 6e 20 59 20 69 73 20   of Y then Y is 
26ab0 61 20 62 65 74 74 65 72 20 63 68 6f 69 63 65 20  a better choice 
26ac0 61 6e 64 20 6f 75 67 68 74 0a 2a 2a 20 74 6f 20  and ought.** to 
26ad0 68 61 76 65 20 61 20 6c 6f 77 65 72 20 63 6f 73  have a lower cos
26ae0 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  t.  This routine
26af0 20 72 65 74 75 72 6e 73 20 54 52 55 45 20 77 68   returns TRUE wh
26b00 65 6e 20 74 68 61 74 20 63 6f 73 74 20 0a 2a 2a  en that cost .**
26b10 20 72 65 6c 61 74 69 6f 6e 73 68 69 70 20 69 73   relationship is
26b20 20 69 6e 76 65 72 74 65 64 20 61 6e 64 20 6e 65   inverted and ne
26b30 65 64 73 20 74 6f 20 62 65 20 61 64 6a 75 73 74  eds to be adjust
26b40 65 64 2e 20 20 54 68 65 20 74 68 69 72 64 20 72  ed.  The third r
26b50 75 6c 65 0a 2a 2a 20 77 61 73 20 61 64 64 65 64  ule.** was added
26b60 20 62 65 63 61 75 73 65 20 69 66 20 58 20 75 73   because if X us
26b70 65 73 20 73 6b 69 70 2d 73 63 61 6e 20 6c 65 73  es skip-scan les
26b80 73 20 74 68 61 6e 20 59 20 69 74 20 73 74 69 6c  s than Y it stil
26b90 6c 20 6d 69 67 68 74 0a 2a 2a 20 64 65 73 65 72  l might.** deser
26ba0 76 65 20 61 20 6c 6f 77 65 72 20 63 6f 73 74 20  ve a lower cost 
26bb0 65 76 65 6e 20 69 66 20 69 74 20 69 73 20 61 20  even if it is a 
26bc0 70 72 6f 70 65 72 20 73 75 62 73 65 74 20 6f 66  proper subset of
26bd0 20 59 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e   Y..*/.static in
26be0 74 20 77 68 65 72 65 4c 6f 6f 70 43 68 65 61 70  t whereLoopCheap
26bf0 65 72 50 72 6f 70 65 72 53 75 62 73 65 74 28 0a  erProperSubset(.
26c00 20 20 63 6f 6e 73 74 20 57 68 65 72 65 4c 6f 6f    const WhereLoo
26c10 70 20 2a 70 58 2c 20 20 20 20 20 20 20 2f 2a 20  p *pX,       /* 
26c20 46 69 72 73 74 20 57 68 65 72 65 4c 6f 6f 70 20  First WhereLoop 
26c30 74 6f 20 63 6f 6d 70 61 72 65 20 2a 2f 0a 20 20  to compare */.  
26c40 63 6f 6e 73 74 20 57 68 65 72 65 4c 6f 6f 70 20  const WhereLoop 
26c50 2a 70 59 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  *pY        /* Co
26c60 6d 70 61 72 65 20 61 67 61 69 6e 73 74 20 74 68  mpare against th
26c70 69 73 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2f 0a  is WhereLoop */.
26c80 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  ){.  int i, j;. 
26c90 20 69 66 28 20 70 58 2d 3e 6e 4c 54 65 72 6d 2d   if( pX->nLTerm-
26ca0 70 58 2d 3e 6e 53 6b 69 70 20 3e 3d 20 70 59 2d  pX->nSkip >= pY-
26cb0 3e 6e 4c 54 65 72 6d 2d 70 59 2d 3e 6e 53 6b 69  >nLTerm-pY->nSki
26cc0 70 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  p ){.    return 
26cd0 30 3b 20 2f 2a 20 58 20 69 73 20 6e 6f 74 20 61  0; /* X is not a
26ce0 20 73 75 62 73 65 74 20 6f 66 20 59 20 2a 2f 0a   subset of Y */.
26cf0 20 20 7d 0a 20 20 69 66 28 20 70 59 2d 3e 6e 53    }.  if( pY->nS
26d00 6b 69 70 20 3e 20 70 58 2d 3e 6e 53 6b 69 70 20  kip > pX->nSkip 
26d10 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
26d20 28 20 70 58 2d 3e 72 52 75 6e 20 3e 3d 20 70 59  ( pX->rRun >= pY
26d30 2d 3e 72 52 75 6e 20 29 7b 0a 20 20 20 20 69 66  ->rRun ){.    if
26d40 28 20 70 58 2d 3e 72 52 75 6e 20 3e 20 70 59 2d  ( pX->rRun > pY-
26d50 3e 72 52 75 6e 20 29 20 72 65 74 75 72 6e 20 30  >rRun ) return 0
26d60 3b 20 20 20 20 2f 2a 20 58 20 63 6f 73 74 73 20  ;    /* X costs 
26d70 6d 6f 72 65 20 74 68 61 6e 20 59 20 2a 2f 0a 20  more than Y */. 
26d80 20 20 20 69 66 28 20 70 58 2d 3e 6e 4f 75 74 20     if( pX->nOut 
26d90 3e 20 70 59 2d 3e 6e 4f 75 74 20 29 20 72 65 74  > pY->nOut ) ret
26da0 75 72 6e 20 30 3b 20 20 20 20 2f 2a 20 58 20 63  urn 0;    /* X c
26db0 6f 73 74 73 20 6d 6f 72 65 20 74 68 61 6e 20 59  osts more than Y
26dc0 20 2a 2f 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d   */.  }.  for(i=
26dd0 70 58 2d 3e 6e 4c 54 65 72 6d 2d 31 3b 20 69 3e  pX->nLTerm-1; i>
26de0 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69 66  =0; i--){.    if
26df0 28 20 70 58 2d 3e 61 4c 54 65 72 6d 5b 69 5d 3d  ( pX->aLTerm[i]=
26e00 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
26e10 20 20 20 66 6f 72 28 6a 3d 70 59 2d 3e 6e 4c 54     for(j=pY->nLT
26e20 65 72 6d 2d 31 3b 20 6a 3e 3d 30 3b 20 6a 2d 2d  erm-1; j>=0; j--
26e30 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 59 2d  ){.      if( pY-
26e40 3e 61 4c 54 65 72 6d 5b 6a 5d 3d 3d 70 58 2d 3e  >aLTerm[j]==pX->
26e50 61 4c 54 65 72 6d 5b 69 5d 20 29 20 62 72 65 61  aLTerm[i] ) brea
26e60 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  k;.    }.    if(
26e70 20 6a 3c 30 20 29 20 72 65 74 75 72 6e 20 30 3b   j<0 ) return 0;
26e80 20 20 2f 2a 20 58 20 6e 6f 74 20 61 20 73 75 62    /* X not a sub
26e90 73 65 74 20 6f 66 20 59 20 73 69 6e 63 65 20 74  set of Y since t
26ea0 65 72 6d 20 58 5b 69 5d 20 6e 6f 74 20 75 73 65  erm X[i] not use
26eb0 64 20 62 79 20 59 20 2a 2f 0a 20 20 7d 0a 20 20  d by Y */.  }.  
26ec0 72 65 74 75 72 6e 20 31 3b 20 20 2f 2a 20 41 6c  return 1;  /* Al
26ed0 6c 20 63 6f 6e 64 69 74 69 6f 6e 73 20 6d 65 65  l conditions mee
26ee0 74 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72  t */.}../*.** Tr
26ef0 79 20 74 6f 20 61 64 6a 75 73 74 20 74 68 65 20  y to adjust the 
26f00 63 6f 73 74 20 6f 66 20 57 68 65 72 65 4c 6f 6f  cost of WhereLoo
26f10 70 20 70 54 65 6d 70 6c 61 74 65 20 75 70 77 61  p pTemplate upwa
26f20 72 64 73 20 6f 72 20 64 6f 77 6e 77 61 72 64 73  rds or downwards
26f30 20 73 6f 0a 2a 2a 20 74 68 61 74 3a 0a 2a 2a 0a   so.** that:.**.
26f40 2a 2a 20 20 20 28 31 29 20 70 54 65 6d 70 6c 61  **   (1) pTempla
26f50 74 65 20 63 6f 73 74 73 20 6c 65 73 73 20 74 68  te costs less th
26f60 61 6e 20 61 6e 79 20 6f 74 68 65 72 20 57 68 65  an any other Whe
26f70 72 65 4c 6f 6f 70 73 20 74 68 61 74 20 61 72 65  reLoops that are
26f80 20 61 20 70 72 6f 70 65 72 0a 2a 2a 20 20 20 20   a proper.**    
26f90 20 20 20 73 75 62 73 65 74 20 6f 66 20 70 54 65     subset of pTe
26fa0 6d 70 6c 61 74 65 0a 2a 2a 0a 2a 2a 20 20 20 28  mplate.**.**   (
26fb0 32 29 20 70 54 65 6d 70 6c 61 74 65 20 63 6f 73  2) pTemplate cos
26fc0 74 73 20 6d 6f 72 65 20 74 68 61 6e 20 61 6e 79  ts more than any
26fd0 20 6f 74 68 65 72 20 57 68 65 72 65 4c 6f 6f 70   other WhereLoop
26fe0 73 20 66 6f 72 20 77 68 69 63 68 20 70 54 65 6d  s for which pTem
26ff0 70 6c 61 74 65 0a 2a 2a 20 20 20 20 20 20 20 69  plate.**       i
27000 73 20 61 20 70 72 6f 70 65 72 20 73 75 62 73 65  s a proper subse
27010 74 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 73 61 79 20  t..**.** To say 
27020 22 57 68 65 72 65 4c 6f 6f 70 20 58 20 69 73 20  "WhereLoop X is 
27030 61 20 70 72 6f 70 65 72 20 73 75 62 73 65 74 20  a proper subset 
27040 6f 66 20 59 22 20 6d 65 61 6e 73 20 74 68 61 74  of Y" means that
27050 20 58 20 75 73 65 73 20 66 65 77 65 72 0a 2a 2a   X uses fewer.**
27060 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65   WHERE clause te
27070 72 6d 73 20 74 68 61 6e 20 59 20 61 6e 64 20 74  rms than Y and t
27080 68 61 74 20 65 76 65 72 79 20 57 48 45 52 45 20  hat every WHERE 
27090 63 6c 61 75 73 65 20 74 65 72 6d 20 75 73 65 64  clause term used
270a0 20 62 79 20 58 20 69 73 0a 2a 2a 20 61 6c 73 6f   by X is.** also
270b0 20 75 73 65 64 20 62 79 20 59 2e 0a 2a 2f 0a 73   used by Y..*/.s
270c0 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65  tatic void where
270d0 4c 6f 6f 70 41 64 6a 75 73 74 43 6f 73 74 28 63  LoopAdjustCost(c
270e0 6f 6e 73 74 20 57 68 65 72 65 4c 6f 6f 70 20 2a  onst WhereLoop *
270f0 70 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 54  p, WhereLoop *pT
27100 65 6d 70 6c 61 74 65 29 7b 0a 20 20 69 66 28 20  emplate){.  if( 
27110 28 70 54 65 6d 70 6c 61 74 65 2d 3e 77 73 46 6c  (pTemplate->wsFl
27120 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45  ags & WHERE_INDE
27130 58 45 44 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  XED)==0 ) return
27140 3b 0a 20 20 66 6f 72 28 3b 20 70 3b 20 70 3d 70  ;.  for(; p; p=p
27150 2d 3e 70 4e 65 78 74 4c 6f 6f 70 29 7b 0a 20 20  ->pNextLoop){.  
27160 20 20 69 66 28 20 70 2d 3e 69 54 61 62 21 3d 70    if( p->iTab!=p
27170 54 65 6d 70 6c 61 74 65 2d 3e 69 54 61 62 20 29  Template->iTab )
27180 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
27190 66 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26  f( (p->wsFlags &
271a0 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 3d   WHERE_INDEXED)=
271b0 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
271c0 20 20 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70     if( whereLoop
271d0 43 68 65 61 70 65 72 50 72 6f 70 65 72 53 75 62  CheaperProperSub
271e0 73 65 74 28 70 2c 20 70 54 65 6d 70 6c 61 74 65  set(p, pTemplate
271f0 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 64  ) ){.      /* Ad
27200 6a 75 73 74 20 70 54 65 6d 70 6c 61 74 65 20 63  just pTemplate c
27210 6f 73 74 20 64 6f 77 6e 77 61 72 64 20 73 6f 20  ost downward so 
27220 74 68 61 74 20 69 74 20 69 73 20 63 68 65 61 70  that it is cheap
27230 65 72 20 74 68 61 6e 20 69 74 73 20 0a 20 20 20  er than its .   
27240 20 20 20 2a 2a 20 73 75 62 73 65 74 20 70 2e 20     ** subset p. 
27250 2a 2f 0a 20 20 20 20 20 20 57 48 45 52 45 54 52  */.      WHERETR
27260 41 43 45 28 30 78 38 30 2c 28 22 73 75 62 73 65  ACE(0x80,("subse
27270 74 20 63 6f 73 74 20 61 64 6a 75 73 74 6d 65 6e  t cost adjustmen
27280 74 20 25 64 2c 25 64 20 74 6f 20 25 64 2c 25 64  t %d,%d to %d,%d
27290 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
272a0 20 20 20 20 20 20 20 20 20 20 20 20 70 54 65 6d              pTem
272b0 70 6c 61 74 65 2d 3e 72 52 75 6e 2c 20 70 54 65  plate->rRun, pTe
272c0 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74 2c 20 70 2d  mplate->nOut, p-
272d0 3e 72 52 75 6e 2c 20 70 2d 3e 6e 4f 75 74 2d 31  >rRun, p->nOut-1
272e0 29 29 3b 0a 20 20 20 20 20 20 70 54 65 6d 70 6c  ));.      pTempl
272f0 61 74 65 2d 3e 72 52 75 6e 20 3d 20 70 2d 3e 72  ate->rRun = p->r
27300 52 75 6e 3b 0a 20 20 20 20 20 20 70 54 65 6d 70  Run;.      pTemp
27310 6c 61 74 65 2d 3e 6e 4f 75 74 20 3d 20 70 2d 3e  late->nOut = p->
27320 6e 4f 75 74 20 2d 20 31 3b 0a 20 20 20 20 7d 65  nOut - 1;.    }e
27330 6c 73 65 20 69 66 28 20 77 68 65 72 65 4c 6f 6f  lse if( whereLoo
27340 70 43 68 65 61 70 65 72 50 72 6f 70 65 72 53 75  pCheaperProperSu
27350 62 73 65 74 28 70 54 65 6d 70 6c 61 74 65 2c 20  bset(pTemplate, 
27360 70 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41  p) ){.      /* A
27370 64 6a 75 73 74 20 70 54 65 6d 70 6c 61 74 65 20  djust pTemplate 
27380 63 6f 73 74 20 75 70 77 61 72 64 20 73 6f 20 74  cost upward so t
27390 68 61 74 20 69 74 20 69 73 20 63 6f 73 74 6c 69  hat it is costli
273a0 65 72 20 74 68 61 6e 20 70 20 73 69 6e 63 65 0a  er than p since.
273b0 20 20 20 20 20 20 2a 2a 20 70 54 65 6d 70 6c 61        ** pTempla
273c0 74 65 20 69 73 20 61 20 70 72 6f 70 65 72 20 73  te is a proper s
273d0 75 62 73 65 74 20 6f 66 20 70 20 2a 2f 0a 20 20  ubset of p */.  
273e0 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30      WHERETRACE(0
273f0 78 38 30 2c 28 22 73 75 62 73 65 74 20 63 6f 73  x80,("subset cos
27400 74 20 61 64 6a 75 73 74 6d 65 6e 74 20 25 64 2c  t adjustment %d,
27410 25 64 20 74 6f 20 25 64 2c 25 64 5c 6e 22 2c 0a  %d to %d,%d\n",.
27420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27430 20 20 20 20 20 20 20 70 54 65 6d 70 6c 61 74 65         pTemplate
27440 2d 3e 72 52 75 6e 2c 20 70 54 65 6d 70 6c 61 74  ->rRun, pTemplat
27450 65 2d 3e 6e 4f 75 74 2c 20 70 2d 3e 72 52 75 6e  e->nOut, p->rRun
27460 2c 20 70 2d 3e 6e 4f 75 74 2b 31 29 29 3b 0a 20  , p->nOut+1));. 
27470 20 20 20 20 20 70 54 65 6d 70 6c 61 74 65 2d 3e       pTemplate->
27480 72 52 75 6e 20 3d 20 70 2d 3e 72 52 75 6e 3b 0a  rRun = p->rRun;.
27490 20 20 20 20 20 20 70 54 65 6d 70 6c 61 74 65 2d        pTemplate-
274a0 3e 6e 4f 75 74 20 3d 20 70 2d 3e 6e 4f 75 74 20  >nOut = p->nOut 
274b0 2b 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  + 1;.    }.  }.}
274c0 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20 74  ../*.** Search t
274d0 68 65 20 6c 69 73 74 20 6f 66 20 57 68 65 72 65  he list of Where
274e0 4c 6f 6f 70 73 20 69 6e 20 2a 70 70 50 72 65 76  Loops in *ppPrev
274f0 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 6f 6e 65   looking for one
27500 20 74 68 61 74 20 63 61 6e 20 62 65 0a 2a 2a 20   that can be.** 
27510 73 75 70 70 6c 61 6e 74 65 64 20 62 79 20 70 54  supplanted by pT
27520 65 6d 70 6c 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 52  emplate..**.** R
27530 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 74 68  eturn NULL if th
27540 65 20 57 68 65 72 65 4c 6f 6f 70 20 6c 69 73 74  e WhereLoop list
27550 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 65 6e 74   contains an ent
27560 72 79 20 74 68 61 74 20 63 61 6e 20 73 75 70 70  ry that can supp
27570 6c 61 6e 74 0a 2a 2a 20 70 54 65 6d 70 6c 61 74  lant.** pTemplat
27580 65 2c 20 69 6e 20 6f 74 68 65 72 20 77 6f 72 64  e, in other word
27590 73 20 69 66 20 70 54 65 6d 70 6c 61 74 65 20 64  s if pTemplate d
275a0 6f 65 73 20 6e 6f 74 20 62 65 6c 6f 6e 67 20 6f  oes not belong o
275b0 6e 20 74 68 65 20 6c 69 73 74 2e 0a 2a 2a 0a 2a  n the list..**.*
275c0 2a 20 49 66 20 70 58 20 69 73 20 61 20 57 68 65  * If pX is a Whe
275d0 72 65 4c 6f 6f 70 20 74 68 61 74 20 70 54 65 6d  reLoop that pTem
275e0 70 6c 61 74 65 20 63 61 6e 20 73 75 70 70 6c 61  plate can suppla
275f0 6e 74 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20  nt, then return 
27600 74 68 65 0a 2a 2a 20 6c 69 6e 6b 20 74 68 61 74  the.** link that
27610 20 70 6f 69 6e 74 73 20 74 6f 20 70 58 2e 0a 2a   points to pX..*
27620 2a 0a 2a 2a 20 49 66 20 70 54 65 6d 70 6c 61 74  *.** If pTemplat
27630 65 20 63 61 6e 6e 6f 74 20 73 75 70 70 6c 61 6e  e cannot supplan
27640 74 20 61 6e 79 20 65 78 69 73 74 69 6e 67 20 65  t any existing e
27650 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 6c 69  lement of the li
27660 73 74 20 62 75 74 20 6e 65 65 64 73 0a 2a 2a 20  st but needs.** 
27670 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f 20 74  to be added to t
27680 68 65 20 6c 69 73 74 2c 20 74 68 65 6e 20 72 65  he list, then re
27690 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
276a0 6f 20 74 68 65 20 74 61 69 6c 20 6f 66 20 74 68  o the tail of th
276b0 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69  e list..*/.stati
276c0 63 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a 77 68  c WhereLoop **wh
276d0 65 72 65 4c 6f 6f 70 46 69 6e 64 4c 65 73 73 65  ereLoopFindLesse
276e0 72 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  r(.  WhereLoop *
276f0 2a 70 70 50 72 65 76 2c 0a 20 20 63 6f 6e 73 74  *ppPrev,.  const
27700 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 54 65 6d   WhereLoop *pTem
27710 70 6c 61 74 65 0a 29 7b 0a 20 20 57 68 65 72 65  plate.){.  Where
27720 4c 6f 6f 70 20 2a 70 3b 0a 20 20 66 6f 72 28 70  Loop *p;.  for(p
27730 3d 28 2a 70 70 50 72 65 76 29 3b 20 70 3b 20 70  =(*ppPrev); p; p
27740 70 50 72 65 76 3d 26 70 2d 3e 70 4e 65 78 74 4c  pPrev=&p->pNextL
27750 6f 6f 70 2c 20 70 3d 2a 70 70 50 72 65 76 29 7b  oop, p=*ppPrev){
27760 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 54 61 62  .    if( p->iTab
27770 21 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 69 54 61  !=pTemplate->iTa
27780 62 20 7c 7c 20 70 2d 3e 69 53 6f 72 74 49 64 78  b || p->iSortIdx
27790 21 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 69 53 6f  !=pTemplate->iSo
277a0 72 74 49 64 78 20 29 7b 0a 20 20 20 20 20 20 2f  rtIdx ){.      /
277b0 2a 20 49 66 20 65 69 74 68 65 72 20 74 68 65 20  * If either the 
277c0 69 54 61 62 20 6f 72 20 69 53 6f 72 74 49 64 78  iTab or iSortIdx
277d0 20 76 61 6c 75 65 73 20 66 6f 72 20 74 77 6f 20   values for two 
277e0 57 68 65 72 65 4c 6f 6f 70 20 61 72 65 20 64 69  WhereLoop are di
277f0 66 66 65 72 65 6e 74 0a 20 20 20 20 20 20 2a 2a  fferent.      **
27800 20 74 68 65 6e 20 74 68 6f 73 65 20 57 68 65 72   then those Wher
27810 65 4c 6f 6f 70 73 20 6e 65 65 64 20 74 6f 20 62  eLoops need to b
27820 65 20 63 6f 6e 73 69 64 65 72 65 64 20 73 65 70  e considered sep
27830 61 72 61 74 65 6c 79 2e 20 20 4e 65 69 74 68 65  arately.  Neithe
27840 72 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 20  r is.      ** a 
27850 63 61 6e 64 69 64 61 74 65 20 74 6f 20 72 65 70  candidate to rep
27860 6c 61 63 65 20 74 68 65 20 6f 74 68 65 72 2e 20  lace the other. 
27870 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  */.      continu
27880 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20  e;.    }.    /* 
27890 49 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 69  In the current i
278a0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2c 20 74  mplementation, t
278b0 68 65 20 72 53 65 74 75 70 20 76 61 6c 75 65 20  he rSetup value 
278c0 69 73 20 65 69 74 68 65 72 20 7a 65 72 6f 0a 20  is either zero. 
278d0 20 20 20 2a 2a 20 6f 72 20 74 68 65 20 63 6f 73     ** or the cos
278e0 74 20 6f 66 20 62 75 69 6c 64 69 6e 67 20 61 6e  t of building an
278f0 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78   automatic index
27900 20 28 4e 6c 6f 67 4e 29 20 61 6e 64 20 74 68 65   (NlogN) and the
27910 20 4e 6c 6f 67 4e 0a 20 20 20 20 2a 2a 20 69 73   NlogN.    ** is
27920 20 74 68 65 20 73 61 6d 65 20 66 6f 72 20 63 6f   the same for co
27930 6d 70 61 74 69 62 6c 65 20 57 68 65 72 65 4c 6f  mpatible WhereLo
27940 6f 70 73 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65  ops. */.    asse
27950 72 74 28 20 70 2d 3e 72 53 65 74 75 70 3d 3d 30  rt( p->rSetup==0
27960 20 7c 7c 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72   || pTemplate->r
27970 53 65 74 75 70 3d 3d 30 20 0a 20 20 20 20 20 20  Setup==0 .      
27980 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d             || p-
27990 3e 72 53 65 74 75 70 3d 3d 70 54 65 6d 70 6c 61  >rSetup==pTempla
279a0 74 65 2d 3e 72 53 65 74 75 70 20 29 3b 0a 0a 20  te->rSetup );.. 
279b0 20 20 20 2f 2a 20 77 68 65 72 65 4c 6f 6f 70 41     /* whereLoopA
279c0 64 64 42 74 72 65 65 28 29 20 61 6c 77 61 79 73  ddBtree() always
279d0 20 67 65 6e 65 72 61 74 65 73 20 61 6e 64 20 69   generates and i
279e0 6e 73 65 72 74 73 20 74 68 65 20 61 75 74 6f 6d  nserts the autom
279f0 61 74 69 63 20 69 6e 64 65 78 0a 20 20 20 20 2a  atic index.    *
27a00 2a 20 63 61 73 65 20 66 69 72 73 74 2e 20 20 48  * case first.  H
27a10 65 6e 63 65 20 63 6f 6d 70 61 74 69 62 6c 65 20  ence compatible 
27a20 63 61 6e 64 69 64 61 74 65 20 57 68 65 72 65 4c  candidate WhereL
27a30 6f 6f 70 73 20 6e 65 76 65 72 20 68 61 76 65 20  oops never have 
27a40 61 20 6c 61 72 67 65 72 0a 20 20 20 20 2a 2a 20  a larger.    ** 
27a50 72 53 65 74 75 70 2e 20 43 61 6c 6c 20 74 68 69  rSetup. Call thi
27a60 73 20 53 45 54 55 50 2d 49 4e 56 41 52 49 41 4e  s SETUP-INVARIAN
27a70 54 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  T */.    assert(
27a80 20 70 2d 3e 72 53 65 74 75 70 3e 3d 70 54 65 6d   p->rSetup>=pTem
27a90 70 6c 61 74 65 2d 3e 72 53 65 74 75 70 20 29 3b  plate->rSetup );
27aa0 0a 0a 20 20 20 20 2f 2a 20 41 6e 79 20 6c 6f 6f  ..    /* Any loo
27ab0 70 20 75 73 69 6e 67 20 61 6e 20 61 70 70 6c 69  p using an appli
27ac0 61 74 69 6f 6e 2d 64 65 66 69 6e 65 64 20 69 6e  ation-defined in
27ad0 64 65 78 20 28 6f 72 20 50 52 49 4d 41 52 59 20  dex (or PRIMARY 
27ae0 4b 45 59 20 6f 72 0a 20 20 20 20 2a 2a 20 55 4e  KEY or.    ** UN
27af0 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 29  IQUE constraint)
27b00 20 77 69 74 68 20 6f 6e 65 20 6f 72 20 6d 6f 72   with one or mor
27b10 65 20 3d 3d 20 63 6f 6e 73 74 72 61 69 6e 74 73  e == constraints
27b20 20 69 73 20 62 65 74 74 65 72 0a 20 20 20 20 2a   is better.    *
27b30 2a 20 74 68 61 6e 20 61 6e 20 61 75 74 6f 6d 61  * than an automa
27b40 74 69 63 20 69 6e 64 65 78 2e 20 55 6e 6c 65 73  tic index. Unles
27b50 73 20 69 74 20 69 73 20 61 20 73 6b 69 70 2d 73  s it is a skip-s
27b60 63 61 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  can. */.    if( 
27b70 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  (p->wsFlags & WH
27b80 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 21  ERE_AUTO_INDEX)!
27b90 3d 30 0a 20 20 20 20 20 26 26 20 28 70 54 65 6d  =0.     && (pTem
27ba0 70 6c 61 74 65 2d 3e 6e 53 6b 69 70 29 3d 3d 30  plate->nSkip)==0
27bb0 0a 20 20 20 20 20 26 26 20 28 70 54 65 6d 70 6c  .     && (pTempl
27bc0 61 74 65 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  ate->wsFlags & W
27bd0 48 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30  HERE_INDEXED)!=0
27be0 0a 20 20 20 20 20 26 26 20 28 70 54 65 6d 70 6c  .     && (pTempl
27bf0 61 74 65 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  ate->wsFlags & W
27c00 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 29 21  HERE_COLUMN_EQ)!
27c10 3d 30 0a 20 20 20 20 20 26 26 20 28 70 2d 3e 70  =0.     && (p->p
27c20 72 65 72 65 71 20 26 20 70 54 65 6d 70 6c 61 74  rereq & pTemplat
27c30 65 2d 3e 70 72 65 72 65 71 29 3d 3d 70 54 65 6d  e->prereq)==pTem
27c40 70 6c 61 74 65 2d 3e 70 72 65 72 65 71 0a 20 20  plate->prereq.  
27c50 20 20 29 7b 0a 20 20 20 20 20 20 62 72 65 61 6b    ){.      break
27c60 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
27c70 49 66 20 65 78 69 73 74 69 6e 67 20 57 68 65 72  If existing Wher
27c80 65 4c 6f 6f 70 20 70 20 69 73 20 62 65 74 74 65  eLoop p is bette
27c90 72 20 74 68 61 6e 20 70 54 65 6d 70 6c 61 74 65  r than pTemplate
27ca0 2c 20 70 54 65 6d 70 6c 61 74 65 20 63 61 6e 20  , pTemplate can 
27cb0 62 65 0a 20 20 20 20 2a 2a 20 64 69 73 63 61 72  be.    ** discar
27cc0 64 65 64 2e 20 20 57 68 65 72 65 4c 6f 6f 70 20  ded.  WhereLoop 
27cd0 70 20 69 73 20 62 65 74 74 65 72 20 69 66 3a 0a  p is better if:.
27ce0 20 20 20 20 2a 2a 20 20 20 28 31 29 20 20 70 20      **   (1)  p 
27cf0 68 61 73 20 6e 6f 20 6d 6f 72 65 20 64 65 70 65  has no more depe
27d00 6e 64 65 6e 63 69 65 73 20 74 68 61 6e 20 70 54  ndencies than pT
27d10 65 6d 70 6c 61 74 65 2c 20 61 6e 64 0a 20 20 20  emplate, and.   
27d20 20 2a 2a 20 20 20 28 32 29 20 20 70 20 68 61 73   **   (2)  p has
27d30 20 61 6e 20 65 71 75 61 6c 20 6f 72 20 6c 6f 77   an equal or low
27d40 65 72 20 63 6f 73 74 20 74 68 61 6e 20 70 54 65  er cost than pTe
27d50 6d 70 6c 61 74 65 0a 20 20 20 20 2a 2f 0a 20 20  mplate.    */.  
27d60 20 20 69 66 28 20 28 70 2d 3e 70 72 65 72 65 71    if( (p->prereq
27d70 20 26 20 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72   & pTemplate->pr
27d80 65 72 65 71 29 3d 3d 70 2d 3e 70 72 65 72 65 71  ereq)==p->prereq
27d90 20 20 20 20 2f 2a 20 28 31 29 20 20 2a 2f 0a 20      /* (1)  */. 
27da0 20 20 20 20 26 26 20 70 2d 3e 72 53 65 74 75 70      && p->rSetup
27db0 3c 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65  <=pTemplate->rSe
27dc0 74 75 70 20 20 20 20 20 20 20 20 20 20 20 20 20  tup             
27dd0 20 20 20 20 20 2f 2a 20 28 32 61 29 20 2a 2f 0a       /* (2a) */.
27de0 20 20 20 20 20 26 26 20 70 2d 3e 72 52 75 6e 3c       && p->rRun<
27df0 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e  =pTemplate->rRun
27e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27e10 20 20 20 20 20 20 2f 2a 20 28 32 62 29 20 2a 2f        /* (2b) */
27e20 0a 20 20 20 20 20 26 26 20 70 2d 3e 6e 4f 75 74  .     && p->nOut
27e30 3c 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75  <=pTemplate->nOu
27e40 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
27e50 20 20 20 20 20 20 20 2f 2a 20 28 32 63 29 20 2a         /* (2c) *
27e60 2f 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72  /.    ){.      r
27e70 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 44 69 73  eturn 0;  /* Dis
27e80 63 61 72 64 20 70 54 65 6d 70 6c 61 74 65 20 2a  card pTemplate *
27e90 2f 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  /.    }..    /* 
27ea0 49 66 20 70 54 65 6d 70 6c 61 74 65 20 69 73 20  If pTemplate is 
27eb0 61 6c 77 61 79 73 20 62 65 74 74 65 72 20 74 68  always better th
27ec0 61 6e 20 70 2c 20 74 68 65 6e 20 63 61 75 73 65  an p, then cause
27ed0 20 70 20 74 6f 20 62 65 20 6f 76 65 72 77 72 69   p to be overwri
27ee0 74 74 65 6e 0a 20 20 20 20 2a 2a 20 77 69 74 68  tten.    ** with
27ef0 20 70 54 65 6d 70 6c 61 74 65 2e 20 20 70 54 65   pTemplate.  pTe
27f00 6d 70 6c 61 74 65 20 69 73 20 62 65 74 74 65 72  mplate is better
27f10 20 74 68 61 6e 20 70 20 69 66 3a 0a 20 20 20 20   than p if:.    
27f20 2a 2a 20 20 20 28 31 29 20 20 70 54 65 6d 70 6c  **   (1)  pTempl
27f30 61 74 65 20 68 61 73 20 6e 6f 20 6d 6f 72 65 20  ate has no more 
27f40 64 65 70 65 6e 64 65 6e 63 65 73 20 74 68 61 6e  dependences than
27f50 20 70 2c 20 61 6e 64 0a 20 20 20 20 2a 2a 20 20   p, and.    **  
27f60 20 28 32 29 20 20 70 54 65 6d 70 6c 61 74 65 20   (2)  pTemplate 
27f70 68 61 73 20 61 6e 20 65 71 75 61 6c 20 6f 72 20  has an equal or 
27f80 6c 6f 77 65 72 20 63 6f 73 74 20 74 68 61 6e 20  lower cost than 
27f90 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  p..    */.    if
27fa0 28 20 28 70 2d 3e 70 72 65 72 65 71 20 26 20 70  ( (p->prereq & p
27fb0 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65 71  Template->prereq
27fc0 29 3d 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72  )==pTemplate->pr
27fd0 65 72 65 71 20 20 20 2f 2a 20 28 31 29 20 20 2a  ereq   /* (1)  *
27fe0 2f 0a 20 20 20 20 20 26 26 20 70 2d 3e 72 52 75  /.     && p->rRu
27ff0 6e 3e 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52  n>=pTemplate->rR
28000 75 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20  un              
28010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28020 2a 20 28 32 61 29 20 2a 2f 0a 20 20 20 20 20 26  * (2a) */.     &
28030 26 20 70 2d 3e 6e 4f 75 74 3e 3d 70 54 65 6d 70  & p->nOut>=pTemp
28040 6c 61 74 65 2d 3e 6e 4f 75 74 20 20 20 20 20 20  late->nOut      
28050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28060 20 20 20 20 20 20 20 2f 2a 20 28 32 62 29 20 2a         /* (2b) *
28070 2f 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 61  /.    ){.      a
28080 73 73 65 72 74 28 20 70 2d 3e 72 53 65 74 75 70  ssert( p->rSetup
28090 3e 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65  >=pTemplate->rSe
280a0 74 75 70 20 29 3b 20 2f 2a 20 53 45 54 55 50 2d  tup ); /* SETUP-
280b0 49 4e 56 41 52 49 41 4e 54 20 61 62 6f 76 65 20  INVARIANT above 
280c0 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 20  */.      break; 
280d0 20 20 2f 2a 20 43 61 75 73 65 20 70 20 74 6f 20    /* Cause p to 
280e0 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e 20 62  be overwritten b
280f0 79 20 70 54 65 6d 70 6c 61 74 65 20 2a 2f 0a 20  y pTemplate */. 
28100 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
28110 6e 20 70 70 50 72 65 76 3b 0a 7d 0a 0a 2f 2a 0a  n ppPrev;.}../*.
28120 2a 2a 20 49 6e 73 65 72 74 20 6f 72 20 72 65 70  ** Insert or rep
28130 6c 61 63 65 20 61 20 57 68 65 72 65 4c 6f 6f 70  lace a WhereLoop
28140 20 65 6e 74 72 79 20 75 73 69 6e 67 20 74 68 65   entry using the
28150 20 74 65 6d 70 6c 61 74 65 20 73 75 70 70 6c 69   template suppli
28160 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 69  ed..**.** An exi
28170 73 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20  sting WhereLoop 
28180 65 6e 74 72 79 20 6d 69 67 68 74 20 62 65 20 6f  entry might be o
28190 76 65 72 77 72 69 74 74 65 6e 20 69 66 20 74 68  verwritten if th
281a0 65 20 6e 65 77 20 74 65 6d 70 6c 61 74 65 0a 2a  e new template.*
281b0 2a 20 69 73 20 62 65 74 74 65 72 20 61 6e 64 20  * is better and 
281c0 68 61 73 20 66 65 77 65 72 20 64 65 70 65 6e 64  has fewer depend
281d0 65 6e 63 69 65 73 2e 20 20 4f 72 20 74 68 65 20  encies.  Or the 
281e0 74 65 6d 70 6c 61 74 65 20 77 69 6c 6c 20 62 65  template will be
281f0 20 69 67 6e 6f 72 65 64 0a 2a 2a 20 61 6e 64 20   ignored.** and 
28200 6e 6f 20 69 6e 73 65 72 74 20 77 69 6c 6c 20 6f  no insert will o
28210 63 63 75 72 20 69 66 20 61 6e 20 65 78 69 73 74  ccur if an exist
28220 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 69 73  ing WhereLoop is
28230 20 66 61 73 74 65 72 20 61 6e 64 20 68 61 73 0a   faster and has.
28240 2a 2a 20 66 65 77 65 72 20 64 65 70 65 6e 64 65  ** fewer depende
28250 6e 63 69 65 73 20 74 68 61 6e 20 74 68 65 20 74  ncies than the t
28260 65 6d 70 6c 61 74 65 2e 20 20 4f 74 68 65 72 77  emplate.  Otherw
28270 69 73 65 20 61 20 6e 65 77 20 57 68 65 72 65 4c  ise a new WhereL
28280 6f 6f 70 20 69 73 0a 2a 2a 20 61 64 64 65 64 20  oop is.** added 
28290 62 61 73 65 64 20 6f 6e 20 74 68 65 20 74 65 6d  based on the tem
282a0 70 6c 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  plate..**.** If 
282b0 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74  pBuilder->pOrSet
282c0 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65   is not NULL the
282d0 6e 20 77 65 20 63 61 72 65 20 61 62 6f 75 74 20  n we care about 
282e0 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 70 72 65 72  only the.** prer
282f0 65 71 75 69 73 69 74 65 73 20 61 6e 64 20 72 52  equisites and rR
28300 75 6e 20 61 6e 64 20 6e 4f 75 74 20 63 6f 73 74  un and nOut cost
28310 73 20 6f 66 20 74 68 65 20 4e 20 62 65 73 74 20  s of the N best 
28320 6c 6f 6f 70 73 2e 20 20 54 68 61 74 0a 2a 2a 20  loops.  That.** 
28330 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 67  information is g
28340 61 74 68 65 72 65 64 20 69 6e 20 74 68 65 20 70  athered in the p
28350 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20  Builder->pOrSet 
28360 6f 62 6a 65 63 74 2e 20 20 54 68 69 73 20 73 70  object.  This sp
28370 65 63 69 61 6c 0a 2a 2a 20 70 72 6f 63 65 73 73  ecial.** process
28380 69 6e 67 20 6d 6f 64 65 20 69 73 20 75 73 65 64  ing mode is used
28390 20 6f 6e 6c 79 20 66 6f 72 20 4f 52 20 63 6c 61   only for OR cla
283a0 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a  use processing..
283b0 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61 63 63 75 6d  **.** When accum
283c0 75 6c 61 74 69 6e 67 20 6d 75 6c 74 69 70 6c 65  ulating multiple
283d0 20 6c 6f 6f 70 73 20 28 77 68 65 6e 20 70 42 75   loops (when pBu
283e0 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20 69 73  ilder->pOrSet is
283f0 20 4e 55 4c 4c 29 20 77 65 0a 2a 2a 20 73 74 69   NULL) we.** sti
28400 6c 6c 20 6d 69 67 68 74 20 6f 76 65 72 77 72 69  ll might overwri
28410 74 65 20 73 69 6d 69 6c 61 72 20 6c 6f 6f 70 73  te similar loops
28420 20 77 69 74 68 20 74 68 65 20 6e 65 77 20 74 65   with the new te
28430 6d 70 6c 61 74 65 20 69 66 20 74 68 65 0a 2a 2a  mplate if the.**
28440 20 6e 65 77 20 74 65 6d 70 6c 61 74 65 20 69 73   new template is
28450 20 62 65 74 74 65 72 2e 20 20 4c 6f 6f 70 73 20   better.  Loops 
28460 6d 61 79 20 62 65 20 6f 76 65 72 77 72 69 74 74  may be overwritt
28470 65 6e 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77  en if the follow
28480 69 6e 67 20 0a 2a 2a 20 63 6f 6e 64 69 74 69 6f  ing .** conditio
28490 6e 73 20 61 72 65 20 6d 65 74 3a 0a 2a 2a 0a 2a  ns are met:.**.*
284a0 2a 20 20 20 20 28 31 29 20 20 54 68 65 79 20 68  *    (1)  They h
284b0 61 76 65 20 74 68 65 20 73 61 6d 65 20 69 54 61  ave the same iTa
284c0 62 2e 0a 2a 2a 20 20 20 20 28 32 29 20 20 54 68  b..**    (2)  Th
284d0 65 79 20 68 61 76 65 20 74 68 65 20 73 61 6d 65  ey have the same
284e0 20 69 53 6f 72 74 49 64 78 2e 0a 2a 2a 20 20 20   iSortIdx..**   
284f0 20 28 33 29 20 20 54 68 65 20 74 65 6d 70 6c 61   (3)  The templa
28500 74 65 20 68 61 73 20 73 61 6d 65 20 6f 72 20 66  te has same or f
28510 65 77 65 72 20 64 65 70 65 6e 64 65 6e 63 69 65  ewer dependencie
28520 73 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65  s than the curre
28530 6e 74 20 6c 6f 6f 70 0a 2a 2a 20 20 20 20 28 34  nt loop.**    (4
28540 29 20 20 54 68 65 20 74 65 6d 70 6c 61 74 65 20  )  The template 
28550 68 61 73 20 74 68 65 20 73 61 6d 65 20 6f 72 20  has the same or 
28560 6c 6f 77 65 72 20 63 6f 73 74 20 74 68 61 6e 20  lower cost than 
28570 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f 70  the current loop
28580 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
28590 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 57  hereLoopInsert(W
285a0 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20  hereLoopBuilder 
285b0 2a 70 42 75 69 6c 64 65 72 2c 20 57 68 65 72 65  *pBuilder, Where
285c0 4c 6f 6f 70 20 2a 70 54 65 6d 70 6c 61 74 65 29  Loop *pTemplate)
285d0 7b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a  {.  WhereLoop **
285e0 70 70 50 72 65 76 2c 20 2a 70 3b 0a 20 20 57 68  ppPrev, *p;.  Wh
285f0 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20  ereInfo *pWInfo 
28600 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e  = pBuilder->pWIn
28610 66 6f 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  fo;.  sqlite3 *d
28620 62 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72  b = pWInfo->pPar
28630 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 49 66  se->db;..  /* If
28640 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65   pBuilder->pOrSe
28650 74 20 69 73 20 64 65 66 69 6e 65 64 2c 20 74 68  t is defined, th
28660 65 6e 20 6f 6e 6c 79 20 6b 65 65 70 20 74 72 61  en only keep tra
28670 63 6b 20 6f 66 20 74 68 65 20 63 6f 73 74 73 0a  ck of the costs.
28680 20 20 2a 2a 20 61 6e 64 20 70 72 65 72 65 71 73    ** and prereqs
28690 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 75  ..  */.  if( pBu
286a0 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 21 3d 30  ilder->pOrSet!=0
286b0 20 29 7b 0a 23 69 66 20 57 48 45 52 45 54 52 41   ){.#if WHERETRA
286c0 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20 75  CE_ENABLED.    u
286d0 31 36 20 6e 20 3d 20 70 42 75 69 6c 64 65 72 2d  16 n = pBuilder-
286e0 3e 70 4f 72 53 65 74 2d 3e 6e 3b 0a 20 20 20 20  >pOrSet->n;.    
286f0 69 6e 74 20 78 20 3d 0a 23 65 6e 64 69 66 0a 20  int x =.#endif. 
28700 20 20 20 77 68 65 72 65 4f 72 49 6e 73 65 72 74     whereOrInsert
28710 28 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65  (pBuilder->pOrSe
28720 74 2c 20 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72  t, pTemplate->pr
28730 65 72 65 71 2c 20 70 54 65 6d 70 6c 61 74 65 2d  ereq, pTemplate-
28740 3e 72 52 75 6e 2c 0a 20 20 20 20 20 20 20 20 20  >rRun,.         
28750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28760 20 20 20 20 20 20 20 20 20 20 20 70 54 65 6d 70             pTemp
28770 6c 61 74 65 2d 3e 6e 4f 75 74 29 3b 0a 23 69 66  late->nOut);.#if
28780 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42   WHERETRACE_ENAB
28790 4c 45 44 20 2f 2a 20 30 78 38 20 2a 2f 0a 20 20  LED /* 0x8 */.  
287a0 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65    if( sqlite3Whe
287b0 72 65 54 72 61 63 65 20 26 20 30 78 38 20 29 7b  reTrace & 0x8 ){
287c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65  .      sqlite3De
287d0 62 75 67 50 72 69 6e 74 66 28 78 3f 22 20 20 20  bugPrintf(x?"   
287e0 6f 72 2d 25 64 3a 20 20 22 3a 22 20 20 20 6f 72  or-%d:  ":"   or
287f0 2d 58 3a 20 20 22 2c 20 6e 29 3b 0a 20 20 20 20  -X:  ", n);.    
28800 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74    whereLoopPrint
28810 28 70 54 65 6d 70 6c 61 74 65 2c 20 70 42 75 69  (pTemplate, pBui
28820 6c 64 65 72 2d 3e 70 57 43 29 3b 0a 20 20 20 20  lder->pWC);.    
28830 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74  }.#endif.    ret
28840 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
28850 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 66 6f   }..  /* Look fo
28860 72 20 61 6e 20 65 78 69 73 74 69 6e 67 20 57 68  r an existing Wh
28870 65 72 65 4c 6f 6f 70 20 74 6f 20 72 65 70 6c 61  ereLoop to repla
28880 63 65 20 77 69 74 68 20 70 54 65 6d 70 6c 61 74  ce with pTemplat
28890 65 0a 20 20 2a 2f 0a 20 20 77 68 65 72 65 4c 6f  e.  */.  whereLo
288a0 6f 70 41 64 6a 75 73 74 43 6f 73 74 28 70 57 49  opAdjustCost(pWI
288b0 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 70 54 65  nfo->pLoops, pTe
288c0 6d 70 6c 61 74 65 29 3b 0a 20 20 70 70 50 72 65  mplate);.  ppPre
288d0 76 20 3d 20 77 68 65 72 65 4c 6f 6f 70 46 69 6e  v = whereLoopFin
288e0 64 4c 65 73 73 65 72 28 26 70 57 49 6e 66 6f 2d  dLesser(&pWInfo-
288f0 3e 70 4c 6f 6f 70 73 2c 20 70 54 65 6d 70 6c 61  >pLoops, pTempla
28900 74 65 29 3b 0a 0a 20 20 69 66 28 20 70 70 50 72  te);..  if( ppPr
28910 65 76 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  ev==0 ){.    /* 
28920 54 68 65 72 65 20 61 6c 72 65 61 64 79 20 65 78  There already ex
28930 69 73 74 73 20 61 20 57 68 65 72 65 4c 6f 6f 70  ists a WhereLoop
28940 20 6f 6e 20 74 68 65 20 6c 69 73 74 20 74 68 61   on the list tha
28950 74 20 69 73 20 62 65 74 74 65 72 0a 20 20 20 20  t is better.    
28960 2a 2a 20 74 68 61 6e 20 70 54 65 6d 70 6c 61 74  ** than pTemplat
28970 65 2c 20 73 6f 20 6a 75 73 74 20 69 67 6e 6f 72  e, so just ignor
28980 65 20 70 54 65 6d 70 6c 61 74 65 20 2a 2f 0a 23  e pTemplate */.#
28990 69 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  if WHERETRACE_EN
289a0 41 42 4c 45 44 20 2f 2a 20 30 78 38 20 2a 2f 0a  ABLED /* 0x8 */.
289b0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57      if( sqlite3W
289c0 68 65 72 65 54 72 61 63 65 20 26 20 30 78 38 20  hereTrace & 0x8 
289d0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
289e0 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 20  DebugPrintf("   
289f0 73 6b 69 70 3a 20 22 29 3b 0a 20 20 20 20 20 20  skip: ");.      
28a00 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70  whereLoopPrint(p
28a10 54 65 6d 70 6c 61 74 65 2c 20 70 42 75 69 6c 64  Template, pBuild
28a20 65 72 2d 3e 70 57 43 29 3b 0a 20 20 20 20 7d 0a  er->pWC);.    }.
28a30 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72  #endif.    retur
28a40 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 0a 20  n SQLITE_OK;  . 
28a50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20 3d 20   }else{.    p = 
28a60 2a 70 70 50 72 65 76 3b 0a 20 20 7d 0a 0a 20 20  *ppPrev;.  }..  
28a70 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74  /* If we reach t
28a80 68 69 73 20 70 6f 69 6e 74 20 69 74 20 6d 65 61  his point it mea
28a90 6e 73 20 74 68 61 74 20 65 69 74 68 65 72 20 70  ns that either p
28aa0 5b 5d 20 73 68 6f 75 6c 64 20 62 65 20 6f 76 65  [] should be ove
28ab0 72 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20 77 69  rwritten.  ** wi
28ac0 74 68 20 70 54 65 6d 70 6c 61 74 65 5b 5d 20 69  th pTemplate[] i
28ad0 66 20 70 5b 5d 20 65 78 69 73 74 73 2c 20 6f 72  f p[] exists, or
28ae0 20 69 66 20 70 3d 3d 4e 55 4c 4c 20 74 68 65 6e   if p==NULL then
28af0 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 0a   allocate a new.
28b00 20 20 2a 2a 20 57 68 65 72 65 4c 6f 6f 70 20 61    ** WhereLoop a
28b10 6e 64 20 69 6e 73 65 72 74 20 69 74 2e 0a 20 20  nd insert it..  
28b20 2a 2f 0a 23 69 66 20 57 48 45 52 45 54 52 41 43  */.#if WHERETRAC
28b30 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78 38  E_ENABLED /* 0x8
28b40 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65   */.  if( sqlite
28b50 33 57 68 65 72 65 54 72 61 63 65 20 26 20 30 78  3WhereTrace & 0x
28b60 38 20 29 7b 0a 20 20 20 20 69 66 28 20 70 21 3d  8 ){.    if( p!=
28b70 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
28b80 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 72  e3DebugPrintf("r
28b90 65 70 6c 61 63 65 3a 20 22 29 3b 0a 20 20 20 20  eplace: ");.    
28ba0 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74    whereLoopPrint
28bb0 28 70 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 57  (p, pBuilder->pW
28bc0 43 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  C);.    }.    sq
28bd0 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
28be0 28 22 20 20 20 20 61 64 64 3a 20 22 29 3b 0a 20  ("    add: ");. 
28bf0 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e     whereLoopPrin
28c00 74 28 70 54 65 6d 70 6c 61 74 65 2c 20 70 42 75  t(pTemplate, pBu
28c10 69 6c 64 65 72 2d 3e 70 57 43 29 3b 0a 20 20 7d  ilder->pWC);.  }
28c20 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 3d  .#endif.  if( p=
28c30 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6c 6c  =0 ){.    /* All
28c40 6f 63 61 74 65 20 61 20 6e 65 77 20 57 68 65 72  ocate a new Wher
28c50 65 4c 6f 6f 70 20 74 6f 20 61 64 64 20 74 6f 20  eLoop to add to 
28c60 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c  the end of the l
28c70 69 73 74 20 2a 2f 0a 20 20 20 20 2a 70 70 50 72  ist */.    *ppPr
28c80 65 76 20 3d 20 70 20 3d 20 73 71 6c 69 74 65 33  ev = p = sqlite3
28c90 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20  DbMallocRaw(db, 
28ca0 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70  sizeof(WhereLoop
28cb0 29 29 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d 30  ));.    if( p==0
28cc0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
28cd0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 77 68 65 72  _NOMEM;.    wher
28ce0 65 4c 6f 6f 70 49 6e 69 74 28 70 29 3b 0a 20 20  eLoopInit(p);.  
28cf0 20 20 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 20 3d    p->pNextLoop =
28d00 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
28d10 20 2f 2a 20 57 65 20 77 69 6c 6c 20 62 65 20 6f   /* We will be o
28d20 76 65 72 77 72 69 74 69 6e 67 20 57 68 65 72 65  verwriting Where
28d30 4c 6f 6f 70 20 70 5b 5d 2e 20 20 42 75 74 20 62  Loop p[].  But b
28d40 65 66 6f 72 65 20 77 65 20 64 6f 2c 20 66 69 72  efore we do, fir
28d50 73 74 0a 20 20 20 20 2a 2a 20 67 6f 20 74 68 72  st.    ** go thr
28d60 6f 75 67 68 20 74 68 65 20 72 65 73 74 20 6f 66  ough the rest of
28d70 20 74 68 65 20 6c 69 73 74 20 61 6e 64 20 64 65   the list and de
28d80 6c 65 74 65 20 61 6e 79 20 6f 74 68 65 72 20 65  lete any other e
28d90 6e 74 72 69 65 73 20 62 65 73 69 64 65 73 0a 20  ntries besides. 
28da0 20 20 20 2a 2a 20 70 5b 5d 20 74 68 61 74 20 61     ** p[] that a
28db0 72 65 20 61 6c 73 6f 20 73 75 70 70 6c 61 74 65  re also supplate
28dc0 64 20 62 79 20 70 54 65 6d 70 6c 61 74 65 20 2a  d by pTemplate *
28dd0 2f 0a 20 20 20 20 57 68 65 72 65 4c 6f 6f 70 20  /.    WhereLoop 
28de0 2a 2a 70 70 54 61 69 6c 20 3d 20 26 70 2d 3e 70  **ppTail = &p->p
28df0 4e 65 78 74 4c 6f 6f 70 3b 0a 20 20 20 20 57 68  NextLoop;.    Wh
28e00 65 72 65 4c 6f 6f 70 20 2a 70 54 6f 44 65 6c 3b  ereLoop *pToDel;
28e10 0a 20 20 20 20 77 68 69 6c 65 28 20 2a 70 70 54  .    while( *ppT
28e20 61 69 6c 20 29 7b 0a 20 20 20 20 20 20 70 70 54  ail ){.      ppT
28e30 61 69 6c 20 3d 20 77 68 65 72 65 4c 6f 6f 70 46  ail = whereLoopF
28e40 69 6e 64 4c 65 73 73 65 72 28 70 70 54 61 69 6c  indLesser(ppTail
28e50 2c 20 70 54 65 6d 70 6c 61 74 65 29 3b 0a 20 20  , pTemplate);.  
28e60 20 20 20 20 69 66 28 20 70 70 54 61 69 6c 3d 3d      if( ppTail==
28e70 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
28e80 20 70 54 6f 44 65 6c 20 3d 20 2a 70 70 54 61 69   pToDel = *ppTai
28e90 6c 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 6f  l;.      if( pTo
28ea0 44 65 6c 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  Del==0 ) break;.
28eb0 20 20 20 20 20 20 2a 70 70 54 61 69 6c 20 3d 20        *ppTail = 
28ec0 70 54 6f 44 65 6c 2d 3e 70 4e 65 78 74 4c 6f 6f  pToDel->pNextLoo
28ed0 70 3b 0a 23 69 66 20 57 48 45 52 45 54 52 41 43  p;.#if WHERETRAC
28ee0 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78 38  E_ENABLED /* 0x8
28ef0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 73 71   */.      if( sq
28f00 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20  lite3WhereTrace 
28f10 26 20 30 78 38 20 29 7b 0a 20 20 20 20 20 20 20  & 0x8 ){.       
28f20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
28f30 6e 74 66 28 22 20 64 65 6c 65 74 65 3a 20 22 29  ntf(" delete: ")
28f40 3b 0a 20 20 20 20 20 20 20 20 77 68 65 72 65 4c  ;.        whereL
28f50 6f 6f 70 50 72 69 6e 74 28 70 54 6f 44 65 6c 2c  oopPrint(pToDel,
28f60 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 29 3b   pBuilder->pWC);
28f70 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
28f80 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 44        whereLoopD
28f90 65 6c 65 74 65 28 64 62 2c 20 70 54 6f 44 65 6c  elete(db, pToDel
28fa0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 77  );.    }.  }.  w
28fb0 68 65 72 65 4c 6f 6f 70 58 66 65 72 28 64 62 2c  hereLoopXfer(db,
28fc0 20 70 2c 20 70 54 65 6d 70 6c 61 74 65 29 3b 0a   p, pTemplate);.
28fd0 20 20 69 66 28 20 28 70 2d 3e 77 73 46 6c 61 67    if( (p->wsFlag
28fe0 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41  s & WHERE_VIRTUA
28ff0 4c 54 41 42 4c 45 29 3d 3d 30 20 29 7b 0a 20 20  LTABLE)==0 ){.  
29000 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 20    Index *pIndex 
29010 3d 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  = p->u.btree.pIn
29020 64 65 78 3b 0a 20 20 20 20 69 66 28 20 70 49 6e  dex;.    if( pIn
29030 64 65 78 20 26 26 20 70 49 6e 64 65 78 2d 3e 74  dex && pIndex->t
29040 6e 75 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  num==0 ){.      
29050 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
29060 78 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  x = 0;.    }.  }
29070 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
29080 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  _OK;.}../*.** Ad
29090 6a 75 73 74 20 74 68 65 20 57 68 65 72 65 4c 6f  just the WhereLo
290a0 6f 70 2e 6e 4f 75 74 20 76 61 6c 75 65 20 64 6f  op.nOut value do
290b0 77 6e 77 61 72 64 20 74 6f 20 61 63 63 6f 75 6e  wnward to accoun
290c0 74 20 66 6f 72 20 74 65 72 6d 73 20 6f 66 20 74  t for terms of t
290d0 68 65 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75  he.** WHERE clau
290e0 73 65 20 74 68 61 74 20 72 65 66 65 72 65 6e 63  se that referenc
290f0 65 20 74 68 65 20 6c 6f 6f 70 20 62 75 74 20 77  e the loop but w
29100 68 69 63 68 20 61 72 65 20 6e 6f 74 20 75 73 65  hich are not use
29110 64 20 62 79 20 61 6e 0a 2a 2a 20 69 6e 64 65 78  d by an.** index
29120 2e 0a 2a 0a 2a 2a 20 46 6f 72 20 65 76 65 72 79  ..*.** For every
29130 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65   WHERE clause te
29140 72 6d 20 74 68 61 74 20 69 73 20 6e 6f 74 20 75  rm that is not u
29150 73 65 64 20 62 79 20 74 68 65 20 69 6e 64 65 78  sed by the index
29160 0a 2a 2a 20 61 6e 64 20 77 68 69 63 68 20 68 61  .** and which ha
29170 73 20 61 20 74 72 75 74 68 20 70 72 6f 62 61 62  s a truth probab
29180 69 6c 69 74 79 20 61 73 73 69 67 6e 65 64 20 62  ility assigned b
29190 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 69 6b  y one of the lik
291a0 65 6c 69 68 6f 6f 64 28 29 2c 0a 2a 2a 20 6c 69  elihood(),.** li
291b0 6b 65 6c 79 28 29 2c 20 6f 72 20 75 6e 6c 69 6b  kely(), or unlik
291c0 65 6c 79 28 29 20 53 51 4c 20 66 75 6e 63 74 69  ely() SQL functi
291d0 6f 6e 73 2c 20 72 65 64 75 63 65 20 74 68 65 20  ons, reduce the 
291e0 65 73 74 69 6d 61 74 65 64 20 6e 75 6d 62 65 72  estimated number
291f0 0a 2a 2a 20 6f 66 20 6f 75 74 70 75 74 20 72 6f  .** of output ro
29200 77 73 20 62 79 20 74 68 65 20 70 72 6f 62 61 62  ws by the probab
29210 69 6c 69 74 79 20 73 70 65 63 69 66 69 65 64 2e  ility specified.
29220 0a 2a 2a 0a 2a 2a 20 54 55 4e 49 4e 47 3a 20 20  .**.** TUNING:  
29230 46 6f 72 20 65 76 65 72 79 20 57 48 45 52 45 20  For every WHERE 
29240 63 6c 61 75 73 65 20 74 65 72 6d 20 74 68 61 74  clause term that
29250 20 69 73 20 6e 6f 74 20 75 73 65 64 20 62 79 20   is not used by 
29260 74 68 65 20 69 6e 64 65 78 0a 2a 2a 20 61 6e 64  the index.** and
29270 20 77 68 69 63 68 20 64 6f 65 73 20 6e 6f 74 20   which does not 
29280 68 61 76 65 20 61 6e 20 61 73 73 69 67 6e 65 64  have an assigned
29290 20 74 72 75 74 68 20 70 72 6f 62 61 62 69 6c 69   truth probabili
292a0 74 79 2c 20 68 65 75 72 69 73 74 69 63 73 0a 2a  ty, heuristics.*
292b0 2a 20 64 65 73 63 72 69 62 65 64 20 62 65 6c 6f  * described belo
292c0 77 20 61 72 65 20 75 73 65 64 20 74 6f 20 74 72  w are used to tr
292d0 79 20 74 6f 20 65 73 74 69 6d 61 74 65 20 74 68  y to estimate th
292e0 65 20 74 72 75 74 68 20 70 72 6f 62 61 62 69 6c  e truth probabil
292f0 69 74 79 2e 0a 2a 2a 20 54 4f 44 4f 20 2d 2d 3e  ity..** TODO -->
29300 20 50 65 72 68 61 70 73 20 74 68 69 73 20 69 73   Perhaps this is
29310 20 73 6f 6d 65 74 68 69 6e 67 20 74 68 61 74 20   something that 
29320 63 6f 75 6c 64 20 62 65 20 69 6d 70 72 6f 76 65  could be improve
29330 64 20 62 79 20 62 65 74 74 65 72 0a 2a 2a 20 74  d by better.** t
29340 61 62 6c 65 20 73 74 61 74 69 73 74 69 63 73 2e  able statistics.
29350 0a 2a 2a 0a 2a 2a 20 48 65 75 72 69 73 74 69 63  .**.** Heuristic
29360 20 31 3a 20 20 45 73 74 69 6d 61 74 65 20 74 68   1:  Estimate th
29370 65 20 74 72 75 74 68 20 70 72 6f 62 61 62 69 6c  e truth probabil
29380 69 74 79 20 61 73 20 39 33 2e 37 35 25 2e 20 20  ity as 93.75%.  
29390 54 68 65 20 39 33 2e 37 35 25 0a 2a 2a 20 76 61  The 93.75%.** va
293a0 6c 75 65 20 63 6f 72 72 65 73 70 6f 6e 64 73 20  lue corresponds 
293b0 74 6f 20 2d 31 20 69 6e 20 4c 6f 67 45 73 74 20  to -1 in LogEst 
293c0 6e 6f 74 61 74 69 6f 6e 2c 20 73 6f 20 74 68 69  notation, so thi
293d0 73 20 6d 65 61 6e 73 20 64 65 63 72 65 6d 65 6e  s means decremen
293e0 74 0a 2a 2a 20 74 68 65 20 57 68 65 72 65 4c 6f  t.** the WhereLo
293f0 6f 70 2e 6e 4f 75 74 20 66 69 65 6c 64 20 66 6f  op.nOut field fo
29400 72 20 65 76 65 72 79 20 73 75 63 68 20 57 48 45  r every such WHE
29410 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 2e 0a  RE clause term..
29420 2a 2a 0a 2a 2a 20 48 65 75 72 69 73 74 69 63 20  **.** Heuristic 
29430 32 3a 20 20 49 66 20 74 68 65 72 65 20 65 78 69  2:  If there exi
29440 73 74 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  sts one or more 
29450 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
29460 6d 73 20 6f 66 20 74 68 65 0a 2a 2a 20 66 6f 72  ms of the.** for
29470 6d 20 22 78 3d 3d 45 58 50 52 22 20 61 6e 64 20  m "x==EXPR" and 
29480 45 58 50 52 20 69 73 20 6e 6f 74 20 61 20 63 6f  EXPR is not a co
29490 6e 73 74 61 6e 74 20 30 20 6f 72 20 31 2c 20 74  nstant 0 or 1, t
294a0 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 20 74 68  hen make sure th
294b0 65 0a 2a 2a 20 66 69 6e 61 6c 20 6f 75 74 70 75  e.** final outpu
294c0 74 20 72 6f 77 20 65 73 74 69 6d 61 74 65 20 69  t row estimate i
294d0 73 20 6e 6f 20 67 72 65 61 74 65 72 20 74 68 61  s no greater tha
294e0 6e 20 31 2f 34 20 6f 66 20 74 68 65 20 74 6f 74  n 1/4 of the tot
294f0 61 6c 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20  al number.** of 
29500 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c  rows in the tabl
29510 65 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  e.  In other wor
29520 64 73 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20  ds, assume that 
29530 78 3d 3d 45 58 50 52 20 77 69 6c 6c 20 66 69 6c  x==EXPR will fil
29540 74 65 72 0a 2a 2a 20 6f 75 74 20 61 74 20 6c 65  ter.** out at le
29550 61 73 74 20 33 20 6f 75 74 20 6f 66 20 34 20 72  ast 3 out of 4 r
29560 6f 77 73 2e 20 20 49 66 20 45 58 50 52 20 69 73  ows.  If EXPR is
29570 20 2d 31 20 6f 72 20 30 20 6f 72 20 31 2c 20 74   -1 or 0 or 1, t
29580 68 65 6e 20 6d 61 79 62 65 20 74 68 65 0a 2a 2a  hen maybe the.**
29590 20 22 78 22 20 63 6f 6c 75 6d 6e 20 69 73 20 62   "x" column is b
295a0 6f 6f 6c 65 61 6e 20 6f 72 20 65 6c 73 65 20 2d  oolean or else -
295b0 31 20 6f 72 20 30 20 6f 72 20 31 20 69 73 20 61  1 or 0 or 1 is a
295c0 20 63 6f 6d 6d 6f 6e 20 64 65 66 61 75 6c 74 20   common default 
295d0 76 61 6c 75 65 0a 2a 2a 20 6f 6e 20 74 68 65 20  value.** on the 
295e0 22 78 22 20 63 6f 6c 75 6d 6e 20 61 6e 64 20 73  "x" column and s
295f0 6f 20 69 6e 20 74 68 61 74 20 63 61 73 65 20 6f  o in that case o
29600 6e 6c 79 20 63 61 70 20 74 68 65 20 6f 75 74 70  nly cap the outp
29610 75 74 20 72 6f 77 20 65 73 74 69 6d 61 74 65 0a  ut row estimate.
29620 2a 2a 20 61 74 20 31 2f 32 20 69 6e 73 74 65 61  ** at 1/2 instea
29630 64 20 6f 66 20 31 2f 34 2e 0a 2a 2f 0a 73 74 61  d of 1/4..*/.sta
29640 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 4c 6f  tic void whereLo
29650 6f 70 4f 75 74 70 75 74 41 64 6a 75 73 74 28 0a  opOutputAdjust(.
29660 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
29670 57 43 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  WC,      /* The 
29680 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
29690 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f    WhereLoop *pLo
296a0 6f 70 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  op,      /* The 
296b0 6c 6f 6f 70 20 74 6f 20 61 64 6a 75 73 74 20 64  loop to adjust d
296c0 6f 77 6e 77 61 72 64 20 2a 2f 0a 20 20 4c 6f 67  ownward */.  Log
296d0 45 73 74 20 6e 52 6f 77 20 20 20 20 20 20 20 20  Est nRow        
296e0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
296f0 20 72 6f 77 73 20 69 6e 20 74 68 65 20 65 6e 74   rows in the ent
29700 69 72 65 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a  ire table */.){.
29710 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
29720 72 6d 2c 20 2a 70 58 3b 0a 20 20 42 69 74 6d 61  rm, *pX;.  Bitma
29730 73 6b 20 6e 6f 74 41 6c 6c 6f 77 65 64 20 3d 20  sk notAllowed = 
29740 7e 28 70 4c 6f 6f 70 2d 3e 70 72 65 72 65 71 7c  ~(pLoop->prereq|
29750 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 29  pLoop->maskSelf)
29760 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 3b  ;.  int i, j, k;
29770 0a 20 20 4c 6f 67 45 73 74 20 69 52 65 64 75 63  .  LogEst iReduc
29780 65 20 3d 20 30 3b 20 20 20 20 2f 2a 20 70 4c 6f  e = 0;    /* pLo
29790 6f 70 2d 3e 6e 4f 75 74 20 73 68 6f 75 6c 64 20  op->nOut should 
297a0 6e 6f 74 20 65 78 63 65 65 64 20 6e 52 6f 77 2d  not exceed nRow-
297b0 69 52 65 64 75 63 65 20 2a 2f 0a 0a 20 20 61 73  iReduce */..  as
297c0 73 65 72 74 28 20 28 70 4c 6f 6f 70 2d 3e 77 73  sert( (pLoop->ws
297d0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 41 55  Flags & WHERE_AU
297e0 54 4f 5f 49 4e 44 45 58 29 3d 3d 30 20 29 3b 0a  TO_INDEX)==0 );.
297f0 20 20 66 6f 72 28 69 3d 70 57 43 2d 3e 6e 54 65    for(i=pWC->nTe
29800 72 6d 2c 20 70 54 65 72 6d 3d 70 57 43 2d 3e 61  rm, pTerm=pWC->a
29810 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 54 65 72  ; i>0; i--, pTer
29820 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 28 70  m++){.    if( (p
29830 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
29840 54 45 52 4d 5f 56 49 52 54 55 41 4c 29 21 3d 30  TERM_VIRTUAL)!=0
29850 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66   ) break;.    if
29860 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71  ( (pTerm->prereq
29870 41 6c 6c 20 26 20 70 4c 6f 6f 70 2d 3e 6d 61 73  All & pLoop->mas
29880 6b 53 65 6c 66 29 3d 3d 30 20 29 20 63 6f 6e 74  kSelf)==0 ) cont
29890 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 28 70  inue;.    if( (p
298a0 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20  Term->prereqAll 
298b0 26 20 6e 6f 74 41 6c 6c 6f 77 65 64 29 21 3d 30  & notAllowed)!=0
298c0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
298d0 20 66 6f 72 28 6a 3d 70 4c 6f 6f 70 2d 3e 6e 4c   for(j=pLoop->nL
298e0 54 65 72 6d 2d 31 3b 20 6a 3e 3d 30 3b 20 6a 2d  Term-1; j>=0; j-
298f0 2d 29 7b 0a 20 20 20 20 20 20 70 58 20 3d 20 70  -){.      pX = p
29900 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 3b  Loop->aLTerm[j];
29910 0a 20 20 20 20 20 20 69 66 28 20 70 58 3d 3d 30  .      if( pX==0
29920 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
29930 20 20 20 69 66 28 20 70 58 3d 3d 70 54 65 72 6d     if( pX==pTerm
29940 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
29950 69 66 28 20 70 58 2d 3e 69 50 61 72 65 6e 74 3e  if( pX->iParent>
29960 3d 30 20 26 26 20 28 26 70 57 43 2d 3e 61 5b 70  =0 && (&pWC->a[p
29970 58 2d 3e 69 50 61 72 65 6e 74 5d 29 3d 3d 70 54  X->iParent])==pT
29980 65 72 6d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  erm ) break;.   
29990 20 7d 0a 20 20 20 20 69 66 28 20 6a 3c 30 20 29   }.    if( j<0 )
299a0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72  {.      if( pTer
299b0 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3c 3d 30 20  m->truthProb<=0 
299c0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66  ){.        /* If
299d0 20 61 20 74 72 75 74 68 20 70 72 6f 62 61 62 69   a truth probabi
299e0 6c 69 74 79 20 69 73 20 73 70 65 63 69 66 69 65  lity is specifie
299f0 64 20 75 73 69 6e 67 20 74 68 65 20 6c 69 6b 65  d using the like
29a00 6c 69 68 6f 6f 64 28 29 20 68 69 6e 74 73 2c 0a  lihood() hints,.
29a10 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20          ** then 
29a20 75 73 65 20 74 68 65 20 70 72 6f 62 61 62 69 6c  use the probabil
29a30 69 74 79 20 70 72 6f 76 69 64 65 64 20 62 79 20  ity provided by 
29a40 74 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 2e  the application.
29a50 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f   */.        pLoo
29a60 70 2d 3e 6e 4f 75 74 20 2b 3d 20 70 54 65 72 6d  p->nOut += pTerm
29a70 2d 3e 74 72 75 74 68 50 72 6f 62 3b 0a 20 20 20  ->truthProb;.   
29a80 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
29a90 20 20 2f 2a 20 49 6e 20 74 68 65 20 61 62 73 65    /* In the abse
29aa0 6e 63 65 20 6f 66 20 65 78 70 6c 69 63 69 74 20  nce of explicit 
29ab0 74 72 75 74 68 20 70 72 6f 62 61 62 69 6c 69 74  truth probabilit
29ac0 69 65 73 2c 20 75 73 65 20 68 65 75 72 69 73 74  ies, use heurist
29ad0 69 63 73 20 74 6f 0a 20 20 20 20 20 20 20 20 2a  ics to.        *
29ae0 2a 20 67 75 65 73 73 20 61 20 72 65 61 73 6f 6e  * guess a reason
29af0 61 62 6c 65 20 74 72 75 74 68 20 70 72 6f 62 61  able truth proba
29b00 62 69 6c 69 74 79 2e 20 2a 2f 0a 20 20 20 20 20  bility. */.     
29b10 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 2d 2d     pLoop->nOut--
29b20 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54  ;.        if( pT
29b30 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 26 57  erm->eOperator&W
29b40 4f 5f 45 51 20 29 7b 0a 20 20 20 20 20 20 20 20  O_EQ ){.        
29b50 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d    Expr *pRight =
29b60 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70   pTerm->pExpr->p
29b70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 20  Right;.         
29b80 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
29b90 49 73 49 6e 74 65 67 65 72 28 70 52 69 67 68 74  IsInteger(pRight
29ba0 2c 20 26 6b 29 20 26 26 20 6b 3e 3d 28 2d 31 29  , &k) && k>=(-1)
29bb0 20 26 26 20 6b 3c 3d 31 20 29 7b 0a 20 20 20 20   && k<=1 ){.    
29bc0 20 20 20 20 20 20 20 20 6b 20 3d 20 31 30 3b 0a          k = 10;.
29bd0 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
29be0 0a 20 20 20 20 20 20 20 20 20 20 20 20 6b 20 3d  .            k =
29bf0 20 32 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   20;.          }
29c00 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
29c10 52 65 64 75 63 65 3c 6b 20 29 20 69 52 65 64 75  Reduce<k ) iRedu
29c20 63 65 20 3d 20 6b 3b 0a 20 20 20 20 20 20 20 20  ce = k;.        
29c30 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
29c40 20 20 7d 0a 20 20 69 66 28 20 70 4c 6f 6f 70 2d    }.  if( pLoop-
29c50 3e 6e 4f 75 74 20 3e 20 6e 52 6f 77 2d 69 52 65  >nOut > nRow-iRe
29c60 64 75 63 65 20 29 20 20 70 4c 6f 6f 70 2d 3e 6e  duce )  pLoop->n
29c70 4f 75 74 20 3d 20 6e 52 6f 77 20 2d 20 69 52 65  Out = nRow - iRe
29c80 64 75 63 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  duce;.}../*.** A
29c90 64 6a 75 73 74 20 74 68 65 20 63 6f 73 74 20 43  djust the cost C
29ca0 20 62 79 20 74 68 65 20 63 6f 73 74 4d 75 6c 74   by the costMult
29cb0 20 66 61 63 74 65 72 20 54 2e 20 20 54 68 69 73   facter T.  This
29cc0 20 6f 6e 6c 79 20 6f 63 63 75 72 73 20 69 66 0a   only occurs if.
29cd0 2a 2a 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68  ** compiled with
29ce0 20 2d 44 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45   -DSQLITE_ENABLE
29cf0 5f 43 4f 53 54 4d 55 4c 54 0a 2a 2f 0a 23 69 66  _COSTMULT.*/.#if
29d00 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
29d10 45 5f 43 4f 53 54 4d 55 4c 54 0a 23 20 64 65 66  E_COSTMULT.# def
29d20 69 6e 65 20 41 70 70 6c 79 43 6f 73 74 4d 75 6c  ine ApplyCostMul
29d30 74 69 70 6c 69 65 72 28 43 2c 54 29 20 20 43 20  tiplier(C,T)  C 
29d40 2b 3d 20 54 0a 23 65 6c 73 65 0a 23 20 64 65 66  += T.#else.# def
29d50 69 6e 65 20 41 70 70 6c 79 43 6f 73 74 4d 75 6c  ine ApplyCostMul
29d60 74 69 70 6c 69 65 72 28 43 2c 54 29 0a 23 65 6e  tiplier(C,T).#en
29d70 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 65 20 68 61  dif../*.** We ha
29d80 76 65 20 73 6f 20 66 61 72 20 6d 61 74 63 68 65  ve so far matche
29d90 64 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77  d pBuilder->pNew
29da0 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 74 65  ->u.btree.nEq te
29db0 72 6d 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20 69  rms of the .** i
29dc0 6e 64 65 78 20 70 49 6e 64 65 78 2e 20 54 72 79  ndex pIndex. Try
29dd0 20 74 6f 20 6d 61 74 63 68 20 6f 6e 65 20 6d 6f   to match one mo
29de0 72 65 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74  re..**.** When t
29df0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
29e00 63 61 6c 6c 65 64 2c 20 70 42 75 69 6c 64 65 72  called, pBuilder
29e10 2d 3e 70 4e 65 77 2d 3e 6e 4f 75 74 20 63 6f 6e  ->pNew->nOut con
29e20 74 61 69 6e 73 20 74 68 65 20 0a 2a 2a 20 6e 75  tains the .** nu
29e30 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 65 78 70  mber of rows exp
29e40 65 63 74 65 64 20 74 6f 20 62 65 20 76 69 73 69  ected to be visi
29e50 74 65 64 20 62 79 20 66 69 6c 74 65 72 69 6e 67  ted by filtering
29e60 20 75 73 69 6e 67 20 74 68 65 20 6e 45 71 20 0a   using the nEq .
29e70 2a 2a 20 74 65 72 6d 73 20 6f 6e 6c 79 2e 20 49  ** terms only. I
29e80 66 20 69 74 20 69 73 20 6d 6f 64 69 66 69 65 64  f it is modified
29e90 2c 20 74 68 69 73 20 76 61 6c 75 65 20 69 73 20  , this value is 
29ea0 72 65 73 74 6f 72 65 64 20 62 65 66 6f 72 65 20  restored before 
29eb0 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f  this .** functio
29ec0 6e 20 72 65 74 75 72 6e 73 2e 0a 2a 2a 0a 2a 2a  n returns..**.**
29ed0 20 49 66 20 70 50 72 6f 62 65 2d 3e 74 6e 75 6d   If pProbe->tnum
29ee0 3d 3d 30 2c 20 74 68 61 74 20 6d 65 61 6e 73 20  ==0, that means 
29ef0 70 49 6e 64 65 78 20 69 73 20 61 20 66 61 6b 65  pIndex is a fake
29f00 20 69 6e 64 65 78 20 75 73 65 64 20 66 6f 72 20   index used for 
29f10 74 68 65 0a 2a 2a 20 49 4e 54 45 47 45 52 20 50  the.** INTEGER P
29f20 52 49 4d 41 52 59 20 4b 45 59 2e 0a 2a 2f 0a 73  RIMARY KEY..*/.s
29f30 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c  tatic int whereL
29f40 6f 6f 70 41 64 64 42 74 72 65 65 49 6e 64 65 78  oopAddBtreeIndex
29f50 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69  (.  WhereLoopBui
29f60 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 20  lder *pBuilder, 
29f70 20 20 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65      /* The Where
29f80 4c 6f 6f 70 20 66 61 63 74 6f 72 79 20 2a 2f 0a  Loop factory */.
29f90 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
29fa0 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20 20 20 20  _item *pSrc,    
29fb0 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65    /* FROM clause
29fc0 20 74 65 72 6d 20 62 65 69 6e 67 20 61 6e 61 6c   term being anal
29fd0 79 7a 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20  yzed */.  Index 
29fe0 2a 70 50 72 6f 62 65 2c 20 20 20 20 20 20 20 20  *pProbe,        
29ff0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20            /* An 
2a000 69 6e 64 65 78 20 6f 6e 20 70 53 72 63 20 2a 2f  index on pSrc */
2a010 0a 20 20 4c 6f 67 45 73 74 20 6e 49 6e 4d 75 6c  .  LogEst nInMul
2a020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a030 20 20 20 2f 2a 20 6c 6f 67 28 4e 75 6d 62 65 72     /* log(Number
2a040 20 6f 66 20 69 74 65 72 61 74 69 6f 6e 73 20 64   of iterations d
2a050 75 65 20 74 6f 20 49 4e 29 20 2a 2f 0a 29 7b 0a  ue to IN) */.){.
2a060 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
2a070 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  nfo = pBuilder->
2a080 70 57 49 6e 66 6f 3b 20 20 2f 2a 20 57 48 45 52  pWInfo;  /* WHER
2a090 45 20 61 6e 61 6c 79 73 65 20 63 6f 6e 74 65 78  E analyse contex
2a0a0 74 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50  t */.  Parse *pP
2a0b0 61 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  arse = pWInfo->p
2a0c0 50 61 72 73 65 3b 20 20 20 20 20 20 20 20 2f 2a  Parse;        /*
2a0d0 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
2a0e0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
2a0f0 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20  b = pParse->db; 
2a100 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
2a110 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6d 61 6c  e connection mal
2a120 6c 6f 63 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  loc context */. 
2a130 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77   WhereLoop *pNew
2a140 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2a150 20 2f 2a 20 54 65 6d 70 6c 61 74 65 20 57 68 65   /* Template Whe
2a160 72 65 4c 6f 6f 70 20 75 6e 64 65 72 20 63 6f 6e  reLoop under con
2a170 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 57  struction */.  W
2a180 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b  hereTerm *pTerm;
2a190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a1a0 2a 20 41 20 57 68 65 72 65 54 65 72 6d 20 75 6e  * A WhereTerm un
2a1b0 64 65 72 20 63 6f 6e 73 69 64 65 72 61 74 69 6f  der consideratio
2a1c0 6e 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 4d 61 73  n */.  int opMas
2a1d0 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
2a1e0 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 69 64 20         /* Valid 
2a1f0 6f 70 65 72 61 74 6f 72 73 20 66 6f 72 20 63 6f  operators for co
2a200 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 57  nstraints */.  W
2a210 68 65 72 65 53 63 61 6e 20 73 63 61 6e 3b 20 20  hereScan scan;  
2a220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a230 2a 20 49 74 65 72 61 74 6f 72 20 66 6f 72 20 57  * Iterator for W
2a240 48 45 52 45 20 74 65 72 6d 73 20 2a 2f 0a 20 20  HERE terms */.  
2a250 42 69 74 6d 61 73 6b 20 73 61 76 65 64 5f 70 72  Bitmask saved_pr
2a260 65 72 65 71 3b 20 20 20 20 20 20 20 20 20 20 20  ereq;           
2a270 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75  /* Original valu
2a280 65 20 6f 66 20 70 4e 65 77 2d 3e 70 72 65 72 65  e of pNew->prere
2a290 71 20 2a 2f 0a 20 20 75 31 36 20 73 61 76 65 64  q */.  u16 saved
2a2a0 5f 6e 4c 54 65 72 6d 3b 20 20 20 20 20 20 20 20  _nLTerm;        
2a2b0 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e         /* Origin
2a2c0 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77  al value of pNew
2a2d0 2d 3e 6e 4c 54 65 72 6d 20 2a 2f 0a 20 20 75 31  ->nLTerm */.  u1
2a2e0 36 20 73 61 76 65 64 5f 6e 45 71 3b 20 20 20 20  6 saved_nEq;    
2a2f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2a300 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20   Original value 
2a310 6f 66 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65  of pNew->u.btree
2a320 2e 6e 45 71 20 2a 2f 0a 20 20 75 31 36 20 73 61  .nEq */.  u16 sa
2a330 76 65 64 5f 6e 53 6b 69 70 3b 20 20 20 20 20 20  ved_nSkip;      
2a340 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69            /* Ori
2a350 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70  ginal value of p
2a360 4e 65 77 2d 3e 6e 53 6b 69 70 20 2a 2f 0a 20 20  New->nSkip */.  
2a370 75 33 32 20 73 61 76 65 64 5f 77 73 46 6c 61 67  u32 saved_wsFlag
2a380 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
2a390 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75  /* Original valu
2a3a0 65 20 6f 66 20 70 4e 65 77 2d 3e 77 73 46 6c 61  e of pNew->wsFla
2a3b0 67 73 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 73  gs */.  LogEst s
2a3c0 61 76 65 64 5f 6e 4f 75 74 3b 20 20 20 20 20 20  aved_nOut;      
2a3d0 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69          /* Origi
2a3e0 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65  nal value of pNe
2a3f0 77 2d 3e 6e 4f 75 74 20 2a 2f 0a 20 20 69 6e 74  w->nOut */.  int
2a400 20 69 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20   iCol;          
2a410 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2a420 49 6e 64 65 78 20 6f 66 20 74 68 65 20 63 6f 6c  Index of the col
2a430 75 6d 6e 20 69 6e 20 74 68 65 20 74 61 62 6c 65  umn in the table
2a440 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
2a450 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
2a460 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
2a470 63 6f 64 65 20 2a 2f 0a 20 20 4c 6f 67 45 73 74  code */.  LogEst
2a480 20 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20   rSize;         
2a490 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
2a4a0 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74  ber of rows in t
2a4b0 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 4c 6f  he table */.  Lo
2a4c0 67 45 73 74 20 72 4c 6f 67 53 69 7a 65 3b 20 20  gEst rLogSize;  
2a4d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2a4e0 20 4c 6f 67 61 72 69 74 68 6d 20 6f 66 20 74 61   Logarithm of ta
2a4f0 62 6c 65 20 73 69 7a 65 20 2a 2f 0a 20 20 57 68  ble size */.  Wh
2a500 65 72 65 54 65 72 6d 20 2a 70 54 6f 70 20 3d 20  ereTerm *pTop = 
2a510 30 2c 20 2a 70 42 74 6d 20 3d 20 30 3b 20 2f 2a  0, *pBtm = 0; /*
2a520 20 54 6f 70 20 61 6e 64 20 62 6f 74 74 6f 6d 20   Top and bottom 
2a530 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74  range constraint
2a540 73 20 2a 2f 0a 0a 20 20 70 4e 65 77 20 3d 20 70  s */..  pNew = p
2a550 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20  Builder->pNew;. 
2a560 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
2a570 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20 53  ailed ) return S
2a580 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 0a 20 20  QLITE_NOMEM;..  
2a590 61 73 73 65 72 74 28 20 28 70 4e 65 77 2d 3e 77  assert( (pNew->w
2a5a0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56  sFlags & WHERE_V
2a5b0 49 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30 20  IRTUALTABLE)==0 
2a5c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 4e  );.  assert( (pN
2a5d0 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  ew->wsFlags & WH
2a5e0 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 3d 3d  ERE_TOP_LIMIT)==
2a5f0 30 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d  0 );.  if( pNew-
2a600 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
2a610 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20 20  _BTM_LIMIT ){.  
2a620 20 20 6f 70 4d 61 73 6b 20 3d 20 57 4f 5f 4c 54    opMask = WO_LT
2a630 7c 57 4f 5f 4c 45 3b 0a 20 20 7d 65 6c 73 65 20  |WO_LE;.  }else 
2a640 69 66 28 20 70 50 72 6f 62 65 2d 3e 74 6e 75 6d  if( pProbe->tnum
2a650 3c 3d 30 20 7c 7c 20 28 70 53 72 63 2d 3e 6a 6f  <=0 || (pSrc->jo
2a660 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45 46 54  intype & JT_LEFT
2a670 29 21 3d 30 20 29 7b 0a 20 20 20 20 6f 70 4d 61  )!=0 ){.    opMa
2a680 73 6b 20 3d 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e  sk = WO_EQ|WO_IN
2a690 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f  |WO_GT|WO_GE|WO_
2a6a0 4c 54 7c 57 4f 5f 4c 45 3b 0a 20 20 7d 65 6c 73  LT|WO_LE;.  }els
2a6b0 65 7b 0a 20 20 20 20 6f 70 4d 61 73 6b 20 3d 20  e{.    opMask = 
2a6c0 57 4f 5f 45 51 7c 57 4f 5f 49 4e 7c 57 4f 5f 49  WO_EQ|WO_IN|WO_I
2a6d0 53 4e 55 4c 4c 7c 57 4f 5f 47 54 7c 57 4f 5f 47  SNULL|WO_GT|WO_G
2a6e0 45 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 3b 0a 20  E|WO_LT|WO_LE;. 
2a6f0 20 7d 0a 20 20 69 66 28 20 70 50 72 6f 62 65 2d   }.  if( pProbe-
2a700 3e 62 55 6e 6f 72 64 65 72 65 64 20 29 20 6f 70  >bUnordered ) op
2a710 4d 61 73 6b 20 26 3d 20 7e 28 57 4f 5f 47 54 7c  Mask &= ~(WO_GT|
2a720 57 4f 5f 47 45 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c  WO_GE|WO_LT|WO_L
2a730 45 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  E);..  assert( p
2a740 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
2a750 3c 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e  <pProbe->nColumn
2a760 20 29 3b 0a 20 20 69 43 6f 6c 20 3d 20 70 50 72   );.  iCol = pPr
2a770 6f 62 65 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 70 4e  obe->aiColumn[pN
2a780 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 5d  ew->u.btree.nEq]
2a790 3b 0a 0a 20 20 70 54 65 72 6d 20 3d 20 77 68 65  ;..  pTerm = whe
2a7a0 72 65 53 63 61 6e 49 6e 69 74 28 26 73 63 61 6e  reScanInit(&scan
2a7b0 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 2c  , pBuilder->pWC,
2a7c0 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 2c 20   pSrc->iCursor, 
2a7d0 69 43 6f 6c 2c 0a 20 20 20 20 20 20 20 20 20 20  iCol,.          
2a7e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 70                op
2a7f0 4d 61 73 6b 2c 20 70 50 72 6f 62 65 29 3b 0a 20  Mask, pProbe);. 
2a800 20 73 61 76 65 64 5f 6e 45 71 20 3d 20 70 4e 65   saved_nEq = pNe
2a810 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a  w->u.btree.nEq;.
2a820 20 20 73 61 76 65 64 5f 6e 53 6b 69 70 20 3d 20    saved_nSkip = 
2a830 70 4e 65 77 2d 3e 6e 53 6b 69 70 3b 0a 20 20 73  pNew->nSkip;.  s
2a840 61 76 65 64 5f 6e 4c 54 65 72 6d 20 3d 20 70 4e  aved_nLTerm = pN
2a850 65 77 2d 3e 6e 4c 54 65 72 6d 3b 0a 20 20 73 61  ew->nLTerm;.  sa
2a860 76 65 64 5f 77 73 46 6c 61 67 73 20 3d 20 70 4e  ved_wsFlags = pN
2a870 65 77 2d 3e 77 73 46 6c 61 67 73 3b 0a 20 20 73  ew->wsFlags;.  s
2a880 61 76 65 64 5f 70 72 65 72 65 71 20 3d 20 70 4e  aved_prereq = pN
2a890 65 77 2d 3e 70 72 65 72 65 71 3b 0a 20 20 73 61  ew->prereq;.  sa
2a8a0 76 65 64 5f 6e 4f 75 74 20 3d 20 70 4e 65 77 2d  ved_nOut = pNew-
2a8b0 3e 6e 4f 75 74 3b 0a 20 20 70 4e 65 77 2d 3e 72  >nOut;.  pNew->r
2a8c0 53 65 74 75 70 20 3d 20 30 3b 0a 20 20 72 53 69  Setup = 0;.  rSi
2a8d0 7a 65 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69 52  ze = pProbe->aiR
2a8e0 6f 77 4c 6f 67 45 73 74 5b 30 5d 3b 0a 20 20 72  owLogEst[0];.  r
2a8f0 4c 6f 67 53 69 7a 65 20 3d 20 65 73 74 4c 6f 67  LogSize = estLog
2a900 28 72 53 69 7a 65 29 3b 0a 20 20 66 6f 72 28 3b  (rSize);.  for(;
2a910 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
2a920 26 20 70 54 65 72 6d 21 3d 30 3b 20 70 54 65 72  & pTerm!=0; pTer
2a930 6d 20 3d 20 77 68 65 72 65 53 63 61 6e 4e 65 78  m = whereScanNex
2a940 74 28 26 73 63 61 6e 29 29 7b 0a 20 20 20 20 75  t(&scan)){.    u
2a950 31 36 20 65 4f 70 20 3d 20 70 54 65 72 6d 2d 3e  16 eOp = pTerm->
2a960 65 4f 70 65 72 61 74 6f 72 3b 20 20 20 2f 2a 20  eOperator;   /* 
2a970 53 68 6f 72 74 68 61 6e 64 20 66 6f 72 20 70 54  Shorthand for pT
2a980 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 2a  erm->eOperator *
2a990 2f 0a 20 20 20 20 4c 6f 67 45 73 74 20 72 43 6f  /.    LogEst rCo
2a9a0 73 74 49 64 78 3b 0a 20 20 20 20 4c 6f 67 45 73  stIdx;.    LogEs
2a9b0 74 20 6e 4f 75 74 55 6e 61 64 6a 75 73 74 65 64  t nOutUnadjusted
2a9c0 3b 20 20 20 20 20 20 20 20 2f 2a 20 6e 4f 75 74  ;        /* nOut
2a9d0 20 62 65 66 6f 72 65 20 49 4e 28 29 20 61 6e 64   before IN() and
2a9e0 20 57 48 45 52 45 20 61 64 6a 75 73 74 6d 65 6e   WHERE adjustmen
2a9f0 74 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 49  ts */.    int nI
2aa00 6e 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51  n = 0;.#ifdef SQ
2aa10 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
2aa20 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 20 20 69  3_OR_STAT4.    i
2aa30 6e 74 20 6e 52 65 63 56 61 6c 69 64 20 3d 20 70  nt nRecValid = p
2aa40 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c  Builder->nRecVal
2aa50 69 64 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69  id;.#endif.    i
2aa60 66 28 20 28 65 4f 70 3d 3d 57 4f 5f 49 53 4e 55  f( (eOp==WO_ISNU
2aa70 4c 4c 20 7c 7c 20 28 70 54 65 72 6d 2d 3e 77 74  LL || (pTerm->wt
2aa80 46 6c 61 67 73 26 54 45 52 4d 5f 56 4e 55 4c 4c  Flags&TERM_VNULL
2aa90 29 21 3d 30 29 0a 20 20 20 20 20 26 26 20 28 69  )!=0).     && (i
2aaa0 43 6f 6c 3c 30 20 7c 7c 20 70 53 72 63 2d 3e 70  Col<0 || pSrc->p
2aab0 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
2aac0 6e 6f 74 4e 75 6c 6c 29 0a 20 20 20 20 29 7b 0a  notNull).    ){.
2aad0 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20        continue; 
2aae0 2f 2a 20 69 67 6e 6f 72 65 20 49 53 20 5b 4e 4f  /* ignore IS [NO
2aaf0 54 5d 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69  T] NULL constrai
2ab00 6e 74 73 20 6f 6e 20 4e 4f 54 20 4e 55 4c 4c 20  nts on NOT NULL 
2ab10 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 7d  columns */.    }
2ab20 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e  .    if( pTerm->
2ab30 70 72 65 72 65 71 52 69 67 68 74 20 26 20 70 4e  prereqRight & pN
2ab40 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 20 29 20 63  ew->maskSelf ) c
2ab50 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a  ontinue;..    /*
2ab60 20 44 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20 74 68   Do not allow th
2ab70 65 20 75 70 70 65 72 20 62 6f 75 6e 64 20 6f 66  e upper bound of
2ab80 20 61 20 4c 49 4b 45 20 6f 70 74 69 6d 69 7a 61   a LIKE optimiza
2ab90 74 69 6f 6e 20 72 61 6e 67 65 20 63 6f 6e 73 74  tion range const
2aba0 72 61 69 6e 74 0a 20 20 20 20 2a 2a 20 74 6f 20  raint.    ** to 
2abb0 6d 69 78 20 77 69 74 68 20 61 20 6c 6f 77 65 72  mix with a lower
2abc0 20 72 61 6e 67 65 20 62 6f 75 6e 64 20 66 72 6f   range bound fro
2abd0 6d 20 73 6f 6d 65 20 6f 74 68 65 72 20 73 6f 75  m some other sou
2abe0 72 63 65 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  rce */.    if( p
2abf0 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
2ac00 54 45 52 4d 5f 4c 49 4b 45 4f 50 54 20 26 26 20  TERM_LIKEOPT && 
2ac10 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
2ac20 3d 3d 57 4f 5f 4c 54 20 29 20 63 6f 6e 74 69 6e  ==WO_LT ) contin
2ac30 75 65 3b 0a 0a 20 20 20 20 70 4e 65 77 2d 3e 77  ue;..    pNew->w
2ac40 73 46 6c 61 67 73 20 3d 20 73 61 76 65 64 5f 77  sFlags = saved_w
2ac50 73 46 6c 61 67 73 3b 0a 20 20 20 20 70 4e 65 77  sFlags;.    pNew
2ac60 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20  ->u.btree.nEq = 
2ac70 73 61 76 65 64 5f 6e 45 71 3b 0a 20 20 20 20 70  saved_nEq;.    p
2ac80 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 73 61  New->nLTerm = sa
2ac90 76 65 64 5f 6e 4c 54 65 72 6d 3b 0a 20 20 20 20  ved_nLTerm;.    
2aca0 69 66 28 20 77 68 65 72 65 4c 6f 6f 70 52 65 73  if( whereLoopRes
2acb0 69 7a 65 28 64 62 2c 20 70 4e 65 77 2c 20 70 4e  ize(db, pNew, pN
2acc0 65 77 2d 3e 6e 4c 54 65 72 6d 2b 31 29 20 29 20  ew->nLTerm+1) ) 
2acd0 62 72 65 61 6b 3b 20 2f 2a 20 4f 4f 4d 20 2a 2f  break; /* OOM */
2ace0 0a 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72  .    pNew->aLTer
2acf0 6d 5b 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b 2b  m[pNew->nLTerm++
2ad00 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 70  ] = pTerm;.    p
2ad10 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 28 73  New->prereq = (s
2ad20 61 76 65 64 5f 70 72 65 72 65 71 20 7c 20 70 54  aved_prereq | pT
2ad30 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
2ad40 29 20 26 20 7e 70 4e 65 77 2d 3e 6d 61 73 6b 53  ) & ~pNew->maskS
2ad50 65 6c 66 3b 0a 0a 20 20 20 20 61 73 73 65 72 74  elf;..    assert
2ad60 28 20 6e 49 6e 4d 75 6c 3d 3d 30 0a 20 20 20 20  ( nInMul==0.    
2ad70 20 20 20 20 7c 7c 20 28 70 4e 65 77 2d 3e 77 73      || (pNew->ws
2ad80 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f  Flags & WHERE_CO
2ad90 4c 55 4d 4e 5f 4e 55 4c 4c 29 21 3d 30 20 0a 20  LUMN_NULL)!=0 . 
2ada0 20 20 20 20 20 20 20 7c 7c 20 28 70 4e 65 77 2d         || (pNew-
2adb0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
2adc0 5f 43 4f 4c 55 4d 4e 5f 49 4e 29 21 3d 30 20 0a  _COLUMN_IN)!=0 .
2add0 20 20 20 20 20 20 20 20 7c 7c 20 28 70 4e 65 77          || (pNew
2ade0 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
2adf0 45 5f 53 4b 49 50 53 43 41 4e 29 21 3d 30 20 0a  E_SKIPSCAN)!=0 .
2ae00 20 20 20 20 29 3b 0a 0a 20 20 20 20 69 66 28 20      );..    if( 
2ae10 65 4f 70 20 26 20 57 4f 5f 49 4e 20 29 7b 0a 20  eOp & WO_IN ){. 
2ae20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72       Expr *pExpr
2ae30 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b   = pTerm->pExpr;
2ae40 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46  .      pNew->wsF
2ae50 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f  lags |= WHERE_CO
2ae60 4c 55 4d 4e 5f 49 4e 3b 0a 20 20 20 20 20 20 69  LUMN_IN;.      i
2ae70 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
2ae80 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73  ty(pExpr, EP_xIs
2ae90 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20  Select) ){.     
2aea0 20 20 20 2f 2a 20 22 78 20 49 4e 20 28 53 45 4c     /* "x IN (SEL
2aeb0 45 43 54 20 2e 2e 2e 29 22 3a 20 20 54 55 4e 49  ECT ...)":  TUNI
2aec0 4e 47 3a 20 74 68 65 20 53 45 4c 45 43 54 20 72  NG: the SELECT r
2aed0 65 74 75 72 6e 73 20 32 35 20 72 6f 77 73 20 2a  eturns 25 rows *
2aee0 2f 0a 20 20 20 20 20 20 20 20 6e 49 6e 20 3d 20  /.        nIn = 
2aef0 34 36 3b 20 20 61 73 73 65 72 74 28 20 34 36 3d  46;  assert( 46=
2af00 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 32  =sqlite3LogEst(2
2af10 35 29 20 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  5) );.      }els
2af20 65 20 69 66 28 20 41 4c 57 41 59 53 28 70 45 78  e if( ALWAYS(pEx
2af30 70 72 2d 3e 78 2e 70 4c 69 73 74 20 26 26 20 70  pr->x.pList && p
2af40 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e  Expr->x.pList->n
2af50 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20  Expr) ){.       
2af60 20 2f 2a 20 22 78 20 49 4e 20 28 76 61 6c 75 65   /* "x IN (value
2af70 2c 20 76 61 6c 75 65 2c 20 2e 2e 2e 29 22 20 2a  , value, ...)" *
2af80 2f 0a 20 20 20 20 20 20 20 20 6e 49 6e 20 3d 20  /.        nIn = 
2af90 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 70 45  sqlite3LogEst(pE
2afa0 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45  xpr->x.pList->nE
2afb0 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  xpr);.      }.  
2afc0 20 20 20 20 61 73 73 65 72 74 28 20 6e 49 6e 3e      assert( nIn>
2afd0 30 20 29 3b 20 20 2f 2a 20 52 48 53 20 61 6c 77  0 );  /* RHS alw
2afe0 61 79 73 20 68 61 73 20 32 20 6f 72 20 6d 6f 72  ays has 2 or mor
2aff0 65 20 74 65 72 6d 73 2e 2e 2e 20 20 54 68 65 20  e terms...  The 
2b000 70 61 72 73 65 72 0a 20 20 20 20 20 20 20 20 20  parser.         
2b010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
2b020 2a 20 63 68 61 6e 67 65 73 20 22 78 20 49 4e 20  * changes "x IN 
2b030 28 3f 29 22 20 69 6e 74 6f 20 22 78 3d 3f 22 2e  (?)" into "x=?".
2b040 20 2a 2f 0a 0a 20 20 20 20 7d 65 6c 73 65 20 69   */..    }else i
2b050 66 28 20 65 4f 70 20 26 20 28 57 4f 5f 45 51 29  f( eOp & (WO_EQ)
2b060 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e   ){.      pNew->
2b070 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45  wsFlags |= WHERE
2b080 5f 43 4f 4c 55 4d 4e 5f 45 51 3b 0a 20 20 20 20  _COLUMN_EQ;.    
2b090 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 7c 7c 20    if( iCol<0 || 
2b0a0 28 6e 49 6e 4d 75 6c 3d 3d 30 20 26 26 20 70 4e  (nInMul==0 && pN
2b0b0 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3d  ew->u.btree.nEq=
2b0c0 3d 70 50 72 6f 62 65 2d 3e 6e 4b 65 79 43 6f 6c  =pProbe->nKeyCol
2b0d0 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  -1) ){.        i
2b0e0 66 28 20 69 43 6f 6c 3e 3d 30 20 26 26 20 21 49  f( iCol>=0 && !I
2b0f0 73 55 6e 69 71 75 65 49 6e 64 65 78 28 70 50 72  sUniqueIndex(pPr
2b100 6f 62 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20  obe) ){.        
2b110 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20    pNew->wsFlags 
2b120 7c 3d 20 57 48 45 52 45 5f 55 4e 51 5f 57 41 4e  |= WHERE_UNQ_WAN
2b130 54 45 44 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  TED;.        }el
2b140 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e  se{.          pN
2b150 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57  ew->wsFlags |= W
2b160 48 45 52 45 5f 4f 4e 45 52 4f 57 3b 0a 20 20 20  HERE_ONEROW;.   
2b170 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
2b180 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 4f 70     }else if( eOp
2b190 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 7b 0a   & WO_ISNULL ){.
2b1a0 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c        pNew->wsFl
2b1b0 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c  ags |= WHERE_COL
2b1c0 55 4d 4e 5f 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65  UMN_NULL;.    }e
2b1d0 6c 73 65 20 69 66 28 20 65 4f 70 20 26 20 28 57  lse if( eOp & (W
2b1e0 4f 5f 47 54 7c 57 4f 5f 47 45 29 20 29 7b 0a 20  O_GT|WO_GE) ){. 
2b1f0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65       testcase( e
2b200 4f 70 20 26 20 57 4f 5f 47 54 20 29 3b 0a 20 20  Op & WO_GT );.  
2b210 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65 4f      testcase( eO
2b220 70 20 26 20 57 4f 5f 47 45 20 29 3b 0a 20 20 20  p & WO_GE );.   
2b230 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73     pNew->wsFlags
2b240 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e   |= WHERE_COLUMN
2b250 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f 42 54 4d  _RANGE|WHERE_BTM
2b260 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20 70 42  _LIMIT;.      pB
2b270 74 6d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20  tm = pTerm;.    
2b280 20 20 70 54 6f 70 20 3d 20 30 3b 0a 20 20 20 20    pTop = 0;.    
2b290 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46    if( pTerm->wtF
2b2a0 6c 61 67 73 20 26 20 54 45 52 4d 5f 4c 49 4b 45  lags & TERM_LIKE
2b2b0 4f 50 54 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  OPT ){.        /
2b2c0 2a 20 52 61 6e 67 65 20 63 6f 6e 74 72 61 69 6e  * Range contrain
2b2d0 74 73 20 74 68 61 74 20 63 6f 6d 65 20 66 72 6f  ts that come fro
2b2e0 6d 20 74 68 65 20 4c 49 4b 45 20 6f 70 74 69 6d  m the LIKE optim
2b2f0 69 7a 61 74 69 6f 6e 20 61 72 65 0a 20 20 20 20  ization are.    
2b300 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 75 73      ** always us
2b310 65 64 20 69 6e 20 70 61 69 72 73 2e 20 2a 2f 0a  ed in pairs. */.
2b320 20 20 20 20 20 20 20 20 70 54 6f 70 20 3d 20 26          pTop = &
2b330 70 54 65 72 6d 5b 31 5d 3b 0a 20 20 20 20 20 20  pTerm[1];.      
2b340 20 20 61 73 73 65 72 74 28 20 28 70 54 6f 70 2d    assert( (pTop-
2b350 28 70 54 65 72 6d 2d 3e 70 57 43 2d 3e 61 29 29  (pTerm->pWC->a))
2b360 3c 70 54 65 72 6d 2d 3e 70 57 43 2d 3e 6e 54 65  <pTerm->pWC->nTe
2b370 72 6d 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  rm );.        as
2b380 73 65 72 74 28 20 70 54 6f 70 2d 3e 77 74 46 6c  sert( pTop->wtFl
2b390 61 67 73 20 26 20 54 45 52 4d 5f 4c 49 4b 45 4f  ags & TERM_LIKEO
2b3a0 50 54 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  PT );.        as
2b3b0 73 65 72 74 28 20 70 54 6f 70 2d 3e 65 4f 70 65  sert( pTop->eOpe
2b3c0 72 61 74 6f 72 3d 3d 57 4f 5f 4c 54 20 29 3b 0a  rator==WO_LT );.
2b3d0 20 20 20 20 20 20 20 20 69 66 28 20 77 68 65 72          if( wher
2b3e0 65 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62 2c 20  eLoopResize(db, 
2b3f0 70 4e 65 77 2c 20 70 4e 65 77 2d 3e 6e 4c 54 65  pNew, pNew->nLTe
2b400 72 6d 2b 31 29 20 29 20 62 72 65 61 6b 3b 20 2f  rm+1) ) break; /
2b410 2a 20 4f 4f 4d 20 2a 2f 0a 20 20 20 20 20 20 20  * OOM */.       
2b420 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 70 4e   pNew->aLTerm[pN
2b430 65 77 2d 3e 6e 4c 54 65 72 6d 2b 2b 5d 20 3d 20  ew->nLTerm++] = 
2b440 70 54 6f 70 3b 0a 20 20 20 20 20 20 20 20 70 4e  pTop;.        pN
2b450 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57  ew->wsFlags |= W
2b460 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 3b 0a  HERE_TOP_LIMIT;.
2b470 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
2b480 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
2b490 20 65 4f 70 20 26 20 28 57 4f 5f 4c 54 7c 57 4f   eOp & (WO_LT|WO
2b4a0 5f 4c 45 29 20 29 3b 0a 20 20 20 20 20 20 74 65  _LE) );.      te
2b4b0 73 74 63 61 73 65 28 20 65 4f 70 20 26 20 57 4f  stcase( eOp & WO
2b4c0 5f 4c 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _LT );.      tes
2b4d0 74 63 61 73 65 28 20 65 4f 70 20 26 20 57 4f 5f  tcase( eOp & WO_
2b4e0 4c 45 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77  LE );.      pNew
2b4f0 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45  ->wsFlags |= WHE
2b500 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c  RE_COLUMN_RANGE|
2b510 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 3b  WHERE_TOP_LIMIT;
2b520 0a 20 20 20 20 20 20 70 54 6f 70 20 3d 20 70 54  .      pTop = pT
2b530 65 72 6d 3b 0a 20 20 20 20 20 20 70 42 74 6d 20  erm;.      pBtm 
2b540 3d 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73  = (pNew->wsFlags
2b550 20 26 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d   & WHERE_BTM_LIM
2b560 49 54 29 21 3d 30 20 3f 0a 20 20 20 20 20 20 20  IT)!=0 ?.       
2b570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4e                pN
2b580 65 77 2d 3e 61 4c 54 65 72 6d 5b 70 4e 65 77 2d  ew->aLTerm[pNew-
2b590 3e 6e 4c 54 65 72 6d 2d 32 5d 20 3a 20 30 3b 0a  >nLTerm-2] : 0;.
2b5a0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 74      }..    /* At
2b5b0 20 74 68 69 73 20 70 6f 69 6e 74 20 70 4e 65 77   this point pNew
2b5c0 2d 3e 6e 4f 75 74 20 69 73 20 73 65 74 20 74 6f  ->nOut is set to
2b5d0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
2b5e0 6f 77 73 20 65 78 70 65 63 74 65 64 20 74 6f 0a  ows expected to.
2b5f0 20 20 20 20 2a 2a 20 62 65 20 76 69 73 69 74 65      ** be visite
2b600 64 20 62 79 20 74 68 65 20 69 6e 64 65 78 20 73  d by the index s
2b610 63 61 6e 20 62 65 66 6f 72 65 20 63 6f 6e 73 69  can before consi
2b620 64 65 72 69 6e 67 20 74 65 72 6d 20 70 54 65 72  dering term pTer
2b630 6d 2c 20 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a  m, or the.    **
2b640 20 76 61 6c 75 65 73 20 6f 66 20 6e 49 6e 20 61   values of nIn a
2b650 6e 64 20 6e 49 6e 4d 75 6c 2e 20 49 6e 20 6f 74  nd nInMul. In ot
2b660 68 65 72 20 77 6f 72 64 73 2c 20 61 73 73 75 6d  her words, assum
2b670 69 6e 67 20 74 68 61 74 20 61 6c 6c 20 0a 20 20  ing that all .  
2b680 20 20 2a 2a 20 22 78 20 49 4e 28 2e 2e 2e 29 22    ** "x IN(...)"
2b690 20 74 65 72 6d 73 20 61 72 65 20 72 65 70 6c 61   terms are repla
2b6a0 63 65 64 20 77 69 74 68 20 22 78 20 3d 20 3f 22  ced with "x = ?"
2b6b0 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20 75 70 64  . This block upd
2b6c0 61 74 65 73 0a 20 20 20 20 2a 2a 20 74 68 65 20  ates.    ** the 
2b6d0 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 6e  value of pNew->n
2b6e0 4f 75 74 20 74 6f 20 61 63 63 6f 75 6e 74 20 66  Out to account f
2b6f0 6f 72 20 70 54 65 72 6d 20 28 62 75 74 20 6e 6f  or pTerm (but no
2b700 74 20 6e 49 6e 2f 6e 49 6e 4d 75 6c 29 2e 20 20  t nIn/nInMul).  
2b710 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
2b720 4e 65 77 2d 3e 6e 4f 75 74 3d 3d 73 61 76 65 64  New->nOut==saved
2b730 5f 6e 4f 75 74 20 29 3b 0a 20 20 20 20 69 66 28  _nOut );.    if(
2b740 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26   pNew->wsFlags &
2b750 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41   WHERE_COLUMN_RA
2b760 4e 47 45 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  NGE ){.      /* 
2b770 41 64 6a 75 73 74 20 6e 4f 75 74 20 75 73 69 6e  Adjust nOut usin
2b780 67 20 73 74 61 74 33 2f 73 74 61 74 34 20 64 61  g stat3/stat4 da
2b790 74 61 2e 20 4f 72 2c 20 69 66 20 74 68 65 72 65  ta. Or, if there
2b7a0 20 69 73 20 6e 6f 20 73 74 61 74 33 2f 73 74 61   is no stat3/sta
2b7b0 74 34 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61  t4.      ** data
2b7c0 2c 20 75 73 69 6e 67 20 73 6f 6d 65 20 6f 74 68  , using some oth
2b7d0 65 72 20 65 73 74 69 6d 61 74 65 2e 20 20 2a 2f  er estimate.  */
2b7e0 0a 20 20 20 20 20 20 77 68 65 72 65 52 61 6e 67  .      whereRang
2b7f0 65 53 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c  eScanEst(pParse,
2b800 20 70 42 75 69 6c 64 65 72 2c 20 70 42 74 6d 2c   pBuilder, pBtm,
2b810 20 70 54 6f 70 2c 20 70 4e 65 77 29 3b 0a 20 20   pTop, pNew);.  
2b820 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
2b830 6e 74 20 6e 45 71 20 3d 20 2b 2b 70 4e 65 77 2d  nt nEq = ++pNew-
2b840 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20  >u.btree.nEq;.  
2b850 20 20 20 20 61 73 73 65 72 74 28 20 65 4f 70 20      assert( eOp 
2b860 26 20 28 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f  & (WO_ISNULL|WO_
2b870 45 51 7c 57 4f 5f 49 4e 29 20 29 3b 0a 0a 20 20  EQ|WO_IN) );..  
2b880 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77      assert( pNew
2b890 2d 3e 6e 4f 75 74 3d 3d 73 61 76 65 64 5f 6e 4f  ->nOut==saved_nO
2b8a0 75 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ut );.      if( 
2b8b0 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62  pTerm->truthProb
2b8c0 3c 3d 30 20 26 26 20 69 43 6f 6c 3e 3d 30 20 29  <=0 && iCol>=0 )
2b8d0 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
2b8e0 28 20 28 65 4f 70 20 26 20 57 4f 5f 49 4e 29 20  ( (eOp & WO_IN) 
2b8f0 7c 7c 20 6e 49 6e 3d 3d 30 20 29 3b 0a 20 20 20  || nIn==0 );.   
2b900 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65       testcase( e
2b910 4f 70 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20 20  Op & WO_IN );.  
2b920 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74        pNew->nOut
2b930 20 2b 3d 20 70 54 65 72 6d 2d 3e 74 72 75 74 68   += pTerm->truth
2b940 50 72 6f 62 3b 0a 20 20 20 20 20 20 20 20 70 4e  Prob;.        pN
2b950 65 77 2d 3e 6e 4f 75 74 20 2d 3d 20 6e 49 6e 3b  ew->nOut -= nIn;
2b960 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 23 69  .      }else{.#i
2b970 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
2b980 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54  LE_STAT3_OR_STAT
2b990 34 0a 20 20 20 20 20 20 20 20 74 52 6f 77 63 6e  4.        tRowcn
2b9a0 74 20 6e 4f 75 74 20 3d 20 30 3b 0a 20 20 20 20  t nOut = 0;.    
2b9b0 20 20 20 20 69 66 28 20 6e 49 6e 4d 75 6c 3d 3d      if( nInMul==
2b9c0 30 20 0a 20 20 20 20 20 20 20 20 20 26 26 20 70  0 .         && p
2b9d0 50 72 6f 62 65 2d 3e 6e 53 61 6d 70 6c 65 20 0a  Probe->nSample .
2b9e0 20 20 20 20 20 20 20 20 20 26 26 20 70 4e 65 77           && pNew
2b9f0 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3c 3d 70  ->u.btree.nEq<=p
2ba00 50 72 6f 62 65 2d 3e 6e 53 61 6d 70 6c 65 43 6f  Probe->nSampleCo
2ba10 6c 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 28  l.         && ((
2ba20 65 4f 70 20 26 20 57 4f 5f 49 4e 29 3d 3d 30 20  eOp & WO_IN)==0 
2ba30 7c 7c 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  || !ExprHasPrope
2ba40 72 74 79 28 70 54 65 72 6d 2d 3e 70 45 78 70 72  rty(pTerm->pExpr
2ba50 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 29  , EP_xIsSelect))
2ba60 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
2ba70 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70        Expr *pExp
2ba80 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  r = pTerm->pExpr
2ba90 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2baa0 28 65 4f 70 20 26 20 28 57 4f 5f 45 51 7c 57 4f  (eOp & (WO_EQ|WO
2bab0 5f 49 53 4e 55 4c 4c 29 29 21 3d 30 20 29 7b 0a  _ISNULL))!=0 ){.
2bac0 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
2bad0 63 61 73 65 28 20 65 4f 70 20 26 20 57 4f 5f 45  case( eOp & WO_E
2bae0 51 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Q );.           
2baf0 20 74 65 73 74 63 61 73 65 28 20 65 4f 70 20 26   testcase( eOp &
2bb00 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20   WO_ISNULL );.  
2bb10 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 77            rc = w
2bb20 68 65 72 65 45 71 75 61 6c 53 63 61 6e 45 73 74  hereEqualScanEst
2bb30 28 70 50 61 72 73 65 2c 20 70 42 75 69 6c 64 65  (pParse, pBuilde
2bb40 72 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  r, pExpr->pRight
2bb50 2c 20 26 6e 4f 75 74 29 3b 0a 20 20 20 20 20 20  , &nOut);.      
2bb60 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2bb70 20 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72         rc = wher
2bb80 65 49 6e 53 63 61 6e 45 73 74 28 70 50 61 72 73  eInScanEst(pPars
2bb90 65 2c 20 70 42 75 69 6c 64 65 72 2c 20 70 45 78  e, pBuilder, pEx
2bba0 70 72 2d 3e 78 2e 70 4c 69 73 74 2c 20 26 6e 4f  pr->x.pList, &nO
2bbb0 75 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ut);.          }
2bbc0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
2bbd0 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55  c==SQLITE_NOTFOU
2bbe0 4e 44 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45  ND ) rc = SQLITE
2bbf0 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 69  _OK;.          i
2bc00 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2bc10 20 29 20 62 72 65 61 6b 3b 20 20 20 20 20 20 20   ) break;       
2bc20 20 20 20 2f 2a 20 4a 75 6d 70 20 6f 75 74 20 6f     /* Jump out o
2bc30 66 20 74 68 65 20 70 54 65 72 6d 20 6c 6f 6f 70  f the pTerm loop
2bc40 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
2bc50 28 20 6e 4f 75 74 20 29 7b 0a 20 20 20 20 20 20  ( nOut ){.      
2bc60 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74        pNew->nOut
2bc70 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
2bc80 28 6e 4f 75 74 29 3b 0a 20 20 20 20 20 20 20 20  (nOut);.        
2bc90 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 6e 4f      if( pNew->nO
2bca0 75 74 3e 73 61 76 65 64 5f 6e 4f 75 74 20 29 20  ut>saved_nOut ) 
2bcb0 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76  pNew->nOut = sav
2bcc0 65 64 5f 6e 4f 75 74 3b 0a 20 20 20 20 20 20 20  ed_nOut;.       
2bcd0 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20       pNew->nOut 
2bce0 2d 3d 20 6e 49 6e 3b 0a 20 20 20 20 20 20 20 20  -= nIn;.        
2bcf0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
2bd00 20 20 20 20 20 20 69 66 28 20 6e 4f 75 74 3d 3d        if( nOut==
2bd10 30 20 29 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  0 ).#endif.     
2bd20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 70     {.          p
2bd30 4e 65 77 2d 3e 6e 4f 75 74 20 2b 3d 20 28 70 50  New->nOut += (pP
2bd40 72 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73  robe->aiRowLogEs
2bd50 74 5b 6e 45 71 5d 20 2d 20 70 50 72 6f 62 65 2d  t[nEq] - pProbe-
2bd60 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 6e 45 71  >aiRowLogEst[nEq
2bd70 2d 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  -1]);.          
2bd80 69 66 28 20 65 4f 70 20 26 20 57 4f 5f 49 53 4e  if( eOp & WO_ISN
2bd90 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ULL ){.         
2bda0 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 49 66     /* TUNING: If
2bdb0 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6c 69 6b   there is no lik
2bdc0 65 6c 69 68 6f 6f 64 28 29 20 76 61 6c 75 65 2c  elihood() value,
2bdd0 20 61 73 73 75 6d 65 20 74 68 61 74 20 61 20 0a   assume that a .
2bde0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 22              ** "
2bdf0 63 6f 6c 20 49 53 20 4e 55 4c 4c 22 20 65 78 70  col IS NULL" exp
2be00 72 65 73 73 69 6f 6e 20 6d 61 74 63 68 65 73 20  ression matches 
2be10 74 77 69 63 65 20 61 73 20 6d 61 6e 79 20 72 6f  twice as many ro
2be20 77 73 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  ws .            
2be30 2a 2a 20 61 73 20 28 63 6f 6c 3d 3f 29 2e 20 2a  ** as (col=?). *
2be40 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4e  /.            pN
2be50 65 77 2d 3e 6e 4f 75 74 20 2b 3d 20 31 30 3b 0a  ew->nOut += 10;.
2be60 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2be70 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
2be80 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20    }..    /* Set 
2be90 72 43 6f 73 74 49 64 78 20 74 6f 20 74 68 65 20  rCostIdx to the 
2bea0 63 6f 73 74 20 6f 66 20 76 69 73 69 74 69 6e 67  cost of visiting
2beb0 20 73 65 6c 65 63 74 65 64 20 72 6f 77 73 20 69   selected rows i
2bec0 6e 20 69 6e 64 65 78 2e 20 41 64 64 0a 20 20 20  n index. Add.   
2bed0 20 2a 2a 20 69 74 20 74 6f 20 70 4e 65 77 2d 3e   ** it to pNew->
2bee0 72 52 75 6e 2c 20 77 68 69 63 68 20 69 73 20 63  rRun, which is c
2bef0 75 72 72 65 6e 74 6c 79 20 73 65 74 20 74 6f 20  urrently set to 
2bf00 74 68 65 20 63 6f 73 74 20 6f 66 20 74 68 65 20  the cost of the 
2bf10 69 6e 64 65 78 0a 20 20 20 20 2a 2a 20 73 65 65  index.    ** see
2bf20 6b 20 6f 6e 6c 79 2e 20 54 68 65 6e 2c 20 69 66  k only. Then, if
2bf30 20 74 68 69 73 20 69 73 20 61 20 6e 6f 6e 2d 63   this is a non-c
2bf40 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 2c 20 61  overing index, a
2bf50 64 64 20 74 68 65 20 63 6f 73 74 20 6f 66 0a 20  dd the cost of. 
2bf60 20 20 20 2a 2a 20 76 69 73 69 74 69 6e 67 20 74     ** visiting t
2bf70 68 65 20 72 6f 77 73 20 69 6e 20 74 68 65 20 6d  he rows in the m
2bf80 61 69 6e 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20  ain table.  */. 
2bf90 20 20 20 72 43 6f 73 74 49 64 78 20 3d 20 70 4e     rCostIdx = pN
2bfa0 65 77 2d 3e 6e 4f 75 74 20 2b 20 31 20 2b 20 28  ew->nOut + 1 + (
2bfb0 31 35 2a 70 50 72 6f 62 65 2d 3e 73 7a 49 64 78  15*pProbe->szIdx
2bfc0 52 6f 77 29 2f 70 53 72 63 2d 3e 70 54 61 62 2d  Row)/pSrc->pTab-
2bfd0 3e 73 7a 54 61 62 52 6f 77 3b 0a 20 20 20 20 70  >szTabRow;.    p
2bfe0 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 73 71 6c 69  New->rRun = sqli
2bff0 74 65 33 4c 6f 67 45 73 74 41 64 64 28 72 4c 6f  te3LogEstAdd(rLo
2c000 67 53 69 7a 65 2c 20 72 43 6f 73 74 49 64 78 29  gSize, rCostIdx)
2c010 3b 0a 20 20 20 20 69 66 28 20 28 70 4e 65 77 2d  ;.    if( (pNew-
2c020 3e 77 73 46 6c 61 67 73 20 26 20 28 57 48 45 52  >wsFlags & (WHER
2c030 45 5f 49 44 58 5f 4f 4e 4c 59 7c 57 48 45 52 45  E_IDX_ONLY|WHERE
2c040 5f 49 50 4b 29 29 3d 3d 30 20 29 7b 0a 20 20 20  _IPK))==0 ){.   
2c050 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20     pNew->rRun = 
2c060 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64  sqlite3LogEstAdd
2c070 28 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 70 4e 65  (pNew->rRun, pNe
2c080 77 2d 3e 6e 4f 75 74 20 2b 20 31 36 29 3b 0a 20  w->nOut + 16);. 
2c090 20 20 20 7d 0a 20 20 20 20 41 70 70 6c 79 43 6f     }.    ApplyCo
2c0a0 73 74 4d 75 6c 74 69 70 6c 69 65 72 28 70 4e 65  stMultiplier(pNe
2c0b0 77 2d 3e 72 52 75 6e 2c 20 70 50 72 6f 62 65 2d  w->rRun, pProbe-
2c0c0 3e 70 54 61 62 6c 65 2d 3e 63 6f 73 74 4d 75 6c  >pTable->costMul
2c0d0 74 29 3b 0a 0a 20 20 20 20 6e 4f 75 74 55 6e 61  t);..    nOutUna
2c0e0 64 6a 75 73 74 65 64 20 3d 20 70 4e 65 77 2d 3e  djusted = pNew->
2c0f0 6e 4f 75 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  nOut;.    pNew->
2c100 72 52 75 6e 20 2b 3d 20 6e 49 6e 4d 75 6c 20 2b  rRun += nInMul +
2c110 20 6e 49 6e 3b 0a 20 20 20 20 70 4e 65 77 2d 3e   nIn;.    pNew->
2c120 6e 4f 75 74 20 2b 3d 20 6e 49 6e 4d 75 6c 20 2b  nOut += nInMul +
2c130 20 6e 49 6e 3b 0a 20 20 20 20 77 68 65 72 65 4c   nIn;.    whereL
2c140 6f 6f 70 4f 75 74 70 75 74 41 64 6a 75 73 74 28  oopOutputAdjust(
2c150 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 2c 20 70  pBuilder->pWC, p
2c160 4e 65 77 2c 20 72 53 69 7a 65 29 3b 0a 20 20 20  New, rSize);.   
2c170 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49   rc = whereLoopI
2c180 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20  nsert(pBuilder, 
2c190 70 4e 65 77 29 3b 0a 0a 20 20 20 20 69 66 28 20  pNew);..    if( 
2c1a0 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20  pNew->wsFlags & 
2c1b0 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e  WHERE_COLUMN_RAN
2c1c0 47 45 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77  GE ){.      pNew
2c1d0 2d 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e  ->nOut = saved_n
2c1e0 4f 75 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  Out;.    }else{.
2c1f0 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74        pNew->nOut
2c200 20 3d 20 6e 4f 75 74 55 6e 61 64 6a 75 73 74 65   = nOutUnadjuste
2c210 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  d;.    }..    if
2c220 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73  ( (pNew->wsFlags
2c230 20 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d   & WHERE_TOP_LIM
2c240 49 54 29 3d 3d 30 0a 20 20 20 20 20 26 26 20 70  IT)==0.     && p
2c250 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
2c260 3c 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e  <pProbe->nColumn
2c270 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 77 68  .    ){.      wh
2c280 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 49  ereLoopAddBtreeI
2c290 6e 64 65 78 28 70 42 75 69 6c 64 65 72 2c 20 70  ndex(pBuilder, p
2c2a0 53 72 63 2c 20 70 50 72 6f 62 65 2c 20 6e 49 6e  Src, pProbe, nIn
2c2b0 4d 75 6c 2b 6e 49 6e 29 3b 0a 20 20 20 20 7d 0a  Mul+nIn);.    }.
2c2c0 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d      pNew->nOut =
2c2d0 20 73 61 76 65 64 5f 6e 4f 75 74 3b 0a 23 69 66   saved_nOut;.#if
2c2e0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
2c2f0 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34  E_STAT3_OR_STAT4
2c300 0a 20 20 20 20 70 42 75 69 6c 64 65 72 2d 3e 6e  .    pBuilder->n
2c310 52 65 63 56 61 6c 69 64 20 3d 20 6e 52 65 63 56  RecValid = nRecV
2c320 61 6c 69 64 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  alid;.#endif.  }
2c330 0a 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20  .  pNew->prereq 
2c340 3d 20 73 61 76 65 64 5f 70 72 65 72 65 71 3b 0a  = saved_prereq;.
2c350 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e    pNew->u.btree.
2c360 6e 45 71 20 3d 20 73 61 76 65 64 5f 6e 45 71 3b  nEq = saved_nEq;
2c370 0a 20 20 70 4e 65 77 2d 3e 6e 53 6b 69 70 20 3d  .  pNew->nSkip =
2c380 20 73 61 76 65 64 5f 6e 53 6b 69 70 3b 0a 20 20   saved_nSkip;.  
2c390 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20  pNew->wsFlags = 
2c3a0 73 61 76 65 64 5f 77 73 46 6c 61 67 73 3b 0a 20  saved_wsFlags;. 
2c3b0 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 61   pNew->nOut = sa
2c3c0 76 65 64 5f 6e 4f 75 74 3b 0a 20 20 70 4e 65 77  ved_nOut;.  pNew
2c3d0 2d 3e 6e 4c 54 65 72 6d 20 3d 20 73 61 76 65 64  ->nLTerm = saved
2c3e0 5f 6e 4c 54 65 72 6d 3b 0a 0a 20 20 2f 2a 20 43  _nLTerm;..  /* C
2c3f0 6f 6e 73 69 64 65 72 20 75 73 69 6e 67 20 61 20  onsider using a 
2c400 73 6b 69 70 2d 73 63 61 6e 20 69 66 20 74 68 65  skip-scan if the
2c410 72 65 20 61 72 65 20 6e 6f 20 57 48 45 52 45 20  re are no WHERE 
2c420 63 6c 61 75 73 65 20 63 6f 6e 73 74 72 61 69 6e  clause constrain
2c430 74 73 0a 20 20 2a 2a 20 61 76 61 69 6c 61 62 6c  ts.  ** availabl
2c440 65 20 66 6f 72 20 74 68 65 20 6c 65 66 74 2d 6d  e for the left-m
2c450 6f 73 74 20 74 65 72 6d 73 20 6f 66 20 74 68 65  ost terms of the
2c460 20 69 6e 64 65 78 2c 20 61 6e 64 20 69 66 20 74   index, and if t
2c470 68 65 20 61 76 65 72 61 67 65 0a 20 20 2a 2a 20  he average.  ** 
2c480 6e 75 6d 62 65 72 20 6f 66 20 72 65 70 65 61 74  number of repeat
2c490 73 20 69 6e 20 74 68 65 20 6c 65 66 74 2d 6d 6f  s in the left-mo
2c4a0 73 74 20 74 65 72 6d 73 20 69 73 20 61 74 20 6c  st terms is at l
2c4b0 65 61 73 74 20 31 38 2e 20 0a 20 20 2a 2a 0a 20  east 18. .  **. 
2c4c0 20 2a 2a 20 54 68 65 20 6d 61 67 69 63 20 6e 75   ** The magic nu
2c4d0 6d 62 65 72 20 31 38 20 69 73 20 73 65 6c 65 63  mber 18 is selec
2c4e0 74 65 64 20 6f 6e 20 74 68 65 20 62 61 73 69 73  ted on the basis
2c4f0 20 74 68 61 74 20 73 63 61 6e 6e 69 6e 67 20 31   that scanning 1
2c500 37 20 72 6f 77 73 0a 20 20 2a 2a 20 69 73 20 61  7 rows.  ** is a
2c510 6c 6d 6f 73 74 20 61 6c 77 61 79 73 20 71 75 69  lmost always qui
2c520 63 6b 65 72 20 74 68 61 6e 20 61 6e 20 69 6e 64  cker than an ind
2c530 65 78 20 73 65 65 6b 20 28 65 76 65 6e 20 74 68  ex seek (even th
2c540 6f 75 67 68 20 69 66 20 74 68 65 20 69 6e 64 65  ough if the inde
2c550 78 0a 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20  x.  ** contains 
2c560 66 65 77 65 72 20 74 68 61 6e 20 32 5e 31 37 20  fewer than 2^17 
2c570 72 6f 77 73 20 77 65 20 61 73 73 75 6d 65 20 6f  rows we assume o
2c580 74 68 65 72 77 69 73 65 20 69 6e 20 6f 74 68 65  therwise in othe
2c590 72 20 70 61 72 74 73 20 6f 66 0a 20 20 2a 2a 20  r parts of.  ** 
2c5a0 74 68 65 20 63 6f 64 65 29 2e 20 41 6e 64 2c 20  the code). And, 
2c5b0 65 76 65 6e 20 69 66 20 69 74 20 69 73 20 6e 6f  even if it is no
2c5c0 74 2c 20 69 74 20 73 68 6f 75 6c 64 20 6e 6f 74  t, it should not
2c5d0 20 62 65 20 74 6f 6f 20 6d 75 63 68 20 73 6c 6f   be too much slo
2c5e0 77 65 72 2e 20 0a 20 20 2a 2a 20 4f 6e 20 74 68  wer. .  ** On th
2c5f0 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 74 68  e other hand, th
2c600 65 20 65 78 74 72 61 20 73 65 65 6b 73 20 63 6f  e extra seeks co
2c610 75 6c 64 20 65 6e 64 20 75 70 20 62 65 69 6e 67  uld end up being
2c620 20 73 69 67 6e 69 66 69 63 61 6e 74 6c 79 0a 20   significantly. 
2c630 20 2a 2a 20 6d 6f 72 65 20 65 78 70 65 6e 73 69   ** more expensi
2c640 76 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  ve.  */.  assert
2c650 28 20 34 32 3d 3d 73 71 6c 69 74 65 33 4c 6f 67  ( 42==sqlite3Log
2c660 45 73 74 28 31 38 29 20 29 3b 0a 20 20 69 66 28  Est(18) );.  if(
2c670 20 73 61 76 65 64 5f 6e 45 71 3d 3d 73 61 76 65   saved_nEq==save
2c680 64 5f 6e 53 6b 69 70 0a 20 20 20 26 26 20 73 61  d_nSkip.   && sa
2c690 76 65 64 5f 6e 45 71 2b 31 3c 70 50 72 6f 62 65  ved_nEq+1<pProbe
2c6a0 2d 3e 6e 4b 65 79 43 6f 6c 0a 20 20 20 26 26 20  ->nKeyCol.   && 
2c6b0 70 50 72 6f 62 65 2d 3e 6e 6f 53 6b 69 70 53 63  pProbe->noSkipSc
2c6c0 61 6e 3d 3d 30 0a 20 20 20 26 26 20 70 50 72 6f  an==0.   && pPro
2c6d0 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b  be->aiRowLogEst[
2c6e0 73 61 76 65 64 5f 6e 45 71 2b 31 5d 3e 3d 34 32  saved_nEq+1]>=42
2c6f0 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 4d 69 6e    /* TUNING: Min
2c700 69 6d 75 6d 20 66 6f 72 20 73 6b 69 70 2d 73 63  imum for skip-sc
2c710 61 6e 20 2a 2f 0a 20 20 20 26 26 20 28 72 63 20  an */.   && (rc 
2c720 3d 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a  = whereLoopResiz
2c730 65 28 64 62 2c 20 70 4e 65 77 2c 20 70 4e 65 77  e(db, pNew, pNew
2c740 2d 3e 6e 4c 54 65 72 6d 2b 31 29 29 3d 3d 53 51  ->nLTerm+1))==SQ
2c750 4c 49 54 45 5f 4f 4b 0a 20 20 29 7b 0a 20 20 20  LITE_OK.  ){.   
2c760 20 4c 6f 67 45 73 74 20 6e 49 74 65 72 3b 0a 20   LogEst nIter;. 
2c770 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65     pNew->u.btree
2c780 2e 6e 45 71 2b 2b 3b 0a 20 20 20 20 70 4e 65 77  .nEq++;.    pNew
2c790 2d 3e 6e 53 6b 69 70 2b 2b 3b 0a 20 20 20 20 70  ->nSkip++;.    p
2c7a0 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 70 4e 65 77  New->aLTerm[pNew
2c7b0 2d 3e 6e 4c 54 65 72 6d 2b 2b 5d 20 3d 20 30 3b  ->nLTerm++] = 0;
2c7c0 0a 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61  .    pNew->wsFla
2c7d0 67 73 20 7c 3d 20 57 48 45 52 45 5f 53 4b 49 50  gs |= WHERE_SKIP
2c7e0 53 43 41 4e 3b 0a 20 20 20 20 6e 49 74 65 72 20  SCAN;.    nIter 
2c7f0 3d 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77 4c  = pProbe->aiRowL
2c800 6f 67 45 73 74 5b 73 61 76 65 64 5f 6e 45 71 5d  ogEst[saved_nEq]
2c810 20 2d 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77   - pProbe->aiRow
2c820 4c 6f 67 45 73 74 5b 73 61 76 65 64 5f 6e 45 71  LogEst[saved_nEq
2c830 2b 31 5d 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e  +1];.    pNew->n
2c840 4f 75 74 20 2d 3d 20 6e 49 74 65 72 3b 0a 20 20  Out -= nIter;.  
2c850 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 20 42 65    /* TUNING:  Be
2c860 63 61 75 73 65 20 75 6e 63 65 72 74 61 69 6e 74  cause uncertaint
2c870 69 65 73 20 69 6e 20 74 68 65 20 65 73 74 69 6d  ies in the estim
2c880 61 74 65 73 20 66 6f 72 20 73 6b 69 70 2d 73 63  ates for skip-sc
2c890 61 6e 20 71 75 65 72 69 65 73 2c 0a 20 20 20 20  an queries,.    
2c8a0 2a 2a 20 61 64 64 20 61 20 31 2e 33 37 35 20 66  ** add a 1.375 f
2c8b0 75 64 67 65 20 66 61 63 74 6f 72 20 74 6f 20 6d  udge factor to m
2c8c0 61 6b 65 20 73 6b 69 70 2d 73 63 61 6e 20 73 6c  ake skip-scan sl
2c8d0 69 67 68 74 6c 79 20 6c 65 73 73 20 6c 69 6b 65  ightly less like
2c8e0 6c 79 2e 20 2a 2f 0a 20 20 20 20 6e 49 74 65 72  ly. */.    nIter
2c8f0 20 2b 3d 20 35 3b 0a 20 20 20 20 77 68 65 72 65   += 5;.    where
2c900 4c 6f 6f 70 41 64 64 42 74 72 65 65 49 6e 64 65  LoopAddBtreeInde
2c910 78 28 70 42 75 69 6c 64 65 72 2c 20 70 53 72 63  x(pBuilder, pSrc
2c920 2c 20 70 50 72 6f 62 65 2c 20 6e 49 74 65 72 20  , pProbe, nIter 
2c930 2b 20 6e 49 6e 4d 75 6c 29 3b 0a 20 20 20 20 70  + nInMul);.    p
2c940 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76 65  New->nOut = save
2c950 64 5f 6e 4f 75 74 3b 0a 20 20 20 20 70 4e 65 77  d_nOut;.    pNew
2c960 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20  ->u.btree.nEq = 
2c970 73 61 76 65 64 5f 6e 45 71 3b 0a 20 20 20 20 70  saved_nEq;.    p
2c980 4e 65 77 2d 3e 6e 53 6b 69 70 20 3d 20 73 61 76  New->nSkip = sav
2c990 65 64 5f 6e 53 6b 69 70 3b 0a 20 20 20 20 70 4e  ed_nSkip;.    pN
2c9a0 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 73 61  ew->wsFlags = sa
2c9b0 76 65 64 5f 77 73 46 6c 61 67 73 3b 0a 20 20 7d  ved_wsFlags;.  }
2c9c0 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
2c9d0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
2c9e0 72 75 65 20 69 66 20 69 74 20 69 73 20 70 6f 73  rue if it is pos
2c9f0 73 69 62 6c 65 20 74 68 61 74 20 70 49 6e 64 65  sible that pInde
2ca00 78 20 6d 69 67 68 74 20 62 65 20 75 73 65 66 75  x might be usefu
2ca10 6c 20 69 6e 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e  l in.** implemen
2ca20 74 69 6e 67 20 74 68 65 20 4f 52 44 45 52 20 42  ting the ORDER B
2ca30 59 20 63 6c 61 75 73 65 20 69 6e 20 70 42 75 69  Y clause in pBui
2ca40 6c 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  lder..**.** Retu
2ca50 72 6e 20 46 61 6c 73 65 20 69 66 20 70 42 75 69  rn False if pBui
2ca60 6c 64 65 72 20 64 6f 65 73 20 6e 6f 74 20 63 6f  lder does not co
2ca70 6e 74 61 69 6e 20 61 6e 20 4f 52 44 45 52 20 42  ntain an ORDER B
2ca80 59 20 63 6c 61 75 73 65 20 6f 72 0a 2a 2a 20 69  Y clause or.** i
2ca90 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77 61  f there is no wa
2caa0 79 20 66 6f 72 20 70 49 6e 64 65 78 20 74 6f 20  y for pIndex to 
2cab0 62 65 20 75 73 65 66 75 6c 20 69 6e 20 69 6d 70  be useful in imp
2cac0 6c 65 6d 65 6e 74 69 6e 67 20 74 68 61 74 0a 2a  lementing that.*
2cad0 2a 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  * ORDER BY claus
2cae0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
2caf0 20 69 6e 64 65 78 4d 69 67 68 74 48 65 6c 70 57   indexMightHelpW
2cb00 69 74 68 4f 72 64 65 72 42 79 28 0a 20 20 57 68  ithOrderBy(.  Wh
2cb10 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a  ereLoopBuilder *
2cb20 70 42 75 69 6c 64 65 72 2c 0a 20 20 49 6e 64 65  pBuilder,.  Inde
2cb30 78 20 2a 70 49 6e 64 65 78 2c 0a 20 20 69 6e 74  x *pIndex,.  int
2cb40 20 69 43 75 72 73 6f 72 0a 29 7b 0a 20 20 45 78   iCursor.){.  Ex
2cb50 70 72 4c 69 73 74 20 2a 70 4f 42 3b 0a 20 20 69  prList *pOB;.  i
2cb60 6e 74 20 69 69 2c 20 6a 6a 3b 0a 0a 20 20 69 66  nt ii, jj;..  if
2cb70 28 20 70 49 6e 64 65 78 2d 3e 62 55 6e 6f 72 64  ( pIndex->bUnord
2cb80 65 72 65 64 20 29 20 72 65 74 75 72 6e 20 30 3b  ered ) return 0;
2cb90 0a 20 20 69 66 28 20 28 70 4f 42 20 3d 20 70 42  .  if( (pOB = pB
2cba0 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 2d 3e  uilder->pWInfo->
2cbb0 70 4f 72 64 65 72 42 79 29 3d 3d 30 20 29 20 72  pOrderBy)==0 ) r
2cbc0 65 74 75 72 6e 20 30 3b 0a 20 20 66 6f 72 28 69  eturn 0;.  for(i
2cbd0 69 3d 30 3b 20 69 69 3c 70 4f 42 2d 3e 6e 45 78  i=0; ii<pOB->nEx
2cbe0 70 72 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 45  pr; ii++){.    E
2cbf0 78 70 72 20 2a 70 45 78 70 72 20 3d 20 73 71 6c  xpr *pExpr = sql
2cc00 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c  ite3ExprSkipColl
2cc10 61 74 65 28 70 4f 42 2d 3e 61 5b 69 69 5d 2e 70  ate(pOB->a[ii].p
2cc20 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20 70  Expr);.    if( p
2cc30 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c  Expr->op!=TK_COL
2cc40 55 4d 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  UMN ) return 0;.
2cc50 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69      if( pExpr->i
2cc60 54 61 62 6c 65 3d 3d 69 43 75 72 73 6f 72 20 29  Table==iCursor )
2cc70 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  {.      if( pExp
2cc80 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 20 72  r->iColumn<0 ) r
2cc90 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 66  eturn 1;.      f
2cca0 6f 72 28 6a 6a 3d 30 3b 20 6a 6a 3c 70 49 6e 64  or(jj=0; jj<pInd
2ccb0 65 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 6a 2b  ex->nKeyCol; jj+
2ccc0 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
2ccd0 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d  pExpr->iColumn==
2cce0 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e  pIndex->aiColumn
2ccf0 5b 6a 6a 5d 20 29 20 72 65 74 75 72 6e 20 31 3b  [jj] ) return 1;
2cd00 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2cd10 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
2cd20 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
2cd30 20 62 69 74 6d 61 73 6b 20 77 68 65 72 65 20 31   bitmask where 1
2cd40 73 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20  s indicate that 
2cd50 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
2cd60 67 20 63 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a 20 74  g column of.** t
2cd70 68 65 20 74 61 62 6c 65 20 69 73 20 75 73 65 64  he table is used
2cd80 20 62 79 20 61 6e 20 69 6e 64 65 78 2e 20 20 4f   by an index.  O
2cd90 6e 6c 79 20 74 68 65 20 66 69 72 73 74 20 36 33  nly the first 63
2cda0 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 63 6f 6e   columns are con
2cdb0 73 69 64 65 72 65 64 2e 0a 2a 2f 0a 73 74 61 74  sidered..*/.stat
2cdc0 69 63 20 42 69 74 6d 61 73 6b 20 63 6f 6c 75 6d  ic Bitmask colum
2cdd0 6e 73 49 6e 49 6e 64 65 78 28 49 6e 64 65 78 20  nsInIndex(Index 
2cde0 2a 70 49 64 78 29 7b 0a 20 20 42 69 74 6d 61 73  *pIdx){.  Bitmas
2cdf0 6b 20 6d 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6a  k m = 0;.  int j
2ce00 3b 0a 20 20 66 6f 72 28 6a 3d 70 49 64 78 2d 3e  ;.  for(j=pIdx->
2ce10 6e 43 6f 6c 75 6d 6e 2d 31 3b 20 6a 3e 3d 30 3b  nColumn-1; j>=0;
2ce20 20 6a 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20 78   j--){.    int x
2ce30 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d   = pIdx->aiColum
2ce40 6e 5b 6a 5d 3b 0a 20 20 20 20 69 66 28 20 78 3e  n[j];.    if( x>
2ce50 3d 30 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74  =0 ){.      test
2ce60 63 61 73 65 28 20 78 3d 3d 42 4d 53 2d 31 20 29  case( x==BMS-1 )
2ce70 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
2ce80 28 20 78 3d 3d 42 4d 53 2d 32 20 29 3b 0a 20 20  ( x==BMS-2 );.  
2ce90 20 20 20 20 69 66 28 20 78 3c 42 4d 53 2d 31 20      if( x<BMS-1 
2cea0 29 20 6d 20 7c 3d 20 4d 41 53 4b 42 49 54 28 78  ) m |= MASKBIT(x
2ceb0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
2cec0 65 74 75 72 6e 20 6d 3b 0a 7d 0a 0a 2f 2a 20 43  eturn m;.}../* C
2ced0 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 61  heck to see if a
2cee0 20 70 61 72 74 69 61 6c 20 69 6e 64 65 78 20 77   partial index w
2cef0 69 74 68 20 70 50 61 72 74 49 6e 64 65 78 57 68  ith pPartIndexWh
2cf00 65 72 65 20 63 61 6e 20 62 65 20 75 73 65 64 0a  ere can be used.
2cf10 2a 2a 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e  ** in the curren
2cf20 74 20 71 75 65 72 79 2e 20 20 52 65 74 75 72 6e  t query.  Return
2cf30 20 74 72 75 65 20 69 66 20 69 74 20 63 61 6e 20   true if it can 
2cf40 62 65 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20  be and false if 
2cf50 6e 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  not..*/.static i
2cf60 6e 74 20 77 68 65 72 65 55 73 61 62 6c 65 50 61  nt whereUsablePa
2cf70 72 74 69 61 6c 49 6e 64 65 78 28 69 6e 74 20 69  rtialIndex(int i
2cf80 54 61 62 2c 20 57 68 65 72 65 43 6c 61 75 73 65  Tab, WhereClause
2cf90 20 2a 70 57 43 2c 20 45 78 70 72 20 2a 70 57 68   *pWC, Expr *pWh
2cfa0 65 72 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ere){.  int i;. 
2cfb0 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
2cfc0 6d 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 54  m;.  for(i=0, pT
2cfd0 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c 70 57  erm=pWC->a; i<pW
2cfe0 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c 20 70  C->nTerm; i++, p
2cff0 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70  Term++){.    Exp
2d000 72 20 2a 70 45 78 70 72 20 3d 20 70 54 65 72 6d  r *pExpr = pTerm
2d010 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28  ->pExpr;.    if(
2d020 20 73 71 6c 69 74 65 33 45 78 70 72 49 6d 70 6c   sqlite3ExprImpl
2d030 69 65 73 45 78 70 72 28 70 45 78 70 72 2c 20 70  iesExpr(pExpr, p
2d040 57 68 65 72 65 2c 20 69 54 61 62 29 20 0a 20 20  Where, iTab) .  
2d050 20 20 20 26 26 20 28 21 45 78 70 72 48 61 73 50     && (!ExprHasP
2d060 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
2d070 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 7c 7c 20 70  P_FromJoin) || p
2d080 45 78 70 72 2d 3e 69 52 69 67 68 74 4a 6f 69 6e  Expr->iRightJoin
2d090 54 61 62 6c 65 3d 3d 69 54 61 62 29 0a 20 20 20  Table==iTab).   
2d0a0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
2d0b0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   1;.    }.  }.  
2d0c0 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
2d0d0 2a 2a 20 41 64 64 20 61 6c 6c 20 57 68 65 72 65  ** Add all Where
2d0e0 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 66 6f 72  Loop objects for
2d0f0 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20   a single table 
2d100 6f 66 20 74 68 65 20 6a 6f 69 6e 20 77 68 65 72  of the join wher
2d110 65 20 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20 69  e the table.** i
2d120 73 20 69 64 65 6e 66 69 65 64 20 62 79 20 70 42  s idenfied by pB
2d130 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 69 54  uilder->pNew->iT
2d140 61 62 2e 20 20 54 68 61 74 20 74 61 62 6c 65 20  ab.  That table 
2d150 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  is guaranteed to
2d160 20 62 65 0a 2a 2a 20 61 20 62 2d 74 72 65 65 20   be.** a b-tree 
2d170 74 61 62 6c 65 2c 20 6e 6f 74 20 61 20 76 69 72  table, not a vir
2d180 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a  tual table..**.*
2d190 2a 20 54 68 65 20 63 6f 73 74 73 20 28 57 68 65  * The costs (Whe
2d1a0 72 65 4c 6f 6f 70 2e 72 52 75 6e 29 20 6f 66 20  reLoop.rRun) of 
2d1b0 74 68 65 20 62 2d 74 72 65 65 20 6c 6f 6f 70 73  the b-tree loops
2d1c0 20 61 64 64 65 64 20 62 79 20 74 68 69 73 20 66   added by this f
2d1d0 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61 72 65 20 63  unction.** are c
2d1e0 61 6c 63 75 6c 61 74 65 64 20 61 73 20 66 6f 6c  alculated as fol
2d1f0 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  lows:.**.** For 
2d200 61 20 66 75 6c 6c 20 73 63 61 6e 2c 20 61 73 73  a full scan, ass
2d210 75 6d 69 6e 67 20 74 68 65 20 74 61 62 6c 65 20  uming the table 
2d220 28 6f 72 20 69 6e 64 65 78 29 20 63 6f 6e 74 61  (or index) conta
2d230 69 6e 73 20 6e 52 6f 77 20 72 6f 77 73 3a 0a 2a  ins nRow rows:.*
2d240 2a 0a 2a 2a 20 20 20 20 20 63 6f 73 74 20 3d 20  *.**     cost = 
2d250 6e 52 6f 77 20 2a 20 33 2e 30 20 20 20 20 20 20  nRow * 3.0      
2d260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f                //
2d270 20 66 75 6c 6c 2d 74 61 62 6c 65 20 73 63 61 6e   full-table scan
2d280 0a 2a 2a 20 20 20 20 20 63 6f 73 74 20 3d 20 6e  .**     cost = n
2d290 52 6f 77 20 2a 20 4b 20 20 20 20 20 20 20 20 20  Row * K         
2d2a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20               // 
2d2b0 73 63 61 6e 20 6f 66 20 63 6f 76 65 72 69 6e 67  scan of covering
2d2c0 20 69 6e 64 65 78 0a 2a 2a 20 20 20 20 20 63 6f   index.**     co
2d2d0 73 74 20 3d 20 6e 52 6f 77 20 2a 20 28 4b 2b 33  st = nRow * (K+3
2d2e0 2e 30 29 20 20 20 20 20 20 20 20 20 20 20 20 20  .0)             
2d2f0 20 20 20 2f 2f 20 73 63 61 6e 20 6f 66 20 6e 6f     // scan of no
2d300 6e 2d 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78  n-covering index
2d310 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 4b 20 69  .**.** where K i
2d320 73 20 61 20 76 61 6c 75 65 20 62 65 74 77 65 65  s a value betwee
2d330 6e 20 31 2e 31 20 61 6e 64 20 33 2e 30 20 73 65  n 1.1 and 3.0 se
2d340 74 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 72  t based on the r
2d350 65 6c 61 74 69 76 65 20 0a 2a 2a 20 65 73 74 69  elative .** esti
2d360 6d 61 74 65 64 20 61 76 65 72 61 67 65 20 73 69  mated average si
2d370 7a 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  ze of the index 
2d380 61 6e 64 20 74 61 62 6c 65 20 72 65 63 6f 72 64  and table record
2d390 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 6e 20  s..**.** For an 
2d3a0 69 6e 64 65 78 20 73 63 61 6e 2c 20 77 68 65 72  index scan, wher
2d3b0 65 20 6e 56 69 73 69 74 20 69 73 20 74 68 65 20  e nVisit is the 
2d3c0 6e 75 6d 62 65 72 20 6f 66 20 69 6e 64 65 78 20  number of index 
2d3d0 72 6f 77 73 20 76 69 73 69 74 65 64 0a 2a 2a 20  rows visited.** 
2d3e0 62 79 20 74 68 65 20 73 63 61 6e 2c 20 61 6e 64  by the scan, and
2d3f0 20 6e 53 65 65 6b 20 69 73 20 74 68 65 20 6e 75   nSeek is the nu
2d400 6d 62 65 72 20 6f 66 20 73 65 65 6b 20 6f 70 65  mber of seek ope
2d410 72 61 74 69 6f 6e 73 20 72 65 71 75 69 72 65 64  rations required
2d420 20 6f 6e 20 0a 2a 2a 20 74 68 65 20 69 6e 64 65   on .** the inde
2d430 78 20 62 2d 74 72 65 65 3a 0a 2a 2a 0a 2a 2a 20  x b-tree:.**.** 
2d440 20 20 20 20 63 6f 73 74 20 3d 20 6e 53 65 65 6b      cost = nSeek
2d450 20 2a 20 28 6c 6f 67 28 6e 52 6f 77 29 20 2b 20   * (log(nRow) + 
2d460 4b 20 2a 20 6e 56 69 73 69 74 29 20 20 20 20 20  K * nVisit)     
2d470 20 20 20 20 20 2f 2f 20 63 6f 76 65 72 69 6e 67       // covering
2d480 20 69 6e 64 65 78 0a 2a 2a 20 20 20 20 20 63 6f   index.**     co
2d490 73 74 20 3d 20 6e 53 65 65 6b 20 2a 20 28 6c 6f  st = nSeek * (lo
2d4a0 67 28 6e 52 6f 77 29 20 2b 20 28 4b 2b 33 2e 30  g(nRow) + (K+3.0
2d4b0 29 20 2a 20 6e 56 69 73 69 74 29 20 20 20 20 2f  ) * nVisit)    /
2d4c0 2f 20 6e 6f 6e 2d 63 6f 76 65 72 69 6e 67 20 69  / non-covering i
2d4d0 6e 64 65 78 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61  ndex.**.** Norma
2d4e0 6c 6c 79 2c 20 6e 53 65 65 6b 20 69 73 20 31 2e  lly, nSeek is 1.
2d4f0 20 6e 53 65 65 6b 20 76 61 6c 75 65 73 20 67 72   nSeek values gr
2d500 65 61 74 65 72 20 74 68 61 6e 20 31 20 63 6f 6d  eater than 1 com
2d510 65 20 61 62 6f 75 74 20 69 66 20 74 68 65 20 0a  e about if the .
2d520 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  ** WHERE clause 
2d530 69 6e 63 6c 75 64 65 73 20 22 78 20 49 4e 20 28  includes "x IN (
2d540 2e 2e 2e 2e 29 22 20 74 65 72 6d 73 20 75 73 65  ....)" terms use
2d550 64 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 22 78  d in place of "x
2d560 3d 3f 22 2e 20 4f 72 20 77 68 65 6e 20 0a 2a 2a  =?". Or when .**
2d570 20 69 6d 70 6c 69 63 69 74 20 22 78 20 49 4e 20   implicit "x IN 
2d580 28 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74  (SELECT x FROM t
2d590 62 6c 29 22 20 74 65 72 6d 73 20 61 72 65 20 61  bl)" terms are a
2d5a0 64 64 65 64 20 66 6f 72 20 73 6b 69 70 2d 73 63  dded for skip-sc
2d5b0 61 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65  ans..**.** The e
2d5c0 73 74 69 6d 61 74 65 64 20 76 61 6c 75 65 73 20  stimated values 
2d5d0 28 6e 52 6f 77 2c 20 6e 56 69 73 69 74 2c 20 6e  (nRow, nVisit, n
2d5e0 53 65 65 6b 29 20 6f 66 74 65 6e 20 63 6f 6e 74  Seek) often cont
2d5f0 61 69 6e 20 61 20 6c 61 72 67 65 20 61 6d 6f 75  ain a large amou
2d600 6e 74 0a 2a 2a 20 6f 66 20 75 6e 63 65 72 74 61  nt.** of uncerta
2d610 69 6e 74 79 2e 20 20 46 6f 72 20 74 68 69 73 20  inty.  For this 
2d620 72 65 61 73 6f 6e 2c 20 73 63 6f 72 69 6e 67 20  reason, scoring 
2d630 69 73 20 64 65 73 69 67 6e 65 64 20 74 6f 20 70  is designed to p
2d640 69 63 6b 20 70 6c 61 6e 73 20 74 68 61 74 0a 2a  ick plans that.*
2d650 2a 20 22 64 6f 20 74 68 65 20 6c 65 61 73 74 20  * "do the least 
2d660 68 61 72 6d 22 20 69 66 20 74 68 65 20 65 73 74  harm" if the est
2d670 69 6d 61 74 65 73 20 61 72 65 20 69 6e 61 63 63  imates are inacc
2d680 75 72 61 74 65 2e 20 20 46 6f 72 20 65 78 61 6d  urate.  For exam
2d690 70 6c 65 2c 20 61 0a 2a 2a 20 6c 6f 67 28 6e 52  ple, a.** log(nR
2d6a0 6f 77 29 20 66 61 63 74 6f 72 20 69 73 20 6f 6d  ow) factor is om
2d6b0 69 74 74 65 64 20 66 72 6f 6d 20 61 20 6e 6f 6e  itted from a non
2d6c0 2d 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20  -covering index 
2d6d0 73 63 61 6e 20 69 6e 20 6f 72 64 65 72 20 74 6f  scan in order to
2d6e0 0a 2a 2a 20 62 69 61 73 20 74 68 65 20 73 63 6f  .** bias the sco
2d6f0 72 69 6e 67 20 69 6e 20 66 61 76 6f 72 20 6f 66  ring in favor of
2d700 20 75 73 69 6e 67 20 61 6e 20 69 6e 64 65 78 2c   using an index,
2d710 20 73 69 6e 63 65 20 74 68 65 20 77 6f 72 73 74   since the worst
2d720 2d 63 61 73 65 0a 2a 2a 20 70 65 72 66 6f 72 6d  -case.** perform
2d730 61 6e 63 65 20 6f 66 20 75 73 69 6e 67 20 61 6e  ance of using an
2d740 20 69 6e 64 65 78 20 69 73 20 66 61 72 20 62 65   index is far be
2d750 74 74 65 72 20 74 68 61 6e 20 74 68 65 20 77 6f  tter than the wo
2d760 72 73 74 2d 63 61 73 65 20 70 65 72 66 6f 72 6d  rst-case perform
2d770 61 6e 63 65 0a 2a 2a 20 6f 66 20 61 20 66 75 6c  ance.** of a ful
2d780 6c 20 74 61 62 6c 65 20 73 63 61 6e 2e 0a 2a 2f  l table scan..*/
2d790 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
2d7a0 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 28 0a 20  eLoopAddBtree(. 
2d7b0 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65   WhereLoopBuilde
2d7c0 72 20 2a 70 42 75 69 6c 64 65 72 2c 20 2f 2a 20  r *pBuilder, /* 
2d7d0 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e 66  WHERE clause inf
2d7e0 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 42 69  ormation */.  Bi
2d7f0 74 6d 61 73 6b 20 6d 45 78 74 72 61 20 20 20 20  tmask mExtra    
2d800 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74            /* Ext
2d810 72 61 20 70 72 65 72 65 71 75 65 73 69 74 65 73  ra prerequesites
2d820 20 66 6f 72 20 75 73 69 6e 67 20 74 68 69 73 20   for using this 
2d830 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 57 68  table */.){.  Wh
2d840 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b  ereInfo *pWInfo;
2d850 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 48 45            /* WHE
2d860 52 45 20 61 6e 61 6c 79 73 69 73 20 63 6f 6e 74  RE analysis cont
2d870 65 78 74 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  ext */.  Index *
2d880 70 50 72 6f 62 65 3b 20 20 20 20 20 20 20 20 20  pProbe;         
2d890 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78       /* An index
2d8a0 20 77 65 20 61 72 65 20 65 76 61 6c 75 61 74 69   we are evaluati
2d8b0 6e 67 20 2a 2f 0a 20 20 49 6e 64 65 78 20 73 50  ng */.  Index sP
2d8c0 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
2d8d0 20 20 20 20 2f 2a 20 41 20 66 61 6b 65 20 69 6e      /* A fake in
2d8e0 64 65 78 20 6f 62 6a 65 63 74 20 66 6f 72 20 74  dex object for t
2d8f0 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20 2a  he primary key *
2d900 2f 0a 20 20 4c 6f 67 45 73 74 20 61 69 52 6f 77  /.  LogEst aiRow
2d910 45 73 74 50 6b 5b 32 5d 3b 20 20 20 20 20 20 20  EstPk[2];       
2d920 2f 2a 20 54 68 65 20 61 69 52 6f 77 4c 6f 67 45  /* The aiRowLogE
2d930 73 74 5b 5d 20 76 61 6c 75 65 20 66 6f 72 20 74  st[] value for t
2d940 68 65 20 73 50 6b 20 69 6e 64 65 78 20 2a 2f 0a  he sPk index */.
2d950 20 20 69 31 36 20 61 69 43 6f 6c 75 6d 6e 50 6b    i16 aiColumnPk
2d960 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 2f 2a   = -1;        /*
2d970 20 54 68 65 20 61 43 6f 6c 75 6d 6e 5b 5d 20 76   The aColumn[] v
2d980 61 6c 75 65 20 66 6f 72 20 74 68 65 20 73 50 6b  alue for the sPk
2d990 20 69 6e 64 65 78 20 2a 2f 0a 20 20 53 72 63 4c   index */.  SrcL
2d9a0 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 20 20  ist *pTabList;  
2d9b0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46          /* The F
2d9c0 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ROM clause */.  
2d9d0 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
2d9e0 74 65 6d 20 2a 70 53 72 63 3b 20 20 2f 2a 20 54  tem *pSrc;  /* T
2d9f0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 62  he FROM clause b
2da00 74 72 65 65 20 74 65 72 6d 20 74 6f 20 61 64 64  tree term to add
2da10 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20   */.  WhereLoop 
2da20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20  *pNew;          
2da30 20 20 2f 2a 20 54 65 6d 70 6c 61 74 65 20 57 68    /* Template Wh
2da40 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 2a  ereLoop object *
2da50 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
2da60 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
2da70 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
2da80 2f 0a 20 20 69 6e 74 20 69 53 6f 72 74 49 64 78  /.  int iSortIdx
2da90 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20   = 1;           
2daa0 2f 2a 20 49 6e 64 65 78 20 6e 75 6d 62 65 72 20  /* Index number 
2dab0 2a 2f 0a 20 20 69 6e 74 20 62 3b 20 20 20 20 20  */.  int b;     
2dac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dad0 20 2f 2a 20 41 20 62 6f 6f 6c 65 61 6e 20 76 61   /* A boolean va
2dae0 6c 75 65 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20  lue */.  LogEst 
2daf0 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  rSize;          
2db00 20 20 20 20 20 2f 2a 20 6e 75 6d 62 65 72 20 6f       /* number o
2db10 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61  f rows in the ta
2db20 62 6c 65 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20  ble */.  LogEst 
2db30 72 4c 6f 67 53 69 7a 65 3b 20 20 20 20 20 20 20  rLogSize;       
2db40 20 20 20 20 20 2f 2a 20 4c 6f 67 61 72 69 74 68       /* Logarith
2db50 6d 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20  m of the number 
2db60 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74  of rows in the t
2db70 61 62 6c 65 20 2a 2f 0a 20 20 57 68 65 72 65 43  able */.  WhereC
2db80 6c 61 75 73 65 20 2a 70 57 43 3b 20 20 20 20 20  lause *pWC;     
2db90 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
2dba0 73 65 64 20 57 48 45 52 45 20 63 6c 61 75 73 65  sed WHERE clause
2dbb0 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   */.  Table *pTa
2dbc0 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
2dbd0 20 20 2f 2a 20 54 61 62 6c 65 20 62 65 69 6e 67    /* Table being
2dbe0 20 71 75 65 72 69 65 64 20 2a 2f 0a 20 20 0a 20   queried */.  . 
2dbf0 20 70 4e 65 77 20 3d 20 70 42 75 69 6c 64 65 72   pNew = pBuilder
2dc00 2d 3e 70 4e 65 77 3b 0a 20 20 70 57 49 6e 66 6f  ->pNew;.  pWInfo
2dc10 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49   = pBuilder->pWI
2dc20 6e 66 6f 3b 0a 20 20 70 54 61 62 4c 69 73 74 20  nfo;.  pTabList 
2dc30 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69  = pWInfo->pTabLi
2dc40 73 74 3b 0a 20 20 70 53 72 63 20 3d 20 70 54 61  st;.  pSrc = pTa
2dc50 62 4c 69 73 74 2d 3e 61 20 2b 20 70 4e 65 77 2d  bList->a + pNew-
2dc60 3e 69 54 61 62 3b 0a 20 20 70 54 61 62 20 3d 20  >iTab;.  pTab = 
2dc70 70 53 72 63 2d 3e 70 54 61 62 3b 0a 20 20 70 57  pSrc->pTab;.  pW
2dc80 43 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57  C = pBuilder->pW
2dc90 43 3b 0a 20 20 61 73 73 65 72 74 28 20 21 49 73  C;.  assert( !Is
2dca0 56 69 72 74 75 61 6c 28 70 53 72 63 2d 3e 70 54  Virtual(pSrc->pT
2dcb0 61 62 29 20 29 3b 0a 0a 20 20 69 66 28 20 70 53  ab) );..  if( pS
2dcc0 72 63 2d 3e 70 49 6e 64 65 78 20 29 7b 0a 20 20  rc->pIndex ){.  
2dcd0 20 20 2f 2a 20 41 6e 20 49 4e 44 45 58 45 44 20    /* An INDEXED 
2dce0 42 59 20 63 6c 61 75 73 65 20 73 70 65 63 69 66  BY clause specif
2dcf0 69 65 73 20 61 20 70 61 72 74 69 63 75 6c 61 72  ies a particular
2dd00 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20 2a 2f   index to use */
2dd10 0a 20 20 20 20 70 50 72 6f 62 65 20 3d 20 70 53  .    pProbe = pS
2dd20 72 63 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 7d 65  rc->pIndex;.  }e
2dd30 6c 73 65 20 69 66 28 20 21 48 61 73 52 6f 77 69  lse if( !HasRowi
2dd40 64 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 70  d(pTab) ){.    p
2dd50 50 72 6f 62 65 20 3d 20 70 54 61 62 2d 3e 70 49  Probe = pTab->pI
2dd60 6e 64 65 78 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ndex;.  }else{. 
2dd70 20 20 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6e     /* There is n
2dd80 6f 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61  o INDEXED BY cla
2dd90 75 73 65 2e 20 20 43 72 65 61 74 65 20 61 20 66  use.  Create a f
2dda0 61 6b 65 20 49 6e 64 65 78 20 6f 62 6a 65 63 74  ake Index object
2ddb0 20 69 6e 20 6c 6f 63 61 6c 0a 20 20 20 20 2a 2a   in local.    **
2ddc0 20 76 61 72 69 61 62 6c 65 20 73 50 6b 20 74 6f   variable sPk to
2ddd0 20 72 65 70 72 65 73 65 6e 74 20 74 68 65 20 72   represent the r
2dde0 6f 77 69 64 20 70 72 69 6d 61 72 79 20 6b 65 79  owid primary key
2ddf0 20 69 6e 64 65 78 2e 20 20 4d 61 6b 65 20 74 68   index.  Make th
2de00 69 73 0a 20 20 20 20 2a 2a 20 66 61 6b 65 20 69  is.    ** fake i
2de10 6e 64 65 78 20 74 68 65 20 66 69 72 73 74 20 69  ndex the first i
2de20 6e 20 61 20 63 68 61 69 6e 20 6f 66 20 49 6e 64  n a chain of Ind
2de30 65 78 20 6f 62 6a 65 63 74 73 20 77 69 74 68 20  ex objects with 
2de40 61 6c 6c 20 6f 66 20 74 68 65 20 72 65 61 6c 0a  all of the real.
2de50 20 20 20 20 2a 2a 20 69 6e 64 69 63 65 73 20 74      ** indices t
2de60 6f 20 66 6f 6c 6c 6f 77 20 2a 2f 0a 20 20 20 20  o follow */.    
2de70 49 6e 64 65 78 20 2a 70 46 69 72 73 74 3b 20 20  Index *pFirst;  
2de80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2de90 2f 2a 20 46 69 72 73 74 20 6f 66 20 72 65 61 6c  /* First of real
2dea0 20 69 6e 64 69 63 65 73 20 6f 6e 20 74 68 65 20   indices on the 
2deb0 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 6d 65 6d  table */.    mem
2dec0 73 65 74 28 26 73 50 6b 2c 20 30 2c 20 73 69 7a  set(&sPk, 0, siz
2ded0 65 6f 66 28 49 6e 64 65 78 29 29 3b 0a 20 20 20  eof(Index));.   
2dee0 20 73 50 6b 2e 6e 4b 65 79 43 6f 6c 20 3d 20 31   sPk.nKeyCol = 1
2def0 3b 0a 20 20 20 20 73 50 6b 2e 6e 43 6f 6c 75 6d  ;.    sPk.nColum
2df00 6e 20 3d 20 31 3b 0a 20 20 20 20 73 50 6b 2e 61  n = 1;.    sPk.a
2df10 69 43 6f 6c 75 6d 6e 20 3d 20 26 61 69 43 6f 6c  iColumn = &aiCol
2df20 75 6d 6e 50 6b 3b 0a 20 20 20 20 73 50 6b 2e 61  umnPk;.    sPk.a
2df30 69 52 6f 77 4c 6f 67 45 73 74 20 3d 20 61 69 52  iRowLogEst = aiR
2df40 6f 77 45 73 74 50 6b 3b 0a 20 20 20 20 73 50 6b  owEstPk;.    sPk
2df50 2e 6f 6e 45 72 72 6f 72 20 3d 20 4f 45 5f 52 65  .onError = OE_Re
2df60 70 6c 61 63 65 3b 0a 20 20 20 20 73 50 6b 2e 70  place;.    sPk.p
2df70 54 61 62 6c 65 20 3d 20 70 54 61 62 3b 0a 20 20  Table = pTab;.  
2df80 20 20 73 50 6b 2e 73 7a 49 64 78 52 6f 77 20 3d    sPk.szIdxRow =
2df90 20 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 3b   pTab->szTabRow;
2dfa0 0a 20 20 20 20 61 69 52 6f 77 45 73 74 50 6b 5b  .    aiRowEstPk[
2dfb0 30 5d 20 3d 20 70 54 61 62 2d 3e 6e 52 6f 77 4c  0] = pTab->nRowL
2dfc0 6f 67 45 73 74 3b 0a 20 20 20 20 61 69 52 6f 77  ogEst;.    aiRow
2dfd0 45 73 74 50 6b 5b 31 5d 20 3d 20 30 3b 0a 20 20  EstPk[1] = 0;.  
2dfe0 20 20 70 46 69 72 73 74 20 3d 20 70 53 72 63 2d    pFirst = pSrc-
2dff0 3e 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20  >pTab->pIndex;. 
2e000 20 20 20 69 66 28 20 70 53 72 63 2d 3e 6e 6f 74     if( pSrc->not
2e010 49 6e 64 65 78 65 64 3d 3d 30 20 29 7b 0a 20 20  Indexed==0 ){.  
2e020 20 20 20 20 2f 2a 20 54 68 65 20 72 65 61 6c 20      /* The real 
2e030 69 6e 64 69 63 65 73 20 6f 66 20 74 68 65 20 74  indices of the t
2e040 61 62 6c 65 20 61 72 65 20 6f 6e 6c 79 20 63 6f  able are only co
2e050 6e 73 69 64 65 72 65 64 20 69 66 20 74 68 65 0a  nsidered if the.
2e060 20 20 20 20 20 20 2a 2a 20 4e 4f 54 20 49 4e 44        ** NOT IND
2e070 45 58 45 44 20 71 75 61 6c 69 66 69 65 72 20 69  EXED qualifier i
2e080 73 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d 20 74  s omitted from t
2e090 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a  he FROM clause *
2e0a0 2f 0a 20 20 20 20 20 20 73 50 6b 2e 70 4e 65 78  /.      sPk.pNex
2e0b0 74 20 3d 20 70 46 69 72 73 74 3b 0a 20 20 20 20  t = pFirst;.    
2e0c0 7d 0a 20 20 20 20 70 50 72 6f 62 65 20 3d 20 26  }.    pProbe = &
2e0d0 73 50 6b 3b 0a 20 20 7d 0a 20 20 72 53 69 7a 65  sPk;.  }.  rSize
2e0e0 20 3d 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67   = pTab->nRowLog
2e0f0 45 73 74 3b 0a 20 20 72 4c 6f 67 53 69 7a 65 20  Est;.  rLogSize 
2e100 3d 20 65 73 74 4c 6f 67 28 72 53 69 7a 65 29 3b  = estLog(rSize);
2e110 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
2e120 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f  _OMIT_AUTOMATIC_
2e130 49 4e 44 45 58 0a 20 20 2f 2a 20 41 75 74 6f 6d  INDEX.  /* Autom
2e140 61 74 69 63 20 69 6e 64 65 78 65 73 20 2a 2f 0a  atic indexes */.
2e150 20 20 69 66 28 20 21 70 42 75 69 6c 64 65 72 2d    if( !pBuilder-
2e160 3e 70 4f 72 53 65 74 0a 20 20 20 26 26 20 28 70  >pOrSet.   && (p
2e170 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67  WInfo->wctrlFlag
2e180 73 20 26 20 57 48 45 52 45 5f 4e 4f 5f 41 55 54  s & WHERE_NO_AUT
2e190 4f 49 4e 44 45 58 29 3d 3d 30 0a 20 20 20 26 26  OINDEX)==0.   &&
2e1a0 20 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65   (pWInfo->pParse
2e1b0 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ->db->flags & SQ
2e1c0 4c 49 54 45 5f 41 75 74 6f 49 6e 64 65 78 29 21  LITE_AutoIndex)!
2e1d0 3d 30 0a 20 20 20 26 26 20 70 53 72 63 2d 3e 70  =0.   && pSrc->p
2e1e0 49 6e 64 65 78 3d 3d 30 0a 20 20 20 26 26 20 21  Index==0.   && !
2e1f0 70 53 72 63 2d 3e 76 69 61 43 6f 72 6f 75 74 69  pSrc->viaCorouti
2e200 6e 65 0a 20 20 20 26 26 20 21 70 53 72 63 2d 3e  ne.   && !pSrc->
2e210 6e 6f 74 49 6e 64 65 78 65 64 0a 20 20 20 26 26  notIndexed.   &&
2e220 20 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 0a   HasRowid(pTab).
2e230 20 20 20 26 26 20 21 70 53 72 63 2d 3e 69 73 43     && !pSrc->isC
2e240 6f 72 72 65 6c 61 74 65 64 0a 20 20 20 26 26 20  orrelated.   && 
2e250 21 70 53 72 63 2d 3e 69 73 52 65 63 75 72 73 69  !pSrc->isRecursi
2e260 76 65 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20 47  ve.  ){.    /* G
2e270 65 6e 65 72 61 74 65 20 61 75 74 6f 2d 69 6e 64  enerate auto-ind
2e280 65 78 20 57 68 65 72 65 4c 6f 6f 70 73 20 2a 2f  ex WhereLoops */
2e290 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a  .    WhereTerm *
2e2a0 70 54 65 72 6d 3b 0a 20 20 20 20 57 68 65 72 65  pTerm;.    Where
2e2b0 54 65 72 6d 20 2a 70 57 43 45 6e 64 20 3d 20 70  Term *pWCEnd = p
2e2c0 57 43 2d 3e 61 20 2b 20 70 57 43 2d 3e 6e 54 65  WC->a + pWC->nTe
2e2d0 72 6d 3b 0a 20 20 20 20 66 6f 72 28 70 54 65 72  rm;.    for(pTer
2e2e0 6d 3d 70 57 43 2d 3e 61 3b 20 72 63 3d 3d 53 51  m=pWC->a; rc==SQ
2e2f0 4c 49 54 45 5f 4f 4b 20 26 26 20 70 54 65 72 6d  LITE_OK && pTerm
2e300 3c 70 57 43 45 6e 64 3b 20 70 54 65 72 6d 2b 2b  <pWCEnd; pTerm++
2e310 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65  ){.      if( pTe
2e320 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20  rm->prereqRight 
2e330 26 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66  & pNew->maskSelf
2e340 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
2e350 20 20 20 69 66 28 20 74 65 72 6d 43 61 6e 44 72     if( termCanDr
2e360 69 76 65 49 6e 64 65 78 28 70 54 65 72 6d 2c 20  iveIndex(pTerm, 
2e370 70 53 72 63 2c 20 30 29 20 29 7b 0a 20 20 20 20  pSrc, 0) ){.    
2e380 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65      pNew->u.btre
2e390 65 2e 6e 45 71 20 3d 20 31 3b 0a 20 20 20 20 20  e.nEq = 1;.     
2e3a0 20 20 20 70 4e 65 77 2d 3e 6e 53 6b 69 70 20 3d     pNew->nSkip =
2e3b0 20 30 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77   0;.        pNew
2e3c0 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
2e3d0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 4e   = 0;.        pN
2e3e0 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 31 3b 0a  ew->nLTerm = 1;.
2e3f0 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 4c          pNew->aL
2e400 54 65 72 6d 5b 30 5d 20 3d 20 70 54 65 72 6d 3b  Term[0] = pTerm;
2e410 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 55 4e 49  .        /* TUNI
2e420 4e 47 3a 20 4f 6e 65 2d 74 69 6d 65 20 63 6f 73  NG: One-time cos
2e430 74 20 66 6f 72 20 63 6f 6d 70 75 74 69 6e 67 20  t for computing 
2e440 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e  the automatic in
2e450 64 65 78 20 69 73 0a 20 20 20 20 20 20 20 20 2a  dex is.        *
2e460 2a 20 65 73 74 69 6d 61 74 65 64 20 74 6f 20 62  * estimated to b
2e470 65 20 58 2a 4e 2a 6c 6f 67 32 28 4e 29 20 77 68  e X*N*log2(N) wh
2e480 65 72 65 20 4e 20 69 73 20 74 68 65 20 6e 75 6d  ere N is the num
2e490 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 0a 20  ber of rows in. 
2e4a0 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 74 61         ** the ta
2e4b0 62 6c 65 20 62 65 69 6e 67 20 69 6e 64 65 78 65  ble being indexe
2e4c0 64 20 61 6e 64 20 77 68 65 72 65 20 58 20 69 73  d and where X is
2e4d0 20 37 20 28 4c 6f 67 45 73 74 3d 32 38 29 20 66   7 (LogEst=28) f
2e4e0 6f 72 20 6e 6f 72 6d 61 6c 0a 20 20 20 20 20 20  or normal.      
2e4f0 20 20 2a 2a 20 74 61 62 6c 65 73 20 6f 72 20 31    ** tables or 1
2e500 2e 33 37 35 20 28 4c 6f 67 45 73 74 3d 34 29 20  .375 (LogEst=4) 
2e510 66 6f 72 20 76 69 65 77 73 20 61 6e 64 20 73 75  for views and su
2e520 62 71 75 65 72 69 65 73 2e 20 20 54 68 65 20 76  bqueries.  The v
2e530 61 6c 75 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  alue.        ** 
2e540 6f 66 20 58 20 69 73 20 73 6d 61 6c 6c 65 72 20  of X is smaller 
2e550 66 6f 72 20 76 69 65 77 73 20 61 6e 64 20 73 75  for views and su
2e560 62 71 75 65 72 69 65 73 20 73 6f 20 74 68 61 74  bqueries so that
2e570 20 74 68 65 20 71 75 65 72 79 20 70 6c 61 6e 6e   the query plann
2e580 65 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 69  er.        ** wi
2e590 6c 6c 20 62 65 20 6d 6f 72 65 20 61 67 67 72 65  ll be more aggre
2e5a0 73 73 69 76 65 20 61 62 6f 75 74 20 67 65 6e 65  ssive about gene
2e5b0 72 61 74 69 6e 67 20 61 75 74 6f 6d 61 74 69 63  rating automatic
2e5c0 20 69 6e 64 65 78 65 73 20 66 6f 72 0a 20 20 20   indexes for.   
2e5d0 20 20 20 20 20 2a 2a 20 74 68 6f 73 65 20 6f 62       ** those ob
2e5e0 6a 65 63 74 73 2c 20 73 69 6e 63 65 20 74 68 65  jects, since the
2e5f0 72 65 20 69 73 20 6e 6f 20 6f 70 70 6f 72 74 75  re is no opportu
2e600 6e 69 74 79 20 74 6f 20 61 64 64 20 73 63 68 65  nity to add sche
2e610 6d 61 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e  ma.        ** in
2e620 64 65 78 65 73 20 6f 6e 20 73 75 62 71 75 65 72  dexes on subquer
2e630 69 65 73 20 61 6e 64 20 76 69 65 77 73 2e 20 2a  ies and views. *
2e640 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  /.        pNew->
2e650 72 53 65 74 75 70 20 3d 20 72 4c 6f 67 53 69 7a  rSetup = rLogSiz
2e660 65 20 2b 20 72 53 69 7a 65 20 2b 20 34 3b 0a 20  e + rSize + 4;. 
2e670 20 20 20 20 20 20 20 69 66 28 20 70 54 61 62 2d         if( pTab-
2e680 3e 70 53 65 6c 65 63 74 3d 3d 30 20 26 26 20 28  >pSelect==0 && (
2e690 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26  pTab->tabFlags &
2e6a0 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 29 3d 3d   TF_Ephemeral)==
2e6b0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  0 ){.          p
2e6c0 4e 65 77 2d 3e 72 53 65 74 75 70 20 2b 3d 20 32  New->rSetup += 2
2e6d0 34 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  4;.        }.   
2e6e0 20 20 20 20 20 41 70 70 6c 79 43 6f 73 74 4d 75       ApplyCostMu
2e6f0 6c 74 69 70 6c 69 65 72 28 70 4e 65 77 2d 3e 72  ltiplier(pNew->r
2e700 53 65 74 75 70 2c 20 70 54 61 62 2d 3e 63 6f 73  Setup, pTab->cos
2e710 74 4d 75 6c 74 29 3b 0a 20 20 20 20 20 20 20 20  tMult);.        
2e720 2f 2a 20 54 55 4e 49 4e 47 3a 20 45 61 63 68 20  /* TUNING: Each 
2e730 69 6e 64 65 78 20 6c 6f 6f 6b 75 70 20 79 69 65  index lookup yie
2e740 6c 64 73 20 32 30 20 72 6f 77 73 20 69 6e 20 74  lds 20 rows in t
2e750 68 65 20 74 61 62 6c 65 2e 20 20 54 68 69 73 0a  he table.  This.
2e760 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 6d 6f          ** is mo
2e770 72 65 20 74 68 61 6e 20 74 68 65 20 75 73 75 61  re than the usua
2e780 6c 20 67 75 65 73 73 20 6f 66 20 31 30 20 72 6f  l guess of 10 ro
2e790 77 73 2c 20 73 69 6e 63 65 20 77 65 20 68 61 76  ws, since we hav
2e7a0 65 20 6e 6f 20 77 61 79 0a 20 20 20 20 20 20 20  e no way.       
2e7b0 20 2a 2a 20 6f 66 20 6b 6e 6f 77 69 6e 67 20 68   ** of knowing h
2e7c0 6f 77 20 73 65 6c 65 63 74 69 76 65 20 74 68 65  ow selective the
2e7d0 20 69 6e 64 65 78 20 77 69 6c 6c 20 75 6c 74 69   index will ulti
2e7e0 6d 61 74 65 6c 79 20 62 65 2e 20 20 49 74 20 77  mately be.  It w
2e7f0 6f 75 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a 20  ould.        ** 
2e800 6e 6f 74 20 62 65 20 75 6e 72 65 61 73 6f 6e 61  not be unreasona
2e810 62 6c 65 20 74 6f 20 6d 61 6b 65 20 74 68 69 73  ble to make this
2e820 20 76 61 6c 75 65 20 6d 75 63 68 20 6c 61 72 67   value much larg
2e830 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70  er. */.        p
2e840 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 34 33 3b 20  New->nOut = 43; 
2e850 20 61 73 73 65 72 74 28 20 34 33 3d 3d 73 71 6c   assert( 43==sql
2e860 69 74 65 33 4c 6f 67 45 73 74 28 32 30 29 20 29  ite3LogEst(20) )
2e870 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
2e880 72 52 75 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f  rRun = sqlite3Lo
2e890 67 45 73 74 41 64 64 28 72 4c 6f 67 53 69 7a 65  gEstAdd(rLogSize
2e8a0 2c 70 4e 65 77 2d 3e 6e 4f 75 74 29 3b 0a 20 20  ,pNew->nOut);.  
2e8b0 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c        pNew->wsFl
2e8c0 61 67 73 20 3d 20 57 48 45 52 45 5f 41 55 54 4f  ags = WHERE_AUTO
2e8d0 5f 49 4e 44 45 58 3b 0a 20 20 20 20 20 20 20 20  _INDEX;.        
2e8e0 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 6d  pNew->prereq = m
2e8f0 45 78 74 72 61 20 7c 20 70 54 65 72 6d 2d 3e 70  Extra | pTerm->p
2e900 72 65 72 65 71 52 69 67 68 74 3b 0a 20 20 20 20  rereqRight;.    
2e910 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f      rc = whereLo
2e920 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65  opInsert(pBuilde
2e930 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20  r, pNew);.      
2e940 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  }.    }.  }.#end
2e950 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
2e960 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45  T_AUTOMATIC_INDE
2e970 58 20 2a 2f 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20  X */..  /* Loop 
2e980 6f 76 65 72 20 61 6c 6c 20 69 6e 64 69 63 65 73  over all indices
2e990 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 3b 20 72 63  .  */.  for(; rc
2e9a0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
2e9b0 50 72 6f 62 65 3b 20 70 50 72 6f 62 65 3d 70 50  Probe; pProbe=pP
2e9c0 72 6f 62 65 2d 3e 70 4e 65 78 74 2c 20 69 53 6f  robe->pNext, iSo
2e9d0 72 74 49 64 78 2b 2b 29 7b 0a 20 20 20 20 69 66  rtIdx++){.    if
2e9e0 28 20 70 50 72 6f 62 65 2d 3e 70 50 61 72 74 49  ( pProbe->pPartI
2e9f0 64 78 57 68 65 72 65 21 3d 30 0a 20 20 20 20 20  dxWhere!=0.     
2ea00 26 26 20 21 77 68 65 72 65 55 73 61 62 6c 65 50  && !whereUsableP
2ea10 61 72 74 69 61 6c 49 6e 64 65 78 28 70 53 72 63  artialIndex(pSrc
2ea20 2d 3e 69 43 75 72 73 6f 72 2c 20 70 57 43 2c 20  ->iCursor, pWC, 
2ea30 70 50 72 6f 62 65 2d 3e 70 50 61 72 74 49 64 78  pProbe->pPartIdx
2ea40 57 68 65 72 65 29 20 29 7b 0a 20 20 20 20 20 20  Where) ){.      
2ea50 74 65 73 74 63 61 73 65 28 20 70 4e 65 77 2d 3e  testcase( pNew->
2ea60 69 54 61 62 21 3d 70 53 72 63 2d 3e 69 43 75 72  iTab!=pSrc->iCur
2ea70 73 6f 72 20 29 3b 20 20 2f 2a 20 53 65 65 20 74  sor );  /* See t
2ea80 69 63 6b 65 74 20 5b 39 38 64 39 37 33 62 38 66  icket [98d973b8f
2ea90 35 5d 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 74  5] */.      cont
2eaa0 69 6e 75 65 3b 20 20 2f 2a 20 50 61 72 74 69 61  inue;  /* Partia
2eab0 6c 20 69 6e 64 65 78 20 69 6e 61 70 70 72 6f 70  l index inapprop
2eac0 72 69 61 74 65 20 66 6f 72 20 74 68 69 73 20 71  riate for this q
2ead0 75 65 72 79 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  uery */.    }.  
2eae0 20 20 72 53 69 7a 65 20 3d 20 70 50 72 6f 62 65    rSize = pProbe
2eaf0 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 30 5d  ->aiRowLogEst[0]
2eb00 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74  ;.    pNew->u.bt
2eb10 72 65 65 2e 6e 45 71 20 3d 20 30 3b 0a 20 20 20  ree.nEq = 0;.   
2eb20 20 70 4e 65 77 2d 3e 6e 53 6b 69 70 20 3d 20 30   pNew->nSkip = 0
2eb30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54 65  ;.    pNew->nLTe
2eb40 72 6d 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77  rm = 0;.    pNew
2eb50 2d 3e 69 53 6f 72 74 49 64 78 20 3d 20 30 3b 0a  ->iSortIdx = 0;.
2eb60 20 20 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70      pNew->rSetup
2eb70 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e   = 0;.    pNew->
2eb80 70 72 65 72 65 71 20 3d 20 6d 45 78 74 72 61 3b  prereq = mExtra;
2eb90 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20  .    pNew->nOut 
2eba0 3d 20 72 53 69 7a 65 3b 0a 20 20 20 20 70 4e 65  = rSize;.    pNe
2ebb0 77 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  w->u.btree.pInde
2ebc0 78 20 3d 20 70 50 72 6f 62 65 3b 0a 20 20 20 20  x = pProbe;.    
2ebd0 62 20 3d 20 69 6e 64 65 78 4d 69 67 68 74 48 65  b = indexMightHe
2ebe0 6c 70 57 69 74 68 4f 72 64 65 72 42 79 28 70 42  lpWithOrderBy(pB
2ebf0 75 69 6c 64 65 72 2c 20 70 50 72 6f 62 65 2c 20  uilder, pProbe, 
2ec00 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 29 3b 0a  pSrc->iCursor);.
2ec10 20 20 20 20 2f 2a 20 54 68 65 20 4f 4e 45 50 41      /* The ONEPA
2ec20 53 53 5f 44 45 53 49 52 45 44 20 66 6c 61 67 73  SS_DESIRED flags
2ec30 20 6e 65 76 65 72 20 6f 63 63 75 72 73 20 74 6f   never occurs to
2ec40 67 65 74 68 65 72 20 77 69 74 68 20 4f 52 44 45  gether with ORDE
2ec50 52 20 42 59 20 2a 2f 0a 20 20 20 20 61 73 73 65  R BY */.    asse
2ec60 72 74 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74  rt( (pWInfo->wct
2ec70 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
2ec80 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44 29  ONEPASS_DESIRED)
2ec90 3d 3d 30 20 7c 7c 20 62 3d 3d 30 20 29 3b 0a 20  ==0 || b==0 );. 
2eca0 20 20 20 69 66 28 20 70 50 72 6f 62 65 2d 3e 74     if( pProbe->t
2ecb0 6e 75 6d 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20  num<=0 ){.      
2ecc0 2f 2a 20 49 6e 74 65 67 65 72 20 70 72 69 6d 61  /* Integer prima
2ecd0 72 79 20 6b 65 79 20 69 6e 64 65 78 20 2a 2f 0a  ry key index */.
2ece0 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c        pNew->wsFl
2ecf0 61 67 73 20 3d 20 57 48 45 52 45 5f 49 50 4b 3b  ags = WHERE_IPK;
2ed00 0a 0a 20 20 20 20 20 20 2f 2a 20 46 75 6c 6c 20  ..      /* Full 
2ed10 74 61 62 6c 65 20 73 63 61 6e 20 2a 2f 0a 20 20  table scan */.  
2ed20 20 20 20 20 70 4e 65 77 2d 3e 69 53 6f 72 74 49      pNew->iSortI
2ed30 64 78 20 3d 20 62 20 3f 20 69 53 6f 72 74 49 64  dx = b ? iSortId
2ed40 78 20 3a 20 30 3b 0a 20 20 20 20 20 20 2f 2a 20  x : 0;.      /* 
2ed50 54 55 4e 49 4e 47 3a 20 43 6f 73 74 20 6f 66 20  TUNING: Cost of 
2ed60 66 75 6c 6c 20 74 61 62 6c 65 20 73 63 61 6e 20  full table scan 
2ed70 69 73 20 28 4e 2a 33 2e 30 29 2e 20 2a 2f 0a 20  is (N*3.0). */. 
2ed80 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20       pNew->rRun 
2ed90 3d 20 72 53 69 7a 65 20 2b 20 31 36 3b 0a 20 20  = rSize + 16;.  
2eda0 20 20 20 20 41 70 70 6c 79 43 6f 73 74 4d 75 6c      ApplyCostMul
2edb0 74 69 70 6c 69 65 72 28 70 4e 65 77 2d 3e 72 52  tiplier(pNew->rR
2edc0 75 6e 2c 20 70 54 61 62 2d 3e 63 6f 73 74 4d 75  un, pTab->costMu
2edd0 6c 74 29 3b 0a 20 20 20 20 20 20 77 68 65 72 65  lt);.      where
2ede0 4c 6f 6f 70 4f 75 74 70 75 74 41 64 6a 75 73 74  LoopOutputAdjust
2edf0 28 70 57 43 2c 20 70 4e 65 77 2c 20 72 53 69 7a  (pWC, pNew, rSiz
2ee00 65 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77  e);.      rc = w
2ee10 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70  hereLoopInsert(p
2ee20 42 75 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a  Builder, pNew);.
2ee30 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74        pNew->nOut
2ee40 20 3d 20 72 53 69 7a 65 3b 0a 20 20 20 20 20 20   = rSize;.      
2ee50 69 66 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a  if( rc ) break;.
2ee60 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2ee70 20 42 69 74 6d 61 73 6b 20 6d 3b 0a 20 20 20 20   Bitmask m;.    
2ee80 20 20 69 66 28 20 70 50 72 6f 62 65 2d 3e 69 73    if( pProbe->is
2ee90 43 6f 76 65 72 69 6e 67 20 29 7b 0a 20 20 20 20  Covering ){.    
2eea0 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67      pNew->wsFlag
2eeb0 73 20 3d 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e  s = WHERE_IDX_ON
2eec0 4c 59 20 7c 20 57 48 45 52 45 5f 49 4e 44 45 58  LY | WHERE_INDEX
2eed0 45 44 3b 0a 20 20 20 20 20 20 20 20 6d 20 3d 20  ED;.        m = 
2eee0 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  0;.      }else{.
2eef0 20 20 20 20 20 20 20 20 6d 20 3d 20 70 53 72 63          m = pSrc
2ef00 2d 3e 63 6f 6c 55 73 65 64 20 26 20 7e 63 6f 6c  ->colUsed & ~col
2ef10 75 6d 6e 73 49 6e 49 6e 64 65 78 28 70 50 72 6f  umnsInIndex(pPro
2ef20 62 65 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  be);.        pNe
2ef30 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 28 6d 3d  w->wsFlags = (m=
2ef40 3d 30 29 20 3f 20 28 57 48 45 52 45 5f 49 44 58  =0) ? (WHERE_IDX
2ef50 5f 4f 4e 4c 59 7c 57 48 45 52 45 5f 49 4e 44 45  _ONLY|WHERE_INDE
2ef60 58 45 44 29 20 3a 20 57 48 45 52 45 5f 49 4e 44  XED) : WHERE_IND
2ef70 45 58 45 44 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  EXED;.      }.. 
2ef80 20 20 20 20 20 2f 2a 20 46 75 6c 6c 20 73 63 61       /* Full sca
2ef90 6e 20 76 69 61 20 69 6e 64 65 78 20 2a 2f 0a 20  n via index */. 
2efa0 20 20 20 20 20 69 66 28 20 62 0a 20 20 20 20 20       if( b.     
2efb0 20 20 7c 7c 20 21 48 61 73 52 6f 77 69 64 28 70    || !HasRowid(p
2efc0 54 61 62 29 0a 20 20 20 20 20 20 20 7c 7c 20 28  Tab).       || (
2efd0 20 6d 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26   m==0.         &
2efe0 26 20 70 50 72 6f 62 65 2d 3e 62 55 6e 6f 72 64  & pProbe->bUnord
2eff0 65 72 65 64 3d 3d 30 0a 20 20 20 20 20 20 20 20  ered==0.        
2f000 20 26 26 20 28 70 50 72 6f 62 65 2d 3e 73 7a 49   && (pProbe->szI
2f010 64 78 52 6f 77 3c 70 54 61 62 2d 3e 73 7a 54 61  dxRow<pTab->szTa
2f020 62 52 6f 77 29 0a 20 20 20 20 20 20 20 20 20 26  bRow).         &
2f030 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  & (pWInfo->wctrl
2f040 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e  Flags & WHERE_ON
2f050 45 50 41 53 53 5f 44 45 53 49 52 45 44 29 3d 3d  EPASS_DESIRED)==
2f060 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 73 71  0.         && sq
2f070 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
2f080 67 2e 62 55 73 65 43 69 73 0a 20 20 20 20 20 20  g.bUseCis.      
2f090 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69     && Optimizati
2f0a0 6f 6e 45 6e 61 62 6c 65 64 28 70 57 49 6e 66 6f  onEnabled(pWInfo
2f0b0 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2c 20 53 51  ->pParse->db, SQ
2f0c0 4c 49 54 45 5f 43 6f 76 65 72 49 64 78 53 63 61  LITE_CoverIdxSca
2f0d0 6e 29 0a 20 20 20 20 20 20 20 20 20 20 29 0a 20  n).          ). 
2f0e0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
2f0f0 70 4e 65 77 2d 3e 69 53 6f 72 74 49 64 78 20 3d  pNew->iSortIdx =
2f100 20 62 20 3f 20 69 53 6f 72 74 49 64 78 20 3a 20   b ? iSortIdx : 
2f110 30 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 54  0;..        /* T
2f120 68 65 20 63 6f 73 74 20 6f 66 20 76 69 73 69 74  he cost of visit
2f130 69 6e 67 20 74 68 65 20 69 6e 64 65 78 20 72 6f  ing the index ro
2f140 77 73 20 69 73 20 4e 2a 4b 2c 20 77 68 65 72 65  ws is N*K, where
2f150 20 4b 20 69 73 0a 20 20 20 20 20 20 20 20 2a 2a   K is.        **
2f160 20 62 65 74 77 65 65 6e 20 31 2e 31 20 61 6e 64   between 1.1 and
2f170 20 33 2e 30 2c 20 64 65 70 65 6e 64 69 6e 67 20   3.0, depending 
2f180 6f 6e 20 74 68 65 20 72 65 6c 61 74 69 76 65 20  on the relative 
2f190 73 69 7a 65 73 20 6f 66 20 74 68 65 0a 20 20 20  sizes of the.   
2f1a0 20 20 20 20 20 2a 2a 20 69 6e 64 65 78 20 61 6e       ** index an
2f1b0 64 20 74 61 62 6c 65 20 72 6f 77 73 2e 20 49 66  d table rows. If
2f1c0 20 74 68 69 73 20 69 73 20 61 20 6e 6f 6e 2d 63   this is a non-c
2f1d0 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20 73 63  overing index sc
2f1e0 61 6e 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  an,.        ** a
2f1f0 6c 73 6f 20 61 64 64 20 74 68 65 20 63 6f 73 74  lso add the cost
2f200 20 6f 66 20 76 69 73 69 74 69 6e 67 20 74 61 62   of visiting tab
2f210 6c 65 20 72 6f 77 73 20 28 4e 2a 33 2e 30 29 2e  le rows (N*3.0).
2f220 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65    */.        pNe
2f230 77 2d 3e 72 52 75 6e 20 3d 20 72 53 69 7a 65 20  w->rRun = rSize 
2f240 2b 20 31 20 2b 20 28 31 35 2a 70 50 72 6f 62 65  + 1 + (15*pProbe
2f250 2d 3e 73 7a 49 64 78 52 6f 77 29 2f 70 54 61 62  ->szIdxRow)/pTab
2f260 2d 3e 73 7a 54 61 62 52 6f 77 3b 0a 20 20 20 20  ->szTabRow;.    
2f270 20 20 20 20 69 66 28 20 6d 21 3d 30 20 29 7b 0a      if( m!=0 ){.
2f280 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
2f290 72 52 75 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f  rRun = sqlite3Lo
2f2a0 67 45 73 74 41 64 64 28 70 4e 65 77 2d 3e 72 52  gEstAdd(pNew->rR
2f2b0 75 6e 2c 20 72 53 69 7a 65 2b 31 36 29 3b 0a 20  un, rSize+16);. 
2f2c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2f2d0 20 41 70 70 6c 79 43 6f 73 74 4d 75 6c 74 69 70   ApplyCostMultip
2f2e0 6c 69 65 72 28 70 4e 65 77 2d 3e 72 52 75 6e 2c  lier(pNew->rRun,
2f2f0 20 70 54 61 62 2d 3e 63 6f 73 74 4d 75 6c 74 29   pTab->costMult)
2f300 3b 0a 20 20 20 20 20 20 20 20 77 68 65 72 65 4c  ;.        whereL
2f310 6f 6f 70 4f 75 74 70 75 74 41 64 6a 75 73 74 28  oopOutputAdjust(
2f320 70 57 43 2c 20 70 4e 65 77 2c 20 72 53 69 7a 65  pWC, pNew, rSize
2f330 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
2f340 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28  whereLoopInsert(
2f350 70 42 75 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b  pBuilder, pNew);
2f360 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e  .        pNew->n
2f370 4f 75 74 20 3d 20 72 53 69 7a 65 3b 0a 20 20 20  Out = rSize;.   
2f380 20 20 20 20 20 69 66 28 20 72 63 20 29 20 62 72       if( rc ) br
2f390 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
2f3a0 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20 77 68 65   }..    rc = whe
2f3b0 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 49 6e  reLoopAddBtreeIn
2f3c0 64 65 78 28 70 42 75 69 6c 64 65 72 2c 20 70 53  dex(pBuilder, pS
2f3d0 72 63 2c 20 70 50 72 6f 62 65 2c 20 30 29 3b 0a  rc, pProbe, 0);.
2f3e0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
2f3f0 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54  ABLE_STAT3_OR_ST
2f400 41 54 34 0a 20 20 20 20 73 71 6c 69 74 65 33 53  AT4.    sqlite3S
2f410 74 61 74 34 50 72 6f 62 65 46 72 65 65 28 70 42  tat4ProbeFree(pB
2f420 75 69 6c 64 65 72 2d 3e 70 52 65 63 29 3b 0a 20  uilder->pRec);. 
2f430 20 20 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65     pBuilder->nRe
2f440 63 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20 20 20  cValid = 0;.    
2f450 70 42 75 69 6c 64 65 72 2d 3e 70 52 65 63 20 3d  pBuilder->pRec =
2f460 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20   0;.#endif..    
2f470 2f 2a 20 49 66 20 74 68 65 72 65 20 77 61 73 20  /* If there was 
2f480 61 6e 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c  an INDEXED BY cl
2f490 61 75 73 65 2c 20 74 68 65 6e 20 6f 6e 6c 79 20  ause, then only 
2f4a0 74 68 61 74 20 6f 6e 65 20 69 6e 64 65 78 20 69  that one index i
2f4b0 73 0a 20 20 20 20 2a 2a 20 63 6f 6e 73 69 64 65  s.    ** conside
2f4c0 72 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  red. */.    if( 
2f4d0 70 53 72 63 2d 3e 70 49 6e 64 65 78 20 29 20 62  pSrc->pIndex ) b
2f4e0 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  reak;.  }.  retu
2f4f0 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65  rn rc;.}..#ifnde
2f500 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
2f510 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a  RTUALTABLE./*.**
2f520 20 41 64 64 20 61 6c 6c 20 57 68 65 72 65 4c 6f   Add all WhereLo
2f530 6f 70 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 61  op objects for a
2f540 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 6a 6f   table of the jo
2f550 69 6e 20 69 64 65 6e 74 69 66 69 65 64 20 62 79  in identified by
2f560 0a 2a 2a 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e  .** pBuilder->pN
2f570 65 77 2d 3e 69 54 61 62 2e 20 20 54 68 61 74 20  ew->iTab.  That 
2f580 74 61 62 6c 65 20 69 73 20 67 75 61 72 61 6e 74  table is guarant
2f590 65 65 64 20 74 6f 20 62 65 20 61 20 76 69 72 74  eed to be a virt
2f5a0 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  ual table..*/.st
2f5b0 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f  atic int whereLo
2f5c0 6f 70 41 64 64 56 69 72 74 75 61 6c 28 0a 20 20  opAddVirtual(.  
2f5d0 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72  WhereLoopBuilder
2f5e0 20 2a 70 42 75 69 6c 64 65 72 2c 20 20 2f 2a 20   *pBuilder,  /* 
2f5f0 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e 66  WHERE clause inf
2f600 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 42 69  ormation */.  Bi
2f610 74 6d 61 73 6b 20 6d 45 78 74 72 61 0a 29 7b 0a  tmask mExtra.){.
2f620 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
2f630 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20 20 2f  nfo;           /
2f640 2a 20 57 48 45 52 45 20 61 6e 61 6c 79 73 69 73  * WHERE analysis
2f650 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 50 61   context */.  Pa
2f660 72 73 65 20 2a 70 50 61 72 73 65 3b 20 20 20 20  rse *pParse;    
2f670 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
2f680 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  e parsing contex
2f690 74 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75  t */.  WhereClau
2f6a0 73 65 20 2a 70 57 43 3b 20 20 20 20 20 20 20 20  se *pWC;        
2f6b0 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
2f6c0 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72   clause */.  str
2f6d0 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
2f6e0 20 2a 70 53 72 63 3b 20 20 20 2f 2a 20 54 68 65   *pSrc;   /* The
2f6f0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72   FROM clause ter
2f700 6d 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20  m to search */. 
2f710 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
2f720 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 73  sqlite3 *db;.  s
2f730 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
2f740 6f 20 2a 70 49 64 78 49 6e 66 6f 3b 0a 20 20 73  o *pIdxInfo;.  s
2f750 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
2f760 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 20 2a  dex_constraint *
2f770 70 49 64 78 43 6f 6e 73 3b 0a 20 20 73 74 72 75  pIdxCons;.  stru
2f780 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
2f790 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61 67  _constraint_usag
2f7a0 65 20 2a 70 55 73 61 67 65 3b 0a 20 20 57 68 65  e *pUsage;.  Whe
2f7b0 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20  reTerm *pTerm;. 
2f7c0 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74   int i, j;.  int
2f7d0 20 69 54 65 72 6d 2c 20 6d 78 54 65 72 6d 3b 0a   iTerm, mxTerm;.
2f7e0 20 20 69 6e 74 20 6e 43 6f 6e 73 74 72 61 69 6e    int nConstrain
2f7f0 74 3b 0a 20 20 69 6e 74 20 73 65 65 6e 49 6e 20  t;.  int seenIn 
2f800 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
2f810 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 20    /* True if an 
2f820 49 4e 20 6f 70 65 72 61 74 6f 72 20 69 73 20 73  IN operator is s
2f830 65 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 73 65 65  een */.  int see
2f840 6e 56 61 72 20 3d 20 30 3b 20 20 20 20 20 20 20  nVar = 0;       
2f850 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
2f860 20 61 20 6e 6f 6e 2d 63 6f 6e 73 74 61 6e 74 20   a non-constant 
2f870 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 20 73 65  constraint is se
2f880 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 50 68 61  en */.  int iPha
2f890 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  se;             
2f8a0 20 20 20 20 20 2f 2a 20 30 3a 20 63 6f 6e 73 74       /* 0: const
2f8b0 20 77 2f 6f 20 49 4e 2c 20 31 3a 20 63 6f 6e 73   w/o IN, 1: cons
2f8c0 74 2c 20 32 3a 20 6e 6f 20 49 4e 2c 20 20 32 3a  t, 2: no IN,  2:
2f8d0 20 49 4e 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f   IN */.  WhereLo
2f8e0 6f 70 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20  op *pNew;.  int 
2f8f0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
2f900 0a 20 20 70 57 49 6e 66 6f 20 3d 20 70 42 75 69  .  pWInfo = pBui
2f910 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20  lder->pWInfo;.  
2f920 70 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d  pParse = pWInfo-
2f930 3e 70 50 61 72 73 65 3b 0a 20 20 64 62 20 3d 20  >pParse;.  db = 
2f940 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 57  pParse->db;.  pW
2f950 43 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57  C = pBuilder->pW
2f960 43 3b 0a 20 20 70 4e 65 77 20 3d 20 70 42 75 69  C;.  pNew = pBui
2f970 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 70 53  lder->pNew;.  pS
2f980 72 63 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 70 54  rc = &pWInfo->pT
2f990 61 62 4c 69 73 74 2d 3e 61 5b 70 4e 65 77 2d 3e  abList->a[pNew->
2f9a0 69 54 61 62 5d 3b 0a 20 20 70 54 61 62 20 3d 20  iTab];.  pTab = 
2f9b0 70 53 72 63 2d 3e 70 54 61 62 3b 0a 20 20 61 73  pSrc->pTab;.  as
2f9c0 73 65 72 74 28 20 49 73 56 69 72 74 75 61 6c 28  sert( IsVirtual(
2f9d0 70 54 61 62 29 20 29 3b 0a 20 20 70 49 64 78 49  pTab) );.  pIdxI
2f9e0 6e 66 6f 20 3d 20 61 6c 6c 6f 63 61 74 65 49 6e  nfo = allocateIn
2f9f0 64 65 78 49 6e 66 6f 28 70 50 61 72 73 65 2c 20  dexInfo(pParse, 
2fa00 70 57 43 2c 20 70 53 72 63 2c 20 70 42 75 69 6c  pWC, pSrc, pBuil
2fa10 64 65 72 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a  der->pOrderBy);.
2fa20 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f 3d 3d    if( pIdxInfo==
2fa30 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
2fa40 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 70 4e 65 77 2d  E_NOMEM;.  pNew-
2fa50 3e 70 72 65 72 65 71 20 3d 20 30 3b 0a 20 20 70  >prereq = 0;.  p
2fa60 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b  New->rSetup = 0;
2fa70 0a 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73  .  pNew->wsFlags
2fa80 20 3d 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c   = WHERE_VIRTUAL
2fa90 54 41 42 4c 45 3b 0a 20 20 70 4e 65 77 2d 3e 6e  TABLE;.  pNew->n
2faa0 4c 54 65 72 6d 20 3d 20 30 3b 0a 20 20 70 4e 65  LTerm = 0;.  pNe
2fab0 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72  w->u.vtab.needFr
2fac0 65 65 20 3d 20 30 3b 0a 20 20 70 55 73 61 67 65  ee = 0;.  pUsage
2fad0 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f   = pIdxInfo->aCo
2fae0 6e 73 74 72 61 69 6e 74 55 73 61 67 65 3b 0a 20  nstraintUsage;. 
2faf0 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 70   nConstraint = p
2fb00 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72  IdxInfo->nConstr
2fb10 61 69 6e 74 3b 0a 20 20 69 66 28 20 77 68 65 72  aint;.  if( wher
2fb20 65 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62 2c 20  eLoopResize(db, 
2fb30 70 4e 65 77 2c 20 6e 43 6f 6e 73 74 72 61 69 6e  pNew, nConstrain
2fb40 74 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  t) ){.    sqlite
2fb50 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 64 78  3DbFree(db, pIdx
2fb60 49 6e 66 6f 29 3b 0a 20 20 20 20 72 65 74 75 72  Info);.    retur
2fb70 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
2fb80 20 20 7d 0a 0a 20 20 66 6f 72 28 69 50 68 61 73    }..  for(iPhas
2fb90 65 3d 30 3b 20 69 50 68 61 73 65 3c 3d 33 3b 20  e=0; iPhase<=3; 
2fba0 69 50 68 61 73 65 2b 2b 29 7b 0a 20 20 20 20 69  iPhase++){.    i
2fbb0 66 28 20 21 73 65 65 6e 49 6e 20 26 26 20 28 69  f( !seenIn && (i
2fbc0 50 68 61 73 65 26 31 29 21 3d 30 20 29 7b 0a 20  Phase&1)!=0 ){. 
2fbd0 20 20 20 20 20 69 50 68 61 73 65 2b 2b 3b 0a 20       iPhase++;. 
2fbe0 20 20 20 20 20 69 66 28 20 69 50 68 61 73 65 3e       if( iPhase>
2fbf0 33 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  3 ) break;.    }
2fc00 0a 20 20 20 20 69 66 28 20 21 73 65 65 6e 56 61  .    if( !seenVa
2fc10 72 20 26 26 20 69 50 68 61 73 65 3e 31 20 29 20  r && iPhase>1 ) 
2fc20 62 72 65 61 6b 3b 0a 20 20 20 20 70 49 64 78 43  break;.    pIdxC
2fc30 6f 6e 73 20 3d 20 2a 28 73 74 72 75 63 74 20 73  ons = *(struct s
2fc40 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e  qlite3_index_con
2fc50 73 74 72 61 69 6e 74 2a 2a 29 26 70 49 64 78 49  straint**)&pIdxI
2fc60 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74  nfo->aConstraint
2fc70 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
2fc80 3c 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73  <pIdxInfo->nCons
2fc90 74 72 61 69 6e 74 3b 20 69 2b 2b 2c 20 70 49 64  traint; i++, pId
2fca0 78 43 6f 6e 73 2b 2b 29 7b 0a 20 20 20 20 20 20  xCons++){.      
2fcb0 6a 20 3d 20 70 49 64 78 43 6f 6e 73 2d 3e 69 54  j = pIdxCons->iT
2fcc0 65 72 6d 4f 66 66 73 65 74 3b 0a 20 20 20 20 20  ermOffset;.     
2fcd0 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61   pTerm = &pWC->a
2fce0 5b 6a 5d 3b 0a 20 20 20 20 20 20 73 77 69 74 63  [j];.      switc
2fcf0 68 28 20 69 50 68 61 73 65 20 29 7b 0a 20 20 20  h( iPhase ){.   
2fd00 20 20 20 20 20 63 61 73 65 20 30 3a 20 20 20 20       case 0:    
2fd10 2f 2a 20 43 6f 6e 73 74 61 6e 74 73 20 77 69 74  /* Constants wit
2fd20 68 6f 75 74 20 49 4e 20 6f 70 65 72 61 74 6f 72  hout IN operator
2fd30 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70 49   */.          pI
2fd40 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d  dxCons->usable =
2fd50 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   0;.          if
2fd60 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  ( (pTerm->eOpera
2fd70 74 6f 72 20 26 20 57 4f 5f 49 4e 29 21 3d 30 20  tor & WO_IN)!=0 
2fd80 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
2fd90 65 65 6e 49 6e 20 3d 20 31 3b 0a 20 20 20 20 20  eenIn = 1;.     
2fda0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2fdb0 20 69 66 28 20 70 54 65 72 6d 2d 3e 70 72 65 72   if( pTerm->prer
2fdc0 65 71 52 69 67 68 74 21 3d 30 20 29 7b 0a 20 20  eqRight!=0 ){.  
2fdd0 20 20 20 20 20 20 20 20 20 20 73 65 65 6e 56 61            seenVa
2fde0 72 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  r = 1;.         
2fdf0 20 7d 65 6c 73 65 20 69 66 28 20 28 70 54 65 72   }else if( (pTer
2fe00 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
2fe10 4f 5f 49 4e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  O_IN)==0 ){.    
2fe20 20 20 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73          pIdxCons
2fe30 2d 3e 75 73 61 62 6c 65 20 3d 20 31 3b 0a 20 20  ->usable = 1;.  
2fe40 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2fe50 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
2fe60 20 20 20 63 61 73 65 20 31 3a 20 20 20 20 2f 2a     case 1:    /*
2fe70 20 43 6f 6e 73 74 61 6e 74 73 20 77 69 74 68 20   Constants with 
2fe80 49 4e 20 6f 70 65 72 61 74 6f 72 73 20 2a 2f 0a  IN operators */.
2fe90 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
2fea0 28 20 73 65 65 6e 49 6e 20 29 3b 0a 20 20 20 20  ( seenIn );.    
2feb0 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e        pIdxCons->
2fec0 75 73 61 62 6c 65 20 3d 20 28 70 54 65 72 6d 2d  usable = (pTerm-
2fed0 3e 70 72 65 72 65 71 52 69 67 68 74 3d 3d 30 29  >prereqRight==0)
2fee0 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
2fef0 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  k;.        case 
2ff00 32 3a 20 20 20 20 2f 2a 20 56 61 72 69 61 62 6c  2:    /* Variabl
2ff10 65 73 20 77 69 74 68 6f 75 74 20 49 4e 20 2a 2f  es without IN */
2ff20 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
2ff30 74 28 20 73 65 65 6e 56 61 72 20 29 3b 0a 20 20  t( seenVar );.  
2ff40 20 20 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73          pIdxCons
2ff50 2d 3e 75 73 61 62 6c 65 20 3d 20 28 70 54 65 72  ->usable = (pTer
2ff60 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
2ff70 4f 5f 49 4e 29 3d 3d 30 3b 0a 20 20 20 20 20 20  O_IN)==0;.      
2ff80 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
2ff90 20 20 20 64 65 66 61 75 6c 74 3a 20 20 20 2f 2a     default:   /*
2ffa0 20 56 61 72 69 61 62 6c 65 73 20 77 69 74 68 20   Variables with 
2ffb0 49 4e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  IN */.          
2ffc0 61 73 73 65 72 74 28 20 73 65 65 6e 56 61 72 20  assert( seenVar 
2ffd0 26 26 20 73 65 65 6e 49 6e 20 29 3b 0a 20 20 20  && seenIn );.   
2ffe0 20 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73 2d         pIdxCons-
2fff0 3e 75 73 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20  >usable = 1;.   
30000 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
30010 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
30020 6d 65 6d 73 65 74 28 70 55 73 61 67 65 2c 20 30  memset(pUsage, 0
30030 2c 20 73 69 7a 65 6f 66 28 70 55 73 61 67 65 5b  , sizeof(pUsage[
30040 30 5d 29 2a 70 49 64 78 49 6e 66 6f 2d 3e 6e 43  0])*pIdxInfo->nC
30050 6f 6e 73 74 72 61 69 6e 74 29 3b 0a 20 20 20 20  onstraint);.    
30060 69 66 28 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65  if( pIdxInfo->ne
30070 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 20 29  edToFreeIdxStr )
30080 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49   sqlite3_free(pI
30090 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72 29 3b  dxInfo->idxStr);
300a0 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69  .    pIdxInfo->i
300b0 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 20 20 70  dxStr = 0;.    p
300c0 49 64 78 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d 20  IdxInfo->idxNum 
300d0 3d 20 30 3b 0a 20 20 20 20 70 49 64 78 49 6e 66  = 0;.    pIdxInf
300e0 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78  o->needToFreeIdx
300f0 53 74 72 20 3d 20 30 3b 0a 20 20 20 20 70 49 64  Str = 0;.    pId
30100 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f  xInfo->orderByCo
30110 6e 73 75 6d 65 64 20 3d 20 30 3b 0a 20 20 20 20  nsumed = 0;.    
30120 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61  pIdxInfo->estima
30130 74 65 64 43 6f 73 74 20 3d 20 53 51 4c 49 54 45  tedCost = SQLITE
30140 5f 42 49 47 5f 44 42 4c 20 2f 20 28 64 6f 75 62  _BIG_DBL / (doub
30150 6c 65 29 32 3b 0a 20 20 20 20 70 49 64 78 49 6e  le)2;.    pIdxIn
30160 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 52 6f 77  fo->estimatedRow
30170 73 20 3d 20 32 35 3b 0a 20 20 20 20 72 63 20 3d  s = 25;.    rc =
30180 20 76 74 61 62 42 65 73 74 49 6e 64 65 78 28 70   vtabBestIndex(p
30190 50 61 72 73 65 2c 20 70 54 61 62 2c 20 70 49 64  Parse, pTab, pId
301a0 78 49 6e 66 6f 29 3b 0a 20 20 20 20 69 66 28 20  xInfo);.    if( 
301b0 72 63 20 29 20 67 6f 74 6f 20 77 68 65 72 65 4c  rc ) goto whereL
301c0 6f 6f 70 41 64 64 56 74 61 62 5f 65 78 69 74 3b  oopAddVtab_exit;
301d0 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 20 3d 20  .    pIdxCons = 
301e0 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33  *(struct sqlite3
301f0 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e  _index_constrain
30200 74 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61  t**)&pIdxInfo->a
30210 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 20 20  Constraint;.    
30220 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 6d  pNew->prereq = m
30230 45 78 74 72 61 3b 0a 20 20 20 20 6d 78 54 65 72  Extra;.    mxTer
30240 6d 20 3d 20 2d 31 3b 0a 20 20 20 20 61 73 73 65  m = -1;.    asse
30250 72 74 28 20 70 4e 65 77 2d 3e 6e 4c 53 6c 6f 74  rt( pNew->nLSlot
30260 3e 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 20 29 3b  >=nConstraint );
30270 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
30280 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b  nConstraint; i++
30290 29 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 69  ) pNew->aLTerm[i
302a0 5d 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d  ] = 0;.    pNew-
302b0 3e 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b  >u.vtab.omitMask
302c0 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d   = 0;.    for(i=
302d0 30 3b 20 69 3c 6e 43 6f 6e 73 74 72 61 69 6e 74  0; i<nConstraint
302e0 3b 20 69 2b 2b 2c 20 70 49 64 78 43 6f 6e 73 2b  ; i++, pIdxCons+
302f0 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 69  +){.      if( (i
30300 54 65 72 6d 20 3d 20 70 55 73 61 67 65 5b 69 5d  Term = pUsage[i]
30310 2e 61 72 67 76 49 6e 64 65 78 20 2d 20 31 29 3e  .argvIndex - 1)>
30320 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6a 20  =0 ){.        j 
30330 3d 20 70 49 64 78 43 6f 6e 73 2d 3e 69 54 65 72  = pIdxCons->iTer
30340 6d 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20  mOffset;.       
30350 20 69 66 28 20 69 54 65 72 6d 3e 3d 6e 43 6f 6e   if( iTerm>=nCon
30360 73 74 72 61 69 6e 74 0a 20 20 20 20 20 20 20 20  straint.        
30370 20 7c 7c 20 6a 3c 30 0a 20 20 20 20 20 20 20 20   || j<0.        
30380 20 7c 7c 20 6a 3e 3d 70 57 43 2d 3e 6e 54 65 72   || j>=pWC->nTer
30390 6d 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 4e  m.         || pN
303a0 65 77 2d 3e 61 4c 54 65 72 6d 5b 69 54 65 72 6d  ew->aLTerm[iTerm
303b0 5d 21 3d 30 0a 20 20 20 20 20 20 20 20 29 7b 0a  ]!=0.        ){.
303c0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
303d0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
303e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
303f0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
30400 25 73 2e 78 42 65 73 74 49 6e 64 65 78 28 29 20  %s.xBestIndex() 
30410 6d 61 6c 66 75 6e 63 74 69 6f 6e 22 2c 20 70 54  malfunction", pT
30420 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
30430 20 20 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65        goto where
30440 4c 6f 6f 70 41 64 64 56 74 61 62 5f 65 78 69 74  LoopAddVtab_exit
30450 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
30460 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 54      testcase( iT
30470 65 72 6d 3d 3d 6e 43 6f 6e 73 74 72 61 69 6e 74  erm==nConstraint
30480 2d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65  -1 );.        te
30490 73 74 63 61 73 65 28 20 6a 3d 3d 30 20 29 3b 0a  stcase( j==0 );.
304a0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
304b0 28 20 6a 3d 3d 70 57 43 2d 3e 6e 54 65 72 6d 2d  ( j==pWC->nTerm-
304c0 31 20 29 3b 0a 20 20 20 20 20 20 20 20 70 54 65  1 );.        pTe
304d0 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 6a 5d 3b  rm = &pWC->a[j];
304e0 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70  .        pNew->p
304f0 72 65 72 65 71 20 7c 3d 20 70 54 65 72 6d 2d 3e  rereq |= pTerm->
30500 70 72 65 72 65 71 52 69 67 68 74 3b 0a 20 20 20  prereqRight;.   
30510 20 20 20 20 20 61 73 73 65 72 74 28 20 69 54 65       assert( iTe
30520 72 6d 3c 70 4e 65 77 2d 3e 6e 4c 53 6c 6f 74 20  rm<pNew->nLSlot 
30530 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  );.        pNew-
30540 3e 61 4c 54 65 72 6d 5b 69 54 65 72 6d 5d 20 3d  >aLTerm[iTerm] =
30550 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20   pTerm;.        
30560 69 66 28 20 69 54 65 72 6d 3e 6d 78 54 65 72 6d  if( iTerm>mxTerm
30570 20 29 20 6d 78 54 65 72 6d 20 3d 20 69 54 65 72   ) mxTerm = iTer
30580 6d 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  m;.        testc
30590 61 73 65 28 20 69 54 65 72 6d 3d 3d 31 35 20 29  ase( iTerm==15 )
305a0 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
305b0 73 65 28 20 69 54 65 72 6d 3d 3d 31 36 20 29 3b  se( iTerm==16 );
305c0 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 54 65  .        if( iTe
305d0 72 6d 3c 31 36 20 26 26 20 70 55 73 61 67 65 5b  rm<16 && pUsage[
305e0 69 5d 2e 6f 6d 69 74 20 29 20 70 4e 65 77 2d 3e  i].omit ) pNew->
305f0 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 20  u.vtab.omitMask 
30600 7c 3d 20 31 3c 3c 69 54 65 72 6d 3b 0a 20 20 20  |= 1<<iTerm;.   
30610 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d       if( (pTerm-
30620 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
30630 49 4e 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  IN)!=0 ){.      
30640 20 20 20 20 69 66 28 20 70 55 73 61 67 65 5b 69      if( pUsage[i
30650 5d 2e 6f 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20  ].omit==0 ){.   
30660 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e           /* Do n
30670 6f 74 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73  ot attempt to us
30680 65 20 61 6e 20 49 4e 20 63 6f 6e 73 74 72 61 69  e an IN constrai
30690 6e 74 20 69 66 20 74 68 65 20 76 69 72 74 75 61  nt if the virtua
306a0 6c 20 74 61 62 6c 65 0a 20 20 20 20 20 20 20 20  l table.        
306b0 20 20 20 20 2a 2a 20 73 61 79 73 20 74 68 61 74      ** says that
306c0 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74 20   the equivalent 
306d0 45 51 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 61  EQ constraint ca
306e0 6e 6e 6f 74 20 62 65 20 73 61 66 65 6c 79 20 6f  nnot be safely o
306f0 6d 69 74 74 65 64 2e 0a 20 20 20 20 20 20 20 20  mitted..        
30700 20 20 20 20 2a 2a 20 49 66 20 77 65 20 64 6f 20      ** If we do 
30710 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20 73  attempt to use s
30720 75 63 68 20 61 20 63 6f 6e 73 74 72 61 69 6e 74  uch a constraint
30730 2c 20 73 6f 6d 65 20 72 6f 77 73 20 6d 69 67 68  , some rows migh
30740 74 20 62 65 0a 20 20 20 20 20 20 20 20 20 20 20  t be.           
30750 20 2a 2a 20 72 65 70 65 61 74 65 64 20 69 6e 20   ** repeated in 
30760 74 68 65 20 6f 75 74 70 75 74 2e 20 2a 2f 0a 20  the output. */. 
30770 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
30780 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
30790 20 20 20 20 20 20 20 20 2f 2a 20 41 20 76 69 72          /* A vir
307a0 74 75 61 6c 20 74 61 62 6c 65 20 74 68 61 74 20  tual table that 
307b0 69 73 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 62  is constrained b
307c0 79 20 61 6e 20 49 4e 20 63 6c 61 75 73 65 20 6d  y an IN clause m
307d0 61 79 20 6e 6f 74 0a 20 20 20 20 20 20 20 20 20  ay not.         
307e0 20 2a 2a 20 63 6f 6e 73 75 6d 65 20 74 68 65 20   ** consume the 
307f0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
30800 62 65 63 61 75 73 65 20 28 31 29 20 74 68 65 20  because (1) the 
30810 6f 72 64 65 72 20 6f 66 20 49 4e 20 74 65 72 6d  order of IN term
30820 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69  s.          ** i
30830 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c  s not necessaril
30840 79 20 72 65 6c 61 74 65 64 20 74 6f 20 74 68 65  y related to the
30850 20 6f 72 64 65 72 20 6f 66 20 6f 75 74 70 75 74   order of output
30860 20 74 65 72 6d 73 20 61 6e 64 0a 20 20 20 20 20   terms and.     
30870 20 20 20 20 20 2a 2a 20 28 32 29 20 4d 75 6c 74       ** (2) Mult
30880 69 70 6c 65 20 6f 75 74 70 75 74 73 20 66 72 6f  iple outputs fro
30890 6d 20 61 20 73 69 6e 67 6c 65 20 49 4e 20 76 61  m a single IN va
308a0 6c 75 65 20 77 69 6c 6c 20 6e 6f 74 20 6d 65 72  lue will not mer
308b0 67 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ge.          ** 
308c0 74 6f 67 65 74 68 65 72 2e 20 20 2a 2f 0a 20 20  together.  */.  
308d0 20 20 20 20 20 20 20 20 70 49 64 78 49 6e 66 6f          pIdxInfo
308e0 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65  ->orderByConsume
308f0 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  d = 0;.        }
30900 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
30910 20 20 20 69 66 28 20 69 3e 3d 6e 43 6f 6e 73 74     if( i>=nConst
30920 72 61 69 6e 74 20 29 7b 0a 20 20 20 20 20 20 70  raint ){.      p
30930 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 6d 78  New->nLTerm = mx
30940 54 65 72 6d 2b 31 3b 0a 20 20 20 20 20 20 61 73  Term+1;.      as
30950 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4c 54 65  sert( pNew->nLTe
30960 72 6d 3c 3d 70 4e 65 77 2d 3e 6e 4c 53 6c 6f 74  rm<=pNew->nLSlot
30970 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e   );.      pNew->
30980 75 2e 76 74 61 62 2e 69 64 78 4e 75 6d 20 3d 20  u.vtab.idxNum = 
30990 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d  pIdxInfo->idxNum
309a0 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e  ;.      pNew->u.
309b0 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3d 20  vtab.needFree = 
309c0 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f  pIdxInfo->needTo
309d0 46 72 65 65 49 64 78 53 74 72 3b 0a 20 20 20 20  FreeIdxStr;.    
309e0 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64    pIdxInfo->need
309f0 54 6f 46 72 65 65 49 64 78 53 74 72 20 3d 20 30  ToFreeIdxStr = 0
30a00 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e  ;.      pNew->u.
30a10 76 74 61 62 2e 69 64 78 53 74 72 20 3d 20 70 49  vtab.idxStr = pI
30a20 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72 3b 0a  dxInfo->idxStr;.
30a30 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74        pNew->u.vt
30a40 61 62 2e 69 73 4f 72 64 65 72 65 64 20 3d 20 28  ab.isOrdered = (
30a50 69 38 29 28 70 49 64 78 49 6e 66 6f 2d 3e 6f 72  i8)(pIdxInfo->or
30a60 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 20 3f 0a  derByConsumed ?.
30a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30a90 20 20 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e        pIdxInfo->
30aa0 6e 4f 72 64 65 72 42 79 20 3a 20 30 29 3b 0a 20  nOrderBy : 0);. 
30ab0 20 20 20 20 20 70 4e 65 77 2d 3e 72 53 65 74 75       pNew->rSetu
30ac0 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4e 65  p = 0;.      pNe
30ad0 77 2d 3e 72 52 75 6e 20 3d 20 73 71 6c 69 74 65  w->rRun = sqlite
30ae0 33 4c 6f 67 45 73 74 46 72 6f 6d 44 6f 75 62 6c  3LogEstFromDoubl
30af0 65 28 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69  e(pIdxInfo->esti
30b00 6d 61 74 65 64 43 6f 73 74 29 3b 0a 20 20 20 20  matedCost);.    
30b10 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73    pNew->nOut = s
30b20 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 70 49 64  qlite3LogEst(pId
30b30 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64  xInfo->estimated
30b40 52 6f 77 73 29 3b 0a 20 20 20 20 20 20 77 68 65  Rows);.      whe
30b50 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75  reLoopInsert(pBu
30b60 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20  ilder, pNew);.  
30b70 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 75 2e      if( pNew->u.
30b80 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20 29 7b  vtab.needFree ){
30b90 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
30ba0 5f 66 72 65 65 28 70 4e 65 77 2d 3e 75 2e 76 74  _free(pNew->u.vt
30bb0 61 62 2e 69 64 78 53 74 72 29 3b 0a 20 20 20 20  ab.idxStr);.    
30bc0 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62      pNew->u.vtab
30bd0 2e 6e 65 65 64 46 72 65 65 20 3d 20 30 3b 0a 20  .needFree = 0;. 
30be0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
30bf0 20 20 0a 0a 77 68 65 72 65 4c 6f 6f 70 41 64 64    ..whereLoopAdd
30c00 56 74 61 62 5f 65 78 69 74 3a 0a 20 20 69 66 28  Vtab_exit:.  if(
30c10 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54   pIdxInfo->needT
30c20 6f 46 72 65 65 49 64 78 53 74 72 20 29 20 73 71  oFreeIdxStr ) sq
30c30 6c 69 74 65 33 5f 66 72 65 65 28 70 49 64 78 49  lite3_free(pIdxI
30c40 6e 66 6f 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20  nfo->idxStr);.  
30c50 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
30c60 2c 20 70 49 64 78 49 6e 66 6f 29 3b 0a 20 20 72  , pIdxInfo);.  r
30c70 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64  eturn rc;.}.#end
30c80 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
30c90 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a  T_VIRTUALTABLE *
30ca0 2f 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 57 68 65  /../*.** Add Whe
30cb0 72 65 4c 6f 6f 70 20 65 6e 74 72 69 65 73 20 74  reLoop entries t
30cc0 6f 20 68 61 6e 64 6c 65 20 4f 52 20 74 65 72 6d  o handle OR term
30cd0 73 2e 20 20 54 68 69 73 20 77 6f 72 6b 73 20 66  s.  This works f
30ce0 6f 72 20 65 69 74 68 65 72 0a 2a 2a 20 62 74 72  or either.** btr
30cf0 65 65 73 20 6f 72 20 76 69 72 74 75 61 6c 20 74  ees or virtual t
30d00 61 62 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  ables..*/.static
30d10 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64   int whereLoopAd
30d20 64 4f 72 28 57 68 65 72 65 4c 6f 6f 70 42 75 69  dOr(WhereLoopBui
30d30 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 20  lder *pBuilder, 
30d40 42 69 74 6d 61 73 6b 20 6d 45 78 74 72 61 29 7b  Bitmask mExtra){
30d50 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  .  WhereInfo *pW
30d60 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d  Info = pBuilder-
30d70 3e 70 57 49 6e 66 6f 3b 0a 20 20 57 68 65 72 65  >pWInfo;.  Where
30d80 43 6c 61 75 73 65 20 2a 70 57 43 3b 0a 20 20 57  Clause *pWC;.  W
30d90 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a  hereLoop *pNew;.
30da0 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
30db0 72 6d 2c 20 2a 70 57 43 45 6e 64 3b 0a 20 20 69  rm, *pWCEnd;.  i
30dc0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
30dd0 4b 3b 0a 20 20 69 6e 74 20 69 43 75 72 3b 0a 20  K;.  int iCur;. 
30de0 20 57 68 65 72 65 43 6c 61 75 73 65 20 74 65 6d   WhereClause tem
30df0 70 57 43 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70  pWC;.  WhereLoop
30e00 42 75 69 6c 64 65 72 20 73 53 75 62 42 75 69 6c  Builder sSubBuil
30e10 64 3b 0a 20 20 57 68 65 72 65 4f 72 53 65 74 20  d;.  WhereOrSet 
30e20 73 53 75 6d 2c 20 73 43 75 72 3b 0a 20 20 73 74  sSum, sCur;.  st
30e30 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
30e40 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 0a 20 20 70  m *pItem;.  .  p
30e50 57 43 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  WC = pBuilder->p
30e60 57 43 3b 0a 20 20 70 57 43 45 6e 64 20 3d 20 70  WC;.  pWCEnd = p
30e70 57 43 2d 3e 61 20 2b 20 70 57 43 2d 3e 6e 54 65  WC->a + pWC->nTe
30e80 72 6d 3b 0a 20 20 70 4e 65 77 20 3d 20 70 42 75  rm;.  pNew = pBu
30e90 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 6d  ilder->pNew;.  m
30ea0 65 6d 73 65 74 28 26 73 53 75 6d 2c 20 30 2c 20  emset(&sSum, 0, 
30eb0 73 69 7a 65 6f 66 28 73 53 75 6d 29 29 3b 0a 20  sizeof(sSum));. 
30ec0 20 70 49 74 65 6d 20 3d 20 70 57 49 6e 66 6f 2d   pItem = pWInfo-
30ed0 3e 70 54 61 62 4c 69 73 74 2d 3e 61 20 2b 20 70  >pTabList->a + p
30ee0 4e 65 77 2d 3e 69 54 61 62 3b 0a 20 20 69 43 75  New->iTab;.  iCu
30ef0 72 20 3d 20 70 49 74 65 6d 2d 3e 69 43 75 72 73  r = pItem->iCurs
30f00 6f 72 3b 0a 0a 20 20 66 6f 72 28 70 54 65 72 6d  or;..  for(pTerm
30f10 3d 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70  =pWC->a; pTerm<p
30f20 57 43 45 6e 64 20 26 26 20 72 63 3d 3d 53 51 4c  WCEnd && rc==SQL
30f30 49 54 45 5f 4f 4b 3b 20 70 54 65 72 6d 2b 2b 29  ITE_OK; pTerm++)
30f40 7b 0a 20 20 20 20 69 66 28 20 28 70 54 65 72 6d  {.    if( (pTerm
30f50 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
30f60 5f 4f 52 29 21 3d 30 0a 20 20 20 20 20 26 26 20  _OR)!=0.     && 
30f70 28 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66  (pTerm->u.pOrInf
30f80 6f 2d 3e 69 6e 64 65 78 61 62 6c 65 20 26 20 70  o->indexable & p
30f90 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 29 21 3d  New->maskSelf)!=
30fa0 30 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  0 .    ){.      
30fb0 57 68 65 72 65 43 6c 61 75 73 65 20 2a 20 63 6f  WhereClause * co
30fc0 6e 73 74 20 70 4f 72 57 43 20 3d 20 26 70 54 65  nst pOrWC = &pTe
30fd0 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 77  rm->u.pOrInfo->w
30fe0 63 3b 0a 20 20 20 20 20 20 57 68 65 72 65 54 65  c;.      WhereTe
30ff0 72 6d 20 2a 20 63 6f 6e 73 74 20 70 4f 72 57 43  rm * const pOrWC
31000 45 6e 64 20 3d 20 26 70 4f 72 57 43 2d 3e 61 5b  End = &pOrWC->a[
31010 70 4f 72 57 43 2d 3e 6e 54 65 72 6d 5d 3b 0a 20  pOrWC->nTerm];. 
31020 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a       WhereTerm *
31030 70 4f 72 54 65 72 6d 3b 0a 20 20 20 20 20 20 69  pOrTerm;.      i
31040 6e 74 20 6f 6e 63 65 20 3d 20 31 3b 0a 20 20 20  nt once = 1;.   
31050 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20     int i, j;.   
31060 20 0a 20 20 20 20 20 20 73 53 75 62 42 75 69 6c   .      sSubBuil
31070 64 20 3d 20 2a 70 42 75 69 6c 64 65 72 3b 0a 20  d = *pBuilder;. 
31080 20 20 20 20 20 73 53 75 62 42 75 69 6c 64 2e 70       sSubBuild.p
31090 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20  OrderBy = 0;.   
310a0 20 20 20 73 53 75 62 42 75 69 6c 64 2e 70 4f 72     sSubBuild.pOr
310b0 53 65 74 20 3d 20 26 73 43 75 72 3b 0a 0a 20 20  Set = &sCur;..  
310c0 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30      WHERETRACE(0
310d0 78 32 30 30 2c 20 28 22 42 65 67 69 6e 20 70 72  x200, ("Begin pr
310e0 6f 63 65 73 73 69 6e 67 20 4f 52 2d 63 6c 61 75  ocessing OR-clau
310f0 73 65 20 25 70 5c 6e 22 2c 20 70 54 65 72 6d 29  se %p\n", pTerm)
31100 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 4f 72  );.      for(pOr
31110 54 65 72 6d 3d 70 4f 72 57 43 2d 3e 61 3b 20 70  Term=pOrWC->a; p
31120 4f 72 54 65 72 6d 3c 70 4f 72 57 43 45 6e 64 3b  OrTerm<pOrWCEnd;
31130 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20   pOrTerm++){.   
31140 20 20 20 20 20 69 66 28 20 28 70 4f 72 54 65 72       if( (pOrTer
31150 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
31160 4f 5f 41 4e 44 29 21 3d 30 20 29 7b 0a 20 20 20  O_AND)!=0 ){.   
31170 20 20 20 20 20 20 20 73 53 75 62 42 75 69 6c 64         sSubBuild
31180 2e 70 57 43 20 3d 20 26 70 4f 72 54 65 72 6d 2d  .pWC = &pOrTerm-
31190 3e 75 2e 70 41 6e 64 49 6e 66 6f 2d 3e 77 63 3b  >u.pAndInfo->wc;
311a0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
311b0 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74  f( pOrTerm->left
311c0 43 75 72 73 6f 72 3d 3d 69 43 75 72 20 29 7b 0a  Cursor==iCur ){.
311d0 20 20 20 20 20 20 20 20 20 20 74 65 6d 70 57 43            tempWC
311e0 2e 70 57 49 6e 66 6f 20 3d 20 70 57 43 2d 3e 70  .pWInfo = pWC->p
311f0 57 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 20  WInfo;.         
31200 20 74 65 6d 70 57 43 2e 70 4f 75 74 65 72 20 3d   tempWC.pOuter =
31210 20 70 57 43 3b 0a 20 20 20 20 20 20 20 20 20 20   pWC;.          
31220 74 65 6d 70 57 43 2e 6f 70 20 3d 20 54 4b 5f 41  tempWC.op = TK_A
31230 4e 44 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65  ND;.          te
31240 6d 70 57 43 2e 6e 54 65 72 6d 20 3d 20 31 3b 0a  mpWC.nTerm = 1;.
31250 20 20 20 20 20 20 20 20 20 20 74 65 6d 70 57 43            tempWC
31260 2e 61 20 3d 20 70 4f 72 54 65 72 6d 3b 0a 20 20  .a = pOrTerm;.  
31270 20 20 20 20 20 20 20 20 73 53 75 62 42 75 69 6c          sSubBuil
31280 64 2e 70 57 43 20 3d 20 26 74 65 6d 70 57 43 3b  d.pWC = &tempWC;
31290 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
312a0 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
312b0 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ue;.        }.  
312c0 20 20 20 20 20 20 73 43 75 72 2e 6e 20 3d 20 30        sCur.n = 0
312d0 3b 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52  ;.#ifdef WHERETR
312e0 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20  ACE_ENABLED.    
312f0 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30      WHERETRACE(0
31300 78 32 30 30 2c 20 28 22 4f 52 2d 74 65 72 6d 20  x200, ("OR-term 
31310 25 64 20 6f 66 20 25 70 20 68 61 73 20 25 64 20  %d of %p has %d 
31320 73 75 62 74 65 72 6d 73 3a 5c 6e 22 2c 20 0a 20  subterms:\n", . 
31330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31340 20 20 28 69 6e 74 29 28 70 4f 72 54 65 72 6d 2d    (int)(pOrTerm-
31350 70 4f 72 57 43 2d 3e 61 29 2c 20 70 54 65 72 6d  pOrWC->a), pTerm
31360 2c 20 73 53 75 62 42 75 69 6c 64 2e 70 57 43 2d  , sSubBuild.pWC-
31370 3e 6e 54 65 72 6d 29 29 3b 0a 20 20 20 20 20 20  >nTerm));.      
31380 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65    if( sqlite3Whe
31390 72 65 54 72 61 63 65 20 26 20 30 78 34 30 30 20  reTrace & 0x400 
313a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  ){.          for
313b0 28 69 3d 30 3b 20 69 3c 73 53 75 62 42 75 69 6c  (i=0; i<sSubBuil
313c0 64 2e 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b  d.pWC->nTerm; i+
313d0 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
313e0 77 68 65 72 65 54 65 72 6d 50 72 69 6e 74 28 26  whereTermPrint(&
313f0 73 53 75 62 42 75 69 6c 64 2e 70 57 43 2d 3e 61  sSubBuild.pWC->a
31400 5b 69 5d 2c 20 69 29 3b 0a 20 20 20 20 20 20 20  [i], i);.       
31410 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 23     }.        }.#
31420 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51  endif.#ifndef SQ
31430 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
31440 4c 54 41 42 4c 45 0a 20 20 20 20 20 20 20 20 69  LTABLE.        i
31450 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 49 74  f( IsVirtual(pIt
31460 65 6d 2d 3e 70 54 61 62 29 20 29 7b 0a 20 20 20  em->pTab) ){.   
31470 20 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72         rc = wher
31480 65 4c 6f 6f 70 41 64 64 56 69 72 74 75 61 6c 28  eLoopAddVirtual(
31490 26 73 53 75 62 42 75 69 6c 64 2c 20 6d 45 78 74  &sSubBuild, mExt
314a0 72 61 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ra);.        }el
314b0 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  se.#endif.      
314c0 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63    {.          rc
314d0 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42   = whereLoopAddB
314e0 74 72 65 65 28 26 73 53 75 62 42 75 69 6c 64 2c  tree(&sSubBuild,
314f0 20 6d 45 78 74 72 61 29 3b 0a 20 20 20 20 20 20   mExtra);.      
31500 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
31510 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
31520 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
31530 77 68 65 72 65 4c 6f 6f 70 41 64 64 4f 72 28 26  whereLoopAddOr(&
31540 73 53 75 62 42 75 69 6c 64 2c 20 6d 45 78 74 72  sSubBuild, mExtr
31550 61 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  a);.        }.  
31560 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63        assert( rc
31570 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73  ==SQLITE_OK || s
31580 43 75 72 2e 6e 3d 3d 30 20 29 3b 0a 20 20 20 20  Cur.n==0 );.    
31590 20 20 20 20 69 66 28 20 73 43 75 72 2e 6e 3d 3d      if( sCur.n==
315a0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  0 ){.          s
315b0 53 75 6d 2e 6e 20 3d 20 30 3b 0a 20 20 20 20 20  Sum.n = 0;.     
315c0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
315d0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 6e      }else if( on
315e0 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ce ){.          
315f0 77 68 65 72 65 4f 72 4d 6f 76 65 28 26 73 53 75  whereOrMove(&sSu
31600 6d 2c 20 26 73 43 75 72 29 3b 0a 20 20 20 20 20  m, &sCur);.     
31610 20 20 20 20 20 6f 6e 63 65 20 3d 20 30 3b 0a 20       once = 0;. 
31620 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
31630 20 20 20 20 20 20 20 20 57 68 65 72 65 4f 72 53          WhereOrS
31640 65 74 20 73 50 72 65 76 3b 0a 20 20 20 20 20 20  et sPrev;.      
31650 20 20 20 20 77 68 65 72 65 4f 72 4d 6f 76 65 28      whereOrMove(
31660 26 73 50 72 65 76 2c 20 26 73 53 75 6d 29 3b 0a  &sPrev, &sSum);.
31670 20 20 20 20 20 20 20 20 20 20 73 53 75 6d 2e 6e            sSum.n
31680 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
31690 66 6f 72 28 69 3d 30 3b 20 69 3c 73 50 72 65 76  for(i=0; i<sPrev
316a0 2e 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  .n; i++){.      
316b0 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
316c0 3c 73 43 75 72 2e 6e 3b 20 6a 2b 2b 29 7b 0a 20  <sCur.n; j++){. 
316d0 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65               whe
316e0 72 65 4f 72 49 6e 73 65 72 74 28 26 73 53 75 6d  reOrInsert(&sSum
316f0 2c 20 73 50 72 65 76 2e 61 5b 69 5d 2e 70 72 65  , sPrev.a[i].pre
31700 72 65 71 20 7c 20 73 43 75 72 2e 61 5b 6a 5d 2e  req | sCur.a[j].
31710 70 72 65 72 65 71 2c 0a 20 20 20 20 20 20 20 20  prereq,.        
31720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31730 20 20 20 20 73 71 6c 69 74 65 33 4c 6f 67 45 73      sqlite3LogEs
31740 74 41 64 64 28 73 50 72 65 76 2e 61 5b 69 5d 2e  tAdd(sPrev.a[i].
31750 72 52 75 6e 2c 20 73 43 75 72 2e 61 5b 6a 5d 2e  rRun, sCur.a[j].
31760 72 52 75 6e 29 2c 0a 20 20 20 20 20 20 20 20 20  rRun),.         
31770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31780 20 20 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74     sqlite3LogEst
31790 41 64 64 28 73 50 72 65 76 2e 61 5b 69 5d 2e 6e  Add(sPrev.a[i].n
317a0 4f 75 74 2c 20 73 43 75 72 2e 61 5b 6a 5d 2e 6e  Out, sCur.a[j].n
317b0 4f 75 74 29 29 3b 0a 20 20 20 20 20 20 20 20 20  Out));.         
317c0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
317d0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
317e0 20 7d 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e   }.      pNew->n
317f0 4c 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20  LTerm = 1;.     
31800 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 30 5d   pNew->aLTerm[0]
31810 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20   = pTerm;.      
31820 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20  pNew->wsFlags = 
31830 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 3b 0a  WHERE_MULTI_OR;.
31840 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 53 65 74        pNew->rSet
31850 75 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4e  up = 0;.      pN
31860 65 77 2d 3e 69 53 6f 72 74 49 64 78 20 3d 20 30  ew->iSortIdx = 0
31870 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26  ;.      memset(&
31880 70 4e 65 77 2d 3e 75 2c 20 30 2c 20 73 69 7a 65  pNew->u, 0, size
31890 6f 66 28 70 4e 65 77 2d 3e 75 29 29 3b 0a 20 20  of(pNew->u));.  
318a0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d      for(i=0; rc=
318b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c  =SQLITE_OK && i<
318c0 73 53 75 6d 2e 6e 3b 20 69 2b 2b 29 7b 0a 20 20  sSum.n; i++){.  
318d0 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a        /* TUNING:
318e0 20 43 75 72 72 65 6e 74 6c 79 20 73 53 75 6d 2e   Currently sSum.
318f0 61 5b 69 5d 2e 72 52 75 6e 20 69 73 20 73 65 74  a[i].rRun is set
31900 20 74 6f 20 74 68 65 20 73 75 6d 20 6f 66 20 74   to the sum of t
31910 68 65 20 63 6f 73 74 73 0a 20 20 20 20 20 20 20  he costs.       
31920 20 2a 2a 20 6f 66 20 61 6c 6c 20 73 75 62 2d 73   ** of all sub-s
31930 63 61 6e 73 20 72 65 71 75 69 72 65 64 20 62 79  cans required by
31940 20 74 68 65 20 4f 52 2d 73 63 61 6e 2e 20 48 6f   the OR-scan. Ho
31950 77 65 76 65 72 2c 20 64 75 65 20 74 6f 20 72 6f  wever, due to ro
31960 75 6e 64 69 6e 67 0a 20 20 20 20 20 20 20 20 2a  unding.        *
31970 2a 20 65 72 72 6f 72 73 2c 20 69 74 20 6d 61 79  * errors, it may
31980 20 62 65 20 74 68 61 74 20 74 68 65 20 63 6f 73   be that the cos
31990 74 20 6f 66 20 74 68 65 20 4f 52 2d 73 63 61 6e  t of the OR-scan
319a0 20 69 73 20 65 71 75 61 6c 20 74 6f 20 69 74 73   is equal to its
319b0 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 6f 73 74  .        ** most
319c0 20 65 78 70 65 6e 73 69 76 65 20 73 75 62 2d 73   expensive sub-s
319d0 63 61 6e 2e 20 41 64 64 20 74 68 65 20 73 6d 61  can. Add the sma
319e0 6c 6c 65 73 74 20 70 6f 73 73 69 62 6c 65 20 70  llest possible p
319f0 65 6e 61 6c 74 79 20 0a 20 20 20 20 20 20 20 20  enalty .        
31a00 2a 2a 20 28 65 71 75 69 76 61 6c 65 6e 74 20 74  ** (equivalent t
31a10 6f 20 6d 75 6c 74 69 70 6c 79 69 6e 67 20 74 68  o multiplying th
31a20 65 20 63 6f 73 74 20 62 79 20 31 2e 30 37 29 20  e cost by 1.07) 
31a30 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 0a  to ensure that .
31a40 20 20 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20          ** this 
31a50 64 6f 65 73 20 6e 6f 74 20 68 61 70 70 65 6e 2e  does not happen.
31a60 20 4f 74 68 65 72 77 69 73 65 2c 20 66 6f 72 20   Otherwise, for 
31a70 57 48 45 52 45 20 63 6c 61 75 73 65 73 20 73 75  WHERE clauses su
31a80 63 68 20 61 73 20 74 68 65 0a 20 20 20 20 20 20  ch as the.      
31a90 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 77    ** following w
31aa0 68 65 72 65 20 74 68 65 72 65 20 69 73 20 61 6e  here there is an
31ab0 20 69 6e 64 65 78 20 6f 6e 20 22 79 22 3a 0a 20   index on "y":. 
31ac0 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
31ad0 20 20 2a 2a 20 20 20 20 20 57 48 45 52 45 20 6c    **     WHERE l
31ae0 69 6b 65 6c 69 68 6f 6f 64 28 78 3d 3f 2c 20 30  ikelihood(x=?, 0
31af0 2e 39 39 29 20 4f 52 20 79 3d 3f 0a 20 20 20 20  .99) OR y=?.    
31b00 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
31b10 2a 20 74 68 65 20 70 6c 61 6e 6e 65 72 20 6d 61  * the planner ma
31b20 79 20 65 6c 65 63 74 20 74 6f 20 22 4f 52 22 20  y elect to "OR" 
31b30 74 6f 67 65 74 68 65 72 20 61 20 66 75 6c 6c 2d  together a full-
31b40 74 61 62 6c 65 20 73 63 61 6e 20 61 6e 64 20 61  table scan and a
31b50 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 64  n.        ** ind
31b60 65 78 20 6c 6f 6f 6b 75 70 2e 20 41 6e 64 20 6f  ex lookup. And o
31b70 74 68 65 72 20 73 69 6d 69 6c 61 72 6c 79 20 6f  ther similarly o
31b80 64 64 20 72 65 73 75 6c 74 73 2e 20 20 2a 2f 0a  dd results.  */.
31b90 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52          pNew->rR
31ba0 75 6e 20 3d 20 73 53 75 6d 2e 61 5b 69 5d 2e 72  un = sSum.a[i].r
31bb0 52 75 6e 20 2b 20 31 3b 0a 20 20 20 20 20 20 20  Run + 1;.       
31bc0 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 53   pNew->nOut = sS
31bd0 75 6d 2e 61 5b 69 5d 2e 6e 4f 75 74 3b 0a 20 20  um.a[i].nOut;.  
31be0 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72        pNew->prer
31bf0 65 71 20 3d 20 73 53 75 6d 2e 61 5b 69 5d 2e 70  eq = sSum.a[i].p
31c00 72 65 72 65 71 3b 0a 20 20 20 20 20 20 20 20 72  rereq;.        r
31c10 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73  c = whereLoopIns
31c20 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e  ert(pBuilder, pN
31c30 65 77 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ew);.      }.   
31c40 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78     WHERETRACE(0x
31c50 32 30 30 2c 20 28 22 45 6e 64 20 70 72 6f 63 65  200, ("End proce
31c60 73 73 69 6e 67 20 4f 52 2d 63 6c 61 75 73 65 20  ssing OR-clause 
31c70 25 70 5c 6e 22 2c 20 70 54 65 72 6d 29 29 3b 0a  %p\n", pTerm));.
31c80 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
31c90 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
31ca0 41 64 64 20 61 6c 6c 20 57 68 65 72 65 4c 6f 6f  Add all WhereLoo
31cb0 70 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 61 6c  p objects for al
31cc0 6c 20 74 61 62 6c 65 73 20 0a 2a 2f 0a 73 74 61  l tables .*/.sta
31cd0 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f  tic int whereLoo
31ce0 70 41 64 64 41 6c 6c 28 57 68 65 72 65 4c 6f 6f  pAddAll(WhereLoo
31cf0 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64  pBuilder *pBuild
31d00 65 72 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f  er){.  WhereInfo
31d10 20 2a 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c   *pWInfo = pBuil
31d20 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 42  der->pWInfo;.  B
31d30 69 74 6d 61 73 6b 20 6d 45 78 74 72 61 20 3d 20  itmask mExtra = 
31d40 30 3b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 50 72  0;.  Bitmask mPr
31d50 69 6f 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  ior = 0;.  int i
31d60 54 61 62 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a  Tab;.  SrcList *
31d70 70 54 61 62 4c 69 73 74 20 3d 20 70 57 49 6e 66  pTabList = pWInf
31d80 6f 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20 20 73  o->pTabList;.  s
31d90 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
31da0 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 73 71 6c  em *pItem;.  sql
31db0 69 74 65 33 20 2a 64 62 20 3d 20 70 57 49 6e 66  ite3 *db = pWInf
31dc0 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20  o->pParse->db;. 
31dd0 20 69 6e 74 20 6e 54 61 62 4c 69 73 74 20 3d 20   int nTabList = 
31de0 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 0a  pWInfo->nLevel;.
31df0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
31e00 45 5f 4f 4b 3b 0a 20 20 75 38 20 70 72 69 6f 72  E_OK;.  u8 prior
31e10 4a 6f 69 6e 54 79 70 65 20 3d 20 30 3b 0a 20 20  JoinType = 0;.  
31e20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b  WhereLoop *pNew;
31e30 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72  ..  /* Loop over
31e40 20 74 68 65 20 74 61 62 6c 65 73 20 69 6e 20 74   the tables in t
31e50 68 65 20 6a 6f 69 6e 2c 20 66 72 6f 6d 20 6c 65  he join, from le
31e60 66 74 20 74 6f 20 72 69 67 68 74 20 2a 2f 0a 20  ft to right */. 
31e70 20 70 4e 65 77 20 3d 20 70 42 75 69 6c 64 65 72   pNew = pBuilder
31e80 2d 3e 70 4e 65 77 3b 0a 20 20 77 68 65 72 65 4c  ->pNew;.  whereL
31e90 6f 6f 70 49 6e 69 74 28 70 4e 65 77 29 3b 0a 20  oopInit(pNew);. 
31ea0 20 66 6f 72 28 69 54 61 62 3d 30 2c 20 70 49 74   for(iTab=0, pIt
31eb0 65 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20  em=pTabList->a; 
31ec0 69 54 61 62 3c 6e 54 61 62 4c 69 73 74 3b 20 69  iTab<nTabList; i
31ed0 54 61 62 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  Tab++, pItem++){
31ee0 0a 20 20 20 20 70 4e 65 77 2d 3e 69 54 61 62 20  .    pNew->iTab 
31ef0 3d 20 69 54 61 62 3b 0a 20 20 20 20 70 4e 65 77  = iTab;.    pNew
31f00 2d 3e 6d 61 73 6b 53 65 6c 66 20 3d 20 67 65 74  ->maskSelf = get
31f10 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d  Mask(&pWInfo->sM
31f20 61 73 6b 53 65 74 2c 20 70 49 74 65 6d 2d 3e 69  askSet, pItem->i
31f30 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 69 66 28  Cursor);.    if(
31f40 20 28 28 70 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79   ((pItem->jointy
31f50 70 65 7c 70 72 69 6f 72 4a 6f 69 6e 54 79 70 65  pe|priorJoinType
31f60 29 20 26 20 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f  ) & (JT_LEFT|JT_
31f70 43 52 4f 53 53 29 29 21 3d 30 20 29 7b 0a 20 20  CROSS))!=0 ){.  
31f80 20 20 20 20 6d 45 78 74 72 61 20 3d 20 6d 50 72      mExtra = mPr
31f90 69 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ior;.    }.    p
31fa0 72 69 6f 72 4a 6f 69 6e 54 79 70 65 20 3d 20 70  riorJoinType = p
31fb0 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 3b 0a  Item->jointype;.
31fc0 20 20 20 20 69 66 28 20 49 73 56 69 72 74 75 61      if( IsVirtua
31fd0 6c 28 70 49 74 65 6d 2d 3e 70 54 61 62 29 20 29  l(pItem->pTab) )
31fe0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68 65  {.      rc = whe
31ff0 72 65 4c 6f 6f 70 41 64 64 56 69 72 74 75 61 6c  reLoopAddVirtual
32000 28 70 42 75 69 6c 64 65 72 2c 20 6d 45 78 74 72  (pBuilder, mExtr
32010 61 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  a);.    }else{. 
32020 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c       rc = whereL
32030 6f 6f 70 41 64 64 42 74 72 65 65 28 70 42 75 69  oopAddBtree(pBui
32040 6c 64 65 72 2c 20 6d 45 78 74 72 61 29 3b 0a 20  lder, mExtra);. 
32050 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
32060 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
32070 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f      rc = whereLo
32080 6f 70 41 64 64 4f 72 28 70 42 75 69 6c 64 65 72  opAddOr(pBuilder
32090 2c 20 6d 45 78 74 72 61 29 3b 0a 20 20 20 20 7d  , mExtra);.    }
320a0 0a 20 20 20 20 6d 50 72 69 6f 72 20 7c 3d 20 70  .    mPrior |= p
320b0 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20  New->maskSelf;. 
320c0 20 20 20 69 66 28 20 72 63 20 7c 7c 20 64 62 2d     if( rc || db-
320d0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
320e0 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 77 68 65  break;.  }.  whe
320f0 72 65 4c 6f 6f 70 43 6c 65 61 72 28 64 62 2c 20  reLoopClear(db, 
32100 70 4e 65 77 29 3b 0a 20 20 72 65 74 75 72 6e 20  pNew);.  return 
32110 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 61  rc;.}../*.** Exa
32120 6d 69 6e 65 20 61 20 57 68 65 72 65 50 61 74 68  mine a WherePath
32130 20 28 77 69 74 68 20 74 68 65 20 61 64 64 69 74   (with the addit
32140 69 6f 6e 20 6f 66 20 74 68 65 20 65 78 74 72 61  ion of the extra
32150 20 57 68 65 72 65 4c 6f 6f 70 20 6f 66 20 74 68   WhereLoop of th
32160 65 20 35 74 68 0a 2a 2a 20 70 61 72 61 6d 65 74  e 5th.** paramet
32170 65 72 73 29 20 74 6f 20 73 65 65 20 69 66 20 69  ers) to see if i
32180 74 20 6f 75 74 70 75 74 73 20 72 6f 77 73 20 69  t outputs rows i
32190 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  n the requested 
321a0 4f 52 44 45 52 20 42 59 0a 2a 2a 20 28 6f 72 20  ORDER BY.** (or 
321b0 47 52 4f 55 50 20 42 59 29 20 77 69 74 68 6f 75  GROUP BY) withou
321c0 74 20 72 65 71 75 69 72 69 6e 67 20 61 20 73 65  t requiring a se
321d0 70 61 72 61 74 65 20 73 6f 72 74 20 6f 70 65 72  parate sort oper
321e0 61 74 69 6f 6e 2e 20 20 52 65 74 75 72 6e 20 4e  ation.  Return N
321f0 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 4e 3e 30 3a 20  :.** .**   N>0: 
32200 20 20 4e 20 74 65 72 6d 73 20 6f 66 20 74 68 65    N terms of the
32210 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
32220 20 61 72 65 20 73 61 74 69 73 66 69 65 64 0a 2a   are satisfied.*
32230 2a 20 20 20 4e 3d 3d 30 3a 20 20 4e 6f 20 74 65  *   N==0:  No te
32240 72 6d 73 20 6f 66 20 74 68 65 20 4f 52 44 45 52  rms of the ORDER
32250 20 42 59 20 63 6c 61 75 73 65 20 61 72 65 20 73   BY clause are s
32260 61 74 69 73 66 69 65 64 0a 2a 2a 20 20 20 4e 3c  atisfied.**   N<
32270 30 3a 20 20 20 55 6e 6b 6e 6f 77 6e 20 79 65 74  0:   Unknown yet
32280 20 68 6f 77 20 6d 61 6e 79 20 74 65 72 6d 73 20   how many terms 
32290 6f 66 20 4f 52 44 45 52 20 42 59 20 6d 69 67 68  of ORDER BY migh
322a0 74 20 62 65 20 73 61 74 69 73 66 69 65 64 2e 20  t be satisfied. 
322b0 20 20 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68    .**.** Note th
322c0 61 74 20 70 72 6f 63 65 73 73 69 6e 67 20 66 6f  at processing fo
322d0 72 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20  r WHERE_GROUPBY 
322e0 61 6e 64 20 57 48 45 52 45 5f 44 49 53 54 49 4e  and WHERE_DISTIN
322f0 43 54 42 59 20 69 73 20 6e 6f 74 20 61 73 0a 2a  CTBY is not as.*
32300 2a 20 73 74 72 69 63 74 2e 20 20 57 69 74 68 20  * strict.  With 
32310 47 52 4f 55 50 20 42 59 20 61 6e 64 20 44 49 53  GROUP BY and DIS
32320 54 49 4e 43 54 20 74 68 65 20 6f 6e 6c 79 20 72  TINCT the only r
32330 65 71 75 69 72 65 6d 65 6e 74 20 69 73 20 74 68  equirement is th
32340 61 74 0a 2a 2a 20 65 71 75 69 76 61 6c 65 6e 74  at.** equivalent
32350 20 72 6f 77 73 20 61 70 70 65 61 72 20 69 6d 6d   rows appear imm
32360 65 64 69 61 74 65 6c 79 20 61 64 6a 61 63 65 6e  ediately adjacen
32370 74 20 74 6f 20 6f 6e 65 20 61 6e 6f 74 68 65 72  t to one another
32380 2e 20 20 47 52 4f 55 50 20 42 59 0a 2a 2a 20 61  .  GROUP BY.** a
32390 6e 64 20 44 49 53 54 49 4e 43 54 20 64 6f 20 6e  nd DISTINCT do n
323a0 6f 74 20 72 65 71 75 69 72 65 20 72 6f 77 73 20  ot require rows 
323b0 74 6f 20 61 70 70 65 61 72 20 69 6e 20 61 6e 79  to appear in any
323c0 20 70 61 72 74 69 63 75 6c 61 72 20 6f 72 64 65   particular orde
323d0 72 20 61 73 20 6c 6f 6e 67 0a 2a 2a 20 61 73 20  r as long.** as 
323e0 65 71 75 69 76 61 6c 65 6e 74 20 72 6f 77 73 20  equivalent rows 
323f0 61 72 65 20 67 72 6f 75 70 65 64 20 74 6f 67 65  are grouped toge
32400 74 68 65 72 2e 20 20 54 68 75 73 20 66 6f 72 20  ther.  Thus for 
32410 47 52 4f 55 50 20 42 59 20 61 6e 64 20 44 49 53  GROUP BY and DIS
32420 54 49 4e 43 54 0a 2a 2a 20 74 68 65 20 70 4f 72  TINCT.** the pOr
32430 64 65 72 42 79 20 74 65 72 6d 73 20 63 61 6e 20  derBy terms can 
32440 62 65 20 6d 61 74 63 68 65 64 20 69 6e 20 61 6e  be matched in an
32450 79 20 6f 72 64 65 72 2e 20 20 57 69 74 68 20 4f  y order.  With O
32460 52 44 45 52 20 42 59 2c 20 74 68 65 20 0a 2a 2a  RDER BY, the .**
32470 20 70 4f 72 64 65 72 42 79 20 74 65 72 6d 73 20   pOrderBy terms 
32480 6d 75 73 74 20 62 65 20 6d 61 74 63 68 65 64 20  must be matched 
32490 69 6e 20 73 74 72 69 63 74 20 6c 65 66 74 2d 74  in strict left-t
324a0 6f 2d 72 69 67 68 74 20 6f 72 64 65 72 2e 0a 2a  o-right order..*
324b0 2f 0a 73 74 61 74 69 63 20 69 38 20 77 68 65 72  /.static i8 wher
324c0 65 50 61 74 68 53 61 74 69 73 66 69 65 73 4f 72  ePathSatisfiesOr
324d0 64 65 72 42 79 28 0a 20 20 57 68 65 72 65 49 6e  derBy(.  WhereIn
324e0 66 6f 20 2a 70 57 49 6e 66 6f 2c 20 20 20 20 2f  fo *pWInfo,    /
324f0 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
32500 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  se */.  ExprList
32510 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a   *pOrderBy,   /*
32520 20 4f 52 44 45 52 20 42 59 20 6f 72 20 47 52 4f   ORDER BY or GRO
32530 55 50 20 42 59 20 6f 72 20 44 49 53 54 49 4e 43  UP BY or DISTINC
32540 54 20 63 6c 61 75 73 65 20 74 6f 20 63 68 65 63  T clause to chec
32550 6b 20 2a 2f 0a 20 20 57 68 65 72 65 50 61 74 68  k */.  WherePath
32560 20 2a 70 50 61 74 68 2c 20 20 20 20 20 2f 2a 20   *pPath,     /* 
32570 54 68 65 20 57 68 65 72 65 50 61 74 68 20 74 6f  The WherePath to
32580 20 63 68 65 63 6b 20 2a 2f 0a 20 20 75 31 36 20   check */.  u16 
32590 77 63 74 72 6c 46 6c 61 67 73 2c 20 20 20 20 20  wctrlFlags,     
325a0 20 20 2f 2a 20 4d 69 67 68 74 20 63 6f 6e 74 61    /* Might conta
325b0 69 6e 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59  in WHERE_GROUPBY
325c0 20 6f 72 20 57 48 45 52 45 5f 44 49 53 54 49 4e   or WHERE_DISTIN
325d0 43 54 42 59 20 2a 2f 0a 20 20 75 31 36 20 6e 4c  CTBY */.  u16 nL
325e0 6f 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20  oop,            
325f0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74  /* Number of ent
32600 72 69 65 73 20 69 6e 20 70 50 61 74 68 2d 3e 61  ries in pPath->a
32610 4c 6f 6f 70 5b 5d 20 2a 2f 0a 20 20 57 68 65 72  Loop[] */.  Wher
32620 65 4c 6f 6f 70 20 2a 70 4c 61 73 74 2c 20 20 20  eLoop *pLast,   
32630 20 20 2f 2a 20 41 64 64 20 74 68 69 73 20 57 68    /* Add this Wh
32640 65 72 65 4c 6f 6f 70 20 74 6f 20 74 68 65 20 65  ereLoop to the e
32650 6e 64 20 6f 66 20 70 50 61 74 68 2d 3e 61 4c 6f  nd of pPath->aLo
32660 6f 70 5b 5d 20 2a 2f 0a 20 20 42 69 74 6d 61 73  op[] */.  Bitmas
32670 6b 20 2a 70 52 65 76 4d 61 73 6b 20 20 20 20 20  k *pRevMask     
32680 2f 2a 20 4f 55 54 3a 20 4d 61 73 6b 20 6f 66 20  /* OUT: Mask of 
32690 57 68 65 72 65 4c 6f 6f 70 73 20 74 6f 20 72 75  WhereLoops to ru
326a0 6e 20 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64  n in reverse ord
326b0 65 72 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 72 65  er */.){.  u8 re
326c0 76 53 65 74 3b 20 20 20 20 20 20 20 20 20 20 20  vSet;           
326d0 20 2f 2a 20 54 72 75 65 20 69 66 20 72 65 76 20   /* True if rev 
326e0 69 73 20 6b 6e 6f 77 6e 20 2a 2f 0a 20 20 75 38  is known */.  u8
326f0 20 72 65 76 3b 20 20 20 20 20 20 20 20 20 20 20   rev;           
32700 20 20 20 20 2f 2a 20 43 6f 6d 70 6f 73 69 74 65      /* Composite
32710 20 73 6f 72 74 20 6f 72 64 65 72 20 2a 2f 0a 20   sort order */. 
32720 20 75 38 20 72 65 76 49 64 78 3b 20 20 20 20 20   u8 revIdx;     
32730 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
32740 73 6f 72 74 20 6f 72 64 65 72 20 2a 2f 0a 20 20  sort order */.  
32750 75 38 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e  u8 isOrderDistin
32760 63 74 3b 20 20 20 2f 2a 20 41 6c 6c 20 70 72 69  ct;   /* All pri
32770 6f 72 20 57 68 65 72 65 4c 6f 6f 70 73 20 61 72  or WhereLoops ar
32780 65 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74  e order-distinct
32790 20 2a 2f 0a 20 20 75 38 20 64 69 73 74 69 6e 63   */.  u8 distinc
327a0 74 43 6f 6c 75 6d 6e 73 3b 20 20 20 2f 2a 20 54  tColumns;   /* T
327b0 72 75 65 20 69 66 20 74 68 65 20 6c 6f 6f 70 20  rue if the loop 
327c0 68 61 73 20 55 4e 49 51 55 45 20 4e 4f 54 20 4e  has UNIQUE NOT N
327d0 55 4c 4c 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20  ULL columns */. 
327e0 20 75 38 20 69 73 4d 61 74 63 68 3b 20 20 20 20   u8 isMatch;    
327f0 20 20 20 20 20 20 20 2f 2a 20 69 43 6f 6c 75 6d         /* iColum
32800 6e 20 6d 61 74 63 68 65 73 20 61 20 74 65 72 6d  n matches a term
32810 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59   of the ORDER BY
32820 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 75 31 36   clause */.  u16
32830 20 6e 4b 65 79 43 6f 6c 3b 20 20 20 20 20 20 20   nKeyCol;       
32840 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
32850 6b 65 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 70  key columns in p
32860 49 6e 64 65 78 20 2a 2f 0a 20 20 75 31 36 20 6e  Index */.  u16 n
32870 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20 20  Column;         
32880 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72   /* Total number
32890 20 6f 66 20 6f 72 64 65 72 65 64 20 63 6f 6c 75   of ordered colu
328a0 6d 6e 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78  mns in the index
328b0 20 2a 2f 0a 20 20 75 31 36 20 6e 4f 72 64 65 72   */.  u16 nOrder
328c0 42 79 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  By;         /* N
328d0 75 6d 62 65 72 20 74 65 72 6d 73 20 69 6e 20 74  umber terms in t
328e0 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
328f0 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 6f 6f  se */.  int iLoo
32900 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p;            /*
32910 20 49 6e 64 65 78 20 6f 66 20 57 68 65 72 65 4c   Index of WhereL
32920 6f 6f 70 20 69 6e 20 70 50 61 74 68 20 62 65 69  oop in pPath bei
32930 6e 67 20 70 72 6f 63 65 73 73 65 64 20 2a 2f 0a  ng processed */.
32940 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20    int i, j;     
32950 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
32960 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e  counters */.  in
32970 74 20 69 43 75 72 3b 20 20 20 20 20 20 20 20 20  t iCur;         
32980 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75      /* Cursor nu
32990 6d 62 65 72 20 66 6f 72 20 63 75 72 72 65 6e 74  mber for current
329a0 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2f 0a 20 20   WhereLoop */.  
329b0 69 6e 74 20 69 43 6f 6c 75 6d 6e 3b 20 20 20 20  int iColumn;    
329c0 20 20 20 20 20 20 2f 2a 20 41 20 63 6f 6c 75 6d        /* A colum
329d0 6e 20 6e 75 6d 62 65 72 20 77 69 74 68 69 6e 20  n number within 
329e0 74 61 62 6c 65 20 69 43 75 72 20 2a 2f 0a 20 20  table iCur */.  
329f0 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70  WhereLoop *pLoop
32a00 20 3d 20 30 3b 20 2f 2a 20 43 75 72 72 65 6e 74   = 0; /* Current
32a10 20 57 68 65 72 65 4c 6f 6f 70 20 62 65 69 6e 67   WhereLoop being
32a20 20 70 72 6f 63 65 73 73 65 64 2e 20 2a 2f 0a 20   processed. */. 
32a30 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
32a40 6d 3b 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67  m;     /* A sing
32a50 6c 65 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57  le term of the W
32a60 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
32a70 20 45 78 70 72 20 2a 70 4f 42 45 78 70 72 3b 20   Expr *pOBExpr; 
32a80 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 70         /* An exp
32a90 72 65 73 73 69 6f 6e 20 66 72 6f 6d 20 74 68 65  ression from the
32aa0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
32ab0 20 2a 2f 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70   */.  CollSeq *p
32ac0 43 6f 6c 6c 3b 20 20 20 20 20 20 20 2f 2a 20 43  Coll;       /* C
32ad0 4f 4c 4c 41 54 45 20 66 75 6e 63 74 69 6f 6e 20  OLLATE function 
32ae0 66 72 6f 6d 20 61 6e 20 4f 52 44 45 52 20 42 59  from an ORDER BY
32af0 20 63 6c 61 75 73 65 20 74 65 72 6d 20 2a 2f 0a   clause term */.
32b00 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b    Index *pIndex;
32b10 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69          /* The i
32b20 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65 64 20  ndex associated 
32b30 77 69 74 68 20 70 4c 6f 6f 70 20 2a 2f 0a 20 20  with pLoop */.  
32b40 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 57  sqlite3 *db = pW
32b50 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62  Info->pParse->db
32b60 3b 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63  ;  /* Database c
32b70 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 42  onnection */.  B
32b80 69 74 6d 61 73 6b 20 6f 62 53 61 74 20 3d 20 30  itmask obSat = 0
32b90 3b 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20  ;    /* Mask of 
32ba0 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20 73  ORDER BY terms s
32bb0 61 74 69 73 66 69 65 64 20 73 6f 20 66 61 72 20  atisfied so far 
32bc0 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6f 62 44  */.  Bitmask obD
32bd0 6f 6e 65 3b 20 20 20 20 20 20 20 2f 2a 20 4d 61  one;       /* Ma
32be0 73 6b 20 6f 66 20 61 6c 6c 20 4f 52 44 45 52 20  sk of all ORDER 
32bf0 42 59 20 74 65 72 6d 73 20 2a 2f 0a 20 20 42 69  BY terms */.  Bi
32c00 74 6d 61 73 6b 20 6f 72 64 65 72 44 69 73 74 69  tmask orderDisti
32c10 6e 63 74 4d 61 73 6b 3b 20 20 2f 2a 20 4d 61 73  nctMask;  /* Mas
32c20 6b 20 6f 66 20 61 6c 6c 20 77 65 6c 6c 2d 6f 72  k of all well-or
32c30 64 65 72 65 64 20 6c 6f 6f 70 73 20 2a 2f 0a 20  dered loops */. 
32c40 20 42 69 74 6d 61 73 6b 20 72 65 61 64 79 3b 20   Bitmask ready; 
32c50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
32c60 4d 61 73 6b 20 6f 66 20 69 6e 6e 65 72 20 6c 6f  Mask of inner lo
32c70 6f 70 73 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a  ops */..  /*.  *
32c80 2a 20 57 65 20 73 61 79 20 74 68 65 20 57 68 65  * We say the Whe
32c90 72 65 4c 6f 6f 70 20 69 73 20 22 6f 6e 65 2d 72  reLoop is "one-r
32ca0 6f 77 22 20 69 66 20 69 74 20 67 65 6e 65 72 61  ow" if it genera
32cb0 74 65 73 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e  tes no more than
32cc0 20 6f 6e 65 0a 20 20 2a 2a 20 72 6f 77 20 6f 66   one.  ** row of
32cd0 20 6f 75 74 70 75 74 2e 20 20 41 20 57 68 65 72   output.  A Wher
32ce0 65 4c 6f 6f 70 20 69 73 20 6f 6e 65 2d 72 6f 77  eLoop is one-row
32cf0 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66   if all of the f
32d00 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75  ollowing are tru
32d10 65 3a 0a 20 20 2a 2a 20 20 28 61 29 20 41 6c 6c  e:.  **  (a) All
32d20 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20 6d   index columns m
32d30 61 74 63 68 20 77 69 74 68 20 57 48 45 52 45 5f  atch with WHERE_
32d40 43 4f 4c 55 4d 4e 5f 45 51 2e 0a 20 20 2a 2a 20  COLUMN_EQ..  ** 
32d50 20 28 62 29 20 54 68 65 20 69 6e 64 65 78 20 69   (b) The index i
32d60 73 20 75 6e 69 71 75 65 0a 20 20 2a 2a 20 41 6e  s unique.  ** An
32d70 79 20 57 68 65 72 65 4c 6f 6f 70 20 77 69 74 68  y WhereLoop with
32d80 20 61 6e 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e   an WHERE_COLUMN
32d90 5f 45 51 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f  _EQ constraint o
32da0 6e 20 74 68 65 20 72 6f 77 69 64 20 69 73 20 6f  n the rowid is o
32db0 6e 65 2d 72 6f 77 2e 0a 20 20 2a 2a 20 45 76 65  ne-row..  ** Eve
32dc0 72 79 20 6f 6e 65 2d 72 6f 77 20 57 68 65 72 65  ry one-row Where
32dd0 4c 6f 6f 70 20 77 69 6c 6c 20 68 61 76 65 20 74  Loop will have t
32de0 68 65 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 20  he WHERE_ONEROW 
32df0 62 69 74 20 73 65 74 20 69 6e 20 77 73 46 6c 61  bit set in wsFla
32e00 67 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 65  gs..  **.  ** We
32e10 20 73 61 79 20 74 68 65 20 57 68 65 72 65 4c 6f   say the WhereLo
32e20 6f 70 20 69 73 20 22 6f 72 64 65 72 2d 64 69 73  op is "order-dis
32e30 74 69 6e 63 74 22 20 69 66 20 74 68 65 20 73 65  tinct" if the se
32e40 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 66 72 6f  t of columns fro
32e50 6d 0a 20 20 2a 2a 20 74 68 61 74 20 57 68 65 72  m.  ** that Wher
32e60 65 4c 6f 6f 70 20 74 68 61 74 20 61 72 65 20 69  eLoop that are i
32e70 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  n the ORDER BY c
32e80 6c 61 75 73 65 20 61 72 65 20 64 69 66 66 65 72  lause are differ
32e90 65 6e 74 20 66 6f 72 20 65 76 65 72 79 0a 20 20  ent for every.  
32ea0 2a 2a 20 72 6f 77 20 6f 66 20 74 68 65 20 57 68  ** row of the Wh
32eb0 65 72 65 4c 6f 6f 70 2e 20 20 45 76 65 72 79 20  ereLoop.  Every 
32ec0 6f 6e 65 2d 72 6f 77 20 57 68 65 72 65 4c 6f 6f  one-row WhereLoo
32ed0 70 20 69 73 20 61 75 74 6f 6d 61 74 69 63 61 6c  p is automatical
32ee0 6c 79 0a 20 20 2a 2a 20 6f 72 64 65 72 2d 64 69  ly.  ** order-di
32ef0 73 74 69 6e 63 74 2e 20 20 20 41 20 57 68 65 72  stinct.   A Wher
32f00 65 4c 6f 6f 70 20 74 68 61 74 20 68 61 73 20 6e  eLoop that has n
32f10 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  o columns in the
32f20 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
32f30 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 6f 72 64  .  ** is not ord
32f40 65 72 2d 64 69 73 74 69 6e 63 74 2e 20 54 6f 20  er-distinct. To 
32f50 62 65 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63  be order-distinc
32f60 74 20 69 73 20 6e 6f 74 20 71 75 69 74 65 20 74  t is not quite t
32f70 68 65 20 73 61 6d 65 20 61 73 20 62 65 69 6e 67  he same as being
32f80 0a 20 20 2a 2a 20 55 4e 49 51 55 45 20 73 69 6e  .  ** UNIQUE sin
32f90 63 65 20 61 20 55 4e 49 51 55 45 20 63 6f 6c 75  ce a UNIQUE colu
32fa0 6d 6e 20 6f 72 20 69 6e 64 65 78 20 63 61 6e 20  mn or index can 
32fb0 68 61 76 65 20 6d 75 6c 74 69 70 6c 65 20 72 6f  have multiple ro
32fc0 77 73 20 74 68 61 74 20 0a 20 20 2a 2a 20 61 72  ws that .  ** ar
32fd0 65 20 4e 55 4c 4c 20 61 6e 64 20 4e 55 4c 4c 20  e NULL and NULL 
32fe0 76 61 6c 75 65 73 20 61 72 65 20 65 71 75 69 76  values are equiv
32ff0 61 6c 65 6e 74 20 66 6f 72 20 74 68 65 20 70 75  alent for the pu
33000 72 70 6f 73 65 20 6f 66 20 6f 72 64 65 72 2d 64  rpose of order-d
33010 69 73 74 69 6e 63 74 2e 0a 20 20 2a 2a 20 54 6f  istinct..  ** To
33020 20 62 65 20 6f 72 64 65 72 2d 64 69 73 74 69 6e   be order-distin
33030 63 74 2c 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20  ct, the columns 
33040 6d 75 73 74 20 62 65 20 55 4e 49 51 55 45 20 61  must be UNIQUE a
33050 6e 64 20 4e 4f 54 20 4e 55 4c 4c 2e 0a 20 20 2a  nd NOT NULL..  *
33060 2a 0a 20 20 2a 2a 20 54 68 65 20 72 6f 77 69 64  *.  ** The rowid
33070 20 66 6f 72 20 61 20 74 61 62 6c 65 20 69 73 20   for a table is 
33080 61 6c 77 61 79 73 20 55 4e 49 51 55 45 20 61 6e  always UNIQUE an
33090 64 20 4e 4f 54 20 4e 55 4c 4c 20 73 6f 20 77 68  d NOT NULL so wh
330a0 65 6e 65 76 65 72 20 74 68 65 0a 20 20 2a 2a 20  enever the.  ** 
330b0 72 6f 77 69 64 20 61 70 70 65 61 72 73 20 69 6e  rowid appears in
330c0 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
330d0 61 75 73 65 2c 20 74 68 65 20 63 6f 72 72 65 73  ause, the corres
330e0 70 6f 6e 64 69 6e 67 20 57 68 65 72 65 4c 6f 6f  ponding WhereLoo
330f0 70 20 69 73 0a 20 20 2a 2a 20 61 75 74 6f 6d 61  p is.  ** automa
33100 74 69 63 61 6c 6c 79 20 6f 72 64 65 72 2d 64 69  tically order-di
33110 73 74 69 6e 63 74 2e 0a 20 20 2a 2f 0a 0a 20 20  stinct..  */..  
33120 61 73 73 65 72 74 28 20 70 4f 72 64 65 72 42 79  assert( pOrderBy
33130 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 6e 4c 6f  !=0 );.  if( nLo
33140 6f 70 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69  op && Optimizati
33150 6f 6e 44 69 73 61 62 6c 65 64 28 64 62 2c 20 53  onDisabled(db, S
33160 51 4c 49 54 45 5f 4f 72 64 65 72 42 79 49 64 78  QLITE_OrderByIdx
33170 4a 6f 69 6e 29 20 29 20 72 65 74 75 72 6e 20 30  Join) ) return 0
33180 3b 0a 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d 20  ;..  nOrderBy = 
33190 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
331a0 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 4f 72  .  testcase( nOr
331b0 64 65 72 42 79 3d 3d 42 4d 53 2d 31 20 29 3b 0a  derBy==BMS-1 );.
331c0 20 20 69 66 28 20 6e 4f 72 64 65 72 42 79 3e 42    if( nOrderBy>B
331d0 4d 53 2d 31 20 29 20 72 65 74 75 72 6e 20 30 3b  MS-1 ) return 0;
331e0 20 20 2f 2a 20 43 61 6e 6e 6f 74 20 6f 70 74 69    /* Cannot opti
331f0 6d 69 7a 65 20 6f 76 65 72 6c 79 20 6c 61 72 67  mize overly larg
33200 65 20 4f 52 44 45 52 20 42 59 73 20 2a 2f 0a 20  e ORDER BYs */. 
33210 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74   isOrderDistinct
33220 20 3d 20 31 3b 0a 20 20 6f 62 44 6f 6e 65 20 3d   = 1;.  obDone =
33230 20 4d 41 53 4b 42 49 54 28 6e 4f 72 64 65 72 42   MASKBIT(nOrderB
33240 79 29 2d 31 3b 0a 20 20 6f 72 64 65 72 44 69 73  y)-1;.  orderDis
33250 74 69 6e 63 74 4d 61 73 6b 20 3d 20 30 3b 0a 20  tinctMask = 0;. 
33260 20 72 65 61 64 79 20 3d 20 30 3b 0a 20 20 66 6f   ready = 0;.  fo
33270 72 28 69 4c 6f 6f 70 3d 30 3b 20 69 73 4f 72 64  r(iLoop=0; isOrd
33280 65 72 44 69 73 74 69 6e 63 74 20 26 26 20 6f 62  erDistinct && ob
33290 53 61 74 3c 6f 62 44 6f 6e 65 20 26 26 20 69 4c  Sat<obDone && iL
332a0 6f 6f 70 3c 3d 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f  oop<=nLoop; iLoo
332b0 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 4c  p++){.    if( iL
332c0 6f 6f 70 3e 30 20 29 20 72 65 61 64 79 20 7c 3d  oop>0 ) ready |=
332d0 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66   pLoop->maskSelf
332e0 3b 0a 20 20 20 20 70 4c 6f 6f 70 20 3d 20 69 4c  ;.    pLoop = iL
332f0 6f 6f 70 3c 6e 4c 6f 6f 70 20 3f 20 70 50 61 74  oop<nLoop ? pPat
33300 68 2d 3e 61 4c 6f 6f 70 5b 69 4c 6f 6f 70 5d 20  h->aLoop[iLoop] 
33310 3a 20 70 4c 61 73 74 3b 0a 20 20 20 20 69 66 28  : pLast;.    if(
33320 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20   pLoop->wsFlags 
33330 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54  & WHERE_VIRTUALT
33340 41 42 4c 45 20 29 7b 0a 20 20 20 20 20 20 69 66  ABLE ){.      if
33350 28 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e  ( pLoop->u.vtab.
33360 69 73 4f 72 64 65 72 65 64 20 29 20 6f 62 53 61  isOrdered ) obSa
33370 74 20 3d 20 6f 62 44 6f 6e 65 3b 0a 20 20 20 20  t = obDone;.    
33380 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
33390 20 20 20 69 43 75 72 20 3d 20 70 57 49 6e 66 6f     iCur = pWInfo
333a0 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c  ->pTabList->a[pL
333b0 6f 6f 70 2d 3e 69 54 61 62 5d 2e 69 43 75 72 73  oop->iTab].iCurs
333c0 6f 72 3b 0a 0a 20 20 20 20 2f 2a 20 4d 61 72 6b  or;..    /* Mark
333d0 20 6f 66 66 20 61 6e 79 20 4f 52 44 45 52 20 42   off any ORDER B
333e0 59 20 74 65 72 6d 20 58 20 74 68 61 74 20 69 73  Y term X that is
333f0 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65   a column in the
33400 20 74 61 62 6c 65 20 6f 66 0a 20 20 20 20 2a 2a   table of.    **
33410 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f   the current loo
33420 70 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 72  p for which ther
33430 65 20 69 73 20 74 65 72 6d 20 69 6e 20 74 68 65  e is term in the
33440 20 57 48 45 52 45 0a 20 20 20 20 2a 2a 20 63 6c   WHERE.    ** cl
33450 61 75 73 65 20 6f 66 20 74 68 65 20 66 6f 72 6d  ause of the form
33460 20 58 20 49 53 20 4e 55 4c 4c 20 6f 72 20 58 3d   X IS NULL or X=
33470 3f 20 74 68 61 74 20 72 65 66 65 72 65 6e 63 65  ? that reference
33480 20 6f 6e 6c 79 20 6f 75 74 65 72 0a 20 20 20 20   only outer.    
33490 2a 2a 20 6c 6f 6f 70 73 2e 0a 20 20 20 20 2a 2f  ** loops..    */
334a0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
334b0 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a  nOrderBy; i++){.
334c0 20 20 20 20 20 20 69 66 28 20 4d 41 53 4b 42 49        if( MASKBI
334d0 54 28 69 29 20 26 20 6f 62 53 61 74 20 29 20 63  T(i) & obSat ) c
334e0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 70  ontinue;.      p
334f0 4f 42 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  OBExpr = sqlite3
33500 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28  ExprSkipCollate(
33510 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70  pOrderBy->a[i].p
33520 45 78 70 72 29 3b 0a 20 20 20 20 20 20 69 66 28  Expr);.      if(
33530 20 70 4f 42 45 78 70 72 2d 3e 6f 70 21 3d 54 4b   pOBExpr->op!=TK
33540 5f 43 4f 4c 55 4d 4e 20 29 20 63 6f 6e 74 69 6e  _COLUMN ) contin
33550 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f  ue;.      if( pO
33560 42 45 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d 69  BExpr->iTable!=i
33570 43 75 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  Cur ) continue;.
33580 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 66 69        pTerm = fi
33590 6e 64 54 65 72 6d 28 26 70 57 49 6e 66 6f 2d 3e  ndTerm(&pWInfo->
335a0 73 57 43 2c 20 69 43 75 72 2c 20 70 4f 42 45 78  sWC, iCur, pOBEx
335b0 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20  pr->iColumn,.   
335c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
335d0 20 20 20 20 7e 72 65 61 64 79 2c 20 57 4f 5f 45      ~ready, WO_E
335e0 51 7c 57 4f 5f 49 53 4e 55 4c 4c 2c 20 30 29 3b  Q|WO_ISNULL, 0);
335f0 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d  .      if( pTerm
33600 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
33610 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d        if( (pTerm
33620 2d 3e 65 4f 70 65 72 61 74 6f 72 26 57 4f 5f 45  ->eOperator&WO_E
33630 51 29 21 3d 30 20 26 26 20 70 4f 42 45 78 70 72  Q)!=0 && pOBExpr
33640 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 29 7b 0a  ->iColumn>=0 ){.
33650 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
33660 61 72 20 2a 7a 31 2c 20 2a 7a 32 3b 0a 20 20 20  ar *z1, *z2;.   
33670 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c       pColl = sql
33680 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
33690 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2c 20  pWInfo->pParse, 
336a0 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70  pOrderBy->a[i].p
336b0 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 69  Expr);.        i
336c0 66 28 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c  f( !pColl ) pCol
336d0 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c  l = db->pDfltCol
336e0 6c 3b 0a 20 20 20 20 20 20 20 20 7a 31 20 3d 20  l;.        z1 = 
336f0 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20 20  pColl->zName;.  
33700 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71        pColl = sq
33710 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
33720 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2c  (pWInfo->pParse,
33730 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 29 3b 0a   pTerm->pExpr);.
33740 20 20 20 20 20 20 20 20 69 66 28 20 21 70 43 6f          if( !pCo
33750 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d  ll ) pColl = db-
33760 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20  >pDfltColl;.    
33770 20 20 20 20 7a 32 20 3d 20 70 43 6f 6c 6c 2d 3e      z2 = pColl->
33780 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 69  zName;.        i
33790 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
337a0 70 28 7a 31 2c 20 7a 32 29 21 3d 30 20 29 20 63  p(z1, z2)!=0 ) c
337b0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d  ontinue;.      }
337c0 0a 20 20 20 20 20 20 6f 62 53 61 74 20 7c 3d 20  .      obSat |= 
337d0 4d 41 53 4b 42 49 54 28 69 29 3b 0a 20 20 20 20  MASKBIT(i);.    
337e0 7d 0a 0a 20 20 20 20 69 66 28 20 28 70 4c 6f 6f  }..    if( (pLoo
337f0 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
33800 52 45 5f 4f 4e 45 52 4f 57 29 3d 3d 30 20 29 7b  RE_ONEROW)==0 ){
33810 0a 20 20 20 20 20 20 69 66 28 20 70 4c 6f 6f 70  .      if( pLoop
33820 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
33830 45 5f 49 50 4b 20 29 7b 0a 20 20 20 20 20 20 20  E_IPK ){.       
33840 20 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20   pIndex = 0;.   
33850 20 20 20 20 20 6e 4b 65 79 43 6f 6c 20 3d 20 30       nKeyCol = 0
33860 3b 0a 20 20 20 20 20 20 20 20 6e 43 6f 6c 75 6d  ;.        nColum
33870 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c  n = 1;.      }el
33880 73 65 20 69 66 28 20 28 70 49 6e 64 65 78 20 3d  se if( (pIndex =
33890 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
338a0 70 49 6e 64 65 78 29 3d 3d 30 20 7c 7c 20 70 49  pIndex)==0 || pI
338b0 6e 64 65 78 2d 3e 62 55 6e 6f 72 64 65 72 65 64  ndex->bUnordered
338c0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
338d0 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73  rn 0;.      }els
338e0 65 7b 0a 20 20 20 20 20 20 20 20 6e 4b 65 79 43  e{.        nKeyC
338f0 6f 6c 20 3d 20 70 49 6e 64 65 78 2d 3e 6e 4b 65  ol = pIndex->nKe
33900 79 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 6e 43  yCol;.        nC
33910 6f 6c 75 6d 6e 20 3d 20 70 49 6e 64 65 78 2d 3e  olumn = pIndex->
33920 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20  nColumn;.       
33930 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e   assert( nColumn
33940 3d 3d 6e 4b 65 79 43 6f 6c 2b 31 20 7c 7c 20 21  ==nKeyCol+1 || !
33950 48 61 73 52 6f 77 69 64 28 70 49 6e 64 65 78 2d  HasRowid(pIndex-
33960 3e 70 54 61 62 6c 65 29 20 29 3b 0a 20 20 20 20  >pTable) );.    
33970 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 64      assert( pInd
33980 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 43 6f  ex->aiColumn[nCo
33990 6c 75 6d 6e 2d 31 5d 3d 3d 28 2d 31 29 20 7c 7c  lumn-1]==(-1) ||
339a0 20 21 48 61 73 52 6f 77 69 64 28 70 49 6e 64 65   !HasRowid(pInde
339b0 78 2d 3e 70 54 61 62 6c 65 29 29 3b 0a 20 20 20  x->pTable));.   
339c0 20 20 20 20 20 69 73 4f 72 64 65 72 44 69 73 74       isOrderDist
339d0 69 6e 63 74 20 3d 20 49 73 55 6e 69 71 75 65 49  inct = IsUniqueI
339e0 6e 64 65 78 28 70 49 6e 64 65 78 29 3b 0a 20 20  ndex(pIndex);.  
339f0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
33a00 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 61 6c 6c  Loop through all
33a10 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20   columns of the 
33a20 69 6e 64 65 78 20 61 6e 64 20 64 65 61 6c 20 77  index and deal w
33a30 69 74 68 20 74 68 65 20 6f 6e 65 73 0a 20 20 20  ith the ones.   
33a40 20 20 20 2a 2a 20 74 68 61 74 20 61 72 65 20 6e     ** that are n
33a50 6f 74 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 62  ot constrained b
33a60 79 20 3d 3d 20 6f 72 20 49 4e 2e 0a 20 20 20 20  y == or IN..    
33a70 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 76 20 3d    */.      rev =
33a80 20 72 65 76 53 65 74 20 3d 20 30 3b 0a 20 20 20   revSet = 0;.   
33a90 20 20 20 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d     distinctColum
33aa0 6e 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 66 6f  ns = 0;.      fo
33ab0 72 28 6a 3d 30 3b 20 6a 3c 6e 43 6f 6c 75 6d 6e  r(j=0; j<nColumn
33ac0 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
33ad0 75 38 20 62 4f 6e 63 65 3b 20 20 20 2f 2a 20 54  u8 bOnce;   /* T
33ae0 72 75 65 20 74 6f 20 72 75 6e 20 74 68 65 20 4f  rue to run the O
33af0 52 44 45 52 20 42 59 20 73 65 61 72 63 68 20 6c  RDER BY search l
33b00 6f 6f 70 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20  oop */..        
33b10 2f 2a 20 53 6b 69 70 20 6f 76 65 72 20 3d 3d 20  /* Skip over == 
33b20 61 6e 64 20 49 53 20 4e 55 4c 4c 20 74 65 72 6d  and IS NULL term
33b30 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28  s */.        if(
33b40 20 6a 3c 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65   j<pLoop->u.btre
33b50 65 2e 6e 45 71 0a 20 20 20 20 20 20 20 20 20 26  e.nEq.         &
33b60 26 20 70 4c 6f 6f 70 2d 3e 6e 53 6b 69 70 3d 3d  & pLoop->nSkip==
33b70 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 28  0.         && ((
33b80 69 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72  i = pLoop->aLTer
33b90 6d 5b 6a 5d 2d 3e 65 4f 70 65 72 61 74 6f 72 29  m[j]->eOperator)
33ba0 20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 4e   & (WO_EQ|WO_ISN
33bb0 55 4c 4c 29 29 21 3d 30 0a 20 20 20 20 20 20 20  ULL))!=0.       
33bc0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
33bd0 28 20 69 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20  ( i & WO_ISNULL 
33be0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  ){.            t
33bf0 65 73 74 63 61 73 65 28 20 69 73 4f 72 64 65 72  estcase( isOrder
33c00 44 69 73 74 69 6e 63 74 20 29 3b 0a 20 20 20 20  Distinct );.    
33c10 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 44          isOrderD
33c20 69 73 74 69 6e 63 74 20 3d 20 30 3b 0a 20 20 20  istinct = 0;.   
33c30 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
33c40 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 20 0a 20     continue;  . 
33c50 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
33c60 20 20 2f 2a 20 47 65 74 20 74 68 65 20 63 6f 6c    /* Get the col
33c70 75 6d 6e 20 6e 75 6d 62 65 72 20 69 6e 20 74 68  umn number in th
33c80 65 20 74 61 62 6c 65 20 28 69 43 6f 6c 75 6d 6e  e table (iColumn
33c90 29 20 61 6e 64 20 73 6f 72 74 20 6f 72 64 65 72  ) and sort order
33ca0 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 72 65 76  .        ** (rev
33cb0 49 64 78 29 20 66 6f 72 20 74 68 65 20 6a 2d 74  Idx) for the j-t
33cc0 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  h column of the 
33cd0 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20 2a  index..        *
33ce0 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49  /.        if( pI
33cf0 6e 64 65 78 20 29 7b 0a 20 20 20 20 20 20 20 20  ndex ){.        
33d00 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 70 49 6e 64    iColumn = pInd
33d10 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b  ex->aiColumn[j];
33d20 0a 20 20 20 20 20 20 20 20 20 20 72 65 76 49 64  .          revId
33d30 78 20 3d 20 70 49 6e 64 65 78 2d 3e 61 53 6f 72  x = pIndex->aSor
33d40 74 4f 72 64 65 72 5b 6a 5d 3b 0a 20 20 20 20 20  tOrder[j];.     
33d50 20 20 20 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e       if( iColumn
33d60 3d 3d 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65  ==pIndex->pTable
33d70 2d 3e 69 50 4b 65 79 20 29 20 69 43 6f 6c 75 6d  ->iPKey ) iColum
33d80 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20  n = -1;.        
33d90 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
33da0 20 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20   iColumn = -1;. 
33db0 20 20 20 20 20 20 20 20 20 72 65 76 49 64 78 20           revIdx 
33dc0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  = 0;.        }..
33dd0 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 75 6e          /* An un
33de0 63 6f 6e 73 74 72 61 69 6e 65 64 20 63 6f 6c 75  constrained colu
33df0 6d 6e 20 74 68 61 74 20 6d 69 67 68 74 20 62 65  mn that might be
33e00 20 4e 55 4c 4c 20 6d 65 61 6e 73 20 74 68 61 74   NULL means that
33e10 20 74 68 69 73 0a 20 20 20 20 20 20 20 20 2a 2a   this.        **
33e20 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 20 6e 6f   WhereLoop is no
33e30 74 20 77 65 6c 6c 2d 6f 72 64 65 72 65 64 0a 20  t well-ordered. 
33e40 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
33e50 20 20 69 66 28 20 69 73 4f 72 64 65 72 44 69 73    if( isOrderDis
33e60 74 69 6e 63 74 0a 20 20 20 20 20 20 20 20 20 26  tinct.         &
33e70 26 20 69 43 6f 6c 75 6d 6e 3e 3d 30 0a 20 20 20  & iColumn>=0.   
33e80 20 20 20 20 20 20 26 26 20 6a 3e 3d 70 4c 6f 6f        && j>=pLoo
33e90 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 0a 20  p->u.btree.nEq. 
33ea0 20 20 20 20 20 20 20 20 26 26 20 70 49 6e 64 65          && pInde
33eb0 78 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b  x->pTable->aCol[
33ec0 69 43 6f 6c 75 6d 6e 5d 2e 6e 6f 74 4e 75 6c 6c  iColumn].notNull
33ed0 3d 3d 30 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  ==0.        ){. 
33ee0 20 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72           isOrder
33ef0 44 69 73 74 69 6e 63 74 20 3d 20 30 3b 0a 20 20  Distinct = 0;.  
33f00 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
33f10 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 4f 52 44   /* Find the ORD
33f20 45 52 20 42 59 20 74 65 72 6d 20 74 68 61 74 20  ER BY term that 
33f30 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 74  corresponds to t
33f40 68 65 20 6a 2d 74 68 20 63 6f 6c 75 6d 6e 0a 20  he j-th column. 
33f50 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65         ** of the
33f60 20 69 6e 64 65 78 20 61 6e 64 20 6d 61 72 6b 20   index and mark 
33f70 74 68 61 74 20 4f 52 44 45 52 20 42 59 20 74 65  that ORDER BY te
33f80 72 6d 20 6f 66 66 20 0a 20 20 20 20 20 20 20 20  rm off .        
33f90 2a 2f 0a 20 20 20 20 20 20 20 20 62 4f 6e 63 65  */.        bOnce
33fa0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 69 73   = 1;.        is
33fb0 4d 61 74 63 68 20 3d 20 30 3b 0a 20 20 20 20 20  Match = 0;.     
33fc0 20 20 20 66 6f 72 28 69 3d 30 3b 20 62 4f 6e 63     for(i=0; bOnc
33fd0 65 20 26 26 20 69 3c 6e 4f 72 64 65 72 42 79 3b  e && i<nOrderBy;
33fe0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
33ff0 20 69 66 28 20 4d 41 53 4b 42 49 54 28 69 29 20   if( MASKBIT(i) 
34000 26 20 6f 62 53 61 74 20 29 20 63 6f 6e 74 69 6e  & obSat ) contin
34010 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4f  ue;.          pO
34020 42 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45  BExpr = sqlite3E
34030 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70  xprSkipCollate(p
34040 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45  OrderBy->a[i].pE
34050 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  xpr);.          
34060 74 65 73 74 63 61 73 65 28 20 77 63 74 72 6c 46  testcase( wctrlF
34070 6c 61 67 73 20 26 20 57 48 45 52 45 5f 47 52 4f  lags & WHERE_GRO
34080 55 50 42 59 20 29 3b 0a 20 20 20 20 20 20 20 20  UPBY );.        
34090 20 20 74 65 73 74 63 61 73 65 28 20 77 63 74 72    testcase( wctr
340a0 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 44  lFlags & WHERE_D
340b0 49 53 54 49 4e 43 54 42 59 20 29 3b 0a 20 20 20  ISTINCTBY );.   
340c0 20 20 20 20 20 20 20 69 66 28 20 28 77 63 74 72         if( (wctr
340d0 6c 46 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f  lFlags & (WHERE_
340e0 47 52 4f 55 50 42 59 7c 57 48 45 52 45 5f 44 49  GROUPBY|WHERE_DI
340f0 53 54 49 4e 43 54 42 59 29 29 3d 3d 30 20 29 20  STINCTBY))==0 ) 
34100 62 4f 6e 63 65 20 3d 20 30 3b 0a 20 20 20 20 20  bOnce = 0;.     
34110 20 20 20 20 20 69 66 28 20 70 4f 42 45 78 70 72       if( pOBExpr
34120 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op!=TK_COLUMN 
34130 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
34140 20 20 20 20 20 20 69 66 28 20 70 4f 42 45 78 70        if( pOBExp
34150 72 2d 3e 69 54 61 62 6c 65 21 3d 69 43 75 72 20  r->iTable!=iCur 
34160 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
34170 20 20 20 20 20 20 69 66 28 20 70 4f 42 45 78 70        if( pOBExp
34180 72 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c  r->iColumn!=iCol
34190 75 6d 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  umn ) continue;.
341a0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 43            if( iC
341b0 6f 6c 75 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20 20  olumn>=0 ){.    
341c0 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20          pColl = 
341d0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
341e0 65 71 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73  eq(pWInfo->pPars
341f0 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69  e, pOrderBy->a[i
34200 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
34210 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c        if( !pColl
34220 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70   ) pColl = db->p
34230 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  DfltColl;.      
34240 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
34250 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e  3StrICmp(pColl->
34260 7a 4e 61 6d 65 2c 20 70 49 6e 64 65 78 2d 3e 61  zName, pIndex->a
34270 7a 43 6f 6c 6c 5b 6a 5d 29 21 3d 30 20 29 20 63  zColl[j])!=0 ) c
34280 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
34290 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
342a0 73 4d 61 74 63 68 20 3d 20 31 3b 0a 20 20 20 20  sMatch = 1;.    
342b0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
342c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
342d0 66 28 20 69 73 4d 61 74 63 68 20 26 26 20 28 77  f( isMatch && (w
342e0 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
342f0 45 5f 47 52 4f 55 50 42 59 29 3d 3d 30 20 29 7b  E_GROUPBY)==0 ){
34300 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61  .          /* Ma
34310 6b 65 20 73 75 72 65 20 74 68 65 20 73 6f 72 74  ke sure the sort
34320 20 6f 72 64 65 72 20 69 73 20 63 6f 6d 70 61 74   order is compat
34330 69 62 6c 65 20 69 6e 20 61 6e 20 4f 52 44 45 52  ible in an ORDER
34340 20 42 59 20 63 6c 61 75 73 65 2e 0a 20 20 20 20   BY clause..    
34350 20 20 20 20 20 20 2a 2a 20 53 6f 72 74 20 6f 72        ** Sort or
34360 64 65 72 20 69 73 20 69 72 72 65 6c 65 76 61 6e  der is irrelevan
34370 74 20 66 6f 72 20 61 20 47 52 4f 55 50 20 42 59  t for a GROUP BY
34380 20 63 6c 61 75 73 65 2e 20 2a 2f 0a 20 20 20 20   clause. */.    
34390 20 20 20 20 20 20 69 66 28 20 72 65 76 53 65 74        if( revSet
343a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
343b0 69 66 28 20 28 72 65 76 20 5e 20 72 65 76 49 64  if( (rev ^ revId
343c0 78 29 21 3d 70 4f 72 64 65 72 42 79 2d 3e 61 5b  x)!=pOrderBy->a[
343d0 69 5d 2e 73 6f 72 74 4f 72 64 65 72 20 29 20 69  i].sortOrder ) i
343e0 73 4d 61 74 63 68 20 3d 20 30 3b 0a 20 20 20 20  sMatch = 0;.    
343f0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
34400 20 20 20 20 20 20 20 20 20 72 65 76 20 3d 20 72           rev = r
34410 65 76 49 64 78 20 5e 20 70 4f 72 64 65 72 42 79  evIdx ^ pOrderBy
34420 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72  ->a[i].sortOrder
34430 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
34440 28 20 72 65 76 20 29 20 2a 70 52 65 76 4d 61 73  ( rev ) *pRevMas
34450 6b 20 7c 3d 20 4d 41 53 4b 42 49 54 28 69 4c 6f  k |= MASKBIT(iLo
34460 6f 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  op);.           
34470 20 72 65 76 53 65 74 20 3d 20 31 3b 0a 20 20 20   revSet = 1;.   
34480 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
34490 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 69   }.        if( i
344a0 73 4d 61 74 63 68 20 29 7b 0a 20 20 20 20 20 20  sMatch ){.      
344b0 20 20 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3c      if( iColumn<
344c0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
344d0 20 74 65 73 74 63 61 73 65 28 20 64 69 73 74 69   testcase( disti
344e0 6e 63 74 43 6f 6c 75 6d 6e 73 3d 3d 30 20 29 3b  nctColumns==0 );
344f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 64 69 73  .            dis
34500 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 20 3d 20 31  tinctColumns = 1
34510 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
34520 20 20 20 20 20 20 20 20 6f 62 53 61 74 20 7c 3d          obSat |=
34530 20 4d 41 53 4b 42 49 54 28 69 29 3b 0a 20 20 20   MASKBIT(i);.   
34540 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
34550 20 20 20 20 20 20 2f 2a 20 4e 6f 20 6d 61 74 63        /* No matc
34560 68 20 66 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20  h found */.     
34570 20 20 20 20 20 69 66 28 20 6a 3d 3d 30 20 7c 7c       if( j==0 ||
34580 20 6a 3c 6e 4b 65 79 43 6f 6c 20 29 7b 0a 20 20   j<nKeyCol ){.  
34590 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
345a0 73 65 28 20 69 73 4f 72 64 65 72 44 69 73 74 69  se( isOrderDisti
345b0 6e 63 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  nct!=0 );.      
345c0 20 20 20 20 20 20 69 73 4f 72 64 65 72 44 69 73        isOrderDis
345d0 74 69 6e 63 74 20 3d 20 30 3b 0a 20 20 20 20 20  tinct = 0;.     
345e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
345f0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
34600 7d 0a 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64  }.      } /* end
34610 20 4c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20 69   Loop over all i
34620 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a  ndex columns */.
34630 20 20 20 20 20 20 69 66 28 20 64 69 73 74 69 6e        if( distin
34640 63 74 43 6f 6c 75 6d 6e 73 20 29 7b 0a 20 20 20  ctColumns ){.   
34650 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
34660 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 3d 3d  sOrderDistinct==
34670 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 73 4f  0 );.        isO
34680 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20 31  rderDistinct = 1
34690 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20  ;.      }.    } 
346a0 2f 2a 20 65 6e 64 2d 69 66 20 6e 6f 74 20 6f 6e  /* end-if not on
346b0 65 2d 72 6f 77 20 2a 2f 0a 0a 20 20 20 20 2f 2a  e-row */..    /*
346c0 20 4d 61 72 6b 20 6f 66 66 20 61 6e 79 20 6f 74   Mark off any ot
346d0 68 65 72 20 4f 52 44 45 52 20 42 59 20 74 65 72  her ORDER BY ter
346e0 6d 73 20 74 68 61 74 20 72 65 66 65 72 65 6e 63  ms that referenc
346f0 65 20 70 4c 6f 6f 70 20 2a 2f 0a 20 20 20 20 69  e pLoop */.    i
34700 66 28 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e  f( isOrderDistin
34710 63 74 20 29 7b 0a 20 20 20 20 20 20 6f 72 64 65  ct ){.      orde
34720 72 44 69 73 74 69 6e 63 74 4d 61 73 6b 20 7c 3d  rDistinctMask |=
34730 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66   pLoop->maskSelf
34740 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
34750 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b   i<nOrderBy; i++
34760 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20  ){.        Expr 
34770 2a 70 3b 0a 20 20 20 20 20 20 20 20 42 69 74 6d  *p;.        Bitm
34780 61 73 6b 20 6d 54 65 72 6d 3b 0a 20 20 20 20 20  ask mTerm;.     
34790 20 20 20 69 66 28 20 4d 41 53 4b 42 49 54 28 69     if( MASKBIT(i
347a0 29 20 26 20 6f 62 53 61 74 20 29 20 63 6f 6e 74  ) & obSat ) cont
347b0 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 70 20  inue;.        p 
347c0 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  = pOrderBy->a[i]
347d0 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  .pExpr;.        
347e0 6d 54 65 72 6d 20 3d 20 65 78 70 72 54 61 62 6c  mTerm = exprTabl
347f0 65 55 73 61 67 65 28 26 70 57 49 6e 66 6f 2d 3e  eUsage(&pWInfo->
34800 73 4d 61 73 6b 53 65 74 2c 70 29 3b 0a 20 20 20  sMaskSet,p);.   
34810 20 20 20 20 20 69 66 28 20 6d 54 65 72 6d 3d 3d       if( mTerm==
34820 30 20 26 26 20 21 73 71 6c 69 74 65 33 45 78 70  0 && !sqlite3Exp
34830 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 29 20 29  rIsConstant(p) )
34840 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
34850 20 20 20 69 66 28 20 28 6d 54 65 72 6d 26 7e 6f     if( (mTerm&~o
34860 72 64 65 72 44 69 73 74 69 6e 63 74 4d 61 73 6b  rderDistinctMask
34870 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
34880 20 20 6f 62 53 61 74 20 7c 3d 20 4d 41 53 4b 42    obSat |= MASKB
34890 49 54 28 69 29 3b 0a 20 20 20 20 20 20 20 20 7d  IT(i);.        }
348a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
348b0 20 7d 20 2f 2a 20 45 6e 64 20 74 68 65 20 6c 6f   } /* End the lo
348c0 6f 70 20 6f 76 65 72 20 61 6c 6c 20 57 68 65 72  op over all Wher
348d0 65 4c 6f 6f 70 73 20 66 72 6f 6d 20 6f 75 74 65  eLoops from oute
348e0 72 2d 6d 6f 73 74 20 64 6f 77 6e 20 74 6f 20 69  r-most down to i
348f0 6e 6e 65 72 2d 6d 6f 73 74 20 2a 2f 0a 20 20 69  nner-most */.  i
34900 66 28 20 6f 62 53 61 74 3d 3d 6f 62 44 6f 6e 65  f( obSat==obDone
34910 20 29 20 72 65 74 75 72 6e 20 28 69 38 29 6e 4f   ) return (i8)nO
34920 72 64 65 72 42 79 3b 0a 20 20 69 66 28 20 21 69  rderBy;.  if( !i
34930 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 29  sOrderDistinct )
34940 7b 0a 20 20 20 20 66 6f 72 28 69 3d 6e 4f 72 64  {.    for(i=nOrd
34950 65 72 42 79 2d 31 3b 20 69 3e 30 3b 20 69 2d 2d  erBy-1; i>0; i--
34960 29 7b 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b  ){.      Bitmask
34970 20 6d 20 3d 20 4d 41 53 4b 42 49 54 28 69 29 20   m = MASKBIT(i) 
34980 2d 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20 28  - 1;.      if( (
34990 6f 62 53 61 74 26 6d 29 3d 3d 6d 20 29 20 72 65  obSat&m)==m ) re
349a0 74 75 72 6e 20 69 3b 0a 20 20 20 20 7d 0a 20 20  turn i;.    }.  
349b0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
349c0 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a    return -1;.}..
349d0 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 57 48  ./*.** If the WH
349e0 45 52 45 5f 47 52 4f 55 50 42 59 20 66 6c 61 67  ERE_GROUPBY flag
349f0 20 69 73 20 73 65 74 20 69 6e 20 74 68 65 20 6d   is set in the m
34a00 61 73 6b 20 70 61 73 73 65 64 20 74 6f 20 73 71  ask passed to sq
34a10 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
34a20 29 2c 0a 2a 2a 20 74 68 65 20 70 6c 61 6e 6e 65  ),.** the planne
34a30 72 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 74  r assumes that t
34a40 68 65 20 73 70 65 63 69 66 69 65 64 20 70 4f 72  he specified pOr
34a50 64 65 72 42 79 20 6c 69 73 74 20 69 73 20 61 63  derBy list is ac
34a60 74 75 61 6c 6c 79 20 61 20 47 52 4f 55 50 0a 2a  tually a GROUP.*
34a70 2a 20 42 59 20 63 6c 61 75 73 65 20 2d 20 61 6e  * BY clause - an
34a80 64 20 73 6f 20 61 6e 79 20 6f 72 64 65 72 20 74  d so any order t
34a90 68 61 74 20 67 72 6f 75 70 73 20 72 6f 77 73 20  hat groups rows 
34aa0 61 73 20 72 65 71 75 69 72 65 64 20 73 61 74 69  as required sati
34ab0 73 66 69 65 73 20 74 68 65 0a 2a 2a 20 72 65 71  sfies the.** req
34ac0 75 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d  uest..**.** Norm
34ad0 61 6c 6c 79 2c 20 69 6e 20 74 68 69 73 20 63 61  ally, in this ca
34ae0 73 65 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73  se it is not pos
34af0 73 69 62 6c 65 20 66 6f 72 20 74 68 65 20 63 61  sible for the ca
34b00 6c 6c 65 72 20 74 6f 20 64 65 74 65 72 6d 69 6e  ller to determin
34b10 65 0a 2a 2a 20 77 68 65 74 68 65 72 20 6f 72 20  e.** whether or 
34b20 6e 6f 74 20 74 68 65 20 72 6f 77 73 20 61 72 65  not the rows are
34b30 20 72 65 61 6c 6c 79 20 62 65 69 6e 67 20 64 65   really being de
34b40 6c 69 76 65 72 65 64 20 69 6e 20 73 6f 72 74 65  livered in sorte
34b50 64 20 6f 72 64 65 72 2c 20 6f 72 0a 2a 2a 20 6a  d order, or.** j
34b60 75 73 74 20 69 6e 20 73 6f 6d 65 20 6f 74 68 65  ust in some othe
34b70 72 20 6f 72 64 65 72 20 74 68 61 74 20 70 72 6f  r order that pro
34b80 76 69 64 65 73 20 74 68 65 20 72 65 71 75 69 72  vides the requir
34b90 65 64 20 67 72 6f 75 70 69 6e 67 2e 20 48 6f 77  ed grouping. How
34ba0 65 76 65 72 2c 0a 2a 2a 20 69 66 20 74 68 65 20  ever,.** if the 
34bb0 57 48 45 52 45 5f 53 4f 52 54 42 59 47 52 4f 55  WHERE_SORTBYGROU
34bc0 50 20 66 6c 61 67 20 69 73 20 61 6c 73 6f 20 70  P flag is also p
34bd0 61 73 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33  assed to sqlite3
34be0 57 68 65 72 65 42 65 67 69 6e 28 29 2c 20 74 68  WhereBegin(), th
34bf0 65 6e 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74  en.** this funct
34c00 69 6f 6e 20 6d 61 79 20 62 65 20 63 61 6c 6c 65  ion may be calle
34c10 64 20 6f 6e 20 74 68 65 20 72 65 74 75 72 6e 65  d on the returne
34c20 64 20 57 68 65 72 65 49 6e 66 6f 20 6f 62 6a 65  d WhereInfo obje
34c30 63 74 2e 20 49 74 20 72 65 74 75 72 6e 73 0a 2a  ct. It returns.*
34c40 2a 20 74 72 75 65 20 69 66 20 74 68 65 20 72 6f  * true if the ro
34c50 77 73 20 72 65 61 6c 6c 79 20 77 69 6c 6c 20 62  ws really will b
34c60 65 20 73 6f 72 74 65 64 20 69 6e 20 74 68 65 20  e sorted in the 
34c70 73 70 65 63 69 66 69 65 64 20 6f 72 64 65 72 2c  specified order,
34c80 20 6f 72 20 66 61 6c 73 65 0a 2a 2a 20 6f 74 68   or false.** oth
34c90 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f  erwise..**.** Fo
34ca0 72 20 65 78 61 6d 70 6c 65 2c 20 61 73 73 75 6d  r example, assum
34cb0 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 43 52 45  ing:.**.**   CRE
34cc0 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20  ATE INDEX i1 ON 
34cd0 74 31 28 78 2c 20 59 29 3b 0a 2a 2a 0a 2a 2a 20  t1(x, Y);.**.** 
34ce0 74 68 65 6e 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c  then.**.**   SEL
34cf0 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 47 52  ECT * FROM t1 GR
34d00 4f 55 50 20 42 59 20 78 2c 79 20 4f 52 44 45 52  OUP BY x,y ORDER
34d10 20 42 59 20 78 2c 79 3b 20 20 20 2d 2d 20 49 73   BY x,y;   -- Is
34d20 53 6f 72 74 65 64 28 29 3d 3d 31 0a 2a 2a 20 20  Sorted()==1.**  
34d30 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
34d40 31 20 47 52 4f 55 50 20 42 59 20 79 2c 78 20 4f  1 GROUP BY y,x O
34d50 52 44 45 52 20 42 59 20 79 2c 78 3b 20 20 20 2d  RDER BY y,x;   -
34d60 2d 20 49 73 53 6f 72 74 65 64 28 29 3d 3d 30 0a  - IsSorted()==0.
34d70 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 68  */.int sqlite3Wh
34d80 65 72 65 49 73 53 6f 72 74 65 64 28 57 68 65 72  ereIsSorted(Wher
34d90 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a  eInfo *pWInfo){.
34da0 20 20 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f    assert( pWInfo
34db0 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ->wctrlFlags & W
34dc0 48 45 52 45 5f 47 52 4f 55 50 42 59 20 29 3b 0a  HERE_GROUPBY );.
34dd0 20 20 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f    assert( pWInfo
34de0 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ->wctrlFlags & W
34df0 48 45 52 45 5f 53 4f 52 54 42 59 47 52 4f 55 50  HERE_SORTBYGROUP
34e00 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 57 49   );.  return pWI
34e10 6e 66 6f 2d 3e 73 6f 72 74 65 64 3b 0a 7d 0a 0a  nfo->sorted;.}..
34e20 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41 43  #ifdef WHERETRAC
34e30 45 5f 45 4e 41 42 4c 45 44 0a 2f 2a 20 46 6f 72  E_ENABLED./* For
34e40 20 64 65 62 75 67 67 69 6e 67 20 75 73 65 20 6f   debugging use o
34e50 6e 6c 79 3a 20 2a 2f 0a 73 74 61 74 69 63 20 63  nly: */.static c
34e60 6f 6e 73 74 20 63 68 61 72 20 2a 77 68 65 72 65  onst char *where
34e70 50 61 74 68 4e 61 6d 65 28 57 68 65 72 65 50 61  PathName(WherePa
34e80 74 68 20 2a 70 50 61 74 68 2c 20 69 6e 74 20 6e  th *pPath, int n
34e90 4c 6f 6f 70 2c 20 57 68 65 72 65 4c 6f 6f 70 20  Loop, WhereLoop 
34ea0 2a 70 4c 61 73 74 29 7b 0a 20 20 73 74 61 74 69  *pLast){.  stati
34eb0 63 20 63 68 61 72 20 7a 4e 61 6d 65 5b 36 35 5d  c char zName[65]
34ec0 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  ;.  int i;.  for
34ed0 28 69 3d 30 3b 20 69 3c 6e 4c 6f 6f 70 3b 20 69  (i=0; i<nLoop; i
34ee0 2b 2b 29 7b 20 7a 4e 61 6d 65 5b 69 5d 20 3d 20  ++){ zName[i] = 
34ef0 70 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b 69 5d 2d  pPath->aLoop[i]-
34f00 3e 63 49 64 3b 20 7d 0a 20 20 69 66 28 20 70 4c  >cId; }.  if( pL
34f10 61 73 74 20 29 20 7a 4e 61 6d 65 5b 69 2b 2b 5d  ast ) zName[i++]
34f20 20 3d 20 70 4c 61 73 74 2d 3e 63 49 64 3b 0a 20   = pLast->cId;. 
34f30 20 7a 4e 61 6d 65 5b 69 5d 20 3d 20 30 3b 0a 20   zName[i] = 0;. 
34f40 20 72 65 74 75 72 6e 20 7a 4e 61 6d 65 3b 0a 7d   return zName;.}
34f50 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
34f60 65 74 75 72 6e 20 74 68 65 20 63 6f 73 74 20 6f  eturn the cost o
34f70 66 20 73 6f 72 74 69 6e 67 20 6e 52 6f 77 20 72  f sorting nRow r
34f80 6f 77 73 2c 20 61 73 73 75 6d 69 6e 67 20 74 68  ows, assuming th
34f90 61 74 20 74 68 65 20 6b 65 79 73 20 68 61 76 65  at the keys have
34fa0 20 0a 2a 2a 20 6e 4f 72 64 65 72 62 79 20 63 6f   .** nOrderby co
34fb0 6c 75 6d 6e 73 20 61 6e 64 20 74 68 61 74 20 74  lumns and that t
34fc0 68 65 20 66 69 72 73 74 20 6e 53 6f 72 74 65 64  he first nSorted
34fd0 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 61 6c 72   columns are alr
34fe0 65 61 64 79 20 69 6e 0a 2a 2a 20 6f 72 64 65 72  eady in.** order
34ff0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4c 6f 67 45  ..*/.static LogE
35000 73 74 20 77 68 65 72 65 53 6f 72 74 69 6e 67 43  st whereSortingC
35010 6f 73 74 28 0a 20 20 57 68 65 72 65 49 6e 66 6f  ost(.  WhereInfo
35020 20 2a 70 57 49 6e 66 6f 2c 0a 20 20 4c 6f 67 45   *pWInfo,.  LogE
35030 73 74 20 6e 52 6f 77 2c 0a 20 20 69 6e 74 20 6e  st nRow,.  int n
35040 4f 72 64 65 72 42 79 2c 0a 20 20 69 6e 74 20 6e  OrderBy,.  int n
35050 53 6f 72 74 65 64 0a 29 7b 0a 20 20 2f 2a 20 54  Sorted.){.  /* T
35060 55 4e 49 4e 47 3a 20 45 73 74 69 6d 61 74 65 64  UNING: Estimated
35070 20 63 6f 73 74 20 6f 66 20 61 20 66 75 6c 6c 20   cost of a full 
35080 65 78 74 65 72 6e 61 6c 20 73 6f 72 74 2c 20 77  external sort, w
35090 68 65 72 65 20 4e 20 69 73 20 0a 20 20 2a 2a 20  here N is .  ** 
350a0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
350b0 77 73 20 74 6f 20 73 6f 72 74 20 69 73 3a 0a 20  ws to sort is:. 
350c0 20 2a 2a 0a 20 20 2a 2a 20 20 20 63 6f 73 74 20   **.  **   cost 
350d0 3d 20 28 33 2e 30 20 2a 20 4e 20 2a 20 6c 6f 67  = (3.0 * N * log
350e0 28 4e 29 29 2e 0a 20 20 2a 2a 20 0a 20 20 2a 2a  (N))..  ** .  **
350f0 20 4f 72 2c 20 69 66 20 74 68 65 20 6f 72 64 65   Or, if the orde
35100 72 2d 62 79 20 63 6c 61 75 73 65 20 68 61 73 20  r-by clause has 
35110 58 20 74 65 72 6d 73 20 62 75 74 20 6f 6e 6c 79  X terms but only
35120 20 74 68 65 20 6c 61 73 74 20 59 20 0a 20 20 2a   the last Y .  *
35130 2a 20 74 65 72 6d 73 20 61 72 65 20 6f 75 74 20  * terms are out 
35140 6f 66 20 6f 72 64 65 72 2c 20 74 68 65 6e 20 62  of order, then b
35150 6c 6f 63 6b 2d 73 6f 72 74 69 6e 67 20 77 69 6c  lock-sorting wil
35160 6c 20 72 65 64 75 63 65 20 74 68 65 20 0a 20 20  l reduce the .  
35170 2a 2a 20 73 6f 72 74 69 6e 67 20 63 6f 73 74 20  ** sorting cost 
35180 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  to:.  **.  **   
35190 63 6f 73 74 20 3d 20 28 33 2e 30 20 2a 20 4e 20  cost = (3.0 * N 
351a0 2a 20 6c 6f 67 28 4e 29 29 20 2a 20 28 59 2f 58  * log(N)) * (Y/X
351b0 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ).  **.  ** The 
351c0 28 59 2f 58 29 20 74 65 72 6d 20 69 73 20 69 6d  (Y/X) term is im
351d0 70 6c 65 6d 65 6e 74 65 64 20 75 73 69 6e 67 20  plemented using 
351e0 73 74 61 63 6b 20 76 61 72 69 61 62 6c 65 20 72  stack variable r
351f0 53 63 61 6c 65 0a 20 20 2a 2a 20 62 65 6c 6f 77  Scale.  ** below
35200 2e 20 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 72  .  */.  LogEst r
35210 53 63 61 6c 65 2c 20 72 53 6f 72 74 43 6f 73 74  Scale, rSortCost
35220 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4f 72 64  ;.  assert( nOrd
35230 65 72 42 79 3e 30 20 26 26 20 36 36 3d 3d 73 71  erBy>0 && 66==sq
35240 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 30 30 29  lite3LogEst(100)
35250 20 29 3b 0a 20 20 72 53 63 61 6c 65 20 3d 20 73   );.  rScale = s
35260 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 28 6e 4f  qlite3LogEst((nO
35270 72 64 65 72 42 79 2d 6e 53 6f 72 74 65 64 29 2a  rderBy-nSorted)*
35280 31 30 30 2f 6e 4f 72 64 65 72 42 79 29 20 2d 20  100/nOrderBy) - 
35290 36 36 3b 0a 20 20 72 53 6f 72 74 43 6f 73 74 20  66;.  rSortCost 
352a0 3d 20 6e 52 6f 77 20 2b 20 65 73 74 4c 6f 67 28  = nRow + estLog(
352b0 6e 52 6f 77 29 20 2b 20 72 53 63 61 6c 65 20 2b  nRow) + rScale +
352c0 20 31 36 3b 0a 0a 20 20 2f 2a 20 54 55 4e 49 4e   16;..  /* TUNIN
352d0 47 3a 20 54 68 65 20 63 6f 73 74 20 6f 66 20 69  G: The cost of i
352e0 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 44 49 53 54  mplementing DIST
352f0 49 4e 43 54 20 75 73 69 6e 67 20 61 20 42 2d 54  INCT using a B-T
35300 52 45 45 20 69 73 0a 20 20 2a 2a 20 73 69 6d 69  REE is.  ** simi
35310 6c 61 72 20 62 75 74 20 77 69 74 68 20 61 20 6c  lar but with a l
35320 61 72 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 6f  arger constant o
35330 66 20 70 72 6f 70 6f 72 74 69 6f 6e 61 6c 69 74  f proportionalit
35340 79 2e 20 0a 20 20 2a 2a 20 4d 75 6c 74 69 70 6c  y. .  ** Multipl
35350 79 20 62 79 20 61 6e 20 61 64 64 69 74 69 6f 6e  y by an addition
35360 61 6c 20 66 61 63 74 6f 72 20 6f 66 20 33 2e 30  al factor of 3.0
35370 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 57 49 6e  .  */.  if( pWIn
35380 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26  fo->wctrlFlags &
35390 20 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54   WHERE_WANT_DIST
353a0 49 4e 43 54 20 29 7b 0a 20 20 20 20 72 53 6f 72  INCT ){.    rSor
353b0 74 43 6f 73 74 20 2b 3d 20 31 36 3b 0a 20 20 7d  tCost += 16;.  }
353c0 0a 0a 20 20 72 65 74 75 72 6e 20 72 53 6f 72 74  ..  return rSort
353d0 43 6f 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  Cost;.}../*.** G
353e0 69 76 65 6e 20 74 68 65 20 6c 69 73 74 20 6f 66  iven the list of
353f0 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63   WhereLoop objec
35400 74 73 20 61 74 20 70 57 49 6e 66 6f 2d 3e 70 4c  ts at pWInfo->pL
35410 6f 6f 70 73 2c 20 74 68 69 73 20 72 6f 75 74 69  oops, this routi
35420 6e 65 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 74  ne.** attempts t
35430 6f 20 66 69 6e 64 20 74 68 65 20 6c 6f 77 65 73  o find the lowes
35440 74 20 63 6f 73 74 20 70 61 74 68 20 74 68 61 74  t cost path that
35450 20 76 69 73 69 74 73 20 65 61 63 68 20 57 68 65   visits each Whe
35460 72 65 4c 6f 6f 70 0a 2a 2a 20 6f 6e 63 65 2e 20  reLoop.** once. 
35470 20 54 68 69 73 20 70 61 74 68 20 69 73 20 74 68   This path is th
35480 65 6e 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20 74  en loaded into t
35490 68 65 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 70  he pWInfo->a[].p
354a0 57 4c 6f 6f 70 20 66 69 65 6c 64 73 2e 0a 2a 2a  WLoop fields..**
354b0 0a 2a 2a 20 41 73 73 75 6d 65 20 74 68 61 74 20  .** Assume that 
354c0 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  the total number
354d0 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20   of output rows 
354e0 74 68 61 74 20 77 69 6c 6c 20 6e 65 65 64 20 74  that will need t
354f0 6f 20 62 65 20 73 6f 72 74 65 64 0a 2a 2a 20 77  o be sorted.** w
35500 69 6c 6c 20 62 65 20 6e 52 6f 77 45 73 74 20 28  ill be nRowEst (
35510 69 6e 20 74 68 65 20 31 30 2a 6c 6f 67 32 20 72  in the 10*log2 r
35520 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 29 2e 20  epresentation). 
35530 20 4f 72 2c 20 69 67 6e 6f 72 65 20 73 6f 72 74   Or, ignore sort
35540 69 6e 67 0a 2a 2a 20 63 6f 73 74 73 20 69 66 20  ing.** costs if 
35550 6e 52 6f 77 45 73 74 3d 3d 30 2e 0a 2a 2a 0a 2a  nRowEst==0..**.*
35560 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
35570 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72  OK on success or
35580 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6f 66   SQLITE_NOMEM of
35590 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61   a memory alloca
355a0 74 69 6f 6e 0a 2a 2a 20 65 72 72 6f 72 20 6f 63  tion.** error oc
355b0 63 75 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  curs..*/.static 
355c0 69 6e 74 20 77 68 65 72 65 50 61 74 68 53 6f 6c  int wherePathSol
355d0 76 65 72 28 57 68 65 72 65 49 6e 66 6f 20 2a 70  ver(WhereInfo *p
355e0 57 49 6e 66 6f 2c 20 4c 6f 67 45 73 74 20 6e 52  WInfo, LogEst nR
355f0 6f 77 45 73 74 29 7b 0a 20 20 69 6e 74 20 6d 78  owEst){.  int mx
35600 43 68 6f 69 63 65 3b 20 20 20 20 20 20 20 20 20  Choice;         
35610 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e      /* Maximum n
35620 75 6d 62 65 72 20 6f 66 20 73 69 6d 75 6c 74 61  umber of simulta
35630 6e 65 6f 75 73 20 70 61 74 68 73 20 74 72 61 63  neous paths trac
35640 6b 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f  ked */.  int nLo
35650 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  op;             
35660 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
35670 74 65 72 6d 73 20 69 6e 20 74 68 65 20 6a 6f 69  terms in the joi
35680 6e 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50  n */.  Parse *pP
35690 61 72 73 65 3b 20 20 20 20 20 20 20 20 20 20 20  arse;           
356a0 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
356b0 65 78 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ext */.  sqlite3
356c0 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20   *db;           
356d0 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
356e0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
356f0 0a 20 20 69 6e 74 20 69 4c 6f 6f 70 3b 20 20 20  .  int iLoop;   
35700 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
35710 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 6f 76 65  Loop counter ove
35720 72 20 74 68 65 20 74 65 72 6d 73 20 6f 66 20 74  r the terms of t
35730 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20 69 6e 74  he join */.  int
35740 20 69 69 2c 20 6a 6a 3b 20 20 20 20 20 20 20 20   ii, jj;        
35750 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
35760 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74  ounters */.  int
35770 20 6d 78 49 20 3d 20 30 3b 20 20 20 20 20 20 20   mxI = 0;       
35780 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
35790 6f 66 20 6e 65 78 74 20 65 6e 74 72 79 20 74 6f  of next entry to
357a0 20 72 65 70 6c 61 63 65 20 2a 2f 0a 20 20 69 6e   replace */.  in
357b0 74 20 6e 4f 72 64 65 72 42 79 3b 20 20 20 20 20  t nOrderBy;     
357c0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
357d0 72 20 6f 66 20 4f 52 44 45 52 20 42 59 20 63 6c  r of ORDER BY cl
357e0 61 75 73 65 20 74 65 72 6d 73 20 2a 2f 0a 20 20  ause terms */.  
357f0 4c 6f 67 45 73 74 20 6d 78 43 6f 73 74 20 3d 20  LogEst mxCost = 
35800 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78  0;        /* Max
35810 69 6d 75 6d 20 63 6f 73 74 20 6f 66 20 61 20 73  imum cost of a s
35820 65 74 20 6f 66 20 70 61 74 68 73 20 2a 2f 0a 20  et of paths */. 
35830 20 4c 6f 67 45 73 74 20 6d 78 55 6e 73 6f 72 74   LogEst mxUnsort
35840 65 64 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4d 61  ed = 0;    /* Ma
35850 78 69 6d 75 6d 20 75 6e 73 6f 72 74 65 64 20 63  ximum unsorted c
35860 6f 73 74 20 6f 66 20 61 20 73 65 74 20 6f 66 20  ost of a set of 
35870 70 61 74 68 20 2a 2f 0a 20 20 69 6e 74 20 6e 54  path */.  int nT
35880 6f 2c 20 6e 46 72 6f 6d 3b 20 20 20 20 20 20 20  o, nFrom;       
35890 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
358a0 20 76 61 6c 69 64 20 65 6e 74 72 69 65 73 20 69   valid entries i
358b0 6e 20 61 54 6f 5b 5d 20 61 6e 64 20 61 46 72 6f  n aTo[] and aFro
358c0 6d 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65 50 61  m[] */.  WherePa
358d0 74 68 20 2a 61 46 72 6f 6d 3b 20 20 20 20 20 20  th *aFrom;      
358e0 20 20 20 2f 2a 20 41 6c 6c 20 6e 46 72 6f 6d 20     /* All nFrom 
358f0 70 61 74 68 73 20 61 74 20 74 68 65 20 70 72 65  paths at the pre
35900 76 69 6f 75 73 20 6c 65 76 65 6c 20 2a 2f 0a 20  vious level */. 
35910 20 57 68 65 72 65 50 61 74 68 20 2a 61 54 6f 3b   WherePath *aTo;
35920 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
35930 65 20 6e 54 6f 20 62 65 73 74 20 70 61 74 68 73  e nTo best paths
35940 20 61 74 20 74 68 65 20 63 75 72 72 65 6e 74 20   at the current 
35950 6c 65 76 65 6c 20 2a 2f 0a 20 20 57 68 65 72 65  level */.  Where
35960 50 61 74 68 20 2a 70 46 72 6f 6d 3b 20 20 20 20  Path *pFrom;    
35970 20 20 20 20 20 2f 2a 20 41 6e 20 65 6c 65 6d 65       /* An eleme
35980 6e 74 20 6f 66 20 61 46 72 6f 6d 5b 5d 20 74 68  nt of aFrom[] th
35990 61 74 20 77 65 20 61 72 65 20 77 6f 72 6b 69 6e  at we are workin
359a0 67 20 6f 6e 20 2a 2f 0a 20 20 57 68 65 72 65 50  g on */.  WhereP
359b0 61 74 68 20 2a 70 54 6f 3b 20 20 20 20 20 20 20  ath *pTo;       
359c0 20 20 20 20 2f 2a 20 41 6e 20 65 6c 65 6d 65 6e      /* An elemen
359d0 74 20 6f 66 20 61 54 6f 5b 5d 20 74 68 61 74 20  t of aTo[] that 
359e0 77 65 20 61 72 65 20 77 6f 72 6b 69 6e 67 20 6f  we are working o
359f0 6e 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70  n */.  WhereLoop
35a00 20 2a 70 57 4c 6f 6f 70 3b 20 20 20 20 20 20 20   *pWLoop;       
35a10 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 57   /* One of the W
35a20 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73  hereLoop objects
35a30 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20   */.  WhereLoop 
35a40 2a 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20 20  **pX;           
35a50 2f 2a 20 55 73 65 64 20 74 6f 20 64 69 76 79 20  /* Used to divy 
35a60 75 70 20 74 68 65 20 70 53 70 61 63 65 20 6d 65  up the pSpace me
35a70 6d 6f 72 79 20 2a 2f 0a 20 20 4c 6f 67 45 73 74  mory */.  LogEst
35a80 20 2a 61 53 6f 72 74 43 6f 73 74 20 3d 20 30 3b   *aSortCost = 0;
35a90 20 20 20 20 2f 2a 20 53 6f 72 74 69 6e 67 20 61      /* Sorting a
35aa0 6e 64 20 70 61 72 74 69 61 6c 20 73 6f 72 74 69  nd partial sorti
35ab0 6e 67 20 63 6f 73 74 73 20 2a 2f 0a 20 20 63 68  ng costs */.  ch
35ac0 61 72 20 2a 70 53 70 61 63 65 3b 20 20 20 20 20  ar *pSpace;     
35ad0 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f          /* Tempo
35ae0 72 61 72 79 20 6d 65 6d 6f 72 79 20 75 73 65 64  rary memory used
35af0 20 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65   by this routine
35b00 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 70 61 63 65   */.  int nSpace
35b10 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
35b20 2f 2a 20 42 79 74 65 73 20 6f 66 20 73 70 61 63  /* Bytes of spac
35b30 65 20 61 6c 6c 6f 63 61 74 65 64 20 61 74 20 70  e allocated at p
35b40 53 70 61 63 65 20 2a 2f 0a 0a 20 20 70 50 61 72  Space */..  pPar
35b50 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61  se = pWInfo->pPa
35b60 72 73 65 3b 0a 20 20 64 62 20 3d 20 70 50 61 72  rse;.  db = pPar
35b70 73 65 2d 3e 64 62 3b 0a 20 20 6e 4c 6f 6f 70 20  se->db;.  nLoop 
35b80 3d 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c  = pWInfo->nLevel
35b90 3b 0a 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 46  ;.  /* TUNING: F
35ba0 6f 72 20 73 69 6d 70 6c 65 20 71 75 65 72 69 65  or simple querie
35bb0 73 2c 20 6f 6e 6c 79 20 74 68 65 20 62 65 73 74  s, only the best
35bc0 20 70 61 74 68 20 69 73 20 74 72 61 63 6b 65 64   path is tracked
35bd0 2e 0a 20 20 2a 2a 20 46 6f 72 20 32 2d 77 61 79  ..  ** For 2-way
35be0 20 6a 6f 69 6e 73 2c 20 74 68 65 20 35 20 62 65   joins, the 5 be
35bf0 73 74 20 70 61 74 68 73 20 61 72 65 20 66 6f 6c  st paths are fol
35c00 6c 6f 77 65 64 2e 0a 20 20 2a 2a 20 46 6f 72 20  lowed..  ** For 
35c10 6a 6f 69 6e 73 20 6f 66 20 33 20 6f 72 20 6d 6f  joins of 3 or mo
35c20 72 65 20 74 61 62 6c 65 73 2c 20 74 72 61 63 6b  re tables, track
35c30 20 74 68 65 20 31 30 20 62 65 73 74 20 70 61 74   the 10 best pat
35c40 68 73 20 2a 2f 0a 20 20 6d 78 43 68 6f 69 63 65  hs */.  mxChoice
35c50 20 3d 20 28 6e 4c 6f 6f 70 3c 3d 31 29 20 3f 20   = (nLoop<=1) ? 
35c60 31 20 3a 20 28 6e 4c 6f 6f 70 3d 3d 32 20 3f 20  1 : (nLoop==2 ? 
35c70 35 20 3a 20 31 30 29 3b 0a 20 20 61 73 73 65 72  5 : 10);.  asser
35c80 74 28 20 6e 4c 6f 6f 70 3c 3d 70 57 49 6e 66 6f  t( nLoop<=pWInfo
35c90 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  ->pTabList->nSrc
35ca0 20 29 3b 0a 20 20 57 48 45 52 45 54 52 41 43 45   );.  WHERETRACE
35cb0 28 30 78 30 30 32 2c 20 28 22 2d 2d 2d 2d 20 62  (0x002, ("---- b
35cc0 65 67 69 6e 20 73 6f 6c 76 65 72 2e 20 20 28 6e  egin solver.  (n
35cd0 52 6f 77 45 73 74 3d 25 64 29 5c 6e 22 2c 20 6e  RowEst=%d)\n", n
35ce0 52 6f 77 45 73 74 29 29 3b 0a 0a 20 20 2f 2a 20  RowEst));..  /* 
35cf0 49 66 20 6e 52 6f 77 45 73 74 20 69 73 20 7a 65  If nRowEst is ze
35d00 72 6f 20 61 6e 64 20 74 68 65 72 65 20 69 73 20  ro and there is 
35d10 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
35d20 73 65 2c 20 69 67 6e 6f 72 65 20 69 74 2e 20 49  se, ignore it. I
35d30 6e 20 74 68 69 73 0a 20 20 2a 2a 20 63 61 73 65  n this.  ** case
35d40 20 74 68 65 20 70 75 72 70 6f 73 65 20 6f 66 20   the purpose of 
35d50 74 68 69 73 20 63 61 6c 6c 20 69 73 20 74 6f 20  this call is to 
35d60 65 73 74 69 6d 61 74 65 20 74 68 65 20 6e 75 6d  estimate the num
35d70 62 65 72 20 6f 66 20 72 6f 77 73 20 72 65 74 75  ber of rows retu
35d80 72 6e 65 64 0a 20 20 2a 2a 20 62 79 20 74 68 65  rned.  ** by the
35d90 20 6f 76 65 72 61 6c 6c 20 71 75 65 72 79 2e 20   overall query. 
35da0 4f 6e 63 65 20 74 68 69 73 20 65 73 74 69 6d 61  Once this estima
35db0 74 65 20 68 61 73 20 62 65 65 6e 20 6f 62 74 61  te has been obta
35dc0 69 6e 65 64 2c 20 74 68 65 20 63 61 6c 6c 65 72  ined, the caller
35dd0 0a 20 20 2a 2a 20 77 69 6c 6c 20 69 6e 76 6f 6b  .  ** will invok
35de0 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  e this function 
35df0 61 20 73 65 63 6f 6e 64 20 74 69 6d 65 2c 20 70  a second time, p
35e00 61 73 73 69 6e 67 20 74 68 65 20 65 73 74 69 6d  assing the estim
35e10 61 74 65 20 61 73 20 74 68 65 0a 20 20 2a 2a 20  ate as the.  ** 
35e20 6e 52 6f 77 45 73 74 20 70 61 72 61 6d 65 74 65  nRowEst paramete
35e30 72 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 57 49  r.  */.  if( pWI
35e40 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30  nfo->pOrderBy==0
35e50 20 7c 7c 20 6e 52 6f 77 45 73 74 3d 3d 30 20 29   || nRowEst==0 )
35e60 7b 0a 20 20 20 20 6e 4f 72 64 65 72 42 79 20 3d  {.    nOrderBy =
35e70 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
35e80 20 6e 4f 72 64 65 72 42 79 20 3d 20 70 57 49 6e   nOrderBy = pWIn
35e90 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45  fo->pOrderBy->nE
35ea0 78 70 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41  xpr;.  }..  /* A
35eb0 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74  llocate and init
35ec0 69 61 6c 69 7a 65 20 73 70 61 63 65 20 66 6f 72  ialize space for
35ed0 20 61 54 6f 2c 20 61 46 72 6f 6d 20 61 6e 64 20   aTo, aFrom and 
35ee0 61 53 6f 72 74 43 6f 73 74 5b 5d 20 2a 2f 0a 20  aSortCost[] */. 
35ef0 20 6e 53 70 61 63 65 20 3d 20 28 73 69 7a 65 6f   nSpace = (sizeo
35f00 66 28 57 68 65 72 65 50 61 74 68 29 2b 73 69 7a  f(WherePath)+siz
35f10 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70 2a 29 2a  eof(WhereLoop*)*
35f20 6e 4c 6f 6f 70 29 2a 6d 78 43 68 6f 69 63 65 2a  nLoop)*mxChoice*
35f30 32 3b 0a 20 20 6e 53 70 61 63 65 20 2b 3d 20 73  2;.  nSpace += s
35f40 69 7a 65 6f 66 28 4c 6f 67 45 73 74 29 20 2a 20  izeof(LogEst) * 
35f50 6e 4f 72 64 65 72 42 79 3b 0a 20 20 70 53 70 61  nOrderBy;.  pSpa
35f60 63 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ce = sqlite3DbMa
35f70 6c 6c 6f 63 52 61 77 28 64 62 2c 20 6e 53 70 61  llocRaw(db, nSpa
35f80 63 65 29 3b 0a 20 20 69 66 28 20 70 53 70 61 63  ce);.  if( pSpac
35f90 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  e==0 ) return SQ
35fa0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 61 54  LITE_NOMEM;.  aT
35fb0 6f 20 3d 20 28 57 68 65 72 65 50 61 74 68 2a 29  o = (WherePath*)
35fc0 70 53 70 61 63 65 3b 0a 20 20 61 46 72 6f 6d 20  pSpace;.  aFrom 
35fd0 3d 20 61 54 6f 2b 6d 78 43 68 6f 69 63 65 3b 0a  = aTo+mxChoice;.
35fe0 20 20 6d 65 6d 73 65 74 28 61 46 72 6f 6d 2c 20    memset(aFrom, 
35ff0 30 2c 20 73 69 7a 65 6f 66 28 61 46 72 6f 6d 5b  0, sizeof(aFrom[
36000 30 5d 29 29 3b 0a 20 20 70 58 20 3d 20 28 57 68  0]));.  pX = (Wh
36010 65 72 65 4c 6f 6f 70 2a 2a 29 28 61 46 72 6f 6d  ereLoop**)(aFrom
36020 2b 6d 78 43 68 6f 69 63 65 29 3b 0a 20 20 66 6f  +mxChoice);.  fo
36030 72 28 69 69 3d 6d 78 43 68 6f 69 63 65 2a 32 2c  r(ii=mxChoice*2,
36040 20 70 46 72 6f 6d 3d 61 54 6f 3b 20 69 69 3e 30   pFrom=aTo; ii>0
36050 3b 20 69 69 2d 2d 2c 20 70 46 72 6f 6d 2b 2b 2c  ; ii--, pFrom++,
36060 20 70 58 20 2b 3d 20 6e 4c 6f 6f 70 29 7b 0a 20   pX += nLoop){. 
36070 20 20 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 20     pFrom->aLoop 
36080 3d 20 70 58 3b 0a 20 20 7d 0a 20 20 69 66 28 20  = pX;.  }.  if( 
36090 6e 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  nOrderBy ){.    
360a0 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61  /* If there is a
360b0 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
360c0 65 20 61 6e 64 20 69 74 20 69 73 20 6e 6f 74 20  e and it is not 
360d0 62 65 69 6e 67 20 69 67 6e 6f 72 65 64 2c 20 73  being ignored, s
360e0 65 74 20 75 70 0a 20 20 20 20 2a 2a 20 73 70 61  et up.    ** spa
360f0 63 65 20 66 6f 72 20 74 68 65 20 61 53 6f 72 74  ce for the aSort
36100 43 6f 73 74 5b 5d 20 61 72 72 61 79 2e 20 45 61  Cost[] array. Ea
36110 63 68 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68  ch element of th
36120 65 20 61 53 6f 72 74 43 6f 73 74 20 61 72 72 61  e aSortCost arra
36130 79 0a 20 20 20 20 2a 2a 20 69 73 20 65 69 74 68  y.    ** is eith
36140 65 72 20 7a 65 72 6f 20 2d 20 6d 65 61 6e 69 6e  er zero - meanin
36150 67 20 69 74 20 68 61 73 20 6e 6f 74 20 79 65 74  g it has not yet
36160 20 62 65 65 6e 20 69 6e 69 74 69 61 6c 69 7a 65   been initialize
36170 64 20 2d 20 6f 72 20 74 68 65 0a 20 20 20 20 2a  d - or the.    *
36180 2a 20 63 6f 73 74 20 6f 66 20 73 6f 72 74 69 6e  * cost of sortin
36190 67 20 6e 52 6f 77 45 73 74 20 72 6f 77 73 20 6f  g nRowEst rows o
361a0 66 20 64 61 74 61 20 77 68 65 72 65 20 74 68 65  f data where the
361b0 20 66 69 72 73 74 20 58 20 74 65 72 6d 73 20 6f   first X terms o
361c0 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 4f 52 44  f.    ** the ORD
361d0 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 72 65  ER BY clause are
361e0 20 61 6c 72 65 61 64 79 20 69 6e 20 6f 72 64 65   already in orde
361f0 72 2c 20 77 68 65 72 65 20 58 20 69 73 20 74 68  r, where X is th
36200 65 20 61 72 72 61 79 20 0a 20 20 20 20 2a 2a 20  e array .    ** 
36210 69 6e 64 65 78 2e 20 20 2a 2f 0a 20 20 20 20 61  index.  */.    a
36220 53 6f 72 74 43 6f 73 74 20 3d 20 28 4c 6f 67 45  SortCost = (LogE
36230 73 74 2a 29 70 58 3b 0a 20 20 20 20 6d 65 6d 73  st*)pX;.    mems
36240 65 74 28 61 53 6f 72 74 43 6f 73 74 2c 20 30 2c  et(aSortCost, 0,
36250 20 73 69 7a 65 6f 66 28 4c 6f 67 45 73 74 29 20   sizeof(LogEst) 
36260 2a 20 6e 4f 72 64 65 72 42 79 29 3b 0a 20 20 7d  * nOrderBy);.  }
36270 0a 20 20 61 73 73 65 72 74 28 20 61 53 6f 72 74  .  assert( aSort
36280 43 6f 73 74 3d 3d 30 20 7c 7c 20 26 70 53 70 61  Cost==0 || &pSpa
36290 63 65 5b 6e 53 70 61 63 65 5d 3d 3d 28 63 68 61  ce[nSpace]==(cha
362a0 72 2a 29 26 61 53 6f 72 74 43 6f 73 74 5b 6e 4f  r*)&aSortCost[nO
362b0 72 64 65 72 42 79 5d 20 29 3b 0a 20 20 61 73 73  rderBy] );.  ass
362c0 65 72 74 28 20 61 53 6f 72 74 43 6f 73 74 21 3d  ert( aSortCost!=
362d0 30 20 7c 7c 20 26 70 53 70 61 63 65 5b 6e 53 70  0 || &pSpace[nSp
362e0 61 63 65 5d 3d 3d 28 63 68 61 72 2a 29 70 58 20  ace]==(char*)pX 
362f0 29 3b 0a 0a 20 20 2f 2a 20 53 65 65 64 20 74 68  );..  /* Seed th
36300 65 20 73 65 61 72 63 68 20 77 69 74 68 20 61 20  e search with a 
36310 73 69 6e 67 6c 65 20 57 68 65 72 65 50 61 74 68  single WherePath
36320 20 63 6f 6e 74 61 69 6e 69 6e 67 20 7a 65 72 6f   containing zero
36330 20 57 68 65 72 65 4c 6f 6f 70 73 2e 0a 20 20 2a   WhereLoops..  *
36340 2a 0a 20 20 2a 2a 20 54 55 4e 49 4e 47 3a 20 44  *.  ** TUNING: D
36350 6f 20 6e 6f 74 20 6c 65 74 20 74 68 65 20 6e 75  o not let the nu
36360 6d 62 65 72 20 6f 66 20 69 74 65 72 61 74 69 6f  mber of iteratio
36370 6e 73 20 67 6f 20 61 62 6f 76 65 20 32 35 2e 20  ns go above 25. 
36380 20 49 66 20 74 68 65 20 63 6f 73 74 0a 20 20 2a   If the cost.  *
36390 2a 20 6f 66 20 63 6f 6d 70 75 74 69 6e 67 20 61  * of computing a
363a0 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65  n automatic inde
363b0 78 20 69 73 20 6e 6f 74 20 70 61 69 64 20 62 61  x is not paid ba
363c0 63 6b 20 77 69 74 68 69 6e 20 74 68 65 20 66 69  ck within the fi
363d0 72 73 74 20 32 35 0a 20 20 2a 2a 20 72 6f 77 73  rst 25.  ** rows
363e0 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 75 73  , then do not us
363f0 65 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20  e the automatic 
36400 69 6e 64 65 78 2e 20 2a 2f 0a 20 20 61 46 72 6f  index. */.  aFro
36410 6d 5b 30 5d 2e 6e 52 6f 77 20 3d 20 4d 49 4e 28  m[0].nRow = MIN(
36420 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f  pParse->nQueryLo
36430 6f 70 2c 20 34 36 29 3b 20 20 61 73 73 65 72 74  op, 46);  assert
36440 28 20 34 36 3d 3d 73 71 6c 69 74 65 33 4c 6f 67  ( 46==sqlite3Log
36450 45 73 74 28 32 35 29 20 29 3b 0a 20 20 6e 46 72  Est(25) );.  nFr
36460 6f 6d 20 3d 20 31 3b 0a 20 20 61 73 73 65 72 74  om = 1;.  assert
36470 28 20 61 46 72 6f 6d 5b 30 5d 2e 69 73 4f 72 64  ( aFrom[0].isOrd
36480 65 72 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28  ered==0 );.  if(
36490 20 6e 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20   nOrderBy ){.   
364a0 20 2f 2a 20 49 66 20 6e 4c 6f 6f 70 20 69 73 20   /* If nLoop is 
364b0 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 72 65  zero, then there
364c0 20 61 72 65 20 6e 6f 20 46 52 4f 4d 20 74 65 72   are no FROM ter
364d0 6d 73 20 69 6e 20 74 68 65 20 71 75 65 72 79 2e  ms in the query.
364e0 20 53 69 6e 63 65 0a 20 20 20 20 2a 2a 20 69 6e   Since.    ** in
364f0 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 71   this case the q
36500 75 65 72 79 20 6d 61 79 20 72 65 74 75 72 6e 20  uery may return 
36510 61 20 6d 61 78 69 6d 75 6d 20 6f 66 20 6f 6e 65  a maximum of one
36520 20 72 6f 77 2c 20 74 68 65 20 72 65 73 75 6c 74   row, the result
36530 73 0a 20 20 20 20 2a 2a 20 61 72 65 20 61 6c 72  s.    ** are alr
36540 65 61 64 79 20 69 6e 20 74 68 65 20 72 65 71 75  eady in the requ
36550 65 73 74 65 64 20 6f 72 64 65 72 2e 20 53 65 74  ested order. Set
36560 20 69 73 4f 72 64 65 72 65 64 20 74 6f 20 6e 4f   isOrdered to nO
36570 72 64 65 72 42 79 20 74 6f 0a 20 20 20 20 2a 2a  rderBy to.    **
36580 20 69 6e 64 69 63 61 74 65 20 74 68 69 73 2e 20   indicate this. 
36590 4f 72 2c 20 69 66 20 6e 4c 6f 6f 70 20 69 73 20  Or, if nLoop is 
365a0 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72  greater than zer
365b0 6f 2c 20 73 65 74 20 69 73 4f 72 64 65 72 65 64  o, set isOrdered
365c0 20 74 6f 0a 20 20 20 20 2a 2a 20 2d 31 2c 20 69   to.    ** -1, i
365d0 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74 20 74  ndicating that t
365e0 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6d 61  he result set ma
365f0 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20  y or may not be 
36600 6f 72 64 65 72 65 64 2c 20 0a 20 20 20 20 2a 2a  ordered, .    **
36610 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68   depending on th
36620 65 20 6c 6f 6f 70 73 20 61 64 64 65 64 20 74 6f  e loops added to
36630 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 6c 61   the current pla
36640 6e 2e 20 20 2a 2f 0a 20 20 20 20 61 46 72 6f 6d  n.  */.    aFrom
36650 5b 30 5d 2e 69 73 4f 72 64 65 72 65 64 20 3d 20  [0].isOrdered = 
36660 6e 4c 6f 6f 70 3e 30 20 3f 20 2d 31 20 3a 20 6e  nLoop>0 ? -1 : n
36670 4f 72 64 65 72 42 79 3b 0a 20 20 7d 0a 0a 20 20  OrderBy;.  }..  
36680 2f 2a 20 43 6f 6d 70 75 74 65 20 73 75 63 63 65  /* Compute succe
36690 73 73 69 76 65 6c 79 20 6c 6f 6e 67 65 72 20 57  ssively longer W
366a0 68 65 72 65 50 61 74 68 73 20 75 73 69 6e 67 20  herePaths using 
366b0 74 68 65 20 70 72 65 76 69 6f 75 73 20 67 65 6e  the previous gen
366c0 65 72 61 74 69 6f 6e 0a 20 20 2a 2a 20 6f 66 20  eration.  ** of 
366d0 57 68 65 72 65 50 61 74 68 73 20 61 73 20 74 68  WherePaths as th
366e0 65 20 62 61 73 69 73 20 66 6f 72 20 74 68 65 20  e basis for the 
366f0 6e 65 78 74 2e 20 20 4b 65 65 70 20 74 72 61 63  next.  Keep trac
36700 6b 20 6f 66 20 74 68 65 20 6d 78 43 68 6f 69 63  k of the mxChoic
36710 65 0a 20 20 2a 2a 20 62 65 73 74 20 70 61 74 68  e.  ** best path
36720 73 20 61 74 20 65 61 63 68 20 67 65 6e 65 72 61  s at each genera
36730 74 69 6f 6e 20 2a 2f 0a 20 20 66 6f 72 28 69 4c  tion */.  for(iL
36740 6f 6f 70 3d 30 3b 20 69 4c 6f 6f 70 3c 6e 4c 6f  oop=0; iLoop<nLo
36750 6f 70 3b 20 69 4c 6f 6f 70 2b 2b 29 7b 0a 20 20  op; iLoop++){.  
36760 20 20 6e 54 6f 20 3d 20 30 3b 0a 20 20 20 20 66    nTo = 0;.    f
36770 6f 72 28 69 69 3d 30 2c 20 70 46 72 6f 6d 3d 61  or(ii=0, pFrom=a
36780 46 72 6f 6d 3b 20 69 69 3c 6e 46 72 6f 6d 3b 20  From; ii<nFrom; 
36790 69 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a  ii++, pFrom++){.
367a0 20 20 20 20 20 20 66 6f 72 28 70 57 4c 6f 6f 70        for(pWLoop
367b0 3d 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 3b  =pWInfo->pLoops;
367c0 20 70 57 4c 6f 6f 70 3b 20 70 57 4c 6f 6f 70 3d   pWLoop; pWLoop=
367d0 70 57 4c 6f 6f 70 2d 3e 70 4e 65 78 74 4c 6f 6f  pWLoop->pNextLoo
367e0 70 29 7b 0a 20 20 20 20 20 20 20 20 4c 6f 67 45  p){.        LogE
367f0 73 74 20 6e 4f 75 74 3b 20 20 20 20 20 20 20 20  st nOut;        
36800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
36810 20 52 6f 77 73 20 76 69 73 69 74 65 64 20 62 79   Rows visited by
36820 20 28 70 46 72 6f 6d 2b 70 57 4c 6f 6f 70 29 20   (pFrom+pWLoop) 
36830 2a 2f 0a 20 20 20 20 20 20 20 20 4c 6f 67 45 73  */.        LogEs
36840 74 20 72 43 6f 73 74 3b 20 20 20 20 20 20 20 20  t rCost;        
36850 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
36860 43 6f 73 74 20 6f 66 20 70 61 74 68 20 28 70 46  Cost of path (pF
36870 72 6f 6d 2b 70 57 4c 6f 6f 70 29 20 2a 2f 0a 20  rom+pWLoop) */. 
36880 20 20 20 20 20 20 20 4c 6f 67 45 73 74 20 72 55         LogEst rU
36890 6e 73 6f 72 74 65 64 3b 20 20 20 20 20 20 20 20  nsorted;        
368a0 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 6f           /* Unso
368b0 72 74 65 64 20 63 6f 73 74 20 6f 66 20 28 70 46  rted cost of (pF
368c0 72 6f 6d 2b 70 57 4c 6f 6f 70 29 20 2a 2f 0a 20  rom+pWLoop) */. 
368d0 20 20 20 20 20 20 20 69 38 20 69 73 4f 72 64 65         i8 isOrde
368e0 72 65 64 20 3d 20 70 46 72 6f 6d 2d 3e 69 73 4f  red = pFrom->isO
368f0 72 64 65 72 65 64 3b 20 20 2f 2a 20 69 73 4f 72  rdered;  /* isOr
36900 64 65 72 65 64 20 66 6f 72 20 28 70 46 72 6f 6d  dered for (pFrom
36910 2b 70 57 4c 6f 6f 70 29 20 2a 2f 0a 20 20 20 20  +pWLoop) */.    
36920 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 61 73 6b      Bitmask mask
36930 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20  New;            
36940 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
36950 20 73 72 63 20 76 69 73 69 74 65 64 20 62 79 20   src visited by 
36960 28 2e 2e 29 20 2a 2f 0a 20 20 20 20 20 20 20 20  (..) */.        
36970 42 69 74 6d 61 73 6b 20 72 65 76 4d 61 73 6b 20  Bitmask revMask 
36980 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
36990 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 72 65 76    /* Mask of rev
369a0 2d 6f 72 64 65 72 20 6c 6f 6f 70 73 20 66 6f 72  -order loops for
369b0 20 28 2e 2e 29 20 2a 2f 0a 0a 20 20 20 20 20 20   (..) */..      
369c0 20 20 69 66 28 20 28 70 57 4c 6f 6f 70 2d 3e 70    if( (pWLoop->p
369d0 72 65 72 65 71 20 26 20 7e 70 46 72 6f 6d 2d 3e  rereq & ~pFrom->
369e0 6d 61 73 6b 4c 6f 6f 70 29 21 3d 30 20 29 20 63  maskLoop)!=0 ) c
369f0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
36a00 20 69 66 28 20 28 70 57 4c 6f 6f 70 2d 3e 6d 61   if( (pWLoop->ma
36a10 73 6b 53 65 6c 66 20 26 20 70 46 72 6f 6d 2d 3e  skSelf & pFrom->
36a20 6d 61 73 6b 4c 6f 6f 70 29 21 3d 30 20 29 20 63  maskLoop)!=0 ) c
36a30 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
36a40 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
36a50 74 2c 20 70 57 4c 6f 6f 70 20 69 73 20 61 20 63  t, pWLoop is a c
36a60 61 6e 64 69 64 61 74 65 20 74 6f 20 62 65 20 74  andidate to be t
36a70 68 65 20 6e 65 78 74 20 6c 6f 6f 70 2e 20 0a 20  he next loop. . 
36a80 20 20 20 20 20 20 20 2a 2a 20 43 6f 6d 70 75 74         ** Comput
36a90 65 20 69 74 73 20 63 6f 73 74 20 2a 2f 0a 20 20  e its cost */.  
36aa0 20 20 20 20 20 20 72 55 6e 73 6f 72 74 65 64 20        rUnsorted 
36ab0 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41  = sqlite3LogEstA
36ac0 64 64 28 70 57 4c 6f 6f 70 2d 3e 72 53 65 74 75  dd(pWLoop->rSetu
36ad0 70 2c 70 57 4c 6f 6f 70 2d 3e 72 52 75 6e 20 2b  p,pWLoop->rRun +
36ae0 20 70 46 72 6f 6d 2d 3e 6e 52 6f 77 29 3b 0a 20   pFrom->nRow);. 
36af0 20 20 20 20 20 20 20 72 55 6e 73 6f 72 74 65 64         rUnsorted
36b00 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
36b10 41 64 64 28 72 55 6e 73 6f 72 74 65 64 2c 20 70  Add(rUnsorted, p
36b20 46 72 6f 6d 2d 3e 72 55 6e 73 6f 72 74 65 64 29  From->rUnsorted)
36b30 3b 0a 20 20 20 20 20 20 20 20 6e 4f 75 74 20 3d  ;.        nOut =
36b40 20 70 46 72 6f 6d 2d 3e 6e 52 6f 77 20 2b 20 70   pFrom->nRow + p
36b50 57 4c 6f 6f 70 2d 3e 6e 4f 75 74 3b 0a 20 20 20  WLoop->nOut;.   
36b60 20 20 20 20 20 6d 61 73 6b 4e 65 77 20 3d 20 70       maskNew = p
36b70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 20 7c  From->maskLoop |
36b80 20 70 57 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c   pWLoop->maskSel
36b90 66 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  f;.        if( i
36ba0 73 4f 72 64 65 72 65 64 3c 30 20 29 7b 0a 20 20  sOrdered<0 ){.  
36bb0 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 65          isOrdere
36bc0 64 20 3d 20 77 68 65 72 65 50 61 74 68 53 61 74  d = wherePathSat
36bd0 69 73 66 69 65 73 4f 72 64 65 72 42 79 28 70 57  isfiesOrderBy(pW
36be0 49 6e 66 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  Info,.          
36bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 57 49               pWI
36c00 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2c 20 70  nfo->pOrderBy, p
36c10 46 72 6f 6d 2c 20 70 57 49 6e 66 6f 2d 3e 77 63  From, pWInfo->wc
36c20 74 72 6c 46 6c 61 67 73 2c 0a 20 20 20 20 20 20  trlFlags,.      
36c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36c40 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 2c 20   iLoop, pWLoop, 
36c50 26 72 65 76 4d 61 73 6b 29 3b 0a 20 20 20 20 20  &revMask);.     
36c60 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
36c70 20 20 20 20 72 65 76 4d 61 73 6b 20 3d 20 70 46      revMask = pF
36c80 72 6f 6d 2d 3e 72 65 76 4c 6f 6f 70 3b 0a 20 20  rom->revLoop;.  
36c90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
36ca0 69 66 28 20 69 73 4f 72 64 65 72 65 64 3e 3d 30  if( isOrdered>=0
36cb0 20 26 26 20 69 73 4f 72 64 65 72 65 64 3c 6e 4f   && isOrdered<nO
36cc0 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
36cd0 20 20 20 20 69 66 28 20 61 53 6f 72 74 43 6f 73      if( aSortCos
36ce0 74 5b 69 73 4f 72 64 65 72 65 64 5d 3d 3d 30 20  t[isOrdered]==0 
36cf0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  ){.            a
36d00 53 6f 72 74 43 6f 73 74 5b 69 73 4f 72 64 65 72  SortCost[isOrder
36d10 65 64 5d 20 3d 20 77 68 65 72 65 53 6f 72 74 69  ed] = whereSorti
36d20 6e 67 43 6f 73 74 28 0a 20 20 20 20 20 20 20 20  ngCost(.        
36d30 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2c 20          pWInfo, 
36d40 6e 52 6f 77 45 73 74 2c 20 6e 4f 72 64 65 72 42  nRowEst, nOrderB
36d50 79 2c 20 69 73 4f 72 64 65 72 65 64 0a 20 20 20  y, isOrdered.   
36d60 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20           );.    
36d70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
36d80 20 20 72 43 6f 73 74 20 3d 20 73 71 6c 69 74 65    rCost = sqlite
36d90 33 4c 6f 67 45 73 74 41 64 64 28 72 55 6e 73 6f  3LogEstAdd(rUnso
36da0 72 74 65 64 2c 20 61 53 6f 72 74 43 6f 73 74 5b  rted, aSortCost[
36db0 69 73 4f 72 64 65 72 65 64 5d 29 3b 0a 0a 20 20  isOrdered]);..  
36dc0 20 20 20 20 20 20 20 20 57 48 45 52 45 54 52 41          WHERETRA
36dd0 43 45 28 30 78 30 30 32 2c 0a 20 20 20 20 20 20  CE(0x002,.      
36de0 20 20 20 20 20 20 20 20 28 22 2d 2d 2d 2d 20 73          ("---- s
36df0 6f 72 74 20 63 6f 73 74 3d 25 2d 33 64 20 28 25  ort cost=%-3d (%
36e00 64 2f 25 64 29 20 69 6e 63 72 65 61 73 65 73 20  d/%d) increases 
36e10 63 6f 73 74 20 25 33 64 20 74 6f 20 25 2d 33 64  cost %3d to %-3d
36e20 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
36e30 20 20 20 20 61 53 6f 72 74 43 6f 73 74 5b 69 73      aSortCost[is
36e40 4f 72 64 65 72 65 64 5d 2c 20 28 6e 4f 72 64 65  Ordered], (nOrde
36e50 72 42 79 2d 69 73 4f 72 64 65 72 65 64 29 2c 20  rBy-isOrdered), 
36e60 6e 4f 72 64 65 72 42 79 2c 20 0a 20 20 20 20 20  nOrderBy, .     
36e70 20 20 20 20 20 20 20 20 20 20 72 55 6e 73 6f 72            rUnsor
36e80 74 65 64 2c 20 72 43 6f 73 74 29 29 3b 0a 20 20  ted, rCost));.  
36e90 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
36ea0 20 20 20 20 20 20 20 72 43 6f 73 74 20 3d 20 72         rCost = r
36eb0 55 6e 73 6f 72 74 65 64 3b 0a 20 20 20 20 20 20  Unsorted;.      
36ec0 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20    }..        /* 
36ed0 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
36ee0 70 57 4c 6f 6f 70 20 73 68 6f 75 6c 64 20 62 65  pWLoop should be
36ef0 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 73 65   added to the se
36f00 74 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20  t of.        ** 
36f10 6d 78 43 68 6f 69 63 65 20 62 65 73 74 2d 73 6f  mxChoice best-so
36f20 2d 66 61 72 20 70 61 74 68 73 2e 0a 20 20 20 20  -far paths..    
36f30 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
36f40 2a 20 46 69 72 73 74 20 6c 6f 6f 6b 20 66 6f 72  * First look for
36f50 20 61 6e 20 65 78 69 73 74 69 6e 67 20 70 61 74   an existing pat
36f60 68 20 61 6d 6f 6e 67 20 62 65 73 74 2d 73 6f 2d  h among best-so-
36f70 66 61 72 20 70 61 74 68 73 0a 20 20 20 20 20 20  far paths.      
36f80 20 20 2a 2a 20 74 68 61 74 20 63 6f 76 65 72 73    ** that covers
36f90 20 74 68 65 20 73 61 6d 65 20 73 65 74 20 6f 66   the same set of
36fa0 20 6c 6f 6f 70 73 20 61 6e 64 20 68 61 73 20 74   loops and has t
36fb0 68 65 20 73 61 6d 65 20 69 73 4f 72 64 65 72 65  he same isOrdere
36fc0 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 65 74  d.        ** set
36fd0 74 69 6e 67 20 61 73 20 74 68 65 20 63 75 72 72  ting as the curr
36fe0 65 6e 74 20 70 61 74 68 20 63 61 6e 64 69 64 61  ent path candida
36ff0 74 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  te..        **. 
37000 20 20 20 20 20 20 20 2a 2a 20 54 68 65 20 74 65         ** The te
37010 72 6d 20 22 28 28 70 54 6f 2d 3e 69 73 4f 72 64  rm "((pTo->isOrd
37020 65 72 65 64 5e 69 73 4f 72 64 65 72 65 64 29 26  ered^isOrdered)&
37030 30 78 38 30 29 3d 3d 30 22 20 69 73 20 65 71 75  0x80)==0" is equ
37040 69 76 61 6c 65 6e 74 0a 20 20 20 20 20 20 20 20  ivalent.        
37050 2a 2a 20 74 6f 20 28 70 54 6f 2d 3e 69 73 4f 72  ** to (pTo->isOr
37060 64 65 72 65 64 3d 3d 28 2d 31 29 29 3d 3d 28 69  dered==(-1))==(i
37070 73 4f 72 64 65 72 65 64 3d 3d 28 2d 31 29 29 22  sOrdered==(-1))"
37080 20 66 6f 72 20 74 68 65 20 72 61 6e 67 65 0a 20   for the range. 
37090 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 6c 65 67         ** of leg
370a0 61 6c 20 76 61 6c 75 65 73 20 66 6f 72 20 69 73  al values for is
370b0 4f 72 64 65 72 65 64 2c 20 2d 31 2e 2e 36 34 2e  Ordered, -1..64.
370c0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
370d0 20 20 20 20 66 6f 72 28 6a 6a 3d 30 2c 20 70 54      for(jj=0, pT
370e0 6f 3d 61 54 6f 3b 20 6a 6a 3c 6e 54 6f 3b 20 6a  o=aTo; jj<nTo; j
370f0 6a 2b 2b 2c 20 70 54 6f 2b 2b 29 7b 0a 20 20 20  j++, pTo++){.   
37100 20 20 20 20 20 20 20 69 66 28 20 70 54 6f 2d 3e         if( pTo->
37110 6d 61 73 6b 4c 6f 6f 70 3d 3d 6d 61 73 6b 4e 65  maskLoop==maskNe
37120 77 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20  w.           && 
37130 28 28 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64  ((pTo->isOrdered
37140 5e 69 73 4f 72 64 65 72 65 64 29 26 30 78 38 30  ^isOrdered)&0x80
37150 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 29  )==0.          )
37160 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65  {.            te
37170 73 74 63 61 73 65 28 20 6a 6a 3d 3d 6e 54 6f 2d  stcase( jj==nTo-
37180 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  1 );.           
37190 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
371a0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
371b0 20 20 20 20 20 20 69 66 28 20 6a 6a 3e 3d 6e 54        if( jj>=nT
371c0 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  o ){.          /
371d0 2a 20 4e 6f 6e 65 20 6f 66 20 74 68 65 20 65 78  * None of the ex
371e0 69 73 74 69 6e 67 20 62 65 73 74 2d 73 6f 2d 66  isting best-so-f
371f0 61 72 20 70 61 74 68 73 20 6d 61 74 63 68 20 74  ar paths match t
37200 68 65 20 63 61 6e 64 69 64 61 74 65 2e 20 2a 2f  he candidate. */
37210 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e  .          if( n
37220 54 6f 3e 3d 6d 78 43 68 6f 69 63 65 0a 20 20 20  To>=mxChoice.   
37230 20 20 20 20 20 20 20 20 26 26 20 28 72 43 6f 73          && (rCos
37240 74 3e 6d 78 43 6f 73 74 20 7c 7c 20 28 72 43 6f  t>mxCost || (rCo
37250 73 74 3d 3d 6d 78 43 6f 73 74 20 26 26 20 72 55  st==mxCost && rU
37260 6e 73 6f 72 74 65 64 3e 3d 6d 78 55 6e 73 6f 72  nsorted>=mxUnsor
37270 74 65 64 29 29 0a 20 20 20 20 20 20 20 20 20 20  ted)).          
37280 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ){.            /
37290 2a 20 54 68 65 20 63 75 72 72 65 6e 74 20 63 61  * The current ca
372a0 6e 64 69 64 61 74 65 20 69 73 20 6e 6f 20 62 65  ndidate is no be
372b0 74 74 65 72 20 74 68 61 6e 20 61 6e 79 20 6f 66  tter than any of
372c0 20 74 68 65 20 6d 78 43 68 6f 69 63 65 0a 20 20   the mxChoice.  
372d0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 61 74            ** pat
372e0 68 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20  hs currently in 
372f0 74 68 65 20 62 65 73 74 2d 73 6f 2d 66 61 72 20  the best-so-far 
37300 62 75 66 66 65 72 2e 20 20 53 6f 20 64 69 73 63  buffer.  So disc
37310 61 72 64 0a 20 20 20 20 20 20 20 20 20 20 20 20  ard.            
37320 2a 2a 20 74 68 69 73 20 63 61 6e 64 69 64 61 74  ** this candidat
37330 65 20 61 73 20 6e 6f 74 20 76 69 61 62 6c 65 2e  e as not viable.
37340 20 2a 2f 0a 23 69 66 64 65 66 20 57 48 45 52 45   */.#ifdef WHERE
37350 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a  TRACE_ENABLED /*
37360 20 30 78 34 20 2a 2f 0a 20 20 20 20 20 20 20 20   0x4 */.        
37370 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57      if( sqlite3W
37380 68 65 72 65 54 72 61 63 65 26 30 78 34 20 29 7b  hereTrace&0x4 ){
37390 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
373a0 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
373b0 66 28 22 53 6b 69 70 20 20 20 25 73 20 63 6f 73  f("Skip   %s cos
373c0 74 3d 25 2d 33 64 2c 25 33 64 20 6f 72 64 65 72  t=%-3d,%3d order
373d0 3d 25 63 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%c\n",.        
373e0 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65 50            whereP
373f0 61 74 68 4e 61 6d 65 28 70 46 72 6f 6d 2c 20 69  athName(pFrom, i
37400 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c 20 72  Loop, pWLoop), r
37410 43 6f 73 74 2c 20 6e 4f 75 74 2c 0a 20 20 20 20  Cost, nOut,.    
37420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73                is
37430 4f 72 64 65 72 65 64 3e 3d 30 20 3f 20 69 73 4f  Ordered>=0 ? isO
37440 72 64 65 72 65 64 2b 27 30 27 20 3a 20 27 3f 27  rdered+'0' : '?'
37450 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
37460 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
37470 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
37480 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
37490 20 20 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61      /* If we rea
374a0 63 68 20 74 68 69 73 20 70 6f 69 6e 74 73 20 69  ch this points i
374b0 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  t means that the
374c0 20 6e 65 77 20 63 61 6e 64 69 64 61 74 65 20 70   new candidate p
374d0 61 74 68 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ath.          **
374e0 20 6e 65 65 64 73 20 74 6f 20 62 65 20 61 64 64   needs to be add
374f0 65 64 20 74 6f 20 74 68 65 20 73 65 74 20 6f 66  ed to the set of
37500 20 62 65 73 74 2d 73 6f 2d 66 61 72 20 70 61 74   best-so-far pat
37510 68 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  hs. */.         
37520 20 69 66 28 20 6e 54 6f 3c 6d 78 43 68 6f 69 63   if( nTo<mxChoic
37530 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  e ){.           
37540 20 2f 2a 20 49 6e 63 72 65 61 73 65 20 74 68 65   /* Increase the
37550 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61 54 6f   size of the aTo
37560 20 73 65 74 20 62 79 20 6f 6e 65 20 2a 2f 0a 20   set by one */. 
37570 20 20 20 20 20 20 20 20 20 20 20 6a 6a 20 3d 20             jj = 
37580 6e 54 6f 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  nTo++;.         
37590 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
375a0 20 20 20 20 2f 2a 20 4e 65 77 20 70 61 74 68 20      /* New path 
375b0 72 65 70 6c 61 63 65 73 20 74 68 65 20 70 72 69  replaces the pri
375c0 6f 72 20 77 6f 72 73 74 20 74 6f 20 6b 65 65 70  or worst to keep
375d0 20 63 6f 75 6e 74 20 62 65 6c 6f 77 20 6d 78 43   count below mxC
375e0 68 6f 69 63 65 20 2a 2f 0a 20 20 20 20 20 20 20  hoice */.       
375f0 20 20 20 20 20 6a 6a 20 3d 20 6d 78 49 3b 0a 20       jj = mxI;. 
37600 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
37610 20 20 20 20 20 70 54 6f 20 3d 20 26 61 54 6f 5b       pTo = &aTo[
37620 6a 6a 5d 3b 0a 23 69 66 64 65 66 20 57 48 45 52  jj];.#ifdef WHER
37630 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f  ETRACE_ENABLED /
37640 2a 20 30 78 34 20 2a 2f 0a 20 20 20 20 20 20 20  * 0x4 */.       
37650 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68     if( sqlite3Wh
37660 65 72 65 54 72 61 63 65 26 30 78 34 20 29 7b 0a  ereTrace&0x4 ){.
37670 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
37680 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
37690 4e 65 77 20 20 20 20 25 73 20 63 6f 73 74 3d 25  New    %s cost=%
376a0 2d 33 64 2c 25 33 64 20 6f 72 64 65 72 3d 25 63  -3d,%3d order=%c
376b0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
376c0 20 20 20 20 20 77 68 65 72 65 50 61 74 68 4e 61       wherePathNa
376d0 6d 65 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c  me(pFrom, iLoop,
376e0 20 70 57 4c 6f 6f 70 29 2c 20 72 43 6f 73 74 2c   pWLoop), rCost,
376f0 20 6e 4f 75 74 2c 0a 20 20 20 20 20 20 20 20 20   nOut,.         
37700 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 65 64         isOrdered
37710 3e 3d 30 20 3f 20 69 73 4f 72 64 65 72 65 64 2b  >=0 ? isOrdered+
37720 27 30 27 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20  '0' : '?');.    
37730 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
37740 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
37750 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 72          /* Contr
37760 6f 6c 20 72 65 61 63 68 65 73 20 68 65 72 65 20  ol reaches here 
37770 69 66 20 62 65 73 74 2d 73 6f 2d 66 61 72 20 70  if best-so-far p
37780 61 74 68 20 70 54 6f 3d 61 54 6f 5b 6a 6a 5d 20  ath pTo=aTo[jj] 
37790 63 6f 76 65 72 73 20 74 68 65 0a 20 20 20 20 20  covers the.     
377a0 20 20 20 20 20 2a 2a 20 73 61 6d 65 20 73 65 74       ** same set
377b0 20 6f 66 20 6c 6f 6f 70 73 20 61 6e 64 20 68 61   of loops and ha
377c0 73 20 74 68 65 20 73 61 6d 20 69 73 4f 72 64 65  s the sam isOrde
377d0 72 65 64 20 73 65 74 74 69 6e 67 20 61 73 20 74  red setting as t
377e0 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  he.          ** 
377f0 63 61 6e 64 69 64 61 74 65 20 70 61 74 68 2e 20  candidate path. 
37800 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
37810 20 74 68 65 20 63 61 6e 64 69 64 61 74 65 20 73   the candidate s
37820 68 6f 75 6c 64 20 72 65 70 6c 61 63 65 0a 20 20  hould replace.  
37830 20 20 20 20 20 20 20 20 2a 2a 20 70 54 6f 20 6f          ** pTo o
37840 72 20 69 66 20 74 68 65 20 63 61 6e 64 69 64 61  r if the candida
37850 74 65 20 73 68 6f 75 6c 64 20 62 65 20 73 6b 69  te should be ski
37860 70 70 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20  pped */.        
37870 20 20 69 66 28 20 70 54 6f 2d 3e 72 43 6f 73 74    if( pTo->rCost
37880 3c 72 43 6f 73 74 20 7c 7c 20 28 70 54 6f 2d 3e  <rCost || (pTo->
37890 72 43 6f 73 74 3d 3d 72 43 6f 73 74 20 26 26 20  rCost==rCost && 
378a0 70 54 6f 2d 3e 6e 52 6f 77 3c 3d 6e 4f 75 74 29  pTo->nRow<=nOut)
378b0 20 29 7b 0a 23 69 66 64 65 66 20 57 48 45 52 45   ){.#ifdef WHERE
378c0 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a  TRACE_ENABLED /*
378d0 20 30 78 34 20 2a 2f 0a 20 20 20 20 20 20 20 20   0x4 */.        
378e0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57      if( sqlite3W
378f0 68 65 72 65 54 72 61 63 65 26 30 78 34 20 29 7b  hereTrace&0x4 ){
37900 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
37910 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
37920 66 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  f(.             
37930 20 20 20 20 20 22 53 6b 69 70 20 20 20 25 73 20       "Skip   %s 
37940 63 6f 73 74 3d 25 2d 33 64 2c 25 33 64 20 6f 72  cost=%-3d,%3d or
37950 64 65 72 3d 25 63 22 2c 0a 20 20 20 20 20 20 20  der=%c",.       
37960 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65             where
37970 50 61 74 68 4e 61 6d 65 28 70 46 72 6f 6d 2c 20  PathName(pFrom, 
37980 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c 20  iLoop, pWLoop), 
37990 72 43 6f 73 74 2c 20 6e 4f 75 74 2c 0a 20 20 20  rCost, nOut,.   
379a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
379b0 73 4f 72 64 65 72 65 64 3e 3d 30 20 3f 20 69 73  sOrdered>=0 ? is
379c0 4f 72 64 65 72 65 64 2b 27 30 27 20 3a 20 27 3f  Ordered+'0' : '?
379d0 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ');.            
379e0 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
379f0 69 6e 74 66 28 22 20 20 20 76 73 20 25 73 20 63  intf("   vs %s c
37a00 6f 73 74 3d 25 2d 33 64 2c 25 64 20 6f 72 64 65  ost=%-3d,%d orde
37a10 72 3d 25 63 5c 6e 22 2c 0a 20 20 20 20 20 20 20  r=%c\n",.       
37a20 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65             where
37a30 50 61 74 68 4e 61 6d 65 28 70 54 6f 2c 20 69 4c  PathName(pTo, iL
37a40 6f 6f 70 2b 31 2c 20 30 29 2c 20 70 54 6f 2d 3e  oop+1, 0), pTo->
37a50 72 43 6f 73 74 2c 20 70 54 6f 2d 3e 6e 52 6f 77  rCost, pTo->nRow
37a60 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
37a70 20 20 20 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72      pTo->isOrder
37a80 65 64 3e 3d 30 20 3f 20 70 54 6f 2d 3e 69 73 4f  ed>=0 ? pTo->isO
37a90 72 64 65 72 65 64 2b 27 30 27 20 3a 20 27 3f 27  rdered+'0' : '?'
37aa0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
37ab0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
37ac0 20 20 20 20 2f 2a 20 44 69 73 63 61 72 64 20 74      /* Discard t
37ad0 68 65 20 63 61 6e 64 69 64 61 74 65 20 70 61 74  he candidate pat
37ae0 68 20 66 72 6f 6d 20 66 75 72 74 68 65 72 20 63  h from further c
37af0 6f 6e 73 69 64 65 72 61 74 69 6f 6e 20 2a 2f 0a  onsideration */.
37b00 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
37b10 63 61 73 65 28 20 70 54 6f 2d 3e 72 43 6f 73 74  case( pTo->rCost
37b20 3d 3d 72 43 6f 73 74 20 29 3b 0a 20 20 20 20 20  ==rCost );.     
37b30 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
37b40 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
37b50 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
37b60 20 70 54 6f 2d 3e 72 43 6f 73 74 3d 3d 72 43 6f   pTo->rCost==rCo
37b70 73 74 2b 31 20 29 3b 0a 20 20 20 20 20 20 20 20  st+1 );.        
37b80 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20 72 65 61    /* Control rea
37b90 63 68 65 73 20 68 65 72 65 20 69 66 20 74 68 65  ches here if the
37ba0 20 63 61 6e 64 69 64 61 74 65 20 70 61 74 68 20   candidate path 
37bb0 69 73 20 62 65 74 74 65 72 20 74 68 61 6e 20 74  is better than t
37bc0 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  he.          ** 
37bd0 70 54 6f 20 70 61 74 68 2e 20 20 52 65 70 6c 61  pTo path.  Repla
37be0 63 65 20 70 54 6f 20 77 69 74 68 20 74 68 65 20  ce pTo with the 
37bf0 63 61 6e 64 69 64 61 74 65 2e 20 2a 2f 0a 23 69  candidate. */.#i
37c00 66 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f  fdef WHERETRACE_
37c10 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78 34 20 2a  ENABLED /* 0x4 *
37c20 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
37c30 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63  sqlite3WhereTrac
37c40 65 26 30 78 34 20 29 7b 0a 20 20 20 20 20 20 20  e&0x4 ){.       
37c50 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
37c60 67 50 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20  gPrintf(.       
37c70 20 20 20 20 20 20 20 20 20 22 55 70 64 61 74 65           "Update
37c80 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25 33   %s cost=%-3d,%3
37c90 64 20 6f 72 64 65 72 3d 25 63 22 2c 0a 20 20 20  d order=%c",.   
37ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65               whe
37cb0 72 65 50 61 74 68 4e 61 6d 65 28 70 46 72 6f 6d  rePathName(pFrom
37cc0 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29  , iLoop, pWLoop)
37cd0 2c 20 72 43 6f 73 74 2c 20 6e 4f 75 74 2c 0a 20  , rCost, nOut,. 
37ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
37cf0 73 4f 72 64 65 72 65 64 3e 3d 30 20 3f 20 69 73  sOrdered>=0 ? is
37d00 4f 72 64 65 72 65 64 2b 27 30 27 20 3a 20 27 3f  Ordered+'0' : '?
37d10 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ');.            
37d20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
37d30 74 66 28 22 20 20 77 61 73 20 25 73 20 63 6f 73  tf("  was %s cos
37d40 74 3d 25 2d 33 64 2c 25 33 64 20 6f 72 64 65 72  t=%-3d,%3d order
37d50 3d 25 63 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%c\n",.        
37d60 20 20 20 20 20 20 20 20 77 68 65 72 65 50 61 74          wherePat
37d70 68 4e 61 6d 65 28 70 54 6f 2c 20 69 4c 6f 6f 70  hName(pTo, iLoop
37d80 2b 31 2c 20 30 29 2c 20 70 54 6f 2d 3e 72 43 6f  +1, 0), pTo->rCo
37d90 73 74 2c 20 70 54 6f 2d 3e 6e 52 6f 77 2c 0a 20  st, pTo->nRow,. 
37da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
37db0 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 3e 3d 30  To->isOrdered>=0
37dc0 20 3f 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65   ? pTo->isOrdere
37dd0 64 2b 27 30 27 20 3a 20 27 3f 27 29 3b 0a 20 20  d+'0' : '?');.  
37de0 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66          }.#endif
37df0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
37e00 20 20 20 2f 2a 20 70 57 4c 6f 6f 70 20 69 73 20     /* pWLoop is 
37e10 61 20 77 69 6e 6e 65 72 2e 20 20 41 64 64 20 69  a winner.  Add i
37e20 74 20 74 6f 20 74 68 65 20 73 65 74 20 6f 66 20  t to the set of 
37e30 62 65 73 74 20 73 6f 20 66 61 72 20 2a 2f 0a 20  best so far */. 
37e40 20 20 20 20 20 20 20 70 54 6f 2d 3e 6d 61 73 6b         pTo->mask
37e50 4c 6f 6f 70 20 3d 20 70 46 72 6f 6d 2d 3e 6d 61  Loop = pFrom->ma
37e60 73 6b 4c 6f 6f 70 20 7c 20 70 57 4c 6f 6f 70 2d  skLoop | pWLoop-
37e70 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20 20  >maskSelf;.     
37e80 20 20 20 70 54 6f 2d 3e 72 65 76 4c 6f 6f 70 20     pTo->revLoop 
37e90 3d 20 72 65 76 4d 61 73 6b 3b 0a 20 20 20 20 20  = revMask;.     
37ea0 20 20 20 70 54 6f 2d 3e 6e 52 6f 77 20 3d 20 6e     pTo->nRow = n
37eb0 4f 75 74 3b 0a 20 20 20 20 20 20 20 20 70 54 6f  Out;.        pTo
37ec0 2d 3e 72 43 6f 73 74 20 3d 20 72 43 6f 73 74 3b  ->rCost = rCost;
37ed0 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 72 55  .        pTo->rU
37ee0 6e 73 6f 72 74 65 64 20 3d 20 72 55 6e 73 6f 72  nsorted = rUnsor
37ef0 74 65 64 3b 0a 20 20 20 20 20 20 20 20 70 54 6f  ted;.        pTo
37f00 2d 3e 69 73 4f 72 64 65 72 65 64 20 3d 20 69 73  ->isOrdered = is
37f10 4f 72 64 65 72 65 64 3b 0a 20 20 20 20 20 20 20  Ordered;.       
37f20 20 6d 65 6d 63 70 79 28 70 54 6f 2d 3e 61 4c 6f   memcpy(pTo->aLo
37f30 6f 70 2c 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70  op, pFrom->aLoop
37f40 2c 20 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f  , sizeof(WhereLo
37f50 6f 70 2a 29 2a 69 4c 6f 6f 70 29 3b 0a 20 20 20  op*)*iLoop);.   
37f60 20 20 20 20 20 70 54 6f 2d 3e 61 4c 6f 6f 70 5b       pTo->aLoop[
37f70 69 4c 6f 6f 70 5d 20 3d 20 70 57 4c 6f 6f 70 3b  iLoop] = pWLoop;
37f80 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 54 6f  .        if( nTo
37f90 3e 3d 6d 78 43 68 6f 69 63 65 20 29 7b 0a 20 20  >=mxChoice ){.  
37fa0 20 20 20 20 20 20 20 20 6d 78 49 20 3d 20 30 3b          mxI = 0;
37fb0 0a 20 20 20 20 20 20 20 20 20 20 6d 78 43 6f 73  .          mxCos
37fc0 74 20 3d 20 61 54 6f 5b 30 5d 2e 72 43 6f 73 74  t = aTo[0].rCost
37fd0 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 78 55 6e  ;.          mxUn
37fe0 73 6f 72 74 65 64 20 3d 20 61 54 6f 5b 30 5d 2e  sorted = aTo[0].
37ff0 6e 52 6f 77 3b 0a 20 20 20 20 20 20 20 20 20 20  nRow;.          
38000 66 6f 72 28 6a 6a 3d 31 2c 20 70 54 6f 3d 26 61  for(jj=1, pTo=&a
38010 54 6f 5b 31 5d 3b 20 6a 6a 3c 6d 78 43 68 6f 69  To[1]; jj<mxChoi
38020 63 65 3b 20 6a 6a 2b 2b 2c 20 70 54 6f 2b 2b 29  ce; jj++, pTo++)
38030 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  {.            if
38040 28 20 70 54 6f 2d 3e 72 43 6f 73 74 3e 6d 78 43  ( pTo->rCost>mxC
38050 6f 73 74 20 0a 20 20 20 20 20 20 20 20 20 20 20  ost .           
38060 20 20 7c 7c 20 28 70 54 6f 2d 3e 72 43 6f 73 74    || (pTo->rCost
38070 3d 3d 6d 78 43 6f 73 74 20 26 26 20 70 54 6f 2d  ==mxCost && pTo-
38080 3e 72 55 6e 73 6f 72 74 65 64 3e 6d 78 55 6e 73  >rUnsorted>mxUns
38090 6f 72 74 65 64 29 20 0a 20 20 20 20 20 20 20 20  orted) .        
380a0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
380b0 20 20 20 20 20 6d 78 43 6f 73 74 20 3d 20 70 54       mxCost = pT
380c0 6f 2d 3e 72 43 6f 73 74 3b 0a 20 20 20 20 20 20  o->rCost;.      
380d0 20 20 20 20 20 20 20 20 6d 78 55 6e 73 6f 72 74          mxUnsort
380e0 65 64 20 3d 20 70 54 6f 2d 3e 72 55 6e 73 6f 72  ed = pTo->rUnsor
380f0 74 65 64 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ted;.           
38100 20 20 20 6d 78 49 20 3d 20 6a 6a 3b 0a 20 20 20     mxI = jj;.   
38110 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
38120 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
38130 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
3814