/ Hex Artifact Content
Login

Artifact a14d3d8042adeb51f81731c1b47b3e481d1cc23a:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d  ******.** This m
0180: 6f 64 75 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43  odule contains C
0190: 20 63 6f 64 65 20 74 68 61 74 20 67 65 6e 65 72   code that gener
01a0: 61 74 65 73 20 56 44 42 45 20 63 6f 64 65 20 75  ates VDBE code u
01b0: 73 65 64 20 74 6f 20 70 72 6f 63 65 73 73 0a 2a  sed to process.*
01c0: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
01d0: 73 65 20 6f 66 20 53 51 4c 20 73 74 61 74 65 6d  se of SQL statem
01e0: 65 6e 74 73 2e 20 20 54 68 69 73 20 6d 6f 64 75  ents.  This modu
01f0: 6c 65 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  le is responsibl
0200: 65 20 66 6f 72 0a 2a 2a 20 67 65 6e 65 72 61 74  e for.** generat
0210: 69 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68 61  ing the code tha
0220: 74 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20  t loops through 
0230: 61 20 74 61 62 6c 65 20 6c 6f 6f 6b 69 6e 67 20  a table looking 
0240: 66 6f 72 20 61 70 70 6c 69 63 61 62 6c 65 0a 2a  for applicable.*
0250: 2a 20 72 6f 77 73 2e 20 20 49 6e 64 69 63 65 73  * rows.  Indices
0260: 20 61 72 65 20 73 65 6c 65 63 74 65 64 20 61 6e   are selected an
0270: 64 20 75 73 65 64 20 74 6f 20 73 70 65 65 64 20  d used to speed 
0280: 74 68 65 20 73 65 61 72 63 68 20 77 68 65 6e 20  the search when 
0290: 64 6f 69 6e 67 0a 2a 2a 20 73 6f 20 69 73 20 61  doing.** so is a
02a0: 70 70 6c 69 63 61 62 6c 65 2e 20 20 42 65 63 61  pplicable.  Beca
02b0: 75 73 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 20  use this module 
02c0: 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
02d0: 6f 72 20 73 65 6c 65 63 74 69 6e 67 0a 2a 2a 20  or selecting.** 
02e0: 69 6e 64 69 63 65 73 2c 20 79 6f 75 20 6d 69 67  indices, you mig
02f0: 68 74 20 61 6c 73 6f 20 74 68 69 6e 6b 20 6f 66  ht also think of
0300: 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 61 73 20   this module as 
0310: 74 68 65 20 22 71 75 65 72 79 20 6f 70 74 69 6d  the "query optim
0320: 69 7a 65 72 22 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  izer"..*/.#inclu
0330: 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22  de "sqliteInt.h"
0340: 0a 23 69 6e 63 6c 75 64 65 20 22 77 68 65 72 65  .#include "where
0350: 49 6e 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 52 65  Int.h"../*.** Re
0360: 74 75 72 6e 20 74 68 65 20 65 73 74 69 6d 61 74  turn the estimat
0370: 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74  ed number of out
0380: 70 75 74 20 72 6f 77 73 20 66 72 6f 6d 20 61 20  put rows from a 
0390: 57 48 45 52 45 20 63 6c 61 75 73 65 0a 2a 2f 0a  WHERE clause.*/.
03a0: 75 36 34 20 73 71 6c 69 74 65 33 57 68 65 72 65  u64 sqlite3Where
03b0: 4f 75 74 70 75 74 52 6f 77 43 6f 75 6e 74 28 57  OutputRowCount(W
03c0: 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
03d0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
03e0: 74 65 33 4c 6f 67 45 73 74 54 6f 49 6e 74 28 70  te3LogEstToInt(p
03f0: 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 29 3b  WInfo->nRowOut);
0400: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
0410: 20 6f 6e 65 20 6f 66 20 74 68 65 20 57 48 45 52   one of the WHER
0420: 45 5f 44 49 53 54 49 4e 43 54 5f 78 78 78 78 78  E_DISTINCT_xxxxx
0430: 20 76 61 6c 75 65 73 20 74 6f 20 69 6e 64 69 63   values to indic
0440: 61 74 65 20 68 6f 77 20 74 68 69 73 0a 2a 2a 20  ate how this.** 
0450: 57 48 45 52 45 20 63 6c 61 75 73 65 20 72 65 74  WHERE clause ret
0460: 75 72 6e 73 20 6f 75 74 70 75 74 73 20 66 6f 72  urns outputs for
0470: 20 44 49 53 54 49 4e 43 54 20 70 72 6f 63 65 73   DISTINCT proces
0480: 73 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  sing..*/.int sql
0490: 69 74 65 33 57 68 65 72 65 49 73 44 69 73 74 69  ite3WhereIsDisti
04a0: 6e 63 74 28 57 68 65 72 65 49 6e 66 6f 20 2a 70  nct(WhereInfo *p
04b0: 57 49 6e 66 6f 29 7b 0a 20 20 72 65 74 75 72 6e  WInfo){.  return
04c0: 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e   pWInfo->eDistin
04d0: 63 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ct;.}../*.** Ret
04e0: 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
04f0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 72 65 74  WHERE clause ret
0500: 75 72 6e 73 20 72 6f 77 73 20 69 6e 20 4f 52 44  urns rows in ORD
0510: 45 52 20 42 59 20 6f 72 64 65 72 2e 0a 2a 2a 20  ER BY order..** 
0520: 52 65 74 75 72 6e 20 46 41 4c 53 45 20 69 66 20  Return FALSE if 
0530: 74 68 65 20 6f 75 74 70 75 74 20 6e 65 65 64 73  the output needs
0540: 20 74 6f 20 62 65 20 73 6f 72 74 65 64 2e 0a 2a   to be sorted..*
0550: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65  /.int sqlite3Whe
0560: 72 65 49 73 4f 72 64 65 72 65 64 28 57 68 65 72  reIsOrdered(Wher
0570: 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a  eInfo *pWInfo){.
0580: 20 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 2d    return pWInfo-
0590: 3e 6e 4f 42 53 61 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  >nOBSat;.}../*.*
05a0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 56 44 42  * Return the VDB
05b0: 45 20 61 64 64 72 65 73 73 20 6f 72 20 6c 61 62  E address or lab
05c0: 65 6c 20 74 6f 20 6a 75 6d 70 20 74 6f 20 69 6e  el to jump to in
05d0: 20 6f 72 64 65 72 20 74 6f 20 63 6f 6e 74 69 6e   order to contin
05e0: 75 65 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c  ue.** immediatel
05f0: 79 20 77 69 74 68 20 74 68 65 20 6e 65 78 74 20  y with the next 
0600: 72 6f 77 20 6f 66 20 61 20 57 48 45 52 45 20 63  row of a WHERE c
0610: 6c 61 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  lause..*/.int sq
0620: 6c 69 74 65 33 57 68 65 72 65 43 6f 6e 74 69 6e  lite3WhereContin
0630: 75 65 4c 61 62 65 6c 28 57 68 65 72 65 49 6e 66  ueLabel(WhereInf
0640: 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 61 73  o *pWInfo){.  as
0650: 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 69 43  sert( pWInfo->iC
0660: 6f 6e 74 69 6e 75 65 21 3d 30 20 29 3b 0a 20 20  ontinue!=0 );.  
0670: 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 69  return pWInfo->i
0680: 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a  Continue;.}../*.
0690: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 56 44  ** Return the VD
06a0: 42 45 20 61 64 64 72 65 73 73 20 6f 72 20 6c 61  BE address or la
06b0: 62 65 6c 20 74 6f 20 6a 75 6d 70 20 74 6f 20 69  bel to jump to i
06c0: 6e 20 6f 72 64 65 72 20 74 6f 20 62 72 65 61 6b  n order to break
06d0: 0a 2a 2a 20 6f 75 74 20 6f 66 20 61 20 57 48 45  .** out of a WHE
06e0: 52 45 20 6c 6f 6f 70 2e 0a 2a 2f 0a 69 6e 74 20  RE loop..*/.int 
06f0: 73 71 6c 69 74 65 33 57 68 65 72 65 42 72 65 61  sqlite3WhereBrea
0700: 6b 4c 61 62 65 6c 28 57 68 65 72 65 49 6e 66 6f  kLabel(WhereInfo
0710: 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 72 65 74   *pWInfo){.  ret
0720: 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65  urn pWInfo->iBre
0730: 61 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ak;.}../*.** Ret
0740: 75 72 6e 20 54 52 55 45 20 69 66 20 61 6e 20 55  urn TRUE if an U
0750: 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20  PDATE or DELETE 
0760: 73 74 61 74 65 6d 65 6e 74 20 63 61 6e 20 6f 70  statement can op
0770: 65 72 61 74 65 20 64 69 72 65 63 74 6c 79 20 6f  erate directly o
0780: 6e 0a 2a 2a 20 74 68 65 20 72 6f 77 69 64 73 20  n.** the rowids 
0790: 72 65 74 75 72 6e 65 64 20 62 79 20 61 20 57 48  returned by a WH
07a0: 45 52 45 20 63 6c 61 75 73 65 2e 20 20 52 65 74  ERE clause.  Ret
07b0: 75 72 6e 20 46 41 4c 53 45 20 69 66 20 64 6f 69  urn FALSE if doi
07c0: 6e 67 20 61 6e 0a 2a 2a 20 55 50 44 41 54 45 20  ng an.** UPDATE 
07d0: 6f 72 20 44 45 4c 45 54 45 20 6d 69 67 68 74 20  or DELETE might 
07e0: 63 68 61 6e 67 65 20 73 75 62 73 65 71 75 65 6e  change subsequen
07f0: 74 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 72  t WHERE clause r
0800: 65 73 75 6c 74 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  esults..**.** If
0810: 20 74 68 65 20 4f 4e 45 50 41 53 53 20 6f 70 74   the ONEPASS opt
0820: 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 75 73 65  imization is use
0830: 64 20 28 69 66 20 74 68 69 73 20 72 6f 75 74 69  d (if this routi
0840: 6e 65 20 72 65 74 75 72 6e 73 20 74 72 75 65 29  ne returns true)
0850: 0a 2a 2a 20 74 68 65 6e 20 61 6c 73 6f 20 77 72  .** then also wr
0860: 69 74 65 20 74 68 65 20 69 6e 64 69 63 65 73 20  ite the indices 
0870: 6f 66 20 6f 70 65 6e 20 63 75 72 73 6f 72 73 20  of open cursors 
0880: 75 73 65 64 20 62 79 20 4f 4e 45 50 41 53 53 0a  used by ONEPASS.
0890: 2a 2a 20 69 6e 74 6f 20 61 69 43 75 72 5b 30 5d  ** into aiCur[0]
08a0: 20 61 6e 64 20 61 69 43 75 72 5b 31 5d 2e 20 20   and aiCur[1].  
08b0: 69 61 43 75 72 5b 30 5d 20 67 65 74 73 20 74 68  iaCur[0] gets th
08c0: 65 20 63 75 72 73 6f 72 20 6f 66 20 74 68 65 20  e cursor of the 
08d0: 64 61 74 61 0a 2a 2a 20 74 61 62 6c 65 20 61 6e  data.** table an
08e0: 64 20 69 61 43 75 72 5b 31 5d 20 67 65 74 73 20  d iaCur[1] gets 
08f0: 74 68 65 20 63 75 72 73 6f 72 20 75 73 65 64 20  the cursor used 
0900: 62 79 20 61 6e 20 61 75 78 69 6c 69 61 72 79 20  by an auxiliary 
0910: 69 6e 64 65 78 2e 0a 2a 2a 20 45 69 74 68 65 72  index..** Either
0920: 20 76 61 6c 75 65 20 6d 61 79 20 62 65 20 2d 31   value may be -1
0930: 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61  , indicating tha
0940: 74 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20  t cursor is not 
0950: 75 73 65 64 2e 0a 2a 2a 20 41 6e 79 20 63 75 72  used..** Any cur
0960: 73 6f 72 73 20 72 65 74 75 72 6e 65 64 20 77 69  sors returned wi
0970: 6c 6c 20 68 61 76 65 20 62 65 65 6e 20 6f 70 65  ll have been ope
0980: 6e 65 64 20 66 6f 72 20 77 72 69 74 69 6e 67 2e  ned for writing.
0990: 0a 2a 2a 0a 2a 2a 20 61 69 43 75 72 5b 30 5d 20  .**.** aiCur[0] 
09a0: 61 6e 64 20 61 69 43 75 72 5b 31 5d 20 62 6f 74  and aiCur[1] bot
09b0: 68 20 67 65 74 20 2d 31 20 69 66 20 74 68 65 20  h get -1 if the 
09c0: 77 68 65 72 65 2d 63 6c 61 75 73 65 20 6c 6f 67  where-clause log
09d0: 69 63 20 69 73 0a 2a 2a 20 75 6e 61 62 6c 65 20  ic is.** unable 
09e0: 74 6f 20 75 73 65 20 74 68 65 20 4f 4e 45 50 41  to use the ONEPA
09f0: 53 53 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e  SS optimization.
0a00: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 57  .*/.int sqlite3W
0a10: 68 65 72 65 4f 6b 4f 6e 65 50 61 73 73 28 57 68  hereOkOnePass(Wh
0a20: 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c  ereInfo *pWInfo,
0a30: 20 69 6e 74 20 2a 61 69 43 75 72 29 7b 0a 20 20   int *aiCur){.  
0a40: 6d 65 6d 63 70 79 28 61 69 43 75 72 2c 20 70 57  memcpy(aiCur, pW
0a50: 49 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e 65 50 61  Info->aiCurOnePa
0a60: 73 73 2c 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a  ss, sizeof(int)*
0a70: 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 57 49  2);.  return pWI
0a80: 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 3b 0a  nfo->okOnePass;.
0a90: 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  }../*.** Move th
0aa0: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 53 72  e content of pSr
0ab0: 63 20 69 6e 74 6f 20 70 44 65 73 74 0a 2a 2f 0a  c into pDest.*/.
0ac0: 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72  static void wher
0ad0: 65 4f 72 4d 6f 76 65 28 57 68 65 72 65 4f 72 53  eOrMove(WhereOrS
0ae0: 65 74 20 2a 70 44 65 73 74 2c 20 57 68 65 72 65  et *pDest, Where
0af0: 4f 72 53 65 74 20 2a 70 53 72 63 29 7b 0a 20 20  OrSet *pSrc){.  
0b00: 70 44 65 73 74 2d 3e 6e 20 3d 20 70 53 72 63 2d  pDest->n = pSrc-
0b10: 3e 6e 3b 0a 20 20 6d 65 6d 63 70 79 28 70 44 65  >n;.  memcpy(pDe
0b20: 73 74 2d 3e 61 2c 20 70 53 72 63 2d 3e 61 2c 20  st->a, pSrc->a, 
0b30: 70 44 65 73 74 2d 3e 6e 2a 73 69 7a 65 6f 66 28  pDest->n*sizeof(
0b40: 70 44 65 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 7d  pDest->a[0]));.}
0b50: 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 69  ../*.** Try to i
0b60: 6e 73 65 72 74 20 61 20 6e 65 77 20 70 72 65 72  nsert a new prer
0b70: 65 71 75 69 73 69 74 65 2f 63 6f 73 74 20 65 6e  equisite/cost en
0b80: 74 72 79 20 69 6e 74 6f 20 74 68 65 20 57 68 65  try into the Whe
0b90: 72 65 4f 72 53 65 74 20 70 53 65 74 2e 0a 2a 2a  reOrSet pSet..**
0ba0: 0a 2a 2a 20 54 68 65 20 6e 65 77 20 65 6e 74 72  .** The new entr
0bb0: 79 20 6d 69 67 68 74 20 6f 76 65 72 77 72 69 74  y might overwrit
0bc0: 65 20 61 6e 20 65 78 69 73 74 69 6e 67 20 65 6e  e an existing en
0bd0: 74 72 79 2c 20 6f 72 20 69 74 20 6d 69 67 68 74  try, or it might
0be0: 20 62 65 0a 2a 2a 20 61 70 70 65 6e 64 65 64 2c   be.** appended,
0bf0: 20 6f 72 20 69 74 20 6d 69 67 68 74 20 62 65 20   or it might be 
0c00: 64 69 73 63 61 72 64 65 64 2e 20 20 44 6f 20 77  discarded.  Do w
0c10: 68 61 74 65 76 65 72 20 69 73 20 74 68 65 20 72  hatever is the r
0c20: 69 67 68 74 20 74 68 69 6e 67 0a 2a 2a 20 73 6f  ight thing.** so
0c30: 20 74 68 61 74 20 70 53 65 74 20 6b 65 65 70 73   that pSet keeps
0c40: 20 74 68 65 20 4e 5f 4f 52 5f 43 4f 53 54 20 62   the N_OR_COST b
0c50: 65 73 74 20 65 6e 74 72 69 65 73 20 73 65 65 6e  est entries seen
0c60: 20 73 6f 20 66 61 72 2e 0a 2a 2f 0a 73 74 61 74   so far..*/.stat
0c70: 69 63 20 69 6e 74 20 77 68 65 72 65 4f 72 49 6e  ic int whereOrIn
0c80: 73 65 72 74 28 0a 20 20 57 68 65 72 65 4f 72 53  sert(.  WhereOrS
0c90: 65 74 20 2a 70 53 65 74 2c 20 20 20 20 20 20 2f  et *pSet,      /
0ca0: 2a 20 54 68 65 20 57 68 65 72 65 4f 72 53 65 74  * The WhereOrSet
0cb0: 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 20 2a   to be updated *
0cc0: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 70 72 65 72  /.  Bitmask prer
0cd0: 65 71 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 72  eq,        /* Pr
0ce0: 65 72 65 71 75 69 73 69 74 65 73 20 6f 66 20 74  erequisites of t
0cf0: 68 65 20 6e 65 77 20 65 6e 74 72 79 20 2a 2f 0a  he new entry */.
0d00: 20 20 4c 6f 67 45 73 74 20 72 52 75 6e 2c 20 20    LogEst rRun,  
0d10: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 75 6e 2d           /* Run-
0d20: 63 6f 73 74 20 6f 66 20 74 68 65 20 6e 65 77 20  cost of the new 
0d30: 65 6e 74 72 79 20 2a 2f 0a 20 20 4c 6f 67 45 73  entry */.  LogEs
0d40: 74 20 6e 4f 75 74 20 20 20 20 20 20 20 20 20 20  t nOut          
0d50: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f    /* Number of o
0d60: 75 74 70 75 74 73 20 66 6f 72 20 74 68 65 20 6e  utputs for the n
0d70: 65 77 20 65 6e 74 72 79 20 2a 2f 0a 29 7b 0a 20  ew entry */.){. 
0d80: 20 75 31 36 20 69 3b 0a 20 20 57 68 65 72 65 4f   u16 i;.  WhereO
0d90: 72 43 6f 73 74 20 2a 70 3b 0a 20 20 66 6f 72 28  rCost *p;.  for(
0da0: 69 3d 70 53 65 74 2d 3e 6e 2c 20 70 3d 70 53 65  i=pSet->n, p=pSe
0db0: 74 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20  t->a; i>0; i--, 
0dc0: 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 72 52  p++){.    if( rR
0dd0: 75 6e 3c 3d 70 2d 3e 72 52 75 6e 20 26 26 20 28  un<=p->rRun && (
0de0: 70 72 65 72 65 71 20 26 20 70 2d 3e 70 72 65 72  prereq & p->prer
0df0: 65 71 29 3d 3d 70 72 65 72 65 71 20 29 7b 0a 20  eq)==prereq ){. 
0e00: 20 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65 4f       goto whereO
0e10: 72 49 6e 73 65 72 74 5f 64 6f 6e 65 3b 0a 20 20  rInsert_done;.  
0e20: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 72    }.    if( p->r
0e30: 52 75 6e 3c 3d 72 52 75 6e 20 26 26 20 28 70 2d  Run<=rRun && (p-
0e40: 3e 70 72 65 72 65 71 20 26 20 70 72 65 72 65 71  >prereq & prereq
0e50: 29 3d 3d 70 2d 3e 70 72 65 72 65 71 20 29 7b 0a  )==p->prereq ){.
0e60: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
0e70: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
0e80: 70 53 65 74 2d 3e 6e 3c 4e 5f 4f 52 5f 43 4f 53  pSet->n<N_OR_COS
0e90: 54 20 29 7b 0a 20 20 20 20 70 20 3d 20 26 70 53  T ){.    p = &pS
0ea0: 65 74 2d 3e 61 5b 70 53 65 74 2d 3e 6e 2b 2b 5d  et->a[pSet->n++]
0eb0: 3b 0a 20 20 20 20 70 2d 3e 6e 4f 75 74 20 3d 20  ;.    p->nOut = 
0ec0: 6e 4f 75 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  nOut;.  }else{. 
0ed0: 20 20 20 70 20 3d 20 70 53 65 74 2d 3e 61 3b 0a     p = pSet->a;.
0ee0: 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 70      for(i=1; i<p
0ef0: 53 65 74 2d 3e 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Set->n; i++){.  
0f00: 20 20 20 20 69 66 28 20 70 2d 3e 72 52 75 6e 3e      if( p->rRun>
0f10: 70 53 65 74 2d 3e 61 5b 69 5d 2e 72 52 75 6e 20  pSet->a[i].rRun 
0f20: 29 20 70 20 3d 20 70 53 65 74 2d 3e 61 20 2b 20  ) p = pSet->a + 
0f30: 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  i;.    }.    if(
0f40: 20 70 2d 3e 72 52 75 6e 3c 3d 72 52 75 6e 20 29   p->rRun<=rRun )
0f50: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 77   return 0;.  }.w
0f60: 68 65 72 65 4f 72 49 6e 73 65 72 74 5f 64 6f 6e  hereOrInsert_don
0f70: 65 3a 0a 20 20 70 2d 3e 70 72 65 72 65 71 20 3d  e:.  p->prereq =
0f80: 20 70 72 65 72 65 71 3b 0a 20 20 70 2d 3e 72 52   prereq;.  p->rR
0f90: 75 6e 20 3d 20 72 52 75 6e 3b 0a 20 20 69 66 28  un = rRun;.  if(
0fa0: 20 70 2d 3e 6e 4f 75 74 3e 6e 4f 75 74 20 29 20   p->nOut>nOut ) 
0fb0: 70 2d 3e 6e 4f 75 74 20 3d 20 6e 4f 75 74 3b 0a  p->nOut = nOut;.
0fc0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f    return 1;.}../
0fd0: 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
0fe0: 61 20 70 72 65 61 6c 6c 6f 63 61 74 65 64 20 57  a preallocated W
0ff0: 68 65 72 65 43 6c 61 75 73 65 20 73 74 72 75 63  hereClause struc
1000: 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ture..*/.static 
1010: 76 6f 69 64 20 77 68 65 72 65 43 6c 61 75 73 65  void whereClause
1020: 49 6e 69 74 28 0a 20 20 57 68 65 72 65 43 6c 61  Init(.  WhereCla
1030: 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20  use *pWC,       
1040: 20 2f 2a 20 54 68 65 20 57 68 65 72 65 43 6c 61   /* The WhereCla
1050: 75 73 65 20 74 6f 20 62 65 20 69 6e 69 74 69 61  use to be initia
1060: 6c 69 7a 65 64 20 2a 2f 0a 20 20 57 68 65 72 65  lized */.  Where
1070: 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 20 20 20  Info *pWInfo    
1080: 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
1090: 20 70 72 6f 63 65 73 73 69 6e 67 20 63 6f 6e 74   processing cont
10a0: 65 78 74 20 2a 2f 0a 29 7b 0a 20 20 70 57 43 2d  ext */.){.  pWC-
10b0: 3e 70 57 49 6e 66 6f 20 3d 20 70 57 49 6e 66 6f  >pWInfo = pWInfo
10c0: 3b 0a 20 20 70 57 43 2d 3e 70 4f 75 74 65 72 20  ;.  pWC->pOuter 
10d0: 3d 20 30 3b 0a 20 20 70 57 43 2d 3e 6e 54 65 72  = 0;.  pWC->nTer
10e0: 6d 20 3d 20 30 3b 0a 20 20 70 57 43 2d 3e 6e 53  m = 0;.  pWC->nS
10f0: 6c 6f 74 20 3d 20 41 72 72 61 79 53 69 7a 65 28  lot = ArraySize(
1100: 70 57 43 2d 3e 61 53 74 61 74 69 63 29 3b 0a 20  pWC->aStatic);. 
1110: 20 70 57 43 2d 3e 61 20 3d 20 70 57 43 2d 3e 61   pWC->a = pWC->a
1120: 53 74 61 74 69 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f  Static;.}../* Fo
1130: 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20  rward reference 
1140: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
1150: 68 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28  hereClauseClear(
1160: 57 68 65 72 65 43 6c 61 75 73 65 2a 29 3b 0a 0a  WhereClause*);..
1170: 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65  /*.** Deallocate
1180: 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 73 73 6f   all memory asso
1190: 63 69 61 74 65 64 20 77 69 74 68 20 61 20 57 68  ciated with a Wh
11a0: 65 72 65 4f 72 49 6e 66 6f 20 6f 62 6a 65 63 74  ereOrInfo object
11b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
11c0: 20 77 68 65 72 65 4f 72 49 6e 66 6f 44 65 6c 65   whereOrInfoDele
11d0: 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  te(sqlite3 *db, 
11e0: 57 68 65 72 65 4f 72 49 6e 66 6f 20 2a 70 29 7b  WhereOrInfo *p){
11f0: 0a 20 20 77 68 65 72 65 43 6c 61 75 73 65 43 6c  .  whereClauseCl
1200: 65 61 72 28 26 70 2d 3e 77 63 29 3b 0a 20 20 73  ear(&p->wc);.  s
1210: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
1220: 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65   p);.}../*.** De
1230: 61 6c 6c 6f 63 61 74 65 20 61 6c 6c 20 6d 65 6d  allocate all mem
1240: 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77  ory associated w
1250: 69 74 68 20 61 20 57 68 65 72 65 41 6e 64 49 6e  ith a WhereAndIn
1260: 66 6f 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74  fo object..*/.st
1270: 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 41  atic void whereA
1280: 6e 64 49 6e 66 6f 44 65 6c 65 74 65 28 73 71 6c  ndInfoDelete(sql
1290: 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 41  ite3 *db, WhereA
12a0: 6e 64 49 6e 66 6f 20 2a 70 29 7b 0a 20 20 77 68  ndInfo *p){.  wh
12b0: 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28 26  ereClauseClear(&
12c0: 70 2d 3e 77 63 29 3b 0a 20 20 73 71 6c 69 74 65  p->wc);.  sqlite
12d0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a  3DbFree(db, p);.
12e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63  }../*.** Dealloc
12f0: 61 74 65 20 61 20 57 68 65 72 65 43 6c 61 75 73  ate a WhereClaus
1300: 65 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68  e structure.  Th
1310: 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 73 74  e WhereClause st
1320: 72 75 63 74 75 72 65 0a 2a 2a 20 69 74 73 65 6c  ructure.** itsel
1330: 66 20 69 73 20 6e 6f 74 20 66 72 65 65 64 2e 20  f is not freed. 
1340: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
1350: 20 74 68 65 20 69 6e 76 65 72 73 65 20 6f 66 20   the inverse of 
1360: 77 68 65 72 65 43 6c 61 75 73 65 49 6e 69 74 28  whereClauseInit(
1370: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  )..*/.static voi
1380: 64 20 77 68 65 72 65 43 6c 61 75 73 65 43 6c 65  d whereClauseCle
1390: 61 72 28 57 68 65 72 65 43 6c 61 75 73 65 20 2a  ar(WhereClause *
13a0: 70 57 43 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  pWC){.  int i;. 
13b0: 20 57 68 65 72 65 54 65 72 6d 20 2a 61 3b 0a 20   WhereTerm *a;. 
13c0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
13d0: 57 43 2d 3e 70 57 49 6e 66 6f 2d 3e 70 50 61 72  WC->pWInfo->pPar
13e0: 73 65 2d 3e 64 62 3b 0a 20 20 66 6f 72 28 69 3d  se->db;.  for(i=
13f0: 70 57 43 2d 3e 6e 54 65 72 6d 2d 31 2c 20 61 3d  pWC->nTerm-1, a=
1400: 70 57 43 2d 3e 61 3b 20 69 3e 3d 30 3b 20 69 2d  pWC->a; i>=0; i-
1410: 2d 2c 20 61 2b 2b 29 7b 0a 20 20 20 20 69 66 28  -, a++){.    if(
1420: 20 61 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45   a->wtFlags & TE
1430: 52 4d 5f 44 59 4e 41 4d 49 43 20 29 7b 0a 20 20  RM_DYNAMIC ){.  
1440: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
1450: 65 6c 65 74 65 28 64 62 2c 20 61 2d 3e 70 45 78  elete(db, a->pEx
1460: 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  pr);.    }.    i
1470: 66 28 20 61 2d 3e 77 74 46 6c 61 67 73 20 26 20  f( a->wtFlags & 
1480: 54 45 52 4d 5f 4f 52 49 4e 46 4f 20 29 7b 0a 20  TERM_ORINFO ){. 
1490: 20 20 20 20 20 77 68 65 72 65 4f 72 49 6e 66 6f       whereOrInfo
14a0: 44 65 6c 65 74 65 28 64 62 2c 20 61 2d 3e 75 2e  Delete(db, a->u.
14b0: 70 4f 72 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 65  pOrInfo);.    }e
14c0: 6c 73 65 20 69 66 28 20 61 2d 3e 77 74 46 6c 61  lse if( a->wtFla
14d0: 67 73 20 26 20 54 45 52 4d 5f 41 4e 44 49 4e 46  gs & TERM_ANDINF
14e0: 4f 20 29 7b 0a 20 20 20 20 20 20 77 68 65 72 65  O ){.      where
14f0: 41 6e 64 49 6e 66 6f 44 65 6c 65 74 65 28 64 62  AndInfoDelete(db
1500: 2c 20 61 2d 3e 75 2e 70 41 6e 64 49 6e 66 6f 29  , a->u.pAndInfo)
1510: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
1520: 28 20 70 57 43 2d 3e 61 21 3d 70 57 43 2d 3e 61  ( pWC->a!=pWC->a
1530: 53 74 61 74 69 63 20 29 7b 0a 20 20 20 20 73 71  Static ){.    sq
1540: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
1550: 70 57 43 2d 3e 61 29 3b 0a 20 20 7d 0a 7d 0a 0a  pWC->a);.  }.}..
1560: 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 73 69 6e 67  /*.** Add a sing
1570: 6c 65 20 6e 65 77 20 57 68 65 72 65 54 65 72 6d  le new WhereTerm
1580: 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20 57 68   entry to the Wh
1590: 65 72 65 43 6c 61 75 73 65 20 6f 62 6a 65 63 74  ereClause object
15a0: 20 70 57 43 2e 0a 2a 2a 20 54 68 65 20 6e 65 77   pWC..** The new
15b0: 20 57 68 65 72 65 54 65 72 6d 20 6f 62 6a 65 63   WhereTerm objec
15c0: 74 20 69 73 20 63 6f 6e 73 74 72 75 63 74 65 64  t is constructed
15d0: 20 66 72 6f 6d 20 45 78 70 72 20 70 20 61 6e 64   from Expr p and
15e0: 20 77 69 74 68 20 77 74 46 6c 61 67 73 2e 0a 2a   with wtFlags..*
15f0: 2a 20 54 68 65 20 69 6e 64 65 78 20 69 6e 20 70  * The index in p
1600: 57 43 2d 3e 61 5b 5d 20 6f 66 20 74 68 65 20 6e  WC->a[] of the n
1610: 65 77 20 57 68 65 72 65 54 65 72 6d 20 69 73 20  ew WhereTerm is 
1620: 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63  returned on succ
1630: 65 73 73 2e 0a 2a 2a 20 30 20 69 73 20 72 65 74  ess..** 0 is ret
1640: 75 72 6e 65 64 20 69 66 20 74 68 65 20 6e 65 77  urned if the new
1650: 20 57 68 65 72 65 54 65 72 6d 20 63 6f 75 6c 64   WhereTerm could
1660: 20 6e 6f 74 20 62 65 20 61 64 64 65 64 20 64 75   not be added du
1670: 65 20 74 6f 20 61 20 6d 65 6d 6f 72 79 0a 2a 2a  e to a memory.**
1680: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f   allocation erro
1690: 72 2e 20 20 54 68 65 20 6d 65 6d 6f 72 79 20 61  r.  The memory a
16a0: 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 75 72  llocation failur
16b0: 65 20 77 69 6c 6c 20 62 65 20 72 65 63 6f 72 64  e will be record
16c0: 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 64 62 2d  ed in.** the db-
16d0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c  >mallocFailed fl
16e0: 61 67 20 73 6f 20 74 68 61 74 20 68 69 67 68 65  ag so that highe
16f0: 72 2d 6c 65 76 65 6c 20 66 75 6e 63 74 69 6f 6e  r-level function
1700: 73 20 63 61 6e 20 64 65 74 65 63 74 20 69 74 2e  s can detect it.
1710: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
1720: 69 6e 65 20 77 69 6c 6c 20 69 6e 63 72 65 61 73  ine will increas
1730: 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  e the size of th
1740: 65 20 70 57 43 2d 3e 61 5b 5d 20 61 72 72 61 79  e pWC->a[] array
1750: 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a   as necessary..*
1760: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 77 74 46 6c  *.** If the wtFl
1770: 61 67 73 20 61 72 67 75 6d 65 6e 74 20 69 6e 63  ags argument inc
1780: 6c 75 64 65 73 20 54 45 52 4d 5f 44 59 4e 41 4d  ludes TERM_DYNAM
1790: 49 43 2c 20 74 68 65 6e 20 72 65 73 70 6f 6e 73  IC, then respons
17a0: 69 62 69 6c 69 74 79 0a 2a 2a 20 66 6f 72 20 66  ibility.** for f
17b0: 72 65 65 69 6e 67 20 74 68 65 20 65 78 70 72 65  reeing the expre
17c0: 73 73 69 6f 6e 20 70 20 69 73 20 61 73 73 75 6d  ssion p is assum
17d0: 65 64 20 62 79 20 74 68 65 20 57 68 65 72 65 43  ed by the WhereC
17e0: 6c 61 75 73 65 20 6f 62 6a 65 63 74 20 70 57 43  lause object pWC
17f0: 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 72 75  ..** This is tru
1800: 65 20 65 76 65 6e 20 69 66 20 74 68 69 73 20 72  e even if this r
1810: 6f 75 74 69 6e 65 20 66 61 69 6c 73 20 74 6f 20  outine fails to 
1820: 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 57  allocate a new W
1830: 68 65 72 65 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20  hereTerm..**.** 
1840: 57 41 52 4e 49 4e 47 3a 20 20 54 68 69 73 20 72  WARNING:  This r
1850: 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 72 65 61  outine might rea
1860: 6c 6c 6f 63 61 74 65 20 74 68 65 20 73 70 61 63  llocate the spac
1870: 65 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a  e used to store.
1880: 2a 2a 20 57 68 65 72 65 54 65 72 6d 73 2e 20 20  ** WhereTerms.  
1890: 41 6c 6c 20 70 6f 69 6e 74 65 72 73 20 74 6f 20  All pointers to 
18a0: 57 68 65 72 65 54 65 72 6d 73 20 73 68 6f 75 6c  WhereTerms shoul
18b0: 64 20 62 65 20 69 6e 76 61 6c 69 64 61 74 65 64  d be invalidated
18c0: 20 61 66 74 65 72 0a 2a 2a 20 63 61 6c 6c 69 6e   after.** callin
18d0: 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20  g this routine. 
18e0: 20 53 75 63 68 20 70 6f 69 6e 74 65 72 73 20 6d   Such pointers m
18f0: 61 79 20 62 65 20 72 65 69 6e 69 74 69 61 6c 69  ay be reinitiali
1900: 7a 65 64 20 62 79 20 72 65 66 65 72 65 6e 63 69  zed by referenci
1910: 6e 67 0a 2a 2a 20 74 68 65 20 70 57 43 2d 3e 61  ng.** the pWC->a
1920: 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a 73 74 61  [] array..*/.sta
1930: 74 69 63 20 69 6e 74 20 77 68 65 72 65 43 6c 61  tic int whereCla
1940: 75 73 65 49 6e 73 65 72 74 28 57 68 65 72 65 43  useInsert(WhereC
1950: 6c 61 75 73 65 20 2a 70 57 43 2c 20 45 78 70 72  lause *pWC, Expr
1960: 20 2a 70 2c 20 75 38 20 77 74 46 6c 61 67 73 29   *p, u8 wtFlags)
1970: 7b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  {.  WhereTerm *p
1980: 54 65 72 6d 3b 0a 20 20 69 6e 74 20 69 64 78 3b  Term;.  int idx;
1990: 0a 20 20 74 65 73 74 63 61 73 65 28 20 77 74 46  .  testcase( wtF
19a0: 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54  lags & TERM_VIRT
19b0: 55 41 4c 20 29 3b 0a 20 20 69 66 28 20 70 57 43  UAL );.  if( pWC
19c0: 2d 3e 6e 54 65 72 6d 3e 3d 70 57 43 2d 3e 6e 53  ->nTerm>=pWC->nS
19d0: 6c 6f 74 20 29 7b 0a 20 20 20 20 57 68 65 72 65  lot ){.    Where
19e0: 54 65 72 6d 20 2a 70 4f 6c 64 20 3d 20 70 57 43  Term *pOld = pWC
19f0: 2d 3e 61 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ->a;.    sqlite3
1a00: 20 2a 64 62 20 3d 20 70 57 43 2d 3e 70 57 49 6e   *db = pWC->pWIn
1a10: 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a  fo->pParse->db;.
1a20: 20 20 20 20 70 57 43 2d 3e 61 20 3d 20 73 71 6c      pWC->a = sql
1a30: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
1a40: 64 62 2c 20 73 69 7a 65 6f 66 28 70 57 43 2d 3e  db, sizeof(pWC->
1a50: 61 5b 30 5d 29 2a 70 57 43 2d 3e 6e 53 6c 6f 74  a[0])*pWC->nSlot
1a60: 2a 32 20 29 3b 0a 20 20 20 20 69 66 28 20 70 57  *2 );.    if( pW
1a70: 43 2d 3e 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20  C->a==0 ){.     
1a80: 20 69 66 28 20 77 74 46 6c 61 67 73 20 26 20 54   if( wtFlags & T
1a90: 45 52 4d 5f 44 59 4e 41 4d 49 43 20 29 7b 0a 20  ERM_DYNAMIC ){. 
1aa0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
1ab0: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 29 3b  prDelete(db, p);
1ac0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
1ad0: 57 43 2d 3e 61 20 3d 20 70 4f 6c 64 3b 0a 20 20  WC->a = pOld;.  
1ae0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
1af0: 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28 70    }.    memcpy(p
1b00: 57 43 2d 3e 61 2c 20 70 4f 6c 64 2c 20 73 69 7a  WC->a, pOld, siz
1b10: 65 6f 66 28 70 57 43 2d 3e 61 5b 30 5d 29 2a 70  eof(pWC->a[0])*p
1b20: 57 43 2d 3e 6e 54 65 72 6d 29 3b 0a 20 20 20 20  WC->nTerm);.    
1b30: 69 66 28 20 70 4f 6c 64 21 3d 70 57 43 2d 3e 61  if( pOld!=pWC->a
1b40: 53 74 61 74 69 63 20 29 7b 0a 20 20 20 20 20 20  Static ){.      
1b50: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
1b60: 2c 20 70 4f 6c 64 29 3b 0a 20 20 20 20 7d 0a 20  , pOld);.    }. 
1b70: 20 20 20 70 57 43 2d 3e 6e 53 6c 6f 74 20 3d 20     pWC->nSlot = 
1b80: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 53  sqlite3DbMallocS
1b90: 69 7a 65 28 64 62 2c 20 70 57 43 2d 3e 61 29 2f  ize(db, pWC->a)/
1ba0: 73 69 7a 65 6f 66 28 70 57 43 2d 3e 61 5b 30 5d  sizeof(pWC->a[0]
1bb0: 29 3b 0a 20 20 7d 0a 20 20 70 54 65 72 6d 20 3d  );.  }.  pTerm =
1bc0: 20 26 70 57 43 2d 3e 61 5b 69 64 78 20 3d 20 70   &pWC->a[idx = p
1bd0: 57 43 2d 3e 6e 54 65 72 6d 2b 2b 5d 3b 0a 20 20  WC->nTerm++];.  
1be0: 69 66 28 20 70 20 26 26 20 45 78 70 72 48 61 73  if( p && ExprHas
1bf0: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 55  Property(p, EP_U
1c00: 6e 6c 69 6b 65 6c 79 29 20 29 7b 0a 20 20 20 20  nlikely) ){.    
1c10: 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62  pTerm->truthProb
1c20: 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
1c30: 28 70 2d 3e 69 54 61 62 6c 65 29 20 2d 20 39 39  (p->iTable) - 99
1c40: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
1c50: 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 20  Term->truthProb 
1c60: 3d 20 31 3b 0a 20 20 7d 0a 20 20 70 54 65 72 6d  = 1;.  }.  pTerm
1c70: 2d 3e 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65  ->pExpr = sqlite
1c80: 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65  3ExprSkipCollate
1c90: 28 70 29 3b 0a 20 20 70 54 65 72 6d 2d 3e 77 74  (p);.  pTerm->wt
1ca0: 46 6c 61 67 73 20 3d 20 77 74 46 6c 61 67 73 3b  Flags = wtFlags;
1cb0: 0a 20 20 70 54 65 72 6d 2d 3e 70 57 43 20 3d 20  .  pTerm->pWC = 
1cc0: 70 57 43 3b 0a 20 20 70 54 65 72 6d 2d 3e 69 50  pWC;.  pTerm->iP
1cd0: 61 72 65 6e 74 20 3d 20 2d 31 3b 0a 20 20 72 65  arent = -1;.  re
1ce0: 74 75 72 6e 20 69 64 78 3b 0a 7d 0a 0a 2f 2a 0a  turn idx;.}../*.
1cf0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1d00: 69 64 65 6e 74 69 66 69 65 73 20 73 75 62 65 78  identifies subex
1d10: 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65  pressions in the
1d20: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 77 68   WHERE clause wh
1d30: 65 72 65 0a 2a 2a 20 65 61 63 68 20 73 75 62 65  ere.** each sube
1d40: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 73 65 70  xpression is sep
1d50: 61 72 61 74 65 64 20 62 79 20 74 68 65 20 41 4e  arated by the AN
1d60: 44 20 6f 70 65 72 61 74 6f 72 20 6f 72 20 73 6f  D operator or so
1d70: 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 6f 70 65 72  me other.** oper
1d80: 61 74 6f 72 20 73 70 65 63 69 66 69 65 64 20 69  ator specified i
1d90: 6e 20 74 68 65 20 6f 70 20 70 61 72 61 6d 65 74  n the op paramet
1da0: 65 72 2e 20 20 54 68 65 20 57 68 65 72 65 43 6c  er.  The WhereCl
1db0: 61 75 73 65 20 73 74 72 75 63 74 75 72 65 0a 2a  ause structure.*
1dc0: 2a 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68  * is filled with
1dd0: 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 73 75 62   pointers to sub
1de0: 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 20 46 6f  expressions.  Fo
1df0: 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a  r example:.**.**
1e00: 20 20 20 20 57 48 45 52 45 20 20 61 3d 3d 27 68      WHERE  a=='h
1e10: 65 6c 6c 6f 27 20 41 4e 44 20 63 6f 61 6c 65 73  ello' AND coales
1e20: 63 65 28 62 2c 31 31 29 3c 31 30 20 41 4e 44 20  ce(b,11)<10 AND 
1e30: 28 63 2b 31 32 21 3d 64 20 4f 52 20 63 3d 3d 32  (c+12!=d OR c==2
1e40: 32 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  2).**           
1e50: 5c 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 5c  \________/     \
1e60: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f  _______________/
1e70: 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f       \__________
1e80: 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 20 20 20 20 20 20  ______/.**      
1e90: 20 20 20 20 20 20 73 6c 6f 74 5b 30 5d 20 20 20        slot[0]   
1ea0: 20 20 20 20 20 20 20 20 20 73 6c 6f 74 5b 31 5d           slot[1]
1eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
1ec0: 6c 6f 74 5b 32 5d 0a 2a 2a 0a 2a 2a 20 54 68 65  lot[2].**.** The
1ed0: 20 6f 72 69 67 69 6e 61 6c 20 57 48 45 52 45 20   original WHERE 
1ee0: 63 6c 61 75 73 65 20 69 6e 20 70 45 78 70 72 20  clause in pExpr 
1ef0: 69 73 20 75 6e 61 6c 74 65 72 65 64 2e 20 20 41  is unaltered.  A
1f00: 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  ll this routine.
1f10: 2a 2a 20 64 6f 65 73 20 69 73 20 6d 61 6b 65 20  ** does is make 
1f20: 73 6c 6f 74 5b 5d 20 65 6e 74 72 69 65 73 20 70  slot[] entries p
1f30: 6f 69 6e 74 20 74 6f 20 73 75 62 73 74 72 75 63  oint to substruc
1f40: 74 75 72 65 20 77 69 74 68 69 6e 20 70 45 78 70  ture within pExp
1f50: 72 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20  r..**.** In the 
1f60: 70 72 65 76 69 6f 75 73 20 73 65 6e 74 65 6e 63  previous sentenc
1f70: 65 20 61 6e 64 20 69 6e 20 74 68 65 20 64 69 61  e and in the dia
1f80: 67 72 61 6d 2c 20 22 73 6c 6f 74 5b 5d 22 20 72  gram, "slot[]" r
1f90: 65 66 65 72 73 20 74 6f 0a 2a 2a 20 74 68 65 20  efers to.** the 
1fa0: 57 68 65 72 65 43 6c 61 75 73 65 2e 61 5b 5d 20  WhereClause.a[] 
1fb0: 61 72 72 61 79 2e 20 20 54 68 65 20 73 6c 6f 74  array.  The slot
1fc0: 5b 5d 20 61 72 72 61 79 20 67 72 6f 77 73 20 61  [] array grows a
1fd0: 73 20 6e 65 65 64 65 64 20 74 6f 20 63 6f 6e 74  s needed to cont
1fe0: 61 69 6e 0a 2a 2a 20 61 6c 6c 20 74 65 72 6d 73  ain.** all terms
1ff0: 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
2000: 61 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ause..*/.static 
2010: 76 6f 69 64 20 77 68 65 72 65 53 70 6c 69 74 28  void whereSplit(
2020: 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
2030: 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 75  , Expr *pExpr, u
2040: 38 20 6f 70 29 7b 0a 20 20 70 57 43 2d 3e 6f 70  8 op){.  pWC->op
2050: 20 3d 20 6f 70 3b 0a 20 20 69 66 28 20 70 45 78   = op;.  if( pEx
2060: 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  pr==0 ) return;.
2070: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21    if( pExpr->op!
2080: 3d 6f 70 20 29 7b 0a 20 20 20 20 77 68 65 72 65  =op ){.    where
2090: 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57 43  ClauseInsert(pWC
20a0: 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 7d  , pExpr, 0);.  }
20b0: 65 6c 73 65 7b 0a 20 20 20 20 77 68 65 72 65 53  else{.    whereS
20c0: 70 6c 69 74 28 70 57 43 2c 20 70 45 78 70 72 2d  plit(pWC, pExpr-
20d0: 3e 70 4c 65 66 74 2c 20 6f 70 29 3b 0a 20 20 20  >pLeft, op);.   
20e0: 20 77 68 65 72 65 53 70 6c 69 74 28 70 57 43 2c   whereSplit(pWC,
20f0: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
2100: 6f 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  op);.  }.}../*.*
2110: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 20 57  * Initialize a W
2120: 68 65 72 65 4d 61 73 6b 53 65 74 20 6f 62 6a 65  hereMaskSet obje
2130: 63 74 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 69 6e  ct.*/.#define in
2140: 69 74 4d 61 73 6b 53 65 74 28 50 29 20 20 28 50  itMaskSet(P)  (P
2150: 29 2d 3e 6e 3d 30 0a 0a 2f 2a 0a 2a 2a 20 52 65  )->n=0../*.** Re
2160: 74 75 72 6e 20 74 68 65 20 62 69 74 6d 61 73 6b  turn the bitmask
2170: 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 63   for the given c
2180: 75 72 73 6f 72 20 6e 75 6d 62 65 72 2e 20 20 52  ursor number.  R
2190: 65 74 75 72 6e 20 30 20 69 66 0a 2a 2a 20 69 43  eturn 0 if.** iC
21a0: 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 69 6e 20  ursor is not in 
21b0: 74 68 65 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74  the set..*/.stat
21c0: 69 63 20 42 69 74 6d 61 73 6b 20 67 65 74 4d 61  ic Bitmask getMa
21d0: 73 6b 28 57 68 65 72 65 4d 61 73 6b 53 65 74 20  sk(WhereMaskSet 
21e0: 2a 70 4d 61 73 6b 53 65 74 2c 20 69 6e 74 20 69  *pMaskSet, int i
21f0: 43 75 72 73 6f 72 29 7b 0a 20 20 69 6e 74 20 69  Cursor){.  int i
2200: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4d 61 73  ;.  assert( pMas
2210: 6b 53 65 74 2d 3e 6e 3c 3d 28 69 6e 74 29 73 69  kSet->n<=(int)si
2220: 7a 65 6f 66 28 42 69 74 6d 61 73 6b 29 2a 38 20  zeof(Bitmask)*8 
2230: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
2240: 70 4d 61 73 6b 53 65 74 2d 3e 6e 3b 20 69 2b 2b  pMaskSet->n; i++
2250: 29 7b 0a 20 20 20 20 69 66 28 20 70 4d 61 73 6b  ){.    if( pMask
2260: 53 65 74 2d 3e 69 78 5b 69 5d 3d 3d 69 43 75 72  Set->ix[i]==iCur
2270: 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 72 65 74  sor ){.      ret
2280: 75 72 6e 20 4d 41 53 4b 42 49 54 28 69 29 3b 0a  urn MASKBIT(i);.
2290: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
22a0: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rn 0;.}../*.** C
22b0: 72 65 61 74 65 20 61 20 6e 65 77 20 6d 61 73 6b  reate a new mask
22c0: 20 66 6f 72 20 63 75 72 73 6f 72 20 69 43 75 72   for cursor iCur
22d0: 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65  sor..**.** There
22e0: 20 69 73 20 6f 6e 65 20 63 75 72 73 6f 72 20 70   is one cursor p
22f0: 65 72 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20  er table in the 
2300: 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 54 68  FROM clause.  Th
2310: 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 74  e number of.** t
2320: 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f  ables in the FRO
2330: 4d 20 63 6c 61 75 73 65 20 69 73 20 6c 69 6d 69  M clause is limi
2340: 74 65 64 20 62 79 20 61 20 74 65 73 74 20 65 61  ted by a test ea
2350: 72 6c 79 20 69 6e 20 74 68 65 0a 2a 2a 20 73 71  rly in the.** sq
2360: 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
2370: 29 20 72 6f 75 74 69 6e 65 2e 20 20 53 6f 20 77  ) routine.  So w
2380: 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20  e know that the 
2390: 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 5d 0a 2a  pMaskSet->ix[].*
23a0: 2a 20 61 72 72 61 79 20 77 69 6c 6c 20 6e 65 76  * array will nev
23b0: 65 72 20 6f 76 65 72 66 6c 6f 77 2e 0a 2a 2f 0a  er overflow..*/.
23c0: 73 74 61 74 69 63 20 76 6f 69 64 20 63 72 65 61  static void crea
23d0: 74 65 4d 61 73 6b 28 57 68 65 72 65 4d 61 73 6b  teMask(WhereMask
23e0: 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 69  Set *pMaskSet, i
23f0: 6e 74 20 69 43 75 72 73 6f 72 29 7b 0a 20 20 61  nt iCursor){.  a
2400: 73 73 65 72 74 28 20 70 4d 61 73 6b 53 65 74 2d  ssert( pMaskSet-
2410: 3e 6e 20 3c 20 41 72 72 61 79 53 69 7a 65 28 70  >n < ArraySize(p
2420: 4d 61 73 6b 53 65 74 2d 3e 69 78 29 20 29 3b 0a  MaskSet->ix) );.
2430: 20 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 70    pMaskSet->ix[p
2440: 4d 61 73 6b 53 65 74 2d 3e 6e 2b 2b 5d 20 3d 20  MaskSet->n++] = 
2450: 69 43 75 72 73 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a  iCursor;.}../*.*
2460: 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73  * These routines
2470: 20 77 61 6c 6b 20 28 72 65 63 75 72 73 69 76 65   walk (recursive
2480: 6c 79 29 20 61 6e 20 65 78 70 72 65 73 73 69 6f  ly) an expressio
2490: 6e 20 74 72 65 65 20 61 6e 64 20 67 65 6e 65 72  n tree and gener
24a0: 61 74 65 0a 2a 2a 20 61 20 62 69 74 6d 61 73 6b  ate.** a bitmask
24b0: 20 69 6e 64 69 63 61 74 69 6e 67 20 77 68 69 63   indicating whic
24c0: 68 20 74 61 62 6c 65 73 20 61 72 65 20 75 73 65  h tables are use
24d0: 64 20 69 6e 20 74 68 61 74 20 65 78 70 72 65 73  d in that expres
24e0: 73 69 6f 6e 0a 2a 2a 20 74 72 65 65 2e 0a 2a 2f  sion.** tree..*/
24f0: 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20  .static Bitmask 
2500: 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61  exprListTableUsa
2510: 67 65 28 57 68 65 72 65 4d 61 73 6b 53 65 74 2a  ge(WhereMaskSet*
2520: 2c 20 45 78 70 72 4c 69 73 74 2a 29 3b 0a 73 74  , ExprList*);.st
2530: 61 74 69 63 20 42 69 74 6d 61 73 6b 20 65 78 70  atic Bitmask exp
2540: 72 53 65 6c 65 63 74 54 61 62 6c 65 55 73 61 67  rSelectTableUsag
2550: 65 28 57 68 65 72 65 4d 61 73 6b 53 65 74 2a 2c  e(WhereMaskSet*,
2560: 20 53 65 6c 65 63 74 2a 29 3b 0a 73 74 61 74 69   Select*);.stati
2570: 63 20 42 69 74 6d 61 73 6b 20 65 78 70 72 54 61  c Bitmask exprTa
2580: 62 6c 65 55 73 61 67 65 28 57 68 65 72 65 4d 61  bleUsage(WhereMa
2590: 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c  skSet *pMaskSet,
25a0: 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 42 69 74   Expr *p){.  Bit
25b0: 6d 61 73 6b 20 6d 61 73 6b 20 3d 20 30 3b 0a 20  mask mask = 0;. 
25c0: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
25d0: 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 6f  rn 0;.  if( p->o
25e0: 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a  p==TK_COLUMN ){.
25f0: 20 20 20 20 6d 61 73 6b 20 3d 20 67 65 74 4d 61      mask = getMa
2600: 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d 3e  sk(pMaskSet, p->
2610: 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 72 65 74  iTable);.    ret
2620: 75 72 6e 20 6d 61 73 6b 3b 0a 20 20 7d 0a 20 20  urn mask;.  }.  
2630: 6d 61 73 6b 20 3d 20 65 78 70 72 54 61 62 6c 65  mask = exprTable
2640: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
2650: 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 6d 61  p->pRight);.  ma
2660: 73 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c 65 55  sk |= exprTableU
2670: 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70  sage(pMaskSet, p
2680: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66 28 20  ->pLeft);.  if( 
2690: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
26a0: 70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  p, EP_xIsSelect)
26b0: 20 29 7b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20   ){.    mask |= 
26c0: 65 78 70 72 53 65 6c 65 63 74 54 61 62 6c 65 55  exprSelectTableU
26d0: 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70  sage(pMaskSet, p
26e0: 2d 3e 78 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20  ->x.pSelect);.  
26f0: 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 61 73 6b 20  }else{.    mask 
2700: 7c 3d 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65  |= exprListTable
2710: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
2720: 70 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 7d  p->x.pList);.  }
2730: 0a 20 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b 0a  .  return mask;.
2740: 7d 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b  }.static Bitmask
2750: 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73   exprListTableUs
2760: 61 67 65 28 57 68 65 72 65 4d 61 73 6b 53 65 74  age(WhereMaskSet
2770: 20 2a 70 4d 61 73 6b 53 65 74 2c 20 45 78 70 72   *pMaskSet, Expr
2780: 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20  List *pList){.  
2790: 69 6e 74 20 69 3b 0a 20 20 42 69 74 6d 61 73 6b  int i;.  Bitmask
27a0: 20 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 69 66 28   mask = 0;.  if(
27b0: 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 66 6f   pList ){.    fo
27c0: 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
27d0: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
27e0: 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 54     mask |= exprT
27f0: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
2800: 65 74 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  et, pList->a[i].
2810: 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20  pExpr);.    }.  
2820: 7d 0a 20 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b  }.  return mask;
2830: 0a 7d 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73  .}.static Bitmas
2840: 6b 20 65 78 70 72 53 65 6c 65 63 74 54 61 62 6c  k exprSelectTabl
2850: 65 55 73 61 67 65 28 57 68 65 72 65 4d 61 73 6b  eUsage(WhereMask
2860: 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 53  Set *pMaskSet, S
2870: 65 6c 65 63 74 20 2a 70 53 29 7b 0a 20 20 42 69  elect *pS){.  Bi
2880: 74 6d 61 73 6b 20 6d 61 73 6b 20 3d 20 30 3b 0a  tmask mask = 0;.
2890: 20 20 77 68 69 6c 65 28 20 70 53 20 29 7b 0a 20    while( pS ){. 
28a0: 20 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63     SrcList *pSrc
28b0: 20 3d 20 70 53 2d 3e 70 53 72 63 3b 0a 20 20 20   = pS->pSrc;.   
28c0: 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69 73   mask |= exprLis
28d0: 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  tTableUsage(pMas
28e0: 6b 53 65 74 2c 20 70 53 2d 3e 70 45 4c 69 73 74  kSet, pS->pEList
28f0: 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65  );.    mask |= e
2900: 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67  xprListTableUsag
2910: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e  e(pMaskSet, pS->
2920: 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 6d  pGroupBy);.    m
2930: 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69 73 74 54  ask |= exprListT
2940: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
2950: 65 74 2c 20 70 53 2d 3e 70 4f 72 64 65 72 42 79  et, pS->pOrderBy
2960: 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65  );.    mask |= e
2970: 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d  xprTableUsage(pM
2980: 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70 57 68 65  askSet, pS->pWhe
2990: 72 65 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d  re);.    mask |=
29a0: 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28   exprTableUsage(
29b0: 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70 48  pMaskSet, pS->pH
29c0: 61 76 69 6e 67 29 3b 0a 20 20 20 20 69 66 28 20  aving);.    if( 
29d0: 41 4c 57 41 59 53 28 70 53 72 63 21 3d 30 29 20  ALWAYS(pSrc!=0) 
29e0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  ){.      int i;.
29f0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
2a00: 3c 70 53 72 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b  <pSrc->nSrc; i++
2a10: 29 7b 0a 20 20 20 20 20 20 20 20 6d 61 73 6b 20  ){.        mask 
2a20: 7c 3d 20 65 78 70 72 53 65 6c 65 63 74 54 61 62  |= exprSelectTab
2a30: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
2a40: 2c 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 53 65  , pSrc->a[i].pSe
2a50: 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20 6d  lect);.        m
2a60: 61 73 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c 65  ask |= exprTable
2a70: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
2a80: 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 4f 6e 29 3b  pSrc->a[i].pOn);
2a90: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2aa0: 20 20 20 70 53 20 3d 20 70 53 2d 3e 70 50 72 69     pS = pS->pPri
2ab0: 6f 72 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  or;.  }.  return
2ac0: 20 6d 61 73 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   mask;.}../*.** 
2ad0: 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
2ae0: 68 65 20 67 69 76 65 6e 20 6f 70 65 72 61 74 6f  he given operato
2af0: 72 20 69 73 20 6f 6e 65 20 6f 66 20 74 68 65 20  r is one of the 
2b00: 6f 70 65 72 61 74 6f 72 73 20 74 68 61 74 20 69  operators that i
2b10: 73 0a 2a 2a 20 61 6c 6c 6f 77 65 64 20 66 6f 72  s.** allowed for
2b20: 20 61 6e 20 69 6e 64 65 78 61 62 6c 65 20 57 48   an indexable WH
2b30: 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 2e  ERE clause term.
2b40: 20 20 54 68 65 20 61 6c 6c 6f 77 65 64 20 6f 70    The allowed op
2b50: 65 72 61 74 6f 72 73 20 61 72 65 0a 2a 2a 20 22  erators are.** "
2b60: 3d 22 2c 20 22 3c 22 2c 20 22 3e 22 2c 20 22 3c  =", "<", ">", "<
2b70: 3d 22 2c 20 22 3e 3d 22 2c 20 22 49 4e 22 2c 20  =", ">=", "IN", 
2b80: 61 6e 64 20 22 49 53 20 4e 55 4c 4c 22 0a 2a 2f  and "IS NULL".*/
2b90: 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f  .static int allo
2ba0: 77 65 64 4f 70 28 69 6e 74 20 6f 70 29 7b 0a 20  wedOp(int op){. 
2bb0: 20 61 73 73 65 72 74 28 20 54 4b 5f 47 54 3e 54   assert( TK_GT>T
2bc0: 4b 5f 45 51 20 26 26 20 54 4b 5f 47 54 3c 54 4b  K_EQ && TK_GT<TK
2bd0: 5f 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _GE );.  assert(
2be0: 20 54 4b 5f 4c 54 3e 54 4b 5f 45 51 20 26 26 20   TK_LT>TK_EQ && 
2bf0: 54 4b 5f 4c 54 3c 54 4b 5f 47 45 20 29 3b 0a 20  TK_LT<TK_GE );. 
2c00: 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 45 3e 54   assert( TK_LE>T
2c10: 4b 5f 45 51 20 26 26 20 54 4b 5f 4c 45 3c 54 4b  K_EQ && TK_LE<TK
2c20: 5f 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _GE );.  assert(
2c30: 20 54 4b 5f 47 45 3d 3d 54 4b 5f 45 51 2b 34 20   TK_GE==TK_EQ+4 
2c40: 29 3b 0a 20 20 72 65 74 75 72 6e 20 6f 70 3d 3d  );.  return op==
2c50: 54 4b 5f 49 4e 20 7c 7c 20 28 6f 70 3e 3d 54 4b  TK_IN || (op>=TK
2c60: 5f 45 51 20 26 26 20 6f 70 3c 3d 54 4b 5f 47 45  _EQ && op<=TK_GE
2c70: 29 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55  ) || op==TK_ISNU
2c80: 4c 4c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 77 61  LL;.}../*.** Swa
2c90: 70 20 74 77 6f 20 6f 62 6a 65 63 74 73 20 6f 66  p two objects of
2ca0: 20 74 79 70 65 20 54 59 50 45 2e 0a 2a 2f 0a 23   type TYPE..*/.#
2cb0: 64 65 66 69 6e 65 20 53 57 41 50 28 54 59 50 45  define SWAP(TYPE
2cc0: 2c 41 2c 42 29 20 7b 54 59 50 45 20 74 3d 41 3b  ,A,B) {TYPE t=A;
2cd0: 20 41 3d 42 3b 20 42 3d 74 3b 7d 0a 0a 2f 2a 0a   A=B; B=t;}../*.
2ce0: 2a 2a 20 43 6f 6d 6d 75 74 65 20 61 20 63 6f 6d  ** Commute a com
2cf0: 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72  parison operator
2d00: 2e 20 20 45 78 70 72 65 73 73 69 6f 6e 73 20 6f  .  Expressions o
2d10: 66 20 74 68 65 20 66 6f 72 6d 20 22 58 20 6f 70  f the form "X op
2d20: 20 59 22 0a 2a 2a 20 61 72 65 20 63 6f 6e 76 65   Y".** are conve
2d30: 72 74 65 64 20 69 6e 74 6f 20 22 59 20 6f 70 20  rted into "Y op 
2d40: 58 22 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6c 65 66  X"..**.** If lef
2d50: 74 2f 72 69 67 68 74 20 70 72 65 63 65 64 65 6e  t/right preceden
2d60: 63 65 20 72 75 6c 65 73 20 63 6f 6d 65 20 69 6e  ce rules come in
2d70: 74 6f 20 70 6c 61 79 20 77 68 65 6e 20 64 65 74  to play when det
2d80: 65 72 6d 69 6e 69 6e 67 20 74 68 65 0a 2a 2a 20  ermining the.** 
2d90: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
2da0: 63 65 2c 20 74 68 65 6e 20 43 4f 4c 4c 41 54 45  ce, then COLLATE
2db0: 20 6f 70 65 72 61 74 6f 72 73 20 61 72 65 20 61   operators are a
2dc0: 64 6a 75 73 74 65 64 20 74 6f 20 65 6e 73 75 72  djusted to ensur
2dd0: 65 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 63 6f  e.** that the co
2de0: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
2df0: 20 64 6f 65 73 20 6e 6f 74 20 63 68 61 6e 67 65   does not change
2e00: 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a  .  For example:.
2e10: 2a 2a 20 22 59 20 63 6f 6c 6c 61 74 65 20 4e 4f  ** "Y collate NO
2e20: 43 41 53 45 20 6f 70 20 58 22 20 62 65 63 6f 6d  CASE op X" becom
2e30: 65 73 20 22 58 20 6f 70 20 59 22 20 62 65 63 61  es "X op Y" beca
2e40: 75 73 65 20 61 6e 79 20 63 6f 6c 6c 61 74 69 6f  use any collatio
2e50: 6e 20 73 65 71 75 65 6e 63 65 20 6f 6e 0a 2a 2a  n sequence on.**
2e60: 20 74 68 65 20 6c 65 66 74 20 68 61 6e 64 20 73   the left hand s
2e70: 69 64 65 20 6f 66 20 61 20 63 6f 6d 70 61 72 69  ide of a compari
2e80: 73 6f 6e 20 6f 76 65 72 72 69 64 65 73 20 61 6e  son overrides an
2e90: 79 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  y collation sequ
2ea0: 65 6e 63 65 20 0a 2a 2a 20 61 74 74 61 63 68 65  ence .** attache
2eb0: 64 20 74 6f 20 74 68 65 20 72 69 67 68 74 2e 20  d to the right. 
2ec0: 46 6f 72 20 74 68 65 20 73 61 6d 65 20 72 65 61  For the same rea
2ed0: 73 6f 6e 20 74 68 65 20 45 50 5f 43 6f 6c 6c 61  son the EP_Colla
2ee0: 74 65 20 66 6c 61 67 0a 2a 2a 20 69 73 20 6e 6f  te flag.** is no
2ef0: 74 20 63 6f 6d 6d 75 74 65 64 2e 0a 2a 2f 0a 73  t commuted..*/.s
2f00: 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 72 43  tatic void exprC
2f10: 6f 6d 6d 75 74 65 28 50 61 72 73 65 20 2a 70 50  ommute(Parse *pP
2f20: 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
2f30: 72 29 7b 0a 20 20 75 31 36 20 65 78 70 52 69 67  r){.  u16 expRig
2f40: 68 74 20 3d 20 28 70 45 78 70 72 2d 3e 70 52 69  ht = (pExpr->pRi
2f50: 67 68 74 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  ght->flags & EP_
2f60: 43 6f 6c 6c 61 74 65 29 3b 0a 20 20 75 31 36 20  Collate);.  u16 
2f70: 65 78 70 4c 65 66 74 20 3d 20 28 70 45 78 70 72  expLeft = (pExpr
2f80: 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20 26  ->pLeft->flags &
2f90: 20 45 50 5f 43 6f 6c 6c 61 74 65 29 3b 0a 20 20   EP_Collate);.  
2fa0: 61 73 73 65 72 74 28 20 61 6c 6c 6f 77 65 64 4f  assert( allowedO
2fb0: 70 28 70 45 78 70 72 2d 3e 6f 70 29 20 26 26 20  p(pExpr->op) && 
2fc0: 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 49 4e  pExpr->op!=TK_IN
2fd0: 20 29 3b 0a 20 20 69 66 28 20 65 78 70 52 69 67   );.  if( expRig
2fe0: 68 74 3d 3d 65 78 70 4c 65 66 74 20 29 7b 0a 20  ht==expLeft ){. 
2ff0: 20 20 20 2f 2a 20 45 69 74 68 65 72 20 58 20 61     /* Either X a
3000: 6e 64 20 59 20 62 6f 74 68 20 68 61 76 65 20 43  nd Y both have C
3010: 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 20  OLLATE operator 
3020: 6f 72 20 6e 65 69 74 68 65 72 20 64 6f 20 2a 2f  or neither do */
3030: 0a 20 20 20 20 69 66 28 20 65 78 70 52 69 67 68  .    if( expRigh
3040: 74 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 42 6f  t ){.      /* Bo
3050: 74 68 20 58 20 61 6e 64 20 59 20 68 61 76 65 20  th X and Y have 
3060: 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72  COLLATE operator
3070: 73 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 58 20  s.  Make sure X 
3080: 69 73 20 61 6c 77 61 79 73 0a 20 20 20 20 20 20  is always.      
3090: 2a 2a 20 75 73 65 64 20 62 79 20 63 6c 65 61 72  ** used by clear
30a0: 69 6e 67 20 74 68 65 20 45 50 5f 43 6f 6c 6c 61  ing the EP_Colla
30b0: 74 65 20 66 6c 61 67 20 66 72 6f 6d 20 59 2e 20  te flag from Y. 
30c0: 2a 2f 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  */.      pExpr->
30d0: 70 52 69 67 68 74 2d 3e 66 6c 61 67 73 20 26 3d  pRight->flags &=
30e0: 20 7e 45 50 5f 43 6f 6c 6c 61 74 65 3b 0a 20 20   ~EP_Collate;.  
30f0: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69    }else if( sqli
3100: 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
3110: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
3120: 65 66 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  eft)!=0 ){.     
3130: 20 2f 2a 20 4e 65 69 74 68 65 72 20 58 20 6e 6f   /* Neither X no
3140: 72 20 59 20 68 61 76 65 20 43 4f 4c 4c 41 54 45  r Y have COLLATE
3150: 20 6f 70 65 72 61 74 6f 72 73 2c 20 62 75 74 20   operators, but 
3160: 58 20 68 61 73 20 61 20 6e 6f 6e 2d 64 65 66 61  X has a non-defa
3170: 75 6c 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6c  ult.      ** col
3180: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e  lating sequence.
3190: 20 20 53 6f 20 61 64 64 20 74 68 65 20 45 50 5f    So add the EP_
31a0: 43 6f 6c 6c 61 74 65 20 6d 61 72 6b 65 72 20 6f  Collate marker o
31b0: 6e 20 58 20 74 6f 20 63 61 75 73 65 0a 20 20 20  n X to cause.   
31c0: 20 20 20 2a 2a 20 69 74 20 74 6f 20 62 65 20 73     ** it to be s
31d0: 65 61 72 63 68 65 64 20 66 69 72 73 74 2e 20 2a  earched first. *
31e0: 2f 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70  /.      pExpr->p
31f0: 4c 65 66 74 2d 3e 66 6c 61 67 73 20 7c 3d 20 45  Left->flags |= E
3200: 50 5f 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 7d  P_Collate;.    }
3210: 0a 20 20 7d 0a 20 20 53 57 41 50 28 45 78 70 72  .  }.  SWAP(Expr
3220: 2a 2c 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  *,pExpr->pRight,
3230: 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
3240: 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3e 3d   if( pExpr->op>=
3250: 54 4b 5f 47 54 20 29 7b 0a 20 20 20 20 61 73 73  TK_GT ){.    ass
3260: 65 72 74 28 20 54 4b 5f 4c 54 3d 3d 54 4b 5f 47  ert( TK_LT==TK_G
3270: 54 2b 32 20 29 3b 0a 20 20 20 20 61 73 73 65 72  T+2 );.    asser
3280: 74 28 20 54 4b 5f 47 45 3d 3d 54 4b 5f 4c 45 2b  t( TK_GE==TK_LE+
3290: 32 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  2 );.    assert(
32a0: 20 54 4b 5f 47 54 3e 54 4b 5f 45 51 20 29 3b 0a   TK_GT>TK_EQ );.
32b0: 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47      assert( TK_G
32c0: 54 3c 54 4b 5f 4c 45 20 29 3b 0a 20 20 20 20 61  T<TK_LE );.    a
32d0: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
32e0: 3e 3d 54 4b 5f 47 54 20 26 26 20 70 45 78 70 72  >=TK_GT && pExpr
32f0: 2d 3e 6f 70 3c 3d 54 4b 5f 47 45 20 29 3b 0a 20  ->op<=TK_GE );. 
3300: 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 28     pExpr->op = (
3310: 28 70 45 78 70 72 2d 3e 6f 70 2d 54 4b 5f 47 54  (pExpr->op-TK_GT
3320: 29 5e 32 29 2b 54 4b 5f 47 54 3b 0a 20 20 7d 0a  )^2)+TK_GT;.  }.
3330: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 6c 61  }../*.** Transla
3340: 74 65 20 66 72 6f 6d 20 54 4b 5f 78 78 20 6f 70  te from TK_xx op
3350: 65 72 61 74 6f 72 20 74 6f 20 57 4f 5f 78 78 20  erator to WO_xx 
3360: 62 69 74 6d 61 73 6b 2e 0a 2a 2f 0a 73 74 61 74  bitmask..*/.stat
3370: 69 63 20 75 31 36 20 6f 70 65 72 61 74 6f 72 4d  ic u16 operatorM
3380: 61 73 6b 28 69 6e 74 20 6f 70 29 7b 0a 20 20 75  ask(int op){.  u
3390: 31 36 20 63 3b 0a 20 20 61 73 73 65 72 74 28 20  16 c;.  assert( 
33a0: 61 6c 6c 6f 77 65 64 4f 70 28 6f 70 29 20 29 3b  allowedOp(op) );
33b0: 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e  .  if( op==TK_IN
33c0: 20 29 7b 0a 20 20 20 20 63 20 3d 20 57 4f 5f 49   ){.    c = WO_I
33d0: 4e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  N;.  }else if( o
33e0: 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b 0a  p==TK_ISNULL ){.
33f0: 20 20 20 20 63 20 3d 20 57 4f 5f 49 53 4e 55 4c      c = WO_ISNUL
3400: 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  L;.  }else{.    
3410: 61 73 73 65 72 74 28 20 28 57 4f 5f 45 51 3c 3c  assert( (WO_EQ<<
3420: 28 6f 70 2d 54 4b 5f 45 51 29 29 20 3c 20 30 78  (op-TK_EQ)) < 0x
3430: 37 66 66 66 20 29 3b 0a 20 20 20 20 63 20 3d 20  7fff );.    c = 
3440: 28 75 31 36 29 28 57 4f 5f 45 51 3c 3c 28 6f 70  (u16)(WO_EQ<<(op
3450: 2d 54 4b 5f 45 51 29 29 3b 0a 20 20 7d 0a 20 20  -TK_EQ));.  }.  
3460: 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 49  assert( op!=TK_I
3470: 53 4e 55 4c 4c 20 7c 7c 20 63 3d 3d 57 4f 5f 49  SNULL || c==WO_I
3480: 53 4e 55 4c 4c 20 29 3b 0a 20 20 61 73 73 65 72  SNULL );.  asser
3490: 74 28 20 6f 70 21 3d 54 4b 5f 49 4e 20 7c 7c 20  t( op!=TK_IN || 
34a0: 63 3d 3d 57 4f 5f 49 4e 20 29 3b 0a 20 20 61 73  c==WO_IN );.  as
34b0: 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 45 51 20  sert( op!=TK_EQ 
34c0: 7c 7c 20 63 3d 3d 57 4f 5f 45 51 20 29 3b 0a 20  || c==WO_EQ );. 
34d0: 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f   assert( op!=TK_
34e0: 4c 54 20 7c 7c 20 63 3d 3d 57 4f 5f 4c 54 20 29  LT || c==WO_LT )
34f0: 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d  ;.  assert( op!=
3500: 54 4b 5f 4c 45 20 7c 7c 20 63 3d 3d 57 4f 5f 4c  TK_LE || c==WO_L
3510: 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f  E );.  assert( o
3520: 70 21 3d 54 4b 5f 47 54 20 7c 7c 20 63 3d 3d 57  p!=TK_GT || c==W
3530: 4f 5f 47 54 20 29 3b 0a 20 20 61 73 73 65 72 74  O_GT );.  assert
3540: 28 20 6f 70 21 3d 54 4b 5f 47 45 20 7c 7c 20 63  ( op!=TK_GE || c
3550: 3d 3d 57 4f 5f 47 45 20 29 3b 0a 20 20 72 65 74  ==WO_GE );.  ret
3560: 75 72 6e 20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn c;.}../*.** 
3570: 41 64 76 61 6e 63 65 20 74 6f 20 74 68 65 20 6e  Advance to the n
3580: 65 78 74 20 57 68 65 72 65 54 65 72 6d 20 74 68  ext WhereTerm th
3590: 61 74 20 6d 61 74 63 68 65 73 20 61 63 63 6f 72  at matches accor
35a0: 64 69 6e 67 20 74 6f 20 74 68 65 20 63 72 69 74  ding to the crit
35b0: 65 72 69 61 0a 2a 2a 20 65 73 74 61 62 6c 69 73  eria.** establis
35c0: 68 65 64 20 77 68 65 6e 20 74 68 65 20 70 53 63  hed when the pSc
35d0: 61 6e 20 6f 62 6a 65 63 74 20 77 61 73 20 69 6e  an object was in
35e0: 69 74 69 61 6c 69 7a 65 64 20 62 79 20 77 68 65  itialized by whe
35f0: 72 65 53 63 61 6e 49 6e 69 74 28 29 2e 0a 2a 2a  reScanInit()..**
3600: 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20   Return NULL if 
3610: 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72  there are no mor
3620: 65 20 6d 61 74 63 68 69 6e 67 20 57 68 65 72 65  e matching Where
3630: 54 65 72 6d 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  Terms..*/.static
3640: 20 57 68 65 72 65 54 65 72 6d 20 2a 77 68 65 72   WhereTerm *wher
3650: 65 53 63 61 6e 4e 65 78 74 28 57 68 65 72 65 53  eScanNext(WhereS
3660: 63 61 6e 20 2a 70 53 63 61 6e 29 7b 0a 20 20 69  can *pScan){.  i
3670: 6e 74 20 69 43 75 72 3b 20 20 20 20 20 20 20 20  nt iCur;        
3680: 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f      /* The curso
3690: 72 20 6f 6e 20 74 68 65 20 4c 48 53 20 6f 66 20  r on the LHS of 
36a0: 74 68 65 20 74 65 72 6d 20 2a 2f 0a 20 20 69 6e  the term */.  in
36b0: 74 20 69 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20  t iColumn;      
36c0: 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c 75 6d 6e     /* The column
36d0: 20 6f 6e 20 74 68 65 20 4c 48 53 20 6f 66 20 74   on the LHS of t
36e0: 68 65 20 74 65 72 6d 2e 20 20 2d 31 20 66 6f 72  he term.  -1 for
36f0: 20 49 50 4b 20 2a 2f 0a 20 20 45 78 70 72 20 2a   IPK */.  Expr *
3700: 70 58 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  pX;            /
3710: 2a 20 41 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  * An expression 
3720: 62 65 69 6e 67 20 74 65 73 74 65 64 20 2a 2f 0a  being tested */.
3730: 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
3740: 57 43 3b 20 20 20 20 2f 2a 20 53 68 6f 72 74 68  WC;    /* Shorth
3750: 61 6e 64 20 66 6f 72 20 70 53 63 61 6e 2d 3e 70  and for pScan->p
3760: 57 43 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  WC */.  WhereTer
3770: 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 2f 2a 20  m *pTerm;    /* 
3780: 54 68 65 20 74 65 72 6d 20 62 65 69 6e 67 20 74  The term being t
3790: 65 73 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6b  ested */.  int k
37a0: 20 3d 20 70 53 63 61 6e 2d 3e 6b 3b 20 20 20 20   = pScan->k;    
37b0: 2f 2a 20 57 68 65 72 65 20 74 6f 20 73 74 61 72  /* Where to star
37c0: 74 20 73 63 61 6e 6e 69 6e 67 20 2a 2f 0a 0a 20  t scanning */.. 
37d0: 20 77 68 69 6c 65 28 20 70 53 63 61 6e 2d 3e 69   while( pScan->i
37e0: 45 71 75 69 76 3c 3d 70 53 63 61 6e 2d 3e 6e 45  Equiv<=pScan->nE
37f0: 71 75 69 76 20 29 7b 0a 20 20 20 20 69 43 75 72  quiv ){.    iCur
3800: 20 3d 20 70 53 63 61 6e 2d 3e 61 45 71 75 69 76   = pScan->aEquiv
3810: 5b 70 53 63 61 6e 2d 3e 69 45 71 75 69 76 2d 32  [pScan->iEquiv-2
3820: 5d 3b 0a 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d  ];.    iColumn =
3830: 20 70 53 63 61 6e 2d 3e 61 45 71 75 69 76 5b 70   pScan->aEquiv[p
3840: 53 63 61 6e 2d 3e 69 45 71 75 69 76 2d 31 5d 3b  Scan->iEquiv-1];
3850: 0a 20 20 20 20 77 68 69 6c 65 28 20 28 70 57 43  .    while( (pWC
3860: 20 3d 20 70 53 63 61 6e 2d 3e 70 57 43 29 21 3d   = pScan->pWC)!=
3870: 30 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 70  0 ){.      for(p
3880: 54 65 72 6d 3d 70 57 43 2d 3e 61 2b 6b 3b 20 6b  Term=pWC->a+k; k
3890: 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 6b 2b 2b  <pWC->nTerm; k++
38a0: 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  , pTerm++){.    
38b0: 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c      if( pTerm->l
38c0: 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 0a  eftCursor==iCur.
38d0: 20 20 20 20 20 20 20 20 20 26 26 20 70 54 65 72           && pTer
38e0: 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3d  m->u.leftColumn=
38f0: 3d 69 43 6f 6c 75 6d 6e 0a 20 20 20 20 20 20 20  =iColumn.       
3900: 20 20 26 26 20 28 70 53 63 61 6e 2d 3e 69 45 71    && (pScan->iEq
3910: 75 69 76 3c 3d 32 20 7c 7c 20 21 45 78 70 72 48  uiv<=2 || !ExprH
3920: 61 73 50 72 6f 70 65 72 74 79 28 70 54 65 72 6d  asProperty(pTerm
3930: 2d 3e 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d  ->pExpr, EP_From
3940: 4a 6f 69 6e 29 29 0a 20 20 20 20 20 20 20 20 29  Join)).        )
3950: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
3960: 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  (pTerm->eOperato
3970: 72 20 26 20 57 4f 5f 45 51 55 49 56 29 21 3d 30  r & WO_EQUIV)!=0
3980: 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20 70  .           && p
3990: 53 63 61 6e 2d 3e 6e 45 71 75 69 76 3c 41 72 72  Scan->nEquiv<Arr
39a0: 61 79 53 69 7a 65 28 70 53 63 61 6e 2d 3e 61 45  aySize(pScan->aE
39b0: 71 75 69 76 29 0a 20 20 20 20 20 20 20 20 20 20  quiv).          
39c0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
39d0: 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20  nt j;.          
39e0: 20 20 70 58 20 3d 20 73 71 6c 69 74 65 33 45 78    pX = sqlite3Ex
39f0: 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 54  prSkipCollate(pT
3a00: 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67  erm->pExpr->pRig
3a10: 68 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ht);.           
3a20: 20 61 73 73 65 72 74 28 20 70 58 2d 3e 6f 70 3d   assert( pX->op=
3a30: 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20  =TK_COLUMN );.  
3a40: 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d            for(j=
3a50: 30 3b 20 6a 3c 70 53 63 61 6e 2d 3e 6e 45 71 75  0; j<pScan->nEqu
3a60: 69 76 3b 20 6a 2b 3d 32 29 7b 0a 20 20 20 20 20  iv; j+=2){.     
3a70: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 53 63           if( pSc
3a80: 61 6e 2d 3e 61 45 71 75 69 76 5b 6a 5d 3d 3d 70  an->aEquiv[j]==p
3a90: 58 2d 3e 69 54 61 62 6c 65 0a 20 20 20 20 20 20  X->iTable.      
3aa0: 20 20 20 20 20 20 20 20 20 26 26 20 70 53 63 61           && pSca
3ab0: 6e 2d 3e 61 45 71 75 69 76 5b 6a 2b 31 5d 3d 3d  n->aEquiv[j+1]==
3ac0: 70 58 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20  pX->iColumn ){. 
3ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ae0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
3af0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
3b00: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
3b10: 20 20 69 66 28 20 6a 3d 3d 70 53 63 61 6e 2d 3e    if( j==pScan->
3b20: 6e 45 71 75 69 76 20 29 7b 0a 20 20 20 20 20 20  nEquiv ){.      
3b30: 20 20 20 20 20 20 20 20 70 53 63 61 6e 2d 3e 61          pScan->a
3b40: 45 71 75 69 76 5b 6a 5d 20 3d 20 70 58 2d 3e 69  Equiv[j] = pX->i
3b50: 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 20  Table;.         
3b60: 20 20 20 20 20 70 53 63 61 6e 2d 3e 61 45 71 75       pScan->aEqu
3b70: 69 76 5b 6a 2b 31 5d 20 3d 20 70 58 2d 3e 69 43  iv[j+1] = pX->iC
3b80: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 20  olumn;.         
3b90: 20 20 20 20 20 70 53 63 61 6e 2d 3e 6e 45 71 75       pScan->nEqu
3ba0: 69 76 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 20  iv += 2;.       
3bb0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
3bc0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
3bd0: 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74   (pTerm->eOperat
3be0: 6f 72 20 26 20 70 53 63 61 6e 2d 3e 6f 70 4d 61  or & pScan->opMa
3bf0: 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  sk)!=0 ){.      
3c00: 20 20 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20        /* Verify 
3c10: 74 68 65 20 61 66 66 69 6e 69 74 79 20 61 6e 64  the affinity and
3c20: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
3c30: 6e 63 65 20 6d 61 74 63 68 20 2a 2f 0a 20 20 20  nce match */.   
3c40: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 53 63           if( pSc
3c50: 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65 20 26 26  an->zCollName &&
3c60: 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74   (pTerm->eOperat
3c70: 6f 72 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 29 3d  or & WO_ISNULL)=
3c80: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
3c90: 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
3ca0: 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ll;.            
3cb0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20    Parse *pParse 
3cc0: 3d 20 70 57 43 2d 3e 70 57 49 6e 66 6f 2d 3e 70  = pWC->pWInfo->p
3cd0: 50 61 72 73 65 3b 0a 20 20 20 20 20 20 20 20 20  Parse;.         
3ce0: 20 20 20 20 20 70 58 20 3d 20 70 54 65 72 6d 2d       pX = pTerm-
3cf0: 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  >pExpr;.        
3d00: 20 20 20 20 20 20 69 66 28 20 21 73 71 6c 69 74        if( !sqlit
3d10: 65 33 49 6e 64 65 78 41 66 66 69 6e 69 74 79 4f  e3IndexAffinityO
3d20: 6b 28 70 58 2c 20 70 53 63 61 6e 2d 3e 69 64 78  k(pX, pScan->idx
3d30: 61 66 66 29 20 29 7b 0a 20 20 20 20 20 20 20 20  aff) ){.        
3d40: 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
3d50: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
3d60: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
3d70: 61 73 73 65 72 74 28 70 58 2d 3e 70 4c 65 66 74  assert(pX->pLeft
3d80: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
3d90: 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
3da0: 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c  BinaryCompareCol
3db0: 6c 53 65 71 28 70 50 61 72 73 65 2c 0a 20 20 20  lSeq(pParse,.   
3dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
3df0: 58 2d 3e 70 4c 65 66 74 2c 20 70 58 2d 3e 70 52  X->pLeft, pX->pR
3e00: 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20 20  ight);.         
3e10: 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 3d 3d       if( pColl==
3e20: 30 20 29 20 70 43 6f 6c 6c 20 3d 20 70 50 61 72  0 ) pColl = pPar
3e30: 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c  se->db->pDfltCol
3e40: 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  l;.             
3e50: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
3e60: 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  Cmp(pColl->zName
3e70: 2c 20 70 53 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61  , pScan->zCollNa
3e80: 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  me) ){.         
3e90: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
3ea0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
3eb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
3ec0: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28             if( (
3ed0: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
3ee0: 20 26 20 57 4f 5f 45 51 29 21 3d 30 0a 20 20 20   & WO_EQ)!=0.   
3ef0: 20 20 20 20 20 20 20 20 20 20 26 26 20 28 70 58            && (pX
3f00: 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d   = pTerm->pExpr-
3f10: 3e 70 52 69 67 68 74 29 2d 3e 6f 70 3d 3d 54 4b  >pRight)->op==TK
3f20: 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20 20 20 20 20  _COLUMN.        
3f30: 20 20 20 20 20 26 26 20 70 58 2d 3e 69 54 61 62       && pX->iTab
3f40: 6c 65 3d 3d 70 53 63 61 6e 2d 3e 61 45 71 75 69  le==pScan->aEqui
3f50: 76 5b 30 5d 0a 20 20 20 20 20 20 20 20 20 20 20  v[0].           
3f60: 20 20 26 26 20 70 58 2d 3e 69 43 6f 6c 75 6d 6e    && pX->iColumn
3f70: 3d 3d 70 53 63 61 6e 2d 3e 61 45 71 75 69 76 5b  ==pScan->aEquiv[
3f80: 31 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 29  1].            )
3f90: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
3fa0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
3fb0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
3fc0: 20 20 20 20 70 53 63 61 6e 2d 3e 6b 20 3d 20 6b      pScan->k = k
3fd0: 2b 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +1;.            
3fe0: 72 65 74 75 72 6e 20 70 54 65 72 6d 3b 0a 20 20  return pTerm;.  
3ff0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
4000: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
4010: 20 20 70 53 63 61 6e 2d 3e 70 57 43 20 3d 20 70    pScan->pWC = p
4020: 53 63 61 6e 2d 3e 70 57 43 2d 3e 70 4f 75 74 65  Scan->pWC->pOute
4030: 72 3b 0a 20 20 20 20 20 20 6b 20 3d 20 30 3b 0a  r;.      k = 0;.
4040: 20 20 20 20 7d 0a 20 20 20 20 70 53 63 61 6e 2d      }.    pScan-
4050: 3e 70 57 43 20 3d 20 70 53 63 61 6e 2d 3e 70 4f  >pWC = pScan->pO
4060: 72 69 67 57 43 3b 0a 20 20 20 20 6b 20 3d 20 30  rigWC;.    k = 0
4070: 3b 0a 20 20 20 20 70 53 63 61 6e 2d 3e 69 45 71  ;.    pScan->iEq
4080: 75 69 76 20 2b 3d 20 32 3b 0a 20 20 7d 0a 20 20  uiv += 2;.  }.  
4090: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
40a0: 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 20  ** Initialize a 
40b0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 73 63 61  WHERE clause sca
40c0: 6e 6e 65 72 20 6f 62 6a 65 63 74 2e 20 20 52 65  nner object.  Re
40d0: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
40e0: 6f 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 6d  o the.** first m
40f0: 61 74 63 68 2e 20 20 52 65 74 75 72 6e 20 4e 55  atch.  Return NU
4100: 4c 4c 20 69 66 20 74 68 65 72 65 20 61 72 65 20  LL if there are 
4110: 6e 6f 20 6d 61 74 63 68 65 73 2e 0a 2a 2a 0a 2a  no matches..**.*
4120: 2a 20 54 68 65 20 73 63 61 6e 6e 65 72 20 77 69  * The scanner wi
4130: 6c 6c 20 62 65 20 73 65 61 72 63 68 69 6e 67 20  ll be searching 
4140: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
4150: 20 70 57 43 2e 20 20 49 74 20 77 69 6c 6c 20 6c   pWC.  It will l
4160: 6f 6f 6b 0a 2a 2a 20 66 6f 72 20 74 65 72 6d 73  ook.** for terms
4170: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 58 20   of the form "X 
4180: 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 20 77 68 65  <op> <expr>" whe
4190: 72 65 20 58 20 69 73 20 63 6f 6c 75 6d 6e 20 69  re X is column i
41a0: 43 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65 0a  Column of table.
41b0: 2a 2a 20 69 43 75 72 2e 20 20 54 68 65 20 3c 6f  ** iCur.  The <o
41c0: 70 3e 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f  p> must be one o
41d0: 66 20 74 68 65 20 6f 70 65 72 61 74 6f 72 73 20  f the operators 
41e0: 64 65 73 63 72 69 62 65 64 20 62 79 20 6f 70 4d  described by opM
41f0: 61 73 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ask..**.** If th
4200: 65 20 73 65 61 72 63 68 20 69 73 20 66 6f 72 20  e search is for 
4210: 58 20 61 6e 64 20 74 68 65 20 57 48 45 52 45 20  X and the WHERE 
4220: 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20  clause contains 
4230: 74 65 72 6d 73 20 6f 66 20 74 68 65 0a 2a 2a 20  terms of the.** 
4240: 66 6f 72 6d 20 58 3d 59 20 74 68 65 6e 20 74 68  form X=Y then th
4250: 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74  is routine might
4260: 20 61 6c 73 6f 20 72 65 74 75 72 6e 20 74 65 72   also return ter
4270: 6d 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a 2a  ms of the form.*
4280: 2a 20 22 59 20 3c 6f 70 3e 20 3c 65 78 70 72 3e  * "Y <op> <expr>
4290: 22 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20 6f  ".  The number o
42a0: 66 20 6c 65 76 65 6c 73 20 6f 66 20 74 72 61 6e  f levels of tran
42b0: 73 69 74 69 76 69 74 79 20 69 73 20 6c 69 6d 69  sitivity is limi
42c0: 74 65 64 2c 0a 2a 2a 20 62 75 74 20 69 73 20 65  ted,.** but is e
42d0: 6e 6f 75 67 68 20 74 6f 20 68 61 6e 64 6c 65 20  nough to handle 
42e0: 6d 6f 73 74 20 63 6f 6d 6d 6f 6e 6c 79 20 6f 63  most commonly oc
42f0: 63 75 72 72 69 6e 67 20 53 51 4c 20 73 74 61 74  curring SQL stat
4300: 65 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  ements..**.** If
4310: 20 58 20 69 73 20 6e 6f 74 20 74 68 65 20 49 4e   X is not the IN
4320: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
4330: 59 20 74 68 65 6e 20 58 20 6d 75 73 74 20 62 65  Y then X must be
4340: 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68   compatible with
4350: 0a 2a 2a 20 69 6e 64 65 78 20 70 49 64 78 2e 0a  .** index pIdx..
4360: 2a 2f 0a 73 74 61 74 69 63 20 57 68 65 72 65 54  */.static WhereT
4370: 65 72 6d 20 2a 77 68 65 72 65 53 63 61 6e 49 6e  erm *whereScanIn
4380: 69 74 28 0a 20 20 57 68 65 72 65 53 63 61 6e 20  it(.  WhereScan 
4390: 2a 70 53 63 61 6e 2c 20 20 20 20 20 20 20 2f 2a  *pScan,       /*
43a0: 20 54 68 65 20 57 68 65 72 65 53 63 61 6e 20 6f   The WhereScan o
43b0: 62 6a 65 63 74 20 62 65 69 6e 67 20 69 6e 69 74  bject being init
43c0: 69 61 6c 69 7a 65 64 20 2a 2f 0a 20 20 57 68 65  ialized */.  Whe
43d0: 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20  reClause *pWC,  
43e0: 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
43f0: 45 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20 73  E clause to be s
4400: 63 61 6e 6e 65 64 20 2a 2f 0a 20 20 69 6e 74 20  canned */.  int 
4410: 69 43 75 72 2c 20 20 20 20 20 20 20 20 20 20 20  iCur,           
4420: 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 74 6f      /* Cursor to
4430: 20 73 63 61 6e 20 66 6f 72 20 2a 2f 0a 20 20 69   scan for */.  i
4440: 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20  nt iColumn,     
4450: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e         /* Column
4460: 20 74 6f 20 73 63 61 6e 20 66 6f 72 20 2a 2f 0a   to scan for */.
4470: 20 20 75 33 32 20 6f 70 4d 61 73 6b 2c 20 20 20    u32 opMask,   
4480: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65            /* Ope
4490: 72 61 74 6f 72 28 73 29 20 74 6f 20 73 63 61 6e  rator(s) to scan
44a0: 20 66 6f 72 20 2a 2f 0a 20 20 49 6e 64 65 78 20   for */.  Index 
44b0: 2a 70 49 64 78 20 20 20 20 20 20 20 20 20 20 20  *pIdx           
44c0: 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 63 6f 6d    /* Must be com
44d0: 70 61 74 69 62 6c 65 20 77 69 74 68 20 74 68 69  patible with thi
44e0: 73 20 69 6e 64 65 78 20 2a 2f 0a 29 7b 0a 20 20  s index */.){.  
44f0: 69 6e 74 20 6a 3b 0a 0a 20 20 2f 2a 20 6d 65 6d  int j;..  /* mem
4500: 73 65 74 28 70 53 63 61 6e 2c 20 30 2c 20 73 69  set(pScan, 0, si
4510: 7a 65 6f 66 28 2a 70 53 63 61 6e 29 29 3b 20 2a  zeof(*pScan)); *
4520: 2f 0a 20 20 70 53 63 61 6e 2d 3e 70 4f 72 69 67  /.  pScan->pOrig
4530: 57 43 20 3d 20 70 57 43 3b 0a 20 20 70 53 63 61  WC = pWC;.  pSca
4540: 6e 2d 3e 70 57 43 20 3d 20 70 57 43 3b 0a 20 20  n->pWC = pWC;.  
4550: 69 66 28 20 70 49 64 78 20 26 26 20 69 43 6f 6c  if( pIdx && iCol
4560: 75 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20 20 70 53  umn>=0 ){.    pS
4570: 63 61 6e 2d 3e 69 64 78 61 66 66 20 3d 20 70 49  can->idxaff = pI
4580: 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c  dx->pTable->aCol
4590: 5b 69 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69  [iColumn].affini
45a0: 74 79 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ty;.    for(j=0;
45b0: 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
45c0: 6a 5d 21 3d 69 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b  j]!=iColumn; j++
45d0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 4e 45 56  ){.      if( NEV
45e0: 45 52 28 6a 3e 70 49 64 78 2d 3e 6e 43 6f 6c 75  ER(j>pIdx->nColu
45f0: 6d 6e 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  mn) ) return 0;.
4600: 20 20 20 20 7d 0a 20 20 20 20 70 53 63 61 6e 2d      }.    pScan-
4610: 3e 7a 43 6f 6c 6c 4e 61 6d 65 20 3d 20 70 49 64  >zCollName = pId
4620: 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20  x->azColl[j];.  
4630: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 53 63 61 6e  }else{.    pScan
4640: 2d 3e 69 64 78 61 66 66 20 3d 20 30 3b 0a 20 20  ->idxaff = 0;.  
4650: 20 20 70 53 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61    pScan->zCollNa
4660: 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 53  me = 0;.  }.  pS
4670: 63 61 6e 2d 3e 6f 70 4d 61 73 6b 20 3d 20 6f 70  can->opMask = op
4680: 4d 61 73 6b 3b 0a 20 20 70 53 63 61 6e 2d 3e 6b  Mask;.  pScan->k
4690: 20 3d 20 30 3b 0a 20 20 70 53 63 61 6e 2d 3e 61   = 0;.  pScan->a
46a0: 45 71 75 69 76 5b 30 5d 20 3d 20 69 43 75 72 3b  Equiv[0] = iCur;
46b0: 0a 20 20 70 53 63 61 6e 2d 3e 61 45 71 75 69 76  .  pScan->aEquiv
46c0: 5b 31 5d 20 3d 20 69 43 6f 6c 75 6d 6e 3b 0a 20  [1] = iColumn;. 
46d0: 20 70 53 63 61 6e 2d 3e 6e 45 71 75 69 76 20 3d   pScan->nEquiv =
46e0: 20 32 3b 0a 20 20 70 53 63 61 6e 2d 3e 69 45 71   2;.  pScan->iEq
46f0: 75 69 76 20 3d 20 32 3b 0a 20 20 72 65 74 75 72  uiv = 2;.  retur
4700: 6e 20 77 68 65 72 65 53 63 61 6e 4e 65 78 74 28  n whereScanNext(
4710: 70 53 63 61 6e 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pScan);.}../*.**
4720: 20 53 65 61 72 63 68 20 66 6f 72 20 61 20 74 65   Search for a te
4730: 72 6d 20 69 6e 20 74 68 65 20 57 48 45 52 45 20  rm in the WHERE 
4740: 63 6c 61 75 73 65 20 74 68 61 74 20 69 73 20 6f  clause that is o
4750: 66 20 74 68 65 20 66 6f 72 6d 20 22 58 20 3c 6f  f the form "X <o
4760: 70 3e 20 3c 65 78 70 72 3e 22 0a 2a 2a 20 77 68  p> <expr>".** wh
4770: 65 72 65 20 58 20 69 73 20 61 20 72 65 66 65 72  ere X is a refer
4780: 65 6e 63 65 20 74 6f 20 74 68 65 20 69 43 6f 6c  ence to the iCol
4790: 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20 69 43 75  umn of table iCu
47a0: 72 20 61 6e 64 20 3c 6f 70 3e 20 69 73 20 6f 6e  r and <op> is on
47b0: 65 20 6f 66 0a 2a 2a 20 74 68 65 20 57 4f 5f 78  e of.** the WO_x
47c0: 78 20 6f 70 65 72 61 74 6f 72 20 63 6f 64 65 73  x operator codes
47d0: 20 73 70 65 63 69 66 69 65 64 20 62 79 20 74 68   specified by th
47e0: 65 20 6f 70 20 70 61 72 61 6d 65 74 65 72 2e 0a  e op parameter..
47f0: 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
4800: 74 65 72 20 74 6f 20 74 68 65 20 74 65 72 6d 2e  ter to the term.
4810: 20 20 52 65 74 75 72 6e 20 30 20 69 66 20 6e 6f    Return 0 if no
4820: 74 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 54  t found..**.** T
4830: 68 65 20 74 65 72 6d 20 72 65 74 75 72 6e 65 64  he term returned
4840: 20 6d 69 67 68 74 20 62 79 20 59 3d 3c 65 78 70   might by Y=<exp
4850: 72 3e 20 69 66 20 74 68 65 72 65 20 69 73 20 61  r> if there is a
4860: 6e 6f 74 68 65 72 20 63 6f 6e 73 74 72 61 69 6e  nother constrain
4870: 74 20 69 6e 0a 2a 2a 20 74 68 65 20 57 48 45 52  t in.** the WHER
4880: 45 20 63 6c 61 75 73 65 20 74 68 61 74 20 73 70  E clause that sp
4890: 65 63 69 66 69 65 73 20 74 68 61 74 20 58 3d 59  ecifies that X=Y
48a0: 2e 20 20 41 6e 79 20 73 75 63 68 20 63 6f 6e 73  .  Any such cons
48b0: 74 72 61 69 6e 74 73 20 77 69 6c 6c 20 62 65 0a  traints will be.
48c0: 2a 2a 20 69 64 65 6e 74 69 66 69 65 64 20 62 79  ** identified by
48d0: 20 74 68 65 20 57 4f 5f 45 51 55 49 56 20 62 69   the WO_EQUIV bi
48e0: 74 20 69 6e 20 74 68 65 20 70 54 65 72 6d 2d 3e  t in the pTerm->
48f0: 65 4f 70 65 72 61 74 6f 72 20 66 69 65 6c 64 2e  eOperator field.
4900: 20 20 54 68 65 0a 2a 2a 20 61 45 71 75 69 76 5b    The.** aEquiv[
4910: 5d 20 61 72 72 61 79 20 68 6f 6c 64 73 20 58 20  ] array holds X 
4920: 61 6e 64 20 61 6c 6c 20 69 74 73 20 65 71 75 69  and all its equi
4930: 76 61 6c 65 6e 74 73 2c 20 77 69 74 68 20 65 61  valents, with ea
4940: 63 68 20 53 51 4c 20 76 61 72 69 61 62 6c 65 0a  ch SQL variable.
4950: 2a 2a 20 74 61 6b 69 6e 67 20 75 70 20 74 77 6f  ** taking up two
4960: 20 73 6c 6f 74 73 20 69 6e 20 61 45 71 75 69 76   slots in aEquiv
4970: 5b 5d 2e 20 20 54 68 65 20 66 69 72 73 74 20 73  [].  The first s
4980: 6c 6f 74 20 69 73 20 66 6f 72 20 74 68 65 20 63  lot is for the c
4990: 75 72 73 6f 72 20 6e 75 6d 62 65 72 0a 2a 2a 20  ursor number.** 
49a0: 61 6e 64 20 74 68 65 20 73 65 63 6f 6e 64 20 69  and the second i
49b0: 73 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e  s for the column
49c0: 20 6e 75 6d 62 65 72 2e 20 20 54 68 65 72 65 20   number.  There 
49d0: 61 72 65 20 32 32 20 73 6c 6f 74 73 20 69 6e 20  are 22 slots in 
49e0: 61 45 71 75 69 76 5b 5d 0a 2a 2a 20 73 6f 20 74  aEquiv[].** so t
49f0: 68 61 74 20 6d 65 61 6e 73 20 77 65 20 63 61 6e  hat means we can
4a00: 20 6c 6f 6f 6b 20 66 6f 72 20 58 20 70 6c 75 73   look for X plus
4a10: 20 75 70 20 74 6f 20 31 30 20 6f 74 68 65 72 20   up to 10 other 
4a20: 65 71 75 69 76 61 6c 65 6e 74 20 76 61 6c 75 65  equivalent value
4a30: 73 2e 0a 2a 2a 20 48 65 6e 63 65 20 61 20 73 65  s..** Hence a se
4a40: 61 72 63 68 20 66 6f 72 20 58 20 77 69 6c 6c 20  arch for X will 
4a50: 72 65 74 75 72 6e 20 3c 65 78 70 72 3e 20 69 66  return <expr> if
4a60: 20 58 3d 41 31 20 61 6e 64 20 41 31 3d 41 32 20   X=A1 and A1=A2 
4a70: 61 6e 64 20 41 32 3d 41 33 0a 2a 2a 20 61 6e 64  and A2=A3.** and
4a80: 20 2e 2e 2e 20 61 6e 64 20 41 39 3d 41 31 30 20   ... and A9=A10 
4a90: 61 6e 64 20 41 31 30 3d 3c 65 78 70 72 3e 2e 0a  and A10=<expr>..
4aa0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61  **.** If there a
4ab0: 72 65 20 6d 75 6c 74 69 70 6c 65 20 74 65 72 6d  re multiple term
4ac0: 73 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63  s in the WHERE c
4ad0: 6c 61 75 73 65 20 6f 66 20 74 68 65 20 66 6f 72  lause of the for
4ae0: 6d 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e  m "X <op> <expr>
4af0: 22 0a 2a 2a 20 74 68 65 6e 20 74 72 79 20 66 6f  ".** then try fo
4b00: 72 20 74 68 65 20 6f 6e 65 20 77 69 74 68 20 6e  r the one with n
4b10: 6f 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20 6f  o dependencies o
4b20: 6e 20 3c 65 78 70 72 3e 20 2d 20 69 6e 20 6f 74  n <expr> - in ot
4b30: 68 65 72 20 77 6f 72 64 73 20 77 68 65 72 65 0a  her words where.
4b40: 2a 2a 20 3c 65 78 70 72 3e 20 69 73 20 61 20 63  ** <expr> is a c
4b50: 6f 6e 73 74 61 6e 74 20 65 78 70 72 65 73 73 69  onstant expressi
4b60: 6f 6e 20 6f 66 20 73 6f 6d 65 20 6b 69 6e 64 2e  on of some kind.
4b70: 20 20 4f 6e 6c 79 20 72 65 74 75 72 6e 20 65 6e    Only return en
4b80: 74 72 69 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20  tries of.** the 
4b90: 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 59 22 20  form "X <op> Y" 
4ba0: 77 68 65 72 65 20 59 20 69 73 20 61 20 63 6f 6c  where Y is a col
4bb0: 75 6d 6e 20 69 6e 20 61 6e 6f 74 68 65 72 20 74  umn in another t
4bc0: 61 62 6c 65 20 69 66 20 6e 6f 20 74 65 72 6d 73  able if no terms
4bd0: 20 6f 66 0a 2a 2a 20 74 68 65 20 66 6f 72 6d 20   of.** the form 
4be0: 22 58 20 3c 6f 70 3e 20 3c 63 6f 6e 73 74 2d 65  "X <op> <const-e
4bf0: 78 70 72 3e 22 20 65 78 69 73 74 2e 20 20 20 49  xpr>" exist.   I
4c00: 66 20 6e 6f 20 74 65 72 6d 73 20 77 69 74 68 20  f no terms with 
4c10: 61 20 63 6f 6e 73 74 61 6e 74 20 52 48 53 0a 2a  a constant RHS.*
4c20: 2a 20 65 78 69 73 74 2c 20 74 72 79 20 74 6f 20  * exist, try to 
4c30: 72 65 74 75 72 6e 20 61 20 74 65 72 6d 20 74 68  return a term th
4c40: 61 74 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  at does not use 
4c50: 57 4f 5f 45 51 55 49 56 2e 0a 2a 2f 0a 73 74 61  WO_EQUIV..*/.sta
4c60: 74 69 63 20 57 68 65 72 65 54 65 72 6d 20 2a 66  tic WhereTerm *f
4c70: 69 6e 64 54 65 72 6d 28 0a 20 20 57 68 65 72 65  indTerm(.  Where
4c80: 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20  Clause *pWC,    
4c90: 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c   /* The WHERE cl
4ca0: 61 75 73 65 20 74 6f 20 62 65 20 73 65 61 72 63  ause to be searc
4cb0: 68 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75  hed */.  int iCu
4cc0: 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  r,             /
4cd0: 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  * Cursor number 
4ce0: 6f 66 20 4c 48 53 20 2a 2f 0a 20 20 69 6e 74 20  of LHS */.  int 
4cf0: 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 20 20  iColumn,        
4d00: 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62    /* Column numb
4d10: 65 72 20 6f 66 20 4c 48 53 20 2a 2f 0a 20 20 42  er of LHS */.  B
4d20: 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c  itmask notReady,
4d30: 20 20 20 20 20 2f 2a 20 52 48 53 20 6d 75 73 74       /* RHS must
4d40: 20 6e 6f 74 20 6f 76 65 72 6c 61 70 20 77 69 74   not overlap wit
4d50: 68 20 74 68 69 73 20 6d 61 73 6b 20 2a 2f 0a 20  h this mask */. 
4d60: 20 75 33 32 20 6f 70 2c 20 20 20 20 20 20 20 20   u32 op,        
4d70: 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
4d80: 66 20 57 4f 5f 78 78 20 76 61 6c 75 65 73 20 64  f WO_xx values d
4d90: 65 73 63 72 69 62 69 6e 67 20 6f 70 65 72 61 74  escribing operat
4da0: 6f 72 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  or */.  Index *p
4db0: 49 64 78 20 20 20 20 20 20 20 20 20 20 20 2f 2a  Idx           /*
4dc0: 20 4d 75 73 74 20 62 65 20 63 6f 6d 70 61 74 69   Must be compati
4dd0: 62 6c 65 20 77 69 74 68 20 74 68 69 73 20 69 6e  ble with this in
4de0: 64 65 78 2c 20 69 66 20 6e 6f 74 20 4e 55 4c 4c  dex, if not NULL
4df0: 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 54 65   */.){.  WhereTe
4e00: 72 6d 20 2a 70 52 65 73 75 6c 74 20 3d 20 30 3b  rm *pResult = 0;
4e10: 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 3b  .  WhereTerm *p;
4e20: 0a 20 20 57 68 65 72 65 53 63 61 6e 20 73 63 61  .  WhereScan sca
4e30: 6e 3b 0a 0a 20 20 70 20 3d 20 77 68 65 72 65 53  n;..  p = whereS
4e40: 63 61 6e 49 6e 69 74 28 26 73 63 61 6e 2c 20 70  canInit(&scan, p
4e50: 57 43 2c 20 69 43 75 72 2c 20 69 43 6f 6c 75 6d  WC, iCur, iColum
4e60: 6e 2c 20 6f 70 2c 20 70 49 64 78 29 3b 0a 20 20  n, op, pIdx);.  
4e70: 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20  while( p ){.    
4e80: 69 66 28 20 28 70 2d 3e 70 72 65 72 65 71 52 69  if( (p->prereqRi
4e90: 67 68 74 20 26 20 6e 6f 74 52 65 61 64 79 29 3d  ght & notReady)=
4ea0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
4eb0: 70 2d 3e 70 72 65 72 65 71 52 69 67 68 74 3d 3d  p->prereqRight==
4ec0: 30 20 26 26 20 28 70 2d 3e 65 4f 70 65 72 61 74  0 && (p->eOperat
4ed0: 6f 72 26 57 4f 5f 45 51 29 21 3d 30 20 29 7b 0a  or&WO_EQ)!=0 ){.
4ee0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70          return p
4ef0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
4f00: 69 66 28 20 70 52 65 73 75 6c 74 3d 3d 30 20 29  if( pResult==0 )
4f10: 20 70 52 65 73 75 6c 74 20 3d 20 70 3b 0a 20 20   pResult = p;.  
4f20: 20 20 7d 0a 20 20 20 20 70 20 3d 20 77 68 65 72    }.    p = wher
4f30: 65 53 63 61 6e 4e 65 78 74 28 26 73 63 61 6e 29  eScanNext(&scan)
4f40: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
4f50: 52 65 73 75 6c 74 3b 0a 7d 0a 0a 2f 2a 20 46 6f  Result;.}../* Fo
4f60: 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20  rward reference 
4f70: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
4f80: 78 70 72 41 6e 61 6c 79 7a 65 28 53 72 63 4c 69  xprAnalyze(SrcLi
4f90: 73 74 2a 2c 20 57 68 65 72 65 43 6c 61 75 73 65  st*, WhereClause
4fa0: 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20  *, int);../*.** 
4fb0: 43 61 6c 6c 20 65 78 70 72 41 6e 61 6c 79 7a 65  Call exprAnalyze
4fc0: 20 6f 6e 20 61 6c 6c 20 74 65 72 6d 73 20 69 6e   on all terms in
4fd0: 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e   a WHERE clause.
4fe0: 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69    .*/.static voi
4ff0: 64 20 65 78 70 72 41 6e 61 6c 79 7a 65 41 6c 6c  d exprAnalyzeAll
5000: 28 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  (.  SrcList *pTa
5010: 62 4c 69 73 74 2c 20 20 20 20 20 20 20 2f 2a 20  bList,       /* 
5020: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
5030: 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  */.  WhereClause
5040: 20 2a 70 57 43 20 20 20 20 20 20 20 20 20 2f 2a   *pWC         /*
5050: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
5060: 65 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64  e to be analyzed
5070: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   */.){.  int i;.
5080: 20 20 66 6f 72 28 69 3d 70 57 43 2d 3e 6e 54 65    for(i=pWC->nTe
5090: 72 6d 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29  rm-1; i>=0; i--)
50a0: 7b 0a 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a  {.    exprAnalyz
50b0: 65 28 70 54 61 62 4c 69 73 74 2c 20 70 57 43 2c  e(pTabList, pWC,
50c0: 20 69 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e   i);.  }.}..#ifn
50d0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
50e0: 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  LIKE_OPTIMIZATIO
50f0: 4e 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f  N./*.** Check to
5100: 20 73 65 65 20 69 66 20 74 68 65 20 67 69 76 65   see if the give
5110: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  n expression is 
5120: 61 20 4c 49 4b 45 20 6f 72 20 47 4c 4f 42 20 6f  a LIKE or GLOB o
5130: 70 65 72 61 74 6f 72 20 74 68 61 74 0a 2a 2a 20  perator that.** 
5140: 63 61 6e 20 62 65 20 6f 70 74 69 6d 69 7a 65 64  can be optimized
5150: 20 75 73 69 6e 67 20 69 6e 65 71 75 61 6c 69 74   using inequalit
5160: 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 20 20  y constraints.  
5170: 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 69  Return TRUE if i
5180: 74 20 69 73 0a 2a 2a 20 73 6f 20 61 6e 64 20 66  t is.** so and f
5190: 61 6c 73 65 20 69 66 20 6e 6f 74 2e 0a 2a 2a 0a  alse if not..**.
51a0: 2a 2a 20 49 6e 20 6f 72 64 65 72 20 66 6f 72 20  ** In order for 
51b0: 74 68 65 20 6f 70 65 72 61 74 6f 72 20 74 6f 20  the operator to 
51c0: 62 65 20 6f 70 74 69 6d 69 7a 69 62 6c 65 2c 20  be optimizible, 
51d0: 74 68 65 20 52 48 53 20 6d 75 73 74 20 62 65 20  the RHS must be 
51e0: 61 20 73 74 72 69 6e 67 0a 2a 2a 20 6c 69 74 65  a string.** lite
51f0: 72 61 6c 20 74 68 61 74 20 64 6f 65 73 20 6e 6f  ral that does no
5200: 74 20 62 65 67 69 6e 20 77 69 74 68 20 61 20 77  t begin with a w
5210: 69 6c 64 63 61 72 64 2e 20 20 0a 2a 2f 0a 73 74  ildcard.  .*/.st
5220: 61 74 69 63 20 69 6e 74 20 69 73 4c 69 6b 65 4f  atic int isLikeO
5230: 72 47 6c 6f 62 28 0a 20 20 50 61 72 73 65 20 2a  rGlob(.  Parse *
5240: 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61  pParse,    /* Pa
5250: 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67  rsing and code g
5260: 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78  enerating contex
5270: 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78  t */.  Expr *pEx
5280: 70 72 2c 20 20 20 20 20 20 2f 2a 20 54 65 73 74  pr,      /* Test
5290: 20 74 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e   this expression
52a0: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 2a 70 70 50   */.  Expr **ppP
52b0: 72 65 66 69 78 2c 20 20 2f 2a 20 50 6f 69 6e 74  refix,  /* Point
52c0: 65 72 20 74 6f 20 54 4b 5f 53 54 52 49 4e 47 20  er to TK_STRING 
52d0: 65 78 70 72 65 73 73 69 6f 6e 20 77 69 74 68 20  expression with 
52e0: 70 61 74 74 65 72 6e 20 70 72 65 66 69 78 20 2a  pattern prefix *
52f0: 2f 0a 20 20 69 6e 74 20 2a 70 69 73 43 6f 6d 70  /.  int *pisComp
5300: 6c 65 74 65 2c 20 2f 2a 20 54 72 75 65 20 69 66  lete, /* True if
5310: 20 74 68 65 20 6f 6e 6c 79 20 77 69 6c 64 63 61   the only wildca
5320: 72 64 20 69 73 20 25 20 69 6e 20 74 68 65 20 6c  rd is % in the l
5330: 61 73 74 20 63 68 61 72 61 63 74 65 72 20 2a 2f  ast character */
5340: 0a 20 20 69 6e 74 20 2a 70 6e 6f 43 61 73 65 20  .  int *pnoCase 
5350: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
5360: 75 70 70 65 72 63 61 73 65 20 69 73 20 65 71 75  uppercase is equ
5370: 69 76 61 6c 65 6e 74 20 74 6f 20 6c 6f 77 65 72  ivalent to lower
5380: 63 61 73 65 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e  case */.){.  con
5390: 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 30 3b 20  st char *z = 0; 
53a0: 20 20 20 20 20 20 20 20 2f 2a 20 53 74 72 69 6e          /* Strin
53b0: 67 20 6f 6e 20 52 48 53 20 6f 66 20 4c 49 4b 45  g on RHS of LIKE
53c0: 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 45   operator */.  E
53d0: 78 70 72 20 2a 70 52 69 67 68 74 2c 20 2a 70 4c  xpr *pRight, *pL
53e0: 65 66 74 3b 20 20 20 20 20 20 2f 2a 20 52 69 67  eft;      /* Rig
53f0: 68 74 20 61 6e 64 20 6c 65 66 74 20 73 69 7a 65  ht and left size
5400: 20 6f 66 20 4c 49 4b 45 20 6f 70 65 72 61 74 6f   of LIKE operato
5410: 72 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  r */.  ExprList 
5420: 2a 70 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20  *pList;         
5430: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 6f 70 65    /* List of ope
5440: 72 61 6e 64 73 20 74 6f 20 74 68 65 20 4c 49 4b  rands to the LIK
5450: 45 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  E operator */.  
5460: 69 6e 74 20 63 3b 20 20 20 20 20 20 20 20 20 20  int c;          
5470: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e             /* On
5480: 65 20 63 68 61 72 61 63 74 65 72 20 69 6e 20 7a  e character in z
5490: 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 3b  [] */.  int cnt;
54a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
54b0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
54c0: 6e 6f 6e 2d 77 69 6c 64 63 61 72 64 20 70 72 65  non-wildcard pre
54d0: 66 69 78 20 63 68 61 72 61 63 74 65 72 73 20 2a  fix characters *
54e0: 2f 0a 20 20 63 68 61 72 20 77 63 5b 33 5d 3b 20  /.  char wc[3]; 
54f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5500: 2a 20 57 69 6c 64 63 61 72 64 20 63 68 61 72 61  * Wildcard chara
5510: 63 74 65 72 73 20 2a 2f 0a 20 20 73 71 6c 69 74  cters */.  sqlit
5520: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
5530: 3e 64 62 3b 20 20 2f 2a 20 44 61 74 61 62 61 73  >db;  /* Databas
5540: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
5550: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
5560: 2a 70 56 61 6c 20 3d 20 30 3b 0a 20 20 69 6e 74  *pVal = 0;.  int
5570: 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   op;            
5580: 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 63 6f 64          /* Opcod
5590: 65 20 6f 66 20 70 52 69 67 68 74 20 2a 2f 0a 0a  e of pRight */..
55a0: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 49 73    if( !sqlite3Is
55b0: 4c 69 6b 65 46 75 6e 63 74 69 6f 6e 28 64 62 2c  LikeFunction(db,
55c0: 20 70 45 78 70 72 2c 20 70 6e 6f 43 61 73 65 2c   pExpr, pnoCase,
55d0: 20 77 63 29 20 29 7b 0a 20 20 20 20 72 65 74 75   wc) ){.    retu
55e0: 72 6e 20 30 3b 0a 20 20 7d 0a 23 69 66 64 65 66  rn 0;.  }.#ifdef
55f0: 20 53 51 4c 49 54 45 5f 45 42 43 44 49 43 0a 20   SQLITE_EBCDIC. 
5600: 20 69 66 28 20 2a 70 6e 6f 43 61 73 65 20 29 20   if( *pnoCase ) 
5610: 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66  return 0;.#endif
5620: 0a 20 20 70 4c 69 73 74 20 3d 20 70 45 78 70 72  .  pList = pExpr
5630: 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 70 4c 65  ->x.pList;.  pLe
5640: 66 74 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 31 5d  ft = pList->a[1]
5650: 2e 70 45 78 70 72 3b 0a 20 20 69 66 28 20 70 4c  .pExpr;.  if( pL
5660: 65 66 74 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55  eft->op!=TK_COLU
5670: 4d 4e 20 0a 20 20 20 7c 7c 20 73 71 6c 69 74 65  MN .   || sqlite
5680: 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 4c  3ExprAffinity(pL
5690: 65 66 74 29 21 3d 53 51 4c 49 54 45 5f 41 46 46  eft)!=SQLITE_AFF
56a0: 5f 54 45 58 54 20 0a 20 20 20 7c 7c 20 49 73 56  _TEXT .   || IsV
56b0: 69 72 74 75 61 6c 28 70 4c 65 66 74 2d 3e 70 54  irtual(pLeft->pT
56c0: 61 62 29 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20  ab).  ){.    /* 
56d0: 49 4d 50 3a 20 52 2d 30 32 30 36 35 2d 34 39 34  IMP: R-02065-494
56e0: 36 35 20 54 68 65 20 6c 65 66 74 2d 68 61 6e 64  65 The left-hand
56f0: 20 73 69 64 65 20 6f 66 20 74 68 65 20 4c 49 4b   side of the LIK
5700: 45 20 6f 72 20 47 4c 4f 42 20 6f 70 65 72 61 74  E or GLOB operat
5710: 6f 72 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20 62  or must.    ** b
5720: 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 6e  e the name of an
5730: 20 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e 20   indexed column 
5740: 77 69 74 68 20 54 45 58 54 20 61 66 66 69 6e 69  with TEXT affini
5750: 74 79 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  ty. */.    retur
5760: 6e 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  n 0;.  }.  asser
5770: 74 28 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d  t( pLeft->iColum
5780: 6e 21 3d 28 2d 31 29 20 29 3b 20 2f 2a 20 42 65  n!=(-1) ); /* Be
5790: 63 61 75 73 65 20 49 50 4b 20 6e 65 76 65 72 20  cause IPK never 
57a0: 68 61 73 20 41 46 46 5f 54 45 58 54 20 2a 2f 0a  has AFF_TEXT */.
57b0: 0a 20 20 70 52 69 67 68 74 20 3d 20 73 71 6c 69  .  pRight = sqli
57c0: 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61  te3ExprSkipColla
57d0: 74 65 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  te(pList->a[0].p
57e0: 45 78 70 72 29 3b 0a 20 20 6f 70 20 3d 20 70 52  Expr);.  op = pR
57f0: 69 67 68 74 2d 3e 6f 70 3b 0a 20 20 69 66 28 20  ight->op;.  if( 
5800: 6f 70 3d 3d 54 4b 5f 56 41 52 49 41 42 4c 45 20  op==TK_VARIABLE 
5810: 29 7b 0a 20 20 20 20 56 64 62 65 20 2a 70 52 65  ){.    Vdbe *pRe
5820: 70 72 65 70 61 72 65 20 3d 20 70 50 61 72 73 65  prepare = pParse
5830: 2d 3e 70 52 65 70 72 65 70 61 72 65 3b 0a 20 20  ->pReprepare;.  
5840: 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 52 69    int iCol = pRi
5850: 67 68 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  ght->iColumn;.  
5860: 20 20 70 56 61 6c 20 3d 20 73 71 6c 69 74 65 33    pVal = sqlite3
5870: 56 64 62 65 47 65 74 42 6f 75 6e 64 56 61 6c 75  VdbeGetBoundValu
5880: 65 28 70 52 65 70 72 65 70 61 72 65 2c 20 69 43  e(pReprepare, iC
5890: 6f 6c 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ol, SQLITE_AFF_N
58a0: 4f 4e 45 29 3b 0a 20 20 20 20 69 66 28 20 70 56  ONE);.    if( pV
58b0: 61 6c 20 26 26 20 73 71 6c 69 74 65 33 5f 76 61  al && sqlite3_va
58c0: 6c 75 65 5f 74 79 70 65 28 70 56 61 6c 29 3d 3d  lue_type(pVal)==
58d0: 53 51 4c 49 54 45 5f 54 45 58 54 20 29 7b 0a 20  SQLITE_TEXT ){. 
58e0: 20 20 20 20 20 7a 20 3d 20 28 63 68 61 72 20 2a       z = (char *
58f0: 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
5900: 65 78 74 28 70 56 61 6c 29 3b 0a 20 20 20 20 7d  ext(pVal);.    }
5910: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
5920: 53 65 74 56 61 72 6d 61 73 6b 28 70 50 61 72 73  SetVarmask(pPars
5930: 65 2d 3e 70 56 64 62 65 2c 20 69 43 6f 6c 29 3b  e->pVdbe, iCol);
5940: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 52 69  .    assert( pRi
5950: 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 56 41 52 49  ght->op==TK_VARI
5960: 41 42 4c 45 20 7c 7c 20 70 52 69 67 68 74 2d 3e  ABLE || pRight->
5970: 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20  op==TK_REGISTER 
5980: 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  );.  }else if( o
5990: 70 3d 3d 54 4b 5f 53 54 52 49 4e 47 20 29 7b 0a  p==TK_STRING ){.
59a0: 20 20 20 20 7a 20 3d 20 70 52 69 67 68 74 2d 3e      z = pRight->
59b0: 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 7d 0a 20 20  u.zToken;.  }.  
59c0: 69 66 28 20 7a 20 29 7b 0a 20 20 20 20 63 6e 74  if( z ){.    cnt
59d0: 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28   = 0;.    while(
59e0: 20 28 63 3d 7a 5b 63 6e 74 5d 29 21 3d 30 20 26   (c=z[cnt])!=0 &
59f0: 26 20 63 21 3d 77 63 5b 30 5d 20 26 26 20 63 21  & c!=wc[0] && c!
5a00: 3d 77 63 5b 31 5d 20 26 26 20 63 21 3d 77 63 5b  =wc[1] && c!=wc[
5a10: 32 5d 20 29 7b 0a 20 20 20 20 20 20 63 6e 74 2b  2] ){.      cnt+
5a20: 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  +;.    }.    if(
5a30: 20 63 6e 74 21 3d 30 20 26 26 20 32 35 35 21 3d   cnt!=0 && 255!=
5a40: 28 75 38 29 7a 5b 63 6e 74 2d 31 5d 20 29 7b 0a  (u8)z[cnt-1] ){.
5a50: 20 20 20 20 20 20 45 78 70 72 20 2a 70 50 72 65        Expr *pPre
5a60: 66 69 78 3b 0a 20 20 20 20 20 20 2a 70 69 73 43  fix;.      *pisC
5a70: 6f 6d 70 6c 65 74 65 20 3d 20 63 3d 3d 77 63 5b  omplete = c==wc[
5a80: 30 5d 20 26 26 20 7a 5b 63 6e 74 2b 31 5d 3d 3d  0] && z[cnt+1]==
5a90: 30 3b 0a 20 20 20 20 20 20 70 50 72 65 66 69 78  0;.      pPrefix
5aa0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 64   = sqlite3Expr(d
5ab0: 62 2c 20 54 4b 5f 53 54 52 49 4e 47 2c 20 7a 29  b, TK_STRING, z)
5ac0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 72 65  ;.      if( pPre
5ad0: 66 69 78 20 29 20 70 50 72 65 66 69 78 2d 3e 75  fix ) pPrefix->u
5ae0: 2e 7a 54 6f 6b 65 6e 5b 63 6e 74 5d 20 3d 20 30  .zToken[cnt] = 0
5af0: 3b 0a 20 20 20 20 20 20 2a 70 70 50 72 65 66 69  ;.      *ppPrefi
5b00: 78 20 3d 20 70 50 72 65 66 69 78 3b 0a 20 20 20  x = pPrefix;.   
5b10: 20 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 56 41     if( op==TK_VA
5b20: 52 49 41 42 4c 45 20 29 7b 0a 20 20 20 20 20 20  RIABLE ){.      
5b30: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
5b40: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 20 20 20  se->pVdbe;.     
5b50: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
5b60: 74 56 61 72 6d 61 73 6b 28 76 2c 20 70 52 69 67  tVarmask(v, pRig
5b70: 68 74 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20  ht->iColumn);.  
5b80: 20 20 20 20 20 20 69 66 28 20 2a 70 69 73 43 6f        if( *pisCo
5b90: 6d 70 6c 65 74 65 20 26 26 20 70 52 69 67 68 74  mplete && pRight
5ba0: 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 31 5d 20 29 7b  ->u.zToken[1] ){
5bb0: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66  .          /* If
5bc0: 20 74 68 65 20 72 68 73 20 6f 66 20 74 68 65 20   the rhs of the 
5bd0: 4c 49 4b 45 20 65 78 70 72 65 73 73 69 6f 6e 20  LIKE expression 
5be0: 69 73 20 61 20 76 61 72 69 61 62 6c 65 2c 20 61  is a variable, a
5bf0: 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 0a 20  nd the current. 
5c00: 20 20 20 20 20 20 20 20 20 2a 2a 20 76 61 6c 75           ** valu
5c10: 65 20 6f 66 20 74 68 65 20 76 61 72 69 61 62 6c  e of the variabl
5c20: 65 20 6d 65 61 6e 73 20 74 68 65 72 65 20 69 73  e means there is
5c30: 20 6e 6f 20 6e 65 65 64 20 74 6f 20 69 6e 76 6f   no need to invo
5c40: 6b 65 20 74 68 65 20 4c 49 4b 45 0a 20 20 20 20  ke the LIKE.    
5c50: 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f        ** functio
5c60: 6e 2c 20 74 68 65 6e 20 6e 6f 20 4f 50 5f 56 61  n, then no OP_Va
5c70: 72 69 61 62 6c 65 20 77 69 6c 6c 20 62 65 20 61  riable will be a
5c80: 64 64 65 64 20 74 6f 20 74 68 65 20 70 72 6f 67  dded to the prog
5c90: 72 61 6d 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ram..          *
5ca0: 2a 20 54 68 69 73 20 63 61 75 73 65 73 20 70 72  * This causes pr
5cb0: 6f 62 6c 65 6d 73 20 66 6f 72 20 74 68 65 20 73  oblems for the s
5cc0: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61  qlite3_bind_para
5cd0: 6d 65 74 65 72 5f 6e 61 6d 65 28 29 0a 20 20 20  meter_name().   
5ce0: 20 20 20 20 20 20 20 2a 2a 20 41 50 49 2e 20 54         ** API. T
5cf0: 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68  o work around th
5d00: 65 6d 2c 20 61 64 64 20 61 20 64 75 6d 6d 79 20  em, add a dummy 
5d10: 4f 50 5f 56 61 72 69 61 62 6c 65 20 68 65 72 65  OP_Variable here
5d20: 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 20 0a  ..          */ .
5d30: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 72 31            int r1
5d40: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
5d50: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
5d60: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
5d70: 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50  xprCodeTarget(pP
5d80: 61 72 73 65 2c 20 70 52 69 67 68 74 2c 20 72 31  arse, pRight, r1
5d90: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
5da0: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 33  ite3VdbeChangeP3
5db0: 28 76 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43  (v, sqlite3VdbeC
5dc0: 75 72 72 65 6e 74 41 64 64 72 28 76 29 2d 31 2c  urrentAddr(v)-1,
5dd0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73   0);.          s
5de0: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
5df0: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
5e00: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
5e10: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
5e20: 20 20 20 20 20 7a 20 3d 20 30 3b 0a 20 20 20 20       z = 0;.    
5e30: 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33  }.  }..  sqlite3
5e40: 56 61 6c 75 65 46 72 65 65 28 70 56 61 6c 29 3b  ValueFree(pVal);
5e50: 0a 20 20 72 65 74 75 72 6e 20 28 7a 21 3d 30 29  .  return (z!=0)
5e60: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
5e70: 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f  LITE_OMIT_LIKE_O
5e80: 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a  PTIMIZATION */..
5e90: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
5ea0: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
5eb0: 45 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f  E./*.** Check to
5ec0: 20 73 65 65 20 69 66 20 74 68 65 20 67 69 76 65   see if the give
5ed0: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  n expression is 
5ee0: 6f 66 20 74 68 65 20 66 6f 72 6d 0a 2a 2a 0a 2a  of the form.**.*
5ef0: 2a 20 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e  *         column
5f00: 20 4d 41 54 43 48 20 65 78 70 72 0a 2a 2a 0a 2a   MATCH expr.**.*
5f10: 2a 20 49 66 20 69 74 20 69 73 20 74 68 65 6e 20  * If it is then 
5f20: 72 65 74 75 72 6e 20 54 52 55 45 2e 20 20 49 66  return TRUE.  If
5f30: 20 6e 6f 74 2c 20 72 65 74 75 72 6e 20 46 41 4c   not, return FAL
5f40: 53 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  SE..*/.static in
5f50: 74 20 69 73 4d 61 74 63 68 4f 66 43 6f 6c 75 6d  t isMatchOfColum
5f60: 6e 28 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  n(.  Expr *pExpr
5f70: 20 20 20 20 20 20 2f 2a 20 54 65 73 74 20 74 68        /* Test th
5f80: 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f  is expression */
5f90: 0a 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  .){.  ExprList *
5fa0: 70 4c 69 73 74 3b 0a 0a 20 20 69 66 28 20 70 45  pList;..  if( pE
5fb0: 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 46 55 4e 43  xpr->op!=TK_FUNC
5fc0: 54 49 4f 4e 20 29 7b 0a 20 20 20 20 72 65 74 75  TION ){.    retu
5fd0: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 0;.  }.  if( 
5fe0: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
5ff0: 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 22  Expr->u.zToken,"
6000: 6d 61 74 63 68 22 29 21 3d 30 20 29 7b 0a 20 20  match")!=0 ){.  
6010: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
6020: 20 20 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d    pList = pExpr-
6030: 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 69 66 28 20  >x.pList;.  if( 
6040: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 32 20  pList->nExpr!=2 
6050: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
6060: 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 69 73 74  .  }.  if( pList
6070: 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 2d 3e 6f 70  ->a[1].pExpr->op
6080: 20 21 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b   != TK_COLUMN ){
6090: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
60a0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d   }.  return 1;.}
60b0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
60c0: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
60d0: 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66  BLE */../*.** If
60e0: 20 74 68 65 20 70 42 61 73 65 20 65 78 70 72 65   the pBase expre
60f0: 73 73 69 6f 6e 20 6f 72 69 67 69 6e 61 74 65 64  ssion originated
6100: 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55 53   in the ON or US
6110: 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 0a 2a 2a  ING clause of.**
6120: 20 61 20 6a 6f 69 6e 2c 20 74 68 65 6e 20 74 72   a join, then tr
6130: 61 6e 73 66 65 72 20 74 68 65 20 61 70 70 72 6f  ansfer the appro
6140: 70 72 69 61 74 65 20 6d 61 72 6b 69 6e 67 73 20  priate markings 
6150: 6f 76 65 72 20 74 6f 20 64 65 72 69 76 65 64 2e  over to derived.
6160: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
6170: 74 72 61 6e 73 66 65 72 4a 6f 69 6e 4d 61 72 6b  transferJoinMark
6180: 69 6e 67 73 28 45 78 70 72 20 2a 70 44 65 72 69  ings(Expr *pDeri
6190: 76 65 64 2c 20 45 78 70 72 20 2a 70 42 61 73 65  ved, Expr *pBase
61a0: 29 7b 0a 20 20 69 66 28 20 70 44 65 72 69 76 65  ){.  if( pDerive
61b0: 64 20 29 7b 0a 20 20 20 20 70 44 65 72 69 76 65  d ){.    pDerive
61c0: 64 2d 3e 66 6c 61 67 73 20 7c 3d 20 70 42 61 73  d->flags |= pBas
61d0: 65 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 46 72  e->flags & EP_Fr
61e0: 6f 6d 4a 6f 69 6e 3b 0a 20 20 20 20 70 44 65 72  omJoin;.    pDer
61f0: 69 76 65 64 2d 3e 69 52 69 67 68 74 4a 6f 69 6e  ived->iRightJoin
6200: 54 61 62 6c 65 20 3d 20 70 42 61 73 65 2d 3e 69  Table = pBase->i
6210: 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 3b 0a  RightJoinTable;.
6220: 20 20 7d 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69    }.}..#if !defi
6230: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
6240: 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 29  OR_OPTIMIZATION)
6250: 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
6260: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
6270: 59 29 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65  Y)./*.** Analyze
6280: 20 61 20 74 65 72 6d 20 74 68 61 74 20 63 6f 6e   a term that con
6290: 73 69 73 74 73 20 6f 66 20 74 77 6f 20 6f 72 20  sists of two or 
62a0: 6d 6f 72 65 20 4f 52 2d 63 6f 6e 6e 65 63 74 65  more OR-connecte
62b0: 64 0a 2a 2a 20 73 75 62 74 65 72 6d 73 2e 20 20  d.** subterms.  
62c0: 53 6f 20 69 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  So in:.**.**    
62d0: 20 2e 2e 2e 20 57 48 45 52 45 20 20 28 61 3d 35   ... WHERE  (a=5
62e0: 29 20 41 4e 44 20 28 62 3d 37 20 4f 52 20 63 3d  ) AND (b=7 OR c=
62f0: 39 20 4f 52 20 64 3d 31 33 29 20 41 4e 44 20 28  9 OR d=13) AND (
6300: 64 3d 31 33 29 0a 2a 2a 20 20 20 20 20 20 20 20  d=13).**        
6310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6320: 20 20 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e    ^^^^^^^^^^^^^^
6330: 5e 5e 5e 5e 5e 5e 0a 2a 2a 0a 2a 2a 20 54 68 69  ^^^^^^.**.** Thi
6340: 73 20 72 6f 75 74 69 6e 65 20 61 6e 61 6c 79 7a  s routine analyz
6350: 65 73 20 74 65 72 6d 73 20 73 75 63 68 20 61 73  es terms such as
6360: 20 74 68 65 20 6d 69 64 64 6c 65 20 74 65 72 6d   the middle term
6370: 20 69 6e 20 74 68 65 20 61 62 6f 76 65 20 65 78   in the above ex
6380: 61 6d 70 6c 65 2e 0a 2a 2a 20 41 20 57 68 65 72  ample..** A Wher
6390: 65 4f 72 54 65 72 6d 20 6f 62 6a 65 63 74 20 69  eOrTerm object i
63a0: 73 20 63 6f 6d 70 75 74 65 64 20 61 6e 64 20 61  s computed and a
63b0: 74 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 74  ttached to the t
63c0: 65 72 6d 20 75 6e 64 65 72 0a 2a 2a 20 61 6e 61  erm under.** ana
63d0: 6c 79 73 69 73 2c 20 72 65 67 61 72 64 6c 65 73  lysis, regardles
63e0: 73 20 6f 66 20 74 68 65 20 6f 75 74 63 6f 6d 65  s of the outcome
63f0: 20 6f 66 20 74 68 65 20 61 6e 61 6c 79 73 69 73   of the analysis
6400: 2e 20 20 48 65 6e 63 65 3a 0a 2a 2a 0a 2a 2a 20  .  Hence:.**.** 
6410: 20 20 20 20 57 68 65 72 65 54 65 72 6d 2e 77 74      WhereTerm.wt
6420: 46 6c 61 67 73 20 20 20 7c 3d 20 20 54 45 52 4d  Flags   |=  TERM
6430: 5f 4f 52 49 4e 46 4f 0a 2a 2a 20 20 20 20 20 57  _ORINFO.**     W
6440: 68 65 72 65 54 65 72 6d 2e 75 2e 70 4f 72 49 6e  hereTerm.u.pOrIn
6450: 66 6f 20 20 3d 20 20 61 20 64 79 6e 61 6d 69 63  fo  =  a dynamic
6460: 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 57  ally allocated W
6470: 68 65 72 65 4f 72 54 65 72 6d 20 6f 62 6a 65 63  hereOrTerm objec
6480: 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 65 72 6d  t.**.** The term
6490: 20 62 65 69 6e 67 20 61 6e 61 6c 79 7a 65 64 20   being analyzed 
64a0: 6d 75 73 74 20 68 61 76 65 20 74 77 6f 20 6f 72  must have two or
64b0: 20 6d 6f 72 65 20 6f 66 20 4f 52 2d 63 6f 6e 6e   more of OR-conn
64c0: 65 63 74 65 64 20 73 75 62 74 65 72 6d 73 2e 0a  ected subterms..
64d0: 2a 2a 20 41 20 73 69 6e 67 6c 65 20 73 75 62 74  ** A single subt
64e0: 65 72 6d 20 6d 69 67 68 74 20 62 65 20 61 20 73  erm might be a s
64f0: 65 74 20 6f 66 20 41 4e 44 2d 63 6f 6e 6e 65 63  et of AND-connec
6500: 74 65 64 20 73 75 62 2d 73 75 62 74 65 72 6d 73  ted sub-subterms
6510: 2e 0a 2a 2a 20 45 78 61 6d 70 6c 65 73 20 6f 66  ..** Examples of
6520: 20 74 65 72 6d 73 20 75 6e 64 65 72 20 61 6e 61   terms under ana
6530: 6c 79 73 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  lysis:.**.**    
6540: 20 28 41 29 20 20 20 20 20 74 31 2e 78 3d 74 32   (A)     t1.x=t2
6550: 2e 79 20 4f 52 20 74 31 2e 78 3d 74 32 2e 7a 20  .y OR t1.x=t2.z 
6560: 4f 52 20 74 31 2e 79 3d 31 35 20 4f 52 20 74 31  OR t1.y=15 OR t1
6570: 2e 7a 3d 74 33 2e 61 2b 35 0a 2a 2a 20 20 20 20  .z=t3.a+5.**    
6580: 20 28 42 29 20 20 20 20 20 78 3d 65 78 70 72 31   (B)     x=expr1
6590: 20 4f 52 20 65 78 70 72 32 3d 78 20 4f 52 20 78   OR expr2=x OR x
65a0: 3d 65 78 70 72 33 0a 2a 2a 20 20 20 20 20 28 43  =expr3.**     (C
65b0: 29 20 20 20 20 20 74 31 2e 78 3d 74 32 2e 79 20  )     t1.x=t2.y 
65c0: 4f 52 20 28 74 31 2e 78 3d 74 32 2e 7a 20 41 4e  OR (t1.x=t2.z AN
65d0: 44 20 74 31 2e 79 3d 31 35 29 0a 2a 2a 20 20 20  D t1.y=15).**   
65e0: 20 20 28 44 29 20 20 20 20 20 78 3d 65 78 70 72    (D)     x=expr
65f0: 31 20 4f 52 20 28 79 3e 31 31 20 41 4e 44 20 79  1 OR (y>11 AND y
6600: 3c 32 32 20 41 4e 44 20 7a 20 4c 49 4b 45 20 27  <22 AND z LIKE '
6610: 2a 68 65 6c 6c 6f 2a 27 29 0a 2a 2a 20 20 20 20  *hello*').**    
6620: 20 28 45 29 20 20 20 20 20 28 70 2e 61 3d 31 20   (E)     (p.a=1 
6630: 41 4e 44 20 71 2e 62 3d 32 20 41 4e 44 20 72 2e  AND q.b=2 AND r.
6640: 63 3d 33 29 20 4f 52 20 28 70 2e 78 3d 34 20 41  c=3) OR (p.x=4 A
6650: 4e 44 20 71 2e 79 3d 35 20 41 4e 44 20 72 2e 7a  ND q.y=5 AND r.z
6660: 3d 36 29 0a 2a 2a 0a 2a 2a 20 43 41 53 45 20 31  =6).**.** CASE 1
6670: 3a 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6c 6c 20 73  :.**.** If all s
6680: 75 62 74 65 72 6d 73 20 61 72 65 20 6f 66 20 74  ubterms are of t
6690: 68 65 20 66 6f 72 6d 20 54 2e 43 3d 65 78 70 72  he form T.C=expr
66a0: 20 66 6f 72 20 73 6f 6d 65 20 73 69 6e 67 6c 65   for some single
66b0: 20 63 6f 6c 75 6d 6e 20 6f 66 20 43 20 61 6e 64   column of C and
66c0: 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 74 61 62  .** a single tab
66d0: 6c 65 20 54 20 28 61 73 20 73 68 6f 77 6e 20 69  le T (as shown i
66e0: 6e 20 65 78 61 6d 70 6c 65 20 42 20 61 62 6f 76  n example B abov
66f0: 65 29 20 74 68 65 6e 20 63 72 65 61 74 65 20 61  e) then create a
6700: 20 6e 65 77 20 76 69 72 74 75 61 6c 0a 2a 2a 20   new virtual.** 
6710: 74 65 72 6d 20 74 68 61 74 20 69 73 20 61 6e 20  term that is an 
6720: 65 71 75 69 76 61 6c 65 6e 74 20 49 4e 20 65 78  equivalent IN ex
6730: 70 72 65 73 73 69 6f 6e 2e 20 20 49 6e 20 6f 74  pression.  In ot
6740: 68 65 72 20 77 6f 72 64 73 2c 20 69 66 20 74 68  her words, if th
6750: 65 20 74 65 72 6d 0a 2a 2a 20 62 65 69 6e 67 20  e term.** being 
6760: 61 6e 61 6c 79 7a 65 64 20 69 73 3a 0a 2a 2a 0a  analyzed is:.**.
6770: 2a 2a 20 20 20 20 20 20 78 20 3d 20 65 78 70 72  **      x = expr
6780: 31 20 20 4f 52 20 20 65 78 70 72 32 20 3d 20 78  1  OR  expr2 = x
6790: 20 20 4f 52 20 20 78 20 3d 20 65 78 70 72 33 0a    OR  x = expr3.
67a0: 2a 2a 0a 2a 2a 20 74 68 65 6e 20 63 72 65 61 74  **.** then creat
67b0: 65 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c 20  e a new virtual 
67c0: 74 65 72 6d 20 6c 69 6b 65 20 74 68 69 73 3a 0a  term like this:.
67d0: 2a 2a 0a 2a 2a 20 20 20 20 20 20 78 20 49 4e 20  **.**      x IN 
67e0: 28 65 78 70 72 31 2c 65 78 70 72 32 2c 65 78 70  (expr1,expr2,exp
67f0: 72 33 29 0a 2a 2a 0a 2a 2a 20 43 41 53 45 20 32  r3).**.** CASE 2
6800: 3a 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6c 6c 20 73  :.**.** If all s
6810: 75 62 74 65 72 6d 73 20 61 72 65 20 69 6e 64 65  ubterms are inde
6820: 78 61 62 6c 65 20 62 79 20 61 20 73 69 6e 67 6c  xable by a singl
6830: 65 20 74 61 62 6c 65 20 54 2c 20 74 68 65 6e 20  e table T, then 
6840: 73 65 74 0a 2a 2a 0a 2a 2a 20 20 20 20 20 57 68  set.**.**     Wh
6850: 65 72 65 54 65 72 6d 2e 65 4f 70 65 72 61 74 6f  ereTerm.eOperato
6860: 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3d  r              =
6870: 20 20 57 4f 5f 4f 52 0a 2a 2a 20 20 20 20 20 57    WO_OR.**     W
6880: 68 65 72 65 54 65 72 6d 2e 75 2e 70 4f 72 49 6e  hereTerm.u.pOrIn
6890: 66 6f 2d 3e 69 6e 64 65 78 61 62 6c 65 20 20 7c  fo->indexable  |
68a0: 3d 20 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75  =  the cursor nu
68b0: 6d 62 65 72 20 66 6f 72 20 74 61 62 6c 65 20 54  mber for table T
68c0: 0a 2a 2a 0a 2a 2a 20 41 20 73 75 62 74 65 72 6d  .**.** A subterm
68d0: 20 69 73 20 22 69 6e 64 65 78 61 62 6c 65 22 20   is "indexable" 
68e0: 69 66 20 69 74 20 69 73 20 6f 66 20 74 68 65 20  if it is of the 
68f0: 66 6f 72 6d 0a 2a 2a 20 22 54 2e 43 20 3c 6f 70  form.** "T.C <op
6900: 3e 20 3c 65 78 70 72 3e 22 20 77 68 65 72 65 20  > <expr>" where 
6910: 43 20 69 73 20 61 6e 79 20 63 6f 6c 75 6d 6e 20  C is any column 
6920: 6f 66 20 74 61 62 6c 65 20 54 20 61 6e 64 20 0a  of table T and .
6930: 2a 2a 20 3c 6f 70 3e 20 69 73 20 6f 6e 65 20 6f  ** <op> is one o
6940: 66 20 22 3d 22 2c 20 22 3c 22 2c 20 22 3c 3d 22  f "=", "<", "<="
6950: 2c 20 22 3e 22 2c 20 22 3e 3d 22 2c 20 22 49 53  , ">", ">=", "IS
6960: 20 4e 55 4c 4c 22 2c 20 6f 72 20 22 49 4e 22 2e   NULL", or "IN".
6970: 0a 2a 2a 20 41 20 73 75 62 74 65 72 6d 20 69 73  .** A subterm is
6980: 20 61 6c 73 6f 20 69 6e 64 65 78 61 62 6c 65 20   also indexable 
6990: 69 66 20 69 74 20 69 73 20 61 6e 20 41 4e 44 20  if it is an AND 
69a0: 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 0a 2a  of two or more.*
69b0: 2a 20 73 75 62 73 75 62 74 65 72 6d 73 20 61 74  * subsubterms at
69c0: 20 6c 65 61 73 74 20 6f 6e 65 20 6f 66 20 77 68   least one of wh
69d0: 69 63 68 20 69 73 20 69 6e 64 65 78 61 62 6c 65  ich is indexable
69e0: 2e 20 20 49 6e 64 65 78 61 62 6c 65 20 41 4e 44  .  Indexable AND
69f0: 20 0a 2a 2a 20 73 75 62 74 65 72 6d 73 20 68 61   .** subterms ha
6a00: 76 65 20 74 68 65 69 72 20 65 4f 70 65 72 61 74  ve their eOperat
6a10: 6f 72 20 73 65 74 20 74 6f 20 57 4f 5f 41 4e 44  or set to WO_AND
6a20: 20 61 6e 64 20 74 68 65 79 20 68 61 76 65 0a 2a   and they have.*
6a30: 2a 20 75 2e 70 41 6e 64 49 6e 66 6f 20 73 65 74  * u.pAndInfo set
6a40: 20 74 6f 20 61 20 64 79 6e 61 6d 69 63 61 6c 6c   to a dynamicall
6a50: 79 20 61 6c 6c 6f 63 61 74 65 64 20 57 68 65 72  y allocated Wher
6a60: 65 41 6e 64 54 65 72 6d 20 6f 62 6a 65 63 74 2e  eAndTerm object.
6a70: 0a 2a 2a 0a 2a 2a 20 46 72 6f 6d 20 61 6e 6f 74  .**.** From anot
6a80: 68 65 72 20 70 6f 69 6e 74 20 6f 66 20 76 69 65  her point of vie
6a90: 77 2c 20 22 69 6e 64 65 78 61 62 6c 65 22 20 6d  w, "indexable" m
6aa0: 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 73 75  eans that the su
6ab0: 62 74 65 72 6d 20 63 6f 75 6c 64 0a 2a 2a 20 70  bterm could.** p
6ac0: 6f 74 65 6e 74 69 61 6c 6c 79 20 62 65 20 75 73  otentially be us
6ad0: 65 64 20 77 69 74 68 20 61 6e 20 69 6e 64 65 78  ed with an index
6ae0: 20 69 66 20 61 6e 20 61 70 70 72 6f 70 72 69 61   if an appropria
6af0: 74 65 20 69 6e 64 65 78 20 65 78 69 73 74 73 2e  te index exists.
6b00: 0a 2a 2a 20 54 68 69 73 20 61 6e 61 6c 79 73 69  .** This analysi
6b10: 73 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 73 69  s does not consi
6b20: 64 65 72 20 77 68 65 74 68 65 72 20 6f 72 20 6e  der whether or n
6b30: 6f 74 20 74 68 65 20 69 6e 64 65 78 20 65 78 69  ot the index exi
6b40: 73 74 73 3b 20 74 68 61 74 0a 2a 2a 20 69 73 20  sts; that.** is 
6b50: 64 65 63 69 64 65 64 20 65 6c 73 65 77 68 65 72  decided elsewher
6b60: 65 2e 20 20 54 68 69 73 20 61 6e 61 6c 79 73 69  e.  This analysi
6b70: 73 20 6f 6e 6c 79 20 6c 6f 6f 6b 73 20 61 74 20  s only looks at 
6b80: 77 68 65 74 68 65 72 20 73 75 62 74 65 72 6d 73  whether subterms
6b90: 0a 2a 2a 20 61 70 70 72 6f 70 72 69 61 74 65 20  .** appropriate 
6ba0: 66 6f 72 20 69 6e 64 65 78 69 6e 67 20 65 78 69  for indexing exi
6bb0: 73 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 65 78  st..**.** All ex
6bc0: 61 6d 70 6c 65 73 20 41 20 74 68 72 6f 75 67 68  amples A through
6bd0: 20 45 20 61 62 6f 76 65 20 73 61 74 69 73 66 79   E above satisfy
6be0: 20 63 61 73 65 20 32 2e 20 20 42 75 74 20 69 66   case 2.  But if
6bf0: 20 61 20 74 65 72 6d 0a 2a 2a 20 61 6c 73 6f 20   a term.** also 
6c00: 73 61 74 69 73 66 69 65 73 20 63 61 73 65 20 31  satisfies case 1
6c10: 20 28 73 75 63 68 20 61 73 20 42 29 20 77 65 20   (such as B) we 
6c20: 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20 6f 70  know that the op
6c30: 74 69 6d 69 7a 65 72 20 77 69 6c 6c 0a 2a 2a 20  timizer will.** 
6c40: 61 6c 77 61 79 73 20 70 72 65 66 65 72 20 63 61  always prefer ca
6c50: 73 65 20 31 2c 20 73 6f 20 69 6e 20 74 68 61 74  se 1, so in that
6c60: 20 63 61 73 65 20 77 65 20 70 72 65 74 65 6e 64   case we pretend
6c70: 20 74 68 61 74 20 63 61 73 65 20 32 20 69 73 20   that case 2 is 
6c80: 6e 6f 74 0a 2a 2a 20 73 61 74 69 73 66 69 65 64  not.** satisfied
6c90: 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 6d 69 67 68 74  ..**.** It might
6ca0: 20 62 65 20 74 68 65 20 63 61 73 65 20 74 68 61   be the case tha
6cb0: 74 20 6d 75 6c 74 69 70 6c 65 20 74 61 62 6c 65  t multiple table
6cc0: 73 20 61 72 65 20 69 6e 64 65 78 61 62 6c 65 2e  s are indexable.
6cd0: 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 0a 2a    For example,.*
6ce0: 2a 20 28 45 29 20 61 62 6f 76 65 20 69 73 20 69  * (E) above is i
6cf0: 6e 64 65 78 61 62 6c 65 20 6f 6e 20 74 61 62 6c  ndexable on tabl
6d00: 65 73 20 50 2c 20 51 2c 20 61 6e 64 20 52 2e 0a  es P, Q, and R..
6d10: 2a 2a 0a 2a 2a 20 54 65 72 6d 73 20 74 68 61 74  **.** Terms that
6d20: 20 73 61 74 69 73 66 79 20 63 61 73 65 20 32 20   satisfy case 2 
6d30: 61 72 65 20 63 61 6e 64 69 64 61 74 65 73 20 66  are candidates f
6d40: 6f 72 20 6c 6f 6f 6b 75 70 20 62 79 20 75 73 69  or lookup by usi
6d50: 6e 67 0a 2a 2a 20 73 65 70 61 72 61 74 65 20 69  ng.** separate i
6d60: 6e 64 69 63 65 73 20 74 6f 20 66 69 6e 64 20 72  ndices to find r
6d70: 6f 77 69 64 73 20 66 6f 72 20 65 61 63 68 20 73  owids for each s
6d80: 75 62 74 65 72 6d 20 61 6e 64 20 63 6f 6d 70 6f  ubterm and compo
6d90: 73 69 6e 67 0a 2a 2a 20 74 68 65 20 75 6e 69 6f  sing.** the unio
6da0: 6e 20 6f 66 20 61 6c 6c 20 72 6f 77 69 64 73 20  n of all rowids 
6db0: 75 73 69 6e 67 20 61 20 52 6f 77 53 65 74 20 6f  using a RowSet o
6dc0: 62 6a 65 63 74 2e 20 20 54 68 69 73 20 69 73 20  bject.  This is 
6dd0: 73 69 6d 69 6c 61 72 0a 2a 2a 20 74 6f 20 22 62  similar.** to "b
6de0: 69 74 6d 61 70 20 69 6e 64 69 63 65 73 22 20 69  itmap indices" i
6df0: 6e 20 6f 74 68 65 72 20 64 61 74 61 62 61 73 65  n other database
6e00: 20 65 6e 67 69 6e 65 73 2e 0a 2a 2a 0a 2a 2a 20   engines..**.** 
6e10: 4f 54 48 45 52 57 49 53 45 3a 0a 2a 2a 0a 2a 2a  OTHERWISE:.**.**
6e20: 20 49 66 20 6e 65 69 74 68 65 72 20 63 61 73 65   If neither case
6e30: 20 31 20 6e 6f 72 20 63 61 73 65 20 32 20 61 70   1 nor case 2 ap
6e40: 70 6c 79 2c 20 74 68 65 6e 20 6c 65 61 76 65 20  ply, then leave 
6e50: 74 68 65 20 65 4f 70 65 72 61 74 6f 72 20 73 65  the eOperator se
6e60: 74 20 74 6f 0a 2a 2a 20 7a 65 72 6f 2e 20 20 54  t to.** zero.  T
6e70: 68 69 73 20 74 65 72 6d 20 69 73 20 6e 6f 74 20  his term is not 
6e80: 75 73 65 66 75 6c 20 66 6f 72 20 73 65 61 72 63  useful for searc
6e90: 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  h..*/.static voi
6ea0: 64 20 65 78 70 72 41 6e 61 6c 79 7a 65 4f 72 54  d exprAnalyzeOrT
6eb0: 65 72 6d 28 0a 20 20 53 72 63 4c 69 73 74 20 2a  erm(.  SrcList *
6ec0: 70 53 72 63 2c 20 20 20 20 20 20 20 20 20 20 20  pSrc,           
6ed0: 20 2f 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   /* the FROM cla
6ee0: 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c  use */.  WhereCl
6ef0: 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20  ause *pWC,      
6f00: 20 20 20 2f 2a 20 74 68 65 20 63 6f 6d 70 6c 65     /* the comple
6f10: 74 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  te WHERE clause 
6f20: 2a 2f 0a 20 20 69 6e 74 20 69 64 78 54 65 72 6d  */.  int idxTerm
6f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
6f40: 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20 4f  * Index of the O
6f50: 52 2d 74 65 72 6d 20 74 6f 20 62 65 20 61 6e 61  R-term to be ana
6f60: 6c 79 7a 65 64 20 2a 2f 0a 29 7b 0a 20 20 57 68  lyzed */.){.  Wh
6f70: 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20  ereInfo *pWInfo 
6f80: 3d 20 70 57 43 2d 3e 70 57 49 6e 66 6f 3b 20 20  = pWC->pWInfo;  
6f90: 20 20 20 20 20 20 2f 2a 20 57 48 45 52 45 20 63        /* WHERE c
6fa0: 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67  lause processing
6fb0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 50 61   context */.  Pa
6fc0: 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57  rse *pParse = pW
6fd0: 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 20 20 20  Info->pParse;   
6fe0: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20        /* Parser 
6ff0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73 71 6c  context */.  sql
7000: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
7010: 65 2d 3e 64 62 3b 20 20 20 20 20 20 20 20 20 20  e->db;          
7020: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
7030: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
7040: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
7050: 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54  m = &pWC->a[idxT
7060: 65 72 6d 5d 3b 20 20 20 20 2f 2a 20 54 68 65 20  erm];    /* The 
7070: 74 65 72 6d 20 74 6f 20 62 65 20 61 6e 61 6c 79  term to be analy
7080: 7a 65 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  zed */.  Expr *p
7090: 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45  Expr = pTerm->pE
70a0: 78 70 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  xpr;            
70b0: 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69   /* The expressi
70c0: 6f 6e 20 6f 66 20 74 68 65 20 74 65 72 6d 20 2a  on of the term *
70d0: 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
70e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
70f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
7100: 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a  oop counters */.
7110: 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
7120: 4f 72 57 63 3b 20 20 20 20 20 20 20 2f 2a 20 42  OrWc;       /* B
7130: 72 65 61 6b 75 70 20 6f 66 20 70 54 65 72 6d 20  reakup of pTerm 
7140: 69 6e 74 6f 20 73 75 62 74 65 72 6d 73 20 2a 2f  into subterms */
7150: 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f  .  WhereTerm *pO
7160: 72 54 65 72 6d 3b 20 20 20 20 20 20 20 2f 2a 20  rTerm;       /* 
7170: 41 20 53 75 62 2d 74 65 72 6d 20 77 69 74 68 69  A Sub-term withi
7180: 6e 20 74 68 65 20 70 4f 72 57 63 20 2a 2f 0a 20  n the pOrWc */. 
7190: 20 57 68 65 72 65 4f 72 49 6e 66 6f 20 2a 70 4f   WhereOrInfo *pO
71a0: 72 49 6e 66 6f 3b 20 20 20 20 20 2f 2a 20 41 64  rInfo;     /* Ad
71b0: 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61  ditional informa
71c0: 74 69 6f 6e 20 61 73 73 6f 63 69 61 74 65 64 20  tion associated 
71d0: 77 69 74 68 20 70 54 65 72 6d 20 2a 2f 0a 20 20  with pTerm */.  
71e0: 42 69 74 6d 61 73 6b 20 63 68 6e 67 54 6f 49 4e  Bitmask chngToIN
71f0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62  ;         /* Tab
7200: 6c 65 73 20 74 68 61 74 20 6d 69 67 68 74 20 73  les that might s
7210: 61 74 69 73 66 79 20 63 61 73 65 20 31 20 2a 2f  atisfy case 1 */
7220: 0a 20 20 42 69 74 6d 61 73 6b 20 69 6e 64 65 78  .  Bitmask index
7230: 61 62 6c 65 3b 20 20 20 20 20 20 20 20 2f 2a 20  able;        /* 
7240: 54 61 62 6c 65 73 20 74 68 61 74 20 61 72 65 20  Tables that are 
7250: 69 6e 64 65 78 61 62 6c 65 2c 20 73 61 74 69 73  indexable, satis
7260: 66 79 69 6e 67 20 63 61 73 65 20 32 20 2a 2f 0a  fying case 2 */.
7270: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 42 72 65 61 6b  .  /*.  ** Break
7280: 20 74 68 65 20 4f 52 20 63 6c 61 75 73 65 20 69   the OR clause i
7290: 6e 74 6f 20 69 74 73 20 73 65 70 61 72 61 74 65  nto its separate
72a0: 20 73 75 62 74 65 72 6d 73 2e 20 20 54 68 65 20   subterms.  The 
72b0: 73 75 62 74 65 72 6d 73 20 61 72 65 0a 20 20 2a  subterms are.  *
72c0: 2a 20 73 74 6f 72 65 64 20 69 6e 20 61 20 57 68  * stored in a Wh
72d0: 65 72 65 43 6c 61 75 73 65 20 73 74 72 75 63 74  ereClause struct
72e0: 75 72 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 77  ure containing w
72f0: 69 74 68 69 6e 20 74 68 65 20 57 68 65 72 65 4f  ithin the WhereO
7300: 72 49 6e 66 6f 0a 20 20 2a 2a 20 6f 62 6a 65 63  rInfo.  ** objec
7310: 74 20 74 68 61 74 20 69 73 20 61 74 74 61 63 68  t that is attach
7320: 65 64 20 74 6f 20 74 68 65 20 6f 72 69 67 69 6e  ed to the origin
7330: 61 6c 20 4f 52 20 63 6c 61 75 73 65 20 74 65 72  al OR clause ter
7340: 6d 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  m..  */.  assert
7350: 28 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  ( (pTerm->wtFlag
7360: 73 20 26 20 28 54 45 52 4d 5f 44 59 4e 41 4d 49  s & (TERM_DYNAMI
7370: 43 7c 54 45 52 4d 5f 4f 52 49 4e 46 4f 7c 54 45  C|TERM_ORINFO|TE
7380: 52 4d 5f 41 4e 44 49 4e 46 4f 29 29 3d 3d 30 20  RM_ANDINFO))==0 
7390: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
73a0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52 20 29 3b  pr->op==TK_OR );
73b0: 0a 20 20 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49  .  pTerm->u.pOrI
73c0: 6e 66 6f 20 3d 20 70 4f 72 49 6e 66 6f 20 3d 20  nfo = pOrInfo = 
73d0: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
73e0: 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a  ero(db, sizeof(*
73f0: 70 4f 72 49 6e 66 6f 29 29 3b 0a 20 20 69 66 28  pOrInfo));.  if(
7400: 20 70 4f 72 49 6e 66 6f 3d 3d 30 20 29 20 72 65   pOrInfo==0 ) re
7410: 74 75 72 6e 3b 0a 20 20 70 54 65 72 6d 2d 3e 77  turn;.  pTerm->w
7420: 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 4f  tFlags |= TERM_O
7430: 52 49 4e 46 4f 3b 0a 20 20 70 4f 72 57 63 20 3d  RINFO;.  pOrWc =
7440: 20 26 70 4f 72 49 6e 66 6f 2d 3e 77 63 3b 0a 20   &pOrInfo->wc;. 
7450: 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 69 74   whereClauseInit
7460: 28 70 4f 72 57 63 2c 20 70 57 49 6e 66 6f 29 3b  (pOrWc, pWInfo);
7470: 0a 20 20 77 68 65 72 65 53 70 6c 69 74 28 70 4f  .  whereSplit(pO
7480: 72 57 63 2c 20 70 45 78 70 72 2c 20 54 4b 5f 4f  rWc, pExpr, TK_O
7490: 52 29 3b 0a 20 20 65 78 70 72 41 6e 61 6c 79 7a  R);.  exprAnalyz
74a0: 65 41 6c 6c 28 70 53 72 63 2c 20 70 4f 72 57 63  eAll(pSrc, pOrWc
74b0: 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  );.  if( db->mal
74c0: 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75  locFailed ) retu
74d0: 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f  rn;.  assert( pO
74e0: 72 57 63 2d 3e 6e 54 65 72 6d 3e 3d 32 20 29 3b  rWc->nTerm>=2 );
74f0: 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 43 6f 6d 70  ..  /*.  ** Comp
7500: 75 74 65 20 74 68 65 20 73 65 74 20 6f 66 20 74  ute the set of t
7510: 61 62 6c 65 73 20 74 68 61 74 20 6d 69 67 68 74  ables that might
7520: 20 73 61 74 69 73 66 79 20 63 61 73 65 73 20 31   satisfy cases 1
7530: 20 6f 72 20 32 2e 0a 20 20 2a 2f 0a 20 20 69 6e   or 2..  */.  in
7540: 64 65 78 61 62 6c 65 20 3d 20 7e 28 42 69 74 6d  dexable = ~(Bitm
7550: 61 73 6b 29 30 3b 0a 20 20 63 68 6e 67 54 6f 49  ask)0;.  chngToI
7560: 4e 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b  N = ~(Bitmask)0;
7570: 0a 20 20 66 6f 72 28 69 3d 70 4f 72 57 63 2d 3e  .  for(i=pOrWc->
7580: 6e 54 65 72 6d 2d 31 2c 20 70 4f 72 54 65 72 6d  nTerm-1, pOrTerm
7590: 3d 70 4f 72 57 63 2d 3e 61 3b 20 69 3e 3d 30 20  =pOrWc->a; i>=0 
75a0: 26 26 20 69 6e 64 65 78 61 62 6c 65 3b 20 69 2d  && indexable; i-
75b0: 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20  -, pOrTerm++){. 
75c0: 20 20 20 69 66 28 20 28 70 4f 72 54 65 72 6d 2d     if( (pOrTerm-
75d0: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
75e0: 53 49 4e 47 4c 45 29 3d 3d 30 20 29 7b 0a 20 20  SINGLE)==0 ){.  
75f0: 20 20 20 20 57 68 65 72 65 41 6e 64 49 6e 66 6f      WhereAndInfo
7600: 20 2a 70 41 6e 64 49 6e 66 6f 3b 0a 20 20 20 20   *pAndInfo;.    
7610: 20 20 61 73 73 65 72 74 28 20 28 70 4f 72 54 65    assert( (pOrTe
7620: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54  rm->wtFlags & (T
7630: 45 52 4d 5f 41 4e 44 49 4e 46 4f 7c 54 45 52 4d  ERM_ANDINFO|TERM
7640: 5f 4f 52 49 4e 46 4f 29 29 3d 3d 30 20 29 3b 0a  _ORINFO))==0 );.
7650: 20 20 20 20 20 20 63 68 6e 67 54 6f 49 4e 20 3d        chngToIN =
7660: 20 30 3b 0a 20 20 20 20 20 20 70 41 6e 64 49 6e   0;.      pAndIn
7670: 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  fo = sqlite3DbMa
7680: 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65  llocRaw(db, size
7690: 6f 66 28 2a 70 41 6e 64 49 6e 66 6f 29 29 3b 0a  of(*pAndInfo));.
76a0: 20 20 20 20 20 20 69 66 28 20 70 41 6e 64 49 6e        if( pAndIn
76b0: 66 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 57 68  fo ){.        Wh
76c0: 65 72 65 43 6c 61 75 73 65 20 2a 70 41 6e 64 57  ereClause *pAndW
76d0: 43 3b 0a 20 20 20 20 20 20 20 20 57 68 65 72 65  C;.        Where
76e0: 54 65 72 6d 20 2a 70 41 6e 64 54 65 72 6d 3b 0a  Term *pAndTerm;.
76f0: 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20          int j;. 
7700: 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 62         Bitmask b
7710: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 4f   = 0;.        pO
7720: 72 54 65 72 6d 2d 3e 75 2e 70 41 6e 64 49 6e 66  rTerm->u.pAndInf
7730: 6f 20 3d 20 70 41 6e 64 49 6e 66 6f 3b 0a 20 20  o = pAndInfo;.  
7740: 20 20 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 77        pOrTerm->w
7750: 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 41  tFlags |= TERM_A
7760: 4e 44 49 4e 46 4f 3b 0a 20 20 20 20 20 20 20 20  NDINFO;.        
7770: 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  pOrTerm->eOperat
7780: 6f 72 20 3d 20 57 4f 5f 41 4e 44 3b 0a 20 20 20  or = WO_AND;.   
7790: 20 20 20 20 20 70 41 6e 64 57 43 20 3d 20 26 70       pAndWC = &p
77a0: 41 6e 64 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20  AndInfo->wc;.   
77b0: 20 20 20 20 20 77 68 65 72 65 43 6c 61 75 73 65       whereClause
77c0: 49 6e 69 74 28 70 41 6e 64 57 43 2c 20 70 57 43  Init(pAndWC, pWC
77d0: 2d 3e 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20  ->pWInfo);.     
77e0: 20 20 20 77 68 65 72 65 53 70 6c 69 74 28 70 41     whereSplit(pA
77f0: 6e 64 57 43 2c 20 70 4f 72 54 65 72 6d 2d 3e 70  ndWC, pOrTerm->p
7800: 45 78 70 72 2c 20 54 4b 5f 41 4e 44 29 3b 0a 20  Expr, TK_AND);. 
7810: 20 20 20 20 20 20 20 65 78 70 72 41 6e 61 6c 79         exprAnaly
7820: 7a 65 41 6c 6c 28 70 53 72 63 2c 20 70 41 6e 64  zeAll(pSrc, pAnd
7830: 57 43 29 3b 0a 20 20 20 20 20 20 20 20 70 41 6e  WC);.        pAn
7840: 64 57 43 2d 3e 70 4f 75 74 65 72 20 3d 20 70 57  dWC->pOuter = pW
7850: 43 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  C;.        testc
7860: 61 73 65 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ase( db->mallocF
7870: 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20  ailed );.       
7880: 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63   if( !db->malloc
7890: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20  Failed ){.      
78a0: 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 41 6e      for(j=0, pAn
78b0: 64 54 65 72 6d 3d 70 41 6e 64 57 43 2d 3e 61 3b  dTerm=pAndWC->a;
78c0: 20 6a 3c 70 41 6e 64 57 43 2d 3e 6e 54 65 72 6d   j<pAndWC->nTerm
78d0: 3b 20 6a 2b 2b 2c 20 70 41 6e 64 54 65 72 6d 2b  ; j++, pAndTerm+
78e0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
78f0: 61 73 73 65 72 74 28 20 70 41 6e 64 54 65 72 6d  assert( pAndTerm
7900: 2d 3e 70 45 78 70 72 20 29 3b 0a 20 20 20 20 20  ->pExpr );.     
7910: 20 20 20 20 20 20 20 69 66 28 20 61 6c 6c 6f 77         if( allow
7920: 65 64 4f 70 28 70 41 6e 64 54 65 72 6d 2d 3e 70  edOp(pAndTerm->p
7930: 45 78 70 72 2d 3e 6f 70 29 20 29 7b 0a 20 20 20  Expr->op) ){.   
7940: 20 20 20 20 20 20 20 20 20 20 20 62 20 7c 3d 20             b |= 
7950: 67 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d  getMask(&pWInfo-
7960: 3e 73 4d 61 73 6b 53 65 74 2c 20 70 41 6e 64 54  >sMaskSet, pAndT
7970: 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 29  erm->leftCursor)
7980: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
7990: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
79a0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 6e      }.        in
79b0: 64 65 78 61 62 6c 65 20 26 3d 20 62 3b 0a 20 20  dexable &= b;.  
79c0: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
79d0: 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46  if( pOrTerm->wtF
79e0: 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 50 49  lags & TERM_COPI
79f0: 45 44 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 53  ED ){.      /* S
7a00: 6b 69 70 20 74 68 69 73 20 74 65 72 6d 20 66 6f  kip this term fo
7a10: 72 20 6e 6f 77 2e 20 20 57 65 20 72 65 76 69 73  r now.  We revis
7a20: 69 74 20 69 74 20 77 68 65 6e 20 77 65 20 70 72  it it when we pr
7a30: 6f 63 65 73 73 20 74 68 65 0a 20 20 20 20 20 20  ocess the.      
7a40: 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  ** corresponding
7a50: 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 74 65   TERM_VIRTUAL te
7a60: 72 6d 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b  rm */.    }else{
7a70: 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 62  .      Bitmask b
7a80: 3b 0a 20 20 20 20 20 20 62 20 3d 20 67 65 74 4d  ;.      b = getM
7a90: 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61  ask(&pWInfo->sMa
7aa0: 73 6b 53 65 74 2c 20 70 4f 72 54 65 72 6d 2d 3e  skSet, pOrTerm->
7ab0: 6c 65 66 74 43 75 72 73 6f 72 29 3b 0a 20 20 20  leftCursor);.   
7ac0: 20 20 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e     if( pOrTerm->
7ad0: 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
7ae0: 49 52 54 55 41 4c 20 29 7b 0a 20 20 20 20 20 20  IRTUAL ){.      
7af0: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 74    WhereTerm *pOt
7b00: 68 65 72 20 3d 20 26 70 4f 72 57 63 2d 3e 61 5b  her = &pOrWc->a[
7b10: 70 4f 72 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74  pOrTerm->iParent
7b20: 5d 3b 0a 20 20 20 20 20 20 20 20 62 20 7c 3d 20  ];.        b |= 
7b30: 67 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d  getMask(&pWInfo-
7b40: 3e 73 4d 61 73 6b 53 65 74 2c 20 70 4f 74 68 65  >sMaskSet, pOthe
7b50: 72 2d 3e 6c 65 66 74 43 75 72 73 6f 72 29 3b 0a  r->leftCursor);.
7b60: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 6e        }.      in
7b70: 64 65 78 61 62 6c 65 20 26 3d 20 62 3b 0a 20 20  dexable &= b;.  
7b80: 20 20 20 20 69 66 28 20 28 70 4f 72 54 65 72 6d      if( (pOrTerm
7b90: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
7ba0: 5f 45 51 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  _EQ)==0 ){.     
7bb0: 20 20 20 63 68 6e 67 54 6f 49 4e 20 3d 20 30 3b     chngToIN = 0;
7bc0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
7bd0: 20 20 20 20 20 20 63 68 6e 67 54 6f 49 4e 20 26        chngToIN &
7be0: 3d 20 62 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = b;.      }.   
7bf0: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a   }.  }..  /*.  *
7c00: 2a 20 52 65 63 6f 72 64 20 74 68 65 20 73 65 74  * Record the set
7c10: 20 6f 66 20 74 61 62 6c 65 73 20 74 68 61 74 20   of tables that 
7c20: 73 61 74 69 73 66 79 20 63 61 73 65 20 32 2e 20  satisfy case 2. 
7c30: 20 54 68 65 20 73 65 74 20 6d 69 67 68 74 20 62   The set might b
7c40: 65 0a 20 20 2a 2a 20 65 6d 70 74 79 2e 0a 20 20  e.  ** empty..  
7c50: 2a 2f 0a 20 20 70 4f 72 49 6e 66 6f 2d 3e 69 6e  */.  pOrInfo->in
7c60: 64 65 78 61 62 6c 65 20 3d 20 69 6e 64 65 78 61  dexable = indexa
7c70: 62 6c 65 3b 0a 20 20 70 54 65 72 6d 2d 3e 65 4f  ble;.  pTerm->eO
7c80: 70 65 72 61 74 6f 72 20 3d 20 69 6e 64 65 78 61  perator = indexa
7c90: 62 6c 65 3d 3d 30 20 3f 20 30 20 3a 20 57 4f 5f  ble==0 ? 0 : WO_
7ca0: 4f 52 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 63  OR;..  /*.  ** c
7cb0: 68 6e 67 54 6f 49 4e 20 68 6f 6c 64 73 20 61 20  hngToIN holds a 
7cc0: 73 65 74 20 6f 66 20 74 61 62 6c 65 73 20 74 68  set of tables th
7cd0: 61 74 20 2a 6d 69 67 68 74 2a 20 73 61 74 69 73  at *might* satis
7ce0: 66 79 20 63 61 73 65 20 31 2e 20 20 42 75 74 0a  fy case 1.  But.
7cf0: 20 20 2a 2a 20 77 65 20 68 61 76 65 20 74 6f 20    ** we have to 
7d00: 64 6f 20 73 6f 6d 65 20 61 64 64 69 74 69 6f 6e  do some addition
7d10: 61 6c 20 63 68 65 63 6b 69 6e 67 20 74 6f 20 73  al checking to s
7d20: 65 65 20 69 66 20 63 61 73 65 20 31 20 72 65 61  ee if case 1 rea
7d30: 6c 6c 79 0a 20 20 2a 2a 20 69 73 20 73 61 74 69  lly.  ** is sati
7d40: 73 66 69 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  sfied..  **.  **
7d50: 20 63 68 6e 67 54 6f 49 4e 20 77 69 6c 6c 20 68   chngToIN will h
7d60: 6f 6c 64 20 65 69 74 68 65 72 20 30 2c 20 31 2c  old either 0, 1,
7d70: 20 6f 72 20 32 20 62 69 74 73 2e 20 20 54 68 65   or 2 bits.  The
7d80: 20 30 2d 62 69 74 20 63 61 73 65 20 6d 65 61 6e   0-bit case mean
7d90: 73 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65 72  s.  ** that ther
7da0: 65 20 69 73 20 6e 6f 20 70 6f 73 73 69 62 69 6c  e is no possibil
7db0: 69 74 79 20 6f 66 20 74 72 61 6e 73 66 6f 72 6d  ity of transform
7dc0: 69 6e 67 20 74 68 65 20 4f 52 20 63 6c 61 75 73  ing the OR claus
7dd0: 65 20 69 6e 74 6f 20 61 6e 0a 20 20 2a 2a 20 49  e into an.  ** I
7de0: 4e 20 6f 70 65 72 61 74 6f 72 20 62 65 63 61 75  N operator becau
7df0: 73 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 74  se one or more t
7e00: 65 72 6d 73 20 69 6e 20 74 68 65 20 4f 52 20 63  erms in the OR c
7e10: 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 0a 20 20  lause contain.  
7e20: 2a 2a 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68  ** something oth
7e30: 65 72 20 74 68 61 6e 20 3d 3d 20 6f 6e 20 61 20  er than == on a 
7e40: 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 73 69  column in the si
7e50: 6e 67 6c 65 20 74 61 62 6c 65 2e 20 20 54 68 65  ngle table.  The
7e60: 20 31 2d 62 69 74 0a 20 20 2a 2a 20 63 61 73 65   1-bit.  ** case
7e70: 20 6d 65 61 6e 73 20 74 68 61 74 20 65 76 65 72   means that ever
7e80: 79 20 74 65 72 6d 20 6f 66 20 74 68 65 20 4f 52  y term of the OR
7e90: 20 63 6c 61 75 73 65 20 69 73 20 6f 66 20 74 68   clause is of th
7ea0: 65 20 66 6f 72 6d 0a 20 20 2a 2a 20 22 74 61 62  e form.  ** "tab
7eb0: 6c 65 2e 63 6f 6c 75 6d 6e 3d 65 78 70 72 22 20  le.column=expr" 
7ec0: 66 6f 72 20 73 6f 6d 65 20 73 69 6e 67 6c 65 20  for some single 
7ed0: 74 61 62 6c 65 2e 20 20 54 68 65 20 6f 6e 65 20  table.  The one 
7ee0: 62 69 74 20 74 68 61 74 20 69 73 20 73 65 74 0a  bit that is set.
7ef0: 20 20 2a 2a 20 77 69 6c 6c 20 63 6f 72 72 65 73    ** will corres
7f00: 70 6f 6e 64 20 74 6f 20 74 68 65 20 63 6f 6d 6d  pond to the comm
7f10: 6f 6e 20 74 61 62 6c 65 2e 20 20 57 65 20 73 74  on table.  We st
7f20: 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63 68 65 63  ill need to chec
7f30: 6b 20 74 6f 20 6d 61 6b 65 0a 20 20 2a 2a 20 73  k to make.  ** s
7f40: 75 72 65 20 74 68 65 20 73 61 6d 65 20 63 6f 6c  ure the same col
7f50: 75 6d 6e 20 69 73 20 75 73 65 64 20 6f 6e 20 61  umn is used on a
7f60: 6c 6c 20 74 65 72 6d 73 2e 20 20 54 68 65 20 32  ll terms.  The 2
7f70: 2d 62 69 74 20 63 61 73 65 20 69 73 20 77 68 65  -bit case is whe
7f80: 6e 0a 20 20 2a 2a 20 74 68 65 20 61 6c 6c 20 74  n.  ** the all t
7f90: 65 72 6d 73 20 61 72 65 20 6f 66 20 74 68 65 20  erms are of the 
7fa0: 66 6f 72 6d 20 22 74 61 62 6c 65 31 2e 63 6f 6c  form "table1.col
7fb0: 75 6d 6e 3d 74 61 62 6c 65 32 2e 63 6f 6c 75 6d  umn=table2.colum
7fc0: 6e 22 2e 20 20 49 74 0a 20 20 2a 2a 20 6d 69 67  n".  It.  ** mig
7fd0: 68 74 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74  ht be possible t
7fe0: 6f 20 66 6f 72 6d 20 61 6e 20 49 4e 20 6f 70 65  o form an IN ope
7ff0: 72 61 74 6f 72 20 77 69 74 68 20 65 69 74 68 65  rator with eithe
8000: 72 20 74 61 62 6c 65 31 2e 63 6f 6c 75 6d 6e 0a  r table1.column.
8010: 20 20 2a 2a 20 6f 72 20 74 61 62 6c 65 32 2e 63    ** or table2.c
8020: 6f 6c 75 6d 6e 20 61 73 20 74 68 65 20 4c 48 53  olumn as the LHS
8030: 20 69 66 20 65 69 74 68 65 72 20 69 73 20 63 6f   if either is co
8040: 6d 6d 6f 6e 20 74 6f 20 65 76 65 72 79 20 74 65  mmon to every te
8050: 72 6d 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 4f  rm of.  ** the O
8060: 52 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 0a 20  R clause..  **. 
8070: 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 65   ** Note that te
8080: 72 6d 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  rms of the form 
8090: 22 74 61 62 6c 65 2e 63 6f 6c 75 6d 6e 31 3d 74  "table.column1=t
80a0: 61 62 6c 65 2e 63 6f 6c 75 6d 6e 32 22 20 28 74  able.column2" (t
80b0: 68 65 0a 20 20 2a 2a 20 73 61 6d 65 20 74 61 62  he.  ** same tab
80c0: 6c 65 20 6f 6e 20 62 6f 74 68 20 73 69 7a 65 73  le on both sizes
80d0: 20 6f 66 20 74 68 65 20 3d 3d 29 20 63 61 6e 6e   of the ==) cann
80e0: 6f 74 20 62 65 20 6f 70 74 69 6d 69 7a 65 64 2e  ot be optimized.
80f0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 68 6e 67  .  */.  if( chng
8100: 54 6f 49 4e 20 29 7b 0a 20 20 20 20 69 6e 74 20  ToIN ){.    int 
8110: 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 3d 20 30  okToChngToIN = 0
8120: 3b 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66  ;     /* True if
8130: 20 74 68 65 20 63 6f 6e 76 65 72 73 69 6f 6e 20   the conversion 
8140: 74 6f 20 49 4e 20 69 73 20 76 61 6c 69 64 20 2a  to IN is valid *
8150: 2f 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 75 6d  /.    int iColum
8160: 6e 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20  n = -1;         
8170: 2f 2a 20 43 6f 6c 75 6d 6e 20 69 6e 64 65 78 20  /* Column index 
8180: 6f 6e 20 6c 68 73 20 6f 66 20 49 4e 20 6f 70 65  on lhs of IN ope
8190: 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 69 6e 74  rator */.    int
81a0: 20 69 43 75 72 73 6f 72 20 3d 20 2d 31 3b 20 20   iCursor = -1;  
81b0: 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20         /* Table 
81c0: 63 75 72 73 6f 72 20 63 6f 6d 6d 6f 6e 20 74 6f  cursor common to
81d0: 20 61 6c 6c 20 74 65 72 6d 73 20 2a 2f 0a 20 20   all terms */.  
81e0: 20 20 69 6e 74 20 6a 20 3d 20 30 3b 20 20 20 20    int j = 0;    
81f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
8200: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a  oop counter */..
8210: 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f      /* Search fo
8220: 72 20 61 20 74 61 62 6c 65 20 61 6e 64 20 63 6f  r a table and co
8230: 6c 75 6d 6e 20 74 68 61 74 20 61 70 70 65 61 72  lumn that appear
8240: 73 20 6f 6e 20 6f 6e 65 20 73 69 64 65 20 6f 72  s on one side or
8250: 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 74 68 65   the.    ** othe
8260: 72 20 6f 66 20 74 68 65 20 3d 3d 20 6f 70 65 72  r of the == oper
8270: 61 74 6f 72 20 69 6e 20 65 76 65 72 79 20 73 75  ator in every su
8280: 62 74 65 72 6d 2e 20 20 54 68 61 74 20 74 61 62  bterm.  That tab
8290: 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 0a 20 20  le and column.  
82a0: 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65 63    ** will be rec
82b0: 6f 72 64 65 64 20 69 6e 20 69 43 75 72 73 6f 72  orded in iCursor
82c0: 20 61 6e 64 20 69 43 6f 6c 75 6d 6e 2e 20 20 54   and iColumn.  T
82d0: 68 65 72 65 20 6d 69 67 68 74 20 6e 6f 74 20 62  here might not b
82e0: 65 20 61 6e 79 0a 20 20 20 20 2a 2a 20 73 75 63  e any.    ** suc
82f0: 68 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75  h table and colu
8300: 6d 6e 2e 20 20 53 65 74 20 6f 6b 54 6f 43 68 6e  mn.  Set okToChn
8310: 67 54 6f 49 4e 20 69 66 20 61 6e 20 61 70 70 72  gToIN if an appr
8320: 6f 70 72 69 61 74 65 20 74 61 62 6c 65 0a 20 20  opriate table.  
8330: 20 20 2a 2a 20 61 6e 64 20 63 6f 6c 75 6d 6e 20    ** and column 
8340: 69 73 20 66 6f 75 6e 64 20 62 75 74 20 6c 65 61  is found but lea
8350: 76 65 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20  ve okToChngToIN 
8360: 66 61 6c 73 65 20 69 66 20 6e 6f 74 20 66 6f 75  false if not fou
8370: 6e 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  nd..    */.    f
8380: 6f 72 28 6a 3d 30 3b 20 6a 3c 32 20 26 26 20 21  or(j=0; j<2 && !
8390: 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 3b 20 6a 2b  okToChngToIN; j+
83a0: 2b 29 7b 0a 20 20 20 20 20 20 70 4f 72 54 65 72  +){.      pOrTer
83b0: 6d 20 3d 20 70 4f 72 57 63 2d 3e 61 3b 0a 20 20  m = pOrWc->a;.  
83c0: 20 20 20 20 66 6f 72 28 69 3d 70 4f 72 57 63 2d      for(i=pOrWc-
83d0: 3e 6e 54 65 72 6d 2d 31 3b 20 69 3e 3d 30 3b 20  >nTerm-1; i>=0; 
83e0: 69 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b 29 7b  i--, pOrTerm++){
83f0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
8400: 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61   pOrTerm->eOpera
8410: 74 6f 72 20 26 20 57 4f 5f 45 51 20 29 3b 0a 20  tor & WO_EQ );. 
8420: 20 20 20 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e         pOrTerm->
8430: 77 74 46 6c 61 67 73 20 26 3d 20 7e 54 45 52 4d  wtFlags &= ~TERM
8440: 5f 4f 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  _OR_OK;.        
8450: 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66  if( pOrTerm->lef
8460: 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 73 6f 72  tCursor==iCursor
8470: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
8480: 20 54 68 69 73 20 69 73 20 74 68 65 20 32 2d 62   This is the 2-b
8490: 69 74 20 63 61 73 65 20 61 6e 64 20 77 65 20 61  it case and we a
84a0: 72 65 20 6f 6e 20 74 68 65 20 73 65 63 6f 6e 64  re on the second
84b0: 20 69 74 65 72 61 74 69 6f 6e 20 61 6e 64 0a 20   iteration and. 
84c0: 20 20 20 20 20 20 20 20 20 2a 2a 20 63 75 72 72           ** curr
84d0: 65 6e 74 20 74 65 72 6d 20 69 73 20 66 72 6f 6d  ent term is from
84e0: 20 74 68 65 20 66 69 72 73 74 20 69 74 65 72 61   the first itera
84f0: 74 69 6f 6e 2e 20 20 53 6f 20 73 6b 69 70 20 74  tion.  So skip t
8500: 68 69 73 20 74 65 72 6d 2e 20 2a 2f 0a 20 20 20  his term. */.   
8510: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6a         assert( j
8520: 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ==1 );.         
8530: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
8540: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
8550: 20 28 63 68 6e 67 54 6f 49 4e 20 26 20 67 65 74   (chngToIN & get
8560: 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d  Mask(&pWInfo->sM
8570: 61 73 6b 53 65 74 2c 20 70 4f 72 54 65 72 6d 2d  askSet, pOrTerm-
8580: 3e 6c 65 66 74 43 75 72 73 6f 72 29 29 3d 3d 30  >leftCursor))==0
8590: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
85a0: 20 54 68 69 73 20 74 65 72 6d 20 6d 75 73 74 20   This term must 
85b0: 62 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 74  be of the form t
85c0: 31 2e 61 3d 3d 74 32 2e 62 20 77 68 65 72 65 20  1.a==t2.b where 
85d0: 74 32 20 69 73 20 69 6e 20 74 68 65 0a 20 20 20  t2 is in the.   
85e0: 20 20 20 20 20 20 20 2a 2a 20 63 68 6e 67 54 6f         ** chngTo
85f0: 49 4e 20 73 65 74 20 62 75 74 20 74 31 20 69 73  IN set but t1 is
8600: 20 6e 6f 74 2e 20 20 54 68 69 73 20 74 65 72 6d   not.  This term
8610: 20 77 69 6c 6c 20 62 65 20 65 69 74 68 65 72 20   will be either 
8620: 70 72 65 63 65 64 65 64 0a 20 20 20 20 20 20 20  preceded.       
8630: 20 20 20 2a 2a 20 6f 72 20 66 6f 6c 6c 77 65 64     ** or follwed
8640: 20 62 79 20 61 6e 20 69 6e 76 65 72 74 65 64 20   by an inverted 
8650: 63 6f 70 79 20 28 74 32 2e 62 3d 3d 74 31 2e 61  copy (t2.b==t1.a
8660: 29 2e 20 20 53 6b 69 70 20 74 68 69 73 20 74 65  ).  Skip this te
8670: 72 6d 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  rm .          **
8680: 20 61 6e 64 20 75 73 65 20 69 74 73 20 69 6e 76   and use its inv
8690: 65 72 73 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20  ersion. */.     
86a0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
86b0: 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20  OrTerm->wtFlags 
86c0: 26 20 54 45 52 4d 5f 43 4f 50 49 45 44 20 29 3b  & TERM_COPIED );
86d0: 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
86e0: 61 73 65 28 20 70 4f 72 54 65 72 6d 2d 3e 77 74  ase( pOrTerm->wt
86f0: 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52  Flags & TERM_VIR
8700: 54 55 41 4c 20 29 3b 0a 20 20 20 20 20 20 20 20  TUAL );.        
8710: 20 20 61 73 73 65 72 74 28 20 70 4f 72 54 65 72    assert( pOrTer
8720: 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54 45  m->wtFlags & (TE
8730: 52 4d 5f 43 4f 50 49 45 44 7c 54 45 52 4d 5f 56  RM_COPIED|TERM_V
8740: 49 52 54 55 41 4c 29 20 29 3b 0a 20 20 20 20 20  IRTUAL) );.     
8750: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
8760: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
8770: 20 69 43 6f 6c 75 6d 6e 20 3d 20 70 4f 72 54 65   iColumn = pOrTe
8780: 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e  rm->u.leftColumn
8790: 3b 0a 20 20 20 20 20 20 20 20 69 43 75 72 73 6f  ;.        iCurso
87a0: 72 20 3d 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66  r = pOrTerm->lef
87b0: 74 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 20  tCursor;.       
87c0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
87d0: 20 20 20 20 20 20 69 66 28 20 69 3c 30 20 29 7b        if( i<0 ){
87e0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20 63  .        /* No c
87f0: 61 6e 64 69 64 61 74 65 20 74 61 62 6c 65 2b 63  andidate table+c
8800: 6f 6c 75 6d 6e 20 77 61 73 20 66 6f 75 6e 64 2e  olumn was found.
8810: 20 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20    This can only 
8820: 6f 63 63 75 72 0a 20 20 20 20 20 20 20 20 2a 2a  occur.        **
8830: 20 6f 6e 20 74 68 65 20 73 65 63 6f 6e 64 20 69   on the second i
8840: 74 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  teration */.    
8850: 20 20 20 20 61 73 73 65 72 74 28 20 6a 3d 3d 31      assert( j==1
8860: 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
8870: 72 74 28 20 49 73 50 6f 77 65 72 4f 66 54 77 6f  rt( IsPowerOfTwo
8880: 28 63 68 6e 67 54 6f 49 4e 29 20 29 3b 0a 20 20  (chngToIN) );.  
8890: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 63 68        assert( ch
88a0: 6e 67 54 6f 49 4e 3d 3d 67 65 74 4d 61 73 6b 28  ngToIN==getMask(
88b0: 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65  &pWInfo->sMaskSe
88c0: 74 2c 20 69 43 75 72 73 6f 72 29 20 29 3b 0a 20  t, iCursor) );. 
88d0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
88e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 74 65 73 74      }.      test
88f0: 63 61 73 65 28 20 6a 3d 3d 31 20 29 3b 0a 0a 20  case( j==1 );.. 
8900: 20 20 20 20 20 2f 2a 20 57 65 20 68 61 76 65 20       /* We have 
8910: 66 6f 75 6e 64 20 61 20 63 61 6e 64 69 64 61 74  found a candidat
8920: 65 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75  e table and colu
8930: 6d 6e 2e 20 20 43 68 65 63 6b 20 74 6f 20 73 65  mn.  Check to se
8940: 65 20 69 66 20 74 68 61 74 0a 20 20 20 20 20 20  e if that.      
8950: 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c  ** table and col
8960: 75 6d 6e 20 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f  umn is common to
8970: 20 65 76 65 72 79 20 74 65 72 6d 20 69 6e 20 74   every term in t
8980: 68 65 20 4f 52 20 63 6c 61 75 73 65 20 2a 2f 0a  he OR clause */.
8990: 20 20 20 20 20 20 6f 6b 54 6f 43 68 6e 67 54 6f        okToChngTo
89a0: 49 4e 20 3d 20 31 3b 0a 20 20 20 20 20 20 66 6f  IN = 1;.      fo
89b0: 72 28 3b 20 69 3e 3d 30 20 26 26 20 6f 6b 54 6f  r(; i>=0 && okTo
89c0: 43 68 6e 67 54 6f 49 4e 3b 20 69 2d 2d 2c 20 70  ChngToIN; i--, p
89d0: 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20  OrTerm++){.     
89e0: 20 20 20 61 73 73 65 72 74 28 20 70 4f 72 54 65     assert( pOrTe
89f0: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
8a00: 57 4f 5f 45 51 20 29 3b 0a 20 20 20 20 20 20 20  WO_EQ );.       
8a10: 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65   if( pOrTerm->le
8a20: 66 74 43 75 72 73 6f 72 21 3d 69 43 75 72 73 6f  ftCursor!=iCurso
8a30: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  r ){.          p
8a40: 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20  OrTerm->wtFlags 
8a50: 26 3d 20 7e 54 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a  &= ~TERM_OR_OK;.
8a60: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
8a70: 28 20 70 4f 72 54 65 72 6d 2d 3e 75 2e 6c 65 66  ( pOrTerm->u.lef
8a80: 74 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 75 6d 6e  tColumn!=iColumn
8a90: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6f 6b   ){.          ok
8aa0: 54 6f 43 68 6e 67 54 6f 49 4e 20 3d 20 30 3b 0a  ToChngToIN = 0;.
8ab0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
8ac0: 20 20 20 20 20 20 20 20 20 69 6e 74 20 61 66 66           int aff
8ad0: 4c 65 66 74 2c 20 61 66 66 52 69 67 68 74 3b 0a  Left, affRight;.
8ae0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
8af0: 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73  the right-hand s
8b00: 69 64 65 20 69 73 20 61 6c 73 6f 20 61 20 63 6f  ide is also a co
8b10: 6c 75 6d 6e 2c 20 74 68 65 6e 20 74 68 65 20 61  lumn, then the a
8b20: 66 66 69 6e 69 74 69 65 73 0a 20 20 20 20 20 20  ffinities.      
8b30: 20 20 20 20 2a 2a 20 6f 66 20 62 6f 74 68 20 72      ** of both r
8b40: 69 67 68 74 20 61 6e 64 20 6c 65 66 74 20 73 69  ight and left si
8b50: 64 65 73 20 6d 75 73 74 20 62 65 20 73 75 63 68  des must be such
8b60: 20 74 68 61 74 20 6e 6f 20 74 79 70 65 0a 20 20   that no type.  
8b70: 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 76 65          ** conve
8b80: 72 73 69 6f 6e 73 20 61 72 65 20 72 65 71 75 69  rsions are requi
8b90: 72 65 64 20 6f 6e 20 74 68 65 20 72 69 67 68 74  red on the right
8ba0: 2e 20 20 28 54 69 63 6b 65 74 20 23 32 32 34 39  .  (Ticket #2249
8bb0: 29 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ).          */. 
8bc0: 20 20 20 20 20 20 20 20 20 61 66 66 52 69 67 68           affRigh
8bd0: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  t = sqlite3ExprA
8be0: 66 66 69 6e 69 74 79 28 70 4f 72 54 65 72 6d 2d  ffinity(pOrTerm-
8bf0: 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b  >pExpr->pRight);
8c00: 0a 20 20 20 20 20 20 20 20 20 20 61 66 66 4c 65  .          affLe
8c10: 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ft = sqlite3Expr
8c20: 41 66 66 69 6e 69 74 79 28 70 4f 72 54 65 72 6d  Affinity(pOrTerm
8c30: 2d 3e 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  ->pExpr->pLeft);
8c40: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61  .          if( a
8c50: 66 66 52 69 67 68 74 21 3d 30 20 26 26 20 61 66  ffRight!=0 && af
8c60: 66 52 69 67 68 74 21 3d 61 66 66 4c 65 66 74 20  fRight!=affLeft 
8c70: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f  ){.            o
8c80: 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 3d 20 30 3b  kToChngToIN = 0;
8c90: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
8ca0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4f  {.            pO
8cb0: 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c  rTerm->wtFlags |
8cc0: 3d 20 54 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a 20 20  = TERM_OR_OK;.  
8cd0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
8ce0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
8cf0: 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69  }..    /* At thi
8d00: 73 20 70 6f 69 6e 74 2c 20 6f 6b 54 6f 43 68 6e  s point, okToChn
8d10: 67 54 6f 49 4e 20 69 73 20 74 72 75 65 20 69 66  gToIN is true if
8d20: 20 6f 72 69 67 69 6e 61 6c 20 70 54 65 72 6d 20   original pTerm 
8d30: 73 61 74 69 73 66 69 65 73 0a 20 20 20 20 2a 2a  satisfies.    **
8d40: 20 63 61 73 65 20 31 2e 20 20 49 6e 20 74 68 61   case 1.  In tha
8d50: 74 20 63 61 73 65 2c 20 63 6f 6e 73 74 72 75 63  t case, construc
8d60: 74 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c 20  t a new virtual 
8d70: 74 65 72 6d 20 74 68 61 74 20 69 73 20 0a 20 20  term that is .  
8d80: 20 20 2a 2a 20 70 54 65 72 6d 20 63 6f 6e 76 65    ** pTerm conve
8d90: 72 74 65 64 20 69 6e 74 6f 20 61 6e 20 49 4e 20  rted into an IN 
8da0: 6f 70 65 72 61 74 6f 72 2e 0a 20 20 20 20 2a 2f  operator..    */
8db0: 0a 20 20 20 20 69 66 28 20 6f 6b 54 6f 43 68 6e  .    if( okToChn
8dc0: 67 54 6f 49 4e 20 29 7b 0a 20 20 20 20 20 20 45  gToIN ){.      E
8dd0: 78 70 72 20 2a 70 44 75 70 3b 20 20 20 20 20 20  xpr *pDup;      
8de0: 20 20 20 20 20 20 2f 2a 20 41 20 74 72 61 6e 73        /* A trans
8df0: 69 65 6e 74 20 64 75 70 6c 69 63 61 74 65 20 65  ient duplicate e
8e00: 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20  xpression */.   
8e10: 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69     ExprList *pLi
8e20: 73 74 20 3d 20 30 3b 20 20 20 2f 2a 20 54 68 65  st = 0;   /* The
8e30: 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f   RHS of the IN o
8e40: 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20  perator */.     
8e50: 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 30   Expr *pLeft = 0
8e60: 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c  ;       /* The L
8e70: 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65  HS of the IN ope
8e80: 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 45  rator */.      E
8e90: 78 70 72 20 2a 70 4e 65 77 3b 20 20 20 20 20 20  xpr *pNew;      
8ea0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d        /* The com
8eb0: 70 6c 65 74 65 20 49 4e 20 6f 70 65 72 61 74 6f  plete IN operato
8ec0: 72 20 2a 2f 0a 0a 20 20 20 20 20 20 66 6f 72 28  r */..      for(
8ed0: 69 3d 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d 31  i=pOrWc->nTerm-1
8ee0: 2c 20 70 4f 72 54 65 72 6d 3d 70 4f 72 57 63 2d  , pOrTerm=pOrWc-
8ef0: 3e 61 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70  >a; i>=0; i--, p
8f00: 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20  OrTerm++){.     
8f10: 20 20 20 69 66 28 20 28 70 4f 72 54 65 72 6d 2d     if( (pOrTerm-
8f20: 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
8f30: 4f 52 5f 4f 4b 29 3d 3d 30 20 29 20 63 6f 6e 74  OR_OK)==0 ) cont
8f40: 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 61 73  inue;.        as
8f50: 73 65 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e 65  sert( pOrTerm->e
8f60: 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45 51  Operator & WO_EQ
8f70: 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
8f80: 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66  rt( pOrTerm->lef
8f90: 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 73 6f 72  tCursor==iCursor
8fa0: 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
8fb0: 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e 75 2e 6c  rt( pOrTerm->u.l
8fc0: 65 66 74 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 75  eftColumn==iColu
8fd0: 6d 6e 20 29 3b 0a 20 20 20 20 20 20 20 20 70 44  mn );.        pD
8fe0: 75 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  up = sqlite3Expr
8ff0: 44 75 70 28 64 62 2c 20 70 4f 72 54 65 72 6d 2d  Dup(db, pOrTerm-
9000: 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20  >pExpr->pRight, 
9010: 30 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 69 73  0);.        pLis
9020: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  t = sqlite3ExprL
9030: 69 73 74 41 70 70 65 6e 64 28 70 57 49 6e 66 6f  istAppend(pWInfo
9040: 2d 3e 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2c  ->pParse, pList,
9050: 20 70 44 75 70 29 3b 0a 20 20 20 20 20 20 20 20   pDup);.        
9060: 70 4c 65 66 74 20 3d 20 70 4f 72 54 65 72 6d 2d  pLeft = pOrTerm-
9070: 3e 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20  >pExpr->pLeft;. 
9080: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
9090: 65 72 74 28 20 70 4c 65 66 74 21 3d 30 20 29 3b  ert( pLeft!=0 );
90a0: 0a 20 20 20 20 20 20 70 44 75 70 20 3d 20 73 71  .      pDup = sq
90b0: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
90c0: 20 70 4c 65 66 74 2c 20 30 29 3b 0a 20 20 20 20   pLeft, 0);.    
90d0: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
90e0: 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
90f0: 5f 49 4e 2c 20 70 44 75 70 2c 20 30 2c 20 30 29  _IN, pDup, 0, 0)
9100: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65 77  ;.      if( pNew
9110: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
9120: 69 64 78 4e 65 77 3b 0a 20 20 20 20 20 20 20 20  idxNew;.        
9130: 74 72 61 6e 73 66 65 72 4a 6f 69 6e 4d 61 72 6b  transferJoinMark
9140: 69 6e 67 73 28 70 4e 65 77 2c 20 70 45 78 70 72  ings(pNew, pExpr
9150: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
9160: 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
9170: 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 78 49 73  rty(pNew, EP_xIs
9180: 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20  Select) );.     
9190: 20 20 20 70 4e 65 77 2d 3e 78 2e 70 4c 69 73 74     pNew->x.pList
91a0: 20 3d 20 70 4c 69 73 74 3b 0a 20 20 20 20 20 20   = pList;.      
91b0: 20 20 69 64 78 4e 65 77 20 3d 20 77 68 65 72 65    idxNew = where
91c0: 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57 43  ClauseInsert(pWC
91d0: 2c 20 70 4e 65 77 2c 20 54 45 52 4d 5f 56 49 52  , pNew, TERM_VIR
91e0: 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49  TUAL|TERM_DYNAMI
91f0: 43 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  C);.        test
9200: 63 61 73 65 28 20 69 64 78 4e 65 77 3d 3d 30 20  case( idxNew==0 
9210: 29 3b 0a 20 20 20 20 20 20 20 20 65 78 70 72 41  );.        exprA
9220: 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20 70 57 43  nalyze(pSrc, pWC
9230: 2c 20 69 64 78 4e 65 77 29 3b 0a 20 20 20 20 20  , idxNew);.     
9240: 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d     pTerm = &pWC-
9250: 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20  >a[idxTerm];.   
9260: 20 20 20 20 20 70 57 43 2d 3e 61 5b 69 64 78 4e       pWC->a[idxN
9270: 65 77 5d 2e 69 50 61 72 65 6e 74 20 3d 20 69 64  ew].iParent = id
9280: 78 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 70  xTerm;.        p
9290: 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 31  Term->nChild = 1
92a0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
92b0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
92c0: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
92d0: 20 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 7d   pList);.      }
92e0: 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 65 4f  .      pTerm->eO
92f0: 70 65 72 61 74 6f 72 20 3d 20 57 4f 5f 4e 4f 4f  perator = WO_NOO
9300: 50 3b 20 20 2f 2a 20 63 61 73 65 20 31 20 74 72  P;  /* case 1 tr
9310: 75 6d 70 73 20 63 61 73 65 20 32 20 2a 2f 0a 20  umps case 2 */. 
9320: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69     }.  }.}.#endi
9330: 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49  f /* !SQLITE_OMI
9340: 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  T_OR_OPTIMIZATIO
9350: 4e 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 4d 49  N && !SQLITE_OMI
9360: 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 2f  T_SUBQUERY */../
9370: 2a 0a 2a 2a 20 54 68 65 20 69 6e 70 75 74 20 74  *.** The input t
9380: 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  o this routine i
9390: 73 20 61 6e 20 57 68 65 72 65 54 65 72 6d 20 73  s an WhereTerm s
93a0: 74 72 75 63 74 75 72 65 20 77 69 74 68 20 6f 6e  tructure with on
93b0: 6c 79 20 74 68 65 0a 2a 2a 20 22 70 45 78 70 72  ly the.** "pExpr
93c0: 22 20 66 69 65 6c 64 20 66 69 6c 6c 65 64 20 69  " field filled i
93d0: 6e 2e 20 20 54 68 65 20 6a 6f 62 20 6f 66 20 74  n.  The job of t
93e0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74  his routine is t
93f0: 6f 20 61 6e 61 6c 79 7a 65 20 74 68 65 0a 2a 2a  o analyze the.**
9400: 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 61   subexpression a
9410: 6e 64 20 70 6f 70 75 6c 61 74 65 20 61 6c 6c 20  nd populate all 
9420: 74 68 65 20 6f 74 68 65 72 20 66 69 65 6c 64 73  the other fields
9430: 20 6f 66 20 74 68 65 20 57 68 65 72 65 54 65 72   of the WhereTer
9440: 6d 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 0a  m.** structure..
9450: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70  **.** If the exp
9460: 72 65 73 73 69 6f 6e 20 69 73 20 6f 66 20 74 68  ression is of th
9470: 65 20 66 6f 72 6d 20 22 3c 65 78 70 72 3e 20 3c  e form "<expr> <
9480: 6f 70 3e 20 58 22 20 69 74 20 67 65 74 73 20 63  op> X" it gets c
9490: 6f 6d 6d 75 74 65 64 0a 2a 2a 20 74 6f 20 74 68  ommuted.** to th
94a0: 65 20 73 74 61 6e 64 61 72 64 20 66 6f 72 6d 20  e standard form 
94b0: 6f 66 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72  of "X <op> <expr
94c0: 3e 22 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  >"..**.** If the
94d0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6f   expression is o
94e0: 66 20 74 68 65 20 66 6f 72 6d 20 22 58 20 3c 6f  f the form "X <o
94f0: 70 3e 20 59 22 20 77 68 65 72 65 20 62 6f 74 68  p> Y" where both
9500: 20 58 20 61 6e 64 20 59 20 61 72 65 0a 2a 2a 20   X and Y are.** 
9510: 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 74 68  columns, then th
9520: 65 20 6f 72 69 67 69 6e 61 6c 20 65 78 70 72 65  e original expre
9530: 73 73 69 6f 6e 20 69 73 20 75 6e 63 68 61 6e 67  ssion is unchang
9540: 65 64 20 61 6e 64 20 61 20 6e 65 77 20 76 69 72  ed and a new vir
9550: 74 75 61 6c 0a 2a 2a 20 74 65 72 6d 20 6f 66 20  tual.** term of 
9560: 74 68 65 20 66 6f 72 6d 20 22 59 20 3c 6f 70 3e  the form "Y <op>
9570: 20 58 22 20 69 73 20 61 64 64 65 64 20 74 6f 20   X" is added to 
9580: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
9590: 20 61 6e 64 0a 2a 2a 20 61 6e 61 6c 79 7a 65 64   and.** analyzed
95a0: 20 73 65 70 61 72 61 74 65 6c 79 2e 20 20 54 68   separately.  Th
95b0: 65 20 6f 72 69 67 69 6e 61 6c 20 74 65 72 6d 20  e original term 
95c0: 69 73 20 6d 61 72 6b 65 64 20 77 69 74 68 20 54  is marked with T
95d0: 45 52 4d 5f 43 4f 50 49 45 44 0a 2a 2a 20 61 6e  ERM_COPIED.** an
95e0: 64 20 74 68 65 20 6e 65 77 20 74 65 72 6d 20 69  d the new term i
95f0: 73 20 6d 61 72 6b 65 64 20 77 69 74 68 20 54 45  s marked with TE
9600: 52 4d 5f 44 59 4e 41 4d 49 43 20 28 62 65 63 61  RM_DYNAMIC (beca
9610: 75 73 65 20 69 74 27 73 20 70 45 78 70 72 0a 2a  use it's pExpr.*
9620: 2a 20 6e 65 65 64 73 20 74 6f 20 62 65 20 66 72  * needs to be fr
9630: 65 65 64 20 77 69 74 68 20 74 68 65 20 57 68 65  eed with the Whe
9640: 72 65 43 6c 61 75 73 65 29 20 61 6e 64 20 54 45  reClause) and TE
9650: 52 4d 5f 56 49 52 54 55 41 4c 20 28 62 65 63 61  RM_VIRTUAL (beca
9660: 75 73 65 20 69 74 0a 2a 2a 20 69 73 20 61 20 63  use it.** is a c
9670: 6f 6d 6d 75 74 65 64 20 63 6f 70 79 20 6f 66 20  ommuted copy of 
9680: 61 20 70 72 69 6f 72 20 74 65 72 6d 2e 29 20 20  a prior term.)  
9690: 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 74 65 72  The original ter
96a0: 6d 20 68 61 73 20 6e 43 68 69 6c 64 3d 31 0a 2a  m has nChild=1.*
96b0: 2a 20 61 6e 64 20 74 68 65 20 63 6f 70 79 20 68  * and the copy h
96c0: 61 73 20 69 64 78 50 61 72 65 6e 74 20 73 65 74  as idxParent set
96d0: 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66   to the index of
96e0: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 74 65   the original te
96f0: 72 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  rm..*/.static vo
9700: 69 64 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 0a  id exprAnalyze(.
9710: 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c    SrcList *pSrc,
9720: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74              /* t
9730: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a  he FROM clause *
9740: 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  /.  WhereClause 
9750: 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20 2f 2a  *pWC,         /*
9760: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
9770: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78 54 65  e */.  int idxTe
9780: 72 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20  rm              
9790: 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65   /* Index of the
97a0: 20 74 65 72 6d 20 74 6f 20 62 65 20 61 6e 61 6c   term to be anal
97b0: 79 7a 65 64 20 2a 2f 0a 29 7b 0a 20 20 57 68 65  yzed */.){.  Whe
97c0: 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d  reInfo *pWInfo =
97d0: 20 70 57 43 2d 3e 70 57 49 6e 66 6f 3b 20 2f 2a   pWC->pWInfo; /*
97e0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 70 72   WHERE clause pr
97f0: 6f 63 65 73 73 69 6e 67 20 63 6f 6e 74 65 78 74  ocessing context
9800: 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
9810: 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20  *pTerm;         
9820: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 65         /* The te
9830: 72 6d 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65  rm to be analyze
9840: 64 20 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b  d */.  WhereMask
9850: 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 3b 20 20  Set *pMaskSet;  
9860: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 6f          /* Set o
9870: 66 20 74 61 62 6c 65 20 69 6e 64 65 78 20 6d 61  f table index ma
9880: 73 6b 73 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  sks */.  Expr *p
9890: 45 78 70 72 3b 20 20 20 20 20 20 20 20 20 20 20  Expr;           
98a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
98b0: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 62   expression to b
98c0: 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20 20  e analyzed */.  
98d0: 42 69 74 6d 61 73 6b 20 70 72 65 72 65 71 4c 65  Bitmask prereqLe
98e0: 66 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ft;             
98f0: 20 2f 2a 20 50 72 65 72 65 71 75 65 73 69 74 65   /* Prerequesite
9900: 73 20 6f 66 20 74 68 65 20 70 45 78 70 72 2d 3e  s of the pExpr->
9910: 70 4c 65 66 74 20 2a 2f 0a 20 20 42 69 74 6d 61  pLeft */.  Bitma
9920: 73 6b 20 70 72 65 72 65 71 41 6c 6c 3b 20 20 20  sk prereqAll;   
9930: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
9940: 72 65 72 65 71 75 65 73 69 74 65 73 20 6f 66 20  rerequesites of 
9950: 70 45 78 70 72 20 2a 2f 0a 20 20 42 69 74 6d 61  pExpr */.  Bitma
9960: 73 6b 20 65 78 74 72 61 52 69 67 68 74 20 3d 20  sk extraRight = 
9970: 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45  0;          /* E
9980: 78 74 72 61 20 64 65 70 65 6e 64 65 6e 63 69 65  xtra dependencie
9990: 73 20 6f 6e 20 4c 45 46 54 20 4a 4f 49 4e 20 2a  s on LEFT JOIN *
99a0: 2f 0a 20 20 45 78 70 72 20 2a 70 53 74 72 31 20  /.  Expr *pStr1 
99b0: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
99c0: 20 20 20 20 20 2f 2a 20 52 48 53 20 6f 66 20 4c       /* RHS of L
99d0: 49 4b 45 2f 47 4c 4f 42 20 6f 70 65 72 61 74 6f  IKE/GLOB operato
99e0: 72 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6f 6d  r */.  int isCom
99f0: 70 6c 65 74 65 20 3d 20 30 3b 20 20 20 20 20 20  plete = 0;      
9a00: 20 20 20 20 20 20 20 20 2f 2a 20 52 48 53 20 6f          /* RHS o
9a10: 66 20 4c 49 4b 45 2f 47 4c 4f 42 20 65 6e 64 73  f LIKE/GLOB ends
9a20: 20 77 69 74 68 20 77 69 6c 64 63 61 72 64 20 2a   with wildcard *
9a30: 2f 0a 20 20 69 6e 74 20 6e 6f 43 61 73 65 20 3d  /.  int noCase =
9a40: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
9a50: 20 20 20 20 20 2f 2a 20 4c 49 4b 45 2f 47 4c 4f       /* LIKE/GLO
9a60: 42 20 64 69 73 74 69 6e 67 75 69 73 68 65 73 20  B distinguishes 
9a70: 63 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 70  case */.  int op
9a80: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
9a90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f             /* To
9aa0: 70 2d 6c 65 76 65 6c 20 6f 70 65 72 61 74 6f 72  p-level operator
9ab0: 2e 20 20 70 45 78 70 72 2d 3e 6f 70 20 2a 2f 0a  .  pExpr->op */.
9ac0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20    Parse *pParse 
9ad0: 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65  = pWInfo->pParse
9ae0: 3b 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f  ;  /* Parsing co
9af0: 6e 74 65 78 74 20 2a 2f 0a 20 20 73 71 6c 69 74  ntext */.  sqlit
9b00: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
9b10: 3e 64 62 3b 20 20 20 20 20 20 20 20 2f 2a 20 44  >db;        /* D
9b20: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
9b30: 6f 6e 20 2a 2f 0a 0a 20 20 69 66 28 20 64 62 2d  on */..  if( db-
9b40: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
9b50: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
9b60: 0a 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d  .  pTerm = &pWC-
9b70: 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 70  >a[idxTerm];.  p
9b80: 4d 61 73 6b 53 65 74 20 3d 20 26 70 57 49 6e 66  MaskSet = &pWInf
9b90: 6f 2d 3e 73 4d 61 73 6b 53 65 74 3b 0a 20 20 70  o->sMaskSet;.  p
9ba0: 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45  Expr = pTerm->pE
9bb0: 78 70 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70  xpr;.  assert( p
9bc0: 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 53 20  Expr->op!=TK_AS 
9bd0: 26 26 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  && pExpr->op!=TK
9be0: 5f 43 4f 4c 4c 41 54 45 20 29 3b 0a 20 20 70 72  _COLLATE );.  pr
9bf0: 65 72 65 71 4c 65 66 74 20 3d 20 65 78 70 72 54  ereqLeft = exprT
9c00: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
9c10: 65 74 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  et, pExpr->pLeft
9c20: 29 3b 0a 20 20 6f 70 20 3d 20 70 45 78 70 72 2d  );.  op = pExpr-
9c30: 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54  >op;.  if( op==T
9c40: 4b 5f 49 4e 20 29 7b 0a 20 20 20 20 61 73 73 65  K_IN ){.    asse
9c50: 72 74 28 20 70 45 78 70 72 2d 3e 70 52 69 67 68  rt( pExpr->pRigh
9c60: 74 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  t==0 );.    if( 
9c70: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
9c80: 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
9c90: 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20 70 54  ect) ){.      pT
9ca0: 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
9cb0: 20 3d 20 65 78 70 72 53 65 6c 65 63 74 54 61 62   = exprSelectTab
9cc0: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
9cd0: 2c 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65  , pExpr->x.pSele
9ce0: 63 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ct);.    }else{.
9cf0: 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 70 72 65        pTerm->pre
9d00: 72 65 71 52 69 67 68 74 20 3d 20 65 78 70 72 4c  reqRight = exprL
9d10: 69 73 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d  istTableUsage(pM
9d20: 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 78  askSet, pExpr->x
9d30: 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20  .pList);.    }. 
9d40: 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54   }else if( op==T
9d50: 4b 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20  K_ISNULL ){.    
9d60: 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
9d70: 68 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  ht = 0;.  }else{
9d80: 0a 20 20 20 20 70 54 65 72 6d 2d 3e 70 72 65 72  .    pTerm->prer
9d90: 65 71 52 69 67 68 74 20 3d 20 65 78 70 72 54 61  eqRight = exprTa
9da0: 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65  bleUsage(pMaskSe
9db0: 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  t, pExpr->pRight
9dc0: 29 3b 0a 20 20 7d 0a 20 20 70 72 65 72 65 71 41  );.  }.  prereqA
9dd0: 6c 6c 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73  ll = exprTableUs
9de0: 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 45  age(pMaskSet, pE
9df0: 78 70 72 29 3b 0a 20 20 69 66 28 20 45 78 70 72  xpr);.  if( Expr
9e00: 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
9e10: 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20  r, EP_FromJoin) 
9e20: 29 7b 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 78  ){.    Bitmask x
9e30: 20 3d 20 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b   = getMask(pMask
9e40: 53 65 74 2c 20 70 45 78 70 72 2d 3e 69 52 69 67  Set, pExpr->iRig
9e50: 68 74 4a 6f 69 6e 54 61 62 6c 65 29 3b 0a 20 20  htJoinTable);.  
9e60: 20 20 70 72 65 72 65 71 41 6c 6c 20 7c 3d 20 78    prereqAll |= x
9e70: 3b 0a 20 20 20 20 65 78 74 72 61 52 69 67 68 74  ;.    extraRight
9e80: 20 3d 20 78 2d 31 3b 20 20 2f 2a 20 4f 4e 20 63   = x-1;  /* ON c
9e90: 6c 61 75 73 65 20 74 65 72 6d 73 20 6d 61 79 20  lause terms may 
9ea0: 6e 6f 74 20 62 65 20 75 73 65 64 20 77 69 74 68  not be used with
9eb0: 20 61 6e 20 69 6e 64 65 78 0a 20 20 20 20 20 20   an index.      
9ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ed0: 20 2a 2a 20 6f 6e 20 6c 65 66 74 20 74 61 62 6c   ** on left tabl
9ee0: 65 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e  e of a LEFT JOIN
9ef0: 2e 20 20 54 69 63 6b 65 74 20 23 33 30 31 35 20  .  Ticket #3015 
9f00: 2a 2f 0a 20 20 7d 0a 20 20 70 54 65 72 6d 2d 3e  */.  }.  pTerm->
9f10: 70 72 65 72 65 71 41 6c 6c 20 3d 20 70 72 65 72  prereqAll = prer
9f20: 65 71 41 6c 6c 3b 0a 20 20 70 54 65 72 6d 2d 3e  eqAll;.  pTerm->
9f30: 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 2d 31 3b  leftCursor = -1;
9f40: 0a 20 20 70 54 65 72 6d 2d 3e 69 50 61 72 65 6e  .  pTerm->iParen
9f50: 74 20 3d 20 2d 31 3b 0a 20 20 70 54 65 72 6d 2d  t = -1;.  pTerm-
9f60: 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 30 3b 0a  >eOperator = 0;.
9f70: 20 20 69 66 28 20 61 6c 6c 6f 77 65 64 4f 70 28    if( allowedOp(
9f80: 6f 70 29 20 29 7b 0a 20 20 20 20 45 78 70 72 20  op) ){.    Expr 
9f90: 2a 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33  *pLeft = sqlite3
9fa0: 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28  ExprSkipCollate(
9fb0: 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
9fc0: 20 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 20     Expr *pRight 
9fd0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69  = sqlite3ExprSki
9fe0: 70 43 6f 6c 6c 61 74 65 28 70 45 78 70 72 2d 3e  pCollate(pExpr->
9ff0: 70 52 69 67 68 74 29 3b 0a 20 20 20 20 75 31 36  pRight);.    u16
a000: 20 6f 70 4d 61 73 6b 20 3d 20 28 70 54 65 72 6d   opMask = (pTerm
a010: 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20  ->prereqRight & 
a020: 70 72 65 72 65 71 4c 65 66 74 29 3d 3d 30 20 3f  prereqLeft)==0 ?
a030: 20 57 4f 5f 41 4c 4c 20 3a 20 57 4f 5f 45 51 55   WO_ALL : WO_EQU
a040: 49 56 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 66  IV;.    if( pLef
a050: 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  t->op==TK_COLUMN
a060: 20 29 7b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d   ){.      pTerm-
a070: 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 70 4c  >leftCursor = pL
a080: 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20  eft->iTable;.   
a090: 20 20 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74     pTerm->u.left
a0a0: 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66 74 2d 3e  Column = pLeft->
a0b0: 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 70  iColumn;.      p
a0c0: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
a0d0: 3d 20 6f 70 65 72 61 74 6f 72 4d 61 73 6b 28 6f  = operatorMask(o
a0e0: 70 29 20 26 20 6f 70 4d 61 73 6b 3b 0a 20 20 20  p) & opMask;.   
a0f0: 20 7d 0a 20 20 20 20 69 66 28 20 70 52 69 67 68   }.    if( pRigh
a100: 74 20 26 26 20 70 52 69 67 68 74 2d 3e 6f 70 3d  t && pRight->op=
a110: 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20  =TK_COLUMN ){.  
a120: 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
a130: 4e 65 77 3b 0a 20 20 20 20 20 20 45 78 70 72 20  New;.      Expr 
a140: 2a 70 44 75 70 3b 0a 20 20 20 20 20 20 75 31 36  *pDup;.      u16
a150: 20 65 45 78 74 72 61 4f 70 20 3d 20 30 3b 20 20   eExtraOp = 0;  
a160: 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 62        /* Extra b
a170: 69 74 73 20 66 6f 72 20 70 4e 65 77 2d 3e 65 4f  its for pNew->eO
a180: 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20  perator */.     
a190: 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74   if( pTerm->left
a1a0: 43 75 72 73 6f 72 3e 3d 30 20 29 7b 0a 20 20 20  Cursor>=0 ){.   
a1b0: 20 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77 3b       int idxNew;
a1c0: 0a 20 20 20 20 20 20 20 20 70 44 75 70 20 3d 20  .        pDup = 
a1d0: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
a1e0: 62 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20  b, pExpr, 0);.  
a1f0: 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61        if( db->ma
a200: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
a210: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
a220: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 44  xprDelete(db, pD
a230: 75 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  up);.          r
a240: 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 7d  eturn;.        }
a250: 0a 20 20 20 20 20 20 20 20 69 64 78 4e 65 77 20  .        idxNew 
a260: 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73  = whereClauseIns
a270: 65 72 74 28 70 57 43 2c 20 70 44 75 70 2c 20 54  ert(pWC, pDup, T
a280: 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d  ERM_VIRTUAL|TERM
a290: 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20  _DYNAMIC);.     
a2a0: 20 20 20 69 66 28 20 69 64 78 4e 65 77 3d 3d 30     if( idxNew==0
a2b0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20   ) return;.     
a2c0: 20 20 20 70 4e 65 77 20 3d 20 26 70 57 43 2d 3e     pNew = &pWC->
a2d0: 61 5b 69 64 78 4e 65 77 5d 3b 0a 20 20 20 20 20  a[idxNew];.     
a2e0: 20 20 20 70 4e 65 77 2d 3e 69 50 61 72 65 6e 74     pNew->iParent
a2f0: 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20   = idxTerm;.    
a300: 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43      pTerm = &pWC
a310: 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20  ->a[idxTerm];.  
a320: 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68        pTerm->nCh
a330: 69 6c 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ild = 1;.       
a340: 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
a350: 7c 3d 20 54 45 52 4d 5f 43 4f 50 49 45 44 3b 0a  |= TERM_COPIED;.
a360: 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78 70          if( pExp
a370: 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 0a 20 20 20  r->op==TK_EQ.   
a380: 20 20 20 20 20 20 26 26 20 21 45 78 70 72 48 61        && !ExprHa
a390: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
a3a0: 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 0a 20 20   EP_FromJoin).  
a3b0: 20 20 20 20 20 20 20 26 26 20 4f 70 74 69 6d 69         && Optimi
a3c0: 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62  zationEnabled(db
a3d0: 2c 20 53 51 4c 49 54 45 5f 54 72 61 6e 73 69 74  , SQLITE_Transit
a3e0: 69 76 65 29 0a 20 20 20 20 20 20 20 20 29 7b 0a  ive).        ){.
a3f0: 20 20 20 20 20 20 20 20 20 20 70 54 65 72 6d 2d            pTerm-
a400: 3e 65 4f 70 65 72 61 74 6f 72 20 7c 3d 20 57 4f  >eOperator |= WO
a410: 5f 45 51 55 49 56 3b 0a 20 20 20 20 20 20 20 20  _EQUIV;.        
a420: 20 20 65 45 78 74 72 61 4f 70 20 3d 20 57 4f 5f    eExtraOp = WO_
a430: 45 51 55 49 56 3b 0a 20 20 20 20 20 20 20 20 7d  EQUIV;.        }
a440: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
a450: 20 20 20 20 20 20 70 44 75 70 20 3d 20 70 45 78        pDup = pEx
a460: 70 72 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  pr;.        pNew
a470: 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20   = pTerm;.      
a480: 7d 0a 20 20 20 20 20 20 65 78 70 72 43 6f 6d 6d  }.      exprComm
a490: 75 74 65 28 70 50 61 72 73 65 2c 20 70 44 75 70  ute(pParse, pDup
a4a0: 29 3b 0a 20 20 20 20 20 20 70 4c 65 66 74 20 3d  );.      pLeft =
a4b0: 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70   sqlite3ExprSkip
a4c0: 43 6f 6c 6c 61 74 65 28 70 44 75 70 2d 3e 70 4c  Collate(pDup->pL
a4d0: 65 66 74 29 3b 0a 20 20 20 20 20 20 70 4e 65 77  eft);.      pNew
a4e0: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 70  ->leftCursor = p
a4f0: 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20 20  Left->iTable;.  
a500: 20 20 20 20 70 4e 65 77 2d 3e 75 2e 6c 65 66 74      pNew->u.left
a510: 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66 74 2d 3e  Column = pLeft->
a520: 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 74  iColumn;.      t
a530: 65 73 74 63 61 73 65 28 20 28 70 72 65 72 65 71  estcase( (prereq
a540: 4c 65 66 74 20 7c 20 65 78 74 72 61 52 69 67 68  Left | extraRigh
a550: 74 29 20 21 3d 20 70 72 65 72 65 71 4c 65 66 74  t) != prereqLeft
a560: 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e   );.      pNew->
a570: 70 72 65 72 65 71 52 69 67 68 74 20 3d 20 70 72  prereqRight = pr
a580: 65 72 65 71 4c 65 66 74 20 7c 20 65 78 74 72 61  ereqLeft | extra
a590: 52 69 67 68 74 3b 0a 20 20 20 20 20 20 70 4e 65  Right;.      pNe
a5a0: 77 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20 70  w->prereqAll = p
a5b0: 72 65 72 65 71 41 6c 6c 3b 0a 20 20 20 20 20 20  rereqAll;.      
a5c0: 70 4e 65 77 2d 3e 65 4f 70 65 72 61 74 6f 72 20  pNew->eOperator 
a5d0: 3d 20 28 6f 70 65 72 61 74 6f 72 4d 61 73 6b 28  = (operatorMask(
a5e0: 70 44 75 70 2d 3e 6f 70 29 20 2b 20 65 45 78 74  pDup->op) + eExt
a5f0: 72 61 4f 70 29 20 26 20 6f 70 4d 61 73 6b 3b 0a  raOp) & opMask;.
a600: 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 6e 64      }.  }..#ifnd
a610: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42  ef SQLITE_OMIT_B
a620: 45 54 57 45 45 4e 5f 4f 50 54 49 4d 49 5a 41 54  ETWEEN_OPTIMIZAT
a630: 49 4f 4e 0a 20 20 2f 2a 20 49 66 20 61 20 74 65  ION.  /* If a te
a640: 72 6d 20 69 73 20 74 68 65 20 42 45 54 57 45 45  rm is the BETWEE
a650: 4e 20 6f 70 65 72 61 74 6f 72 2c 20 63 72 65 61  N operator, crea
a660: 74 65 20 74 77 6f 20 6e 65 77 20 76 69 72 74 75  te two new virtu
a670: 61 6c 20 74 65 72 6d 73 0a 20 20 2a 2a 20 74 68  al terms.  ** th
a680: 61 74 20 64 65 66 69 6e 65 20 74 68 65 20 72 61  at define the ra
a690: 6e 67 65 20 74 68 61 74 20 74 68 65 20 42 45 54  nge that the BET
a6a0: 57 45 45 4e 20 69 6d 70 6c 65 6d 65 6e 74 73 2e  WEEN implements.
a6b0: 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 20    For example:. 
a6c0: 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 61 20   **.  **      a 
a6d0: 42 45 54 57 45 45 4e 20 62 20 41 4e 44 20 63 0a  BETWEEN b AND c.
a6e0: 20 20 2a 2a 0a 20 20 2a 2a 20 69 73 20 63 6f 6e    **.  ** is con
a6f0: 76 65 72 74 65 64 20 69 6e 74 6f 3a 0a 20 20 2a  verted into:.  *
a700: 2a 0a 20 20 2a 2a 20 20 20 20 20 20 28 61 20 42  *.  **      (a B
a710: 45 54 57 45 45 4e 20 62 20 41 4e 44 20 63 29 20  ETWEEN b AND c) 
a720: 41 4e 44 20 28 61 3e 3d 62 29 20 41 4e 44 20 28  AND (a>=b) AND (
a730: 61 3c 3d 63 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20  a<=c).  **.  ** 
a740: 54 68 65 20 74 77 6f 20 6e 65 77 20 74 65 72 6d  The two new term
a750: 73 20 61 72 65 20 61 64 64 65 64 20 6f 6e 74 6f  s are added onto
a760: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
a770: 57 68 65 72 65 43 6c 61 75 73 65 20 6f 62 6a 65  WhereClause obje
a780: 63 74 2e 0a 20 20 2a 2a 20 54 68 65 20 6e 65 77  ct..  ** The new
a790: 20 74 65 72 6d 73 20 61 72 65 20 22 64 79 6e 61   terms are "dyna
a7a0: 6d 69 63 22 20 61 6e 64 20 61 72 65 20 63 68 69  mic" and are chi
a7b0: 6c 64 72 65 6e 20 6f 66 20 74 68 65 20 6f 72 69  ldren of the ori
a7c0: 67 69 6e 61 6c 20 42 45 54 57 45 45 4e 0a 20 20  ginal BETWEEN.  
a7d0: 2a 2a 20 74 65 72 6d 2e 20 20 54 68 61 74 20 6d  ** term.  That m
a7e0: 65 61 6e 73 20 74 68 61 74 20 69 66 20 74 68 65  eans that if the
a7f0: 20 42 45 54 57 45 45 4e 20 74 65 72 6d 20 69 73   BETWEEN term is
a800: 20 63 6f 64 65 64 2c 20 74 68 65 20 63 68 69 6c   coded, the chil
a810: 64 72 65 6e 20 61 72 65 0a 20 20 2a 2a 20 73 6b  dren are.  ** sk
a820: 69 70 70 65 64 2e 20 20 4f 72 2c 20 69 66 20 74  ipped.  Or, if t
a830: 68 65 20 63 68 69 6c 64 72 65 6e 20 61 72 65 20  he children are 
a840: 73 61 74 69 73 66 69 65 64 20 62 79 20 61 6e 20  satisfied by an 
a850: 69 6e 64 65 78 2c 20 74 68 65 20 6f 72 69 67 69  index, the origi
a860: 6e 61 6c 0a 20 20 2a 2a 20 42 45 54 57 45 45 4e  nal.  ** BETWEEN
a870: 20 74 65 72 6d 20 69 73 20 73 6b 69 70 70 65 64   term is skipped
a880: 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66  ..  */.  else if
a890: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
a8a0: 42 45 54 57 45 45 4e 20 26 26 20 70 57 43 2d 3e  BETWEEN && pWC->
a8b0: 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 7b 0a 20 20  op==TK_AND ){.  
a8c0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
a8d0: 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  t = pExpr->x.pLi
a8e0: 73 74 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20  st;.    int i;. 
a8f0: 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
a900: 75 38 20 6f 70 73 5b 5d 20 3d 20 7b 54 4b 5f 47  u8 ops[] = {TK_G
a910: 45 2c 20 54 4b 5f 4c 45 7d 3b 0a 20 20 20 20 61  E, TK_LE};.    a
a920: 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20  ssert( pList!=0 
a930: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
a940: 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 32 20 29  List->nExpr==2 )
a950: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
a960: 3c 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  <2; i++){.      
a970: 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72 3b 0a  Expr *pNewExpr;.
a980: 20 20 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77        int idxNew
a990: 3b 0a 20 20 20 20 20 20 70 4e 65 77 45 78 70 72  ;.      pNewExpr
a9a0: 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
a9b0: 70 50 61 72 73 65 2c 20 6f 70 73 5b 69 5d 2c 20  pParse, ops[i], 
a9c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
a9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
a9e0: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
a9f0: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 30   pExpr->pLeft, 0
aa00: 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
aa10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa20: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
aa30: 62 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  b, pList->a[i].p
aa40: 45 78 70 72 2c 20 30 29 2c 20 30 29 3b 0a 20 20  Expr, 0), 0);.  
aa50: 20 20 20 20 74 72 61 6e 73 66 65 72 4a 6f 69 6e      transferJoin
aa60: 4d 61 72 6b 69 6e 67 73 28 70 4e 65 77 45 78 70  Markings(pNewExp
aa70: 72 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20  r, pExpr);.     
aa80: 20 69 64 78 4e 65 77 20 3d 20 77 68 65 72 65 43   idxNew = whereC
aa90: 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c  lauseInsert(pWC,
aaa0: 20 70 4e 65 77 45 78 70 72 2c 20 54 45 52 4d 5f   pNewExpr, TERM_
aab0: 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e  VIRTUAL|TERM_DYN
aac0: 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 74 65 73  AMIC);.      tes
aad0: 74 63 61 73 65 28 20 69 64 78 4e 65 77 3d 3d 30  tcase( idxNew==0
aae0: 20 29 3b 0a 20 20 20 20 20 20 65 78 70 72 41 6e   );.      exprAn
aaf0: 61 6c 79 7a 65 28 70 53 72 63 2c 20 70 57 43 2c  alyze(pSrc, pWC,
ab00: 20 69 64 78 4e 65 77 29 3b 0a 20 20 20 20 20 20   idxNew);.      
ab10: 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b  pTerm = &pWC->a[
ab20: 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20  idxTerm];.      
ab30: 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 2e 69  pWC->a[idxNew].i
ab40: 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d  Parent = idxTerm
ab50: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 65 72  ;.    }.    pTer
ab60: 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 32 3b 0a 20  m->nChild = 2;. 
ab70: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
ab80: 49 54 45 5f 4f 4d 49 54 5f 42 45 54 57 45 45 4e  ITE_OMIT_BETWEEN
ab90: 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f  _OPTIMIZATION */
aba0: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
abb0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50  QLITE_OMIT_OR_OP
abc0: 54 49 4d 49 5a 41 54 49 4f 4e 29 20 26 26 20 21  TIMIZATION) && !
abd0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
abe0: 4d 49 54 5f 53 55 42 51 55 45 52 59 29 0a 20 20  MIT_SUBQUERY).  
abf0: 2f 2a 20 41 6e 61 6c 79 7a 65 20 61 20 74 65 72  /* Analyze a ter
ac00: 6d 20 74 68 61 74 20 69 73 20 63 6f 6d 70 6f 73  m that is compos
ac10: 65 64 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72  ed of two or mor
ac20: 65 20 73 75 62 74 65 72 6d 73 20 63 6f 6e 6e 65  e subterms conne
ac30: 63 74 65 64 20 62 79 0a 20 20 2a 2a 20 61 6e 20  cted by.  ** an 
ac40: 4f 52 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 2a  OR operator..  *
ac50: 2f 0a 20 20 65 6c 73 65 20 69 66 28 20 70 45 78  /.  else if( pEx
ac60: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52 20 29 7b  pr->op==TK_OR ){
ac70: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 57 43  .    assert( pWC
ac80: 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 3b 0a  ->op==TK_AND );.
ac90: 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 4f      exprAnalyzeO
aca0: 72 54 65 72 6d 28 70 53 72 63 2c 20 70 57 43 2c  rTerm(pSrc, pWC,
acb0: 20 69 64 78 54 65 72 6d 29 3b 0a 20 20 20 20 70   idxTerm);.    p
acc0: 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69  Term = &pWC->a[i
acd0: 64 78 54 65 72 6d 5d 3b 0a 20 20 7d 0a 23 65 6e  dxTerm];.  }.#en
ace0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
acf0: 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49  IT_OR_OPTIMIZATI
ad00: 4f 4e 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  ON */..#ifndef S
ad10: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f  QLITE_OMIT_LIKE_
ad20: 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 20 20 2f  OPTIMIZATION.  /
ad30: 2a 20 41 64 64 20 63 6f 6e 73 74 72 61 69 6e 74  * Add constraint
ad40: 73 20 74 6f 20 72 65 64 75 63 65 20 74 68 65 20  s to reduce the 
ad50: 73 65 61 72 63 68 20 73 70 61 63 65 20 6f 6e 20  search space on 
ad60: 61 20 4c 49 4b 45 20 6f 72 20 47 4c 4f 42 0a 20  a LIKE or GLOB. 
ad70: 20 2a 2a 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20   ** operator..  
ad80: 2a 2a 0a 20 20 2a 2a 20 41 20 6c 69 6b 65 20 70  **.  ** A like p
ad90: 61 74 74 65 72 6e 20 6f 66 20 74 68 65 20 66 6f  attern of the fo
ada0: 72 6d 20 22 78 20 4c 49 4b 45 20 27 61 62 63 25  rm "x LIKE 'abc%
adb0: 27 22 20 69 73 20 63 68 61 6e 67 65 64 20 69 6e  '" is changed in
adc0: 74 6f 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20  to constraints. 
add0: 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20   **.  **        
ade0: 20 20 78 3e 3d 27 61 62 63 27 20 41 4e 44 20 78    x>='abc' AND x
adf0: 3c 27 61 62 64 27 20 41 4e 44 20 78 20 4c 49 4b  <'abd' AND x LIK
ae00: 45 20 27 61 62 63 25 27 0a 20 20 2a 2a 0a 20 20  E 'abc%'.  **.  
ae10: 2a 2a 20 54 68 65 20 6c 61 73 74 20 63 68 61 72  ** The last char
ae20: 61 63 74 65 72 20 6f 66 20 74 68 65 20 70 72 65  acter of the pre
ae30: 66 69 78 20 22 61 62 63 22 20 69 73 20 69 6e 63  fix "abc" is inc
ae40: 72 65 6d 65 6e 74 65 64 20 74 6f 20 66 6f 72 6d  remented to form
ae50: 20 74 68 65 0a 20 20 2a 2a 20 74 65 72 6d 69 6e   the.  ** termin
ae60: 61 74 69 6f 6e 20 63 6f 6e 64 69 74 69 6f 6e 20  ation condition 
ae70: 22 61 62 64 22 2e 0a 20 20 2a 2f 0a 20 20 69 66  "abd"..  */.  if
ae80: 28 20 70 57 43 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e  ( pWC->op==TK_AN
ae90: 44 20 0a 20 20 20 26 26 20 69 73 4c 69 6b 65 4f  D .   && isLikeO
aea0: 72 47 6c 6f 62 28 70 50 61 72 73 65 2c 20 70 45  rGlob(pParse, pE
aeb0: 78 70 72 2c 20 26 70 53 74 72 31 2c 20 26 69 73  xpr, &pStr1, &is
aec0: 43 6f 6d 70 6c 65 74 65 2c 20 26 6e 6f 43 61 73  Complete, &noCas
aed0: 65 29 0a 20 20 29 7b 0a 20 20 20 20 45 78 70 72  e).  ){.    Expr
aee0: 20 2a 70 4c 65 66 74 3b 20 20 20 20 20 20 20 2f   *pLeft;       /
aef0: 2a 20 4c 48 53 20 6f 66 20 4c 49 4b 45 2f 47 4c  * LHS of LIKE/GL
af00: 4f 42 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  OB operator */. 
af10: 20 20 20 45 78 70 72 20 2a 70 53 74 72 32 3b 20     Expr *pStr2; 
af20: 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66        /* Copy of
af30: 20 70 53 74 72 31 20 2d 20 52 48 53 20 6f 66 20   pStr1 - RHS of 
af40: 4c 49 4b 45 2f 47 4c 4f 42 20 6f 70 65 72 61 74  LIKE/GLOB operat
af50: 6f 72 20 2a 2f 0a 20 20 20 20 45 78 70 72 20 2a  or */.    Expr *
af60: 70 4e 65 77 45 78 70 72 31 3b 0a 20 20 20 20 45  pNewExpr1;.    E
af70: 78 70 72 20 2a 70 4e 65 77 45 78 70 72 32 3b 0a  xpr *pNewExpr2;.
af80: 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77 31 3b      int idxNew1;
af90: 0a 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77 32  .    int idxNew2
afa0: 3b 0a 20 20 20 20 54 6f 6b 65 6e 20 73 43 6f 6c  ;.    Token sCol
afb0: 6c 53 65 71 4e 61 6d 65 3b 20 20 2f 2a 20 4e 61  lSeqName;  /* Na
afc0: 6d 65 20 6f 66 20 63 6f 6c 6c 61 74 69 6e 67 20  me of collating 
afd0: 73 65 71 75 65 6e 63 65 20 2a 2f 0a 0a 20 20 20  sequence */..   
afe0: 20 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e   pLeft = pExpr->
aff0: 78 2e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45  x.pList->a[1].pE
b000: 78 70 72 3b 0a 20 20 20 20 70 53 74 72 32 20 3d  xpr;.    pStr2 =
b010: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
b020: 64 62 2c 20 70 53 74 72 31 2c 20 30 29 3b 0a 20  db, pStr1, 0);. 
b030: 20 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c     if( !db->mall
b040: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
b050: 20 20 75 38 20 63 2c 20 2a 70 43 3b 20 20 20 20    u8 c, *pC;    
b060: 20 20 20 2f 2a 20 4c 61 73 74 20 63 68 61 72 61     /* Last chara
b070: 63 74 65 72 20 62 65 66 6f 72 65 20 74 68 65 20  cter before the 
b080: 66 69 72 73 74 20 77 69 6c 64 63 61 72 64 20 2a  first wildcard *
b090: 2f 0a 20 20 20 20 20 20 70 43 20 3d 20 28 75 38  /.      pC = (u8
b0a0: 2a 29 26 70 53 74 72 32 2d 3e 75 2e 7a 54 6f 6b  *)&pStr2->u.zTok
b0b0: 65 6e 5b 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  en[sqlite3Strlen
b0c0: 33 30 28 70 53 74 72 32 2d 3e 75 2e 7a 54 6f 6b  30(pStr2->u.zTok
b0d0: 65 6e 29 2d 31 5d 3b 0a 20 20 20 20 20 20 63 20  en)-1];.      c 
b0e0: 3d 20 2a 70 43 3b 0a 20 20 20 20 20 20 69 66 28  = *pC;.      if(
b0f0: 20 6e 6f 43 61 73 65 20 29 7b 0a 20 20 20 20 20   noCase ){.     
b100: 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 20     /* The point 
b110: 69 73 20 74 6f 20 69 6e 63 72 65 6d 65 6e 74 20  is to increment 
b120: 74 68 65 20 6c 61 73 74 20 63 68 61 72 61 63 74  the last charact
b130: 65 72 20 62 65 66 6f 72 65 20 74 68 65 20 66 69  er before the fi
b140: 72 73 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 77  rst.        ** w
b150: 69 6c 64 63 61 72 64 2e 20 20 42 75 74 20 69 66  ildcard.  But if
b160: 20 77 65 20 69 6e 63 72 65 6d 65 6e 74 20 27 40   we increment '@
b170: 27 2c 20 74 68 61 74 20 77 69 6c 6c 20 70 75 73  ', that will pus
b180: 68 20 69 74 20 69 6e 74 6f 20 74 68 65 0a 20 20  h it into the.  
b190: 20 20 20 20 20 20 2a 2a 20 61 6c 70 68 61 62 65        ** alphabe
b1a0: 74 69 63 20 72 61 6e 67 65 20 77 68 65 72 65 20  tic range where 
b1b0: 63 61 73 65 20 63 6f 6e 76 65 72 73 69 6f 6e 73  case conversions
b1c0: 20 77 69 6c 6c 20 6d 65 73 73 20 75 70 20 74 68   will mess up th
b1d0: 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e  e .        ** in
b1e0: 65 71 75 61 6c 69 74 79 2e 20 20 54 6f 20 61 76  equality.  To av
b1f0: 6f 69 64 20 74 68 69 73 2c 20 6d 61 6b 65 20 73  oid this, make s
b200: 75 72 65 20 74 6f 20 61 6c 73 6f 20 72 75 6e 20  ure to also run 
b210: 74 68 65 20 66 75 6c 6c 0a 20 20 20 20 20 20 20  the full.       
b220: 20 2a 2a 20 4c 49 4b 45 20 6f 6e 20 61 6c 6c 20   ** LIKE on all 
b230: 63 61 6e 64 69 64 61 74 65 20 65 78 70 72 65 73  candidate expres
b240: 73 69 6f 6e 73 20 62 79 20 63 6c 65 61 72 69 6e  sions by clearin
b250: 67 20 74 68 65 20 69 73 43 6f 6d 70 6c 65 74 65  g the isComplete
b260: 20 66 6c 61 67 0a 20 20 20 20 20 20 20 20 2a 2f   flag.        */
b270: 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d  .        if( c==
b280: 27 41 27 2d 31 20 29 20 69 73 43 6f 6d 70 6c 65  'A'-1 ) isComple
b290: 74 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  te = 0;.        
b2a0: 63 20 3d 20 73 71 6c 69 74 65 33 55 70 70 65 72  c = sqlite3Upper
b2b0: 54 6f 4c 6f 77 65 72 5b 63 5d 3b 0a 20 20 20 20  ToLower[c];.    
b2c0: 20 20 7d 0a 20 20 20 20 20 20 2a 70 43 20 3d 20    }.      *pC = 
b2d0: 63 20 2b 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  c + 1;.    }.   
b2e0: 20 73 43 6f 6c 6c 53 65 71 4e 61 6d 65 2e 7a 20   sCollSeqName.z 
b2f0: 3d 20 6e 6f 43 61 73 65 20 3f 20 22 4e 4f 43 41  = noCase ? "NOCA
b300: 53 45 22 20 3a 20 22 42 49 4e 41 52 59 22 3b 0a  SE" : "BINARY";.
b310: 20 20 20 20 73 43 6f 6c 6c 53 65 71 4e 61 6d 65      sCollSeqName
b320: 2e 6e 20 3d 20 36 3b 0a 20 20 20 20 70 4e 65 77  .n = 6;.    pNew
b330: 45 78 70 72 31 20 3d 20 73 71 6c 69 74 65 33 45  Expr1 = sqlite3E
b340: 78 70 72 44 75 70 28 64 62 2c 20 70 4c 65 66 74  xprDup(db, pLeft
b350: 2c 20 30 29 3b 0a 20 20 20 20 70 4e 65 77 45 78  , 0);.    pNewEx
b360: 70 72 31 20 3d 20 73 71 6c 69 74 65 33 50 45 78  pr1 = sqlite3PEx
b370: 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 47 45  pr(pParse, TK_GE
b380: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 73 71  , .           sq
b390: 6c 69 74 65 33 45 78 70 72 41 64 64 43 6f 6c 6c  lite3ExprAddColl
b3a0: 61 74 65 54 6f 6b 65 6e 28 70 50 61 72 73 65 2c  ateToken(pParse,
b3b0: 70 4e 65 77 45 78 70 72 31 2c 26 73 43 6f 6c 6c  pNewExpr1,&sColl
b3c0: 53 65 71 4e 61 6d 65 29 2c 0a 20 20 20 20 20 20  SeqName),.      
b3d0: 20 20 20 20 20 70 53 74 72 31 2c 20 30 29 3b 0a       pStr1, 0);.
b3e0: 20 20 20 20 74 72 61 6e 73 66 65 72 4a 6f 69 6e      transferJoin
b3f0: 4d 61 72 6b 69 6e 67 73 28 70 4e 65 77 45 78 70  Markings(pNewExp
b400: 72 31 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20  r1, pExpr);.    
b410: 69 64 78 4e 65 77 31 20 3d 20 77 68 65 72 65 43  idxNew1 = whereC
b420: 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c  lauseInsert(pWC,
b430: 20 70 4e 65 77 45 78 70 72 31 2c 20 54 45 52 4d   pNewExpr1, TERM
b440: 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59  _VIRTUAL|TERM_DY
b450: 4e 41 4d 49 43 29 3b 0a 20 20 20 20 74 65 73 74  NAMIC);.    test
b460: 63 61 73 65 28 20 69 64 78 4e 65 77 31 3d 3d 30  case( idxNew1==0
b470: 20 29 3b 0a 20 20 20 20 65 78 70 72 41 6e 61 6c   );.    exprAnal
b480: 79 7a 65 28 70 53 72 63 2c 20 70 57 43 2c 20 69  yze(pSrc, pWC, i
b490: 64 78 4e 65 77 31 29 3b 0a 20 20 20 20 70 4e 65  dxNew1);.    pNe
b4a0: 77 45 78 70 72 32 20 3d 20 73 71 6c 69 74 65 33  wExpr2 = sqlite3
b4b0: 45 78 70 72 44 75 70 28 64 62 2c 20 70 4c 65 66  ExprDup(db, pLef
b4c0: 74 2c 20 30 29 3b 0a 20 20 20 20 70 4e 65 77 45  t, 0);.    pNewE
b4d0: 78 70 72 32 20 3d 20 73 71 6c 69 74 65 33 50 45  xpr2 = sqlite3PE
b4e0: 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 4c  xpr(pParse, TK_L
b4f0: 54 2c 0a 20 20 20 20 20 20 20 20 20 20 20 73 71  T,.           sq
b500: 6c 69 74 65 33 45 78 70 72 41 64 64 43 6f 6c 6c  lite3ExprAddColl
b510: 61 74 65 54 6f 6b 65 6e 28 70 50 61 72 73 65 2c  ateToken(pParse,
b520: 70 4e 65 77 45 78 70 72 32 2c 26 73 43 6f 6c 6c  pNewExpr2,&sColl
b530: 53 65 71 4e 61 6d 65 29 2c 0a 20 20 20 20 20 20  SeqName),.      
b540: 20 20 20 20 20 70 53 74 72 32 2c 20 30 29 3b 0a       pStr2, 0);.
b550: 20 20 20 20 74 72 61 6e 73 66 65 72 4a 6f 69 6e      transferJoin
b560: 4d 61 72 6b 69 6e 67 73 28 70 4e 65 77 45 78 70  Markings(pNewExp
b570: 72 32 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20  r2, pExpr);.    
b580: 69 64 78 4e 65 77 32 20 3d 20 77 68 65 72 65 43  idxNew2 = whereC
b590: 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c  lauseInsert(pWC,
b5a0: 20 70 4e 65 77 45 78 70 72 32 2c 20 54 45 52 4d   pNewExpr2, TERM
b5b0: 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59  _VIRTUAL|TERM_DY
b5c0: 4e 41 4d 49 43 29 3b 0a 20 20 20 20 74 65 73 74  NAMIC);.    test
b5d0: 63 61 73 65 28 20 69 64 78 4e 65 77 32 3d 3d 30  case( idxNew2==0
b5e0: 20 29 3b 0a 20 20 20 20 65 78 70 72 41 6e 61 6c   );.    exprAnal
b5f0: 79 7a 65 28 70 53 72 63 2c 20 70 57 43 2c 20 69  yze(pSrc, pWC, i
b600: 64 78 4e 65 77 32 29 3b 0a 20 20 20 20 70 54 65  dxNew2);.    pTe
b610: 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78  rm = &pWC->a[idx
b620: 54 65 72 6d 5d 3b 0a 20 20 20 20 69 66 28 20 69  Term];.    if( i
b630: 73 43 6f 6d 70 6c 65 74 65 20 29 7b 0a 20 20 20  sComplete ){.   
b640: 20 20 20 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77     pWC->a[idxNew
b650: 31 5d 2e 69 50 61 72 65 6e 74 20 3d 20 69 64 78  1].iParent = idx
b660: 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 57 43 2d  Term;.      pWC-
b670: 3e 61 5b 69 64 78 4e 65 77 32 5d 2e 69 50 61 72  >a[idxNew2].iPar
b680: 65 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20  ent = idxTerm;. 
b690: 20 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69       pTerm->nChi
b6a0: 6c 64 20 3d 20 32 3b 0a 20 20 20 20 7d 0a 20 20  ld = 2;.    }.  
b6b0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
b6c0: 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54  TE_OMIT_LIKE_OPT
b6d0: 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69  IMIZATION */..#i
b6e0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
b6f0: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
b700: 20 2f 2a 20 41 64 64 20 61 20 57 4f 5f 4d 41 54   /* Add a WO_MAT
b710: 43 48 20 61 75 78 69 6c 69 61 72 79 20 74 65 72  CH auxiliary ter
b720: 6d 20 74 6f 20 74 68 65 20 63 6f 6e 73 74 72 61  m to the constra
b730: 69 6e 74 20 73 65 74 20 69 66 20 74 68 65 0a 20  int set if the. 
b740: 20 2a 2a 20 63 75 72 72 65 6e 74 20 65 78 70 72   ** current expr
b750: 65 73 73 69 6f 6e 20 69 73 20 6f 66 20 74 68 65  ession is of the
b760: 20 66 6f 72 6d 3a 20 20 63 6f 6c 75 6d 6e 20 4d   form:  column M
b770: 41 54 43 48 20 65 78 70 72 2e 0a 20 20 2a 2a 20  ATCH expr..  ** 
b780: 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  This information
b790: 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20   is used by the 
b7a0: 78 42 65 73 74 49 6e 64 65 78 20 6d 65 74 68 6f  xBestIndex metho
b7b0: 64 73 20 6f 66 0a 20 20 2a 2a 20 76 69 72 74 75  ds of.  ** virtu
b7c0: 61 6c 20 74 61 62 6c 65 73 2e 20 20 54 68 65 20  al tables.  The 
b7d0: 6e 61 74 69 76 65 20 71 75 65 72 79 20 6f 70 74  native query opt
b7e0: 69 6d 69 7a 65 72 20 64 6f 65 73 20 6e 6f 74 20  imizer does not 
b7f0: 61 74 74 65 6d 70 74 0a 20 20 2a 2a 20 74 6f 20  attempt.  ** to 
b800: 64 6f 20 61 6e 79 74 68 69 6e 67 20 77 69 74 68  do anything with
b810: 20 4d 41 54 43 48 20 66 75 6e 63 74 69 6f 6e 73   MATCH functions
b820: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 4d  ..  */.  if( isM
b830: 61 74 63 68 4f 66 43 6f 6c 75 6d 6e 28 70 45 78  atchOfColumn(pEx
b840: 70 72 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  pr) ){.    int i
b850: 64 78 4e 65 77 3b 0a 20 20 20 20 45 78 70 72 20  dxNew;.    Expr 
b860: 2a 70 52 69 67 68 74 2c 20 2a 70 4c 65 66 74 3b  *pRight, *pLeft;
b870: 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a  .    WhereTerm *
b880: 70 4e 65 77 54 65 72 6d 3b 0a 20 20 20 20 42 69  pNewTerm;.    Bi
b890: 74 6d 61 73 6b 20 70 72 65 72 65 71 43 6f 6c 75  tmask prereqColu
b8a0: 6d 6e 2c 20 70 72 65 72 65 71 45 78 70 72 3b 0a  mn, prereqExpr;.
b8b0: 0a 20 20 20 20 70 52 69 67 68 74 20 3d 20 70 45  .    pRight = pE
b8c0: 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b  xpr->x.pList->a[
b8d0: 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 4c  0].pExpr;.    pL
b8e0: 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  eft = pExpr->x.p
b8f0: 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72  List->a[1].pExpr
b900: 3b 0a 20 20 20 20 70 72 65 72 65 71 45 78 70 72  ;.    prereqExpr
b910: 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67   = exprTableUsag
b920: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 52 69 67  e(pMaskSet, pRig
b930: 68 74 29 3b 0a 20 20 20 20 70 72 65 72 65 71 43  ht);.    prereqC
b940: 6f 6c 75 6d 6e 20 3d 20 65 78 70 72 54 61 62 6c  olumn = exprTabl
b950: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
b960: 20 70 4c 65 66 74 29 3b 0a 20 20 20 20 69 66 28   pLeft);.    if(
b970: 20 28 70 72 65 72 65 71 45 78 70 72 20 26 20 70   (prereqExpr & p
b980: 72 65 72 65 71 43 6f 6c 75 6d 6e 29 3d 3d 30 20  rereqColumn)==0 
b990: 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  ){.      Expr *p
b9a0: 4e 65 77 45 78 70 72 3b 0a 20 20 20 20 20 20 70  NewExpr;.      p
b9b0: 4e 65 77 45 78 70 72 20 3d 20 73 71 6c 69 74 65  NewExpr = sqlite
b9c0: 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
b9d0: 4b 5f 4d 41 54 43 48 2c 20 0a 20 20 20 20 20 20  K_MATCH, .      
b9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b9f0: 20 20 20 20 20 20 20 20 30 2c 20 73 71 6c 69 74          0, sqlit
ba00: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 52  e3ExprDup(db, pR
ba10: 69 67 68 74 2c 20 30 29 2c 20 30 29 3b 0a 20 20  ight, 0), 0);.  
ba20: 20 20 20 20 69 64 78 4e 65 77 20 3d 20 77 68 65      idxNew = whe
ba30: 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70  reClauseInsert(p
ba40: 57 43 2c 20 70 4e 65 77 45 78 70 72 2c 20 54 45  WC, pNewExpr, TE
ba50: 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f  RM_VIRTUAL|TERM_
ba60: 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20  DYNAMIC);.      
ba70: 74 65 73 74 63 61 73 65 28 20 69 64 78 4e 65 77  testcase( idxNew
ba80: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4e 65  ==0 );.      pNe
ba90: 77 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b  wTerm = &pWC->a[
baa0: 69 64 78 4e 65 77 5d 3b 0a 20 20 20 20 20 20 70  idxNew];.      p
bab0: 4e 65 77 54 65 72 6d 2d 3e 70 72 65 72 65 71 52  NewTerm->prereqR
bac0: 69 67 68 74 20 3d 20 70 72 65 72 65 71 45 78 70  ight = prereqExp
bad0: 72 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72  r;.      pNewTer
bae0: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20  m->leftCursor = 
baf0: 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20  pLeft->iTable;. 
bb00: 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 75       pNewTerm->u
bb10: 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c  .leftColumn = pL
bb20: 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  eft->iColumn;.  
bb30: 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 65 4f      pNewTerm->eO
bb40: 70 65 72 61 74 6f 72 20 3d 20 57 4f 5f 4d 41 54  perator = WO_MAT
bb50: 43 48 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65  CH;.      pNewTe
bb60: 72 6d 2d 3e 69 50 61 72 65 6e 74 20 3d 20 69 64  rm->iParent = id
bb70: 78 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 54 65  xTerm;.      pTe
bb80: 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78  rm = &pWC->a[idx
bb90: 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 70 54 65  Term];.      pTe
bba0: 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 31 3b 0a  rm->nChild = 1;.
bbb0: 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46        pTerm->wtF
bbc0: 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 50  lags |= TERM_COP
bbd0: 49 45 44 3b 0a 20 20 20 20 20 20 70 4e 65 77 54  IED;.      pNewT
bbe0: 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d  erm->prereqAll =
bbf0: 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c   pTerm->prereqAl
bc00: 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  l;.    }.  }.#en
bc10: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
bc20: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20  IT_VIRTUALTABLE 
bc30: 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
bc40: 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f  E_ENABLE_STAT3_O
bc50: 52 5f 53 54 41 54 34 0a 20 20 2f 2a 20 57 68 65  R_STAT4.  /* Whe
bc60: 6e 20 73 71 6c 69 74 65 5f 73 74 61 74 33 20 68  n sqlite_stat3 h
bc70: 69 73 74 6f 67 72 61 6d 20 64 61 74 61 20 69 73  istogram data is
bc80: 20 61 76 61 69 6c 61 62 6c 65 20 61 6e 20 6f 70   available an op
bc90: 65 72 61 74 6f 72 20 6f 66 20 74 68 65 0a 20 20  erator of the.  
bca0: 2a 2a 20 66 6f 72 6d 20 22 78 20 49 53 20 4e 4f  ** form "x IS NO
bcb0: 54 20 4e 55 4c 4c 22 20 63 61 6e 20 73 6f 6d 65  T NULL" can some
bcc0: 74 69 6d 65 73 20 62 65 20 65 76 61 6c 75 61 74  times be evaluat
bcd0: 65 64 20 6d 6f 72 65 20 65 66 66 69 63 69 65 6e  ed more efficien
bce0: 74 6c 79 0a 20 20 2a 2a 20 61 73 20 22 78 3e 4e  tly.  ** as "x>N
bcf0: 55 4c 4c 22 20 69 66 20 78 20 69 73 20 6e 6f 74  ULL" if x is not
bd00: 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d   an INTEGER PRIM
bd10: 41 52 59 20 4b 45 59 2e 20 20 53 6f 20 63 6f 6e  ARY KEY.  So con
bd20: 73 74 72 75 63 74 20 61 0a 20 20 2a 2a 20 76 69  struct a.  ** vi
bd30: 72 74 75 61 6c 20 74 65 72 6d 20 6f 66 20 74 68  rtual term of th
bd40: 61 74 20 66 6f 72 6d 2e 0a 20 20 2a 2a 0a 20 20  at form..  **.  
bd50: 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65  ** Note that the
bd60: 20 76 69 72 74 75 61 6c 20 74 65 72 6d 20 6d 75   virtual term mu
bd70: 73 74 20 62 65 20 74 61 67 67 65 64 20 77 69 74  st be tagged wit
bd80: 68 20 54 45 52 4d 5f 56 4e 55 4c 4c 2e 20 20 54  h TERM_VNULL.  T
bd90: 68 69 73 0a 20 20 2a 2a 20 54 45 52 4d 5f 56 4e  his.  ** TERM_VN
bda0: 55 4c 4c 20 74 61 67 20 77 69 6c 6c 20 73 75 70  ULL tag will sup
bdb0: 70 72 65 73 73 20 74 68 65 20 6e 6f 74 2d 6e 75  press the not-nu
bdc0: 6c 6c 20 63 68 65 63 6b 20 61 74 20 74 68 65 20  ll check at the 
bdd0: 62 65 67 69 6e 6e 69 6e 67 0a 20 20 2a 2a 20 6f  beginning.  ** o
bde0: 66 20 74 68 65 20 6c 6f 6f 70 2e 20 20 57 69 74  f the loop.  Wit
bdf0: 68 6f 75 74 20 74 68 65 20 54 45 52 4d 5f 56 4e  hout the TERM_VN
be00: 55 4c 4c 20 66 6c 61 67 2c 20 74 68 65 20 6e 6f  ULL flag, the no
be10: 74 2d 6e 75 6c 6c 20 63 68 65 63 6b 20 61 74 0a  t-null check at.
be20: 20 20 2a 2a 20 74 68 65 20 73 74 61 72 74 20 6f    ** the start o
be30: 66 20 74 68 65 20 6c 6f 6f 70 20 77 69 6c 6c 20  f the loop will 
be40: 70 72 65 76 65 6e 74 20 61 6e 79 20 72 65 73 75  prevent any resu
be50: 6c 74 73 20 66 72 6f 6d 20 62 65 69 6e 67 20 72  lts from being r
be60: 65 74 75 72 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20  eturned..  */.  
be70: 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  if( pExpr->op==T
be80: 4b 5f 4e 4f 54 4e 55 4c 4c 0a 20 20 20 26 26 20  K_NOTNULL.   && 
be90: 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 6f 70  pExpr->pLeft->op
bea0: 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20 26  ==TK_COLUMN.   &
beb0: 26 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e  & pExpr->pLeft->
bec0: 69 43 6f 6c 75 6d 6e 3e 3d 30 0a 20 20 20 26 26  iColumn>=0.   &&
bed0: 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61   OptimizationEna
bee0: 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f  bled(db, SQLITE_
bef0: 53 74 61 74 33 29 0a 20 20 29 7b 0a 20 20 20 20  Stat3).  ){.    
bf00: 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72 3b 0a  Expr *pNewExpr;.
bf10: 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20      Expr *pLeft 
bf20: 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a  = pExpr->pLeft;.
bf30: 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77 3b 0a      int idxNew;.
bf40: 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
bf50: 4e 65 77 54 65 72 6d 3b 0a 0a 20 20 20 20 70 4e  NewTerm;..    pN
bf60: 65 77 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  ewExpr = sqlite3
bf70: 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
bf80: 5f 47 54 2c 0a 20 20 20 20 20 20 20 20 20 20 20  _GT,.           
bf90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bfa0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
bfb0: 64 62 2c 20 70 4c 65 66 74 2c 20 30 29 2c 0a 20  db, pLeft, 0),. 
bfc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bfd0: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
bfe0: 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
bff0: 54 4b 5f 4e 55 4c 4c 2c 20 30 2c 20 30 2c 20 30  TK_NULL, 0, 0, 0
c000: 29 2c 20 30 29 3b 0a 0a 20 20 20 20 69 64 78 4e  ), 0);..    idxN
c010: 65 77 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65  ew = whereClause
c020: 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e 65 77  Insert(pWC, pNew
c030: 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20  Expr,.          
c040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c050: 20 20 20 20 54 45 52 4d 5f 56 49 52 54 55 41 4c      TERM_VIRTUAL
c060: 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 7c 54 45  |TERM_DYNAMIC|TE
c070: 52 4d 5f 56 4e 55 4c 4c 29 3b 0a 20 20 20 20 69  RM_VNULL);.    i
c080: 66 28 20 69 64 78 4e 65 77 20 29 7b 0a 20 20 20  f( idxNew ){.   
c090: 20 20 20 70 4e 65 77 54 65 72 6d 20 3d 20 26 70     pNewTerm = &p
c0a0: 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 3b 0a 20  WC->a[idxNew];. 
c0b0: 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 70       pNewTerm->p
c0c0: 72 65 72 65 71 52 69 67 68 74 20 3d 20 30 3b 0a  rereqRight = 0;.
c0d0: 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e        pNewTerm->
c0e0: 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 70 4c 65  leftCursor = pLe
c0f0: 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20  ft->iTable;.    
c100: 20 20 70 4e 65 77 54 65 72 6d 2d 3e 75 2e 6c 65    pNewTerm->u.le
c110: 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66 74  ftColumn = pLeft
c120: 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  ->iColumn;.     
c130: 20 70 4e 65 77 54 65 72 6d 2d 3e 65 4f 70 65 72   pNewTerm->eOper
c140: 61 74 6f 72 20 3d 20 57 4f 5f 47 54 3b 0a 20 20  ator = WO_GT;.  
c150: 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 69 50      pNewTerm->iP
c160: 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b  arent = idxTerm;
c170: 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26  .      pTerm = &
c180: 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b  pWC->a[idxTerm];
c190: 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43  .      pTerm->nC
c1a0: 68 69 6c 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  hild = 1;.      
c1b0: 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c  pTerm->wtFlags |
c1c0: 3d 20 54 45 52 4d 5f 43 4f 50 49 45 44 3b 0a 20  = TERM_COPIED;. 
c1d0: 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 70       pNewTerm->p
c1e0: 72 65 72 65 71 41 6c 6c 20 3d 20 70 54 65 72 6d  rereqAll = pTerm
c1f0: 2d 3e 70 72 65 72 65 71 41 6c 6c 3b 0a 20 20 20  ->prereqAll;.   
c200: 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a   }.  }.#endif /*
c210: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
c220: 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 20 2a 2f  TAT3_OR_STAT4 */
c230: 0a 0a 20 20 2f 2a 20 50 72 65 76 65 6e 74 20 4f  ..  /* Prevent O
c240: 4e 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 6f  N clause terms o
c250: 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20 66 72  f a LEFT JOIN fr
c260: 6f 6d 20 62 65 69 6e 67 20 75 73 65 64 20 74 6f  om being used to
c270: 20 64 72 69 76 65 0a 20 20 2a 2a 20 61 6e 20 69   drive.  ** an i
c280: 6e 64 65 78 20 66 6f 72 20 74 61 62 6c 65 73 20  ndex for tables 
c290: 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20 74  to the left of t
c2a0: 68 65 20 6a 6f 69 6e 2e 0a 20 20 2a 2f 0a 20 20  he join..  */.  
c2b0: 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
c2c0: 68 74 20 7c 3d 20 65 78 74 72 61 52 69 67 68 74  ht |= extraRight
c2d0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
c2e0: 66 75 6e 63 74 69 6f 6e 20 73 65 61 72 63 68 65  function searche
c2f0: 73 20 70 4c 69 73 74 20 66 6f 72 20 61 6e 20 65  s pList for an e
c300: 6e 74 72 79 20 74 68 61 74 20 6d 61 74 63 68 65  ntry that matche
c310: 73 20 74 68 65 20 69 43 6f 6c 2d 74 68 20 63 6f  s the iCol-th co
c320: 6c 75 6d 6e 0a 2a 2a 20 6f 66 20 69 6e 64 65 78  lumn.** of index
c330: 20 70 49 64 78 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   pIdx..**.** If 
c340: 73 75 63 68 20 61 6e 20 65 78 70 72 65 73 73 69  such an expressi
c350: 6f 6e 20 69 73 20 66 6f 75 6e 64 2c 20 69 74 73  on is found, its
c360: 20 69 6e 64 65 78 20 69 6e 20 70 4c 69 73 74 2d   index in pList-
c370: 3e 61 5b 5d 20 69 73 20 72 65 74 75 72 6e 65 64  >a[] is returned
c380: 2e 20 49 66 0a 2a 2a 20 6e 6f 20 65 78 70 72 65  . If.** no expre
c390: 73 73 69 6f 6e 20 69 73 20 66 6f 75 6e 64 2c 20  ssion is found, 
c3a0: 2d 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  -1 is returned..
c3b0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69  */.static int fi
c3c0: 6e 64 49 6e 64 65 78 43 6f 6c 28 0a 20 20 50 61  ndIndexCol(.  Pa
c3d0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
c3e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c3f0: 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a   Parse context *
c400: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  /.  ExprList *pL
c410: 69 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  ist,            
c420: 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
c430: 6e 20 6c 69 73 74 20 74 6f 20 73 65 61 72 63 68  n list to search
c440: 20 2a 2f 0a 20 20 69 6e 74 20 69 42 61 73 65 2c   */.  int iBase,
c450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c460: 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
c470: 66 6f 72 20 74 61 62 6c 65 20 61 73 73 6f 63 69  for table associ
c480: 61 74 65 64 20 77 69 74 68 20 70 49 64 78 20 2a  ated with pIdx *
c490: 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 2c  /.  Index *pIdx,
c4a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c4b0: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20      /* Index to 
c4c0: 6d 61 74 63 68 20 63 6f 6c 75 6d 6e 20 6f 66 20  match column of 
c4d0: 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 20 20 20  */.  int iCol   
c4e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c4f0: 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6f       /* Column o
c500: 66 20 69 6e 64 65 78 20 74 6f 20 6d 61 74 63 68  f index to match
c510: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   */.){.  int i;.
c520: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
c530: 6f 6c 6c 20 3d 20 70 49 64 78 2d 3e 61 7a 43 6f  oll = pIdx->azCo
c540: 6c 6c 5b 69 43 6f 6c 5d 3b 0a 0a 20 20 66 6f 72  ll[iCol];..  for
c550: 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  (i=0; i<pList->n
c560: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
c570: 45 78 70 72 20 2a 70 20 3d 20 73 71 6c 69 74 65  Expr *p = sqlite
c580: 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65  3ExprSkipCollate
c590: 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  (pList->a[i].pEx
c5a0: 70 72 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  pr);.    if( p->
c5b0: 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20  op==TK_COLUMN.  
c5c0: 20 20 20 26 26 20 70 2d 3e 69 43 6f 6c 75 6d 6e     && p->iColumn
c5d0: 3d 3d 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  ==pIdx->aiColumn
c5e0: 5b 69 43 6f 6c 5d 0a 20 20 20 20 20 26 26 20 70  [iCol].     && p
c5f0: 2d 3e 69 54 61 62 6c 65 3d 3d 69 42 61 73 65 0a  ->iTable==iBase.
c600: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 43 6f 6c      ){.      Col
c610: 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73 71  lSeq *pColl = sq
c620: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
c630: 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2d 3e  (pParse, pList->
c640: 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[i].pExpr);.   
c650: 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 43     if( ALWAYS(pC
c660: 6f 6c 6c 29 20 26 26 20 30 3d 3d 73 71 6c 69 74  oll) && 0==sqlit
c670: 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 6c 2d  e3StrICmp(pColl-
c680: 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 6c 29 20 29  >zName, zColl) )
c690: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
c6a0: 20 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   i;.      }.    
c6b0: 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
c6c0: 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  -1;.}../*.** Ret
c6d0: 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20  urn true if the 
c6e0: 44 49 53 54 49 4e 43 54 20 65 78 70 72 65 73 73  DISTINCT express
c6f0: 69 6f 6e 2d 6c 69 73 74 20 70 61 73 73 65 64 20  ion-list passed 
c700: 61 73 20 74 68 65 20 74 68 69 72 64 20 61 72 67  as the third arg
c710: 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 72 65 64 75  ument.** is redu
c720: 6e 64 61 6e 74 2e 0a 2a 2a 0a 2a 2a 20 41 20 44  ndant..**.** A D
c730: 49 53 54 49 4e 43 54 20 6c 69 73 74 20 69 73 20  ISTINCT list is 
c740: 72 65 64 75 6e 64 61 6e 74 20 69 66 20 74 68 65  redundant if the
c750: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69   database contai
c760: 6e 73 20 73 6f 6d 65 20 73 75 62 73 65 74 20 6f  ns some subset o
c770: 66 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 20 74 68 61  f.** columns tha
c780: 74 20 61 72 65 20 75 6e 69 71 75 65 20 61 6e 64  t are unique and
c790: 20 6e 6f 6e 2d 6e 75 6c 6c 2e 0a 2a 2f 0a 73 74   non-null..*/.st
c7a0: 61 74 69 63 20 69 6e 74 20 69 73 44 69 73 74 69  atic int isDisti
c7b0: 6e 63 74 52 65 64 75 6e 64 61 6e 74 28 0a 20 20  nctRedundant(.  
c7c0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
c7d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
c7e0: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
c7f0: 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
c800: 69 73 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 54  ist,        /* T
c810: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a  he FROM clause *
c820: 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  /.  WhereClause 
c830: 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20 2f 2a  *pWC,         /*
c840: 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
c850: 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  e */.  ExprList 
c860: 2a 70 44 69 73 74 69 6e 63 74 20 20 20 20 20 20  *pDistinct      
c870: 20 2f 2a 20 54 68 65 20 72 65 73 75 6c 74 20 73   /* The result s
c880: 65 74 20 74 68 61 74 20 6e 65 65 64 73 20 74 6f  et that needs to
c890: 20 62 65 20 44 49 53 54 49 4e 43 54 20 2a 2f 0a   be DISTINCT */.
c8a0: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  ){.  Table *pTab
c8b0: 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b  ;.  Index *pIdx;
c8c0: 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
c8d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c8e0: 20 20 20 0a 20 20 69 6e 74 20 69 42 61 73 65 3b     .  int iBase;
c8f0: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
c900: 69 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  is more than one
c910: 20 74 61 62 6c 65 20 6f 72 20 73 75 62 2d 73 65   table or sub-se
c920: 6c 65 63 74 20 69 6e 20 74 68 65 20 46 52 4f 4d  lect in the FROM
c930: 20 63 6c 61 75 73 65 20 6f 66 0a 20 20 2a 2a 20   clause of.  ** 
c940: 74 68 69 73 20 71 75 65 72 79 2c 20 74 68 65 6e  this query, then
c950: 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20   it will not be 
c960: 70 6f 73 73 69 62 6c 65 20 74 6f 20 73 68 6f 77  possible to show
c970: 20 74 68 61 74 20 74 68 65 20 44 49 53 54 49 4e   that the DISTIN
c980: 43 54 20 0a 20 20 2a 2a 20 63 6c 61 75 73 65 20  CT .  ** clause 
c990: 69 73 20 72 65 64 75 6e 64 61 6e 74 2e 20 2a 2f  is redundant. */
c9a0: 0a 20 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d  .  if( pTabList-
c9b0: 3e 6e 53 72 63 21 3d 31 20 29 20 72 65 74 75 72  >nSrc!=1 ) retur
c9c0: 6e 20 30 3b 0a 20 20 69 42 61 73 65 20 3d 20 70  n 0;.  iBase = p
c9d0: 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e 69 43  TabList->a[0].iC
c9e0: 75 72 73 6f 72 3b 0a 20 20 70 54 61 62 20 3d 20  ursor;.  pTab = 
c9f0: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  pTabList->a[0].p
ca00: 54 61 62 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e  Tab;..  /* If an
ca10: 79 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73  y of the express
ca20: 69 6f 6e 73 20 69 73 20 61 6e 20 49 50 4b 20 63  ions is an IPK c
ca30: 6f 6c 75 6d 6e 20 6f 6e 20 74 61 62 6c 65 20 69  olumn on table i
ca40: 42 61 73 65 2c 20 74 68 65 6e 20 72 65 74 75 72  Base, then retur
ca50: 6e 20 0a 20 20 2a 2a 20 74 72 75 65 2e 20 4e 6f  n .  ** true. No
ca60: 74 65 3a 20 54 68 65 20 28 70 2d 3e 69 54 61 62  te: The (p->iTab
ca70: 6c 65 3d 3d 69 42 61 73 65 29 20 70 61 72 74 20  le==iBase) part 
ca80: 6f 66 20 74 68 69 73 20 74 65 73 74 20 6d 61 79  of this test may
ca90: 20 62 65 20 66 61 6c 73 65 20 69 66 20 74 68 65   be false if the
caa0: 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 53 45  .  ** current SE
cab0: 4c 45 43 54 20 69 73 20 61 20 63 6f 72 72 65 6c  LECT is a correl
cac0: 61 74 65 64 20 73 75 62 2d 71 75 65 72 79 2e 0a  ated sub-query..
cad0: 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20    */.  for(i=0; 
cae0: 69 3c 70 44 69 73 74 69 6e 63 74 2d 3e 6e 45 78  i<pDistinct->nEx
caf0: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78  pr; i++){.    Ex
cb00: 70 72 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 45  pr *p = sqlite3E
cb10: 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70  xprSkipCollate(p
cb20: 44 69 73 74 69 6e 63 74 2d 3e 61 5b 69 5d 2e 70  Distinct->a[i].p
cb30: 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20 70  Expr);.    if( p
cb40: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
cb50: 26 26 20 70 2d 3e 69 54 61 62 6c 65 3d 3d 69 42  && p->iTable==iB
cb60: 61 73 65 20 26 26 20 70 2d 3e 69 43 6f 6c 75 6d  ase && p->iColum
cb70: 6e 3c 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  n<0 ) return 1;.
cb80: 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20 74    }..  /* Loop t
cb90: 68 72 6f 75 67 68 20 61 6c 6c 20 69 6e 64 69 63  hrough all indic
cba0: 65 73 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 2c  es on the table,
cbb0: 20 63 68 65 63 6b 69 6e 67 20 65 61 63 68 20 74   checking each t
cbc0: 6f 20 73 65 65 20 69 66 20 69 74 20 6d 61 6b 65  o see if it make
cbd0: 73 0a 20 20 2a 2a 20 74 68 65 20 44 49 53 54 49  s.  ** the DISTI
cbe0: 4e 43 54 20 71 75 61 6c 69 66 69 65 72 20 72 65  NCT qualifier re
cbf0: 64 75 6e 64 61 6e 74 2e 20 49 74 20 64 6f 65 73  dundant. It does
cc00: 20 73 6f 20 69 66 3a 0a 20 20 2a 2a 0a 20 20 2a   so if:.  **.  *
cc10: 2a 20 20 20 31 2e 20 54 68 65 20 69 6e 64 65 78  *   1. The index
cc20: 20 69 73 20 69 74 73 65 6c 66 20 55 4e 49 51 55   is itself UNIQU
cc30: 45 2c 20 61 6e 64 0a 20 20 2a 2a 0a 20 20 2a 2a  E, and.  **.  **
cc40: 20 20 20 32 2e 20 41 6c 6c 20 6f 66 20 74 68 65     2. All of the
cc50: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
cc60: 69 6e 64 65 78 20 61 72 65 20 65 69 74 68 65 72  index are either
cc70: 20 70 61 72 74 20 6f 66 20 74 68 65 20 70 44 69   part of the pDi
cc80: 73 74 69 6e 63 74 0a 20 20 2a 2a 20 20 20 20 20  stinct.  **     
cc90: 20 6c 69 73 74 2c 20 6f 72 20 65 6c 73 65 20 74   list, or else t
cca0: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
ccb0: 63 6f 6e 74 61 69 6e 73 20 61 20 74 65 72 6d 20  contains a term 
ccc0: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 63 6f 6c  of the form "col
ccd0: 3d 58 22 2c 0a 20 20 2a 2a 20 20 20 20 20 20 77  =X",.  **      w
cce0: 68 65 72 65 20 58 20 69 73 20 61 20 63 6f 6e 73  here X is a cons
ccf0: 74 61 6e 74 20 76 61 6c 75 65 2e 20 54 68 65 20  tant value. The 
cd00: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
cd10: 63 65 73 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  ces of the.  ** 
cd20: 20 20 20 20 20 63 6f 6d 70 61 72 69 73 6f 6e 20       comparison 
cd30: 61 6e 64 20 73 65 6c 65 63 74 2d 6c 69 73 74 20  and select-list 
cd40: 65 78 70 72 65 73 73 69 6f 6e 73 20 6d 75 73 74  expressions must
cd50: 20 6d 61 74 63 68 20 74 68 6f 73 65 20 6f 66 20   match those of 
cd60: 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 2a 2a 0a  the index..  **.
cd70: 20 20 2a 2a 20 20 20 33 2e 20 41 6c 6c 20 6f 66    **   3. All of
cd80: 20 74 68 6f 73 65 20 69 6e 64 65 78 20 63 6f 6c   those index col
cd90: 75 6d 6e 73 20 66 6f 72 20 77 68 69 63 68 20 74  umns for which t
cda0: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
cdb0: 64 6f 65 73 20 6e 6f 74 0a 20 20 2a 2a 20 20 20  does not.  **   
cdc0: 20 20 20 63 6f 6e 74 61 69 6e 20 61 20 22 63 6f     contain a "co
cdd0: 6c 3d 58 22 20 74 65 72 6d 20 61 72 65 20 73 75  l=X" term are su
cde0: 62 6a 65 63 74 20 74 6f 20 61 20 4e 4f 54 20 4e  bject to a NOT N
cdf0: 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0a  ULL constraint..
ce00: 20 20 2a 2f 0a 20 20 66 6f 72 28 70 49 64 78 3d    */.  for(pIdx=
ce10: 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
ce20: 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  dx; pIdx=pIdx->p
ce30: 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 21  Next){.    if( !
ce40: 49 73 55 6e 69 71 75 65 49 6e 64 65 78 28 70 49  IsUniqueIndex(pI
ce50: 64 78 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  dx) ) continue;.
ce60: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
ce70: 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 69 2b  Idx->nKeyCol; i+
ce80: 2b 29 7b 0a 20 20 20 20 20 20 69 31 36 20 69 43  +){.      i16 iC
ce90: 6f 6c 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c  ol = pIdx->aiCol
cea0: 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66  umn[i];.      if
ceb0: 28 20 30 3d 3d 66 69 6e 64 54 65 72 6d 28 70 57  ( 0==findTerm(pW
cec0: 43 2c 20 69 42 61 73 65 2c 20 69 43 6f 6c 2c 20  C, iBase, iCol, 
ced0: 7e 28 42 69 74 6d 61 73 6b 29 30 2c 20 57 4f 5f  ~(Bitmask)0, WO_
cee0: 45 51 2c 20 70 49 64 78 29 20 29 7b 0a 20 20 20  EQ, pIdx) ){.   
cef0: 20 20 20 20 20 69 6e 74 20 69 49 64 78 43 6f 6c       int iIdxCol
cf00: 20 3d 20 66 69 6e 64 49 6e 64 65 78 43 6f 6c 28   = findIndexCol(
cf10: 70 50 61 72 73 65 2c 20 70 44 69 73 74 69 6e 63  pParse, pDistinc
cf20: 74 2c 20 69 42 61 73 65 2c 20 70 49 64 78 2c 20  t, iBase, pIdx, 
cf30: 69 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  i);.        if( 
cf40: 69 49 64 78 43 6f 6c 3c 30 20 7c 7c 20 70 54 61  iIdxCol<0 || pTa
cf50: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 6e 6f  b->aCol[iCol].no
cf60: 74 4e 75 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  tNull==0 ){.    
cf70: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
cf80: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
cf90: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3d 3d     }.    if( i==
cfa0: 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 20 29 7b  pIdx->nKeyCol ){
cfb0: 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 69  .      /* This i
cfc0: 6e 64 65 78 20 69 6d 70 6c 69 65 73 20 74 68 61  ndex implies tha
cfd0: 74 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 71  t the DISTINCT q
cfe0: 75 61 6c 69 66 69 65 72 20 69 73 20 72 65 64 75  ualifier is redu
cff0: 6e 64 61 6e 74 2e 20 2a 2f 0a 20 20 20 20 20 20  ndant. */.      
d000: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
d010: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 30 3b    }..  return 0;
d020: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d  .}.../*.** Estim
d030: 61 74 65 20 74 68 65 20 6c 6f 67 61 72 69 74 68  ate the logarith
d040: 6d 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20 76  m of the input v
d050: 61 6c 75 65 20 74 6f 20 62 61 73 65 20 32 2e 0a  alue to base 2..
d060: 2a 2f 0a 73 74 61 74 69 63 20 4c 6f 67 45 73 74  */.static LogEst
d070: 20 65 73 74 4c 6f 67 28 4c 6f 67 45 73 74 20 4e   estLog(LogEst N
d080: 29 7b 0a 20 20 72 65 74 75 72 6e 20 4e 3c 3d 31  ){.  return N<=1
d090: 30 20 3f 20 30 20 3a 20 73 71 6c 69 74 65 33 4c  0 ? 0 : sqlite3L
d0a0: 6f 67 45 73 74 28 4e 29 20 2d 20 33 33 3b 0a 7d  ogEst(N) - 33;.}
d0b0: 0a 0a 2f 2a 0a 2a 2a 20 54 77 6f 20 72 6f 75 74  ../*.** Two rout
d0c0: 69 6e 65 73 20 66 6f 72 20 70 72 69 6e 74 69 6e  ines for printin
d0d0: 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  g the content of
d0e0: 20 61 6e 20 73 71 6c 69 74 65 33 5f 69 6e 64 65   an sqlite3_inde
d0f0: 78 5f 69 6e 66 6f 0a 2a 2a 20 73 74 72 75 63 74  x_info.** struct
d100: 75 72 65 2e 20 20 55 73 65 64 20 66 6f 72 20 74  ure.  Used for t
d110: 65 73 74 69 6e 67 20 61 6e 64 20 64 65 62 75 67  esting and debug
d120: 67 69 6e 67 20 6f 6e 6c 79 2e 20 20 49 66 20 6e  ging only.  If n
d130: 65 69 74 68 65 72 0a 2a 2a 20 53 51 4c 49 54 45  either.** SQLITE
d140: 5f 54 45 53 54 20 6f 72 20 53 51 4c 49 54 45 5f  _TEST or SQLITE_
d150: 44 45 42 55 47 20 61 72 65 20 64 65 66 69 6e 65  DEBUG are define
d160: 64 2c 20 74 68 65 6e 20 74 68 65 73 65 20 72 6f  d, then these ro
d170: 75 74 69 6e 65 73 0a 2a 2a 20 61 72 65 20 6e 6f  utines.** are no
d180: 2d 6f 70 73 2e 0a 2a 2f 0a 23 69 66 20 21 64 65  -ops..*/.#if !de
d190: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
d1a0: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 20  T_VIRTUALTABLE) 
d1b0: 26 26 20 64 65 66 69 6e 65 64 28 57 48 45 52 45  && defined(WHERE
d1c0: 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 29 0a 73  TRACE_ENABLED).s
d1d0: 74 61 74 69 63 20 76 6f 69 64 20 54 52 41 43 45  tatic void TRACE
d1e0: 5f 49 44 58 5f 49 4e 50 55 54 53 28 73 71 6c 69  _IDX_INPUTS(sqli
d1f0: 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a  te3_index_info *
d200: 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  p){.  int i;.  i
d210: 66 28 20 21 73 71 6c 69 74 65 33 57 68 65 72 65  f( !sqlite3Where
d220: 54 72 61 63 65 20 29 20 72 65 74 75 72 6e 3b 0a  Trace ) return;.
d230: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
d240: 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b  nConstraint; i++
d250: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  ){.    sqlite3De
d260: 62 75 67 50 72 69 6e 74 66 28 22 20 20 63 6f 6e  bugPrintf("  con
d270: 73 74 72 61 69 6e 74 5b 25 64 5d 3a 20 63 6f 6c  straint[%d]: col
d280: 3d 25 64 20 74 65 72 6d 69 64 3d 25 64 20 6f 70  =%d termid=%d op
d290: 3d 25 64 20 75 73 61 62 6c 65 64 3d 25 64 5c 6e  =%d usabled=%d\n
d2a0: 22 2c 0a 20 20 20 20 20 20 20 69 2c 0a 20 20 20  ",.       i,.   
d2b0: 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69      p->aConstrai
d2c0: 6e 74 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 2c 0a 20  nt[i].iColumn,. 
d2d0: 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72        p->aConstr
d2e0: 61 69 6e 74 5b 69 5d 2e 69 54 65 72 6d 4f 66 66  aint[i].iTermOff
d2f0: 73 65 74 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61  set,.       p->a
d300: 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 6f 70  Constraint[i].op
d310: 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e  ,.       p->aCon
d320: 73 74 72 61 69 6e 74 5b 69 5d 2e 75 73 61 62 6c  straint[i].usabl
d330: 65 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d  e);.  }.  for(i=
d340: 30 3b 20 69 3c 70 2d 3e 6e 4f 72 64 65 72 42 79  0; i<p->nOrderBy
d350: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  ; i++){.    sqli
d360: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
d370: 20 20 6f 72 64 65 72 62 79 5b 25 64 5d 3a 20 63    orderby[%d]: c
d380: 6f 6c 3d 25 64 20 64 65 73 63 3d 25 64 5c 6e 22  ol=%d desc=%d\n"
d390: 2c 0a 20 20 20 20 20 20 20 69 2c 0a 20 20 20 20  ,.       i,.    
d3a0: 20 20 20 70 2d 3e 61 4f 72 64 65 72 42 79 5b 69     p->aOrderBy[i
d3b0: 5d 2e 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20  ].iColumn,.     
d3c0: 20 20 70 2d 3e 61 4f 72 64 65 72 42 79 5b 69 5d    p->aOrderBy[i]
d3d0: 2e 64 65 73 63 29 3b 0a 20 20 7d 0a 7d 0a 73 74  .desc);.  }.}.st
d3e0: 61 74 69 63 20 76 6f 69 64 20 54 52 41 43 45 5f  atic void TRACE_
d3f0: 49 44 58 5f 4f 55 54 50 55 54 53 28 73 71 6c 69  IDX_OUTPUTS(sqli
d400: 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a  te3_index_info *
d410: 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  p){.  int i;.  i
d420: 66 28 20 21 73 71 6c 69 74 65 33 57 68 65 72 65  f( !sqlite3Where
d430: 54 72 61 63 65 20 29 20 72 65 74 75 72 6e 3b 0a  Trace ) return;.
d440: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
d450: 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b  nConstraint; i++
d460: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  ){.    sqlite3De
d470: 62 75 67 50 72 69 6e 74 66 28 22 20 20 75 73 61  bugPrintf("  usa
d480: 67 65 5b 25 64 5d 3a 20 61 72 67 76 49 64 78 3d  ge[%d]: argvIdx=
d490: 25 64 20 6f 6d 69 74 3d 25 64 5c 6e 22 2c 0a 20  %d omit=%d\n",. 
d4a0: 20 20 20 20 20 20 69 2c 0a 20 20 20 20 20 20 20        i,.       
d4b0: 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73  p->aConstraintUs
d4c0: 61 67 65 5b 69 5d 2e 61 72 67 76 49 6e 64 65 78  age[i].argvIndex
d4d0: 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e  ,.       p->aCon
d4e0: 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e  straintUsage[i].
d4f0: 6f 6d 69 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  omit);.  }.  sql
d500: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
d510: 22 20 20 69 64 78 4e 75 6d 3d 25 64 5c 6e 22 2c  "  idxNum=%d\n",
d520: 20 70 2d 3e 69 64 78 4e 75 6d 29 3b 0a 20 20 73   p->idxNum);.  s
d530: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
d540: 66 28 22 20 20 69 64 78 53 74 72 3d 25 73 5c 6e  f("  idxStr=%s\n
d550: 22 2c 20 70 2d 3e 69 64 78 53 74 72 29 3b 0a 20  ", p->idxStr);. 
d560: 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
d570: 6e 74 66 28 22 20 20 6f 72 64 65 72 42 79 43 6f  ntf("  orderByCo
d580: 6e 73 75 6d 65 64 3d 25 64 5c 6e 22 2c 20 70 2d  nsumed=%d\n", p-
d590: 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64  >orderByConsumed
d5a0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75  );.  sqlite3Debu
d5b0: 67 50 72 69 6e 74 66 28 22 20 20 65 73 74 69 6d  gPrintf("  estim
d5c0: 61 74 65 64 43 6f 73 74 3d 25 67 5c 6e 22 2c 20  atedCost=%g\n", 
d5d0: 70 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74  p->estimatedCost
d5e0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75  );.  sqlite3Debu
d5f0: 67 50 72 69 6e 74 66 28 22 20 20 65 73 74 69 6d  gPrintf("  estim
d600: 61 74 65 64 52 6f 77 73 3d 25 6c 6c 64 5c 6e 22  atedRows=%lld\n"
d610: 2c 20 70 2d 3e 65 73 74 69 6d 61 74 65 64 52 6f  , p->estimatedRo
d620: 77 73 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64 65  ws);.}.#else.#de
d630: 66 69 6e 65 20 54 52 41 43 45 5f 49 44 58 5f 49  fine TRACE_IDX_I
d640: 4e 50 55 54 53 28 41 29 0a 23 64 65 66 69 6e 65  NPUTS(A).#define
d650: 20 54 52 41 43 45 5f 49 44 58 5f 4f 55 54 50 55   TRACE_IDX_OUTPU
d660: 54 53 28 41 29 0a 23 65 6e 64 69 66 0a 0a 23 69  TS(A).#endif..#i
d670: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
d680: 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45  T_AUTOMATIC_INDE
d690: 58 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  X./*.** Return T
d6a0: 52 55 45 20 69 66 20 74 68 65 20 57 48 45 52 45  RUE if the WHERE
d6b0: 20 63 6c 61 75 73 65 20 74 65 72 6d 20 70 54 65   clause term pTe
d6c0: 72 6d 20 69 73 20 6f 66 20 61 20 66 6f 72 6d 20  rm is of a form 
d6d0: 77 68 65 72 65 20 69 74 0a 2a 2a 20 63 6f 75 6c  where it.** coul
d6e0: 64 20 62 65 20 75 73 65 64 20 77 69 74 68 20 61  d be used with a
d6f0: 6e 20 69 6e 64 65 78 20 74 6f 20 61 63 63 65 73  n index to acces
d700: 73 20 70 53 72 63 2c 20 61 73 73 75 6d 69 6e 67  s pSrc, assuming
d710: 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 0a   an appropriate.
d720: 2a 2a 20 69 6e 64 65 78 20 65 78 69 73 74 65 64  ** index existed
d730: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
d740: 74 65 72 6d 43 61 6e 44 72 69 76 65 49 6e 64 65  termCanDriveInde
d750: 78 28 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  x(.  WhereTerm *
d760: 70 54 65 72 6d 2c 20 20 20 20 20 20 20 20 20 20  pTerm,          
d770: 20 20 20 20 2f 2a 20 57 48 45 52 45 20 63 6c 61      /* WHERE cla
d780: 75 73 65 20 74 65 72 6d 20 74 6f 20 63 68 65 63  use term to chec
d790: 6b 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72  k */.  struct Sr
d7a0: 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63  cList_item *pSrc
d7b0: 2c 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 77  ,     /* Table w
d7c0: 65 20 61 72 65 20 74 72 79 69 6e 67 20 74 6f 20  e are trying to 
d7d0: 61 63 63 65 73 73 20 2a 2f 0a 20 20 42 69 74 6d  access */.  Bitm
d7e0: 61 73 6b 20 6e 6f 74 52 65 61 64 79 20 20 20 20  ask notReady    
d7f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61             /* Ta
d800: 62 6c 65 73 20 69 6e 20 6f 75 74 65 72 20 6c 6f  bles in outer lo
d810: 6f 70 73 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20  ops of the join 
d820: 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 61 66 66  */.){.  char aff
d830: 3b 0a 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c  ;.  if( pTerm->l
d840: 65 66 74 43 75 72 73 6f 72 21 3d 70 53 72 63 2d  eftCursor!=pSrc-
d850: 3e 69 43 75 72 73 6f 72 20 29 20 72 65 74 75 72  >iCursor ) retur
d860: 6e 20 30 3b 0a 20 20 69 66 28 20 28 70 54 65 72  n 0;.  if( (pTer
d870: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
d880: 4f 5f 45 51 29 3d 3d 30 20 29 20 72 65 74 75 72  O_EQ)==0 ) retur
d890: 6e 20 30 3b 0a 20 20 69 66 28 20 28 70 54 65 72  n 0;.  if( (pTer
d8a0: 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 26  m->prereqRight &
d8b0: 20 6e 6f 74 52 65 61 64 79 29 21 3d 30 20 29 20   notReady)!=0 ) 
d8c0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
d8d0: 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c  pTerm->u.leftCol
d8e0: 75 6d 6e 3c 30 20 29 20 72 65 74 75 72 6e 20 30  umn<0 ) return 0
d8f0: 3b 0a 20 20 61 66 66 20 3d 20 70 53 72 63 2d 3e  ;.  aff = pSrc->
d900: 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 65 72 6d  pTab->aCol[pTerm
d910: 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 5d 2e  ->u.leftColumn].
d920: 61 66 66 69 6e 69 74 79 3b 0a 20 20 69 66 28 20  affinity;.  if( 
d930: 21 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66  !sqlite3IndexAff
d940: 69 6e 69 74 79 4f 6b 28 70 54 65 72 6d 2d 3e 70  inityOk(pTerm->p
d950: 45 78 70 72 2c 20 61 66 66 29 20 29 20 72 65 74  Expr, aff) ) ret
d960: 75 72 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  urn 0;.  return 
d970: 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23 69  1;.}.#endif...#i
d980: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
d990: 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45  T_AUTOMATIC_INDE
d9a0: 58 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  X./*.** Generate
d9b0: 20 63 6f 64 65 20 74 6f 20 63 6f 6e 73 74 72 75   code to constru
d9c0: 63 74 20 74 68 65 20 49 6e 64 65 78 20 6f 62 6a  ct the Index obj
d9d0: 65 63 74 20 66 6f 72 20 61 6e 20 61 75 74 6f 6d  ect for an autom
d9e0: 61 74 69 63 20 69 6e 64 65 78 0a 2a 2a 20 61 6e  atic index.** an
d9f0: 64 20 74 6f 20 73 65 74 20 75 70 20 74 68 65 20  d to set up the 
da00: 57 68 65 72 65 4c 65 76 65 6c 20 6f 62 6a 65 63  WhereLevel objec
da10: 74 20 70 4c 65 76 65 6c 20 73 6f 20 74 68 61 74  t pLevel so that
da20: 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61   the code genera
da30: 74 6f 72 0a 2a 2a 20 6d 61 6b 65 73 20 75 73 65  tor.** makes use
da40: 20 6f 66 20 74 68 65 20 61 75 74 6f 6d 61 74 69   of the automati
da50: 63 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74  c index..*/.stat
da60: 69 63 20 76 6f 69 64 20 63 6f 6e 73 74 72 75 63  ic void construc
da70: 74 41 75 74 6f 6d 61 74 69 63 49 6e 64 65 78 28  tAutomaticIndex(
da80: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
da90: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
daa0: 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f  * The parsing co
dab0: 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65  ntext */.  Where
dac0: 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20  Clause *pWC,    
dad0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48         /* The WH
dae0: 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
daf0: 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
db00: 74 65 6d 20 2a 70 53 72 63 2c 20 20 2f 2a 20 54  tem *pSrc,  /* T
db10: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74  he FROM clause t
db20: 65 72 6d 20 74 6f 20 67 65 74 20 74 68 65 20 6e  erm to get the n
db30: 65 78 74 20 69 6e 64 65 78 20 2a 2f 0a 20 20 42  ext index */.  B
db40: 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c  itmask notReady,
db50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
db60: 73 6b 20 6f 66 20 63 75 72 73 6f 72 73 20 74 68  sk of cursors th
db70: 61 74 20 61 72 65 20 6e 6f 74 20 61 76 61 69 6c  at are not avail
db80: 61 62 6c 65 20 2a 2f 0a 20 20 57 68 65 72 65 4c  able */.  WhereL
db90: 65 76 65 6c 20 2a 70 4c 65 76 65 6c 20 20 20 20  evel *pLevel    
dba0: 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6e        /* Write n
dbb0: 65 77 20 69 6e 64 65 78 20 68 65 72 65 20 2a 2f  ew index here */
dbc0: 0a 29 7b 0a 20 20 69 6e 74 20 6e 4b 65 79 43 6f  .){.  int nKeyCo
dbd0: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
dbe0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
dbf0: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 63 6f  olumns in the co
dc00: 6e 73 74 72 75 63 74 65 64 20 69 6e 64 65 78 20  nstructed index 
dc10: 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  */.  WhereTerm *
dc20: 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20  pTerm;          
dc30: 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 74 65 72   /* A single ter
dc40: 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  m of the WHERE c
dc50: 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65  lause */.  Where
dc60: 54 65 72 6d 20 2a 70 57 43 45 6e 64 3b 20 20 20  Term *pWCEnd;   
dc70: 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66         /* End of
dc80: 20 70 57 43 2d 3e 61 5b 5d 20 2a 2f 0a 20 20 49   pWC->a[] */.  I
dc90: 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20  ndex *pIdx;     
dca0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 62             /* Ob
dcb0: 6a 65 63 74 20 64 65 73 63 72 69 62 69 6e 67 20  ject describing 
dcc0: 74 68 65 20 74 72 61 6e 73 69 65 6e 74 20 69 6e  the transient in
dcd0: 64 65 78 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  dex */.  Vdbe *v
dce0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
dcf0: 20 20 20 20 20 2f 2a 20 50 72 65 70 61 72 65 64       /* Prepared
dd00: 20 73 74 61 74 65 6d 65 6e 74 20 75 6e 64 65 72   statement under
dd10: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f   construction */
dd20: 0a 20 20 69 6e 74 20 61 64 64 72 49 6e 69 74 3b  .  int addrInit;
dd30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
dd40: 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
dd50: 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
dd60: 62 79 70 61 73 73 20 6a 75 6d 70 20 2a 2f 0a 20  bypass jump */. 
dd70: 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 3b 20   Table *pTable; 
dd80: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
dd90: 54 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20  The table being 
dda0: 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74  indexed */.  int
ddb0: 20 61 64 64 72 54 6f 70 3b 20 20 20 20 20 20 20   addrTop;       
ddc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 70 20           /* Top 
ddd0: 6f 66 20 74 68 65 20 69 6e 64 65 78 20 66 69 6c  of the index fil
dde0: 6c 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20  l loop */.  int 
ddf0: 72 65 67 52 65 63 6f 72 64 3b 20 20 20 20 20 20  regRecord;      
de00: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73          /* Regis
de10: 74 65 72 20 68 6f 6c 64 69 6e 67 20 61 6e 20 69  ter holding an i
de20: 6e 64 65 78 20 72 65 63 6f 72 64 20 2a 2f 0a 20  ndex record */. 
de30: 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20   int n;         
de40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
de50: 43 6f 6c 75 6d 6e 20 63 6f 75 6e 74 65 72 20 2a  Column counter *
de60: 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
de70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de80: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
de90: 2a 2f 0a 20 20 69 6e 74 20 6d 78 42 69 74 43 6f  */.  int mxBitCo
dea0: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
deb0: 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 63 6f 6c 75   /* Maximum colu
dec0: 6d 6e 20 69 6e 20 70 53 72 63 2d 3e 63 6f 6c 55  mn in pSrc->colU
ded0: 73 65 64 20 2a 2f 0a 20 20 43 6f 6c 6c 53 65 71  sed */.  CollSeq
dee0: 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20   *pColl;        
def0: 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e       /* Collatin
df00: 67 20 73 65 71 75 65 6e 63 65 20 74 6f 20 6f 6e  g sequence to on
df10: 20 61 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 57   a column */.  W
df20: 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b  hereLoop *pLoop;
df30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
df40: 65 20 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 2a 2f  e Loop object */
df50: 0a 20 20 63 68 61 72 20 2a 7a 4e 6f 74 55 73 65  .  char *zNotUse
df60: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  d;             /
df70: 2a 20 45 78 74 72 61 20 73 70 61 63 65 20 6f 6e  * Extra space on
df80: 20 74 68 65 20 65 6e 64 20 6f 66 20 70 49 64 78   the end of pIdx
df90: 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 69 64   */.  Bitmask id
dfa0: 78 43 6f 6c 73 3b 20 20 20 20 20 20 20 20 20 20  xCols;          
dfb0: 20 20 2f 2a 20 42 69 74 6d 61 70 20 6f 66 20 63    /* Bitmap of c
dfc0: 6f 6c 75 6d 6e 73 20 75 73 65 64 20 66 6f 72 20  olumns used for 
dfd0: 69 6e 64 65 78 69 6e 67 20 2a 2f 0a 20 20 42 69  indexing */.  Bi
dfe0: 74 6d 61 73 6b 20 65 78 74 72 61 43 6f 6c 73 3b  tmask extraCols;
dff0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69 74            /* Bit
e000: 6d 61 70 20 6f 66 20 61 64 64 69 74 69 6f 6e 61  map of additiona
e010: 6c 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 75  l columns */.  u
e020: 38 20 73 65 6e 74 57 61 72 6e 69 6e 67 20 3d 20  8 sentWarning = 
e030: 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72  0;         /* Tr
e040: 75 65 20 69 66 20 61 20 77 61 72 6e 6e 69 6e 67  ue if a warnning
e050: 20 68 61 73 20 62 65 65 6e 20 69 73 73 75 65 64   has been issued
e060: 20 2a 2f 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61   */..  /* Genera
e070: 74 65 20 63 6f 64 65 20 74 6f 20 73 6b 69 70 20  te code to skip 
e080: 6f 76 65 72 20 74 68 65 20 63 72 65 61 74 69 6f  over the creatio
e090: 6e 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 61  n and initializa
e0a0: 74 69 6f 6e 20 6f 66 20 74 68 65 0a 20 20 2a 2a  tion of the.  **
e0b0: 20 74 72 61 6e 73 69 65 6e 74 20 69 6e 64 65 78   transient index
e0c0: 20 6f 6e 20 32 6e 64 20 61 6e 64 20 73 75 62 73   on 2nd and subs
e0d0: 65 71 75 65 6e 74 20 69 74 65 72 61 74 69 6f 6e  equent iteration
e0e0: 73 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20 2a  s of the loop. *
e0f0: 2f 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e  /.  v = pParse->
e100: 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74 28  pVdbe;.  assert(
e110: 20 76 21 3d 30 20 29 3b 0a 20 20 61 64 64 72 49   v!=0 );.  addrI
e120: 6e 69 74 20 3d 20 73 71 6c 69 74 65 33 43 6f 64  nit = sqlite3Cod
e130: 65 4f 6e 63 65 28 70 50 61 72 73 65 29 3b 20 56  eOnce(pParse); V
e140: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
e150: 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 74 68 65 20  .  /* Count the 
e160: 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  number of column
e170: 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 61  s that will be a
e180: 64 64 65 64 20 74 6f 20 74 68 65 20 69 6e 64 65  dded to the inde
e190: 78 0a 20 20 2a 2a 20 61 6e 64 20 75 73 65 64 20  x.  ** and used 
e1a0: 74 6f 20 6d 61 74 63 68 20 57 48 45 52 45 20 63  to match WHERE c
e1b0: 6c 61 75 73 65 20 63 6f 6e 73 74 72 61 69 6e 74  lause constraint
e1c0: 73 20 2a 2f 0a 20 20 6e 4b 65 79 43 6f 6c 20 3d  s */.  nKeyCol =
e1d0: 20 30 3b 0a 20 20 70 54 61 62 6c 65 20 3d 20 70   0;.  pTable = p
e1e0: 53 72 63 2d 3e 70 54 61 62 3b 0a 20 20 70 57 43  Src->pTab;.  pWC
e1f0: 45 6e 64 20 3d 20 26 70 57 43 2d 3e 61 5b 70 57  End = &pWC->a[pW
e200: 43 2d 3e 6e 54 65 72 6d 5d 3b 0a 20 20 70 4c 6f  C->nTerm];.  pLo
e210: 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c  op = pLevel->pWL
e220: 6f 6f 70 3b 0a 20 20 69 64 78 43 6f 6c 73 20 3d  oop;.  idxCols =
e230: 20 30 3b 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d   0;.  for(pTerm=
e240: 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 57  pWC->a; pTerm<pW
e250: 43 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a  CEnd; pTerm++){.
e260: 20 20 20 20 69 66 28 20 74 65 72 6d 43 61 6e 44      if( termCanD
e270: 72 69 76 65 49 6e 64 65 78 28 70 54 65 72 6d 2c  riveIndex(pTerm,
e280: 20 70 53 72 63 2c 20 6e 6f 74 52 65 61 64 79 29   pSrc, notReady)
e290: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 43   ){.      int iC
e2a0: 6f 6c 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65  ol = pTerm->u.le
e2b0: 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  ftColumn;.      
e2c0: 42 69 74 6d 61 73 6b 20 63 4d 61 73 6b 20 3d 20  Bitmask cMask = 
e2d0: 69 43 6f 6c 3e 3d 42 4d 53 20 3f 20 4d 41 53 4b  iCol>=BMS ? MASK
e2e0: 42 49 54 28 42 4d 53 2d 31 29 20 3a 20 4d 41 53  BIT(BMS-1) : MAS
e2f0: 4b 42 49 54 28 69 43 6f 6c 29 3b 0a 20 20 20 20  KBIT(iCol);.    
e300: 20 20 74 65 73 74 63 61 73 65 28 20 69 43 6f 6c    testcase( iCol
e310: 3d 3d 42 4d 53 20 29 3b 0a 20 20 20 20 20 20 74  ==BMS );.      t
e320: 65 73 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d 42  estcase( iCol==B
e330: 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20 20 69 66  MS-1 );.      if
e340: 28 20 21 73 65 6e 74 57 61 72 6e 69 6e 67 20 29  ( !sentWarning )
e350: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
e360: 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 57 41 52  3_log(SQLITE_WAR
e370: 4e 49 4e 47 5f 41 55 54 4f 49 4e 44 45 58 2c 0a  NING_AUTOINDEX,.
e380: 20 20 20 20 20 20 20 20 20 20 20 20 22 61 75 74              "aut
e390: 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 6f 6e 20  omatic index on 
e3a0: 25 73 28 25 73 29 22 2c 20 70 54 61 62 6c 65 2d  %s(%s)", pTable-
e3b0: 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  >zName,.        
e3c0: 20 20 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c      pTable->aCol
e3d0: 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 29 3b 0a 20  [iCol].zName);. 
e3e0: 20 20 20 20 20 20 20 73 65 6e 74 57 61 72 6e 69         sentWarni
e3f0: 6e 67 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  ng = 1;.      }.
e400: 20 20 20 20 20 20 69 66 28 20 28 69 64 78 43 6f        if( (idxCo
e410: 6c 73 20 26 20 63 4d 61 73 6b 29 3d 3d 30 20 29  ls & cMask)==0 )
e420: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 77 68  {.        if( wh
e430: 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 70 50  ereLoopResize(pP
e440: 61 72 73 65 2d 3e 64 62 2c 20 70 4c 6f 6f 70 2c  arse->db, pLoop,
e450: 20 6e 4b 65 79 43 6f 6c 2b 31 29 20 29 20 72 65   nKeyCol+1) ) re
e460: 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 70 4c  turn;.        pL
e470: 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6e 4b 65 79  oop->aLTerm[nKey
e480: 43 6f 6c 2b 2b 5d 20 3d 20 70 54 65 72 6d 3b 0a  Col++] = pTerm;.
e490: 20 20 20 20 20 20 20 20 69 64 78 43 6f 6c 73 20          idxCols 
e4a0: 7c 3d 20 63 4d 61 73 6b 3b 0a 20 20 20 20 20 20  |= cMask;.      
e4b0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73  }.    }.  }.  as
e4c0: 73 65 72 74 28 20 6e 4b 65 79 43 6f 6c 3e 30 20  sert( nKeyCol>0 
e4d0: 29 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  );.  pLoop->u.bt
e4e0: 72 65 65 2e 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d  ree.nEq = pLoop-
e4f0: 3e 6e 4c 54 65 72 6d 20 3d 20 6e 4b 65 79 43 6f  >nLTerm = nKeyCo
e500: 6c 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c  l;.  pLoop->wsFl
e510: 61 67 73 20 3d 20 57 48 45 52 45 5f 43 4f 4c 55  ags = WHERE_COLU
e520: 4d 4e 5f 45 51 20 7c 20 57 48 45 52 45 5f 49 44  MN_EQ | WHERE_ID
e530: 58 5f 4f 4e 4c 59 20 7c 20 57 48 45 52 45 5f 49  X_ONLY | WHERE_I
e540: 4e 44 45 58 45 44 0a 20 20 20 20 20 20 20 20 20  NDEXED.         
e550: 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 57 48              | WH
e560: 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 3b 0a  ERE_AUTO_INDEX;.
e570: 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 74 68 65 20  .  /* Count the 
e580: 6e 75 6d 62 65 72 20 6f 66 20 61 64 64 69 74 69  number of additi
e590: 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 73 20 6e 65 65  onal columns nee
e5a0: 64 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 0a  ded to create a.
e5b0: 20 20 2a 2a 20 63 6f 76 65 72 69 6e 67 20 69 6e    ** covering in
e5c0: 64 65 78 2e 20 20 41 20 22 63 6f 76 65 72 69 6e  dex.  A "coverin
e5d0: 67 20 69 6e 64 65 78 22 20 69 73 20 61 6e 20 69  g index" is an i
e5e0: 6e 64 65 78 20 74 68 61 74 20 63 6f 6e 74 61 69  ndex that contai
e5f0: 6e 73 20 61 6c 6c 0a 20 20 2a 2a 20 63 6f 6c 75  ns all.  ** colu
e600: 6d 6e 73 20 74 68 61 74 20 61 72 65 20 6e 65 65  mns that are nee
e610: 64 65 64 20 62 79 20 74 68 65 20 71 75 65 72 79  ded by the query
e620: 2e 20 20 57 69 74 68 20 61 20 63 6f 76 65 72 69  .  With a coveri
e630: 6e 67 20 69 6e 64 65 78 2c 20 74 68 65 0a 20 20  ng index, the.  
e640: 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 74 61 62 6c  ** original tabl
e650: 65 20 6e 65 76 65 72 20 6e 65 65 64 73 20 74 6f  e never needs to
e660: 20 62 65 20 61 63 63 65 73 73 65 64 2e 20 20 41   be accessed.  A
e670: 75 74 6f 6d 61 74 69 63 20 69 6e 64 69 63 65 73  utomatic indices
e680: 20 6d 75 73 74 0a 20 20 2a 2a 20 62 65 20 61 20   must.  ** be a 
e690: 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20 62  covering index b
e6a0: 65 63 61 75 73 65 20 74 68 65 20 69 6e 64 65 78  ecause the index
e6b0: 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75 70 64   will not be upd
e6c0: 61 74 65 64 20 69 66 20 74 68 65 0a 20 20 2a 2a  ated if the.  **
e6d0: 20 6f 72 69 67 69 6e 61 6c 20 74 61 62 6c 65 20   original table 
e6e0: 63 68 61 6e 67 65 73 20 61 6e 64 20 74 68 65 20  changes and the 
e6f0: 69 6e 64 65 78 20 61 6e 64 20 74 61 62 6c 65 20  index and table 
e700: 63 61 6e 6e 6f 74 20 62 6f 74 68 20 62 65 20 75  cannot both be u
e710: 73 65 64 0a 20 20 2a 2a 20 69 66 20 74 68 65 79  sed.  ** if they
e720: 20 67 6f 20 6f 75 74 20 6f 66 20 73 79 6e 63 2e   go out of sync.
e730: 0a 20 20 2a 2f 0a 20 20 65 78 74 72 61 43 6f 6c  .  */.  extraCol
e740: 73 20 3d 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65  s = pSrc->colUse
e750: 64 20 26 20 28 7e 69 64 78 43 6f 6c 73 20 7c 20  d & (~idxCols | 
e760: 4d 41 53 4b 42 49 54 28 42 4d 53 2d 31 29 29 3b  MASKBIT(BMS-1));
e770: 0a 20 20 6d 78 42 69 74 43 6f 6c 20 3d 20 28 70  .  mxBitCol = (p
e780: 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3e 3d 20 42  Table->nCol >= B
e790: 4d 53 2d 31 29 20 3f 20 42 4d 53 2d 31 20 3a 20  MS-1) ? BMS-1 : 
e7a0: 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 0a 20 20  pTable->nCol;.  
e7b0: 74 65 73 74 63 61 73 65 28 20 70 54 61 62 6c 65  testcase( pTable
e7c0: 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b  ->nCol==BMS-1 );
e7d0: 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 54 61  .  testcase( pTa
e7e0: 62 6c 65 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 32  ble->nCol==BMS-2
e7f0: 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   );.  for(i=0; i
e800: 3c 6d 78 42 69 74 43 6f 6c 3b 20 69 2b 2b 29 7b  <mxBitCol; i++){
e810: 0a 20 20 20 20 69 66 28 20 65 78 74 72 61 43 6f  .    if( extraCo
e820: 6c 73 20 26 20 4d 41 53 4b 42 49 54 28 69 29 20  ls & MASKBIT(i) 
e830: 29 20 6e 4b 65 79 43 6f 6c 2b 2b 3b 0a 20 20 7d  ) nKeyCol++;.  }
e840: 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 63 6f 6c  .  if( pSrc->col
e850: 55 73 65 64 20 26 20 4d 41 53 4b 42 49 54 28 42  Used & MASKBIT(B
e860: 4d 53 2d 31 29 20 29 7b 0a 20 20 20 20 6e 4b 65  MS-1) ){.    nKe
e870: 79 43 6f 6c 20 2b 3d 20 70 54 61 62 6c 65 2d 3e  yCol += pTable->
e880: 6e 43 6f 6c 20 2d 20 42 4d 53 20 2b 20 31 3b 0a  nCol - BMS + 1;.
e890: 20 20 7d 0a 20 20 70 4c 6f 6f 70 2d 3e 77 73 46    }.  pLoop->wsF
e8a0: 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f  lags |= WHERE_CO
e8b0: 4c 55 4d 4e 5f 45 51 20 7c 20 57 48 45 52 45 5f  LUMN_EQ | WHERE_
e8c0: 49 44 58 5f 4f 4e 4c 59 3b 0a 0a 20 20 2f 2a 20  IDX_ONLY;..  /* 
e8d0: 43 6f 6e 73 74 72 75 63 74 20 74 68 65 20 49 6e  Construct the In
e8e0: 64 65 78 20 6f 62 6a 65 63 74 20 74 6f 20 64 65  dex object to de
e8f0: 73 63 72 69 62 65 20 74 68 69 73 20 69 6e 64 65  scribe this inde
e900: 78 20 2a 2f 0a 20 20 70 49 64 78 20 3d 20 73 71  x */.  pIdx = sq
e910: 6c 69 74 65 33 41 6c 6c 6f 63 61 74 65 49 6e 64  lite3AllocateInd
e920: 65 78 4f 62 6a 65 63 74 28 70 50 61 72 73 65 2d  exObject(pParse-
e930: 3e 64 62 2c 20 6e 4b 65 79 43 6f 6c 2b 31 2c 20  >db, nKeyCol+1, 
e940: 30 2c 20 26 7a 4e 6f 74 55 73 65 64 29 3b 0a 20  0, &zNotUsed);. 
e950: 20 69 66 28 20 70 49 64 78 3d 3d 30 20 29 20 72   if( pIdx==0 ) r
e960: 65 74 75 72 6e 3b 0a 20 20 70 4c 6f 6f 70 2d 3e  eturn;.  pLoop->
e970: 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d  u.btree.pIndex =
e980: 20 70 49 64 78 3b 0a 20 20 70 49 64 78 2d 3e 7a   pIdx;.  pIdx->z
e990: 4e 61 6d 65 20 3d 20 22 61 75 74 6f 2d 69 6e 64  Name = "auto-ind
e9a0: 65 78 22 3b 0a 20 20 70 49 64 78 2d 3e 70 54 61  ex";.  pIdx->pTa
e9b0: 62 6c 65 20 3d 20 70 54 61 62 6c 65 3b 0a 20 20  ble = pTable;.  
e9c0: 6e 20 3d 20 30 3b 0a 20 20 69 64 78 43 6f 6c 73  n = 0;.  idxCols
e9d0: 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 54 65 72   = 0;.  for(pTer
e9e0: 6d 3d 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c  m=pWC->a; pTerm<
e9f0: 70 57 43 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29  pWCEnd; pTerm++)
ea00: 7b 0a 20 20 20 20 69 66 28 20 74 65 72 6d 43 61  {.    if( termCa
ea10: 6e 44 72 69 76 65 49 6e 64 65 78 28 70 54 65 72  nDriveIndex(pTer
ea20: 6d 2c 20 70 53 72 63 2c 20 6e 6f 74 52 65 61 64  m, pSrc, notRead
ea30: 79 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  y) ){.      int 
ea40: 69 43 6f 6c 20 3d 20 70 54 65 72 6d 2d 3e 75 2e  iCol = pTerm->u.
ea50: 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  leftColumn;.    
ea60: 20 20 42 69 74 6d 61 73 6b 20 63 4d 61 73 6b 20    Bitmask cMask 
ea70: 3d 20 69 43 6f 6c 3e 3d 42 4d 53 20 3f 20 4d 41  = iCol>=BMS ? MA
ea80: 53 4b 42 49 54 28 42 4d 53 2d 31 29 20 3a 20 4d  SKBIT(BMS-1) : M
ea90: 41 53 4b 42 49 54 28 69 43 6f 6c 29 3b 0a 20 20  ASKBIT(iCol);.  
eaa0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 43      testcase( iC
eab0: 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20  ol==BMS-1 );.   
eac0: 20 20 20 74 65 73 74 63 61 73 65 28 20 69 43 6f     testcase( iCo
ead0: 6c 3d 3d 42 4d 53 20 29 3b 0a 20 20 20 20 20 20  l==BMS );.      
eae0: 69 66 28 20 28 69 64 78 43 6f 6c 73 20 26 20 63  if( (idxCols & c
eaf0: 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Mask)==0 ){.    
eb00: 20 20 20 20 45 78 70 72 20 2a 70 58 20 3d 20 70      Expr *pX = p
eb10: 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Term->pExpr;.   
eb20: 20 20 20 20 20 69 64 78 43 6f 6c 73 20 7c 3d 20       idxCols |= 
eb30: 63 4d 61 73 6b 3b 0a 20 20 20 20 20 20 20 20 70  cMask;.        p
eb40: 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d  Idx->aiColumn[n]
eb50: 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74   = pTerm->u.left
eb60: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20  Column;.        
eb70: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 42  pColl = sqlite3B
eb80: 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c  inaryCompareColl
eb90: 53 65 71 28 70 50 61 72 73 65 2c 20 70 58 2d 3e  Seq(pParse, pX->
eba0: 70 4c 65 66 74 2c 20 70 58 2d 3e 70 52 69 67 68  pLeft, pX->pRigh
ebb0: 74 29 3b 0a 20 20 20 20 20 20 20 20 70 49 64 78  t);.        pIdx
ebc0: 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 41 4c  ->azColl[n] = AL
ebd0: 57 41 59 53 28 70 43 6f 6c 6c 29 20 3f 20 70 43  WAYS(pColl) ? pC
ebe0: 6f 6c 6c 2d 3e 7a 4e 61 6d 65 20 3a 20 22 42 49  oll->zName : "BI
ebf0: 4e 41 52 59 22 3b 0a 20 20 20 20 20 20 20 20 6e  NARY";.        n
ec00: 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
ec10: 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  }.  }.  assert( 
ec20: 28 75 33 32 29 6e 3d 3d 70 4c 6f 6f 70 2d 3e 75  (u32)n==pLoop->u
ec30: 2e 62 74 72 65 65 2e 6e 45 71 20 29 3b 0a 0a 20  .btree.nEq );.. 
ec40: 20 2f 2a 20 41 64 64 20 61 64 64 69 74 69 6f 6e   /* Add addition
ec50: 61 6c 20 63 6f 6c 75 6d 6e 73 20 6e 65 65 64 65  al columns neede
ec60: 64 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 61 75  d to make the au
ec70: 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 69 6e  tomatic index in
ec80: 74 6f 0a 20 20 2a 2a 20 61 20 63 6f 76 65 72 69  to.  ** a coveri
ec90: 6e 67 20 69 6e 64 65 78 20 2a 2f 0a 20 20 66 6f  ng index */.  fo
eca0: 72 28 69 3d 30 3b 20 69 3c 6d 78 42 69 74 43 6f  r(i=0; i<mxBitCo
ecb0: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  l; i++){.    if(
ecc0: 20 65 78 74 72 61 43 6f 6c 73 20 26 20 4d 41 53   extraCols & MAS
ecd0: 4b 42 49 54 28 69 29 20 29 7b 0a 20 20 20 20 20  KBIT(i) ){.     
ece0: 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
ecf0: 6e 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20 70 49  n] = i;.      pI
ed00: 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20  dx->azColl[n] = 
ed10: 22 42 49 4e 41 52 59 22 3b 0a 20 20 20 20 20 20  "BINARY";.      
ed20: 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n++;.    }.  }. 
ed30: 20 69 66 28 20 70 53 72 63 2d 3e 63 6f 6c 55 73   if( pSrc->colUs
ed40: 65 64 20 26 20 4d 41 53 4b 42 49 54 28 42 4d 53  ed & MASKBIT(BMS
ed50: 2d 31 29 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  -1) ){.    for(i
ed60: 3d 42 4d 53 2d 31 3b 20 69 3c 70 54 61 62 6c 65  =BMS-1; i<pTable
ed70: 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  ->nCol; i++){.  
ed80: 20 20 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75      pIdx->aiColu
ed90: 6d 6e 5b 6e 5d 20 3d 20 69 3b 0a 20 20 20 20 20  mn[n] = i;.     
eda0: 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d   pIdx->azColl[n]
edb0: 20 3d 20 22 42 49 4e 41 52 59 22 3b 0a 20 20 20   = "BINARY";.   
edc0: 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20     n++;.    }.  
edd0: 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 6e  }.  assert( n==n
ede0: 4b 65 79 43 6f 6c 20 29 3b 0a 20 20 70 49 64 78  KeyCol );.  pIdx
edf0: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20  ->aiColumn[n] = 
ee00: 2d 31 3b 0a 20 20 70 49 64 78 2d 3e 61 7a 43 6f  -1;.  pIdx->azCo
ee10: 6c 6c 5b 6e 5d 20 3d 20 22 42 49 4e 41 52 59 22  ll[n] = "BINARY"
ee20: 3b 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 20 74  ;..  /* Create t
ee30: 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64  he automatic ind
ee40: 65 78 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ex */.  assert( 
ee50: 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3e  pLevel->iIdxCur>
ee60: 3d 30 20 29 3b 0a 20 20 70 4c 65 76 65 6c 2d 3e  =0 );.  pLevel->
ee70: 69 49 64 78 43 75 72 20 3d 20 70 50 61 72 73 65  iIdxCur = pParse
ee80: 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 73 71 6c 69  ->nTab++;.  sqli
ee90: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
eea0: 20 4f 50 5f 4f 70 65 6e 41 75 74 6f 69 6e 64 65   OP_OpenAutoinde
eeb0: 78 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43  x, pLevel->iIdxC
eec0: 75 72 2c 20 6e 4b 65 79 43 6f 6c 2b 31 29 3b 0a  ur, nKeyCol+1);.
eed0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
eee0: 50 34 4b 65 79 49 6e 66 6f 28 70 50 61 72 73 65  P4KeyInfo(pParse
eef0: 2c 20 70 49 64 78 29 3b 0a 20 20 56 64 62 65 43  , pIdx);.  VdbeC
ef00: 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 66 6f 72 20  omment((v, "for 
ef10: 25 73 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61  %s", pTable->zNa
ef20: 6d 65 29 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c  me));..  /* Fill
ef30: 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69   the automatic i
ef40: 6e 64 65 78 20 77 69 74 68 20 63 6f 6e 74 65 6e  ndex with conten
ef50: 74 20 2a 2f 0a 20 20 61 64 64 72 54 6f 70 20 3d  t */.  addrTop =
ef60: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
ef70: 70 31 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  p1(v, OP_Rewind,
ef80: 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72   pLevel->iTabCur
ef90: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
efa0: 76 29 3b 0a 20 20 72 65 67 52 65 63 6f 72 64 20  v);.  regRecord 
efb0: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
efc0: 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 73  Reg(pParse);.  s
efd0: 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65 49 6e  qlite3GenerateIn
efe0: 64 65 78 4b 65 79 28 70 50 61 72 73 65 2c 20 70  dexKey(pParse, p
eff0: 49 64 78 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61  Idx, pLevel->iTa
f000: 62 43 75 72 2c 20 72 65 67 52 65 63 6f 72 64 2c  bCur, regRecord,
f010: 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20   0, 0, 0, 0);.  
f020: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
f030: 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72  2(v, OP_IdxInser
f040: 74 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43  t, pLevel->iIdxC
f050: 75 72 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a  ur, regRecord);.
f060: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
f070: 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f  ngeP5(v, OPFLAG_
f080: 55 53 45 53 45 45 4b 52 45 53 55 4c 54 29 3b 0a  USESEEKRESULT);.
f090: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
f0a0: 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20  Op2(v, OP_Next, 
f0b0: 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 2c  pLevel->iTabCur,
f0c0: 20 61 64 64 72 54 6f 70 2b 31 29 3b 20 56 64 62   addrTop+1); Vdb
f0d0: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
f0e0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
f0f0: 65 50 35 28 76 2c 20 53 51 4c 49 54 45 5f 53 54  eP5(v, SQLITE_ST
f100: 4d 54 53 54 41 54 55 53 5f 41 55 54 4f 49 4e 44  MTSTATUS_AUTOIND
f110: 45 58 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  EX);.  sqlite3Vd
f120: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
f130: 64 72 54 6f 70 29 3b 0a 20 20 73 71 6c 69 74 65  drTop);.  sqlite
f140: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
f150: 70 50 61 72 73 65 2c 20 72 65 67 52 65 63 6f 72  pParse, regRecor
f160: 64 29 3b 0a 20 20 0a 20 20 2f 2a 20 4a 75 6d 70  d);.  .  /* Jump
f170: 20 68 65 72 65 20 77 68 65 6e 20 73 6b 69 70 70   here when skipp
f180: 69 6e 67 20 74 68 65 20 69 6e 69 74 69 61 6c 69  ing the initiali
f190: 7a 61 74 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69  zation */.  sqli
f1a0: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
f1b0: 76 2c 20 61 64 64 72 49 6e 69 74 29 3b 0a 7d 0a  v, addrInit);.}.
f1c0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
f1d0: 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f  _OMIT_AUTOMATIC_
f1e0: 49 4e 44 45 58 20 2a 2f 0a 0a 23 69 66 6e 64 65  INDEX */..#ifnde
f1f0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
f200: 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a  RTUALTABLE./*.**
f210: 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 70 6f   Allocate and po
f220: 70 75 6c 61 74 65 20 61 6e 20 73 71 6c 69 74 65  pulate an sqlite
f230: 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72  3_index_info str
f240: 75 63 74 75 72 65 2e 20 49 74 20 69 73 20 74 68  ucture. It is th
f250: 65 20 0a 2a 2a 20 72 65 73 70 6f 6e 73 69 62 69  e .** responsibi
f260: 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c  lity of the call
f270: 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79  er to eventually
f280: 20 72 65 6c 65 61 73 65 20 74 68 65 20 73 74 72   release the str
f290: 75 63 74 75 72 65 0a 2a 2a 20 62 79 20 70 61 73  ucture.** by pas
f2a0: 73 69 6e 67 20 74 68 65 20 70 6f 69 6e 74 65 72  sing the pointer
f2b0: 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 69   returned by thi
f2c0: 73 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 73 71  s function to sq
f2d0: 6c 69 74 65 33 5f 66 72 65 65 28 29 2e 0a 2a 2f  lite3_free()..*/
f2e0: 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f  .static sqlite3_
f2f0: 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 61 6c 6c 6f  index_info *allo
f300: 63 61 74 65 49 6e 64 65 78 49 6e 66 6f 28 0a 20  cateIndexInfo(. 
f310: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 0a   Parse *pParse,.
f320: 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
f330: 57 43 2c 0a 20 20 73 74 72 75 63 74 20 53 72 63  WC,.  struct Src
f340: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c  List_item *pSrc,
f350: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72  .  ExprList *pOr
f360: 64 65 72 42 79 0a 29 7b 0a 20 20 69 6e 74 20 69  derBy.){.  int i
f370: 2c 20 6a 3b 0a 20 20 69 6e 74 20 6e 54 65 72 6d  , j;.  int nTerm
f380: 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69 74  ;.  struct sqlit
f390: 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61  e3_index_constra
f3a0: 69 6e 74 20 2a 70 49 64 78 43 6f 6e 73 3b 0a 20  int *pIdxCons;. 
f3b0: 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f   struct sqlite3_
f3c0: 69 6e 64 65 78 5f 6f 72 64 65 72 62 79 20 2a 70  index_orderby *p
f3d0: 49 64 78 4f 72 64 65 72 42 79 3b 0a 20 20 73 74  IdxOrderBy;.  st
f3e0: 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
f3f0: 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73  ex_constraint_us
f400: 61 67 65 20 2a 70 55 73 61 67 65 3b 0a 20 20 57  age *pUsage;.  W
f410: 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b  hereTerm *pTerm;
f420: 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72 42 79 3b  .  int nOrderBy;
f430: 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  .  sqlite3_index
f440: 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e 66 6f 3b  _info *pIdxInfo;
f450: 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 74 68 65  ..  /* Count the
f460: 20 6e 75 6d 62 65 72 20 6f 66 20 70 6f 73 73 69   number of possi
f470: 62 6c 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  ble WHERE clause
f480: 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 72 65 66   constraints ref
f490: 65 72 72 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 74  erring.  ** to t
f4a0: 68 69 73 20 76 69 72 74 75 61 6c 20 74 61 62 6c  his virtual tabl
f4b0: 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6e 54 65  e */.  for(i=nTe
f4c0: 72 6d 3d 30 2c 20 70 54 65 72 6d 3d 70 57 43 2d  rm=0, pTerm=pWC-
f4d0: 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72 6d  >a; i<pWC->nTerm
f4e0: 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b  ; i++, pTerm++){
f4f0: 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e  .    if( pTerm->
f500: 6c 65 66 74 43 75 72 73 6f 72 20 21 3d 20 70 53  leftCursor != pS
f510: 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 20 63 6f  rc->iCursor ) co
f520: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65  ntinue;.    asse
f530: 72 74 28 20 49 73 50 6f 77 65 72 4f 66 54 77 6f  rt( IsPowerOfTwo
f540: 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  (pTerm->eOperato
f550: 72 20 26 20 7e 57 4f 5f 45 51 55 49 56 29 20 29  r & ~WO_EQUIV) )
f560: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
f570: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
f580: 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20   & WO_IN );.    
f590: 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
f5a0: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
f5b0: 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 74 65  ISNULL );.    te
f5c0: 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65  stcase( pTerm->e
f5d0: 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 41 4c  Operator & WO_AL
f5e0: 4c 20 29 3b 0a 20 20 20 20 69 66 28 20 28 70 54  L );.    if( (pT
f5f0: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
f600: 20 7e 28 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f   ~(WO_ISNULL|WO_
f610: 45 51 55 49 56 29 29 3d 3d 30 20 29 20 63 6f 6e  EQUIV))==0 ) con
f620: 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70  tinue;.    if( p
f630: 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
f640: 54 45 52 4d 5f 56 4e 55 4c 4c 20 29 20 63 6f 6e  TERM_VNULL ) con
f650: 74 69 6e 75 65 3b 0a 20 20 20 20 6e 54 65 72 6d  tinue;.    nTerm
f660: 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  ++;.  }..  /* If
f670: 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
f680: 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 6f 6e  ause contains on
f690: 6c 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  ly columns in th
f6a0: 65 20 63 75 72 72 65 6e 74 20 0a 20 20 2a 2a 20  e current .  ** 
f6b0: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 74 68  virtual table th
f6c0: 65 6e 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63  en allocate spac
f6d0: 65 20 66 6f 72 20 74 68 65 20 61 4f 72 64 65 72  e for the aOrder
f6e0: 42 79 20 70 61 72 74 20 6f 66 0a 20 20 2a 2a 20  By part of.  ** 
f6f0: 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  the sqlite3_inde
f700: 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65  x_info structure
f710: 2e 0a 20 20 2a 2f 0a 20 20 6e 4f 72 64 65 72 42  ..  */.  nOrderB
f720: 79 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 4f 72  y = 0;.  if( pOr
f730: 64 65 72 42 79 20 29 7b 0a 20 20 20 20 69 6e 74  derBy ){.    int
f740: 20 6e 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e   n = pOrderBy->n
f750: 45 78 70 72 3b 0a 20 20 20 20 66 6f 72 28 69 3d  Expr;.    for(i=
f760: 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20  0; i<n; i++){.  
f770: 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20      Expr *pExpr 
f780: 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  = pOrderBy->a[i]
f790: 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 69 66  .pExpr;.      if
f7a0: 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
f7b0: 43 4f 4c 55 4d 4e 20 7c 7c 20 70 45 78 70 72 2d  COLUMN || pExpr-
f7c0: 3e 69 54 61 62 6c 65 21 3d 70 53 72 63 2d 3e 69  >iTable!=pSrc->i
f7d0: 43 75 72 73 6f 72 20 29 20 62 72 65 61 6b 3b 0a  Cursor ) break;.
f7e0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3d      }.    if( i=
f7f0: 3d 6e 29 7b 0a 20 20 20 20 20 20 6e 4f 72 64 65  =n){.      nOrde
f800: 72 42 79 20 3d 20 6e 3b 0a 20 20 20 20 7d 0a 20  rBy = n;.    }. 
f810: 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74   }..  /* Allocat
f820: 65 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e  e the sqlite3_in
f830: 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75  dex_info structu
f840: 72 65 0a 20 20 2a 2f 0a 20 20 70 49 64 78 49 6e  re.  */.  pIdxIn
f850: 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  fo = sqlite3DbMa
f860: 6c 6c 6f 63 5a 65 72 6f 28 70 50 61 72 73 65 2d  llocZero(pParse-
f870: 3e 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 49 64  >db, sizeof(*pId
f880: 78 49 6e 66 6f 29 0a 20 20 20 20 20 20 20 20 20  xInfo).         
f890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f8a0: 20 20 2b 20 28 73 69 7a 65 6f 66 28 2a 70 49 64    + (sizeof(*pId
f8b0: 78 43 6f 6e 73 29 20 2b 20 73 69 7a 65 6f 66 28  xCons) + sizeof(
f8c0: 2a 70 55 73 61 67 65 29 29 2a 6e 54 65 72 6d 0a  *pUsage))*nTerm.
f8d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f8e0: 20 20 20 20 20 20 20 20 20 20 20 2b 20 73 69 7a             + siz
f8f0: 65 6f 66 28 2a 70 49 64 78 4f 72 64 65 72 42 79  eof(*pIdxOrderBy
f900: 29 2a 6e 4f 72 64 65 72 42 79 20 29 3b 0a 20 20  )*nOrderBy );.  
f910: 69 66 28 20 70 49 64 78 49 6e 66 6f 3d 3d 30 20  if( pIdxInfo==0 
f920: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
f930: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
f940: 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 22 29 3b  out of memory");
f950: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
f960: 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c   }..  /* Initial
f970: 69 7a 65 20 74 68 65 20 73 74 72 75 63 74 75 72  ize the structur
f980: 65 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33 5f  e.  The sqlite3_
f990: 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63  index_info struc
f9a0: 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 0a 20 20  ture contains.  
f9b0: 2a 2a 20 6d 61 6e 79 20 66 69 65 6c 64 73 20 74  ** many fields t
f9c0: 68 61 74 20 61 72 65 20 64 65 63 6c 61 72 65 64  hat are declared
f9d0: 20 22 63 6f 6e 73 74 22 20 74 6f 20 70 72 65 76   "const" to prev
f9e0: 65 6e 74 20 78 42 65 73 74 49 6e 64 65 78 20 66  ent xBestIndex f
f9f0: 72 6f 6d 0a 20 20 2a 2a 20 63 68 61 6e 67 69 6e  rom.  ** changin
fa00: 67 20 74 68 65 6d 2e 20 20 57 65 20 68 61 76 65  g them.  We have
fa10: 20 74 6f 20 64 6f 20 73 6f 6d 65 20 66 75 6e 6b   to do some funk
fa20: 79 20 63 61 73 74 69 6e 67 20 69 6e 20 6f 72 64  y casting in ord
fa30: 65 72 20 74 6f 0a 20 20 2a 2a 20 69 6e 69 74 69  er to.  ** initi
fa40: 61 6c 69 7a 65 20 74 68 6f 73 65 20 66 69 65 6c  alize those fiel
fa50: 64 73 2e 0a 20 20 2a 2f 0a 20 20 70 49 64 78 43  ds..  */.  pIdxC
fa60: 6f 6e 73 20 3d 20 28 73 74 72 75 63 74 20 73 71  ons = (struct sq
fa70: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
fa80: 74 72 61 69 6e 74 2a 29 26 70 49 64 78 49 6e 66  traint*)&pIdxInf
fa90: 6f 5b 31 5d 3b 0a 20 20 70 49 64 78 4f 72 64 65  o[1];.  pIdxOrde
faa0: 72 42 79 20 3d 20 28 73 74 72 75 63 74 20 73 71  rBy = (struct sq
fab0: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65  lite3_index_orde
fac0: 72 62 79 2a 29 26 70 49 64 78 43 6f 6e 73 5b 6e  rby*)&pIdxCons[n
fad0: 54 65 72 6d 5d 3b 0a 20 20 70 55 73 61 67 65 20  Term];.  pUsage 
fae0: 3d 20 28 73 74 72 75 63 74 20 73 71 6c 69 74 65  = (struct sqlite
faf0: 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69  3_index_constrai
fb00: 6e 74 5f 75 73 61 67 65 2a 29 26 70 49 64 78 4f  nt_usage*)&pIdxO
fb10: 72 64 65 72 42 79 5b 6e 4f 72 64 65 72 42 79 5d  rderBy[nOrderBy]
fb20: 3b 0a 20 20 2a 28 69 6e 74 2a 29 26 70 49 64 78  ;.  *(int*)&pIdx
fb30: 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e  Info->nConstrain
fb40: 74 20 3d 20 6e 54 65 72 6d 3b 0a 20 20 2a 28 69  t = nTerm;.  *(i
fb50: 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 6e  nt*)&pIdxInfo->n
fb60: 4f 72 64 65 72 42 79 20 3d 20 6e 4f 72 64 65 72  OrderBy = nOrder
fb70: 42 79 3b 0a 20 20 2a 28 73 74 72 75 63 74 20 73  By;.  *(struct s
fb80: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e  qlite3_index_con
fb90: 73 74 72 61 69 6e 74 2a 2a 29 26 70 49 64 78 49  straint**)&pIdxI
fba0: 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74  nfo->aConstraint
fbb0: 20 3d 20 70 49 64 78 43 6f 6e 73 3b 0a 20 20 2a   = pIdxCons;.  *
fbc0: 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f  (struct sqlite3_
fbd0: 69 6e 64 65 78 5f 6f 72 64 65 72 62 79 2a 2a 29  index_orderby**)
fbe0: 26 70 49 64 78 49 6e 66 6f 2d 3e 61 4f 72 64 65  &pIdxInfo->aOrde
fbf0: 72 42 79 20 3d 20 70 49 64 78 4f 72 64 65 72 42  rBy = pIdxOrderB
fc00: 79 3b 0a 20 20 2a 28 73 74 72 75 63 74 20 73 71  y;.  *(struct sq
fc10: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
fc20: 74 72 61 69 6e 74 5f 75 73 61 67 65 2a 2a 29 26  traint_usage**)&
fc30: 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74  pIdxInfo->aConst
fc40: 72 61 69 6e 74 55 73 61 67 65 20 3d 0a 20 20 20  raintUsage =.   
fc50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc90: 70 55 73 61 67 65 3b 0a 0a 20 20 66 6f 72 28 69  pUsage;..  for(i
fca0: 3d 6a 3d 30 2c 20 70 54 65 72 6d 3d 70 57 43 2d  =j=0, pTerm=pWC-
fcb0: 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72 6d  >a; i<pWC->nTerm
fcc0: 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b  ; i++, pTerm++){
fcd0: 0a 20 20 20 20 75 38 20 6f 70 3b 0a 20 20 20 20  .    u8 op;.    
fce0: 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43  if( pTerm->leftC
fcf0: 75 72 73 6f 72 20 21 3d 20 70 53 72 63 2d 3e 69  ursor != pSrc->i
fd00: 43 75 72 73 6f 72 20 29 20 63 6f 6e 74 69 6e 75  Cursor ) continu
fd10: 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 49  e;.    assert( I
fd20: 73 50 6f 77 65 72 4f 66 54 77 6f 28 70 54 65 72  sPowerOfTwo(pTer
fd30: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 7e  m->eOperator & ~
fd40: 57 4f 5f 45 51 55 49 56 29 20 29 3b 0a 20 20 20  WO_EQUIV) );.   
fd50: 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
fd60: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
fd70: 5f 49 4e 20 29 3b 0a 20 20 20 20 74 65 73 74 63  _IN );.    testc
fd80: 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65  ase( pTerm->eOpe
fd90: 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 4e 55 4c  rator & WO_ISNUL
fda0: 4c 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  L );.    testcas
fdb0: 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  e( pTerm->eOpera
fdc0: 74 6f 72 20 26 20 57 4f 5f 41 4c 4c 20 29 3b 0a  tor & WO_ALL );.
fdd0: 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e      if( (pTerm->
fde0: 65 4f 70 65 72 61 74 6f 72 20 26 20 7e 28 57 4f  eOperator & ~(WO
fdf0: 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 45 51 55 49 56  _ISNULL|WO_EQUIV
fe00: 29 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  ))==0 ) continue
fe10: 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  ;.    if( pTerm-
fe20: 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
fe30: 56 4e 55 4c 4c 20 29 20 63 6f 6e 74 69 6e 75 65  VNULL ) continue
fe40: 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a  ;.    pIdxCons[j
fe50: 5d 2e 69 43 6f 6c 75 6d 6e 20 3d 20 70 54 65 72  ].iColumn = pTer
fe60: 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b  m->u.leftColumn;
fe70: 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d  .    pIdxCons[j]
fe80: 2e 69 54 65 72 6d 4f 66 66 73 65 74 20 3d 20 69  .iTermOffset = i
fe90: 3b 0a 20 20 20 20 6f 70 20 3d 20 28 75 38 29 70  ;.    op = (u8)p
fea0: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
feb0: 26 20 57 4f 5f 41 4c 4c 3b 0a 20 20 20 20 69 66  & WO_ALL;.    if
fec0: 28 20 6f 70 3d 3d 57 4f 5f 49 4e 20 29 20 6f 70  ( op==WO_IN ) op
fed0: 20 3d 20 57 4f 5f 45 51 3b 0a 20 20 20 20 70 49   = WO_EQ;.    pI
fee0: 64 78 43 6f 6e 73 5b 6a 5d 2e 6f 70 20 3d 20 6f  dxCons[j].op = o
fef0: 70 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20 64 69  p;.    /* The di
ff00: 72 65 63 74 20 61 73 73 69 67 6e 6d 65 6e 74 20  rect assignment 
ff10: 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  in the previous 
ff20: 6c 69 6e 65 20 69 73 20 70 6f 73 73 69 62 6c 65  line is possible
ff30: 20 6f 6e 6c 79 20 62 65 63 61 75 73 65 0a 20 20   only because.  
ff40: 20 20 2a 2a 20 74 68 65 20 57 4f 5f 20 61 6e 64    ** the WO_ and
ff50: 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f   SQLITE_INDEX_CO
ff60: 4e 53 54 52 41 49 4e 54 5f 20 63 6f 64 65 73 20  NSTRAINT_ codes 
ff70: 61 72 65 20 69 64 65 6e 74 69 63 61 6c 2e 20 20  are identical.  
ff80: 54 68 65 0a 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f  The.    ** follo
ff90: 77 69 6e 67 20 61 73 73 65 72 74 73 20 76 65 72  wing asserts ver
ffa0: 69 66 79 20 74 68 69 73 20 66 61 63 74 2e 20 2a  ify this fact. *
ffb0: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 57 4f  /.    assert( WO
ffc0: 5f 45 51 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45  _EQ==SQLITE_INDE
ffd0: 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 45 51 20  X_CONSTRAINT_EQ 
ffe0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 57  );.    assert( W
fff0: 4f 5f 4c 54 3d 3d 53 51 4c 49 54 45 5f 49 4e 44  O_LT==SQLITE_IND
10000 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4c 54  EX_CONSTRAINT_LT
10010 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
10020 57 4f 5f 4c 45 3d 3d 53 51 4c 49 54 45 5f 49 4e  WO_LE==SQLITE_IN
10030 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4c  DEX_CONSTRAINT_L
10040 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  E );.    assert(
10050 20 57 4f 5f 47 54 3d 3d 53 51 4c 49 54 45 5f 49   WO_GT==SQLITE_I
10060 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  NDEX_CONSTRAINT_
10070 47 54 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  GT );.    assert
10080 28 20 57 4f 5f 47 45 3d 3d 53 51 4c 49 54 45 5f  ( WO_GE==SQLITE_
10090 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54  INDEX_CONSTRAINT
100a0 5f 47 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72  _GE );.    asser
100b0 74 28 20 57 4f 5f 4d 41 54 43 48 3d 3d 53 51 4c  t( WO_MATCH==SQL
100c0 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52  ITE_INDEX_CONSTR
100d0 41 49 4e 54 5f 4d 41 54 43 48 20 29 3b 0a 20 20  AINT_MATCH );.  
100e0 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d    assert( pTerm-
100f0 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f  >eOperator & (WO
10100 5f 49 4e 7c 57 4f 5f 45 51 7c 57 4f 5f 4c 54 7c  _IN|WO_EQ|WO_LT|
10110 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c 57 4f 5f 47  WO_LE|WO_GT|WO_G
10120 45 7c 57 4f 5f 4d 41 54 43 48 29 20 29 3b 0a 20  E|WO_MATCH) );. 
10130 20 20 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20 66 6f     j++;.  }.  fo
10140 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42  r(i=0; i<nOrderB
10150 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70  y; i++){.    Exp
10160 72 20 2a 70 45 78 70 72 20 3d 20 70 4f 72 64 65  r *pExpr = pOrde
10170 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  rBy->a[i].pExpr;
10180 0a 20 20 20 20 70 49 64 78 4f 72 64 65 72 42 79  .    pIdxOrderBy
10190 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 20 3d 20 70 45  [i].iColumn = pE
101a0 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  xpr->iColumn;.  
101b0 20 20 70 49 64 78 4f 72 64 65 72 42 79 5b 69 5d    pIdxOrderBy[i]
101c0 2e 64 65 73 63 20 3d 20 70 4f 72 64 65 72 42 79  .desc = pOrderBy
101d0 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72  ->a[i].sortOrder
101e0 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
101f0 70 49 64 78 49 6e 66 6f 3b 0a 7d 0a 0a 2f 2a 0a  pIdxInfo;.}../*.
10200 2a 2a 20 54 68 65 20 74 61 62 6c 65 20 6f 62 6a  ** The table obj
10210 65 63 74 20 72 65 66 65 72 65 6e 63 65 20 70 61  ect reference pa
10220 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
10230 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  nd argument to t
10240 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  his function.** 
10250 6d 75 73 74 20 72 65 70 72 65 73 65 6e 74 20 61  must represent a
10260 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20   virtual table. 
10270 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 6e  This function in
10280 76 6f 6b 65 73 20 74 68 65 20 78 42 65 73 74 49  vokes the xBestI
10290 6e 64 65 78 28 29 0a 2a 2a 20 6d 65 74 68 6f 64  ndex().** method
102a0 20 6f 66 20 74 68 65 20 76 69 72 74 75 61 6c 20   of the virtual 
102b0 74 61 62 6c 65 20 77 69 74 68 20 74 68 65 20 73  table with the s
102c0 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
102d0 6f 20 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a 2a  o object that.**
102e0 20 63 6f 6d 65 73 20 69 6e 20 61 73 20 74 68 65   comes in as the
102f0 20 33 72 64 20 61 72 67 75 6d 65 6e 74 20 74 6f   3rd argument to
10300 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
10310 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
10320 72 20 6f 63 63 75 72 73 2c 20 70 50 61 72 73 65  r occurs, pParse
10330 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69   is populated wi
10340 74 68 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  th an error mess
10350 61 67 65 20 61 6e 64 20 61 0a 2a 2a 20 6e 6f 6e  age and a.** non
10360 2d 7a 65 72 6f 20 76 61 6c 75 65 20 69 73 20 72  -zero value is r
10370 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69  eturned. Otherwi
10380 73 65 2c 20 30 20 69 73 20 72 65 74 75 72 6e 65  se, 0 is returne
10390 64 20 61 6e 64 20 74 68 65 20 6f 75 74 70 75 74  d and the output
103a0 0a 2a 2a 20 70 61 72 74 20 6f 66 20 74 68 65 20  .** part of the 
103b0 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
103c0 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20  fo structure is 
103d0 6c 65 66 74 20 70 6f 70 75 6c 61 74 65 64 2e 0a  left populated..
103e0 2a 2a 0a 2a 2a 20 57 68 65 74 68 65 72 20 6f 72  **.** Whether or
103f0 20 6e 6f 74 20 61 6e 20 65 72 72 6f 72 20 69 73   not an error is
10400 20 72 65 74 75 72 6e 65 64 2c 20 69 74 20 69 73   returned, it is
10410 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c   the responsibil
10420 69 74 79 20 6f 66 20 74 68 65 0a 2a 2a 20 63 61  ity of the.** ca
10430 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c  ller to eventual
10440 6c 79 20 66 72 65 65 20 70 2d 3e 69 64 78 53 74  ly free p->idxSt
10450 72 20 69 66 20 70 2d 3e 6e 65 65 64 54 6f 46 72  r if p->needToFr
10460 65 65 49 64 78 53 74 72 20 69 6e 64 69 63 61 74  eeIdxStr indicat
10470 65 73 0a 2a 2a 20 74 68 61 74 20 74 68 69 73 20  es.** that this 
10480 69 73 20 72 65 71 75 69 72 65 64 2e 0a 2a 2f 0a  is required..*/.
10490 73 74 61 74 69 63 20 69 6e 74 20 76 74 61 62 42  static int vtabB
104a0 65 73 74 49 6e 64 65 78 28 50 61 72 73 65 20 2a  estIndex(Parse *
104b0 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70  pParse, Table *p
104c0 54 61 62 2c 20 73 71 6c 69 74 65 33 5f 69 6e 64  Tab, sqlite3_ind
104d0 65 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 73  ex_info *p){.  s
104e0 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74  qlite3_vtab *pVt
104f0 61 62 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  ab = sqlite3GetV
10500 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e 64 62  Table(pParse->db
10510 2c 20 70 54 61 62 29 2d 3e 70 56 74 61 62 3b 0a  , pTab)->pVtab;.
10520 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72    int i;.  int r
10530 63 3b 0a 0a 20 20 54 52 41 43 45 5f 49 44 58 5f  c;..  TRACE_IDX_
10540 49 4e 50 55 54 53 28 70 29 3b 0a 20 20 72 63 20  INPUTS(p);.  rc 
10550 3d 20 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65  = pVtab->pModule
10560 2d 3e 78 42 65 73 74 49 6e 64 65 78 28 70 56 74  ->xBestIndex(pVt
10570 61 62 2c 20 70 29 3b 0a 20 20 54 52 41 43 45 5f  ab, p);.  TRACE_
10580 49 44 58 5f 4f 55 54 50 55 54 53 28 70 29 3b 0a  IDX_OUTPUTS(p);.
10590 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
105a0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
105b0 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
105c0 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65   ){.      pParse
105d0 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
105e0 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73  ed = 1;.    }els
105f0 65 20 69 66 28 20 21 70 56 74 61 62 2d 3e 7a 45  e if( !pVtab->zE
10600 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 20 20 73  rrMsg ){.      s
10610 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
10620 50 61 72 73 65 2c 20 22 25 73 22 2c 20 73 71 6c  Parse, "%s", sql
10630 69 74 65 33 45 72 72 53 74 72 28 72 63 29 29 3b  ite3ErrStr(rc));
10640 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
10650 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
10660 67 28 70 50 61 72 73 65 2c 20 22 25 73 22 2c 20  g(pParse, "%s", 
10670 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b  pVtab->zErrMsg);
10680 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
10690 69 74 65 33 5f 66 72 65 65 28 70 56 74 61 62 2d  ite3_free(pVtab-
106a0 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70 56 74  >zErrMsg);.  pVt
106b0 61 62 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b  ab->zErrMsg = 0;
106c0 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ..  for(i=0; i<p
106d0 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69  ->nConstraint; i
106e0 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 21 70 2d  ++){.    if( !p-
106f0 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e  >aConstraint[i].
10700 75 73 61 62 6c 65 20 26 26 20 70 2d 3e 61 43 6f  usable && p->aCo
10710 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69 5d  nstraintUsage[i]
10720 2e 61 72 67 76 49 6e 64 65 78 3e 30 20 29 7b 0a  .argvIndex>0 ){.
10730 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
10740 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20  orMsg(pParse, . 
10750 20 20 20 20 20 20 20 20 20 22 74 61 62 6c 65 20           "table 
10760 25 73 3a 20 78 42 65 73 74 49 6e 64 65 78 20 72  %s: xBestIndex r
10770 65 74 75 72 6e 65 64 20 61 6e 20 69 6e 76 61 6c  eturned an inval
10780 69 64 20 70 6c 61 6e 22 2c 20 70 54 61 62 2d 3e  id plan", pTab->
10790 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20  zName);.    }.  
107a0 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 50 61 72  }..  return pPar
107b0 73 65 2d 3e 6e 45 72 72 3b 0a 7d 0a 23 65 6e 64  se->nErr;.}.#end
107c0 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53  if /* !defined(S
107d0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
107e0 41 4c 54 41 42 4c 45 29 20 2a 2f 0a 0a 0a 23 69  ALTABLE) */...#i
107f0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
10800 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54  LE_STAT3_OR_STAT
10810 34 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65  4./*.** Estimate
10820 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66   the location of
10830 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 6b 65   a particular ke
10840 79 20 61 6d 6f 6e 67 20 61 6c 6c 20 6b 65 79 73  y among all keys
10850 20 69 6e 20 61 6e 0a 2a 2a 20 69 6e 64 65 78 2e   in an.** index.
10860 20 20 53 74 6f 72 65 20 74 68 65 20 72 65 73 75    Store the resu
10870 6c 74 73 20 69 6e 20 61 53 74 61 74 20 61 73 20  lts in aStat as 
10880 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
10890 20 20 61 53 74 61 74 5b 30 5d 20 20 20 20 20 20    aStat[0]      
108a0 45 73 74 2e 20 6e 75 6d 62 65 72 20 6f 66 20 72  Est. number of r
108b0 6f 77 73 20 6c 65 73 73 20 74 68 61 6e 20 70 56  ows less than pV
108c0 61 6c 0a 2a 2a 20 20 20 20 61 53 74 61 74 5b 31  al.**    aStat[1
108d0 5d 20 20 20 20 20 20 45 73 74 2e 20 6e 75 6d 62  ]      Est. numb
108e0 65 72 20 6f 66 20 72 6f 77 73 20 65 71 75 61 6c  er of rows equal
108f0 20 74 6f 20 70 56 61 6c 0a 2a 2a 0a 2a 2a 20 52   to pVal.**.** R
10900 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
10910 6f 6e 20 73 75 63 63 65 73 73 2e 0a 2a 2f 0a 73  on success..*/.s
10920 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65  tatic void where
10930 4b 65 79 53 74 61 74 73 28 0a 20 20 50 61 72 73  KeyStats(.  Pars
10940 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
10950 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
10960 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
10970 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 2c  /.  Index *pIdx,
10980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10990 2f 2a 20 49 6e 64 65 78 20 74 6f 20 63 6f 6e 73  /* Index to cons
109a0 69 64 65 72 20 64 6f 6d 61 69 6e 20 6f 66 20 2a  ider domain of *
109b0 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  /.  UnpackedReco
109c0 72 64 20 2a 70 52 65 63 2c 20 20 20 20 20 20 20  rd *pRec,       
109d0 2f 2a 20 56 65 63 74 6f 72 20 6f 66 20 76 61 6c  /* Vector of val
109e0 75 65 73 20 74 6f 20 63 6f 6e 73 69 64 65 72 20  ues to consider 
109f0 2a 2f 0a 20 20 69 6e 74 20 72 6f 75 6e 64 55 70  */.  int roundUp
10a00 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
10a10 20 2f 2a 20 52 6f 75 6e 64 20 75 70 20 69 66 20   /* Round up if 
10a20 74 72 75 65 2e 20 20 52 6f 75 6e 64 20 64 6f 77  true.  Round dow
10a30 6e 20 69 66 20 66 61 6c 73 65 20 2a 2f 0a 20 20  n if false */.  
10a40 74 52 6f 77 63 6e 74 20 2a 61 53 74 61 74 20 20  tRowcnt *aStat  
10a50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
10a60 55 54 3a 20 73 74 61 74 73 20 77 72 69 74 74 65  UT: stats writte
10a70 6e 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 49  n here */.){.  I
10a80 6e 64 65 78 53 61 6d 70 6c 65 20 2a 61 53 61 6d  ndexSample *aSam
10a90 70 6c 65 20 3d 20 70 49 64 78 2d 3e 61 53 61 6d  ple = pIdx->aSam
10aa0 70 6c 65 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 3b  ple;.  int iCol;
10ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ac0 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 72     /* Index of r
10ad0 65 71 75 69 72 65 64 20 73 74 61 74 73 20 69 6e  equired stats in
10ae0 20 61 6e 45 71 5b 5d 20 65 74 63 2e 20 2a 2f 0a   anEq[] etc. */.
10af0 20 20 69 6e 74 20 69 4d 69 6e 20 3d 20 30 3b 20    int iMin = 0; 
10b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10b10 20 53 6d 61 6c 6c 65 73 74 20 73 61 6d 70 6c 65   Smallest sample
10b20 20 6e 6f 74 20 79 65 74 20 74 65 73 74 65 64 20   not yet tested 
10b30 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20 70 49 64  */.  int i = pId
10b40 78 2d 3e 6e 53 61 6d 70 6c 65 3b 20 20 20 20 20  x->nSample;     
10b50 20 2f 2a 20 53 6d 61 6c 6c 65 73 74 20 73 61 6d   /* Smallest sam
10b60 70 6c 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20  ple larger than 
10b70 6f 72 20 65 71 75 61 6c 20 74 6f 20 70 52 65 63  or equal to pRec
10b80 20 2a 2f 0a 20 20 69 6e 74 20 69 54 65 73 74 3b   */.  int iTest;
10b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ba0 20 20 2f 2a 20 4e 65 78 74 20 73 61 6d 70 6c 65    /* Next sample
10bb0 20 74 6f 20 74 65 73 74 20 2a 2f 0a 20 20 69 6e   to test */.  in
10bc0 74 20 72 65 73 3b 20 20 20 20 20 20 20 20 20 20  t res;          
10bd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
10be0 75 6c 74 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f  ult of compariso
10bf0 6e 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 0a  n operation */..
10c00 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44  #ifndef SQLITE_D
10c10 45 42 55 47 0a 20 20 55 4e 55 53 45 44 5f 50 41  EBUG.  UNUSED_PA
10c20 52 41 4d 45 54 45 52 28 20 70 50 61 72 73 65 20  RAMETER( pParse 
10c30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65  );.#endif.  asse
10c40 72 74 28 20 70 52 65 63 21 3d 30 20 29 3b 0a 20  rt( pRec!=0 );. 
10c50 20 69 43 6f 6c 20 3d 20 70 52 65 63 2d 3e 6e 46   iCol = pRec->nF
10c60 69 65 6c 64 20 2d 20 31 3b 0a 20 20 61 73 73 65  ield - 1;.  asse
10c70 72 74 28 20 70 49 64 78 2d 3e 6e 53 61 6d 70 6c  rt( pIdx->nSampl
10c80 65 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  e>0 );.  assert(
10c90 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 3e 30 20   pRec->nField>0 
10ca0 26 26 20 69 43 6f 6c 3c 70 49 64 78 2d 3e 6e 53  && iCol<pIdx->nS
10cb0 61 6d 70 6c 65 43 6f 6c 20 29 3b 0a 20 20 64 6f  ampleCol );.  do
10cc0 7b 0a 20 20 20 20 69 54 65 73 74 20 3d 20 28 69  {.    iTest = (i
10cd0 4d 69 6e 2b 69 29 2f 32 3b 0a 20 20 20 20 72 65  Min+i)/2;.    re
10ce0 73 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52  s = sqlite3VdbeR
10cf0 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 61 53 61  ecordCompare(aSa
10d00 6d 70 6c 65 5b 69 54 65 73 74 5d 2e 6e 2c 20 61  mple[iTest].n, a
10d10 53 61 6d 70 6c 65 5b 69 54 65 73 74 5d 2e 70 2c  Sample[iTest].p,
10d20 20 70 52 65 63 29 3b 0a 20 20 20 20 69 66 28 20   pRec);.    if( 
10d30 72 65 73 3c 30 20 29 7b 0a 20 20 20 20 20 20 69  res<0 ){.      i
10d40 4d 69 6e 20 3d 20 69 54 65 73 74 2b 31 3b 0a 20  Min = iTest+1;. 
10d50 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
10d60 69 20 3d 20 69 54 65 73 74 3b 0a 20 20 20 20 7d  i = iTest;.    }
10d70 0a 20 20 7d 77 68 69 6c 65 28 20 72 65 73 20 26  .  }while( res &
10d80 26 20 69 4d 69 6e 3c 69 20 29 3b 0a 0a 23 69 66  & iMin<i );..#if
10d90 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
10da0 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  .  /* The follow
10db0 69 6e 67 20 61 73 73 65 72 74 20 73 74 61 74 65  ing assert state
10dc0 6d 65 6e 74 73 20 63 68 65 63 6b 20 74 68 61 74  ments check that
10dd0 20 74 68 65 20 62 69 6e 61 72 79 20 73 65 61 72   the binary sear
10de0 63 68 20 63 6f 64 65 0a 20 20 2a 2a 20 61 62 6f  ch code.  ** abo
10df0 76 65 20 66 6f 75 6e 64 20 74 68 65 20 72 69 67  ve found the rig
10e00 68 74 20 61 6e 73 77 65 72 2e 20 54 68 69 73 20  ht answer. This 
10e10 62 6c 6f 63 6b 20 73 65 72 76 65 73 20 6e 6f 20  block serves no 
10e20 70 75 72 70 6f 73 65 20 6f 74 68 65 72 0a 20 20  purpose other.  
10e30 2a 2a 20 74 68 61 6e 20 74 6f 20 69 6e 76 6f 6b  ** than to invok
10e40 65 20 74 68 65 20 61 73 73 65 72 74 73 2e 20 20  e the asserts.  
10e50 2a 2f 0a 20 20 69 66 28 20 72 65 73 3d 3d 30 20  */.  if( res==0 
10e60 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 28 72 65  ){.    /* If (re
10e70 73 3d 3d 30 29 20 69 73 20 74 72 75 65 2c 20 74  s==0) is true, t
10e80 68 65 6e 20 73 61 6d 70 6c 65 20 24 69 20 6d 75  hen sample $i mu
10e90 73 74 20 62 65 20 65 71 75 61 6c 20 74 6f 20 70  st be equal to p
10ea0 52 65 63 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  Rec */.    asser
10eb0 74 28 20 69 3c 70 49 64 78 2d 3e 6e 53 61 6d 70  t( i<pIdx->nSamp
10ec0 6c 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  le );.    assert
10ed0 28 20 30 3d 3d 73 71 6c 69 74 65 33 56 64 62 65  ( 0==sqlite3Vdbe
10ee0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 61 53  RecordCompare(aS
10ef0 61 6d 70 6c 65 5b 69 5d 2e 6e 2c 20 61 53 61 6d  ample[i].n, aSam
10f00 70 6c 65 5b 69 5d 2e 70 2c 20 70 52 65 63 29 0a  ple[i].p, pRec).
10f10 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61 72           || pPar
10f20 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
10f30 69 6c 65 64 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  iled );.  }else{
10f40 0a 20 20 20 20 2f 2a 20 4f 74 68 65 72 77 69 73  .    /* Otherwis
10f50 65 2c 20 70 52 65 63 20 6d 75 73 74 20 62 65 20  e, pRec must be 
10f60 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 73 61 6d  smaller than sam
10f70 70 6c 65 20 24 69 20 61 6e 64 20 6c 61 72 67 65  ple $i and large
10f80 72 20 74 68 61 6e 0a 20 20 20 20 2a 2a 20 73 61  r than.    ** sa
10f90 6d 70 6c 65 20 28 24 69 2d 31 29 2e 20 20 2a 2f  mple ($i-1).  */
10fa0 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 3d 3d  .    assert( i==
10fb0 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 0a 20  pIdx->nSample . 
10fc0 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74          || sqlit
10fd0 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
10fe0 61 72 65 28 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e  are(aSample[i].n
10ff0 2c 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 70 2c 20  , aSample[i].p, 
11000 70 52 65 63 29 3e 30 0a 20 20 20 20 20 20 20 20  pRec)>0.        
11010 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e   || pParse->db->
11020 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
11030 20 20 20 20 61 73 73 65 72 74 28 20 69 3d 3d 30      assert( i==0
11040 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c  .         || sql
11050 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
11060 6d 70 61 72 65 28 61 53 61 6d 70 6c 65 5b 69 2d  mpare(aSample[i-
11070 31 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b 69 2d  1].n, aSample[i-
11080 31 5d 2e 70 2c 20 70 52 65 63 29 3c 30 0a 20 20  1].p, pRec)<0.  
11090 20 20 20 20 20 20 20 7c 7c 20 70 50 61 72 73 65         || pParse
110a0 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
110b0 65 64 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  ed );.  }.#endif
110c0 20 2f 2a 20 69 66 64 65 66 20 53 51 4c 49 54 45   /* ifdef SQLITE
110d0 5f 44 45 42 55 47 20 2a 2f 0a 0a 20 20 2f 2a 20  _DEBUG */..  /* 
110e0 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 61  At this point, a
110f0 53 61 6d 70 6c 65 5b 69 5d 20 69 73 20 74 68 65  Sample[i] is the
11100 20 66 69 72 73 74 20 73 61 6d 70 6c 65 20 74 68   first sample th
11110 61 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68  at is greater th
11120 61 6e 0a 20 20 2a 2a 20 6f 72 20 65 71 75 61 6c  an.  ** or equal
11130 20 74 6f 20 70 56 61 6c 2e 20 20 4f 72 20 69 66   to pVal.  Or if
11140 20 69 3d 3d 70 49 64 78 2d 3e 6e 53 61 6d 70 6c   i==pIdx->nSampl
11150 65 2c 20 74 68 65 6e 20 61 6c 6c 20 73 61 6d 70  e, then all samp
11160 6c 65 73 20 61 72 65 20 6c 65 73 73 0a 20 20 2a  les are less.  *
11170 2a 20 74 68 61 6e 20 70 56 61 6c 2e 20 20 49 66  * than pVal.  If
11180 20 61 53 61 6d 70 6c 65 5b 69 5d 3d 3d 70 56 61   aSample[i]==pVa
11190 6c 2c 20 74 68 65 6e 20 72 65 73 3d 3d 30 2e 0a  l, then res==0..
111a0 20 20 2a 2f 0a 20 20 69 66 28 20 72 65 73 3d 3d    */.  if( res==
111b0 30 20 29 7b 0a 20 20 20 20 61 53 74 61 74 5b 30  0 ){.    aStat[0
111c0 5d 20 3d 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 61  ] = aSample[i].a
111d0 6e 4c 74 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 61  nLt[iCol];.    a
111e0 53 74 61 74 5b 31 5d 20 3d 20 61 53 61 6d 70 6c  Stat[1] = aSampl
111f0 65 5b 69 5d 2e 61 6e 45 71 5b 69 43 6f 6c 5d 3b  e[i].anEq[iCol];
11200 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 74 52  .  }else{.    tR
11210 6f 77 63 6e 74 20 69 4c 6f 77 65 72 2c 20 69 55  owcnt iLower, iU
11220 70 70 65 72 2c 20 69 47 61 70 3b 0a 20 20 20 20  pper, iGap;.    
11230 69 66 28 20 69 3d 3d 30 20 29 7b 0a 20 20 20 20  if( i==0 ){.    
11240 20 20 69 4c 6f 77 65 72 20 3d 20 30 3b 0a 20 20    iLower = 0;.  
11250 20 20 20 20 69 55 70 70 65 72 20 3d 20 61 53 61      iUpper = aSa
11260 6d 70 6c 65 5b 30 5d 2e 61 6e 4c 74 5b 69 43 6f  mple[0].anLt[iCo
11270 6c 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  l];.    }else{. 
11280 20 20 20 20 20 69 36 34 20 6e 52 6f 77 30 20 3d       i64 nRow0 =
11290 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 54 6f   sqlite3LogEstTo
112a0 49 6e 74 28 70 49 64 78 2d 3e 61 69 52 6f 77 4c  Int(pIdx->aiRowL
112b0 6f 67 45 73 74 5b 30 5d 29 3b 0a 20 20 20 20 20  ogEst[0]);.     
112c0 20 69 55 70 70 65 72 20 3d 20 69 3e 3d 70 49 64   iUpper = i>=pId
112d0 78 2d 3e 6e 53 61 6d 70 6c 65 20 3f 20 6e 52 6f  x->nSample ? nRo
112e0 77 30 20 3a 20 61 53 61 6d 70 6c 65 5b 69 5d 2e  w0 : aSample[i].
112f0 61 6e 4c 74 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20  anLt[iCol];.    
11300 20 20 69 4c 6f 77 65 72 20 3d 20 61 53 61 6d 70    iLower = aSamp
11310 6c 65 5b 69 2d 31 5d 2e 61 6e 45 71 5b 69 43 6f  le[i-1].anEq[iCo
11320 6c 5d 20 2b 20 61 53 61 6d 70 6c 65 5b 69 2d 31  l] + aSample[i-1
11330 5d 2e 61 6e 4c 74 5b 69 43 6f 6c 5d 3b 0a 20 20  ].anLt[iCol];.  
11340 20 20 7d 0a 20 20 20 20 61 53 74 61 74 5b 31 5d    }.    aStat[1]
11350 20 3d 20 70 49 64 78 2d 3e 61 41 76 67 45 71 5b   = pIdx->aAvgEq[
11360 69 43 6f 6c 5d 3b 0a 20 20 20 20 69 66 28 20 69  iCol];.    if( i
11370 4c 6f 77 65 72 3e 3d 69 55 70 70 65 72 20 29 7b  Lower>=iUpper ){
11380 0a 20 20 20 20 20 20 69 47 61 70 20 3d 20 30 3b  .      iGap = 0;
11390 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
113a0 20 20 69 47 61 70 20 3d 20 69 55 70 70 65 72 20    iGap = iUpper 
113b0 2d 20 69 4c 6f 77 65 72 3b 0a 20 20 20 20 7d 0a  - iLower;.    }.
113c0 20 20 20 20 69 66 28 20 72 6f 75 6e 64 55 70 20      if( roundUp 
113d0 29 7b 0a 20 20 20 20 20 20 69 47 61 70 20 3d 20  ){.      iGap = 
113e0 28 69 47 61 70 2a 32 29 2f 33 3b 0a 20 20 20 20  (iGap*2)/3;.    
113f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 47 61  }else{.      iGa
11400 70 20 3d 20 69 47 61 70 2f 33 3b 0a 20 20 20 20  p = iGap/3;.    
11410 7d 0a 20 20 20 20 61 53 74 61 74 5b 30 5d 20 3d  }.    aStat[0] =
11420 20 69 4c 6f 77 65 72 20 2b 20 69 47 61 70 3b 0a   iLower + iGap;.
11430 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20    }.}.#endif /* 
11440 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
11450 41 54 33 5f 4f 52 5f 53 54 41 54 34 20 2a 2f 0a  AT3_OR_STAT4 */.
11460 0a 2f 2a 0a 2a 2a 20 49 66 20 69 74 20 69 73 20  ./*.** If it is 
11470 6e 6f 74 20 4e 55 4c 4c 2c 20 70 54 65 72 6d 20  not NULL, pTerm 
11480 69 73 20 61 20 74 65 72 6d 20 74 68 61 74 20 70  is a term that p
11490 72 6f 76 69 64 65 73 20 61 6e 20 75 70 70 65 72  rovides an upper
114a0 20 6f 72 20 6c 6f 77 65 72 0a 2a 2a 20 62 6f 75   or lower.** bou
114b0 6e 64 20 6f 6e 20 61 20 72 61 6e 67 65 20 73 63  nd on a range sc
114c0 61 6e 2e 20 57 69 74 68 6f 75 74 20 63 6f 6e 73  an. Without cons
114d0 69 64 65 72 69 6e 67 20 70 54 65 72 6d 2c 20 69  idering pTerm, i
114e0 74 20 69 73 20 65 73 74 69 6d 61 74 65 64 20 0a  t is estimated .
114f0 2a 2a 20 74 68 61 74 20 74 68 65 20 73 63 61 6e  ** that the scan
11500 20 77 69 6c 6c 20 76 69 73 69 74 20 6e 4e 65 77   will visit nNew
11510 20 72 6f 77 73 2e 20 54 68 69 73 20 66 75 6e 63   rows. This func
11520 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65  tion returns the
11530 20 6e 75 6d 62 65 72 0a 2a 2a 20 65 73 74 69 6d   number.** estim
11540 61 74 65 64 20 74 6f 20 62 65 20 76 69 73 69 74  ated to be visit
11550 65 64 20 61 66 74 65 72 20 74 61 6b 69 6e 67 20  ed after taking 
11560 70 54 65 72 6d 20 69 6e 74 6f 20 61 63 63 6f 75  pTerm into accou
11570 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  nt..**.** If the
11580 20 75 73 65 72 20 65 78 70 6c 69 63 69 74 6c 79   user explicitly
11590 20 73 70 65 63 69 66 69 65 64 20 61 20 6c 69 6b   specified a lik
115a0 65 6c 69 68 6f 6f 64 28 29 20 76 61 6c 75 65 20  elihood() value 
115b0 66 6f 72 20 74 68 69 73 20 74 65 72 6d 2c 0a 2a  for this term,.*
115c0 2a 20 74 68 65 6e 20 74 68 65 20 72 65 74 75 72  * then the retur
115d0 6e 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 6c  n value is the l
115e0 69 6b 65 6c 69 68 6f 6f 64 20 6d 75 6c 74 69 70  ikelihood multip
115f0 6c 69 65 64 20 62 79 20 74 68 65 20 6e 75 6d 62  lied by the numb
11600 65 72 20 6f 66 0a 2a 2a 20 69 6e 70 75 74 20 72  er of.** input r
11610 6f 77 73 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ows. Otherwise, 
11620 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 73  this function as
11630 73 75 6d 65 73 20 74 68 61 74 20 61 6e 20 22 49  sumes that an "I
11640 53 20 4e 4f 54 20 4e 55 4c 4c 22 20 74 65 72 6d  S NOT NULL" term
11650 0a 2a 2a 20 68 61 73 20 61 20 6c 69 6b 65 6c 69  .** has a likeli
11660 68 6f 6f 64 20 6f 66 20 30 2e 35 30 2c 20 61 6e  hood of 0.50, an
11670 64 20 61 6e 79 20 6f 74 68 65 72 20 74 65 72 6d  d any other term
11680 20 61 20 6c 69 6b 65 6c 69 68 6f 6f 64 20 6f 66   a likelihood of
11690 20 30 2e 32 35 2e 0a 2a 2f 0a 73 74 61 74 69 63   0.25..*/.static
116a0 20 4c 6f 67 45 73 74 20 77 68 65 72 65 52 61 6e   LogEst whereRan
116b0 67 65 41 64 6a 75 73 74 28 57 68 65 72 65 54 65  geAdjust(WhereTe
116c0 72 6d 20 2a 70 54 65 72 6d 2c 20 4c 6f 67 45 73  rm *pTerm, LogEs
116d0 74 20 6e 4e 65 77 29 7b 0a 20 20 4c 6f 67 45 73  t nNew){.  LogEs
116e0 74 20 6e 52 65 74 20 3d 20 6e 4e 65 77 3b 0a 20  t nRet = nNew;. 
116f0 20 69 66 28 20 70 54 65 72 6d 20 29 7b 0a 20 20   if( pTerm ){.  
11700 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 74 72 75    if( pTerm->tru
11710 74 68 50 72 6f 62 3c 3d 30 20 29 7b 0a 20 20 20  thProb<=0 ){.   
11720 20 20 20 6e 52 65 74 20 2b 3d 20 70 54 65 72 6d     nRet += pTerm
11730 2d 3e 74 72 75 74 68 50 72 6f 62 3b 0a 20 20 20  ->truthProb;.   
11740 20 7d 65 6c 73 65 20 69 66 28 20 28 70 54 65 72   }else if( (pTer
11750 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
11760 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29 7b 0a 20  M_VNULL)==0 ){. 
11770 20 20 20 20 20 6e 52 65 74 20 2d 3d 20 32 30 3b       nRet -= 20;
11780 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
11790 32 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73  20==sqlite3LogEs
117a0 74 28 34 29 20 29 3b 0a 20 20 20 20 7d 0a 20 20  t(4) );.    }.  
117b0 7d 0a 20 20 72 65 74 75 72 6e 20 6e 52 65 74 3b  }.  return nRet;
117c0 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
117d0 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f  E_ENABLE_STAT3_O
117e0 52 5f 53 54 41 54 34 0a 2f 2a 20 0a 2a 2a 20 54  R_STAT4./* .** T
117f0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
11800 63 61 6c 6c 65 64 20 74 6f 20 65 73 74 69 6d 61  called to estima
11810 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  te the number of
11820 20 72 6f 77 73 20 76 69 73 69 74 65 64 20 62 79   rows visited by
11830 20 61 0a 2a 2a 20 72 61 6e 67 65 2d 73 63 61 6e   a.** range-scan
11840 20 6f 6e 20 61 20 73 6b 69 70 2d 73 63 61 6e 20   on a skip-scan 
11850 69 6e 64 65 78 2e 20 46 6f 72 20 65 78 61 6d 70  index. For examp
11860 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 43 52 45 41  le:.**.**   CREA
11870 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74  TE INDEX i1 ON t
11880 31 28 61 2c 20 62 2c 20 63 29 3b 0a 2a 2a 20 20  1(a, b, c);.**  
11890 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
118a0 31 20 57 48 45 52 45 20 61 3d 3f 20 41 4e 44 20  1 WHERE a=? AND 
118b0 63 20 42 45 54 57 45 45 4e 20 3f 20 41 4e 44 20  c BETWEEN ? AND 
118c0 3f 3b 0a 2a 2a 0a 2a 2a 20 56 61 6c 75 65 20 70  ?;.**.** Value p
118d0 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 69 73 20 63 75  Loop->nOut is cu
118e0 72 72 65 6e 74 6c 79 20 73 65 74 20 74 6f 20 74  rrently set to t
118f0 68 65 20 65 73 74 69 6d 61 74 65 64 20 6e 75 6d  he estimated num
11900 62 65 72 20 6f 66 20 72 6f 77 73 20 0a 2a 2a 20  ber of rows .** 
11910 76 69 73 69 74 65 64 20 66 6f 72 20 73 63 61 6e  visited for scan
11920 6e 69 6e 67 20 28 61 3d 3f 20 41 4e 44 20 62 3d  ning (a=? AND b=
11930 3f 29 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ?). This functio
11940 6e 20 72 65 64 75 63 65 73 20 74 68 61 74 20 65  n reduces that e
11950 73 74 69 6d 61 74 65 20 0a 2a 2a 20 62 79 20 73  stimate .** by s
11960 6f 6d 65 20 66 61 63 74 6f 72 20 74 6f 20 61 63  ome factor to ac
11970 63 6f 75 6e 74 20 66 6f 72 20 74 68 65 20 28 63  count for the (c
11980 20 42 45 54 57 45 45 4e 20 3f 20 41 4e 44 20 3f   BETWEEN ? AND ?
11990 29 20 65 78 70 72 65 73 73 69 6f 6e 20 62 61 73  ) expression bas
119a0 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 74 61  ed.** on the sta
119b0 74 34 20 64 61 74 61 20 66 6f 72 20 74 68 65 20  t4 data for the 
119c0 69 6e 64 65 78 2e 20 74 68 69 73 20 73 63 61 6e  index. this scan
119d0 20 77 69 6c 6c 20 62 65 20 70 65 66 6f 72 6d 65   will be peforme
119e0 64 20 6d 75 6c 74 69 70 6c 65 20 0a 2a 2a 20 74  d multiple .** t
119f0 69 6d 65 73 20 28 6f 6e 63 65 20 66 6f 72 20 65  imes (once for e
11a00 61 63 68 20 28 61 2c 62 29 20 63 6f 6d 62 69 6e  ach (a,b) combin
11a10 61 74 69 6f 6e 20 74 68 61 74 20 6d 61 74 63 68  ation that match
11a20 65 73 20 61 3d 3f 29 20 69 73 20 64 65 61 6c 74  es a=?) is dealt
11a30 20 77 69 74 68 20 0a 2a 2a 20 62 79 20 74 68 65   with .** by the
11a40 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 49   caller..**.** I
11a50 74 20 64 6f 65 73 20 74 68 69 73 20 62 79 20 73  t does this by s
11a60 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67 68 20  canning through 
11a70 61 6c 6c 20 73 74 61 74 34 20 73 61 6d 70 6c 65  all stat4 sample
11a80 73 2c 20 63 6f 6d 70 61 72 69 6e 67 20 76 61 6c  s, comparing val
11a90 75 65 73 0a 2a 2a 20 65 78 74 72 61 63 74 65 64  ues.** extracted
11aa0 20 66 72 6f 6d 20 70 4c 6f 77 65 72 20 61 6e 64   from pLower and
11ab0 20 70 55 70 70 65 72 20 77 69 74 68 20 74 68 65   pUpper with the
11ac0 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 63   corresponding c
11ad0 6f 6c 75 6d 6e 20 69 6e 20 65 61 63 68 0a 2a 2a  olumn in each.**
11ae0 20 73 61 6d 70 6c 65 2e 20 49 66 20 4c 20 61 6e   sample. If L an
11af0 64 20 55 20 61 72 65 20 74 68 65 20 6e 75 6d 62  d U are the numb
11b00 65 72 20 6f 66 20 73 61 6d 70 6c 65 73 20 66 6f  er of samples fo
11b10 75 6e 64 20 74 6f 20 62 65 20 6c 65 73 73 20 74  und to be less t
11b20 68 61 6e 20 6f 72 0a 2a 2a 20 65 71 75 61 6c 20  han or.** equal 
11b30 74 6f 20 74 68 65 20 76 61 6c 75 65 73 20 65 78  to the values ex
11b40 74 72 61 63 74 65 64 20 66 72 6f 6d 20 70 4c 6f  tracted from pLo
11b50 77 65 72 20 61 6e 64 20 70 55 70 70 65 72 20 72  wer and pUpper r
11b60 65 73 70 65 63 74 69 76 65 6c 79 2c 20 61 6e 64  espectively, and
11b70 0a 2a 2a 20 4e 20 69 73 20 74 68 65 20 74 6f 74  .** N is the tot
11b80 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73 61 6d  al number of sam
11b90 70 6c 65 73 2c 20 74 68 65 20 70 4c 6f 6f 70 2d  ples, the pLoop-
11ba0 3e 6e 4f 75 74 20 76 61 6c 75 65 20 69 73 20 61  >nOut value is a
11bb0 64 6a 75 73 74 65 64 0a 2a 2a 20 61 73 20 66 6f  djusted.** as fo
11bc0 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 6e  llows:.**.**   n
11bd0 4f 75 74 20 3d 20 6e 4f 75 74 20 2a 20 28 20 6d  Out = nOut * ( m
11be0 69 6e 28 55 20 2d 20 4c 2c 20 31 29 20 2f 20 4e  in(U - L, 1) / N
11bf0 20 29 0a 2a 2a 0a 2a 2a 20 49 66 20 70 4c 6f 77   ).**.** If pLow
11c00 65 72 20 69 73 20 4e 55 4c 4c 2c 20 6f 72 20 61  er is NULL, or a
11c10 20 76 61 6c 75 65 20 63 61 6e 6e 6f 74 20 62 65   value cannot be
11c20 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
11c30 74 68 65 20 74 65 72 6d 2c 20 4c 20 69 73 0a 2a  the term, L is.*
11c40 2a 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 49  * set to zero. I
11c50 66 20 70 55 70 70 65 72 20 69 73 20 4e 55 4c 4c  f pUpper is NULL
11c60 2c 20 6f 72 20 61 20 76 61 6c 75 65 20 63 61 6e  , or a value can
11c70 6e 6f 74 20 62 65 20 65 78 74 72 61 63 74 65 64  not be extracted
11c80 20 66 72 6f 6d 20 69 74 2c 0a 2a 2a 20 55 20 69   from it,.** U i
11c90 73 20 73 65 74 20 74 6f 20 4e 2e 0a 2a 2a 0a 2a  s set to N..**.*
11ca0 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 74 68 69 73  * Normally, this
11cb0 20 66 75 6e 63 74 69 6f 6e 20 73 65 74 73 20 2a   function sets *
11cc0 70 62 44 6f 6e 65 20 74 6f 20 31 20 62 65 66 6f  pbDone to 1 befo
11cd0 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 48 6f  re returning. Ho
11ce0 77 65 76 65 72 2c 0a 2a 2a 20 69 66 20 6e 6f 20  wever,.** if no 
11cf0 76 61 6c 75 65 20 63 61 6e 20 62 65 20 65 78 74  value can be ext
11d00 72 61 63 74 65 64 20 66 72 6f 6d 20 65 69 74 68  racted from eith
11d10 65 72 20 70 4c 6f 77 65 72 20 6f 72 20 70 55 70  er pLower or pUp
11d20 70 65 72 20 28 61 6e 64 20 73 6f 20 74 68 65 0a  per (and so the.
11d30 2a 2a 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74  ** estimate of t
11d40 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
11d50 73 20 64 65 6c 69 76 65 72 65 64 20 72 65 6d 61  s delivered rema
11d60 69 6e 73 20 75 6e 63 68 61 6e 67 65 64 29 2c 20  ins unchanged), 
11d70 2a 70 62 44 6f 6e 65 0a 2a 2a 20 69 73 20 6c 65  *pbDone.** is le
11d80 66 74 20 61 73 20 69 73 2e 0a 2a 2a 0a 2a 2a 20  ft as is..**.** 
11d90 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
11da0 72 73 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72  rs, an SQLite er
11db0 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
11dc0 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  rned. Otherwise,
11dd0 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a   .** SQLITE_OK..
11de0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68  */.static int wh
11df0 65 72 65 52 61 6e 67 65 53 6b 69 70 53 63 61 6e  ereRangeSkipScan
11e00 45 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  Est(.  Parse *pP
11e10 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50  arse,       /* P
11e20 61 72 73 69 6e 67 20 26 20 63 6f 64 65 20 67 65  arsing & code ge
11e30 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74  nerating context
11e40 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
11e50 2a 70 4c 6f 77 65 72 2c 20 20 20 2f 2a 20 4c 6f  *pLower,   /* Lo
11e60 77 65 72 20 62 6f 75 6e 64 20 6f 6e 20 74 68 65  wer bound on the
11e70 20 72 61 6e 67 65 2e 20 65 78 3a 20 22 78 3e 31   range. ex: "x>1
11e80 32 33 22 20 4d 69 67 68 74 20 62 65 20 4e 55 4c  23" Might be NUL
11e90 4c 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  L */.  WhereTerm
11ea0 20 2a 70 55 70 70 65 72 2c 20 20 20 2f 2a 20 55   *pUpper,   /* U
11eb0 70 70 65 72 20 62 6f 75 6e 64 20 6f 6e 20 74 68  pper bound on th
11ec0 65 20 72 61 6e 67 65 2e 20 65 78 3a 20 22 78 3c  e range. ex: "x<
11ed0 34 35 35 22 20 4d 69 67 68 74 20 62 65 20 4e 55  455" Might be NU
11ee0 4c 4c 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f  LL */.  WhereLoo
11ef0 70 20 2a 70 4c 6f 6f 70 2c 20 20 20 20 2f 2a 20  p *pLoop,    /* 
11f00 55 70 64 61 74 65 20 74 68 65 20 2e 6e 4f 75 74  Update the .nOut
11f10 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20 6c   value of this l
11f20 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 62  oop */.  int *pb
11f30 44 6f 6e 65 20 20 20 20 20 20 20 20 20 20 2f 2a  Done          /*
11f40 20 53 65 74 20 74 6f 20 74 72 75 65 20 69 66 20   Set to true if 
11f50 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 65 78 70  at least one exp
11f60 72 2e 20 76 61 6c 75 65 20 65 78 74 72 61 63 74  r. value extract
11f70 65 64 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78  ed */.){.  Index
11f80 20 2a 70 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62   *p = pLoop->u.b
11f90 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 69  tree.pIndex;.  i
11fa0 6e 74 20 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e  nt nEq = pLoop->
11fb0 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20 73  u.btree.nEq;.  s
11fc0 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
11fd0 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 6e  rse->db;.  int n
11fe0 4c 6f 77 65 72 20 3d 20 2d 31 3b 0a 20 20 69 6e  Lower = -1;.  in
11ff0 74 20 6e 55 70 70 65 72 20 3d 20 70 2d 3e 6e 53  t nUpper = p->nS
12000 61 6d 70 6c 65 2b 31 3b 0a 20 20 69 6e 74 20 72  ample+1;.  int r
12010 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
12020 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 61   int iCol = p->a
12030 69 43 6f 6c 75 6d 6e 5b 6e 45 71 5d 3b 0a 20 20  iColumn[nEq];.  
12040 75 38 20 61 66 66 20 3d 20 69 43 6f 6c 3e 3d 30  u8 aff = iCol>=0
12050 20 3f 20 70 2d 3e 70 54 61 62 6c 65 2d 3e 61 43   ? p->pTable->aC
12060 6f 6c 5b 69 43 6f 6c 5d 2e 61 66 66 69 6e 69 74  ol[iCol].affinit
12070 79 20 3a 20 53 51 4c 49 54 45 5f 41 46 46 5f 49  y : SQLITE_AFF_I
12080 4e 54 45 47 45 52 3b 0a 20 20 43 6f 6c 6c 53 65  NTEGER;.  CollSe
12090 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 0a 20 20 73  q *pColl;.  .  s
120a0 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 31  qlite3_value *p1
120b0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f   = 0;          /
120c0 2a 20 56 61 6c 75 65 20 65 78 74 72 61 63 74 65  * Value extracte
120d0 64 20 66 72 6f 6d 20 70 4c 6f 77 65 72 20 2a 2f  d from pLower */
120e0 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
120f0 20 2a 70 32 20 3d 20 30 3b 20 20 20 20 20 20 20   *p2 = 0;       
12100 20 20 20 2f 2a 20 56 61 6c 75 65 20 65 78 74 72     /* Value extr
12110 61 63 74 65 64 20 66 72 6f 6d 20 70 55 70 70 65  acted from pUppe
12120 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76  r */.  sqlite3_v
12130 61 6c 75 65 20 2a 70 56 61 6c 20 3d 20 30 3b 20  alue *pVal = 0; 
12140 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
12150 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 72  extracted from r
12160 65 63 6f 72 64 20 2a 2f 0a 0a 20 20 70 43 6f 6c  ecord */..  pCol
12170 6c 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74  l = sqlite3Locat
12180 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  eCollSeq(pParse,
12190 20 70 2d 3e 61 7a 43 6f 6c 6c 5b 6e 45 71 5d 29   p->azColl[nEq])
121a0 3b 0a 20 20 69 66 28 20 70 4c 6f 77 65 72 20 29  ;.  if( pLower )
121b0 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
121c0 65 33 53 74 61 74 34 56 61 6c 75 65 46 72 6f 6d  e3Stat4ValueFrom
121d0 45 78 70 72 28 70 50 61 72 73 65 2c 20 70 4c 6f  Expr(pParse, pLo
121e0 77 65 72 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67  wer->pExpr->pRig
121f0 68 74 2c 20 61 66 66 2c 20 26 70 31 29 3b 0a 20  ht, aff, &p1);. 
12200 20 20 20 6e 4c 6f 77 65 72 20 3d 20 30 3b 0a 20     nLower = 0;. 
12210 20 7d 0a 20 20 69 66 28 20 70 55 70 70 65 72 20   }.  if( pUpper 
12220 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
12230 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
12240 69 74 65 33 53 74 61 74 34 56 61 6c 75 65 46 72  ite3Stat4ValueFr
12250 6f 6d 45 78 70 72 28 70 50 61 72 73 65 2c 20 70  omExpr(pParse, p
12260 55 70 70 65 72 2d 3e 70 45 78 70 72 2d 3e 70 52  Upper->pExpr->pR
12270 69 67 68 74 2c 20 61 66 66 2c 20 26 70 32 29 3b  ight, aff, &p2);
12280 0a 20 20 20 20 6e 55 70 70 65 72 20 3d 20 70 32  .    nUpper = p2
12290 20 3f 20 30 20 3a 20 70 2d 3e 6e 53 61 6d 70 6c   ? 0 : p->nSampl
122a0 65 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 31  e;.  }..  if( p1
122b0 20 7c 7c 20 70 32 20 29 7b 0a 20 20 20 20 69 6e   || p2 ){.    in
122c0 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 6e 44 69  t i;.    int nDi
122d0 66 66 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  ff;.    for(i=0;
122e0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
122f0 26 20 69 3c 70 2d 3e 6e 53 61 6d 70 6c 65 3b 20  & i<p->nSample; 
12300 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  i++){.      rc =
12310 20 73 71 6c 69 74 65 33 53 74 61 74 34 43 6f 6c   sqlite3Stat4Col
12320 75 6d 6e 28 64 62 2c 20 70 2d 3e 61 53 61 6d 70  umn(db, p->aSamp
12330 6c 65 5b 69 5d 2e 70 2c 20 70 2d 3e 61 53 61 6d  le[i].p, p->aSam
12340 70 6c 65 5b 69 5d 2e 6e 2c 20 6e 45 71 2c 20 26  ple[i].n, nEq, &
12350 70 56 61 6c 29 3b 0a 20 20 20 20 20 20 69 66 28  pVal);.      if(
12360 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
12370 26 20 70 31 20 29 7b 0a 20 20 20 20 20 20 20 20  & p1 ){.        
12380 69 6e 74 20 72 65 73 20 3d 20 73 71 6c 69 74 65  int res = sqlite
12390 33 4d 65 6d 43 6f 6d 70 61 72 65 28 70 31 2c 20  3MemCompare(p1, 
123a0 70 56 61 6c 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20  pVal, pColl);.  
123b0 20 20 20 20 20 20 69 66 28 20 72 65 73 3e 3d 30        if( res>=0
123c0 20 29 20 6e 4c 6f 77 65 72 2b 2b 3b 0a 20 20 20   ) nLower++;.   
123d0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
123e0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
123f0 70 32 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  p2 ){.        in
12400 74 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33 4d  t res = sqlite3M
12410 65 6d 43 6f 6d 70 61 72 65 28 70 32 2c 20 70 56  emCompare(p2, pV
12420 61 6c 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20 20 20  al, pColl);.    
12430 20 20 20 20 69 66 28 20 72 65 73 3e 3d 30 20 29      if( res>=0 )
12440 20 6e 55 70 70 65 72 2b 2b 3b 0a 20 20 20 20 20   nUpper++;.     
12450 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6e 44 69   }.    }.    nDi
12460 66 66 20 3d 20 28 6e 55 70 70 65 72 20 2d 20 6e  ff = (nUpper - n
12470 4c 6f 77 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Lower);.    if( 
12480 6e 44 69 66 66 3c 3d 30 20 29 20 6e 44 69 66 66  nDiff<=0 ) nDiff
12490 20 3d 20 31 3b 0a 0a 20 20 20 20 2f 2a 20 49 66   = 1;..    /* If
124a0 20 74 68 65 72 65 20 69 73 20 62 6f 74 68 20 61   there is both a
124b0 6e 20 75 70 70 65 72 20 61 6e 64 20 6c 6f 77 65  n upper and lowe
124c0 72 20 62 6f 75 6e 64 20 73 70 65 63 69 66 69 65  r bound specifie
124d0 64 2c 20 61 6e 64 20 74 68 65 20 0a 20 20 20 20  d, and the .    
124e0 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 73 20 69  ** comparisons i
124f0 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65  ndicate that the
12500 79 20 61 72 65 20 63 6c 6f 73 65 20 74 6f 67 65  y are close toge
12510 74 68 65 72 2c 20 75 73 65 20 74 68 65 20 66 61  ther, use the fa
12520 6c 6c 62 61 63 6b 0a 20 20 20 20 2a 2a 20 6d 65  llback.    ** me
12530 74 68 6f 64 20 28 61 73 73 75 6d 65 20 74 68 61  thod (assume tha
12540 74 20 74 68 65 20 73 63 61 6e 20 76 69 73 69 74  t the scan visit
12550 73 20 31 2f 36 34 20 6f 66 20 74 68 65 20 72 6f  s 1/64 of the ro
12560 77 73 29 20 66 6f 72 20 65 73 74 69 6d 61 74 69  ws) for estimati
12570 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65 20 6e 75  ng.    ** the nu
12580 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 76 69 73  mber of rows vis
12590 69 74 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  ited. Otherwise,
125a0 20 65 73 74 69 6d 61 74 65 20 74 68 65 20 6e 75   estimate the nu
125b0 6d 62 65 72 20 6f 66 20 72 6f 77 73 0a 20 20 20  mber of rows.   
125c0 20 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 6d 65   ** using the me
125d0 74 68 6f 64 20 64 65 73 63 72 69 62 65 64 20 69  thod described i
125e0 6e 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d  n the header com
125f0 6d 65 6e 74 20 66 6f 72 20 74 68 69 73 20 66 75  ment for this fu
12600 6e 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69  nction. */.    i
12610 66 28 20 6e 44 69 66 66 21 3d 31 20 7c 7c 20 70  f( nDiff!=1 || p
12620 55 70 70 65 72 3d 3d 30 20 7c 7c 20 70 4c 6f 77  Upper==0 || pLow
12630 65 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  er==0 ){.      i
12640 6e 74 20 6e 41 64 6a 75 73 74 20 3d 20 28 73 71  nt nAdjust = (sq
12650 6c 69 74 65 33 4c 6f 67 45 73 74 28 70 2d 3e 6e  lite3LogEst(p->n
12660 53 61 6d 70 6c 65 29 20 2d 20 73 71 6c 69 74 65  Sample) - sqlite
12670 33 4c 6f 67 45 73 74 28 6e 44 69 66 66 29 29 3b  3LogEst(nDiff));
12680 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f  .      pLoop->nO
12690 75 74 20 2d 3d 20 6e 41 64 6a 75 73 74 3b 0a 20  ut -= nAdjust;. 
126a0 20 20 20 20 20 2a 70 62 44 6f 6e 65 20 3d 20 31       *pbDone = 1
126b0 3b 0a 20 20 20 20 20 20 57 48 45 52 45 54 52 41  ;.      WHERETRA
126c0 43 45 28 30 78 31 30 2c 20 28 22 72 61 6e 67 65  CE(0x10, ("range
126d0 20 73 6b 69 70 2d 73 63 61 6e 20 72 65 67 69 6f   skip-scan regio
126e0 6e 73 3a 20 25 75 2e 2e 25 75 20 20 61 64 6a 75  ns: %u..%u  adju
126f0 73 74 3d 25 64 20 65 73 74 3d 25 64 5c 6e 22 2c  st=%d est=%d\n",
12700 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
12710 20 20 20 20 20 20 20 20 20 20 20 20 6e 4c 6f 77              nLow
12720 65 72 2c 20 6e 55 70 70 65 72 2c 20 6e 41 64 6a  er, nUpper, nAdj
12730 75 73 74 2a 2d 31 2c 20 70 4c 6f 6f 70 2d 3e 6e  ust*-1, pLoop->n
12740 4f 75 74 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  Out));.    }..  
12750 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
12760 74 28 20 2a 70 62 44 6f 6e 65 3d 3d 30 20 29 3b  t( *pbDone==0 );
12770 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 56  .  }..  sqlite3V
12780 61 6c 75 65 46 72 65 65 28 70 31 29 3b 0a 20 20  alueFree(p1);.  
12790 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65  sqlite3ValueFree
127a0 28 70 32 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  (p2);.  sqlite3V
127b0 61 6c 75 65 46 72 65 65 28 70 56 61 6c 29 3b 0a  alueFree(pVal);.
127c0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
127d0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
127e0 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52  _ENABLE_STAT3_OR
127f0 5f 53 54 41 54 34 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _STAT4 */../*.**
12800 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
12810 73 20 75 73 65 64 20 74 6f 20 65 73 74 69 6d 61  s used to estima
12820 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  te the number of
12830 20 72 6f 77 73 20 74 68 61 74 20 77 69 6c 6c 20   rows that will 
12840 62 65 20 76 69 73 69 74 65 64 0a 2a 2a 20 62 79  be visited.** by
12850 20 73 63 61 6e 6e 69 6e 67 20 61 6e 20 69 6e 64   scanning an ind
12860 65 78 20 66 6f 72 20 61 20 72 61 6e 67 65 20 6f  ex for a range o
12870 66 20 76 61 6c 75 65 73 2e 20 54 68 65 20 72 61  f values. The ra
12880 6e 67 65 20 6d 61 79 20 68 61 76 65 20 61 6e 20  nge may have an 
12890 75 70 70 65 72 0a 2a 2a 20 62 6f 75 6e 64 2c 20  upper.** bound, 
128a0 61 20 6c 6f 77 65 72 20 62 6f 75 6e 64 2c 20 6f  a lower bound, o
128b0 72 20 62 6f 74 68 2e 20 54 68 65 20 57 48 45 52  r both. The WHER
128c0 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 74  E clause terms t
128d0 68 61 74 20 73 65 74 20 74 68 65 20 75 70 70 65  hat set the uppe
128e0 72 0a 2a 2a 20 61 6e 64 20 6c 6f 77 65 72 20 62  r.** and lower b
128f0 6f 75 6e 64 73 20 61 72 65 20 72 65 70 72 65 73  ounds are repres
12900 65 6e 74 65 64 20 62 79 20 70 4c 6f 77 65 72 20  ented by pLower 
12910 61 6e 64 20 70 55 70 70 65 72 20 72 65 73 70 65  and pUpper respe
12920 63 74 69 76 65 6c 79 2e 20 46 6f 72 0a 2a 2a 20  ctively. For.** 
12930 65 78 61 6d 70 6c 65 2c 20 61 73 73 75 6d 69 6e  example, assumin
12940 67 20 74 68 61 74 20 69 6e 64 65 78 20 70 20 69  g that index p i
12950 73 20 6f 6e 20 74 31 28 61 29 3a 0a 2a 2a 0a 2a  s on t1(a):.**.*
12960 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20  *   ... FROM t1 
12970 57 48 45 52 45 20 61 20 3e 20 3f 20 41 4e 44 20  WHERE a > ? AND 
12980 61 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 20 20 20 20  a < ? ....**    
12990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
129a0 7c 5f 5f 5f 5f 5f 7c 20 20 20 7c 5f 5f 5f 5f 5f  |_____|   |_____
129b0 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  |.**            
129c0 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20             |    
129d0 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20       |.**       
129e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4c                pL
129f0 6f 77 65 72 20 20 20 20 70 55 70 70 65 72 0a 2a  ower    pUpper.*
12a00 2a 0a 2a 2a 20 49 66 20 65 69 74 68 65 72 20 6f  *.** If either o
12a10 66 20 74 68 65 20 75 70 70 65 72 20 6f 72 20 6c  f the upper or l
12a20 6f 77 65 72 20 62 6f 75 6e 64 20 69 73 20 6e 6f  ower bound is no
12a30 74 20 70 72 65 73 65 6e 74 2c 20 74 68 65 6e 20  t present, then 
12a40 4e 55 4c 4c 20 69 73 20 70 61 73 73 65 64 20 69  NULL is passed i
12a50 6e 0a 2a 2a 20 70 6c 61 63 65 20 6f 66 20 74 68  n.** place of th
12a60 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
12a70 57 68 65 72 65 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a  WhereTerm..**.**
12a80 20 54 68 65 20 76 61 6c 75 65 20 69 6e 20 28 70   The value in (p
12a90 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 75  Builder->pNew->u
12aa0 2e 62 74 72 65 65 2e 6e 45 71 29 20 69 73 20 74  .btree.nEq) is t
12ab0 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20  he index of the 
12ac0 69 6e 64 65 78 0a 2a 2a 20 63 6f 6c 75 6d 6e 20  index.** column 
12ad0 73 75 62 6a 65 63 74 20 74 6f 20 74 68 65 20 72  subject to the r
12ae0 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 2e  ange constraint.
12af0 20 4f 72 2c 20 65 71 75 69 76 61 6c 65 6e 74 6c   Or, equivalentl
12b00 79 2c 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  y, the number of
12b10 0a 2a 2a 20 65 71 75 61 6c 69 74 79 20 63 6f 6e  .** equality con
12b20 73 74 72 61 69 6e 74 73 20 6f 70 74 69 6d 69 7a  straints optimiz
12b30 65 64 20 62 79 20 74 68 65 20 70 72 6f 70 6f 73  ed by the propos
12b40 65 64 20 69 6e 64 65 78 20 73 63 61 6e 2e 20 46  ed index scan. F
12b50 6f 72 20 65 78 61 6d 70 6c 65 2c 0a 2a 2a 20 61  or example,.** a
12b60 73 73 75 6d 69 6e 67 20 69 6e 64 65 78 20 70 20  ssuming index p 
12b70 69 73 20 6f 6e 20 74 31 28 61 2c 20 62 29 2c 20  is on t1(a, b), 
12b80 61 6e 64 20 74 68 65 20 53 51 4c 20 71 75 65 72  and the SQL quer
12b90 79 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e  y is:.**.**   ..
12ba0 2e 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  . FROM t1 WHERE 
12bb0 61 20 3d 20 3f 20 41 4e 44 20 62 20 3e 20 3f 20  a = ? AND b > ? 
12bc0 41 4e 44 20 62 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a  AND b < ? ....**
12bd0 0a 2a 2a 20 74 68 65 6e 20 6e 45 71 20 69 73 20  .** then nEq is 
12be0 73 65 74 20 74 6f 20 31 20 28 61 73 20 74 68 65  set to 1 (as the
12bf0 20 72 61 6e 67 65 20 72 65 73 74 72 69 63 74 65   range restricte
12c00 64 20 63 6f 6c 75 6d 6e 2c 20 62 2c 20 69 73 20  d column, b, is 
12c10 74 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a 20 6c  the second .** l
12c20 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20  eft-most column 
12c30 6f 66 20 74 68 65 20 69 6e 64 65 78 29 2e 20 4f  of the index). O
12c40 72 2c 20 69 66 20 74 68 65 20 71 75 65 72 79 20  r, if the query 
12c50 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20  is:.**.**   ... 
12c60 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 20  FROM t1 WHERE a 
12c70 3e 20 3f 20 41 4e 44 20 61 20 3c 20 3f 20 2e 2e  > ? AND a < ? ..
12c80 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 6e 45 71  ..**.** then nEq
12c90 20 69 73 20 73 65 74 20 74 6f 20 30 2e 0a 2a 2a   is set to 0..**
12ca0 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 66 75  .** When this fu
12cb0 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
12cc0 2c 20 2a 70 6e 4f 75 74 20 69 73 20 73 65 74 20  , *pnOut is set 
12cd0 74 6f 20 74 68 65 20 73 71 6c 69 74 65 33 4c 6f  to the sqlite3Lo
12ce0 67 45 73 74 28 29 20 6f 66 20 74 68 65 0a 2a 2a  gEst() of the.**
12cf0 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
12d00 74 68 61 74 20 74 68 65 20 69 6e 64 65 78 20 73  that the index s
12d10 63 61 6e 20 69 73 20 65 78 70 65 63 74 65 64 20  can is expected 
12d20 74 6f 20 76 69 73 69 74 20 77 69 74 68 6f 75 74  to visit without
12d30 20 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 69 6e 67   .** considering
12d40 20 74 68 65 20 72 61 6e 67 65 20 63 6f 6e 73 74   the range const
12d50 72 61 69 6e 74 73 2e 20 49 66 20 6e 45 71 20 69  raints. If nEq i
12d60 73 20 30 2c 20 74 68 69 73 20 69 73 20 74 68 65  s 0, this is the
12d70 20 6e 75 6d 62 65 72 20 6f 66 20 0a 2a 2a 20 72   number of .** r
12d80 6f 77 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78  ows in the index
12d90 2e 20 41 73 73 75 6d 69 6e 67 20 6e 6f 20 65 72  . Assuming no er
12da0 72 6f 72 20 6f 63 63 75 72 73 2c 20 2a 70 6e 4f  ror occurs, *pnO
12db0 75 74 20 69 73 20 61 64 6a 75 73 74 65 64 20 28  ut is adjusted (
12dc0 72 65 64 75 63 65 64 29 0a 2a 2a 20 74 6f 20 61  reduced).** to a
12dd0 63 63 6f 75 6e 74 20 66 6f 72 20 74 68 65 20 72  ccount for the r
12de0 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 73  ange constraints
12df0 20 70 4c 6f 77 65 72 20 61 6e 64 20 70 55 70 70   pLower and pUpp
12e00 65 72 2e 0a 2a 2a 20 0a 2a 2a 20 49 6e 20 74 68  er..** .** In th
12e10 65 20 61 62 73 65 6e 63 65 20 6f 66 20 73 71 6c  e absence of sql
12e20 69 74 65 5f 73 74 61 74 34 20 41 4e 41 4c 59 5a  ite_stat4 ANALYZ
12e30 45 20 64 61 74 61 2c 20 6f 72 20 69 66 20 73 75  E data, or if su
12e40 63 68 20 64 61 74 61 20 63 61 6e 6e 6f 74 20 62  ch data cannot b
12e50 65 0a 2a 2a 20 75 73 65 64 2c 20 61 20 73 69 6e  e.** used, a sin
12e60 67 6c 65 20 72 61 6e 67 65 20 69 6e 65 71 75 61  gle range inequa
12e70 6c 69 74 79 20 72 65 64 75 63 65 73 20 74 68 65  lity reduces the
12e80 20 73 65 61 72 63 68 20 73 70 61 63 65 20 62 79   search space by
12e90 20 61 20 66 61 63 74 6f 72 20 6f 66 20 34 2e 20   a factor of 4. 
12ea0 0a 2a 2a 20 61 6e 64 20 61 20 70 61 69 72 20 6f  .** and a pair o
12eb0 66 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 28 78  f constraints (x
12ec0 3e 3f 20 41 4e 44 20 78 3c 3f 29 20 72 65 64 75  >? AND x<?) redu
12ed0 63 65 73 20 74 68 65 20 65 78 70 65 63 74 65 64  ces the expected
12ee0 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 72 6f   number of.** ro
12ef0 77 73 20 76 69 73 69 74 65 64 20 62 79 20 61 20  ws visited by a 
12f00 66 61 63 74 6f 72 20 6f 66 20 36 34 2e 0a 2a 2f  factor of 64..*/
12f10 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
12f20 65 52 61 6e 67 65 53 63 61 6e 45 73 74 28 0a 20  eRangeScanEst(. 
12f30 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
12f40 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
12f50 20 26 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69   & code generati
12f60 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
12f70 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72  WhereLoopBuilder
12f80 20 2a 70 42 75 69 6c 64 65 72 2c 0a 20 20 57 68   *pBuilder,.  Wh
12f90 65 72 65 54 65 72 6d 20 2a 70 4c 6f 77 65 72 2c  ereTerm *pLower,
12fa0 20 20 20 2f 2a 20 4c 6f 77 65 72 20 62 6f 75 6e     /* Lower boun
12fb0 64 20 6f 6e 20 74 68 65 20 72 61 6e 67 65 2e 20  d on the range. 
12fc0 65 78 3a 20 22 78 3e 31 32 33 22 20 4d 69 67 68  ex: "x>123" Migh
12fd0 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 57  t be NULL */.  W
12fe0 68 65 72 65 54 65 72 6d 20 2a 70 55 70 70 65 72  hereTerm *pUpper
12ff0 2c 20 20 20 2f 2a 20 55 70 70 65 72 20 62 6f 75  ,   /* Upper bou
13000 6e 64 20 6f 6e 20 74 68 65 20 72 61 6e 67 65 2e  nd on the range.
13010 20 65 78 3a 20 22 78 3c 34 35 35 22 20 4d 69 67   ex: "x<455" Mig
13020 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ht be NULL */.  
13030 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70  WhereLoop *pLoop
13040 20 20 20 20 20 2f 2a 20 4d 6f 64 69 66 79 20 74       /* Modify t
13050 68 65 20 2e 6e 4f 75 74 20 61 6e 64 20 6d 61 79  he .nOut and may
13060 62 65 20 2e 72 52 75 6e 20 66 69 65 6c 64 73 20  be .rRun fields 
13070 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  */.){.  int rc =
13080 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
13090 74 20 6e 4f 75 74 20 3d 20 70 4c 6f 6f 70 2d 3e  t nOut = pLoop->
130a0 6e 4f 75 74 3b 0a 20 20 4c 6f 67 45 73 74 20 6e  nOut;.  LogEst n
130b0 4e 65 77 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  New;..#ifdef SQL
130c0 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
130d0 5f 4f 52 5f 53 54 41 54 34 0a 20 20 49 6e 64 65  _OR_STAT4.  Inde
130e0 78 20 2a 70 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e  x *p = pLoop->u.
130f0 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20  btree.pIndex;.  
13100 69 6e 74 20 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d  int nEq = pLoop-
13110 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 0a 20  >u.btree.nEq;.. 
13120 20 69 66 28 20 70 2d 3e 6e 53 61 6d 70 6c 65 3e   if( p->nSample>
13130 30 0a 20 20 20 26 26 20 6e 45 71 3c 70 2d 3e 6e  0.   && nEq<p->n
13140 53 61 6d 70 6c 65 43 6f 6c 0a 20 20 20 26 26 20  SampleCol.   && 
13150 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62  OptimizationEnab
13160 6c 65 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  led(pParse->db, 
13170 53 51 4c 49 54 45 5f 53 74 61 74 33 29 20 0a 20  SQLITE_Stat3) . 
13180 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 45 71 3d   ){.    if( nEq=
13190 3d 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56  =pBuilder->nRecV
131a0 61 6c 69 64 20 29 7b 0a 20 20 20 20 20 20 55 6e  alid ){.      Un
131b0 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 52  packedRecord *pR
131c0 65 63 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  ec = pBuilder->p
131d0 52 65 63 3b 0a 20 20 20 20 20 20 74 52 6f 77 63  Rec;.      tRowc
131e0 6e 74 20 61 5b 32 5d 3b 0a 20 20 20 20 20 20 75  nt a[2];.      u
131f0 38 20 61 66 66 3b 0a 0a 20 20 20 20 20 20 2f 2a  8 aff;..      /*
13200 20 56 61 72 69 61 62 6c 65 20 69 4c 6f 77 65 72   Variable iLower
13210 20 77 69 6c 6c 20 62 65 20 73 65 74 20 74 6f 20   will be set to 
13220 74 68 65 20 65 73 74 69 6d 61 74 65 20 6f 66 20  the estimate of 
13230 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
13240 77 73 20 69 6e 20 0a 20 20 20 20 20 20 2a 2a 20  ws in .      ** 
13250 74 68 65 20 69 6e 64 65 78 20 74 68 61 74 20 61  the index that a
13260 72 65 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65  re less than the
13270 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20 6f 66 20   lower bound of 
13280 74 68 65 20 72 61 6e 67 65 20 71 75 65 72 79 2e  the range query.
13290 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 6c 6f   The.      ** lo
132a0 77 65 72 20 62 6f 75 6e 64 20 62 65 69 6e 67 20  wer bound being 
132b0 74 68 65 20 63 6f 6e 63 61 74 65 6e 61 74 69 6f  the concatenatio
132c0 6e 20 6f 66 20 24 50 20 61 6e 64 20 24 4c 2c 20  n of $P and $L, 
132d0 77 68 65 72 65 20 24 50 20 69 73 20 74 68 65 0a  where $P is the.
132e0 20 20 20 20 20 20 2a 2a 20 6b 65 79 2d 70 72 65        ** key-pre
132f0 66 69 78 20 66 6f 72 6d 65 64 20 62 79 20 74 68  fix formed by th
13300 65 20 6e 45 71 20 76 61 6c 75 65 73 20 6d 61 74  e nEq values mat
13310 63 68 65 64 20 61 67 61 69 6e 73 74 20 74 68 65  ched against the
13320 20 6e 45 71 20 6c 65 66 74 2d 6d 6f 73 74 0a 20   nEq left-most. 
13330 20 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20       ** columns 
13340 6f 66 20 74 68 65 20 69 6e 64 65 78 2c 20 61 6e  of the index, an
13350 64 20 24 4c 20 69 73 20 74 68 65 20 76 61 6c 75  d $L is the valu
13360 65 20 69 6e 20 70 4c 6f 77 65 72 2e 0a 20 20 20  e in pLower..   
13370 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4f     **.      ** O
13380 72 2c 20 69 66 20 70 4c 6f 77 65 72 20 69 73 20  r, if pLower is 
13390 4e 55 4c 4c 20 6f 72 20 24 4c 20 63 61 6e 6e 6f  NULL or $L canno
133a0 74 20 62 65 20 65 78 74 72 61 63 74 65 64 20 66  t be extracted f
133b0 72 6f 6d 20 69 74 20 28 62 65 63 61 75 73 65 20  rom it (because 
133c0 69 74 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 6e  it.      ** is n
133d0 6f 74 20 61 20 73 69 6d 70 6c 65 20 76 61 72 69  ot a simple vari
133e0 61 62 6c 65 20 6f 72 20 6c 69 74 65 72 61 6c 20  able or literal 
133f0 76 61 6c 75 65 29 2c 20 74 68 65 20 6c 6f 77 65  value), the lowe
13400 72 20 62 6f 75 6e 64 20 6f 66 20 74 68 65 0a 20  r bound of the. 
13410 20 20 20 20 20 2a 2a 20 72 61 6e 67 65 20 69 73       ** range is
13420 20 24 50 2e 20 44 75 65 20 74 6f 20 61 20 71 75   $P. Due to a qu
13430 69 72 6b 20 69 6e 20 74 68 65 20 77 61 79 20 77  irk in the way w
13440 68 65 72 65 4b 65 79 53 74 61 74 73 28 29 20 77  hereKeyStats() w
13450 6f 72 6b 73 2c 20 65 76 65 6e 0a 20 20 20 20 20  orks, even.     
13460 20 2a 2a 20 69 66 20 24 4c 20 69 73 20 61 76 61   ** if $L is ava
13470 69 6c 61 62 6c 65 2c 20 77 68 65 72 65 4b 65 79  ilable, whereKey
13480 53 74 61 74 73 28 29 20 69 73 20 63 61 6c 6c 65  Stats() is calle
13490 64 20 66 6f 72 20 62 6f 74 68 20 28 24 50 29 20  d for both ($P) 
134a0 61 6e 64 20 0a 20 20 20 20 20 20 2a 2a 20 28 24  and .      ** ($
134b0 50 3a 24 4c 29 20 61 6e 64 20 74 68 65 20 6c 61  P:$L) and the la
134c0 72 67 65 72 20 6f 66 20 74 68 65 20 74 77 6f 20  rger of the two 
134d0 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65 73 20  returned values 
134e0 75 73 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  used..      **. 
134f0 20 20 20 20 20 2a 2a 20 53 69 6d 69 6c 61 72 6c       ** Similarl
13500 79 2c 20 69 55 70 70 65 72 20 69 73 20 74 6f 20  y, iUpper is to 
13510 62 65 20 73 65 74 20 74 6f 20 74 68 65 20 65 73  be set to the es
13520 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20 6e 75  timate of the nu
13530 6d 62 65 72 20 6f 66 20 72 6f 77 73 0a 20 20 20  mber of rows.   
13540 20 20 20 2a 2a 20 6c 65 73 73 20 74 68 61 6e 20     ** less than 
13550 74 68 65 20 75 70 70 65 72 20 62 6f 75 6e 64 20  the upper bound 
13560 6f 66 20 74 68 65 20 72 61 6e 67 65 20 71 75 65  of the range que
13570 72 79 2e 20 57 68 65 72 65 20 74 68 65 20 75 70  ry. Where the up
13580 70 65 72 20 62 6f 75 6e 64 0a 20 20 20 20 20 20  per bound.      
13590 2a 2a 20 69 73 20 65 69 74 68 65 72 20 28 24 50  ** is either ($P
135a0 29 20 6f 72 20 28 24 50 3a 24 55 29 2e 20 41 67  ) or ($P:$U). Ag
135b0 61 69 6e 2c 20 65 76 65 6e 20 69 66 20 24 55 20  ain, even if $U 
135c0 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 62 6f  is available, bo
135d0 74 68 20 76 61 6c 75 65 73 0a 20 20 20 20 20 20  th values.      
135e0 2a 2a 20 6f 66 20 69 55 70 70 65 72 20 61 72 65  ** of iUpper are
135f0 20 72 65 71 75 65 73 74 65 64 20 6f 66 20 77 68   requested of wh
13600 65 72 65 4b 65 79 53 74 61 74 73 28 29 20 61 6e  ereKeyStats() an
13610 64 20 74 68 65 20 73 6d 61 6c 6c 65 72 20 75 73  d the smaller us
13620 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ed..      */.   
13630 20 20 20 74 52 6f 77 63 6e 74 20 69 4c 6f 77 65     tRowcnt iLowe
13640 72 3b 0a 20 20 20 20 20 20 74 52 6f 77 63 6e 74  r;.      tRowcnt
13650 20 69 55 70 70 65 72 3b 0a 0a 20 20 20 20 20 20   iUpper;..      
13660 69 66 28 20 70 52 65 63 20 29 7b 0a 20 20 20 20  if( pRec ){.    
13670 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 52      testcase( pR
13680 65 63 2d 3e 6e 46 69 65 6c 64 21 3d 70 42 75 69  ec->nField!=pBui
13690 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20  lder->nRecValid 
136a0 29 3b 0a 20 20 20 20 20 20 20 20 70 52 65 63 2d  );.        pRec-
136b0 3e 6e 46 69 65 6c 64 20 3d 20 70 42 75 69 6c 64  >nField = pBuild
136c0 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3b 0a 20  er->nRecValid;. 
136d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
136e0 20 6e 45 71 3d 3d 70 2d 3e 6e 4b 65 79 43 6f 6c   nEq==p->nKeyCol
136f0 20 29 7b 0a 20 20 20 20 20 20 20 20 61 66 66 20   ){.        aff 
13700 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54  = SQLITE_AFF_INT
13710 45 47 45 52 3b 0a 20 20 20 20 20 20 7d 65 6c 73  EGER;.      }els
13720 65 7b 0a 20 20 20 20 20 20 20 20 61 66 66 20 3d  e{.        aff =
13730 20 70 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c   p->pTable->aCol
13740 5b 70 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 45 71  [p->aiColumn[nEq
13750 5d 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 20  ]].affinity;.   
13760 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 44 65     }.      /* De
13770 74 65 72 6d 69 6e 65 20 69 4c 6f 77 65 72 20 61  termine iLower a
13780 6e 64 20 69 55 70 70 65 72 20 75 73 69 6e 67 20  nd iUpper using 
13790 28 24 50 29 20 6f 6e 6c 79 2e 20 2a 2f 0a 20 20  ($P) only. */.  
137a0 20 20 20 20 69 66 28 20 6e 45 71 3d 3d 30 20 29      if( nEq==0 )
137b0 7b 0a 20 20 20 20 20 20 20 20 69 4c 6f 77 65 72  {.        iLower
137c0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 55   = 0;.        iU
137d0 70 70 65 72 20 3d 20 73 71 6c 69 74 65 33 4c 6f  pper = sqlite3Lo
137e0 67 45 73 74 54 6f 49 6e 74 28 70 2d 3e 61 69 52  gEstToInt(p->aiR
137f0 6f 77 4c 6f 67 45 73 74 5b 30 5d 29 3b 0a 20 20  owLogEst[0]);.  
13800 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
13810 20 20 20 2f 2a 20 4e 6f 74 65 3a 20 74 68 69 73     /* Note: this
13820 20 63 61 6c 6c 20 63 6f 75 6c 64 20 62 65 20 6f   call could be o
13830 70 74 69 6d 69 7a 65 64 20 61 77 61 79 20 2d 20  ptimized away - 
13840 73 69 6e 63 65 20 74 68 65 20 73 61 6d 65 20 76  since the same v
13850 61 6c 75 65 73 20 6d 75 73 74 20 0a 20 20 20 20  alues must .    
13860 20 20 20 20 2a 2a 20 68 61 76 65 20 62 65 65 6e      ** have been
13870 20 72 65 71 75 65 73 74 65 64 20 77 68 65 6e 20   requested when 
13880 74 65 73 74 69 6e 67 20 6b 65 79 20 24 50 20 69  testing key $P i
13890 6e 20 77 68 65 72 65 45 71 75 61 6c 53 63 61 6e  n whereEqualScan
138a0 45 73 74 28 29 2e 20 20 2a 2f 0a 20 20 20 20 20  Est().  */.     
138b0 20 20 20 77 68 65 72 65 4b 65 79 53 74 61 74 73     whereKeyStats
138c0 28 70 50 61 72 73 65 2c 20 70 2c 20 70 52 65 63  (pParse, p, pRec
138d0 2c 20 30 2c 20 61 29 3b 0a 20 20 20 20 20 20 20  , 0, a);.       
138e0 20 69 4c 6f 77 65 72 20 3d 20 61 5b 30 5d 3b 0a   iLower = a[0];.
138f0 20 20 20 20 20 20 20 20 69 55 70 70 65 72 20 3d          iUpper =
13900 20 61 5b 30 5d 20 2b 20 61 5b 31 5d 3b 0a 20 20   a[0] + a[1];.  
13910 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
13920 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 69 6d 70  If possible, imp
13930 72 6f 76 65 20 6f 6e 20 74 68 65 20 69 4c 6f 77  rove on the iLow
13940 65 72 20 65 73 74 69 6d 61 74 65 20 75 73 69 6e  er estimate usin
13950 67 20 28 24 50 3a 24 4c 29 2e 20 2a 2f 0a 20 20  g ($P:$L). */.  
13960 20 20 20 20 69 66 28 20 70 4c 6f 77 65 72 20 29      if( pLower )
13970 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 62 4f  {.        int bO
13980 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
13990 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
139a0 20 76 61 6c 75 65 20 69 73 20 65 78 74 72 61 63   value is extrac
139b0 74 65 64 20 66 72 6f 6d 20 70 45 78 70 72 20 2a  ted from pExpr *
139c0 2f 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a  /.        Expr *
139d0 70 45 78 70 72 20 3d 20 70 4c 6f 77 65 72 2d 3e  pExpr = pLower->
139e0 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20  pExpr->pRight;. 
139f0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28         assert( (
13a00 70 4c 6f 77 65 72 2d 3e 65 4f 70 65 72 61 74 6f  pLower->eOperato
13a10 72 20 26 20 28 57 4f 5f 47 54 7c 57 4f 5f 47 45  r & (WO_GT|WO_GE
13a20 29 29 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  ))!=0 );.       
13a30 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 74 61   rc = sqlite3Sta
13a40 74 34 50 72 6f 62 65 53 65 74 56 61 6c 75 65 28  t4ProbeSetValue(
13a50 70 50 61 72 73 65 2c 20 70 2c 20 26 70 52 65 63  pParse, p, &pRec
13a60 2c 20 70 45 78 70 72 2c 20 61 66 66 2c 20 6e 45  , pExpr, aff, nE
13a70 71 2c 20 26 62 4f 6b 29 3b 0a 20 20 20 20 20 20  q, &bOk);.      
13a80 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
13a90 5f 4f 4b 20 26 26 20 62 4f 6b 20 29 7b 0a 20 20  _OK && bOk ){.  
13aa0 20 20 20 20 20 20 20 20 74 52 6f 77 63 6e 74 20          tRowcnt 
13ab0 69 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 20 20  iNew;.          
13ac0 77 68 65 72 65 4b 65 79 53 74 61 74 73 28 70 50  whereKeyStats(pP
13ad0 61 72 73 65 2c 20 70 2c 20 70 52 65 63 2c 20 30  arse, p, pRec, 0
13ae0 2c 20 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , a);.          
13af0 69 4e 65 77 20 3d 20 61 5b 30 5d 20 2b 20 28 28  iNew = a[0] + ((
13b00 70 4c 6f 77 65 72 2d 3e 65 4f 70 65 72 61 74 6f  pLower->eOperato
13b10 72 20 26 20 57 4f 5f 47 54 29 20 3f 20 61 5b 31  r & WO_GT) ? a[1
13b20 5d 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ] : 0);.        
13b30 20 20 69 66 28 20 69 4e 65 77 3e 69 4c 6f 77 65    if( iNew>iLowe
13b40 72 20 29 20 69 4c 6f 77 65 72 20 3d 20 69 4e 65  r ) iLower = iNe
13b50 77 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 4f 75  w;.          nOu
13b60 74 2d 2d 3b 0a 20 20 20 20 20 20 20 20 20 20 70  t--;.          p
13b70 4c 6f 77 65 72 20 3d 20 30 3b 0a 20 20 20 20 20  Lower = 0;.     
13b80 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20     }.      }..  
13b90 20 20 20 20 2f 2a 20 49 66 20 70 6f 73 73 69 62      /* If possib
13ba0 6c 65 2c 20 69 6d 70 72 6f 76 65 20 6f 6e 20 74  le, improve on t
13bb0 68 65 20 69 55 70 70 65 72 20 65 73 74 69 6d 61  he iUpper estima
13bc0 74 65 20 75 73 69 6e 67 20 28 24 50 3a 24 55 29  te using ($P:$U)
13bd0 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70  . */.      if( p
13be0 55 70 70 65 72 20 29 7b 0a 20 20 20 20 20 20 20  Upper ){.       
13bf0 20 69 6e 74 20 62 4f 6b 3b 20 20 20 20 20 20 20   int bOk;       
13c00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13c10 54 72 75 65 20 69 66 20 76 61 6c 75 65 20 69 73  True if value is
13c20 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
13c30 70 45 78 70 72 20 2a 2f 0a 20 20 20 20 20 20 20  pExpr */.       
13c40 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70   Expr *pExpr = p
13c50 55 70 70 65 72 2d 3e 70 45 78 70 72 2d 3e 70 52  Upper->pExpr->pR
13c60 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 61 73  ight;.        as
13c70 73 65 72 74 28 20 28 70 55 70 70 65 72 2d 3e 65  sert( (pUpper->e
13c80 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 4c  Operator & (WO_L
13c90 54 7c 57 4f 5f 4c 45 29 29 21 3d 30 20 29 3b 0a  T|WO_LE))!=0 );.
13ca0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
13cb0 69 74 65 33 53 74 61 74 34 50 72 6f 62 65 53 65  ite3Stat4ProbeSe
13cc0 74 56 61 6c 75 65 28 70 50 61 72 73 65 2c 20 70  tValue(pParse, p
13cd0 2c 20 26 70 52 65 63 2c 20 70 45 78 70 72 2c 20  , &pRec, pExpr, 
13ce0 61 66 66 2c 20 6e 45 71 2c 20 26 62 4f 6b 29 3b  aff, nEq, &bOk);
13cf0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
13d00 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 4f  =SQLITE_OK && bO
13d10 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74  k ){.          t
13d20 52 6f 77 63 6e 74 20 69 4e 65 77 3b 0a 20 20 20  Rowcnt iNew;.   
13d30 20 20 20 20 20 20 20 77 68 65 72 65 4b 65 79 53         whereKeyS
13d40 74 61 74 73 28 70 50 61 72 73 65 2c 20 70 2c 20  tats(pParse, p, 
13d50 70 52 65 63 2c 20 31 2c 20 61 29 3b 0a 20 20 20  pRec, 1, a);.   
13d60 20 20 20 20 20 20 20 69 4e 65 77 20 3d 20 61 5b         iNew = a[
13d70 30 5d 20 2b 20 28 28 70 55 70 70 65 72 2d 3e 65  0] + ((pUpper->e
13d80 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 4c 45  Operator & WO_LE
13d90 29 20 3f 20 61 5b 31 5d 20 3a 20 30 29 3b 0a 20  ) ? a[1] : 0);. 
13da0 20 20 20 20 20 20 20 20 20 69 66 28 20 69 4e 65           if( iNe
13db0 77 3c 69 55 70 70 65 72 20 29 20 69 55 70 70 65  w<iUpper ) iUppe
13dc0 72 20 3d 20 69 4e 65 77 3b 0a 20 20 20 20 20 20  r = iNew;.      
13dd0 20 20 20 20 6e 4f 75 74 2d 2d 3b 0a 20 20 20 20      nOut--;.    
13de0 20 20 20 20 20 20 70 55 70 70 65 72 20 3d 20 30        pUpper = 0
13df0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
13e00 20 20 7d 0a 0a 20 20 20 20 20 20 70 42 75 69 6c    }..      pBuil
13e10 64 65 72 2d 3e 70 52 65 63 20 3d 20 70 52 65 63  der->pRec = pRec
13e20 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
13e30 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
13e40 20 20 20 20 20 69 66 28 20 69 55 70 70 65 72 3e       if( iUpper>
13e50 69 4c 6f 77 65 72 20 29 7b 0a 20 20 20 20 20 20  iLower ){.      
13e60 20 20 20 20 6e 4e 65 77 20 3d 20 73 71 6c 69 74      nNew = sqlit
13e70 65 33 4c 6f 67 45 73 74 28 69 55 70 70 65 72 20  e3LogEst(iUpper 
13e80 2d 20 69 4c 6f 77 65 72 29 3b 0a 20 20 20 20 20  - iLower);.     
13e90 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
13ea0 20 20 20 20 6e 4e 65 77 20 3d 20 31 30 3b 20 20      nNew = 10;  
13eb0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 31 30        assert( 10
13ec0 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  ==sqlite3LogEst(
13ed0 32 29 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  2) );.        }.
13ee0 20 20 20 20 20 20 20 20 69 66 28 20 6e 4e 65 77          if( nNew
13ef0 3c 6e 4f 75 74 20 29 7b 0a 20 20 20 20 20 20 20  <nOut ){.       
13f00 20 20 20 6e 4f 75 74 20 3d 20 6e 4e 65 77 3b 0a     nOut = nNew;.
13f10 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
13f20 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78 31    WHERETRACE(0x1
13f30 30 2c 20 28 22 53 54 41 54 34 20 72 61 6e 67 65  0, ("STAT4 range
13f40 20 73 63 61 6e 3a 20 25 75 2e 2e 25 75 20 20 65   scan: %u..%u  e
13f50 73 74 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  st=%d\n",.      
13f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f70 20 20 20 20 20 28 75 33 32 29 69 4c 6f 77 65 72       (u32)iLower
13f80 2c 20 28 75 33 32 29 69 55 70 70 65 72 2c 20 6e  , (u32)iUpper, n
13f90 4f 75 74 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Out));.      }. 
13fa0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
13fb0 69 6e 74 20 62 44 6f 6e 65 20 3d 20 30 3b 0a 20  int bDone = 0;. 
13fc0 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 52       rc = whereR
13fd0 61 6e 67 65 53 6b 69 70 53 63 61 6e 45 73 74 28  angeSkipScanEst(
13fe0 70 50 61 72 73 65 2c 20 70 4c 6f 77 65 72 2c 20  pParse, pLower, 
13ff0 70 55 70 70 65 72 2c 20 70 4c 6f 6f 70 2c 20 26  pUpper, pLoop, &
14000 62 44 6f 6e 65 29 3b 0a 20 20 20 20 20 20 69 66  bDone);.      if
14010 28 20 62 44 6f 6e 65 20 29 20 72 65 74 75 72 6e  ( bDone ) return
14020 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23   rc;.    }.  }.#
14030 65 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41  else.  UNUSED_PA
14040 52 41 4d 45 54 45 52 28 70 50 61 72 73 65 29 3b  RAMETER(pParse);
14050 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
14060 54 45 52 28 70 42 75 69 6c 64 65 72 29 3b 0a 20  TER(pBuilder);. 
14070 20 61 73 73 65 72 74 28 20 70 4c 6f 77 65 72 20   assert( pLower 
14080 7c 7c 20 70 55 70 70 65 72 20 29 3b 0a 23 65 6e  || pUpper );.#en
14090 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 70 55  dif.  assert( pU
140a0 70 70 65 72 3d 3d 30 20 7c 7c 20 28 70 55 70 70  pper==0 || (pUpp
140b0 65 72 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  er->wtFlags & TE
140c0 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29 3b 0a  RM_VNULL)==0 );.
140d0 20 20 6e 4e 65 77 20 3d 20 77 68 65 72 65 52 61    nNew = whereRa
140e0 6e 67 65 41 64 6a 75 73 74 28 70 4c 6f 77 65 72  ngeAdjust(pLower
140f0 2c 20 6e 4f 75 74 29 3b 0a 20 20 6e 4e 65 77 20  , nOut);.  nNew 
14100 3d 20 77 68 65 72 65 52 61 6e 67 65 41 64 6a 75  = whereRangeAdju
14110 73 74 28 70 55 70 70 65 72 2c 20 6e 4e 65 77 29  st(pUpper, nNew)
14120 3b 0a 0a 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20  ;..  /* TUNING: 
14130 49 66 20 74 68 65 72 65 20 69 73 20 62 6f 74 68  If there is both
14140 20 61 6e 20 75 70 70 65 72 20 61 6e 64 20 6c 6f   an upper and lo
14150 77 65 72 20 6c 69 6d 69 74 2c 20 61 73 73 75 6d  wer limit, assum
14160 65 20 74 68 65 20 72 61 6e 67 65 20 69 73 0a 20  e the range is. 
14170 20 2a 2a 20 72 65 64 75 63 65 64 20 62 79 20 61   ** reduced by a
14180 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20 37 35 25  n additional 75%
14190 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61  . This means tha
141a0 74 2c 20 62 79 20 64 65 66 61 75 6c 74 2c 20 61  t, by default, a
141b0 6e 20 6f 70 65 6e 2d 65 6e 64 65 64 0a 20 20 2a  n open-ended.  *
141c0 2a 20 72 61 6e 67 65 20 71 75 65 72 79 20 28 65  * range query (e
141d0 2e 67 2e 20 63 6f 6c 20 3e 20 3f 29 20 69 73 20  .g. col > ?) is 
141e0 61 73 73 75 6d 65 64 20 74 6f 20 6d 61 74 63 68  assumed to match
141f0 20 31 2f 34 20 6f 66 20 74 68 65 20 72 6f 77 73   1/4 of the rows
14200 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 69 6e 64   in the.  ** ind
14210 65 78 2e 20 57 68 69 6c 65 20 61 20 63 6c 6f 73  ex. While a clos
14220 65 64 20 72 61 6e 67 65 20 28 65 2e 67 2e 20 63  ed range (e.g. c
14230 6f 6c 20 42 45 54 57 45 45 4e 20 3f 20 41 4e 44  ol BETWEEN ? AND
14240 20 3f 29 20 69 73 20 65 73 74 69 6d 61 74 65 64   ?) is estimated
14250 20 74 6f 0a 20 20 2a 2a 20 6d 61 74 63 68 20 31   to.  ** match 1
14260 2f 36 34 20 6f 66 20 74 68 65 20 69 6e 64 65 78  /64 of the index
14270 2e 20 2a 2f 20 0a 20 20 69 66 28 20 70 4c 6f 77  . */ .  if( pLow
14280 65 72 20 26 26 20 70 55 70 70 65 72 20 29 20 6e  er && pUpper ) n
14290 4e 65 77 20 2d 3d 20 32 30 3b 0a 0a 20 20 6e 4f  New -= 20;..  nO
142a0 75 74 20 2d 3d 20 28 70 4c 6f 77 65 72 21 3d 30  ut -= (pLower!=0
142b0 29 20 2b 20 28 70 55 70 70 65 72 21 3d 30 29 3b  ) + (pUpper!=0);
142c0 0a 20 20 69 66 28 20 6e 4e 65 77 3c 31 30 20 29  .  if( nNew<10 )
142d0 20 6e 4e 65 77 20 3d 20 31 30 3b 0a 20 20 69 66   nNew = 10;.  if
142e0 28 20 6e 4e 65 77 3c 6e 4f 75 74 20 29 20 6e 4f  ( nNew<nOut ) nO
142f0 75 74 20 3d 20 6e 4e 65 77 3b 0a 23 69 66 20 64  ut = nNew;.#if d
14300 65 66 69 6e 65 64 28 57 48 45 52 45 54 52 41 43  efined(WHERETRAC
14310 45 5f 45 4e 41 42 4c 45 44 29 0a 20 20 69 66 28  E_ENABLED).  if(
14320 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 3e 6e 4f 75   pLoop->nOut>nOu
14330 74 20 29 7b 0a 20 20 20 20 57 48 45 52 45 54 52  t ){.    WHERETR
14340 41 43 45 28 30 78 31 30 2c 28 22 52 61 6e 67 65  ACE(0x10,("Range
14350 20 73 63 61 6e 20 6c 6f 77 65 72 73 20 6e 4f 75   scan lowers nOu
14360 74 20 66 72 6f 6d 20 25 64 20 74 6f 20 25 64 5c  t from %d to %d\
14370 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
14380 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e          pLoop->n
14390 4f 75 74 2c 20 6e 4f 75 74 29 29 3b 0a 20 20 7d  Out, nOut));.  }
143a0 0a 23 65 6e 64 69 66 0a 20 20 70 4c 6f 6f 70 2d  .#endif.  pLoop-
143b0 3e 6e 4f 75 74 20 3d 20 28 4c 6f 67 45 73 74 29  >nOut = (LogEst)
143c0 6e 4f 75 74 3b 0a 20 20 72 65 74 75 72 6e 20 72  nOut;.  return r
143d0 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  c;.}..#ifdef SQL
143e0 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
143f0 5f 4f 52 5f 53 54 41 54 34 0a 2f 2a 0a 2a 2a 20  _OR_STAT4./*.** 
14400 45 73 74 69 6d 61 74 65 20 74 68 65 20 6e 75 6d  Estimate the num
14410 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74  ber of rows that
14420 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65   will be returne
14430 64 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 61 6e  d based on.** an
14440 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72   equality constr
14450 61 69 6e 74 20 78 3d 56 41 4c 55 45 20 61 6e 64  aint x=VALUE and
14460 20 77 68 65 72 65 20 74 68 61 74 20 56 41 4c 55   where that VALU
14470 45 20 6f 63 63 75 72 73 20 69 6e 0a 2a 2a 20 74  E occurs in.** t
14480 68 65 20 68 69 73 74 6f 67 72 61 6d 20 64 61 74  he histogram dat
14490 61 2e 20 20 54 68 69 73 20 6f 6e 6c 79 20 77 6f  a.  This only wo
144a0 72 6b 73 20 77 68 65 6e 20 78 20 69 73 20 74 68  rks when x is th
144b0 65 20 6c 65 66 74 2d 6d 6f 73 74 0a 2a 2a 20 63  e left-most.** c
144c0 6f 6c 75 6d 6e 20 6f 66 20 61 6e 20 69 6e 64 65  olumn of an inde
144d0 78 20 61 6e 64 20 73 71 6c 69 74 65 5f 73 74 61  x and sqlite_sta
144e0 74 33 20 68 69 73 74 6f 67 72 61 6d 20 64 61 74  t3 histogram dat
144f0 61 20 69 73 20 61 76 61 69 6c 61 62 6c 65 0a 2a  a is available.*
14500 2a 20 66 6f 72 20 74 68 61 74 20 69 6e 64 65 78  * for that index
14510 2e 20 20 57 68 65 6e 20 70 45 78 70 72 3d 3d 4e  .  When pExpr==N
14520 55 4c 4c 20 74 68 61 74 20 6d 65 61 6e 73 20 74  ULL that means t
14530 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73  he constraint is
14540 0a 2a 2a 20 22 78 20 49 53 20 4e 55 4c 4c 22 20  .** "x IS NULL" 
14550 69 6e 73 74 65 61 64 20 6f 66 20 22 78 3d 56 41  instead of "x=VA
14560 4c 55 45 22 2e 0a 2a 2a 0a 2a 2a 20 57 72 69 74  LUE"..**.** Writ
14570 65 20 74 68 65 20 65 73 74 69 6d 61 74 65 64 20  e the estimated 
14580 72 6f 77 20 63 6f 75 6e 74 20 69 6e 74 6f 20 2a  row count into *
14590 70 6e 52 6f 77 20 61 6e 64 20 72 65 74 75 72 6e  pnRow and return
145a0 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 0a 2a 2a 20   SQLITE_OK. .** 
145b0 49 66 20 75 6e 61 62 6c 65 20 74 6f 20 6d 61 6b  If unable to mak
145c0 65 20 61 6e 20 65 73 74 69 6d 61 74 65 2c 20 6c  e an estimate, l
145d0 65 61 76 65 20 2a 70 6e 52 6f 77 20 75 6e 63 68  eave *pnRow unch
145e0 61 6e 67 65 64 20 61 6e 64 20 72 65 74 75 72 6e  anged and return
145f0 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a  .** non-zero..**
14600 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
14610 20 63 61 6e 20 66 61 69 6c 20 69 66 20 69 74 20   can fail if it 
14620 69 73 20 75 6e 61 62 6c 65 20 74 6f 20 6c 6f 61  is unable to loa
14630 64 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  d a collating se
14640 71 75 65 6e 63 65 0a 2a 2a 20 72 65 71 75 69 72  quence.** requir
14650 65 64 20 66 6f 72 20 73 74 72 69 6e 67 20 63 6f  ed for string co
14660 6d 70 61 72 69 73 6f 6e 2c 20 6f 72 20 69 66 20  mparison, or if 
14670 75 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61  unable to alloca
14680 74 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72  te memory.** for
14690 20 61 20 55 54 46 20 63 6f 6e 76 65 72 73 69 6f   a UTF conversio
146a0 6e 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 63  n required for c
146b0 6f 6d 70 61 72 69 73 6f 6e 2e 20 20 54 68 65 20  omparison.  The 
146c0 65 72 72 6f 72 20 69 73 20 73 74 6f 72 65 64 0a  error is stored.
146d0 2a 2a 20 69 6e 20 74 68 65 20 70 50 61 72 73 65  ** in the pParse
146e0 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73   structure..*/.s
146f0 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 45  tatic int whereE
14700 71 75 61 6c 53 63 61 6e 45 73 74 28 0a 20 20 50  qualScanEst(.  P
14710 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
14720 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 26      /* Parsing &
14730 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67   code generating
14740 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68   context */.  Wh
14750 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a  ereLoopBuilder *
14760 70 42 75 69 6c 64 65 72 2c 0a 20 20 45 78 70 72  pBuilder,.  Expr
14770 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20   *pExpr,        
14780 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 66   /* Expression f
14790 6f 72 20 56 41 4c 55 45 20 69 6e 20 74 68 65 20  or VALUE in the 
147a0 78 3d 56 41 4c 55 45 20 63 6f 6e 73 74 72 61 69  x=VALUE constrai
147b0 6e 74 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20  nt */.  tRowcnt 
147c0 2a 70 6e 52 6f 77 20 20 20 20 20 20 20 2f 2a 20  *pnRow       /* 
147d0 57 72 69 74 65 20 74 68 65 20 72 65 76 69 73 65  Write the revise
147e0 64 20 72 6f 77 20 65 73 74 69 6d 61 74 65 20 68  d row estimate h
147f0 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65  ere */.){.  Inde
14800 78 20 2a 70 20 3d 20 70 42 75 69 6c 64 65 72 2d  x *p = pBuilder-
14810 3e 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 70  >pNew->u.btree.p
14820 49 6e 64 65 78 3b 0a 20 20 69 6e 74 20 6e 45 71  Index;.  int nEq
14830 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65   = pBuilder->pNe
14840 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a  w->u.btree.nEq;.
14850 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64    UnpackedRecord
14860 20 2a 70 52 65 63 20 3d 20 70 42 75 69 6c 64 65   *pRec = pBuilde
14870 72 2d 3e 70 52 65 63 3b 0a 20 20 75 38 20 61 66  r->pRec;.  u8 af
14880 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
14890 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 61       /* Column a
148a0 66 66 69 6e 69 74 79 20 2a 2f 0a 20 20 69 6e 74  ffinity */.  int
148b0 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
148c0 20 20 20 20 20 20 20 2f 2a 20 53 75 62 66 75 6e         /* Subfun
148d0 63 74 69 6f 6e 20 72 65 74 75 72 6e 20 63 6f 64  ction return cod
148e0 65 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 61  e */.  tRowcnt a
148f0 5b 32 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20  [2];            
14900 20 2f 2a 20 53 74 61 74 69 73 74 69 63 73 20 2a   /* Statistics *
14910 2f 0a 20 20 69 6e 74 20 62 4f 6b 3b 0a 0a 20 20  /.  int bOk;..  
14920 61 73 73 65 72 74 28 20 6e 45 71 3e 3d 31 20 29  assert( nEq>=1 )
14930 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 45 71 3c  ;.  assert( nEq<
14940 3d 70 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20  =p->nColumn );. 
14950 20 61 73 73 65 72 74 28 20 70 2d 3e 61 53 61 6d   assert( p->aSam
14960 70 6c 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ple!=0 );.  asse
14970 72 74 28 20 70 2d 3e 6e 53 61 6d 70 6c 65 3e 30  rt( p->nSample>0
14980 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42   );.  assert( pB
14990 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69  uilder->nRecVali
149a0 64 3c 6e 45 71 20 29 3b 0a 0a 20 20 2f 2a 20 49  d<nEq );..  /* I
149b0 66 20 76 61 6c 75 65 73 20 61 72 65 20 6e 6f 74  f values are not
149c0 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 61   available for a
149d0 6c 6c 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65  ll fields of the
149e0 20 69 6e 64 65 78 20 74 6f 20 74 68 65 20 6c 65   index to the le
149f0 66 74 0a 20 20 2a 2a 20 6f 66 20 74 68 69 73 20  ft.  ** of this 
14a00 6f 6e 65 2c 20 6e 6f 20 65 73 74 69 6d 61 74 65  one, no estimate
14a10 20 63 61 6e 20 62 65 20 6d 61 64 65 2e 20 52 65   can be made. Re
14a20 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46  turn SQLITE_NOTF
14a30 4f 55 4e 44 2e 20 2a 2f 0a 20 20 69 66 28 20 70  OUND. */.  if( p
14a40 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c  Builder->nRecVal
14a50 69 64 3c 28 6e 45 71 2d 31 29 20 29 7b 0a 20 20  id<(nEq-1) ){.  
14a60 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
14a70 4e 4f 54 46 4f 55 4e 44 3b 0a 20 20 7d 0a 0a 20  NOTFOUND;.  }.. 
14a80 20 2f 2a 20 54 68 69 73 20 69 73 20 61 6e 20 6f   /* This is an o
14a90 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6f 6e 6c 79  ptimization only
14aa0 2e 20 54 68 65 20 63 61 6c 6c 20 74 6f 20 73 71  . The call to sq
14ab0 6c 69 74 65 33 53 74 61 74 34 50 72 6f 62 65 53  lite3Stat4ProbeS
14ac0 65 74 56 61 6c 75 65 28 29 0a 20 20 2a 2a 20 62  etValue().  ** b
14ad0 65 6c 6f 77 20 77 6f 75 6c 64 20 72 65 74 75 72  elow would retur
14ae0 6e 20 74 68 65 20 73 61 6d 65 20 76 61 6c 75 65  n the same value
14af0 2e 20 20 2a 2f 0a 20 20 69 66 28 20 6e 45 71 3e  .  */.  if( nEq>
14b00 3d 70 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20  =p->nColumn ){. 
14b10 20 20 20 2a 70 6e 52 6f 77 20 3d 20 31 3b 0a 20     *pnRow = 1;. 
14b20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
14b30 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 61 66 66 20  _OK;.  }..  aff 
14b40 3d 20 70 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f  = p->pTable->aCo
14b50 6c 5b 70 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 45  l[p->aiColumn[nE
14b60 71 2d 31 5d 5d 2e 61 66 66 69 6e 69 74 79 3b 0a  q-1]].affinity;.
14b70 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 74    rc = sqlite3St
14b80 61 74 34 50 72 6f 62 65 53 65 74 56 61 6c 75 65  at4ProbeSetValue
14b90 28 70 50 61 72 73 65 2c 20 70 2c 20 26 70 52 65  (pParse, p, &pRe
14ba0 63 2c 20 70 45 78 70 72 2c 20 61 66 66 2c 20 6e  c, pExpr, aff, n
14bb0 45 71 2d 31 2c 20 26 62 4f 6b 29 3b 0a 20 20 70  Eq-1, &bOk);.  p
14bc0 42 75 69 6c 64 65 72 2d 3e 70 52 65 63 20 3d 20  Builder->pRec = 
14bd0 70 52 65 63 3b 0a 20 20 69 66 28 20 72 63 21 3d  pRec;.  if( rc!=
14be0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
14bf0 72 6e 20 72 63 3b 0a 20 20 69 66 28 20 62 4f 6b  rn rc;.  if( bOk
14c00 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
14c10 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 20 20  ITE_NOTFOUND;.  
14c20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61  pBuilder->nRecVa
14c30 6c 69 64 20 3d 20 6e 45 71 3b 0a 0a 20 20 77 68  lid = nEq;..  wh
14c40 65 72 65 4b 65 79 53 74 61 74 73 28 70 50 61 72  ereKeyStats(pPar
14c50 73 65 2c 20 70 2c 20 70 52 65 63 2c 20 30 2c 20  se, p, pRec, 0, 
14c60 61 29 3b 0a 20 20 57 48 45 52 45 54 52 41 43 45  a);.  WHERETRACE
14c70 28 30 78 31 30 2c 28 22 65 71 75 61 6c 69 74 79  (0x10,("equality
14c80 20 73 63 61 6e 20 72 65 67 69 6f 6e 73 3a 20 25   scan regions: %
14c90 64 5c 6e 22 2c 20 28 69 6e 74 29 61 5b 31 5d 29  d\n", (int)a[1])
14ca0 29 3b 0a 20 20 2a 70 6e 52 6f 77 20 3d 20 61 5b  );.  *pnRow = a[
14cb0 31 5d 3b 0a 20 20 0a 20 20 72 65 74 75 72 6e 20  1];.  .  return 
14cc0 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  rc;.}.#endif /* 
14cd0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
14ce0 41 54 33 5f 4f 52 5f 53 54 41 54 34 20 2a 2f 0a  AT3_OR_STAT4 */.
14cf0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
14d00 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53  NABLE_STAT3_OR_S
14d10 54 41 54 34 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d  TAT4./*.** Estim
14d20 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ate the number o
14d30 66 20 72 6f 77 73 20 74 68 61 74 20 77 69 6c 6c  f rows that will
14d40 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 61 73   be returned bas
14d50 65 64 20 6f 6e 0a 2a 2a 20 61 6e 20 49 4e 20 63  ed on.** an IN c
14d60 6f 6e 73 74 72 61 69 6e 74 20 77 68 65 72 65 20  onstraint where 
14d70 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73  the right-hand s
14d80 69 64 65 20 6f 66 20 74 68 65 20 49 4e 20 6f 70  ide of the IN op
14d90 65 72 61 74 6f 72 0a 2a 2a 20 69 73 20 61 20 6c  erator.** is a l
14da0 69 73 74 20 6f 66 20 76 61 6c 75 65 73 2e 20 20  ist of values.  
14db0 45 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20  Example:.**.**  
14dc0 20 20 20 20 20 20 57 48 45 52 45 20 78 20 49 4e        WHERE x IN
14dd0 20 28 31 2c 32 2c 33 2c 34 29 0a 2a 2a 0a 2a 2a   (1,2,3,4).**.**
14de0 20 57 72 69 74 65 20 74 68 65 20 65 73 74 69 6d   Write the estim
14df0 61 74 65 64 20 72 6f 77 20 63 6f 75 6e 74 20 69  ated row count i
14e00 6e 74 6f 20 2a 70 6e 52 6f 77 20 61 6e 64 20 72  nto *pnRow and r
14e10 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
14e20 20 0a 2a 2a 20 49 66 20 75 6e 61 62 6c 65 20 74   .** If unable t
14e30 6f 20 6d 61 6b 65 20 61 6e 20 65 73 74 69 6d 61  o make an estima
14e40 74 65 2c 20 6c 65 61 76 65 20 2a 70 6e 52 6f 77  te, leave *pnRow
14e50 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 20 72   unchanged and r
14e60 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72  eturn.** non-zer
14e70 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  o..**.** This ro
14e80 75 74 69 6e 65 20 63 61 6e 20 66 61 69 6c 20 69  utine can fail i
14e90 66 20 69 74 20 69 73 20 75 6e 61 62 6c 65 20 74  f it is unable t
14ea0 6f 20 6c 6f 61 64 20 61 20 63 6f 6c 6c 61 74 69  o load a collati
14eb0 6e 67 20 73 65 71 75 65 6e 63 65 0a 2a 2a 20 72  ng sequence.** r
14ec0 65 71 75 69 72 65 64 20 66 6f 72 20 73 74 72 69  equired for stri
14ed0 6e 67 20 63 6f 6d 70 61 72 69 73 6f 6e 2c 20 6f  ng comparison, o
14ee0 72 20 69 66 20 75 6e 61 62 6c 65 20 74 6f 20 61  r if unable to a
14ef0 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 0a 2a  llocate memory.*
14f00 2a 20 66 6f 72 20 61 20 55 54 46 20 63 6f 6e 76  * for a UTF conv
14f10 65 72 73 69 6f 6e 20 72 65 71 75 69 72 65 64 20  ersion required 
14f20 66 6f 72 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20  for comparison. 
14f30 20 54 68 65 20 65 72 72 6f 72 20 69 73 20 73 74   The error is st
14f40 6f 72 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70  ored.** in the p
14f50 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65 2e  Parse structure.
14f60 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
14f70 68 65 72 65 49 6e 53 63 61 6e 45 73 74 28 0a 20  hereInScanEst(. 
14f80 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
14f90 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
14fa0 20 26 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69   & code generati
14fb0 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
14fc0 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72  WhereLoopBuilder
14fd0 20 2a 70 42 75 69 6c 64 65 72 2c 0a 20 20 45 78   *pBuilder,.  Ex
14fe0 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20  prList *pList,  
14ff0 20 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20     /* The value 
15000 6c 69 73 74 20 6f 6e 20 74 68 65 20 52 48 53 20  list on the RHS 
15010 6f 66 20 22 78 20 49 4e 20 28 76 31 2c 76 32 2c  of "x IN (v1,v2,
15020 76 33 2c 2e 2e 2e 29 22 20 2a 2f 0a 20 20 74 52  v3,...)" */.  tR
15030 6f 77 63 6e 74 20 2a 70 6e 52 6f 77 20 20 20 20  owcnt *pnRow    
15040 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
15050 72 65 76 69 73 65 64 20 72 6f 77 20 65 73 74 69  revised row esti
15060 6d 61 74 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  mate here */.){.
15070 20 20 49 6e 64 65 78 20 2a 70 20 3d 20 70 42 75    Index *p = pBu
15080 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62  ilder->pNew->u.b
15090 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 69  tree.pIndex;.  i
150a0 36 34 20 6e 52 6f 77 30 20 3d 20 73 71 6c 69 74  64 nRow0 = sqlit
150b0 65 33 4c 6f 67 45 73 74 54 6f 49 6e 74 28 70 2d  e3LogEstToInt(p-
150c0 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 30 5d 29  >aiRowLogEst[0])
150d0 3b 0a 20 20 69 6e 74 20 6e 52 65 63 56 61 6c 69  ;.  int nRecVali
150e0 64 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52  d = pBuilder->nR
150f0 65 63 56 61 6c 69 64 3b 0a 20 20 69 6e 74 20 72  ecValid;.  int r
15100 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
15110 20 20 20 2f 2a 20 53 75 62 66 75 6e 63 74 69 6f     /* Subfunctio
15120 6e 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  n return code */
15130 0a 20 20 74 52 6f 77 63 6e 74 20 6e 45 73 74 3b  .  tRowcnt nEst;
15140 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
15150 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 66 6f 72  mber of rows for
15160 20 61 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 2a   a single term *
15170 2f 0a 20 20 74 52 6f 77 63 6e 74 20 6e 52 6f 77  /.  tRowcnt nRow
15180 45 73 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e  Est = 0;    /* N
15190 65 77 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74  ew estimate of t
151a0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
151b0 73 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20  s */.  int i;   
151c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
151d0 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
151e0 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  /..  assert( p->
151f0 61 53 61 6d 70 6c 65 21 3d 30 20 29 3b 0a 20 20  aSample!=0 );.  
15200 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c  for(i=0; rc==SQL
15210 49 54 45 5f 4f 4b 20 26 26 20 69 3c 70 4c 69 73  ITE_OK && i<pLis
15220 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
15230 20 20 20 20 6e 45 73 74 20 3d 20 6e 52 6f 77 30      nEst = nRow0
15240 3b 0a 20 20 20 20 72 63 20 3d 20 77 68 65 72 65  ;.    rc = where
15250 45 71 75 61 6c 53 63 61 6e 45 73 74 28 70 50 61  EqualScanEst(pPa
15260 72 73 65 2c 20 70 42 75 69 6c 64 65 72 2c 20 70  rse, pBuilder, p
15270 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
15280 2c 20 26 6e 45 73 74 29 3b 0a 20 20 20 20 6e 52  , &nEst);.    nR
15290 6f 77 45 73 74 20 2b 3d 20 6e 45 73 74 3b 0a 20  owEst += nEst;. 
152a0 20 20 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65     pBuilder->nRe
152b0 63 56 61 6c 69 64 20 3d 20 6e 52 65 63 56 61 6c  cValid = nRecVal
152c0 69 64 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72  id;.  }..  if( r
152d0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
152e0 20 20 20 20 69 66 28 20 6e 52 6f 77 45 73 74 20      if( nRowEst 
152f0 3e 20 6e 52 6f 77 30 20 29 20 6e 52 6f 77 45 73  > nRow0 ) nRowEs
15300 74 20 3d 20 6e 52 6f 77 30 3b 0a 20 20 20 20 2a  t = nRow0;.    *
15310 70 6e 52 6f 77 20 3d 20 6e 52 6f 77 45 73 74 3b  pnRow = nRowEst;
15320 0a 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28  .    WHERETRACE(
15330 30 78 31 30 2c 28 22 49 4e 20 72 6f 77 20 65 73  0x10,("IN row es
15340 74 69 6d 61 74 65 3a 20 65 73 74 3d 25 64 5c 6e  timate: est=%d\n
15350 22 2c 20 6e 52 6f 77 45 73 74 29 29 3b 0a 20 20  ", nRowEst));.  
15360 7d 0a 20 20 61 73 73 65 72 74 28 20 70 42 75 69  }.  assert( pBui
15370 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3d  lder->nRecValid=
15380 3d 6e 52 65 63 56 61 6c 69 64 20 29 3b 0a 20 20  =nRecValid );.  
15390 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
153a0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e  dif /* SQLITE_EN
153b0 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54  ABLE_STAT3_OR_ST
153c0 41 54 34 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 44 69  AT4 */../*.** Di
153d0 73 61 62 6c 65 20 61 20 74 65 72 6d 20 69 6e 20  sable a term in 
153e0 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
153f0 2e 20 20 45 78 63 65 70 74 2c 20 64 6f 20 6e 6f  .  Except, do no
15400 74 20 64 69 73 61 62 6c 65 20 74 68 65 20 74 65  t disable the te
15410 72 6d 0a 2a 2a 20 69 66 20 69 74 20 63 6f 6e 74  rm.** if it cont
15420 72 6f 6c 73 20 61 20 4c 45 46 54 20 4f 55 54 45  rols a LEFT OUTE
15430 52 20 4a 4f 49 4e 20 61 6e 64 20 69 74 20 64 69  R JOIN and it di
15440 64 20 6e 6f 74 20 6f 72 69 67 69 6e 61 74 65 20  d not originate 
15450 69 6e 20 74 68 65 20 4f 4e 0a 2a 2a 20 6f 72 20  in the ON.** or 
15460 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20  USING clause of 
15470 74 68 61 74 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a  that join..**.**
15480 20 43 6f 6e 73 69 64 65 72 20 74 68 65 20 74 65   Consider the te
15490 72 6d 20 74 32 2e 7a 3d 27 6f 6b 27 20 69 6e 20  rm t2.z='ok' in 
154a0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 71 75  the following qu
154b0 65 72 69 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 28  eries:.**.**   (
154c0 31 29 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  1)  SELECT * FRO
154d0 4d 20 74 31 20 4c 45 46 54 20 4a 4f 49 4e 20 74  M t1 LEFT JOIN t
154e0 32 20 4f 4e 20 74 31 2e 61 3d 74 32 2e 78 20 57  2 ON t1.a=t2.x W
154f0 48 45 52 45 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a  HERE t2.z='ok'.*
15500 2a 20 20 20 28 32 29 20 20 53 45 4c 45 43 54 20  *   (2)  SELECT 
15510 2a 20 46 52 4f 4d 20 74 31 20 4c 45 46 54 20 4a  * FROM t1 LEFT J
15520 4f 49 4e 20 74 32 20 4f 4e 20 74 31 2e 61 3d 74  OIN t2 ON t1.a=t
15530 32 2e 78 20 41 4e 44 20 74 32 2e 7a 3d 27 6f 6b  2.x AND t2.z='ok
15540 27 0a 2a 2a 20 20 20 28 33 29 20 20 53 45 4c 45  '.**   (3)  SELE
15550 43 54 20 2a 20 46 52 4f 4d 20 74 31 2c 20 74 32  CT * FROM t1, t2
15560 20 57 48 45 52 45 20 74 31 2e 61 3d 74 32 2e 78   WHERE t1.a=t2.x
15570 20 41 4e 44 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a   AND t2.z='ok'.*
15580 2a 0a 2a 2a 20 54 68 65 20 74 32 2e 7a 3d 27 6f  *.** The t2.z='o
15590 6b 27 20 69 73 20 64 69 73 61 62 6c 65 64 20 69  k' is disabled i
155a0 6e 20 74 68 65 20 69 6e 20 28 32 29 20 62 65 63  n the in (2) bec
155b0 61 75 73 65 20 69 74 20 6f 72 69 67 69 6e 61 74  ause it originat
155c0 65 73 0a 2a 2a 20 69 6e 20 74 68 65 20 4f 4e 20  es.** in the ON 
155d0 63 6c 61 75 73 65 2e 20 20 54 68 65 20 74 65 72  clause.  The ter
155e0 6d 20 69 73 20 64 69 73 61 62 6c 65 64 20 69 6e  m is disabled in
155f0 20 28 33 29 20 62 65 63 61 75 73 65 20 69 74 20   (3) because it 
15600 69 73 20 6e 6f 74 20 70 61 72 74 0a 2a 2a 20 6f  is not part.** o
15610 66 20 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a  f a LEFT OUTER J
15620 4f 49 4e 2e 20 20 49 6e 20 28 31 29 2c 20 74 68  OIN.  In (1), th
15630 65 20 74 65 72 6d 20 69 73 20 6e 6f 74 20 64 69  e term is not di
15640 73 61 62 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 44 69  sabled..**.** Di
15650 73 61 62 6c 69 6e 67 20 61 20 74 65 72 6d 20 63  sabling a term c
15660 61 75 73 65 73 20 74 68 61 74 20 74 65 72 6d 20  auses that term 
15670 74 6f 20 6e 6f 74 20 62 65 20 74 65 73 74 65 64  to not be tested
15680 20 69 6e 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f   in the inner lo
15690 6f 70 0a 2a 2a 20 6f 66 20 74 68 65 20 6a 6f 69  op.** of the joi
156a0 6e 2e 20 20 44 69 73 61 62 6c 69 6e 67 20 69 73  n.  Disabling is
156b0 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   an optimization
156c0 2e 20 20 57 68 65 6e 20 74 65 72 6d 73 20 61 72  .  When terms ar
156d0 65 20 73 61 74 69 73 66 69 65 64 0a 2a 2a 20 62  e satisfied.** b
156e0 79 20 69 6e 64 69 63 65 73 2c 20 77 65 20 64 69  y indices, we di
156f0 73 61 62 6c 65 20 74 68 65 6d 20 74 6f 20 70 72  sable them to pr
15700 65 76 65 6e 74 20 72 65 64 75 6e 64 61 6e 74 20  event redundant 
15710 74 65 73 74 73 20 69 6e 20 74 68 65 20 69 6e 6e  tests in the inn
15720 65 72 0a 2a 2a 20 6c 6f 6f 70 2e 20 20 57 65 20  er.** loop.  We 
15730 77 6f 75 6c 64 20 67 65 74 20 74 68 65 20 63 6f  would get the co
15740 72 72 65 63 74 20 72 65 73 75 6c 74 73 20 69 66  rrect results if
15750 20 6e 6f 74 68 69 6e 67 20 77 65 72 65 20 65 76   nothing were ev
15760 65 72 20 64 69 73 61 62 6c 65 64 2c 0a 2a 2a 20  er disabled,.** 
15770 62 75 74 20 6a 6f 69 6e 73 20 6d 69 67 68 74 20  but joins might 
15780 72 75 6e 20 61 20 6c 69 74 74 6c 65 20 73 6c 6f  run a little slo
15790 77 65 72 2e 20 20 54 68 65 20 74 72 69 63 6b 20  wer.  The trick 
157a0 69 73 20 74 6f 20 64 69 73 61 62 6c 65 20 61 73  is to disable as
157b0 20 6d 75 63 68 0a 2a 2a 20 61 73 20 77 65 20 63   much.** as we c
157c0 61 6e 20 77 69 74 68 6f 75 74 20 64 69 73 61 62  an without disab
157d0 6c 69 6e 67 20 74 6f 6f 20 6d 75 63 68 2e 20 20  ling too much.  
157e0 49 66 20 77 65 20 64 69 73 61 62 6c 65 64 20 69  If we disabled i
157f0 6e 20 28 31 29 2c 20 77 65 27 64 20 67 65 74 0a  n (1), we'd get.
15800 2a 2a 20 74 68 65 20 77 72 6f 6e 67 20 61 6e 73  ** the wrong ans
15810 77 65 72 2e 20 20 53 65 65 20 74 69 63 6b 65 74  wer.  See ticket
15820 20 23 38 31 33 2e 0a 2a 2f 0a 73 74 61 74 69 63   #813..*/.static
15830 20 76 6f 69 64 20 64 69 73 61 62 6c 65 54 65 72   void disableTer
15840 6d 28 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c  m(WhereLevel *pL
15850 65 76 65 6c 2c 20 57 68 65 72 65 54 65 72 6d 20  evel, WhereTerm 
15860 2a 70 54 65 72 6d 29 7b 0a 20 20 69 66 28 20 70  *pTerm){.  if( p
15870 54 65 72 6d 0a 20 20 20 20 20 20 26 26 20 28 70  Term.      && (p
15880 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
15890 54 45 52 4d 5f 43 4f 44 45 44 29 3d 3d 30 0a 20  TERM_CODED)==0. 
158a0 20 20 20 20 20 26 26 20 28 70 4c 65 76 65 6c 2d       && (pLevel-
158b0 3e 69 4c 65 66 74 4a 6f 69 6e 3d 3d 30 20 7c 7c  >iLeftJoin==0 ||
158c0 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
158d0 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 45  (pTerm->pExpr, E
158e0 50 5f 46 72 6f 6d 4a 6f 69 6e 29 29 0a 20 20 20  P_FromJoin)).   
158f0 20 20 20 26 26 20 28 70 4c 65 76 65 6c 2d 3e 6e     && (pLevel->n
15900 6f 74 52 65 61 64 79 20 26 20 70 54 65 72 6d 2d  otReady & pTerm-
15910 3e 70 72 65 72 65 71 41 6c 6c 29 3d 3d 30 0a 20  >prereqAll)==0. 
15920 20 29 7b 0a 20 20 20 20 70 54 65 72 6d 2d 3e 77   ){.    pTerm->w
15930 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43  tFlags |= TERM_C
15940 4f 44 45 44 3b 0a 20 20 20 20 69 66 28 20 70 54  ODED;.    if( pT
15950 65 72 6d 2d 3e 69 50 61 72 65 6e 74 3e 3d 30 20  erm->iParent>=0 
15960 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 54 65  ){.      WhereTe
15970 72 6d 20 2a 70 4f 74 68 65 72 20 3d 20 26 70 54  rm *pOther = &pT
15980 65 72 6d 2d 3e 70 57 43 2d 3e 61 5b 70 54 65 72  erm->pWC->a[pTer
15990 6d 2d 3e 69 50 61 72 65 6e 74 5d 3b 0a 20 20 20  m->iParent];.   
159a0 20 20 20 69 66 28 20 28 2d 2d 70 4f 74 68 65 72     if( (--pOther
159b0 2d 3e 6e 43 68 69 6c 64 29 3d 3d 30 20 29 7b 0a  ->nChild)==0 ){.
159c0 20 20 20 20 20 20 20 20 64 69 73 61 62 6c 65 54          disableT
159d0 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 4f 74 68  erm(pLevel, pOth
159e0 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  er);.      }.   
159f0 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
15a00 43 6f 64 65 20 61 6e 20 4f 50 5f 41 66 66 69 6e  Code an OP_Affin
15a10 69 74 79 20 6f 70 63 6f 64 65 20 74 6f 20 61 70  ity opcode to ap
15a20 70 6c 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61  ply the column a
15a30 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20 7a  ffinity string z
15a40 41 66 66 0a 2a 2a 20 74 6f 20 74 68 65 20 6e 20  Aff.** to the n 
15a50 72 65 67 69 73 74 65 72 73 20 73 74 61 72 74 69  registers starti
15a60 6e 67 20 61 74 20 62 61 73 65 2e 20 0a 2a 2a 0a  ng at base. .**.
15a70 2a 2a 20 41 73 20 61 6e 20 6f 70 74 69 6d 69 7a  ** As an optimiz
15a80 61 74 69 6f 6e 2c 20 53 51 4c 49 54 45 5f 41 46  ation, SQLITE_AF
15a90 46 5f 4e 4f 4e 45 20 65 6e 74 72 69 65 73 20 28  F_NONE entries (
15aa0 77 68 69 63 68 20 61 72 65 20 6e 6f 2d 6f 70 73  which are no-ops
15ab0 29 20 61 74 20 74 68 65 0a 2a 2a 20 62 65 67 69  ) at the.** begi
15ac0 6e 6e 69 6e 67 20 61 6e 64 20 65 6e 64 20 6f 66  nning and end of
15ad0 20 7a 41 66 66 20 61 72 65 20 69 67 6e 6f 72 65   zAff are ignore
15ae0 64 2e 20 20 49 66 20 61 6c 6c 20 65 6e 74 72 69  d.  If all entri
15af0 65 73 20 69 6e 20 7a 41 66 66 20 61 72 65 0a 2a  es in zAff are.*
15b00 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  * SQLITE_AFF_NON
15b10 45 2c 20 74 68 65 6e 20 6e 6f 20 63 6f 64 65 20  E, then no code 
15b20 67 65 74 73 20 67 65 6e 65 72 61 74 65 64 2e 0a  gets generated..
15b30 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
15b40 6e 65 20 6d 61 6b 65 73 20 69 74 73 20 6f 77 6e  ne makes its own
15b50 20 63 6f 70 79 20 6f 66 20 7a 41 66 66 20 73 6f   copy of zAff so
15b60 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72   that the caller
15b70 20 69 73 20 66 72 65 65 0a 2a 2a 20 74 6f 20 6d   is free.** to m
15b80 6f 64 69 66 79 20 7a 41 66 66 20 61 66 74 65 72  odify zAff after
15b90 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
15ba0 74 75 72 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  turns..*/.static
15bb0 20 76 6f 69 64 20 63 6f 64 65 41 70 70 6c 79 41   void codeApplyA
15bc0 66 66 69 6e 69 74 79 28 50 61 72 73 65 20 2a 70  ffinity(Parse *p
15bd0 50 61 72 73 65 2c 20 69 6e 74 20 62 61 73 65 2c  Parse, int base,
15be0 20 69 6e 74 20 6e 2c 20 63 68 61 72 20 2a 7a 41   int n, char *zA
15bf0 66 66 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  ff){.  Vdbe *v =
15c00 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
15c10 20 20 69 66 28 20 7a 41 66 66 3d 3d 30 20 29 7b    if( zAff==0 ){
15c20 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
15c30 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
15c40 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 72 65 74  ailed );.    ret
15c50 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  urn;.  }.  asser
15c60 74 28 20 76 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a  t( v!=0 );..  /*
15c70 20 41 64 6a 75 73 74 20 62 61 73 65 20 61 6e 64   Adjust base and
15c80 20 6e 20 74 6f 20 73 6b 69 70 20 6f 76 65 72 20   n to skip over 
15c90 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20  SQLITE_AFF_NONE 
15ca0 65 6e 74 72 69 65 73 20 61 74 20 74 68 65 20 62  entries at the b
15cb0 65 67 69 6e 6e 69 6e 67 0a 20 20 2a 2a 20 61 6e  eginning.  ** an
15cc0 64 20 65 6e 64 20 6f 66 20 74 68 65 20 61 66 66  d end of the aff
15cd0 69 6e 69 74 79 20 73 74 72 69 6e 67 2e 0a 20 20  inity string..  
15ce0 2a 2f 0a 20 20 77 68 69 6c 65 28 20 6e 3e 30 20  */.  while( n>0 
15cf0 26 26 20 7a 41 66 66 5b 30 5d 3d 3d 53 51 4c 49  && zAff[0]==SQLI
15d00 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 29 7b 0a 20  TE_AFF_NONE ){. 
15d10 20 20 20 6e 2d 2d 3b 0a 20 20 20 20 62 61 73 65     n--;.    base
15d20 2b 2b 3b 0a 20 20 20 20 7a 41 66 66 2b 2b 3b 0a  ++;.    zAff++;.
15d30 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 6e 3e 31    }.  while( n>1
15d40 20 26 26 20 7a 41 66 66 5b 6e 2d 31 5d 3d 3d 53   && zAff[n-1]==S
15d50 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 29  QLITE_AFF_NONE )
15d60 7b 0a 20 20 20 20 6e 2d 2d 3b 0a 20 20 7d 0a 0a  {.    n--;.  }..
15d70 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 4f 50    /* Code the OP
15d80 5f 41 66 66 69 6e 69 74 79 20 6f 70 63 6f 64 65  _Affinity opcode
15d90 20 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 79   if there is any
15da0 74 68 69 6e 67 20 6c 65 66 74 20 74 6f 20 64 6f  thing left to do
15db0 2e 20 2a 2f 0a 20 20 69 66 28 20 6e 3e 30 20 29  . */.  if( n>0 )
15dc0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
15dd0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 66  eAddOp2(v, OP_Af
15de0 66 69 6e 69 74 79 2c 20 62 61 73 65 2c 20 6e 29  finity, base, n)
15df0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
15e00 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c  eChangeP4(v, -1,
15e10 20 7a 41 66 66 2c 20 6e 29 3b 0a 20 20 20 20 73   zAff, n);.    s
15e20 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41  qlite3ExprCacheA
15e30 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50  ffinityChange(pP
15e40 61 72 73 65 2c 20 62 61 73 65 2c 20 6e 29 3b 0a  arse, base, n);.
15e50 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65    }.}.../*.** Ge
15e60 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
15e70 61 20 73 69 6e 67 6c 65 20 65 71 75 61 6c 69 74  a single equalit
15e80 79 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48  y term of the WH
15e90 45 52 45 20 63 6c 61 75 73 65 2e 20 20 41 6e 20  ERE clause.  An 
15ea0 65 71 75 61 6c 69 74 79 0a 2a 2a 20 74 65 72 6d  equality.** term
15eb0 20 63 61 6e 20 62 65 20 65 69 74 68 65 72 20 58   can be either X
15ec0 3d 65 78 70 72 20 6f 72 20 58 20 49 4e 20 28 2e  =expr or X IN (.
15ed0 2e 2e 29 2e 20 20 20 70 54 65 72 6d 20 69 73 20  ..).   pTerm is 
15ee0 74 68 65 20 74 65 72 6d 20 74 6f 20 62 65 20 0a  the term to be .
15ef0 2a 2a 20 63 6f 64 65 64 2e 0a 2a 2a 0a 2a 2a 20  ** coded..**.** 
15f00 54 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75  The current valu
15f10 65 20 66 6f 72 20 74 68 65 20 63 6f 6e 73 74 72  e for the constr
15f20 61 69 6e 74 20 69 73 20 6c 65 66 74 20 69 6e 20  aint is left in 
15f30 72 65 67 69 73 74 65 72 20 69 52 65 67 2e 0a 2a  register iReg..*
15f40 2a 0a 2a 2a 20 46 6f 72 20 61 20 63 6f 6e 73 74  *.** For a const
15f50 72 61 69 6e 74 20 6f 66 20 74 68 65 20 66 6f 72  raint of the for
15f60 6d 20 58 3d 65 78 70 72 2c 20 74 68 65 20 65 78  m X=expr, the ex
15f70 70 72 65 73 73 69 6f 6e 20 69 73 20 65 76 61 6c  pression is eval
15f80 75 61 74 65 64 20 61 6e 64 20 69 74 73 0a 2a 2a  uated and its.**
15f90 20 72 65 73 75 6c 74 20 69 73 20 6c 65 66 74 20   result is left 
15fa0 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20 46  on the stack.  F
15fb0 6f 72 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f  or constraints o
15fc0 66 20 74 68 65 20 66 6f 72 6d 20 58 20 49 4e 20  f the form X IN 
15fd0 28 2e 2e 2e 29 0a 2a 2a 20 74 68 69 73 20 72 6f  (...).** this ro
15fe0 75 74 69 6e 65 20 73 65 74 73 20 75 70 20 61 20  utine sets up a 
15ff0 6c 6f 6f 70 20 74 68 61 74 20 77 69 6c 6c 20 69  loop that will i
16000 74 65 72 61 74 65 20 6f 76 65 72 20 61 6c 6c 20  terate over all 
16010 76 61 6c 75 65 73 20 6f 66 20 58 2e 0a 2a 2f 0a  values of X..*/.
16020 73 74 61 74 69 63 20 69 6e 74 20 63 6f 64 65 45  static int codeE
16030 71 75 61 6c 69 74 79 54 65 72 6d 28 0a 20 20 50  qualityTerm(.  P
16040 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
16050 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e     /* The parsin
16060 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57  g context */.  W
16070 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c  hereTerm *pTerm,
16080 20 20 20 2f 2a 20 54 68 65 20 74 65 72 6d 20 6f     /* The term o
16090 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
160a0 73 65 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a  se to be coded *
160b0 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a  /.  WhereLevel *
160c0 70 4c 65 76 65 6c 2c 20 2f 2a 20 54 68 65 20 6c  pLevel, /* The l
160d0 65 76 65 6c 20 6f 66 20 74 68 65 20 46 52 4f 4d  evel of the FROM
160e0 20 63 6c 61 75 73 65 20 77 65 20 61 72 65 20 77   clause we are w
160f0 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20 69  orking on */.  i
16100 6e 74 20 69 45 71 2c 20 20 20 20 20 20 20 20 20  nt iEq,         
16110 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74     /* Index of t
16120 68 65 20 65 71 75 61 6c 69 74 79 20 74 65 72 6d  he equality term
16130 20 77 69 74 68 69 6e 20 74 68 69 73 20 6c 65 76   within this lev
16140 65 6c 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65 76  el */.  int bRev
16150 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ,           /* T
16160 72 75 65 20 66 6f 72 20 72 65 76 65 72 73 65 2d  rue for reverse-
16170 6f 72 64 65 72 20 49 4e 20 6f 70 65 72 61 74 69  order IN operati
16180 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  ons */.  int iTa
16190 72 67 65 74 20 20 20 20 20 20 20 20 20 2f 2a 20  rget         /* 
161a0 41 74 74 65 6d 70 74 20 74 6f 20 6c 65 61 76 65  Attempt to leave
161b0 20 72 65 73 75 6c 74 73 20 69 6e 20 74 68 69 73   results in this
161c0 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 29 7b 0a   register */.){.
161d0 20 20 45 78 70 72 20 2a 70 58 20 3d 20 70 54 65    Expr *pX = pTe
161e0 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 56 64 62  rm->pExpr;.  Vdb
161f0 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
16200 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 52 65 67  Vdbe;.  int iReg
16210 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
16220 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68     /* Register h
16230 6f 6c 64 69 6e 67 20 72 65 73 75 6c 74 73 20 2a  olding results *
16240 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69 54 61  /..  assert( iTa
16250 72 67 65 74 3e 30 20 29 3b 0a 20 20 69 66 28 20  rget>0 );.  if( 
16260 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20 29 7b  pX->op==TK_EQ ){
16270 0a 20 20 20 20 69 52 65 67 20 3d 20 73 71 6c 69  .    iReg = sqli
16280 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65  te3ExprCodeTarge
16290 74 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 52  t(pParse, pX->pR
162a0 69 67 68 74 2c 20 69 54 61 72 67 65 74 29 3b 0a  ight, iTarget);.
162b0 20 20 7d 65 6c 73 65 20 69 66 28 20 70 58 2d 3e    }else if( pX->
162c0 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b  op==TK_ISNULL ){
162d0 0a 20 20 20 20 69 52 65 67 20 3d 20 69 54 61 72  .    iReg = iTar
162e0 67 65 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  get;.    sqlite3
162f0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
16300 5f 4e 75 6c 6c 2c 20 30 2c 20 69 52 65 67 29 3b  _Null, 0, iReg);
16310 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
16320 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
16330 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 65  }else{.    int e
16340 54 79 70 65 3b 0a 20 20 20 20 69 6e 74 20 69 54  Type;.    int iT
16350 61 62 3b 0a 20 20 20 20 73 74 72 75 63 74 20 49  ab;.    struct I
16360 6e 4c 6f 6f 70 20 2a 70 49 6e 3b 0a 20 20 20 20  nLoop *pIn;.    
16370 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70  WhereLoop *pLoop
16380 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f   = pLevel->pWLoo
16390 70 3b 0a 0a 20 20 20 20 69 66 28 20 28 70 4c 6f  p;..    if( (pLo
163a0 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
163b0 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  ERE_VIRTUALTABLE
163c0 29 3d 3d 30 0a 20 20 20 20 20 20 26 26 20 70 4c  )==0.      && pL
163d0 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  oop->u.btree.pIn
163e0 64 65 78 21 3d 30 0a 20 20 20 20 20 20 26 26 20  dex!=0.      && 
163f0 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70  pLoop->u.btree.p
16400 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65  Index->aSortOrde
16410 72 5b 69 45 71 5d 0a 20 20 20 20 29 7b 0a 20 20  r[iEq].    ){.  
16420 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 45      testcase( iE
16430 71 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65  q==0 );.      te
16440 73 74 63 61 73 65 28 20 62 52 65 76 20 29 3b 0a  stcase( bRev );.
16450 20 20 20 20 20 20 62 52 65 76 20 3d 20 21 62 52        bRev = !bR
16460 65 76 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  ev;.    }.    as
16470 73 65 72 74 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b  sert( pX->op==TK
16480 5f 49 4e 20 29 3b 0a 20 20 20 20 69 52 65 67 20  _IN );.    iReg 
16490 3d 20 69 54 61 72 67 65 74 3b 0a 20 20 20 20 65  = iTarget;.    e
164a0 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33 46 69  Type = sqlite3Fi
164b0 6e 64 49 6e 49 6e 64 65 78 28 70 50 61 72 73 65  ndInIndex(pParse
164c0 2c 20 70 58 2c 20 49 4e 5f 49 4e 44 45 58 5f 4c  , pX, IN_INDEX_L
164d0 4f 4f 50 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  OOP, 0);.    if(
164e0 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58   eType==IN_INDEX
164f0 5f 49 4e 44 45 58 5f 44 45 53 43 20 29 7b 0a 20  _INDEX_DESC ){. 
16500 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 62       testcase( b
16510 52 65 76 20 29 3b 0a 20 20 20 20 20 20 62 52 65  Rev );.      bRe
16520 76 20 3d 20 21 62 52 65 76 3b 0a 20 20 20 20 7d  v = !bRev;.    }
16530 0a 20 20 20 20 69 54 61 62 20 3d 20 70 58 2d 3e  .    iTab = pX->
16540 69 54 61 62 6c 65 3b 0a 20 20 20 20 73 71 6c 69  iTable;.    sqli
16550 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
16560 20 62 52 65 76 20 3f 20 4f 50 5f 4c 61 73 74 20   bRev ? OP_Last 
16570 3a 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 54 61  : OP_Rewind, iTa
16580 62 2c 20 30 29 3b 0a 20 20 20 20 56 64 62 65 43  b, 0);.    VdbeC
16590 6f 76 65 72 61 67 65 49 66 28 76 2c 20 62 52 65  overageIf(v, bRe
165a0 76 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65  v);.    VdbeCove
165b0 72 61 67 65 49 66 28 76 2c 20 21 62 52 65 76 29  rageIf(v, !bRev)
165c0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  ;.    assert( (p
165d0 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
165e0 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 29 3d  WHERE_MULTI_OR)=
165f0 3d 30 20 29 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d  =0 );.    pLoop-
16600 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52  >wsFlags |= WHER
16610 45 5f 49 4e 5f 41 42 4c 45 3b 0a 20 20 20 20 69  E_IN_ABLE;.    i
16620 66 28 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e  f( pLevel->u.in.
16630 6e 49 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  nIn==0 ){.      
16640 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 20  pLevel->addrNxt 
16650 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
16660 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 7d  eLabel(v);.    }
16670 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 75 2e 69  .    pLevel->u.i
16680 6e 2e 6e 49 6e 2b 2b 3b 0a 20 20 20 20 70 4c 65  n.nIn++;.    pLe
16690 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f  vel->u.in.aInLoo
166a0 70 20 3d 0a 20 20 20 20 20 20 20 73 71 6c 69 74  p =.       sqlit
166b0 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72 65  e3DbReallocOrFre
166c0 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c  e(pParse->db, pL
166d0 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f  evel->u.in.aInLo
166e0 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  op,.            
166f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16700 20 20 73 69 7a 65 6f 66 28 70 4c 65 76 65 6c 2d    sizeof(pLevel-
16710 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 5b 30 5d  >u.in.aInLoop[0]
16720 29 2a 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e  )*pLevel->u.in.n
16730 49 6e 29 3b 0a 20 20 20 20 70 49 6e 20 3d 20 70  In);.    pIn = p
16740 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c  Level->u.in.aInL
16750 6f 6f 70 3b 0a 20 20 20 20 69 66 28 20 70 49 6e  oop;.    if( pIn
16760 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 20 2b 3d   ){.      pIn +=
16770 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49   pLevel->u.in.nI
16780 6e 20 2d 20 31 3b 0a 20 20 20 20 20 20 70 49 6e  n - 1;.      pIn
16790 2d 3e 69 43 75 72 20 3d 20 69 54 61 62 3b 0a 20  ->iCur = iTab;. 
167a0 20 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d       if( eType==
167b0 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 20 29  IN_INDEX_ROWID )
167c0 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 2d 3e 61  {.        pIn->a
167d0 64 64 72 49 6e 54 6f 70 20 3d 20 73 71 6c 69 74  ddrInTop = sqlit
167e0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
167f0 4f 50 5f 52 6f 77 69 64 2c 20 69 54 61 62 2c 20  OP_Rowid, iTab, 
16800 69 52 65 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c  iReg);.      }el
16810 73 65 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 2d  se{.        pIn-
16820 3e 61 64 64 72 49 6e 54 6f 70 20 3d 20 73 71 6c  >addrInTop = sql
16830 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
16840 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 54 61  , OP_Column, iTa
16850 62 2c 20 30 2c 20 69 52 65 67 29 3b 0a 20 20 20  b, 0, iReg);.   
16860 20 20 20 7d 0a 20 20 20 20 20 20 70 49 6e 2d 3e     }.      pIn->
16870 65 45 6e 64 4c 6f 6f 70 4f 70 20 3d 20 62 52 65  eEndLoopOp = bRe
16880 76 20 3f 20 4f 50 5f 50 72 65 76 49 66 4f 70 65  v ? OP_PrevIfOpe
16890 6e 20 3a 20 4f 50 5f 4e 65 78 74 49 66 4f 70 65  n : OP_NextIfOpe
168a0 6e 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  n;.      sqlite3
168b0 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
168c0 5f 49 73 4e 75 6c 6c 2c 20 69 52 65 67 29 3b 20  _IsNull, iReg); 
168d0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
168e0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
168f0 20 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e    pLevel->u.in.n
16900 49 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 23 65  In = 0;.    }.#e
16910 6e 64 69 66 0a 20 20 7d 0a 20 20 64 69 73 61 62  ndif.  }.  disab
16920 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70  leTerm(pLevel, p
16930 54 65 72 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20  Term);.  return 
16940 69 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  iReg;.}../*.** G
16950 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
16960 74 20 77 69 6c 6c 20 65 76 61 6c 75 61 74 65 20  t will evaluate 
16970 61 6c 6c 20 3d 3d 20 61 6e 64 20 49 4e 20 63 6f  all == and IN co
16980 6e 73 74 72 61 69 6e 74 73 20 66 6f 72 20 61 6e  nstraints for an
16990 0a 2a 2a 20 69 6e 64 65 78 20 73 63 61 6e 2e 0a  .** index scan..
169a0 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c  **.** For exampl
169b0 65 2c 20 63 6f 6e 73 69 64 65 72 20 74 61 62 6c  e, consider tabl
169c0 65 20 74 31 28 61 2c 62 2c 63 2c 64 2c 65 2c 66  e t1(a,b,c,d,e,f
169d0 29 20 77 69 74 68 20 69 6e 64 65 78 20 69 31 28  ) with index i1(
169e0 61 2c 62 2c 63 29 2e 0a 2a 2a 20 53 75 70 70 6f  a,b,c)..** Suppo
169f0 73 65 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  se the WHERE cla
16a00 75 73 65 20 69 73 20 74 68 69 73 3a 20 20 61 3d  use is this:  a=
16a10 3d 35 20 41 4e 44 20 62 20 49 4e 20 28 31 2c 32  =5 AND b IN (1,2
16a20 2c 33 29 20 41 4e 44 20 63 3e 35 20 41 4e 44 20  ,3) AND c>5 AND 
16a30 63 3c 31 30 0a 2a 2a 20 54 68 65 20 69 6e 64 65  c<10.** The inde
16a40 78 20 68 61 73 20 61 73 20 6d 61 6e 79 20 61 73  x has as many as
16a50 20 74 68 72 65 65 20 65 71 75 61 6c 69 74 79 20   three equality 
16a60 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20 62 75 74  constraints, but
16a70 20 69 6e 20 74 68 69 73 0a 2a 2a 20 65 78 61 6d   in this.** exam
16a80 70 6c 65 2c 20 74 68 65 20 74 68 69 72 64 20 22  ple, the third "
16a90 63 22 20 76 61 6c 75 65 20 69 73 20 61 6e 20 69  c" value is an i
16aa0 6e 65 71 75 61 6c 69 74 79 2e 20 20 53 6f 20 6f  nequality.  So o
16ab0 6e 6c 79 20 74 77 6f 20 0a 2a 2a 20 63 6f 6e 73  nly two .** cons
16ac0 74 72 61 69 6e 74 73 20 61 72 65 20 63 6f 64 65  traints are code
16ad0 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  d.  This routine
16ae0 20 77 69 6c 6c 20 67 65 6e 65 72 61 74 65 20 63   will generate c
16af0 6f 64 65 20 74 6f 20 65 76 61 6c 75 61 74 65 0a  ode to evaluate.
16b00 2a 2a 20 61 3d 3d 35 20 61 6e 64 20 62 20 49 4e  ** a==5 and b IN
16b10 20 28 31 2c 32 2c 33 29 2e 20 20 54 68 65 20 63   (1,2,3).  The c
16b20 75 72 72 65 6e 74 20 76 61 6c 75 65 73 20 66 6f  urrent values fo
16b30 72 20 61 20 61 6e 64 20 62 20 77 69 6c 6c 20 62  r a and b will b
16b40 65 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 63  e stored.** in c
16b50 6f 6e 73 65 63 75 74 69 76 65 20 72 65 67 69 73  onsecutive regis
16b60 74 65 72 73 20 61 6e 64 20 74 68 65 20 69 6e 64  ters and the ind
16b70 65 78 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  ex of the first 
16b80 72 65 67 69 73 74 65 72 20 69 73 20 72 65 74 75  register is retu
16b90 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74  rned..**.** In t
16ba0 68 65 20 65 78 61 6d 70 6c 65 20 61 62 6f 76 65  he example above
16bb0 20 6e 45 71 3d 3d 32 2e 20 20 42 75 74 20 74 68   nEq==2.  But th
16bc0 69 73 20 73 75 62 72 6f 75 74 69 6e 65 20 77 6f  is subroutine wo
16bd0 72 6b 73 20 66 6f 72 20 61 6e 79 20 76 61 6c 75  rks for any valu
16be0 65 0a 2a 2a 20 6f 66 20 6e 45 71 20 69 6e 63 6c  e.** of nEq incl
16bf0 75 64 69 6e 67 20 30 2e 20 20 49 66 20 6e 45 71  uding 0.  If nEq
16c00 3d 3d 30 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ==0, this routin
16c10 65 20 69 73 20 6e 65 61 72 6c 79 20 61 20 6e 6f  e is nearly a no
16c20 2d 6f 70 2e 0a 2a 2a 20 54 68 65 20 6f 6e 6c 79  -op..** The only
16c30 20 74 68 69 6e 67 20 69 74 20 64 6f 65 73 20 69   thing it does i
16c40 73 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 70  s allocate the p
16c50 4c 65 76 65 6c 2d 3e 69 4d 65 6d 20 6d 65 6d 6f  Level->iMem memo
16c60 72 79 20 63 65 6c 6c 20 61 6e 64 0a 2a 2a 20 63  ry cell and.** c
16c70 6f 6d 70 75 74 65 20 74 68 65 20 61 66 66 69 6e  ompute the affin
16c80 69 74 79 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a  ity string..**.*
16c90 2a 20 54 68 65 20 6e 45 78 74 72 61 52 65 67 20  * The nExtraReg 
16ca0 70 61 72 61 6d 65 74 65 72 20 69 73 20 30 20 6f  parameter is 0 o
16cb0 72 20 31 2e 20 20 49 74 20 69 73 20 30 20 69 66  r 1.  It is 0 if
16cc0 20 61 6c 6c 20 57 48 45 52 45 20 63 6c 61 75 73   all WHERE claus
16cd0 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 2a 2a  e constraints.**
16ce0 20 61 72 65 20 3d 3d 20 6f 72 20 49 4e 20 61 6e   are == or IN an
16cf0 64 20 61 72 65 20 63 6f 76 65 72 65 64 20 62 79  d are covered by
16d00 20 74 68 65 20 6e 45 71 2e 20 20 6e 45 78 74 72   the nEq.  nExtr
16d10 61 52 65 67 20 69 73 20 31 20 69 66 20 74 68 65  aReg is 1 if the
16d20 72 65 20 69 73 0a 2a 2a 20 61 6e 20 69 6e 65 71  re is.** an ineq
16d30 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
16d40 74 20 28 73 75 63 68 20 61 73 20 74 68 65 20 22  t (such as the "
16d50 63 3e 3d 35 20 41 4e 44 20 63 3c 31 30 22 20 69  c>=5 AND c<10" i
16d60 6e 20 74 68 65 20 65 78 61 6d 70 6c 65 29 20 74  n the example) t
16d70 68 61 74 0a 2a 2a 20 6f 63 63 75 72 73 20 61 66  hat.** occurs af
16d80 74 65 72 20 74 68 65 20 6e 45 71 20 71 75 61 6c  ter the nEq qual
16d90 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e  ity constraints.
16da0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
16db0 69 6e 65 20 61 6c 6c 6f 63 61 74 65 73 20 61 20  ine allocates a 
16dc0 72 61 6e 67 65 20 6f 66 20 6e 45 71 2b 6e 45 78  range of nEq+nEx
16dd0 74 72 61 52 65 67 20 6d 65 6d 6f 72 79 20 63 65  traReg memory ce
16de0 6c 6c 73 20 61 6e 64 20 72 65 74 75 72 6e 73 0a  lls and returns.
16df0 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  ** the index of 
16e00 74 68 65 20 66 69 72 73 74 20 6d 65 6d 6f 72 79  the first memory
16e10 20 63 65 6c 6c 20 69 6e 20 74 68 61 74 20 72 61   cell in that ra
16e20 6e 67 65 2e 20 54 68 65 20 63 6f 64 65 20 74 68  nge. The code th
16e30 61 74 0a 2a 2a 20 63 61 6c 6c 73 20 74 68 69 73  at.** calls this
16e40 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 75 73   routine will us
16e50 65 20 74 68 61 74 20 6d 65 6d 6f 72 79 20 72 61  e that memory ra
16e60 6e 67 65 20 74 6f 20 73 74 6f 72 65 20 6b 65 79  nge to store key
16e70 73 20 66 6f 72 0a 2a 2a 20 73 74 61 72 74 20 61  s for.** start a
16e80 6e 64 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20 63  nd termination c
16e90 6f 6e 64 69 74 69 6f 6e 73 20 6f 66 20 74 68 65  onditions of the
16ea0 20 6c 6f 6f 70 2e 0a 2a 2a 20 6b 65 79 20 76 61   loop..** key va
16eb0 6c 75 65 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e  lue of the loop.
16ec0 20 20 49 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65    If one or more
16ed0 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 20 61 70   IN operators ap
16ee0 70 65 61 72 2c 20 74 68 65 6e 0a 2a 2a 20 74 68  pear, then.** th
16ef0 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 6c 6f 63  is routine alloc
16f00 61 74 65 73 20 61 6e 20 61 64 64 69 74 69 6f 6e  ates an addition
16f10 61 6c 20 6e 45 71 20 6d 65 6d 6f 72 79 20 63 65  al nEq memory ce
16f20 6c 6c 73 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c  lls for internal
16f30 0a 2a 2a 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 42  .** use..**.** B
16f40 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2c  efore returning,
16f50 20 2a 70 7a 41 66 66 20 69 73 20 73 65 74 20 74   *pzAff is set t
16f60 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66  o point to a buf
16f70 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61  fer containing a
16f80 0a 2a 2a 20 63 6f 70 79 20 6f 66 20 74 68 65 20  .** copy of the 
16f90 63 6f 6c 75 6d 6e 20 61 66 66 69 6e 69 74 79 20  column affinity 
16fa0 73 74 72 69 6e 67 20 6f 66 20 74 68 65 20 69 6e  string of the in
16fb0 64 65 78 20 61 6c 6c 6f 63 61 74 65 64 20 75 73  dex allocated us
16fc0 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 44 62  ing.** sqlite3Db
16fd0 4d 61 6c 6c 6f 63 28 29 2e 20 45 78 63 65 70 74  Malloc(). Except
16fe0 2c 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65  , entries in the
16ff0 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73 74 72   copy of the str
17000 69 6e 67 20 61 73 73 6f 63 69 61 74 65 64 0a 2a  ing associated.*
17010 2a 20 77 69 74 68 20 65 71 75 61 6c 69 74 79 20  * with equality 
17020 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 68 61 74  constraints that
17030 20 75 73 65 20 4e 4f 4e 45 20 61 66 66 69 6e 69   use NONE affini
17040 74 79 20 61 72 65 20 73 65 74 20 74 6f 0a 2a 2a  ty are set to.**
17050 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45   SQLITE_AFF_NONE
17060 2e 20 54 68 69 73 20 69 73 20 74 6f 20 64 65 61  . This is to dea
17070 6c 20 77 69 74 68 20 53 51 4c 20 73 75 63 68 20  l with SQL such 
17080 61 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  as the following
17090 3a 0a 2a 2a 0a 2a 2a 20 20 20 43 52 45 41 54 45  :.**.**   CREATE
170a0 20 54 41 42 4c 45 20 74 31 28 61 20 54 45 58 54   TABLE t1(a TEXT
170b0 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 29   PRIMARY KEY, b)
170c0 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 2e 2e  ;.**   SELECT ..
170d0 2e 20 46 52 4f 4d 20 74 31 20 41 53 20 74 32 2c  . FROM t1 AS t2,
170e0 20 74 31 20 57 48 45 52 45 20 74 31 2e 61 20 3d   t1 WHERE t1.a =
170f0 20 74 32 2e 62 3b 0a 2a 2a 0a 2a 2a 20 49 6e 20   t2.b;.**.** In 
17100 74 68 65 20 65 78 61 6d 70 6c 65 20 61 62 6f 76  the example abov
17110 65 2c 20 74 68 65 20 69 6e 64 65 78 20 6f 6e 20  e, the index on 
17120 74 31 28 61 29 20 68 61 73 20 54 45 58 54 20 61  t1(a) has TEXT a
17130 66 66 69 6e 69 74 79 2e 20 42 75 74 20 73 69 6e  ffinity. But sin
17140 63 65 0a 2a 2a 20 74 68 65 20 72 69 67 68 74 20  ce.** the right 
17150 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65  hand side of the
17160 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72   equality constr
17170 61 69 6e 74 20 28 74 32 2e 62 29 20 68 61 73 20  aint (t2.b) has 
17180 4e 4f 4e 45 20 61 66 66 69 6e 69 74 79 2c 0a 2a  NONE affinity,.*
17190 2a 20 6e 6f 20 63 6f 6e 76 65 72 73 69 6f 6e 20  * no conversion 
171a0 73 68 6f 75 6c 64 20 62 65 20 61 74 74 65 6d 70  should be attemp
171b0 74 65 64 20 62 65 66 6f 72 65 20 75 73 69 6e 67  ted before using
171c0 20 61 20 74 32 2e 62 20 76 61 6c 75 65 20 61 73   a t2.b value as
171d0 20 70 61 72 74 20 6f 66 0a 2a 2a 20 61 20 6b 65   part of.** a ke
171e0 79 20 74 6f 20 73 65 61 72 63 68 20 74 68 65 20  y to search the 
171f0 69 6e 64 65 78 2e 20 48 65 6e 63 65 20 74 68 65  index. Hence the
17200 20 66 69 72 73 74 20 62 79 74 65 20 69 6e 20 74   first byte in t
17210 68 65 20 72 65 74 75 72 6e 65 64 20 61 66 66 69  he returned affi
17220 6e 69 74 79 0a 2a 2a 20 73 74 72 69 6e 67 20 69  nity.** string i
17230 6e 20 74 68 69 73 20 65 78 61 6d 70 6c 65 20 77  n this example w
17240 6f 75 6c 64 20 62 65 20 73 65 74 20 74 6f 20 53  ould be set to S
17250 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 2e 0a  QLITE_AFF_NONE..
17260 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f  */.static int co
17270 64 65 41 6c 6c 45 71 75 61 6c 69 74 79 54 65 72  deAllEqualityTer
17280 6d 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ms(.  Parse *pPa
17290 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  rse,        /* P
172a0 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
172b0 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a  /.  WhereLevel *
172c0 70 4c 65 76 65 6c 2c 20 20 20 2f 2a 20 57 68 69  pLevel,   /* Whi
172d0 63 68 20 6e 65 73 74 65 64 20 6c 6f 6f 70 20 6f  ch nested loop o
172e0 66 20 74 68 65 20 46 52 4f 4d 20 77 65 20 61 72  f the FROM we ar
172f0 65 20 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 69 6e  e coding */.  in
17300 74 20 62 52 65 76 2c 20 20 20 20 20 20 20 20 20  t bRev,         
17310 20 20 20 20 2f 2a 20 52 65 76 65 72 73 65 20 74      /* Reverse t
17320 68 65 20 6f 72 64 65 72 20 6f 66 20 49 4e 20 6f  he order of IN o
17330 70 65 72 61 74 6f 72 73 20 2a 2f 0a 20 20 69 6e  perators */.  in
17340 74 20 6e 45 78 74 72 61 52 65 67 2c 20 20 20 20  t nExtraReg,    
17350 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
17360 20 65 78 74 72 61 20 72 65 67 69 73 74 65 72 73   extra registers
17370 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a   to allocate */.
17380 20 20 63 68 61 72 20 2a 2a 70 7a 41 66 66 20 20    char **pzAff  
17390 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
173a0 53 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  Set to point to 
173b0 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20  affinity string 
173c0 2a 2f 0a 29 7b 0a 20 20 75 31 36 20 6e 45 71 3b  */.){.  u16 nEq;
173d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
173e0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d        /* The num
173f0 62 65 72 20 6f 66 20 3d 3d 20 6f 72 20 49 4e 20  ber of == or IN 
17400 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f 20 63  constraints to c
17410 6f 64 65 20 2a 2f 0a 20 20 75 31 36 20 6e 53 6b  ode */.  u16 nSk
17420 69 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ip;             
17430 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
17440 20 6f 66 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f   of left-most co
17450 6c 75 6d 6e 73 20 74 6f 20 73 6b 69 70 20 2a 2f  lumns to skip */
17460 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
17470 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 20 20  rse->pVdbe;     
17480 20 2f 2a 20 54 68 65 20 76 6d 20 75 6e 64 65 72   /* The vm under
17490 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f   construction */
174a0 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20  .  Index *pIdx; 
174b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
174c0 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 62 65   /* The index be
174d0 69 6e 67 20 75 73 65 64 20 66 6f 72 20 74 68 69  ing used for thi
174e0 73 20 6c 6f 6f 70 20 2a 2f 0a 20 20 57 68 65 72  s loop */.  Wher
174f0 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20  eTerm *pTerm;   
17500 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73            /* A s
17510 69 6e 67 6c 65 20 63 6f 6e 73 74 72 61 69 6e 74  ingle constraint
17520 20 74 65 72 6d 20 2a 2f 0a 20 20 57 68 65 72 65   term */.  Where
17530 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20 20 20  Loop *pLoop;    
17540 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
17550 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
17560 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b 20 20 20 20   */.  int j;    
17570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17580 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
17590 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  ter */.  int reg
175a0 42 61 73 65 3b 20 20 20 20 20 20 20 20 20 20 20  Base;           
175b0 20 20 20 20 20 20 20 2f 2a 20 42 61 73 65 20 72         /* Base r
175c0 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74  egister */.  int
175d0 20 6e 52 65 67 3b 20 20 20 20 20 20 20 20 20 20   nReg;          
175e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
175f0 6d 62 65 72 20 6f 66 20 72 65 67 69 73 74 65 72  mber of register
17600 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f  s to allocate */
17610 0a 20 20 63 68 61 72 20 2a 7a 41 66 66 3b 20 20  .  char *zAff;  
17620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17630 20 2f 2a 20 41 66 66 69 6e 69 74 79 20 73 74 72   /* Affinity str
17640 69 6e 67 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f  ing to return */
17650 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6d 6f 64 75  ..  /* This modu
17660 6c 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65  le is only calle
17670 64 20 6f 6e 20 71 75 65 72 79 20 70 6c 61 6e 73  d on query plans
17680 20 74 68 61 74 20 75 73 65 20 61 6e 20 69 6e 64   that use an ind
17690 65 78 2e 20 2a 2f 0a 20 20 70 4c 6f 6f 70 20 3d  ex. */.  pLoop =
176a0 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b   pLevel->pWLoop;
176b0 0a 20 20 61 73 73 65 72 74 28 20 28 70 4c 6f 6f  .  assert( (pLoo
176c0 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
176d0 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  RE_VIRTUALTABLE)
176e0 3d 3d 30 20 29 3b 0a 20 20 6e 45 71 20 3d 20 70  ==0 );.  nEq = p
176f0 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  Loop->u.btree.nE
17700 71 3b 0a 20 20 6e 53 6b 69 70 20 3d 20 70 4c 6f  q;.  nSkip = pLo
17710 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 53 6b 69  op->u.btree.nSki
17720 70 3b 0a 20 20 70 49 64 78 20 3d 20 70 4c 6f 6f  p;.  pIdx = pLoo
17730 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
17740 78 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 64  x;.  assert( pId
17750 78 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 46 69  x!=0 );..  /* Fi
17760 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e  gure out how man
17770 79 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 77  y memory cells w
17780 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 68 65 6e  e will need then
17790 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 6d 2e 0a   allocate them..
177a0 20 20 2a 2f 0a 20 20 72 65 67 42 61 73 65 20 3d    */.  regBase =
177b0 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20   pParse->nMem + 
177c0 31 3b 0a 20 20 6e 52 65 67 20 3d 20 70 4c 6f 6f  1;.  nReg = pLoo
177d0 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 2b  p->u.btree.nEq +
177e0 20 6e 45 78 74 72 61 52 65 67 3b 0a 20 20 70 50   nExtraReg;.  pP
177f0 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52  arse->nMem += nR
17800 65 67 3b 0a 0a 20 20 7a 41 66 66 20 3d 20 73 71  eg;..  zAff = sq
17810 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 70 50  lite3DbStrDup(pP
17820 61 72 73 65 2d 3e 64 62 2c 20 73 71 6c 69 74 65  arse->db, sqlite
17830 33 49 6e 64 65 78 41 66 66 69 6e 69 74 79 53 74  3IndexAffinitySt
17840 72 28 76 2c 20 70 49 64 78 29 29 3b 0a 20 20 69  r(v, pIdx));.  i
17850 66 28 20 21 7a 41 66 66 20 29 7b 0a 20 20 20 20  f( !zAff ){.    
17860 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
17870 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20  ocFailed = 1;.  
17880 7d 0a 0a 20 20 69 66 28 20 6e 53 6b 69 70 20 29  }..  if( nSkip )
17890 7b 0a 20 20 20 20 69 6e 74 20 69 49 64 78 43 75  {.    int iIdxCu
178a0 72 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78  r = pLevel->iIdx
178b0 43 75 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Cur;.    sqlite3
178c0 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 28 62  VdbeAddOp1(v, (b
178d0 52 65 76 3f 4f 50 5f 4c 61 73 74 3a 4f 50 5f 52  Rev?OP_Last:OP_R
178e0 65 77 69 6e 64 29 2c 20 69 49 64 78 43 75 72 29  ewind), iIdxCur)
178f0 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61  ;.    VdbeCovera
17900 67 65 49 66 28 76 2c 20 62 52 65 76 3d 3d 30 29  geIf(v, bRev==0)
17910 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61  ;.    VdbeCovera
17920 67 65 49 66 28 76 2c 20 62 52 65 76 21 3d 30 29  geIf(v, bRev!=0)
17930 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e  ;.    VdbeCommen
17940 74 28 28 76 2c 20 22 62 65 67 69 6e 20 73 6b 69  t((v, "begin ski
17950 70 2d 73 63 61 6e 20 6f 6e 20 25 73 22 2c 20 70  p-scan on %s", p
17960 49 64 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20  Idx->zName));.  
17970 20 20 6a 20 3d 20 73 71 6c 69 74 65 33 56 64 62    j = sqlite3Vdb
17980 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f  eAddOp0(v, OP_Go
17990 74 6f 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  to);.    pLevel-
179a0 3e 61 64 64 72 53 6b 69 70 20 3d 20 73 71 6c 69  >addrSkip = sqli
179b0 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
179c0 28 76 2c 20 28 62 52 65 76 3f 4f 50 5f 53 65 65  (v, (bRev?OP_See
179d0 6b 4c 54 3a 4f 50 5f 53 65 65 6b 47 54 29 2c 0a  kLT:OP_SeekGT),.
179e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
179f0 20 20 20 20 20 20 20 20 20 20 20 20 69 49 64 78              iIdx
17a00 43 75 72 2c 20 30 2c 20 72 65 67 42 61 73 65 2c  Cur, 0, regBase,
17a10 20 6e 53 6b 69 70 29 3b 0a 20 20 20 20 56 64 62   nSkip);.    Vdb
17a20 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 62  eCoverageIf(v, b
17a30 52 65 76 3d 3d 30 29 3b 0a 20 20 20 20 56 64 62  Rev==0);.    Vdb
17a40 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 62  eCoverageIf(v, b
17a50 52 65 76 21 3d 30 29 3b 0a 20 20 20 20 73 71 6c  Rev!=0);.    sql
17a60 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
17a70 28 76 2c 20 6a 29 3b 0a 20 20 20 20 66 6f 72 28  (v, j);.    for(
17a80 6a 3d 30 3b 20 6a 3c 6e 53 6b 69 70 3b 20 6a 2b  j=0; j<nSkip; j+
17a90 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
17aa0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
17ab0 50 5f 43 6f 6c 75 6d 6e 2c 20 69 49 64 78 43 75  P_Column, iIdxCu
17ac0 72 2c 20 6a 2c 20 72 65 67 42 61 73 65 2b 6a 29  r, j, regBase+j)
17ad0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
17ae0 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a  pIdx->aiColumn[j
17af0 5d 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 56 64  ]>=0 );.      Vd
17b00 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25  beComment((v, "%
17b10 73 22 2c 20 70 49 64 78 2d 3e 70 54 61 62 6c 65  s", pIdx->pTable
17b20 2d 3e 61 43 6f 6c 5b 70 49 64 78 2d 3e 61 69 43  ->aCol[pIdx->aiC
17b30 6f 6c 75 6d 6e 5b 6a 5d 5d 2e 7a 4e 61 6d 65 29  olumn[j]].zName)
17b40 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 20 20 20  );.    }.  }    
17b50 0a 0a 20 20 2f 2a 20 45 76 61 6c 75 61 74 65 20  ..  /* Evaluate 
17b60 74 68 65 20 65 71 75 61 6c 69 74 79 20 63 6f 6e  the equality con
17b70 73 74 72 61 69 6e 74 73 0a 20 20 2a 2f 0a 20 20  straints.  */.  
17b80 61 73 73 65 72 74 28 20 7a 41 66 66 3d 3d 30 20  assert( zAff==0 
17b90 7c 7c 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a  || (int)strlen(z
17ba0 41 66 66 29 3e 3d 6e 45 71 20 29 3b 0a 20 20 66  Aff)>=nEq );.  f
17bb0 6f 72 28 6a 3d 6e 53 6b 69 70 3b 20 6a 3c 6e 45  or(j=nSkip; j<nE
17bc0 71 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  q; j++){.    int
17bd0 20 72 31 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d   r1;.    pTerm =
17be0 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a   pLoop->aLTerm[j
17bf0 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ];.    assert( p
17c00 54 65 72 6d 21 3d 30 20 29 3b 0a 20 20 20 20 2f  Term!=0 );.    /
17c10 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
17c20 74 65 73 74 63 61 73 65 20 69 73 20 74 72 75 65  testcase is true
17c30 20 66 6f 72 20 69 6e 64 69 63 65 73 20 77 69 74   for indices wit
17c40 68 20 72 65 64 75 6e 64 61 6e 74 20 63 6f 6c 75  h redundant colu
17c50 6d 6e 73 2e 20 0a 20 20 20 20 2a 2a 20 45 78 3a  mns. .    ** Ex:
17c60 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 31   CREATE INDEX i1
17c70 20 4f 4e 20 74 31 28 61 2c 62 2c 61 29 3b 20 53   ON t1(a,b,a); S
17c80 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
17c90 57 48 45 52 45 20 61 3d 30 20 41 4e 44 20 62 3d  WHERE a=0 AND b=
17ca0 30 3b 20 2a 2f 0a 20 20 20 20 74 65 73 74 63 61  0; */.    testca
17cb0 73 65 28 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c  se( (pTerm->wtFl
17cc0 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 44 45 44  ags & TERM_CODED
17cd0 29 21 3d 30 20 29 3b 0a 20 20 20 20 74 65 73 74  )!=0 );.    test
17ce0 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 77 74 46  case( pTerm->wtF
17cf0 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54  lags & TERM_VIRT
17d00 55 41 4c 20 29 3b 0a 20 20 20 20 72 31 20 3d 20  UAL );.    r1 = 
17d10 63 6f 64 65 45 71 75 61 6c 69 74 79 54 65 72 6d  codeEqualityTerm
17d20 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2c 20  (pParse, pTerm, 
17d30 70 4c 65 76 65 6c 2c 20 6a 2c 20 62 52 65 76 2c  pLevel, j, bRev,
17d40 20 72 65 67 42 61 73 65 2b 6a 29 3b 0a 20 20 20   regBase+j);.   
17d50 20 69 66 28 20 72 31 21 3d 72 65 67 42 61 73 65   if( r1!=regBase
17d60 2b 6a 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  +j ){.      if( 
17d70 6e 52 65 67 3d 3d 31 20 29 7b 0a 20 20 20 20 20  nReg==1 ){.     
17d80 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
17d90 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
17da0 20 72 65 67 42 61 73 65 29 3b 0a 20 20 20 20 20   regBase);.     
17db0 20 20 20 72 65 67 42 61 73 65 20 3d 20 72 31 3b     regBase = r1;
17dc0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
17dd0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
17de0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43  eAddOp2(v, OP_SC
17df0 6f 70 79 2c 20 72 31 2c 20 72 65 67 42 61 73 65  opy, r1, regBase
17e00 2b 6a 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  +j);.      }.   
17e10 20 7d 0a 20 20 20 20 74 65 73 74 63 61 73 65 28   }.    testcase(
17e20 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
17e30 72 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b  r & WO_ISNULL );
17e40 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
17e50 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
17e60 26 20 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 69  & WO_IN );.    i
17e70 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  f( (pTerm->eOper
17e80 61 74 6f 72 20 26 20 28 57 4f 5f 49 53 4e 55 4c  ator & (WO_ISNUL
17e90 4c 7c 57 4f 5f 49 4e 29 29 3d 3d 30 20 29 7b 0a  L|WO_IN))==0 ){.
17ea0 20 20 20 20 20 20 45 78 70 72 20 2a 70 52 69 67        Expr *pRig
17eb0 68 74 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70  ht = pTerm->pExp
17ec0 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20  r->pRight;.     
17ed0 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
17ee0 43 61 6e 42 65 4e 75 6c 6c 28 70 52 69 67 68 74  CanBeNull(pRight
17ef0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ) ){.        sql
17f00 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
17f10 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 65 67  , OP_IsNull, reg
17f20 42 61 73 65 2b 6a 2c 20 70 4c 65 76 65 6c 2d 3e  Base+j, pLevel->
17f30 61 64 64 72 42 72 6b 29 3b 0a 20 20 20 20 20 20  addrBrk);.      
17f40 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
17f50 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
17f60 20 69 66 28 20 7a 41 66 66 20 29 7b 0a 20 20 20   if( zAff ){.   
17f70 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
17f80 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28  CompareAffinity(
17f90 70 52 69 67 68 74 2c 20 7a 41 66 66 5b 6a 5d 29  pRight, zAff[j])
17fa0 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  ==SQLITE_AFF_NON
17fb0 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  E ){.          z
17fc0 41 66 66 5b 6a 5d 20 3d 20 53 51 4c 49 54 45 5f  Aff[j] = SQLITE_
17fd0 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20  AFF_NONE;.      
17fe0 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
17ff0 73 71 6c 69 74 65 33 45 78 70 72 4e 65 65 64 73  sqlite3ExprNeeds
18000 4e 6f 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  NoAffinityChange
18010 28 70 52 69 67 68 74 2c 20 7a 41 66 66 5b 6a 5d  (pRight, zAff[j]
18020 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  ) ){.          z
18030 41 66 66 5b 6a 5d 20 3d 20 53 51 4c 49 54 45 5f  Aff[j] = SQLITE_
18040 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20  AFF_NONE;.      
18050 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
18060 7d 0a 20 20 7d 0a 20 20 2a 70 7a 41 66 66 20 3d  }.  }.  *pzAff =
18070 20 7a 41 66 66 3b 0a 20 20 72 65 74 75 72 6e 20   zAff;.  return 
18080 72 65 67 42 61 73 65 3b 0a 7d 0a 0a 23 69 66 6e  regBase;.}..#ifn
18090 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
180a0 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 54 68  EXPLAIN./*.** Th
180b0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
180c0 68 65 6c 70 65 72 20 66 6f 72 20 65 78 70 6c 61  helper for expla
180d0 69 6e 49 6e 64 65 78 52 61 6e 67 65 28 29 20 62  inIndexRange() b
180e0 65 6c 6f 77 0a 2a 2a 0a 2a 2a 20 70 53 74 72 20  elow.**.** pStr 
180f0 68 6f 6c 64 73 20 74 68 65 20 74 65 78 74 20 6f  holds the text o
18100 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  f an expression 
18110 74 68 61 74 20 77 65 20 61 72 65 20 62 75 69 6c  that we are buil
18120 64 69 6e 67 20 75 70 20 6f 6e 65 20 74 65 72 6d  ding up one term
18130 0a 2a 2a 20 61 74 20 61 20 74 69 6d 65 2e 20 20  .** at a time.  
18140 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 64 64  This routine add
18150 73 20 61 20 6e 65 77 20 74 65 72 6d 20 74 6f 20  s a new term to 
18160 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 65  the end of the e
18170 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 20 54 65  xpression..** Te
18180 72 6d 73 20 61 72 65 20 73 65 70 61 72 61 74 65  rms are separate
18190 64 20 62 79 20 41 4e 44 20 73 6f 20 61 64 64 20  d by AND so add 
181a0 74 68 65 20 22 41 4e 44 22 20 74 65 78 74 20 66  the "AND" text f
181b0 6f 72 20 73 65 63 6f 6e 64 20 61 6e 64 20 73 75  or second and su
181c0 62 73 65 71 75 65 6e 74 0a 2a 2a 20 74 65 72 6d  bsequent.** term
181d0 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69  s only..*/.stati
181e0 63 20 76 6f 69 64 20 65 78 70 6c 61 69 6e 41 70  c void explainAp
181f0 70 65 6e 64 54 65 72 6d 28 0a 20 20 53 74 72 41  pendTerm(.  StrA
18200 63 63 75 6d 20 2a 70 53 74 72 2c 20 20 20 20 20  ccum *pStr,     
18210 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
18220 65 78 74 20 65 78 70 72 65 73 73 69 6f 6e 20 62  ext expression b
18230 65 69 6e 67 20 62 75 69 6c 74 20 2a 2f 0a 20 20  eing built */.  
18240 69 6e 74 20 69 54 65 72 6d 2c 20 20 20 20 20 20  int iTerm,      
18250 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
18260 6e 64 65 78 20 6f 66 20 74 68 69 73 20 74 65 72  ndex of this ter
18270 6d 2e 20 20 46 69 72 73 74 20 69 73 20 7a 65 72  m.  First is zer
18280 6f 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  o */.  const cha
18290 72 20 2a 7a 43 6f 6c 75 6d 6e 2c 20 20 20 20 20  r *zColumn,     
182a0 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
182b0 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63 6f  e column */.  co
182c0 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70 20 20 20  nst char *zOp   
182d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
182e0 65 20 6f 66 20 74 68 65 20 6f 70 65 72 61 74 6f  e of the operato
182f0 72 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 69 54  r */.){.  if( iT
18300 65 72 6d 20 29 20 73 71 6c 69 74 65 33 53 74 72  erm ) sqlite3Str
18310 41 63 63 75 6d 41 70 70 65 6e 64 28 70 53 74 72  AccumAppend(pStr
18320 2c 20 22 20 41 4e 44 20 22 2c 20 35 29 3b 0a 20  , " AND ", 5);. 
18330 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
18340 41 70 70 65 6e 64 41 6c 6c 28 70 53 74 72 2c 20  AppendAll(pStr, 
18350 7a 43 6f 6c 75 6d 6e 29 3b 0a 20 20 73 71 6c 69  zColumn);.  sqli
18360 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e  te3StrAccumAppen
18370 64 28 70 53 74 72 2c 20 7a 4f 70 2c 20 31 29 3b  d(pStr, zOp, 1);
18380 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63  .  sqlite3StrAcc
18390 75 6d 41 70 70 65 6e 64 28 70 53 74 72 2c 20 22  umAppend(pStr, "
183a0 3f 22 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ?", 1);.}../*.**
183b0 20 41 72 67 75 6d 65 6e 74 20 70 4c 65 76 65 6c   Argument pLevel
183c0 20 64 65 73 63 72 69 62 65 73 20 61 20 73 74 72   describes a str
183d0 61 74 65 67 79 20 66 6f 72 20 73 63 61 6e 6e 69  ategy for scanni
183e0 6e 67 20 74 61 62 6c 65 20 70 54 61 62 2e 20 54  ng table pTab. T
183f0 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  his .** function
18400 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74   returns a point
18410 65 72 20 74 6f 20 61 20 73 74 72 69 6e 67 20 62  er to a string b
18420 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  uffer containing
18430 20 61 20 64 65 73 63 72 69 70 74 69 6f 6e 0a 2a   a description.*
18440 2a 20 6f 66 20 74 68 65 20 73 75 62 73 65 74 20  * of the subset 
18450 6f 66 20 74 61 62 6c 65 20 72 6f 77 73 20 73 63  of table rows sc
18460 61 6e 6e 65 64 20 62 79 20 74 68 65 20 73 74 72  anned by the str
18470 61 74 65 67 79 20 69 6e 20 74 68 65 20 66 6f 72  ategy in the for
18480 6d 20 6f 66 20 61 6e 0a 2a 2a 20 53 51 4c 20 65  m of an.** SQL e
18490 78 70 72 65 73 73 69 6f 6e 2e 20 4f 72 2c 20 69  xpression. Or, i
184a0 66 20 61 6c 6c 20 72 6f 77 73 20 61 72 65 20 73  f all rows are s
184b0 63 61 6e 6e 65 64 2c 20 4e 55 4c 4c 20 69 73 20  canned, NULL is 
184c0 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
184d0 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20  For example, if 
184e0 74 68 65 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a  the query:.**.**
184f0 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
18500 20 74 31 20 57 48 45 52 45 20 61 3d 31 20 41 4e   t1 WHERE a=1 AN
18510 44 20 62 3e 32 3b 0a 2a 2a 0a 2a 2a 20 69 73 20  D b>2;.**.** is 
18520 72 75 6e 20 61 6e 64 20 74 68 65 72 65 20 69 73  run and there is
18530 20 61 6e 20 69 6e 64 65 78 20 6f 6e 20 28 61 2c   an index on (a,
18540 20 62 29 2c 20 74 68 65 6e 20 74 68 69 73 20 66   b), then this f
18550 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
18560 61 0a 2a 2a 20 73 74 72 69 6e 67 20 73 69 6d 69  a.** string simi
18570 6c 61 72 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20  lar to:.**.**   
18580 22 61 3d 3f 20 41 4e 44 20 62 3e 3f 22 0a 2a 2a  "a=? AND b>?".**
18590 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64  .** The returned
185a0 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20   pointer points 
185b0 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e  to memory obtain
185c0 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 44  ed from sqlite3D
185d0 62 4d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 49 74  bMalloc()..** It
185e0 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69   is the responsi
185f0 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61  bility of the ca
18600 6c 6c 65 72 20 74 6f 20 66 72 65 65 20 74 68 65  ller to free the
18610 20 62 75 66 66 65 72 20 77 68 65 6e 20 69 74 20   buffer when it 
18620 69 73 0a 2a 2a 20 6e 6f 20 6c 6f 6e 67 65 72 20  is.** no longer 
18630 72 65 71 75 69 72 65 64 2e 0a 2a 2f 0a 73 74 61  required..*/.sta
18640 74 69 63 20 63 68 61 72 20 2a 65 78 70 6c 61 69  tic char *explai
18650 6e 49 6e 64 65 78 52 61 6e 67 65 28 73 71 6c 69  nIndexRange(sqli
18660 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f  te3 *db, WhereLo
18670 6f 70 20 2a 70 4c 6f 6f 70 2c 20 54 61 62 6c 65  op *pLoop, Table
18680 20 2a 70 54 61 62 29 7b 0a 20 20 49 6e 64 65 78   *pTab){.  Index
18690 20 2a 70 49 6e 64 65 78 20 3d 20 70 4c 6f 6f 70   *pIndex = pLoop
186a0 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
186b0 3b 0a 20 20 75 31 36 20 6e 45 71 20 3d 20 70 4c  ;.  u16 nEq = pL
186c0 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  oop->u.btree.nEq
186d0 3b 0a 20 20 75 31 36 20 6e 53 6b 69 70 20 3d 20  ;.  u16 nSkip = 
186e0 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e  pLoop->u.btree.n
186f0 53 6b 69 70 3b 0a 20 20 69 6e 74 20 69 2c 20 6a  Skip;.  int i, j
18700 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f 6c  ;.  Column *aCol
18710 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20   = pTab->aCol;. 
18720 20 69 31 36 20 2a 61 69 43 6f 6c 75 6d 6e 20 3d   i16 *aiColumn =
18730 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d   pIndex->aiColum
18740 6e 3b 0a 20 20 53 74 72 41 63 63 75 6d 20 74 78  n;.  StrAccum tx
18750 74 3b 0a 0a 20 20 69 66 28 20 6e 45 71 3d 3d 30  t;..  if( nEq==0
18760 20 26 26 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c   && (pLoop->wsFl
18770 61 67 73 20 26 20 28 57 48 45 52 45 5f 42 54 4d  ags & (WHERE_BTM
18780 5f 4c 49 4d 49 54 7c 57 48 45 52 45 5f 54 4f 50  _LIMIT|WHERE_TOP
18790 5f 4c 49 4d 49 54 29 29 3d 3d 30 20 29 7b 0a 20  _LIMIT))==0 ){. 
187a0 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
187b0 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63  .  sqlite3StrAcc
187c0 75 6d 49 6e 69 74 28 26 74 78 74 2c 20 30 2c 20  umInit(&txt, 0, 
187d0 30 2c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45  0, SQLITE_MAX_LE
187e0 4e 47 54 48 29 3b 0a 20 20 74 78 74 2e 64 62 20  NGTH);.  txt.db 
187f0 3d 20 64 62 3b 0a 20 20 73 71 6c 69 74 65 33 53  = db;.  sqlite3S
18800 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 26 74  trAccumAppend(&t
18810 78 74 2c 20 22 20 28 22 2c 20 32 29 3b 0a 20 20  xt, " (", 2);.  
18820 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 71 3b 20  for(i=0; i<nEq; 
18830 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  i++){.    char *
18840 7a 20 3d 20 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20  z = aiColumn[i] 
18850 3c 20 30 20 3f 20 22 72 6f 77 69 64 22 20 3a 20  < 0 ? "rowid" : 
18860 61 43 6f 6c 5b 61 69 43 6f 6c 75 6d 6e 5b 69 5d  aCol[aiColumn[i]
18870 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28  ].zName;.    if(
18880 20 69 3e 3d 6e 53 6b 69 70 20 29 7b 0a 20 20 20   i>=nSkip ){.   
18890 20 20 20 65 78 70 6c 61 69 6e 41 70 70 65 6e 64     explainAppend
188a0 54 65 72 6d 28 26 74 78 74 2c 20 69 2c 20 7a 2c  Term(&txt, i, z,
188b0 20 22 3d 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65   "=");.    }else
188c0 7b 0a 20 20 20 20 20 20 69 66 28 20 69 20 29 20  {.      if( i ) 
188d0 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41  sqlite3StrAccumA
188e0 70 70 65 6e 64 28 26 74 78 74 2c 20 22 20 41 4e  ppend(&txt, " AN
188f0 44 20 22 2c 20 35 29 3b 0a 20 20 20 20 20 20 73  D ", 5);.      s
18900 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70  qlite3StrAccumAp
18910 70 65 6e 64 28 26 74 78 74 2c 20 22 41 4e 59 28  pend(&txt, "ANY(
18920 22 2c 20 34 29 3b 0a 20 20 20 20 20 20 73 71 6c  ", 4);.      sql
18930 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65  ite3StrAccumAppe
18940 6e 64 41 6c 6c 28 26 74 78 74 2c 20 7a 29 3b 0a  ndAll(&txt, z);.
18950 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 74 72        sqlite3Str
18960 41 63 63 75 6d 41 70 70 65 6e 64 28 26 74 78 74  AccumAppend(&txt
18970 2c 20 22 29 22 2c 20 31 29 3b 0a 20 20 20 20 7d  , ")", 1);.    }
18980 0a 20 20 7d 0a 0a 20 20 6a 20 3d 20 69 3b 0a 20  .  }..  j = i;. 
18990 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c   if( pLoop->wsFl
189a0 61 67 73 26 57 48 45 52 45 5f 42 54 4d 5f 4c 49  ags&WHERE_BTM_LI
189b0 4d 49 54 20 29 7b 0a 20 20 20 20 63 68 61 72 20  MIT ){.    char 
189c0 2a 7a 20 3d 20 61 69 43 6f 6c 75 6d 6e 5b 6a 5d  *z = aiColumn[j]
189d0 20 3c 20 30 20 3f 20 22 72 6f 77 69 64 22 20 3a   < 0 ? "rowid" :
189e0 20 61 43 6f 6c 5b 61 69 43 6f 6c 75 6d 6e 5b 6a   aCol[aiColumn[j
189f0 5d 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 65 78  ]].zName;.    ex
18a00 70 6c 61 69 6e 41 70 70 65 6e 64 54 65 72 6d 28  plainAppendTerm(
18a10 26 74 78 74 2c 20 69 2b 2b 2c 20 7a 2c 20 22 3e  &txt, i++, z, ">
18a20 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c  ");.  }.  if( pL
18a30 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 26 57 48 45  oop->wsFlags&WHE
18a40 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20 29 7b 0a  RE_TOP_LIMIT ){.
18a50 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 61 69      char *z = ai
18a60 43 6f 6c 75 6d 6e 5b 6a 5d 20 3c 20 30 20 3f 20  Column[j] < 0 ? 
18a70 22 72 6f 77 69 64 22 20 3a 20 61 43 6f 6c 5b 61  "rowid" : aCol[a
18a80 69 43 6f 6c 75 6d 6e 5b 6a 5d 5d 2e 7a 4e 61 6d  iColumn[j]].zNam
18a90 65 3b 0a 20 20 20 20 65 78 70 6c 61 69 6e 41 70  e;.    explainAp
18aa0 70 65 6e 64 54 65 72 6d 28 26 74 78 74 2c 20 69  pendTerm(&txt, i
18ab0 2c 20 7a 2c 20 22 3c 22 29 3b 0a 20 20 7d 0a 20  , z, "<");.  }. 
18ac0 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
18ad0 41 70 70 65 6e 64 28 26 74 78 74 2c 20 22 29 22  Append(&txt, ")"
18ae0 2c 20 31 29 3b 0a 20 20 72 65 74 75 72 6e 20 73  , 1);.  return s
18af0 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 46 69  qlite3StrAccumFi
18b00 6e 69 73 68 28 26 74 78 74 29 3b 0a 7d 0a 0a 2f  nish(&txt);.}../
18b10 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
18b20 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20 75 6e  on is a no-op un
18b30 6c 65 73 73 20 63 75 72 72 65 6e 74 6c 79 20 70  less currently p
18b40 72 6f 63 65 73 73 69 6e 67 20 61 6e 20 45 58 50  rocessing an EXP
18b50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 0a  LAIN QUERY PLAN.
18b60 2a 2a 20 63 6f 6d 6d 61 6e 64 2e 20 49 66 20 74  ** command. If t
18b70 68 65 20 71 75 65 72 79 20 62 65 69 6e 67 20 63  he query being c
18b80 6f 6d 70 69 6c 65 64 20 69 73 20 61 6e 20 45 58  ompiled is an EX
18b90 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e  PLAIN QUERY PLAN
18ba0 2c 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20 72 65  , a single.** re
18bb0 63 6f 72 64 20 69 73 20 61 64 64 65 64 20 74 6f  cord is added to
18bc0 20 74 68 65 20 6f 75 74 70 75 74 20 74 6f 20 64   the output to d
18bd0 65 73 63 72 69 62 65 20 74 68 65 20 74 61 62 6c  escribe the tabl
18be0 65 20 73 63 61 6e 20 73 74 72 61 74 65 67 79 20  e scan strategy 
18bf0 69 6e 20 0a 2a 2a 20 70 4c 65 76 65 6c 2e 0a 2a  in .** pLevel..*
18c00 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78  /.static void ex
18c10 70 6c 61 69 6e 4f 6e 65 53 63 61 6e 28 0a 20 20  plainOneScan(.  
18c20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
18c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18c40 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74  /* Parse context
18c50 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
18c60 54 61 62 4c 69 73 74 2c 20 20 20 20 20 20 20 20  TabList,        
18c70 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 6c        /* Table l
18c80 69 73 74 20 74 68 69 73 20 6c 6f 6f 70 20 72 65  ist this loop re
18c90 66 65 72 73 20 74 6f 20 2a 2f 0a 20 20 57 68 65  fers to */.  Whe
18ca0 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c  reLevel *pLevel,
18cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18cc0 53 63 61 6e 20 74 6f 20 77 72 69 74 65 20 4f 50  Scan to write OP
18cd0 5f 45 78 70 6c 61 69 6e 20 6f 70 63 6f 64 65 20  _Explain opcode 
18ce0 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65  for */.  int iLe
18cf0 76 65 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  vel,            
18d00 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75           /* Valu
18d10 65 20 66 6f 72 20 22 6c 65 76 65 6c 22 20 63 6f  e for "level" co
18d20 6c 75 6d 6e 20 6f 66 20 6f 75 74 70 75 74 20 2a  lumn of output *
18d30 2f 0a 20 20 69 6e 74 20 69 46 72 6f 6d 2c 20 20  /.  int iFrom,  
18d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18d50 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 66 6f 72      /* Value for
18d60 20 22 66 72 6f 6d 22 20 63 6f 6c 75 6d 6e 20 6f   "from" column o
18d70 66 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 75 31  f output */.  u1
18d80 36 20 77 63 74 72 6c 46 6c 61 67 73 20 20 20 20  6 wctrlFlags    
18d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18da0 20 46 6c 61 67 73 20 70 61 73 73 65 64 20 74 6f   Flags passed to
18db0 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
18dc0 69 6e 28 29 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64  in() */.){.#ifnd
18dd0 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
18de0 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78    if( pParse->ex
18df0 70 6c 61 69 6e 3d 3d 32 20 29 0a 23 65 6e 64 69  plain==2 ).#endi
18e00 66 0a 20 20 7b 0a 20 20 20 20 73 74 72 75 63 74  f.  {.    struct
18e10 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
18e20 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74  Item = &pTabList
18e30 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f  ->a[pLevel->iFro
18e40 6d 5d 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 20  m];.    Vdbe *v 
18e50 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
18e60 20 20 20 20 20 20 2f 2a 20 56 4d 20 62 65 69 6e        /* VM bein
18e70 67 20 63 6f 6e 73 74 72 75 63 74 65 64 20 2a 2f  g constructed */
18e80 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62  .    sqlite3 *db
18e90 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20   = pParse->db;  
18ea0 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68     /* Database h
18eb0 61 6e 64 6c 65 20 2a 2f 0a 20 20 20 20 63 68 61  andle */.    cha
18ec0 72 20 2a 7a 4d 73 67 3b 20 20 20 20 20 20 20 20  r *zMsg;        
18ed0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
18ee0 78 74 20 74 6f 20 61 64 64 20 74 6f 20 45 51 50  xt to add to EQP
18ef0 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 20 20 69   output */.    i
18f00 6e 74 20 69 49 64 20 3d 20 70 50 61 72 73 65 2d  nt iId = pParse-
18f10 3e 69 53 65 6c 65 63 74 49 64 3b 20 20 2f 2a 20  >iSelectId;  /* 
18f20 53 65 6c 65 63 74 20 69 64 20 28 6c 65 66 74 2d  Select id (left-
18f30 6d 6f 73 74 20 6f 75 74 70 75 74 20 63 6f 6c 75  most output colu
18f40 6d 6e 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  mn) */.    int i
18f50 73 53 65 61 72 63 68 3b 20 20 20 20 20 20 20 20  sSearch;        
18f60 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
18f70 20 66 6f 72 20 61 20 53 45 41 52 43 48 2e 20 46   for a SEARCH. F
18f80 61 6c 73 65 20 66 6f 72 20 53 43 41 4e 2e 20 2a  alse for SCAN. *
18f90 2f 0a 20 20 20 20 57 68 65 72 65 4c 6f 6f 70 20  /.    WhereLoop 
18fa0 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20  *pLoop;         
18fb0 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 74 72      /* The contr
18fc0 6f 6c 6c 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70  olling WhereLoop
18fd0 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20 75   object */.    u
18fe0 33 32 20 66 6c 61 67 73 3b 20 20 20 20 20 20 20  32 flags;       
18ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19000 46 6c 61 67 73 20 74 68 61 74 20 64 65 73 63 72  Flags that descr
19010 69 62 65 20 74 68 69 73 20 6c 6f 6f 70 20 2a 2f  ibe this loop */
19020 0a 0a 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70 4c  ..    pLoop = pL
19030 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20  evel->pWLoop;.  
19040 20 20 66 6c 61 67 73 20 3d 20 70 4c 6f 6f 70 2d    flags = pLoop-
19050 3e 77 73 46 6c 61 67 73 3b 0a 20 20 20 20 69 66  >wsFlags;.    if
19060 28 20 28 66 6c 61 67 73 26 57 48 45 52 45 5f 4d  ( (flags&WHERE_M
19070 55 4c 54 49 5f 4f 52 29 20 7c 7c 20 28 77 63 74  ULTI_OR) || (wct
19080 72 6c 46 6c 61 67 73 26 57 48 45 52 45 5f 4f 4e  rlFlags&WHERE_ON
19090 45 54 41 42 4c 45 5f 4f 4e 4c 59 29 20 29 20 72  ETABLE_ONLY) ) r
190a0 65 74 75 72 6e 3b 0a 0a 20 20 20 20 69 73 53 65  eturn;..    isSe
190b0 61 72 63 68 20 3d 20 28 66 6c 61 67 73 26 28 57  arch = (flags&(W
190c0 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 7c 57  HERE_BTM_LIMIT|W
190d0 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 29  HERE_TOP_LIMIT))
190e0 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20  !=0.            
190f0 7c 7c 20 28 28 66 6c 61 67 73 26 57 48 45 52 45  || ((flags&WHERE
19100 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d  _VIRTUALTABLE)==
19110 30 20 26 26 20 28 70 4c 6f 6f 70 2d 3e 75 2e 62  0 && (pLoop->u.b
19120 74 72 65 65 2e 6e 45 71 3e 30 29 29 0a 20 20 20  tree.nEq>0)).   
19130 20 20 20 20 20 20 20 20 20 7c 7c 20 28 77 63 74           || (wct
19140 72 6c 46 6c 61 67 73 26 28 57 48 45 52 45 5f 4f  rlFlags&(WHERE_O
19150 52 44 45 52 42 59 5f 4d 49 4e 7c 57 48 45 52 45  RDERBY_MIN|WHERE
19160 5f 4f 52 44 45 52 42 59 5f 4d 41 58 29 29 3b 0a  _ORDERBY_MAX));.
19170 0a 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69  .    zMsg = sqli
19180 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
19190 25 73 22 2c 20 69 73 53 65 61 72 63 68 3f 22 53  %s", isSearch?"S
191a0 45 41 52 43 48 22 3a 22 53 43 41 4e 22 29 3b 0a  EARCH":"SCAN");.
191b0 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 70      if( pItem->p
191c0 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Select ){.      
191d0 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41  zMsg = sqlite3MA
191e0 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c  ppendf(db, zMsg,
191f0 20 22 25 73 20 53 55 42 51 55 45 52 59 20 25 64   "%s SUBQUERY %d
19200 22 2c 20 7a 4d 73 67 2c 70 49 74 65 6d 2d 3e 69  ", zMsg,pItem->i
19210 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 7d  SelectId);.    }
19220 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 4d 73 67  else{.      zMsg
19230 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e   = sqlite3MAppen
19240 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73  df(db, zMsg, "%s
19250 20 54 41 42 4c 45 20 25 73 22 2c 20 7a 4d 73 67   TABLE %s", zMsg
19260 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b  , pItem->zName);
19270 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
19280 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 29 7b  pItem->zAlias ){
19290 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71  .      zMsg = sq
192a0 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62  lite3MAppendf(db
192b0 2c 20 7a 4d 73 67 2c 20 22 25 73 20 41 53 20 25  , zMsg, "%s AS %
192c0 73 22 2c 20 7a 4d 73 67 2c 20 70 49 74 65 6d 2d  s", zMsg, pItem-
192d0 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 7d 0a  >zAlias);.    }.
192e0 20 20 20 20 69 66 28 20 28 66 6c 61 67 73 20 26      if( (flags &
192f0 20 28 57 48 45 52 45 5f 49 50 4b 7c 57 48 45 52   (WHERE_IPK|WHER
19300 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 29  E_VIRTUALTABLE))
19310 3d 3d 30 0a 20 20 20 20 20 26 26 20 41 4c 57 41  ==0.     && ALWA
19320 59 53 28 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65  YS(pLoop->u.btre
19330 65 2e 70 49 6e 64 65 78 21 3d 30 29 0a 20 20 20  e.pIndex!=0).   
19340 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   ){.      const 
19350 63 68 61 72 20 2a 7a 46 6d 74 3b 0a 20 20 20 20  char *zFmt;.    
19360 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 3d 20    Index *pIdx = 
19370 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70  pLoop->u.btree.p
19380 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 63 68 61  Index;.      cha
19390 72 20 2a 7a 57 68 65 72 65 20 3d 20 65 78 70 6c  r *zWhere = expl
193a0 61 69 6e 49 6e 64 65 78 52 61 6e 67 65 28 64 62  ainIndexRange(db
193b0 2c 20 70 4c 6f 6f 70 2c 20 70 49 74 65 6d 2d 3e  , pLoop, pItem->
193c0 70 54 61 62 29 3b 0a 20 20 20 20 20 20 61 73 73  pTab);.      ass
193d0 65 72 74 28 20 21 28 66 6c 61 67 73 26 57 48 45  ert( !(flags&WHE
193e0 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 20 7c  RE_AUTO_INDEX) |
193f0 7c 20 28 66 6c 61 67 73 26 57 48 45 52 45 5f 49  | (flags&WHERE_I
19400 44 58 5f 4f 4e 4c 59 29 20 29 3b 0a 20 20 20 20  DX_ONLY) );.    
19410 20 20 69 66 28 20 21 48 61 73 52 6f 77 69 64 28    if( !HasRowid(
19420 70 49 74 65 6d 2d 3e 70 54 61 62 29 20 26 26 20  pItem->pTab) && 
19430 49 73 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65  IsPrimaryKeyInde
19440 78 28 70 49 64 78 29 20 29 7b 0a 20 20 20 20 20  x(pIdx) ){.     
19450 20 20 20 7a 46 6d 74 20 3d 20 7a 57 68 65 72 65     zFmt = zWhere
19460 20 3f 20 22 25 73 20 55 53 49 4e 47 20 50 52 49   ? "%s USING PRI
19470 4d 41 52 59 20 4b 45 59 25 2e 30 73 25 73 22 20  MARY KEY%.0s%s" 
19480 3a 20 22 25 73 25 2e 30 73 25 73 22 3b 0a 20 20  : "%s%.0s%s";.  
19490 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c      }else if( fl
194a0 61 67 73 20 26 20 57 48 45 52 45 5f 41 55 54 4f  ags & WHERE_AUTO
194b0 5f 49 4e 44 45 58 20 29 7b 0a 20 20 20 20 20 20  _INDEX ){.      
194c0 20 20 7a 46 6d 74 20 3d 20 22 25 73 20 55 53 49    zFmt = "%s USI
194d0 4e 47 20 41 55 54 4f 4d 41 54 49 43 20 43 4f 56  NG AUTOMATIC COV
194e0 45 52 49 4e 47 20 49 4e 44 45 58 25 2e 30 73 25  ERING INDEX%.0s%
194f0 73 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  s";.      }else 
19500 69 66 28 20 66 6c 61 67 73 20 26 20 57 48 45 52  if( flags & WHER
19510 45 5f 49 44 58 5f 4f 4e 4c 59 20 29 7b 0a 20 20  E_IDX_ONLY ){.  
19520 20 20 20 20 20 20 7a 46 6d 74 20 3d 20 22 25 73        zFmt = "%s
19530 20 55 53 49 4e 47 20 43 4f 56 45 52 49 4e 47 20   USING COVERING 
19540 49 4e 44 45 58 20 25 73 25 73 22 3b 0a 20 20 20  INDEX %s%s";.   
19550 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
19560 20 20 7a 46 6d 74 20 3d 20 22 25 73 20 55 53 49    zFmt = "%s USI
19570 4e 47 20 49 4e 44 45 58 20 25 73 25 73 22 3b 0a  NG INDEX %s%s";.
19580 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 4d        }.      zM
19590 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70  sg = sqlite3MApp
195a0 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 7a  endf(db, zMsg, z
195b0 46 6d 74 2c 20 7a 4d 73 67 2c 20 70 49 64 78 2d  Fmt, zMsg, pIdx-
195c0 3e 7a 4e 61 6d 65 2c 20 7a 57 68 65 72 65 29 3b  >zName, zWhere);
195d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
195e0 46 72 65 65 28 64 62 2c 20 7a 57 68 65 72 65 29  Free(db, zWhere)
195f0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
19600 28 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  (flags & WHERE_I
19610 50 4b 29 21 3d 30 20 26 26 20 28 66 6c 61 67 73  PK)!=0 && (flags
19620 20 26 20 57 48 45 52 45 5f 43 4f 4e 53 54 52 41   & WHERE_CONSTRA
19630 49 4e 54 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  INT)!=0 ){.     
19640 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d   zMsg = sqlite3M
19650 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67  Appendf(db, zMsg
19660 2c 20 22 25 73 20 55 53 49 4e 47 20 49 4e 54 45  , "%s USING INTE
19670 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 22  GER PRIMARY KEY"
19680 2c 20 7a 4d 73 67 29 3b 0a 0a 20 20 20 20 20 20  , zMsg);..      
19690 69 66 28 20 66 6c 61 67 73 26 28 57 48 45 52 45  if( flags&(WHERE
196a0 5f 43 4f 4c 55 4d 4e 5f 45 51 7c 57 48 45 52 45  _COLUMN_EQ|WHERE
196b0 5f 43 4f 4c 55 4d 4e 5f 49 4e 29 20 29 7b 0a 20  _COLUMN_IN) ){. 
196c0 20 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71         zMsg = sq
196d0 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62  lite3MAppendf(db
196e0 2c 20 7a 4d 73 67 2c 20 22 25 73 20 28 72 6f 77  , zMsg, "%s (row
196f0 69 64 3d 3f 29 22 2c 20 7a 4d 73 67 29 3b 0a 20  id=?)", zMsg);. 
19700 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28       }else if( (
19710 66 6c 61 67 73 26 57 48 45 52 45 5f 42 4f 54 48  flags&WHERE_BOTH
19720 5f 4c 49 4d 49 54 29 3d 3d 57 48 45 52 45 5f 42  _LIMIT)==WHERE_B
19730 4f 54 48 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20  OTH_LIMIT ){.   
19740 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69       zMsg = sqli
19750 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20  te3MAppendf(db, 
19760 7a 4d 73 67 2c 20 22 25 73 20 28 72 6f 77 69 64  zMsg, "%s (rowid
19770 3e 3f 20 41 4e 44 20 72 6f 77 69 64 3c 3f 29 22  >? AND rowid<?)"
19780 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20 20 20 7d  , zMsg);.      }
19790 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73 26 57  else if( flags&W
197a0 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29  HERE_BTM_LIMIT )
197b0 7b 0a 20 20 20 20 20 20 20 20 7a 4d 73 67 20 3d  {.        zMsg =
197c0 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66   sqlite3MAppendf
197d0 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 28  (db, zMsg, "%s (
197e0 72 6f 77 69 64 3e 3f 29 22 2c 20 7a 4d 73 67 29  rowid>?)", zMsg)
197f0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
19800 28 20 41 4c 57 41 59 53 28 66 6c 61 67 73 26 57  ( ALWAYS(flags&W
19810 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 20  HERE_TOP_LIMIT) 
19820 29 7b 0a 20 20 20 20 20 20 20 20 7a 4d 73 67 20  ){.        zMsg 
19830 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64  = sqlite3MAppend
19840 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20  f(db, zMsg, "%s 
19850 28 72 6f 77 69 64 3c 3f 29 22 2c 20 7a 4d 73 67  (rowid<?)", zMsg
19860 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
19870 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
19880 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
19890 45 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20 28  E.    else if( (
198a0 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49  flags & WHERE_VI
198b0 52 54 55 41 4c 54 41 42 4c 45 29 21 3d 30 20 29  RTUALTABLE)!=0 )
198c0 7b 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73  {.      zMsg = s
198d0 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64  qlite3MAppendf(d
198e0 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 56 49 52  b, zMsg, "%s VIR
198f0 54 55 41 4c 20 54 41 42 4c 45 20 49 4e 44 45 58  TUAL TABLE INDEX
19900 20 25 64 3a 25 73 22 2c 20 7a 4d 73 67 2c 0a 20   %d:%s", zMsg,. 
19910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19920 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 69   pLoop->u.vtab.i
19930 64 78 4e 75 6d 2c 20 70 4c 6f 6f 70 2d 3e 75 2e  dxNum, pLoop->u.
19940 76 74 61 62 2e 69 64 78 53 74 72 29 3b 0a 20 20  vtab.idxStr);.  
19950 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7a    }.#endif.    z
19960 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70  Msg = sqlite3MAp
19970 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20  pendf(db, zMsg, 
19980 22 25 73 22 2c 20 7a 4d 73 67 29 3b 0a 20 20 20  "%s", zMsg);.   
19990 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
199a0 70 34 28 76 2c 20 4f 50 5f 45 78 70 6c 61 69 6e  p4(v, OP_Explain
199b0 2c 20 69 49 64 2c 20 69 4c 65 76 65 6c 2c 20 69  , iId, iLevel, i
199c0 46 72 6f 6d 2c 20 7a 4d 73 67 2c 20 50 34 5f 44  From, zMsg, P4_D
199d0 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 7d 0a 23  YNAMIC);.  }.}.#
199e0 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 65 78  else.# define ex
199f0 70 6c 61 69 6e 4f 6e 65 53 63 61 6e 28 75 2c 76  plainOneScan(u,v
19a00 2c 77 2c 78 2c 79 2c 7a 29 0a 23 65 6e 64 69 66  ,w,x,y,z).#endif
19a10 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
19a20 45 58 50 4c 41 49 4e 20 2a 2f 0a 0a 0a 2f 2a 0a  EXPLAIN */.../*.
19a30 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
19a40 20 66 6f 72 20 74 68 65 20 73 74 61 72 74 20 6f   for the start o
19a50 66 20 74 68 65 20 69 4c 65 76 65 6c 2d 74 68 20  f the iLevel-th 
19a60 6c 6f 6f 70 20 69 6e 20 74 68 65 20 57 48 45 52  loop in the WHER
19a70 45 20 63 6c 61 75 73 65 0a 2a 2a 20 69 6d 70 6c  E clause.** impl
19a80 65 6d 65 6e 74 61 74 69 6f 6e 20 64 65 73 63 72  ementation descr
19a90 69 62 65 64 20 62 79 20 70 57 49 6e 66 6f 2e 0a  ibed by pWInfo..
19aa0 2a 2f 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73  */.static Bitmas
19ab0 6b 20 63 6f 64 65 4f 6e 65 4c 6f 6f 70 53 74 61  k codeOneLoopSta
19ac0 72 74 28 0a 20 20 57 68 65 72 65 49 6e 66 6f 20  rt(.  WhereInfo 
19ad0 2a 70 57 49 6e 66 6f 2c 20 20 20 2f 2a 20 43 6f  *pWInfo,   /* Co
19ae0 6d 70 6c 65 74 65 20 69 6e 66 6f 72 6d 61 74 69  mplete informati
19af0 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 57 48 45  on about the WHE
19b00 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69  RE clause */.  i
19b10 6e 74 20 69 4c 65 76 65 6c 2c 20 20 20 20 20 20  nt iLevel,      
19b20 20 20 20 20 2f 2a 20 57 68 69 63 68 20 6c 65 76      /* Which lev
19b30 65 6c 20 6f 66 20 70 57 49 6e 66 6f 2d 3e 61 5b  el of pWInfo->a[
19b40 5d 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 64 65  ] should be code
19b50 64 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e  d */.  Bitmask n
19b60 6f 74 52 65 61 64 79 20 20 20 20 20 2f 2a 20 57  otReady     /* W
19b70 68 69 63 68 20 74 61 62 6c 65 73 20 61 72 65 20  hich tables are 
19b80 63 75 72 72 65 6e 74 6c 79 20 61 76 61 69 6c 61  currently availa
19b90 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ble */.){.  int 
19ba0 6a 2c 20 6b 3b 20 20 20 20 20 20 20 20 20 20 20  j, k;           
19bb0 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
19bc0 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 3b  s */.  int iCur;
19bd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
19be0 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 66  he VDBE cursor f
19bf0 6f 72 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a  or the table */.
19c00 20 20 69 6e 74 20 61 64 64 72 4e 78 74 3b 20 20    int addrNxt;  
19c10 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20         /* Where 
19c20 74 6f 20 6a 75 6d 70 20 74 6f 20 63 6f 6e 74 69  to jump to conti
19c30 6e 75 65 20 77 69 74 68 20 74 68 65 20 6e 65 78  nue with the nex
19c40 74 20 49 4e 20 63 61 73 65 20 2a 2f 0a 20 20 69  t IN case */.  i
19c50 6e 74 20 6f 6d 69 74 54 61 62 6c 65 3b 20 20 20  nt omitTable;   
19c60 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 77      /* True if w
19c70 65 20 75 73 65 20 74 68 65 20 69 6e 64 65 78 20  e use the index 
19c80 6f 6e 6c 79 20 2a 2f 0a 20 20 69 6e 74 20 62 52  only */.  int bR
19c90 65 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ev;            /
19ca0 2a 20 54 72 75 65 20 69 66 20 77 65 20 6e 65 65  * True if we nee
19cb0 64 20 74 6f 20 73 63 61 6e 20 69 6e 20 72 65 76  d to scan in rev
19cc0 65 72 73 65 20 6f 72 64 65 72 20 2a 2f 0a 20 20  erse order */.  
19cd0 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76  WhereLevel *pLev
19ce0 65 6c 3b 20 20 2f 2a 20 54 68 65 20 77 68 65 72  el;  /* The wher
19cf0 65 20 6c 65 76 65 6c 20 74 6f 20 62 65 20 63 6f  e level to be co
19d00 64 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f  ded */.  WhereLo
19d10 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 2f 2a  op *pLoop;    /*
19d20 20 54 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f   The WhereLoop o
19d30 62 6a 65 63 74 20 62 65 69 6e 67 20 63 6f 64 65  bject being code
19d40 64 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75  d */.  WhereClau
19d50 73 65 20 2a 70 57 43 3b 20 20 20 20 2f 2a 20 44  se *pWC;    /* D
19d60 65 63 6f 6d 70 6f 73 69 74 69 6f 6e 20 6f 66 20  ecomposition of 
19d70 74 68 65 20 65 6e 74 69 72 65 20 57 48 45 52 45  the entire WHERE
19d80 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65   clause */.  Whe
19d90 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20  reTerm *pTerm;  
19da0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19db0 41 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  A WHERE clause t
19dc0 65 72 6d 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a  erm */.  Parse *
19dd0 70 50 61 72 73 65 3b 20 20 20 20 20 20 20 20 20  pParse;         
19de0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
19df0 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
19e00 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20   sqlite3 *db;   
19e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19e20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
19e30 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 56 64 62  nection */.  Vdb
19e40 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20  e *v;           
19e50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19e60 54 68 65 20 70 72 65 70 61 72 65 64 20 73 74 6d  The prepared stm
19e70 74 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  t under construc
19e80 74 69 6f 6e 73 20 2a 2f 0a 20 20 73 74 72 75 63  tions */.  struc
19e90 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
19ea0 70 54 61 62 49 74 65 6d 3b 20 20 2f 2a 20 46 52  pTabItem;  /* FR
19eb0 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20 62  OM clause term b
19ec0 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20  eing coded */.  
19ed0 69 6e 74 20 61 64 64 72 42 72 6b 3b 20 20 20 20  int addrBrk;    
19ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19ef0 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20  /* Jump here to 
19f00 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 74 68 65  break out of the
19f10 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61   loop */.  int a
19f20 64 64 72 43 6f 6e 74 3b 20 20 20 20 20 20 20 20  ddrCont;        
19f30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75             /* Ju
19f40 6d 70 20 68 65 72 65 20 74 6f 20 63 6f 6e 74 69  mp here to conti
19f50 6e 75 65 20 77 69 74 68 20 6e 65 78 74 20 63 79  nue with next cy
19f60 63 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 6f  cle */.  int iRo
19f70 77 69 64 52 65 67 20 3d 20 30 3b 20 20 20 20 20  widReg = 0;     
19f80 20 20 20 2f 2a 20 52 6f 77 69 64 20 69 73 20 73     /* Rowid is s
19f90 74 6f 72 65 64 20 69 6e 20 74 68 69 73 20 72 65  tored in this re
19fa0 67 69 73 74 65 72 2c 20 69 66 20 6e 6f 74 20 7a  gister, if not z
19fb0 65 72 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65  ero */.  int iRe
19fc0 6c 65 61 73 65 52 65 67 20 3d 20 30 3b 20 20 20  leaseReg = 0;   
19fd0 20 20 20 2f 2a 20 54 65 6d 70 20 72 65 67 69 73     /* Temp regis
19fe0 74 65 72 20 74 6f 20 66 72 65 65 20 62 65 66 6f  ter to free befo
19ff0 72 65 20 72 65 74 75 72 6e 69 6e 67 20 2a 2f 0a  re returning */.
1a000 0a 20 20 70 50 61 72 73 65 20 3d 20 70 57 49 6e  .  pParse = pWIn
1a010 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20 76 20  fo->pParse;.  v 
1a020 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
1a030 0a 20 20 70 57 43 20 3d 20 26 70 57 49 6e 66 6f  .  pWC = &pWInfo
1a040 2d 3e 73 57 43 3b 0a 20 20 64 62 20 3d 20 70 50  ->sWC;.  db = pP
1a050 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 4c 65 76  arse->db;.  pLev
1a060 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b  el = &pWInfo->a[
1a070 69 4c 65 76 65 6c 5d 3b 0a 20 20 70 4c 6f 6f 70  iLevel];.  pLoop
1a080 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f   = pLevel->pWLoo
1a090 70 3b 0a 20 20 70 54 61 62 49 74 65 6d 20 3d 20  p;.  pTabItem = 
1a0a0 26 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73  &pWInfo->pTabLis
1a0b0 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72  t->a[pLevel->iFr
1a0c0 6f 6d 5d 3b 0a 20 20 69 43 75 72 20 3d 20 70 54  om];.  iCur = pT
1a0d0 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b  abItem->iCursor;
1a0e0 0a 20 20 70 4c 65 76 65 6c 2d 3e 6e 6f 74 52 65  .  pLevel->notRe
1a0f0 61 64 79 20 3d 20 6e 6f 74 52 65 61 64 79 20 26  ady = notReady &
1a100 20 7e 67 65 74 4d 61 73 6b 28 26 70 57 49 6e 66   ~getMask(&pWInf
1a110 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 69 43 75  o->sMaskSet, iCu
1a120 72 29 3b 0a 20 20 62 52 65 76 20 3d 20 28 70 57  r);.  bRev = (pW
1a130 49 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b 3e 3e 69  Info->revMask>>i
1a140 4c 65 76 65 6c 29 26 31 3b 0a 20 20 6f 6d 69 74  Level)&1;.  omit
1a150 54 61 62 6c 65 20 3d 20 28 70 4c 6f 6f 70 2d 3e  Table = (pLoop->
1a160 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
1a170 49 44 58 5f 4f 4e 4c 59 29 21 3d 30 20 0a 20 20  IDX_ONLY)!=0 .  
1a180 20 20 20 20 20 20 20 20 20 26 26 20 28 70 57 49           && (pWI
1a190 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
1a1a0 26 20 57 48 45 52 45 5f 46 4f 52 43 45 5f 54 41  & WHERE_FORCE_TA
1a1b0 42 4c 45 29 3d 3d 30 3b 0a 20 20 56 64 62 65 4d  BLE)==0;.  VdbeM
1a1c0 6f 64 75 6c 65 43 6f 6d 6d 65 6e 74 28 28 76 2c  oduleComment((v,
1a1d0 20 22 42 65 67 69 6e 20 57 48 45 52 45 2d 6c 6f   "Begin WHERE-lo
1a1e0 6f 70 25 64 3a 20 25 73 22 2c 69 4c 65 76 65 6c  op%d: %s",iLevel
1a1f0 2c 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 2d  ,pTabItem->pTab-
1a200 3e 7a 4e 61 6d 65 29 29 3b 0a 0a 20 20 2f 2a 20  >zName));..  /* 
1a210 43 72 65 61 74 65 20 6c 61 62 65 6c 73 20 66 6f  Create labels fo
1a220 72 20 74 68 65 20 22 62 72 65 61 6b 22 20 61 6e  r the "break" an
1a230 64 20 22 63 6f 6e 74 69 6e 75 65 22 20 69 6e 73  d "continue" ins
1a240 74 72 75 63 74 69 6f 6e 73 0a 20 20 2a 2a 20 66  tructions.  ** f
1a250 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  or the current l
1a260 6f 6f 70 2e 20 20 4a 75 6d 70 20 74 6f 20 61 64  oop.  Jump to ad
1a270 64 72 42 72 6b 20 74 6f 20 62 72 65 61 6b 20 6f  drBrk to break o
1a280 75 74 20 6f 66 20 61 20 6c 6f 6f 70 2e 0a 20 20  ut of a loop..  
1a290 2a 2a 20 4a 75 6d 70 20 74 6f 20 63 6f 6e 74 20  ** Jump to cont 
1a2a0 74 6f 20 67 6f 20 69 6d 6d 65 64 69 61 74 65 6c  to go immediatel
1a2b0 79 20 74 6f 20 74 68 65 20 6e 65 78 74 20 69 74  y to the next it
1a2c0 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a 20  eration of the. 
1a2d0 20 2a 2a 20 6c 6f 6f 70 2e 0a 20 20 2a 2a 0a 20   ** loop..  **. 
1a2e0 20 2a 2a 20 57 68 65 6e 20 74 68 65 72 65 20 69   ** When there i
1a2f0 73 20 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72  s an IN operator
1a300 2c 20 77 65 20 61 6c 73 6f 20 68 61 76 65 20 61  , we also have a
1a310 20 22 61 64 64 72 4e 78 74 22 20 6c 61 62 65 6c   "addrNxt" label
1a320 20 74 68 61 74 0a 20 20 2a 2a 20 6d 65 61 6e 73   that.  ** means
1a330 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69 74   to continue wit
1a340 68 20 74 68 65 20 6e 65 78 74 20 49 4e 20 76 61  h the next IN va
1a350 6c 75 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 2e  lue combination.
1a360 20 20 57 68 65 6e 0a 20 20 2a 2a 20 74 68 65 72    When.  ** ther
1a370 65 20 61 72 65 20 6e 6f 20 49 4e 20 6f 70 65 72  e are no IN oper
1a380 61 74 6f 72 73 20 69 6e 20 74 68 65 20 63 6f 6e  ators in the con
1a390 73 74 72 61 69 6e 74 73 2c 20 74 68 65 20 22 61  straints, the "a
1a3a0 64 64 72 4e 78 74 22 20 6c 61 62 65 6c 0a 20 20  ddrNxt" label.  
1a3b0 2a 2a 20 69 73 20 74 68 65 20 73 61 6d 65 20 61  ** is the same a
1a3c0 73 20 22 61 64 64 72 42 72 6b 22 2e 0a 20 20 2a  s "addrBrk"..  *
1a3d0 2f 0a 20 20 61 64 64 72 42 72 6b 20 3d 20 70 4c  /.  addrBrk = pL
1a3e0 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b 20 3d 20  evel->addrBrk = 
1a3f0 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 20  pLevel->addrNxt 
1a400 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
1a410 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 61 64 64  eLabel(v);.  add
1a420 72 43 6f 6e 74 20 3d 20 70 4c 65 76 65 6c 2d 3e  rCont = pLevel->
1a430 61 64 64 72 43 6f 6e 74 20 3d 20 73 71 6c 69 74  addrCont = sqlit
1a440 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
1a450 76 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69  v);..  /* If thi
1a460 73 20 69 73 20 74 68 65 20 72 69 67 68 74 20 74  s is the right t
1a470 61 62 6c 65 20 6f 66 20 61 20 4c 45 46 54 20 4f  able of a LEFT O
1a480 55 54 45 52 20 4a 4f 49 4e 2c 20 61 6c 6c 6f 63  UTER JOIN, alloc
1a490 61 74 65 20 61 6e 64 0a 20 20 2a 2a 20 69 6e 69  ate and.  ** ini
1a4a0 74 69 61 6c 69 7a 65 20 61 20 6d 65 6d 6f 72 79  tialize a memory
1a4b0 20 63 65 6c 6c 20 74 68 61 74 20 72 65 63 6f 72   cell that recor
1a4c0 64 73 20 69 66 20 74 68 69 73 20 74 61 62 6c 65  ds if this table
1a4d0 20 6d 61 74 63 68 65 73 20 61 6e 79 0a 20 20 2a   matches any.  *
1a4e0 2a 20 72 6f 77 20 6f 66 20 74 68 65 20 6c 65 66  * row of the lef
1a4f0 74 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 6a  t table of the j
1a500 6f 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  oin..  */.  if( 
1a510 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 3e 30 20  pLevel->iFrom>0 
1a520 26 26 20 28 70 54 61 62 49 74 65 6d 5b 30 5d 2e  && (pTabItem[0].
1a530 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45  jointype & JT_LE
1a540 46 54 29 21 3d 30 20 29 7b 0a 20 20 20 20 70 4c  FT)!=0 ){.    pL
1a550 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20  evel->iLeftJoin 
1a560 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
1a570 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1a580 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
1a590 74 65 67 65 72 2c 20 30 2c 20 70 4c 65 76 65 6c  teger, 0, pLevel
1a5a0 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b 0a 20 20  ->iLeftJoin);.  
1a5b0 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
1a5c0 2c 20 22 69 6e 69 74 20 4c 45 46 54 20 4a 4f 49  , "init LEFT JOI
1a5d0 4e 20 6e 6f 2d 6d 61 74 63 68 20 66 6c 61 67 22  N no-match flag"
1a5e0 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 70  ));.  }..  /* Sp
1a5f0 65 63 69 61 6c 20 63 61 73 65 20 6f 66 20 61 20  ecial case of a 
1a600 46 52 4f 4d 20 63 6c 61 75 73 65 20 73 75 62 71  FROM clause subq
1a610 75 65 72 79 20 69 6d 70 6c 65 6d 65 6e 74 65 64  uery implemented
1a620 20 61 73 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65   as a co-routine
1a630 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 49 74   */.  if( pTabIt
1a640 65 6d 2d 3e 76 69 61 43 6f 72 6f 75 74 69 6e 65  em->viaCoroutine
1a650 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 65 67 59   ){.    int regY
1a660 69 65 6c 64 20 3d 20 70 54 61 62 49 74 65 6d 2d  ield = pTabItem-
1a670 3e 72 65 67 52 65 74 75 72 6e 3b 0a 20 20 20 20  >regReturn;.    
1a680 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1a690 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f 72 6f  3(v, OP_InitCoro
1a6a0 75 74 69 6e 65 2c 20 72 65 67 59 69 65 6c 64 2c  utine, regYield,
1a6b0 20 30 2c 20 70 54 61 62 49 74 65 6d 2d 3e 61 64   0, pTabItem->ad
1a6c0 64 72 46 69 6c 6c 53 75 62 29 3b 0a 20 20 20 20  drFillSub);.    
1a6d0 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 20 73 71  pLevel->p2 =  sq
1a6e0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1a6f0 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67  v, OP_Yield, reg
1a700 59 69 65 6c 64 2c 20 61 64 64 72 42 72 6b 29 3b  Yield, addrBrk);
1a710 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67  .    VdbeCoverag
1a720 65 28 76 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  e(v);.    VdbeCo
1a730 6d 6d 65 6e 74 28 28 76 2c 20 22 6e 65 78 74 20  mment((v, "next 
1a740 72 6f 77 20 6f 66 20 5c 22 25 73 5c 22 22 2c 20  row of \"%s\"", 
1a750 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 2d 3e  pTabItem->pTab->
1a760 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 70 4c 65  zName));.    pLe
1a770 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 47 6f 74  vel->op = OP_Got
1a780 6f 3b 0a 20 20 7d 65 6c 73 65 0a 0a 23 69 66 6e  o;.  }else..#ifn
1a790 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1a7a0 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69  VIRTUALTABLE.  i
1a7b0 66 28 20 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c  f(  (pLoop->wsFl
1a7c0 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54  ags & WHERE_VIRT
1a7d0 55 41 4c 54 41 42 4c 45 29 21 3d 30 20 29 7b 0a  UALTABLE)!=0 ){.
1a7e0 20 20 20 20 2f 2a 20 43 61 73 65 20 31 3a 20 20      /* Case 1:  
1a7f0 54 68 65 20 74 61 62 6c 65 20 69 73 20 61 20 76  The table is a v
1a800 69 72 74 75 61 6c 2d 74 61 62 6c 65 2e 20 20 55  irtual-table.  U
1a810 73 65 20 74 68 65 20 56 46 69 6c 74 65 72 20 61  se the VFilter a
1a820 6e 64 20 56 4e 65 78 74 0a 20 20 20 20 2a 2a 20  nd VNext.    ** 
1a830 20 20 20 20 20 20 20 20 20 74 6f 20 61 63 63 65           to acce
1a840 73 73 20 74 68 65 20 64 61 74 61 2e 0a 20 20 20  ss the data..   
1a850 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 52 65 67   */.    int iReg
1a860 3b 20 20 20 2f 2a 20 50 33 20 56 61 6c 75 65 20  ;   /* P3 Value 
1a870 66 6f 72 20 4f 50 5f 56 46 69 6c 74 65 72 20 2a  for OP_VFilter *
1a880 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72 4e 6f  /.    int addrNo
1a890 74 46 6f 75 6e 64 3b 0a 20 20 20 20 69 6e 74 20  tFound;.    int 
1a8a0 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 70 4c  nConstraint = pL
1a8b0 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 3b 0a 0a 20 20  oop->nLTerm;..  
1a8c0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
1a8d0 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a  hePush(pParse);.
1a8e0 20 20 20 20 69 52 65 67 20 3d 20 73 71 6c 69 74      iReg = sqlit
1a8f0 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70  e3GetTempRange(p
1a900 50 61 72 73 65 2c 20 6e 43 6f 6e 73 74 72 61 69  Parse, nConstrai
1a910 6e 74 2b 32 29 3b 0a 20 20 20 20 61 64 64 72 4e  nt+2);.    addrN
1a920 6f 74 46 6f 75 6e 64 20 3d 20 70 4c 65 76 65 6c  otFound = pLevel
1a930 2d 3e 61 64 64 72 42 72 6b 3b 0a 20 20 20 20 66  ->addrBrk;.    f
1a940 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 43 6f 6e 73 74  or(j=0; j<nConst
1a950 72 61 69 6e 74 3b 20 6a 2b 2b 29 7b 0a 20 20 20  raint; j++){.   
1a960 20 20 20 69 6e 74 20 69 54 61 72 67 65 74 20 3d     int iTarget =
1a970 20 69 52 65 67 2b 6a 2b 32 3b 0a 20 20 20 20 20   iReg+j+2;.     
1a980 20 70 54 65 72 6d 20 3d 20 70 4c 6f 6f 70 2d 3e   pTerm = pLoop->
1a990 61 4c 54 65 72 6d 5b 6a 5d 3b 0a 20 20 20 20 20  aLTerm[j];.     
1a9a0 20 69 66 28 20 70 54 65 72 6d 3d 3d 30 20 29 20   if( pTerm==0 ) 
1a9b0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
1a9c0 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  if( pTerm->eOper
1a9d0 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29 7b 0a  ator & WO_IN ){.
1a9e0 20 20 20 20 20 20 20 20 63 6f 64 65 45 71 75 61          codeEqua
1a9f0 6c 69 74 79 54 65 72 6d 28 70 50 61 72 73 65 2c  lityTerm(pParse,
1aa00 20 70 54 65 72 6d 2c 20 70 4c 65 76 65 6c 2c 20   pTerm, pLevel, 
1aa10 6a 2c 20 62 52 65 76 2c 20 69 54 61 72 67 65 74  j, bRev, iTarget
1aa20 29 3b 0a 20 20 20 20 20 20 20 20 61 64 64 72 4e  );.        addrN
1aa30 6f 74 46 6f 75 6e 64 20 3d 20 70 4c 65 76 65 6c  otFound = pLevel
1aa40 2d 3e 61 64 64 72 4e 78 74 3b 0a 20 20 20 20 20  ->addrNxt;.     
1aa50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1aa60 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
1aa70 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2d 3e 70  pParse, pTerm->p
1aa80 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 69 54  Expr->pRight, iT
1aa90 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a  arget);.      }.
1aaa0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
1aab0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1aac0 50 5f 49 6e 74 65 67 65 72 2c 20 70 4c 6f 6f 70  P_Integer, pLoop
1aad0 2d 3e 75 2e 76 74 61 62 2e 69 64 78 4e 75 6d 2c  ->u.vtab.idxNum,
1aae0 20 69 52 65 67 29 3b 0a 20 20 20 20 73 71 6c 69   iReg);.    sqli
1aaf0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1ab00 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 6e 43 6f   OP_Integer, nCo
1ab10 6e 73 74 72 61 69 6e 74 2c 20 69 52 65 67 2b 31  nstraint, iReg+1
1ab20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
1ab30 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 56  beAddOp4(v, OP_V
1ab40 46 69 6c 74 65 72 2c 20 69 43 75 72 2c 20 61 64  Filter, iCur, ad
1ab50 64 72 4e 6f 74 46 6f 75 6e 64 2c 20 69 52 65 67  drNotFound, iReg
1ab60 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1ab70 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 75          pLoop->u
1ab80 2e 76 74 61 62 2e 69 64 78 53 74 72 2c 0a 20 20  .vtab.idxStr,.  
1ab90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aba0 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61      pLoop->u.vta
1abb0 62 2e 6e 65 65 64 46 72 65 65 20 3f 20 50 34 5f  b.needFree ? P4_
1abc0 4d 50 52 49 4e 54 46 20 3a 20 50 34 5f 53 54 41  MPRINTF : P4_STA
1abd0 54 49 43 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  TIC);.    VdbeCo
1abe0 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 70  verage(v);.    p
1abf0 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 6e 65 65  Loop->u.vtab.nee
1ac00 64 46 72 65 65 20 3d 20 30 3b 0a 20 20 20 20 66  dFree = 0;.    f
1ac10 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 43 6f 6e 73 74  or(j=0; j<nConst
1ac20 72 61 69 6e 74 20 26 26 20 6a 3c 31 36 3b 20 6a  raint && j<16; j
1ac30 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  ++){.      if( (
1ac40 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 6f 6d  pLoop->u.vtab.om
1ac50 69 74 4d 61 73 6b 3e 3e 6a 29 26 31 20 29 7b 0a  itMask>>j)&1 ){.
1ac60 20 20 20 20 20 20 20 20 64 69 73 61 62 6c 65 54          disableT
1ac70 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 4c 6f 6f  erm(pLevel, pLoo
1ac80 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 29 3b 0a 20  p->aLTerm[j]);. 
1ac90 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1aca0 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50   pLevel->op = OP
1acb0 5f 56 4e 65 78 74 3b 0a 20 20 20 20 70 4c 65 76  _VNext;.    pLev
1acc0 65 6c 2d 3e 70 31 20 3d 20 69 43 75 72 3b 0a 20  el->p1 = iCur;. 
1acd0 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20     pLevel->p2 = 
1ace0 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
1acf0 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 73  ntAddr(v);.    s
1ad00 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
1ad10 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 69  pRange(pParse, i
1ad20 52 65 67 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74  Reg, nConstraint
1ad30 2b 32 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  +2);.    sqlite3
1ad40 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61  ExprCachePop(pPa
1ad50 72 73 65 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65  rse);.  }else.#e
1ad60 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
1ad70 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
1ad80 20 2a 2f 0a 0a 20 20 69 66 28 20 28 70 4c 6f 6f   */..  if( (pLoo
1ad90 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
1ada0 52 45 5f 49 50 4b 29 21 3d 30 0a 20 20 20 26 26  RE_IPK)!=0.   &&
1adb0 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73   (pLoop->wsFlags
1adc0 20 26 20 28 57 48 45 52 45 5f 43 4f 4c 55 4d 4e   & (WHERE_COLUMN
1add0 5f 49 4e 7c 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  _IN|WHERE_COLUMN
1ade0 5f 45 51 29 29 21 3d 30 0a 20 20 29 7b 0a 20 20  _EQ))!=0.  ){.  
1adf0 20 20 2f 2a 20 43 61 73 65 20 32 3a 20 20 57 65    /* Case 2:  We
1ae00 20 63 61 6e 20 64 69 72 65 63 74 6c 79 20 72 65   can directly re
1ae10 66 65 72 65 6e 63 65 20 61 20 73 69 6e 67 6c 65  ference a single
1ae20 20 72 6f 77 20 75 73 69 6e 67 20 61 6e 0a 20 20   row using an.  
1ae30 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 65 71    **          eq
1ae40 75 61 6c 69 74 79 20 63 6f 6d 70 61 72 69 73 6f  uality compariso
1ae50 6e 20 61 67 61 69 6e 73 74 20 74 68 65 20 52 4f  n against the RO
1ae60 57 49 44 20 66 69 65 6c 64 2e 20 20 4f 72 0a 20  WID field.  Or. 
1ae70 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 77     **          w
1ae80 65 20 72 65 66 65 72 65 6e 63 65 20 6d 75 6c 74  e reference mult
1ae90 69 70 6c 65 20 72 6f 77 73 20 75 73 69 6e 67 20  iple rows using 
1aea0 61 20 22 72 6f 77 69 64 20 49 4e 20 28 2e 2e 2e  a "rowid IN (...
1aeb0 29 22 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  )".    **       
1aec0 20 20 20 63 6f 6e 73 74 72 75 63 74 2e 0a 20 20     construct..  
1aed0 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
1aee0 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
1aef0 6e 45 71 3d 3d 31 20 29 3b 0a 20 20 20 20 70 54  nEq==1 );.    pT
1af00 65 72 6d 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54  erm = pLoop->aLT
1af10 65 72 6d 5b 30 5d 3b 0a 20 20 20 20 61 73 73 65  erm[0];.    asse
1af20 72 74 28 20 70 54 65 72 6d 21 3d 30 20 29 3b 0a  rt( pTerm!=0 );.
1af30 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72      assert( pTer
1af40 6d 2d 3e 70 45 78 70 72 21 3d 30 20 29 3b 0a 20  m->pExpr!=0 );. 
1af50 20 20 20 61 73 73 65 72 74 28 20 6f 6d 69 74 54     assert( omitT
1af60 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 20 20 74  able==0 );.    t
1af70 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
1af80 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
1af90 49 52 54 55 41 4c 20 29 3b 0a 20 20 20 20 69 52  IRTUAL );.    iR
1afa0 65 6c 65 61 73 65 52 65 67 20 3d 20 2b 2b 70 50  eleaseReg = ++pP
1afb0 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
1afc0 69 52 6f 77 69 64 52 65 67 20 3d 20 63 6f 64 65  iRowidReg = code
1afd0 45 71 75 61 6c 69 74 79 54 65 72 6d 28 70 50 61  EqualityTerm(pPa
1afe0 72 73 65 2c 20 70 54 65 72 6d 2c 20 70 4c 65 76  rse, pTerm, pLev
1aff0 65 6c 2c 20 30 2c 20 62 52 65 76 2c 20 69 52 65  el, 0, bRev, iRe
1b000 6c 65 61 73 65 52 65 67 29 3b 0a 20 20 20 20 69  leaseReg);.    i
1b010 66 28 20 69 52 6f 77 69 64 52 65 67 21 3d 69 52  f( iRowidReg!=iR
1b020 65 6c 65 61 73 65 52 65 67 20 29 20 73 71 6c 69  eleaseReg ) sqli
1b030 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
1b040 67 28 70 50 61 72 73 65 2c 20 69 52 65 6c 65 61  g(pParse, iRelea
1b050 73 65 52 65 67 29 3b 0a 20 20 20 20 61 64 64 72  seReg);.    addr
1b060 4e 78 74 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64  Nxt = pLevel->ad
1b070 64 72 4e 78 74 3b 0a 20 20 20 20 73 71 6c 69 74  drNxt;.    sqlit
1b080 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1b090 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 69 52  OP_MustBeInt, iR
1b0a0 6f 77 69 64 52 65 67 2c 20 61 64 64 72 4e 78 74  owidReg, addrNxt
1b0b0 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
1b0c0 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  v);.    sqlite3V
1b0d0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
1b0e0 4e 6f 74 45 78 69 73 74 73 2c 20 69 43 75 72 2c  NotExists, iCur,
1b0f0 20 61 64 64 72 4e 78 74 2c 20 69 52 6f 77 69 64   addrNxt, iRowid
1b100 52 65 67 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  Reg);.    VdbeCo
1b110 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73  verage(v);.    s
1b120 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41  qlite3ExprCacheA
1b130 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50  ffinityChange(pP
1b140 61 72 73 65 2c 20 69 52 6f 77 69 64 52 65 67 2c  arse, iRowidReg,
1b150 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   1);.    sqlite3
1b160 45 78 70 72 43 61 63 68 65 53 74 6f 72 65 28 70  ExprCacheStore(p
1b170 50 61 72 73 65 2c 20 69 43 75 72 2c 20 2d 31 2c  Parse, iCur, -1,
1b180 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20   iRowidReg);.   
1b190 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
1b1a0 20 22 70 6b 22 29 29 3b 0a 20 20 20 20 70 4c 65   "pk"));.    pLe
1b1b0 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 6f 6f  vel->op = OP_Noo
1b1c0 70 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28  p;.  }else if( (
1b1d0 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
1b1e0 20 57 48 45 52 45 5f 49 50 4b 29 21 3d 30 0a 20   WHERE_IPK)!=0. 
1b1f0 20 20 20 20 20 20 20 20 26 26 20 28 70 4c 6f 6f          && (pLoo
1b200 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
1b210 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 29  RE_COLUMN_RANGE)
1b220 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20  !=0.  ){.    /* 
1b230 43 61 73 65 20 33 3a 20 20 57 65 20 68 61 76 65  Case 3:  We have
1b240 20 61 6e 20 69 6e 65 71 75 61 6c 69 74 79 20 63   an inequality c
1b250 6f 6d 70 61 72 69 73 6f 6e 20 61 67 61 69 6e 73  omparison agains
1b260 74 20 74 68 65 20 52 4f 57 49 44 20 66 69 65 6c  t the ROWID fiel
1b270 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e  d..    */.    in
1b280 74 20 74 65 73 74 4f 70 20 3d 20 4f 50 5f 4e 6f  t testOp = OP_No
1b290 6f 70 3b 0a 20 20 20 20 69 6e 74 20 73 74 61 72  op;.    int star
1b2a0 74 3b 0a 20 20 20 20 69 6e 74 20 6d 65 6d 45 6e  t;.    int memEn
1b2b0 64 56 61 6c 75 65 20 3d 20 30 3b 0a 20 20 20 20  dValue = 0;.    
1b2c0 57 68 65 72 65 54 65 72 6d 20 2a 70 53 74 61 72  WhereTerm *pStar
1b2d0 74 2c 20 2a 70 45 6e 64 3b 0a 0a 20 20 20 20 61  t, *pEnd;..    a
1b2e0 73 73 65 72 74 28 20 6f 6d 69 74 54 61 62 6c 65  ssert( omitTable
1b2f0 3d 3d 30 20 29 3b 0a 20 20 20 20 6a 20 3d 20 30  ==0 );.    j = 0
1b300 3b 0a 20 20 20 20 70 53 74 61 72 74 20 3d 20 70  ;.    pStart = p
1b310 45 6e 64 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  End = 0;.    if(
1b320 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20   pLoop->wsFlags 
1b330 26 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49  & WHERE_BTM_LIMI
1b340 54 20 29 20 70 53 74 61 72 74 20 3d 20 70 4c 6f  T ) pStart = pLo
1b350 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 2b 2b 5d 3b  op->aLTerm[j++];
1b360 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e  .    if( pLoop->
1b370 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
1b380 54 4f 50 5f 4c 49 4d 49 54 20 29 20 70 45 6e 64  TOP_LIMIT ) pEnd
1b390 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d   = pLoop->aLTerm
1b3a0 5b 6a 2b 2b 5d 3b 0a 20 20 20 20 61 73 73 65 72  [j++];.    asser
1b3b0 74 28 20 70 53 74 61 72 74 21 3d 30 20 7c 7c 20  t( pStart!=0 || 
1b3c0 70 45 6e 64 21 3d 30 20 29 3b 0a 20 20 20 20 69  pEnd!=0 );.    i
1b3d0 66 28 20 62 52 65 76 20 29 7b 0a 20 20 20 20 20  f( bRev ){.     
1b3e0 20 70 54 65 72 6d 20 3d 20 70 53 74 61 72 74 3b   pTerm = pStart;
1b3f0 0a 20 20 20 20 20 20 70 53 74 61 72 74 20 3d 20  .      pStart = 
1b400 70 45 6e 64 3b 0a 20 20 20 20 20 20 70 45 6e 64  pEnd;.      pEnd
1b410 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 7d 0a   = pTerm;.    }.
1b420 20 20 20 20 69 66 28 20 70 53 74 61 72 74 20 29      if( pStart )
1b430 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 58  {.      Expr *pX
1b440 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1b450 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
1b460 74 68 61 74 20 64 65 66 69 6e 65 73 20 74 68 65  that defines the
1b470 20 73 74 61 72 74 20 62 6f 75 6e 64 20 2a 2f 0a   start bound */.
1b480 20 20 20 20 20 20 69 6e 74 20 72 31 2c 20 72 54        int r1, rT
1b490 65 6d 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 52  emp;        /* R
1b4a0 65 67 69 73 74 65 72 73 20 66 6f 72 20 68 6f 6c  egisters for hol
1b4b0 64 69 6e 67 20 74 68 65 20 73 74 61 72 74 20 62  ding the start b
1b4c0 6f 75 6e 64 61 72 79 20 2a 2f 0a 0a 20 20 20 20  oundary */..    
1b4d0 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    /* The followi
1b4e0 6e 67 20 63 6f 6e 73 74 61 6e 74 20 6d 61 70 73  ng constant maps
1b4f0 20 54 4b 5f 78 78 20 63 6f 64 65 73 20 69 6e 74   TK_xx codes int
1b500 6f 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  o corresponding 
1b510 0a 20 20 20 20 20 20 2a 2a 20 73 65 65 6b 20 6f  .      ** seek o
1b520 70 63 6f 64 65 73 2e 20 20 49 74 20 64 65 70 65  pcodes.  It depe
1b530 6e 64 73 20 6f 6e 20 61 20 70 61 72 74 69 63 75  nds on a particu
1b540 6c 61 72 20 6f 72 64 65 72 69 6e 67 20 6f 66 20  lar ordering of 
1b550 54 4b 5f 78 78 0a 20 20 20 20 20 20 2a 2f 0a 20  TK_xx.      */. 
1b560 20 20 20 20 20 63 6f 6e 73 74 20 75 38 20 61 4d       const u8 aM
1b570 6f 76 65 4f 70 5b 5d 20 3d 20 7b 0a 20 20 20 20  oveOp[] = {.    
1b580 20 20 20 20 20 20 20 2f 2a 20 54 4b 5f 47 54 20         /* TK_GT 
1b590 2a 2f 20 20 4f 50 5f 53 65 65 6b 47 54 2c 0a 20  */  OP_SeekGT,. 
1b5a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 4b 5f            /* TK_
1b5b0 4c 45 20 2a 2f 20 20 4f 50 5f 53 65 65 6b 4c 45  LE */  OP_SeekLE
1b5c0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,.           /* 
1b5d0 54 4b 5f 4c 54 20 2a 2f 20 20 4f 50 5f 53 65 65  TK_LT */  OP_See
1b5e0 6b 4c 54 2c 0a 20 20 20 20 20 20 20 20 20 20 20  kLT,.           
1b5f0 2f 2a 20 54 4b 5f 47 45 20 2a 2f 20 20 4f 50 5f  /* TK_GE */  OP_
1b600 53 65 65 6b 47 45 0a 20 20 20 20 20 20 7d 3b 0a  SeekGE.      };.
1b610 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
1b620 5f 4c 45 3d 3d 54 4b 5f 47 54 2b 31 20 29 3b 20  _LE==TK_GT+1 ); 
1b630 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72       /* Make sur
1b640 65 20 74 68 65 20 6f 72 64 65 72 69 6e 67 2e 2e  e the ordering..
1b650 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
1b660 28 20 54 4b 5f 4c 54 3d 3d 54 4b 5f 47 54 2b 32  ( TK_LT==TK_GT+2
1b670 20 29 3b 20 20 20 20 20 20 2f 2a 20 20 2e 2e 2e   );      /*  ...
1b680 20 6f 66 20 74 68 65 20 54 4b 5f 78 78 20 76 61   of the TK_xx va
1b690 6c 75 65 73 2e 2e 2e 20 2a 2f 0a 20 20 20 20 20  lues... */.     
1b6a0 20 61 73 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d   assert( TK_GE==
1b6b0 54 4b 5f 47 54 2b 33 20 29 3b 20 20 20 20 20 20  TK_GT+3 );      
1b6c0 2f 2a 20 20 2e 2e 2e 20 69 73 20 63 6f 72 72 65  /*  ... is corre
1b6d0 63 63 74 2e 20 2a 2f 0a 0a 20 20 20 20 20 20 61  cct. */..      a
1b6e0 73 73 65 72 74 28 20 28 70 53 74 61 72 74 2d 3e  ssert( (pStart->
1b6f0 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
1b700 4e 55 4c 4c 29 3d 3d 30 20 29 3b 0a 20 20 20 20  NULL)==0 );.    
1b710 20 20 74 65 73 74 63 61 73 65 28 20 70 53 74 61    testcase( pSta
1b720 72 74 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rt->wtFlags & TE
1b730 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20 20  RM_VIRTUAL );.  
1b740 20 20 20 20 70 58 20 3d 20 70 53 74 61 72 74 2d      pX = pStart-
1b750 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73  >pExpr;.      as
1b760 73 65 72 74 28 20 70 58 21 3d 30 20 29 3b 0a 20  sert( pX!=0 );. 
1b770 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
1b780 53 74 61 72 74 2d 3e 6c 65 66 74 43 75 72 73 6f  Start->leftCurso
1b790 72 21 3d 69 43 75 72 20 29 3b 20 2f 2a 20 74 72  r!=iCur ); /* tr
1b7a0 61 6e 73 69 74 69 76 65 20 63 6f 6e 73 74 72 61  ansitive constra
1b7b0 69 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 72 31  ints */.      r1
1b7c0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1b7d0 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
1b7e0 58 2d 3e 70 52 69 67 68 74 2c 20 26 72 54 65 6d  X->pRight, &rTem
1b7f0 70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  p);.      sqlite
1b800 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 61  3VdbeAddOp3(v, a
1b810 4d 6f 76 65 4f 70 5b 70 58 2d 3e 6f 70 2d 54 4b  MoveOp[pX->op-TK
1b820 5f 47 54 5d 2c 20 69 43 75 72 2c 20 61 64 64 72  _GT], iCur, addr
1b830 42 72 6b 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  Brk, r1);.      
1b840 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
1b850 22 70 6b 22 29 29 3b 0a 20 20 20 20 20 20 56 64  "pk"));.      Vd
1b860 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
1b870 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 29 3b 0a  pX->op==TK_GT);.
1b880 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
1b890 67 65 49 66 28 76 2c 20 70 58 2d 3e 6f 70 3d 3d  geIf(v, pX->op==
1b8a0 54 4b 5f 4c 45 29 3b 0a 20 20 20 20 20 20 56 64  TK_LE);.      Vd
1b8b0 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
1b8c0 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54 29 3b 0a  pX->op==TK_LT);.
1b8d0 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
1b8e0 67 65 49 66 28 76 2c 20 70 58 2d 3e 6f 70 3d 3d  geIf(v, pX->op==
1b8f0 54 4b 5f 47 45 29 3b 0a 20 20 20 20 20 20 73 71  TK_GE);.      sq
1b900 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66  lite3ExprCacheAf
1b910 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61  finityChange(pPa
1b920 72 73 65 2c 20 72 31 2c 20 31 29 3b 0a 20 20 20  rse, r1, 1);.   
1b930 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
1b940 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
1b950 20 72 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 64   rTemp);.      d
1b960 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65  isableTerm(pLeve
1b970 6c 2c 20 70 53 74 61 72 74 29 3b 0a 20 20 20 20  l, pStart);.    
1b980 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
1b990 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1b9a0 2c 20 62 52 65 76 20 3f 20 4f 50 5f 4c 61 73 74  , bRev ? OP_Last
1b9b0 20 3a 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 43   : OP_Rewind, iC
1b9c0 75 72 2c 20 61 64 64 72 42 72 6b 29 3b 0a 20 20  ur, addrBrk);.  
1b9d0 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
1b9e0 49 66 28 76 2c 20 62 52 65 76 3d 3d 30 29 3b 0a  If(v, bRev==0);.
1b9f0 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
1ba00 67 65 49 66 28 76 2c 20 62 52 65 76 21 3d 30 29  geIf(v, bRev!=0)
1ba10 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1ba20 70 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 45 78  pEnd ){.      Ex
1ba30 70 72 20 2a 70 58 3b 0a 20 20 20 20 20 20 70 58  pr *pX;.      pX
1ba40 20 3d 20 70 45 6e 64 2d 3e 70 45 78 70 72 3b 0a   = pEnd->pExpr;.
1ba50 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 58        assert( pX
1ba60 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73  !=0 );.      ass
1ba70 65 72 74 28 20 28 70 45 6e 64 2d 3e 77 74 46 6c  ert( (pEnd->wtFl
1ba80 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c  ags & TERM_VNULL
1ba90 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65  )==0 );.      te
1baa0 73 74 63 61 73 65 28 20 70 45 6e 64 2d 3e 6c 65  stcase( pEnd->le
1bab0 66 74 43 75 72 73 6f 72 21 3d 69 43 75 72 20 29  ftCursor!=iCur )
1bac0 3b 20 2f 2a 20 54 72 61 6e 73 69 74 69 76 65 20  ; /* Transitive 
1bad0 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20  constraints */. 
1bae0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
1baf0 45 6e 64 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  End->wtFlags & T
1bb00 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20  ERM_VIRTUAL );. 
1bb10 20 20 20 20 20 6d 65 6d 45 6e 64 56 61 6c 75 65       memEndValue
1bb20 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
1bb30 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  m;.      sqlite3
1bb40 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
1bb50 20 70 58 2d 3e 70 52 69 67 68 74 2c 20 6d 65 6d   pX->pRight, mem
1bb60 45 6e 64 56 61 6c 75 65 29 3b 0a 20 20 20 20 20  EndValue);.     
1bb70 20 69 66 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f   if( pX->op==TK_
1bb80 4c 54 20 7c 7c 20 70 58 2d 3e 6f 70 3d 3d 54 4b  LT || pX->op==TK
1bb90 5f 47 54 20 29 7b 0a 20 20 20 20 20 20 20 20 74  _GT ){.        t
1bba0 65 73 74 4f 70 20 3d 20 62 52 65 76 20 3f 20 4f  estOp = bRev ? O
1bbb0 50 5f 4c 65 20 3a 20 4f 50 5f 47 65 3b 0a 20 20  P_Le : OP_Ge;.  
1bbc0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1bbd0 20 20 20 74 65 73 74 4f 70 20 3d 20 62 52 65 76     testOp = bRev
1bbe0 20 3f 20 4f 50 5f 4c 74 20 3a 20 4f 50 5f 47 74   ? OP_Lt : OP_Gt
1bbf0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1bc00 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76  disableTerm(pLev
1bc10 65 6c 2c 20 70 45 6e 64 29 3b 0a 20 20 20 20 7d  el, pEnd);.    }
1bc20 0a 20 20 20 20 73 74 61 72 74 20 3d 20 73 71 6c  .    start = sql
1bc30 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
1bc40 64 64 72 28 76 29 3b 0a 20 20 20 20 70 4c 65 76  ddr(v);.    pLev
1bc50 65 6c 2d 3e 6f 70 20 3d 20 62 52 65 76 20 3f 20  el->op = bRev ? 
1bc60 4f 50 5f 50 72 65 76 20 3a 20 4f 50 5f 4e 65 78  OP_Prev : OP_Nex
1bc70 74 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  t;.    pLevel->p
1bc80 31 20 3d 20 69 43 75 72 3b 0a 20 20 20 20 70 4c  1 = iCur;.    pL
1bc90 65 76 65 6c 2d 3e 70 32 20 3d 20 73 74 61 72 74  evel->p2 = start
1bca0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c  ;.    assert( pL
1bcb0 65 76 65 6c 2d 3e 70 35 3d 3d 30 20 29 3b 0a 20  evel->p5==0 );. 
1bcc0 20 20 20 69 66 28 20 74 65 73 74 4f 70 21 3d 4f     if( testOp!=O
1bcd0 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20  P_Noop ){.      
1bce0 69 52 6f 77 69 64 52 65 67 20 3d 20 2b 2b 70 50  iRowidReg = ++pP
1bcf0 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
1bd00 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1bd10 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c  Op2(v, OP_Rowid,
1bd20 20 69 43 75 72 2c 20 69 52 6f 77 69 64 52 65 67   iCur, iRowidReg
1bd30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1bd40 45 78 70 72 43 61 63 68 65 53 74 6f 72 65 28 70  ExprCacheStore(p
1bd50 50 61 72 73 65 2c 20 69 43 75 72 2c 20 2d 31 2c  Parse, iCur, -1,
1bd60 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20   iRowidReg);.   
1bd70 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1bd80 64 4f 70 33 28 76 2c 20 74 65 73 74 4f 70 2c 20  dOp3(v, testOp, 
1bd90 6d 65 6d 45 6e 64 56 61 6c 75 65 2c 20 61 64 64  memEndValue, add
1bda0 72 42 72 6b 2c 20 69 52 6f 77 69 64 52 65 67 29  rBrk, iRowidReg)
1bdb0 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
1bdc0 72 61 67 65 49 66 28 76 2c 20 74 65 73 74 4f 70  rageIf(v, testOp
1bdd0 3d 3d 4f 50 5f 4c 65 29 3b 0a 20 20 20 20 20 20  ==OP_Le);.      
1bde0 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
1bdf0 2c 20 74 65 73 74 4f 70 3d 3d 4f 50 5f 4c 74 29  , testOp==OP_Lt)
1be00 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
1be10 72 61 67 65 49 66 28 76 2c 20 74 65 73 74 4f 70  rageIf(v, testOp
1be20 3d 3d 4f 50 5f 47 65 29 3b 0a 20 20 20 20 20 20  ==OP_Ge);.      
1be30 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
1be40 2c 20 74 65 73 74 4f 70 3d 3d 4f 50 5f 47 74 29  , testOp==OP_Gt)
1be50 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1be60 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 53  dbeChangeP5(v, S
1be70 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
1be80 43 20 7c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49  C | SQLITE_JUMPI
1be90 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a 20 20  FNULL);.    }.  
1bea0 7d 65 6c 73 65 20 69 66 28 20 70 4c 6f 6f 70 2d  }else if( pLoop-
1beb0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
1bec0 5f 49 4e 44 45 58 45 44 20 29 7b 0a 20 20 20 20  _INDEXED ){.    
1bed0 2f 2a 20 43 61 73 65 20 34 3a 20 41 20 73 63 61  /* Case 4: A sca
1bee0 6e 20 75 73 69 6e 67 20 61 6e 20 69 6e 64 65 78  n using an index
1bef0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
1bf00 20 20 20 20 20 20 20 20 54 68 65 20 57 48 45 52          The WHER
1bf10 45 20 63 6c 61 75 73 65 20 6d 61 79 20 63 6f 6e  E clause may con
1bf20 74 61 69 6e 20 7a 65 72 6f 20 6f 72 20 6d 6f 72  tain zero or mor
1bf30 65 20 65 71 75 61 6c 69 74 79 20 0a 20 20 20 20  e equality .    
1bf40 2a 2a 20 20 20 20 20 20 20 20 20 74 65 72 6d 73  **         terms
1bf50 20 28 22 3d 3d 22 20 6f 72 20 22 49 4e 22 20 6f   ("==" or "IN" o
1bf60 70 65 72 61 74 6f 72 73 29 20 74 68 61 74 20 72  perators) that r
1bf70 65 66 65 72 20 74 6f 20 74 68 65 20 4e 0a 20 20  efer to the N.  
1bf80 20 20 2a 2a 20 20 20 20 20 20 20 20 20 6c 65 66    **         lef
1bf90 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 73 20 6f  t-most columns o
1bfa0 66 20 74 68 65 20 69 6e 64 65 78 2e 20 49 74 20  f the index. It 
1bfb0 6d 61 79 20 61 6c 73 6f 20 63 6f 6e 74 61 69 6e  may also contain
1bfc0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
1bfd0 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  inequality const
1bfe0 72 61 69 6e 74 73 20 28 3e 2c 20 3c 2c 20 3e 3d  raints (>, <, >=
1bff0 20 6f 72 20 3c 3d 29 20 6f 6e 20 74 68 65 20 69   or <=) on the i
1c000 6e 64 65 78 65 64 0a 20 20 20 20 2a 2a 20 20 20  ndexed.    **   
1c010 20 20 20 20 20 20 63 6f 6c 75 6d 6e 20 74 68 61        column tha
1c020 74 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f  t immediately fo
1c030 6c 6c 6f 77 73 20 74 68 65 20 4e 20 65 71 75 61  llows the N equa
1c040 6c 69 74 69 65 73 2e 20 4f 6e 6c 79 20 0a 20 20  lities. Only .  
1c050 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74 68 65    **         the
1c060 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 6f 6c 75   right-most colu
1c070 6d 6e 20 63 61 6e 20 62 65 20 61 6e 20 69 6e 65  mn can be an ine
1c080 71 75 61 6c 69 74 79 20 2d 20 74 68 65 20 72 65  quality - the re
1c090 73 74 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20 20  st must.    **  
1c0a0 20 20 20 20 20 20 20 75 73 65 20 74 68 65 20 22         use the "
1c0b0 3d 3d 22 20 61 6e 64 20 22 49 4e 22 20 6f 70 65  ==" and "IN" ope
1c0c0 72 61 74 6f 72 73 2e 20 46 6f 72 20 65 78 61 6d  rators. For exam
1c0d0 70 6c 65 2c 20 69 66 20 74 68 65 20 0a 20 20 20  ple, if the .   
1c0e0 20 2a 2a 20 20 20 20 20 20 20 20 20 69 6e 64 65   **         inde
1c0f0 78 20 69 73 20 6f 6e 20 28 78 2c 79 2c 7a 29 2c  x is on (x,y,z),
1c100 20 74 68 65 6e 20 74 68 65 20 66 6f 6c 6c 6f 77   then the follow
1c110 69 6e 67 20 63 6c 61 75 73 65 73 20 61 72 65 20  ing clauses are 
1c120 61 6c 6c 20 0a 20 20 20 20 2a 2a 20 20 20 20 20  all .    **     
1c130 20 20 20 20 6f 70 74 69 6d 69 7a 65 64 3a 0a 20      optimized:. 
1c140 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
1c150 20 20 20 20 20 20 20 20 78 3d 35 0a 20 20 20 20          x=5.    
1c160 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 78 3d  **            x=
1c170 35 20 41 4e 44 20 79 3d 31 30 0a 20 20 20 20 2a  5 AND y=10.    *
1c180 2a 20 20 20 20 20 20 20 20 20 20 20 20 78 3d 35  *            x=5
1c190 20 41 4e 44 20 79 3c 31 30 0a 20 20 20 20 2a 2a   AND y<10.    **
1c1a0 20 20 20 20 20 20 20 20 20 20 20 20 78 3d 35 20              x=5 
1c1b0 41 4e 44 20 79 3e 35 20 41 4e 44 20 79 3c 31 30  AND y>5 AND y<10
1c1c0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
1c1d0 20 20 20 78 3d 35 20 41 4e 44 20 79 3d 35 20 41     x=5 AND y=5 A
1c1e0 4e 44 20 7a 3c 3d 31 30 0a 20 20 20 20 2a 2a 0a  ND z<=10.    **.
1c1f0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 54      **         T
1c200 68 65 20 7a 3c 31 30 20 74 65 72 6d 20 6f 66 20  he z<10 term of 
1c210 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61  the following ca
1c220 6e 6e 6f 74 20 62 65 20 75 73 65 64 2c 20 6f 6e  nnot be used, on
1c230 6c 79 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  ly.    **       
1c240 20 20 74 68 65 20 78 3d 35 20 74 65 72 6d 3a 0a    the x=5 term:.
1c250 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
1c260 20 20 20 20 20 20 20 20 20 78 3d 35 20 41 4e 44           x=5 AND
1c270 20 7a 3c 31 30 0a 20 20 20 20 2a 2a 0a 20 20 20   z<10.    **.   
1c280 20 2a 2a 20 20 20 20 20 20 20 20 20 4e 20 6d 61   **         N ma
1c290 79 20 62 65 20 7a 65 72 6f 20 69 66 20 74 68 65  y be zero if the
1c2a0 72 65 20 61 72 65 20 69 6e 65 71 75 61 6c 69 74  re are inequalit
1c2b0 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 0a 20  y constraints.. 
1c2c0 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 49 66     **         If
1c2d0 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 69 6e   there are no in
1c2e0 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
1c2f0 69 6e 74 73 2c 20 74 68 65 6e 20 4e 20 69 73 20  ints, then N is 
1c300 61 74 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  at.    **       
1c310 20 20 6c 65 61 73 74 20 6f 6e 65 2e 0a 20 20 20    least one..   
1c320 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   **.    **      
1c330 20 20 20 54 68 69 73 20 63 61 73 65 20 69 73 20     This case is 
1c340 61 6c 73 6f 20 75 73 65 64 20 77 68 65 6e 20 74  also used when t
1c350 68 65 72 65 20 61 72 65 20 6e 6f 20 57 48 45 52  here are no WHER
1c360 45 20 63 6c 61 75 73 65 0a 20 20 20 20 2a 2a 20  E clause.    ** 
1c370 20 20 20 20 20 20 20 20 63 6f 6e 73 74 72 61 69          constrai
1c380 6e 74 73 20 62 75 74 20 61 6e 20 69 6e 64 65 78  nts but an index
1c390 20 69 73 20 73 65 6c 65 63 74 65 64 20 61 6e 79   is selected any
1c3a0 77 61 79 2c 20 69 6e 20 6f 72 64 65 72 0a 20 20  way, in order.  
1c3b0 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74 6f 20    **         to 
1c3c0 66 6f 72 63 65 20 74 68 65 20 6f 75 74 70 75 74  force the output
1c3d0 20 6f 72 64 65 72 20 74 6f 20 63 6f 6e 66 6f 72   order to confor
1c3e0 6d 20 74 6f 20 61 6e 20 4f 52 44 45 52 20 42 59  m to an ORDER BY
1c3f0 2e 0a 20 20 20 20 2a 2f 20 20 0a 20 20 20 20 73  ..    */  .    s
1c400 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61  tatic const u8 a
1c410 53 74 61 72 74 4f 70 5b 5d 20 3d 20 7b 0a 20 20  StartOp[] = {.  
1c420 20 20 20 20 30 2c 0a 20 20 20 20 20 20 30 2c 0a      0,.      0,.
1c430 20 20 20 20 20 20 4f 50 5f 52 65 77 69 6e 64 2c        OP_Rewind,
1c440 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 32 3a             /* 2:
1c450 20 28 21 73 74 61 72 74 5f 63 6f 6e 73 74 72 61   (!start_constra
1c460 69 6e 74 73 20 26 26 20 73 74 61 72 74 45 71 20  ints && startEq 
1c470 26 26 20 20 21 62 52 65 76 29 20 2a 2f 0a 20 20  &&  !bRev) */.  
1c480 20 20 20 20 4f 50 5f 4c 61 73 74 2c 20 20 20 20      OP_Last,    
1c490 20 20 20 20 20 20 20 20 20 2f 2a 20 33 3a 20 28           /* 3: (
1c4a0 21 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e  !start_constrain
1c4b0 74 73 20 26 26 20 73 74 61 72 74 45 71 20 26 26  ts && startEq &&
1c4c0 20 20 20 62 52 65 76 29 20 2a 2f 0a 20 20 20 20     bRev) */.    
1c4d0 20 20 4f 50 5f 53 65 65 6b 47 54 2c 20 20 20 20    OP_SeekGT,    
1c4e0 20 20 20 20 20 20 20 2f 2a 20 34 3a 20 28 73 74         /* 4: (st
1c4f0 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20  art_constraints 
1c500 20 26 26 20 21 73 74 61 72 74 45 71 20 26 26 20   && !startEq && 
1c510 21 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20  !bRev) */.      
1c520 4f 50 5f 53 65 65 6b 4c 54 2c 20 20 20 20 20 20  OP_SeekLT,      
1c530 20 20 20 20 20 2f 2a 20 35 3a 20 28 73 74 61 72       /* 5: (star
1c540 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 20 26  t_constraints  &
1c550 26 20 21 73 74 61 72 74 45 71 20 26 26 20 20 62  & !startEq &&  b
1c560 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50  Rev) */.      OP
1c570 5f 53 65 65 6b 47 45 2c 20 20 20 20 20 20 20 20  _SeekGE,        
1c580 20 20 20 2f 2a 20 36 3a 20 28 73 74 61 72 74 5f     /* 6: (start_
1c590 63 6f 6e 73 74 72 61 69 6e 74 73 20 20 26 26 20  constraints  && 
1c5a0 20 73 74 61 72 74 45 71 20 26 26 20 21 62 52 65   startEq && !bRe
1c5b0 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 53  v) */.      OP_S
1c5c0 65 65 6b 4c 45 20 20 20 20 20 20 20 20 20 20 20  eekLE           
1c5d0 20 2f 2a 20 37 3a 20 28 73 74 61 72 74 5f 63 6f   /* 7: (start_co
1c5e0 6e 73 74 72 61 69 6e 74 73 20 20 26 26 20 20 73  nstraints  &&  s
1c5f0 74 61 72 74 45 71 20 26 26 20 20 62 52 65 76 29  tartEq &&  bRev)
1c600 20 2a 2f 0a 20 20 20 20 7d 3b 0a 20 20 20 20 73   */.    };.    s
1c610 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61  tatic const u8 a
1c620 45 6e 64 4f 70 5b 5d 20 3d 20 7b 0a 20 20 20 20  EndOp[] = {.    
1c630 20 20 4f 50 5f 49 64 78 47 45 2c 20 20 20 20 20    OP_IdxGE,     
1c640 20 20 20 20 20 20 20 2f 2a 20 30 3a 20 28 65 6e         /* 0: (en
1c650 64 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 26 26  d_constraints &&
1c660 20 21 62 52 65 76 20 26 26 20 21 65 6e 64 45 71   !bRev && !endEq
1c670 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 49 64  ) */.      OP_Id
1c680 78 47 54 2c 20 20 20 20 20 20 20 20 20 20 20 20  xGT,            
1c690 2f 2a 20 31 3a 20 28 65 6e 64 5f 63 6f 6e 73 74  /* 1: (end_const
1c6a0 72 61 69 6e 74 73 20 26 26 20 21 62 52 65 76 20  raints && !bRev 
1c6b0 26 26 20 20 65 6e 64 45 71 29 20 2a 2f 0a 20 20  &&  endEq) */.  
1c6c0 20 20 20 20 4f 50 5f 49 64 78 4c 45 2c 20 20 20      OP_IdxLE,   
1c6d0 20 20 20 20 20 20 20 20 20 2f 2a 20 32 3a 20 28           /* 2: (
1c6e0 65 6e 64 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20  end_constraints 
1c6f0 26 26 20 20 62 52 65 76 20 26 26 20 21 65 6e 64  &&  bRev && !end
1c700 45 71 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f  Eq) */.      OP_
1c710 49 64 78 4c 54 2c 20 20 20 20 20 20 20 20 20 20  IdxLT,          
1c720 20 20 2f 2a 20 33 3a 20 28 65 6e 64 5f 63 6f 6e    /* 3: (end_con
1c730 73 74 72 61 69 6e 74 73 20 26 26 20 20 62 52 65  straints &&  bRe
1c740 76 20 26 26 20 20 65 6e 64 45 71 29 20 2a 2f 0a  v &&  endEq) */.
1c750 20 20 20 20 7d 3b 0a 20 20 20 20 75 31 36 20 6e      };.    u16 n
1c760 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  Eq = pLoop->u.bt
1c770 72 65 65 2e 6e 45 71 3b 20 20 20 20 20 2f 2a 20  ree.nEq;     /* 
1c780 4e 75 6d 62 65 72 20 6f 66 20 3d 3d 20 6f 72 20  Number of == or 
1c790 49 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20  IN terms */.    
1c7a0 69 6e 74 20 72 65 67 42 61 73 65 3b 20 20 20 20  int regBase;    
1c7b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c7c0 42 61 73 65 20 72 65 67 69 73 74 65 72 20 68 6f  Base register ho
1c7d0 6c 64 69 6e 67 20 63 6f 6e 73 74 72 61 69 6e 74  lding constraint
1c7e0 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 20 20 57   values */.    W
1c7f0 68 65 72 65 54 65 72 6d 20 2a 70 52 61 6e 67 65  hereTerm *pRange
1c800 53 74 61 72 74 20 3d 20 30 3b 20 20 2f 2a 20 49  Start = 0;  /* I
1c810 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72  nequality constr
1c820 61 69 6e 74 20 61 74 20 72 61 6e 67 65 20 73 74  aint at range st
1c830 61 72 74 20 2a 2f 0a 20 20 20 20 57 68 65 72 65  art */.    Where
1c840 54 65 72 6d 20 2a 70 52 61 6e 67 65 45 6e 64 20  Term *pRangeEnd 
1c850 3d 20 30 3b 20 20 20 20 2f 2a 20 49 6e 65 71 75  = 0;    /* Inequ
1c860 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
1c870 20 61 74 20 72 61 6e 67 65 20 65 6e 64 20 2a 2f   at range end */
1c880 0a 20 20 20 20 69 6e 74 20 73 74 61 72 74 45 71  .    int startEq
1c890 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1c8a0 20 20 2f 2a 20 54 72 75 65 20 69 66 20 72 61 6e    /* True if ran
1c8b0 67 65 20 73 74 61 72 74 20 75 73 65 73 20 3d 3d  ge start uses ==
1c8c0 2c 20 3e 3d 20 6f 72 20 3c 3d 20 2a 2f 0a 20 20  , >= or <= */.  
1c8d0 20 20 69 6e 74 20 65 6e 64 45 71 3b 20 20 20 20    int endEq;    
1c8e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1c8f0 2a 20 54 72 75 65 20 69 66 20 72 61 6e 67 65 20  * True if range 
1c900 65 6e 64 20 75 73 65 73 20 3d 3d 2c 20 3e 3d 20  end uses ==, >= 
1c910 6f 72 20 3c 3d 20 2a 2f 0a 20 20 20 20 69 6e 74  or <= */.    int
1c920 20 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e   start_constrain
1c930 74 73 3b 20 20 20 20 20 20 20 2f 2a 20 53 74 61  ts;       /* Sta
1c940 72 74 20 6f 66 20 72 61 6e 67 65 20 69 73 20 63  rt of range is c
1c950 6f 6e 73 74 72 61 69 6e 65 64 20 2a 2f 0a 20 20  onstrained */.  
1c960 20 20 69 6e 74 20 6e 43 6f 6e 73 74 72 61 69 6e    int nConstrain
1c970 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  t;             /
1c980 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6e 73  * Number of cons
1c990 74 72 61 69 6e 74 20 74 65 72 6d 73 20 2a 2f 0a  traint terms */.
1c9a0 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b      Index *pIdx;
1c9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c9c0 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 77 65   /* The index we
1c9d0 20 77 69 6c 6c 20 62 65 20 75 73 69 6e 67 20 2a   will be using *
1c9e0 2f 0a 20 20 20 20 69 6e 74 20 69 49 64 78 43 75  /.    int iIdxCu
1c9f0 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
1ca00 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 63     /* The VDBE c
1ca10 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20 69 6e  ursor for the in
1ca20 64 65 78 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  dex */.    int n
1ca30 45 78 74 72 61 52 65 67 20 3d 20 30 3b 20 20 20  ExtraReg = 0;   
1ca40 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1ca50 72 20 6f 66 20 65 78 74 72 61 20 72 65 67 69 73  r of extra regis
1ca60 74 65 72 73 20 6e 65 65 64 65 64 20 2a 2f 0a 20  ters needed */. 
1ca70 20 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20     int op;      
1ca80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ca90 2f 2a 20 49 6e 73 74 72 75 63 74 69 6f 6e 20 6f  /* Instruction o
1caa0 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20 63 68 61  pcode */.    cha
1cab0 72 20 2a 7a 53 74 61 72 74 41 66 66 3b 20 20 20  r *zStartAff;   
1cac0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 66 66            /* Aff
1cad0 69 6e 69 74 79 20 66 6f 72 20 73 74 61 72 74 20  inity for start 
1cae0 6f 66 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61  of range constra
1caf0 69 6e 74 20 2a 2f 0a 20 20 20 20 63 68 61 72 20  int */.    char 
1cb00 63 45 6e 64 41 66 66 20 3d 20 30 3b 20 20 20 20  cEndAff = 0;    
1cb10 20 20 20 20 20 20 20 20 2f 2a 20 41 66 66 69 6e          /* Affin
1cb20 69 74 79 20 66 6f 72 20 65 6e 64 20 6f 66 20 72  ity for end of r
1cb30 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 20  ange constraint 
1cb40 2a 2f 0a 20 20 20 20 75 38 20 62 53 65 65 6b 50  */.    u8 bSeekP
1cb50 61 73 74 4e 75 6c 6c 20 3d 20 30 3b 20 20 20 20  astNull = 0;    
1cb60 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 73      /* True to s
1cb70 65 65 6b 20 70 61 73 74 20 69 6e 69 74 69 61 6c  eek past initial
1cb80 20 6e 75 6c 6c 73 20 2a 2f 0a 20 20 20 20 75 38   nulls */.    u8
1cb90 20 62 53 74 6f 70 41 74 4e 75 6c 6c 20 3d 20 30   bStopAtNull = 0
1cba0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64  ;          /* Ad
1cbb0 64 20 63 6f 6e 64 69 74 69 6f 6e 20 74 6f 20 74  d condition to t
1cbc0 65 72 6d 69 6e 61 74 65 20 61 74 20 4e 55 4c 4c  erminate at NULL
1cbd0 73 20 2a 2f 0a 0a 20 20 20 20 70 49 64 78 20 3d  s */..    pIdx =
1cbe0 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
1cbf0 70 49 6e 64 65 78 3b 0a 20 20 20 20 69 49 64 78  pIndex;.    iIdx
1cc00 43 75 72 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49  Cur = pLevel->iI
1cc10 64 78 43 75 72 3b 0a 20 20 20 20 61 73 73 65 72  dxCur;.    asser
1cc20 74 28 20 6e 45 71 3e 3d 70 4c 6f 6f 70 2d 3e 75  t( nEq>=pLoop->u
1cc30 2e 62 74 72 65 65 2e 6e 53 6b 69 70 20 29 3b 0a  .btree.nSkip );.
1cc40 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
1cc50 6c 6f 6f 70 20 73 61 74 69 73 66 69 65 73 20 61  loop satisfies a
1cc60 20 73 6f 72 74 20 6f 72 64 65 72 20 28 70 4f 72   sort order (pOr
1cc70 64 65 72 42 79 29 20 72 65 71 75 65 73 74 20 74  derBy) request t
1cc80 68 61 74 20 0a 20 20 20 20 2a 2a 20 77 61 73 20  hat .    ** was 
1cc90 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 66  passed to this f
1cca0 75 6e 63 74 69 6f 6e 20 74 6f 20 69 6d 70 6c 65  unction to imple
1ccb0 6d 65 6e 74 20 61 20 22 53 45 4c 45 43 54 20 6d  ment a "SELECT m
1ccc0 69 6e 28 78 29 20 2e 2e 2e 22 20 0a 20 20 20 20  in(x) ..." .    
1ccd0 2a 2a 20 71 75 65 72 79 2c 20 74 68 65 6e 20 74  ** query, then t
1cce0 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6f  he caller will o
1ccf0 6e 6c 79 20 61 6c 6c 6f 77 20 74 68 65 20 6c 6f  nly allow the lo
1cd00 6f 70 20 74 6f 20 72 75 6e 20 66 6f 72 0a 20 20  op to run for.  
1cd10 20 20 2a 2a 20 61 20 73 69 6e 67 6c 65 20 69 74    ** a single it
1cd20 65 72 61 74 69 6f 6e 2e 20 54 68 69 73 20 6d 65  eration. This me
1cd30 61 6e 73 20 74 68 61 74 20 74 68 65 20 66 69 72  ans that the fir
1cd40 73 74 20 72 6f 77 20 72 65 74 75 72 6e 65 64 0a  st row returned.
1cd50 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20 6e 6f      ** should no
1cd60 74 20 68 61 76 65 20 61 20 4e 55 4c 4c 20 76 61  t have a NULL va
1cd70 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20 27 78  lue stored in 'x
1cd80 27 2e 20 49 66 20 63 6f 6c 75 6d 6e 20 27 78 27  '. If column 'x'
1cd90 20 69 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 66   is.    ** the f
1cda0 69 72 73 74 20 6f 6e 65 20 61 66 74 65 72 20 74  irst one after t
1cdb0 68 65 20 6e 45 71 20 65 71 75 61 6c 69 74 79 20  he nEq equality 
1cdc0 63 6f 6e 73 74 72 61 69 6e 74 73 20 69 6e 20 74  constraints in t
1cdd0 68 65 20 69 6e 64 65 78 2c 0a 20 20 20 20 2a 2a  he index,.    **
1cde0 20 74 68 69 73 20 72 65 71 75 69 72 65 73 20 73   this requires s
1cdf0 6f 6d 65 20 73 70 65 63 69 61 6c 20 68 61 6e 64  ome special hand
1ce00 6c 69 6e 67 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ling..    */.   
1ce10 20 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d   assert( pWInfo-
1ce20 3e 70 4f 72 64 65 72 42 79 3d 3d 30 0a 20 20 20  >pOrderBy==0.   
1ce30 20 20 20 20 20 20 7c 7c 20 70 57 49 6e 66 6f 2d        || pWInfo-
1ce40 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  >pOrderBy->nExpr
1ce50 3d 3d 31 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  ==1.         || 
1ce60 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c  (pWInfo->wctrlFl
1ce70 61 67 73 26 57 48 45 52 45 5f 4f 52 44 45 52 42  ags&WHERE_ORDERB
1ce80 59 5f 4d 49 4e 29 3d 3d 30 20 29 3b 0a 20 20 20  Y_MIN)==0 );.   
1ce90 20 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63   if( (pWInfo->wc
1cea0 74 72 6c 46 6c 61 67 73 26 57 48 45 52 45 5f 4f  trlFlags&WHERE_O
1ceb0 52 44 45 52 42 59 5f 4d 49 4e 29 21 3d 30 0a 20  RDERBY_MIN)!=0. 
1cec0 20 20 20 20 26 26 20 70 57 49 6e 66 6f 2d 3e 6e      && pWInfo->n
1ced0 4f 42 53 61 74 3e 30 0a 20 20 20 20 20 26 26 20  OBSat>0.     && 
1cee0 28 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3e 6e  (pIdx->nKeyCol>n
1cef0 45 71 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  Eq).    ){.     
1cf00 20 61 73 73 65 72 74 28 20 70 4c 6f 6f 70 2d 3e   assert( pLoop->
1cf10 75 2e 62 74 72 65 65 2e 6e 53 6b 69 70 3d 3d 30  u.btree.nSkip==0
1cf20 20 29 3b 0a 20 20 20 20 20 20 62 53 65 65 6b 50   );.      bSeekP
1cf30 61 73 74 4e 75 6c 6c 20 3d 20 31 3b 0a 20 20 20  astNull = 1;.   
1cf40 20 20 20 6e 45 78 74 72 61 52 65 67 20 3d 20 31     nExtraReg = 1
1cf50 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1cf60 46 69 6e 64 20 61 6e 79 20 69 6e 65 71 75 61 6c  Find any inequal
1cf70 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 74  ity constraint t
1cf80 65 72 6d 73 20 66 6f 72 20 74 68 65 20 73 74 61  erms for the sta
1cf90 72 74 20 61 6e 64 20 65 6e 64 20 0a 20 20 20 20  rt and end .    
1cfa0 2a 2a 20 6f 66 20 74 68 65 20 72 61 6e 67 65 2e  ** of the range.
1cfb0 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6a 20 3d   .    */.    j =
1cfc0 20 6e 45 71 3b 0a 20 20 20 20 69 66 28 20 70 4c   nEq;.    if( pL
1cfd0 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
1cfe0 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29  HERE_BTM_LIMIT )
1cff0 7b 0a 20 20 20 20 20 20 70 52 61 6e 67 65 53 74  {.      pRangeSt
1d000 61 72 74 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54  art = pLoop->aLT
1d010 65 72 6d 5b 6a 2b 2b 5d 3b 0a 20 20 20 20 20 20  erm[j++];.      
1d020 6e 45 78 74 72 61 52 65 67 20 3d 20 31 3b 0a 20  nExtraReg = 1;. 
1d030 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 6f     }.    if( pLo
1d040 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
1d050 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20 29 7b  ERE_TOP_LIMIT ){
1d060 0a 20 20 20 20 20 20 70 52 61 6e 67 65 45 6e 64  .      pRangeEnd
1d070 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d   = pLoop->aLTerm
1d080 5b 6a 2b 2b 5d 3b 0a 20 20 20 20 20 20 6e 45 78  [j++];.      nEx
1d090 74 72 61 52 65 67 20 3d 20 31 3b 0a 20 20 20 20  traReg = 1;.    
1d0a0 20 20 69 66 28 20 70 52 61 6e 67 65 53 74 61 72    if( pRangeStar
1d0b0 74 3d 3d 30 0a 20 20 20 20 20 20 20 26 26 20 28  t==0.       && (
1d0c0 6a 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  j = pIdx->aiColu
1d0d0 6d 6e 5b 6e 45 71 5d 29 3e 3d 30 20 0a 20 20 20  mn[nEq])>=0 .   
1d0e0 20 20 20 20 26 26 20 70 49 64 78 2d 3e 70 54 61      && pIdx->pTa
1d0f0 62 6c 65 2d 3e 61 43 6f 6c 5b 6a 5d 2e 6e 6f 74  ble->aCol[j].not
1d100 4e 75 6c 6c 3d 3d 30 0a 20 20 20 20 20 20 29 7b  Null==0.      ){
1d110 0a 20 20 20 20 20 20 20 20 62 53 65 65 6b 50 61  .        bSeekPa
1d120 73 74 4e 75 6c 6c 20 3d 20 31 3b 0a 20 20 20 20  stNull = 1;.    
1d130 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73    }.    }.    as
1d140 73 65 72 74 28 20 70 52 61 6e 67 65 45 6e 64 3d  sert( pRangeEnd=
1d150 3d 30 20 7c 7c 20 28 70 52 61 6e 67 65 45 6e 64  =0 || (pRangeEnd
1d160 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
1d170 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29 3b 0a 0a 20  _VNULL)==0 );.. 
1d180 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63     /* Generate c
1d190 6f 64 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20  ode to evaluate 
1d1a0 61 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74 20 74  all constraint t
1d1b0 65 72 6d 73 20 75 73 69 6e 67 20 3d 3d 20 6f 72  erms using == or
1d1c0 20 49 4e 0a 20 20 20 20 2a 2a 20 61 6e 64 20 73   IN.    ** and s
1d1d0 74 6f 72 65 20 74 68 65 20 76 61 6c 75 65 73 20  tore the values 
1d1e0 6f 66 20 74 68 6f 73 65 20 74 65 72 6d 73 20 69  of those terms i
1d1f0 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20 72 65  n an array of re
1d200 67 69 73 74 65 72 73 0a 20 20 20 20 2a 2a 20 73  gisters.    ** s
1d210 74 61 72 74 69 6e 67 20 61 74 20 72 65 67 42 61  tarting at regBa
1d220 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  se..    */.    r
1d230 65 67 42 61 73 65 20 3d 20 63 6f 64 65 41 6c 6c  egBase = codeAll
1d240 45 71 75 61 6c 69 74 79 54 65 72 6d 73 28 70 50  EqualityTerms(pP
1d250 61 72 73 65 2c 70 4c 65 76 65 6c 2c 62 52 65 76  arse,pLevel,bRev
1d260 2c 6e 45 78 74 72 61 52 65 67 2c 26 7a 53 74 61  ,nExtraReg,&zSta
1d270 72 74 41 66 66 29 3b 0a 20 20 20 20 61 73 73 65  rtAff);.    asse
1d280 72 74 28 20 7a 53 74 61 72 74 41 66 66 3d 3d 30  rt( zStartAff==0
1d290 20 7c 7c 20 73 71 6c 69 74 65 33 53 74 72 6c 65   || sqlite3Strle
1d2a0 6e 33 30 28 7a 53 74 61 72 74 41 66 66 29 3e 3d  n30(zStartAff)>=
1d2b0 6e 45 71 20 29 3b 0a 20 20 20 20 69 66 28 20 7a  nEq );.    if( z
1d2c0 53 74 61 72 74 41 66 66 20 29 20 63 45 6e 64 41  StartAff ) cEndA
1d2d0 66 66 20 3d 20 7a 53 74 61 72 74 41 66 66 5b 6e  ff = zStartAff[n
1d2e0 45 71 5d 3b 0a 20 20 20 20 61 64 64 72 4e 78 74  Eq];.    addrNxt
1d2f0 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e   = pLevel->addrN
1d300 78 74 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 77  xt;..    /* If w
1d310 65 20 61 72 65 20 64 6f 69 6e 67 20 61 20 72 65  e are doing a re
1d320 76 65 72 73 65 20 6f 72 64 65 72 20 73 63 61 6e  verse order scan
1d330 20 6f 6e 20 61 6e 20 61 73 63 65 6e 64 69 6e 67   on an ascending
1d340 20 69 6e 64 65 78 2c 20 6f 72 0a 20 20 20 20 2a   index, or.    *
1d350 2a 20 61 20 66 6f 72 77 61 72 64 20 6f 72 64 65  * a forward orde
1d360 72 20 73 63 61 6e 20 6f 6e 20 61 20 64 65 73 63  r scan on a desc
1d370 65 6e 64 69 6e 67 20 69 6e 64 65 78 2c 20 69 6e  ending index, in
1d380 74 65 72 63 68 61 6e 67 65 20 74 68 65 20 0a 20  terchange the . 
1d390 20 20 20 2a 2a 20 73 74 61 72 74 20 61 6e 64 20     ** start and 
1d3a0 65 6e 64 20 74 65 72 6d 73 20 28 70 52 61 6e 67  end terms (pRang
1d3b0 65 53 74 61 72 74 20 61 6e 64 20 70 52 61 6e 67  eStart and pRang
1d3c0 65 45 6e 64 29 2e 0a 20 20 20 20 2a 2f 0a 20 20  eEnd)..    */.  
1d3d0 20 20 69 66 28 20 28 6e 45 71 3c 70 49 64 78 2d    if( (nEq<pIdx-
1d3e0 3e 6e 4b 65 79 43 6f 6c 20 26 26 20 62 52 65 76  >nKeyCol && bRev
1d3f0 3d 3d 28 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72  ==(pIdx->aSortOr
1d400 64 65 72 5b 6e 45 71 5d 3d 3d 53 51 4c 49 54 45  der[nEq]==SQLITE
1d410 5f 53 4f 5f 41 53 43 29 29 0a 20 20 20 20 20 7c  _SO_ASC)).     |
1d420 7c 20 28 62 52 65 76 20 26 26 20 70 49 64 78 2d  | (bRev && pIdx-
1d430 3e 6e 4b 65 79 43 6f 6c 3d 3d 6e 45 71 29 0a 20  >nKeyCol==nEq). 
1d440 20 20 20 29 7b 0a 20 20 20 20 20 20 53 57 41 50     ){.      SWAP
1d450 28 57 68 65 72 65 54 65 72 6d 20 2a 2c 20 70 52  (WhereTerm *, pR
1d460 61 6e 67 65 45 6e 64 2c 20 70 52 61 6e 67 65 53  angeEnd, pRangeS
1d470 74 61 72 74 29 3b 0a 20 20 20 20 20 20 53 57 41  tart);.      SWA
1d480 50 28 75 38 2c 20 62 53 65 65 6b 50 61 73 74 4e  P(u8, bSeekPastN
1d490 75 6c 6c 2c 20 62 53 74 6f 70 41 74 4e 75 6c 6c  ull, bStopAtNull
1d4a0 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 74 65  );.    }..    te
1d4b0 73 74 63 61 73 65 28 20 70 52 61 6e 67 65 53 74  stcase( pRangeSt
1d4c0 61 72 74 20 26 26 20 28 70 52 61 6e 67 65 53 74  art && (pRangeSt
1d4d0 61 72 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  art->eOperator &
1d4e0 20 57 4f 5f 4c 45 29 21 3d 30 20 29 3b 0a 20 20   WO_LE)!=0 );.  
1d4f0 20 20 74 65 73 74 63 61 73 65 28 20 70 52 61 6e    testcase( pRan
1d500 67 65 53 74 61 72 74 20 26 26 20 28 70 52 61 6e  geStart && (pRan
1d510 67 65 53 74 61 72 74 2d 3e 65 4f 70 65 72 61 74  geStart->eOperat
1d520 6f 72 20 26 20 57 4f 5f 47 45 29 21 3d 30 20 29  or & WO_GE)!=0 )
1d530 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
1d540 70 52 61 6e 67 65 45 6e 64 20 26 26 20 28 70 52  pRangeEnd && (pR
1d550 61 6e 67 65 45 6e 64 2d 3e 65 4f 70 65 72 61 74  angeEnd->eOperat
1d560 6f 72 20 26 20 57 4f 5f 4c 45 29 21 3d 30 20 29  or & WO_LE)!=0 )
1d570 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
1d580 70 52 61 6e 67 65 45 6e 64 20 26 26 20 28 70 52  pRangeEnd && (pR
1d590 61 6e 67 65 45 6e 64 2d 3e 65 4f 70 65 72 61 74  angeEnd->eOperat
1d5a0 6f 72 20 26 20 57 4f 5f 47 45 29 21 3d 30 20 29  or & WO_GE)!=0 )
1d5b0 3b 0a 20 20 20 20 73 74 61 72 74 45 71 20 3d 20  ;.    startEq = 
1d5c0 21 70 52 61 6e 67 65 53 74 61 72 74 20 7c 7c 20  !pRangeStart || 
1d5d0 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 65 4f 70  pRangeStart->eOp
1d5e0 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 4c 45 7c  erator & (WO_LE|
1d5f0 57 4f 5f 47 45 29 3b 0a 20 20 20 20 65 6e 64 45  WO_GE);.    endE
1d600 71 20 3d 20 20 20 21 70 52 61 6e 67 65 45 6e 64  q =   !pRangeEnd
1d610 20 7c 7c 20 70 52 61 6e 67 65 45 6e 64 2d 3e 65   || pRangeEnd->e
1d620 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 4c  Operator & (WO_L
1d630 45 7c 57 4f 5f 47 45 29 3b 0a 20 20 20 20 73 74  E|WO_GE);.    st
1d640 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20  art_constraints 
1d650 3d 20 70 52 61 6e 67 65 53 74 61 72 74 20 7c 7c  = pRangeStart ||
1d660 20 6e 45 71 3e 30 3b 0a 0a 20 20 20 20 2f 2a 20   nEq>0;..    /* 
1d670 53 65 65 6b 20 74 68 65 20 69 6e 64 65 78 20 63  Seek the index c
1d680 75 72 73 6f 72 20 74 6f 20 74 68 65 20 73 74 61  ursor to the sta
1d690 72 74 20 6f 66 20 74 68 65 20 72 61 6e 67 65 2e  rt of the range.
1d6a0 20 2a 2f 0a 20 20 20 20 6e 43 6f 6e 73 74 72 61   */.    nConstra
1d6b0 69 6e 74 20 3d 20 6e 45 71 3b 0a 20 20 20 20 69  int = nEq;.    i
1d6c0 66 28 20 70 52 61 6e 67 65 53 74 61 72 74 20 29  f( pRangeStart )
1d6d0 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 52  {.      Expr *pR
1d6e0 69 67 68 74 20 3d 20 70 52 61 6e 67 65 53 74 61  ight = pRangeSta
1d6f0 72 74 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68  rt->pExpr->pRigh
1d700 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  t;.      sqlite3
1d710 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
1d720 20 70 52 69 67 68 74 2c 20 72 65 67 42 61 73 65   pRight, regBase
1d730 2b 6e 45 71 29 3b 0a 20 20 20 20 20 20 69 66 28  +nEq);.      if(
1d740 20 28 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 77   (pRangeStart->w
1d750 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e  tFlags & TERM_VN
1d760 55 4c 4c 29 3d 3d 30 0a 20 20 20 20 20 20 20 26  ULL)==0.       &
1d770 26 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 6e  & sqlite3ExprCan
1d780 42 65 4e 75 6c 6c 28 70 52 69 67 68 74 29 0a 20  BeNull(pRight). 
1d790 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
1d7a0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1d7b0 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20  2(v, OP_IsNull, 
1d7c0 72 65 67 42 61 73 65 2b 6e 45 71 2c 20 61 64 64  regBase+nEq, add
1d7d0 72 4e 78 74 29 3b 0a 20 20 20 20 20 20 20 20 56  rNxt);.        V
1d7e0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
1d7f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
1d800 28 20 7a 53 74 61 72 74 41 66 66 20 29 7b 0a 20  ( zStartAff ){. 
1d810 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
1d820 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74  e3CompareAffinit
1d830 79 28 70 52 69 67 68 74 2c 20 7a 53 74 61 72 74  y(pRight, zStart
1d840 41 66 66 5b 6e 45 71 5d 29 3d 3d 53 51 4c 49 54  Aff[nEq])==SQLIT
1d850 45 5f 41 46 46 5f 4e 4f 4e 45 29 7b 0a 20 20 20  E_AFF_NONE){.   
1d860 20 20 20 20 20 20 20 2f 2a 20 53 69 6e 63 65 20         /* Since 
1d870 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69  the comparison i
1d880 73 20 74 6f 20 62 65 20 70 65 72 66 6f 72 6d 65  s to be performe
1d890 64 20 77 69 74 68 20 6e 6f 20 63 6f 6e 76 65 72  d with no conver
1d8a0 73 69 6f 6e 73 0a 20 20 20 20 20 20 20 20 20 20  sions.          
1d8b0 2a 2a 20 61 70 70 6c 69 65 64 20 74 6f 20 74 68  ** applied to th
1d8c0 65 20 6f 70 65 72 61 6e 64 73 2c 20 73 65 74 20  e operands, set 
1d8d0 74 68 65 20 61 66 66 69 6e 69 74 79 20 74 6f 20  the affinity to 
1d8e0 61 70 70 6c 79 20 74 6f 20 70 52 69 67 68 74 20  apply to pRight 
1d8f0 74 6f 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  to .          **
1d900 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45   SQLITE_AFF_NONE
1d910 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  .  */.          
1d920 7a 53 74 61 72 74 41 66 66 5b 6e 45 71 5d 20 3d  zStartAff[nEq] =
1d930 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45   SQLITE_AFF_NONE
1d940 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1d950 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
1d960 78 70 72 4e 65 65 64 73 4e 6f 41 66 66 69 6e 69  xprNeedsNoAffini
1d970 74 79 43 68 61 6e 67 65 28 70 52 69 67 68 74 2c  tyChange(pRight,
1d980 20 7a 53 74 61 72 74 41 66 66 5b 6e 45 71 5d 29   zStartAff[nEq])
1d990 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 53   ){.          zS
1d9a0 74 61 72 74 41 66 66 5b 6e 45 71 5d 20 3d 20 53  tartAff[nEq] = S
1d9b0 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a  QLITE_AFF_NONE;.
1d9c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1d9d0 7d 20 20 0a 20 20 20 20 20 20 6e 43 6f 6e 73 74  }  .      nConst
1d9e0 72 61 69 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 74  raint++;.      t
1d9f0 65 73 74 63 61 73 65 28 20 70 52 61 6e 67 65 53  estcase( pRangeS
1da00 74 61 72 74 2d 3e 77 74 46 6c 61 67 73 20 26 20  tart->wtFlags & 
1da10 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a  TERM_VIRTUAL );.
1da20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 62 53      }else if( bS
1da30 65 65 6b 50 61 73 74 4e 75 6c 6c 20 29 7b 0a 20  eekPastNull ){. 
1da40 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1da50 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp2(v, OP_Nul
1da60 6c 2c 20 30 2c 20 72 65 67 42 61 73 65 2b 6e 45  l, 0, regBase+nE
1da70 71 29 3b 0a 20 20 20 20 20 20 6e 43 6f 6e 73 74  q);.      nConst
1da80 72 61 69 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 73  raint++;.      s
1da90 74 61 72 74 45 71 20 3d 20 30 3b 0a 20 20 20 20  tartEq = 0;.    
1daa0 20 20 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69    start_constrai
1dab0 6e 74 73 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  nts = 1;.    }. 
1dac0 20 20 20 63 6f 64 65 41 70 70 6c 79 41 66 66 69     codeApplyAffi
1dad0 6e 69 74 79 28 70 50 61 72 73 65 2c 20 72 65 67  nity(pParse, reg
1dae0 42 61 73 65 2c 20 6e 43 6f 6e 73 74 72 61 69 6e  Base, nConstrain
1daf0 74 20 2d 20 62 53 65 65 6b 50 61 73 74 4e 75 6c  t - bSeekPastNul
1db00 6c 2c 20 7a 53 74 61 72 74 41 66 66 29 3b 0a 20  l, zStartAff);. 
1db10 20 20 20 6f 70 20 3d 20 61 53 74 61 72 74 4f 70     op = aStartOp
1db20 5b 28 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69  [(start_constrai
1db30 6e 74 73 3c 3c 32 29 20 2b 20 28 73 74 61 72 74  nts<<2) + (start
1db40 45 71 3c 3c 31 29 20 2b 20 62 52 65 76 5d 3b 0a  Eq<<1) + bRev];.
1db50 20 20 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d      assert( op!=
1db60 30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 );.    sqlite3
1db70 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c  VdbeAddOp4Int(v,
1db80 20 6f 70 2c 20 69 49 64 78 43 75 72 2c 20 61 64   op, iIdxCur, ad
1db90 64 72 4e 78 74 2c 20 72 65 67 42 61 73 65 2c 20  drNxt, regBase, 
1dba0 6e 43 6f 6e 73 74 72 61 69 6e 74 29 3b 0a 20 20  nConstraint);.  
1dbb0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
1dbc0 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72  );.    VdbeCover
1dbd0 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f  ageIf(v, op==OP_
1dbe0 52 65 77 69 6e 64 29 3b 20 20 74 65 73 74 63 61  Rewind);  testca
1dbf0 73 65 28 20 6f 70 3d 3d 4f 50 5f 52 65 77 69 6e  se( op==OP_Rewin
1dc00 64 20 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76  d );.    VdbeCov
1dc10 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f  erageIf(v, op==O
1dc20 50 5f 4c 61 73 74 29 3b 20 20 20 20 74 65 73 74  P_Last);    test
1dc30 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 4c 61 73  case( op==OP_Las
1dc40 74 20 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76  t );.    VdbeCov
1dc50 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f  erageIf(v, op==O
1dc60 50 5f 53 65 65 6b 47 54 29 3b 20 20 74 65 73 74  P_SeekGT);  test
1dc70 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 53 65 65  case( op==OP_See
1dc80 6b 47 54 20 29 3b 0a 20 20 20 20 56 64 62 65 43  kGT );.    VdbeC
1dc90 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d  overageIf(v, op=
1dca0 3d 4f 50 5f 53 65 65 6b 47 45 29 3b 20 20 74 65  =OP_SeekGE);  te
1dcb0 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 53  stcase( op==OP_S
1dcc0 65 65 6b 47 45 20 29 3b 0a 20 20 20 20 56 64 62  eekGE );.    Vdb
1dcd0 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f  eCoverageIf(v, o
1dce0 70 3d 3d 4f 50 5f 53 65 65 6b 4c 45 29 3b 20 20  p==OP_SeekLE);  
1dcf0 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50  testcase( op==OP
1dd00 5f 53 65 65 6b 4c 45 20 29 3b 0a 20 20 20 20 56  _SeekLE );.    V
1dd10 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
1dd20 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 4c 54 29 3b   op==OP_SeekLT);
1dd30 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1dd40 4f 50 5f 53 65 65 6b 4c 54 20 29 3b 0a 0a 20 20  OP_SeekLT );..  
1dd50 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 76 61    /* Load the va
1dd60 6c 75 65 20 66 6f 72 20 74 68 65 20 69 6e 65 71  lue for the ineq
1dd70 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
1dd80 74 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  t at the end of 
1dd90 74 68 65 0a 20 20 20 20 2a 2a 20 72 61 6e 67 65  the.    ** range
1dda0 20 28 69 66 20 61 6e 79 29 2e 0a 20 20 20 20 2a   (if any)..    *
1ddb0 2f 0a 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e  /.    nConstrain
1ddc0 74 20 3d 20 6e 45 71 3b 0a 20 20 20 20 69 66 28  t = nEq;.    if(
1ddd0 20 70 52 61 6e 67 65 45 6e 64 20 29 7b 0a 20 20   pRangeEnd ){.  
1dde0 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68 74      Expr *pRight
1ddf0 20 3d 20 70 52 61 6e 67 65 45 6e 64 2d 3e 70 45   = pRangeEnd->pE
1de00 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20  xpr->pRight;.   
1de10 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
1de20 63 68 65 52 65 6d 6f 76 65 28 70 50 61 72 73 65  cheRemove(pParse
1de30 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 2c 20 31  , regBase+nEq, 1
1de40 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1de50 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
1de60 20 70 52 69 67 68 74 2c 20 72 65 67 42 61 73 65   pRight, regBase
1de70 2b 6e 45 71 29 3b 0a 20 20 20 20 20 20 69 66 28  +nEq);.      if(
1de80 20 28 70 52 61 6e 67 65 45 6e 64 2d 3e 77 74 46   (pRangeEnd->wtF
1de90 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c  lags & TERM_VNUL
1dea0 4c 29 3d 3d 30 0a 20 20 20 20 20 20 20 26 26 20  L)==0.       && 
1deb0 73 71 6c 69 74 65 33 45 78 70 72 43 61 6e 42 65  sqlite3ExprCanBe
1dec0 4e 75 6c 6c 28 70 52 69 67 68 74 29 0a 20 20 20  Null(pRight).   
1ded0 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71     ){.        sq
1dee0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1def0 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 65  v, OP_IsNull, re
1df00 67 42 61 73 65 2b 6e 45 71 2c 20 61 64 64 72 4e  gBase+nEq, addrN
1df10 78 74 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62  xt);.        Vdb
1df20 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
1df30 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
1df40 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66  sqlite3CompareAf
1df50 66 69 6e 69 74 79 28 70 52 69 67 68 74 2c 20 63  finity(pRight, c
1df60 45 6e 64 41 66 66 29 21 3d 53 51 4c 49 54 45 5f  EndAff)!=SQLITE_
1df70 41 46 46 5f 4e 4f 4e 45 0a 20 20 20 20 20 20 20  AFF_NONE.       
1df80 26 26 20 21 73 71 6c 69 74 65 33 45 78 70 72 4e  && !sqlite3ExprN
1df90 65 65 64 73 4e 6f 41 66 66 69 6e 69 74 79 43 68  eedsNoAffinityCh
1dfa0 61 6e 67 65 28 70 52 69 67 68 74 2c 20 63 45 6e  ange(pRight, cEn
1dfb0 64 41 66 66 29 0a 20 20 20 20 20 20 29 7b 0a 20  dAff).      ){. 
1dfc0 20 20 20 20 20 20 20 63 6f 64 65 41 70 70 6c 79         codeApply
1dfd0 41 66 66 69 6e 69 74 79 28 70 50 61 72 73 65 2c  Affinity(pParse,
1dfe0 20 72 65 67 42 61 73 65 2b 6e 45 71 2c 20 31 2c   regBase+nEq, 1,
1dff0 20 26 63 45 6e 64 41 66 66 29 3b 0a 20 20 20 20   &cEndAff);.    
1e000 20 20 7d 0a 20 20 20 20 20 20 6e 43 6f 6e 73 74    }.      nConst
1e010 72 61 69 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 74  raint++;.      t
1e020 65 73 74 63 61 73 65 28 20 70 52 61 6e 67 65 45  estcase( pRangeE
1e030 6e 64 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  nd->wtFlags & TE
1e040 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20 20  RM_VIRTUAL );.  
1e050 20 20 7d 65 6c 73 65 20 69 66 28 20 62 53 74 6f    }else if( bSto
1e060 70 41 74 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20  pAtNull ){.     
1e070 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1e080 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  p2(v, OP_Null, 0
1e090 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 29 3b 0a  , regBase+nEq);.
1e0a0 20 20 20 20 20 20 65 6e 64 45 71 20 3d 20 30 3b        endEq = 0;
1e0b0 0a 20 20 20 20 20 20 6e 43 6f 6e 73 74 72 61 69  .      nConstrai
1e0c0 6e 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  nt++;.    }.    
1e0d0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
1e0e0 2c 20 7a 53 74 61 72 74 41 66 66 29 3b 0a 0a 20  , zStartAff);.. 
1e0f0 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65     /* Top of the
1e100 20 6c 6f 6f 70 20 62 6f 64 79 20 2a 2f 0a 20 20   loop body */.  
1e110 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 73    pLevel->p2 = s
1e120 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
1e130 74 41 64 64 72 28 76 29 3b 0a 0a 20 20 20 20 2f  tAddr(v);..    /
1e140 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 69  * Check if the i
1e150 6e 64 65 78 20 63 75 72 73 6f 72 20 69 73 20 70  ndex cursor is p
1e160 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ast the end of t
1e170 68 65 20 72 61 6e 67 65 2e 20 2a 2f 0a 20 20 20  he range. */.   
1e180 20 69 66 28 20 6e 43 6f 6e 73 74 72 61 69 6e 74   if( nConstraint
1e190 20 29 7b 0a 20 20 20 20 20 20 6f 70 20 3d 20 61   ){.      op = a
1e1a0 45 6e 64 4f 70 5b 62 52 65 76 2a 32 20 2b 20 65  EndOp[bRev*2 + e
1e1b0 6e 64 45 71 5d 3b 0a 20 20 20 20 20 20 73 71 6c  ndEq];.      sql
1e1c0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
1e1d0 74 28 76 2c 20 6f 70 2c 20 69 49 64 78 43 75 72  t(v, op, iIdxCur
1e1e0 2c 20 61 64 64 72 4e 78 74 2c 20 72 65 67 42 61  , addrNxt, regBa
1e1f0 73 65 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74 29  se, nConstraint)
1e200 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1e210 28 20 6f 70 3d 3d 4f 50 5f 49 64 78 47 54 20 29  ( op==OP_IdxGT )
1e220 3b 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49  ;  VdbeCoverageI
1e230 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 49 64 78 47  f(v, op==OP_IdxG
1e240 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  T );.      testc
1e250 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 49 64 78 47  ase( op==OP_IdxG
1e260 45 20 29 3b 20 20 56 64 62 65 43 6f 76 65 72 61  E );  VdbeCovera
1e270 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 49  geIf(v, op==OP_I
1e280 64 78 47 45 20 29 3b 0a 20 20 20 20 20 20 74 65  dxGE );.      te
1e290 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 49  stcase( op==OP_I
1e2a0 64 78 4c 54 20 29 3b 20 20 56 64 62 65 43 6f 76  dxLT );  VdbeCov
1e2b0 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f  erageIf(v, op==O
1e2c0 50 5f 49 64 78 4c 54 20 29 3b 0a 20 20 20 20 20  P_IdxLT );.     
1e2d0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f   testcase( op==O
1e2e0 50 5f 49 64 78 4c 45 20 29 3b 20 20 56 64 62 65  P_IdxLE );  Vdbe
1e2f0 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70  CoverageIf(v, op
1e300 3d 3d 4f 50 5f 49 64 78 4c 45 20 29 3b 0a 20 20  ==OP_IdxLE );.  
1e310 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 65 6b    }..    /* Seek
1e320 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 73 6f   the table curso
1e330 72 2c 20 69 66 20 72 65 71 75 69 72 65 64 20 2a  r, if required *
1e340 2f 0a 20 20 20 20 64 69 73 61 62 6c 65 54 65 72  /.    disableTer
1e350 6d 28 70 4c 65 76 65 6c 2c 20 70 52 61 6e 67 65  m(pLevel, pRange
1e360 53 74 61 72 74 29 3b 0a 20 20 20 20 64 69 73 61  Start);.    disa
1e370 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20  bleTerm(pLevel, 
1e380 70 52 61 6e 67 65 45 6e 64 29 3b 0a 20 20 20 20  pRangeEnd);.    
1e390 69 66 28 20 6f 6d 69 74 54 61 62 6c 65 20 29 7b  if( omitTable ){
1e3a0 0a 20 20 20 20 20 20 2f 2a 20 70 49 64 78 20 69  .      /* pIdx i
1e3b0 73 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64  s a covering ind
1e3c0 65 78 2e 20 20 4e 6f 20 6e 65 65 64 20 74 6f 20  ex.  No need to 
1e3d0 61 63 63 65 73 73 20 74 68 65 20 6d 61 69 6e 20  access the main 
1e3e0 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 7d 65  table. */.    }e
1e3f0 6c 73 65 20 69 66 28 20 48 61 73 52 6f 77 69 64  lse if( HasRowid
1e400 28 70 49 64 78 2d 3e 70 54 61 62 6c 65 29 20 29  (pIdx->pTable) )
1e410 7b 0a 20 20 20 20 20 20 69 52 6f 77 69 64 52 65  {.      iRowidRe
1e420 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  g = ++pParse->nM
1e430 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  em;.      sqlite
1e440 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1e450 50 5f 49 64 78 52 6f 77 69 64 2c 20 69 49 64 78  P_IdxRowid, iIdx
1e460 43 75 72 2c 20 69 52 6f 77 69 64 52 65 67 29 3b  Cur, iRowidReg);
1e470 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1e480 70 72 43 61 63 68 65 53 74 6f 72 65 28 70 50 61  prCacheStore(pPa
1e490 72 73 65 2c 20 69 43 75 72 2c 20 2d 31 2c 20 69  rse, iCur, -1, i
1e4a0 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20 20  RowidReg);.     
1e4b0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1e4c0 70 32 28 76 2c 20 4f 50 5f 53 65 65 6b 2c 20 69  p2(v, OP_Seek, i
1e4d0 43 75 72 2c 20 69 52 6f 77 69 64 52 65 67 29 3b  Cur, iRowidReg);
1e4e0 20 20 2f 2a 20 44 65 66 65 72 72 65 64 20 73 65    /* Deferred se
1e4f0 65 6b 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 20  ek */.    }else 
1e500 69 66 28 20 69 43 75 72 21 3d 69 49 64 78 43 75  if( iCur!=iIdxCu
1e510 72 20 29 7b 0a 20 20 20 20 20 20 49 6e 64 65 78  r ){.      Index
1e520 20 2a 70 50 6b 20 3d 20 73 71 6c 69 74 65 33 50   *pPk = sqlite3P
1e530 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70  rimaryKeyIndex(p
1e540 49 64 78 2d 3e 70 54 61 62 6c 65 29 3b 0a 20 20  Idx->pTable);.  
1e550 20 20 20 20 69 52 6f 77 69 64 52 65 67 20 3d 20      iRowidReg = 
1e560 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61  sqlite3GetTempRa
1e570 6e 67 65 28 70 50 61 72 73 65 2c 20 70 50 6b 2d  nge(pParse, pPk-
1e580 3e 6e 4b 65 79 43 6f 6c 29 3b 0a 20 20 20 20 20  >nKeyCol);.     
1e590 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 50 6b 2d   for(j=0; j<pPk-
1e5a0 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a  >nKeyCol; j++){.
1e5b0 20 20 20 20 20 20 20 20 6b 20 3d 20 73 71 6c 69          k = sqli
1e5c0 74 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78  te3ColumnOfIndex
1e5d0 28 70 49 64 78 2c 20 70 50 6b 2d 3e 61 69 43 6f  (pIdx, pPk->aiCo
1e5e0 6c 75 6d 6e 5b 6a 5d 29 3b 0a 20 20 20 20 20 20  lumn[j]);.      
1e5f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1e600 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  Op3(v, OP_Column
1e610 2c 20 69 49 64 78 43 75 72 2c 20 6b 2c 20 69 52  , iIdxCur, k, iR
1e620 6f 77 69 64 52 65 67 2b 6a 29 3b 0a 20 20 20 20  owidReg+j);.    
1e630 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
1e640 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
1e650 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 69  , OP_NotFound, i
1e660 43 75 72 2c 20 61 64 64 72 43 6f 6e 74 2c 0a 20  Cur, addrCont,. 
1e670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e680 20 20 20 20 20 20 20 20 20 20 69 52 6f 77 69 64            iRowid
1e690 52 65 67 2c 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f  Reg, pPk->nKeyCo
1e6a0 6c 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  l); VdbeCoverage
1e6b0 28 76 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  (v);.    }..    
1e6c0 2f 2a 20 52 65 63 6f 72 64 20 74 68 65 20 69 6e  /* Record the in
1e6d0 73 74 72 75 63 74 69 6f 6e 20 75 73 65 64 20 74  struction used t
1e6e0 6f 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20  o terminate the 
1e6f0 6c 6f 6f 70 2e 20 44 69 73 61 62 6c 65 20 0a 20  loop. Disable . 
1e700 20 20 20 2a 2a 20 57 48 45 52 45 20 63 6c 61 75     ** WHERE clau
1e710 73 65 20 74 65 72 6d 73 20 6d 61 64 65 20 72 65  se terms made re
1e720 64 75 6e 64 61 6e 74 20 62 79 20 74 68 65 20 69  dundant by the i
1e730 6e 64 65 78 20 72 61 6e 67 65 20 73 63 61 6e 2e  ndex range scan.
1e740 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1e750 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
1e760 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 20 29 7b   WHERE_ONEROW ){
1e770 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f  .      pLevel->o
1e780 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20  p = OP_Noop;.   
1e790 20 7d 65 6c 73 65 20 69 66 28 20 62 52 65 76 20   }else if( bRev 
1e7a0 29 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d  ){.      pLevel-
1e7b0 3e 6f 70 20 3d 20 4f 50 5f 50 72 65 76 3b 0a 20  >op = OP_Prev;. 
1e7c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1e7d0 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f  pLevel->op = OP_
1e7e0 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Next;.    }.    
1e7f0 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69 49 64  pLevel->p1 = iId
1e800 78 43 75 72 3b 0a 20 20 20 20 70 4c 65 76 65 6c  xCur;.    pLevel
1e810 2d 3e 70 33 20 3d 20 28 70 4c 6f 6f 70 2d 3e 77  ->p3 = (pLoop->w
1e820 73 46 6c 61 67 73 26 57 48 45 52 45 5f 55 4e 51  sFlags&WHERE_UNQ
1e830 5f 57 41 4e 54 45 44 29 21 3d 30 20 3f 20 31 3a  _WANTED)!=0 ? 1:
1e840 30 3b 0a 20 20 20 20 69 66 28 20 28 70 4c 6f 6f  0;.    if( (pLoo
1e850 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
1e860 52 45 5f 43 4f 4e 53 54 52 41 49 4e 54 29 3d 3d  RE_CONSTRAINT)==
1e870 30 20 29 7b 0a 20 20 20 20 20 20 70 4c 65 76 65  0 ){.      pLeve
1e880 6c 2d 3e 70 35 20 3d 20 53 51 4c 49 54 45 5f 53  l->p5 = SQLITE_S
1e890 54 4d 54 53 54 41 54 55 53 5f 46 55 4c 4c 53 43  TMTSTATUS_FULLSC
1e8a0 41 4e 5f 53 54 45 50 3b 0a 20 20 20 20 7d 65 6c  AN_STEP;.    }el
1e8b0 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
1e8c0 28 20 70 4c 65 76 65 6c 2d 3e 70 35 3d 3d 30 20  ( pLevel->p5==0 
1e8d0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
1e8e0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
1e8f0 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a  _OMIT_OR_OPTIMIZ
1e900 41 54 49 4f 4e 0a 20 20 69 66 28 20 70 4c 6f 6f  ATION.  if( pLoo
1e910 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
1e920 52 45 5f 4d 55 4c 54 49 5f 4f 52 20 29 7b 0a 20  RE_MULTI_OR ){. 
1e930 20 20 20 2f 2a 20 43 61 73 65 20 35 3a 20 20 54     /* Case 5:  T
1e940 77 6f 20 6f 72 20 6d 6f 72 65 20 73 65 70 61 72  wo or more separ
1e950 61 74 65 6c 79 20 69 6e 64 65 78 65 64 20 74 65  ately indexed te
1e960 72 6d 73 20 63 6f 6e 6e 65 63 74 65 64 20 62 79  rms connected by
1e970 20 4f 52 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a   OR.    **.    *
1e980 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a  * Example:.    *
1e990 2a 0a 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54  *.    **   CREAT
1e9a0 45 20 54 41 42 4c 45 20 74 31 28 61 2c 62 2c 63  E TABLE t1(a,b,c
1e9b0 2c 64 29 3b 0a 20 20 20 20 2a 2a 20 20 20 43 52  ,d);.    **   CR
1e9c0 45 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e  EATE INDEX i1 ON
1e9d0 20 74 31 28 61 29 3b 0a 20 20 20 20 2a 2a 20 20   t1(a);.    **  
1e9e0 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 32   CREATE INDEX i2
1e9f0 20 4f 4e 20 74 31 28 62 29 3b 0a 20 20 20 20 2a   ON t1(b);.    *
1ea00 2a 20 20 20 43 52 45 41 54 45 20 49 4e 44 45 58  *   CREATE INDEX
1ea10 20 69 33 20 4f 4e 20 74 31 28 63 29 3b 0a 20 20   i3 ON t1(c);.  
1ea20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 53 45    **.    **   SE
1ea30 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57  LECT * FROM t1 W
1ea40 48 45 52 45 20 61 3d 35 20 4f 52 20 62 3d 37 20  HERE a=5 OR b=7 
1ea50 4f 52 20 28 63 3d 31 31 20 41 4e 44 20 64 3d 31  OR (c=11 AND d=1
1ea60 33 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  3).    **.    **
1ea70 20 49 6e 20 74 68 65 20 65 78 61 6d 70 6c 65 2c   In the example,
1ea80 20 74 68 65 72 65 20 61 72 65 20 74 68 72 65 65   there are three
1ea90 20 69 6e 64 65 78 65 64 20 74 65 72 6d 73 20 63   indexed terms c
1eaa0 6f 6e 6e 65 63 74 65 64 20 62 79 20 4f 52 2e 0a  onnected by OR..
1eab0 20 20 20 20 2a 2a 20 54 68 65 20 74 6f 70 20 6f      ** The top o
1eac0 66 20 74 68 65 20 6c 6f 6f 70 20 6c 6f 6f 6b 73  f the loop looks
1ead0 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20 20 20   like this:.    
1eae0 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  **.    **       
1eaf0 20 20 20 4e 75 6c 6c 20 20 20 20 20 20 20 31 20     Null       1 
1eb00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23                 #
1eb10 20 5a 65 72 6f 20 74 68 65 20 72 6f 77 73 65 74   Zero the rowset
1eb20 20 69 6e 20 72 65 67 20 31 0a 20 20 20 20 2a 2a   in reg 1.    **
1eb30 0a 20 20 20 20 2a 2a 20 54 68 65 6e 2c 20 66 6f  .    ** Then, fo
1eb40 72 20 65 61 63 68 20 69 6e 64 65 78 65 64 20 74  r each indexed t
1eb50 65 72 6d 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69  erm, the followi
1eb60 6e 67 2e 20 54 68 65 20 61 72 67 75 6d 65 6e 74  ng. The argument
1eb70 73 20 74 6f 0a 20 20 20 20 2a 2a 20 52 6f 77 53  s to.    ** RowS
1eb80 65 74 54 65 73 74 20 61 72 65 20 73 75 63 68 20  etTest are such 
1eb90 74 68 61 74 20 74 68 65 20 72 6f 77 69 64 20 6f  that the rowid o
1eba0 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f  f the current ro
1ebb0 77 20 69 73 20 69 6e 73 65 72 74 65 64 0a 20 20  w is inserted.  
1ebc0 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 52 6f    ** into the Ro
1ebd0 77 53 65 74 2e 20 49 66 20 69 74 20 69 73 20 61  wSet. If it is a
1ebe0 6c 72 65 61 64 79 20 70 72 65 73 65 6e 74 2c 20  lready present, 
1ebf0 63 6f 6e 74 72 6f 6c 20 73 6b 69 70 73 20 74 68  control skips th
1ec00 65 0a 20 20 20 20 2a 2a 20 47 6f 73 75 62 20 6f  e.    ** Gosub o
1ec10 70 63 6f 64 65 20 61 6e 64 20 6a 75 6d 70 73 20  pcode and jumps 
1ec20 73 74 72 61 69 67 68 74 20 74 6f 20 74 68 65 20  straight to the 
1ec30 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 62  code generated b
1ec40 79 20 57 68 65 72 65 45 6e 64 28 29 2e 0a 20 20  y WhereEnd()..  
1ec50 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20    **.    **     
1ec60 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 42     sqlite3WhereB
1ec70 65 67 69 6e 28 3c 74 65 72 6d 3e 29 0a 20 20 20  egin(<term>).   
1ec80 20 2a 2a 20 20 20 20 20 20 20 20 20 20 52 6f 77   **          Row
1ec90 53 65 74 54 65 73 74 20 20 20 20 20 20 20 20 20  SetTest         
1eca0 20 20 20 20 20 20 20 20 20 23 20 49 6e 73 65 72           # Inser
1ecb0 74 20 72 6f 77 69 64 20 69 6e 74 6f 20 72 6f 77  t rowid into row
1ecc0 73 65 74 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  set.    **      
1ecd0 20 20 20 20 47 6f 73 75 62 20 20 20 20 20 20 32      Gosub      2
1ece0 20 41 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20   A.    **       
1ecf0 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
1ed00 28 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  ().    **.    **
1ed10 20 46 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 61   Following the a
1ed20 62 6f 76 65 2c 20 63 6f 64 65 20 74 6f 20 74 65  bove, code to te
1ed30 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70  rminate the loop
1ed40 2e 20 4c 61 62 65 6c 20 41 2c 20 74 68 65 20 74  . Label A, the t
1ed50 61 72 67 65 74 0a 20 20 20 20 2a 2a 20 6f 66 20  arget.    ** of 
1ed60 74 68 65 20 47 6f 73 75 62 20 61 62 6f 76 65 2c  the Gosub above,
1ed70 20 6a 75 6d 70 73 20 74 6f 20 74 68 65 20 69 6e   jumps to the in
1ed80 73 74 72 75 63 74 69 6f 6e 20 72 69 67 68 74 20  struction right 
1ed90 61 66 74 65 72 20 74 68 65 20 47 6f 74 6f 2e 0a  after the Goto..
1eda0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
1edb0 20 20 20 20 20 20 20 4e 75 6c 6c 20 20 20 20 20         Null     
1edc0 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20    1             
1edd0 20 20 20 23 20 5a 65 72 6f 20 74 68 65 20 72 6f     # Zero the ro
1ede0 77 73 65 74 20 69 6e 20 72 65 67 20 31 0a 20 20  wset in reg 1.  
1edf0 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 47 6f    **          Go
1ee00 74 6f 20 20 20 20 20 20 20 42 20 20 20 20 20 20  to       B      
1ee10 20 20 20 20 20 20 20 20 20 20 23 20 54 68 65 20            # The 
1ee20 6c 6f 6f 70 20 69 73 20 66 69 6e 69 73 68 65 64  loop is finished
1ee30 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
1ee40 20 20 20 20 20 20 41 3a 20 3c 6c 6f 6f 70 20 62        A: <loop b
1ee50 6f 64 79 3e 20 20 20 20 20 20 20 20 20 20 20 20  ody>            
1ee60 20 20 20 20 20 23 20 52 65 74 75 72 6e 20 64 61       # Return da
1ee70 74 61 2c 20 77 68 61 74 65 76 65 72 2e 0a 20 20  ta, whatever..  
1ee80 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20    **.    **     
1ee90 20 20 20 20 20 52 65 74 75 72 6e 20 20 20 20 20       Return     
1eea0 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2               
1eeb0 20 23 20 4a 75 6d 70 20 62 61 63 6b 20 74 6f 20   # Jump back to 
1eec0 74 68 65 20 47 6f 73 75 62 0a 20 20 20 20 2a 2a  the Gosub.    **
1eed0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 42 3a  .    **       B:
1eee0 20 3c 61 66 74 65 72 20 74 68 65 20 6c 6f 6f 70   <after the loop
1eef0 3e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  >.    **.    ** 
1ef00 41 64 64 65 64 20 32 30 31 34 2d 30 35 2d 32 36  Added 2014-05-26
1ef10 3a 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 69  : If the table i
1ef20 73 20 61 20 57 49 54 48 4f 55 54 20 52 4f 57 49  s a WITHOUT ROWI
1ef30 44 20 74 61 62 6c 65 2c 20 74 68 65 6e 0a 20 20  D table, then.  
1ef40 20 20 2a 2a 20 75 73 65 20 61 6e 20 65 70 68 65    ** use an ephe
1ef50 6d 65 72 61 6c 20 69 6e 64 65 78 20 69 6e 73 74  meral index inst
1ef60 65 61 64 20 6f 66 20 61 20 52 6f 77 53 65 74 20  ead of a RowSet 
1ef70 74 6f 20 72 65 63 6f 72 64 20 74 68 65 20 70 72  to record the pr
1ef80 69 6d 61 72 79 0a 20 20 20 20 2a 2a 20 6b 65 79  imary.    ** key
1ef90 73 20 6f 66 20 74 68 65 20 72 6f 77 73 20 77 65  s of the rows we
1efa0 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 73 65   have already se
1efb0 65 6e 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  en..    **.    *
1efc0 2f 0a 20 20 20 20 57 68 65 72 65 43 6c 61 75 73  /.    WhereClaus
1efd0 65 20 2a 70 4f 72 57 63 3b 20 20 20 20 2f 2a 20  e *pOrWc;    /* 
1efe0 54 68 65 20 4f 52 2d 63 6c 61 75 73 65 20 62 72  The OR-clause br
1eff0 6f 6b 65 6e 20 6f 75 74 20 69 6e 74 6f 20 73 75  oken out into su
1f000 62 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 53 72  bterms */.    Sr
1f010 63 4c 69 73 74 20 2a 70 4f 72 54 61 62 3b 20 20  cList *pOrTab;  
1f020 20 20 20 20 20 2f 2a 20 53 68 6f 72 74 65 6e 65       /* Shortene
1f030 64 20 74 61 62 6c 65 20 6c 69 73 74 20 6f 72 20  d table list or 
1f040 4f 52 2d 63 6c 61 75 73 65 20 67 65 6e 65 72 61  OR-clause genera
1f050 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 49 6e 64 65  tion */.    Inde
1f060 78 20 2a 70 43 6f 76 20 3d 20 30 3b 20 20 20 20  x *pCov = 0;    
1f070 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 74 65           /* Pote
1f080 6e 74 69 61 6c 20 63 6f 76 65 72 69 6e 67 20 69  ntial covering i
1f090 6e 64 65 78 20 28 6f 72 20 4e 55 4c 4c 29 20 2a  ndex (or NULL) *
1f0a0 2f 0a 20 20 20 20 69 6e 74 20 69 43 6f 76 43 75  /.    int iCovCu
1f0b0 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  r = pParse->nTab
1f0c0 2b 2b 3b 20 20 2f 2a 20 43 75 72 73 6f 72 20 75  ++;  /* Cursor u
1f0d0 73 65 64 20 66 6f 72 20 69 6e 64 65 78 20 73 63  sed for index sc
1f0e0 61 6e 73 20 28 69 66 20 61 6e 79 29 20 2a 2f 0a  ans (if any) */.
1f0f0 0a 20 20 20 20 69 6e 74 20 72 65 67 52 65 74 75  .    int regRetu
1f100 72 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  rn = ++pParse->n
1f110 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20 2f  Mem;           /
1f120 2a 20 52 65 67 69 73 74 65 72 20 75 73 65 64 20  * Register used 
1f130 77 69 74 68 20 4f 50 5f 47 6f 73 75 62 20 2a 2f  with OP_Gosub */
1f140 0a 20 20 20 20 69 6e 74 20 72 65 67 52 6f 77 73  .    int regRows
1f150 65 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  et = 0;         
1f160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1f170 2a 20 52 65 67 69 73 74 65 72 20 66 6f 72 20 52  * Register for R
1f180 6f 77 53 65 74 20 6f 62 6a 65 63 74 20 2a 2f 0a  owSet object */.
1f190 20 20 20 20 69 6e 74 20 72 65 67 52 6f 77 69 64      int regRowid
1f1a0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
1f1b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f1c0 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e   Register holdin
1f1d0 67 20 72 6f 77 69 64 20 2a 2f 0a 20 20 20 20 69  g rowid */.    i
1f1e0 6e 74 20 69 4c 6f 6f 70 42 6f 64 79 20 3d 20 73  nt iLoopBody = s
1f1f0 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
1f200 62 65 6c 28 76 29 3b 20 20 2f 2a 20 53 74 61 72  bel(v);  /* Star
1f210 74 20 6f 66 20 6c 6f 6f 70 20 62 6f 64 79 20 2a  t of loop body *
1f220 2f 0a 20 20 20 20 69 6e 74 20 69 52 65 74 49 6e  /.    int iRetIn
1f230 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  it;             
1f240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f250 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 72 65  /* Address of re
1f260 67 52 65 74 75 72 6e 20 69 6e 69 74 20 2a 2f 0a  gReturn init */.
1f270 20 20 20 20 69 6e 74 20 75 6e 74 65 73 74 65 64      int untested
1f280 54 65 72 6d 73 20 3d 20 30 3b 20 20 20 20 20 20  Terms = 0;      
1f290 20 20 20 20 20 20 20 2f 2a 20 53 6f 6d 65 20 74         /* Some t
1f2a0 65 72 6d 73 20 6e 6f 74 20 63 6f 6d 70 6c 65 74  erms not complet
1f2b0 65 6c 79 20 74 65 73 74 65 64 20 2a 2f 0a 20 20  ely tested */.  
1f2c0 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20    int ii;       
1f2d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f2e0 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
1f2f0 6e 74 65 72 20 2a 2f 0a 20 20 20 20 75 31 36 20  nter */.    u16 
1f300 77 63 74 72 6c 46 6c 61 67 73 3b 20 20 20 20 20  wctrlFlags;     
1f310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1f320 2a 20 46 6c 61 67 73 20 66 6f 72 20 73 75 62 2d  * Flags for sub-
1f330 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
1f340 20 20 20 20 45 78 70 72 20 2a 70 41 6e 64 45 78      Expr *pAndEx
1f350 70 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  pr = 0;         
1f360 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 22 2e 2e         /* An "..
1f370 20 41 4e 44 20 28 2e 2e 2e 29 22 20 65 78 70 72   AND (...)" expr
1f380 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 54 61  ession */.    Ta
1f390 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 54 61 62  ble *pTab = pTab
1f3a0 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 0a  Item->pTab;.   .
1f3b0 20 20 20 20 70 54 65 72 6d 20 3d 20 70 4c 6f 6f      pTerm = pLoo
1f3c0 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d 3b 0a 20 20  p->aLTerm[0];.  
1f3d0 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 21    assert( pTerm!
1f3e0 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
1f3f0 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
1f400 6f 72 20 26 20 57 4f 5f 4f 52 20 29 3b 0a 20 20  or & WO_OR );.  
1f410 20 20 61 73 73 65 72 74 28 20 28 70 54 65 72 6d    assert( (pTerm
1f420 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
1f430 5f 4f 52 49 4e 46 4f 29 21 3d 30 20 29 3b 0a 20  _ORINFO)!=0 );. 
1f440 20 20 20 70 4f 72 57 63 20 3d 20 26 70 54 65 72     pOrWc = &pTer
1f450 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 77 63  m->u.pOrInfo->wc
1f460 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70  ;.    pLevel->op
1f470 20 3d 20 4f 50 5f 52 65 74 75 72 6e 3b 0a 20 20   = OP_Return;.  
1f480 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 72    pLevel->p1 = r
1f490 65 67 52 65 74 75 72 6e 3b 0a 0a 20 20 20 20 2f  egReturn;..    /
1f4a0 2a 20 53 65 74 20 75 70 20 61 20 6e 65 77 20 53  * Set up a new S
1f4b0 72 63 4c 69 73 74 20 69 6e 20 70 4f 72 54 61 62  rcList in pOrTab
1f4c0 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
1f4d0 74 61 62 6c 65 20 62 65 69 6e 67 20 73 63 61 6e  table being scan
1f4e0 6e 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 74 68  ned.    ** by th
1f4f0 69 73 20 6c 6f 6f 70 20 69 6e 20 74 68 65 20 61  is loop in the a
1f500 5b 30 5d 20 73 6c 6f 74 20 61 6e 64 20 61 6c 6c  [0] slot and all
1f510 20 6e 6f 74 52 65 61 64 79 20 74 61 62 6c 65 73   notReady tables
1f520 20 69 6e 20 61 5b 31 2e 2e 5d 20 73 6c 6f 74 73   in a[1..] slots
1f530 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 62 65  ..    ** This be
1f540 63 6f 6d 65 73 20 74 68 65 20 53 72 63 4c 69 73  comes the SrcLis
1f550 74 20 69 6e 20 74 68 65 20 72 65 63 75 72 73 69  t in the recursi
1f560 76 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  ve call to sqlit
1f570 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 2e 0a  e3WhereBegin()..
1f580 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
1f590 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3e 31 20  WInfo->nLevel>1 
1f5a0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4e 6f  ){.      int nNo
1f5b0 74 52 65 61 64 79 3b 20 20 20 20 20 20 20 20 20  tReady;         
1f5c0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e          /* The n
1f5d0 75 6d 62 65 72 20 6f 66 20 6e 6f 74 52 65 61 64  umber of notRead
1f5e0 79 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 20 20  y tables */.    
1f5f0 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
1f600 5f 69 74 65 6d 20 2a 6f 72 69 67 53 72 63 3b 20  _item *origSrc; 
1f610 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20      /* Original 
1f620 6c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 2a  list of tables *
1f630 2f 0a 20 20 20 20 20 20 6e 4e 6f 74 52 65 61 64  /.      nNotRead
1f640 79 20 3d 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76  y = pWInfo->nLev
1f650 65 6c 20 2d 20 69 4c 65 76 65 6c 20 2d 20 31 3b  el - iLevel - 1;
1f660 0a 20 20 20 20 20 20 70 4f 72 54 61 62 20 3d 20  .      pOrTab = 
1f670 73 71 6c 69 74 65 33 53 74 61 63 6b 41 6c 6c 6f  sqlite3StackAllo
1f680 63 52 61 77 28 64 62 2c 0a 20 20 20 20 20 20 20  cRaw(db,.       
1f690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f6a0 20 20 20 20 20 73 69 7a 65 6f 66 28 2a 70 4f 72       sizeof(*pOr
1f6b0 54 61 62 29 2b 20 6e 4e 6f 74 52 65 61 64 79 2a  Tab)+ nNotReady*
1f6c0 73 69 7a 65 6f 66 28 70 4f 72 54 61 62 2d 3e 61  sizeof(pOrTab->a
1f6d0 5b 30 5d 29 29 3b 0a 20 20 20 20 20 20 69 66 28  [0]));.      if(
1f6e0 20 70 4f 72 54 61 62 3d 3d 30 20 29 20 72 65 74   pOrTab==0 ) ret
1f6f0 75 72 6e 20 6e 6f 74 52 65 61 64 79 3b 0a 20 20  urn notReady;.  
1f700 20 20 20 20 70 4f 72 54 61 62 2d 3e 6e 41 6c 6c      pOrTab->nAll
1f710 6f 63 20 3d 20 28 75 38 29 28 6e 4e 6f 74 52 65  oc = (u8)(nNotRe
1f720 61 64 79 20 2b 20 31 29 3b 0a 20 20 20 20 20 20  ady + 1);.      
1f730 70 4f 72 54 61 62 2d 3e 6e 53 72 63 20 3d 20 70  pOrTab->nSrc = p
1f740 4f 72 54 61 62 2d 3e 6e 41 6c 6c 6f 63 3b 0a 20  OrTab->nAlloc;. 
1f750 20 20 20 20 20 6d 65 6d 63 70 79 28 70 4f 72 54       memcpy(pOrT
1f760 61 62 2d 3e 61 2c 20 70 54 61 62 49 74 65 6d 2c  ab->a, pTabItem,
1f770 20 73 69 7a 65 6f 66 28 2a 70 54 61 62 49 74 65   sizeof(*pTabIte
1f780 6d 29 29 3b 0a 20 20 20 20 20 20 6f 72 69 67 53  m));.      origS
1f790 72 63 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61  rc = pWInfo->pTa
1f7a0 62 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20  bList->a;.      
1f7b0 66 6f 72 28 6b 3d 31 3b 20 6b 3c 3d 6e 4e 6f 74  for(k=1; k<=nNot
1f7c0 52 65 61 64 79 3b 20 6b 2b 2b 29 7b 0a 20 20 20  Ready; k++){.   
1f7d0 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4f 72       memcpy(&pOr
1f7e0 54 61 62 2d 3e 61 5b 6b 5d 2c 20 26 6f 72 69 67  Tab->a[k], &orig
1f7f0 53 72 63 5b 70 4c 65 76 65 6c 5b 6b 5d 2e 69 46  Src[pLevel[k].iF
1f800 72 6f 6d 5d 2c 20 73 69 7a 65 6f 66 28 70 4f 72  rom], sizeof(pOr
1f810 54 61 62 2d 3e 61 5b 6b 5d 29 29 3b 0a 20 20 20  Tab->a[k]));.   
1f820 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
1f830 20 20 20 20 20 20 70 4f 72 54 61 62 20 3d 20 70        pOrTab = p
1f840 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 3b  WInfo->pTabList;
1f850 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
1f860 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 72 6f  nitialize the ro
1f870 77 73 65 74 20 72 65 67 69 73 74 65 72 20 74 6f  wset register to
1f880 20 63 6f 6e 74 61 69 6e 20 4e 55 4c 4c 2e 20 41   contain NULL. A
1f890 6e 20 53 51 4c 20 4e 55 4c 4c 20 69 73 20 0a 20  n SQL NULL is . 
1f8a0 20 20 20 2a 2a 20 65 71 75 69 76 61 6c 65 6e 74     ** equivalent
1f8b0 20 74 6f 20 61 6e 20 65 6d 70 74 79 20 72 6f 77   to an empty row
1f8c0 73 65 74 2e 20 20 4f 72 2c 20 63 72 65 61 74 65  set.  Or, create
1f8d0 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 69 6e   an ephemeral in
1f8e0 64 65 78 0a 20 20 20 20 2a 2a 20 63 61 70 61 62  dex.    ** capab
1f8f0 6c 65 20 6f 66 20 68 6f 6c 64 69 6e 67 20 70 72  le of holding pr
1f900 69 6d 61 72 79 20 6b 65 79 73 20 69 6e 20 74 68  imary keys in th
1f910 65 20 63 61 73 65 20 6f 66 20 61 20 57 49 54 48  e case of a WITH
1f920 4f 55 54 20 52 4f 57 49 44 2e 0a 20 20 20 20 2a  OUT ROWID..    *
1f930 2a 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 20 69 6e  *.    ** Also in
1f940 69 74 69 61 6c 69 7a 65 20 72 65 67 52 65 74 75  itialize regRetu
1f950 72 6e 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68  rn to contain th
1f960 65 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65  e address of the
1f970 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 0a 20 20   instruction .  
1f980 20 20 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79    ** immediately
1f990 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 4f   following the O
1f9a0 50 5f 52 65 74 75 72 6e 20 61 74 20 74 68 65 20  P_Return at the 
1f9b0 62 6f 74 74 6f 6d 20 6f 66 20 74 68 65 20 6c 6f  bottom of the lo
1f9c0 6f 70 2e 20 54 68 69 73 0a 20 20 20 20 2a 2a 20  op. This.    ** 
1f9d0 69 73 20 72 65 71 75 69 72 65 64 20 69 6e 20 61  is required in a
1f9e0 20 66 65 77 20 6f 62 73 63 75 72 65 20 4c 45 46   few obscure LEF
1f9f0 54 20 4a 4f 49 4e 20 63 61 73 65 73 20 77 68 65  T JOIN cases whe
1fa00 72 65 20 63 6f 6e 74 72 6f 6c 20 6a 75 6d 70 73  re control jumps
1fa10 0a 20 20 20 20 2a 2a 20 6f 76 65 72 20 74 68 65  .    ** over the
1fa20 20 74 6f 70 20 6f 66 20 74 68 65 20 6c 6f 6f 70   top of the loop
1fa30 20 69 6e 74 6f 20 74 68 65 20 62 6f 64 79 20 6f   into the body o
1fa40 66 20 69 74 2e 20 49 6e 20 74 68 69 73 20 63 61  f it. In this ca
1fa50 73 65 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 63  se the .    ** c
1fa60 6f 72 72 65 63 74 20 72 65 73 70 6f 6e 73 65 20  orrect response 
1fa70 66 6f 72 20 74 68 65 20 65 6e 64 2d 6f 66 2d 6c  for the end-of-l
1fa80 6f 6f 70 20 63 6f 64 65 20 28 74 68 65 20 4f 50  oop code (the OP
1fa90 5f 52 65 74 75 72 6e 29 20 69 73 20 74 6f 20 0a  _Return) is to .
1faa0 20 20 20 20 2a 2a 20 66 61 6c 6c 20 74 68 72 6f      ** fall thro
1fab0 75 67 68 20 74 6f 20 74 68 65 20 6e 65 78 74 20  ugh to the next 
1fac0 69 6e 73 74 72 75 63 74 69 6f 6e 2c 20 6a 75 73  instruction, jus
1fad0 74 20 61 73 20 61 6e 20 4f 50 5f 4e 65 78 74 20  t as an OP_Next 
1fae0 64 6f 65 73 20 69 66 0a 20 20 20 20 2a 2a 20 63  does if.    ** c
1faf0 61 6c 6c 65 64 20 6f 6e 20 61 6e 20 75 6e 69 6e  alled on an unin
1fb00 69 74 69 61 6c 69 7a 65 64 20 63 75 72 73 6f 72  itialized cursor
1fb10 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1fb20 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46   (pWInfo->wctrlF
1fb30 6c 61 67 73 20 26 20 57 48 45 52 45 5f 44 55 50  lags & WHERE_DUP
1fb40 4c 49 43 41 54 45 53 5f 4f 4b 29 3d 3d 30 20 29  LICATES_OK)==0 )
1fb50 7b 0a 20 20 20 20 20 20 69 66 28 20 48 61 73 52  {.      if( HasR
1fb60 6f 77 69 64 28 70 54 61 62 29 20 29 7b 0a 20 20  owid(pTab) ){.  
1fb70 20 20 20 20 20 20 72 65 67 52 6f 77 73 65 74 20        regRowset 
1fb80 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
1fb90 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
1fba0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1fbb0 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65 67 52 6f  P_Null, 0, regRo
1fbc0 77 73 65 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c  wset);.      }el
1fbd0 73 65 7b 0a 20 20 20 20 20 20 20 20 49 6e 64 65  se{.        Inde
1fbe0 78 20 2a 70 50 6b 20 3d 20 73 71 6c 69 74 65 33  x *pPk = sqlite3
1fbf0 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28  PrimaryKeyIndex(
1fc00 70 54 61 62 29 3b 0a 20 20 20 20 20 20 20 20 72  pTab);.        r
1fc10 65 67 52 6f 77 73 65 74 20 3d 20 70 50 61 72 73  egRowset = pPars
1fc20 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20  e->nTab++;.     
1fc30 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1fc40 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  dOp2(v, OP_OpenE
1fc50 70 68 65 6d 65 72 61 6c 2c 20 72 65 67 52 6f 77  phemeral, regRow
1fc60 73 65 74 2c 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f  set, pPk->nKeyCo
1fc70 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  l);.        sqli
1fc80 74 65 33 56 64 62 65 53 65 74 50 34 4b 65 79 49  te3VdbeSetP4KeyI
1fc90 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 50 6b 29  nfo(pParse, pPk)
1fca0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1fcb0 72 65 67 52 6f 77 69 64 20 3d 20 2b 2b 70 50 61  regRowid = ++pPa
1fcc0 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 7d  rse->nMem;.    }
1fcd0 0a 20 20 20 20 69 52 65 74 49 6e 69 74 20 3d 20  .    iRetInit = 
1fce0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1fcf0 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
1fd00 20 30 2c 20 72 65 67 52 65 74 75 72 6e 29 3b 0a   0, regReturn);.
1fd10 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6f  .    /* If the o
1fd20 72 69 67 69 6e 61 6c 20 57 48 45 52 45 20 63 6c  riginal WHERE cl
1fd30 61 75 73 65 20 69 73 20 7a 20 6f 66 20 74 68 65  ause is z of the
1fd40 20 66 6f 72 6d 3a 20 20 28 78 31 20 4f 52 20 78   form:  (x1 OR x
1fd50 32 20 4f 52 20 2e 2e 2e 29 20 41 4e 44 20 79 0a  2 OR ...) AND y.
1fd60 20 20 20 20 2a 2a 20 54 68 65 6e 20 66 6f 72 20      ** Then for 
1fd70 65 76 65 72 79 20 74 65 72 6d 20 78 4e 2c 20 65  every term xN, e
1fd80 76 61 6c 75 61 74 65 20 61 73 20 74 68 65 20 73  valuate as the s
1fd90 75 62 65 78 70 72 65 73 73 69 6f 6e 3a 20 78 4e  ubexpression: xN
1fda0 20 41 4e 44 20 7a 0a 20 20 20 20 2a 2a 20 54 68   AND z.    ** Th
1fdb0 61 74 20 77 61 79 2c 20 74 65 72 6d 73 20 69 6e  at way, terms in
1fdc0 20 79 20 74 68 61 74 20 61 72 65 20 66 61 63 74   y that are fact
1fdd0 6f 72 65 64 20 69 6e 74 6f 20 74 68 65 20 64 69  ored into the di
1fde0 73 6a 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 0a 20  sjunction will. 
1fdf0 20 20 20 2a 2a 20 62 65 20 70 69 63 6b 65 64 20     ** be picked 
1fe00 75 70 20 62 79 20 74 68 65 20 72 65 63 75 72 73  up by the recurs
1fe10 69 76 65 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c  ive calls to sql
1fe20 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
1fe30 20 62 65 6c 6f 77 2e 0a 20 20 20 20 2a 2a 0a 20   below..    **. 
1fe40 20 20 20 2a 2a 20 41 63 74 75 61 6c 6c 79 2c 20     ** Actually, 
1fe50 65 61 63 68 20 73 75 62 65 78 70 72 65 73 73 69  each subexpressi
1fe60 6f 6e 20 69 73 20 63 6f 6e 76 65 72 74 65 64 20  on is converted 
1fe70 74 6f 20 22 78 4e 20 41 4e 44 20 77 22 20 77 68  to "xN AND w" wh
1fe80 65 72 65 20 77 20 69 73 0a 20 20 20 20 2a 2a 20  ere w is.    ** 
1fe90 74 68 65 20 22 69 6e 74 65 72 65 73 74 69 6e 67  the "interesting
1fea0 22 20 74 65 72 6d 73 20 6f 66 20 7a 20 2d 20 74  " terms of z - t
1feb0 65 72 6d 73 20 74 68 61 74 20 64 69 64 20 6e 6f  erms that did no
1fec0 74 20 6f 72 69 67 69 6e 61 74 65 20 69 6e 20 74  t originate in t
1fed0 68 65 0a 20 20 20 20 2a 2a 20 4f 4e 20 6f 72 20  he.    ** ON or 
1fee0 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20  USING clause of 
1fef0 61 20 4c 45 46 54 20 4a 4f 49 4e 2c 20 61 6e 64  a LEFT JOIN, and
1ff00 20 74 65 72 6d 73 20 74 68 61 74 20 61 72 65 20   terms that are 
1ff10 75 73 61 62 6c 65 20 61 73 20 0a 20 20 20 20 2a  usable as .    *
1ff20 2a 20 69 6e 64 69 63 65 73 2e 0a 20 20 20 20 2a  * indices..    *
1ff30 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 6f 70  *.    ** This op
1ff40 74 69 6d 69 7a 61 74 69 6f 6e 20 61 6c 73 6f 20  timization also 
1ff50 6f 6e 6c 79 20 61 70 70 6c 69 65 73 20 69 66 20  only applies if 
1ff60 74 68 65 20 28 78 31 20 4f 52 20 78 32 20 4f 52  the (x1 OR x2 OR
1ff70 20 2e 2e 2e 29 20 74 65 72 6d 0a 20 20 20 20 2a   ...) term.    *
1ff80 2a 20 69 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e  * is not contain
1ff90 65 64 20 69 6e 20 74 68 65 20 4f 4e 20 63 6c 61  ed in the ON cla
1ffa0 75 73 65 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f  use of a LEFT JO
1ffb0 49 4e 2e 0a 20 20 20 20 2a 2a 20 53 65 65 20 74  IN..    ** See t
1ffc0 69 63 6b 65 74 20 68 74 74 70 3a 2f 2f 77 77 77  icket http://www
1ffd0 2e 73 71 6c 69 74 65 2e 6f 72 67 2f 73 72 63 2f  .sqlite.org/src/
1ffe0 69 6e 66 6f 2f 66 32 33 36 39 33 30 34 65 34 0a  info/f2369304e4.
1fff0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
20000 57 43 2d 3e 6e 54 65 72 6d 3e 31 20 29 7b 0a 20  WC->nTerm>1 ){. 
20010 20 20 20 20 20 69 6e 74 20 69 54 65 72 6d 3b 0a       int iTerm;.
20020 20 20 20 20 20 20 66 6f 72 28 69 54 65 72 6d 3d        for(iTerm=
20030 30 3b 20 69 54 65 72 6d 3c 70 57 43 2d 3e 6e 54  0; iTerm<pWC->nT
20040 65 72 6d 3b 20 69 54 65 72 6d 2b 2b 29 7b 0a 20  erm; iTerm++){. 
20050 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78         Expr *pEx
20060 70 72 20 3d 20 70 57 43 2d 3e 61 5b 69 54 65 72  pr = pWC->a[iTer
20070 6d 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  m].pExpr;.      
20080 20 20 69 66 28 20 26 70 57 43 2d 3e 61 5b 69 54    if( &pWC->a[iT
20090 65 72 6d 5d 20 3d 3d 20 70 54 65 72 6d 20 29 20  erm] == pTerm ) 
200a0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
200b0 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
200c0 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
200d0 46 72 6f 6d 4a 6f 69 6e 29 20 29 20 63 6f 6e 74  FromJoin) ) cont
200e0 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 74 65  inue;.        te
200f0 73 74 63 61 73 65 28 20 70 57 43 2d 3e 61 5b 69  stcase( pWC->a[i
20100 54 65 72 6d 5d 2e 77 74 46 6c 61 67 73 20 26 20  Term].wtFlags & 
20110 54 45 52 4d 5f 4f 52 49 4e 46 4f 20 29 3b 0a 20  TERM_ORINFO );. 
20120 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
20130 20 70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d 2e 77   pWC->a[iTerm].w
20140 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49  tFlags & TERM_VI
20150 52 54 55 41 4c 20 29 3b 0a 20 20 20 20 20 20 20  RTUAL );.       
20160 20 69 66 28 20 70 57 43 2d 3e 61 5b 69 54 65 72   if( pWC->a[iTer
20170 6d 5d 2e 77 74 46 6c 61 67 73 20 26 20 28 54 45  m].wtFlags & (TE
20180 52 4d 5f 4f 52 49 4e 46 4f 7c 54 45 52 4d 5f 56  RM_ORINFO|TERM_V
20190 49 52 54 55 41 4c 29 20 29 20 63 6f 6e 74 69 6e  IRTUAL) ) contin
201a0 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ue;.        if( 
201b0 28 70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d 2e 65  (pWC->a[iTerm].e
201c0 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 41 4c  Operator & WO_AL
201d0 4c 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  L)==0 ) continue
201e0 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 20  ;.        pExpr 
201f0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
20200 28 64 62 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a  (db, pExpr, 0);.
20210 20 20 20 20 20 20 20 20 70 41 6e 64 45 78 70 72          pAndExpr
20220 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e   = sqlite3ExprAn
20230 64 28 64 62 2c 20 70 41 6e 64 45 78 70 72 2c 20  d(db, pAndExpr, 
20240 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a  pExpr);.      }.
20250 20 20 20 20 20 20 69 66 28 20 70 41 6e 64 45 78        if( pAndEx
20260 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 70 41  pr ){.        pA
20270 6e 64 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  ndExpr = sqlite3
20280 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
20290 5f 41 4e 44 2c 20 30 2c 20 70 41 6e 64 45 78 70  _AND, 0, pAndExp
202a0 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  r, 0);.      }. 
202b0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 75 6e     }..    /* Run
202c0 20 61 20 73 65 70 61 72 61 74 65 20 57 48 45 52   a separate WHER
202d0 45 20 63 6c 61 75 73 65 20 66 6f 72 20 65 61 63  E clause for eac
202e0 68 20 74 65 72 6d 20 6f 66 20 74 68 65 20 4f 52  h term of the OR
202f0 20 63 6c 61 75 73 65 2e 20 20 41 66 74 65 72 0a   clause.  After.
20300 20 20 20 20 2a 2a 20 65 6c 69 6d 69 6e 61 74 69      ** eliminati
20310 6e 67 20 64 75 70 6c 69 63 61 74 65 73 20 66 72  ng duplicates fr
20320 6f 6d 20 6f 74 68 65 72 20 57 48 45 52 45 20 63  om other WHERE c
20330 6c 61 75 73 65 73 2c 20 74 68 65 20 61 63 74 69  lauses, the acti
20340 6f 6e 20 66 6f 72 20 65 61 63 68 0a 20 20 20 20  on for each.    
20350 2a 2a 20 73 75 62 2d 57 48 45 52 45 20 63 6c 61  ** sub-WHERE cla
20360 75 73 65 20 69 73 20 74 6f 20 74 6f 20 69 6e 76  use is to to inv
20370 6f 6b 65 20 74 68 65 20 6d 61 69 6e 20 6c 6f 6f  oke the main loo
20380 70 20 62 6f 64 79 20 61 73 20 61 20 73 75 62 72  p body as a subr
20390 6f 75 74 69 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20  outine..    */. 
203a0 20 20 20 77 63 74 72 6c 46 6c 61 67 73 20 3d 20     wctrlFlags = 
203b0 20 57 48 45 52 45 5f 4f 4d 49 54 5f 4f 50 45 4e   WHERE_OMIT_OPEN
203c0 5f 43 4c 4f 53 45 20 7c 20 57 48 45 52 45 5f 41  _CLOSE | WHERE_A
203d0 4e 44 5f 4f 4e 4c 59 20 7c 0a 20 20 20 20 20 20  ND_ONLY |.      
203e0 20 20 20 20 20 20 20 20 20 20 20 20 57 48 45 52              WHER
203f0 45 5f 46 4f 52 43 45 5f 54 41 42 4c 45 20 7c 20  E_FORCE_TABLE | 
20400 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f  WHERE_ONETABLE_O
20410 4e 4c 59 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d  NLY;.    for(ii=
20420 30 3b 20 69 69 3c 70 4f 72 57 63 2d 3e 6e 54 65  0; ii<pOrWc->nTe
20430 72 6d 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  rm; ii++){.     
20440 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 72 54   WhereTerm *pOrT
20450 65 72 6d 20 3d 20 26 70 4f 72 57 63 2d 3e 61 5b  erm = &pOrWc->a[
20460 69 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ii];.      if( p
20470 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73  OrTerm->leftCurs
20480 6f 72 3d 3d 69 43 75 72 20 7c 7c 20 28 70 4f 72  or==iCur || (pOr
20490 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
204a0 26 20 57 4f 5f 41 4e 44 29 21 3d 30 20 29 7b 0a  & WO_AND)!=0 ){.
204b0 20 20 20 20 20 20 20 20 57 68 65 72 65 49 6e 66          WhereInf
204c0 6f 20 2a 70 53 75 62 57 49 6e 66 6f 3b 20 20 20  o *pSubWInfo;   
204d0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 20          /* Info 
204e0 66 6f 72 20 73 69 6e 67 6c 65 20 4f 52 2d 74 65  for single OR-te
204f0 72 6d 20 73 63 61 6e 20 2a 2f 0a 20 20 20 20 20  rm scan */.     
20500 20 20 20 45 78 70 72 20 2a 70 4f 72 45 78 70 72     Expr *pOrExpr
20510 20 3d 20 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70   = pOrTerm->pExp
20520 72 3b 20 2f 2a 20 43 75 72 72 65 6e 74 20 4f 52  r; /* Current OR
20530 20 63 6c 61 75 73 65 20 74 65 72 6d 20 2a 2f 0a   clause term */.
20540 20 20 20 20 20 20 20 20 69 6e 74 20 6a 31 20 3d          int j1 =
20550 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
20560 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
20570 73 73 20 6f 66 20 6a 75 6d 70 20 6f 70 65 72 61  ss of jump opera
20580 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20  tion */.        
20590 69 66 28 20 70 41 6e 64 45 78 70 72 20 26 26 20  if( pAndExpr && 
205a0 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
205b0 28 70 4f 72 45 78 70 72 2c 20 45 50 5f 46 72 6f  (pOrExpr, EP_Fro
205c0 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20 20 20  mJoin) ){.      
205d0 20 20 20 20 70 41 6e 64 45 78 70 72 2d 3e 70 4c      pAndExpr->pL
205e0 65 66 74 20 3d 20 70 4f 72 45 78 70 72 3b 0a 20  eft = pOrExpr;. 
205f0 20 20 20 20 20 20 20 20 20 70 4f 72 45 78 70 72           pOrExpr
20600 20 3d 20 70 41 6e 64 45 78 70 72 3b 0a 20 20 20   = pAndExpr;.   
20610 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f       }.        /
20620 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 74  * Loop through t
20630 61 62 6c 65 20 65 6e 74 72 69 65 73 20 74 68 61  able entries tha
20640 74 20 6d 61 74 63 68 20 74 65 72 6d 20 70 4f 72  t match term pOr
20650 54 65 72 6d 2e 20 2a 2f 0a 20 20 20 20 20 20 20  Term. */.       
20660 20 70 53 75 62 57 49 6e 66 6f 20 3d 20 73 71 6c   pSubWInfo = sql
20670 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 70  ite3WhereBegin(p
20680 50 61 72 73 65 2c 20 70 4f 72 54 61 62 2c 20 70  Parse, pOrTab, p
20690 4f 72 45 78 70 72 2c 20 30 2c 20 30 2c 0a 20 20  OrExpr, 0, 0,.  
206a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
206b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
206c0 20 20 20 20 77 63 74 72 6c 46 6c 61 67 73 2c 20      wctrlFlags, 
206d0 69 43 6f 76 43 75 72 29 3b 0a 20 20 20 20 20 20  iCovCur);.      
206e0 20 20 61 73 73 65 72 74 28 20 70 53 75 62 57 49    assert( pSubWI
206f0 6e 66 6f 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e  nfo || pParse->n
20700 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  Err || db->mallo
20710 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20  cFailed );.     
20720 20 20 20 69 66 28 20 70 53 75 62 57 49 6e 66 6f     if( pSubWInfo
20730 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 57 68   ){.          Wh
20740 65 72 65 4c 6f 6f 70 20 2a 70 53 75 62 4c 6f 6f  ereLoop *pSubLoo
20750 70 3b 0a 20 20 20 20 20 20 20 20 20 20 65 78 70  p;.          exp
20760 6c 61 69 6e 4f 6e 65 53 63 61 6e 28 0a 20 20 20  lainOneScan(.   
20770 20 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73             pPars
20780 65 2c 20 70 4f 72 54 61 62 2c 20 26 70 53 75 62  e, pOrTab, &pSub
20790 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2c 20 69 4c 65  WInfo->a[0], iLe
207a0 76 65 6c 2c 20 70 4c 65 76 65 6c 2d 3e 69 46 72  vel, pLevel->iFr
207b0 6f 6d 2c 20 30 0a 20 20 20 20 20 20 20 20 20 20  om, 0.          
207c0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  );.          /* 
207d0 54 68 69 73 20 69 73 20 74 68 65 20 73 75 62 2d  This is the sub-
207e0 57 48 45 52 45 20 63 6c 61 75 73 65 20 62 6f 64  WHERE clause bod
207f0 79 2e 20 20 46 69 72 73 74 20 73 6b 69 70 20 6f  y.  First skip o
20800 76 65 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ver.          **
20810 20 64 75 70 6c 69 63 61 74 65 20 72 6f 77 73 20   duplicate rows 
20820 66 72 6f 6d 20 70 72 69 6f 72 20 73 75 62 2d 57  from prior sub-W
20830 48 45 52 45 20 63 6c 61 75 73 65 73 2c 20 61 6e  HERE clauses, an
20840 64 20 72 65 63 6f 72 64 20 74 68 65 0a 20 20 20  d record the.   
20850 20 20 20 20 20 20 20 2a 2a 20 72 6f 77 69 64 20         ** rowid 
20860 28 6f 72 20 50 52 49 4d 41 52 59 20 4b 45 59 29  (or PRIMARY KEY)
20870 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74   for the current
20880 20 72 6f 77 20 73 6f 20 74 68 61 74 20 74 68 65   row so that the
20890 20 73 61 6d 65 0a 20 20 20 20 20 20 20 20 20 20   same.          
208a0 2a 2a 20 72 6f 77 20 77 69 6c 6c 20 62 65 20 73  ** row will be s
208b0 6b 69 70 70 65 64 20 69 6e 20 73 75 62 73 65 71  kipped in subseq
208c0 75 65 6e 74 20 73 75 62 2d 57 48 45 52 45 20 63  uent sub-WHERE c
208d0 6c 61 75 73 65 73 2e 0a 20 20 20 20 20 20 20 20  lauses..        
208e0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69    */.          i
208f0 66 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72  f( (pWInfo->wctr
20900 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 44  lFlags & WHERE_D
20910 55 50 4c 49 43 41 54 45 53 5f 4f 4b 29 3d 3d 30  UPLICATES_OK)==0
20920 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
20930 69 6e 74 20 72 3b 0a 20 20 20 20 20 20 20 20 20  int r;.         
20940 20 20 20 69 6e 74 20 69 53 65 74 20 3d 20 28 28     int iSet = ((
20950 69 69 3d 3d 70 4f 72 57 63 2d 3e 6e 54 65 72 6d  ii==pOrWc->nTerm
20960 2d 31 29 3f 2d 31 3a 69 69 29 3b 0a 20 20 20 20  -1)?-1:ii);.    
20970 20 20 20 20 20 20 20 20 69 66 28 20 48 61 73 52          if( HasR
20980 6f 77 69 64 28 70 54 61 62 29 20 29 7b 0a 20 20  owid(pTab) ){.  
20990 20 20 20 20 20 20 20 20 20 20 20 20 72 20 3d 20              r = 
209a0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47  sqlite3ExprCodeG
209b0 65 74 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c  etColumn(pParse,
209c0 20 70 54 61 62 2c 20 2d 31 2c 20 69 43 75 72 2c   pTab, -1, iCur,
209d0 20 72 65 67 52 6f 77 69 64 2c 20 30 29 3b 0a 20   regRowid, 0);. 
209e0 20 20 20 20 20 20 20 20 20 20 20 20 20 6a 31 20               j1 
209f0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
20a00 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 52 6f 77  Op4Int(v, OP_Row
20a10 53 65 74 54 65 73 74 2c 20 72 65 67 52 6f 77 73  SetTest, regRows
20a20 65 74 2c 20 30 2c 20 72 2c 69 53 65 74 29 3b 0a  et, 0, r,iSet);.
20a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 56 64                Vd
20a40 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
20a50 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65             }else
20a60 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
20a70 49 6e 64 65 78 20 2a 70 50 6b 20 3d 20 73 71 6c  Index *pPk = sql
20a80 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e  ite3PrimaryKeyIn
20a90 64 65 78 28 70 54 61 62 29 3b 0a 20 20 20 20 20  dex(pTab);.     
20aa0 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 50 6b           int nPk
20ab0 20 3d 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b   = pPk->nKeyCol;
20ac0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
20ad0 6e 74 20 69 50 6b 3b 0a 0a 20 20 20 20 20 20 20  nt iPk;..       
20ae0 20 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20 74         /* Read t
20af0 68 65 20 50 4b 20 69 6e 74 6f 20 61 6e 20 61 72  he PK into an ar
20b00 72 61 79 20 6f 66 20 74 65 6d 70 20 72 65 67 69  ray of temp regi
20b10 73 74 65 72 73 2e 20 2a 2f 0a 20 20 20 20 20 20  sters. */.      
20b20 20 20 20 20 20 20 20 20 72 20 3d 20 73 71 6c 69          r = sqli
20b30 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28  te3GetTempRange(
20b40 70 50 61 72 73 65 2c 20 6e 50 6b 29 3b 0a 20 20  pParse, nPk);.  
20b50 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28              for(
20b60 69 50 6b 3d 30 3b 20 69 50 6b 3c 6e 50 6b 3b 20  iPk=0; iPk<nPk; 
20b70 69 50 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  iPk++){.        
20b80 20 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c          int iCol
20b90 20 3d 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e   = pPk->aiColumn
20ba0 5b 69 50 6b 5d 3b 0a 20 20 20 20 20 20 20 20 20  [iPk];.         
20bb0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
20bc0 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28  prCodeGetColumn(
20bd0 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 69 43  pParse, pTab, iC
20be0 6f 6c 2c 20 69 43 75 72 2c 20 72 2b 69 50 6b 2c  ol, iCur, r+iPk,
20bf0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
20c00 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20     }..          
20c10 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20      /* Check if 
20c20 74 68 65 20 74 65 6d 70 20 74 61 62 6c 65 20 61  the temp table a
20c30 6c 72 65 61 64 79 20 63 6f 6e 74 61 69 6e 73 20  lready contains 
20c40 74 68 69 73 20 6b 65 79 2e 20 49 66 20 73 6f 2c  this key. If so,
20c50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a  .              *
20c60 2a 20 74 68 65 20 72 6f 77 20 68 61 73 20 61 6c  * the row has al
20c70 72 65 61 64 79 20 62 65 65 6e 20 69 6e 63 6c 75  ready been inclu
20c80 64 65 64 20 69 6e 20 74 68 65 20 72 65 73 75 6c  ded in the resul
20c90 74 20 73 65 74 20 61 6e 64 0a 20 20 20 20 20 20  t set and.      
20ca0 20 20 20 20 20 20 20 20 2a 2a 20 63 61 6e 20 62          ** can b
20cb0 65 20 69 67 6e 6f 72 65 64 20 28 62 79 20 6a 75  e ignored (by ju
20cc0 6d 70 69 6e 67 20 70 61 73 74 20 74 68 65 20 47  mping past the G
20cd0 6f 73 75 62 20 62 65 6c 6f 77 29 2e 20 4f 74 68  osub below). Oth
20ce0 65 72 77 69 73 65 2c 0a 20 20 20 20 20 20 20 20  erwise,.        
20cf0 20 20 20 20 20 20 2a 2a 20 69 6e 73 65 72 74 20        ** insert 
20d00 74 68 65 20 6b 65 79 20 69 6e 74 6f 20 74 68 65  the key into the
20d10 20 74 65 6d 70 20 74 61 62 6c 65 20 61 6e 64 20   temp table and 
20d20 70 72 6f 63 65 65 64 20 77 69 74 68 20 70 72 6f  proceed with pro
20d30 63 65 73 73 69 6e 67 0a 20 20 20 20 20 20 20 20  cessing.        
20d40 20 20 20 20 20 20 2a 2a 20 74 68 65 20 72 6f 77        ** the row
20d50 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
20d60 2a 2a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  **.             
20d70 20 2a 2a 20 55 73 65 20 73 6f 6d 65 20 6f 66 20   ** Use some of 
20d80 74 68 65 20 73 61 6d 65 20 6f 70 74 69 6d 69 7a  the same optimiz
20d90 61 74 69 6f 6e 73 20 61 73 20 4f 50 5f 52 6f 77  ations as OP_Row
20da0 53 65 74 54 65 73 74 3a 20 49 66 20 69 53 65 74  SetTest: If iSet
20db0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a  .              *
20dc0 2a 20 69 73 20 7a 65 72 6f 2c 20 61 73 73 75 6d  * is zero, assum
20dd0 65 20 74 68 61 74 20 74 68 65 20 6b 65 79 20 63  e that the key c
20de0 61 6e 6e 6f 74 20 61 6c 72 65 61 64 79 20 62 65  annot already be
20df0 20 70 72 65 73 65 6e 74 20 69 6e 0a 20 20 20 20   present in.    
20e00 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65            ** the
20e10 20 74 65 6d 70 20 74 61 62 6c 65 2e 20 41 6e 64   temp table. And
20e20 20 69 66 20 69 53 65 74 20 69 73 20 2d 31 2c 20   if iSet is -1, 
20e30 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 72  assume that ther
20e40 65 20 69 73 20 6e 6f 20 0a 20 20 20 20 20 20 20  e is no .       
20e50 20 20 20 20 20 20 20 2a 2a 20 6e 65 65 64 20 74         ** need t
20e60 6f 20 69 6e 73 65 72 74 20 74 68 65 20 6b 65 79  o insert the key
20e70 20 69 6e 74 6f 20 74 68 65 20 74 65 6d 70 20 74   into the temp t
20e80 61 62 6c 65 2c 20 61 73 20 69 74 20 77 69 6c 6c  able, as it will
20e90 20 6e 65 76 65 72 20 0a 20 20 20 20 20 20 20 20   never .        
20ea0 20 20 20 20 20 20 2a 2a 20 62 65 20 74 65 73 74        ** be test
20eb0 65 64 20 66 6f 72 2e 20 20 2a 2f 20 0a 20 20 20  ed for.  */ .   
20ec0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69             if( i
20ed0 53 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Set ){.         
20ee0 20 20 20 20 20 20 20 6a 31 20 3d 20 73 71 6c 69         j1 = sqli
20ef0 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
20f00 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 72 65  (v, OP_Found, re
20f10 67 52 6f 77 73 65 74 2c 20 30 2c 20 72 2c 20 6e  gRowset, 0, r, n
20f20 50 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Pk);.           
20f30 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
20f40 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(v);.          
20f50 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
20f60 20 20 20 20 69 66 28 20 69 53 65 74 3e 3d 30 20      if( iSet>=0 
20f70 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
20f80 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
20f90 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp3(v, OP_MakeR
20fa0 65 63 6f 72 64 2c 20 72 2c 20 6e 50 6b 2c 20 72  ecord, r, nPk, r
20fb0 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20  egRowid);.      
20fc0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
20fd0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
20fe0 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 72 65 67  P_IdxInsert, reg
20ff0 52 6f 77 73 65 74 2c 20 72 65 67 52 6f 77 69 64  Rowset, regRowid
21000 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
21010 20 20 20 20 20 20 69 66 28 20 69 53 65 74 20 29        if( iSet )
21020 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
21030 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 55  geP5(v, OPFLAG_U
21040 53 45 53 45 45 4b 52 45 53 55 4c 54 29 3b 0a 20  SESEEKRESULT);. 
21050 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 0a               }..
21060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21070 20 52 65 6c 65 61 73 65 20 74 68 65 20 61 72 72   Release the arr
21080 61 79 20 6f 66 20 74 65 6d 70 20 72 65 67 69 73  ay of temp regis
21090 74 65 72 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  ters */.        
210a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
210b0 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50  easeTempRange(pP
210c0 61 72 73 65 2c 20 72 2c 20 6e 50 6b 29 3b 0a 20  arse, r, nPk);. 
210d0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
210e0 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
210f0 20 20 20 20 2f 2a 20 49 6e 76 6f 6b 65 20 74 68      /* Invoke th
21100 65 20 6d 61 69 6e 20 6c 6f 6f 70 20 62 6f 64 79  e main loop body
21110 20 61 73 20 61 20 73 75 62 72 6f 75 74 69 6e 65   as a subroutine
21120 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73 71   */.          sq
21130 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
21140 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67  v, OP_Gosub, reg
21150 52 65 74 75 72 6e 2c 20 69 4c 6f 6f 70 42 6f 64  Return, iLoopBod
21160 79 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 2f  y);..          /
21170 2a 20 4a 75 6d 70 20 68 65 72 65 20 28 73 6b 69  * Jump here (ski
21180 70 70 69 6e 67 20 74 68 65 20 6d 61 69 6e 20 6c  pping the main l
21190 6f 6f 70 20 62 6f 64 79 20 73 75 62 72 6f 75 74  oop body subrout
211a0 69 6e 65 29 20 69 66 20 74 68 65 0a 20 20 20 20  ine) if the.    
211b0 20 20 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74        ** current
211c0 20 73 75 62 2d 57 48 45 52 45 20 72 6f 77 20 69   sub-WHERE row i
211d0 73 20 61 20 64 75 70 6c 69 63 61 74 65 20 66 72  s a duplicate fr
211e0 6f 6d 20 70 72 69 6f 72 20 73 75 62 2d 57 48 45  om prior sub-WHE
211f0 52 45 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  REs. */.        
21200 20 20 69 66 28 20 6a 31 20 29 20 73 71 6c 69 74    if( j1 ) sqlit
21210 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
21220 2c 20 6a 31 29 3b 0a 0a 20 20 20 20 20 20 20 20  , j1);..        
21230 20 20 2f 2a 20 54 68 65 20 70 53 75 62 57 49 6e    /* The pSubWIn
21240 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54 65 72 6d  fo->untestedTerm
21250 73 20 66 6c 61 67 20 6d 65 61 6e 73 20 74 68 61  s flag means tha
21260 74 20 74 68 69 73 20 4f 52 20 74 65 72 6d 0a 20  t this OR term. 
21270 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74           ** cont
21280 61 69 6e 65 64 20 6f 6e 65 20 6f 72 20 6d 6f 72  ained one or mor
21290 65 20 41 4e 44 20 74 65 72 6d 20 66 72 6f 6d 20  e AND term from 
212a0 61 20 6e 6f 74 52 65 61 64 79 20 74 61 62 6c 65  a notReady table
212b0 2e 20 20 54 68 65 0a 20 20 20 20 20 20 20 20 20  .  The.         
212c0 20 2a 2a 20 74 65 72 6d 73 20 66 72 6f 6d 20 74   ** terms from t
212d0 68 65 20 6e 6f 74 52 65 61 64 79 20 74 61 62 6c  he notReady tabl
212e0 65 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 74  e could not be t
212f0 65 73 74 65 64 20 61 6e 64 20 77 69 6c 6c 0a 20  ested and will. 
21300 20 20 20 20 20 20 20 20 20 2a 2a 20 6e 65 65 64           ** need
21310 20 74 6f 20 62 65 20 74 65 73 74 65 64 20 6c 61   to be tested la
21320 74 65 72 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ter..          *
21330 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
21340 70 53 75 62 57 49 6e 66 6f 2d 3e 75 6e 74 65 73  pSubWInfo->untes
21350 74 65 64 54 65 72 6d 73 20 29 20 75 6e 74 65 73  tedTerms ) untes
21360 74 65 64 54 65 72 6d 73 20 3d 20 31 3b 0a 0a 20  tedTerms = 1;.. 
21370 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61           /* If a
21380 6c 6c 20 6f 66 20 74 68 65 20 4f 52 2d 63 6f 6e  ll of the OR-con
21390 6e 65 63 74 65 64 20 74 65 72 6d 73 20 61 72 65  nected terms are
213a0 20 6f 70 74 69 6d 69 7a 65 64 20 75 73 69 6e 67   optimized using
213b0 20 74 68 65 20 73 61 6d 65 0a 20 20 20 20 20 20   the same.      
213c0 20 20 20 20 2a 2a 20 69 6e 64 65 78 2c 20 61 6e      ** index, an
213d0 64 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 6f  d the index is o
213e0 70 65 6e 65 64 20 75 73 69 6e 67 20 74 68 65 20  pened using the 
213f0 73 61 6d 65 20 63 75 72 73 6f 72 20 6e 75 6d 62  same cursor numb
21400 65 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  er.          ** 
21410 62 79 20 65 61 63 68 20 63 61 6c 6c 20 74 6f 20  by each call to 
21420 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
21430 6e 28 29 20 6d 61 64 65 20 62 79 20 74 68 69 73  n() made by this
21440 20 6c 6f 6f 70 2c 20 69 74 20 6d 61 79 0a 20 20   loop, it may.  
21450 20 20 20 20 20 20 20 20 2a 2a 20 62 65 20 70 6f          ** be po
21460 73 73 69 62 6c 65 20 74 6f 20 75 73 65 20 74 68  ssible to use th
21470 61 74 20 69 6e 64 65 78 20 61 73 20 61 20 63 6f  at index as a co
21480 76 65 72 69 6e 67 20 69 6e 64 65 78 2e 0a 20 20  vering index..  
21490 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
214a0 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 63       ** If the c
214b0 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 57 68  all to sqlite3Wh
214c0 65 72 65 42 65 67 69 6e 28 29 20 61 62 6f 76 65  ereBegin() above
214d0 20 72 65 73 75 6c 74 65 64 20 69 6e 20 61 20 73   resulted in a s
214e0 63 61 6e 20 74 68 61 74 0a 20 20 20 20 20 20 20  can that.       
214f0 20 20 20 2a 2a 20 75 73 65 73 20 61 6e 20 69 6e     ** uses an in
21500 64 65 78 2c 20 61 6e 64 20 74 68 69 73 20 69 73  dex, and this is
21510 20 65 69 74 68 65 72 20 74 68 65 20 66 69 72 73   either the firs
21520 74 20 4f 52 2d 63 6f 6e 6e 65 63 74 65 64 20 74  t OR-connected t
21530 65 72 6d 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  erm.          **
21540 20 70 72 6f 63 65 73 73 65 64 20 6f 72 20 74 68   processed or th
21550 65 20 69 6e 64 65 78 20 69 73 20 74 68 65 20 73  e index is the s
21560 61 6d 65 20 61 73 20 74 68 61 74 20 75 73 65 64  ame as that used
21570 20 62 79 20 61 6c 6c 20 70 72 65 76 69 6f 75 73   by all previous
21580 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 65  .          ** te
21590 72 6d 73 2c 20 73 65 74 20 70 43 6f 76 20 74 6f  rms, set pCov to
215a0 20 74 68 65 20 63 61 6e 64 69 64 61 74 65 20 63   the candidate c
215b0 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 2e 20 4f  overing index. O
215c0 74 68 65 72 77 69 73 65 2c 20 73 65 74 20 0a 20  therwise, set . 
215d0 20 20 20 20 20 20 20 20 20 2a 2a 20 70 43 6f 76           ** pCov
215e0 20 74 6f 20 4e 55 4c 4c 20 74 6f 20 69 6e 64 69   to NULL to indi
215f0 63 61 74 65 20 74 68 61 74 20 6e 6f 20 63 61 6e  cate that no can
21600 64 69 64 61 74 65 20 63 6f 76 65 72 69 6e 67 20  didate covering 
21610 69 6e 64 65 78 20 77 69 6c 6c 20 0a 20 20 20 20  index will .    
21620 20 20 20 20 20 20 2a 2a 20 62 65 20 61 76 61 69        ** be avai
21630 6c 61 62 6c 65 2e 0a 20 20 20 20 20 20 20 20 20  lable..         
21640 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70 53   */.          pS
21650 75 62 4c 6f 6f 70 20 3d 20 70 53 75 62 57 49 6e  ubLoop = pSubWIn
21660 66 6f 2d 3e 61 5b 30 5d 2e 70 57 4c 6f 6f 70 3b  fo->a[0].pWLoop;
21670 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
21680 74 28 20 28 70 53 75 62 4c 6f 6f 70 2d 3e 77 73  t( (pSubLoop->ws
21690 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 41 55  Flags & WHERE_AU
216a0 54 4f 5f 49 4e 44 45 58 29 3d 3d 30 20 29 3b 0a  TO_INDEX)==0 );.
216b0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70            if( (p
216c0 53 75 62 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  SubLoop->wsFlags
216d0 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44   & WHERE_INDEXED
216e0 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  )!=0.           
216f0 26 26 20 28 69 69 3d 3d 30 20 7c 7c 20 70 53 75  && (ii==0 || pSu
21700 62 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70  bLoop->u.btree.p
21710 49 6e 64 65 78 3d 3d 70 43 6f 76 29 0a 20 20 20  Index==pCov).   
21720 20 20 20 20 20 20 20 20 26 26 20 28 48 61 73 52          && (HasR
21730 6f 77 69 64 28 70 54 61 62 29 20 7c 7c 20 21 49  owid(pTab) || !I
21740 73 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78  sPrimaryKeyIndex
21750 28 70 53 75 62 4c 6f 6f 70 2d 3e 75 2e 62 74 72  (pSubLoop->u.btr
21760 65 65 2e 70 49 6e 64 65 78 29 29 0a 20 20 20 20  ee.pIndex)).    
21770 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
21780 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53 75       assert( pSu
21790 62 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 69 49 64  bWInfo->a[0].iId
217a0 78 43 75 72 3d 3d 69 43 6f 76 43 75 72 20 29 3b  xCur==iCovCur );
217b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f  .            pCo
217c0 76 20 3d 20 70 53 75 62 4c 6f 6f 70 2d 3e 75 2e  v = pSubLoop->u.
217d0 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20  btree.pIndex;.  
217e0 20 20 20 20 20 20 20 20 20 20 77 63 74 72 6c 46            wctrlF
217f0 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 52 45  lags |= WHERE_RE
21800 4f 50 45 4e 5f 49 44 58 3b 0a 20 20 20 20 20 20  OPEN_IDX;.      
21810 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
21820 20 20 20 20 20 20 20 70 43 6f 76 20 3d 20 30 3b         pCov = 0;
21830 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  .          }..  
21840 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 69 73          /* Finis
21850 68 20 74 68 65 20 6c 6f 6f 70 20 74 68 72 6f 75  h the loop throu
21860 67 68 20 74 61 62 6c 65 20 65 6e 74 72 69 65 73  gh table entries
21870 20 74 68 61 74 20 6d 61 74 63 68 20 74 65 72 6d   that match term
21880 20 70 4f 72 54 65 72 6d 2e 20 2a 2f 0a 20 20 20   pOrTerm. */.   
21890 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68         sqlite3Wh
218a0 65 72 65 45 6e 64 28 70 53 75 62 57 49 6e 66 6f  ereEnd(pSubWInfo
218b0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
218c0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
218d0 4c 65 76 65 6c 2d 3e 75 2e 70 43 6f 76 69 64 78  Level->u.pCovidx
218e0 20 3d 20 70 43 6f 76 3b 0a 20 20 20 20 69 66 28   = pCov;.    if(
218f0 20 70 43 6f 76 20 29 20 70 4c 65 76 65 6c 2d 3e   pCov ) pLevel->
21900 69 49 64 78 43 75 72 20 3d 20 69 43 6f 76 43 75  iIdxCur = iCovCu
21910 72 3b 0a 20 20 20 20 69 66 28 20 70 41 6e 64 45  r;.    if( pAndE
21920 78 70 72 20 29 7b 0a 20 20 20 20 20 20 70 41 6e  xpr ){.      pAn
21930 64 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20 30  dExpr->pLeft = 0
21940 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
21950 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 41  xprDelete(db, pA
21960 6e 64 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20  ndExpr);.    }. 
21970 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
21980 61 6e 67 65 50 31 28 76 2c 20 69 52 65 74 49 6e  angeP1(v, iRetIn
21990 69 74 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43  it, sqlite3VdbeC
219a0 75 72 72 65 6e 74 41 64 64 72 28 76 29 29 3b 0a  urrentAddr(v));.
219b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
219c0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
219d0 2c 20 30 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64  , 0, pLevel->add
219e0 72 42 72 6b 29 3b 0a 20 20 20 20 73 71 6c 69 74  rBrk);.    sqlit
219f0 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
21a00 65 6c 28 76 2c 20 69 4c 6f 6f 70 42 6f 64 79 29  el(v, iLoopBody)
21a10 3b 0a 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66  ;..    if( pWInf
21a20 6f 2d 3e 6e 4c 65 76 65 6c 3e 31 20 29 20 73 71  o->nLevel>1 ) sq
21a30 6c 69 74 65 33 53 74 61 63 6b 46 72 65 65 28 64  lite3StackFree(d
21a40 62 2c 20 70 4f 72 54 61 62 29 3b 0a 20 20 20 20  b, pOrTab);.    
21a50 69 66 28 20 21 75 6e 74 65 73 74 65 64 54 65 72  if( !untestedTer
21a60 6d 73 20 29 20 64 69 73 61 62 6c 65 54 65 72 6d  ms ) disableTerm
21a70 28 70 4c 65 76 65 6c 2c 20 70 54 65 72 6d 29 3b  (pLevel, pTerm);
21a80 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20  .  }else.#endif 
21a90 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f  /* SQLITE_OMIT_O
21aa0 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a  R_OPTIMIZATION *
21ab0 2f 0a 0a 20 20 7b 0a 20 20 20 20 2f 2a 20 43 61  /..  {.    /* Ca
21ac0 73 65 20 36 3a 20 20 54 68 65 72 65 20 69 73 20  se 6:  There is 
21ad0 6e 6f 20 75 73 61 62 6c 65 20 69 6e 64 65 78 2e  no usable index.
21ae0 20 20 57 65 20 6d 75 73 74 20 64 6f 20 61 20 63    We must do a c
21af0 6f 6d 70 6c 65 74 65 0a 20 20 20 20 2a 2a 20 20  omplete.    **  
21b00 20 20 20 20 20 20 20 20 73 63 61 6e 20 6f 66 20          scan of 
21b10 74 68 65 20 65 6e 74 69 72 65 20 74 61 62 6c 65  the entire table
21b20 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 74 61  ..    */.    sta
21b30 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61 53 74  tic const u8 aSt
21b40 65 70 5b 5d 20 3d 20 7b 20 4f 50 5f 4e 65 78 74  ep[] = { OP_Next
21b50 2c 20 4f 50 5f 50 72 65 76 20 7d 3b 0a 20 20 20  , OP_Prev };.   
21b60 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38   static const u8
21b70 20 61 53 74 61 72 74 5b 5d 20 3d 20 7b 20 4f 50   aStart[] = { OP
21b80 5f 52 65 77 69 6e 64 2c 20 4f 50 5f 4c 61 73 74  _Rewind, OP_Last
21b90 20 7d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   };.    assert( 
21ba0 62 52 65 76 3d 3d 30 20 7c 7c 20 62 52 65 76 3d  bRev==0 || bRev=
21bb0 3d 31 20 29 3b 0a 20 20 20 20 69 66 28 20 70 54  =1 );.    if( pT
21bc0 61 62 49 74 65 6d 2d 3e 69 73 52 65 63 75 72 73  abItem->isRecurs
21bd0 69 76 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ive ){.      /* 
21be0 54 61 62 6c 65 73 20 6d 61 72 6b 65 64 20 69 73  Tables marked is
21bf0 52 65 63 75 72 73 69 76 65 20 68 61 76 65 20 6f  Recursive have o
21c00 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 72 6f 77  nly a single row
21c10 20 74 68 61 74 20 69 73 20 73 74 6f 72 65 64 20   that is stored 
21c20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 61 20 70 73  in.      ** a ps
21c30 65 75 64 6f 2d 63 75 72 73 6f 72 2e 20 20 4e 6f  eudo-cursor.  No
21c40 20 6e 65 65 64 20 74 6f 20 52 65 77 69 6e 64 20   need to Rewind 
21c50 6f 72 20 4e 65 78 74 20 73 75 63 68 20 63 75 72  or Next such cur
21c60 73 6f 72 73 2e 20 2a 2f 0a 20 20 20 20 20 20 70  sors. */.      p
21c70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e  Level->op = OP_N
21c80 6f 6f 70 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  oop;.    }else{.
21c90 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70        pLevel->op
21ca0 20 3d 20 61 53 74 65 70 5b 62 52 65 76 5d 3b 0a   = aStep[bRev];.
21cb0 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31        pLevel->p1
21cc0 20 3d 20 69 43 75 72 3b 0a 20 20 20 20 20 20 70   = iCur;.      p
21cd0 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 31 20 2b 20  Level->p2 = 1 + 
21ce0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
21cf0 32 28 76 2c 20 61 53 74 61 72 74 5b 62 52 65 76  2(v, aStart[bRev
21d00 5d 2c 20 69 43 75 72 2c 20 61 64 64 72 42 72 6b  ], iCur, addrBrk
21d10 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
21d20 65 72 61 67 65 49 66 28 76 2c 20 62 52 65 76 3d  erageIf(v, bRev=
21d30 3d 30 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  =0);.      VdbeC
21d40 6f 76 65 72 61 67 65 49 66 28 76 2c 20 62 52 65  overageIf(v, bRe
21d50 76 21 3d 30 29 3b 0a 20 20 20 20 20 20 70 4c 65  v!=0);.      pLe
21d60 76 65 6c 2d 3e 70 35 20 3d 20 53 51 4c 49 54 45  vel->p5 = SQLITE
21d70 5f 53 54 4d 54 53 54 41 54 55 53 5f 46 55 4c 4c  _STMTSTATUS_FULL
21d80 53 43 41 4e 5f 53 54 45 50 3b 0a 20 20 20 20 7d  SCAN_STEP;.    }
21d90 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 73 65 72  .  }..  /* Inser
21da0 74 20 63 6f 64 65 20 74 6f 20 74 65 73 74 20 65  t code to test e
21db0 76 65 72 79 20 73 75 62 65 78 70 72 65 73 73 69  very subexpressi
21dc0 6f 6e 20 74 68 61 74 20 63 61 6e 20 62 65 20 63  on that can be c
21dd0 6f 6d 70 6c 65 74 65 6c 79 0a 20 20 2a 2a 20 63  ompletely.  ** c
21de0 6f 6d 70 75 74 65 64 20 75 73 69 6e 67 20 74 68  omputed using th
21df0 65 20 63 75 72 72 65 6e 74 20 73 65 74 20 6f 66  e current set of
21e00 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20   tables..  */.  
21e10 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61  for(pTerm=pWC->a
21e20 2c 20 6a 3d 70 57 43 2d 3e 6e 54 65 72 6d 3b 20  , j=pWC->nTerm; 
21e30 6a 3e 30 3b 20 6a 2d 2d 2c 20 70 54 65 72 6d 2b  j>0; j--, pTerm+
21e40 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45  +){.    Expr *pE
21e50 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
21e60 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
21e70 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b   TERM_VIRTUAL );
21e80 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
21e90 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
21ea0 54 45 52 4d 5f 43 4f 44 45 44 20 29 3b 0a 20 20  TERM_CODED );.  
21eb0 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46    if( pTerm->wtF
21ec0 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 56 49 52  lags & (TERM_VIR
21ed0 54 55 41 4c 7c 54 45 52 4d 5f 43 4f 44 45 44 29  TUAL|TERM_CODED)
21ee0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
21ef0 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65   if( (pTerm->pre
21f00 72 65 71 41 6c 6c 20 26 20 70 4c 65 76 65 6c 2d  reqAll & pLevel-
21f10 3e 6e 6f 74 52 65 61 64 79 29 21 3d 30 20 29 7b  >notReady)!=0 ){
21f20 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
21f30 20 70 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65   pWInfo->unteste
21f40 64 54 65 72 6d 73 3d 3d 30 0a 20 20 20 20 20 20  dTerms==0.      
21f50 20 20 20 20 20 20 20 20 20 26 26 20 28 70 57 49           && (pWI
21f60 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
21f70 26 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45  & WHERE_ONETABLE
21f80 5f 4f 4e 4c 59 29 21 3d 30 20 29 3b 0a 20 20 20  _ONLY)!=0 );.   
21f90 20 20 20 70 57 49 6e 66 6f 2d 3e 75 6e 74 65 73     pWInfo->untes
21fa0 74 65 64 54 65 72 6d 73 20 3d 20 31 3b 0a 20 20  tedTerms = 1;.  
21fb0 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
21fc0 20 20 7d 0a 20 20 20 20 70 45 20 3d 20 70 54 65    }.    pE = pTe
21fd0 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 61  rm->pExpr;.    a
21fe0 73 73 65 72 74 28 20 70 45 21 3d 30 20 29 3b 0a  ssert( pE!=0 );.
21ff0 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e      if( pLevel->
22000 69 4c 65 66 74 4a 6f 69 6e 20 26 26 20 21 45 78  iLeftJoin && !Ex
22010 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
22020 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29  , EP_FromJoin) )
22030 7b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  {.      continue
22040 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
22050 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
22060 50 61 72 73 65 2c 20 70 45 2c 20 61 64 64 72 43  Parse, pE, addrC
22070 6f 6e 74 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50  ont, SQLITE_JUMP
22080 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 70 54 65  IFNULL);.    pTe
22090 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54  rm->wtFlags |= T
220a0 45 52 4d 5f 43 4f 44 45 44 3b 0a 20 20 7d 0a 0a  ERM_CODED;.  }..
220b0 20 20 2f 2a 20 49 6e 73 65 72 74 20 63 6f 64 65    /* Insert code
220c0 20 74 6f 20 74 65 73 74 20 66 6f 72 20 69 6d 70   to test for imp
220d0 6c 69 65 64 20 63 6f 6e 73 74 72 61 69 6e 74 73  lied constraints
220e0 20 62 61 73 65 64 20 6f 6e 20 74 72 61 6e 73 69   based on transi
220f0 74 69 76 69 74 79 0a 20 20 2a 2a 20 6f 66 20 74  tivity.  ** of t
22100 68 65 20 22 3d 3d 22 20 6f 70 65 72 61 74 6f 72  he "==" operator
22110 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 61 6d  ..  **.  ** Exam
22120 70 6c 65 3a 20 49 66 20 74 68 65 20 57 48 45 52  ple: If the WHER
22130 45 20 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e  E clause contain
22140 73 20 22 74 31 2e 61 3d 74 32 2e 62 22 20 61 6e  s "t1.a=t2.b" an
22150 64 20 22 74 32 2e 62 3d 31 32 33 22 0a 20 20 2a  d "t2.b=123".  *
22160 2a 20 61 6e 64 20 77 65 20 61 72 65 20 63 6f 64  * and we are cod
22170 69 6e 67 20 74 68 65 20 74 31 20 6c 6f 6f 70 20  ing the t1 loop 
22180 61 6e 64 20 74 68 65 20 74 32 20 6c 6f 6f 70 20  and the t2 loop 
22190 68 61 73 20 6e 6f 74 20 79 65 74 20 63 6f 64 65  has not yet code
221a0 64 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 77 65 20  d,.  ** then we 
221b0 63 61 6e 6e 6f 74 20 75 73 65 20 74 68 65 20 22  cannot use the "
221c0 74 31 2e 61 3d 74 32 2e 62 22 20 63 6f 6e 73 74  t1.a=t2.b" const
221d0 72 61 69 6e 74 2c 20 62 75 74 20 77 65 20 63 61  raint, but we ca
221e0 6e 20 63 6f 64 65 0a 20 20 2a 2a 20 74 68 65 20  n code.  ** the 
221f0 69 6d 70 6c 69 65 64 20 22 74 31 2e 61 3d 31 32  implied "t1.a=12
22200 33 22 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 20  3" constraint.. 
22210 20 2a 2f 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d   */.  for(pTerm=
22220 70 57 43 2d 3e 61 2c 20 6a 3d 70 57 43 2d 3e 6e  pWC->a, j=pWC->n
22230 54 65 72 6d 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c 20  Term; j>0; j--, 
22240 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 45 78  pTerm++){.    Ex
22250 70 72 20 2a 70 45 2c 20 2a 70 45 41 6c 74 3b 0a  pr *pE, *pEAlt;.
22260 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
22270 41 6c 74 3b 0a 20 20 20 20 69 66 28 20 70 54 65  Alt;.    if( pTe
22280 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54  rm->wtFlags & (T
22290 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d  ERM_VIRTUAL|TERM
222a0 5f 43 4f 44 45 44 29 20 29 20 63 6f 6e 74 69 6e  _CODED) ) contin
222b0 75 65 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72  ue;.    if( pTer
222c0 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 21 3d 28 57  m->eOperator!=(W
222d0 4f 5f 45 51 55 49 56 7c 57 4f 5f 45 51 29 20 29  O_EQUIV|WO_EQ) )
222e0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
222f0 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75  f( pTerm->leftCu
22300 72 73 6f 72 21 3d 69 43 75 72 20 29 20 63 6f 6e  rsor!=iCur ) con
22310 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70  tinue;.    if( p
22320 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e  Level->iLeftJoin
22330 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
22340 20 70 45 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78   pE = pTerm->pEx
22350 70 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  pr;.    assert( 
22360 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
22370 28 70 45 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  (pE, EP_FromJoin
22380 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ) );.    assert(
22390 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52   (pTerm->prereqR
223a0 69 67 68 74 20 26 20 70 4c 65 76 65 6c 2d 3e 6e  ight & pLevel->n
223b0 6f 74 52 65 61 64 79 29 21 3d 30 20 29 3b 0a 20  otReady)!=0 );. 
223c0 20 20 20 70 41 6c 74 20 3d 20 66 69 6e 64 54 65     pAlt = findTe
223d0 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 70 54  rm(pWC, iCur, pT
223e0 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d  erm->u.leftColum
223f0 6e 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f  n, notReady, WO_
22400 45 51 7c 57 4f 5f 49 4e 2c 20 30 29 3b 0a 20 20  EQ|WO_IN, 0);.  
22410 20 20 69 66 28 20 70 41 6c 74 3d 3d 30 20 29 20    if( pAlt==0 ) 
22420 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
22430 28 20 70 41 6c 74 2d 3e 77 74 46 6c 61 67 73 20  ( pAlt->wtFlags 
22440 26 20 28 54 45 52 4d 5f 43 4f 44 45 44 29 20 29  & (TERM_CODED) )
22450 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 74   continue;.    t
22460 65 73 74 63 61 73 65 28 20 70 41 6c 74 2d 3e 65  estcase( pAlt->e
22470 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45 51  Operator & WO_EQ
22480 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
22490 28 20 70 41 6c 74 2d 3e 65 4f 70 65 72 61 74 6f  ( pAlt->eOperato
224a0 72 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20 20 20  r & WO_IN );.   
224b0 20 56 64 62 65 4d 6f 64 75 6c 65 43 6f 6d 6d 65   VdbeModuleComme
224c0 6e 74 28 28 76 2c 20 22 62 65 67 69 6e 20 74 72  nt((v, "begin tr
224d0 61 6e 73 69 74 69 76 65 20 63 6f 6e 73 74 72 61  ansitive constra
224e0 69 6e 74 22 29 29 3b 0a 20 20 20 20 70 45 41 6c  int"));.    pEAl
224f0 74 20 3d 20 73 71 6c 69 74 65 33 53 74 61 63 6b  t = sqlite3Stack
22500 41 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a  AllocRaw(db, siz
22510 65 6f 66 28 2a 70 45 41 6c 74 29 29 3b 0a 20 20  eof(*pEAlt));.  
22520 20 20 69 66 28 20 70 45 41 6c 74 20 29 7b 0a 20    if( pEAlt ){. 
22530 20 20 20 20 20 2a 70 45 41 6c 74 20 3d 20 2a 70       *pEAlt = *p
22540 41 6c 74 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  Alt->pExpr;.    
22550 20 20 70 45 41 6c 74 2d 3e 70 4c 65 66 74 20 3d    pEAlt->pLeft =
22560 20 70 45 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20   pE->pLeft;.    
22570 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
22580 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 41  alse(pParse, pEA
22590 6c 74 2c 20 61 64 64 72 43 6f 6e 74 2c 20 53 51  lt, addrCont, SQ
225a0 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29  LITE_JUMPIFNULL)
225b0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  ;.      sqlite3S
225c0 74 61 63 6b 46 72 65 65 28 64 62 2c 20 70 45 41  tackFree(db, pEA
225d0 6c 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  lt);.    }.  }..
225e0 20 20 2f 2a 20 46 6f 72 20 61 20 4c 45 46 54 20    /* For a LEFT 
225f0 4f 55 54 45 52 20 4a 4f 49 4e 2c 20 67 65 6e 65  OUTER JOIN, gene
22600 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77  rate code that w
22610 69 6c 6c 20 72 65 63 6f 72 64 20 74 68 65 20 66  ill record the f
22620 61 63 74 20 74 68 61 74 0a 20 20 2a 2a 20 61 74  act that.  ** at
22630 20 6c 65 61 73 74 20 6f 6e 65 20 72 6f 77 20 6f   least one row o
22640 66 20 74 68 65 20 72 69 67 68 74 20 74 61 62 6c  f the right tabl
22650 65 20 68 61 73 20 6d 61 74 63 68 65 64 20 74 68  e has matched th
22660 65 20 6c 65 66 74 20 74 61 62 6c 65 2e 20 20 0a  e left table.  .
22670 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c 65 76 65    */.  if( pLeve
22680 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 29 7b 0a  l->iLeftJoin ){.
22690 20 20 20 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72      pLevel->addr
226a0 46 69 72 73 74 20 3d 20 73 71 6c 69 74 65 33 56  First = sqlite3V
226b0 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
226c0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
226d0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
226e0 6e 74 65 67 65 72 2c 20 31 2c 20 70 4c 65 76 65  nteger, 1, pLeve
226f0 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b 0a 20  l->iLeftJoin);. 
22700 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
22710 76 2c 20 22 72 65 63 6f 72 64 20 4c 45 46 54 20  v, "record LEFT 
22720 4a 4f 49 4e 20 68 69 74 22 29 29 3b 0a 20 20 20  JOIN hit"));.   
22730 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
22740 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a  eClear(pParse);.
22750 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57      for(pTerm=pW
22760 43 2d 3e 61 2c 20 6a 3d 30 3b 20 6a 3c 70 57 43  C->a, j=0; j<pWC
22770 2d 3e 6e 54 65 72 6d 3b 20 6a 2b 2b 2c 20 70 54  ->nTerm; j++, pT
22780 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 74 65  erm++){.      te
22790 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 77  stcase( pTerm->w
227a0 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49  tFlags & TERM_VI
227b0 52 54 55 41 4c 20 29 3b 0a 20 20 20 20 20 20 74  RTUAL );.      t
227c0 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
227d0 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 43  wtFlags & TERM_C
227e0 4f 44 45 44 20 29 3b 0a 20 20 20 20 20 20 69 66  ODED );.      if
227f0 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  ( pTerm->wtFlags
22800 20 26 20 28 54 45 52 4d 5f 56 49 52 54 55 41 4c   & (TERM_VIRTUAL
22810 7c 54 45 52 4d 5f 43 4f 44 45 44 29 20 29 20 63  |TERM_CODED) ) c
22820 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69  ontinue;.      i
22830 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65  f( (pTerm->prere
22840 71 41 6c 6c 20 26 20 70 4c 65 76 65 6c 2d 3e 6e  qAll & pLevel->n
22850 6f 74 52 65 61 64 79 29 21 3d 30 20 29 7b 0a 20  otReady)!=0 ){. 
22860 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
22870 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54  WInfo->untestedT
22880 65 72 6d 73 20 29 3b 0a 20 20 20 20 20 20 20 20  erms );.        
22890 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
228a0 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
228b0 70 54 65 72 6d 2d 3e 70 45 78 70 72 20 29 3b 0a  pTerm->pExpr );.
228c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
228d0 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
228e0 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 61   pTerm->pExpr, a
228f0 64 64 72 43 6f 6e 74 2c 20 53 51 4c 49 54 45 5f  ddrCont, SQLITE_
22900 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20  JUMPIFNULL);.   
22910 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67     pTerm->wtFlag
22920 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44 3b  s |= TERM_CODED;
22930 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
22940 74 75 72 6e 20 70 4c 65 76 65 6c 2d 3e 6e 6f 74  turn pLevel->not
22950 52 65 61 64 79 3b 0a 7d 0a 0a 23 69 66 20 64 65  Ready;.}..#if de
22960 66 69 6e 65 64 28 57 48 45 52 45 54 52 41 43 45  fined(WHERETRACE
22970 5f 45 4e 41 42 4c 45 44 29 20 26 26 20 64 65 66  _ENABLED) && def
22980 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
22990 4c 45 5f 54 52 45 45 5f 45 58 50 4c 41 49 4e 29  LE_TREE_EXPLAIN)
229a0 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
229b0 22 45 78 70 6c 61 6e 61 74 69 6f 6e 22 20 74 65  "Explanation" te
229c0 78 74 20 66 6f 72 20 61 20 57 68 65 72 65 54 65  xt for a WhereTe
229d0 72 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  rm..*/.static vo
229e0 69 64 20 77 68 65 72 65 45 78 70 6c 61 69 6e 54  id whereExplainT
229f0 65 72 6d 28 56 64 62 65 20 2a 76 2c 20 57 68 65  erm(Vdbe *v, Whe
22a00 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 29 7b 0a  reTerm *pTerm){.
22a10 20 20 63 68 61 72 20 7a 54 79 70 65 5b 34 5d 3b    char zType[4];
22a20 0a 20 20 6d 65 6d 63 70 79 28 7a 54 79 70 65 2c  .  memcpy(zType,
22a30 20 22 2e 2e 2e 22 2c 20 34 29 3b 0a 20 20 69 66   "...", 4);.  if
22a40 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  ( pTerm->wtFlags
22a50 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20   & TERM_VIRTUAL 
22a60 29 20 7a 54 79 70 65 5b 30 5d 20 3d 20 27 56 27  ) zType[0] = 'V'
22a70 3b 0a 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65  ;.  if( pTerm->e
22a80 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45 51  Operator & WO_EQ
22a90 55 49 56 20 20 29 20 7a 54 79 70 65 5b 31 5d 20  UIV  ) zType[1] 
22aa0 3d 20 27 45 27 3b 0a 20 20 69 66 28 20 45 78 70  = 'E';.  if( Exp
22ab0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 54 65  rHasProperty(pTe
22ac0 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f 46 72  rm->pExpr, EP_Fr
22ad0 6f 6d 4a 6f 69 6e 29 20 29 20 7a 54 79 70 65 5b  omJoin) ) zType[
22ae0 32 5d 20 3d 20 27 4c 27 3b 0a 20 20 73 71 6c 69  2] = 'L';.  sqli
22af0 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
22b00 28 76 2c 20 22 25 73 20 22 2c 20 7a 54 79 70 65  (v, "%s ", zType
22b10 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 6c  );.  sqlite3Expl
22b20 61 69 6e 45 78 70 72 28 76 2c 20 70 54 65 72 6d  ainExpr(v, pTerm
22b30 2d 3e 70 45 78 70 72 29 3b 0a 7d 0a 23 65 6e 64  ->pExpr);.}.#end
22b40 69 66 20 2f 2a 20 57 48 45 52 45 54 52 41 43 45  if /* WHERETRACE
22b50 5f 45 4e 41 42 4c 45 44 20 26 26 20 53 51 4c 49  _ENABLED && SQLI
22b60 54 45 5f 45 4e 41 42 4c 45 5f 54 52 45 45 5f 45  TE_ENABLE_TREE_E
22b70 58 50 4c 41 49 4e 20 2a 2f 0a 0a 0a 23 69 66 64  XPLAIN */...#ifd
22b80 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  ef WHERETRACE_EN
22b90 41 42 4c 45 44 0a 2f 2a 0a 2a 2a 20 50 72 69 6e  ABLED./*.** Prin
22ba0 74 20 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62  t a WhereLoop ob
22bb0 6a 65 63 74 20 66 6f 72 20 64 65 62 75 67 67 69  ject for debuggi
22bc0 6e 67 20 70 75 72 70 6f 73 65 73 0a 2a 2f 0a 73  ng purposes.*/.s
22bd0 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65  tatic void where
22be0 4c 6f 6f 70 50 72 69 6e 74 28 57 68 65 72 65 4c  LoopPrint(WhereL
22bf0 6f 6f 70 20 2a 70 2c 20 57 68 65 72 65 43 6c 61  oop *p, WhereCla
22c00 75 73 65 20 2a 70 57 43 29 7b 0a 20 20 57 68 65  use *pWC){.  Whe
22c10 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d  reInfo *pWInfo =
22c20 20 70 57 43 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20   pWC->pWInfo;.  
22c30 69 6e 74 20 6e 62 20 3d 20 31 2b 28 70 57 49 6e  int nb = 1+(pWIn
22c40 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 6e 53  fo->pTabList->nS
22c50 72 63 2b 37 29 2f 38 3b 0a 20 20 73 74 72 75 63  rc+7)/8;.  struc
22c60 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
22c70 70 49 74 65 6d 20 3d 20 70 57 49 6e 66 6f 2d 3e  pItem = pWInfo->
22c80 70 54 61 62 4c 69 73 74 2d 3e 61 20 2b 20 70 2d  pTabList->a + p-
22c90 3e 69 54 61 62 3b 0a 20 20 54 61 62 6c 65 20 2a  >iTab;.  Table *
22ca0 70 54 61 62 20 3d 20 70 49 74 65 6d 2d 3e 70 54  pTab = pItem->pT
22cb0 61 62 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62  ab;.  sqlite3Deb
22cc0 75 67 50 72 69 6e 74 66 28 22 25 63 25 32 64 2e  ugPrintf("%c%2d.
22cd0 25 30 2a 6c 6c 78 2e 25 30 2a 6c 6c 78 22 2c 20  %0*llx.%0*llx", 
22ce0 70 2d 3e 63 49 64 2c 0a 20 20 20 20 20 20 20 20  p->cId,.        
22cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e               p->
22d00 69 54 61 62 2c 20 6e 62 2c 20 70 2d 3e 6d 61 73  iTab, nb, p->mas
22d10 6b 53 65 6c 66 2c 20 6e 62 2c 20 70 2d 3e 70 72  kSelf, nb, p->pr
22d20 65 72 65 71 29 3b 0a 20 20 73 71 6c 69 74 65 33  ereq);.  sqlite3
22d30 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 25 31  DebugPrintf(" %1
22d40 32 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  2s",.           
22d50 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d            pItem-
22d60 3e 7a 41 6c 69 61 73 20 3f 20 70 49 74 65 6d 2d  >zAlias ? pItem-
22d70 3e 7a 41 6c 69 61 73 20 3a 20 70 54 61 62 2d 3e  >zAlias : pTab->
22d80 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 28 70  zName);.  if( (p
22d90 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
22da0 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 3d  E_VIRTUALTABLE)=
22db0 3d 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  =0 ){.    const 
22dc0 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20  char *zName;.   
22dd0 20 69 66 28 20 70 2d 3e 75 2e 62 74 72 65 65 2e   if( p->u.btree.
22de0 70 49 6e 64 65 78 20 26 26 20 28 7a 4e 61 6d 65  pIndex && (zName
22df0 20 3d 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49   = p->u.btree.pI
22e00 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 21 3d 30 20  ndex->zName)!=0 
22e10 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72  ){.      if( str
22e20 6e 63 6d 70 28 7a 4e 61 6d 65 2c 20 22 73 71 6c  ncmp(zName, "sql
22e30 69 74 65 5f 61 75 74 6f 69 6e 64 65 78 5f 22 2c  ite_autoindex_",
22e40 20 31 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20   17)==0 ){.     
22e50 20 20 20 69 6e 74 20 69 20 3d 20 73 71 6c 69 74     int i = sqlit
22e60 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65  e3Strlen30(zName
22e70 29 20 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 77  ) - 1;.        w
22e80 68 69 6c 65 28 20 7a 4e 61 6d 65 5b 69 5d 21 3d  hile( zName[i]!=
22e90 27 5f 27 20 29 20 69 2d 2d 3b 0a 20 20 20 20 20  '_' ) i--;.     
22ea0 20 20 20 7a 4e 61 6d 65 20 2b 3d 20 69 3b 0a 20     zName += i;. 
22eb0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
22ec0 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
22ed0 22 2e 25 2d 31 36 73 20 25 32 64 22 2c 20 7a 4e  ".%-16s %2d", zN
22ee0 61 6d 65 2c 20 70 2d 3e 75 2e 62 74 72 65 65 2e  ame, p->u.btree.
22ef0 6e 45 71 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  nEq);.    }else{
22f00 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65  .      sqlite3De
22f10 62 75 67 50 72 69 6e 74 66 28 22 25 32 30 73 22  bugPrintf("%20s"
22f20 2c 22 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  ,"");.    }.  }e
22f30 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  lse{.    char *z
22f40 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 75 2e 76  ;.    if( p->u.v
22f50 74 61 62 2e 69 64 78 53 74 72 20 29 7b 0a 20 20  tab.idxStr ){.  
22f60 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f      z = sqlite3_
22f70 6d 70 72 69 6e 74 66 28 22 28 25 64 2c 5c 22 25  mprintf("(%d,\"%
22f80 73 5c 22 2c 25 78 29 22 2c 0a 20 20 20 20 20 20  s\",%x)",.      
22f90 20 20 20 20 20 20 20 20 20 20 70 2d 3e 75 2e 76            p->u.v
22fa0 74 61 62 2e 69 64 78 4e 75 6d 2c 20 70 2d 3e 75  tab.idxNum, p->u
22fb0 2e 76 74 61 62 2e 69 64 78 53 74 72 2c 20 70 2d  .vtab.idxStr, p-
22fc0 3e 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b  >u.vtab.omitMask
22fd0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
22fe0 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f      z = sqlite3_
22ff0 6d 70 72 69 6e 74 66 28 22 28 25 64 2c 25 78 29  mprintf("(%d,%x)
23000 22 2c 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78  ", p->u.vtab.idx
23010 4e 75 6d 2c 20 70 2d 3e 75 2e 76 74 61 62 2e 6f  Num, p->u.vtab.o
23020 6d 69 74 4d 61 73 6b 29 3b 0a 20 20 20 20 7d 0a  mitMask);.    }.
23030 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
23040 50 72 69 6e 74 66 28 22 20 25 2d 31 39 73 22 2c  Printf(" %-19s",
23050 20 7a 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   z);.    sqlite3
23060 5f 66 72 65 65 28 7a 29 3b 0a 20 20 7d 0a 20 20  _free(z);.  }.  
23070 69 66 28 20 70 2d 3e 77 73 46 6c 61 67 73 20 26  if( p->wsFlags &
23080 20 57 48 45 52 45 5f 53 4b 49 50 53 43 41 4e 20   WHERE_SKIPSCAN 
23090 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  ){.    sqlite3De
230a0 62 75 67 50 72 69 6e 74 66 28 22 20 66 20 25 30  bugPrintf(" f %0
230b0 35 78 20 25 64 2d 25 64 22 2c 20 70 2d 3e 77 73  5x %d-%d", p->ws
230c0 46 6c 61 67 73 2c 20 70 2d 3e 6e 4c 54 65 72 6d  Flags, p->nLTerm
230d0 2c 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 53 6b 69  ,p->u.btree.nSki
230e0 70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  p);.  }else{.   
230f0 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
23100 6e 74 66 28 22 20 66 20 25 30 35 78 20 4e 20 25  ntf(" f %05x N %
23110 64 22 2c 20 70 2d 3e 77 73 46 6c 61 67 73 2c 20  d", p->wsFlags, 
23120 70 2d 3e 6e 4c 54 65 72 6d 29 3b 0a 20 20 7d 0a  p->nLTerm);.  }.
23130 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
23140 69 6e 74 66 28 22 20 63 6f 73 74 20 25 64 2c 25  intf(" cost %d,%
23150 64 2c 25 64 5c 6e 22 2c 20 70 2d 3e 72 53 65 74  d,%d\n", p->rSet
23160 75 70 2c 20 70 2d 3e 72 52 75 6e 2c 20 70 2d 3e  up, p->rRun, p->
23170 6e 4f 75 74 29 3b 0a 23 69 66 64 65 66 20 53 51  nOut);.#ifdef SQ
23180 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 54 52 45 45  LITE_ENABLE_TREE
23190 5f 45 58 50 4c 41 49 4e 0a 20 20 2f 2a 20 49 66  _EXPLAIN.  /* If
231a0 20 74 68 65 20 30 78 31 30 30 20 62 69 74 20 6f   the 0x100 bit o
231b0 66 20 77 68 65 72 65 74 72 61 63 69 6e 67 20 69  f wheretracing i
231c0 73 20 73 65 74 2c 20 74 68 65 6e 20 73 68 6f 77  s set, then show
231d0 20 61 6c 6c 20 6f 66 20 74 68 65 20 63 6f 6e 73   all of the cons
231e0 74 72 61 69 6e 74 0a 20 20 2a 2a 20 65 78 70 72  traint.  ** expr
231f0 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 57  essions in the W
23200 68 65 72 65 4c 6f 6f 70 2e 61 4c 54 65 72 6d 5b  hereLoop.aLTerm[
23210 5d 20 61 72 72 61 79 2e 0a 20 20 2a 2f 0a 20 20  ] array..  */.  
23220 69 66 28 20 70 2d 3e 6e 4c 54 65 72 6d 20 26 26  if( p->nLTerm &&
23230 20 28 73 71 6c 69 74 65 33 57 68 65 72 65 54 72   (sqlite3WhereTr
23240 61 63 65 20 26 20 30 78 31 30 30 29 21 3d 30 20  ace & 0x100)!=0 
23250 29 7b 20 20 2f 2a 20 57 48 45 52 45 54 52 41 43  ){  /* WHERETRAC
23260 45 20 30 78 31 30 30 20 2a 2f 0a 20 20 20 20 69  E 0x100 */.    i
23270 6e 74 20 69 3b 0a 20 20 20 20 56 64 62 65 20 2a  nt i;.    Vdbe *
23280 76 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72  v = pWInfo->pPar
23290 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 20 20 73  se->pVdbe;.    s
232a0 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 42 65 67  qlite3ExplainBeg
232b0 69 6e 28 76 29 3b 0a 20 20 20 20 66 6f 72 28 69  in(v);.    for(i
232c0 3d 30 3b 20 69 3c 70 2d 3e 6e 4c 54 65 72 6d 3b  =0; i<p->nLTerm;
232d0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 57 68 65   i++){.      Whe
232e0 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 20 3d 20  reTerm *pTerm = 
232f0 70 2d 3e 61 4c 54 65 72 6d 5b 69 5d 3b 0a 20 20  p->aLTerm[i];.  
23300 20 20 20 20 69 66 28 20 70 54 65 72 6d 3d 3d 30      if( pTerm==0
23310 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
23320 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
23330 6e 50 72 69 6e 74 66 28 76 2c 20 22 20 20 28 25  nPrintf(v, "  (%
23340 64 29 20 23 25 2d 32 64 20 22 2c 20 69 2b 31 2c  d) #%-2d ", i+1,
23350 20 28 69 6e 74 29 28 70 54 65 72 6d 2d 70 57 43   (int)(pTerm-pWC
23360 2d 3e 61 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  ->a));.      sql
23370 69 74 65 33 45 78 70 6c 61 69 6e 50 75 73 68 28  ite3ExplainPush(
23380 76 29 3b 0a 20 20 20 20 20 20 77 68 65 72 65 45  v);.      whereE
23390 78 70 6c 61 69 6e 54 65 72 6d 28 76 2c 20 70 54  xplainTerm(v, pT
233a0 65 72 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  erm);.      sqli
233b0 74 65 33 45 78 70 6c 61 69 6e 50 6f 70 28 76 29  te3ExplainPop(v)
233c0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
233d0 78 70 6c 61 69 6e 4e 4c 28 76 29 3b 0a 20 20 20  xplainNL(v);.   
233e0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78   }.    sqlite3Ex
233f0 70 6c 61 69 6e 46 69 6e 69 73 68 28 76 29 3b 0a  plainFinish(v);.
23400 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
23410 50 72 69 6e 74 66 28 22 25 73 22 2c 20 73 71 6c  Printf("%s", sql
23420 69 74 65 33 56 64 62 65 45 78 70 6c 61 6e 61 74  ite3VdbeExplanat
23430 69 6f 6e 28 76 29 29 3b 0a 20 20 7d 0a 23 65 6e  ion(v));.  }.#en
23440 64 69 66 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  dif.}.#endif../*
23450 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 62 75 6c 6b  .** Convert bulk
23460 20 6d 65 6d 6f 72 79 20 69 6e 74 6f 20 61 20 76   memory into a v
23470 61 6c 69 64 20 57 68 65 72 65 4c 6f 6f 70 20 74  alid WhereLoop t
23480 68 61 74 20 63 61 6e 20 62 65 20 70 61 73 73 65  hat can be passe
23490 64 0a 2a 2a 20 74 6f 20 77 68 65 72 65 4c 6f 6f  d.** to whereLoo
234a0 70 43 6c 65 61 72 20 68 61 72 6d 6c 65 73 73 6c  pClear harmlessl
234b0 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  y..*/.static voi
234c0 64 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28  d whereLoopInit(
234d0 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20  WhereLoop *p){. 
234e0 20 70 2d 3e 61 4c 54 65 72 6d 20 3d 20 70 2d 3e   p->aLTerm = p->
234f0 61 4c 54 65 72 6d 53 70 61 63 65 3b 0a 20 20 70  aLTermSpace;.  p
23500 2d 3e 6e 4c 54 65 72 6d 20 3d 20 30 3b 0a 20 20  ->nLTerm = 0;.  
23510 70 2d 3e 6e 4c 53 6c 6f 74 20 3d 20 41 72 72 61  p->nLSlot = Arra
23520 79 53 69 7a 65 28 70 2d 3e 61 4c 54 65 72 6d 53  ySize(p->aLTermS
23530 70 61 63 65 29 3b 0a 20 20 70 2d 3e 77 73 46 6c  pace);.  p->wsFl
23540 61 67 73 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  ags = 0;.}../*.*
23550 2a 20 43 6c 65 61 72 20 74 68 65 20 57 68 65 72  * Clear the Wher
23560 65 4c 6f 6f 70 2e 75 20 75 6e 69 6f 6e 2e 20 20  eLoop.u union.  
23570 4c 65 61 76 65 20 57 68 65 72 65 4c 6f 6f 70 2e  Leave WhereLoop.
23580 70 4c 54 65 72 6d 20 69 6e 74 61 63 74 2e 0a 2a  pLTerm intact..*
23590 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68  /.static void wh
235a0 65 72 65 4c 6f 6f 70 43 6c 65 61 72 55 6e 69 6f  ereLoopClearUnio
235b0 6e 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57  n(sqlite3 *db, W
235c0 68 65 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20  hereLoop *p){.  
235d0 69 66 28 20 70 2d 3e 77 73 46 6c 61 67 73 20 26  if( p->wsFlags &
235e0 20 28 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54   (WHERE_VIRTUALT
235f0 41 42 4c 45 7c 57 48 45 52 45 5f 41 55 54 4f 5f  ABLE|WHERE_AUTO_
23600 49 4e 44 45 58 29 20 29 7b 0a 20 20 20 20 69 66  INDEX) ){.    if
23610 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  ( (p->wsFlags & 
23620 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42  WHERE_VIRTUALTAB
23630 4c 45 29 21 3d 30 20 26 26 20 70 2d 3e 75 2e 76  LE)!=0 && p->u.v
23640 74 61 62 2e 6e 65 65 64 46 72 65 65 20 29 7b 0a  tab.needFree ){.
23650 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
23660 65 65 28 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78  ee(p->u.vtab.idx
23670 53 74 72 29 3b 0a 20 20 20 20 20 20 70 2d 3e 75  Str);.      p->u
23680 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3d  .vtab.needFree =
23690 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 75 2e 76   0;.      p->u.v
236a0 74 61 62 2e 69 64 78 53 74 72 20 3d 20 30 3b 0a  tab.idxStr = 0;.
236b0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70      }else if( (p
236c0 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
236d0 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 21 3d 30  E_AUTO_INDEX)!=0
236e0 20 26 26 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70   && p->u.btree.p
236f0 49 6e 64 65 78 21 3d 30 20 29 7b 0a 20 20 20 20  Index!=0 ){.    
23700 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
23710 64 62 2c 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70  db, p->u.btree.p
23720 49 6e 64 65 78 2d 3e 7a 43 6f 6c 41 66 66 29 3b  Index->zColAff);
23730 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4b 65  .      sqlite3Ke
23740 79 49 6e 66 6f 55 6e 72 65 66 28 70 2d 3e 75 2e  yInfoUnref(p->u.
23750 62 74 72 65 65 2e 70 49 6e 64 65 78 2d 3e 70 4b  btree.pIndex->pK
23760 65 79 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73  eyInfo);.      s
23770 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
23780 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64   p->u.btree.pInd
23790 65 78 29 3b 0a 20 20 20 20 20 20 70 2d 3e 75 2e  ex);.      p->u.
237a0 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 30  btree.pIndex = 0
237b0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
237c0 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20  *.** Deallocate 
237d0 69 6e 74 65 72 6e 61 6c 20 6d 65 6d 6f 72 79 20  internal memory 
237e0 75 73 65 64 20 62 79 20 61 20 57 68 65 72 65 4c  used by a WhereL
237f0 6f 6f 70 20 6f 62 6a 65 63 74 0a 2a 2f 0a 73 74  oop object.*/.st
23800 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 4c  atic void whereL
23810 6f 6f 70 43 6c 65 61 72 28 73 71 6c 69 74 65 33  oopClear(sqlite3
23820 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20   *db, WhereLoop 
23830 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 61 4c  *p){.  if( p->aL
23840 54 65 72 6d 21 3d 70 2d 3e 61 4c 54 65 72 6d 53  Term!=p->aLTermS
23850 70 61 63 65 20 29 20 73 71 6c 69 74 65 33 44 62  pace ) sqlite3Db
23860 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 4c 54 65  Free(db, p->aLTe
23870 72 6d 29 3b 0a 20 20 77 68 65 72 65 4c 6f 6f 70  rm);.  whereLoop
23880 43 6c 65 61 72 55 6e 69 6f 6e 28 64 62 2c 20 70  ClearUnion(db, p
23890 29 3b 0a 20 20 77 68 65 72 65 4c 6f 6f 70 49 6e  );.  whereLoopIn
238a0 69 74 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  it(p);.}../*.** 
238b0 49 6e 63 72 65 61 73 65 20 74 68 65 20 6d 65 6d  Increase the mem
238c0 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66  ory allocation f
238d0 6f 72 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d  or pLoop->aLTerm
238e0 5b 5d 20 74 6f 20 62 65 20 61 74 20 6c 65 61 73  [] to be at leas
238f0 74 20 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  t n..*/.static i
23900 6e 74 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69  nt whereLoopResi
23910 7a 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ze(sqlite3 *db, 
23920 57 68 65 72 65 4c 6f 6f 70 20 2a 70 2c 20 69 6e  WhereLoop *p, in
23930 74 20 6e 29 7b 0a 20 20 57 68 65 72 65 54 65 72  t n){.  WhereTer
23940 6d 20 2a 2a 70 61 4e 65 77 3b 0a 20 20 69 66 28  m **paNew;.  if(
23950 20 70 2d 3e 6e 4c 53 6c 6f 74 3e 3d 6e 20 29 20   p->nLSlot>=n ) 
23960 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
23970 3b 0a 20 20 6e 20 3d 20 28 6e 2b 37 29 26 7e 37  ;.  n = (n+7)&~7
23980 3b 0a 20 20 70 61 4e 65 77 20 3d 20 73 71 6c 69  ;.  paNew = sqli
23990 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64  te3DbMallocRaw(d
239a0 62 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 61 4c 54  b, sizeof(p->aLT
239b0 65 72 6d 5b 30 5d 29 2a 6e 29 3b 0a 20 20 69 66  erm[0])*n);.  if
239c0 28 20 70 61 4e 65 77 3d 3d 30 20 29 20 72 65 74  ( paNew==0 ) ret
239d0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
239e0 3b 0a 20 20 6d 65 6d 63 70 79 28 70 61 4e 65 77  ;.  memcpy(paNew
239f0 2c 20 70 2d 3e 61 4c 54 65 72 6d 2c 20 73 69 7a  , p->aLTerm, siz
23a00 65 6f 66 28 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d  eof(p->aLTerm[0]
23a10 29 2a 70 2d 3e 6e 4c 53 6c 6f 74 29 3b 0a 20 20  )*p->nLSlot);.  
23a20 69 66 28 20 70 2d 3e 61 4c 54 65 72 6d 21 3d 70  if( p->aLTerm!=p
23a30 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 20 29 20  ->aLTermSpace ) 
23a40 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
23a50 2c 20 70 2d 3e 61 4c 54 65 72 6d 29 3b 0a 20 20  , p->aLTerm);.  
23a60 70 2d 3e 61 4c 54 65 72 6d 20 3d 20 70 61 4e 65  p->aLTerm = paNe
23a70 77 3b 0a 20 20 70 2d 3e 6e 4c 53 6c 6f 74 20 3d  w;.  p->nLSlot =
23a80 20 6e 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   n;.  return SQL
23a90 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
23aa0 20 54 72 61 6e 73 66 65 72 20 63 6f 6e 74 65 6e   Transfer conten
23ab0 74 20 66 72 6f 6d 20 74 68 65 20 73 65 63 6f 6e  t from the secon
23ac0 64 20 70 4c 6f 6f 70 20 69 6e 74 6f 20 74 68 65  d pLoop into the
23ad0 20 66 69 72 73 74 2e 0a 2a 2f 0a 73 74 61 74 69   first..*/.stati
23ae0 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 58  c int whereLoopX
23af0 66 65 72 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  fer(sqlite3 *db,
23b00 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 54 6f 2c   WhereLoop *pTo,
23b10 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 46 72 6f   WhereLoop *pFro
23b20 6d 29 7b 0a 20 20 77 68 65 72 65 4c 6f 6f 70 43  m){.  whereLoopC
23b30 6c 65 61 72 55 6e 69 6f 6e 28 64 62 2c 20 70 54  learUnion(db, pT
23b40 6f 29 3b 0a 20 20 69 66 28 20 77 68 65 72 65 4c  o);.  if( whereL
23b50 6f 6f 70 52 65 73 69 7a 65 28 64 62 2c 20 70 54  oopResize(db, pT
23b60 6f 2c 20 70 46 72 6f 6d 2d 3e 6e 4c 54 65 72 6d  o, pFrom->nLTerm
23b70 29 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28  ) ){.    memset(
23b80 26 70 54 6f 2d 3e 75 2c 20 30 2c 20 73 69 7a 65  &pTo->u, 0, size
23b90 6f 66 28 70 54 6f 2d 3e 75 29 29 3b 0a 20 20 20  of(pTo->u));.   
23ba0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
23bb0 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 6d 65 6d 63  OMEM;.  }.  memc
23bc0 70 79 28 70 54 6f 2c 20 70 46 72 6f 6d 2c 20 57  py(pTo, pFrom, W
23bd0 48 45 52 45 5f 4c 4f 4f 50 5f 58 46 45 52 5f 53  HERE_LOOP_XFER_S
23be0 5a 29 3b 0a 20 20 6d 65 6d 63 70 79 28 70 54 6f  Z);.  memcpy(pTo
23bf0 2d 3e 61 4c 54 65 72 6d 2c 20 70 46 72 6f 6d 2d  ->aLTerm, pFrom-
23c00 3e 61 4c 54 65 72 6d 2c 20 70 54 6f 2d 3e 6e 4c  >aLTerm, pTo->nL
23c10 54 65 72 6d 2a 73 69 7a 65 6f 66 28 70 54 6f 2d  Term*sizeof(pTo-
23c20 3e 61 4c 54 65 72 6d 5b 30 5d 29 29 3b 0a 20 20  >aLTerm[0]));.  
23c30 69 66 28 20 70 46 72 6f 6d 2d 3e 77 73 46 6c 61  if( pFrom->wsFla
23c40 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55  gs & WHERE_VIRTU
23c50 41 4c 54 41 42 4c 45 20 29 7b 0a 20 20 20 20 70  ALTABLE ){.    p
23c60 46 72 6f 6d 2d 3e 75 2e 76 74 61 62 2e 6e 65 65  From->u.vtab.nee
23c70 64 46 72 65 65 20 3d 20 30 3b 0a 20 20 7d 65 6c  dFree = 0;.  }el
23c80 73 65 20 69 66 28 20 28 70 46 72 6f 6d 2d 3e 77  se if( (pFrom->w
23c90 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 41  sFlags & WHERE_A
23ca0 55 54 4f 5f 49 4e 44 45 58 29 21 3d 30 20 29 7b  UTO_INDEX)!=0 ){
23cb0 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 75 2e 62 74  .    pFrom->u.bt
23cc0 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 30 3b 0a  ree.pIndex = 0;.
23cd0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
23ce0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
23cf0 20 44 65 6c 65 74 65 20 61 20 57 68 65 72 65 4c   Delete a WhereL
23d00 6f 6f 70 20 6f 62 6a 65 63 74 0a 2a 2f 0a 73 74  oop object.*/.st
23d10 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 4c  atic void whereL
23d20 6f 6f 70 44 65 6c 65 74 65 28 73 71 6c 69 74 65  oopDelete(sqlite
23d30 33 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f 70  3 *db, WhereLoop
23d40 20 2a 70 29 7b 0a 20 20 77 68 65 72 65 4c 6f 6f   *p){.  whereLoo
23d50 70 43 6c 65 61 72 28 64 62 2c 20 70 29 3b 0a 20  pClear(db, p);. 
23d60 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
23d70 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  b, p);.}../*.** 
23d80 46 72 65 65 20 61 20 57 68 65 72 65 49 6e 66 6f  Free a WhereInfo
23d90 20 73 74 72 75 63 74 75 72 65 0a 2a 2f 0a 73 74   structure.*/.st
23da0 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 49  atic void whereI
23db0 6e 66 6f 46 72 65 65 28 73 71 6c 69 74 65 33 20  nfoFree(sqlite3 
23dc0 2a 64 62 2c 20 57 68 65 72 65 49 6e 66 6f 20 2a  *db, WhereInfo *
23dd0 70 57 49 6e 66 6f 29 7b 0a 20 20 69 66 28 20 41  pWInfo){.  if( A
23de0 4c 57 41 59 53 28 70 57 49 6e 66 6f 29 20 29 7b  LWAYS(pWInfo) ){
23df0 0a 20 20 20 20 77 68 65 72 65 43 6c 61 75 73 65  .    whereClause
23e00 43 6c 65 61 72 28 26 70 57 49 6e 66 6f 2d 3e 73  Clear(&pWInfo->s
23e10 57 43 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  WC);.    while( 
23e20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 20 29  pWInfo->pLoops )
23e30 7b 0a 20 20 20 20 20 20 57 68 65 72 65 4c 6f 6f  {.      WhereLoo
23e40 70 20 2a 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  p *p = pWInfo->p
23e50 4c 6f 6f 70 73 3b 0a 20 20 20 20 20 20 70 57 49  Loops;.      pWI
23e60 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 20 3d 20 70 2d  nfo->pLoops = p-
23e70 3e 70 4e 65 78 74 4c 6f 6f 70 3b 0a 20 20 20 20  >pNextLoop;.    
23e80 20 20 77 68 65 72 65 4c 6f 6f 70 44 65 6c 65 74    whereLoopDelet
23e90 65 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 7d 0a  e(db, p);.    }.
23ea0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
23eb0 65 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20  e(db, pWInfo);. 
23ec0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75   }.}../*.** Retu
23ed0 72 6e 20 54 52 55 45 20 69 66 20 62 6f 74 68 20  rn TRUE if both 
23ee0 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
23ef0 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a   are true:.**.**
23f00 20 20 20 28 31 29 20 20 58 20 68 61 73 20 74 68     (1)  X has th
23f10 65 20 73 61 6d 65 20 6f 72 20 6c 6f 77 65 72 20  e same or lower 
23f20 63 6f 73 74 20 74 68 61 74 20 59 0a 2a 2a 20 20  cost that Y.**  
23f30 20 28 32 29 20 20 58 20 69 73 20 61 20 70 72 6f   (2)  X is a pro
23f40 70 65 72 20 73 75 62 73 65 74 20 6f 66 20 59 0a  per subset of Y.
23f50 2a 2a 0a 2a 2a 20 42 79 20 22 70 72 6f 70 65 72  **.** By "proper
23f60 20 73 75 62 73 65 74 22 20 77 65 20 6d 65 61 6e   subset" we mean
23f70 20 74 68 61 74 20 58 20 75 73 65 73 20 66 65 77   that X uses few
23f80 65 72 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  er WHERE clause 
23f90 74 65 72 6d 73 0a 2a 2a 20 74 68 61 6e 20 59 20  terms.** than Y 
23fa0 61 6e 64 20 74 68 61 74 20 65 76 65 72 79 20 57  and that every W
23fb0 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d  HERE clause term
23fc0 20 75 73 65 64 20 62 79 20 58 20 69 73 20 61 6c   used by X is al
23fd0 73 6f 20 75 73 65 64 0a 2a 2a 20 62 79 20 59 2e  so used.** by Y.
23fe0 0a 2a 2a 0a 2a 2a 20 49 66 20 58 20 69 73 20 61  .**.** If X is a
23ff0 20 70 72 6f 70 65 72 20 73 75 62 73 65 74 20 6f   proper subset o
24000 66 20 59 20 74 68 65 6e 20 59 20 69 73 20 61 20  f Y then Y is a 
24010 62 65 74 74 65 72 20 63 68 6f 69 63 65 20 61 6e  better choice an
24020 64 20 6f 75 67 68 74 0a 2a 2a 20 74 6f 20 68 61  d ought.** to ha
24030 76 65 20 61 20 6c 6f 77 65 72 20 63 6f 73 74 2e  ve a lower cost.
24040 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72    This routine r
24050 65 74 75 72 6e 73 20 54 52 55 45 20 77 68 65 6e  eturns TRUE when
24060 20 74 68 61 74 20 63 6f 73 74 20 0a 2a 2a 20 72   that cost .** r
24070 65 6c 61 74 69 6f 6e 73 68 69 70 20 69 73 20 69  elationship is i
24080 6e 76 65 72 74 65 64 20 61 6e 64 20 6e 65 65 64  nverted and need
24090 73 20 74 6f 20 62 65 20 61 64 6a 75 73 74 65 64  s to be adjusted
240a0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
240b0 77 68 65 72 65 4c 6f 6f 70 43 68 65 61 70 65 72  whereLoopCheaper
240c0 50 72 6f 70 65 72 53 75 62 73 65 74 28 0a 20 20  ProperSubset(.  
240d0 63 6f 6e 73 74 20 57 68 65 72 65 4c 6f 6f 70 20  const WhereLoop 
240e0 2a 70 58 2c 20 20 20 20 20 20 20 2f 2a 20 46 69  *pX,       /* Fi
240f0 72 73 74 20 57 68 65 72 65 4c 6f 6f 70 20 74 6f  rst WhereLoop to
24100 20 63 6f 6d 70 61 72 65 20 2a 2f 0a 20 20 63 6f   compare */.  co
24110 6e 73 74 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  nst WhereLoop *p
24120 59 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70  Y        /* Comp
24130 61 72 65 20 61 67 61 69 6e 73 74 20 74 68 69 73  are against this
24140 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2f 0a 29 7b   WhereLoop */.){
24150 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69  .  int i, j;.  i
24160 66 28 20 70 58 2d 3e 6e 4c 54 65 72 6d 20 3e 3d  f( pX->nLTerm >=
24170 20 70 59 2d 3e 6e 4c 54 65 72 6d 20 29 20 72 65   pY->nLTerm ) re
24180 74 75 72 6e 20 30 3b 20 2f 2a 20 58 20 69 73 20  turn 0; /* X is 
24190 6e 6f 74 20 61 20 73 75 62 73 65 74 20 6f 66 20  not a subset of 
241a0 59 20 2a 2f 0a 20 20 69 66 28 20 70 58 2d 3e 72  Y */.  if( pX->r
241b0 52 75 6e 20 3e 3d 20 70 59 2d 3e 72 52 75 6e 20  Run >= pY->rRun 
241c0 29 7b 0a 20 20 20 20 69 66 28 20 70 58 2d 3e 72  ){.    if( pX->r
241d0 52 75 6e 20 3e 20 70 59 2d 3e 72 52 75 6e 20 29  Run > pY->rRun )
241e0 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 2f 2a   return 0;    /*
241f0 20 58 20 63 6f 73 74 73 20 6d 6f 72 65 20 74 68   X costs more th
24200 61 6e 20 59 20 2a 2f 0a 20 20 20 20 69 66 28 20  an Y */.    if( 
24210 70 58 2d 3e 6e 4f 75 74 20 3e 20 70 59 2d 3e 6e  pX->nOut > pY->n
24220 4f 75 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20  Out ) return 0; 
24230 20 20 20 2f 2a 20 58 20 63 6f 73 74 73 20 6d 6f     /* X costs mo
24240 72 65 20 74 68 61 6e 20 59 20 2a 2f 0a 20 20 7d  re than Y */.  }
24250 0a 20 20 66 6f 72 28 69 3d 70 58 2d 3e 6e 4c 54  .  for(i=pX->nLT
24260 65 72 6d 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d  erm-1; i>=0; i--
24270 29 7b 0a 20 20 20 20 66 6f 72 28 6a 3d 70 59 2d  ){.    for(j=pY-
24280 3e 6e 4c 54 65 72 6d 2d 31 3b 20 6a 3e 3d 30 3b  >nLTerm-1; j>=0;
24290 20 6a 2d 2d 29 7b 0a 20 20 20 20 20 20 69 66 28   j--){.      if(
242a0 20 70 59 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 3d 3d   pY->aLTerm[j]==
242b0 70 58 2d 3e 61 4c 54 65 72 6d 5b 69 5d 20 29 20  pX->aLTerm[i] ) 
242c0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
242d0 20 69 66 28 20 6a 3c 30 20 29 20 72 65 74 75 72   if( j<0 ) retur
242e0 6e 20 30 3b 20 20 2f 2a 20 58 20 6e 6f 74 20 61  n 0;  /* X not a
242f0 20 73 75 62 73 65 74 20 6f 66 20 59 20 73 69 6e   subset of Y sin
24300 63 65 20 74 65 72 6d 20 58 5b 69 5d 20 6e 6f 74  ce term X[i] not
24310 20 75 73 65 64 20 62 79 20 59 20 2a 2f 0a 20 20   used by Y */.  
24320 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 20 20 2f  }.  return 1;  /
24330 2a 20 41 6c 6c 20 63 6f 6e 64 69 74 69 6f 6e 73  * All conditions
24340 20 6d 65 65 74 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a   meet */.}../*.*
24350 2a 20 54 72 79 20 74 6f 20 61 64 6a 75 73 74 20  * Try to adjust 
24360 74 68 65 20 63 6f 73 74 20 6f 66 20 57 68 65 72  the cost of Wher
24370 65 4c 6f 6f 70 20 70 54 65 6d 70 6c 61 74 65 20  eLoop pTemplate 
24380 75 70 77 61 72 64 73 20 6f 72 20 64 6f 77 6e 77  upwards or downw
24390 61 72 64 73 20 73 6f 0a 2a 2a 20 74 68 61 74 3a  ards so.** that:
243a0 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 70 54 65  .**.**   (1) pTe
243b0 6d 70 6c 61 74 65 20 63 6f 73 74 73 20 6c 65 73  mplate costs les
243c0 73 20 74 68 61 6e 20 61 6e 79 20 6f 74 68 65 72  s than any other
243d0 20 57 68 65 72 65 4c 6f 6f 70 73 20 74 68 61 74   WhereLoops that
243e0 20 61 72 65 20 61 20 70 72 6f 70 65 72 0a 2a 2a   are a proper.**
243f0 20 20 20 20 20 20 20 73 75 62 73 65 74 20 6f 66         subset of
24400 20 70 54 65 6d 70 6c 61 74 65 0a 2a 2a 0a 2a 2a   pTemplate.**.**
24410 20 20 20 28 32 29 20 70 54 65 6d 70 6c 61 74 65     (2) pTemplate
24420 20 63 6f 73 74 73 20 6d 6f 72 65 20 74 68 61 6e   costs more than
24430 20 61 6e 79 20 6f 74 68 65 72 20 57 68 65 72 65   any other Where
24440 4c 6f 6f 70 73 20 66 6f 72 20 77 68 69 63 68 20  Loops for which 
24450 70 54 65 6d 70 6c 61 74 65 0a 2a 2a 20 20 20 20  pTemplate.**    
24460 20 20 20 69 73 20 61 20 70 72 6f 70 65 72 20 73     is a proper s
24470 75 62 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20  ubset..**.** To 
24480 73 61 79 20 22 57 68 65 72 65 4c 6f 6f 70 20 58  say "WhereLoop X
24490 20 69 73 20 61 20 70 72 6f 70 65 72 20 73 75 62   is a proper sub
244a0 73 65 74 20 6f 66 20 59 22 20 6d 65 61 6e 73 20  set of Y" means 
244b0 74 68 61 74 20 58 20 75 73 65 73 20 66 65 77 65  that X uses fewe
244c0 72 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73  r.** WHERE claus
244d0 65 20 74 65 72 6d 73 20 74 68 61 6e 20 59 20 61  e terms than Y a
244e0 6e 64 20 74 68 61 74 20 65 76 65 72 79 20 57 48  nd that every WH
244f0 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20  ERE clause term 
24500 75 73 65 64 20 62 79 20 58 20 69 73 0a 2a 2a 20  used by X is.** 
24510 61 6c 73 6f 20 75 73 65 64 20 62 79 20 59 2e 0a  also used by Y..
24520 2a 2a 0a 2a 2a 20 54 68 69 73 20 61 64 6a 75 73  **.** This adjus
24530 74 6d 65 6e 74 20 69 73 20 6f 6d 69 74 74 65 64  tment is omitted
24540 20 66 6f 72 20 53 4b 49 50 53 43 41 4e 20 6c 6f   for SKIPSCAN lo
24550 6f 70 73 2e 20 20 49 6e 20 61 20 53 4b 49 50 53  ops.  In a SKIPS
24560 43 41 4e 20 6c 6f 6f 70 2c 20 74 68 65 0a 2a 2a  CAN loop, the.**
24570 20 57 68 65 72 65 4c 6f 6f 70 2e 6e 4c 54 65 72   WhereLoop.nLTer
24580 6d 20 66 69 65 6c 64 20 69 73 20 6e 6f 74 20 61  m field is not a
24590 6e 20 61 63 63 75 72 61 74 65 20 6d 65 61 73 75  n accurate measu
245a0 72 65 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72  re of the number
245b0 20 6f 66 20 57 48 45 52 45 0a 2a 2a 20 63 6c 61   of WHERE.** cla
245c0 75 73 65 20 74 65 72 6d 73 20 63 6f 76 65 72 65  use terms covere
245d0 64 2c 20 73 69 6e 63 65 20 73 6f 6d 65 20 6f 66  d, since some of
245e0 20 74 68 65 20 66 69 72 73 74 20 6e 4c 54 65 72   the first nLTer
245f0 6d 20 65 6e 74 72 69 65 73 20 69 6e 20 61 4c 54  m entries in aLT
24600 65 72 6d 5b 5d 0a 2a 2a 20 77 69 6c 6c 20 62 65  erm[].** will be
24610 20 4e 55 4c 4c 20 28 62 65 63 61 75 73 65 20 74   NULL (because t
24620 68 65 79 20 61 72 65 20 73 6b 69 70 70 65 64 29  hey are skipped)
24630 2e 20 20 54 68 61 74 20 6d 61 6b 65 73 20 69 74  .  That makes it
24640 20 6d 6f 72 65 20 64 69 66 66 69 63 75 6c 74 0a   more difficult.
24650 2a 2a 20 74 6f 20 63 6f 6d 70 61 72 65 20 74 68  ** to compare th
24660 65 20 6c 6f 6f 70 73 2e 20 20 57 65 20 63 6f 75  e loops.  We cou
24670 6c 64 20 61 64 64 20 65 78 74 72 61 20 63 6f 64  ld add extra cod
24680 65 20 74 6f 20 64 6f 20 74 68 65 20 63 6f 6d 70  e to do the comp
24690 61 72 69 73 6f 6e 2c 20 61 6e 64 0a 2a 2a 20 70  arison, and.** p
246a0 65 72 68 61 70 73 20 77 65 20 77 69 6c 6c 20 73  erhaps we will s
246b0 6f 6d 65 64 61 79 2e 20 20 42 75 74 20 53 4b 49  omeday.  But SKI
246c0 50 53 43 41 4e 20 69 73 20 73 75 66 66 69 63 69  PSCAN is suffici
246d0 65 6e 74 6c 79 20 75 6e 63 6f 6d 6d 6f 6e 2c 20  ently uncommon, 
246e0 61 6e 64 20 74 68 69 73 0a 2a 2a 20 61 64 6a 75  and this.** adju
246f0 73 74 6d 65 6e 74 20 69 73 20 73 75 66 66 69 63  stment is suffic
24700 69 65 6e 74 20 6d 69 6e 6f 72 2c 20 74 68 61 74  ient minor, that
24710 20 69 74 20 69 73 20 76 65 72 79 20 64 69 66 66   it is very diff
24720 69 63 75 6c 74 20 74 6f 20 63 6f 6e 73 74 72 75  icult to constru
24730 63 74 0a 2a 2a 20 61 20 74 65 73 74 20 63 61 73  ct.** a test cas
24740 65 20 77 68 65 72 65 20 74 68 65 20 65 78 74 72  e where the extr
24750 61 20 63 6f 64 65 20 77 6f 75 6c 64 20 69 6d 70  a code would imp
24760 72 6f 76 65 20 74 68 65 20 71 75 65 72 79 20 70  rove the query p
24770 6c 61 6e 2e 20 20 42 65 74 74 65 72 0a 2a 2a 20  lan.  Better.** 
24780 74 6f 20 61 76 6f 69 64 20 74 68 65 20 61 64 64  to avoid the add
24790 65 64 20 63 6f 6d 70 6c 65 78 69 74 79 20 61 6e  ed complexity an
247a0 64 20 6a 75 73 74 20 6f 6d 69 74 20 63 6f 73 74  d just omit cost
247b0 20 61 64 6a 75 73 74 6d 65 6e 74 73 20 74 6f 20   adjustments to 
247c0 53 4b 49 50 53 43 41 4e 0a 2a 2a 20 6c 6f 6f 70  SKIPSCAN.** loop
247d0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
247e0 64 20 77 68 65 72 65 4c 6f 6f 70 41 64 6a 75 73  d whereLoopAdjus
247f0 74 43 6f 73 74 28 63 6f 6e 73 74 20 57 68 65 72  tCost(const Wher
24800 65 4c 6f 6f 70 20 2a 70 2c 20 57 68 65 72 65 4c  eLoop *p, WhereL
24810 6f 6f 70 20 2a 70 54 65 6d 70 6c 61 74 65 29 7b  oop *pTemplate){
24820 0a 20 20 69 66 28 20 28 70 54 65 6d 70 6c 61 74  .  if( (pTemplat
24830 65 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  e->wsFlags & WHE
24840 52 45 5f 49 4e 44 45 58 45 44 29 3d 3d 30 20 29  RE_INDEXED)==0 )
24850 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 28   return;.  if( (
24860 70 54 65 6d 70 6c 61 74 65 2d 3e 77 73 46 6c 61  pTemplate->wsFla
24870 67 73 20 26 20 57 48 45 52 45 5f 53 4b 49 50 53  gs & WHERE_SKIPS
24880 43 41 4e 29 21 3d 30 20 29 20 72 65 74 75 72 6e  CAN)!=0 ) return
24890 3b 0a 20 20 66 6f 72 28 3b 20 70 3b 20 70 3d 70  ;.  for(; p; p=p
248a0 2d 3e 70 4e 65 78 74 4c 6f 6f 70 29 7b 0a 20 20  ->pNextLoop){.  
248b0 20 20 69 66 28 20 70 2d 3e 69 54 61 62 21 3d 70    if( p->iTab!=p
248c0 54 65 6d 70 6c 61 74 65 2d 3e 69 54 61 62 20 29  Template->iTab )
248d0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
248e0 66 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26  f( (p->wsFlags &
248f0 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 3d   WHERE_INDEXED)=
24900 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
24910 20 20 20 69 66 28 20 28 70 2d 3e 77 73 46 6c 61     if( (p->wsFla
24920 67 73 20 26 20 57 48 45 52 45 5f 53 4b 49 50 53  gs & WHERE_SKIPS
24930 43 41 4e 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e  CAN)!=0 ) contin
24940 75 65 3b 0a 20 20 20 20 69 66 28 20 77 68 65 72  ue;.    if( wher
24950 65 4c 6f 6f 70 43 68 65 61 70 65 72 50 72 6f 70  eLoopCheaperProp
24960 65 72 53 75 62 73 65 74 28 70 2c 20 70 54 65 6d  erSubset(p, pTem
24970 70 6c 61 74 65 29 20 29 7b 0a 20 20 20 20 20 20  plate) ){.      
24980 2f 2a 20 41 64 6a 75 73 74 20 70 54 65 6d 70 6c  /* Adjust pTempl
24990 61 74 65 20 63 6f 73 74 20 64 6f 77 6e 77 61 72  ate cost downwar
249a0 64 20 73 6f 20 74 68 61 74 20 69 74 20 69 73 20  d so that it is 
249b0 63 68 65 61 70 65 72 20 74 68 61 6e 20 69 74 73  cheaper than its
249c0 20 0a 20 20 20 20 20 20 2a 2a 20 73 75 62 73 65   .      ** subse
249d0 74 20 70 20 2a 2f 0a 20 20 20 20 20 20 70 54 65  t p */.      pTe
249e0 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 20 3d 20 70  mplate->rRun = p
249f0 2d 3e 72 52 75 6e 3b 0a 20 20 20 20 20 20 70 54  ->rRun;.      pT
24a00 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74 20 3d 20  emplate->nOut = 
24a10 70 2d 3e 6e 4f 75 74 20 2d 20 31 3b 0a 20 20 20  p->nOut - 1;.   
24a20 20 7d 65 6c 73 65 20 69 66 28 20 77 68 65 72 65   }else if( where
24a30 4c 6f 6f 70 43 68 65 61 70 65 72 50 72 6f 70 65  LoopCheaperPrope
24a40 72 53 75 62 73 65 74 28 70 54 65 6d 70 6c 61 74  rSubset(pTemplat
24a50 65 2c 20 70 29 20 29 7b 0a 20 20 20 20 20 20 2f  e, p) ){.      /
24a60 2a 20 41 64 6a 75 73 74 20 70 54 65 6d 70 6c 61  * Adjust pTempla
24a70 74 65 20 63 6f 73 74 20 75 70 77 61 72 64 20 73  te cost upward s
24a80 6f 20 74 68 61 74 20 69 74 20 69 73 20 63 6f 73  o that it is cos
24a90 74 6c 69 65 72 20 74 68 61 6e 20 70 20 73 69 6e  tlier than p sin
24aa0 63 65 0a 20 20 20 20 20 20 2a 2a 20 70 54 65 6d  ce.      ** pTem
24ab0 70 6c 61 74 65 20 69 73 20 61 20 70 72 6f 70 65  plate is a prope
24ac0 72 20 73 75 62 73 65 74 20 6f 66 20 70 20 2a 2f  r subset of p */
24ad0 0a 20 20 20 20 20 20 70 54 65 6d 70 6c 61 74 65  .      pTemplate
24ae0 2d 3e 72 52 75 6e 20 3d 20 70 2d 3e 72 52 75 6e  ->rRun = p->rRun
24af0 3b 0a 20 20 20 20 20 20 70 54 65 6d 70 6c 61 74  ;.      pTemplat
24b00 65 2d 3e 6e 4f 75 74 20 3d 20 70 2d 3e 6e 4f 75  e->nOut = p->nOu
24b10 74 20 2b 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  t + 1;.    }.  }
24b20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68  .}../*.** Search
24b30 20 74 68 65 20 6c 69 73 74 20 6f 66 20 57 68 65   the list of Whe
24b40 72 65 4c 6f 6f 70 73 20 69 6e 20 2a 70 70 50 72  reLoops in *ppPr
24b50 65 76 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 6f  ev looking for o
24b60 6e 65 20 74 68 61 74 20 63 61 6e 20 62 65 0a 2a  ne that can be.*
24b70 2a 20 73 75 70 70 6c 61 6e 74 65 64 20 62 79 20  * supplanted by 
24b80 70 54 65 6d 70 6c 61 74 65 2e 0a 2a 2a 0a 2a 2a  pTemplate..**.**
24b90 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20   Return NULL if 
24ba0 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 6c 69  the WhereLoop li
24bb0 73 74 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 65  st contains an e
24bc0 6e 74 72 79 20 74 68 61 74 20 63 61 6e 20 73 75  ntry that can su
24bd0 70 70 6c 61 6e 74 0a 2a 2a 20 70 54 65 6d 70 6c  pplant.** pTempl
24be0 61 74 65 2c 20 69 6e 20 6f 74 68 65 72 20 77 6f  ate, in other wo
24bf0 72 64 73 20 69 66 20 70 54 65 6d 70 6c 61 74 65  rds if pTemplate
24c00 20 64 6f 65 73 20 6e 6f 74 20 62 65 6c 6f 6e 67   does not belong
24c10 20 6f 6e 20 74 68 65 20 6c 69 73 74 2e 0a 2a 2a   on the list..**
24c20 0a 2a 2a 20 49 66 20 70 58 20 69 73 20 61 20 57  .** If pX is a W
24c30 68 65 72 65 4c 6f 6f 70 20 74 68 61 74 20 70 54  hereLoop that pT
24c40 65 6d 70 6c 61 74 65 20 63 61 6e 20 73 75 70 70  emplate can supp
24c50 6c 61 6e 74 2c 20 74 68 65 6e 20 72 65 74 75 72  lant, then retur
24c60 6e 20 74 68 65 0a 2a 2a 20 6c 69 6e 6b 20 74 68  n the.** link th
24c70 61 74 20 70 6f 69 6e 74 73 20 74 6f 20 70 58 2e  at points to pX.
24c80 0a 2a 2a 0a 2a 2a 20 49 66 20 70 54 65 6d 70 6c  .**.** If pTempl
24c90 61 74 65 20 63 61 6e 6e 6f 74 20 73 75 70 70 6c  ate cannot suppl
24ca0 61 6e 74 20 61 6e 79 20 65 78 69 73 74 69 6e 67  ant any existing
24cb0 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20   element of the 
24cc0 6c 69 73 74 20 62 75 74 20 6e 65 65 64 73 0a 2a  list but needs.*
24cd0 2a 20 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f  * to be added to
24ce0 20 74 68 65 20 6c 69 73 74 2c 20 74 68 65 6e 20   the list, then 
24cf0 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
24d00 20 74 6f 20 74 68 65 20 74 61 69 6c 20 6f 66 20   to the tail of 
24d10 74 68 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61  the list..*/.sta
24d20 74 69 63 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a  tic WhereLoop **
24d30 77 68 65 72 65 4c 6f 6f 70 46 69 6e 64 4c 65 73  whereLoopFindLes
24d40 73 65 72 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70  ser(.  WhereLoop
24d50 20 2a 2a 70 70 50 72 65 76 2c 0a 20 20 63 6f 6e   **ppPrev,.  con
24d60 73 74 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 54  st WhereLoop *pT
24d70 65 6d 70 6c 61 74 65 0a 29 7b 0a 20 20 57 68 65  emplate.){.  Whe
24d80 72 65 4c 6f 6f 70 20 2a 70 3b 0a 20 20 66 6f 72  reLoop *p;.  for
24d90 28 70 3d 28 2a 70 70 50 72 65 76 29 3b 20 70 3b  (p=(*ppPrev); p;
24da0 20 70 70 50 72 65 76 3d 26 70 2d 3e 70 4e 65 78   ppPrev=&p->pNex
24db0 74 4c 6f 6f 70 2c 20 70 3d 2a 70 70 50 72 65 76  tLoop, p=*ppPrev
24dc0 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 54  ){.    if( p->iT
24dd0 61 62 21 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 69  ab!=pTemplate->i
24de0 54 61 62 20 7c 7c 20 70 2d 3e 69 53 6f 72 74 49  Tab || p->iSortI
24df0 64 78 21 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 69  dx!=pTemplate->i
24e00 53 6f 72 74 49 64 78 20 29 7b 0a 20 20 20 20 20  SortIdx ){.     
24e10 20 2f 2a 20 49 66 20 65 69 74 68 65 72 20 74 68   /* If either th
24e20 65 20 69 54 61 62 20 6f 72 20 69 53 6f 72 74 49  e iTab or iSortI
24e30 64 78 20 76 61 6c 75 65 73 20 66 6f 72 20 74 77  dx values for tw
24e40 6f 20 57 68 65 72 65 4c 6f 6f 70 20 61 72 65 20  o WhereLoop are 
24e50 64 69 66 66 65 72 65 6e 74 0a 20 20 20 20 20 20  different.      
24e60 2a 2a 20 74 68 65 6e 20 74 68 6f 73 65 20 57 68  ** then those Wh
24e70 65 72 65 4c 6f 6f 70 73 20 6e 65 65 64 20 74 6f  ereLoops need to
24e80 20 62 65 20 63 6f 6e 73 69 64 65 72 65 64 20 73   be considered s
24e90 65 70 61 72 61 74 65 6c 79 2e 20 20 4e 65 69 74  eparately.  Neit
24ea0 68 65 72 20 69 73 0a 20 20 20 20 20 20 2a 2a 20  her is.      ** 
24eb0 61 20 63 61 6e 64 69 64 61 74 65 20 74 6f 20 72  a candidate to r
24ec0 65 70 6c 61 63 65 20 74 68 65 20 6f 74 68 65 72  eplace the other
24ed0 2e 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 74 69  . */.      conti
24ee0 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f  nue;.    }.    /
24ef0 2a 20 49 6e 20 74 68 65 20 63 75 72 72 65 6e 74  * In the current
24f00 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2c   implementation,
24f10 20 74 68 65 20 72 53 65 74 75 70 20 76 61 6c 75   the rSetup valu
24f20 65 20 69 73 20 65 69 74 68 65 72 20 7a 65 72 6f  e is either zero
24f30 0a 20 20 20 20 2a 2a 20 6f 72 20 74 68 65 20 63  .    ** or the c
24f40 6f 73 74 20 6f 66 20 62 75 69 6c 64 69 6e 67 20  ost of building 
24f50 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64  an automatic ind
24f60 65 78 20 28 4e 6c 6f 67 4e 29 20 61 6e 64 20 74  ex (NlogN) and t
24f70 68 65 20 4e 6c 6f 67 4e 0a 20 20 20 20 2a 2a 20  he NlogN.    ** 
24f80 69 73 20 74 68 65 20 73 61 6d 65 20 66 6f 72 20  is the same for 
24f90 63 6f 6d 70 61 74 69 62 6c 65 20 57 68 65 72 65  compatible Where
24fa0 4c 6f 6f 70 73 2e 20 2a 2f 0a 20 20 20 20 61 73  Loops. */.    as
24fb0 73 65 72 74 28 20 70 2d 3e 72 53 65 74 75 70 3d  sert( p->rSetup=
24fc0 3d 30 20 7c 7c 20 70 54 65 6d 70 6c 61 74 65 2d  =0 || pTemplate-
24fd0 3e 72 53 65 74 75 70 3d 3d 30 20 0a 20 20 20 20  >rSetup==0 .    
24fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
24ff0 70 2d 3e 72 53 65 74 75 70 3d 3d 70 54 65 6d 70  p->rSetup==pTemp
25000 6c 61 74 65 2d 3e 72 53 65 74 75 70 20 29 3b 0a  late->rSetup );.
25010 0a 20 20 20 20 2f 2a 20 77 68 65 72 65 4c 6f 6f  .    /* whereLoo
25020 70 41 64 64 42 74 72 65 65 28 29 20 61 6c 77 61  pAddBtree() alwa
25030 79 73 20 67 65 6e 65 72 61 74 65 73 20 61 6e 64  ys generates and
25040 20 69 6e 73 65 72 74 73 20 74 68 65 20 61 75 74   inserts the aut
25050 6f 6d 61 74 69 63 20 69 6e 64 65 78 0a 20 20 20  omatic index.   
25060 20 2a 2a 20 63 61 73 65 20 66 69 72 73 74 2e 20   ** case first. 
25070 20 48 65 6e 63 65 20 63 6f 6d 70 61 74 69 62 6c   Hence compatibl
25080 65 20 63 61 6e 64 69 64 61 74 65 20 57 68 65 72  e candidate Wher
25090 65 4c 6f 6f 70 73 20 6e 65 76 65 72 20 68 61 76  eLoops never hav
250a0 65 20 61 20 6c 61 72 67 65 72 0a 20 20 20 20 2a  e a larger.    *
250b0 2a 20 72 53 65 74 75 70 2e 20 43 61 6c 6c 20 74  * rSetup. Call t
250c0 68 69 73 20 53 45 54 55 50 2d 49 4e 56 41 52 49  his SETUP-INVARI
250d0 41 4e 54 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ANT */.    asser
250e0 74 28 20 70 2d 3e 72 53 65 74 75 70 3e 3d 70 54  t( p->rSetup>=pT
250f0 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75 70 20  emplate->rSetup 
25100 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 6e 79 20 6c  );..    /* Any l
25110 6f 6f 70 20 75 73 69 6e 67 20 61 6e 20 61 70 70  oop using an app
25120 6c 69 61 74 69 6f 6e 2d 64 65 66 69 6e 65 64 20  liation-defined 
25130 69 6e 64 65 78 20 28 6f 72 20 50 52 49 4d 41 52  index (or PRIMAR
25140 59 20 4b 45 59 20 6f 72 0a 20 20 20 20 2a 2a 20  Y KEY or.    ** 
25150 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e  UNIQUE constrain
25160 74 29 20 77 69 74 68 20 6f 6e 65 20 6f 72 20 6d  t) with one or m
25170 6f 72 65 20 3d 3d 20 63 6f 6e 73 74 72 61 69 6e  ore == constrain
25180 74 73 20 69 73 20 62 65 74 74 65 72 0a 20 20 20  ts is better.   
25190 20 2a 2a 20 74 68 61 6e 20 61 6e 20 61 75 74 6f   ** than an auto
251a0 6d 61 74 69 63 20 69 6e 64 65 78 2e 20 2a 2f 0a  matic index. */.
251b0 20 20 20 20 69 66 28 20 28 70 2d 3e 77 73 46 6c      if( (p->wsFl
251c0 61 67 73 20 26 20 57 48 45 52 45 5f 41 55 54 4f  ags & WHERE_AUTO
251d0 5f 49 4e 44 45 58 29 21 3d 30 0a 20 20 20 20 20  _INDEX)!=0.     
251e0 26 26 20 28 70 54 65 6d 70 6c 61 74 65 2d 3e 77  && (pTemplate->w
251f0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
25200 4e 44 45 58 45 44 29 21 3d 30 0a 20 20 20 20 20  NDEXED)!=0.     
25210 26 26 20 28 70 54 65 6d 70 6c 61 74 65 2d 3e 77  && (pTemplate->w
25220 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43  sFlags & WHERE_C
25230 4f 4c 55 4d 4e 5f 45 51 29 21 3d 30 0a 20 20 20  OLUMN_EQ)!=0.   
25240 20 20 26 26 20 28 70 2d 3e 70 72 65 72 65 71 20    && (p->prereq 
25250 26 20 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65  & pTemplate->pre
25260 72 65 71 29 3d 3d 70 54 65 6d 70 6c 61 74 65 2d  req)==pTemplate-
25270 3e 70 72 65 72 65 71 0a 20 20 20 20 29 7b 0a 20  >prereq.    ){. 
25280 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
25290 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 65 78 69  }..    /* If exi
252a0 73 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20  sting WhereLoop 
252b0 70 20 69 73 20 62 65 74 74 65 72 20 74 68 61 6e  p is better than
252c0 20 70 54 65 6d 70 6c 61 74 65 2c 20 70 54 65 6d   pTemplate, pTem
252d0 70 6c 61 74 65 20 63 61 6e 20 62 65 0a 20 20 20  plate can be.   
252e0 20 2a 2a 20 64 69 73 63 61 72 64 65 64 2e 20 20   ** discarded.  
252f0 57 68 65 72 65 4c 6f 6f 70 20 70 20 69 73 20 62  WhereLoop p is b
25300 65 74 74 65 72 20 69 66 3a 0a 20 20 20 20 2a 2a  etter if:.    **
25310 20 20 20 28 31 29 20 20 70 20 68 61 73 20 6e 6f     (1)  p has no
25320 20 6d 6f 72 65 20 64 65 70 65 6e 64 65 6e 63 69   more dependenci
25330 65 73 20 74 68 61 6e 20 70 54 65 6d 70 6c 61 74  es than pTemplat
25340 65 2c 20 61 6e 64 0a 20 20 20 20 2a 2a 20 20 20  e, and.    **   
25350 28 32 29 20 20 70 20 68 61 73 20 61 6e 20 65 71  (2)  p has an eq
25360 75 61 6c 20 6f 72 20 6c 6f 77 65 72 20 63 6f 73  ual or lower cos
25370 74 20 74 68 61 6e 20 70 54 65 6d 70 6c 61 74 65  t than pTemplate
25380 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
25390 28 70 2d 3e 70 72 65 72 65 71 20 26 20 70 54 65  (p->prereq & pTe
253a0 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65 71 29 3d  mplate->prereq)=
253b0 3d 70 2d 3e 70 72 65 72 65 71 20 20 20 20 2f 2a  =p->prereq    /*
253c0 20 28 31 29 20 20 2a 2f 0a 20 20 20 20 20 26 26   (1)  */.     &&
253d0 20 70 2d 3e 72 53 65 74 75 70 3c 3d 70 54 65 6d   p->rSetup<=pTem
253e0 70 6c 61 74 65 2d 3e 72 53 65 74 75 70 20 20 20  plate->rSetup   
253f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25400 2a 20 28 32 61 29 20 2a 2f 0a 20 20 20 20 20 26  * (2a) */.     &
25410 26 20 70 2d 3e 72 52 75 6e 3c 3d 70 54 65 6d 70  & p->rRun<=pTemp
25420 6c 61 74 65 2d 3e 72 52 75 6e 20 20 20 20 20 20  late->rRun      
25430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25440 2f 2a 20 28 32 62 29 20 2a 2f 0a 20 20 20 20 20  /* (2b) */.     
25450 26 26 20 70 2d 3e 6e 4f 75 74 3c 3d 70 54 65 6d  && p->nOut<=pTem
25460 70 6c 61 74 65 2d 3e 6e 4f 75 74 20 20 20 20 20  plate->nOut     
25470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25480 20 2f 2a 20 28 32 63 29 20 2a 2f 0a 20 20 20 20   /* (2c) */.    
25490 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
254a0 30 3b 20 20 2f 2a 20 44 69 73 63 61 72 64 20 70  0;  /* Discard p
254b0 54 65 6d 70 6c 61 74 65 20 2a 2f 0a 20 20 20 20  Template */.    
254c0 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 54 65  }..    /* If pTe
254d0 6d 70 6c 61 74 65 20 69 73 20 61 6c 77 61 79 73  mplate is always
254e0 20 62 65 74 74 65 72 20 74 68 61 6e 20 70 2c 20   better than p, 
254f0 74 68 65 6e 20 63 61 75 73 65 20 70 20 74 6f 20  then cause p to 
25500 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e 0a 20  be overwritten. 
25510 20 20 20 2a 2a 20 77 69 74 68 20 70 54 65 6d 70     ** with pTemp
25520 6c 61 74 65 2e 20 20 70 54 65 6d 70 6c 61 74 65  late.  pTemplate
25530 20 69 73 20 62 65 74 74 65 72 20 74 68 61 6e 20   is better than 
25540 70 20 69 66 3a 0a 20 20 20 20 2a 2a 20 20 20 28  p if:.    **   (
25550 31 29 20 20 70 54 65 6d 70 6c 61 74 65 20 68 61  1)  pTemplate ha
25560 73 20 6e 6f 20 6d 6f 72 65 20 64 65 70 65 6e 64  s no more depend
25570 65 6e 63 65 73 20 74 68 61 6e 20 70 2c 20 61 6e  ences than p, an
25580 64 0a 20 20 20 20 2a 2a 20 20 20 28 32 29 20 20  d.    **   (2)  
25590 70 54 65 6d 70 6c 61 74 65 20 68 61 73 20 61 6e  pTemplate has an
255a0 20 65 71 75 61 6c 20 6f 72 20 6c 6f 77 65 72 20   equal or lower 
255b0 63 6f 73 74 20 74 68 61 6e 20 70 2e 0a 20 20 20  cost than p..   
255c0 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 2d 3e   */.    if( (p->
255d0 70 72 65 72 65 71 20 26 20 70 54 65 6d 70 6c 61  prereq & pTempla
255e0 74 65 2d 3e 70 72 65 72 65 71 29 3d 3d 70 54 65  te->prereq)==pTe
255f0 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65 71 20 20  mplate->prereq  
25600 20 2f 2a 20 28 31 29 20 20 2a 2f 0a 20 20 20 20   /* (1)  */.    
25610 20 26 26 20 70 2d 3e 72 52 75 6e 3e 3d 70 54 65   && p->rRun>=pTe
25620 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 20 20 20 20  mplate->rRun    
25630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25640 20 20 20 20 20 20 20 20 20 2f 2a 20 28 32 61 29           /* (2a)
25650 20 2a 2f 0a 20 20 20 20 20 26 26 20 70 2d 3e 6e   */.     && p->n
25660 4f 75 74 3e 3d 70 54 65 6d 70 6c 61 74 65 2d 3e  Out>=pTemplate->
25670 6e 4f 75 74 20 20 20 20 20 20 20 20 20 20 20 20  nOut            
25680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25690 20 2f 2a 20 28 32 62 29 20 2a 2f 0a 20 20 20 20   /* (2b) */.    
256a0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
256b0 20 70 2d 3e 72 53 65 74 75 70 3e 3d 70 54 65 6d   p->rSetup>=pTem
256c0 70 6c 61 74 65 2d 3e 72 53 65 74 75 70 20 29 3b  plate->rSetup );
256d0 20 2f 2a 20 53 45 54 55 50 2d 49 4e 56 41 52 49   /* SETUP-INVARI
256e0 41 4e 54 20 61 62 6f 76 65 20 2a 2f 0a 20 20 20  ANT above */.   
256f0 20 20 20 62 72 65 61 6b 3b 20 20 20 2f 2a 20 43     break;   /* C
25700 61 75 73 65 20 70 20 74 6f 20 62 65 20 6f 76 65  ause p to be ove
25710 72 77 72 69 74 74 65 6e 20 62 79 20 70 54 65 6d  rwritten by pTem
25720 70 6c 61 74 65 20 2a 2f 0a 20 20 20 20 7d 0a 20  plate */.    }. 
25730 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 70 50 72   }.  return ppPr
25740 65 76 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73  ev;.}../*.** Ins
25750 65 72 74 20 6f 72 20 72 65 70 6c 61 63 65 20 61  ert or replace a
25760 20 57 68 65 72 65 4c 6f 6f 70 20 65 6e 74 72 79   WhereLoop entry
25770 20 75 73 69 6e 67 20 74 68 65 20 74 65 6d 70 6c   using the templ
25780 61 74 65 20 73 75 70 70 6c 69 65 64 2e 0a 2a 2a  ate supplied..**
25790 0a 2a 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20  .** An existing 
257a0 57 68 65 72 65 4c 6f 6f 70 20 65 6e 74 72 79 20  WhereLoop entry 
257b0 6d 69 67 68 74 20 62 65 20 6f 76 65 72 77 72 69  might be overwri
257c0 74 74 65 6e 20 69 66 20 74 68 65 20 6e 65 77 20  tten if the new 
257d0 74 65 6d 70 6c 61 74 65 0a 2a 2a 20 69 73 20 62  template.** is b
257e0 65 74 74 65 72 20 61 6e 64 20 68 61 73 20 66 65  etter and has fe
257f0 77 65 72 20 64 65 70 65 6e 64 65 6e 63 69 65 73  wer dependencies
25800 2e 20 20 4f 72 20 74 68 65 20 74 65 6d 70 6c 61  .  Or the templa
25810 74 65 20 77 69 6c 6c 20 62 65 20 69 67 6e 6f 72  te will be ignor
25820 65 64 0a 2a 2a 20 61 6e 64 20 6e 6f 20 69 6e 73  ed.** and no ins
25830 65 72 74 20 77 69 6c 6c 20 6f 63 63 75 72 20 69  ert will occur i
25840 66 20 61 6e 20 65 78 69 73 74 69 6e 67 20 57 68  f an existing Wh
25850 65 72 65 4c 6f 6f 70 20 69 73 20 66 61 73 74 65  ereLoop is faste
25860 72 20 61 6e 64 20 68 61 73 0a 2a 2a 20 66 65 77  r and has.** few
25870 65 72 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20  er dependencies 
25880 74 68 61 6e 20 74 68 65 20 74 65 6d 70 6c 61 74  than the templat
25890 65 2e 20 20 4f 74 68 65 72 77 69 73 65 20 61 20  e.  Otherwise a 
258a0 6e 65 77 20 57 68 65 72 65 4c 6f 6f 70 20 69 73  new WhereLoop is
258b0 0a 2a 2a 20 61 64 64 65 64 20 62 61 73 65 64 20  .** added based 
258c0 6f 6e 20 74 68 65 20 74 65 6d 70 6c 61 74 65 2e  on the template.
258d0 0a 2a 2a 0a 2a 2a 20 49 66 20 70 42 75 69 6c 64  .**.** If pBuild
258e0 65 72 2d 3e 70 4f 72 53 65 74 20 69 73 20 6e 6f  er->pOrSet is no
258f0 74 20 4e 55 4c 4c 20 74 68 65 6e 20 77 65 20 63  t NULL then we c
25900 61 72 65 20 61 62 6f 75 74 20 6f 6e 6c 79 20 74  are about only t
25910 68 65 0a 2a 2a 20 70 72 65 72 65 71 75 69 73 69  he.** prerequisi
25920 74 65 73 20 61 6e 64 20 72 52 75 6e 20 61 6e 64  tes and rRun and
25930 20 6e 4f 75 74 20 63 6f 73 74 73 20 6f 66 20 74   nOut costs of t
25940 68 65 20 4e 20 62 65 73 74 20 6c 6f 6f 70 73 2e  he N best loops.
25950 20 20 54 68 61 74 0a 2a 2a 20 69 6e 66 6f 72 6d    That.** inform
25960 61 74 69 6f 6e 20 69 73 20 67 61 74 68 65 72 65  ation is gathere
25970 64 20 69 6e 20 74 68 65 20 70 42 75 69 6c 64 65  d in the pBuilde
25980 72 2d 3e 70 4f 72 53 65 74 20 6f 62 6a 65 63 74  r->pOrSet object
25990 2e 20 20 54 68 69 73 20 73 70 65 63 69 61 6c 0a  .  This special.
259a0 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67 20 6d 6f  ** processing mo
259b0 64 65 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20  de is used only 
259c0 66 6f 72 20 4f 52 20 63 6c 61 75 73 65 20 70 72  for OR clause pr
259d0 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  ocessing..**.** 
259e0 57 68 65 6e 20 61 63 63 75 6d 75 6c 61 74 69 6e  When accumulatin
259f0 67 20 6d 75 6c 74 69 70 6c 65 20 6c 6f 6f 70 73  g multiple loops
25a00 20 28 77 68 65 6e 20 70 42 75 69 6c 64 65 72 2d   (when pBuilder-
25a10 3e 70 4f 72 53 65 74 20 69 73 20 4e 55 4c 4c 29  >pOrSet is NULL)
25a20 20 77 65 0a 2a 2a 20 73 74 69 6c 6c 20 6d 69 67   we.** still mig
25a30 68 74 20 6f 76 65 72 77 72 69 74 65 20 73 69 6d  ht overwrite sim
25a40 69 6c 61 72 20 6c 6f 6f 70 73 20 77 69 74 68 20  ilar loops with 
25a50 74 68 65 20 6e 65 77 20 74 65 6d 70 6c 61 74 65  the new template
25a60 20 69 66 20 74 68 65 0a 2a 2a 20 6e 65 77 20 74   if the.** new t
25a70 65 6d 70 6c 61 74 65 20 69 73 20 62 65 74 74 65  emplate is bette
25a80 72 2e 20 20 4c 6f 6f 70 73 20 6d 61 79 20 62 65  r.  Loops may be
25a90 20 6f 76 65 72 77 72 69 74 74 65 6e 20 69 66 20   overwritten if 
25aa0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a 2a  the following .*
25ab0 2a 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61 72 65  * conditions are
25ac0 20 6d 65 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28   met:.**.**    (
25ad0 31 29 20 20 54 68 65 79 20 68 61 76 65 20 74 68  1)  They have th
25ae0 65 20 73 61 6d 65 20 69 54 61 62 2e 0a 2a 2a 20  e same iTab..** 
25af0 20 20 20 28 32 29 20 20 54 68 65 79 20 68 61 76     (2)  They hav
25b00 65 20 74 68 65 20 73 61 6d 65 20 69 53 6f 72 74  e the same iSort
25b10 49 64 78 2e 0a 2a 2a 20 20 20 20 28 33 29 20 20  Idx..**    (3)  
25b20 54 68 65 20 74 65 6d 70 6c 61 74 65 20 68 61 73  The template has
25b30 20 73 61 6d 65 20 6f 72 20 66 65 77 65 72 20 64   same or fewer d
25b40 65 70 65 6e 64 65 6e 63 69 65 73 20 74 68 61 6e  ependencies than
25b50 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f   the current loo
25b60 70 0a 2a 2a 20 20 20 20 28 34 29 20 20 54 68 65  p.**    (4)  The
25b70 20 74 65 6d 70 6c 61 74 65 20 68 61 73 20 74 68   template has th
25b80 65 20 73 61 6d 65 20 6f 72 20 6c 6f 77 65 72 20  e same or lower 
25b90 63 6f 73 74 20 74 68 61 6e 20 74 68 65 20 63 75  cost than the cu
25ba0 72 72 65 6e 74 20 6c 6f 6f 70 0a 2a 2f 0a 73 74  rrent loop.*/.st
25bb0 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f  atic int whereLo
25bc0 6f 70 49 6e 73 65 72 74 28 57 68 65 72 65 4c 6f  opInsert(WhereLo
25bd0 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c  opBuilder *pBuil
25be0 64 65 72 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a  der, WhereLoop *
25bf0 70 54 65 6d 70 6c 61 74 65 29 7b 0a 20 20 57 68  pTemplate){.  Wh
25c00 65 72 65 4c 6f 6f 70 20 2a 2a 70 70 50 72 65 76  ereLoop **ppPrev
25c10 2c 20 2a 70 3b 0a 20 20 57 68 65 72 65 49 6e 66  , *p;.  WhereInf
25c20 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70 42 75 69  o *pWInfo = pBui
25c30 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20  lder->pWInfo;.  
25c40 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 57  sqlite3 *db = pW
25c50 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62  Info->pParse->db
25c60 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 42 75 69 6c  ;..  /* If pBuil
25c70 64 65 72 2d 3e 70 4f 72 53 65 74 20 69 73 20 64  der->pOrSet is d
25c80 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 6f 6e 6c  efined, then onl
25c90 79 20 6b 65 65 70 20 74 72 61 63 6b 20 6f 66 20  y keep track of 
25ca0 74 68 65 20 63 6f 73 74 73 0a 20 20 2a 2a 20 61  the costs.  ** a
25cb0 6e 64 20 70 72 65 72 65 71 73 2e 0a 20 20 2a 2f  nd prereqs..  */
25cc0 0a 20 20 69 66 28 20 70 42 75 69 6c 64 65 72 2d  .  if( pBuilder-
25cd0 3e 70 4f 72 53 65 74 21 3d 30 20 29 7b 0a 23 69  >pOrSet!=0 ){.#i
25ce0 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  f WHERETRACE_ENA
25cf0 42 4c 45 44 0a 20 20 20 20 75 31 36 20 6e 20 3d  BLED.    u16 n =
25d00 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65   pBuilder->pOrSe
25d10 74 2d 3e 6e 3b 0a 20 20 20 20 69 6e 74 20 78 20  t->n;.    int x 
25d20 3d 0a 23 65 6e 64 69 66 0a 20 20 20 20 77 68 65  =.#endif.    whe
25d30 72 65 4f 72 49 6e 73 65 72 74 28 70 42 75 69 6c  reOrInsert(pBuil
25d40 64 65 72 2d 3e 70 4f 72 53 65 74 2c 20 70 54 65  der->pOrSet, pTe
25d50 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65 71 2c 20  mplate->prereq, 
25d60 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 2c  pTemplate->rRun,
25d70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
25d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25d90 20 20 20 20 20 70 54 65 6d 70 6c 61 74 65 2d 3e       pTemplate->
25da0 6e 4f 75 74 29 3b 0a 23 69 66 20 57 48 45 52 45  nOut);.#if WHERE
25db0 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a  TRACE_ENABLED /*
25dc0 20 30 78 38 20 2a 2f 0a 20 20 20 20 69 66 28 20   0x8 */.    if( 
25dd0 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63  sqlite3WhereTrac
25de0 65 20 26 20 30 78 38 20 29 7b 0a 20 20 20 20 20  e & 0x8 ){.     
25df0 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
25e00 6e 74 66 28 78 3f 22 20 20 20 6f 72 2d 25 64 3a  ntf(x?"   or-%d:
25e10 20 20 22 3a 22 20 20 20 6f 72 2d 58 3a 20 20 22    ":"   or-X:  "
25e20 2c 20 6e 29 3b 0a 20 20 20 20 20 20 77 68 65 72  , n);.      wher
25e30 65 4c 6f 6f 70 50 72 69 6e 74 28 70 54 65 6d 70  eLoopPrint(pTemp
25e40 6c 61 74 65 2c 20 70 42 75 69 6c 64 65 72 2d 3e  late, pBuilder->
25e50 70 57 43 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  pWC);.    }.#end
25e60 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  if.    return SQ
25e70 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20  LITE_OK;.  }..  
25e80 2f 2a 20 4c 6f 6f 6b 20 66 6f 72 20 61 6e 20 65  /* Look for an e
25e90 78 69 73 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f  xisting WhereLoo
25ea0 70 20 74 6f 20 72 65 70 6c 61 63 65 20 77 69 74  p to replace wit
25eb0 68 20 70 54 65 6d 70 6c 61 74 65 0a 20 20 2a 2f  h pTemplate.  */
25ec0 0a 20 20 77 68 65 72 65 4c 6f 6f 70 41 64 6a 75  .  whereLoopAdju
25ed0 73 74 43 6f 73 74 28 70 57 49 6e 66 6f 2d 3e 70  stCost(pWInfo->p
25ee0 4c 6f 6f 70 73 2c 20 70 54 65 6d 70 6c 61 74 65  Loops, pTemplate
25ef0 29 3b 0a 20 20 70 70 50 72 65 76 20 3d 20 77 68  );.  ppPrev = wh
25f00 65 72 65 4c 6f 6f 70 46 69 6e 64 4c 65 73 73 65  ereLoopFindLesse
25f10 72 28 26 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70  r(&pWInfo->pLoop
25f20 73 2c 20 70 54 65 6d 70 6c 61 74 65 29 3b 0a 0a  s, pTemplate);..
25f30 20 20 69 66 28 20 70 70 50 72 65 76 3d 3d 30 20    if( ppPrev==0 
25f40 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20  ){.    /* There 
25f50 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 61  already exists a
25f60 20 57 68 65 72 65 4c 6f 6f 70 20 6f 6e 20 74 68   WhereLoop on th
25f70 65 20 6c 69 73 74 20 74 68 61 74 20 69 73 20 62  e list that is b
25f80 65 74 74 65 72 0a 20 20 20 20 2a 2a 20 74 68 61  etter.    ** tha
25f90 6e 20 70 54 65 6d 70 6c 61 74 65 2c 20 73 6f 20  n pTemplate, so 
25fa0 6a 75 73 74 20 69 67 6e 6f 72 65 20 70 54 65 6d  just ignore pTem
25fb0 70 6c 61 74 65 20 2a 2f 0a 23 69 66 20 57 48 45  plate */.#if WHE
25fc0 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20  RETRACE_ENABLED 
25fd0 2f 2a 20 30 78 38 20 2a 2f 0a 20 20 20 20 69 66  /* 0x8 */.    if
25fe0 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72  ( sqlite3WhereTr
25ff0 61 63 65 20 26 20 30 78 38 20 29 7b 0a 20 20 20  ace & 0x8 ){.   
26000 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
26010 72 69 6e 74 66 28 22 69 6e 73 2d 6e 6f 6f 70 3a  rintf("ins-noop:
26020 20 22 29 3b 0a 20 20 20 20 20 20 77 68 65 72 65   ");.      where
26030 4c 6f 6f 70 50 72 69 6e 74 28 70 54 65 6d 70 6c  LoopPrint(pTempl
26040 61 74 65 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70  ate, pBuilder->p
26050 57 43 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  WC);.    }.#endi
26060 66 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  f.    return SQL
26070 49 54 45 5f 4f 4b 3b 20 20 0a 20 20 7d 65 6c 73  ITE_OK;  .  }els
26080 65 7b 0a 20 20 20 20 70 20 3d 20 2a 70 70 50 72  e{.    p = *ppPr
26090 65 76 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  ev;.  }..  /* If
260a0 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70   we reach this p
260b0 6f 69 6e 74 20 69 74 20 6d 65 61 6e 73 20 74 68  oint it means th
260c0 61 74 20 65 69 74 68 65 72 20 70 5b 5d 20 73 68  at either p[] sh
260d0 6f 75 6c 64 20 62 65 20 6f 76 65 72 77 72 69 74  ould be overwrit
260e0 74 65 6e 0a 20 20 2a 2a 20 77 69 74 68 20 70 54  ten.  ** with pT
260f0 65 6d 70 6c 61 74 65 5b 5d 20 69 66 20 70 5b 5d  emplate[] if p[]
26100 20 65 78 69 73 74 73 2c 20 6f 72 20 69 66 20 70   exists, or if p
26110 3d 3d 4e 55 4c 4c 20 74 68 65 6e 20 61 6c 6c 6f  ==NULL then allo
26120 63 61 74 65 20 61 20 6e 65 77 0a 20 20 2a 2a 20  cate a new.  ** 
26130 57 68 65 72 65 4c 6f 6f 70 20 61 6e 64 20 69 6e  WhereLoop and in
26140 73 65 72 74 20 69 74 2e 0a 20 20 2a 2f 0a 23 69  sert it..  */.#i
26150 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  f WHERETRACE_ENA
26160 42 4c 45 44 20 2f 2a 20 30 78 38 20 2a 2f 0a 20  BLED /* 0x8 */. 
26170 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72   if( sqlite3Wher
26180 65 54 72 61 63 65 20 26 20 30 78 38 20 29 7b 0a  eTrace & 0x8 ){.
26190 20 20 20 20 69 66 28 20 70 21 3d 30 20 29 7b 0a      if( p!=0 ){.
261a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
261b0 75 67 50 72 69 6e 74 66 28 22 69 6e 73 2d 64 65  ugPrintf("ins-de
261c0 6c 3a 20 20 22 29 3b 0a 20 20 20 20 20 20 77 68  l:  ");.      wh
261d0 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 2c 20  ereLoopPrint(p, 
261e0 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 29 3b 0a  pBuilder->pWC);.
261f0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
26200 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 69 6e  3DebugPrintf("in
26210 73 2d 6e 65 77 3a 20 20 22 29 3b 0a 20 20 20 20  s-new:  ");.    
26220 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70  whereLoopPrint(p
26230 54 65 6d 70 6c 61 74 65 2c 20 70 42 75 69 6c 64  Template, pBuild
26240 65 72 2d 3e 70 57 43 29 3b 0a 20 20 7d 0a 23 65  er->pWC);.  }.#e
26250 6e 64 69 66 0a 20 20 69 66 28 20 70 3d 3d 30 20  ndif.  if( p==0 
26260 29 7b 0a 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61  ){.    /* Alloca
26270 74 65 20 61 20 6e 65 77 20 57 68 65 72 65 4c 6f  te a new WhereLo
26280 6f 70 20 74 6f 20 61 64 64 20 74 6f 20 74 68 65  op to add to the
26290 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 69 73 74   end of the list
262a0 20 2a 2f 0a 20 20 20 20 2a 70 70 50 72 65 76 20   */.    *ppPrev 
262b0 3d 20 70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  = p = sqlite3DbM
262c0 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a  allocRaw(db, siz
262d0 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70 29 29 3b  eof(WhereLoop));
262e0 0a 20 20 20 20 69 66 28 20 70 3d 3d 30 20 29 20  .    if( p==0 ) 
262f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
26300 4d 45 4d 3b 0a 20 20 20 20 77 68 65 72 65 4c 6f  MEM;.    whereLo
26310 6f 70 49 6e 69 74 28 70 29 3b 0a 20 20 20 20 70  opInit(p);.    p
26320 2d 3e 70 4e 65 78 74 4c 6f 6f 70 20 3d 20 30 3b  ->pNextLoop = 0;
26330 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
26340 20 57 65 20 77 69 6c 6c 20 62 65 20 6f 76 65 72   We will be over
26350 77 72 69 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f  writing WhereLoo
26360 70 20 70 5b 5d 2e 20 20 42 75 74 20 62 65 66 6f  p p[].  But befo
26370 72 65 20 77 65 20 64 6f 2c 20 66 69 72 73 74 0a  re we do, first.
26380 20 20 20 20 2a 2a 20 67 6f 20 74 68 72 6f 75 67      ** go throug
26390 68 20 74 68 65 20 72 65 73 74 20 6f 66 20 74 68  h the rest of th
263a0 65 20 6c 69 73 74 20 61 6e 64 20 64 65 6c 65 74  e list and delet
263b0 65 20 61 6e 79 20 6f 74 68 65 72 20 65 6e 74 72  e any other entr
263c0 69 65 73 20 62 65 73 69 64 65 73 0a 20 20 20 20  ies besides.    
263d0 2a 2a 20 70 5b 5d 20 74 68 61 74 20 61 72 65 20  ** p[] that are 
263e0 61 6c 73 6f 20 73 75 70 70 6c 61 74 65 64 20 62  also supplated b
263f0 79 20 70 54 65 6d 70 6c 61 74 65 20 2a 2f 0a 20  y pTemplate */. 
26400 20 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a 70     WhereLoop **p
26410 70 54 61 69 6c 20 3d 20 26 70 2d 3e 70 4e 65 78  pTail = &p->pNex
26420 74 4c 6f 6f 70 3b 0a 20 20 20 20 57 68 65 72 65  tLoop;.    Where
26430 4c 6f 6f 70 20 2a 70 54 6f 44 65 6c 3b 0a 20 20  Loop *pToDel;.  
26440 20 20 77 68 69 6c 65 28 20 2a 70 70 54 61 69 6c    while( *ppTail
26450 20 29 7b 0a 20 20 20 20 20 20 70 70 54 61 69 6c   ){.      ppTail
26460 20 3d 20 77 68 65 72 65 4c 6f 6f 70 46 69 6e 64   = whereLoopFind
26470 4c 65 73 73 65 72 28 70 70 54 61 69 6c 2c 20 70  Lesser(ppTail, p
26480 54 65 6d 70 6c 61 74 65 29 3b 0a 20 20 20 20 20  Template);.     
26490 20 69 66 28 20 70 70 54 61 69 6c 3d 3d 30 20 29   if( ppTail==0 )
264a0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 70 54   break;.      pT
264b0 6f 44 65 6c 20 3d 20 2a 70 70 54 61 69 6c 3b 0a  oDel = *ppTail;.
264c0 20 20 20 20 20 20 69 66 28 20 70 54 6f 44 65 6c        if( pToDel
264d0 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
264e0 20 20 20 2a 70 70 54 61 69 6c 20 3d 20 70 54 6f     *ppTail = pTo
264f0 44 65 6c 2d 3e 70 4e 65 78 74 4c 6f 6f 70 3b 0a  Del->pNextLoop;.
26500 23 69 66 20 57 48 45 52 45 54 52 41 43 45 5f 45  #if WHERETRACE_E
26510 4e 41 42 4c 45 44 20 2f 2a 20 30 78 38 20 2a 2f  NABLED /* 0x8 */
26520 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
26530 65 33 57 68 65 72 65 54 72 61 63 65 20 26 20 30  e3WhereTrace & 0
26540 78 38 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  x8 ){.        sq
26550 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
26560 28 22 69 6e 73 2d 64 65 6c 3a 20 20 22 29 3b 0a  ("ins-del:  ");.
26570 20 20 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f          whereLoo
26580 70 50 72 69 6e 74 28 70 54 6f 44 65 6c 2c 20 70  pPrint(pToDel, p
26590 42 75 69 6c 64 65 72 2d 3e 70 57 43 29 3b 0a 20  Builder->pWC);. 
265a0 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
265b0 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 44 65 6c      whereLoopDel
265c0 65 74 65 28 64 62 2c 20 70 54 6f 44 65 6c 29 3b  ete(db, pToDel);
265d0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 77 68 65  .    }.  }.  whe
265e0 72 65 4c 6f 6f 70 58 66 65 72 28 64 62 2c 20 70  reLoopXfer(db, p
265f0 2c 20 70 54 65 6d 70 6c 61 74 65 29 3b 0a 20 20  , pTemplate);.  
26600 69 66 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20  if( (p->wsFlags 
26610 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54  & WHERE_VIRTUALT
26620 41 42 4c 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ABLE)==0 ){.    
26630 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 20 3d 20  Index *pIndex = 
26640 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
26650 78 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 64 65  x;.    if( pInde
26660 78 20 26 26 20 70 49 6e 64 65 78 2d 3e 74 6e 75  x && pIndex->tnu
26670 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d  m==0 ){.      p-
26680 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20  >u.btree.pIndex 
26690 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = 0;.    }.  }. 
266a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
266b0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75  K;.}../*.** Adju
266c0 73 74 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70  st the WhereLoop
266d0 2e 6e 4f 75 74 20 76 61 6c 75 65 20 64 6f 77 6e  .nOut value down
266e0 77 61 72 64 20 74 6f 20 61 63 63 6f 75 6e 74 20  ward to account 
266f0 66 6f 72 20 74 65 72 6d 73 20 6f 66 20 74 68 65  for terms of the
26700 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65  .** WHERE clause
26710 20 74 68 61 74 20 72 65 66 65 72 65 6e 63 65 20   that reference 
26720 74 68 65 20 6c 6f 6f 70 20 62 75 74 20 77 68 69  the loop but whi
26730 63 68 20 61 72 65 20 6e 6f 74 20 75 73 65 64 20  ch are not used 
26740 62 79 20 61 6e 0a 2a 2a 20 69 6e 64 65 78 2e 0a  by an.** index..
26750 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 63 75 72  **.** In the cur
26760 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74  rent implementat
26770 69 6f 6e 2c 20 74 68 65 20 66 69 72 73 74 20 65  ion, the first e
26780 78 74 72 61 20 57 48 45 52 45 20 63 6c 61 75 73  xtra WHERE claus
26790 65 20 74 65 72 6d 20 72 65 64 75 63 65 73 0a 2a  e term reduces.*
267a0 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * the number of 
267b0 6f 75 74 70 75 74 20 72 6f 77 73 20 62 79 20 61  output rows by a
267c0 20 66 61 63 74 6f 72 20 6f 66 20 31 30 20 61 6e   factor of 10 an
267d0 64 20 65 61 63 68 20 61 64 64 69 74 69 6f 6e 61  d each additiona
267e0 6c 20 74 65 72 6d 0a 2a 2a 20 72 65 64 75 63 65  l term.** reduce
267f0 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
26800 6f 75 74 70 75 74 20 72 6f 77 73 20 62 79 20 73  output rows by s
26810 71 72 74 28 32 29 2e 0a 2a 2f 0a 73 74 61 74 69  qrt(2)..*/.stati
26820 63 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70  c void whereLoop
26830 4f 75 74 70 75 74 41 64 6a 75 73 74 28 0a 20 20  OutputAdjust(.  
26840 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
26850 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48  ,      /* The WH
26860 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
26870 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70  WhereLoop *pLoop
26880 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f  ,      /* The lo
26890 6f 70 20 74 6f 20 61 64 6a 75 73 74 20 64 6f 77  op to adjust dow
268a0 6e 77 61 72 64 20 2a 2f 0a 20 20 4c 6f 67 45 73  nward */.  LogEs
268b0 74 20 6e 52 6f 77 20 20 20 20 20 20 20 20 20 20  t nRow          
268c0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
268d0 6f 77 73 20 69 6e 20 74 68 65 20 65 6e 74 69 72  ows in the entir
268e0 65 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20  e table */.){.  
268f0 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
26900 2c 20 2a 70 58 3b 0a 20 20 42 69 74 6d 61 73 6b  , *pX;.  Bitmask
26910 20 6e 6f 74 41 6c 6c 6f 77 65 64 20 3d 20 7e 28   notAllowed = ~(
26920 70 4c 6f 6f 70 2d 3e 70 72 65 72 65 71 7c 70 4c  pLoop->prereq|pL
26930 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 29 3b 0a  oop->maskSelf);.
26940 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 6e    int i, j;.  in
26950 74 20 6e 45 71 20 3d 20 30 3b 20 20 20 20 2f 2a  t nEq = 0;    /*
26960 20 4e 75 6d 62 65 72 20 6f 66 20 3d 20 63 6f 6e   Number of = con
26970 73 74 72 61 69 6e 74 73 20 6e 6f 74 20 77 69 74  straints not wit
26980 68 69 6e 20 6c 69 6b 65 6c 79 28 29 2f 75 6e 6c  hin likely()/unl
26990 69 6b 65 6c 79 28 29 20 2a 2f 0a 0a 20 20 66 6f  ikely() */..  fo
269a0 72 28 69 3d 70 57 43 2d 3e 6e 54 65 72 6d 2c 20  r(i=pWC->nTerm, 
269b0 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 69 3e  pTerm=pWC->a; i>
269c0 30 3b 20 69 2d 2d 2c 20 70 54 65 72 6d 2b 2b 29  0; i--, pTerm++)
269d0 7b 0a 20 20 20 20 69 66 28 20 28 70 54 65 72 6d  {.    if( (pTerm
269e0 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
269f0 5f 56 49 52 54 55 41 4c 29 21 3d 30 20 29 20 62  _VIRTUAL)!=0 ) b
26a00 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 28 70  reak;.    if( (p
26a10 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20  Term->prereqAll 
26a20 26 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c  & pLoop->maskSel
26a30 66 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  f)==0 ) continue
26a40 3b 0a 20 20 20 20 69 66 28 20 28 70 54 65 72 6d  ;.    if( (pTerm
26a50 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26 20 6e 6f  ->prereqAll & no
26a60 74 41 6c 6c 6f 77 65 64 29 21 3d 30 20 29 20 63  tAllowed)!=0 ) c
26a70 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 66 6f 72  ontinue;.    for
26a80 28 6a 3d 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d  (j=pLoop->nLTerm
26a90 2d 31 3b 20 6a 3e 3d 30 3b 20 6a 2d 2d 29 7b 0a  -1; j>=0; j--){.
26aa0 20 20 20 20 20 20 70 58 20 3d 20 70 4c 6f 6f 70        pX = pLoop
26ab0 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 3b 0a 20 20 20  ->aLTerm[j];.   
26ac0 20 20 20 69 66 28 20 70 58 3d 3d 30 20 29 20 63     if( pX==0 ) c
26ad0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69  ontinue;.      i
26ae0 66 28 20 70 58 3d 3d 70 54 65 72 6d 20 29 20 62  f( pX==pTerm ) b
26af0 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 66 28 20  reak;.      if( 
26b00 70 58 2d 3e 69 50 61 72 65 6e 74 3e 3d 30 20 26  pX->iParent>=0 &
26b10 26 20 28 26 70 57 43 2d 3e 61 5b 70 58 2d 3e 69  & (&pWC->a[pX->i
26b20 50 61 72 65 6e 74 5d 29 3d 3d 70 54 65 72 6d 20  Parent])==pTerm 
26b30 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20  ) break;.    }. 
26b40 20 20 20 69 66 28 20 6a 3c 30 20 29 7b 0a 20 20     if( j<0 ){.  
26b50 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 74      if( pTerm->t
26b60 72 75 74 68 50 72 6f 62 3c 3d 30 20 29 7b 0a 20  ruthProb<=0 ){. 
26b70 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f         pLoop->nO
26b80 75 74 20 2b 3d 20 70 54 65 72 6d 2d 3e 74 72 75  ut += pTerm->tru
26b90 74 68 50 72 6f 62 3b 0a 20 20 20 20 20 20 7d 65  thProb;.      }e
26ba0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 4c 6f  lse{.        pLo
26bb0 6f 70 2d 3e 6e 4f 75 74 2d 2d 3b 0a 20 20 20 20  op->nOut--;.    
26bc0 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65      if( pTerm->e
26bd0 4f 70 65 72 61 74 6f 72 26 57 4f 5f 45 51 20 29  Operator&WO_EQ )
26be0 20 6e 45 71 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a   nEq++;.      }.
26bf0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20 54      }.  }.  /* T
26c00 55 4e 49 4e 47 3a 20 20 49 66 20 74 68 65 72 65  UNING:  If there
26c10 20 69 73 20 61 74 20 6c 65 61 73 74 20 6f 6e 65   is at least one
26c20 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72   equality constr
26c30 61 69 6e 74 20 69 6e 20 74 68 65 20 57 48 45 52  aint in the WHER
26c40 45 0a 20 20 2a 2a 20 63 6c 61 75 73 65 20 74 68  E.  ** clause th
26c50 61 74 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65  at does not have
26c60 20 61 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 29 20   a likelihood() 
26c70 65 78 70 6c 69 63 69 74 6c 79 20 61 73 73 69 67  explicitly assig
26c80 6e 65 64 20 74 6f 20 69 74 0a 20 20 2a 2a 20 74  ned to it.  ** t
26c90 68 65 6e 20 64 6f 20 6e 6f 74 20 6c 65 74 20 74  hen do not let t
26ca0 68 65 20 65 73 74 69 6d 61 74 65 64 20 6e 75 6d  he estimated num
26cb0 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20 72 6f  ber of output ro
26cc0 77 73 20 65 78 63 65 65 64 20 68 61 6c 66 20 0a  ws exceed half .
26cd0 20 20 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20    ** the number 
26ce0 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74  of rows in the t
26cf0 61 62 6c 65 2e 20 2a 2f 0a 20 20 69 66 28 20 6e  able. */.  if( n
26d00 45 71 20 26 26 20 70 4c 6f 6f 70 2d 3e 6e 4f 75  Eq && pLoop->nOu
26d10 74 3e 6e 52 6f 77 2d 31 30 20 29 7b 0a 20 20 20  t>nRow-10 ){.   
26d20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 3d 20 6e   pLoop->nOut = n
26d30 52 6f 77 20 2d 20 31 30 3b 0a 20 20 7d 0a 7d 0a  Row - 10;.  }.}.
26d40 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20 74 68  ./*.** Adjust th
26d50 65 20 63 6f 73 74 20 43 20 62 79 20 74 68 65 20  e cost C by the 
26d60 63 6f 73 74 4d 75 6c 74 20 66 61 63 74 65 72 20  costMult facter 
26d70 54 2e 20 20 54 68 69 73 20 6f 6e 6c 79 20 6f 63  T.  This only oc
26d80 63 75 72 73 20 69 66 0a 2a 2a 20 63 6f 6d 70 69  curs if.** compi
26d90 6c 65 64 20 77 69 74 68 20 2d 44 53 51 4c 49 54  led with -DSQLIT
26da0 45 5f 45 4e 41 42 4c 45 5f 43 4f 53 54 4d 55 4c  E_ENABLE_COSTMUL
26db0 54 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  T.*/.#ifdef SQLI
26dc0 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 53 54 4d 55  TE_ENABLE_COSTMU
26dd0 4c 54 0a 23 20 64 65 66 69 6e 65 20 41 70 70 6c  LT.# define Appl
26de0 79 43 6f 73 74 4d 75 6c 74 69 70 6c 69 65 72 28  yCostMultiplier(
26df0 43 2c 54 29 20 20 43 20 2b 3d 20 54 0a 23 65 6c  C,T)  C += T.#el
26e00 73 65 0a 23 20 64 65 66 69 6e 65 20 41 70 70 6c  se.# define Appl
26e10 79 43 6f 73 74 4d 75 6c 74 69 70 6c 69 65 72 28  yCostMultiplier(
26e20 43 2c 54 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  C,T).#endif../*.
26e30 2a 2a 20 57 65 20 68 61 76 65 20 73 6f 20 66 61  ** We have so fa
26e40 72 20 6d 61 74 63 68 65 64 20 70 42 75 69 6c 64  r matched pBuild
26e50 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74 72 65  er->pNew->u.btre
26e60 65 2e 6e 45 71 20 74 65 72 6d 73 20 6f 66 20 74  e.nEq terms of t
26e70 68 65 20 0a 2a 2a 20 69 6e 64 65 78 20 70 49 6e  he .** index pIn
26e80 64 65 78 2e 20 54 72 79 20 74 6f 20 6d 61 74 63  dex. Try to matc
26e90 68 20 6f 6e 65 20 6d 6f 72 65 2e 0a 2a 2a 0a 2a  h one more..**.*
26ea0 2a 20 57 68 65 6e 20 74 68 69 73 20 66 75 6e 63  * When this func
26eb0 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20  tion is called, 
26ec0 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e  pBuilder->pNew->
26ed0 6e 4f 75 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  nOut contains th
26ee0 65 20 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20  e .** number of 
26ef0 72 6f 77 73 20 65 78 70 65 63 74 65 64 20 74 6f  rows expected to
26f00 20 62 65 20 76 69 73 69 74 65 64 20 62 79 20 66   be visited by f
26f10 69 6c 74 65 72 69 6e 67 20 75 73 69 6e 67 20 74  iltering using t
26f20 68 65 20 6e 45 71 20 0a 2a 2a 20 74 65 72 6d 73  he nEq .** terms
26f30 20 6f 6e 6c 79 2e 20 49 66 20 69 74 20 69 73 20   only. If it is 
26f40 6d 6f 64 69 66 69 65 64 2c 20 74 68 69 73 20 76  modified, this v
26f50 61 6c 75 65 20 69 73 20 72 65 73 74 6f 72 65 64  alue is restored
26f60 20 62 65 66 6f 72 65 20 74 68 69 73 20 0a 2a 2a   before this .**
26f70 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
26f80 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 50 72 6f  s..**.** If pPro
26f90 62 65 2d 3e 74 6e 75 6d 3d 3d 30 2c 20 74 68 61  be->tnum==0, tha
26fa0 74 20 6d 65 61 6e 73 20 70 49 6e 64 65 78 20 69  t means pIndex i
26fb0 73 20 61 20 66 61 6b 65 20 69 6e 64 65 78 20 75  s a fake index u
26fc0 73 65 64 20 66 6f 72 20 74 68 65 0a 2a 2a 20 49  sed for the.** I
26fd0 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
26fe0 45 59 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  EY..*/.static in
26ff0 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74  t whereLoopAddBt
27000 72 65 65 49 6e 64 65 78 28 0a 20 20 57 68 65 72  reeIndex(.  Wher
27010 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42  eLoopBuilder *pB
27020 75 69 6c 64 65 72 2c 20 20 20 20 20 2f 2a 20 54  uilder,     /* T
27030 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 66 61 63  he WhereLoop fac
27040 74 6f 72 79 20 2a 2f 0a 20 20 73 74 72 75 63 74  tory */.  struct
27050 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
27060 53 72 63 2c 20 20 20 20 20 20 2f 2a 20 46 52 4f  Src,      /* FRO
27070 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20 62 65  M clause term be
27080 69 6e 67 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a  ing analyzed */.
27090 20 20 49 6e 64 65 78 20 2a 70 50 72 6f 62 65 2c    Index *pProbe,
270a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
270b0 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 6f 6e    /* An index on
270c0 20 70 53 72 63 20 2a 2f 0a 20 20 4c 6f 67 45 73   pSrc */.  LogEs
270d0 74 20 6e 49 6e 4d 75 6c 20 20 20 20 20 20 20 20  t nInMul        
270e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6c 6f             /* lo
270f0 67 28 4e 75 6d 62 65 72 20 6f 66 20 69 74 65 72  g(Number of iter
27100 61 74 69 6f 6e 73 20 64 75 65 20 74 6f 20 49 4e  ations due to IN
27110 29 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 49  ) */.){.  WhereI
27120 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70 42  nfo *pWInfo = pB
27130 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 20  uilder->pWInfo; 
27140 20 2f 2a 20 57 48 45 52 45 20 61 6e 61 6c 79 73   /* WHERE analys
27150 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 50  e context */.  P
27160 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70  arse *pParse = p
27170 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 20 20  WInfo->pParse;  
27180 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
27190 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73 71   context */.  sq
271a0 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
271b0 73 65 2d 3e 64 62 3b 20 20 20 20 20 20 20 2f 2a  se->db;       /*
271c0 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
271d0 74 69 6f 6e 20 6d 61 6c 6c 6f 63 20 63 6f 6e 74  tion malloc cont
271e0 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f  ext */.  WhereLo
271f0 6f 70 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20  op *pNew;       
27200 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70           /* Temp
27210 6c 61 74 65 20 57 68 65 72 65 4c 6f 6f 70 20 75  late WhereLoop u
27220 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
27230 6e 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  n */.  WhereTerm
27240 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20   *pTerm;        
27250 20 20 20 20 20 20 20 2f 2a 20 41 20 57 68 65 72         /* A Wher
27260 65 54 65 72 6d 20 75 6e 64 65 72 20 63 6f 6e 73  eTerm under cons
27270 69 64 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69  ideration */.  i
27280 6e 74 20 6f 70 4d 61 73 6b 3b 20 20 20 20 20 20  nt opMask;      
27290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
272a0 2a 20 56 61 6c 69 64 20 6f 70 65 72 61 74 6f 72  * Valid operator
272b0 73 20 66 6f 72 20 63 6f 6e 73 74 72 61 69 6e 74  s for constraint
272c0 73 20 2a 2f 0a 20 20 57 68 65 72 65 53 63 61 6e  s */.  WhereScan
272d0 20 73 63 61 6e 3b 20 20 20 20 20 20 20 20 20 20   scan;          
272e0 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74         /* Iterat
272f0 6f 72 20 66 6f 72 20 57 48 45 52 45 20 74 65 72  or for WHERE ter
27300 6d 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  ms */.  Bitmask 
27310 73 61 76 65 64 5f 70 72 65 72 65 71 3b 20 20 20  saved_prereq;   
27320 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69          /* Origi
27330 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65  nal value of pNe
27340 77 2d 3e 70 72 65 72 65 71 20 2a 2f 0a 20 20 75  w->prereq */.  u
27350 31 36 20 73 61 76 65 64 5f 6e 4c 54 65 72 6d 3b  16 saved_nLTerm;
27360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
27370 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65  * Original value
27380 20 6f 66 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d   of pNew->nLTerm
27390 20 2a 2f 0a 20 20 75 31 36 20 73 61 76 65 64 5f   */.  u16 saved_
273a0 6e 45 71 3b 20 20 20 20 20 20 20 20 20 20 20 20  nEq;            
273b0 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61        /* Origina
273c0 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d  l value of pNew-
273d0 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 2a 2f 0a  >u.btree.nEq */.
273e0 20 20 75 31 36 20 73 61 76 65 64 5f 6e 53 6b 69    u16 saved_nSki
273f0 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
27400 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61    /* Original va
27410 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 75 2e 62  lue of pNew->u.b
27420 74 72 65 65 2e 6e 53 6b 69 70 20 2a 2f 0a 20 20  tree.nSkip */.  
27430 75 33 32 20 73 61 76 65 64 5f 77 73 46 6c 61 67  u32 saved_wsFlag
27440 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
27450 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75  /* Original valu
27460 65 20 6f 66 20 70 4e 65 77 2d 3e 77 73 46 6c 61  e of pNew->wsFla
27470 67 73 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 73  gs */.  LogEst s
27480 61 76 65 64 5f 6e 4f 75 74 3b 20 20 20 20 20 20  aved_nOut;      
27490 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69          /* Origi
274a0 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65  nal value of pNe
274b0 77 2d 3e 6e 4f 75 74 20 2a 2f 0a 20 20 69 6e 74  w->nOut */.  int
274c0 20 69 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20   iCol;          
274d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
274e0 49 6e 64 65 78 20 6f 66 20 74 68 65 20 63 6f 6c  Index of the col
274f0 75 6d 6e 20 69 6e 20 74 68 65 20 74 61 62 6c 65  umn in the table
27500 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
27510 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
27520 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
27530 63 6f 64 65 20 2a 2f 0a 20 20 4c 6f 67 45 73 74  code */.  LogEst
27540 20 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20   rSize;         
27550 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
27560 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74  ber of rows in t
27570 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 4c 6f  he table */.  Lo
27580 67 45 73 74 20 72 4c 6f 67 53 69 7a 65 3b 20 20  gEst rLogSize;  
27590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
275a0 20 4c 6f 67 61 72 69 74 68 6d 20 6f 66 20 74 61   Logarithm of ta
275b0 62 6c 65 20 73 69 7a 65 20 2a 2f 0a 20 20 57 68  ble size */.  Wh
275c0 65 72 65 54 65 72 6d 20 2a 70 54 6f 70 20 3d 20  ereTerm *pTop = 
275d0 30 2c 20 2a 70 42 74 6d 20 3d 20 30 3b 20 2f 2a  0, *pBtm = 0; /*
275e0 20 54 6f 70 20 61 6e 64 20 62 6f 74 74 6f 6d 20   Top and bottom 
275f0 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74  range constraint
27600 73 20 2a 2f 0a 0a 20 20 70 4e 65 77 20 3d 20 70  s */..  pNew = p
27610 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20  Builder->pNew;. 
27620 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
27630 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20 53  ailed ) return S
27640 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 0a 20 20  QLITE_NOMEM;..  
27650 61 73 73 65 72 74 28 20 28 70 4e 65 77 2d 3e 77  assert( (pNew->w
27660 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56  sFlags & WHERE_V
27670 49 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30 20  IRTUALTABLE)==0 
27680 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 4e  );.  assert( (pN
27690 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  ew->wsFlags & WH
276a0 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 3d 3d  ERE_TOP_LIMIT)==
276b0 30 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d  0 );.  if( pNew-
276c0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
276d0 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20 20  _BTM_LIMIT ){.  
276e0 20 20 6f 70 4d 61 73 6b 20 3d 20 57 4f 5f 4c 54    opMask = WO_LT
276f0 7c 57 4f 5f 4c 45 3b 0a 20 20 7d 65 6c 73 65 20  |WO_LE;.  }else 
27700 69 66 28 20 70 50 72 6f 62 65 2d 3e 74 6e 75 6d  if( pProbe->tnum
27710 3c 3d 30 20 7c 7c 20 28 70 53 72 63 2d 3e 6a 6f  <=0 || (pSrc->jo
27720 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45 46 54  intype & JT_LEFT
27730 29 21 3d 30 20 29 7b 0a 20 20 20 20 6f 70 4d 61  )!=0 ){.    opMa
27740 73 6b 20 3d 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e  sk = WO_EQ|WO_IN
27750 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f  |WO_GT|WO_GE|WO_
27760 4c 54 7c 57 4f 5f 4c 45 3b 0a 20 20 7d 65 6c 73  LT|WO_LE;.  }els
27770 65 7b 0a 20 20 20 20 6f 70 4d 61 73 6b 20 3d 20  e{.    opMask = 
27780 57 4f 5f 45 51 7c 57 4f 5f 49 4e 7c 57 4f 5f 49  WO_EQ|WO_IN|WO_I
27790 53 4e 55 4c 4c 7c 57 4f 5f 47 54 7c 57 4f 5f 47  SNULL|WO_GT|WO_G
277a0 45 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 3b 0a 20  E|WO_LT|WO_LE;. 
277b0 20 7d 0a 20 20 69 66 28 20 70 50 72 6f 62 65 2d   }.  if( pProbe-
277c0 3e 62 55 6e 6f 72 64 65 72 65 64 20 29 20 6f 70  >bUnordered ) op
277d0 4d 61 73 6b 20 26 3d 20 7e 28 57 4f 5f 47 54 7c  Mask &= ~(WO_GT|
277e0 57 4f 5f 47 45 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c  WO_GE|WO_LT|WO_L
277f0 45 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  E);..  assert( p
27800 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
27810 3c 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e  <pProbe->nColumn
27820 20 29 3b 0a 20 20 69 43 6f 6c 20 3d 20 70 50 72   );.  iCol = pPr
27830 6f 62 65 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 70 4e  obe->aiColumn[pN
27840 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 5d  ew->u.btree.nEq]
27850 3b 0a 0a 20 20 70 54 65 72 6d 20 3d 20 77 68 65  ;..  pTerm = whe
27860 72 65 53 63 61 6e 49 6e 69 74 28 26 73 63 61 6e  reScanInit(&scan
27870 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 2c  , pBuilder->pWC,
27880 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 2c 20   pSrc->iCursor, 
27890 69 43 6f 6c 2c 0a 20 20 20 20 20 20 20 20 20 20  iCol,.          
278a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 70                op
278b0 4d 61 73 6b 2c 20 70 50 72 6f 62 65 29 3b 0a 20  Mask, pProbe);. 
278c0 20 73 61 76 65 64 5f 6e 45 71 20 3d 20 70 4e 65   saved_nEq = pNe
278d0 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a  w->u.btree.nEq;.
278e0 20 20 73 61 76 65 64 5f 6e 53 6b 69 70 20 3d 20    saved_nSkip = 
278f0 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 53  pNew->u.btree.nS
27900 6b 69 70 3b 0a 20 20 73 61 76 65 64 5f 6e 4c 54  kip;.  saved_nLT
27910 65 72 6d 20 3d 20 70 4e 65 77 2d 3e 6e 4c 54 65  erm = pNew->nLTe
27920 72 6d 3b 0a 20 20 73 61 76 65 64 5f 77 73 46 6c  rm;.  saved_wsFl
27930 61 67 73 20 3d 20 70 4e 65 77 2d 3e 77 73 46 6c  ags = pNew->wsFl
27940 61 67 73 3b 0a 20 20 73 61 76 65 64 5f 70 72 65  ags;.  saved_pre
27950 72 65 71 20 3d 20 70 4e 65 77 2d 3e 70 72 65 72  req = pNew->prer
27960 65 71 3b 0a 20 20 73 61 76 65 64 5f 6e 4f 75 74  eq;.  saved_nOut
27970 20 3d 20 70 4e 65 77 2d 3e 6e 4f 75 74 3b 0a 20   = pNew->nOut;. 
27980 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20   pNew->rSetup = 
27990 30 3b 0a 20 20 72 53 69 7a 65 20 3d 20 70 50 72  0;.  rSize = pPr
279a0 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74  obe->aiRowLogEst
279b0 5b 30 5d 3b 0a 20 20 72 4c 6f 67 53 69 7a 65 20  [0];.  rLogSize 
279c0 3d 20 65 73 74 4c 6f 67 28 72 53 69 7a 65 29 3b  = estLog(rSize);
279d0 0a 0a 20 20 2f 2a 20 43 6f 6e 73 69 64 65 72 20  ..  /* Consider 
279e0 75 73 69 6e 67 20 61 20 73 6b 69 70 2d 73 63 61  using a skip-sca
279f0 6e 20 69 66 20 74 68 65 72 65 20 61 72 65 20 6e  n if there are n
27a00 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 63  o WHERE clause c
27a10 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a 2a 20  onstraints.  ** 
27a20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 74 68  available for th
27a30 65 20 6c 65 66 74 2d 6d 6f 73 74 20 74 65 72 6d  e left-most term
27a40 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2c 20  s of the index, 
27a50 61 6e 64 20 69 66 20 74 68 65 20 61 76 65 72 61  and if the avera
27a60 67 65 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f  ge.  ** number o
27a70 66 20 72 65 70 65 61 74 73 20 69 6e 20 74 68 65  f repeats in the
27a80 20 6c 65 66 74 2d 6d 6f 73 74 20 74 65 72 6d 73   left-most terms
27a90 20 69 73 20 61 74 20 6c 65 61 73 74 20 31 38 2e   is at least 18.
27aa0 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20   .  **.  ** The 
27ab0 6d 61 67 69 63 20 6e 75 6d 62 65 72 20 31 38 20  magic number 18 
27ac0 69 73 20 73 65 6c 65 63 74 65 64 20 6f 6e 20 74  is selected on t
27ad0 68 65 20 62 61 73 69 73 20 74 68 61 74 20 73 63  he basis that sc
27ae0 61 6e 6e 69 6e 67 20 31 37 20 72 6f 77 73 0a 20  anning 17 rows. 
27af0 20 2a 2a 20 69 73 20 61 6c 6d 6f 73 74 20 61 6c   ** is almost al
27b00 77 61 79 73 20 71 75 69 63 6b 65 72 20 74 68 61  ways quicker tha
27b10 6e 20 61 6e 20 69 6e 64 65 78 20 73 65 65 6b 20  n an index seek 
27b20 28 65 76 65 6e 20 74 68 6f 75 67 68 20 69 66 20  (even though if 
27b30 74 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20 63  the index.  ** c
27b40 6f 6e 74 61 69 6e 73 20 66 65 77 65 72 20 74 68  ontains fewer th
27b50 61 6e 20 32 5e 31 37 20 72 6f 77 73 20 77 65 20  an 2^17 rows we 
27b60 61 73 73 75 6d 65 20 6f 74 68 65 72 77 69 73 65  assume otherwise
27b70 20 69 6e 20 6f 74 68 65 72 20 70 61 72 74 73 20   in other parts 
27b80 6f 66 0a 20 20 2a 2a 20 74 68 65 20 63 6f 64 65  of.  ** the code
27b90 29 2e 20 41 6e 64 2c 20 65 76 65 6e 20 69 66 20  ). And, even if 
27ba0 69 74 20 69 73 20 6e 6f 74 2c 20 69 74 20 73 68  it is not, it sh
27bb0 6f 75 6c 64 20 6e 6f 74 20 62 65 20 74 6f 6f 20  ould not be too 
27bc0 6d 75 63 68 20 73 6c 6f 77 65 72 2e 20 0a 20 20  much slower. .  
27bd0 2a 2a 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20  ** On the other 
27be0 68 61 6e 64 2c 20 74 68 65 20 65 78 74 72 61 20  hand, the extra 
27bf0 73 65 65 6b 73 20 63 6f 75 6c 64 20 65 6e 64 20  seeks could end 
27c00 75 70 20 62 65 69 6e 67 20 73 69 67 6e 69 66 69  up being signifi
27c10 63 61 6e 74 6c 79 0a 20 20 2a 2a 20 6d 6f 72 65  cantly.  ** more
27c20 20 65 78 70 65 6e 73 69 76 65 2e 20 20 2a 2f 0a   expensive.  */.
27c30 20 20 61 73 73 65 72 74 28 20 34 32 3d 3d 73 71    assert( 42==sq
27c40 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 38 29 20  lite3LogEst(18) 
27c50 29 3b 0a 20 20 69 66 28 20 73 61 76 65 64 5f 6e  );.  if( saved_n
27c60 45 71 3d 3d 73 61 76 65 64 5f 6e 53 6b 69 70 0a  Eq==saved_nSkip.
27c70 20 20 20 26 26 20 73 61 76 65 64 5f 6e 45 71 2b     && saved_nEq+
27c80 31 3c 70 50 72 6f 62 65 2d 3e 6e 4b 65 79 43 6f  1<pProbe->nKeyCo
27c90 6c 0a 20 20 20 26 26 20 70 50 72 6f 62 65 2d 3e  l.   && pProbe->
27ca0 61 69 52 6f 77 4c 6f 67 45 73 74 5b 73 61 76 65  aiRowLogEst[save
27cb0 64 5f 6e 45 71 2b 31 5d 3e 3d 34 32 20 20 2f 2a  d_nEq+1]>=42  /*
27cc0 20 54 55 4e 49 4e 47 3a 20 4d 69 6e 69 6d 75 6d   TUNING: Minimum
27cd0 20 66 6f 72 20 73 6b 69 70 2d 73 63 61 6e 20 2a   for skip-scan *
27ce0 2f 0a 20 20 20 26 26 20 28 72 63 20 3d 20 77 68  /.   && (rc = wh
27cf0 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62  ereLoopResize(db
27d00 2c 20 70 4e 65 77 2c 20 70 4e 65 77 2d 3e 6e 4c  , pNew, pNew->nL
27d10 54 65 72 6d 2b 31 29 29 3d 3d 53 51 4c 49 54 45  Term+1))==SQLITE
27d20 5f 4f 4b 0a 20 20 29 7b 0a 20 20 20 20 4c 6f 67  _OK.  ){.    Log
27d30 45 73 74 20 6e 49 74 65 72 3b 0a 20 20 20 20 70  Est nIter;.    p
27d40 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
27d50 2b 2b 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e  ++;.    pNew->u.
27d60 62 74 72 65 65 2e 6e 53 6b 69 70 2b 2b 3b 0a 20  btree.nSkip++;. 
27d70 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b     pNew->aLTerm[
27d80 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b 2b 5d 20  pNew->nLTerm++] 
27d90 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 77  = 0;.    pNew->w
27da0 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f  sFlags |= WHERE_
27db0 53 4b 49 50 53 43 41 4e 3b 0a 20 20 20 20 6e 49  SKIPSCAN;.    nI
27dc0 74 65 72 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69  ter = pProbe->ai
27dd0 52 6f 77 4c 6f 67 45 73 74 5b 73 61 76 65 64 5f  RowLogEst[saved_
27de0 6e 45 71 5d 20 2d 20 70 50 72 6f 62 65 2d 3e 61  nEq] - pProbe->a
27df0 69 52 6f 77 4c 6f 67 45 73 74 5b 73 61 76 65 64  iRowLogEst[saved
27e00 5f 6e 45 71 2b 31 5d 3b 0a 20 20 20 20 69 66 28  _nEq+1];.    if(
27e10 20 70 54 65 72 6d 20 29 7b 0a 20 20 20 20 20 20   pTerm ){.      
27e20 2f 2a 20 54 55 4e 49 4e 47 3a 20 20 57 68 65 6e  /* TUNING:  When
27e30 20 65 73 74 69 6d 61 74 69 6e 67 20 73 6b 69 70   estimating skip
27e40 2d 73 63 61 6e 20 66 6f 72 20 61 20 74 65 72 6d  -scan for a term
27e50 20 74 68 61 74 20 69 73 20 61 6c 73 6f 20 69 6e   that is also in
27e60 64 65 78 61 62 6c 65 2c 0a 20 20 20 20 20 20 2a  dexable,.      *
27e70 2a 20 6d 75 6c 74 69 70 6c 79 20 74 68 65 20 63  * multiply the c
27e80 6f 73 74 20 6f 66 20 74 68 65 20 73 6b 69 70 2d  ost of the skip-
27e90 73 63 61 6e 20 62 79 20 32 2e 30 2c 20 74 6f 20  scan by 2.0, to 
27ea0 6d 61 6b 65 20 69 74 20 61 20 6c 69 74 74 6c 65  make it a little
27eb0 20 6c 65 73 73 0a 20 20 20 20 20 20 2a 2a 20 64   less.      ** d
27ec0 65 73 69 72 61 62 6c 65 20 74 68 61 6e 20 74 68  esirable than th
27ed0 65 20 72 65 67 75 6c 61 72 20 69 6e 64 65 78 20  e regular index 
27ee0 6c 6f 6f 6b 75 70 2e 20 2a 2f 0a 20 20 20 20 20  lookup. */.     
27ef0 20 6e 49 74 65 72 20 2b 3d 20 31 30 3b 20 20 61   nIter += 10;  a
27f00 73 73 65 72 74 28 20 31 30 3d 3d 73 71 6c 69 74  ssert( 10==sqlit
27f10 65 33 4c 6f 67 45 73 74 28 32 29 20 29 3b 0a 20  e3LogEst(2) );. 
27f20 20 20 20 7d 0a 20 20 20 20 70 4e 65 77 2d 3e 6e     }.    pNew->n
27f30 4f 75 74 20 2d 3d 20 6e 49 74 65 72 3b 0a 20 20  Out -= nIter;.  
27f40 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 20 42 65    /* TUNING:  Be
27f50 63 61 75 73 65 20 75 6e 63 65 72 74 61 69 6e 74  cause uncertaint
27f60 69 65 73 20 69 6e 20 74 68 65 20 65 73 74 69 6d  ies in the estim
27f70 61 74 65 73 20 66 6f 72 20 73 6b 69 70 2d 73 63  ates for skip-sc
27f80 61 6e 20 71 75 65 72 69 65 73 2c 0a 20 20 20 20  an queries,.    
27f90 2a 2a 20 61 64 64 20 61 20 31 2e 33 37 35 20 66  ** add a 1.375 f
27fa0 75 64 67 65 20 66 61 63 74 6f 72 20 74 6f 20 6d  udge factor to m
27fb0 61 6b 65 20 73 6b 69 70 2d 73 63 61 6e 20 73 6c  ake skip-scan sl
27fc0 69 67 68 74 6c 79 20 6c 65 73 73 20 6c 69 6b 65  ightly less like
27fd0 6c 79 2e 20 2a 2f 0a 20 20 20 20 6e 49 74 65 72  ly. */.    nIter
27fe0 20 2b 3d 20 35 3b 0a 20 20 20 20 77 68 65 72 65   += 5;.    where
27ff0 4c 6f 6f 70 41 64 64 42 74 72 65 65 49 6e 64 65  LoopAddBtreeInde
28000 78 28 70 42 75 69 6c 64 65 72 2c 20 70 53 72 63  x(pBuilder, pSrc
28010 2c 20 70 50 72 6f 62 65 2c 20 6e 49 74 65 72 20  , pProbe, nIter 
28020 2b 20 6e 49 6e 4d 75 6c 29 3b 0a 20 20 20 20 70  + nInMul);.    p
28030 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76 65  New->nOut = save
28040 64 5f 6e 4f 75 74 3b 0a 20 20 20 20 70 4e 65 77  d_nOut;.    pNew
28050 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20  ->u.btree.nEq = 
28060 73 61 76 65 64 5f 6e 45 71 3b 0a 20 20 20 20 70  saved_nEq;.    p
28070 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 53 6b  New->u.btree.nSk
28080 69 70 20 3d 20 73 61 76 65 64 5f 6e 53 6b 69 70  ip = saved_nSkip
28090 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 3b 20 72 63  ;.  }.  for(; rc
280a0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
280b0 54 65 72 6d 21 3d 30 3b 20 70 54 65 72 6d 20 3d  Term!=0; pTerm =
280c0 20 77 68 65 72 65 53 63 61 6e 4e 65 78 74 28 26   whereScanNext(&
280d0 73 63 61 6e 29 29 7b 0a 20 20 20 20 75 31 36 20  scan)){.    u16 
280e0 65 4f 70 20 3d 20 70 54 65 72 6d 2d 3e 65 4f 70  eOp = pTerm->eOp
280f0 65 72 61 74 6f 72 3b 20 20 20 2f 2a 20 53 68 6f  erator;   /* Sho
28100 72 74 68 61 6e 64 20 66 6f 72 20 70 54 65 72 6d  rthand for pTerm
28110 2d 3e 65 4f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  ->eOperator */. 
28120 20 20 20 4c 6f 67 45 73 74 20 72 43 6f 73 74 49     LogEst rCostI
28130 64 78 3b 0a 20 20 20 20 4c 6f 67 45 73 74 20 6e  dx;.    LogEst n
28140 4f 75 74 55 6e 61 64 6a 75 73 74 65 64 3b 20 20  OutUnadjusted;  
28150 20 20 20 20 20 20 2f 2a 20 6e 4f 75 74 20 62 65        /* nOut be
28160 66 6f 72 65 20 49 4e 28 29 20 61 6e 64 20 57 48  fore IN() and WH
28170 45 52 45 20 61 64 6a 75 73 74 6d 65 6e 74 73 20  ERE adjustments 
28180 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 49 6e 20 3d  */.    int nIn =
28190 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   0;.#ifdef SQLIT
281a0 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f  E_ENABLE_STAT3_O
281b0 52 5f 53 54 41 54 34 0a 20 20 20 20 69 6e 74 20  R_STAT4.    int 
281c0 6e 52 65 63 56 61 6c 69 64 20 3d 20 70 42 75 69  nRecValid = pBui
281d0 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3b  lder->nRecValid;
281e0 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20  .#endif.    if( 
281f0 28 65 4f 70 3d 3d 57 4f 5f 49 53 4e 55 4c 4c 20  (eOp==WO_ISNULL 
28200 7c 7c 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61  || (pTerm->wtFla
28210 67 73 26 54 45 52 4d 5f 56 4e 55 4c 4c 29 21 3d  gs&TERM_VNULL)!=
28220 30 29 0a 20 20 20 20 20 26 26 20 28 69 43 6f 6c  0).     && (iCol
28230 3c 30 20 7c 7c 20 70 53 72 63 2d 3e 70 54 61 62  <0 || pSrc->pTab
28240 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 6e 6f 74  ->aCol[iCol].not
28250 4e 75 6c 6c 29 0a 20 20 20 20 29 7b 0a 20 20 20  Null).    ){.   
28260 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 2f 2a 20     continue; /* 
28270 69 67 6e 6f 72 65 20 49 53 20 5b 4e 4f 54 5d 20  ignore IS [NOT] 
28280 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74 73  NULL constraints
28290 20 6f 6e 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6c   on NOT NULL col
282a0 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  umns */.    }.  
282b0 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 70 72 65    if( pTerm->pre
282c0 72 65 71 52 69 67 68 74 20 26 20 70 4e 65 77 2d  reqRight & pNew-
282d0 3e 6d 61 73 6b 53 65 6c 66 20 29 20 63 6f 6e 74  >maskSelf ) cont
282e0 69 6e 75 65 3b 0a 0a 20 20 20 20 70 4e 65 77 2d  inue;..    pNew-
282f0 3e 77 73 46 6c 61 67 73 20 3d 20 73 61 76 65 64  >wsFlags = saved
28300 5f 77 73 46 6c 61 67 73 3b 0a 20 20 20 20 70 4e  _wsFlags;.    pN
28310 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20  ew->u.btree.nEq 
28320 3d 20 73 61 76 65 64 5f 6e 45 71 3b 0a 20 20 20  = saved_nEq;.   
28330 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20   pNew->nLTerm = 
28340 73 61 76 65 64 5f 6e 4c 54 65 72 6d 3b 0a 20 20  saved_nLTerm;.  
28350 20 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70 52    if( whereLoopR
28360 65 73 69 7a 65 28 64 62 2c 20 70 4e 65 77 2c 20  esize(db, pNew, 
28370 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b 31 29 20  pNew->nLTerm+1) 
28380 29 20 62 72 65 61 6b 3b 20 2f 2a 20 4f 4f 4d 20  ) break; /* OOM 
28390 2a 2f 0a 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54  */.    pNew->aLT
283a0 65 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d  erm[pNew->nLTerm
283b0 2b 2b 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20  ++] = pTerm;.   
283c0 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20   pNew->prereq = 
283d0 28 73 61 76 65 64 5f 70 72 65 72 65 71 20 7c 20  (saved_prereq | 
283e0 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
283f0 68 74 29 20 26 20 7e 70 4e 65 77 2d 3e 6d 61 73  ht) & ~pNew->mas
28400 6b 53 65 6c 66 3b 0a 0a 20 20 20 20 61 73 73 65  kSelf;..    asse
28410 72 74 28 20 6e 49 6e 4d 75 6c 3d 3d 30 0a 20 20  rt( nInMul==0.  
28420 20 20 20 20 20 20 7c 7c 20 28 70 4e 65 77 2d 3e        || (pNew->
28430 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
28440 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c 29 21 3d 30 20  COLUMN_NULL)!=0 
28450 0a 20 20 20 20 20 20 20 20 7c 7c 20 28 70 4e 65  .        || (pNe
28460 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  w->wsFlags & WHE
28470 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 29 21 3d 30  RE_COLUMN_IN)!=0
28480 20 0a 20 20 20 20 20 20 20 20 7c 7c 20 28 70 4e   .        || (pN
28490 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  ew->wsFlags & WH
284a0 45 52 45 5f 53 4b 49 50 53 43 41 4e 29 21 3d 30  ERE_SKIPSCAN)!=0
284b0 20 0a 20 20 20 20 29 3b 0a 0a 20 20 20 20 69 66   .    );..    if
284c0 28 20 65 4f 70 20 26 20 57 4f 5f 49 4e 20 29 7b  ( eOp & WO_IN ){
284d0 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78  .      Expr *pEx
284e0 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70  pr = pTerm->pExp
284f0 72 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77  r;.      pNew->w
28500 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f  sFlags |= WHERE_
28510 43 4f 4c 55 4d 4e 5f 49 4e 3b 0a 20 20 20 20 20  COLUMN_IN;.     
28520 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
28530 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78  erty(pExpr, EP_x
28540 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20  IsSelect) ){.   
28550 20 20 20 20 20 2f 2a 20 22 78 20 49 4e 20 28 53       /* "x IN (S
28560 45 4c 45 43 54 20 2e 2e 2e 29 22 3a 20 20 54 55  ELECT ...)":  TU
28570 4e 49 4e 47 3a 20 74 68 65 20 53 45 4c 45 43 54  NING: the SELECT
28580 20 72 65 74 75 72 6e 73 20 32 35 20 72 6f 77 73   returns 25 rows
28590 20 2a 2f 0a 20 20 20 20 20 20 20 20 6e 49 6e 20   */.        nIn 
285a0 3d 20 34 36 3b 20 20 61 73 73 65 72 74 28 20 34  = 46;  assert( 4
285b0 36 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  6==sqlite3LogEst
285c0 28 32 35 29 20 29 3b 0a 20 20 20 20 20 20 7d 65  (25) );.      }e
285d0 6c 73 65 20 69 66 28 20 41 4c 57 41 59 53 28 70  lse if( ALWAYS(p
285e0 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20 26 26  Expr->x.pList &&
285f0 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d   pExpr->x.pList-
28600 3e 6e 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20  >nExpr) ){.     
28610 20 20 20 2f 2a 20 22 78 20 49 4e 20 28 76 61 6c     /* "x IN (val
28620 75 65 2c 20 76 61 6c 75 65 2c 20 2e 2e 2e 29 22  ue, value, ...)"
28630 20 2a 2f 0a 20 20 20 20 20 20 20 20 6e 49 6e 20   */.        nIn 
28640 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  = sqlite3LogEst(
28650 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e  pExpr->x.pList->
28660 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a  nExpr);.      }.
28670 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 49        assert( nI
28680 6e 3e 30 20 29 3b 20 20 2f 2a 20 52 48 53 20 61  n>0 );  /* RHS a
28690 6c 77 61 79 73 20 68 61 73 20 32 20 6f 72 20 6d  lways has 2 or m
286a0 6f 72 65 20 74 65 72 6d 73 2e 2e 2e 20 20 54 68  ore terms...  Th
286b0 65 20 70 61 72 73 65 72 0a 20 20 20 20 20 20 20  e parser.       
286c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
286d0 20 2a 2a 20 63 68 61 6e 67 65 73 20 22 78 20 49   ** changes "x I
286e0 4e 20 28 3f 29 22 20 69 6e 74 6f 20 22 78 3d 3f  N (?)" into "x=?
286f0 22 2e 20 2a 2f 0a 0a 20 20 20 20 7d 65 6c 73 65  ". */..    }else
28700 20 69 66 28 20 65 4f 70 20 26 20 28 57 4f 5f 45   if( eOp & (WO_E
28710 51 29 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77  Q) ){.      pNew
28720 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45  ->wsFlags |= WHE
28730 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 3b 0a 20 20  RE_COLUMN_EQ;.  
28740 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 7c      if( iCol<0 |
28750 7c 20 28 6e 49 6e 4d 75 6c 3d 3d 30 20 26 26 20  | (nInMul==0 && 
28760 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  pNew->u.btree.nE
28770 71 3d 3d 70 50 72 6f 62 65 2d 3e 6e 4b 65 79 43  q==pProbe->nKeyC
28780 6f 6c 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20  ol-1) ){.       
28790 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 26 26 20   if( iCol>=0 && 
287a0 21 49 73 55 6e 69 71 75 65 49 6e 64 65 78 28 70  !IsUniqueIndex(p
287b0 50 72 6f 62 65 29 20 29 7b 0a 20 20 20 20 20 20  Probe) ){.      
287c0 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67      pNew->wsFlag
287d0 73 20 7c 3d 20 57 48 45 52 45 5f 55 4e 51 5f 57  s |= WHERE_UNQ_W
287e0 41 4e 54 45 44 3b 0a 20 20 20 20 20 20 20 20 7d  ANTED;.        }
287f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
28800 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d  pNew->wsFlags |=
28810 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 3b 0a 20   WHERE_ONEROW;. 
28820 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
28830 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65  .    }else if( e
28840 4f 70 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29  Op & WO_ISNULL )
28850 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73  {.      pNew->ws
28860 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43  Flags |= WHERE_C
28870 4f 4c 55 4d 4e 5f 4e 55 4c 4c 3b 0a 20 20 20 20  OLUMN_NULL;.    
28880 7d 65 6c 73 65 20 69 66 28 20 65 4f 70 20 26 20  }else if( eOp & 
28890 28 57 4f 5f 47 54 7c 57 4f 5f 47 45 29 20 29 7b  (WO_GT|WO_GE) ){
288a0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
288b0 20 65 4f 70 20 26 20 57 4f 5f 47 54 20 29 3b 0a   eOp & WO_GT );.
288c0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
288d0 65 4f 70 20 26 20 57 4f 5f 47 45 20 29 3b 0a 20  eOp & WO_GE );. 
288e0 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61       pNew->wsFla
288f0 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55  gs |= WHERE_COLU
28900 4d 4e 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f 42  MN_RANGE|WHERE_B
28910 54 4d 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20  TM_LIMIT;.      
28920 70 42 74 6d 20 3d 20 70 54 65 72 6d 3b 0a 20 20  pBtm = pTerm;.  
28930 20 20 20 20 70 54 6f 70 20 3d 20 30 3b 0a 20 20      pTop = 0;.  
28940 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
28950 73 73 65 72 74 28 20 65 4f 70 20 26 20 28 57 4f  ssert( eOp & (WO
28960 5f 4c 54 7c 57 4f 5f 4c 45 29 20 29 3b 0a 20 20  _LT|WO_LE) );.  
28970 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65 4f      testcase( eO
28980 70 20 26 20 57 4f 5f 4c 54 20 29 3b 0a 20 20 20  p & WO_LT );.   
28990 20 20 20 74 65 73 74 63 61 73 65 28 20 65 4f 70     testcase( eOp
289a0 20 26 20 57 4f 5f 4c 45 20 29 3b 0a 20 20 20 20   & WO_LE );.    
289b0 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20    pNew->wsFlags 
289c0 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  |= WHERE_COLUMN_
289d0 52 41 4e 47 45 7c 57 48 45 52 45 5f 54 4f 50 5f  RANGE|WHERE_TOP_
289e0 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20 70 54 6f  LIMIT;.      pTo
289f0 70 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20  p = pTerm;.     
28a00 20 70 42 74 6d 20 3d 20 28 70 4e 65 77 2d 3e 77   pBtm = (pNew->w
28a10 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 42  sFlags & WHERE_B
28a20 54 4d 5f 4c 49 4d 49 54 29 21 3d 30 20 3f 0a 20  TM_LIMIT)!=0 ?. 
28a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28a40 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d      pNew->aLTerm
28a50 5b 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2d 32 5d  [pNew->nLTerm-2]
28a60 20 3a 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   : 0;.    }..   
28a70 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
28a80 74 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 69 73 20  t pNew->nOut is 
28a90 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  set to the numbe
28aa0 72 20 6f 66 20 72 6f 77 73 20 65 78 70 65 63 74  r of rows expect
28ab0 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20  ed to.    ** be 
28ac0 76 69 73 69 74 65 64 20 62 79 20 74 68 65 20 69  visited by the i
28ad0 6e 64 65 78 20 73 63 61 6e 20 62 65 66 6f 72 65  ndex scan before
28ae0 20 63 6f 6e 73 69 64 65 72 69 6e 67 20 74 65 72   considering ter
28af0 6d 20 70 54 65 72 6d 2c 20 6f 72 20 74 68 65 0a  m pTerm, or the.
28b00 20 20 20 20 2a 2a 20 76 61 6c 75 65 73 20 6f 66      ** values of
28b10 20 6e 49 6e 20 61 6e 64 20 6e 49 6e 4d 75 6c 2e   nIn and nInMul.
28b20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
28b30 20 61 73 73 75 6d 69 6e 67 20 74 68 61 74 20 61   assuming that a
28b40 6c 6c 20 0a 20 20 20 20 2a 2a 20 22 78 20 49 4e  ll .    ** "x IN
28b50 28 2e 2e 2e 29 22 20 74 65 72 6d 73 20 61 72 65  (...)" terms are
28b60 20 72 65 70 6c 61 63 65 64 20 77 69 74 68 20 22   replaced with "
28b70 78 20 3d 20 3f 22 2e 20 54 68 69 73 20 62 6c 6f  x = ?". This blo
28b80 63 6b 20 75 70 64 61 74 65 73 0a 20 20 20 20 2a  ck updates.    *
28b90 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 70  * the value of p
28ba0 4e 65 77 2d 3e 6e 4f 75 74 20 74 6f 20 61 63 63  New->nOut to acc
28bb0 6f 75 6e 74 20 66 6f 72 20 70 54 65 72 6d 20 28  ount for pTerm (
28bc0 62 75 74 20 6e 6f 74 20 6e 49 6e 2f 6e 49 6e 4d  but not nIn/nInM
28bd0 75 6c 29 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73  ul).  */.    ass
28be0 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4f 75 74 3d  ert( pNew->nOut=
28bf0 3d 73 61 76 65 64 5f 6e 4f 75 74 20 29 3b 0a 20  =saved_nOut );. 
28c00 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 77 73 46     if( pNew->wsF
28c10 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c  lags & WHERE_COL
28c20 55 4d 4e 5f 52 41 4e 47 45 20 29 7b 0a 20 20 20  UMN_RANGE ){.   
28c30 20 20 20 2f 2a 20 41 64 6a 75 73 74 20 6e 4f 75     /* Adjust nOu
28c40 74 20 75 73 69 6e 67 20 73 74 61 74 33 2f 73 74  t using stat3/st
28c50 61 74 34 20 64 61 74 61 2e 20 4f 72 2c 20 69 66  at4 data. Or, if
28c60 20 74 68 65 72 65 20 69 73 20 6e 6f 20 73 74 61   there is no sta
28c70 74 33 2f 73 74 61 74 34 0a 20 20 20 20 20 20 2a  t3/stat4.      *
28c80 2a 20 64 61 74 61 2c 20 75 73 69 6e 67 20 73 6f  * data, using so
28c90 6d 65 20 6f 74 68 65 72 20 65 73 74 69 6d 61 74  me other estimat
28ca0 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 77 68 65  e.  */.      whe
28cb0 72 65 52 61 6e 67 65 53 63 61 6e 45 73 74 28 70  reRangeScanEst(p
28cc0 50 61 72 73 65 2c 20 70 42 75 69 6c 64 65 72 2c  Parse, pBuilder,
28cd0 20 70 42 74 6d 2c 20 70 54 6f 70 2c 20 70 4e 65   pBtm, pTop, pNe
28ce0 77 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  w);.    }else{. 
28cf0 20 20 20 20 20 69 6e 74 20 6e 45 71 20 3d 20 2b       int nEq = +
28d00 2b 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e  +pNew->u.btree.n
28d10 45 71 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  Eq;.      assert
28d20 28 20 65 4f 70 20 26 20 28 57 4f 5f 49 53 4e 55  ( eOp & (WO_ISNU
28d30 4c 4c 7c 57 4f 5f 45 51 7c 57 4f 5f 49 4e 29 20  LL|WO_EQ|WO_IN) 
28d40 29 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74  );..      assert
28d50 28 20 70 4e 65 77 2d 3e 6e 4f 75 74 3d 3d 73 61  ( pNew->nOut==sa
28d60 76 65 64 5f 6e 4f 75 74 20 29 3b 0a 20 20 20 20  ved_nOut );.    
28d70 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 74 72 75    if( pTerm->tru
28d80 74 68 50 72 6f 62 3c 3d 30 20 26 26 20 69 43 6f  thProb<=0 && iCo
28d90 6c 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  l>=0 ){.        
28da0 61 73 73 65 72 74 28 20 28 65 4f 70 20 26 20 57  assert( (eOp & W
28db0 4f 5f 49 4e 29 20 7c 7c 20 6e 49 6e 3d 3d 30 20  O_IN) || nIn==0 
28dc0 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
28dd0 61 73 65 28 20 65 4f 70 20 26 20 57 4f 5f 49 4e  ase( eOp & WO_IN
28de0 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77   );.        pNew
28df0 2d 3e 6e 4f 75 74 20 2b 3d 20 70 54 65 72 6d 2d  ->nOut += pTerm-
28e00 3e 74 72 75 74 68 50 72 6f 62 3b 0a 20 20 20 20  >truthProb;.    
28e10 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2d      pNew->nOut -
28e20 3d 20 6e 49 6e 3b 0a 20 20 20 20 20 20 7d 65 6c  = nIn;.      }el
28e30 73 65 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  se{.#ifdef SQLIT
28e40 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f  E_ENABLE_STAT3_O
28e50 52 5f 53 54 41 54 34 0a 20 20 20 20 20 20 20 20  R_STAT4.        
28e60 74 52 6f 77 63 6e 74 20 6e 4f 75 74 20 3d 20 30  tRowcnt nOut = 0
28e70 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 49  ;.        if( nI
28e80 6e 4d 75 6c 3d 3d 30 20 0a 20 20 20 20 20 20 20  nMul==0 .       
28e90 20 20 26 26 20 70 50 72 6f 62 65 2d 3e 6e 53 61    && pProbe->nSa
28ea0 6d 70 6c 65 20 0a 20 20 20 20 20 20 20 20 20 26  mple .         &
28eb0 26 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e  & pNew->u.btree.
28ec0 6e 45 71 3c 3d 70 50 72 6f 62 65 2d 3e 6e 53 61  nEq<=pProbe->nSa
28ed0 6d 70 6c 65 43 6f 6c 0a 20 20 20 20 20 20 20 20  mpleCol.        
28ee0 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e   && Optimization
28ef0 45 6e 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49  Enabled(db, SQLI
28f00 54 45 5f 53 74 61 74 33 29 20 0a 20 20 20 20 20  TE_Stat3) .     
28f10 20 20 20 20 26 26 20 28 28 65 4f 70 20 26 20 57      && ((eOp & W
28f20 4f 5f 49 4e 29 3d 3d 30 20 7c 7c 20 21 45 78 70  O_IN)==0 || !Exp
28f30 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 54 65  rHasProperty(pTe
28f40 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f 78 49  rm->pExpr, EP_xI
28f50 73 53 65 6c 65 63 74 29 29 0a 20 20 20 20 20 20  sSelect)).      
28f60 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45    ){.          E
28f70 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 54 65  xpr *pExpr = pTe
28f80 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  rm->pExpr;.     
28f90 20 20 20 20 20 69 66 28 20 28 65 4f 70 20 26 20       if( (eOp & 
28fa0 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 4e 55 4c 4c  (WO_EQ|WO_ISNULL
28fb0 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ))!=0 ){.       
28fc0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65       testcase( e
28fd0 4f 70 20 26 20 57 4f 5f 45 51 20 29 3b 0a 20 20  Op & WO_EQ );.  
28fe0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
28ff0 73 65 28 20 65 4f 70 20 26 20 57 4f 5f 49 53 4e  se( eOp & WO_ISN
29000 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ULL );.         
29010 20 20 20 72 63 20 3d 20 77 68 65 72 65 45 71 75     rc = whereEqu
29020 61 6c 53 63 61 6e 45 73 74 28 70 50 61 72 73 65  alScanEst(pParse
29030 2c 20 70 42 75 69 6c 64 65 72 2c 20 70 45 78 70  , pBuilder, pExp
29040 72 2d 3e 70 52 69 67 68 74 2c 20 26 6e 4f 75 74  r->pRight, &nOut
29050 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  );.          }el
29060 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
29070 72 63 20 3d 20 77 68 65 72 65 49 6e 53 63 61 6e  rc = whereInScan
29080 45 73 74 28 70 50 61 72 73 65 2c 20 70 42 75 69  Est(pParse, pBui
29090 6c 64 65 72 2c 20 70 45 78 70 72 2d 3e 78 2e 70  lder, pExpr->x.p
290a0 4c 69 73 74 2c 20 26 6e 4f 75 74 29 3b 0a 20 20  List, &nOut);.  
290b0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
290c0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
290d0 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 29 20 72 63  TE_NOTFOUND ) rc
290e0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
290f0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
29100 53 51 4c 49 54 45 5f 4f 4b 20 29 20 62 72 65 61  SQLITE_OK ) brea
29110 6b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a  k;          /* J
29120 75 6d 70 20 6f 75 74 20 6f 66 20 74 68 65 20 70  ump out of the p
29130 54 65 72 6d 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20  Term loop */.   
29140 20 20 20 20 20 20 20 69 66 28 20 6e 4f 75 74 20         if( nOut 
29150 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
29160 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 71 6c 69  New->nOut = sqli
29170 74 65 33 4c 6f 67 45 73 74 28 6e 4f 75 74 29 3b  te3LogEst(nOut);
29180 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
29190 20 70 4e 65 77 2d 3e 6e 4f 75 74 3e 73 61 76 65   pNew->nOut>save
291a0 64 5f 6e 4f 75 74 20 29 20 70 4e 65 77 2d 3e 6e  d_nOut ) pNew->n
291b0 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e 4f 75 74  Out = saved_nOut
291c0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4e  ;.            pN
291d0 65 77 2d 3e 6e 4f 75 74 20 2d 3d 20 6e 49 6e 3b  ew->nOut -= nIn;
291e0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
291f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
29200 66 28 20 6e 4f 75 74 3d 3d 30 20 29 0a 23 65 6e  f( nOut==0 ).#en
29210 64 69 66 0a 20 20 20 20 20 20 20 20 7b 0a 20 20  dif.        {.  
29220 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f          pNew->nO
29230 75 74 20 2b 3d 20 28 70 50 72 6f 62 65 2d 3e 61  ut += (pProbe->a
29240 69 52 6f 77 4c 6f 67 45 73 74 5b 6e 45 71 5d 20  iRowLogEst[nEq] 
29250 2d 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77 4c  - pProbe->aiRowL
29260 6f 67 45 73 74 5b 6e 45 71 2d 31 5d 29 3b 0a 20  ogEst[nEq-1]);. 
29270 20 20 20 20 20 20 20 20 20 69 66 28 20 65 4f 70           if( eOp
29280 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 7b 0a   & WO_ISNULL ){.
29290 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
292a0 55 4e 49 4e 47 3a 20 49 66 20 74 68 65 72 65 20  UNING: If there 
292b0 69 73 20 6e 6f 20 6c 69 6b 65 6c 69 68 6f 6f 64  is no likelihood
292c0 28 29 20 76 61 6c 75 65 2c 20 61 73 73 75 6d 65  () value, assume
292d0 20 74 68 61 74 20 61 20 0a 20 20 20 20 20 20 20   that a .       
292e0 20 20 20 20 20 2a 2a 20 22 63 6f 6c 20 49 53 20       ** "col IS 
292f0 4e 55 4c 4c 22 20 65 78 70 72 65 73 73 69 6f 6e  NULL" expression
29300 20 6d 61 74 63 68 65 73 20 74 77 69 63 65 20 61   matches twice a
29310 73 20 6d 61 6e 79 20 72 6f 77 73 20 0a 20 20 20  s many rows .   
29320 20 20 20 20 20 20 20 20 20 2a 2a 20 61 73 20 28           ** as (
29330 63 6f 6c 3d 3f 29 2e 20 2a 2f 0a 20 20 20 20 20  col=?). */.     
29340 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75         pNew->nOu
29350 74 20 2b 3d 20 31 30 3b 0a 20 20 20 20 20 20 20  t += 10;.       
29360 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
29370 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
29380 20 20 2f 2a 20 53 65 74 20 72 43 6f 73 74 49 64    /* Set rCostId
29390 78 20 74 6f 20 74 68 65 20 63 6f 73 74 20 6f 66  x to the cost of
293a0 20 76 69 73 69 74 69 6e 67 20 73 65 6c 65 63 74   visiting select
293b0 65 64 20 72 6f 77 73 20 69 6e 20 69 6e 64 65 78  ed rows in index
293c0 2e 20 41 64 64 0a 20 20 20 20 2a 2a 20 69 74 20  . Add.    ** it 
293d0 74 6f 20 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 77  to pNew->rRun, w
293e0 68 69 63 68 20 69 73 20 63 75 72 72 65 6e 74 6c  hich is currentl
293f0 79 20 73 65 74 20 74 6f 20 74 68 65 20 63 6f 73  y set to the cos
29400 74 20 6f 66 20 74 68 65 20 69 6e 64 65 78 0a 20  t of the index. 
29410 20 20 20 2a 2a 20 73 65 65 6b 20 6f 6e 6c 79 2e     ** seek only.
29420 20 54 68 65 6e 2c 20 69 66 20 74 68 69 73 20 69   Then, if this i
29430 73 20 61 20 6e 6f 6e 2d 63 6f 76 65 72 69 6e 67  s a non-covering
29440 20 69 6e 64 65 78 2c 20 61 64 64 20 74 68 65 20   index, add the 
29450 63 6f 73 74 20 6f 66 0a 20 20 20 20 2a 2a 20 76  cost of.    ** v
29460 69 73 69 74 69 6e 67 20 74 68 65 20 72 6f 77 73  isiting the rows
29470 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 74 61 62   in the main tab
29480 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 72 43 6f 73  le.  */.    rCos
29490 74 49 64 78 20 3d 20 70 4e 65 77 2d 3e 6e 4f 75  tIdx = pNew->nOu
294a0 74 20 2b 20 31 20 2b 20 28 31 35 2a 70 50 72 6f  t + 1 + (15*pPro
294b0 62 65 2d 3e 73 7a 49 64 78 52 6f 77 29 2f 70 53  be->szIdxRow)/pS
294c0 72 63 2d 3e 70 54 61 62 2d 3e 73 7a 54 61 62 52  rc->pTab->szTabR
294d0 6f 77 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 72 52  ow;.    pNew->rR
294e0 75 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  un = sqlite3LogE
294f0 73 74 41 64 64 28 72 4c 6f 67 53 69 7a 65 2c 20  stAdd(rLogSize, 
29500 72 43 6f 73 74 49 64 78 29 3b 0a 20 20 20 20 69  rCostIdx);.    i
29510 66 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67  f( (pNew->wsFlag
29520 73 20 26 20 28 57 48 45 52 45 5f 49 44 58 5f 4f  s & (WHERE_IDX_O
29530 4e 4c 59 7c 57 48 45 52 45 5f 49 50 4b 29 29 3d  NLY|WHERE_IPK))=
29540 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77  =0 ){.      pNew
29550 2d 3e 72 52 75 6e 20 3d 20 73 71 6c 69 74 65 33  ->rRun = sqlite3
29560 4c 6f 67 45 73 74 41 64 64 28 70 4e 65 77 2d 3e  LogEstAdd(pNew->
29570 72 52 75 6e 2c 20 70 4e 65 77 2d 3e 6e 4f 75 74  rRun, pNew->nOut
29580 20 2b 20 31 36 29 3b 0a 20 20 20 20 7d 0a 20 20   + 16);.    }.  
29590 20 20 41 70 70 6c 79 43 6f 73 74 4d 75 6c 74 69    ApplyCostMulti
295a0 70 6c 69 65 72 28 70 4e 65 77 2d 3e 72 52 75 6e  plier(pNew->rRun
295b0 2c 20 70 50 72 6f 62 65 2d 3e 70 54 61 62 6c 65  , pProbe->pTable
295c0 2d 3e 63 6f 73 74 4d 75 6c 74 29 3b 0a 0a 20 20  ->costMult);..  
295d0 20 20 6e 4f 75 74 55 6e 61 64 6a 75 73 74 65 64    nOutUnadjusted
295e0 20 3d 20 70 4e 65 77 2d 3e 6e 4f 75 74 3b 0a 20   = pNew->nOut;. 
295f0 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 2b 3d     pNew->rRun +=
29600 20 6e 49 6e 4d 75 6c 20 2b 20 6e 49 6e 3b 0a 20   nInMul + nIn;. 
29610 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b 3d     pNew->nOut +=
29620 20 6e 49 6e 4d 75 6c 20 2b 20 6e 49 6e 3b 0a 20   nInMul + nIn;. 
29630 20 20 20 77 68 65 72 65 4c 6f 6f 70 4f 75 74 70     whereLoopOutp
29640 75 74 41 64 6a 75 73 74 28 70 42 75 69 6c 64 65  utAdjust(pBuilde
29650 72 2d 3e 70 57 43 2c 20 70 4e 65 77 2c 20 72 53  r->pWC, pNew, rS
29660 69 7a 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 77  ize);.    rc = w
29670 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70  hereLoopInsert(p
29680 42 75 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a  Builder, pNew);.
29690 0a 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 77  .    if( pNew->w
296a0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43  sFlags & WHERE_C
296b0 4f 4c 55 4d 4e 5f 52 41 4e 47 45 20 29 7b 0a 20  OLUMN_RANGE ){. 
296c0 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20       pNew->nOut 
296d0 3d 20 73 61 76 65 64 5f 6e 4f 75 74 3b 0a 20 20  = saved_nOut;.  
296e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
296f0 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 6e 4f 75 74  New->nOut = nOut
29700 55 6e 61 64 6a 75 73 74 65 64 3b 0a 20 20 20 20  Unadjusted;.    
29710 7d 0a 0a 20 20 20 20 69 66 28 20 28 70 4e 65 77  }..    if( (pNew
29720 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
29730 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 3d 3d 30 0a  E_TOP_LIMIT)==0.
29740 20 20 20 20 20 26 26 20 70 4e 65 77 2d 3e 75 2e       && pNew->u.
29750 62 74 72 65 65 2e 6e 45 71 3c 70 50 72 6f 62 65  btree.nEq<pProbe
29760 2d 3e 6e 43 6f 6c 75 6d 6e 0a 20 20 20 20 29 7b  ->nColumn.    ){
29770 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70  .      whereLoop
29780 41 64 64 42 74 72 65 65 49 6e 64 65 78 28 70 42  AddBtreeIndex(pB
29790 75 69 6c 64 65 72 2c 20 70 53 72 63 2c 20 70 50  uilder, pSrc, pP
297a0 72 6f 62 65 2c 20 6e 49 6e 4d 75 6c 2b 6e 49 6e  robe, nInMul+nIn
297b0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 65  );.    }.    pNe
297c0 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64 5f  w->nOut = saved_
297d0 6e 4f 75 74 3b 0a 23 69 66 64 65 66 20 53 51 4c  nOut;.#ifdef SQL
297e0 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
297f0 5f 4f 52 5f 53 54 41 54 34 0a 20 20 20 20 70 42  _OR_STAT4.    pB
29800 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69  uilder->nRecVali
29810 64 20 3d 20 6e 52 65 63 56 61 6c 69 64 3b 0a 23  d = nRecValid;.#
29820 65 6e 64 69 66 0a 20 20 7d 0a 20 20 70 4e 65 77  endif.  }.  pNew
29830 2d 3e 70 72 65 72 65 71 20 3d 20 73 61 76 65 64  ->prereq = saved
29840 5f 70 72 65 72 65 71 3b 0a 20 20 70 4e 65 77 2d  _prereq;.  pNew-
29850 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 73  >u.btree.nEq = s
29860 61 76 65 64 5f 6e 45 71 3b 0a 20 20 70 4e 65 77  aved_nEq;.  pNew
29870 2d 3e 75 2e 62 74 72 65 65 2e 6e 53 6b 69 70 20  ->u.btree.nSkip 
29880 3d 20 73 61 76 65 64 5f 6e 53 6b 69 70 3b 0a 20  = saved_nSkip;. 
29890 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d   pNew->wsFlags =
298a0 20 73 61 76 65 64 5f 77 73 46 6c 61 67 73 3b 0a   saved_wsFlags;.
298b0 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73    pNew->nOut = s
298c0 61 76 65 64 5f 6e 4f 75 74 3b 0a 20 20 70 4e 65  aved_nOut;.  pNe
298d0 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 73 61 76 65  w->nLTerm = save
298e0 64 5f 6e 4c 54 65 72 6d 3b 0a 20 20 72 65 74 75  d_nLTerm;.  retu
298f0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
29900 52 65 74 75 72 6e 20 54 72 75 65 20 69 66 20 69  Return True if i
29910 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 68  t is possible th
29920 61 74 20 70 49 6e 64 65 78 20 6d 69 67 68 74 20  at pIndex might 
29930 62 65 20 75 73 65 66 75 6c 20 69 6e 0a 2a 2a 20  be useful in.** 
29940 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68 65  implementing the
29950 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
29960 20 69 6e 20 70 42 75 69 6c 64 65 72 2e 0a 2a 2a   in pBuilder..**
29970 0a 2a 2a 20 52 65 74 75 72 6e 20 46 61 6c 73 65  .** Return False
29980 20 69 66 20 70 42 75 69 6c 64 65 72 20 64 6f 65   if pBuilder doe
29990 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 6e  s not contain an
299a0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
299b0 20 6f 72 0a 2a 2a 20 69 66 20 74 68 65 72 65 20   or.** if there 
299c0 69 73 20 6e 6f 20 77 61 79 20 66 6f 72 20 70 49  is no way for pI
299d0 6e 64 65 78 20 74 6f 20 62 65 20 75 73 65 66 75  ndex to be usefu
299e0 6c 20 69 6e 20 69 6d 70 6c 65 6d 65 6e 74 69 6e  l in implementin
299f0 67 20 74 68 61 74 0a 2a 2a 20 4f 52 44 45 52 20  g that.** ORDER 
29a00 42 59 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 73 74  BY clause..*/.st
29a10 61 74 69 63 20 69 6e 74 20 69 6e 64 65 78 4d 69  atic int indexMi
29a20 67 68 74 48 65 6c 70 57 69 74 68 4f 72 64 65 72  ghtHelpWithOrder
29a30 42 79 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42  By(.  WhereLoopB
29a40 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72  uilder *pBuilder
29a50 2c 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65  ,.  Index *pInde
29a60 78 2c 0a 20 20 69 6e 74 20 69 43 75 72 73 6f 72  x,.  int iCursor
29a70 0a 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  .){.  ExprList *
29a80 70 4f 42 3b 0a 20 20 69 6e 74 20 69 69 2c 20 6a  pOB;.  int ii, j
29a90 6a 3b 0a 0a 20 20 69 66 28 20 70 49 6e 64 65 78  j;..  if( pIndex
29aa0 2d 3e 62 55 6e 6f 72 64 65 72 65 64 20 29 20 72  ->bUnordered ) r
29ab0 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28  eturn 0;.  if( (
29ac0 70 4f 42 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  pOB = pBuilder->
29ad0 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79  pWInfo->pOrderBy
29ae0 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  )==0 ) return 0;
29af0 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c  .  for(ii=0; ii<
29b00 70 4f 42 2d 3e 6e 45 78 70 72 3b 20 69 69 2b 2b  pOB->nExpr; ii++
29b10 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78  ){.    Expr *pEx
29b20 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pr = sqlite3Expr
29b30 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4f 42 2d  SkipCollate(pOB-
29b40 3e 61 5b 69 69 5d 2e 70 45 78 70 72 29 3b 0a 20  >a[ii].pExpr);. 
29b50 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70     if( pExpr->op
29b60 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 72 65  !=TK_COLUMN ) re
29b70 74 75 72 6e 20 30 3b 0a 20 20 20 20 69 66 28 20  turn 0;.    if( 
29b80 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 69  pExpr->iTable==i
29b90 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20  Cursor ){.      
29ba0 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  if( pExpr->iColu
29bb0 6d 6e 3c 30 20 29 20 72 65 74 75 72 6e 20 31 3b  mn<0 ) return 1;
29bc0 0a 20 20 20 20 20 20 66 6f 72 28 6a 6a 3d 30 3b  .      for(jj=0;
29bd0 20 6a 6a 3c 70 49 6e 64 65 78 2d 3e 6e 4b 65 79   jj<pIndex->nKey
29be0 43 6f 6c 3b 20 6a 6a 2b 2b 29 7b 0a 20 20 20 20  Col; jj++){.    
29bf0 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69      if( pExpr->i
29c00 43 6f 6c 75 6d 6e 3d 3d 70 49 6e 64 65 78 2d 3e  Column==pIndex->
29c10 61 69 43 6f 6c 75 6d 6e 5b 6a 6a 5d 20 29 20 72  aiColumn[jj] ) r
29c20 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d  eturn 1;.      }
29c30 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
29c40 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
29c50 52 65 74 75 72 6e 20 61 20 62 69 74 6d 61 73 6b  Return a bitmask
29c60 20 77 68 65 72 65 20 31 73 20 69 6e 64 69 63 61   where 1s indica
29c70 74 65 20 74 68 61 74 20 74 68 65 20 63 6f 72 72  te that the corr
29c80 65 73 70 6f 6e 64 69 6e 67 20 63 6f 6c 75 6d 6e  esponding column
29c90 20 6f 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65   of.** the table
29ca0 20 69 73 20 75 73 65 64 20 62 79 20 61 6e 20 69   is used by an i
29cb0 6e 64 65 78 2e 20 20 4f 6e 6c 79 20 74 68 65 20  ndex.  Only the 
29cc0 66 69 72 73 74 20 36 33 20 63 6f 6c 75 6d 6e 73  first 63 columns
29cd0 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64 2e   are considered.
29ce0 0a 2a 2f 0a 73 74 61 74 69 63 20 42 69 74 6d 61  .*/.static Bitma
29cf0 73 6b 20 63 6f 6c 75 6d 6e 73 49 6e 49 6e 64 65  sk columnsInInde
29d00 78 28 49 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a  x(Index *pIdx){.
29d10 20 20 42 69 74 6d 61 73 6b 20 6d 20 3d 20 30 3b    Bitmask m = 0;
29d20 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 66 6f 72 28  .  int j;.  for(
29d30 6a 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 2d  j=pIdx->nColumn-
29d40 31 3b 20 6a 3e 3d 30 3b 20 6a 2d 2d 29 7b 0a 20  1; j>=0; j--){. 
29d50 20 20 20 69 6e 74 20 78 20 3d 20 70 49 64 78 2d     int x = pIdx-
29d60 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20  >aiColumn[j];.  
29d70 20 20 69 66 28 20 78 3e 3d 30 20 29 7b 0a 20 20    if( x>=0 ){.  
29d80 20 20 20 20 74 65 73 74 63 61 73 65 28 20 78 3d      testcase( x=
29d90 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20 20  =BMS-1 );.      
29da0 74 65 73 74 63 61 73 65 28 20 78 3d 3d 42 4d 53  testcase( x==BMS
29db0 2d 32 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  -2 );.      if( 
29dc0 78 3c 42 4d 53 2d 31 20 29 20 6d 20 7c 3d 20 4d  x<BMS-1 ) m |= M
29dd0 41 53 4b 42 49 54 28 78 29 3b 0a 20 20 20 20 7d  ASKBIT(x);.    }
29de0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d 3b  .  }.  return m;
29df0 0a 7d 0a 0a 2f 2a 20 43 68 65 63 6b 20 74 6f 20  .}../* Check to 
29e00 73 65 65 20 69 66 20 61 20 70 61 72 74 69 61 6c  see if a partial
29e10 20 69 6e 64 65 78 20 77 69 74 68 20 70 50 61 72   index with pPar
29e20 74 49 6e 64 65 78 57 68 65 72 65 20 63 61 6e 20  tIndexWhere can 
29e30 62 65 20 75 73 65 64 0a 2a 2a 20 69 6e 20 74 68  be used.** in th
29e40 65 20 63 75 72 72 65 6e 74 20 71 75 65 72 79 2e  e current query.
29e50 20 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66    Return true if
29e60 20 69 74 20 63 61 6e 20 62 65 20 61 6e 64 20 66   it can be and f
29e70 61 6c 73 65 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a  alse if not..*/.
29e80 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
29e90 55 73 61 62 6c 65 50 61 72 74 69 61 6c 49 6e 64  UsablePartialInd
29ea0 65 78 28 69 6e 74 20 69 54 61 62 2c 20 57 68 65  ex(int iTab, Whe
29eb0 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 45  reClause *pWC, E
29ec0 78 70 72 20 2a 70 57 68 65 72 65 29 7b 0a 20 20  xpr *pWhere){.  
29ed0 69 6e 74 20 69 3b 0a 20 20 57 68 65 72 65 54 65  int i;.  WhereTe
29ee0 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 66 6f 72  rm *pTerm;.  for
29ef0 28 69 3d 30 2c 20 70 54 65 72 6d 3d 70 57 43 2d  (i=0, pTerm=pWC-
29f00 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72 6d  >a; i<pWC->nTerm
29f10 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b  ; i++, pTerm++){
29f20 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
29f30 45 78 70 72 49 6d 70 6c 69 65 73 45 78 70 72 28  ExprImpliesExpr(
29f40 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 70 57  pTerm->pExpr, pW
29f50 68 65 72 65 2c 20 69 54 61 62 29 20 29 20 72 65  here, iTab) ) re
29f60 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65  turn 1;.  }.  re
29f70 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
29f80 20 41 64 64 20 61 6c 6c 20 57 68 65 72 65 4c 6f   Add all WhereLo
29f90 6f 70 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 61  op objects for a
29fa0 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 6f 66   single table of
29fb0 20 74 68 65 20 6a 6f 69 6e 20 77 68 65 72 65 20   the join where 
29fc0 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20 69 73 20  the table.** is 
29fd0 69 64 65 6e 66 69 65 64 20 62 79 20 70 42 75 69  idenfied by pBui
29fe0 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 69 54 61 62  lder->pNew->iTab
29ff0 2e 20 20 54 68 61 74 20 74 61 62 6c 65 20 69 73  .  That table is
2a000 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62   guaranteed to b
2a010 65 0a 2a 2a 20 61 20 62 2d 74 72 65 65 20 74 61  e.** a b-tree ta
2a020 62 6c 65 2c 20 6e 6f 74 20 61 20 76 69 72 74 75  ble, not a virtu
2a030 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  al table..**.** 
2a040 54 68 65 20 63 6f 73 74 73 20 28 57 68 65 72 65  The costs (Where
2a050 4c 6f 6f 70 2e 72 52 75 6e 29 20 6f 66 20 74 68  Loop.rRun) of th
2a060 65 20 62 2d 74 72 65 65 20 6c 6f 6f 70 73 20 61  e b-tree loops a
2a070 64 64 65 64 20 62 79 20 74 68 69 73 20 66 75 6e  dded by this fun
2a080 63 74 69 6f 6e 0a 2a 2a 20 61 72 65 20 63 61 6c  ction.** are cal
2a090 63 75 6c 61 74 65 64 20 61 73 20 66 6f 6c 6c 6f  culated as follo
2a0a0 77 73 3a 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20  ws:.**.** For a 
2a0b0 66 75 6c 6c 20 73 63 61 6e 2c 20 61 73 73 75 6d  full scan, assum
2a0c0 69 6e 67 20 74 68 65 20 74 61 62 6c 65 20 28 6f  ing the table (o
2a0d0 72 20 69 6e 64 65 78 29 20 63 6f 6e 74 61 69 6e  r index) contain
2a0e0 73 20 6e 52 6f 77 20 72 6f 77 73 3a 0a 2a 2a 0a  s nRow rows:.**.
2a0f0 2a 2a 20 20 20 20 20 63 6f 73 74 20 3d 20 6e 52  **     cost = nR
2a100 6f 77 20 2a 20 33 2e 30 20 20 20 20 20 20 20 20  ow * 3.0        
2a110 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 66              // f
2a120 75 6c 6c 2d 74 61 62 6c 65 20 73 63 61 6e 0a 2a  ull-table scan.*
2a130 2a 20 20 20 20 20 63 6f 73 74 20 3d 20 6e 52 6f  *     cost = nRo
2a140 77 20 2a 20 4b 20 20 20 20 20 20 20 20 20 20 20  w * K           
2a150 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 73 63             // sc
2a160 61 6e 20 6f 66 20 63 6f 76 65 72 69 6e 67 20 69  an of covering i
2a170 6e 64 65 78 0a 2a 2a 20 20 20 20 20 63 6f 73 74  ndex.**     cost
2a180 20 3d 20 6e 52 6f 77 20 2a 20 28 4b 2b 33 2e 30   = nRow * (K+3.0
2a190 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  )               
2a1a0 20 2f 2f 20 73 63 61 6e 20 6f 66 20 6e 6f 6e 2d   // scan of non-
2a1b0 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 0a 2a  covering index.*
2a1c0 2a 0a 2a 2a 20 77 68 65 72 65 20 4b 20 69 73 20  *.** where K is 
2a1d0 61 20 76 61 6c 75 65 20 62 65 74 77 65 65 6e 20  a value between 
2a1e0 31 2e 31 20 61 6e 64 20 33 2e 30 20 73 65 74 20  1.1 and 3.0 set 
2a1f0 62 61 73 65 64 20 6f 6e 20 74 68 65 20 72 65 6c  based on the rel
2a200 61 74 69 76 65 20 0a 2a 2a 20 65 73 74 69 6d 61  ative .** estima
2a210 74 65 64 20 61 76 65 72 61 67 65 20 73 69 7a 65  ted average size
2a220 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 61 6e   of the index an
2a230 64 20 74 61 62 6c 65 20 72 65 63 6f 72 64 73 2e  d table records.
2a240 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 6e 20 69 6e  .**.** For an in
2a250 64 65 78 20 73 63 61 6e 2c 20 77 68 65 72 65 20  dex scan, where 
2a260 6e 56 69 73 69 74 20 69 73 20 74 68 65 20 6e 75  nVisit is the nu
2a270 6d 62 65 72 20 6f 66 20 69 6e 64 65 78 20 72 6f  mber of index ro
2a280 77 73 20 76 69 73 69 74 65 64 0a 2a 2a 20 62 79  ws visited.** by
2a290 20 74 68 65 20 73 63 61 6e 2c 20 61 6e 64 20 6e   the scan, and n
2a2a0 53 65 65 6b 20 69 73 20 74 68 65 20 6e 75 6d 62  Seek is the numb
2a2b0 65 72 20 6f 66 20 73 65 65 6b 20 6f 70 65 72 61  er of seek opera
2a2c0 74 69 6f 6e 73 20 72 65 71 75 69 72 65 64 20 6f  tions required o
2a2d0 6e 20 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78 20  n .** the index 
2a2e0 62 2d 74 72 65 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  b-tree:.**.**   
2a2f0 20 20 63 6f 73 74 20 3d 20 6e 53 65 65 6b 20 2a    cost = nSeek *
2a300 20 28 6c 6f 67 28 6e 52 6f 77 29 20 2b 20 4b 20   (log(nRow) + K 
2a310 2a 20 6e 56 69 73 69 74 29 20 20 20 20 20 20 20  * nVisit)       
2a320 20 20 20 2f 2f 20 63 6f 76 65 72 69 6e 67 20 69     // covering i
2a330 6e 64 65 78 0a 2a 2a 20 20 20 20 20 63 6f 73 74  ndex.**     cost
2a340 20 3d 20 6e 53 65 65 6b 20 2a 20 28 6c 6f 67 28   = nSeek * (log(
2a350 6e 52 6f 77 29 20 2b 20 28 4b 2b 33 2e 30 29 20  nRow) + (K+3.0) 
2a360 2a 20 6e 56 69 73 69 74 29 20 20 20 20 2f 2f 20  * nVisit)    // 
2a370 6e 6f 6e 2d 63 6f 76 65 72 69 6e 67 20 69 6e 64  non-covering ind
2a380 65 78 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c  ex.**.** Normall
2a390 79 2c 20 6e 53 65 65 6b 20 69 73 20 31 2e 20 6e  y, nSeek is 1. n
2a3a0 53 65 65 6b 20 76 61 6c 75 65 73 20 67 72 65 61  Seek values grea
2a3b0 74 65 72 20 74 68 61 6e 20 31 20 63 6f 6d 65 20  ter than 1 come 
2a3c0 61 62 6f 75 74 20 69 66 20 74 68 65 20 0a 2a 2a  about if the .**
2a3d0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e   WHERE clause in
2a3e0 63 6c 75 64 65 73 20 22 78 20 49 4e 20 28 2e 2e  cludes "x IN (..
2a3f0 2e 2e 29 22 20 74 65 72 6d 73 20 75 73 65 64 20  ..)" terms used 
2a400 69 6e 20 70 6c 61 63 65 20 6f 66 20 22 78 3d 3f  in place of "x=?
2a410 22 2e 20 4f 72 20 77 68 65 6e 20 0a 2a 2a 20 69  ". Or when .** i
2a420 6d 70 6c 69 63 69 74 20 22 78 20 49 4e 20 28 53  mplicit "x IN (S
2a430 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 62 6c  ELECT x FROM tbl
2a440 29 22 20 74 65 72 6d 73 20 61 72 65 20 61 64 64  )" terms are add
2a450 65 64 20 66 6f 72 20 73 6b 69 70 2d 73 63 61 6e  ed for skip-scan
2a460 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 73 74  s..**.** The est
2a470 69 6d 61 74 65 64 20 76 61 6c 75 65 73 20 28 6e  imated values (n
2a480 52 6f 77 2c 20 6e 56 69 73 69 74 2c 20 6e 53 65  Row, nVisit, nSe
2a490 65 6b 29 20 6f 66 74 65 6e 20 63 6f 6e 74 61 69  ek) often contai
2a4a0 6e 20 61 20 6c 61 72 67 65 20 61 6d 6f 75 6e 74  n a large amount
2a4b0 0a 2a 2a 20 6f 66 20 75 6e 63 65 72 74 61 69 6e  .** of uncertain
2a4c0 74 79 2e 20 20 46 6f 72 20 74 68 69 73 20 72 65  ty.  For this re
2a4d0 61 73 6f 6e 2c 20 73 63 6f 72 69 6e 67 20 69 73  ason, scoring is
2a4e0 20 64 65 73 69 67 6e 65 64 20 74 6f 20 70 69 63   designed to pic
2a4f0 6b 20 70 6c 61 6e 73 20 74 68 61 74 0a 2a 2a 20  k plans that.** 
2a500 22 64 6f 20 74 68 65 20 6c 65 61 73 74 20 68 61  "do the least ha
2a510 72 6d 22 20 69 66 20 74 68 65 20 65 73 74 69 6d  rm" if the estim
2a520 61 74 65 73 20 61 72 65 20 69 6e 61 63 63 75 72  ates are inaccur
2a530 61 74 65 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c  ate.  For exampl
2a540 65 2c 20 61 0a 2a 2a 20 6c 6f 67 28 6e 52 6f 77  e, a.** log(nRow
2a550 29 20 66 61 63 74 6f 72 20 69 73 20 6f 6d 69 74  ) factor is omit
2a560 74 65 64 20 66 72 6f 6d 20 61 20 6e 6f 6e 2d 63  ted from a non-c
2a570 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20 73 63  overing index sc
2a580 61 6e 20 69 6e 20 6f 72 64 65 72 20 74 6f 0a 2a  an in order to.*
2a590 2a 20 62 69 61 73 20 74 68 65 20 73 63 6f 72 69  * bias the scori
2a5a0 6e 67 20 69 6e 20 66 61 76 6f 72 20 6f 66 20 75  ng in favor of u
2a5b0 73 69 6e 67 20 61 6e 20 69 6e 64 65 78 2c 20 73  sing an index, s
2a5c0 69 6e 63 65 20 74 68 65 20 77 6f 72 73 74 2d 63  ince the worst-c
2a5d0 61 73 65 0a 2a 2a 20 70 65 72 66 6f 72 6d 61 6e  ase.** performan
2a5e0 63 65 20 6f 66 20 75 73 69 6e 67 20 61 6e 20 69  ce of using an i
2a5f0 6e 64 65 78 20 69 73 20 66 61 72 20 62 65 74 74  ndex is far bett
2a600 65 72 20 74 68 61 6e 20 74 68 65 20 77 6f 72 73  er than the wors
2a610 74 2d 63 61 73 65 20 70 65 72 66 6f 72 6d 61 6e  t-case performan
2a620 63 65 0a 2a 2a 20 6f 66 20 61 20 66 75 6c 6c 20  ce.** of a full 
2a630 74 61 62 6c 65 20 73 63 61 6e 2e 0a 2a 2f 0a 73  table scan..*/.s
2a640 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c  tatic int whereL
2a650 6f 6f 70 41 64 64 42 74 72 65 65 28 0a 20 20 57  oopAddBtree(.  W
2a660 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20  hereLoopBuilder 
2a670 2a 70 42 75 69 6c 64 65 72 2c 20 2f 2a 20 57 48  *pBuilder, /* WH
2a680 45 52 45 20 63 6c 61 75 73 65 20 69 6e 66 6f 72  ERE clause infor
2a690 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 42 69 74 6d  mation */.  Bitm
2a6a0 61 73 6b 20 6d 45 78 74 72 61 20 20 20 20 20 20  ask mExtra      
2a6b0 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61          /* Extra
2a6c0 20 70 72 65 72 65 71 75 65 73 69 74 65 73 20 66   prerequesites f
2a6d0 6f 72 20 75 73 69 6e 67 20 74 68 69 73 20 74 61  or using this ta
2a6e0 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72  ble */.){.  Wher
2a6f0 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20  eInfo *pWInfo;  
2a700 20 20 20 20 20 20 20 20 2f 2a 20 57 48 45 52 45          /* WHERE
2a710 20 61 6e 61 6c 79 73 69 73 20 63 6f 6e 74 65 78   analysis contex
2a720 74 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 50  t */.  Index *pP
2a730 72 6f 62 65 3b 20 20 20 20 20 20 20 20 20 20 20  robe;           
2a740 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 77     /* An index w
2a750 65 20 61 72 65 20 65 76 61 6c 75 61 74 69 6e 67  e are evaluating
2a760 20 2a 2f 0a 20 20 49 6e 64 65 78 20 73 50 6b 3b   */.  Index sPk;
2a770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a780 20 20 2f 2a 20 41 20 66 61 6b 65 20 69 6e 64 65    /* A fake inde
2a790 78 20 6f 62 6a 65 63 74 20 66 6f 72 20 74 68 65  x object for the
2a7a0 20 70 72 69 6d 61 72 79 20 6b 65 79 20 2a 2f 0a   primary key */.
2a7b0 20 20 4c 6f 67 45 73 74 20 61 69 52 6f 77 45 73    LogEst aiRowEs
2a7c0 74 50 6b 5b 32 5d 3b 20 20 20 20 20 20 20 2f 2a  tPk[2];       /*
2a7d0 20 54 68 65 20 61 69 52 6f 77 4c 6f 67 45 73 74   The aiRowLogEst
2a7e0 5b 5d 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  [] value for the
2a7f0 20 73 50 6b 20 69 6e 64 65 78 20 2a 2f 0a 20 20   sPk index */.  
2a800 69 31 36 20 61 69 43 6f 6c 75 6d 6e 50 6b 20 3d  i16 aiColumnPk =
2a810 20 2d 31 3b 20 20 20 20 20 20 20 20 2f 2a 20 54   -1;        /* T
2a820 68 65 20 61 43 6f 6c 75 6d 6e 5b 5d 20 76 61 6c  he aColumn[] val
2a830 75 65 20 66 6f 72 20 74 68 65 20 73 50 6b 20 69  ue for the sPk i
2a840 6e 64 65 78 20 2a 2f 0a 20 20 53 72 63 4c 69 73  ndex */.  SrcLis
2a850 74 20 2a 70 54 61 62 4c 69 73 74 3b 20 20 20 20  t *pTabList;    
2a860 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f        /* The FRO
2a870 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74  M clause */.  st
2a880 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
2a890 6d 20 2a 70 53 72 63 3b 20 20 2f 2a 20 54 68 65  m *pSrc;  /* The
2a8a0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 62 74 72   FROM clause btr
2a8b0 65 65 20 74 65 72 6d 20 74 6f 20 61 64 64 20 2a  ee term to add *
2a8c0 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  /.  WhereLoop *p
2a8d0 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20  New;            
2a8e0 2f 2a 20 54 65 6d 70 6c 61 74 65 20 57 68 65 72  /* Template Wher
2a8f0 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 2a 2f 0a  eLoop object */.
2a900 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
2a910 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 2f 2a  E_OK;         /*
2a920 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
2a930 20 20 69 6e 74 20 69 53 6f 72 74 49 64 78 20 3d    int iSortIdx =
2a940 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   1;           /*
2a950 20 49 6e 64 65 78 20 6e 75 6d 62 65 72 20 2a 2f   Index number */
2a960 0a 20 20 69 6e 74 20 62 3b 20 20 20 20 20 20 20  .  int b;       
2a970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a980 2a 20 41 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75  * A boolean valu
2a990 65 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 72 53  e */.  LogEst rS
2a9a0 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
2a9b0 20 20 20 2f 2a 20 6e 75 6d 62 65 72 20 6f 66 20     /* number of 
2a9c0 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c  rows in the tabl
2a9d0 65 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 72 4c  e */.  LogEst rL
2a9e0 6f 67 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  ogSize;         
2a9f0 20 20 20 2f 2a 20 4c 6f 67 61 72 69 74 68 6d 20     /* Logarithm 
2aa00 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  of the number of
2aa10 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62   rows in the tab
2aa20 6c 65 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61  le */.  WhereCla
2aa30 75 73 65 20 2a 70 57 43 3b 20 20 20 20 20 20 20  use *pWC;       
2aa40 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65      /* The parse
2aa50 64 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  d WHERE clause *
2aa60 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  /.  Table *pTab;
2aa70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aa80 2f 2a 20 54 61 62 6c 65 20 62 65 69 6e 67 20 71  /* Table being q
2aa90 75 65 72 69 65 64 20 2a 2f 0a 20 20 0a 20 20 70  ueried */.  .  p
2aaa0 4e 65 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  New = pBuilder->
2aab0 70 4e 65 77 3b 0a 20 20 70 57 49 6e 66 6f 20 3d  pNew;.  pWInfo =
2aac0 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66   pBuilder->pWInf
2aad0 6f 3b 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20  o;.  pTabList = 
2aae0 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
2aaf0 3b 0a 20 20 70 53 72 63 20 3d 20 70 54 61 62 4c  ;.  pSrc = pTabL
2ab00 69 73 74 2d 3e 61 20 2b 20 70 4e 65 77 2d 3e 69  ist->a + pNew->i
2ab10 54 61 62 3b 0a 20 20 70 54 61 62 20 3d 20 70 53  Tab;.  pTab = pS
2ab20 72 63 2d 3e 70 54 61 62 3b 0a 20 20 70 57 43 20  rc->pTab;.  pWC 
2ab30 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 3b  = pBuilder->pWC;
2ab40 0a 20 20 61 73 73 65 72 74 28 20 21 49 73 56 69  .  assert( !IsVi
2ab50 72 74 75 61 6c 28 70 53 72 63 2d 3e 70 54 61 62  rtual(pSrc->pTab
2ab60 29 20 29 3b 0a 0a 20 20 69 66 28 20 70 53 72 63  ) );..  if( pSrc
2ab70 2d 3e 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20  ->pIndex ){.    
2ab80 2f 2a 20 41 6e 20 49 4e 44 45 58 45 44 20 42 59  /* An INDEXED BY
2ab90 20 63 6c 61 75 73 65 20 73 70 65 63 69 66 69 65   clause specifie
2aba0 73 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 69  s a particular i
2abb0 6e 64 65 78 20 74 6f 20 75 73 65 20 2a 2f 0a 20  ndex to use */. 
2abc0 20 20 20 70 50 72 6f 62 65 20 3d 20 70 53 72 63     pProbe = pSrc
2abd0 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 7d 65 6c 73  ->pIndex;.  }els
2abe0 65 20 69 66 28 20 21 48 61 73 52 6f 77 69 64 28  e if( !HasRowid(
2abf0 70 54 61 62 29 20 29 7b 0a 20 20 20 20 70 50 72  pTab) ){.    pPr
2ac00 6f 62 65 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64  obe = pTab->pInd
2ac10 65 78 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ex;.  }else{.   
2ac20 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 20   /* There is no 
2ac30 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73  INDEXED BY claus
2ac40 65 2e 20 20 43 72 65 61 74 65 20 61 20 66 61 6b  e.  Create a fak
2ac50 65 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 69  e Index object i
2ac60 6e 20 6c 6f 63 61 6c 0a 20 20 20 20 2a 2a 20 76  n local.    ** v
2ac70 61 72 69 61 62 6c 65 20 73 50 6b 20 74 6f 20 72  ariable sPk to r
2ac80 65 70 72 65 73 65 6e 74 20 74 68 65 20 72 6f 77  epresent the row
2ac90 69 64 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69  id primary key i
2aca0 6e 64 65 78 2e 20 20 4d 61 6b 65 20 74 68 69 73  ndex.  Make this
2acb0 0a 20 20 20 20 2a 2a 20 66 61 6b 65 20 69 6e 64  .    ** fake ind
2acc0 65 78 20 74 68 65 20 66 69 72 73 74 20 69 6e 20  ex the first in 
2acd0 61 20 63 68 61 69 6e 20 6f 66 20 49 6e 64 65 78  a chain of Index
2ace0 20 6f 62 6a 65 63 74 73 20 77 69 74 68 20 61 6c   objects with al
2acf0 6c 20 6f 66 20 74 68 65 20 72 65 61 6c 0a 20 20  l of the real.  
2ad00 20 20 2a 2a 20 69 6e 64 69 63 65 73 20 74 6f 20    ** indices to 
2ad10 66 6f 6c 6c 6f 77 20 2a 2f 0a 20 20 20 20 49 6e  follow */.    In
2ad20 64 65 78 20 2a 70 46 69 72 73 74 3b 20 20 20 20  dex *pFirst;    
2ad30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2ad40 20 46 69 72 73 74 20 6f 66 20 72 65 61 6c 20 69   First of real i
2ad50 6e 64 69 63 65 73 20 6f 6e 20 74 68 65 20 74 61  ndices on the ta
2ad60 62 6c 65 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65  ble */.    memse
2ad70 74 28 26 73 50 6b 2c 20 30 2c 20 73 69 7a 65 6f  t(&sPk, 0, sizeo
2ad80 66 28 49 6e 64 65 78 29 29 3b 0a 20 20 20 20 73  f(Index));.    s
2ad90 50 6b 2e 6e 4b 65 79 43 6f 6c 20 3d 20 31 3b 0a  Pk.nKeyCol = 1;.
2ada0 20 20 20 20 73 50 6b 2e 6e 43 6f 6c 75 6d 6e 20      sPk.nColumn 
2adb0 3d 20 31 3b 0a 20 20 20 20 73 50 6b 2e 61 69 43  = 1;.    sPk.aiC
2adc0 6f 6c 75 6d 6e 20 3d 20 26 61 69 43 6f 6c 75 6d  olumn = &aiColum
2add0 6e 50 6b 3b 0a 20 20 20 20 73 50 6b 2e 61 69 52  nPk;.    sPk.aiR
2ade0 6f 77 4c 6f 67 45 73 74 20 3d 20 61 69 52 6f 77  owLogEst = aiRow
2adf0 45 73 74 50 6b 3b 0a 20 20 20 20 73 50 6b 2e 6f  EstPk;.    sPk.o
2ae00 6e 45 72 72 6f 72 20 3d 20 4f 45 5f 52 65 70 6c  nError = OE_Repl
2ae10 61 63 65 3b 0a 20 20 20 20 73 50 6b 2e 70 54 61  ace;.    sPk.pTa
2ae20 62 6c 65 20 3d 20 70 54 61 62 3b 0a 20 20 20 20  ble = pTab;.    
2ae30 73 50 6b 2e 73 7a 49 64 78 52 6f 77 20 3d 20 70  sPk.szIdxRow = p
2ae40 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 3b 0a 20  Tab->szTabRow;. 
2ae50 20 20 20 61 69 52 6f 77 45 73 74 50 6b 5b 30 5d     aiRowEstPk[0]
2ae60 20 3d 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67   = pTab->nRowLog
2ae70 45 73 74 3b 0a 20 20 20 20 61 69 52 6f 77 45 73  Est;.    aiRowEs
2ae80 74 50 6b 5b 31 5d 20 3d 20 30 3b 0a 20 20 20 20  tPk[1] = 0;.    
2ae90 70 46 69 72 73 74 20 3d 20 70 53 72 63 2d 3e 70  pFirst = pSrc->p
2aea0 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20  Tab->pIndex;.   
2aeb0 20 69 66 28 20 70 53 72 63 2d 3e 6e 6f 74 49 6e   if( pSrc->notIn
2aec0 64 65 78 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20  dexed==0 ){.    
2aed0 20 20 2f 2a 20 54 68 65 20 72 65 61 6c 20 69 6e    /* The real in
2aee0 64 69 63 65 73 20 6f 66 20 74 68 65 20 74 61 62  dices of the tab
2aef0 6c 65 20 61 72 65 20 6f 6e 6c 79 20 63 6f 6e 73  le are only cons
2af00 69 64 65 72 65 64 20 69 66 20 74 68 65 0a 20 20  idered if the.  
2af10 20 20 20 20 2a 2a 20 4e 4f 54 20 49 4e 44 45 58      ** NOT INDEX
2af20 45 44 20 71 75 61 6c 69 66 69 65 72 20 69 73 20  ED qualifier is 
2af30 6f 6d 69 74 74 65 64 20 66 72 6f 6d 20 74 68 65  omitted from the
2af40 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a   FROM clause */.
2af50 20 20 20 20 20 20 73 50 6b 2e 70 4e 65 78 74 20        sPk.pNext 
2af60 3d 20 70 46 69 72 73 74 3b 0a 20 20 20 20 7d 0a  = pFirst;.    }.
2af70 20 20 20 20 70 50 72 6f 62 65 20 3d 20 26 73 50      pProbe = &sP
2af80 6b 3b 0a 20 20 7d 0a 20 20 72 53 69 7a 65 20 3d  k;.  }.  rSize =
2af90 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73   pTab->nRowLogEs
2afa0 74 3b 0a 20 20 72 4c 6f 67 53 69 7a 65 20 3d 20  t;.  rLogSize = 
2afb0 65 73 74 4c 6f 67 28 72 53 69 7a 65 29 3b 0a 0a  estLog(rSize);..
2afc0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2afd0 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e  MIT_AUTOMATIC_IN
2afe0 44 45 58 0a 20 20 2f 2a 20 41 75 74 6f 6d 61 74  DEX.  /* Automat
2aff0 69 63 20 69 6e 64 65 78 65 73 20 2a 2f 0a 20 20  ic indexes */.  
2b000 69 66 28 20 21 70 42 75 69 6c 64 65 72 2d 3e 70  if( !pBuilder->p
2b010 4f 72 53 65 74 0a 20 20 20 26 26 20 28 70 57 49  OrSet.   && (pWI
2b020 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2d  nfo->pParse->db-
2b030 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
2b040 41 75 74 6f 49 6e 64 65 78 29 21 3d 30 0a 20 20  AutoIndex)!=0.  
2b050 20 26 26 20 70 53 72 63 2d 3e 70 49 6e 64 65 78   && pSrc->pIndex
2b060 3d 3d 30 0a 20 20 20 26 26 20 21 70 53 72 63 2d  ==0.   && !pSrc-
2b070 3e 76 69 61 43 6f 72 6f 75 74 69 6e 65 0a 20 20  >viaCoroutine.  
2b080 20 26 26 20 21 70 53 72 63 2d 3e 6e 6f 74 49 6e   && !pSrc->notIn
2b090 64 65 78 65 64 0a 20 20 20 26 26 20 48 61 73 52  dexed.   && HasR
2b0a0 6f 77 69 64 28 70 54 61 62 29 0a 20 20 20 26 26  owid(pTab).   &&
2b0b0 20 21 70 53 72 63 2d 3e 69 73 43 6f 72 72 65 6c   !pSrc->isCorrel
2b0c0 61 74 65 64 0a 20 20 20 26 26 20 21 70 53 72 63  ated.   && !pSrc
2b0d0 2d 3e 69 73 52 65 63 75 72 73 69 76 65 0a 20 20  ->isRecursive.  
2b0e0 29 7b 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72 61  ){.    /* Genera
2b0f0 74 65 20 61 75 74 6f 2d 69 6e 64 65 78 20 57 68  te auto-index Wh
2b100 65 72 65 4c 6f 6f 70 73 20 2a 2f 0a 20 20 20 20  ereLoops */.    
2b110 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
2b120 3b 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20  ;.    WhereTerm 
2b130 2a 70 57 43 45 6e 64 20 3d 20 70 57 43 2d 3e 61  *pWCEnd = pWC->a
2b140 20 2b 20 70 57 43 2d 3e 6e 54 65 72 6d 3b 0a 20   + pWC->nTerm;. 
2b150 20 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43     for(pTerm=pWC
2b160 2d 3e 61 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ->a; rc==SQLITE_
2b170 4f 4b 20 26 26 20 70 54 65 72 6d 3c 70 57 43 45  OK && pTerm<pWCE
2b180 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20  nd; pTerm++){.  
2b190 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 70      if( pTerm->p
2b1a0 72 65 72 65 71 52 69 67 68 74 20 26 20 70 4e 65  rereqRight & pNe
2b1b0 77 2d 3e 6d 61 73 6b 53 65 6c 66 20 29 20 63 6f  w->maskSelf ) co
2b1c0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66  ntinue;.      if
2b1d0 28 20 74 65 72 6d 43 61 6e 44 72 69 76 65 49 6e  ( termCanDriveIn
2b1e0 64 65 78 28 70 54 65 72 6d 2c 20 70 53 72 63 2c  dex(pTerm, pSrc,
2b1f0 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70   0) ){.        p
2b200 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
2b210 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 4e   = 1;.        pN
2b220 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 53 6b 69  ew->u.btree.nSki
2b230 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70  p = 0;.        p
2b240 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  New->u.btree.pIn
2b250 64 65 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  dex = 0;.       
2b260 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20   pNew->nLTerm = 
2b270 31 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  1;.        pNew-
2b280 3e 61 4c 54 65 72 6d 5b 30 5d 20 3d 20 70 54 65  >aLTerm[0] = pTe
2b290 72 6d 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54  rm;.        /* T
2b2a0 55 4e 49 4e 47 3a 20 4f 6e 65 2d 74 69 6d 65 20  UNING: One-time 
2b2b0 63 6f 73 74 20 66 6f 72 20 63 6f 6d 70 75 74 69  cost for computi
2b2c0 6e 67 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63  ng the automatic
2b2d0 20 69 6e 64 65 78 20 69 73 0a 20 20 20 20 20 20   index is.      
2b2e0 20 20 2a 2a 20 65 73 74 69 6d 61 74 65 64 20 74    ** estimated t
2b2f0 6f 20 62 65 20 58 2a 4e 2a 6c 6f 67 32 28 4e 29  o be X*N*log2(N)
2b300 20 77 68 65 72 65 20 4e 20 69 73 20 74 68 65 20   where N is the 
2b310 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69  number of rows i
2b320 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  n.        ** the
2b330 20 74 61 62 6c 65 20 62 65 69 6e 67 20 69 6e 64   table being ind
2b340 65 78 65 64 20 61 6e 64 20 77 68 65 72 65 20 58  exed and where X
2b350 20 69 73 20 37 20 28 4c 6f 67 45 73 74 3d 32 38   is 7 (LogEst=28
2b360 29 20 66 6f 72 20 6e 6f 72 6d 61 6c 0a 20 20 20  ) for normal.   
2b370 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 73 20 6f       ** tables o
2b380 72 20 31 2e 33 37 35 20 28 4c 6f 67 45 73 74 3d  r 1.375 (LogEst=
2b390 34 29 20 66 6f 72 20 76 69 65 77 73 20 61 6e 64  4) for views and
2b3a0 20 73 75 62 71 75 65 72 69 65 73 2e 20 20 54 68   subqueries.  Th
2b3b0 65 20 76 61 6c 75 65 0a 20 20 20 20 20 20 20 20  e value.        
2b3c0 2a 2a 20 6f 66 20 58 20 69 73 20 73 6d 61 6c 6c  ** of X is small
2b3d0 65 72 20 66 6f 72 20 76 69 65 77 73 20 61 6e 64  er for views and
2b3e0 20 73 75 62 71 75 65 72 69 65 73 20 73 6f 20 74   subqueries so t
2b3f0 68 61 74 20 74 68 65 20 71 75 65 72 79 20 70 6c  hat the query pl
2b400 61 6e 6e 65 72 0a 20 20 20 20 20 20 20 20 2a 2a  anner.        **
2b410 20 77 69 6c 6c 20 62 65 20 6d 6f 72 65 20 61 67   will be more ag
2b420 67 72 65 73 73 69 76 65 20 61 62 6f 75 74 20 67  gressive about g
2b430 65 6e 65 72 61 74 69 6e 67 20 61 75 74 6f 6d 61  enerating automa
2b440 74 69 63 20 69 6e 64 65 78 65 73 20 66 6f 72 0a  tic indexes for.
2b450 20 20 20 20 20 20 20 20 2a 2a 20 74 68 6f 73 65          ** those
2b460 20 6f 62 6a 65 63 74 73 2c 20 73 69 6e 63 65 20   objects, since 
2b470 74 68 65 72 65 20 69 73 20 6e 6f 20 6f 70 70 6f  there is no oppo
2b480 72 74 75 6e 69 74 79 20 74 6f 20 61 64 64 20 73  rtunity to add s
2b490 63 68 65 6d 61 0a 20 20 20 20 20 20 20 20 2a 2a  chema.        **
2b4a0 20 69 6e 64 65 78 65 73 20 6f 6e 20 73 75 62 71   indexes on subq
2b4b0 75 65 72 69 65 73 20 61 6e 64 20 76 69 65 77 73  ueries and views
2b4c0 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65  . */.        pNe
2b4d0 77 2d 3e 72 53 65 74 75 70 20 3d 20 72 4c 6f 67  w->rSetup = rLog
2b4e0 53 69 7a 65 20 2b 20 72 53 69 7a 65 20 2b 20 34  Size + rSize + 4
2b4f0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54  ;.        if( pT
2b500 61 62 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 26  ab->pSelect==0 &
2b510 26 20 28 70 54 61 62 2d 3e 74 61 62 46 6c 61 67  & (pTab->tabFlag
2b520 73 20 26 20 54 46 5f 45 70 68 65 6d 65 72 61 6c  s & TF_Ephemeral
2b530 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
2b540 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 2b    pNew->rSetup +
2b550 3d 20 32 34 3b 0a 20 20 20 20 20 20 20 20 7d 0a  = 24;.        }.
2b560 20 20 20 20 20 20 20 20 41 70 70 6c 79 43 6f 73          ApplyCos
2b570 74 4d 75 6c 74 69 70 6c 69 65 72 28 70 4e 65 77  tMultiplier(pNew
2b580 2d 3e 72 53 65 74 75 70 2c 20 70 54 61 62 2d 3e  ->rSetup, pTab->
2b590 63 6f 73 74 4d 75 6c 74 29 3b 0a 20 20 20 20 20  costMult);.     
2b5a0 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 45 61     /* TUNING: Ea
2b5b0 63 68 20 69 6e 64 65 78 20 6c 6f 6f 6b 75 70 20  ch index lookup 
2b5c0 79 69 65 6c 64 73 20 32 30 20 72 6f 77 73 20 69  yields 20 rows i
2b5d0 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20 54 68  n the table.  Th
2b5e0 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73  is.        ** is
2b5f0 20 6d 6f 72 65 20 74 68 61 6e 20 74 68 65 20 75   more than the u
2b600 73 75 61 6c 20 67 75 65 73 73 20 6f 66 20 31 30  sual guess of 10
2b610 20 72 6f 77 73 2c 20 73 69 6e 63 65 20 77 65 20   rows, since we 
2b620 68 61 76 65 20 6e 6f 20 77 61 79 0a 20 20 20 20  have no way.    
2b630 20 20 20 20 2a 2a 20 6f 66 20 6b 6e 6f 77 69 6e      ** of knowin
2b640 67 20 68 6f 77 20 73 65 6c 65 63 74 69 76 65 20  g how selective 
2b650 74 68 65 20 69 6e 64 65 78 20 77 69 6c 6c 20 75  the index will u
2b660 6c 74 69 6d 61 74 65 6c 79 20 62 65 2e 20 20 49  ltimately be.  I
2b670 74 20 77 6f 75 6c 64 0a 20 20 20 20 20 20 20 20  t would.        
2b680 2a 2a 20 6e 6f 74 20 62 65 20 75 6e 72 65 61 73  ** not be unreas
2b690 6f 6e 61 62 6c 65 20 74 6f 20 6d 61 6b 65 20 74  onable to make t
2b6a0 68 69 73 20 76 61 6c 75 65 20 6d 75 63 68 20 6c  his value much l
2b6b0 61 72 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  arger. */.      
2b6c0 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 34    pNew->nOut = 4
2b6d0 33 3b 20 20 61 73 73 65 72 74 28 20 34 33 3d 3d  3;  assert( 43==
2b6e0 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 32 30  sqlite3LogEst(20
2b6f0 29 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  ) );.        pNe
2b700 77 2d 3e 72 52 75 6e 20 3d 20 73 71 6c 69 74 65  w->rRun = sqlite
2b710 33 4c 6f 67 45 73 74 41 64 64 28 72 4c 6f 67 53  3LogEstAdd(rLogS
2b720 69 7a 65 2c 70 4e 65 77 2d 3e 6e 4f 75 74 29 3b  ize,pNew->nOut);
2b730 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 77  .        pNew->w
2b740 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 41  sFlags = WHERE_A
2b750 55 54 4f 5f 49 4e 44 45 58 3b 0a 20 20 20 20 20  UTO_INDEX;.     
2b760 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20     pNew->prereq 
2b770 3d 20 6d 45 78 74 72 61 20 7c 20 70 54 65 72 6d  = mExtra | pTerm
2b780 2d 3e 70 72 65 72 65 71 52 69 67 68 74 3b 0a 20  ->prereqRight;. 
2b790 20 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72         rc = wher
2b7a0 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69  eLoopInsert(pBui
2b7b0 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20  lder, pNew);.   
2b7c0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23     }.    }.  }.#
2b7d0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
2b7e0 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49  OMIT_AUTOMATIC_I
2b7f0 4e 44 45 58 20 2a 2f 0a 0a 20 20 2f 2a 20 4c 6f  NDEX */..  /* Lo
2b800 6f 70 20 6f 76 65 72 20 61 6c 6c 20 69 6e 64 69  op over all indi
2b810 63 65 73 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 3b  ces.  */.  for(;
2b820 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
2b830 26 20 70 50 72 6f 62 65 3b 20 70 50 72 6f 62 65  & pProbe; pProbe
2b840 3d 70 50 72 6f 62 65 2d 3e 70 4e 65 78 74 2c 20  =pProbe->pNext, 
2b850 69 53 6f 72 74 49 64 78 2b 2b 29 7b 0a 20 20 20  iSortIdx++){.   
2b860 20 69 66 28 20 70 50 72 6f 62 65 2d 3e 70 50 61   if( pProbe->pPa
2b870 72 74 49 64 78 57 68 65 72 65 21 3d 30 0a 20 20  rtIdxWhere!=0.  
2b880 20 20 20 26 26 20 21 77 68 65 72 65 55 73 61 62     && !whereUsab
2b890 6c 65 50 61 72 74 69 61 6c 49 6e 64 65 78 28 70  lePartialIndex(p
2b8a0 53 72 63 2d 3e 69 43 75 72 73 6f 72 2c 20 70 57  Src->iCursor, pW
2b8b0 43 2c 20 70 50 72 6f 62 65 2d 3e 70 50 61 72 74  C, pProbe->pPart
2b8c0 49 64 78 57 68 65 72 65 29 20 29 7b 0a 20 20 20  IdxWhere) ){.   
2b8d0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4e 65     testcase( pNe
2b8e0 77 2d 3e 69 54 61 62 21 3d 70 53 72 63 2d 3e 69  w->iTab!=pSrc->i
2b8f0 43 75 72 73 6f 72 20 29 3b 20 20 2f 2a 20 53 65  Cursor );  /* Se
2b900 65 20 74 69 63 6b 65 74 20 5b 39 38 64 39 37 33  e ticket [98d973
2b910 62 38 66 35 5d 20 2a 2f 0a 20 20 20 20 20 20 63  b8f5] */.      c
2b920 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 50 61 72  ontinue;  /* Par
2b930 74 69 61 6c 20 69 6e 64 65 78 20 69 6e 61 70 70  tial index inapp
2b940 72 6f 70 72 69 61 74 65 20 66 6f 72 20 74 68 69  ropriate for thi
2b950 73 20 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 7d  s query */.    }
2b960 0a 20 20 20 20 72 53 69 7a 65 20 3d 20 70 50 72  .    rSize = pPr
2b970 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74  obe->aiRowLogEst
2b980 5b 30 5d 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75  [0];.    pNew->u
2b990 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 30 3b 0a  .btree.nEq = 0;.
2b9a0 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65      pNew->u.btre
2b9b0 65 2e 6e 53 6b 69 70 20 3d 20 30 3b 0a 20 20 20  e.nSkip = 0;.   
2b9c0 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20   pNew->nLTerm = 
2b9d0 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 53 6f  0;.    pNew->iSo
2b9e0 72 74 49 64 78 20 3d 20 30 3b 0a 20 20 20 20 70  rtIdx = 0;.    p
2b9f0 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b  New->rSetup = 0;
2ba00 0a 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65  .    pNew->prere
2ba10 71 20 3d 20 6d 45 78 74 72 61 3b 0a 20 20 20 20  q = mExtra;.    
2ba20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 72 53 69  pNew->nOut = rSi
2ba30 7a 65 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e  ze;.    pNew->u.
2ba40 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 70  btree.pIndex = p
2ba50 50 72 6f 62 65 3b 0a 20 20 20 20 62 20 3d 20 69  Probe;.    b = i
2ba60 6e 64 65 78 4d 69 67 68 74 48 65 6c 70 57 69 74  ndexMightHelpWit
2ba70 68 4f 72 64 65 72 42 79 28 70 42 75 69 6c 64 65  hOrderBy(pBuilde
2ba80 72 2c 20 70 50 72 6f 62 65 2c 20 70 53 72 63 2d  r, pProbe, pSrc-
2ba90 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 2f  >iCursor);.    /
2baa0 2a 20 54 68 65 20 4f 4e 45 50 41 53 53 5f 44 45  * The ONEPASS_DE
2bab0 53 49 52 45 44 20 66 6c 61 67 73 20 6e 65 76 65  SIRED flags neve
2bac0 72 20 6f 63 63 75 72 73 20 74 6f 67 65 74 68 65  r occurs togethe
2bad0 72 20 77 69 74 68 20 4f 52 44 45 52 20 42 59 20  r with ORDER BY 
2bae0 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  */.    assert( (
2baf0 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
2bb00 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41  gs & WHERE_ONEPA
2bb10 53 53 5f 44 45 53 49 52 45 44 29 3d 3d 30 20 7c  SS_DESIRED)==0 |
2bb20 7c 20 62 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66  | b==0 );.    if
2bb30 28 20 70 50 72 6f 62 65 2d 3e 74 6e 75 6d 3c 3d  ( pProbe->tnum<=
2bb40 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e  0 ){.      /* In
2bb50 74 65 67 65 72 20 70 72 69 6d 61 72 79 20 6b 65  teger primary ke
2bb60 79 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20  y index */.     
2bb70 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d   pNew->wsFlags =
2bb80 20 57 48 45 52 45 5f 49 50 4b 3b 0a 0a 20 20 20   WHERE_IPK;..   
2bb90 20 20 20 2f 2a 20 46 75 6c 6c 20 74 61 62 6c 65     /* Full table
2bba0 20 73 63 61 6e 20 2a 2f 0a 20 20 20 20 20 20 70   scan */.      p
2bbb0 4e 65 77 2d 3e 69 53 6f 72 74 49 64 78 20 3d 20  New->iSortIdx = 
2bbc0 62 20 3f 20 69 53 6f 72 74 49 64 78 20 3a 20 30  b ? iSortIdx : 0
2bbd0 3b 0a 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e  ;.      /* TUNIN
2bbe0 47 3a 20 43 6f 73 74 20 6f 66 20 66 75 6c 6c 20  G: Cost of full 
2bbf0 74 61 62 6c 65 20 73 63 61 6e 20 69 73 20 28 4e  table scan is (N
2bc00 2a 33 2e 30 29 2e 20 2a 2f 0a 20 20 20 20 20 20  *3.0). */.      
2bc10 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 72 53 69  pNew->rRun = rSi
2bc20 7a 65 20 2b 20 31 36 3b 0a 20 20 20 20 20 20 41  ze + 16;.      A
2bc30 70 70 6c 79 43 6f 73 74 4d 75 6c 74 69 70 6c 69  pplyCostMultipli
2bc40 65 72 28 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 70  er(pNew->rRun, p
2bc50 54 61 62 2d 3e 63 6f 73 74 4d 75 6c 74 29 3b 0a  Tab->costMult);.
2bc60 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 4f        whereLoopO
2bc70 75 74 70 75 74 41 64 6a 75 73 74 28 70 57 43 2c  utputAdjust(pWC,
2bc80 20 70 4e 65 77 2c 20 72 53 69 7a 65 29 3b 0a 20   pNew, rSize);. 
2bc90 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c       rc = whereL
2bca0 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64  oopInsert(pBuild
2bcb0 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20  er, pNew);.     
2bcc0 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 72 53   pNew->nOut = rS
2bcd0 69 7a 65 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ize;.      if( r
2bce0 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  c ) break;.    }
2bcf0 65 6c 73 65 7b 0a 20 20 20 20 20 20 42 69 74 6d  else{.      Bitm
2bd00 61 73 6b 20 6d 3b 0a 20 20 20 20 20 20 69 66 28  ask m;.      if(
2bd10 20 70 50 72 6f 62 65 2d 3e 69 73 43 6f 76 65 72   pProbe->isCover
2bd20 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ing ){.        p
2bd30 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57  New->wsFlags = W
2bd40 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20 7c 20  HERE_IDX_ONLY | 
2bd50 57 48 45 52 45 5f 49 4e 44 45 58 45 44 3b 0a 20  WHERE_INDEXED;. 
2bd60 20 20 20 20 20 20 20 6d 20 3d 20 30 3b 0a 20 20         m = 0;.  
2bd70 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2bd80 20 20 20 6d 20 3d 20 70 53 72 63 2d 3e 63 6f 6c     m = pSrc->col
2bd90 55 73 65 64 20 26 20 7e 63 6f 6c 75 6d 6e 73 49  Used & ~columnsI
2bda0 6e 49 6e 64 65 78 28 70 50 72 6f 62 65 29 3b 0a  nIndex(pProbe);.
2bdb0 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73          pNew->ws
2bdc0 46 6c 61 67 73 20 3d 20 28 6d 3d 3d 30 29 20 3f  Flags = (m==0) ?
2bdd0 20 28 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59   (WHERE_IDX_ONLY
2bde0 7c 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 20  |WHERE_INDEXED) 
2bdf0 3a 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 3b  : WHERE_INDEXED;
2be00 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
2be10 2f 2a 20 46 75 6c 6c 20 73 63 61 6e 20 76 69 61  /* Full scan via
2be20 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20   index */.      
2be30 69 66 28 20 62 0a 20 20 20 20 20 20 20 7c 7c 20  if( b.       || 
2be40 21 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 0a  !HasRowid(pTab).
2be50 20 20 20 20 20 20 20 7c 7c 20 28 20 6d 3d 3d 30         || ( m==0
2be60 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 50 72  .         && pPr
2be70 6f 62 65 2d 3e 62 55 6e 6f 72 64 65 72 65 64 3d  obe->bUnordered=
2be80 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  =0.         && (
2be90 70 50 72 6f 62 65 2d 3e 73 7a 49 64 78 52 6f 77  pProbe->szIdxRow
2bea0 3c 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 29  <pTab->szTabRow)
2beb0 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 70 57  .         && (pW
2bec0 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
2bed0 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53   & WHERE_ONEPASS
2bee0 5f 44 45 53 49 52 45 44 29 3d 3d 30 0a 20 20 20  _DESIRED)==0.   
2bef0 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
2bf00 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 55 73  GlobalConfig.bUs
2bf10 65 43 69 73 0a 20 20 20 20 20 20 20 20 20 26 26  eCis.         &&
2bf20 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61   OptimizationEna
2bf30 62 6c 65 64 28 70 57 49 6e 66 6f 2d 3e 70 50 61  bled(pWInfo->pPa
2bf40 72 73 65 2d 3e 64 62 2c 20 53 51 4c 49 54 45 5f  rse->db, SQLITE_
2bf50 43 6f 76 65 72 49 64 78 53 63 61 6e 29 0a 20 20  CoverIdxScan).  
2bf60 20 20 20 20 20 20 20 20 29 0a 20 20 20 20 20 20          ).      
2bf70 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  ){.        pNew-
2bf80 3e 69 53 6f 72 74 49 64 78 20 3d 20 62 20 3f 20  >iSortIdx = b ? 
2bf90 69 53 6f 72 74 49 64 78 20 3a 20 30 3b 0a 0a 20  iSortIdx : 0;.. 
2bfa0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f         /* The co
2bfb0 73 74 20 6f 66 20 76 69 73 69 74 69 6e 67 20 74  st of visiting t
2bfc0 68 65 20 69 6e 64 65 78 20 72 6f 77 73 20 69 73  he index rows is
2bfd0 20 4e 2a 4b 2c 20 77 68 65 72 65 20 4b 20 69 73   N*K, where K is
2bfe0 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 65 74 77  .        ** betw
2bff0 65 65 6e 20 31 2e 31 20 61 6e 64 20 33 2e 30 2c  een 1.1 and 3.0,
2c000 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68   depending on th
2c010 65 20 72 65 6c 61 74 69 76 65 20 73 69 7a 65 73  e relative sizes
2c020 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20 20   of the.        
2c030 2a 2a 20 69 6e 64 65 78 20 61 6e 64 20 74 61 62  ** index and tab
2c040 6c 65 20 72 6f 77 73 2e 20 49 66 20 74 68 69 73  le rows. If this
2c050 20 69 73 20 61 20 6e 6f 6e 2d 63 6f 76 65 72 69   is a non-coveri
2c060 6e 67 20 69 6e 64 65 78 20 73 63 61 6e 2c 0a 20  ng index scan,. 
2c070 20 20 20 20 20 20 20 2a 2a 20 61 6c 73 6f 20 61         ** also a
2c080 64 64 20 74 68 65 20 63 6f 73 74 20 6f 66 20 76  dd the cost of v
2c090 69 73 69 74 69 6e 67 20 74 61 62 6c 65 20 72 6f  isiting table ro
2c0a0 77 73 20 28 4e 2a 33 2e 30 29 2e 20 20 2a 2f 0a  ws (N*3.0).  */.
2c0b0 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52          pNew->rR
2c0c0 75 6e 20 3d 20 72 53 69 7a 65 20 2b 20 31 20 2b  un = rSize + 1 +
2c0d0 20 28 31 35 2a 70 50 72 6f 62 65 2d 3e 73 7a 49   (15*pProbe->szI
2c0e0 64 78 52 6f 77 29 2f 70 54 61 62 2d 3e 73 7a 54  dxRow)/pTab->szT
2c0f0 61 62 52 6f 77 3b 0a 20 20 20 20 20 20 20 20 69  abRow;.        i
2c100 66 28 20 6d 21 3d 30 20 29 7b 0a 20 20 20 20 20  f( m!=0 ){.     
2c110 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20       pNew->rRun 
2c120 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41  = sqlite3LogEstA
2c130 64 64 28 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 72  dd(pNew->rRun, r
2c140 53 69 7a 65 2b 31 36 29 3b 0a 20 20 20 20 20 20  Size+16);.      
2c150 20 20 7d 0a 20 20 20 20 20 20 20 20 41 70 70 6c    }.        Appl
2c160 79 43 6f 73 74 4d 75 6c 74 69 70 6c 69 65 72 28  yCostMultiplier(
2c170 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 70 54 61 62  pNew->rRun, pTab
2c180 2d 3e 63 6f 73 74 4d 75 6c 74 29 3b 0a 20 20 20  ->costMult);.   
2c190 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 4f 75       whereLoopOu
2c1a0 74 70 75 74 41 64 6a 75 73 74 28 70 57 43 2c 20  tputAdjust(pWC, 
2c1b0 70 4e 65 77 2c 20 72 53 69 7a 65 29 3b 0a 20 20  pNew, rSize);.  
2c1c0 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65        rc = where
2c1d0 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c  LoopInsert(pBuil
2c1e0 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20  der, pNew);.    
2c1f0 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d      pNew->nOut =
2c200 20 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20   rSize;.        
2c210 69 66 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a  if( rc ) break;.
2c220 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
2c230 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f     rc = whereLoo
2c240 70 41 64 64 42 74 72 65 65 49 6e 64 65 78 28 70  pAddBtreeIndex(p
2c250 42 75 69 6c 64 65 72 2c 20 70 53 72 63 2c 20 70  Builder, pSrc, p
2c260 50 72 6f 62 65 2c 20 30 29 3b 0a 23 69 66 64 65  Probe, 0);.#ifde
2c270 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
2c280 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20  STAT3_OR_STAT4. 
2c290 20 20 20 73 71 6c 69 74 65 33 53 74 61 74 34 50     sqlite3Stat4P
2c2a0 72 6f 62 65 46 72 65 65 28 70 42 75 69 6c 64 65  robeFree(pBuilde
2c2b0 72 2d 3e 70 52 65 63 29 3b 0a 20 20 20 20 70 42  r->pRec);.    pB
2c2c0 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69  uilder->nRecVali
2c2d0 64 20 3d 20 30 3b 0a 20 20 20 20 70 42 75 69 6c  d = 0;.    pBuil
2c2e0 64 65 72 2d 3e 70 52 65 63 20 3d 20 30 3b 0a 23  der->pRec = 0;.#
2c2f0 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49 66  endif..    /* If
2c300 20 74 68 65 72 65 20 77 61 73 20 61 6e 20 49 4e   there was an IN
2c310 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 2c  DEXED BY clause,
2c320 20 74 68 65 6e 20 6f 6e 6c 79 20 74 68 61 74 20   then only that 
2c330 6f 6e 65 20 69 6e 64 65 78 20 69 73 0a 20 20 20  one index is.   
2c340 20 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 2e 20   ** considered. 
2c350 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 72 63 2d  */.    if( pSrc-
2c360 3e 70 49 6e 64 65 78 20 29 20 62 72 65 61 6b 3b  >pIndex ) break;
2c370 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
2c380 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
2c390 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
2c3a0 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 41 64 64 20  TABLE./*.** Add 
2c3b0 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62  all WhereLoop ob
2c3c0 6a 65 63 74 73 20 66 6f 72 20 61 20 74 61 62 6c  jects for a tabl
2c3d0 65 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 69 64  e of the join id
2c3e0 65 6e 74 69 66 69 65 64 20 62 79 0a 2a 2a 20 70  entified by.** p
2c3f0 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 69  Builder->pNew->i
2c400 54 61 62 2e 20 20 54 68 61 74 20 74 61 62 6c 65  Tab.  That table
2c410 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
2c420 6f 20 62 65 20 61 20 76 69 72 74 75 61 6c 20 74  o be a virtual t
2c430 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  able..*/.static 
2c440 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  int whereLoopAdd
2c450 56 69 72 74 75 61 6c 28 0a 20 20 57 68 65 72 65  Virtual(.  Where
2c460 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75  LoopBuilder *pBu
2c470 69 6c 64 65 72 2c 20 20 2f 2a 20 57 48 45 52 45  ilder,  /* WHERE
2c480 20 63 6c 61 75 73 65 20 69 6e 66 6f 72 6d 61 74   clause informat
2c490 69 6f 6e 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  ion */.  Bitmask
2c4a0 20 6d 45 78 74 72 61 0a 29 7b 0a 20 20 57 68 65   mExtra.){.  Whe
2c4b0 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20  reInfo *pWInfo; 
2c4c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 48 45            /* WHE
2c4d0 52 45 20 61 6e 61 6c 79 73 69 73 20 63 6f 6e 74  RE analysis cont
2c4e0 65 78 74 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a  ext */.  Parse *
2c4f0 70 50 61 72 73 65 3b 20 20 20 20 20 20 20 20 20  pParse;         
2c500 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
2c510 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
2c520 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
2c530 57 43 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  WC;            /
2c540 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
2c550 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  se */.  struct S
2c560 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72  rcList_item *pSr
2c570 63 3b 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d  c;   /* The FROM
2c580 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74 6f 20   clause term to 
2c590 73 65 61 72 63 68 20 2a 2f 0a 20 20 54 61 62 6c  search */.  Tabl
2c5a0 65 20 2a 70 54 61 62 3b 0a 20 20 73 71 6c 69 74  e *pTab;.  sqlit
2c5b0 65 33 20 2a 64 62 3b 0a 20 20 73 71 6c 69 74 65  e3 *db;.  sqlite
2c5c0 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49  3_index_info *pI
2c5d0 64 78 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74  dxInfo;.  struct
2c5e0 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63   sqlite3_index_c
2c5f0 6f 6e 73 74 72 61 69 6e 74 20 2a 70 49 64 78 43  onstraint *pIdxC
2c600 6f 6e 73 3b 0a 20 20 73 74 72 75 63 74 20 73 71  ons;.  struct sq
2c610 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
2c620 74 72 61 69 6e 74 5f 75 73 61 67 65 20 2a 70 55  traint_usage *pU
2c630 73 61 67 65 3b 0a 20 20 57 68 65 72 65 54 65 72  sage;.  WhereTer
2c640 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 69 6e 74 20  m *pTerm;.  int 
2c650 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 69 54 65 72  i, j;.  int iTer
2c660 6d 2c 20 6d 78 54 65 72 6d 3b 0a 20 20 69 6e 74  m, mxTerm;.  int
2c670 20 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20   nConstraint;.  
2c680 69 6e 74 20 73 65 65 6e 49 6e 20 3d 20 30 3b 20  int seenIn = 0; 
2c690 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2c6a0 54 72 75 65 20 69 66 20 61 6e 20 49 4e 20 6f 70  True if an IN op
2c6b0 65 72 61 74 6f 72 20 69 73 20 73 65 65 6e 20 2a  erator is seen *
2c6c0 2f 0a 20 20 69 6e 74 20 73 65 65 6e 56 61 72 20  /.  int seenVar 
2c6d0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
2c6e0 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 6e 6f   /* True if a no
2c6f0 6e 2d 63 6f 6e 73 74 61 6e 74 20 63 6f 6e 73 74  n-constant const
2c700 72 61 69 6e 74 20 69 73 20 73 65 65 6e 20 2a 2f  raint is seen */
2c710 0a 20 20 69 6e 74 20 69 50 68 61 73 65 3b 20 20  .  int iPhase;  
2c720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c730 2f 2a 20 30 3a 20 63 6f 6e 73 74 20 77 2f 6f 20  /* 0: const w/o 
2c740 49 4e 2c 20 31 3a 20 63 6f 6e 73 74 2c 20 32 3a  IN, 1: const, 2:
2c750 20 6e 6f 20 49 4e 2c 20 20 32 3a 20 49 4e 20 2a   no IN,  2: IN *
2c760 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  /.  WhereLoop *p
2c770 4e 65 77 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  New;.  int rc = 
2c780 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 70 57  SQLITE_OK;..  pW
2c790 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d  Info = pBuilder-
2c7a0 3e 70 57 49 6e 66 6f 3b 0a 20 20 70 50 61 72 73  >pWInfo;.  pPars
2c7b0 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72  e = pWInfo->pPar
2c7c0 73 65 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73  se;.  db = pPars
2c7d0 65 2d 3e 64 62 3b 0a 20 20 70 57 43 20 3d 20 70  e->db;.  pWC = p
2c7e0 42 75 69 6c 64 65 72 2d 3e 70 57 43 3b 0a 20 20  Builder->pWC;.  
2c7f0 70 4e 65 77 20 3d 20 70 42 75 69 6c 64 65 72 2d  pNew = pBuilder-
2c800 3e 70 4e 65 77 3b 0a 20 20 70 53 72 63 20 3d 20  >pNew;.  pSrc = 
2c810 26 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73  &pWInfo->pTabLis
2c820 74 2d 3e 61 5b 70 4e 65 77 2d 3e 69 54 61 62 5d  t->a[pNew->iTab]
2c830 3b 0a 20 20 70 54 61 62 20 3d 20 70 53 72 63 2d  ;.  pTab = pSrc-
2c840 3e 70 54 61 62 3b 0a 20 20 61 73 73 65 72 74 28  >pTab;.  assert(
2c850 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29   IsVirtual(pTab)
2c860 20 29 3b 0a 20 20 70 49 64 78 49 6e 66 6f 20 3d   );.  pIdxInfo =
2c870 20 61 6c 6c 6f 63 61 74 65 49 6e 64 65 78 49 6e   allocateIndexIn
2c880 66 6f 28 70 50 61 72 73 65 2c 20 70 57 43 2c 20  fo(pParse, pWC, 
2c890 70 53 72 63 2c 20 70 42 75 69 6c 64 65 72 2d 3e  pSrc, pBuilder->
2c8a0 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 69 66 28  pOrderBy);.  if(
2c8b0 20 70 49 64 78 49 6e 66 6f 3d 3d 30 20 29 20 72   pIdxInfo==0 ) r
2c8c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
2c8d0 45 4d 3b 0a 20 20 70 4e 65 77 2d 3e 70 72 65 72  EM;.  pNew->prer
2c8e0 65 71 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  eq = 0;.  pNew->
2c8f0 72 53 65 74 75 70 20 3d 20 30 3b 0a 20 20 70 4e  rSetup = 0;.  pN
2c900 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48  ew->wsFlags = WH
2c910 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  ERE_VIRTUALTABLE
2c920 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d  ;.  pNew->nLTerm
2c930 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e   = 0;.  pNew->u.
2c940 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3d 20  vtab.needFree = 
2c950 30 3b 0a 20 20 70 55 73 61 67 65 20 3d 20 70 49  0;.  pUsage = pI
2c960 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61  dxInfo->aConstra
2c970 69 6e 74 55 73 61 67 65 3b 0a 20 20 6e 43 6f 6e  intUsage;.  nCon
2c980 73 74 72 61 69 6e 74 20 3d 20 70 49 64 78 49 6e  straint = pIdxIn
2c990 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b  fo->nConstraint;
2c9a0 0a 20 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70  .  if( whereLoop
2c9b0 52 65 73 69 7a 65 28 64 62 2c 20 70 4e 65 77 2c  Resize(db, pNew,
2c9c0 20 6e 43 6f 6e 73 74 72 61 69 6e 74 29 20 29 7b   nConstraint) ){
2c9d0 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
2c9e0 65 65 28 64 62 2c 20 70 49 64 78 49 6e 66 6f 29  ee(db, pIdxInfo)
2c9f0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
2ca00 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a  ITE_NOMEM;.  }..
2ca10 20 20 66 6f 72 28 69 50 68 61 73 65 3d 30 3b 20    for(iPhase=0; 
2ca20 69 50 68 61 73 65 3c 3d 33 3b 20 69 50 68 61 73  iPhase<=3; iPhas
2ca30 65 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 21 73  e++){.    if( !s
2ca40 65 65 6e 49 6e 20 26 26 20 28 69 50 68 61 73 65  eenIn && (iPhase
2ca50 26 31 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  &1)!=0 ){.      
2ca60 69 50 68 61 73 65 2b 2b 3b 0a 20 20 20 20 20 20  iPhase++;.      
2ca70 69 66 28 20 69 50 68 61 73 65 3e 33 20 29 20 62  if( iPhase>3 ) b
2ca80 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
2ca90 69 66 28 20 21 73 65 65 6e 56 61 72 20 26 26 20  if( !seenVar && 
2caa0 69 50 68 61 73 65 3e 31 20 29 20 62 72 65 61 6b  iPhase>1 ) break
2cab0 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 20 3d  ;.    pIdxCons =
2cac0 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74 65   *(struct sqlite
2cad0 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69  3_index_constrai
2cae0 6e 74 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e  nt**)&pIdxInfo->
2caf0 61 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 20  aConstraint;.   
2cb00 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78   for(i=0; i<pIdx
2cb10 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e  Info->nConstrain
2cb20 74 3b 20 69 2b 2b 2c 20 70 49 64 78 43 6f 6e 73  t; i++, pIdxCons
2cb30 2b 2b 29 7b 0a 20 20 20 20 20 20 6a 20 3d 20 70  ++){.      j = p
2cb40 49 64 78 43 6f 6e 73 2d 3e 69 54 65 72 6d 4f 66  IdxCons->iTermOf
2cb50 66 73 65 74 3b 0a 20 20 20 20 20 20 70 54 65 72  fset;.      pTer
2cb60 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 6a 5d 3b 0a  m = &pWC->a[j];.
2cb70 20 20 20 20 20 20 73 77 69 74 63 68 28 20 69 50        switch( iP
2cb80 68 61 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20  hase ){.        
2cb90 63 61 73 65 20 30 3a 20 20 20 20 2f 2a 20 43 6f  case 0:    /* Co
2cba0 6e 73 74 61 6e 74 73 20 77 69 74 68 6f 75 74 20  nstants without 
2cbb0 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  IN operator */. 
2cbc0 20 20 20 20 20 20 20 20 20 70 49 64 78 43 6f 6e           pIdxCon
2cbd0 73 2d 3e 75 73 61 62 6c 65 20 3d 20 30 3b 0a 20  s->usable = 0;. 
2cbe0 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70 54           if( (pT
2cbf0 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
2cc00 20 57 4f 5f 49 4e 29 21 3d 30 20 29 7b 0a 20 20   WO_IN)!=0 ){.  
2cc10 20 20 20 20 20 20 20 20 20 20 73 65 65 6e 49 6e            seenIn
2cc20 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
2cc30 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  }.          if( 
2cc40 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
2cc50 68 74 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ht!=0 ){.       
2cc60 20 20 20 20 20 73 65 65 6e 56 61 72 20 3d 20 31       seenVar = 1
2cc70 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
2cc80 65 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f  e if( (pTerm->eO
2cc90 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 29  perator & WO_IN)
2cca0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
2ccb0 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61     pIdxCons->usa
2ccc0 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ble = 1;.       
2ccd0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 62     }.          b
2cce0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61  reak;.        ca
2ccf0 73 65 20 31 3a 20 20 20 20 2f 2a 20 43 6f 6e 73  se 1:    /* Cons
2cd00 74 61 6e 74 73 20 77 69 74 68 20 49 4e 20 6f 70  tants with IN op
2cd10 65 72 61 74 6f 72 73 20 2a 2f 0a 20 20 20 20 20  erators */.     
2cd20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 65 65       assert( see
2cd30 6e 49 6e 20 29 3b 0a 20 20 20 20 20 20 20 20 20  nIn );.         
2cd40 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c   pIdxCons->usabl
2cd50 65 20 3d 20 28 70 54 65 72 6d 2d 3e 70 72 65 72  e = (pTerm->prer
2cd60 65 71 52 69 67 68 74 3d 3d 30 29 3b 0a 20 20 20  eqRight==0);.   
2cd70 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
2cd80 20 20 20 20 20 20 63 61 73 65 20 32 3a 20 20 20        case 2:   
2cd90 20 2f 2a 20 56 61 72 69 61 62 6c 65 73 20 77 69   /* Variables wi
2cda0 74 68 6f 75 74 20 49 4e 20 2a 2f 0a 20 20 20 20  thout IN */.    
2cdb0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 65        assert( se
2cdc0 65 6e 56 61 72 20 29 3b 0a 20 20 20 20 20 20 20  enVar );.       
2cdd0 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61     pIdxCons->usa
2cde0 62 6c 65 20 3d 20 28 70 54 65 72 6d 2d 3e 65 4f  ble = (pTerm->eO
2cdf0 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 29  perator & WO_IN)
2ce00 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20 20 20 62  ==0;.          b
2ce10 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 64 65  reak;.        de
2ce20 66 61 75 6c 74 3a 20 20 20 2f 2a 20 56 61 72 69  fault:   /* Vari
2ce30 61 62 6c 65 73 20 77 69 74 68 20 49 4e 20 2a 2f  ables with IN */
2ce40 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
2ce50 74 28 20 73 65 65 6e 56 61 72 20 26 26 20 73 65  t( seenVar && se
2ce60 65 6e 49 6e 20 29 3b 0a 20 20 20 20 20 20 20 20  enIn );.        
2ce70 20 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62    pIdxCons->usab
2ce80 6c 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  le = 1;.        
2ce90 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
2cea0 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65  .    }.    memse
2ceb0 74 28 70 55 73 61 67 65 2c 20 30 2c 20 73 69 7a  t(pUsage, 0, siz
2cec0 65 6f 66 28 70 55 73 61 67 65 5b 30 5d 29 2a 70  eof(pUsage[0])*p
2ced0 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72  IdxInfo->nConstr
2cee0 61 69 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 70  aint);.    if( p
2cef0 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46  IdxInfo->needToF
2cf00 72 65 65 49 64 78 53 74 72 20 29 20 73 71 6c 69  reeIdxStr ) sqli
2cf10 74 65 33 5f 66 72 65 65 28 70 49 64 78 49 6e 66  te3_free(pIdxInf
2cf20 6f 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20 20 20  o->idxStr);.    
2cf30 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72  pIdxInfo->idxStr
2cf40 20 3d 20 30 3b 0a 20 20 20 20 70 49 64 78 49 6e   = 0;.    pIdxIn
2cf50 66 6f 2d 3e 69 64 78 4e 75 6d 20 3d 20 30 3b 0a  fo->idxNum = 0;.
2cf60 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65      pIdxInfo->ne
2cf70 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 20 3d  edToFreeIdxStr =
2cf80 20 30 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f   0;.    pIdxInfo
2cf90 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65  ->orderByConsume
2cfa0 64 20 3d 20 30 3b 0a 20 20 20 20 70 49 64 78 49  d = 0;.    pIdxI
2cfb0 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f  nfo->estimatedCo
2cfc0 73 74 20 3d 20 53 51 4c 49 54 45 5f 42 49 47 5f  st = SQLITE_BIG_
2cfd0 44 42 4c 20 2f 20 28 64 6f 75 62 6c 65 29 32 3b  DBL / (double)2;
2cfe0 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65  .    pIdxInfo->e
2cff0 73 74 69 6d 61 74 65 64 52 6f 77 73 20 3d 20 32  stimatedRows = 2
2d000 35 3b 0a 20 20 20 20 72 63 20 3d 20 76 74 61 62  5;.    rc = vtab
2d010 42 65 73 74 49 6e 64 65 78 28 70 50 61 72 73 65  BestIndex(pParse
2d020 2c 20 70 54 61 62 2c 20 70 49 64 78 49 6e 66 6f  , pTab, pIdxInfo
2d030 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
2d040 67 6f 74 6f 20 77 68 65 72 65 4c 6f 6f 70 41 64  goto whereLoopAd
2d050 64 56 74 61 62 5f 65 78 69 74 3b 0a 20 20 20 20  dVtab_exit;.    
2d060 70 49 64 78 43 6f 6e 73 20 3d 20 2a 28 73 74 72  pIdxCons = *(str
2d070 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
2d080 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 2a 29 26  x_constraint**)&
2d090 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74  pIdxInfo->aConst
2d0a0 72 61 69 6e 74 3b 0a 20 20 20 20 70 4e 65 77 2d  raint;.    pNew-
2d0b0 3e 70 72 65 72 65 71 20 3d 20 6d 45 78 74 72 61  >prereq = mExtra
2d0c0 3b 0a 20 20 20 20 6d 78 54 65 72 6d 20 3d 20 2d  ;.    mxTerm = -
2d0d0 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  1;.    assert( p
2d0e0 4e 65 77 2d 3e 6e 4c 53 6c 6f 74 3e 3d 6e 43 6f  New->nLSlot>=nCo
2d0f0 6e 73 74 72 61 69 6e 74 20 29 3b 0a 20 20 20 20  nstraint );.    
2d100 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6e 73  for(i=0; i<nCons
2d110 74 72 61 69 6e 74 3b 20 69 2b 2b 29 20 70 4e 65  traint; i++) pNe
2d120 77 2d 3e 61 4c 54 65 72 6d 5b 69 5d 20 3d 20 30  w->aLTerm[i] = 0
2d130 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74  ;.    pNew->u.vt
2d140 61 62 2e 6f 6d 69 74 4d 61 73 6b 20 3d 20 30 3b  ab.omitMask = 0;
2d150 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
2d160 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b  nConstraint; i++
2d170 2c 20 70 49 64 78 43 6f 6e 73 2b 2b 29 7b 0a 20  , pIdxCons++){. 
2d180 20 20 20 20 20 69 66 28 20 28 69 54 65 72 6d 20       if( (iTerm 
2d190 3d 20 70 55 73 61 67 65 5b 69 5d 2e 61 72 67 76  = pUsage[i].argv
2d1a0 49 6e 64 65 78 20 2d 20 31 29 3e 3d 30 20 29 7b  Index - 1)>=0 ){
2d1b0 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 70 49 64  .        j = pId
2d1c0 78 43 6f 6e 73 2d 3e 69 54 65 72 6d 4f 66 66 73  xCons->iTermOffs
2d1d0 65 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  et;.        if( 
2d1e0 69 54 65 72 6d 3e 3d 6e 43 6f 6e 73 74 72 61 69  iTerm>=nConstrai
2d1f0 6e 74 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 6a  nt.         || j
2d200 3c 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 6a  <0.         || j
2d210 3e 3d 70 57 43 2d 3e 6e 54 65 72 6d 0a 20 20 20  >=pWC->nTerm.   
2d220 20 20 20 20 20 20 7c 7c 20 70 4e 65 77 2d 3e 61        || pNew->a
2d230 4c 54 65 72 6d 5b 69 54 65 72 6d 5d 21 3d 30 0a  LTerm[iTerm]!=0.
2d240 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
2d250 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
2d260 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20  _ERROR;.        
2d270 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
2d280 67 28 70 50 61 72 73 65 2c 20 22 25 73 2e 78 42  g(pParse, "%s.xB
2d290 65 73 74 49 6e 64 65 78 28 29 20 6d 61 6c 66 75  estIndex() malfu
2d2a0 6e 63 74 69 6f 6e 22 2c 20 70 54 61 62 2d 3e 7a  nction", pTab->z
2d2b0 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Name);.         
2d2c0 20 67 6f 74 6f 20 77 68 65 72 65 4c 6f 6f 70 41   goto whereLoopA
2d2d0 64 64 56 74 61 62 5f 65 78 69 74 3b 0a 20 20 20  ddVtab_exit;.   
2d2e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 74       }.        t
2d2f0 65 73 74 63 61 73 65 28 20 69 54 65 72 6d 3d 3d  estcase( iTerm==
2d300 6e 43 6f 6e 73 74 72 61 69 6e 74 2d 31 20 29 3b  nConstraint-1 );
2d310 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
2d320 65 28 20 6a 3d 3d 30 20 29 3b 0a 20 20 20 20 20  e( j==0 );.     
2d330 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 3d 3d     testcase( j==
2d340 70 57 43 2d 3e 6e 54 65 72 6d 2d 31 20 29 3b 0a  pWC->nTerm-1 );.
2d350 20 20 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20          pTerm = 
2d360 26 70 57 43 2d 3e 61 5b 6a 5d 3b 0a 20 20 20 20  &pWC->a[j];.    
2d370 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71      pNew->prereq
2d380 20 7c 3d 20 70 54 65 72 6d 2d 3e 70 72 65 72 65   |= pTerm->prere
2d390 71 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20  qRight;.        
2d3a0 61 73 73 65 72 74 28 20 69 54 65 72 6d 3c 70 4e  assert( iTerm<pN
2d3b0 65 77 2d 3e 6e 4c 53 6c 6f 74 20 29 3b 0a 20 20  ew->nLSlot );.  
2d3c0 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65        pNew->aLTe
2d3d0 72 6d 5b 69 54 65 72 6d 5d 20 3d 20 70 54 65 72  rm[iTerm] = pTer
2d3e0 6d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  m;.        if( i
2d3f0 54 65 72 6d 3e 6d 78 54 65 72 6d 20 29 20 6d 78  Term>mxTerm ) mx
2d400 54 65 72 6d 20 3d 20 69 54 65 72 6d 3b 0a 20 20  Term = iTerm;.  
2d410 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2d420 69 54 65 72 6d 3d 3d 31 35 20 29 3b 0a 20 20 20  iTerm==15 );.   
2d430 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
2d440 54 65 72 6d 3d 3d 31 36 20 29 3b 0a 20 20 20 20  Term==16 );.    
2d450 20 20 20 20 69 66 28 20 69 54 65 72 6d 3c 31 36      if( iTerm<16
2d460 20 26 26 20 70 55 73 61 67 65 5b 69 5d 2e 6f 6d   && pUsage[i].om
2d470 69 74 20 29 20 70 4e 65 77 2d 3e 75 2e 76 74 61  it ) pNew->u.vta
2d480 62 2e 6f 6d 69 74 4d 61 73 6b 20 7c 3d 20 31 3c  b.omitMask |= 1<
2d490 3c 69 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20  <iTerm;.        
2d4a0 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65  if( (pTerm->eOpe
2d4b0 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 29 21 3d  rator & WO_IN)!=
2d4c0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  0 ){.          i
2d4d0 66 28 20 70 55 73 61 67 65 5b 69 5d 2e 6f 6d 69  f( pUsage[i].omi
2d4e0 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t==0 ){.        
2d4f0 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 74      /* Do not at
2d500 74 65 6d 70 74 20 74 6f 20 75 73 65 20 61 6e 20  tempt to use an 
2d510 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 66  IN constraint if
2d520 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62   the virtual tab
2d530 6c 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  le.            *
2d540 2a 20 73 61 79 73 20 74 68 61 74 20 74 68 65 20  * says that the 
2d550 65 71 75 69 76 61 6c 65 6e 74 20 45 51 20 63 6f  equivalent EQ co
2d560 6e 73 74 72 61 69 6e 74 20 63 61 6e 6e 6f 74 20  nstraint cannot 
2d570 62 65 20 73 61 66 65 6c 79 20 6f 6d 69 74 74 65  be safely omitte
2d580 64 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  d..            *
2d590 2a 20 49 66 20 77 65 20 64 6f 20 61 74 74 65 6d  * If we do attem
2d5a0 70 74 20 74 6f 20 75 73 65 20 73 75 63 68 20 61  pt to use such a
2d5b0 20 63 6f 6e 73 74 72 61 69 6e 74 2c 20 73 6f 6d   constraint, som
2d5c0 65 20 72 6f 77 73 20 6d 69 67 68 74 20 62 65 0a  e rows might be.
2d5d0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72              ** r
2d5e0 65 70 65 61 74 65 64 20 69 6e 20 74 68 65 20 6f  epeated in the o
2d5f0 75 74 70 75 74 2e 20 2a 2f 0a 20 20 20 20 20 20  utput. */.      
2d600 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2d610 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2d620 20 20 20 2f 2a 20 41 20 76 69 72 74 75 61 6c 20     /* A virtual 
2d630 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 63 6f  table that is co
2d640 6e 73 74 72 61 69 6e 65 64 20 62 79 20 61 6e 20  nstrained by an 
2d650 49 4e 20 63 6c 61 75 73 65 20 6d 61 79 20 6e 6f  IN clause may no
2d660 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63  t.          ** c
2d670 6f 6e 73 75 6d 65 20 74 68 65 20 4f 52 44 45 52  onsume the ORDER
2d680 20 42 59 20 63 6c 61 75 73 65 20 62 65 63 61 75   BY clause becau
2d690 73 65 20 28 31 29 20 74 68 65 20 6f 72 64 65 72  se (1) the order
2d6a0 20 6f 66 20 49 4e 20 74 65 72 6d 73 0a 20 20 20   of IN terms.   
2d6b0 20 20 20 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74         ** is not
2d6c0 20 6e 65 63 65 73 73 61 72 69 6c 79 20 72 65 6c   necessarily rel
2d6d0 61 74 65 64 20 74 6f 20 74 68 65 20 6f 72 64 65  ated to the orde
2d6e0 72 20 6f 66 20 6f 75 74 70 75 74 20 74 65 72 6d  r of output term
2d6f0 73 20 61 6e 64 0a 20 20 20 20 20 20 20 20 20 20  s and.          
2d700 2a 2a 20 28 32 29 20 4d 75 6c 74 69 70 6c 65 20  ** (2) Multiple 
2d710 6f 75 74 70 75 74 73 20 66 72 6f 6d 20 61 20 73  outputs from a s
2d720 69 6e 67 6c 65 20 49 4e 20 76 61 6c 75 65 20 77  ingle IN value w
2d730 69 6c 6c 20 6e 6f 74 20 6d 65 72 67 65 0a 20 20  ill not merge.  
2d740 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 67 65 74          ** toget
2d750 68 65 72 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  her.  */.       
2d760 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64     pIdxInfo->ord
2d770 65 72 42 79 43 6f 6e 73 75 6d 65 64 20 3d 20 30  erByConsumed = 0
2d780 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2d790 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
2d7a0 28 20 69 3e 3d 6e 43 6f 6e 73 74 72 61 69 6e 74  ( i>=nConstraint
2d7b0 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e   ){.      pNew->
2d7c0 6e 4c 54 65 72 6d 20 3d 20 6d 78 54 65 72 6d 2b  nLTerm = mxTerm+
2d7d0 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  1;.      assert(
2d7e0 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 3c 3d 70   pNew->nLTerm<=p
2d7f0 4e 65 77 2d 3e 6e 4c 53 6c 6f 74 20 29 3b 0a 20  New->nLSlot );. 
2d800 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61       pNew->u.vta
2d810 62 2e 69 64 78 4e 75 6d 20 3d 20 70 49 64 78 49  b.idxNum = pIdxI
2d820 6e 66 6f 2d 3e 69 64 78 4e 75 6d 3b 0a 20 20 20  nfo->idxNum;.   
2d830 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e     pNew->u.vtab.
2d840 6e 65 65 64 46 72 65 65 20 3d 20 70 49 64 78 49  needFree = pIdxI
2d850 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49  nfo->needToFreeI
2d860 64 78 53 74 72 3b 0a 20 20 20 20 20 20 70 49 64  dxStr;.      pId
2d870 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65  xInfo->needToFre
2d880 65 49 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 20  eIdxStr = 0;.   
2d890 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e     pNew->u.vtab.
2d8a0 69 64 78 53 74 72 20 3d 20 70 49 64 78 49 6e 66  idxStr = pIdxInf
2d8b0 6f 2d 3e 69 64 78 53 74 72 3b 0a 20 20 20 20 20  o->idxStr;.     
2d8c0 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69 73   pNew->u.vtab.is
2d8d0 4f 72 64 65 72 65 64 20 3d 20 28 69 38 29 28 70  Ordered = (i8)(p
2d8e0 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79  IdxInfo->orderBy
2d8f0 43 6f 6e 73 75 6d 65 64 20 3f 0a 20 20 20 20 20  Consumed ?.     
2d900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d920 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65   pIdxInfo->nOrde
2d930 72 42 79 20 3a 20 30 29 3b 0a 20 20 20 20 20 20  rBy : 0);.      
2d940 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 30  pNew->rSetup = 0
2d950 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52  ;.      pNew->rR
2d960 75 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  un = sqlite3LogE
2d970 73 74 46 72 6f 6d 44 6f 75 62 6c 65 28 70 49 64  stFromDouble(pId
2d980 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64  xInfo->estimated
2d990 43 6f 73 74 29 3b 0a 20 20 20 20 20 20 70 4e 65  Cost);.      pNe
2d9a0 77 2d 3e 6e 4f 75 74 20 3d 20 73 71 6c 69 74 65  w->nOut = sqlite
2d9b0 33 4c 6f 67 45 73 74 28 70 49 64 78 49 6e 66 6f  3LogEst(pIdxInfo
2d9c0 2d 3e 65 73 74 69 6d 61 74 65 64 52 6f 77 73 29  ->estimatedRows)
2d9d0 3b 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f  ;.      whereLoo
2d9e0 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72  pInsert(pBuilder
2d9f0 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 69  , pNew);.      i
2da00 66 28 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e  f( pNew->u.vtab.
2da10 6e 65 65 64 46 72 65 65 20 29 7b 0a 20 20 20 20  needFree ){.    
2da20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
2da30 28 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69 64  (pNew->u.vtab.id
2da40 78 53 74 72 29 3b 0a 20 20 20 20 20 20 20 20 70  xStr);.        p
2da50 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64  New->u.vtab.need
2da60 46 72 65 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Free = 0;.      
2da70 7d 0a 20 20 20 20 7d 0a 20 20 7d 20 20 0a 0a 77  }.    }.  }  ..w
2da80 68 65 72 65 4c 6f 6f 70 41 64 64 56 74 61 62 5f  hereLoopAddVtab_
2da90 65 78 69 74 3a 0a 20 20 69 66 28 20 70 49 64 78  exit:.  if( pIdx
2daa0 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65  Info->needToFree
2dab0 49 64 78 53 74 72 20 29 20 73 71 6c 69 74 65 33  IdxStr ) sqlite3
2dac0 5f 66 72 65 65 28 70 49 64 78 49 6e 66 6f 2d 3e  _free(pIdxInfo->
2dad0 69 64 78 53 74 72 29 3b 0a 20 20 73 71 6c 69 74  idxStr);.  sqlit
2dae0 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 64  e3DbFree(db, pId
2daf0 78 49 6e 66 6f 29 3b 0a 20 20 72 65 74 75 72 6e  xInfo);.  return
2db00 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a   rc;.}.#endif /*
2db10 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
2db20 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 2f 2a  TUALTABLE */../*
2db30 0a 2a 2a 20 41 64 64 20 57 68 65 72 65 4c 6f 6f  .** Add WhereLoo
2db40 70 20 65 6e 74 72 69 65 73 20 74 6f 20 68 61 6e  p entries to han
2db50 64 6c 65 20 4f 52 20 74 65 72 6d 73 2e 20 20 54  dle OR terms.  T
2db60 68 69 73 20 77 6f 72 6b 73 20 66 6f 72 20 65 69  his works for ei
2db70 74 68 65 72 0a 2a 2a 20 62 74 72 65 65 73 20 6f  ther.** btrees o
2db80 72 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73  r virtual tables
2db90 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2dba0 77 68 65 72 65 4c 6f 6f 70 41 64 64 4f 72 28 57  whereLoopAddOr(W
2dbb0 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20  hereLoopBuilder 
2dbc0 2a 70 42 75 69 6c 64 65 72 2c 20 42 69 74 6d 61  *pBuilder, Bitma
2dbd0 73 6b 20 6d 45 78 74 72 61 29 7b 0a 20 20 57 68  sk mExtra){.  Wh
2dbe0 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20  ereInfo *pWInfo 
2dbf0 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e  = pBuilder->pWIn
2dc00 66 6f 3b 0a 20 20 57 68 65 72 65 43 6c 61 75 73  fo;.  WhereClaus
2dc10 65 20 2a 70 57 43 3b 0a 20 20 57 68 65 72 65 4c  e *pWC;.  WhereL
2dc20 6f 6f 70 20 2a 70 4e 65 77 3b 0a 20 20 57 68 65  oop *pNew;.  Whe
2dc30 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 2a  reTerm *pTerm, *
2dc40 70 57 43 45 6e 64 3b 0a 20 20 69 6e 74 20 72 63  pWCEnd;.  int rc
2dc50 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
2dc60 69 6e 74 20 69 43 75 72 3b 0a 20 20 57 68 65 72  int iCur;.  Wher
2dc70 65 43 6c 61 75 73 65 20 74 65 6d 70 57 43 3b 0a  eClause tempWC;.
2dc80 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64    WhereLoopBuild
2dc90 65 72 20 73 53 75 62 42 75 69 6c 64 3b 0a 20 20  er sSubBuild;.  
2dca0 57 68 65 72 65 4f 72 53 65 74 20 73 53 75 6d 2c  WhereOrSet sSum,
2dcb0 20 73 43 75 72 3b 0a 20 20 73 74 72 75 63 74 20   sCur;.  struct 
2dcc0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
2dcd0 74 65 6d 3b 0a 20 20 0a 20 20 70 57 43 20 3d 20  tem;.  .  pWC = 
2dce0 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 3b 0a 20  pBuilder->pWC;. 
2dcf0 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 77 63 74   if( pWInfo->wct
2dd00 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
2dd10 41 4e 44 5f 4f 4e 4c 59 20 29 20 72 65 74 75 72  AND_ONLY ) retur
2dd20 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70  n SQLITE_OK;.  p
2dd30 57 43 45 6e 64 20 3d 20 70 57 43 2d 3e 61 20 2b  WCEnd = pWC->a +
2dd40 20 70 57 43 2d 3e 6e 54 65 72 6d 3b 0a 20 20 70   pWC->nTerm;.  p
2dd50 4e 65 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  New = pBuilder->
2dd60 70 4e 65 77 3b 0a 20 20 6d 65 6d 73 65 74 28 26  pNew;.  memset(&
2dd70 73 53 75 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28  sSum, 0, sizeof(
2dd80 73 53 75 6d 29 29 3b 0a 20 20 70 49 74 65 6d 20  sSum));.  pItem 
2dd90 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69  = pWInfo->pTabLi
2dda0 73 74 2d 3e 61 20 2b 20 70 4e 65 77 2d 3e 69 54  st->a + pNew->iT
2ddb0 61 62 3b 0a 20 20 69 43 75 72 20 3d 20 70 49 74  ab;.  iCur = pIt
2ddc0 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 0a 20 20  em->iCursor;..  
2ddd0 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61  for(pTerm=pWC->a
2dde0 3b 20 70 54 65 72 6d 3c 70 57 43 45 6e 64 20 26  ; pTerm<pWCEnd &
2ddf0 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b  & rc==SQLITE_OK;
2de00 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69   pTerm++){.    i
2de10 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  f( (pTerm->eOper
2de20 61 74 6f 72 20 26 20 57 4f 5f 4f 52 29 21 3d 30  ator & WO_OR)!=0
2de30 0a 20 20 20 20 20 26 26 20 28 70 54 65 72 6d 2d  .     && (pTerm-
2de40 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 69 6e 64 65  >u.pOrInfo->inde
2de50 78 61 62 6c 65 20 26 20 70 4e 65 77 2d 3e 6d 61  xable & pNew->ma
2de60 73 6b 53 65 6c 66 29 21 3d 30 20 0a 20 20 20 20  skSelf)!=0 .    
2de70 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 43 6c  ){.      WhereCl
2de80 61 75 73 65 20 2a 20 63 6f 6e 73 74 20 70 4f 72  ause * const pOr
2de90 57 43 20 3d 20 26 70 54 65 72 6d 2d 3e 75 2e 70  WC = &pTerm->u.p
2dea0 4f 72 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20 20  OrInfo->wc;.    
2deb0 20 20 57 68 65 72 65 54 65 72 6d 20 2a 20 63 6f    WhereTerm * co
2dec0 6e 73 74 20 70 4f 72 57 43 45 6e 64 20 3d 20 26  nst pOrWCEnd = &
2ded0 70 4f 72 57 43 2d 3e 61 5b 70 4f 72 57 43 2d 3e  pOrWC->a[pOrWC->
2dee0 6e 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 57 68  nTerm];.      Wh
2def0 65 72 65 54 65 72 6d 20 2a 70 4f 72 54 65 72 6d  ereTerm *pOrTerm
2df00 3b 0a 20 20 20 20 20 20 69 6e 74 20 6f 6e 63 65  ;.      int once
2df10 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 6e 74 20   = 1;.      int 
2df20 69 2c 20 6a 3b 0a 20 20 20 20 0a 20 20 20 20 20  i, j;.    .     
2df30 20 73 53 75 62 42 75 69 6c 64 20 3d 20 2a 70 42   sSubBuild = *pB
2df40 75 69 6c 64 65 72 3b 0a 20 20 20 20 20 20 73 53  uilder;.      sS
2df50 75 62 42 75 69 6c 64 2e 70 4f 72 64 65 72 42 79  ubBuild.pOrderBy
2df60 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 53 75 62   = 0;.      sSub
2df70 42 75 69 6c 64 2e 70 4f 72 53 65 74 20 3d 20 26  Build.pOrSet = &
2df80 73 43 75 72 3b 0a 0a 20 20 20 20 20 20 66 6f 72  sCur;..      for
2df90 28 70 4f 72 54 65 72 6d 3d 70 4f 72 57 43 2d 3e  (pOrTerm=pOrWC->
2dfa0 61 3b 20 70 4f 72 54 65 72 6d 3c 70 4f 72 57 43  a; pOrTerm<pOrWC
2dfb0 45 6e 64 3b 20 70 4f 72 54 65 72 6d 2b 2b 29 7b  End; pOrTerm++){
2dfc0 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70 4f  .        if( (pO
2dfd0 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  rTerm->eOperator
2dfe0 20 26 20 57 4f 5f 41 4e 44 29 21 3d 30 20 29 7b   & WO_AND)!=0 ){
2dff0 0a 20 20 20 20 20 20 20 20 20 20 73 53 75 62 42  .          sSubB
2e000 75 69 6c 64 2e 70 57 43 20 3d 20 26 70 4f 72 54  uild.pWC = &pOrT
2e010 65 72 6d 2d 3e 75 2e 70 41 6e 64 49 6e 66 6f 2d  erm->u.pAndInfo-
2e020 3e 77 63 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  >wc;.        }el
2e030 73 65 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e  se if( pOrTerm->
2e040 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72  leftCursor==iCur
2e050 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74 65   ){.          te
2e060 6d 70 57 43 2e 70 57 49 6e 66 6f 20 3d 20 70 57  mpWC.pWInfo = pW
2e070 43 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 20 20 20  C->pWInfo;.     
2e080 20 20 20 20 20 74 65 6d 70 57 43 2e 70 4f 75 74       tempWC.pOut
2e090 65 72 20 3d 20 70 57 43 3b 0a 20 20 20 20 20 20  er = pWC;.      
2e0a0 20 20 20 20 74 65 6d 70 57 43 2e 6f 70 20 3d 20      tempWC.op = 
2e0b0 54 4b 5f 41 4e 44 3b 0a 20 20 20 20 20 20 20 20  TK_AND;.        
2e0c0 20 20 74 65 6d 70 57 43 2e 6e 54 65 72 6d 20 3d    tempWC.nTerm =
2e0d0 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65   1;.          te
2e0e0 6d 70 57 43 2e 61 20 3d 20 70 4f 72 54 65 72 6d  mpWC.a = pOrTerm
2e0f0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 53 75 62  ;.          sSub
2e100 42 75 69 6c 64 2e 70 57 43 20 3d 20 26 74 65 6d  Build.pWC = &tem
2e110 70 57 43 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  pWC;.        }el
2e120 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f  se{.          co
2e130 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
2e140 7d 0a 20 20 20 20 20 20 20 20 73 43 75 72 2e 6e  }.        sCur.n
2e150 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51   = 0;.#ifndef SQ
2e160 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
2e170 4c 54 41 42 4c 45 0a 20 20 20 20 20 20 20 20 69  LTABLE.        i
2e180 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 49 74  f( IsVirtual(pIt
2e190 65 6d 2d 3e 70 54 61 62 29 20 29 7b 0a 20 20 20  em->pTab) ){.   
2e1a0 20 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72         rc = wher
2e1b0 65 4c 6f 6f 70 41 64 64 56 69 72 74 75 61 6c 28  eLoopAddVirtual(
2e1c0 26 73 53 75 62 42 75 69 6c 64 2c 20 6d 45 78 74  &sSubBuild, mExt
2e1d0 72 61 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ra);.        }el
2e1e0 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  se.#endif.      
2e1f0 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63    {.          rc
2e200 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42   = whereLoopAddB
2e210 74 72 65 65 28 26 73 53 75 62 42 75 69 6c 64 2c  tree(&sSubBuild,
2e220 20 6d 45 78 74 72 61 29 3b 0a 20 20 20 20 20 20   mExtra);.      
2e230 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65    }.        asse
2e240 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
2e250 4b 20 7c 7c 20 73 43 75 72 2e 6e 3d 3d 30 20 29  K || sCur.n==0 )
2e260 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 43  ;.        if( sC
2e270 75 72 2e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ur.n==0 ){.     
2e280 20 20 20 20 20 73 53 75 6d 2e 6e 20 3d 20 30 3b       sSum.n = 0;
2e290 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
2e2a0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
2e2b0 69 66 28 20 6f 6e 63 65 20 29 7b 0a 20 20 20 20  if( once ){.    
2e2c0 20 20 20 20 20 20 77 68 65 72 65 4f 72 4d 6f 76        whereOrMov
2e2d0 65 28 26 73 53 75 6d 2c 20 26 73 43 75 72 29 3b  e(&sSum, &sCur);
2e2e0 0a 20 20 20 20 20 20 20 20 20 20 6f 6e 63 65 20  .          once 
2e2f0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  = 0;.        }el
2e300 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 57 68  se{.          Wh
2e310 65 72 65 4f 72 53 65 74 20 73 50 72 65 76 3b 0a  ereOrSet sPrev;.
2e320 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65 4f            whereO
2e330 72 4d 6f 76 65 28 26 73 50 72 65 76 2c 20 26 73  rMove(&sPrev, &s
2e340 53 75 6d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Sum);.          
2e350 73 53 75 6d 2e 6e 20 3d 20 30 3b 0a 20 20 20 20  sSum.n = 0;.    
2e360 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
2e370 3c 73 50 72 65 76 2e 6e 3b 20 69 2b 2b 29 7b 0a  <sPrev.n; i++){.
2e380 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28              for(
2e390 6a 3d 30 3b 20 6a 3c 73 43 75 72 2e 6e 3b 20 6a  j=0; j<sCur.n; j
2e3a0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
2e3b0 20 20 20 77 68 65 72 65 4f 72 49 6e 73 65 72 74     whereOrInsert
2e3c0 28 26 73 53 75 6d 2c 20 73 50 72 65 76 2e 61 5b  (&sSum, sPrev.a[
2e3d0 69 5d 2e 70 72 65 72 65 71 20 7c 20 73 43 75 72  i].prereq | sCur
2e3e0 2e 61 5b 6a 5d 2e 70 72 65 72 65 71 2c 0a 20 20  .a[j].prereq,.  
2e3f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e400 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2e410 33 4c 6f 67 45 73 74 41 64 64 28 73 50 72 65 76  3LogEstAdd(sPrev
2e420 2e 61 5b 69 5d 2e 72 52 75 6e 2c 20 73 43 75 72  .a[i].rRun, sCur
2e430 2e 61 5b 6a 5d 2e 72 52 75 6e 29 2c 0a 20 20 20  .a[j].rRun),.   
2e440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e450 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
2e460 4c 6f 67 45 73 74 41 64 64 28 73 50 72 65 76 2e  LogEstAdd(sPrev.
2e470 61 5b 69 5d 2e 6e 4f 75 74 2c 20 73 43 75 72 2e  a[i].nOut, sCur.
2e480 61 5b 6a 5d 2e 6e 4f 75 74 29 29 3b 0a 20 20 20  a[j].nOut));.   
2e490 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2e4a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
2e4b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
2e4c0 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 31 3b  New->nLTerm = 1;
2e4d0 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54  .      pNew->aLT
2e4e0 65 72 6d 5b 30 5d 20 3d 20 70 54 65 72 6d 3b 0a  erm[0] = pTerm;.
2e4f0 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c        pNew->wsFl
2e500 61 67 73 20 3d 20 57 48 45 52 45 5f 4d 55 4c 54  ags = WHERE_MULT
2e510 49 5f 4f 52 3b 0a 20 20 20 20 20 20 70 4e 65 77  I_OR;.      pNew
2e520 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a 20 20  ->rSetup = 0;.  
2e530 20 20 20 20 70 4e 65 77 2d 3e 69 53 6f 72 74 49      pNew->iSortI
2e540 64 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 6d 65  dx = 0;.      me
2e550 6d 73 65 74 28 26 70 4e 65 77 2d 3e 75 2c 20 30  mset(&pNew->u, 0
2e560 2c 20 73 69 7a 65 6f 66 28 70 4e 65 77 2d 3e 75  , sizeof(pNew->u
2e570 29 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  ));.      for(i=
2e580 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  0; rc==SQLITE_OK
2e590 20 26 26 20 69 3c 73 53 75 6d 2e 6e 3b 20 69 2b   && i<sSum.n; i+
2e5a0 2b 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54  +){.        /* T
2e5b0 55 4e 49 4e 47 3a 20 43 75 72 72 65 6e 74 6c 79  UNING: Currently
2e5c0 20 73 53 75 6d 2e 61 5b 69 5d 2e 72 52 75 6e 20   sSum.a[i].rRun 
2e5d0 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 73 75  is set to the su
2e5e0 6d 20 6f 66 20 74 68 65 20 63 6f 73 74 73 0a 20  m of the costs. 
2e5f0 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 61 6c 6c         ** of all
2e600 20 73 75 62 2d 73 63 61 6e 73 20 72 65 71 75 69   sub-scans requi
2e610 72 65 64 20 62 79 20 74 68 65 20 4f 52 2d 73 63  red by the OR-sc
2e620 61 6e 2e 20 48 6f 77 65 76 65 72 2c 20 64 75 65  an. However, due
2e630 20 74 6f 20 72 6f 75 6e 64 69 6e 67 0a 20 20 20   to rounding.   
2e640 20 20 20 20 20 2a 2a 20 65 72 72 6f 72 73 2c 20       ** errors, 
2e650 69 74 20 6d 61 79 20 62 65 20 74 68 61 74 20 74  it may be that t
2e660 68 65 20 63 6f 73 74 20 6f 66 20 74 68 65 20 4f  he cost of the O
2e670 52 2d 73 63 61 6e 20 69 73 20 65 71 75 61 6c 20  R-scan is equal 
2e680 74 6f 20 69 74 73 0a 20 20 20 20 20 20 20 20 2a  to its.        *
2e690 2a 20 6d 6f 73 74 20 65 78 70 65 6e 73 69 76 65  * most expensive
2e6a0 20 73 75 62 2d 73 63 61 6e 2e 20 41 64 64 20 74   sub-scan. Add t
2e6b0 68 65 20 73 6d 61 6c 6c 65 73 74 20 70 6f 73 73  he smallest poss
2e6c0 69 62 6c 65 20 70 65 6e 61 6c 74 79 20 0a 20 20  ible penalty .  
2e6d0 20 20 20 20 20 20 2a 2a 20 28 65 71 75 69 76 61        ** (equiva
2e6e0 6c 65 6e 74 20 74 6f 20 6d 75 6c 74 69 70 6c 79  lent to multiply
2e6f0 69 6e 67 20 74 68 65 20 63 6f 73 74 20 62 79 20  ing the cost by 
2e700 31 2e 30 37 29 20 74 6f 20 65 6e 73 75 72 65 20  1.07) to ensure 
2e710 74 68 61 74 20 0a 20 20 20 20 20 20 20 20 2a 2a  that .        **
2e720 20 74 68 69 73 20 64 6f 65 73 20 6e 6f 74 20 68   this does not h
2e730 61 70 70 65 6e 2e 20 4f 74 68 65 72 77 69 73 65  appen. Otherwise
2e740 2c 20 66 6f 72 20 57 48 45 52 45 20 63 6c 61 75  , for WHERE clau
2e750 73 65 73 20 73 75 63 68 20 61 73 20 74 68 65 0a  ses such as the.
2e760 20 20 20 20 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f          ** follo
2e770 77 69 6e 67 20 77 68 65 72 65 20 74 68 65 72 65  wing where there
2e780 20 69 73 20 61 6e 20 69 6e 64 65 78 20 6f 6e 20   is an index on 
2e790 22 79 22 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a  "y":.        **.
2e7a0 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 57          **     W
2e7b0 48 45 52 45 20 6c 69 6b 65 6c 69 68 6f 6f 64 28  HERE likelihood(
2e7c0 78 3d 3f 2c 20 30 2e 39 39 29 20 4f 52 20 79 3d  x=?, 0.99) OR y=
2e7d0 3f 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ?.        **.   
2e7e0 20 20 20 20 20 2a 2a 20 74 68 65 20 70 6c 61 6e       ** the plan
2e7f0 6e 65 72 20 6d 61 79 20 65 6c 65 63 74 20 74 6f  ner may elect to
2e800 20 22 4f 52 22 20 74 6f 67 65 74 68 65 72 20 61   "OR" together a
2e810 20 66 75 6c 6c 2d 74 61 62 6c 65 20 73 63 61 6e   full-table scan
2e820 20 61 6e 64 20 61 6e 0a 20 20 20 20 20 20 20 20   and an.        
2e830 2a 2a 20 69 6e 64 65 78 20 6c 6f 6f 6b 75 70 2e  ** index lookup.
2e840 20 41 6e 64 20 6f 74 68 65 72 20 73 69 6d 69 6c   And other simil
2e850 61 72 6c 79 20 6f 64 64 20 72 65 73 75 6c 74 73  arly odd results
2e860 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e  .  */.        pN
2e870 65 77 2d 3e 72 52 75 6e 20 3d 20 73 53 75 6d 2e  ew->rRun = sSum.
2e880 61 5b 69 5d 2e 72 52 75 6e 20 2b 20 31 3b 0a 20  a[i].rRun + 1;. 
2e890 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75         pNew->nOu
2e8a0 74 20 3d 20 73 53 75 6d 2e 61 5b 69 5d 2e 6e 4f  t = sSum.a[i].nO
2e8b0 75 74 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  ut;.        pNew
2e8c0 2d 3e 70 72 65 72 65 71 20 3d 20 73 53 75 6d 2e  ->prereq = sSum.
2e8d0 61 5b 69 5d 2e 70 72 65 72 65 71 3b 0a 20 20 20  a[i].prereq;.   
2e8e0 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c       rc = whereL
2e8f0 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64  oopInsert(pBuild
2e900 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20  er, pNew);.     
2e910 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
2e920 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
2e930 2a 2a 20 41 64 64 20 61 6c 6c 20 57 68 65 72 65  ** Add all Where
2e940 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 66 6f 72  Loop objects for
2e950 20 61 6c 6c 20 74 61 62 6c 65 73 20 0a 2a 2f 0a   all tables .*/.
2e960 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
2e970 4c 6f 6f 70 41 64 64 41 6c 6c 28 57 68 65 72 65  LoopAddAll(Where
2e980 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75  LoopBuilder *pBu
2e990 69 6c 64 65 72 29 7b 0a 20 20 57 68 65 72 65 49  ilder){.  WhereI
2e9a0 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70 42  nfo *pWInfo = pB
2e9b0 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a  uilder->pWInfo;.
2e9c0 20 20 42 69 74 6d 61 73 6b 20 6d 45 78 74 72 61    Bitmask mExtra
2e9d0 20 3d 20 30 3b 0a 20 20 42 69 74 6d 61 73 6b 20   = 0;.  Bitmask 
2e9e0 6d 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 69 6e  mPrior = 0;.  in
2e9f0 74 20 69 54 61 62 3b 0a 20 20 53 72 63 4c 69 73  t iTab;.  SrcLis
2ea00 74 20 2a 70 54 61 62 4c 69 73 74 20 3d 20 70 57  t *pTabList = pW
2ea10 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 3b 0a  Info->pTabList;.
2ea20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
2ea30 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
2ea40 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 57  sqlite3 *db = pW
2ea50 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62  Info->pParse->db
2ea60 3b 0a 20 20 69 6e 74 20 6e 54 61 62 4c 69 73 74  ;.  int nTabList
2ea70 20 3d 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65   = pWInfo->nLeve
2ea80 6c 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  l;.  int rc = SQ
2ea90 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 38 20 70 72  LITE_OK;.  u8 pr
2eaa0 69 6f 72 4a 6f 69 6e 54 79 70 65 20 3d 20 30 3b  iorJoinType = 0;
2eab0 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e  .  WhereLoop *pN
2eac0 65 77 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20 6f  ew;..  /* Loop o
2ead0 76 65 72 20 74 68 65 20 74 61 62 6c 65 73 20 69  ver the tables i
2eae0 6e 20 74 68 65 20 6a 6f 69 6e 2c 20 66 72 6f 6d  n the join, from
2eaf0 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74 20 2a   left to right *
2eb00 2f 0a 20 20 70 4e 65 77 20 3d 20 70 42 75 69 6c  /.  pNew = pBuil
2eb10 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 77 68 65  der->pNew;.  whe
2eb20 72 65 4c 6f 6f 70 49 6e 69 74 28 70 4e 65 77 29  reLoopInit(pNew)
2eb30 3b 0a 20 20 66 6f 72 28 69 54 61 62 3d 30 2c 20  ;.  for(iTab=0, 
2eb40 70 49 74 65 6d 3d 70 54 61 62 4c 69 73 74 2d 3e  pItem=pTabList->
2eb50 61 3b 20 69 54 61 62 3c 6e 54 61 62 4c 69 73 74  a; iTab<nTabList
2eb60 3b 20 69 54 61 62 2b 2b 2c 20 70 49 74 65 6d 2b  ; iTab++, pItem+
2eb70 2b 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 54  +){.    pNew->iT
2eb80 61 62 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 70  ab = iTab;.    p
2eb90 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 20 3d 20  New->maskSelf = 
2eba0 67 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d  getMask(&pWInfo-
2ebb0 3e 73 4d 61 73 6b 53 65 74 2c 20 70 49 74 65 6d  >sMaskSet, pItem
2ebc0 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  ->iCursor);.    
2ebd0 69 66 28 20 28 28 70 49 74 65 6d 2d 3e 6a 6f 69  if( ((pItem->joi
2ebe0 6e 74 79 70 65 7c 70 72 69 6f 72 4a 6f 69 6e 54  ntype|priorJoinT
2ebf0 79 70 65 29 20 26 20 28 4a 54 5f 4c 45 46 54 7c  ype) & (JT_LEFT|
2ec00 4a 54 5f 43 52 4f 53 53 29 29 21 3d 30 20 29 7b  JT_CROSS))!=0 ){
2ec10 0a 20 20 20 20 20 20 6d 45 78 74 72 61 20 3d 20  .      mExtra = 
2ec20 6d 50 72 69 6f 72 3b 0a 20 20 20 20 7d 0a 20 20  mPrior;.    }.  
2ec30 20 20 70 72 69 6f 72 4a 6f 69 6e 54 79 70 65 20    priorJoinType 
2ec40 3d 20 70 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70  = pItem->jointyp
2ec50 65 3b 0a 20 20 20 20 69 66 28 20 49 73 56 69 72  e;.    if( IsVir
2ec60 74 75 61 6c 28 70 49 74 65 6d 2d 3e 70 54 61 62  tual(pItem->pTab
2ec70 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) ){.      rc = 
2ec80 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 69 72 74  whereLoopAddVirt
2ec90 75 61 6c 28 70 42 75 69 6c 64 65 72 2c 20 6d 45  ual(pBuilder, mE
2eca0 78 74 72 61 29 3b 0a 20 20 20 20 7d 65 6c 73 65  xtra);.    }else
2ecb0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68 65  {.      rc = whe
2ecc0 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 28 70  reLoopAddBtree(p
2ecd0 42 75 69 6c 64 65 72 2c 20 6d 45 78 74 72 61 29  Builder, mExtra)
2ece0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2ecf0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2ed00 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72  .      rc = wher
2ed10 65 4c 6f 6f 70 41 64 64 4f 72 28 70 42 75 69 6c  eLoopAddOr(pBuil
2ed20 64 65 72 2c 20 6d 45 78 74 72 61 29 3b 0a 20 20  der, mExtra);.  
2ed30 20 20 7d 0a 20 20 20 20 6d 50 72 69 6f 72 20 7c    }.    mPrior |
2ed40 3d 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66  = pNew->maskSelf
2ed50 3b 0a 20 20 20 20 69 66 28 20 72 63 20 7c 7c 20  ;.    if( rc || 
2ed60 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
2ed70 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20   ) break;.  }.  
2ed80 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 28 64  whereLoopClear(d
2ed90 62 2c 20 70 4e 65 77 29 3b 0a 20 20 72 65 74 75  b, pNew);.  retu
2eda0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
2edb0 45 78 61 6d 69 6e 65 20 61 20 57 68 65 72 65 50  Examine a WhereP
2edc0 61 74 68 20 28 77 69 74 68 20 74 68 65 20 61 64  ath (with the ad
2edd0 64 69 74 69 6f 6e 20 6f 66 20 74 68 65 20 65 78  dition of the ex
2ede0 74 72 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f 66  tra WhereLoop of
2edf0 20 74 68 65 20 35 74 68 0a 2a 2a 20 70 61 72 61   the 5th.** para
2ee00 6d 65 74 65 72 73 29 20 74 6f 20 73 65 65 20 69  meters) to see i
2ee10 66 20 69 74 20 6f 75 74 70 75 74 73 20 72 6f 77  f it outputs row
2ee20 73 20 69 6e 20 74 68 65 20 72 65 71 75 65 73 74  s in the request
2ee30 65 64 20 4f 52 44 45 52 20 42 59 0a 2a 2a 20 28  ed ORDER BY.** (
2ee40 6f 72 20 47 52 4f 55 50 20 42 59 29 20 77 69 74  or GROUP BY) wit
2ee50 68 6f 75 74 20 72 65 71 75 69 72 69 6e 67 20 61  hout requiring a
2ee60 20 73 65 70 61 72 61 74 65 20 73 6f 72 74 20 6f   separate sort o
2ee70 70 65 72 61 74 69 6f 6e 2e 20 20 52 65 74 75 72  peration.  Retur
2ee80 6e 20 4e 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 4e 3e  n N:.** .**   N>
2ee90 30 3a 20 20 20 4e 20 74 65 72 6d 73 20 6f 66 20  0:   N terms of 
2eea0 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
2eeb0 75 73 65 20 61 72 65 20 73 61 74 69 73 66 69 65  use are satisfie
2eec0 64 0a 2a 2a 20 20 20 4e 3d 3d 30 3a 20 20 4e 6f  d.**   N==0:  No
2eed0 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 4f 52   terms of the OR
2eee0 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 72  DER BY clause ar
2eef0 65 20 73 61 74 69 73 66 69 65 64 0a 2a 2a 20 20  e satisfied.**  
2ef00 20 4e 3c 30 3a 20 20 20 55 6e 6b 6e 6f 77 6e 20   N<0:   Unknown 
2ef10 79 65 74 20 68 6f 77 20 6d 61 6e 79 20 74 65 72  yet how many ter
2ef20 6d 73 20 6f 66 20 4f 52 44 45 52 20 42 59 20 6d  ms of ORDER BY m
2ef30 69 67 68 74 20 62 65 20 73 61 74 69 73 66 69 65  ight be satisfie
2ef40 64 2e 20 20 20 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65  d.   .**.** Note
2ef50 20 74 68 61 74 20 70 72 6f 63 65 73 73 69 6e 67   that processing
2ef60 20 66 6f 72 20 57 48 45 52 45 5f 47 52 4f 55 50   for WHERE_GROUP
2ef70 42 59 20 61 6e 64 20 57 48 45 52 45 5f 44 49 53  BY and WHERE_DIS
2ef80 54 49 4e 43 54 42 59 20 69 73 20 6e 6f 74 20 61  TINCTBY is not a
2ef90 73 0a 2a 2a 20 73 74 72 69 63 74 2e 20 20 57 69  s.** strict.  Wi
2efa0 74 68 20 47 52 4f 55 50 20 42 59 20 61 6e 64 20  th GROUP BY and 
2efb0 44 49 53 54 49 4e 43 54 20 74 68 65 20 6f 6e 6c  DISTINCT the onl
2efc0 79 20 72 65 71 75 69 72 65 6d 65 6e 74 20 69 73  y requirement is
2efd0 20 74 68 61 74 0a 2a 2a 20 65 71 75 69 76 61 6c   that.** equival
2efe0 65 6e 74 20 72 6f 77 73 20 61 70 70 65 61 72 20  ent rows appear 
2eff0 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 64 6a 61  immediately adja
2f000 63 65 6e 74 20 74 6f 20 6f 6e 65 20 61 6e 6f 74  cent to one anot
2f010 68 65 72 2e 20 20 47 52 4f 55 50 20 42 59 0a 2a  her.  GROUP BY.*
2f020 2a 20 61 6e 64 20 44 49 53 54 49 4e 43 54 20 64  * and DISTINCT d
2f030 6f 20 6e 6f 74 20 72 65 71 75 69 72 65 20 72 6f  o not require ro
2f040 77 73 20 74 6f 20 61 70 70 65 61 72 20 69 6e 20  ws to appear in 
2f050 61 6e 79 20 70 61 72 74 69 63 75 6c 61 72 20 6f  any particular o
2f060 72 64 65 72 20 61 73 20 6c 6f 6e 67 0a 2a 2a 20  rder as long.** 
2f070 61 73 20 65 71 75 69 76 61 6c 65 6e 74 20 72 6f  as equivalent ro
2f080 77 73 20 61 72 65 20 67 72 6f 75 70 65 64 20 74  ws are grouped t
2f090 6f 67 65 74 68 65 72 2e 20 20 54 68 75 73 20 66  ogether.  Thus f
2f0a0 6f 72 20 47 52 4f 55 50 20 42 59 20 61 6e 64 20  or GROUP BY and 
2f0b0 44 49 53 54 49 4e 43 54 0a 2a 2a 20 74 68 65 20  DISTINCT.** the 
2f0c0 70 4f 72 64 65 72 42 79 20 74 65 72 6d 73 20 63  pOrderBy terms c
2f0d0 61 6e 20 62 65 20 6d 61 74 63 68 65 64 20 69 6e  an be matched in
2f0e0 20 61 6e 79 20 6f 72 64 65 72 2e 20 20 57 69 74   any order.  Wit
2f0f0 68 20 4f 52 44 45 52 20 42 59 2c 20 74 68 65 20  h ORDER BY, the 
2f100 0a 2a 2a 20 70 4f 72 64 65 72 42 79 20 74 65 72  .** pOrderBy ter
2f110 6d 73 20 6d 75 73 74 20 62 65 20 6d 61 74 63 68  ms must be match
2f120 65 64 20 69 6e 20 73 74 72 69 63 74 20 6c 65 66  ed in strict lef
2f130 74 2d 74 6f 2d 72 69 67 68 74 20 6f 72 64 65 72  t-to-right order
2f140 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 38 20 77  ..*/.static i8 w
2f150 68 65 72 65 50 61 74 68 53 61 74 69 73 66 69 65  herePathSatisfie
2f160 73 4f 72 64 65 72 42 79 28 0a 20 20 57 68 65 72  sOrderBy(.  Wher
2f170 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 20 20  eInfo *pWInfo,  
2f180 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63    /* The WHERE c
2f190 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c  lause */.  ExprL
2f1a0 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20  ist *pOrderBy,  
2f1b0 20 2f 2a 20 4f 52 44 45 52 20 42 59 20 6f 72 20   /* ORDER BY or 
2f1c0 47 52 4f 55 50 20 42 59 20 6f 72 20 44 49 53 54  GROUP BY or DIST
2f1d0 49 4e 43 54 20 63 6c 61 75 73 65 20 74 6f 20 63  INCT clause to c
2f1e0 68 65 63 6b 20 2a 2f 0a 20 20 57 68 65 72 65 50  heck */.  WhereP
2f1f0 61 74 68 20 2a 70 50 61 74 68 2c 20 20 20 20 20  ath *pPath,     
2f200 2f 2a 20 54 68 65 20 57 68 65 72 65 50 61 74 68  /* The WherePath
2f210 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20 75   to check */.  u
2f220 31 36 20 77 63 74 72 6c 46 6c 61 67 73 2c 20 20  16 wctrlFlags,  
2f230 20 20 20 20 20 2f 2a 20 4d 69 67 68 74 20 63 6f       /* Might co
2f240 6e 74 61 69 6e 20 57 48 45 52 45 5f 47 52 4f 55  ntain WHERE_GROU
2f250 50 42 59 20 6f 72 20 57 48 45 52 45 5f 44 49 53  PBY or WHERE_DIS
2f260 54 49 4e 43 54 42 59 20 2a 2f 0a 20 20 75 31 36  TINCTBY */.  u16
2f270 20 6e 4c 6f 6f 70 2c 20 20 20 20 20 20 20 20 20   nLoop,         
2f280 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2f290 65 6e 74 72 69 65 73 20 69 6e 20 70 50 61 74 68  entries in pPath
2f2a0 2d 3e 61 4c 6f 6f 70 5b 5d 20 2a 2f 0a 20 20 57  ->aLoop[] */.  W
2f2b0 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 61 73 74 2c  hereLoop *pLast,
2f2c0 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 69 73       /* Add this
2f2d0 20 57 68 65 72 65 4c 6f 6f 70 20 74 6f 20 74 68   WhereLoop to th
2f2e0 65 20 65 6e 64 20 6f 66 20 70 50 61 74 68 2d 3e  e end of pPath->
2f2f0 61 4c 6f 6f 70 5b 5d 20 2a 2f 0a 20 20 42 69 74  aLoop[] */.  Bit
2f300 6d 61 73 6b 20 2a 70 52 65 76 4d 61 73 6b 20 20  mask *pRevMask  
2f310 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 61 73 6b 20     /* OUT: Mask 
2f320 6f 66 20 57 68 65 72 65 4c 6f 6f 70 73 20 74 6f  of WhereLoops to
2f330 20 72 75 6e 20 69 6e 20 72 65 76 65 72 73 65 20   run in reverse 
2f340 6f 72 64 65 72 20 2a 2f 0a 29 7b 0a 20 20 75 38  order */.){.  u8
2f350 20 72 65 76 53 65 74 3b 20 20 20 20 20 20 20 20   revSet;        
2f360 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 72      /* True if r
2f370 65 76 20 69 73 20 6b 6e 6f 77 6e 20 2a 2f 0a 20  ev is known */. 
2f380 20 75 38 20 72 65 76 3b 20 20 20 20 20 20 20 20   u8 rev;        
2f390 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 6f 73         /* Compos
2f3a0 69 74 65 20 73 6f 72 74 20 6f 72 64 65 72 20 2a  ite sort order *
2f3b0 2f 0a 20 20 75 38 20 72 65 76 49 64 78 3b 20 20  /.  u8 revIdx;  
2f3c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
2f3d0 65 78 20 73 6f 72 74 20 6f 72 64 65 72 20 2a 2f  ex sort order */
2f3e0 0a 20 20 75 38 20 69 73 4f 72 64 65 72 44 69 73  .  u8 isOrderDis
2f3f0 74 69 6e 63 74 3b 20 20 20 2f 2a 20 41 6c 6c 20  tinct;   /* All 
2f400 70 72 69 6f 72 20 57 68 65 72 65 4c 6f 6f 70 73  prior WhereLoops
2f410 20 61 72 65 20 6f 72 64 65 72 2d 64 69 73 74 69   are order-disti
2f420 6e 63 74 20 2a 2f 0a 20 20 75 38 20 64 69 73 74  nct */.  u8 dist
2f430 69 6e 63 74 43 6f 6c 75 6d 6e 73 3b 20 20 20 2f  inctColumns;   /
2f440 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 6c 6f  * True if the lo
2f450 6f 70 20 68 61 73 20 55 4e 49 51 55 45 20 4e 4f  op has UNIQUE NO
2f460 54 20 4e 55 4c 4c 20 63 6f 6c 75 6d 6e 73 20 2a  T NULL columns *
2f470 2f 0a 20 20 75 38 20 69 73 4d 61 74 63 68 3b 20  /.  u8 isMatch; 
2f480 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 43 6f            /* iCo
2f490 6c 75 6d 6e 20 6d 61 74 63 68 65 73 20 61 20 74  lumn matches a t
2f4a0 65 72 6d 20 6f 66 20 74 68 65 20 4f 52 44 45 52  erm of the ORDER
2f4b0 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
2f4c0 75 31 36 20 6e 4b 65 79 43 6f 6c 3b 20 20 20 20  u16 nKeyCol;    
2f4d0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2f4e0 6f 66 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 20 69  of key columns i
2f4f0 6e 20 70 49 6e 64 65 78 20 2a 2f 0a 20 20 75 31  n pIndex */.  u1
2f500 36 20 6e 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20  6 nColumn;      
2f510 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d      /* Total num
2f520 62 65 72 20 6f 66 20 6f 72 64 65 72 65 64 20 63  ber of ordered c
2f530 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 69 6e  olumns in the in
2f540 64 65 78 20 2a 2f 0a 20 20 75 31 36 20 6e 4f 72  dex */.  u16 nOr
2f550 64 65 72 42 79 3b 20 20 20 20 20 20 20 20 20 2f  derBy;         /
2f560 2a 20 4e 75 6d 62 65 72 20 74 65 72 6d 73 20 69  * Number terms i
2f570 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  n the ORDER BY c
2f580 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69  lause */.  int i
2f590 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  Loop;           
2f5a0 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 57 68 65   /* Index of Whe
2f5b0 72 65 4c 6f 6f 70 20 69 6e 20 70 50 61 74 68 20  reLoop in pPath 
2f5c0 62 65 69 6e 67 20 70 72 6f 63 65 73 73 65 64 20  being processed 
2f5d0 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20  */.  int i, j;  
2f5e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
2f5f0 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20  op counters */. 
2f600 20 69 6e 74 20 69 43 75 72 3b 20 20 20 20 20 20   int iCur;      
2f610 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72         /* Cursor
2f620 20 6e 75 6d 62 65 72 20 66 6f 72 20 63 75 72 72   number for curr
2f630 65 6e 74 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2f  ent WhereLoop */
2f640 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 3b 20  .  int iColumn; 
2f650 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 63 6f           /* A co
2f660 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 77 69 74 68  lumn number with
2f670 69 6e 20 74 61 62 6c 65 20 69 43 75 72 20 2a 2f  in table iCur */
2f680 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c  .  WhereLoop *pL
2f690 6f 6f 70 20 3d 20 30 3b 20 2f 2a 20 43 75 72 72  oop = 0; /* Curr
2f6a0 65 6e 74 20 57 68 65 72 65 4c 6f 6f 70 20 62 65  ent WhereLoop be
2f6b0 69 6e 67 20 70 72 6f 63 65 73 73 65 64 2e 20 2a  ing processed. *
2f6c0 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  /.  WhereTerm *p
2f6d0 54 65 72 6d 3b 20 20 20 20 20 2f 2a 20 41 20 73  Term;     /* A s
2f6e0 69 6e 67 6c 65 20 74 65 72 6d 20 6f 66 20 74 68  ingle term of th
2f6f0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
2f700 2f 0a 20 20 45 78 70 72 20 2a 70 4f 42 45 78 70  /.  Expr *pOBExp
2f710 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20  r;        /* An 
2f720 65 78 70 72 65 73 73 69 6f 6e 20 66 72 6f 6d 20  expression from 
2f730 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
2f740 75 73 65 20 2a 2f 0a 20 20 43 6f 6c 6c 53 65 71  use */.  CollSeq
2f750 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20 2f   *pColl;       /
2f760 2a 20 43 4f 4c 4c 41 54 45 20 66 75 6e 63 74 69  * COLLATE functi
2f770 6f 6e 20 66 72 6f 6d 20 61 6e 20 4f 52 44 45 52  on from an ORDER
2f780 20 42 59 20 63 6c 61 75 73 65 20 74 65 72 6d 20   BY clause term 
2f790 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64  */.  Index *pInd
2f7a0 65 78 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ex;        /* Th
2f7b0 65 20 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74  e index associat
2f7c0 65 64 20 77 69 74 68 20 70 4c 6f 6f 70 20 2a 2f  ed with pLoop */
2f7d0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
2f7e0 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d   pWInfo->pParse-
2f7f0 3e 64 62 3b 20 20 2f 2a 20 44 61 74 61 62 61 73  >db;  /* Databas
2f800 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
2f810 20 20 42 69 74 6d 61 73 6b 20 6f 62 53 61 74 20    Bitmask obSat 
2f820 3d 20 30 3b 20 20 20 20 2f 2a 20 4d 61 73 6b 20  = 0;    /* Mask 
2f830 6f 66 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d  of ORDER BY term
2f840 73 20 73 61 74 69 73 66 69 65 64 20 73 6f 20 66  s satisfied so f
2f850 61 72 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  ar */.  Bitmask 
2f860 6f 62 44 6f 6e 65 3b 20 20 20 20 20 20 20 2f 2a  obDone;       /*
2f870 20 4d 61 73 6b 20 6f 66 20 61 6c 6c 20 4f 52 44   Mask of all ORD
2f880 45 52 20 42 59 20 74 65 72 6d 73 20 2a 2f 0a 20  ER BY terms */. 
2f890 20 42 69 74 6d 61 73 6b 20 6f 72 64 65 72 44 69   Bitmask orderDi
2f8a0 73 74 69 6e 63 74 4d 61 73 6b 3b 20 20 2f 2a 20  stinctMask;  /* 
2f8b0 4d 61 73 6b 20 6f 66 20 61 6c 6c 20 77 65 6c 6c  Mask of all well
2f8c0 2d 6f 72 64 65 72 65 64 20 6c 6f 6f 70 73 20 2a  -ordered loops *
2f8d0 2f 0a 20 20 42 69 74 6d 61 73 6b 20 72 65 61 64  /.  Bitmask read
2f8e0 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y;              
2f8f0 2f 2a 20 4d 61 73 6b 20 6f 66 20 69 6e 6e 65 72  /* Mask of inner
2f900 20 6c 6f 6f 70 73 20 2a 2f 0a 0a 20 20 2f 2a 0a   loops */..  /*.
2f910 20 20 2a 2a 20 57 65 20 73 61 79 20 74 68 65 20    ** We say the 
2f920 57 68 65 72 65 4c 6f 6f 70 20 69 73 20 22 6f 6e  WhereLoop is "on
2f930 65 2d 72 6f 77 22 20 69 66 20 69 74 20 67 65 6e  e-row" if it gen
2f940 65 72 61 74 65 73 20 6e 6f 20 6d 6f 72 65 20 74  erates no more t
2f950 68 61 6e 20 6f 6e 65 0a 20 20 2a 2a 20 72 6f 77  han one.  ** row
2f960 20 6f 66 20 6f 75 74 70 75 74 2e 20 20 41 20 57   of output.  A W
2f970 68 65 72 65 4c 6f 6f 70 20 69 73 20 6f 6e 65 2d  hereLoop is one-
2f980 72 6f 77 20 69 66 20 61 6c 6c 20 6f 66 20 74 68  row if all of th
2f990 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20  e following are 
2f9a0 74 72 75 65 3a 0a 20 20 2a 2a 20 20 28 61 29 20  true:.  **  (a) 
2f9b0 41 6c 6c 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e  All index column
2f9c0 73 20 6d 61 74 63 68 20 77 69 74 68 20 57 48 45  s match with WHE
2f9d0 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 2e 0a 20 20  RE_COLUMN_EQ..  
2f9e0 2a 2a 20 20 28 62 29 20 54 68 65 20 69 6e 64 65  **  (b) The inde
2f9f0 78 20 69 73 20 75 6e 69 71 75 65 0a 20 20 2a 2a  x is unique.  **
2fa00 20 41 6e 79 20 57 68 65 72 65 4c 6f 6f 70 20 77   Any WhereLoop w
2fa10 69 74 68 20 61 6e 20 57 48 45 52 45 5f 43 4f 4c  ith an WHERE_COL
2fa20 55 4d 4e 5f 45 51 20 63 6f 6e 73 74 72 61 69 6e  UMN_EQ constrain
2fa30 74 20 6f 6e 20 74 68 65 20 72 6f 77 69 64 20 69  t on the rowid i
2fa40 73 20 6f 6e 65 2d 72 6f 77 2e 0a 20 20 2a 2a 20  s one-row..  ** 
2fa50 45 76 65 72 79 20 6f 6e 65 2d 72 6f 77 20 57 68  Every one-row Wh
2fa60 65 72 65 4c 6f 6f 70 20 77 69 6c 6c 20 68 61 76  ereLoop will hav
2fa70 65 20 74 68 65 20 57 48 45 52 45 5f 4f 4e 45 52  e the WHERE_ONER
2fa80 4f 57 20 62 69 74 20 73 65 74 20 69 6e 20 77 73  OW bit set in ws
2fa90 46 6c 61 67 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  Flags..  **.  **
2faa0 20 57 65 20 73 61 79 20 74 68 65 20 57 68 65 72   We say the Wher
2fab0 65 4c 6f 6f 70 20 69 73 20 22 6f 72 64 65 72 2d  eLoop is "order-
2fac0 64 69 73 74 69 6e 63 74 22 20 69 66 20 74 68 65  distinct" if the
2fad0 20 73 65 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20   set of columns 
2fae0 66 72 6f 6d 0a 20 20 2a 2a 20 74 68 61 74 20 57  from.  ** that W
2faf0 68 65 72 65 4c 6f 6f 70 20 74 68 61 74 20 61 72  hereLoop that ar
2fb00 65 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42  e in the ORDER B
2fb10 59 20 63 6c 61 75 73 65 20 61 72 65 20 64 69 66  Y clause are dif
2fb20 66 65 72 65 6e 74 20 66 6f 72 20 65 76 65 72 79  ferent for every
2fb30 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20 74 68 65  .  ** row of the
2fb40 20 57 68 65 72 65 4c 6f 6f 70 2e 20 20 45 76 65   WhereLoop.  Eve
2fb50 72 79 20 6f 6e 65 2d 72 6f 77 20 57 68 65 72 65  ry one-row Where
2fb60 4c 6f 6f 70 20 69 73 20 61 75 74 6f 6d 61 74 69  Loop is automati
2fb70 63 61 6c 6c 79 0a 20 20 2a 2a 20 6f 72 64 65 72  cally.  ** order
2fb80 2d 64 69 73 74 69 6e 63 74 2e 20 20 20 41 20 57  -distinct.   A W
2fb90 68 65 72 65 4c 6f 6f 70 20 74 68 61 74 20 68 61  hereLoop that ha
2fba0 73 20 6e 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  s no columns in 
2fbb0 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
2fbc0 75 73 65 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20  use.  ** is not 
2fbd0 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74 2e 20  order-distinct. 
2fbe0 54 6f 20 62 65 20 6f 72 64 65 72 2d 64 69 73 74  To be order-dist
2fbf0 69 6e 63 74 20 69 73 20 6e 6f 74 20 71 75 69 74  inct is not quit
2fc00 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 62 65  e the same as be
2fc10 69 6e 67 0a 20 20 2a 2a 20 55 4e 49 51 55 45 20  ing.  ** UNIQUE 
2fc20 73 69 6e 63 65 20 61 20 55 4e 49 51 55 45 20 63  since a UNIQUE c
2fc30 6f 6c 75 6d 6e 20 6f 72 20 69 6e 64 65 78 20 63  olumn or index c
2fc40 61 6e 20 68 61 76 65 20 6d 75 6c 74 69 70 6c 65  an have multiple
2fc50 20 72 6f 77 73 20 74 68 61 74 20 0a 20 20 2a 2a   rows that .  **
2fc60 20 61 72 65 20 4e 55 4c 4c 20 61 6e 64 20 4e 55   are NULL and NU
2fc70 4c 4c 20 76 61 6c 75 65 73 20 61 72 65 20 65 71  LL values are eq
2fc80 75 69 76 61 6c 65 6e 74 20 66 6f 72 20 74 68 65  uivalent for the
2fc90 20 70 75 72 70 6f 73 65 20 6f 66 20 6f 72 64 65   purpose of orde
2fca0 72 2d 64 69 73 74 69 6e 63 74 2e 0a 20 20 2a 2a  r-distinct..  **
2fcb0 20 54 6f 20 62 65 20 6f 72 64 65 72 2d 64 69 73   To be order-dis
2fcc0 74 69 6e 63 74 2c 20 74 68 65 20 63 6f 6c 75 6d  tinct, the colum
2fcd0 6e 73 20 6d 75 73 74 20 62 65 20 55 4e 49 51 55  ns must be UNIQU
2fce0 45 20 61 6e 64 20 4e 4f 54 20 4e 55 4c 4c 2e 0a  E and NOT NULL..
2fcf0 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 72 6f    **.  ** The ro
2fd00 77 69 64 20 66 6f 72 20 61 20 74 61 62 6c 65 20  wid for a table 
2fd10 69 73 20 61 6c 77 61 79 73 20 55 4e 49 51 55 45  is always UNIQUE
2fd20 20 61 6e 64 20 4e 4f 54 20 4e 55 4c 4c 20 73 6f   and NOT NULL so
2fd30 20 77 68 65 6e 65 76 65 72 20 74 68 65 0a 20 20   whenever the.  
2fd40 2a 2a 20 72 6f 77 69 64 20 61 70 70 65 61 72 73  ** rowid appears
2fd50 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59   in the ORDER BY
2fd60 20 63 6c 61 75 73 65 2c 20 74 68 65 20 63 6f 72   clause, the cor
2fd70 72 65 73 70 6f 6e 64 69 6e 67 20 57 68 65 72 65  responding Where
2fd80 4c 6f 6f 70 20 69 73 0a 20 20 2a 2a 20 61 75 74  Loop is.  ** aut
2fd90 6f 6d 61 74 69 63 61 6c 6c 79 20 6f 72 64 65 72  omatically order
2fda0 2d 64 69 73 74 69 6e 63 74 2e 0a 20 20 2a 2f 0a  -distinct..  */.
2fdb0 0a 20 20 61 73 73 65 72 74 28 20 70 4f 72 64 65  .  assert( pOrde
2fdc0 72 42 79 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  rBy!=0 );.  if( 
2fdd0 6e 4c 6f 6f 70 20 26 26 20 4f 70 74 69 6d 69 7a  nLoop && Optimiz
2fde0 61 74 69 6f 6e 44 69 73 61 62 6c 65 64 28 64 62  ationDisabled(db
2fdf0 2c 20 53 51 4c 49 54 45 5f 4f 72 64 65 72 42 79  , SQLITE_OrderBy
2fe00 49 64 78 4a 6f 69 6e 29 20 29 20 72 65 74 75 72  IdxJoin) ) retur
2fe10 6e 20 30 3b 0a 0a 20 20 6e 4f 72 64 65 72 42 79  n 0;..  nOrderBy
2fe20 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78   = pOrderBy->nEx
2fe30 70 72 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20  pr;.  testcase( 
2fe40 6e 4f 72 64 65 72 42 79 3d 3d 42 4d 53 2d 31 20  nOrderBy==BMS-1 
2fe50 29 3b 0a 20 20 69 66 28 20 6e 4f 72 64 65 72 42  );.  if( nOrderB
2fe60 79 3e 42 4d 53 2d 31 20 29 20 72 65 74 75 72 6e  y>BMS-1 ) return
2fe70 20 30 3b 20 20 2f 2a 20 43 61 6e 6e 6f 74 20 6f   0;  /* Cannot o
2fe80 70 74 69 6d 69 7a 65 20 6f 76 65 72 6c 79 20 6c  ptimize overly l
2fe90 61 72 67 65 20 4f 52 44 45 52 20 42 59 73 20 2a  arge ORDER BYs *
2fea0 2f 0a 20 20 69 73 4f 72 64 65 72 44 69 73 74 69  /.  isOrderDisti
2feb0 6e 63 74 20 3d 20 31 3b 0a 20 20 6f 62 44 6f 6e  nct = 1;.  obDon
2fec0 65 20 3d 20 4d 41 53 4b 42 49 54 28 6e 4f 72 64  e = MASKBIT(nOrd
2fed0 65 72 42 79 29 2d 31 3b 0a 20 20 6f 72 64 65 72  erBy)-1;.  order
2fee0 44 69 73 74 69 6e 63 74 4d 61 73 6b 20 3d 20 30  DistinctMask = 0
2fef0 3b 0a 20 20 72 65 61 64 79 20 3d 20 30 3b 0a 20  ;.  ready = 0;. 
2ff00 20 66 6f 72 28 69 4c 6f 6f 70 3d 30 3b 20 69 73   for(iLoop=0; is
2ff10 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 26 26  OrderDistinct &&
2ff20 20 6f 62 53 61 74 3c 6f 62 44 6f 6e 65 20 26 26   obSat<obDone &&
2ff30 20 69 4c 6f 6f 70 3c 3d 6e 4c 6f 6f 70 3b 20 69   iLoop<=nLoop; i
2ff40 4c 6f 6f 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28  Loop++){.    if(
2ff50 20 69 4c 6f 6f 70 3e 30 20 29 20 72 65 61 64 79   iLoop>0 ) ready
2ff60 20 7c 3d 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53   |= pLoop->maskS
2ff70 65 6c 66 3b 0a 20 20 20 20 70 4c 6f 6f 70 20 3d  elf;.    pLoop =
2ff80 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70 20 3f 20 70   iLoop<nLoop ? p
2ff90 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b 69 4c 6f 6f  Path->aLoop[iLoo
2ffa0 70 5d 20 3a 20 70 4c 61 73 74 3b 0a 20 20 20 20  p] : pLast;.    
2ffb0 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  if( pLoop->wsFla
2ffc0 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55  gs & WHERE_VIRTU
2ffd0 41 4c 54 41 42 4c 45 20 29 7b 0a 20 20 20 20 20  ALTABLE ){.     
2ffe0 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74   if( pLoop->u.vt
2fff0 61 62 2e 69 73 4f 72 64 65 72 65 64 20 29 20 6f  ab.isOrdered ) o
30000 62 53 61 74 20 3d 20 6f 62 44 6f 6e 65 3b 0a 20  bSat = obDone;. 
30010 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
30020 7d 0a 20 20 20 20 69 43 75 72 20 3d 20 70 57 49  }.    iCur = pWI
30030 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61  nfo->pTabList->a
30040 5b 70 4c 6f 6f 70 2d 3e 69 54 61 62 5d 2e 69 43  [pLoop->iTab].iC
30050 75 72 73 6f 72 3b 0a 0a 20 20 20 20 2f 2a 20 4d  ursor;..    /* M
30060 61 72 6b 20 6f 66 66 20 61 6e 79 20 4f 52 44 45  ark off any ORDE
30070 52 20 42 59 20 74 65 72 6d 20 58 20 74 68 61 74  R BY term X that
30080 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20   is a column in 
30090 74 68 65 20 74 61 62 6c 65 20 6f 66 0a 20 20 20  the table of.   
300a0 20 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20   ** the current 
300b0 6c 6f 6f 70 20 66 6f 72 20 77 68 69 63 68 20 74  loop for which t
300c0 68 65 72 65 20 69 73 20 74 65 72 6d 20 69 6e 20  here is term in 
300d0 74 68 65 20 57 48 45 52 45 0a 20 20 20 20 2a 2a  the WHERE.    **
300e0 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 66   clause of the f
300f0 6f 72 6d 20 58 20 49 53 20 4e 55 4c 4c 20 6f 72  orm X IS NULL or
30100 20 58 3d 3f 20 74 68 61 74 20 72 65 66 65 72 65   X=? that refere
30110 6e 63 65 20 6f 6e 6c 79 20 6f 75 74 65 72 0a 20  nce only outer. 
30120 20 20 20 2a 2a 20 6c 6f 6f 70 73 2e 0a 20 20 20     ** loops..   
30130 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   */.    for(i=0;
30140 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b   i<nOrderBy; i++
30150 29 7b 0a 20 20 20 20 20 20 69 66 28 20 4d 41 53  ){.      if( MAS
30160 4b 42 49 54 28 69 29 20 26 20 6f 62 53 61 74 20  KBIT(i) & obSat 
30170 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
30180 20 20 70 4f 42 45 78 70 72 20 3d 20 73 71 6c 69    pOBExpr = sqli
30190 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61  te3ExprSkipColla
301a0 74 65 28 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69  te(pOrderBy->a[i
301b0 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
301c0 69 66 28 20 70 4f 42 45 78 70 72 2d 3e 6f 70 21  if( pOBExpr->op!
301d0 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 63 6f 6e  =TK_COLUMN ) con
301e0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28  tinue;.      if(
301f0 20 70 4f 42 45 78 70 72 2d 3e 69 54 61 62 6c 65   pOBExpr->iTable
30200 21 3d 69 43 75 72 20 29 20 63 6f 6e 74 69 6e 75  !=iCur ) continu
30210 65 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d  e;.      pTerm =
30220 20 66 69 6e 64 54 65 72 6d 28 26 70 57 49 6e 66   findTerm(&pWInf
30230 6f 2d 3e 73 57 43 2c 20 69 43 75 72 2c 20 70 4f  o->sWC, iCur, pO
30240 42 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 0a  BExpr->iColumn,.
30250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30260 20 20 20 20 20 20 20 7e 72 65 61 64 79 2c 20 57         ~ready, W
30270 4f 5f 45 51 7c 57 4f 5f 49 53 4e 55 4c 4c 2c 20  O_EQ|WO_ISNULL, 
30280 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54  0);.      if( pT
30290 65 72 6d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  erm==0 ) continu
302a0 65 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 54  e;.      if( (pT
302b0 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 26 57  erm->eOperator&W
302c0 4f 5f 45 51 29 21 3d 30 20 26 26 20 70 4f 42 45  O_EQ)!=0 && pOBE
302d0 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20  xpr->iColumn>=0 
302e0 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  ){.        const
302f0 20 63 68 61 72 20 2a 7a 31 2c 20 2a 7a 32 3b 0a   char *z1, *z2;.
30300 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20          pColl = 
30310 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
30320 65 71 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73  eq(pWInfo->pPars
30330 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69  e, pOrderBy->a[i
30340 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
30350 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 20 70    if( !pColl ) p
30360 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74  Coll = db->pDflt
30370 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 7a 31  Coll;.        z1
30380 20 3d 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 3b   = pColl->zName;
30390 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d  .        pColl =
303a0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
303b0 53 65 71 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72  Seq(pWInfo->pPar
303c0 73 65 2c 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  se, pTerm->pExpr
303d0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  );.        if( !
303e0 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20  pColl ) pColl = 
303f0 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20  db->pDfltColl;. 
30400 20 20 20 20 20 20 20 7a 32 20 3d 20 70 43 6f 6c         z2 = pCol
30410 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  l->zName;.      
30420 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
30430 49 43 6d 70 28 7a 31 2c 20 7a 32 29 21 3d 30 20  ICmp(z1, z2)!=0 
30440 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
30450 20 20 7d 0a 20 20 20 20 20 20 6f 62 53 61 74 20    }.      obSat 
30460 7c 3d 20 4d 41 53 4b 42 49 54 28 69 29 3b 0a 20  |= MASKBIT(i);. 
30470 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 28 70     }..    if( (p
30480 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
30490 57 48 45 52 45 5f 4f 4e 45 52 4f 57 29 3d 3d 30  WHERE_ONEROW)==0
304a0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4c   ){.      if( pL
304b0 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
304c0 48 45 52 45 5f 49 50 4b 20 29 7b 0a 20 20 20 20  HERE_IPK ){.    
304d0 20 20 20 20 70 49 6e 64 65 78 20 3d 20 30 3b 0a      pIndex = 0;.
304e0 20 20 20 20 20 20 20 20 6e 4b 65 79 43 6f 6c 20          nKeyCol 
304f0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 6e 43 6f  = 0;.        nCo
30500 6c 75 6d 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20  lumn = 1;.      
30510 7d 65 6c 73 65 20 69 66 28 20 28 70 49 6e 64 65  }else if( (pInde
30520 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72  x = pLoop->u.btr
30530 65 65 2e 70 49 6e 64 65 78 29 3d 3d 30 20 7c 7c  ee.pIndex)==0 ||
30540 20 70 49 6e 64 65 78 2d 3e 62 55 6e 6f 72 64 65   pIndex->bUnorde
30550 72 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 72  red ){.        r
30560 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d  eturn 0;.      }
30570 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6e 4b  else{.        nK
30580 65 79 43 6f 6c 20 3d 20 70 49 6e 64 65 78 2d 3e  eyCol = pIndex->
30590 6e 4b 65 79 43 6f 6c 3b 0a 20 20 20 20 20 20 20  nKeyCol;.       
305a0 20 6e 43 6f 6c 75 6d 6e 20 3d 20 70 49 6e 64 65   nColumn = pInde
305b0 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  x->nColumn;.    
305c0 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c      assert( nCol
305d0 75 6d 6e 3d 3d 6e 4b 65 79 43 6f 6c 2b 31 20 7c  umn==nKeyCol+1 |
305e0 7c 20 21 48 61 73 52 6f 77 69 64 28 70 49 6e 64  | !HasRowid(pInd
305f0 65 78 2d 3e 70 54 61 62 6c 65 29 20 29 3b 0a 20  ex->pTable) );. 
30600 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
30610 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  Index->aiColumn[
30620 6e 43 6f 6c 75 6d 6e 2d 31 5d 3d 3d 28 2d 31 29  nColumn-1]==(-1)
30630 20 7c 7c 20 21 48 61 73 52 6f 77 69 64 28 70 49   || !HasRowid(pI
30640 6e 64 65 78 2d 3e 70 54 61 62 6c 65 29 29 3b 0a  ndex->pTable));.
30650 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 44          isOrderD
30660 69 73 74 69 6e 63 74 20 3d 20 49 73 55 6e 69 71  istinct = IsUniq
30670 75 65 49 6e 64 65 78 28 70 49 6e 64 65 78 29 3b  ueIndex(pIndex);
30680 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
30690 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20  /* Loop through 
306a0 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74  all columns of t
306b0 68 65 20 69 6e 64 65 78 20 61 6e 64 20 64 65 61  he index and dea
306c0 6c 20 77 69 74 68 20 74 68 65 20 6f 6e 65 73 0a  l with the ones.
306d0 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 61 72        ** that ar
306e0 65 20 6e 6f 74 20 63 6f 6e 73 74 72 61 69 6e 65  e not constraine
306f0 64 20 62 79 20 3d 3d 20 6f 72 20 49 4e 2e 0a 20  d by == or IN.. 
30700 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65       */.      re
30710 76 20 3d 20 72 65 76 53 65 74 20 3d 20 30 3b 0a  v = revSet = 0;.
30720 20 20 20 20 20 20 64 69 73 74 69 6e 63 74 43 6f        distinctCo
30730 6c 75 6d 6e 73 20 3d 20 30 3b 0a 20 20 20 20 20  lumns = 0;.     
30740 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 43 6f 6c   for(j=0; j<nCol
30750 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  umn; j++){.     
30760 20 20 20 75 38 20 62 4f 6e 63 65 3b 20 20 20 2f     u8 bOnce;   /
30770 2a 20 54 72 75 65 20 74 6f 20 72 75 6e 20 74 68  * True to run th
30780 65 20 4f 52 44 45 52 20 42 59 20 73 65 61 72 63  e ORDER BY searc
30790 68 20 6c 6f 6f 70 20 2a 2f 0a 0a 20 20 20 20 20  h loop */..     
307a0 20 20 20 2f 2a 20 53 6b 69 70 20 6f 76 65 72 20     /* Skip over 
307b0 3d 3d 20 61 6e 64 20 49 53 20 4e 55 4c 4c 20 74  == and IS NULL t
307c0 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  erms */.        
307d0 69 66 28 20 6a 3c 70 4c 6f 6f 70 2d 3e 75 2e 62  if( j<pLoop->u.b
307e0 74 72 65 65 2e 6e 45 71 0a 20 20 20 20 20 20 20  tree.nEq.       
307f0 20 20 26 26 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74    && pLoop->u.bt
30800 72 65 65 2e 6e 53 6b 69 70 3d 3d 30 0a 20 20 20  ree.nSkip==0.   
30810 20 20 20 20 20 20 26 26 20 28 28 69 20 3d 20 70        && ((i = p
30820 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 2d  Loop->aLTerm[j]-
30830 3e 65 4f 70 65 72 61 74 6f 72 29 20 26 20 28 57  >eOperator) & (W
30840 4f 5f 45 51 7c 57 4f 5f 49 53 4e 55 4c 4c 29 29  O_EQ|WO_ISNULL))
30850 21 3d 30 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  !=0.        ){. 
30860 20 20 20 20 20 20 20 20 20 69 66 28 20 69 20 26           if( i &
30870 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20   WO_ISNULL ){.  
30880 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
30890 73 65 28 20 69 73 4f 72 64 65 72 44 69 73 74 69  se( isOrderDisti
308a0 6e 63 74 20 29 3b 0a 20 20 20 20 20 20 20 20 20  nct );.         
308b0 20 20 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e     isOrderDistin
308c0 63 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ct = 0;.        
308d0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 63 6f    }.          co
308e0 6e 74 69 6e 75 65 3b 20 20 0a 20 20 20 20 20 20  ntinue;  .      
308f0 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20    }..        /* 
30900 47 65 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  Get the column n
30910 75 6d 62 65 72 20 69 6e 20 74 68 65 20 74 61 62  umber in the tab
30920 6c 65 20 28 69 43 6f 6c 75 6d 6e 29 20 61 6e 64  le (iColumn) and
30930 20 73 6f 72 74 20 6f 72 64 65 72 0a 20 20 20 20   sort order.    
30940 20 20 20 20 2a 2a 20 28 72 65 76 49 64 78 29 20      ** (revIdx) 
30950 66 6f 72 20 74 68 65 20 6a 2d 74 68 20 63 6f 6c  for the j-th col
30960 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64 65 78  umn of the index
30970 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
30980 20 20 20 20 20 69 66 28 20 70 49 6e 64 65 78 20       if( pIndex 
30990 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 43 6f  ){.          iCo
309a0 6c 75 6d 6e 20 3d 20 70 49 6e 64 65 78 2d 3e 61  lumn = pIndex->a
309b0 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20  iColumn[j];.    
309c0 20 20 20 20 20 20 72 65 76 49 64 78 20 3d 20 70        revIdx = p
309d0 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65  Index->aSortOrde
309e0 72 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  r[j];.          
309f0 69 66 28 20 69 43 6f 6c 75 6d 6e 3d 3d 70 49 6e  if( iColumn==pIn
30a00 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 69 50 4b  dex->pTable->iPK
30a10 65 79 20 29 20 69 43 6f 6c 75 6d 6e 20 3d 20 2d  ey ) iColumn = -
30a20 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  1;.        }else
30a30 7b 0a 20 20 20 20 20 20 20 20 20 20 69 43 6f 6c  {.          iCol
30a40 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  umn = -1;.      
30a50 20 20 20 20 72 65 76 49 64 78 20 3d 20 30 3b 0a      revIdx = 0;.
30a60 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
30a70 20 20 20 2f 2a 20 41 6e 20 75 6e 63 6f 6e 73 74     /* An unconst
30a80 72 61 69 6e 65 64 20 63 6f 6c 75 6d 6e 20 74 68  rained column th
30a90 61 74 20 6d 69 67 68 74 20 62 65 20 4e 55 4c 4c  at might be NULL
30aa0 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 69 73   means that this
30ab0 0a 20 20 20 20 20 20 20 20 2a 2a 20 57 68 65 72  .        ** Wher
30ac0 65 4c 6f 6f 70 20 69 73 20 6e 6f 74 20 77 65 6c  eLoop is not wel
30ad0 6c 2d 6f 72 64 65 72 65 64 0a 20 20 20 20 20 20  l-ordered.      
30ae0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
30af0 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74   isOrderDistinct
30b00 0a 20 20 20 20 20 20 20 20 20 26 26 20 69 43 6f  .         && iCo
30b10 6c 75 6d 6e 3e 3d 30 0a 20 20 20 20 20 20 20 20  lumn>=0.        
30b20 20 26 26 20 6a 3e 3d 70 4c 6f 6f 70 2d 3e 75 2e   && j>=pLoop->u.
30b30 62 74 72 65 65 2e 6e 45 71 0a 20 20 20 20 20 20  btree.nEq.      
30b40 20 20 20 26 26 20 70 49 6e 64 65 78 2d 3e 70 54     && pIndex->pT
30b50 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 75  able->aCol[iColu
30b60 6d 6e 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 0a 20  mn].notNull==0. 
30b70 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
30b80 20 20 20 20 69 73 4f 72 64 65 72 44 69 73 74 69      isOrderDisti
30b90 6e 63 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  nct = 0;.       
30ba0 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 46   }..        /* F
30bb0 69 6e 64 20 74 68 65 20 4f 52 44 45 52 20 42 59  ind the ORDER BY
30bc0 20 74 65 72 6d 20 74 68 61 74 20 63 6f 72 72 65   term that corre
30bd0 73 70 6f 6e 64 73 20 74 6f 20 74 68 65 20 6a 2d  sponds to the j-
30be0 74 68 20 63 6f 6c 75 6d 6e 0a 20 20 20 20 20 20  th column.      
30bf0 20 20 2a 2a 20 6f 66 20 74 68 65 20 69 6e 64 65    ** of the inde
30c00 78 20 61 6e 64 20 6d 61 72 6b 20 74 68 61 74 20  x and mark that 
30c10 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20 6f 66  ORDER BY term of
30c20 66 20 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  f .        */.  
30c30 20 20 20 20 20 20 62 4f 6e 63 65 20 3d 20 31 3b        bOnce = 1;
30c40 0a 20 20 20 20 20 20 20 20 69 73 4d 61 74 63 68  .        isMatch
30c50 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 66 6f   = 0;.        fo
30c60 72 28 69 3d 30 3b 20 62 4f 6e 63 65 20 26 26 20  r(i=0; bOnce && 
30c70 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29  i<nOrderBy; i++)
30c80 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
30c90 4d 41 53 4b 42 49 54 28 69 29 20 26 20 6f 62 53  MASKBIT(i) & obS
30ca0 61 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  at ) continue;. 
30cb0 20 20 20 20 20 20 20 20 20 70 4f 42 45 78 70 72           pOBExpr
30cc0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b   = sqlite3ExprSk
30cd0 69 70 43 6f 6c 6c 61 74 65 28 70 4f 72 64 65 72  ipCollate(pOrder
30ce0 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b  By->a[i].pExpr);
30cf0 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
30d00 61 73 65 28 20 77 63 74 72 6c 46 6c 61 67 73 20  ase( wctrlFlags 
30d10 26 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20  & WHERE_GROUPBY 
30d20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73  );.          tes
30d30 74 63 61 73 65 28 20 77 63 74 72 6c 46 6c 61 67  tcase( wctrlFlag
30d40 73 20 26 20 57 48 45 52 45 5f 44 49 53 54 49 4e  s & WHERE_DISTIN
30d50 43 54 42 59 20 29 3b 0a 20 20 20 20 20 20 20 20  CTBY );.        
30d60 20 20 69 66 28 20 28 77 63 74 72 6c 46 6c 61 67    if( (wctrlFlag
30d70 73 20 26 20 28 57 48 45 52 45 5f 47 52 4f 55 50  s & (WHERE_GROUP
30d80 42 59 7c 57 48 45 52 45 5f 44 49 53 54 49 4e 43  BY|WHERE_DISTINC
30d90 54 42 59 29 29 3d 3d 30 20 29 20 62 4f 6e 63 65  TBY))==0 ) bOnce
30da0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
30db0 69 66 28 20 70 4f 42 45 78 70 72 2d 3e 6f 70 21  if( pOBExpr->op!
30dc0 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 63 6f 6e  =TK_COLUMN ) con
30dd0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
30de0 20 69 66 28 20 70 4f 42 45 78 70 72 2d 3e 69 54   if( pOBExpr->iT
30df0 61 62 6c 65 21 3d 69 43 75 72 20 29 20 63 6f 6e  able!=iCur ) con
30e00 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
30e10 20 69 66 28 20 70 4f 42 45 78 70 72 2d 3e 69 43   if( pOBExpr->iC
30e20 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 75 6d 6e 20 29  olumn!=iColumn )
30e30 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
30e40 20 20 20 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e       if( iColumn
30e50 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  >=0 ){.         
30e60 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
30e70 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 57  e3ExprCollSeq(pW
30e80 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2c 20 70 4f  Info->pParse, pO
30e90 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78  rderBy->a[i].pEx
30ea0 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  pr);.           
30eb0 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 20 70 43   if( !pColl ) pC
30ec0 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43  oll = db->pDfltC
30ed0 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20  oll;.           
30ee0 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
30ef0 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  Cmp(pColl->zName
30f00 2c 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c  , pIndex->azColl
30f10 5b 6a 5d 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e  [j])!=0 ) contin
30f20 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ue;.          }.
30f30 20 20 20 20 20 20 20 20 20 20 69 73 4d 61 74 63            isMatc
30f40 68 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  h = 1;.         
30f50 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
30f60 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 73  }.        if( is
30f70 4d 61 74 63 68 20 26 26 20 28 70 57 49 6e 66 6f  Match && (pWInfo
30f80 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ->wctrlFlags & W
30f90 48 45 52 45 5f 47 52 4f 55 50 42 59 29 3d 3d 30  HERE_GROUPBY)==0
30fa0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
30fb0 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 73   Make sure the s
30fc0 6f 72 74 20 6f 72 64 65 72 20 69 73 20 63 6f 6d  ort order is com
30fd0 70 61 74 69 62 6c 65 20 69 6e 20 61 6e 20 4f 52  patible in an OR
30fe0 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 0a 20  DER BY clause.. 
30ff0 20 20 20 20 20 20 20 20 20 2a 2a 20 53 6f 72 74           ** Sort
31000 20 6f 72 64 65 72 20 69 73 20 69 72 72 65 6c 65   order is irrele
31010 76 61 6e 74 20 66 6f 72 20 61 20 47 52 4f 55 50  vant for a GROUP
31020 20 42 59 20 63 6c 61 75 73 65 2e 20 2a 2f 0a 20   BY clause. */. 
31030 20 20 20 20 20 20 20 20 20 69 66 28 20 72 65 76           if( rev
31040 53 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Set ){.         
31050 20 20 20 69 66 28 20 28 72 65 76 20 5e 20 72 65     if( (rev ^ re
31060 76 49 64 78 29 21 3d 70 4f 72 64 65 72 42 79 2d  vIdx)!=pOrderBy-
31070 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 20  >a[i].sortOrder 
31080 29 20 69 73 4d 61 74 63 68 20 3d 20 30 3b 0a 20  ) isMatch = 0;. 
31090 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
310a0 20 20 20 20 20 20 20 20 20 20 20 20 72 65 76 20              rev 
310b0 3d 20 72 65 76 49 64 78 20 5e 20 70 4f 72 64 65  = revIdx ^ pOrde
310c0 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72  rBy->a[i].sortOr
310d0 64 65 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20  der;.           
310e0 20 69 66 28 20 72 65 76 20 29 20 2a 70 52 65 76   if( rev ) *pRev
310f0 4d 61 73 6b 20 7c 3d 20 4d 41 53 4b 42 49 54 28  Mask |= MASKBIT(
31100 69 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 20 20  iLoop);.        
31110 20 20 20 20 72 65 76 53 65 74 20 3d 20 31 3b 0a      revSet = 1;.
31120 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
31130 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
31140 28 20 69 73 4d 61 74 63 68 20 29 7b 0a 20 20 20  ( isMatch ){.   
31150 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 75         if( iColu
31160 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  mn<0 ){.        
31170 20 20 20 20 74 65 73 74 63 61 73 65 28 20 64 69      testcase( di
31180 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 3d 3d 30  stinctColumns==0
31190 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
311a0 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 20  distinctColumns 
311b0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 1;.          }
311c0 0a 20 20 20 20 20 20 20 20 20 20 6f 62 53 61 74  .          obSat
311d0 20 7c 3d 20 4d 41 53 4b 42 49 54 28 69 29 3b 0a   |= MASKBIT(i);.
311e0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
311f0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20 6d           /* No m
31200 61 74 63 68 20 66 6f 75 6e 64 20 2a 2f 0a 20 20  atch found */.  
31210 20 20 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 30          if( j==0
31220 20 7c 7c 20 6a 3c 6e 4b 65 79 43 6f 6c 20 29 7b   || j<nKeyCol ){
31230 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73  .            tes
31240 74 63 61 73 65 28 20 69 73 4f 72 64 65 72 44 69  tcase( isOrderDi
31250 73 74 69 6e 63 74 21 3d 30 20 29 3b 0a 20 20 20  stinct!=0 );.   
31260 20 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72           isOrder
31270 44 69 73 74 69 6e 63 74 20 3d 20 30 3b 0a 20 20  Distinct = 0;.  
31280 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
31290 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
312a0 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 2f 2a 20     }.      } /* 
312b0 65 6e 64 20 4c 6f 6f 70 20 6f 76 65 72 20 61 6c  end Loop over al
312c0 6c 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20  l index columns 
312d0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 64 69 73  */.      if( dis
312e0 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 20 29 7b 0a  tinctColumns ){.
312f0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
31300 28 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63  ( isOrderDistinc
31310 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  t==0 );.        
31320 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20  isOrderDistinct 
31330 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
31340 20 7d 20 2f 2a 20 65 6e 64 2d 69 66 20 6e 6f 74   } /* end-if not
31350 20 6f 6e 65 2d 72 6f 77 20 2a 2f 0a 0a 20 20 20   one-row */..   
31360 20 2f 2a 20 4d 61 72 6b 20 6f 66 66 20 61 6e 79   /* Mark off any
31370 20 6f 74 68 65 72 20 4f 52 44 45 52 20 42 59 20   other ORDER BY 
31380 74 65 72 6d 73 20 74 68 61 74 20 72 65 66 65 72  terms that refer
31390 65 6e 63 65 20 70 4c 6f 6f 70 20 2a 2f 0a 20 20  ence pLoop */.  
313a0 20 20 69 66 28 20 69 73 4f 72 64 65 72 44 69 73    if( isOrderDis
313b0 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 20 20 6f  tinct ){.      o
313c0 72 64 65 72 44 69 73 74 69 6e 63 74 4d 61 73 6b  rderDistinctMask
313d0 20 7c 3d 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53   |= pLoop->maskS
313e0 65 6c 66 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  elf;.      for(i
313f0 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20  =0; i<nOrderBy; 
31400 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 45 78  i++){.        Ex
31410 70 72 20 2a 70 3b 0a 20 20 20 20 20 20 20 20 42  pr *p;.        B
31420 69 74 6d 61 73 6b 20 6d 54 65 72 6d 3b 0a 20 20  itmask mTerm;.  
31430 20 20 20 20 20 20 69 66 28 20 4d 41 53 4b 42 49        if( MASKBI
31440 54 28 69 29 20 26 20 6f 62 53 61 74 20 29 20 63  T(i) & obSat ) c
31450 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
31460 20 70 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61   p = pOrderBy->a
31470 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [i].pExpr;.     
31480 20 20 20 6d 54 65 72 6d 20 3d 20 65 78 70 72 54     mTerm = exprT
31490 61 62 6c 65 55 73 61 67 65 28 26 70 57 49 6e 66  ableUsage(&pWInf
314a0 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 70 29 3b 0a  o->sMaskSet,p);.
314b0 20 20 20 20 20 20 20 20 69 66 28 20 6d 54 65 72          if( mTer
314c0 6d 3d 3d 30 20 26 26 20 21 73 71 6c 69 74 65 33  m==0 && !sqlite3
314d0 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70  ExprIsConstant(p
314e0 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
314f0 20 20 20 20 20 20 69 66 28 20 28 6d 54 65 72 6d        if( (mTerm
31500 26 7e 6f 72 64 65 72 44 69 73 74 69 6e 63 74 4d  &~orderDistinctM
31510 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ask)==0 ){.     
31520 20 20 20 20 20 6f 62 53 61 74 20 7c 3d 20 4d 41       obSat |= MA
31530 53 4b 42 49 54 28 69 29 3b 0a 20 20 20 20 20 20  SKBIT(i);.      
31540 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
31550 7d 0a 20 20 7d 20 2f 2a 20 45 6e 64 20 74 68 65  }.  } /* End the
31560 20 6c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20 57   loop over all W
31570 68 65 72 65 4c 6f 6f 70 73 20 66 72 6f 6d 20 6f  hereLoops from o
31580 75 74 65 72 2d 6d 6f 73 74 20 64 6f 77 6e 20 74  uter-most down t
31590 6f 20 69 6e 6e 65 72 2d 6d 6f 73 74 20 2a 2f 0a  o inner-most */.
315a0 20 20 69 66 28 20 6f 62 53 61 74 3d 3d 6f 62 44    if( obSat==obD
315b0 6f 6e 65 20 29 20 72 65 74 75 72 6e 20 28 69 38  one ) return (i8
315c0 29 6e 4f 72 64 65 72 42 79 3b 0a 20 20 69 66 28  )nOrderBy;.  if(
315d0 20 21 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63   !isOrderDistinc
315e0 74 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 6e  t ){.    for(i=n
315f0 4f 72 64 65 72 42 79 2d 31 3b 20 69 3e 30 3b 20  OrderBy-1; i>0; 
31600 69 2d 2d 29 7b 0a 20 20 20 20 20 20 42 69 74 6d  i--){.      Bitm
31610 61 73 6b 20 6d 20 3d 20 4d 41 53 4b 42 49 54 28  ask m = MASKBIT(
31620 69 29 20 2d 20 31 3b 0a 20 20 20 20 20 20 69 66  i) - 1;.      if
31630 28 20 28 6f 62 53 61 74 26 6d 29 3d 3d 6d 20 29  ( (obSat&m)==m )
31640 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 20 20 7d   return i;.    }
31650 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
31660 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a   }.  return -1;.
31670 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  }.../*.** If the
31680 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20 66   WHERE_GROUPBY f
31690 6c 61 67 20 69 73 20 73 65 74 20 69 6e 20 74 68  lag is set in th
316a0 65 20 6d 61 73 6b 20 70 61 73 73 65 64 20 74 6f  e mask passed to
316b0 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
316c0 69 6e 28 29 2c 0a 2a 2a 20 74 68 65 20 70 6c 61  in(),.** the pla
316d0 6e 6e 65 72 20 61 73 73 75 6d 65 73 20 74 68 61  nner assumes tha
316e0 74 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  t the specified 
316f0 70 4f 72 64 65 72 42 79 20 6c 69 73 74 20 69 73  pOrderBy list is
31700 20 61 63 74 75 61 6c 6c 79 20 61 20 47 52 4f 55   actually a GROU
31710 50 0a 2a 2a 20 42 59 20 63 6c 61 75 73 65 20 2d  P.** BY clause -
31720 20 61 6e 64 20 73 6f 20 61 6e 79 20 6f 72 64 65   and so any orde
31730 72 20 74 68 61 74 20 67 72 6f 75 70 73 20 72 6f  r that groups ro
31740 77 73 20 61 73 20 72 65 71 75 69 72 65 64 20 73  ws as required s
31750 61 74 69 73 66 69 65 73 20 74 68 65 0a 2a 2a 20  atisfies the.** 
31760 72 65 71 75 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 4e  request..**.** N
31770 6f 72 6d 61 6c 6c 79 2c 20 69 6e 20 74 68 69 73  ormally, in this
31780 20 63 61 73 65 20 69 74 20 69 73 20 6e 6f 74 20   case it is not 
31790 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 74 68 65  possible for the
317a0 20 63 61 6c 6c 65 72 20 74 6f 20 64 65 74 65 72   caller to deter
317b0 6d 69 6e 65 0a 2a 2a 20 77 68 65 74 68 65 72 20  mine.** whether 
317c0 6f 72 20 6e 6f 74 20 74 68 65 20 72 6f 77 73 20  or not the rows 
317d0 61 72 65 20 72 65 61 6c 6c 79 20 62 65 69 6e 67  are really being
317e0 20 64 65 6c 69 76 65 72 65 64 20 69 6e 20 73 6f   delivered in so
317f0 72 74 65 64 20 6f 72 64 65 72 2c 20 6f 72 0a 2a  rted order, or.*
31800 2a 20 6a 75 73 74 20 69 6e 20 73 6f 6d 65 20 6f  * just in some o
31810 74 68 65 72 20 6f 72 64 65 72 20 74 68 61 74 20  ther order that 
31820 70 72 6f 76 69 64 65 73 20 74 68 65 20 72 65 71  provides the req
31830 75 69 72 65 64 20 67 72 6f 75 70 69 6e 67 2e 20  uired grouping. 
31840 48 6f 77 65 76 65 72 2c 0a 2a 2a 20 69 66 20 74  However,.** if t
31850 68 65 20 57 48 45 52 45 5f 53 4f 52 54 42 59 47  he WHERE_SORTBYG
31860 52 4f 55 50 20 66 6c 61 67 20 69 73 20 61 6c 73  ROUP flag is als
31870 6f 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c 69  o passed to sqli
31880 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 2c  te3WhereBegin(),
31890 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20 66 75   then.** this fu
318a0 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 63 61  nction may be ca
318b0 6c 6c 65 64 20 6f 6e 20 74 68 65 20 72 65 74 75  lled on the retu
318c0 72 6e 65 64 20 57 68 65 72 65 49 6e 66 6f 20 6f  rned WhereInfo o
318d0 62 6a 65 63 74 2e 20 49 74 20 72 65 74 75 72 6e  bject. It return
318e0 73 0a 2a 2a 20 74 72 75 65 20 69 66 20 74 68 65  s.** true if the
318f0 20 72 6f 77 73 20 72 65 61 6c 6c 79 20 77 69 6c   rows really wil
31900 6c 20 62 65 20 73 6f 72 74 65 64 20 69 6e 20 74  l be sorted in t
31910 68 65 20 73 70 65 63 69 66 69 65 64 20 6f 72 64  he specified ord
31920 65 72 2c 20 6f 72 20 66 61 6c 73 65 0a 2a 2a 20  er, or false.** 
31930 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a  otherwise..**.**
31940 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 61 73   For example, as
31950 73 75 6d 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20  suming:.**.**   
31960 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 31 20  CREATE INDEX i1 
31970 4f 4e 20 74 31 28 78 2c 20 59 29 3b 0a 2a 2a 0a  ON t1(x, Y);.**.
31980 2a 2a 20 74 68 65 6e 0a 2a 2a 0a 2a 2a 20 20 20  ** then.**.**   
31990 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
319a0 20 47 52 4f 55 50 20 42 59 20 78 2c 79 20 4f 52   GROUP BY x,y OR
319b0 44 45 52 20 42 59 20 78 2c 79 3b 20 20 20 2d 2d  DER BY x,y;   --
319c0 20 49 73 53 6f 72 74 65 64 28 29 3d 3d 31 0a 2a   IsSorted()==1.*
319d0 2a 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  *   SELECT * FRO
319e0 4d 20 74 31 20 47 52 4f 55 50 20 42 59 20 79 2c  M t1 GROUP BY y,
319f0 78 20 4f 52 44 45 52 20 42 59 20 79 2c 78 3b 20  x ORDER BY y,x; 
31a00 20 20 2d 2d 20 49 73 53 6f 72 74 65 64 28 29 3d    -- IsSorted()=
31a10 3d 30 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  =0.*/.int sqlite
31a20 33 57 68 65 72 65 49 73 53 6f 72 74 65 64 28 57  3WhereIsSorted(W
31a30 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
31a40 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 57 49  ){.  assert( pWI
31a50 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
31a60 26 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20  & WHERE_GROUPBY 
31a70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 57 49  );.  assert( pWI
31a80 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
31a90 26 20 57 48 45 52 45 5f 53 4f 52 54 42 59 47 52  & WHERE_SORTBYGR
31aa0 4f 55 50 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  OUP );.  return 
31ab0 70 57 49 6e 66 6f 2d 3e 73 6f 72 74 65 64 3b 0a  pWInfo->sorted;.
31ac0 7d 0a 0a 23 69 66 64 65 66 20 57 48 45 52 45 54  }..#ifdef WHERET
31ad0 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 2f 2a 20  RACE_ENABLED./* 
31ae0 46 6f 72 20 64 65 62 75 67 67 69 6e 67 20 75 73  For debugging us
31af0 65 20 6f 6e 6c 79 3a 20 2a 2f 0a 73 74 61 74 69  e only: */.stati
31b00 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 77 68  c const char *wh
31b10 65 72 65 50 61 74 68 4e 61 6d 65 28 57 68 65 72  erePathName(Wher
31b20 65 50 61 74 68 20 2a 70 50 61 74 68 2c 20 69 6e  ePath *pPath, in
31b30 74 20 6e 4c 6f 6f 70 2c 20 57 68 65 72 65 4c 6f  t nLoop, WhereLo
31b40 6f 70 20 2a 70 4c 61 73 74 29 7b 0a 20 20 73 74  op *pLast){.  st
31b50 61 74 69 63 20 63 68 61 72 20 7a 4e 61 6d 65 5b  atic char zName[
31b60 36 35 5d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  65];.  int i;.  
31b70 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4c 6f 6f 70  for(i=0; i<nLoop
31b80 3b 20 69 2b 2b 29 7b 20 7a 4e 61 6d 65 5b 69 5d  ; i++){ zName[i]
31b90 20 3d 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b   = pPath->aLoop[
31ba0 69 5d 2d 3e 63 49 64 3b 20 7d 0a 20 20 69 66 28  i]->cId; }.  if(
31bb0 20 70 4c 61 73 74 20 29 20 7a 4e 61 6d 65 5b 69   pLast ) zName[i
31bc0 2b 2b 5d 20 3d 20 70 4c 61 73 74 2d 3e 63 49 64  ++] = pLast->cId
31bd0 3b 0a 20 20 7a 4e 61 6d 65 5b 69 5d 20 3d 20 30  ;.  zName[i] = 0
31be0 3b 0a 20 20 72 65 74 75 72 6e 20 7a 4e 61 6d 65  ;.  return zName
31bf0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
31c00 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 6f 73  * Return the cos
31c10 74 20 6f 66 20 73 6f 72 74 69 6e 67 20 6e 52 6f  t of sorting nRo
31c20 77 20 72 6f 77 73 2c 20 61 73 73 75 6d 69 6e 67  w rows, assuming
31c30 20 74 68 61 74 20 74 68 65 20 6b 65 79 73 20 68   that the keys h
31c40 61 76 65 20 0a 2a 2a 20 6e 4f 72 64 65 72 62 79  ave .** nOrderby
31c50 20 63 6f 6c 75 6d 6e 73 20 61 6e 64 20 74 68 61   columns and tha
31c60 74 20 74 68 65 20 66 69 72 73 74 20 6e 53 6f 72  t the first nSor
31c70 74 65 64 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20  ted columns are 
31c80 61 6c 72 65 61 64 79 20 69 6e 0a 2a 2a 20 6f 72  already in.** or
31c90 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4c  der..*/.static L
31ca0 6f 67 45 73 74 20 77 68 65 72 65 53 6f 72 74 69  ogEst whereSorti
31cb0 6e 67 43 6f 73 74 28 0a 20 20 57 68 65 72 65 49  ngCost(.  WhereI
31cc0 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 0a 20 20 4c  nfo *pWInfo,.  L
31cd0 6f 67 45 73 74 20 6e 52 6f 77 2c 0a 20 20 69 6e  ogEst nRow,.  in
31ce0 74 20 6e 4f 72 64 65 72 42 79 2c 0a 20 20 69 6e  t nOrderBy,.  in
31cf0 74 20 6e 53 6f 72 74 65 64 0a 29 7b 0a 20 20 2f  t nSorted.){.  /
31d00 2a 20 54 55 4e 49 4e 47 3a 20 45 73 74 69 6d 61  * TUNING: Estima
31d10 74 65 64 20 63 6f 73 74 20 6f 66 20 61 20 66 75  ted cost of a fu
31d20 6c 6c 20 65 78 74 65 72 6e 61 6c 20 73 6f 72 74  ll external sort
31d30 2c 20 77 68 65 72 65 20 4e 20 69 73 20 0a 20 20  , where N is .  
31d40 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ** the number of
31d50 20 72 6f 77 73 20 74 6f 20 73 6f 72 74 20 69 73   rows to sort is
31d60 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 63 6f  :.  **.  **   co
31d70 73 74 20 3d 20 28 33 2e 30 20 2a 20 4e 20 2a 20  st = (3.0 * N * 
31d80 6c 6f 67 28 4e 29 29 2e 0a 20 20 2a 2a 20 0a 20  log(N))..  ** . 
31d90 20 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65 20 6f   ** Or, if the o
31da0 72 64 65 72 2d 62 79 20 63 6c 61 75 73 65 20 68  rder-by clause h
31db0 61 73 20 58 20 74 65 72 6d 73 20 62 75 74 20 6f  as X terms but o
31dc0 6e 6c 79 20 74 68 65 20 6c 61 73 74 20 59 20 0a  nly the last Y .
31dd0 20 20 2a 2a 20 74 65 72 6d 73 20 61 72 65 20 6f    ** terms are o
31de0 75 74 20 6f 66 20 6f 72 64 65 72 2c 20 74 68 65  ut of order, the
31df0 6e 20 62 6c 6f 63 6b 2d 73 6f 72 74 69 6e 67 20  n block-sorting 
31e00 77 69 6c 6c 20 72 65 64 75 63 65 20 74 68 65 20  will reduce the 
31e10 0a 20 20 2a 2a 20 73 6f 72 74 69 6e 67 20 63 6f  .  ** sorting co
31e20 73 74 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  st to:.  **.  **
31e30 20 20 20 63 6f 73 74 20 3d 20 28 33 2e 30 20 2a     cost = (3.0 *
31e40 20 4e 20 2a 20 6c 6f 67 28 4e 29 29 20 2a 20 28   N * log(N)) * (
31e50 59 2f 58 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  Y/X).  **.  ** T
31e60 68 65 20 28 59 2f 58 29 20 74 65 72 6d 20 69 73  he (Y/X) term is
31e70 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 75 73 69   implemented usi
31e80 6e 67 20 73 74 61 63 6b 20 76 61 72 69 61 62 6c  ng stack variabl
31e90 65 20 72 53 63 61 6c 65 0a 20 20 2a 2a 20 62 65  e rScale.  ** be
31ea0 6c 6f 77 2e 20 20 2a 2f 0a 20 20 4c 6f 67 45 73  low.  */.  LogEs
31eb0 74 20 72 53 63 61 6c 65 2c 20 72 53 6f 72 74 43  t rScale, rSortC
31ec0 6f 73 74 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  ost;.  assert( n
31ed0 4f 72 64 65 72 42 79 3e 30 20 26 26 20 36 36 3d  OrderBy>0 && 66=
31ee0 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31  =sqlite3LogEst(1
31ef0 30 30 29 20 29 3b 0a 20 20 72 53 63 61 6c 65 20  00) );.  rScale 
31f00 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  = sqlite3LogEst(
31f10 28 6e 4f 72 64 65 72 42 79 2d 6e 53 6f 72 74 65  (nOrderBy-nSorte
31f20 64 29 2a 31 30 30 2f 6e 4f 72 64 65 72 42 79 29  d)*100/nOrderBy)
31f30 20 2d 20 36 36 3b 0a 20 20 72 53 6f 72 74 43 6f   - 66;.  rSortCo
31f40 73 74 20 3d 20 6e 52 6f 77 20 2b 20 65 73 74 4c  st = nRow + estL
31f50 6f 67 28 6e 52 6f 77 29 20 2b 20 72 53 63 61 6c  og(nRow) + rScal
31f60 65 20 2b 20 31 36 3b 0a 0a 20 20 2f 2a 20 54 55  e + 16;..  /* TU
31f70 4e 49 4e 47 3a 20 54 68 65 20 63 6f 73 74 20 6f  NING: The cost o
31f80 66 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 44  f implementing D
31f90 49 53 54 49 4e 43 54 20 75 73 69 6e 67 20 61 20  ISTINCT using a 
31fa0 42 2d 54 52 45 45 20 69 73 0a 20 20 2a 2a 20 73  B-TREE is.  ** s
31fb0 69 6d 69 6c 61 72 20 62 75 74 20 77 69 74 68 20  imilar but with 
31fc0 61 20 6c 61 72 67 65 72 20 63 6f 6e 73 74 61 6e  a larger constan
31fd0 74 20 6f 66 20 70 72 6f 70 6f 72 74 69 6f 6e 61  t of proportiona
31fe0 6c 69 74 79 2e 20 0a 20 20 2a 2a 20 4d 75 6c 74  lity. .  ** Mult
31ff0 69 70 6c 79 20 62 79 20 61 6e 20 61 64 64 69 74  iply by an addit
32000 69 6f 6e 61 6c 20 66 61 63 74 6f 72 20 6f 66 20  ional factor of 
32010 33 2e 30 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70  3.0.  */.  if( p
32020 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67  WInfo->wctrlFlag
32030 73 20 26 20 57 48 45 52 45 5f 57 41 4e 54 5f 44  s & WHERE_WANT_D
32040 49 53 54 49 4e 43 54 20 29 7b 0a 20 20 20 20 72  ISTINCT ){.    r
32050 53 6f 72 74 43 6f 73 74 20 2b 3d 20 31 36 3b 0a  SortCost += 16;.
32060 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 53    }..  return rS
32070 6f 72 74 43 6f 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  ortCost;.}../*.*
32080 2a 20 47 69 76 65 6e 20 74 68 65 20 6c 69 73 74  * Given the list
32090 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62   of WhereLoop ob
320a0 6a 65 63 74 73 20 61 74 20 70 57 49 6e 66 6f 2d  jects at pWInfo-
320b0 3e 70 4c 6f 6f 70 73 2c 20 74 68 69 73 20 72 6f  >pLoops, this ro
320c0 75 74 69 6e 65 0a 2a 2a 20 61 74 74 65 6d 70 74  utine.** attempt
320d0 73 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6c 6f  s to find the lo
320e0 77 65 73 74 20 63 6f 73 74 20 70 61 74 68 20 74  west cost path t
320f0 68 61 74 20 76 69 73 69 74 73 20 65 61 63 68 20  hat visits each 
32100 57 68 65 72 65 4c 6f 6f 70 0a 2a 2a 20 6f 6e 63  WhereLoop.** onc
32110 65 2e 20 20 54 68 69 73 20 70 61 74 68 20 69 73  e.  This path is
32120 20 74 68 65 6e 20 6c 6f 61 64 65 64 20 69 6e 74   then loaded int
32130 6f 20 74 68 65 20 70 57 49 6e 66 6f 2d 3e 61 5b  o the pWInfo->a[
32140 5d 2e 70 57 4c 6f 6f 70 20 66 69 65 6c 64 73 2e  ].pWLoop fields.
32150 0a 2a 2a 0a 2a 2a 20 41 73 73 75 6d 65 20 74 68  .**.** Assume th
32160 61 74 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  at the total num
32170 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20 72 6f  ber of output ro
32180 77 73 20 74 68 61 74 20 77 69 6c 6c 20 6e 65 65  ws that will nee
32190 64 20 74 6f 20 62 65 20 73 6f 72 74 65 64 0a 2a  d to be sorted.*
321a0 2a 20 77 69 6c 6c 20 62 65 20 6e 52 6f 77 45 73  * will be nRowEs
321b0 74 20 28 69 6e 20 74 68 65 20 31 30 2a 6c 6f 67  t (in the 10*log
321c0 32 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  2 representation
321d0 29 2e 20 20 4f 72 2c 20 69 67 6e 6f 72 65 20 73  ).  Or, ignore s
321e0 6f 72 74 69 6e 67 0a 2a 2a 20 63 6f 73 74 73 20  orting.** costs 
321f0 69 66 20 6e 52 6f 77 45 73 74 3d 3d 30 2e 0a 2a  if nRowEst==0..*
32200 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
32210 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
32220 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d   or SQLITE_NOMEM
32230 20 6f 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c   of a memory all
32240 6f 63 61 74 69 6f 6e 0a 2a 2a 20 65 72 72 6f 72  ocation.** error
32250 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73 74 61 74   occurs..*/.stat
32260 69 63 20 69 6e 74 20 77 68 65 72 65 50 61 74 68  ic int wherePath
32270 53 6f 6c 76 65 72 28 57 68 65 72 65 49 6e 66 6f  Solver(WhereInfo
32280 20 2a 70 57 49 6e 66 6f 2c 20 4c 6f 67 45 73 74   *pWInfo, LogEst
32290 20 6e 52 6f 77 45 73 74 29 7b 0a 20 20 69 6e 74   nRowEst){.  int
322a0 20 6d 78 43 68 6f 69 63 65 3b 20 20 20 20 20 20   mxChoice;      
322b0 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75         /* Maximu
322c0 6d 20 6e 75 6d 62 65 72 20 6f 66 20 73 69 6d 75  m number of simu
322d0 6c 74 61 6e 65 6f 75 73 20 70 61 74 68 73 20 74  ltaneous paths t
322e0 72 61 63 6b 65 64 20 2a 2f 0a 20 20 69 6e 74 20  racked */.  int 
322f0 6e 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20  nLoop;          
32300 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
32310 6f 66 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20  of terms in the 
32320 6a 6f 69 6e 20 2a 2f 0a 20 20 50 61 72 73 65 20  join */.  Parse 
32330 2a 70 50 61 72 73 65 3b 20 20 20 20 20 20 20 20  *pParse;        
32340 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
32350 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73 71 6c 69  ontext */.  sqli
32360 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20  te3 *db;        
32370 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
32380 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
32390 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 6f 6f 70 3b   */.  int iLoop;
323a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
323b0 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
323c0 6f 76 65 72 20 74 68 65 20 74 65 72 6d 73 20 6f  over the terms o
323d0 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20  f the join */.  
323e0 69 6e 74 20 69 69 2c 20 6a 6a 3b 20 20 20 20 20  int ii, jj;     
323f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
32400 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20  p counters */.  
32410 69 6e 74 20 6d 78 49 20 3d 20 30 3b 20 20 20 20  int mxI = 0;    
32420 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
32430 65 78 20 6f 66 20 6e 65 78 74 20 65 6e 74 72 79  ex of next entry
32440 20 74 6f 20 72 65 70 6c 61 63 65 20 2a 2f 0a 20   to replace */. 
32450 20 69 6e 74 20 6e 4f 72 64 65 72 42 79 3b 20 20   int nOrderBy;  
32460 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
32470 6d 62 65 72 20 6f 66 20 4f 52 44 45 52 20 42 59  mber of ORDER BY
32480 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 2a 2f   clause terms */
32490 0a 20 20 4c 6f 67 45 73 74 20 6d 78 43 6f 73 74  .  LogEst mxCost
324a0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20   = 0;        /* 
324b0 4d 61 78 69 6d 75 6d 20 63 6f 73 74 20 6f 66 20  Maximum cost of 
324c0 61 20 73 65 74 20 6f 66 20 70 61 74 68 73 20 2a  a set of paths *
324d0 2f 0a 20 20 4c 6f 67 45 73 74 20 6d 78 55 6e 73  /.  LogEst mxUns
324e0 6f 72 74 65 64 20 3d 20 30 3b 20 20 20 20 2f 2a  orted = 0;    /*
324f0 20 4d 61 78 69 6d 75 6d 20 75 6e 73 6f 72 74 65   Maximum unsorte
32500 64 20 63 6f 73 74 20 6f 66 20 61 20 73 65 74 20  d cost of a set 
32510 6f 66 20 70 61 74 68 20 2a 2f 0a 20 20 69 6e 74  of path */.  int
32520 20 6e 54 6f 2c 20 6e 46 72 6f 6d 3b 20 20 20 20   nTo, nFrom;    
32530 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
32540 20 6f 66 20 76 61 6c 69 64 20 65 6e 74 72 69 65   of valid entrie
32550 73 20 69 6e 20 61 54 6f 5b 5d 20 61 6e 64 20 61  s in aTo[] and a
32560 46 72 6f 6d 5b 5d 20 2a 2f 0a 20 20 57 68 65 72  From[] */.  Wher
32570 65 50 61 74 68 20 2a 61 46 72 6f 6d 3b 20 20 20  ePath *aFrom;   
32580 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 6e 46 72        /* All nFr
32590 6f 6d 20 70 61 74 68 73 20 61 74 20 74 68 65 20  om paths at the 
325a0 70 72 65 76 69 6f 75 73 20 6c 65 76 65 6c 20 2a  previous level *
325b0 2f 0a 20 20 57 68 65 72 65 50 61 74 68 20 2a 61  /.  WherePath *a
325c0 54 6f 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  To;           /*
325d0 20 54 68 65 20 6e 54 6f 20 62 65 73 74 20 70 61   The nTo best pa
325e0 74 68 73 20 61 74 20 74 68 65 20 63 75 72 72 65  ths at the curre
325f0 6e 74 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 57 68  nt level */.  Wh
32600 65 72 65 50 61 74 68 20 2a 70 46 72 6f 6d 3b 20  erePath *pFrom; 
32610 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 6c          /* An el
32620 65 6d 65 6e 74 20 6f 66 20 61 46 72 6f 6d 5b 5d  ement of aFrom[]
32630 20 74 68 61 74 20 77 65 20 61 72 65 20 77 6f 72   that we are wor
32640 6b 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20 57 68 65  king on */.  Whe
32650 72 65 50 61 74 68 20 2a 70 54 6f 3b 20 20 20 20  rePath *pTo;    
32660 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 6c 65         /* An ele
32670 6d 65 6e 74 20 6f 66 20 61 54 6f 5b 5d 20 74 68  ment of aTo[] th
32680 61 74 20 77 65 20 61 72 65 20 77 6f 72 6b 69 6e  at we are workin
32690 67 20 6f 6e 20 2a 2f 0a 20 20 57 68 65 72 65 4c  g on */.  WhereL
326a0 6f 6f 70 20 2a 70 57 4c 6f 6f 70 3b 20 20 20 20  oop *pWLoop;    
326b0 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68      /* One of th
326c0 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65  e WhereLoop obje
326d0 63 74 73 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f  cts */.  WhereLo
326e0 6f 70 20 2a 2a 70 58 3b 20 20 20 20 20 20 20 20  op **pX;        
326f0 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 64 69     /* Used to di
32700 76 79 20 75 70 20 74 68 65 20 70 53 70 61 63 65  vy up the pSpace
32710 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 4c 6f 67   memory */.  Log
32720 45 73 74 20 2a 61 53 6f 72 74 43 6f 73 74 20 3d  Est *aSortCost =
32730 20 30 3b 20 20 20 20 2f 2a 20 53 6f 72 74 69 6e   0;    /* Sortin
32740 67 20 61 6e 64 20 70 61 72 74 69 61 6c 20 73 6f  g and partial so
32750 72 74 69 6e 67 20 63 6f 73 74 73 20 2a 2f 0a 20  rting costs */. 
32760 20 63 68 61 72 20 2a 70 53 70 61 63 65 3b 20 20   char *pSpace;  
32770 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
32780 6d 70 6f 72 61 72 79 20 6d 65 6d 6f 72 79 20 75  mporary memory u
32790 73 65 64 20 62 79 20 74 68 69 73 20 72 6f 75 74  sed by this rout
327a0 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 70  ine */.  int nSp
327b0 61 63 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ace;            
327c0 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 73     /* Bytes of s
327d0 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 61  pace allocated a
327e0 74 20 70 53 70 61 63 65 20 2a 2f 0a 0a 20 20 70  t pSpace */..  p
327f0 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e  Parse = pWInfo->
32800 70 50 61 72 73 65 3b 0a 20 20 64 62 20 3d 20 70  pParse;.  db = p
32810 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 6e 4c 6f  Parse->db;.  nLo
32820 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65  op = pWInfo->nLe
32830 76 65 6c 3b 0a 20 20 2f 2a 20 54 55 4e 49 4e 47  vel;.  /* TUNING
32840 3a 20 46 6f 72 20 73 69 6d 70 6c 65 20 71 75 65  : For simple que
32850 72 69 65 73 2c 20 6f 6e 6c 79 20 74 68 65 20 62  ries, only the b
32860 65 73 74 20 70 61 74 68 20 69 73 20 74 72 61 63  est path is trac
32870 6b 65 64 2e 0a 20 20 2a 2a 20 46 6f 72 20 32 2d  ked..  ** For 2-
32880 77 61 79 20 6a 6f 69 6e 73 2c 20 74 68 65 20 35  way joins, the 5
32890 20 62 65 73 74 20 70 61 74 68 73 20 61 72 65 20   best paths are 
328a0 66 6f 6c 6c 6f 77 65 64 2e 0a 20 20 2a 2a 20 46  followed..  ** F
328b0 6f 72 20 6a 6f 69 6e 73 20 6f 66 20 33 20 6f 72  or joins of 3 or
328c0 20 6d 6f 72 65 20 74 61 62 6c 65 73 2c 20 74 72   more tables, tr
328d0 61 63 6b 20 74 68 65 20 31 30 20 62 65 73 74 20  ack the 10 best 
328e0 70 61 74 68 73 20 2a 2f 0a 20 20 6d 78 43 68 6f  paths */.  mxCho
328f0 69 63 65 20 3d 20 28 6e 4c 6f 6f 70 3c 3d 31 29  ice = (nLoop<=1)
32900 20 3f 20 31 20 3a 20 28 6e 4c 6f 6f 70 3d 3d 32   ? 1 : (nLoop==2
32910 20 3f 20 35 20 3a 20 31 30 29 3b 0a 20 20 61 73   ? 5 : 10);.  as
32920 73 65 72 74 28 20 6e 4c 6f 6f 70 3c 3d 70 57 49  sert( nLoop<=pWI
32930 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 6e  nfo->pTabList->n
32940 53 72 63 20 29 3b 0a 20 20 57 48 45 52 45 54 52  Src );.  WHERETR
32950 41 43 45 28 30 78 30 30 32 2c 20 28 22 2d 2d 2d  ACE(0x002, ("---
32960 2d 20 62 65 67 69 6e 20 73 6f 6c 76 65 72 2e 20  - begin solver. 
32970 20 28 6e 52 6f 77 45 73 74 3d 25 64 29 5c 6e 22   (nRowEst=%d)\n"
32980 2c 20 6e 52 6f 77 45 73 74 29 29 3b 0a 0a 20 20  , nRowEst));..  
32990 2f 2a 20 49 66 20 6e 52 6f 77 45 73 74 20 69 73  /* If nRowEst is
329a0 20 7a 65 72 6f 20 61 6e 64 20 74 68 65 72 65 20   zero and there 
329b0 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  is an ORDER BY c
329c0 6c 61 75 73 65 2c 20 69 67 6e 6f 72 65 20 69 74  lause, ignore it
329d0 2e 20 49 6e 20 74 68 69 73 0a 20 20 2a 2a 20 63  . In this.  ** c
329e0 61 73 65 20 74 68 65 20 70 75 72 70 6f 73 65 20  ase the purpose 
329f0 6f 66 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20  of this call is 
32a00 74 6f 20 65 73 74 69 6d 61 74 65 20 74 68 65 20  to estimate the 
32a10 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 72  number of rows r
32a20 65 74 75 72 6e 65 64 0a 20 20 2a 2a 20 62 79 20  eturned.  ** by 
32a30 74 68 65 20 6f 76 65 72 61 6c 6c 20 71 75 65 72  the overall quer
32a40 79 2e 20 4f 6e 63 65 20 74 68 69 73 20 65 73 74  y. Once this est
32a50 69 6d 61 74 65 20 68 61 73 20 62 65 65 6e 20 6f  imate has been o
32a60 62 74 61 69 6e 65 64 2c 20 74 68 65 20 63 61 6c  btained, the cal
32a70 6c 65 72 0a 20 20 2a 2a 20 77 69 6c 6c 20 69 6e  ler.  ** will in
32a80 76 6f 6b 65 20 74 68 69 73 20 66 75 6e 63 74 69  voke this functi
32a90 6f 6e 20 61 20 73 65 63 6f 6e 64 20 74 69 6d 65  on a second time
32aa0 2c 20 70 61 73 73 69 6e 67 20 74 68 65 20 65 73  , passing the es
32ab0 74 69 6d 61 74 65 20 61 73 20 74 68 65 0a 20 20  timate as the.  
32ac0 2a 2a 20 6e 52 6f 77 45 73 74 20 70 61 72 61 6d  ** nRowEst param
32ad0 65 74 65 72 2e 20 20 2a 2f 0a 20 20 69 66 28 20  eter.  */.  if( 
32ae0 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79  pWInfo->pOrderBy
32af0 3d 3d 30 20 7c 7c 20 6e 52 6f 77 45 73 74 3d 3d  ==0 || nRowEst==
32b00 30 20 29 7b 0a 20 20 20 20 6e 4f 72 64 65 72 42  0 ){.    nOrderB
32b10 79 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  y = 0;.  }else{.
32b20 20 20 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 70      nOrderBy = p
32b30 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2d  WInfo->pOrderBy-
32b40 3e 6e 45 78 70 72 3b 0a 20 20 7d 0a 0a 20 20 2f  >nExpr;.  }..  /
32b50 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69  * Allocate and i
32b60 6e 69 74 69 61 6c 69 7a 65 20 73 70 61 63 65 20  nitialize space 
32b70 66 6f 72 20 61 54 6f 2c 20 61 46 72 6f 6d 20 61  for aTo, aFrom a
32b80 6e 64 20 61 53 6f 72 74 43 6f 73 74 5b 5d 20 2a  nd aSortCost[] *
32b90 2f 0a 20 20 6e 53 70 61 63 65 20 3d 20 28 73 69  /.  nSpace = (si
32ba0 7a 65 6f 66 28 57 68 65 72 65 50 61 74 68 29 2b  zeof(WherePath)+
32bb0 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70  sizeof(WhereLoop
32bc0 2a 29 2a 6e 4c 6f 6f 70 29 2a 6d 78 43 68 6f 69  *)*nLoop)*mxChoi
32bd0 63 65 2a 32 3b 0a 20 20 6e 53 70 61 63 65 20 2b  ce*2;.  nSpace +
32be0 3d 20 73 69 7a 65 6f 66 28 4c 6f 67 45 73 74 29  = sizeof(LogEst)
32bf0 20 2a 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20 70   * nOrderBy;.  p
32c00 53 70 61 63 65 20 3d 20 73 71 6c 69 74 65 33 44  Space = sqlite3D
32c10 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 6e  bMallocRaw(db, n
32c20 53 70 61 63 65 29 3b 0a 20 20 69 66 28 20 70 53  Space);.  if( pS
32c30 70 61 63 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  pace==0 ) return
32c40 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
32c50 20 61 54 6f 20 3d 20 28 57 68 65 72 65 50 61 74   aTo = (WherePat
32c60 68 2a 29 70 53 70 61 63 65 3b 0a 20 20 61 46 72  h*)pSpace;.  aFr
32c70 6f 6d 20 3d 20 61 54 6f 2b 6d 78 43 68 6f 69 63  om = aTo+mxChoic
32c80 65 3b 0a 20 20 6d 65 6d 73 65 74 28 61 46 72 6f  e;.  memset(aFro
32c90 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61 46 72  m, 0, sizeof(aFr
32ca0 6f 6d 5b 30 5d 29 29 3b 0a 20 20 70 58 20 3d 20  om[0]));.  pX = 
32cb0 28 57 68 65 72 65 4c 6f 6f 70 2a 2a 29 28 61 46  (WhereLoop**)(aF
32cc0 72 6f 6d 2b 6d 78 43 68 6f 69 63 65 29 3b 0a 20  rom+mxChoice);. 
32cd0 20 66 6f 72 28 69 69 3d 6d 78 43 68 6f 69 63 65   for(ii=mxChoice
32ce0 2a 32 2c 20 70 46 72 6f 6d 3d 61 54 6f 3b 20 69  *2, pFrom=aTo; i
32cf0 69 3e 30 3b 20 69 69 2d 2d 2c 20 70 46 72 6f 6d  i>0; ii--, pFrom
32d00 2b 2b 2c 20 70 58 20 2b 3d 20 6e 4c 6f 6f 70 29  ++, pX += nLoop)
32d10 7b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 61 4c 6f  {.    pFrom->aLo
32d20 6f 70 20 3d 20 70 58 3b 0a 20 20 7d 0a 20 20 69  op = pX;.  }.  i
32d30 66 28 20 6e 4f 72 64 65 72 42 79 20 29 7b 0a 20  f( nOrderBy ){. 
32d40 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69     /* If there i
32d50 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  s an ORDER BY cl
32d60 61 75 73 65 20 61 6e 64 20 69 74 20 69 73 20 6e  ause and it is n
32d70 6f 74 20 62 65 69 6e 67 20 69 67 6e 6f 72 65 64  ot being ignored
32d80 2c 20 73 65 74 20 75 70 0a 20 20 20 20 2a 2a 20  , set up.    ** 
32d90 73 70 61 63 65 20 66 6f 72 20 74 68 65 20 61 53  space for the aS
32da0 6f 72 74 43 6f 73 74 5b 5d 20 61 72 72 61 79 2e  ortCost[] array.
32db0 20 45 61 63 68 20 65 6c 65 6d 65 6e 74 20 6f 66   Each element of
32dc0 20 74 68 65 20 61 53 6f 72 74 43 6f 73 74 20 61   the aSortCost a
32dd0 72 72 61 79 0a 20 20 20 20 2a 2a 20 69 73 20 65  rray.    ** is e
32de0 69 74 68 65 72 20 7a 65 72 6f 20 2d 20 6d 65 61  ither zero - mea
32df0 6e 69 6e 67 20 69 74 20 68 61 73 20 6e 6f 74 20  ning it has not 
32e00 79 65 74 20 62 65 65 6e 20 69 6e 69 74 69 61 6c  yet been initial
32e10 69 7a 65 64 20 2d 20 6f 72 20 74 68 65 0a 20 20  ized - or the.  
32e20 20 20 2a 2a 20 63 6f 73 74 20 6f 66 20 73 6f 72    ** cost of sor
32e30 74 69 6e 67 20 6e 52 6f 77 45 73 74 20 72 6f 77  ting nRowEst row
32e40 73 20 6f 66 20 64 61 74 61 20 77 68 65 72 65 20  s of data where 
32e50 74 68 65 20 66 69 72 73 74 20 58 20 74 65 72 6d  the first X term
32e60 73 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20  s of.    ** the 
32e70 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
32e80 61 72 65 20 61 6c 72 65 61 64 79 20 69 6e 20 6f  are already in o
32e90 72 64 65 72 2c 20 77 68 65 72 65 20 58 20 69 73  rder, where X is
32ea0 20 74 68 65 20 61 72 72 61 79 20 0a 20 20 20 20   the array .    
32eb0 2a 2a 20 69 6e 64 65 78 2e 20 20 2a 2f 0a 20 20  ** index.  */.  
32ec0 20 20 61 53 6f 72 74 43 6f 73 74 20 3d 20 28 4c    aSortCost = (L
32ed0 6f 67 45 73 74 2a 29 70 58 3b 0a 20 20 20 20 6d  ogEst*)pX;.    m
32ee0 65 6d 73 65 74 28 61 53 6f 72 74 43 6f 73 74 2c  emset(aSortCost,
32ef0 20 30 2c 20 73 69 7a 65 6f 66 28 4c 6f 67 45 73   0, sizeof(LogEs
32f00 74 29 20 2a 20 6e 4f 72 64 65 72 42 79 29 3b 0a  t) * nOrderBy);.
32f10 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 61 53    }.  assert( aS
32f20 6f 72 74 43 6f 73 74 3d 3d 30 20 7c 7c 20 26 70  ortCost==0 || &p
32f30 53 70 61 63 65 5b 6e 53 70 61 63 65 5d 3d 3d 28  Space[nSpace]==(
32f40 63 68 61 72 2a 29 26 61 53 6f 72 74 43 6f 73 74  char*)&aSortCost
32f50 5b 6e 4f 72 64 65 72 42 79 5d 20 29 3b 0a 20 20  [nOrderBy] );.  
32f60 61 73 73 65 72 74 28 20 61 53 6f 72 74 43 6f 73  assert( aSortCos
32f70 74 21 3d 30 20 7c 7c 20 26 70 53 70 61 63 65 5b  t!=0 || &pSpace[
32f80 6e 53 70 61 63 65 5d 3d 3d 28 63 68 61 72 2a 29  nSpace]==(char*)
32f90 70 58 20 29 3b 0a 0a 20 20 2f 2a 20 53 65 65 64  pX );..  /* Seed
32fa0 20 74 68 65 20 73 65 61 72 63 68 20 77 69 74 68   the search with
32fb0 20 61 20 73 69 6e 67 6c 65 20 57 68 65 72 65 50   a single WhereP
32fc0 61 74 68 20 63 6f 6e 74 61 69 6e 69 6e 67 20 7a  ath containing z
32fd0 65 72 6f 20 57 68 65 72 65 4c 6f 6f 70 73 2e 0a  ero WhereLoops..
32fe0 20 20 2a 2a 0a 20 20 2a 2a 20 54 55 4e 49 4e 47    **.  ** TUNING
32ff0 3a 20 44 6f 20 6e 6f 74 20 6c 65 74 20 74 68 65  : Do not let the
33000 20 6e 75 6d 62 65 72 20 6f 66 20 69 74 65 72 61   number of itera
33010 74 69 6f 6e 73 20 67 6f 20 61 62 6f 76 65 20 32  tions go above 2
33020 35 2e 20 20 49 66 20 74 68 65 20 63 6f 73 74 0a  5.  If the cost.
33030 20 20 2a 2a 20 6f 66 20 63 6f 6d 70 75 74 69 6e    ** of computin
33040 67 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 69  g an automatic i
33050 6e 64 65 78 20 69 73 20 6e 6f 74 20 70 61 69 64  ndex is not paid
33060 20 62 61 63 6b 20 77 69 74 68 69 6e 20 74 68 65   back within the
33070 20 66 69 72 73 74 20 32 35 0a 20 20 2a 2a 20 72   first 25.  ** r
33080 6f 77 73 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74  ows, then do not
33090 20 75 73 65 20 74 68 65 20 61 75 74 6f 6d 61 74   use the automat
330a0 69 63 20 69 6e 64 65 78 2e 20 2a 2f 0a 20 20 61  ic index. */.  a
330b0 46 72 6f 6d 5b 30 5d 2e 6e 52 6f 77 20 3d 20 4d  From[0].nRow = M
330c0 49 4e 28 70 50 61 72 73 65 2d 3e 6e 51 75 65 72  IN(pParse->nQuer
330d0 79 4c 6f 6f 70 2c 20 34 36 29 3b 20 20 61 73 73  yLoop, 46);  ass
330e0 65 72 74 28 20 34 36 3d 3d 73 71 6c 69 74 65 33  ert( 46==sqlite3
330f0 4c 6f 67 45 73 74 28 32 35 29 20 29 3b 0a 20 20  LogEst(25) );.  
33100 6e 46 72 6f 6d 20 3d 20 31 3b 0a 20 20 61 73 73  nFrom = 1;.  ass
33110 65 72 74 28 20 61 46 72 6f 6d 5b 30 5d 2e 69 73  ert( aFrom[0].is
33120 4f 72 64 65 72 65 64 3d 3d 30 20 29 3b 0a 20 20  Ordered==0 );.  
33130 69 66 28 20 6e 4f 72 64 65 72 42 79 20 29 7b 0a  if( nOrderBy ){.
33140 20 20 20 20 2f 2a 20 49 66 20 6e 4c 6f 6f 70 20      /* If nLoop 
33150 69 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  is zero, then th
33160 65 72 65 20 61 72 65 20 6e 6f 20 46 52 4f 4d 20  ere are no FROM 
33170 74 65 72 6d 73 20 69 6e 20 74 68 65 20 71 75 65  terms in the que
33180 72 79 2e 20 53 69 6e 63 65 0a 20 20 20 20 2a 2a  ry. Since.    **
33190 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   in this case th
331a0 65 20 71 75 65 72 79 20 6d 61 79 20 72 65 74 75  e query may retu
331b0 72 6e 20 61 20 6d 61 78 69 6d 75 6d 20 6f 66 20  rn a maximum of 
331c0 6f 6e 65 20 72 6f 77 2c 20 74 68 65 20 72 65 73  one row, the res
331d0 75 6c 74 73 0a 20 20 20 20 2a 2a 20 61 72 65 20  ults.    ** are 
331e0 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 72  already in the r
331f0 65 71 75 65 73 74 65 64 20 6f 72 64 65 72 2e 20  equested order. 
33200 53 65 74 20 69 73 4f 72 64 65 72 65 64 20 74 6f  Set isOrdered to
33210 20 6e 4f 72 64 65 72 42 79 20 74 6f 0a 20 20 20   nOrderBy to.   
33220 20 2a 2a 20 69 6e 64 69 63 61 74 65 20 74 68 69   ** indicate thi
33230 73 2e 20 4f 72 2c 20 69 66 20 6e 4c 6f 6f 70 20  s. Or, if nLoop 
33240 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
33250 7a 65 72 6f 2c 20 73 65 74 20 69 73 4f 72 64 65  zero, set isOrde
33260 72 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 2d 31  red to.    ** -1
33270 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61  , indicating tha
33280 74 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  t the result set
33290 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20   may or may not 
332a0 62 65 20 6f 72 64 65 72 65 64 2c 20 0a 20 20 20  be ordered, .   
332b0 20 2a 2a 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e   ** depending on
332c0 20 74 68 65 20 6c 6f 6f 70 73 20 61 64 64 65 64   the loops added
332d0 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20   to the current 
332e0 70 6c 61 6e 2e 20 20 2a 2f 0a 20 20 20 20 61 46  plan.  */.    aF
332f0 72 6f 6d 5b 30 5d 2e 69 73 4f 72 64 65 72 65 64  rom[0].isOrdered
33300 20 3d 20 6e 4c 6f 6f 70 3e 30 20 3f 20 2d 31 20   = nLoop>0 ? -1 
33310 3a 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20 7d 0a  : nOrderBy;.  }.
33320 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 73 75  .  /* Compute su
33330 63 63 65 73 73 69 76 65 6c 79 20 6c 6f 6e 67 65  ccessively longe
33340 72 20 57 68 65 72 65 50 61 74 68 73 20 75 73 69  r WherePaths usi
33350 6e 67 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  ng the previous 
33360 67 65 6e 65 72 61 74 69 6f 6e 0a 20 20 2a 2a 20  generation.  ** 
33370 6f 66 20 57 68 65 72 65 50 61 74 68 73 20 61 73  of WherePaths as
33380 20 74 68 65 20 62 61 73 69 73 20 66 6f 72 20 74   the basis for t
33390 68 65 20 6e 65 78 74 2e 20 20 4b 65 65 70 20 74  he next.  Keep t
333a0 72 61 63 6b 20 6f 66 20 74 68 65 20 6d 78 43 68  rack of the mxCh
333b0 6f 69 63 65 0a 20 20 2a 2a 20 62 65 73 74 20 70  oice.  ** best p
333c0 61 74 68 73 20 61 74 20 65 61 63 68 20 67 65 6e  aths at each gen
333d0 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 66 6f 72  eration */.  for
333e0 28 69 4c 6f 6f 70 3d 30 3b 20 69 4c 6f 6f 70 3c  (iLoop=0; iLoop<
333f0 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f 70 2b 2b 29 7b  nLoop; iLoop++){
33400 0a 20 20 20 20 6e 54 6f 20 3d 20 30 3b 0a 20 20  .    nTo = 0;.  
33410 20 20 66 6f 72 28 69 69 3d 30 2c 20 70 46 72 6f    for(ii=0, pFro
33420 6d 3d 61 46 72 6f 6d 3b 20 69 69 3c 6e 46 72 6f  m=aFrom; ii<nFro
33430 6d 3b 20 69 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b  m; ii++, pFrom++
33440 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 70 57 4c  ){.      for(pWL
33450 6f 6f 70 3d 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f  oop=pWInfo->pLoo
33460 70 73 3b 20 70 57 4c 6f 6f 70 3b 20 70 57 4c 6f  ps; pWLoop; pWLo
33470 6f 70 3d 70 57 4c 6f 6f 70 2d 3e 70 4e 65 78 74  op=pWLoop->pNext
33480 4c 6f 6f 70 29 7b 0a 20 20 20 20 20 20 20 20 4c  Loop){.        L
33490 6f 67 45 73 74 20 6e 4f 75 74 3b 20 20 20 20 20  ogEst nOut;     
334a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
334b0 20 2f 2a 20 52 6f 77 73 20 76 69 73 69 74 65 64   /* Rows visited
334c0 20 62 79 20 28 70 46 72 6f 6d 2b 70 57 4c 6f 6f   by (pFrom+pWLoo
334d0 70 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 4c 6f  p) */.        Lo
334e0 67 45 73 74 20 72 43 6f 73 74 3b 20 20 20 20 20  gEst rCost;     
334f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33500 2f 2a 20 43 6f 73 74 20 6f 66 20 70 61 74 68 20  /* Cost of path 
33510 28 70 46 72 6f 6d 2b 70 57 4c 6f 6f 70 29 20 2a  (pFrom+pWLoop) *
33520 2f 0a 20 20 20 20 20 20 20 20 4c 6f 67 45 73 74  /.        LogEst
33530 20 72 55 6e 73 6f 72 74 65 64 3b 20 20 20 20 20   rUnsorted;     
33540 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
33550 6e 73 6f 72 74 65 64 20 63 6f 73 74 20 6f 66 20  nsorted cost of 
33560 28 70 46 72 6f 6d 2b 70 57 4c 6f 6f 70 29 20 2a  (pFrom+pWLoop) *
33570 2f 0a 20 20 20 20 20 20 20 20 69 38 20 69 73 4f  /.        i8 isO
33580 72 64 65 72 65 64 20 3d 20 70 46 72 6f 6d 2d 3e  rdered = pFrom->
33590 69 73 4f 72 64 65 72 65 64 3b 20 20 2f 2a 20 69  isOrdered;  /* i
335a0 73 4f 72 64 65 72 65 64 20 66 6f 72 20 28 70 46  sOrdered for (pF
335b0 72 6f 6d 2b 70 57 4c 6f 6f 70 29 20 2a 2f 0a 20  rom+pWLoop) */. 
335c0 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d         Bitmask m
335d0 61 73 6b 4e 65 77 3b 20 20 20 20 20 20 20 20 20  askNew;         
335e0 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b           /* Mask
335f0 20 6f 66 20 73 72 63 20 76 69 73 69 74 65 64 20   of src visited 
33600 62 79 20 28 2e 2e 29 20 2a 2f 0a 20 20 20 20 20  by (..) */.     
33610 20 20 20 42 69 74 6d 61 73 6b 20 72 65 76 4d 61     Bitmask revMa
33620 73 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  sk = 0;         
33630 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
33640 72 65 76 2d 6f 72 64 65 72 20 6c 6f 6f 70 73 20  rev-order loops 
33650 66 6f 72 20 28 2e 2e 29 20 2a 2f 0a 0a 20 20 20  for (..) */..   
33660 20 20 20 20 20 69 66 28 20 28 70 57 4c 6f 6f 70       if( (pWLoop
33670 2d 3e 70 72 65 72 65 71 20 26 20 7e 70 46 72 6f  ->prereq & ~pFro
33680 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 29 21 3d 30 20  m->maskLoop)!=0 
33690 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
336a0 20 20 20 20 69 66 28 20 28 70 57 4c 6f 6f 70 2d      if( (pWLoop-
336b0 3e 6d 61 73 6b 53 65 6c 66 20 26 20 70 46 72 6f  >maskSelf & pFro
336c0 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 29 21 3d 30 20  m->maskLoop)!=0 
336d0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
336e0 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70      /* At this p
336f0 6f 69 6e 74 2c 20 70 57 4c 6f 6f 70 20 69 73 20  oint, pWLoop is 
33700 61 20 63 61 6e 64 69 64 61 74 65 20 74 6f 20 62  a candidate to b
33710 65 20 74 68 65 20 6e 65 78 74 20 6c 6f 6f 70 2e  e the next loop.
33720 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 43 6f 6d   .        ** Com
33730 70 75 74 65 20 69 74 73 20 63 6f 73 74 20 2a 2f  pute its cost */
33740 0a 20 20 20 20 20 20 20 20 72 55 6e 73 6f 72 74  .        rUnsort
33750 65 64 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  ed = sqlite3LogE
33760 73 74 41 64 64 28 70 57 4c 6f 6f 70 2d 3e 72 53  stAdd(pWLoop->rS
33770 65 74 75 70 2c 70 57 4c 6f 6f 70 2d 3e 72 52 75  etup,pWLoop->rRu
33780 6e 20 2b 20 70 46 72 6f 6d 2d 3e 6e 52 6f 77 29  n + pFrom->nRow)
33790 3b 0a 20 20 20 20 20 20 20 20 72 55 6e 73 6f 72  ;.        rUnsor
337a0 74 65 64 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  ted = sqlite3Log
337b0 45 73 74 41 64 64 28 72 55 6e 73 6f 72 74 65 64  EstAdd(rUnsorted
337c0 2c 20 70 46 72 6f 6d 2d 3e 72 55 6e 73 6f 72 74  , pFrom->rUnsort
337d0 65 64 29 3b 0a 20 20 20 20 20 20 20 20 6e 4f 75  ed);.        nOu
337e0 74 20 3d 20 70 46 72 6f 6d 2d 3e 6e 52 6f 77 20  t = pFrom->nRow 
337f0 2b 20 70 57 4c 6f 6f 70 2d 3e 6e 4f 75 74 3b 0a  + pWLoop->nOut;.
33800 20 20 20 20 20 20 20 20 6d 61 73 6b 4e 65 77 20          maskNew 
33810 3d 20 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f  = pFrom->maskLoo
33820 70 20 7c 20 70 57 4c 6f 6f 70 2d 3e 6d 61 73 6b  p | pWLoop->mask
33830 53 65 6c 66 3b 0a 20 20 20 20 20 20 20 20 69 66  Self;.        if
33840 28 20 69 73 4f 72 64 65 72 65 64 3c 30 20 29 7b  ( isOrdered<0 ){
33850 0a 20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64  .          isOrd
33860 65 72 65 64 20 3d 20 77 68 65 72 65 50 61 74 68  ered = wherePath
33870 53 61 74 69 73 66 69 65 73 4f 72 64 65 72 42 79  SatisfiesOrderBy
33880 28 70 57 49 6e 66 6f 2c 0a 20 20 20 20 20 20 20  (pWInfo,.       
33890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
338a0 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79  pWInfo->pOrderBy
338b0 2c 20 70 46 72 6f 6d 2c 20 70 57 49 6e 66 6f 2d  , pFrom, pWInfo-
338c0 3e 77 63 74 72 6c 46 6c 61 67 73 2c 0a 20 20 20  >wctrlFlags,.   
338d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
338e0 20 20 20 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f      iLoop, pWLoo
338f0 70 2c 20 26 72 65 76 4d 61 73 6b 29 3b 0a 20 20  p, &revMask);.  
33900 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
33910 20 20 20 20 20 20 20 72 65 76 4d 61 73 6b 20 3d         revMask =
33920 20 70 46 72 6f 6d 2d 3e 72 65 76 4c 6f 6f 70 3b   pFrom->revLoop;
33930 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
33940 20 20 20 69 66 28 20 69 73 4f 72 64 65 72 65 64     if( isOrdered
33950 3e 3d 30 20 26 26 20 69 73 4f 72 64 65 72 65 64  >=0 && isOrdered
33960 3c 6e 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  <nOrderBy ){.   
33970 20 20 20 20 20 20 20 69 66 28 20 61 53 6f 72 74         if( aSort
33980 43 6f 73 74 5b 69 73 4f 72 64 65 72 65 64 5d 3d  Cost[isOrdered]=
33990 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
339a0 20 20 61 53 6f 72 74 43 6f 73 74 5b 69 73 4f 72    aSortCost[isOr
339b0 64 65 72 65 64 5d 20 3d 20 77 68 65 72 65 53 6f  dered] = whereSo
339c0 72 74 69 6e 67 43 6f 73 74 28 0a 20 20 20 20 20  rtingCost(.     
339d0 20 20 20 20 20 20 20 20 20 20 20 70 57 49 6e 66             pWInf
339e0 6f 2c 20 6e 52 6f 77 45 73 74 2c 20 6e 4f 72 64  o, nRowEst, nOrd
339f0 65 72 42 79 2c 20 69 73 4f 72 64 65 72 65 64 0a  erBy, isOrdered.
33a00 20 20 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20              );. 
33a10 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
33a20 20 20 20 20 20 72 43 6f 73 74 20 3d 20 73 71 6c       rCost = sql
33a30 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28 72 55  ite3LogEstAdd(rU
33a40 6e 73 6f 72 74 65 64 2c 20 61 53 6f 72 74 43 6f  nsorted, aSortCo
33a50 73 74 5b 69 73 4f 72 64 65 72 65 64 5d 29 3b 0a  st[isOrdered]);.
33a60 0a 20 20 20 20 20 20 20 20 20 20 57 48 45 52 45  .          WHERE
33a70 54 52 41 43 45 28 30 78 30 30 32 2c 0a 20 20 20  TRACE(0x002,.   
33a80 20 20 20 20 20 20 20 20 20 20 20 28 22 2d 2d 2d             ("---
33a90 2d 20 73 6f 72 74 20 63 6f 73 74 3d 25 2d 33 64  - sort cost=%-3d
33aa0 20 28 25 64 2f 25 64 29 20 69 6e 63 72 65 61 73   (%d/%d) increas
33ab0 65 73 20 63 6f 73 74 20 25 33 64 20 74 6f 20 25  es cost %3d to %
33ac0 2d 33 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  -3d\n",.        
33ad0 20 20 20 20 20 20 20 61 53 6f 72 74 43 6f 73 74         aSortCost
33ae0 5b 69 73 4f 72 64 65 72 65 64 5d 2c 20 28 6e 4f  [isOrdered], (nO
33af0 72 64 65 72 42 79 2d 69 73 4f 72 64 65 72 65 64  rderBy-isOrdered
33b00 29 2c 20 6e 4f 72 64 65 72 42 79 2c 20 0a 20 20  ), nOrderBy, .  
33b10 20 20 20 20 20 20 20 20 20 20 20 20 20 72 55 6e               rUn
33b20 73 6f 72 74 65 64 2c 20 72 43 6f 73 74 29 29 3b  sorted, rCost));
33b30 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
33b40 20 20 20 20 20 20 20 20 20 20 72 43 6f 73 74 20            rCost 
33b50 3d 20 72 55 6e 73 6f 72 74 65 64 3b 0a 20 20 20  = rUnsorted;.   
33b60 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
33b70 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  /* Check to see 
33b80 69 66 20 70 57 4c 6f 6f 70 20 73 68 6f 75 6c 64  if pWLoop should
33b90 20 62 65 20 61 64 64 65 64 20 74 6f 20 74 68 65   be added to the
33ba0 20 73 65 74 20 6f 66 0a 20 20 20 20 20 20 20 20   set of.        
33bb0 2a 2a 20 6d 78 43 68 6f 69 63 65 20 62 65 73 74  ** mxChoice best
33bc0 2d 73 6f 2d 66 61 72 20 70 61 74 68 73 2e 0a 20  -so-far paths.. 
33bd0 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
33be0 20 20 2a 2a 20 46 69 72 73 74 20 6c 6f 6f 6b 20    ** First look 
33bf0 66 6f 72 20 61 6e 20 65 78 69 73 74 69 6e 67 20  for an existing 
33c00 70 61 74 68 20 61 6d 6f 6e 67 20 62 65 73 74 2d  path among best-
33c10 73 6f 2d 66 61 72 20 70 61 74 68 73 0a 20 20 20  so-far paths.   
33c20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 63 6f 76       ** that cov
33c30 65 72 73 20 74 68 65 20 73 61 6d 65 20 73 65 74  ers the same set
33c40 20 6f 66 20 6c 6f 6f 70 73 20 61 6e 64 20 68 61   of loops and ha
33c50 73 20 74 68 65 20 73 61 6d 65 20 69 73 4f 72 64  s the same isOrd
33c60 65 72 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20  ered.        ** 
33c70 73 65 74 74 69 6e 67 20 61 73 20 74 68 65 20 63  setting as the c
33c80 75 72 72 65 6e 74 20 70 61 74 68 20 63 61 6e 64  urrent path cand
33c90 69 64 61 74 65 2e 0a 20 20 20 20 20 20 20 20 2a  idate..        *
33ca0 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 65  *.        ** The
33cb0 20 74 65 72 6d 20 22 28 28 70 54 6f 2d 3e 69 73   term "((pTo->is
33cc0 4f 72 64 65 72 65 64 5e 69 73 4f 72 64 65 72 65  Ordered^isOrdere
33cd0 64 29 26 30 78 38 30 29 3d 3d 30 22 20 69 73 20  d)&0x80)==0" is 
33ce0 65 71 75 69 76 61 6c 65 6e 74 0a 20 20 20 20 20  equivalent.     
33cf0 20 20 20 2a 2a 20 74 6f 20 28 70 54 6f 2d 3e 69     ** to (pTo->i
33d00 73 4f 72 64 65 72 65 64 3d 3d 28 2d 31 29 29 3d  sOrdered==(-1))=
33d10 3d 28 69 73 4f 72 64 65 72 65 64 3d 3d 28 2d 31  =(isOrdered==(-1
33d20 29 29 22 20 66 6f 72 20 74 68 65 20 72 61 6e 67  ))" for the rang
33d30 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20  e.        ** of 
33d40 6c 65 67 61 6c 20 76 61 6c 75 65 73 20 66 6f 72  legal values for
33d50 20 69 73 4f 72 64 65 72 65 64 2c 20 2d 31 2e 2e   isOrdered, -1..
33d60 36 34 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  64..        */. 
33d70 20 20 20 20 20 20 20 66 6f 72 28 6a 6a 3d 30 2c         for(jj=0,
33d80 20 70 54 6f 3d 61 54 6f 3b 20 6a 6a 3c 6e 54 6f   pTo=aTo; jj<nTo
33d90 3b 20 6a 6a 2b 2b 2c 20 70 54 6f 2b 2b 29 7b 0a  ; jj++, pTo++){.
33da0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 54            if( pT
33db0 6f 2d 3e 6d 61 73 6b 4c 6f 6f 70 3d 3d 6d 61 73  o->maskLoop==mas
33dc0 6b 4e 65 77 0a 20 20 20 20 20 20 20 20 20 20 20  kNew.           
33dd0 26 26 20 28 28 70 54 6f 2d 3e 69 73 4f 72 64 65  && ((pTo->isOrde
33de0 72 65 64 5e 69 73 4f 72 64 65 72 65 64 29 26 30  red^isOrdered)&0
33df0 78 38 30 29 3d 3d 30 0a 20 20 20 20 20 20 20 20  x80)==0.        
33e00 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20    ){.           
33e10 20 74 65 73 74 63 61 73 65 28 20 6a 6a 3d 3d 6e   testcase( jj==n
33e20 54 6f 2d 31 20 29 3b 0a 20 20 20 20 20 20 20 20  To-1 );.        
33e30 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
33e40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
33e50 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a 6a 3e  .        if( jj>
33e60 3d 6e 54 6f 20 29 7b 0a 20 20 20 20 20 20 20 20  =nTo ){.        
33e70 20 20 2f 2a 20 4e 6f 6e 65 20 6f 66 20 74 68 65    /* None of the
33e80 20 65 78 69 73 74 69 6e 67 20 62 65 73 74 2d 73   existing best-s
33e90 6f 2d 66 61 72 20 70 61 74 68 73 20 6d 61 74 63  o-far paths matc
33ea0 68 20 74 68 65 20 63 61 6e 64 69 64 61 74 65 2e  h the candidate.
33eb0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
33ec0 28 20 6e 54 6f 3e 3d 6d 78 43 68 6f 69 63 65 0a  ( nTo>=mxChoice.
33ed0 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28 72             && (r
33ee0 43 6f 73 74 3e 6d 78 43 6f 73 74 20 7c 7c 20 28  Cost>mxCost || (
33ef0 72 43 6f 73 74 3d 3d 6d 78 43 6f 73 74 20 26 26  rCost==mxCost &&
33f00 20 72 55 6e 73 6f 72 74 65 64 3e 3d 6d 78 55 6e   rUnsorted>=mxUn
33f10 73 6f 72 74 65 64 29 29 0a 20 20 20 20 20 20 20  sorted)).       
33f20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
33f30 20 20 2f 2a 20 54 68 65 20 63 75 72 72 65 6e 74    /* The current
33f40 20 63 61 6e 64 69 64 61 74 65 20 69 73 20 6e 6f   candidate is no
33f50 20 62 65 74 74 65 72 20 74 68 61 6e 20 61 6e 79   better than any
33f60 20 6f 66 20 74 68 65 20 6d 78 43 68 6f 69 63 65   of the mxChoice
33f70 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
33f80 70 61 74 68 73 20 63 75 72 72 65 6e 74 6c 79 20  paths currently 
33f90 69 6e 20 74 68 65 20 62 65 73 74 2d 73 6f 2d 66  in the best-so-f
33fa0 61 72 20 62 75 66 66 65 72 2e 20 20 53 6f 20 64  ar buffer.  So d
33fb0 69 73 63 61 72 64 0a 20 20 20 20 20 20 20 20 20  iscard.         
33fc0 20 20 20 2a 2a 20 74 68 69 73 20 63 61 6e 64 69     ** this candi
33fd0 64 61 74 65 20 61 73 20 6e 6f 74 20 76 69 61 62  date as not viab
33fe0 6c 65 2e 20 2a 2f 0a 23 69 66 64 65 66 20 57 48  le. */.#ifdef WH
33ff0 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
34000 20 2f 2a 20 30 78 34 20 2a 2f 0a 20 20 20 20 20   /* 0x4 */.     
34010 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
34020 65 33 57 68 65 72 65 54 72 61 63 65 26 30 78 34  e3WhereTrace&0x4
34030 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
34040 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
34050 69 6e 74 66 28 22 53 6b 69 70 20 20 20 25 73 20  intf("Skip   %s 
34060 63 6f 73 74 3d 25 2d 33 64 2c 25 33 64 20 6f 72  cost=%-3d,%3d or
34070 64 65 72 3d 25 63 5c 6e 22 2c 0a 20 20 20 20 20  der=%c\n",.     
34080 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65               whe
34090 72 65 50 61 74 68 4e 61 6d 65 28 70 46 72 6f 6d  rePathName(pFrom
340a0 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29  , iLoop, pWLoop)
340b0 2c 20 72 43 6f 73 74 2c 20 6e 4f 75 74 2c 0a 20  , rCost, nOut,. 
340c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
340d0 20 69 73 4f 72 64 65 72 65 64 3e 3d 30 20 3f 20   isOrdered>=0 ? 
340e0 69 73 4f 72 64 65 72 65 64 2b 27 30 27 20 3a 20  isOrdered+'0' : 
340f0 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20  '?');.          
34100 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
34110 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
34120 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
34130 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20         /* If we 
34140 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74  reach this point
34150 73 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  s it means that 
34160 74 68 65 20 6e 65 77 20 63 61 6e 64 69 64 61 74  the new candidat
34170 65 20 70 61 74 68 0a 20 20 20 20 20 20 20 20 20  e path.         
34180 20 2a 2a 20 6e 65 65 64 73 20 74 6f 20 62 65 20   ** needs to be 
34190 61 64 64 65 64 20 74 6f 20 74 68 65 20 73 65 74  added to the set
341a0 20 6f 66 20 62 65 73 74 2d 73 6f 2d 66 61 72 20   of best-so-far 
341b0 70 61 74 68 73 2e 20 2a 2f 0a 20 20 20 20 20 20  paths. */.      
341c0 20 20 20 20 69 66 28 20 6e 54 6f 3c 6d 78 43 68      if( nTo<mxCh
341d0 6f 69 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20  oice ){.        
341e0 20 20 20 20 2f 2a 20 49 6e 63 72 65 61 73 65 20      /* Increase 
341f0 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
34200 61 54 6f 20 73 65 74 20 62 79 20 6f 6e 65 20 2a  aTo set by one *
34210 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a 6a  /.            jj
34220 20 3d 20 6e 54 6f 2b 2b 3b 0a 20 20 20 20 20 20   = nTo++;.      
34230 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
34240 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 70 61         /* New pa
34250 74 68 20 72 65 70 6c 61 63 65 73 20 74 68 65 20  th replaces the 
34260 70 72 69 6f 72 20 77 6f 72 73 74 20 74 6f 20 6b  prior worst to k
34270 65 65 70 20 63 6f 75 6e 74 20 62 65 6c 6f 77 20  eep count below 
34280 6d 78 43 68 6f 69 63 65 20 2a 2f 0a 20 20 20 20  mxChoice */.    
34290 20 20 20 20 20 20 20 20 6a 6a 20 3d 20 6d 78 49          jj = mxI
342a0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
342b0 20 20 20 20 20 20 20 20 70 54 6f 20 3d 20 26 61          pTo = &a
342c0 54 6f 5b 6a 6a 5d 3b 0a 23 69 66 64 65 66 20 57  To[jj];.#ifdef W
342d0 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
342e0 44 20 2f 2a 20 30 78 34 20 2a 2f 0a 20 20 20 20  D /* 0x4 */.    
342f0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
34300 33 57 68 65 72 65 54 72 61 63 65 26 30 78 34 20  3WhereTrace&0x4 
34310 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
34320 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
34330 66 28 22 4e 65 77 20 20 20 20 25 73 20 63 6f 73  f("New    %s cos
34340 74 3d 25 2d 33 64 2c 25 33 64 20 6f 72 64 65 72  t=%-3d,%3d order
34350 3d 25 63 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%c\n",.        
34360 20 20 20 20 20 20 20 20 77 68 65 72 65 50 61 74          wherePat
34370 68 4e 61 6d 65 28 70 46 72 6f 6d 2c 20 69 4c 6f  hName(pFrom, iLo
34380 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c 20 72 43 6f  op, pWLoop), rCo
34390 73 74 2c 20 6e 4f 75 74 2c 0a 20 20 20 20 20 20  st, nOut,.      
343a0 20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64 65            isOrde
343b0 72 65 64 3e 3d 30 20 3f 20 69 73 4f 72 64 65 72  red>=0 ? isOrder
343c0 65 64 2b 27 30 27 20 3a 20 27 3f 27 29 3b 0a 20  ed+'0' : '?');. 
343d0 20 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69           }.#endi
343e0 66 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  f.        }else{
343f0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  .          /* Co
34400 6e 74 72 6f 6c 20 72 65 61 63 68 65 73 20 68 65  ntrol reaches he
34410 72 65 20 69 66 20 62 65 73 74 2d 73 6f 2d 66 61  re if best-so-fa
34420 72 20 70 61 74 68 20 70 54 6f 3d 61 54 6f 5b 6a  r path pTo=aTo[j
34430 6a 5d 20 63 6f 76 65 72 73 20 74 68 65 0a 20 20  j] covers the.  
34440 20 20 20 20 20 20 20 20 2a 2a 20 73 61 6d 65 20          ** same 
34450 73 65 74 20 6f 66 20 6c 6f 6f 70 73 20 61 6e 64  set of loops and
34460 20 68 61 73 20 74 68 65 20 73 61 6d 20 69 73 4f   has the sam isO
34470 72 64 65 72 65 64 20 73 65 74 74 69 6e 67 20 61  rdered setting a
34480 73 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20  s the.          
34490 2a 2a 20 63 61 6e 64 69 64 61 74 65 20 70 61 74  ** candidate pat
344a0 68 2e 20 20 43 68 65 63 6b 20 74 6f 20 73 65 65  h.  Check to see
344b0 20 69 66 20 74 68 65 20 63 61 6e 64 69 64 61 74   if the candidat
344c0 65 20 73 68 6f 75 6c 64 20 72 65 70 6c 61 63 65  e should replace
344d0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 54  .          ** pT
344e0 6f 20 6f 72 20 69 66 20 74 68 65 20 63 61 6e 64  o or if the cand
344f0 69 64 61 74 65 20 73 68 6f 75 6c 64 20 62 65 20  idate should be 
34500 73 6b 69 70 70 65 64 20 2a 2f 0a 20 20 20 20 20  skipped */.     
34510 20 20 20 20 20 69 66 28 20 70 54 6f 2d 3e 72 43       if( pTo->rC
34520 6f 73 74 3c 72 43 6f 73 74 20 7c 7c 20 28 70 54  ost<rCost || (pT
34530 6f 2d 3e 72 43 6f 73 74 3d 3d 72 43 6f 73 74 20  o->rCost==rCost 
34540 26 26 20 70 54 6f 2d 3e 6e 52 6f 77 3c 3d 6e 4f  && pTo->nRow<=nO
34550 75 74 29 20 29 7b 0a 23 69 66 64 65 66 20 57 48  ut) ){.#ifdef WH
34560 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
34570 20 2f 2a 20 30 78 34 20 2a 2f 0a 20 20 20 20 20   /* 0x4 */.     
34580 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
34590 65 33 57 68 65 72 65 54 72 61 63 65 26 30 78 34  e3WhereTrace&0x4
345a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
345b0 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
345c0 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20 20  intf(.          
345d0 20 20 20 20 20 20 20 20 22 53 6b 69 70 20 20 20          "Skip   
345e0 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25 33 64  %s cost=%-3d,%3d
345f0 20 6f 72 64 65 72 3d 25 63 22 2c 0a 20 20 20 20   order=%c",.    
34600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68                wh
34610 65 72 65 50 61 74 68 4e 61 6d 65 28 70 46 72 6f  erePathName(pFro
34620 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70  m, iLoop, pWLoop
34630 29 2c 20 72 43 6f 73 74 2c 20 6e 4f 75 74 2c 0a  ), rCost, nOut,.
34640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34650 20 20 69 73 4f 72 64 65 72 65 64 3e 3d 30 20 3f    isOrdered>=0 ?
34660 20 69 73 4f 72 64 65 72 65 64 2b 27 30 27 20 3a   isOrdered+'0' :
34670 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20   '?');.         
34680 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
34690 67 50 72 69 6e 74 66 28 22 20 20 20 76 73 20 25  gPrintf("   vs %
346a0 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25 64 20 6f  s cost=%-3d,%d o
346b0 72 64 65 72 3d 25 63 5c 6e 22 2c 0a 20 20 20 20  rder=%c\n",.    
346c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68                wh
346d0 65 72 65 50 61 74 68 4e 61 6d 65 28 70 54 6f 2c  erePathName(pTo,
346e0 20 69 4c 6f 6f 70 2b 31 2c 20 30 29 2c 20 70 54   iLoop+1, 0), pT
346f0 6f 2d 3e 72 43 6f 73 74 2c 20 70 54 6f 2d 3e 6e  o->rCost, pTo->n
34700 52 6f 77 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Row,.           
34710 20 20 20 20 20 20 20 70 54 6f 2d 3e 69 73 4f 72         pTo->isOr
34720 64 65 72 65 64 3e 3d 30 20 3f 20 70 54 6f 2d 3e  dered>=0 ? pTo->
34730 69 73 4f 72 64 65 72 65 64 2b 27 30 27 20 3a 20  isOrdered+'0' : 
34740 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20  '?');.          
34750 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
34760 20 20 20 20 20 20 20 2f 2a 20 44 69 73 63 61 72         /* Discar
34770 64 20 74 68 65 20 63 61 6e 64 69 64 61 74 65 20  d the candidate 
34780 70 61 74 68 20 66 72 6f 6d 20 66 75 72 74 68 65  path from furthe
34790 72 20 63 6f 6e 73 69 64 65 72 61 74 69 6f 6e 20  r consideration 
347a0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  */.            t
347b0 65 73 74 63 61 73 65 28 20 70 54 6f 2d 3e 72 43  estcase( pTo->rC
347c0 6f 73 74 3d 3d 72 43 6f 73 74 20 29 3b 0a 20 20  ost==rCost );.  
347d0 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
347e0 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ue;.          }.
347f0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
34800 73 65 28 20 70 54 6f 2d 3e 72 43 6f 73 74 3d 3d  se( pTo->rCost==
34810 72 43 6f 73 74 2b 31 20 29 3b 0a 20 20 20 20 20  rCost+1 );.     
34820 20 20 20 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20       /* Control 
34830 72 65 61 63 68 65 73 20 68 65 72 65 20 69 66 20  reaches here if 
34840 74 68 65 20 63 61 6e 64 69 64 61 74 65 20 70 61  the candidate pa
34850 74 68 20 69 73 20 62 65 74 74 65 72 20 74 68 61  th is better tha
34860 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20  n the.          
34870 2a 2a 20 70 54 6f 20 70 61 74 68 2e 20 20 52 65  ** pTo path.  Re
34880 70 6c 61 63 65 20 70 54 6f 20 77 69 74 68 20 74  place pTo with t
34890 68 65 20 63 61 6e 64 69 64 61 74 65 2e 20 2a 2f  he candidate. */
348a0 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41  .#ifdef WHERETRA
348b0 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78  CE_ENABLED /* 0x
348c0 34 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69  4 */.          i
348d0 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54  f( sqlite3WhereT
348e0 72 61 63 65 26 30 78 34 20 29 7b 0a 20 20 20 20  race&0x4 ){.    
348f0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
34900 65 62 75 67 50 72 69 6e 74 66 28 0a 20 20 20 20  ebugPrintf(.    
34910 20 20 20 20 20 20 20 20 20 20 20 20 22 55 70 64              "Upd
34920 61 74 65 20 25 73 20 63 6f 73 74 3d 25 2d 33 64  ate %s cost=%-3d
34930 2c 25 33 64 20 6f 72 64 65 72 3d 25 63 22 2c 0a  ,%3d order=%c",.
34940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34950 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70 46  wherePathName(pF
34960 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f  rom, iLoop, pWLo
34970 6f 70 29 2c 20 72 43 6f 73 74 2c 20 6e 4f 75 74  op), rCost, nOut
34980 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
34990 20 20 69 73 4f 72 64 65 72 65 64 3e 3d 30 20 3f    isOrdered>=0 ?
349a0 20 69 73 4f 72 64 65 72 65 64 2b 27 30 27 20 3a   isOrdered+'0' :
349b0 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20   '?');.         
349c0 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
349d0 72 69 6e 74 66 28 22 20 20 77 61 73 20 25 73 20  rintf("  was %s 
349e0 63 6f 73 74 3d 25 2d 33 64 2c 25 33 64 20 6f 72  cost=%-3d,%3d or
349f0 64 65 72 3d 25 63 5c 6e 22 2c 0a 20 20 20 20 20  der=%c\n",.     
34a00 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65             where
34a10 50 61 74 68 4e 61 6d 65 28 70 54 6f 2c 20 69 4c  PathName(pTo, iL
34a20 6f 6f 70 2b 31 2c 20 30 29 2c 20 70 54 6f 2d 3e  oop+1, 0), pTo->
34a30 72 43 6f 73 74 2c 20 70 54 6f 2d 3e 6e 52 6f 77  rCost, pTo->nRow
34a40 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
34a50 20 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64    pTo->isOrdered
34a60 3e 3d 30 20 3f 20 70 54 6f 2d 3e 69 73 4f 72 64  >=0 ? pTo->isOrd
34a70 65 72 65 64 2b 27 30 27 20 3a 20 27 3f 27 29 3b  ered+'0' : '?');
34a80 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 23 65 6e  .          }.#en
34a90 64 69 66 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  dif.        }.  
34aa0 20 20 20 20 20 20 2f 2a 20 70 57 4c 6f 6f 70 20        /* pWLoop 
34ab0 69 73 20 61 20 77 69 6e 6e 65 72 2e 20 20 41 64  is a winner.  Ad
34ac0 64 20 69 74 20 74 6f 20 74 68 65 20 73 65 74 20  d it to the set 
34ad0 6f 66 20 62 65 73 74 20 73 6f 20 66 61 72 20 2a  of best so far *
34ae0 2f 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 6d  /.        pTo->m
34af0 61 73 6b 4c 6f 6f 70 20 3d 20 70 46 72 6f 6d 2d  askLoop = pFrom-
34b00 3e 6d 61 73 6b 4c 6f 6f 70 20 7c 20 70 57 4c 6f  >maskLoop | pWLo
34b10 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20  op->maskSelf;.  
34b20 20 20 20 20 20 20 70 54 6f 2d 3e 72 65 76 4c 6f        pTo->revLo
34b30 6f 70 20 3d 20 72 65 76 4d 61 73 6b 3b 0a 20 20  op = revMask;.  
34b40 20 20 20 20 20 20 70 54 6f 2d 3e 6e 52 6f 77 20        pTo->nRow 
34b50 3d 20 6e 4f 75 74 3b 0a 20 20 20 20 20 20 20 20  = nOut;.        
34b60 70 54 6f 2d 3e 72 43 6f 73 74 20 3d 20 72 43 6f  pTo->rCost = rCo
34b70 73 74 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 2d  st;.        pTo-
34b80 3e 72 55 6e 73 6f 72 74 65 64 20 3d 20 72 55 6e  >rUnsorted = rUn
34b90 73 6f 72 74 65 64 3b 0a 20 20 20 20 20 20 20 20  sorted;.        
34ba0 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 20 3d  pTo->isOrdered =
34bb0 20 69 73 4f 72 64 65 72 65 64 3b 0a 20 20 20 20   isOrdered;.    
34bc0 20 20 20 20 6d 65 6d 63 70 79 28 70 54 6f 2d 3e      memcpy(pTo->
34bd0 61 4c 6f 6f 70 2c 20 70 46 72 6f 6d 2d 3e 61 4c  aLoop, pFrom->aL
34be0 6f 6f 70 2c 20 73 69 7a 65 6f 66 28 57 68 65 72  oop, sizeof(Wher
34bf0 65 4c 6f 6f 70 2a 29 2a 69 4c 6f 6f 70 29 3b 0a  eLoop*)*iLoop);.
34c00 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 61 4c 6f          pTo->aLo
34c10 6f 70 5b 69 4c 6f 6f 70 5d 20 3d 20 70 57 4c 6f  op[iLoop] = pWLo
34c20 6f 70 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  op;.        if( 
34c30 6e 54 6f 3e 3d 6d 78 43 68 6f 69 63 65 20 29 7b  nTo>=mxChoice ){
34c40 0a 20 20 20 20 20 20 20 20 20 20 6d 78 49 20 3d  .          mxI =
34c50 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 78   0;.          mx
34c60 43 6f 73 74 20 3d 20 61 54 6f 5b 30 5d 2e 72 43  Cost = aTo[0].rC
34c70 6f 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 6d  ost;.          m
34c80 78 55 6e 73 6f 72 74 65 64 20 3d 20 61 54 6f 5b  xUnsorted = aTo[
34c90 30 5d 2e 6e 52 6f 77 3b 0a 20 20 20 20 20 20 20  0].nRow;.       
34ca0 20 20 20 66 6f 72 28 6a 6a 3d 31 2c 20 70 54 6f     for(jj=1, pTo
34cb0 3d 26 61 54 6f 5b 31 5d 3b 20 6a 6a 3c 6d 78 43  =&aTo[1]; jj<mxC
34cc0 68 6f 69 63 65 3b 20 6a 6a 2b 2b 2c 20 70 54 6f  hoice; jj++, pTo
34cd0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
34ce0 20 69 66 28 20 70 54 6f 2d 3e 72 43 6f 73 74 3e   if( pTo->rCost>
34cf0 6d 78 43 6f 73 74 20 0a 20 20 20 20 20 20 20 20  mxCost .        
34d00 20 20 20 20 20 7c 7c 20 28 70 54 6f 2d 3e 72 43       || (pTo->rC
34d10 6f 73 74 3d 3d 6d 78 43 6f 73 74 20 26 26 20 70  ost==mxCost && p
34d20 54 6f 2d 3e 72 55 6e 73 6f 72 74 65 64 3e 6d 78  To->rUnsorted>mx
34d30 55 6e 73 6f 72 74 65 64 29 20 0a 20 20 20 20 20  Unsorted) .     
34d40 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
34d50 20 20 20 20 20 20 20 20 6d 78 43 6f 73 74 20 3d          mxCost =
34d60 20 70 54 6f 2d 3e 72 43 6f 73 74 3b 0a 20 20 20   pTo->rCost;.   
34d70 20 20 20 20 20 20 20 20 20 20 20 6d 78 55 6e 73             mxUns
34d80 6f 72 74 65 64 20 3d 20 70 54 6f 2d 3e 72 55 6e  orted = pTo->rUn
34d90 73 6f 72 74 65 64 3b 0a 20 20 20 20 20 20 20 20  sorted;.        
34da0 20 20 20 20 20 20 6d 78 49 20 3d 20 6a 6a 3b 0a        mxI = jj;.
34db0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
34dc0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
34dd0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
34de0 7d 0a 0a 23 69 66 64 65 66 20 57 48 45 52 45 54  }..#ifdef WHERET
34df0 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 20 2f 2a  RACE_ENABLED  /*
34e00 20 3e 3d 32 20 2a 2f 0a 20 20 20 20 69 66 28 20   >=2 */.    if( 
34e10 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63  sqlite3WhereTrac
34e20 65 3e 3d 32 20 29 7b 0a 20 20 20 20 20 20 73 71  e>=2 ){.      sq
34e30 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
34e40 28 22 2d 2d 2d 2d 20 61 66 74 65 72 20 72 6f 75  ("---- after rou
34e50 6e 64 20 25 64 20 2d 2d 2d 2d 5c 6e 22 2c 20 69  nd %d ----\n", i
34e60 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 66 6f 72  Loop);.      for
34e70 28 69 69 3d 30 2c 20 70 54 6f 3d 61 54 6f 3b 20  (ii=0, pTo=aTo; 
34e80 69 69 3c 6e 54 6f 3b 20 69 69 2b 2b 2c 20 70 54  ii<nTo; ii++, pT
34e90 6f 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71  o++){.        sq
34ea0 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
34eb0 28 22 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 20  (" %s cost=%-3d 
34ec0 6e 72 6f 77 3d 25 2d 33 64 20 6f 72 64 65 72 3d  nrow=%-3d order=
34ed0 25 63 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %c",.           
34ee0 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70 54  wherePathName(pT
34ef0 6f 2c 20 69 4c 6f 6f 70 2b 31 2c 20 30 29 2c 20  o, iLoop+1, 0), 
34f00 70 54 6f 2d 3e 72 43 6f 73 74 2c 20 70 54 6f 2d  pTo->rCost, pTo-
34f10 3e 6e 52 6f 77 2c 0a 20 20 20 20 20 20 20 20 20  >nRow,.         
34f20 20 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64    pTo->isOrdered
34f30 3e 3d 30 20 3f 20 28 70 54 6f 2d 3e 69 73 4f 72  >=0 ? (pTo->isOr
34f40 64 65 72 65 64 2b 27 30 27 29 20 3a 20 27 3f 27  dered+'0') : '?'
34f50 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
34f60 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 3e 30 20  To->isOrdered>0 
34f70 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
34f80 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
34f90 22 20 72 65 76 3d 30 78 25 6c 6c 78 5c 6e 22 2c  " rev=0x%llx\n",
34fa0 20 70 54 6f 2d 3e 72 65 76 4c 6f 6f 70 29 3b 0a   pTo->revLoop);.
34fb0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
34fc0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
34fd0 44 65 62 75 67 50 72 69 6e 74 66 28 22 5c 6e 22  DebugPrintf("\n"
34fe0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
34ff0 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69     }.    }.#endi
35000 66 0a 0a 20 20 20 20 2f 2a 20 53 77 61 70 20 74  f..    /* Swap t
35010 68 65 20 72 6f 6c 65 73 20 6f 66 20 61 46 72 6f  he roles of aFro
35020 6d 20 61 6e 64 20 61 54 6f 20 66 6f 72 20 74 68  m and aTo for th
35030 65 20 6e 65 78 74 20 67 65 6e 65 72 61 74 69 6f  e next generatio
35040 6e 20 2a 2f 0a 20 20 20 20 70 46 72 6f 6d 20 3d  n */.    pFrom =
35050 20 61 54 6f 3b 0a 20 20 20 20 61 54 6f 20 3d 20   aTo;.    aTo = 
35060 61 46 72 6f 6d 3b 0a 20 20 20 20 61 46 72 6f 6d  aFrom;.    aFrom
35070 20 3d 20 70 46 72 6f 6d 3b 0a 20 20 20 20 6e 46   = pFrom;.    nF
35080 72 6f 6d 20 3d 20 6e 54 6f 3b 0a 20 20 7d 0a 0a  rom = nTo;.  }..
35090 20 20 69 66 28 20 6e 46 72 6f 6d 3d 3d 30 20 29    if( nFrom==0 )
350a0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
350b0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e  orMsg(pParse, "n
350c0 6f 20 71 75 65 72 79 20 73 6f 6c 75 74 69 6f 6e  o query solution
350d0 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  ");.    sqlite3D
350e0 62 46 72 65 65 28 64 62 2c 20 70 53 70 61 63 65  bFree(db, pSpace
350f0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
35100 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
35110 20 20 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68 65    .  /* Find the
35120 20 6c 6f 77 65 73 74 20 63 6f 73 74 20 70 61 74   lowest cost pat
35130 68 2e 20 20 70 46 72 6f 6d 20 77 69 6c 6c 20 62  h.  pFrom will b
35140 65 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20  e left pointing 
35150 74 6f 20 74 68 61 74 20 70 61 74 68 20 2a 2f 0a  to that path */.
35160 20 20 70 46 72 6f 6d 20 3d 20 61 46 72 6f 6d 3b    pFrom = aFrom;
35170 0a 20 20 66 6f 72 28 69 69 3d 31 3b 20 69 69 3c  .  for(ii=1; ii<
35180 6e 46 72 6f 6d 3b 20 69 69 2b 2b 29 7b 0a 20 20  nFrom; ii++){.  
35190 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 72 43 6f    if( pFrom->rCo
351a0 73 74 3e 61 46 72 6f 6d 5b 69 69 5d 2e 72 43 6f  st>aFrom[ii].rCo
351b0 73 74 20 29 20 70 46 72 6f 6d 20 3d 20 26 61 46  st ) pFrom = &aF
351c0 72 6f 6d 5b 69 69 5d 3b 0a 20 20 7d 0a 20 20 61  rom[ii];.  }.  a
351d0 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 6e  ssert( pWInfo->n
351e0 4c 65 76 65 6c 3d 3d 6e 4c 6f 6f 70 20 29 3b 0a  Level==nLoop );.
351f0 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 6c 6f    /* Load the lo
35200 77 65 73 74 20 63 6f 73 74 20 70 61 74 68 20 69  west cost path i
35210 6e 74 6f 20 70 57 49 6e 66 6f 20 2a 2f 0a 20 20  nto pWInfo */.  
35220 66 6f 72 28 69 4c 6f 6f 70 3d 30 3b 20 69 4c 6f  for(iLoop=0; iLo
35230 6f 70 3c 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f 70 2b  op<nLoop; iLoop+
35240 2b 29 7b 0a 20 20 20 20 57 68 65 72 65 4c 65 76  +){.    WhereLev
35250 65 6c 20 2a 70 4c 65 76 65 6c 20 3d 20 70 57 49  el *pLevel = pWI
35260 6e 66 6f 2d 3e 61 20 2b 20 69 4c 6f 6f 70 3b 0a  nfo->a + iLoop;.
35270 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f      pLevel->pWLo
35280 6f 70 20 3d 20 70 57 4c 6f 6f 70 20 3d 20 70 46  op = pWLoop = pF
35290 72 6f 6d 2d 3e 61 4c 6f 6f 70 5b 69 4c 6f 6f 70  rom->aLoop[iLoop
352a0 5d 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69  ];.    pLevel->i
352b0 46 72 6f 6d 20 3d 20 70 57 4c 6f 6f 70 2d 3e 69  From = pWLoop->i
352c0 54 61 62 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  Tab;.    pLevel-
352d0 3e 69 54 61 62 43 75 72 20 3d 20 70 57 49 6e 66  >iTabCur = pWInf
352e0 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70  o->pTabList->a[p
352f0 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 2e 69 43  Level->iFrom].iC
35300 75 72 73 6f 72 3b 0a 20 20 7d 0a 20 20 69 66 28  ursor;.  }.  if(
35310 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46   (pWInfo->wctrlF
35320 6c 61 67 73 20 26 20 57 48 45 52 45 5f 57 41 4e  lags & WHERE_WAN
35330 54 5f 44 49 53 54 49 4e 43 54 29 21 3d 30 0a 20  T_DISTINCT)!=0. 
35340 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63    && (pWInfo->wc
35350 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
35360 5f 44 49 53 54 49 4e 43 54 42 59 29 3d 3d 30 0a  _DISTINCTBY)==0.
35370 20 20 20 26 26 20 70 57 49 6e 66 6f 2d 3e 65 44     && pWInfo->eD
35380 69 73 74 69 6e 63 74 3d 3d 57 48 45 52 45 5f 44  istinct==WHERE_D
35390 49 53 54 49 4e 43 54 5f 4e 4f 4f 50 0a 20 20 20  ISTINCT_NOOP.   
353a0 26 26 20 6e 52 6f 77 45 73 74 0a 20 20 29 7b 0a  && nRowEst.  ){.
353b0 20 20 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 55      Bitmask notU
353c0 73 65 64 3b 0a 20 20 20 20 69 6e 74 20 72 63 20  sed;.    int rc 
353d0 3d 20 77 68 65 72 65 50 61 74 68 53 61 74 69 73  = wherePathSatis
353e0 66 69 65 73 4f 72 64 65 72 42 79 28 70 57 49 6e  fiesOrderBy(pWIn
353f0 66 6f 2c 20 70 57 49 6e 66 6f 2d 3e 70 52 65 73  fo, pWInfo->pRes
35400 75 6c 74 53 65 74 2c 20 70 46 72 6f 6d 2c 0a 20  ultSet, pFrom,. 
35410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35420 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59  WHERE_DISTINCTBY
35430 2c 20 6e 4c 6f 6f 70 2d 31 2c 20 70 46 72 6f 6d  , nLoop-1, pFrom
35440 2d 3e 61 4c 6f 6f 70 5b 6e 4c 6f 6f 70 2d 31 5d  ->aLoop[nLoop-1]
35450 2c 20 26 6e 6f 74 55 73 65 64 29 3b 0a 20 20 20  , &notUsed);.   
35460 20 69 66 28 20 72 63 3d 3d 70 57 49 6e 66 6f 2d   if( rc==pWInfo-
35470 3e 70 52 65 73 75 6c 74 53 65 74 2d 3e 6e 45 78  >pResultSet->nEx
35480 70 72 20 29 7b 0a 20 20 20 20 20 20 70 57 49 6e  pr ){.      pWIn
35490 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d 20  fo->eDistinct = 
354a0 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f  WHERE_DISTINCT_O
354b0 52 44 45 52 45 44 3b 0a 20 20 20 20 7d 0a 20 20  RDERED;.    }.  
354c0 7d 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e  }.  if( pWInfo->
354d0 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
354e0 69 66 28 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72  if( pWInfo->wctr
354f0 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 44  lFlags & WHERE_D
35500 49 53 54 49 4e 43 54 42 59 20 29 7b 0a 20 20 20  ISTINCTBY ){.   
35510 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 69 73     if( pFrom->is
35520 4f 72 64 65 72 65 64 3d 3d 70 57 49 6e 66 6f 2d  Ordered==pWInfo-
35530 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  >pOrderBy->nExpr
35540 20 29 7b 0a 20 20 20 20 20 20 20 20 70 57 49 6e   ){.        pWIn
35550 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d 20  fo->eDistinct = 
35560 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f  WHERE_DISTINCT_O
35570 52 44 45 52 45 44 3b 0a 20 20 20 20 20 20 7d 0a  RDERED;.      }.
35580 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
35590 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 20   pWInfo->nOBSat 
355a0 3d 20 70 46 72 6f 6d 2d 3e 69 73 4f 72 64 65 72  = pFrom->isOrder
355b0 65 64 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57  ed;.      if( pW
355c0 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 3c 30 20 29  Info->nOBSat<0 )
355d0 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 20   pWInfo->nOBSat 
355e0 3d 20 30 3b 0a 20 20 20 20 20 20 70 57 49 6e 66  = 0;.      pWInf
355f0 6f 2d 3e 72 65 76 4d 61 73 6b 20 3d 20 70 46 72  o->revMask = pFr
35600 6f 6d 2d 3e 72 65 76 4c 6f 6f 70 3b 0a 20 20 20  om->revLoop;.   
35610 20 7d 0a 20 20 20 20 69 66 28 20 28 70 57 49 6e   }.    if( (pWIn
35620 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26  fo->wctrlFlags &
35630 20 57 48 45 52 45 5f 53 4f 52 54 42 59 47 52 4f   WHERE_SORTBYGRO
35640 55 50 29 0a 20 20 20 20 20 20 20 20 26 26 20 70  UP).        && p
35650 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 3d 3d 70  WInfo->nOBSat==p
35660 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2d  WInfo->pOrderBy-
35670 3e 6e 45 78 70 72 0a 20 20 20 20 29 7b 0a 20 20  >nExpr.    ){.  
35680 20 20 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 55      Bitmask notU
35690 73 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  sed = 0;.      i
356a0 6e 74 20 6e 4f 72 64 65 72 20 3d 20 77 68 65 72  nt nOrder = wher
356b0 65 50 61 74 68 53 61 74 69 73 66 69 65 73 4f 72  ePathSatisfiesOr
356c0 64 65 72 42 79 28 70 57 49 6e 66 6f 2c 20 70 57  derBy(pWInfo, pW
356d0 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2c 20  Info->pOrderBy, 
356e0 0a 20 20 20 20 20 20 20 20 20 20 70 46 72 6f 6d  .          pFrom
356f0 2c 20 30 2c 20 6e 4c 6f 6f 70 2d 31 2c 20 70 46  , 0, nLoop-1, pF
35700 72 6f 6d 2d 3e 61 4c 6f 6f 70 5b 6e 4c 6f 6f 70  rom->aLoop[nLoop
35710 2d 31 5d 2c 20 26 6e 6f 74 55 73 65 64 0a 20 20  -1], &notUsed.  
35720 20 20 20 20 29 3b 0a 20 20 20 20 20 20 61 73 73      );.      ass
35730 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 73 6f 72  ert( pWInfo->sor
35740 74 65 64 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ted==0 );.      
35750 70 57 49 6e 66 6f 2d 3e 73 6f 72 74 65 64 20 3d  pWInfo->sorted =
35760 20 28 6e 4f 72 64 65 72 3d 3d 70 57 49 6e 66 6f   (nOrder==pWInfo
35770 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  ->pOrderBy->nExp
35780 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a  r);.    }.  }...
35790 20 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75    pWInfo->nRowOu
357a0 74 20 3d 20 70 46 72 6f 6d 2d 3e 6e 52 6f 77 3b  t = pFrom->nRow;
357b0 0a 0a 20 20 2f 2a 20 46 72 65 65 20 74 65 6d 70  ..  /* Free temp
357c0 6f 72 61 72 79 20 6d 65 6d 6f 72 79 20 61 6e 64  orary memory and
357d0 20 72 65 74 75 72 6e 20 73 75 63 63 65 73 73 20   return success 
357e0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  */.  sqlite3DbFr
357f0 65 65 28 64 62 2c 20 70 53 70 61 63 65 29 3b 0a  ee(db, pSpace);.
35800 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
35810 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 73  OK;.}../*.** Mos
35820 74 20 71 75 65 72 69 65 73 20 75 73 65 20 6f 6e  t queries use on
35830 6c 79 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c  ly a single tabl
35840 65 20 28 74 68 65 79 20 61 72 65 20 6e 6f 74 20  e (they are not 
35850 6a 6f 69 6e 73 29 20 61 6e 64 20 68 61 76 65 0a  joins) and have.
35860 2a 2a 20 73 69 6d 70 6c 65 20 3d 3d 20 63 6f 6e  ** simple == con
35870 73 74 72 61 69 6e 74 73 20 61 67 61 69 6e 73 74  straints against
35880 20 69 6e 64 65 78 65 64 20 66 69 65 6c 64 73 2e   indexed fields.
35890 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61    This routine a
358a0 74 74 65 6d 70 74 73 0a 2a 2a 20 74 6f 20 70 6c  ttempts.** to pl
358b0 61 6e 20 74 68 6f 73 65 20 73 69 6d 70 6c 65 20  an those simple 
358c0 63 61 73 65 73 20 75 73 69 6e 67 20 6d 75 63 68  cases using much
358d0 20 6c 65 73 73 20 63 65 72 65 6d 6f 6e 79 20 74   less ceremony t
358e0 68 61 6e 20 74 68 65 0a 2a 2a 20 67 65 6e 65 72  han the.** gener
358f0 61 6c 2d 70 75 72 70 6f 73 65 20 71 75 65 72 79  al-purpose query
35900 20 70 6c 61 6e 6e 65 72 2c 20 61 6e 64 20 74 68   planner, and th
35910 65 72 65 62 79 20 79 69 65 6c 64 20 66 61 73 74  ereby yield fast
35920 65 72 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61  er sqlite3_prepa
35930 72 65 28 29 0a 2a 2a 20 74 69 6d 65 73 20 66 6f  re().** times fo
35940 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73  r the common cas
35950 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  e..**.** Return 
35960 6e 6f 6e 2d 7a 65 72 6f 20 6f 6e 20 73 75 63 63  non-zero on succ
35970 65 73 73 2c 20 69 66 20 74 68 69 73 20 71 75 65  ess, if this que
35980 72 79 20 63 61 6e 20 62 65 20 68 61 6e 64 6c 65  ry can be handle
35990 64 20 62 79 20 74 68 69 73 0a 2a 2a 20 6e 6f 2d  d by this.** no-
359a0 66 72 69 6c 6c 73 20 71 75 65 72 79 20 70 6c 61  frills query pla
359b0 6e 6e 65 72 2e 20 20 52 65 74 75 72 6e 20 7a 65  nner.  Return ze
359c0 72 6f 20 69 66 20 74 68 69 73 20 71 75 65 72 79  ro if this query
359d0 20 6e 65 65 64 73 20 74 68 65 20 0a 2a 2a 20 67   needs the .** g
359e0 65 6e 65 72 61 6c 2d 70 75 72 70 6f 73 65 20 71  eneral-purpose q
359f0 75 65 72 79 20 70 6c 61 6e 6e 65 72 2e 0a 2a 2f  uery planner..*/
35a00 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
35a10 65 53 68 6f 72 74 43 75 74 28 57 68 65 72 65 4c  eShortCut(WhereL
35a20 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69  oopBuilder *pBui
35a30 6c 64 65 72 29 7b 0a 20 20 57 68 65 72 65 49 6e  lder){.  WhereIn
35a40 66 6f 20 2a 70 57 49 6e 66 6f 3b 0a 20 20 73 74  fo *pWInfo;.  st
35a50 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
35a60 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 57 68 65 72  m *pItem;.  Wher
35a70 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 0a 20 20  eClause *pWC;.  
35a80 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
35a90 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  ;.  WhereLoop *p
35aa0 4c 6f 6f 70 3b 0a 20 20 69 6e 74 20 69 43 75 72  Loop;.  int iCur
35ab0 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 54 61 62  ;.  int j;.  Tab
35ac0 6c 65 20 2a 70 54 61 62 3b 0a 20 20 49 6e 64 65  le *pTab;.  Inde
35ad0 78 20 2a 70 49 64 78 3b 0a 20 20 0a 20 20 70 57  x *pIdx;.  .  pW
35ae0 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d  Info = pBuilder-
35af0 3e 70 57 49 6e 66 6f 3b 0a 20 20 69 66 28 20 70  >pWInfo;.  if( p
35b00 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67  WInfo->wctrlFlag
35b10 73 20 26 20 57 48 45 52 45 5f 46 4f 52 43 45 5f  s & WHERE_FORCE_
35b20 54 41 42 4c 45 20 29 20 72 65 74 75 72 6e 20 30  TABLE ) return 0
35b30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 57 49 6e  ;.  assert( pWIn
35b40 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 6e 53  fo->pTabList->nS
35b50 72 63 3e 3d 31 20 29 3b 0a 20 20 70 49 74 65 6d  rc>=1 );.  pItem
35b60 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c   = pWInfo->pTabL
35b70 69 73 74 2d 3e 61 3b 0a 20 20 70 54 61 62 20 3d  ist->a;.  pTab =
35b80 20 70 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20   pItem->pTab;.  
35b90 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54  if( IsVirtual(pT
35ba0 61 62 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ab) ) return 0;.
35bb0 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 49 6e    if( pItem->zIn
35bc0 64 65 78 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  dex ) return 0;.
35bd0 20 20 69 43 75 72 20 3d 20 70 49 74 65 6d 2d 3e    iCur = pItem->
35be0 69 43 75 72 73 6f 72 3b 0a 20 20 70 57 43 20 3d  iCursor;.  pWC =
35bf0 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43 3b 0a 20   &pWInfo->sWC;. 
35c00 20 70 4c 6f 6f 70 20 3d 20 70 42 75 69 6c 64 65   pLoop = pBuilde
35c10 72 2d 3e 70 4e 65 77 3b 0a 20 20 70 4c 6f 6f 70  r->pNew;.  pLoop
35c20 2d 3e 77 73 46 6c 61 67 73 20 3d 20 30 3b 0a 20  ->wsFlags = 0;. 
35c30 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
35c40 6e 53 6b 69 70 20 3d 20 30 3b 0a 20 20 70 54 65  nSkip = 0;.  pTe
35c50 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57  rm = findTerm(pW
35c60 43 2c 20 69 43 75 72 2c 20 2d 31 2c 20 30 2c 20  C, iCur, -1, 0, 
35c70 57 4f 5f 45 51 2c 20 30 29 3b 0a 20 20 69 66 28  WO_EQ, 0);.  if(
35c80 20 70 54 65 72 6d 20 29 7b 0a 20 20 20 20 70 4c   pTerm ){.    pL
35c90 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57  oop->wsFlags = W
35ca0 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 7c 57  HERE_COLUMN_EQ|W
35cb0 48 45 52 45 5f 49 50 4b 7c 57 48 45 52 45 5f 4f  HERE_IPK|WHERE_O
35cc0 4e 45 52 4f 57 3b 0a 20 20 20 20 70 4c 6f 6f 70  NEROW;.    pLoop
35cd0 2d 3e 61 4c 54 65 72 6d 5b 30 5d 20 3d 20 70 54  ->aLTerm[0] = pT
35ce0 65 72 6d 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e  erm;.    pLoop->
35cf0 6e 4c 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20  nLTerm = 1;.    
35d00 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e  pLoop->u.btree.n
35d10 45 71 20 3d 20 31 3b 0a 20 20 20 20 2f 2a 20 54  Eq = 1;.    /* T
35d20 55 4e 49 4e 47 3a 20 43 6f 73 74 20 6f 66 20 61  UNING: Cost of a
35d30 20 72 6f 77 69 64 20 6c 6f 6f 6b 75 70 20 69 73   rowid lookup is
35d40 20 31 30 20 2a 2f 0a 20 20 20 20 70 4c 6f 6f 70   10 */.    pLoop
35d50 2d 3e 72 52 75 6e 20 3d 20 33 33 3b 20 20 2f 2a  ->rRun = 33;  /*
35d60 20 33 33 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45   33==sqlite3LogE
35d70 73 74 28 31 30 29 20 2a 2f 0a 20 20 7d 65 6c 73  st(10) */.  }els
35d80 65 7b 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d  e{.    for(pIdx=
35d90 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
35da0 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  dx; pIdx=pIdx->p
35db0 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 61 73 73  Next){.      ass
35dc0 65 72 74 28 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65  ert( pLoop->aLTe
35dd0 72 6d 53 70 61 63 65 3d 3d 70 4c 6f 6f 70 2d 3e  rmSpace==pLoop->
35de0 61 4c 54 65 72 6d 20 29 3b 0a 20 20 20 20 20 20  aLTerm );.      
35df0 61 73 73 65 72 74 28 20 41 72 72 61 79 53 69 7a  assert( ArraySiz
35e00 65 28 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 53  e(pLoop->aLTermS
35e10 70 61 63 65 29 3d 3d 34 20 29 3b 0a 20 20 20 20  pace)==4 );.    
35e20 20 20 69 66 28 20 21 49 73 55 6e 69 71 75 65 49    if( !IsUniqueI
35e30 6e 64 65 78 28 70 49 64 78 29 0a 20 20 20 20 20  ndex(pIdx).     
35e40 20 20 7c 7c 20 70 49 64 78 2d 3e 70 50 61 72 74    || pIdx->pPart
35e50 49 64 78 57 68 65 72 65 21 3d 30 20 0a 20 20 20  IdxWhere!=0 .   
35e60 20 20 20 20 7c 7c 20 70 49 64 78 2d 3e 6e 4b 65      || pIdx->nKe
35e70 79 43 6f 6c 3e 41 72 72 61 79 53 69 7a 65 28 70  yCol>ArraySize(p
35e80 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63  Loop->aLTermSpac
35e90 65 29 20 0a 20 20 20 20 20 20 29 20 63 6f 6e 74  e) .      ) cont
35ea0 69 6e 75 65 3b 0a 20 20 20 20 20 20 66 6f 72 28  inue;.      for(
35eb0 6a 3d 30 3b 20 6a 3c 70 49 64 78 2d 3e 6e 4b 65  j=0; j<pIdx->nKe
35ec0 79 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  yCol; j++){.    
35ed0 20 20 20 20 70 54 65 72 6d 20 3d 20 66 69 6e 64      pTerm = find
35ee0 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20  Term(pWC, iCur, 
35ef0 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a  pIdx->aiColumn[j
35f00 5d 2c 20 30 2c 20 57 4f 5f 45 51 2c 20 70 49 64  ], 0, WO_EQ, pId
35f10 78 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  x);.        if( 
35f20 70 54 65 72 6d 3d 3d 30 20 29 20 62 72 65 61 6b  pTerm==0 ) break
35f30 3b 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d  ;.        pLoop-
35f40 3e 61 4c 54 65 72 6d 5b 6a 5d 20 3d 20 70 54 65  >aLTerm[j] = pTe
35f50 72 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rm;.      }.    
35f60 20 20 69 66 28 20 6a 21 3d 70 49 64 78 2d 3e 6e    if( j!=pIdx->n
35f70 4b 65 79 43 6f 6c 20 29 20 63 6f 6e 74 69 6e 75  KeyCol ) continu
35f80 65 3b 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e  e;.      pLoop->
35f90 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f  wsFlags = WHERE_
35fa0 43 4f 4c 55 4d 4e 5f 45 51 7c 57 48 45 52 45 5f  COLUMN_EQ|WHERE_
35fb0 4f 4e 45 52 4f 57 7c 57 48 45 52 45 5f 49 4e 44  ONEROW|WHERE_IND
35fc0 45 58 45 44 3b 0a 20 20 20 20 20 20 69 66 28 20  EXED;.      if( 
35fd0 70 49 64 78 2d 3e 69 73 43 6f 76 65 72 69 6e 67  pIdx->isCovering
35fe0 20 7c 7c 20 28 70 49 74 65 6d 2d 3e 63 6f 6c 55   || (pItem->colU
35ff0 73 65 64 20 26 20 7e 63 6f 6c 75 6d 6e 73 49 6e  sed & ~columnsIn
36000 49 6e 64 65 78 28 70 49 64 78 29 29 3d 3d 30 20  Index(pIdx))==0 
36010 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f 70  ){.        pLoop
36020 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45  ->wsFlags |= WHE
36030 52 45 5f 49 44 58 5f 4f 4e 4c 59 3b 0a 20 20 20  RE_IDX_ONLY;.   
36040 20 20 20 7d 0a 20 20 20 20 20 20 70 4c 6f 6f 70     }.      pLoop
36050 2d 3e 6e 4c 54 65 72 6d 20 3d 20 6a 3b 0a 20 20  ->nLTerm = j;.  
36060 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72      pLoop->u.btr
36070 65 65 2e 6e 45 71 20 3d 20 6a 3b 0a 20 20 20 20  ee.nEq = j;.    
36080 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65    pLoop->u.btree
36090 2e 70 49 6e 64 65 78 20 3d 20 70 49 64 78 3b 0a  .pIndex = pIdx;.
360a0 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a        /* TUNING:
360b0 20 43 6f 73 74 20 6f 66 20 61 20 75 6e 69 71 75   Cost of a uniqu
360c0 65 20 69 6e 64 65 78 20 6c 6f 6f 6b 75 70 20 69  e index lookup i
360d0 73 20 31 35 20 2a 2f 0a 20 20 20 20 20 20 70 4c  s 15 */.      pL
360e0 6f 6f 70 2d 3e 72 52 75 6e 20 3d 20 33 39 3b 20  oop->rRun = 39; 
360f0 20 2f 2a 20 33 39 3d 3d 73 71 6c 69 74 65 33 4c   /* 39==sqlite3L
36100 6f 67 45 73 74 28 31 35 29 20 2a 2f 0a 20 20 20  ogEst(15) */.   
36110 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
36120 20 20 7d 0a 20 20 69 66 28 20 70 4c 6f 6f 70 2d    }.  if( pLoop-
36130 3e 77 73 46 6c 61 67 73 20 29 7b 0a 20 20 20 20  >wsFlags ){.    
36140 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 3d 20 28 4c  pLoop->nOut = (L
36150 6f 67 45 73 74 29 31 3b 0a 20 20 20 20 70 57 49  ogEst)1;.    pWI
36160 6e 66 6f 2d 3e 61 5b 30 5d 2e 70 57 4c 6f 6f 70  nfo->a[0].pWLoop
36170 20 3d 20 70 4c 6f 6f 70 3b 0a 20 20 20 20 70 4c   = pLoop;.    pL
36180 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 20 3d 20  oop->maskSelf = 
36190 67 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d  getMask(&pWInfo-
361a0 3e 73 4d 61 73 6b 53 65 74 2c 20 69 43 75 72 29  >sMaskSet, iCur)
361b0 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b  ;.    pWInfo->a[
361c0 30 5d 2e 69 54 61 62 43 75 72 20 3d 20 69 43 75  0].iTabCur = iCu
361d0 72 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 6e  r;.    pWInfo->n
361e0 52 6f 77 4f 75 74 20 3d 20 31 3b 0a 20 20 20 20  RowOut = 1;.    
361f0 69 66 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64  if( pWInfo->pOrd
36200 65 72 42 79 20 29 20 70 57 49 6e 66 6f 2d 3e 6e  erBy ) pWInfo->n
36210 4f 42 53 61 74 20 3d 20 20 70 57 49 6e 66 6f 2d  OBSat =  pWInfo-
36220 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  >pOrderBy->nExpr
36230 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f  ;.    if( pWInfo
36240 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ->wctrlFlags & W
36250 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e  HERE_WANT_DISTIN
36260 43 54 20 29 7b 0a 20 20 20 20 20 20 70 57 49 6e  CT ){.      pWIn
36270 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d 20  fo->eDistinct = 
36280 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55  WHERE_DISTINCT_U
36290 4e 49 51 55 45 3b 0a 20 20 20 20 7d 0a 23 69 66  NIQUE;.    }.#if
362a0 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
362b0 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 63 49 64 20  .    pLoop->cId 
362c0 3d 20 27 30 27 3b 0a 23 65 6e 64 69 66 0a 20 20  = '0';.#endif.  
362d0 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
362e0 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
362f0 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 74 68  *.** Generate th
36300 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
36310 68 65 20 6c 6f 6f 70 20 75 73 65 64 20 66 6f 72  he loop used for
36320 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 70 72   WHERE clause pr
36330 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 20 54 68 65  ocessing..** The
36340 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73   return value is
36350 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
36360 20 6f 70 61 71 75 65 20 73 74 72 75 63 74 75 72   opaque structur
36370 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 0a  e that contains.
36380 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6e  ** information n
36390 65 65 64 65 64 20 74 6f 20 74 65 72 6d 69 6e 61  eeded to termina
363a0 74 65 20 74 68 65 20 6c 6f 6f 70 2e 20 20 4c 61  te the loop.  La
363b0 74 65 72 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67  ter, the calling
363c0 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 73 68 6f 75   routine.** shou
363d0 6c 64 20 69 6e 76 6f 6b 65 20 73 71 6c 69 74 65  ld invoke sqlite
363e0 33 57 68 65 72 65 45 6e 64 28 29 20 77 69 74 68  3WhereEnd() with
363f0 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
36400 65 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  e of this functi
36410 6f 6e 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74  on.** in order t
36420 6f 20 63 6f 6d 70 6c 65 74 65 20 74 68 65 20 57  o complete the W
36430 48 45 52 45 20 63 6c 61 75 73 65 20 70 72 6f 63  HERE clause proc
36440 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66  essing..**.** If
36450 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
36460 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  , this routine r
36470 65 74 75 72 6e 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a  eturns NULL..**.
36480 2a 2a 20 54 68 65 20 62 61 73 69 63 20 69 64 65  ** The basic ide
36490 61 20 69 73 20 74 6f 20 64 6f 20 61 20 6e 65 73  a is to do a nes
364a0 74 65 64 20 6c 6f 6f 70 2c 20 6f 6e 65 20 6c 6f  ted loop, one lo
364b0 6f 70 20 66 6f 72 20 65 61 63 68 20 74 61 62 6c  op for each tabl
364c0 65 20 69 6e 0a 2a 2a 20 74 68 65 20 46 52 4f 4d  e in.** the FROM
364d0 20 63 6c 61 75 73 65 20 6f 66 20 61 20 73 65 6c   clause of a sel
364e0 65 63 74 2e 20 20 28 49 4e 53 45 52 54 20 61 6e  ect.  (INSERT an
364f0 64 20 55 50 44 41 54 45 20 73 74 61 74 65 6d 65  d UPDATE stateme
36500 6e 74 73 20 61 72 65 20 74 68 65 0a 2a 2a 20 73  nts are the.** s
36510 61 6d 65 20 61 73 20 61 20 53 45 4c 45 43 54 20  ame as a SELECT 
36520 77 69 74 68 20 6f 6e 6c 79 20 61 20 73 69 6e 67  with only a sing
36530 6c 65 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20  le table in the 
36540 46 52 4f 4d 20 63 6c 61 75 73 65 2e 29 20 20 46  FROM clause.)  F
36550 6f 72 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 69  or.** example, i
36560 66 20 74 68 65 20 53 51 4c 20 69 73 20 74 68 69  f the SQL is thi
36570 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 53  s:.**.**       S
36580 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 2c  ELECT * FROM t1,
36590 20 74 32 2c 20 74 33 20 57 48 45 52 45 20 2e 2e   t2, t3 WHERE ..
365a0 2e 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 74 68  .;.**.** Then th
365b0 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64  e code generated
365c0 20 69 73 20 63 6f 6e 63 65 70 74 75 61 6c 6c 79   is conceptually
365d0 20 6c 69 6b 65 20 74 68 65 20 66 6f 6c 6c 6f 77   like the follow
365e0 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  ing:.**.**      
365f0 66 6f 72 65 61 63 68 20 72 6f 77 31 20 69 6e 20  foreach row1 in 
36600 74 31 20 64 6f 20 20 20 20 20 20 20 5c 20 20 20  t1 do       \   
36610 20 43 6f 64 65 20 67 65 6e 65 72 61 74 65 64 0a   Code generated.
36620 2a 2a 20 20 20 20 20 20 20 20 66 6f 72 65 61 63  **        foreac
36630 68 20 72 6f 77 32 20 69 6e 20 74 32 20 64 6f 20  h row2 in t2 do 
36640 20 20 20 20 20 7c 2d 2d 20 62 79 20 73 71 6c 69       |-- by sqli
36650 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 0a  te3WhereBegin().
36660 2a 2a 20 20 20 20 20 20 20 20 20 20 66 6f 72 65  **          fore
36670 61 63 68 20 72 6f 77 33 20 69 6e 20 74 33 20 64  ach row3 in t3 d
36680 6f 20 20 20 2f 0a 2a 2a 20 20 20 20 20 20 20 20  o   /.**        
36690 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20      ....**      
366a0 20 20 20 20 65 6e 64 20 20 20 20 20 20 20 20 20      end         
366b0 20 20 20 20 20 20 20 20 20 20 20 20 5c 20 20 20              \   
366c0 20 43 6f 64 65 20 67 65 6e 65 72 61 74 65 64 0a   Code generated.
366d0 2a 2a 20 20 20 20 20 20 20 20 65 6e 64 20 20 20  **        end   
366e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
366f0 20 20 20 20 20 7c 2d 2d 20 62 79 20 73 71 6c 69       |-- by sqli
36700 74 65 33 57 68 65 72 65 45 6e 64 28 29 0a 2a 2a  te3WhereEnd().**
36710 20 20 20 20 20 20 65 6e 64 20 20 20 20 20 20 20        end       
36720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36730 20 20 2f 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74    /.**.** Note t
36740 68 61 74 20 74 68 65 20 6c 6f 6f 70 73 20 6d 69  hat the loops mi
36750 67 68 74 20 6e 6f 74 20 62 65 20 6e 65 73 74 65  ght not be neste
36760 64 20 69 6e 20 74 68 65 20 6f 72 64 65 72 20 69  d in the order i
36770 6e 20 77 68 69 63 68 20 74 68 65 79 0a 2a 2a 20  n which they.** 
36780 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 46 52  appear in the FR
36790 4f 4d 20 63 6c 61 75 73 65 20 69 66 20 61 20 64  OM clause if a d
367a0 69 66 66 65 72 65 6e 74 20 6f 72 64 65 72 20 69  ifferent order i
367b0 73 20 62 65 74 74 65 72 20 61 62 6c 65 20 74 6f  s better able to
367c0 20 6d 61 6b 65 0a 2a 2a 20 75 73 65 20 6f 66 20   make.** use of 
367d0 69 6e 64 69 63 65 73 2e 20 20 4e 6f 74 65 20 61  indices.  Note a
367e0 6c 73 6f 20 74 68 61 74 20 77 68 65 6e 20 74 68  lso that when th
367f0 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 61 70  e IN operator ap
36800 70 65 61 72 73 20 69 6e 0a 2a 2a 20 74 68 65 20  pears in.** the 
36810 57 48 45 52 45 20 63 6c 61 75 73 65 2c 20 69 74  WHERE clause, it
36820 20 6d 69 67 68 74 20 72 65 73 75 6c 74 20 69 6e   might result in
36830 20 61 64 64 69 74 69 6f 6e 61 6c 20 6e 65 73 74   additional nest
36840 65 64 20 6c 6f 6f 70 73 20 66 6f 72 0a 2a 2a 20  ed loops for.** 
36850 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67 68  scanning through
36860 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f 6e 20 74   all values on t
36870 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69  he right-hand si
36880 64 65 20 6f 66 20 74 68 65 20 49 4e 2e 0a 2a 2a  de of the IN..**
36890 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 20 42 74  .** There are Bt
368a0 72 65 65 20 63 75 72 73 6f 72 73 20 61 73 73 6f  ree cursors asso
368b0 63 69 61 74 65 64 20 77 69 74 68 20 65 61 63 68  ciated with each
368c0 20 74 61 62 6c 65 2e 20 20 74 31 20 75 73 65 73   table.  t1 uses
368d0 20 63 75 72 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65   cursor.** numbe
368e0 72 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d  r pTabList->a[0]
368f0 2e 69 43 75 72 73 6f 72 2e 20 20 74 32 20 75 73  .iCursor.  t2 us
36900 65 73 20 74 68 65 20 63 75 72 73 6f 72 20 70 54  es the cursor pT
36910 61 62 4c 69 73 74 2d 3e 61 5b 31 5d 2e 69 43 75  abList->a[1].iCu
36920 72 73 6f 72 2e 0a 2a 2a 20 41 6e 64 20 73 6f 20  rsor..** And so 
36930 66 6f 72 74 68 2e 20 20 54 68 69 73 20 72 6f 75  forth.  This rou
36940 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 63  tine generates c
36950 6f 64 65 20 74 6f 20 6f 70 65 6e 20 74 68 6f 73  ode to open thos
36960 65 20 56 44 42 45 20 63 75 72 73 6f 72 73 0a 2a  e VDBE cursors.*
36970 2a 20 61 6e 64 20 73 71 6c 69 74 65 33 57 68 65  * and sqlite3Whe
36980 72 65 45 6e 64 28 29 20 67 65 6e 65 72 61 74 65  reEnd() generate
36990 73 20 74 68 65 20 63 6f 64 65 20 74 6f 20 63 6c  s the code to cl
369a0 6f 73 65 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a 20  ose them..**.** 
369b0 54 68 65 20 63 6f 64 65 20 74 68 61 74 20 73 71  The code that sq
369c0 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
369d0 29 20 67 65 6e 65 72 61 74 65 73 20 6c 65 61 76  ) generates leav
369e0 65 73 20 74 68 65 20 63 75 72 73 6f 72 73 20 6e  es the cursors n
369f0 61 6d 65 64 0a 2a 2a 20 69 6e 20 70 54 61 62 4c  amed.** in pTabL
36a00 69 73 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  ist pointing at 
36a10 74 68 65 69 72 20 61 70 70 72 6f 70 72 69 61 74  their appropriat
36a20 65 20 65 6e 74 72 69 65 73 2e 20 20 54 68 65 20  e entries.  The 
36a30 5b 2e 2e 2e 5d 20 63 6f 64 65 0a 2a 2a 20 63 61  [...] code.** ca
36a40 6e 20 75 73 65 20 4f 50 5f 43 6f 6c 75 6d 6e 20  n use OP_Column 
36a50 61 6e 64 20 4f 50 5f 52 6f 77 69 64 20 6f 70 63  and OP_Rowid opc
36a60 6f 64 65 73 20 6f 6e 20 74 68 65 73 65 20 63 75  odes on these cu
36a70 72 73 6f 72 73 20 74 6f 20 65 78 74 72 61 63 74  rsors to extract
36a80 0a 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20 74 68  .** data from th
36a90 65 20 76 61 72 69 6f 75 73 20 74 61 62 6c 65 73  e various tables
36aa0 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a   of the loop..**
36ab0 0a 2a 2a 20 49 66 20 74 68 65 20 57 48 45 52 45  .** If the WHERE
36ac0 20 63 6c 61 75 73 65 20 69 73 20 65 6d 70 74 79   clause is empty
36ad0 2c 20 74 68 65 20 66 6f 72 65 61 63 68 20 6c 6f  , the foreach lo
36ae0 6f 70 73 20 6d 75 73 74 20 65 61 63 68 20 73 63  ops must each sc
36af0 61 6e 20 74 68 65 69 72 0a 2a 2a 20 65 6e 74 69  an their.** enti
36b00 72 65 20 74 61 62 6c 65 73 2e 20 20 54 68 75 73  re tables.  Thus
36b10 20 61 20 74 68 72 65 65 2d 77 61 79 20 6a 6f 69   a three-way joi
36b20 6e 20 69 73 20 61 6e 20 4f 28 4e 5e 33 29 20 6f  n is an O(N^3) o
36b30 70 65 72 61 74 69 6f 6e 2e 20 20 42 75 74 20 69  peration.  But i
36b40 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 73 20  f.** the tables 
36b50 68 61 76 65 20 69 6e 64 69 63 65 73 20 61 6e 64  have indices and
36b60 20 74 68 65 72 65 20 61 72 65 20 74 65 72 6d 73   there are terms
36b70 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c   in the WHERE cl
36b80 61 75 73 65 20 74 68 61 74 0a 2a 2a 20 72 65 66  ause that.** ref
36b90 65 72 20 74 6f 20 74 68 6f 73 65 20 69 6e 64 69  er to those indi
36ba0 63 65 73 2c 20 61 20 63 6f 6d 70 6c 65 74 65 20  ces, a complete 
36bb0 74 61 62 6c 65 20 73 63 61 6e 20 63 61 6e 20 62  table scan can b
36bc0 65 20 61 76 6f 69 64 65 64 20 61 6e 64 20 74 68  e avoided and th
36bd0 65 0a 2a 2a 20 63 6f 64 65 20 77 69 6c 6c 20 72  e.** code will r
36be0 75 6e 20 6d 75 63 68 20 66 61 73 74 65 72 2e 20  un much faster. 
36bf0 20 4d 6f 73 74 20 6f 66 20 74 68 65 20 77 6f 72   Most of the wor
36c00 6b 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e  k of this routin
36c10 65 20 69 73 20 63 68 65 63 6b 69 6e 67 0a 2a 2a  e is checking.**
36c20 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 72 65   to see if there
36c30 20 61 72 65 20 69 6e 64 69 63 65 73 20 74 68 61   are indices tha
36c40 74 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f  t can be used to
36c50 20 73 70 65 65 64 20 75 70 20 74 68 65 20 6c 6f   speed up the lo
36c60 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 65 72 6d 73 20  op..**.** Terms 
36c70 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
36c80 75 73 65 20 61 72 65 20 61 6c 73 6f 20 75 73 65  use are also use
36c90 64 20 74 6f 20 6c 69 6d 69 74 20 77 68 69 63 68  d to limit which
36ca0 20 72 6f 77 73 20 61 63 74 75 61 6c 6c 79 0a 2a   rows actually.*
36cb0 2a 20 6d 61 6b 65 20 69 74 20 74 6f 20 74 68 65  * make it to the
36cc0 20 22 2e 2e 2e 22 20 69 6e 20 74 68 65 20 6d 69   "..." in the mi
36cd0 64 64 6c 65 20 6f 66 20 74 68 65 20 6c 6f 6f 70  ddle of the loop
36ce0 2e 20 20 41 66 74 65 72 20 65 61 63 68 20 22 66  .  After each "f
36cf0 6f 72 65 61 63 68 22 2c 0a 2a 2a 20 74 65 72 6d  oreach",.** term
36d00 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  s of the WHERE c
36d10 6c 61 75 73 65 20 74 68 61 74 20 75 73 65 20 6f  lause that use o
36d20 6e 6c 79 20 74 65 72 6d 73 20 69 6e 20 74 68 61  nly terms in tha
36d30 74 20 6c 6f 6f 70 20 61 6e 64 20 6f 75 74 65 72  t loop and outer
36d40 0a 2a 2a 20 6c 6f 6f 70 73 20 61 72 65 20 65 76  .** loops are ev
36d50 61 6c 75 61 74 65 64 20 61 6e 64 20 69 66 20 66  aluated and if f
36d60 61 6c 73 65 20 61 20 6a 75 6d 70 20 69 73 20 6d  alse a jump is m
36d70 61 64 65 20 61 72 6f 75 6e 64 20 61 6c 6c 20 73  ade around all s
36d80 75 62 73 65 71 75 65 6e 74 0a 2a 2a 20 69 6e 6e  ubsequent.** inn
36d90 65 72 20 6c 6f 6f 70 73 20 28 6f 72 20 61 72 6f  er loops (or aro
36da0 75 6e 64 20 74 68 65 20 22 2e 2e 2e 22 20 69 66  und the "..." if
36db0 20 74 68 65 20 74 65 73 74 20 6f 63 63 75 72 73   the test occurs
36dc0 20 77 69 74 68 69 6e 20 74 68 65 20 69 6e 6e 65   within the inne
36dd0 72 2d 0a 2a 2a 20 6d 6f 73 74 20 6c 6f 6f 70 29  r-.** most loop)
36de0 0a 2a 2a 0a 2a 2a 20 4f 55 54 45 52 20 4a 4f 49  .**.** OUTER JOI
36df0 4e 53 0a 2a 2a 0a 2a 2a 20 41 6e 20 6f 75 74 65  NS.**.** An oute
36e00 72 20 6a 6f 69 6e 20 6f 66 20 74 61 62 6c 65 73  r join of tables
36e10 20 74 31 20 61 6e 64 20 74 32 20 69 73 20 63 6f   t1 and t2 is co
36e20 6e 63 65 70 74 61 6c 6c 79 20 63 6f 64 65 64 20  nceptally coded 
36e30 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
36e40 2a 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77  *    foreach row
36e50 31 20 69 6e 20 74 31 20 64 6f 0a 2a 2a 20 20 20  1 in t1 do.**   
36e60 20 20 20 66 6c 61 67 20 3d 20 30 0a 2a 2a 20 20     flag = 0.**  
36e70 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 32      foreach row2
36e80 20 69 6e 20 74 32 20 64 6f 0a 2a 2a 20 20 20 20   in t2 do.**    
36e90 20 20 20 20 73 74 61 72 74 3a 0a 2a 2a 20 20 20      start:.**   
36ea0 20 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20         ....**   
36eb0 20 20 20 20 20 20 20 66 6c 61 67 20 3d 20 31 0a         flag = 1.
36ec0 2a 2a 20 20 20 20 20 20 65 6e 64 0a 2a 2a 20 20  **      end.**  
36ed0 20 20 20 20 69 66 20 66 6c 61 67 3d 3d 30 20 74      if flag==0 t
36ee0 68 65 6e 0a 2a 2a 20 20 20 20 20 20 20 20 6d 6f  hen.**        mo
36ef0 76 65 20 74 68 65 20 72 6f 77 32 20 63 75 72 73  ve the row2 curs
36f00 6f 72 20 74 6f 20 61 20 6e 75 6c 6c 20 72 6f 77  or to a null row
36f10 0a 2a 2a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .**        goto 
36f20 73 74 61 72 74 0a 2a 2a 20 20 20 20 20 20 66 69  start.**      fi
36f30 0a 2a 2a 20 20 20 20 65 6e 64 0a 2a 2a 0a 2a 2a  .**    end.**.**
36f40 20 4f 52 44 45 52 20 42 59 20 43 4c 41 55 53 45   ORDER BY CLAUSE
36f50 20 50 52 4f 43 45 53 53 49 4e 47 0a 2a 2a 0a 2a   PROCESSING.**.*
36f60 2a 20 70 4f 72 64 65 72 42 79 20 69 73 20 61 20  * pOrderBy is a 
36f70 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 4f  pointer to the O
36f80 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 28  RDER BY clause (
36f90 6f 72 20 74 68 65 20 47 52 4f 55 50 20 42 59 20  or the GROUP BY 
36fa0 63 6c 61 75 73 65 0a 2a 2a 20 69 66 20 74 68 65  clause.** if the
36fb0 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20 66   WHERE_GROUPBY f
36fc0 6c 61 67 20 69 73 20 73 65 74 20 69 6e 20 77 63  lag is set in wc
36fd0 74 72 6c 46 6c 61 67 73 29 20 6f 66 20 61 20 53  trlFlags) of a S
36fe0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a  ELECT statement.
36ff0 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73 20 6f  ** if there is o
37000 6e 65 2e 20 20 49 66 20 74 68 65 72 65 20 69 73  ne.  If there is
37010 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 63 6c 61   no ORDER BY cla
37020 75 73 65 20 6f 72 20 69 66 20 74 68 69 73 20 72  use or if this r
37030 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c  outine.** is cal
37040 6c 65 64 20 66 72 6f 6d 20 61 6e 20 55 50 44 41  led from an UPDA
37050 54 45 20 6f 72 20 44 45 4c 45 54 45 20 73 74 61  TE or DELETE sta
37060 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20 70 4f 72  tement, then pOr
37070 64 65 72 42 79 20 69 73 20 4e 55 4c 4c 2e 0a 2a  derBy is NULL..*
37080 2a 0a 2a 2a 20 54 68 65 20 69 49 64 78 43 75 72  *.** The iIdxCur
37090 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68   parameter is th
370a0 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  e cursor number 
370b0 6f 66 20 61 6e 20 69 6e 64 65 78 2e 20 20 49 66  of an index.  If
370c0 20 0a 2a 2a 20 57 48 45 52 45 5f 4f 4e 45 54 41   .** WHERE_ONETA
370d0 42 4c 45 5f 4f 4e 4c 59 20 69 73 20 73 65 74 2c  BLE_ONLY is set,
370e0 20 69 49 64 78 43 75 72 20 69 73 20 74 68 65 20   iIdxCur is the 
370f0 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66  cursor number of
37100 20 61 6e 20 69 6e 64 65 78 0a 2a 2a 20 74 6f 20   an index.** to 
37110 75 73 65 20 66 6f 72 20 4f 52 20 63 6c 61 75 73  use for OR claus
37120 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 54  e processing.  T
37130 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
37140 73 68 6f 75 6c 64 20 75 73 65 20 74 68 69 73 0a  should use this.
37150 2a 2a 20 73 70 65 63 69 66 69 63 20 63 75 72 73  ** specific curs
37160 6f 72 2e 20 20 49 66 20 57 48 45 52 45 5f 4f 4e  or.  If WHERE_ON
37170 45 50 41 53 53 5f 44 45 53 49 52 45 44 20 69 73  EPASS_DESIRED is
37180 20 73 65 74 2c 20 74 68 65 6e 20 69 49 64 78 43   set, then iIdxC
37190 75 72 20 69 73 0a 2a 2a 20 74 68 65 20 66 69 72  ur is.** the fir
371a0 73 74 20 63 75 72 73 6f 72 20 69 6e 20 61 6e 20  st cursor in an 
371b0 61 72 72 61 79 20 6f 66 20 63 75 72 73 6f 72 73  array of cursors
371c0 20 66 6f 72 20 61 6c 6c 20 69 6e 64 69 63 65 73   for all indices
371d0 2e 20 20 69 49 64 78 43 75 72 20 73 68 6f 75 6c  .  iIdxCur shoul
371e0 64 0a 2a 2a 20 62 65 20 75 73 65 64 20 74 6f 20  d.** be used to 
371f0 63 6f 6d 70 75 74 65 20 74 68 65 20 61 70 70 72  compute the appr
37200 6f 70 72 69 61 74 65 20 63 75 72 73 6f 72 20 64  opriate cursor d
37210 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 69 63  epending on whic
37220 68 20 69 6e 64 65 78 20 69 73 0a 2a 2a 20 75 73  h index is.** us
37230 65 64 2e 0a 2a 2f 0a 57 68 65 72 65 49 6e 66 6f  ed..*/.WhereInfo
37240 20 2a 73 71 6c 69 74 65 33 57 68 65 72 65 42 65   *sqlite3WhereBe
37250 67 69 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50  gin(.  Parse *pP
37260 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  arse,        /* 
37270 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65  The parser conte
37280 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  xt */.  SrcList 
37290 2a 70 54 61 62 4c 69 73 74 2c 20 20 20 20 2f 2a  *pTabList,    /*
372a0 20 46 52 4f 4d 20 63 6c 61 75 73 65 3a 20 41 20   FROM clause: A 
372b0 6c 69 73 74 20 6f 66 20 61 6c 6c 20 74 61 62 6c  list of all tabl
372c0 65 73 20 74 6f 20 62 65 20 73 63 61 6e 6e 65 64  es to be scanned
372d0 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65   */.  Expr *pWhe
372e0 72 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54  re,         /* T
372f0 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
37300 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
37310 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a 20 41 6e  OrderBy,   /* An
37320 20 4f 52 44 45 52 20 42 59 20 28 6f 72 20 47 52   ORDER BY (or GR
37330 4f 55 50 20 42 59 29 20 63 6c 61 75 73 65 2c 20  OUP BY) clause, 
37340 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70  or NULL */.  Exp
37350 72 4c 69 73 74 20 2a 70 52 65 73 75 6c 74 53 65  rList *pResultSe
37360 74 2c 20 2f 2a 20 52 65 73 75 6c 74 20 73 65 74  t, /* Result set
37370 20 6f 66 20 74 68 65 20 71 75 65 72 79 20 2a 2f   of the query */
37380 0a 20 20 75 31 36 20 77 63 74 72 6c 46 6c 61 67  .  u16 wctrlFlag
37390 73 2c 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20  s,       /* One 
373a0 6f 66 20 74 68 65 20 57 48 45 52 45 5f 2a 20 66  of the WHERE_* f
373b0 6c 61 67 73 20 64 65 66 69 6e 65 64 20 69 6e 20  lags defined in 
373c0 73 71 6c 69 74 65 49 6e 74 2e 68 20 2a 2f 0a 20  sqliteInt.h */. 
373d0 20 69 6e 74 20 69 49 64 78 43 75 72 20 20 20 20   int iIdxCur    
373e0 20 20 20 20 20 20 20 2f 2a 20 49 66 20 57 48 45         /* If WHE
373f0 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59  RE_ONETABLE_ONLY
37400 20 69 73 20 73 65 74 2c 20 69 6e 64 65 78 20 63   is set, index c
37410 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 2a 2f 0a  ursor number */.
37420 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 57 49  ){.  int nByteWI
37430 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20  nfo;            
37440 2f 2a 20 4e 75 6d 2e 20 62 79 74 65 73 20 61 6c  /* Num. bytes al
37450 6c 6f 63 61 74 65 64 20 66 6f 72 20 57 68 65 72  located for Wher
37460 65 49 6e 66 6f 20 73 74 72 75 63 74 20 2a 2f 0a  eInfo struct */.
37470 20 20 69 6e 74 20 6e 54 61 62 4c 69 73 74 3b 20    int nTabList; 
37480 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
37490 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e  Number of elemen
374a0 74 73 20 69 6e 20 70 54 61 62 4c 69 73 74 20 2a  ts in pTabList *
374b0 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  /.  WhereInfo *p
374c0 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 2f  WInfo;         /
374d0 2a 20 57 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68  * Will become th
374e0 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f  e return value o
374f0 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  f this function 
37500 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  */.  Vdbe *v = p
37510 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20  Parse->pVdbe;   
37520 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20 64  /* The virtual d
37530 61 74 61 62 61 73 65 20 65 6e 67 69 6e 65 20 2a  atabase engine *
37540 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52  /.  Bitmask notR
37550 65 61 64 79 3b 20 20 20 20 20 20 20 20 20 20 2f  eady;          /
37560 2a 20 43 75 72 73 6f 72 73 20 74 68 61 74 20 61  * Cursors that a
37570 72 65 20 6e 6f 74 20 79 65 74 20 70 6f 73 69 74  re not yet posit
37580 69 6f 6e 65 64 20 2a 2f 0a 20 20 57 68 65 72 65  ioned */.  Where
37590 4c 6f 6f 70 42 75 69 6c 64 65 72 20 73 57 4c 42  LoopBuilder sWLB
375a0 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 57 68 65  ;     /* The Whe
375b0 72 65 4c 6f 6f 70 20 62 75 69 6c 64 65 72 20 2a  reLoop builder *
375c0 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b 53 65 74  /.  WhereMaskSet
375d0 20 2a 70 4d 61 73 6b 53 65 74 3b 20 20 20 20 2f   *pMaskSet;    /
375e0 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * The expression
375f0 20 6d 61 73 6b 20 73 65 74 20 2a 2f 0a 20 20 57   mask set */.  W
37600 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65  hereLevel *pLeve
37610 6c 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73  l;        /* A s
37620 69 6e 67 6c 65 20 6c 65 76 65 6c 20 69 6e 20 70  ingle level in p
37630 57 49 6e 66 6f 2d 3e 61 5b 5d 20 2a 2f 0a 20 20  WInfo->a[] */.  
37640 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70  WhereLoop *pLoop
37650 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f  ;          /* Po
37660 69 6e 74 65 72 20 74 6f 20 61 20 73 69 6e 67 6c  inter to a singl
37670 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65  e WhereLoop obje
37680 63 74 20 2a 2f 0a 20 20 69 6e 74 20 69 69 3b 20  ct */.  int ii; 
37690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
376a0 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
376b0 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  er */.  sqlite3 
376c0 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  *db;            
376d0 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63     /* Database c
376e0 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69  onnection */.  i
376f0 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
37700 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
37710 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 0a 20 20  urn code */...  
37720 2f 2a 20 56 61 72 69 61 62 6c 65 20 69 6e 69 74  /* Variable init
37730 69 61 6c 69 7a 61 74 69 6f 6e 20 2a 2f 0a 20 20  ialization */.  
37740 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
37750 0a 20 20 6d 65 6d 73 65 74 28 26 73 57 4c 42 2c  .  memset(&sWLB,
37760 20 30 2c 20 73 69 7a 65 6f 66 28 73 57 4c 42 29   0, sizeof(sWLB)
37770 29 3b 0a 0a 20 20 2f 2a 20 41 6e 20 4f 52 44 45  );..  /* An ORDE
37780 52 2f 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  R/GROUP BY claus
37790 65 20 6f 66 20 6d 6f 72 65 20 74 68 61 6e 20 36  e of more than 6
377a0 33 20 74 65 72 6d 73 20 63 61 6e 6e 6f 74 20 62  3 terms cannot b
377b0 65 20 6f 70 74 69 6d 69 7a 65 64 20 2a 2f 0a 20  e optimized */. 
377c0 20 74 65 73 74 63 61 73 65 28 20 70 4f 72 64 65   testcase( pOrde
377d0 72 42 79 20 26 26 20 70 4f 72 64 65 72 42 79 2d  rBy && pOrderBy-
377e0 3e 6e 45 78 70 72 3d 3d 42 4d 53 2d 31 20 29 3b  >nExpr==BMS-1 );
377f0 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20  .  if( pOrderBy 
37800 26 26 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  && pOrderBy->nEx
37810 70 72 3e 3d 42 4d 53 20 29 20 70 4f 72 64 65 72  pr>=BMS ) pOrder
37820 42 79 20 3d 20 30 3b 0a 20 20 73 57 4c 42 2e 70  By = 0;.  sWLB.p
37830 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72  OrderBy = pOrder
37840 42 79 3b 0a 0a 20 20 2f 2a 20 44 69 73 61 62 6c  By;..  /* Disabl
37850 65 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6f  e the DISTINCT o
37860 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 66 20 53  ptimization if S
37870 51 4c 49 54 45 5f 44 69 73 74 69 6e 63 74 4f 70  QLITE_DistinctOp
37880 74 20 69 73 20 73 65 74 20 76 69 61 0a 20 20 2a  t is set via.  *
37890 2a 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63  * sqlite3_test_c
378a0 74 72 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  trl(SQLITE_TESTC
378b0 54 52 4c 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e  TRL_OPTIMIZATION
378c0 53 2c 2e 2e 2e 29 20 2a 2f 0a 20 20 69 66 28 20  S,...) */.  if( 
378d0 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 44 69 73 61  OptimizationDisa
378e0 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f  bled(db, SQLITE_
378f0 44 69 73 74 69 6e 63 74 4f 70 74 29 20 29 7b 0a  DistinctOpt) ){.
37900 20 20 20 20 77 63 74 72 6c 46 6c 61 67 73 20 26      wctrlFlags &
37910 3d 20 7e 57 48 45 52 45 5f 57 41 4e 54 5f 44 49  = ~WHERE_WANT_DI
37920 53 54 49 4e 43 54 3b 0a 20 20 7d 0a 0a 20 20 2f  STINCT;.  }..  /
37930 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * The number of 
37940 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52  tables in the FR
37950 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 6c 69 6d  OM clause is lim
37960 69 74 65 64 20 62 79 20 74 68 65 20 6e 75 6d 62  ited by the numb
37970 65 72 20 6f 66 0a 20 20 2a 2a 20 62 69 74 73 20  er of.  ** bits 
37980 69 6e 20 61 20 42 69 74 6d 61 73 6b 20 0a 20 20  in a Bitmask .  
37990 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  */.  testcase( p
379a0 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3d 3d 42  TabList->nSrc==B
379b0 4d 53 20 29 3b 0a 20 20 69 66 28 20 70 54 61 62  MS );.  if( pTab
379c0 4c 69 73 74 2d 3e 6e 53 72 63 3e 42 4d 53 20 29  List->nSrc>BMS )
379d0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
379e0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61  orMsg(pParse, "a
379f0 74 20 6d 6f 73 74 20 25 64 20 74 61 62 6c 65 73  t most %d tables
37a00 20 69 6e 20 61 20 6a 6f 69 6e 22 2c 20 42 4d 53   in a join", BMS
37a10 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
37a20 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 69 73 20  .  }..  /* This 
37a30 66 75 6e 63 74 69 6f 6e 20 6e 6f 72 6d 61 6c 6c  function normall
37a40 79 20 67 65 6e 65 72 61 74 65 73 20 61 20 6e 65  y generates a ne
37a50 73 74 65 64 20 6c 6f 6f 70 20 66 6f 72 20 61 6c  sted loop for al
37a60 6c 20 74 61 62 6c 65 73 20 69 6e 20 0a 20 20 2a  l tables in .  *
37a70 2a 20 70 54 61 62 4c 69 73 74 2e 20 20 42 75 74  * pTabList.  But
37a80 20 69 66 20 74 68 65 20 57 48 45 52 45 5f 4f 4e   if the WHERE_ON
37a90 45 54 41 42 4c 45 5f 4f 4e 4c 59 20 66 6c 61 67  ETABLE_ONLY flag
37aa0 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 77 65   is set, then we
37ab0 20 73 68 6f 75 6c 64 0a 20 20 2a 2a 20 6f 6e 6c   should.  ** onl
37ac0 79 20 67 65 6e 65 72 61 74 65 20 63 6f 64 65 20  y generate code 
37ad0 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 74 61  for the first ta
37ae0 62 6c 65 20 69 6e 20 70 54 61 62 4c 69 73 74 20  ble in pTabList 
37af0 61 6e 64 20 61 73 73 75 6d 65 20 74 68 61 74 0a  and assume that.
37b00 20 20 2a 2a 20 61 6e 79 20 63 75 72 73 6f 72 73    ** any cursors
37b10 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
37b20 20 73 75 62 73 65 71 75 65 6e 74 20 74 61 62 6c   subsequent tabl
37b30 65 73 20 61 72 65 20 75 6e 69 6e 69 74 69 61 6c  es are uninitial
37b40 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 6e 54 61  ized..  */.  nTa
37b50 62 4c 69 73 74 20 3d 20 28 77 63 74 72 6c 46 6c  bList = (wctrlFl
37b60 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 54  ags & WHERE_ONET
37b70 41 42 4c 45 5f 4f 4e 4c 59 29 20 3f 20 31 20 3a  ABLE_ONLY) ? 1 :
37b80 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b   pTabList->nSrc;
37b90 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
37ba0 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 74  and initialize t
37bb0 68 65 20 57 68 65 72 65 49 6e 66 6f 20 73 74 72  he WhereInfo str
37bc0 75 63 74 75 72 65 20 74 68 61 74 20 77 69 6c 6c  ucture that will
37bd0 20 62 65 63 6f 6d 65 20 74 68 65 0a 20 20 2a 2a   become the.  **
37be0 20 72 65 74 75 72 6e 20 76 61 6c 75 65 2e 20 41   return value. A
37bf0 20 73 69 6e 67 6c 65 20 61 6c 6c 6f 63 61 74 69   single allocati
37c00 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 73 74  on is used to st
37c10 6f 72 65 20 74 68 65 20 57 68 65 72 65 49 6e 66  ore the WhereInf
37c20 6f 0a 20 20 2a 2a 20 73 74 72 75 63 74 2c 20 74  o.  ** struct, t
37c30 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 57  he contents of W
37c40 68 65 72 65 49 6e 66 6f 2e 61 5b 5d 2c 20 74 68  hereInfo.a[], th
37c50 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 73 74  e WhereClause st
37c60 72 75 63 74 75 72 65 0a 20 20 2a 2a 20 61 6e 64  ructure.  ** and
37c70 20 74 68 65 20 57 68 65 72 65 4d 61 73 6b 53 65   the WhereMaskSe
37c80 74 20 73 74 72 75 63 74 75 72 65 2e 20 53 69 6e  t structure. Sin
37c90 63 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 63  ce WhereClause c
37ca0 6f 6e 74 61 69 6e 73 20 61 6e 20 38 2d 62 79 74  ontains an 8-byt
37cb0 65 0a 20 20 2a 2a 20 66 69 65 6c 64 20 28 74 79  e.  ** field (ty
37cc0 70 65 20 42 69 74 6d 61 73 6b 29 20 69 74 20 6d  pe Bitmask) it m
37cd0 75 73 74 20 62 65 20 61 6c 69 67 6e 65 64 20 6f  ust be aligned o
37ce0 6e 20 61 6e 20 38 2d 62 79 74 65 20 62 6f 75 6e  n an 8-byte boun
37cf0 64 61 72 79 20 6f 6e 0a 20 20 2a 2a 20 73 6f 6d  dary on.  ** som
37d00 65 20 61 72 63 68 69 74 65 63 74 75 72 65 73 2e  e architectures.
37d10 20 48 65 6e 63 65 20 74 68 65 20 52 4f 55 4e 44   Hence the ROUND
37d20 38 28 29 20 62 65 6c 6f 77 2e 0a 20 20 2a 2f 0a  8() below..  */.
37d30 20 20 6e 42 79 74 65 57 49 6e 66 6f 20 3d 20 52    nByteWInfo = R
37d40 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 57 68 65  OUND8(sizeof(Whe
37d50 72 65 49 6e 66 6f 29 2b 28 6e 54 61 62 4c 69 73  reInfo)+(nTabLis
37d60 74 2d 31 29 2a 73 69 7a 65 6f 66 28 57 68 65 72  t-1)*sizeof(Wher
37d70 65 4c 65 76 65 6c 29 29 3b 0a 20 20 70 57 49 6e  eLevel));.  pWIn
37d80 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  fo = sqlite3DbMa
37d90 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79  llocZero(db, nBy
37da0 74 65 57 49 6e 66 6f 20 2b 20 73 69 7a 65 6f 66  teWInfo + sizeof
37db0 28 57 68 65 72 65 4c 6f 6f 70 29 29 3b 0a 20 20  (WhereLoop));.  
37dc0 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
37dd0 69 6c 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69  iled ){.    sqli
37de0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 57  te3DbFree(db, pW
37df0 49 6e 66 6f 29 3b 0a 20 20 20 20 70 57 49 6e 66  Info);.    pWInf
37e00 6f 20 3d 20 30 3b 0a 20 20 20 20 67 6f 74 6f 20  o = 0;.    goto 
37e10 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b  whereBeginError;
37e20 0a 20 20 7d 0a 20 20 70 57 49 6e 66 6f 2d 3e 61  .  }.  pWInfo->a
37e30 69 43 75 72 4f 6e 65 50 61 73 73 5b 30 5d 20 3d  iCurOnePass[0] =
37e40 20 70 57 49 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e   pWInfo->aiCurOn
37e50 65 50 61 73 73 5b 31 5d 20 3d 20 2d 31 3b 0a 20  ePass[1] = -1;. 
37e60 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 20   pWInfo->nLevel 
37e70 3d 20 6e 54 61 62 4c 69 73 74 3b 0a 20 20 70 57  = nTabList;.  pW
37e80 49 6e 66 6f 2d 3e 70 50 61 72 73 65 20 3d 20 70  Info->pParse = p
37e90 50 61 72 73 65 3b 0a 20 20 70 57 49 6e 66 6f 2d  Parse;.  pWInfo-
37ea0 3e 70 54 61 62 4c 69 73 74 20 3d 20 70 54 61 62  >pTabList = pTab
37eb0 4c 69 73 74 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e  List;.  pWInfo->
37ec0 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65  pOrderBy = pOrde
37ed0 72 42 79 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70  rBy;.  pWInfo->p
37ee0 52 65 73 75 6c 74 53 65 74 20 3d 20 70 52 65 73  ResultSet = pRes
37ef0 75 6c 74 53 65 74 3b 0a 20 20 70 57 49 6e 66 6f  ultSet;.  pWInfo
37f00 2d 3e 69 42 72 65 61 6b 20 3d 20 70 57 49 6e 66  ->iBreak = pWInf
37f10 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 20 3d 20 73  o->iContinue = s
37f20 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
37f30 62 65 6c 28 76 29 3b 0a 20 20 70 57 49 6e 66 6f  bel(v);.  pWInfo
37f40 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 3d 20 77  ->wctrlFlags = w
37f50 63 74 72 6c 46 6c 61 67 73 3b 0a 20 20 70 57 49  ctrlFlags;.  pWI
37f60 6e 66 6f 2d 3e 73 61 76 65 64 4e 51 75 65 72 79  nfo->savedNQuery
37f70 4c 6f 6f 70 20 3d 20 70 50 61 72 73 65 2d 3e 6e  Loop = pParse->n
37f80 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 70 4d 61  QueryLoop;.  pMa
37f90 73 6b 53 65 74 20 3d 20 26 70 57 49 6e 66 6f 2d  skSet = &pWInfo-
37fa0 3e 73 4d 61 73 6b 53 65 74 3b 0a 20 20 73 57 4c  >sMaskSet;.  sWL
37fb0 42 2e 70 57 49 6e 66 6f 20 3d 20 70 57 49 6e 66  B.pWInfo = pWInf
37fc0 6f 3b 0a 20 20 73 57 4c 42 2e 70 57 43 20 3d 20  o;.  sWLB.pWC = 
37fd0 26 70 57 49 6e 66 6f 2d 3e 73 57 43 3b 0a 20 20  &pWInfo->sWC;.  
37fe0 73 57 4c 42 2e 70 4e 65 77 20 3d 20 28 57 68 65  sWLB.pNew = (Whe
37ff0 72 65 4c 6f 6f 70 2a 29 28 28 28 63 68 61 72 2a  reLoop*)(((char*
38000 29 70 57 49 6e 66 6f 29 2b 6e 42 79 74 65 57 49  )pWInfo)+nByteWI
38010 6e 66 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20  nfo);.  assert( 
38020 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e  EIGHT_BYTE_ALIGN
38030 4d 45 4e 54 28 73 57 4c 42 2e 70 4e 65 77 29 20  MENT(sWLB.pNew) 
38040 29 3b 0a 20 20 77 68 65 72 65 4c 6f 6f 70 49 6e  );.  whereLoopIn
38050 69 74 28 73 57 4c 42 2e 70 4e 65 77 29 3b 0a 23  it(sWLB.pNew);.#
38060 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
38070 55 47 0a 20 20 73 57 4c 42 2e 70 4e 65 77 2d 3e  UG.  sWLB.pNew->
38080 63 49 64 20 3d 20 27 2a 27 3b 0a 23 65 6e 64 69  cId = '*';.#endi
38090 66 0a 0a 20 20 2f 2a 20 53 70 6c 69 74 20 74 68  f..  /* Split th
380a0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69  e WHERE clause i
380b0 6e 74 6f 20 73 65 70 61 72 61 74 65 20 73 75 62  nto separate sub
380c0 65 78 70 72 65 73 73 69 6f 6e 73 20 77 68 65 72  expressions wher
380d0 65 20 65 61 63 68 0a 20 20 2a 2a 20 73 75 62 65  e each.  ** sube
380e0 78 70 72 65 73 73 69 6f 6e 20 69 73 20 73 65 70  xpression is sep
380f0 61 72 61 74 65 64 20 62 79 20 61 6e 20 41 4e 44  arated by an AND
38100 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 2a 2f 0a   operator..  */.
38110 20 20 69 6e 69 74 4d 61 73 6b 53 65 74 28 70 4d    initMaskSet(pM
38120 61 73 6b 53 65 74 29 3b 0a 20 20 77 68 65 72 65  askSet);.  where
38130 43 6c 61 75 73 65 49 6e 69 74 28 26 70 57 49 6e  ClauseInit(&pWIn
38140 66 6f 2d 3e 73 57 43 2c 20 70 57 49 6e 66 6f 29  fo->sWC, pWInfo)
38150 3b 0a 20 20 77 68 65 72 65