/ Hex Artifact Content
Login

Artifact d46de821bc604a4fd36fa3928c086950e91aafb1:


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 20 20 6d 65 6d 73 65 74 28 26 70  );.    memset(&p
1bc0: 57 43 2d 3e 61 5b 70 57 43 2d 3e 6e 54 65 72 6d  WC->a[pWC->nTerm
1bd0: 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 57 43  ], 0, sizeof(pWC
1be0: 2d 3e 61 5b 30 5d 29 2a 28 70 57 43 2d 3e 6e 53  ->a[0])*(pWC->nS
1bf0: 6c 6f 74 2d 70 57 43 2d 3e 6e 54 65 72 6d 29 29  lot-pWC->nTerm))
1c00: 3b 0a 20 20 7d 0a 20 20 70 54 65 72 6d 20 3d 20  ;.  }.  pTerm = 
1c10: 26 70 57 43 2d 3e 61 5b 69 64 78 20 3d 20 70 57  &pWC->a[idx = pW
1c20: 43 2d 3e 6e 54 65 72 6d 2b 2b 5d 3b 0a 20 20 69  C->nTerm++];.  i
1c30: 66 28 20 70 20 26 26 20 45 78 70 72 48 61 73 50  f( p && ExprHasP
1c40: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 55 6e  roperty(p, EP_Un
1c50: 6c 69 6b 65 6c 79 29 20 29 7b 0a 20 20 20 20 70  likely) ){.    p
1c60: 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 20  Term->truthProb 
1c70: 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  = sqlite3LogEst(
1c80: 70 2d 3e 69 54 61 62 6c 65 29 20 2d 20 32 37 30  p->iTable) - 270
1c90: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
1ca0: 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 20  Term->truthProb 
1cb0: 3d 20 31 3b 0a 20 20 7d 0a 20 20 70 54 65 72 6d  = 1;.  }.  pTerm
1cc0: 2d 3e 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65  ->pExpr = sqlite
1cd0: 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65  3ExprSkipCollate
1ce0: 28 70 29 3b 0a 20 20 70 54 65 72 6d 2d 3e 77 74  (p);.  pTerm->wt
1cf0: 46 6c 61 67 73 20 3d 20 77 74 46 6c 61 67 73 3b  Flags = wtFlags;
1d00: 0a 20 20 70 54 65 72 6d 2d 3e 70 57 43 20 3d 20  .  pTerm->pWC = 
1d10: 70 57 43 3b 0a 20 20 70 54 65 72 6d 2d 3e 69 50  pWC;.  pTerm->iP
1d20: 61 72 65 6e 74 20 3d 20 2d 31 3b 0a 20 20 72 65  arent = -1;.  re
1d30: 74 75 72 6e 20 69 64 78 3b 0a 7d 0a 0a 2f 2a 0a  turn idx;.}../*.
1d40: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1d50: 69 64 65 6e 74 69 66 69 65 73 20 73 75 62 65 78  identifies subex
1d60: 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65  pressions in the
1d70: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 77 68   WHERE clause wh
1d80: 65 72 65 0a 2a 2a 20 65 61 63 68 20 73 75 62 65  ere.** each sube
1d90: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 73 65 70  xpression is sep
1da0: 61 72 61 74 65 64 20 62 79 20 74 68 65 20 41 4e  arated by the AN
1db0: 44 20 6f 70 65 72 61 74 6f 72 20 6f 72 20 73 6f  D operator or so
1dc0: 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 6f 70 65 72  me other.** oper
1dd0: 61 74 6f 72 20 73 70 65 63 69 66 69 65 64 20 69  ator specified i
1de0: 6e 20 74 68 65 20 6f 70 20 70 61 72 61 6d 65 74  n the op paramet
1df0: 65 72 2e 20 20 54 68 65 20 57 68 65 72 65 43 6c  er.  The WhereCl
1e00: 61 75 73 65 20 73 74 72 75 63 74 75 72 65 0a 2a  ause structure.*
1e10: 2a 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68  * is filled with
1e20: 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 73 75 62   pointers to sub
1e30: 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 20 46 6f  expressions.  Fo
1e40: 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a  r example:.**.**
1e50: 20 20 20 20 57 48 45 52 45 20 20 61 3d 3d 27 68      WHERE  a=='h
1e60: 65 6c 6c 6f 27 20 41 4e 44 20 63 6f 61 6c 65 73  ello' AND coales
1e70: 63 65 28 62 2c 31 31 29 3c 31 30 20 41 4e 44 20  ce(b,11)<10 AND 
1e80: 28 63 2b 31 32 21 3d 64 20 4f 52 20 63 3d 3d 32  (c+12!=d OR c==2
1e90: 32 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  2).**           
1ea0: 5c 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 5c  \________/     \
1eb0: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f  _______________/
1ec0: 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f       \__________
1ed0: 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 20 20 20 20 20 20  ______/.**      
1ee0: 20 20 20 20 20 20 73 6c 6f 74 5b 30 5d 20 20 20        slot[0]   
1ef0: 20 20 20 20 20 20 20 20 20 73 6c 6f 74 5b 31 5d           slot[1]
1f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
1f10: 6c 6f 74 5b 32 5d 0a 2a 2a 0a 2a 2a 20 54 68 65  lot[2].**.** The
1f20: 20 6f 72 69 67 69 6e 61 6c 20 57 48 45 52 45 20   original WHERE 
1f30: 63 6c 61 75 73 65 20 69 6e 20 70 45 78 70 72 20  clause in pExpr 
1f40: 69 73 20 75 6e 61 6c 74 65 72 65 64 2e 20 20 41  is unaltered.  A
1f50: 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  ll this routine.
1f60: 2a 2a 20 64 6f 65 73 20 69 73 20 6d 61 6b 65 20  ** does is make 
1f70: 73 6c 6f 74 5b 5d 20 65 6e 74 72 69 65 73 20 70  slot[] entries p
1f80: 6f 69 6e 74 20 74 6f 20 73 75 62 73 74 72 75 63  oint to substruc
1f90: 74 75 72 65 20 77 69 74 68 69 6e 20 70 45 78 70  ture within pExp
1fa0: 72 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20  r..**.** In the 
1fb0: 70 72 65 76 69 6f 75 73 20 73 65 6e 74 65 6e 63  previous sentenc
1fc0: 65 20 61 6e 64 20 69 6e 20 74 68 65 20 64 69 61  e and in the dia
1fd0: 67 72 61 6d 2c 20 22 73 6c 6f 74 5b 5d 22 20 72  gram, "slot[]" r
1fe0: 65 66 65 72 73 20 74 6f 0a 2a 2a 20 74 68 65 20  efers to.** the 
1ff0: 57 68 65 72 65 43 6c 61 75 73 65 2e 61 5b 5d 20  WhereClause.a[] 
2000: 61 72 72 61 79 2e 20 20 54 68 65 20 73 6c 6f 74  array.  The slot
2010: 5b 5d 20 61 72 72 61 79 20 67 72 6f 77 73 20 61  [] array grows a
2020: 73 20 6e 65 65 64 65 64 20 74 6f 20 63 6f 6e 74  s needed to cont
2030: 61 69 6e 0a 2a 2a 20 61 6c 6c 20 74 65 72 6d 73  ain.** all terms
2040: 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
2050: 61 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ause..*/.static 
2060: 76 6f 69 64 20 77 68 65 72 65 53 70 6c 69 74 28  void whereSplit(
2070: 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
2080: 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 75  , Expr *pExpr, u
2090: 38 20 6f 70 29 7b 0a 20 20 70 57 43 2d 3e 6f 70  8 op){.  pWC->op
20a0: 20 3d 20 6f 70 3b 0a 20 20 69 66 28 20 70 45 78   = op;.  if( pEx
20b0: 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  pr==0 ) return;.
20c0: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21    if( pExpr->op!
20d0: 3d 6f 70 20 29 7b 0a 20 20 20 20 77 68 65 72 65  =op ){.    where
20e0: 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57 43  ClauseInsert(pWC
20f0: 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 7d  , pExpr, 0);.  }
2100: 65 6c 73 65 7b 0a 20 20 20 20 77 68 65 72 65 53  else{.    whereS
2110: 70 6c 69 74 28 70 57 43 2c 20 70 45 78 70 72 2d  plit(pWC, pExpr-
2120: 3e 70 4c 65 66 74 2c 20 6f 70 29 3b 0a 20 20 20  >pLeft, op);.   
2130: 20 77 68 65 72 65 53 70 6c 69 74 28 70 57 43 2c   whereSplit(pWC,
2140: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
2150: 6f 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  op);.  }.}../*.*
2160: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 20 57  * Initialize a W
2170: 68 65 72 65 4d 61 73 6b 53 65 74 20 6f 62 6a 65  hereMaskSet obje
2180: 63 74 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 69 6e  ct.*/.#define in
2190: 69 74 4d 61 73 6b 53 65 74 28 50 29 20 20 28 50  itMaskSet(P)  (P
21a0: 29 2d 3e 6e 3d 30 0a 0a 2f 2a 0a 2a 2a 20 52 65  )->n=0../*.** Re
21b0: 74 75 72 6e 20 74 68 65 20 62 69 74 6d 61 73 6b  turn the bitmask
21c0: 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 63   for the given c
21d0: 75 72 73 6f 72 20 6e 75 6d 62 65 72 2e 20 20 52  ursor number.  R
21e0: 65 74 75 72 6e 20 30 20 69 66 0a 2a 2a 20 69 43  eturn 0 if.** iC
21f0: 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 69 6e 20  ursor is not in 
2200: 74 68 65 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74  the set..*/.stat
2210: 69 63 20 42 69 74 6d 61 73 6b 20 67 65 74 4d 61  ic Bitmask getMa
2220: 73 6b 28 57 68 65 72 65 4d 61 73 6b 53 65 74 20  sk(WhereMaskSet 
2230: 2a 70 4d 61 73 6b 53 65 74 2c 20 69 6e 74 20 69  *pMaskSet, int i
2240: 43 75 72 73 6f 72 29 7b 0a 20 20 69 6e 74 20 69  Cursor){.  int i
2250: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4d 61 73  ;.  assert( pMas
2260: 6b 53 65 74 2d 3e 6e 3c 3d 28 69 6e 74 29 73 69  kSet->n<=(int)si
2270: 7a 65 6f 66 28 42 69 74 6d 61 73 6b 29 2a 38 20  zeof(Bitmask)*8 
2280: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
2290: 70 4d 61 73 6b 53 65 74 2d 3e 6e 3b 20 69 2b 2b  pMaskSet->n; i++
22a0: 29 7b 0a 20 20 20 20 69 66 28 20 70 4d 61 73 6b  ){.    if( pMask
22b0: 53 65 74 2d 3e 69 78 5b 69 5d 3d 3d 69 43 75 72  Set->ix[i]==iCur
22c0: 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 72 65 74  sor ){.      ret
22d0: 75 72 6e 20 4d 41 53 4b 42 49 54 28 69 29 3b 0a  urn MASKBIT(i);.
22e0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
22f0: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rn 0;.}../*.** C
2300: 72 65 61 74 65 20 61 20 6e 65 77 20 6d 61 73 6b  reate a new mask
2310: 20 66 6f 72 20 63 75 72 73 6f 72 20 69 43 75 72   for cursor iCur
2320: 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65  sor..**.** There
2330: 20 69 73 20 6f 6e 65 20 63 75 72 73 6f 72 20 70   is one cursor p
2340: 65 72 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20  er table in the 
2350: 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 54 68  FROM clause.  Th
2360: 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 74  e number of.** t
2370: 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f  ables in the FRO
2380: 4d 20 63 6c 61 75 73 65 20 69 73 20 6c 69 6d 69  M clause is limi
2390: 74 65 64 20 62 79 20 61 20 74 65 73 74 20 65 61  ted by a test ea
23a0: 72 6c 79 20 69 6e 20 74 68 65 0a 2a 2a 20 73 71  rly in the.** sq
23b0: 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
23c0: 29 20 72 6f 75 74 69 6e 65 2e 20 20 53 6f 20 77  ) routine.  So w
23d0: 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20  e know that the 
23e0: 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 5d 0a 2a  pMaskSet->ix[].*
23f0: 2a 20 61 72 72 61 79 20 77 69 6c 6c 20 6e 65 76  * array will nev
2400: 65 72 20 6f 76 65 72 66 6c 6f 77 2e 0a 2a 2f 0a  er overflow..*/.
2410: 73 74 61 74 69 63 20 76 6f 69 64 20 63 72 65 61  static void crea
2420: 74 65 4d 61 73 6b 28 57 68 65 72 65 4d 61 73 6b  teMask(WhereMask
2430: 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 69  Set *pMaskSet, i
2440: 6e 74 20 69 43 75 72 73 6f 72 29 7b 0a 20 20 61  nt iCursor){.  a
2450: 73 73 65 72 74 28 20 70 4d 61 73 6b 53 65 74 2d  ssert( pMaskSet-
2460: 3e 6e 20 3c 20 41 72 72 61 79 53 69 7a 65 28 70  >n < ArraySize(p
2470: 4d 61 73 6b 53 65 74 2d 3e 69 78 29 20 29 3b 0a  MaskSet->ix) );.
2480: 20 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 70    pMaskSet->ix[p
2490: 4d 61 73 6b 53 65 74 2d 3e 6e 2b 2b 5d 20 3d 20  MaskSet->n++] = 
24a0: 69 43 75 72 73 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a  iCursor;.}../*.*
24b0: 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73  * These routines
24c0: 20 77 61 6c 6b 20 28 72 65 63 75 72 73 69 76 65   walk (recursive
24d0: 6c 79 29 20 61 6e 20 65 78 70 72 65 73 73 69 6f  ly) an expressio
24e0: 6e 20 74 72 65 65 20 61 6e 64 20 67 65 6e 65 72  n tree and gener
24f0: 61 74 65 0a 2a 2a 20 61 20 62 69 74 6d 61 73 6b  ate.** a bitmask
2500: 20 69 6e 64 69 63 61 74 69 6e 67 20 77 68 69 63   indicating whic
2510: 68 20 74 61 62 6c 65 73 20 61 72 65 20 75 73 65  h tables are use
2520: 64 20 69 6e 20 74 68 61 74 20 65 78 70 72 65 73  d in that expres
2530: 73 69 6f 6e 0a 2a 2a 20 74 72 65 65 2e 0a 2a 2f  sion.** tree..*/
2540: 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20  .static Bitmask 
2550: 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61  exprListTableUsa
2560: 67 65 28 57 68 65 72 65 4d 61 73 6b 53 65 74 2a  ge(WhereMaskSet*
2570: 2c 20 45 78 70 72 4c 69 73 74 2a 29 3b 0a 73 74  , ExprList*);.st
2580: 61 74 69 63 20 42 69 74 6d 61 73 6b 20 65 78 70  atic Bitmask exp
2590: 72 53 65 6c 65 63 74 54 61 62 6c 65 55 73 61 67  rSelectTableUsag
25a0: 65 28 57 68 65 72 65 4d 61 73 6b 53 65 74 2a 2c  e(WhereMaskSet*,
25b0: 20 53 65 6c 65 63 74 2a 29 3b 0a 73 74 61 74 69   Select*);.stati
25c0: 63 20 42 69 74 6d 61 73 6b 20 65 78 70 72 54 61  c Bitmask exprTa
25d0: 62 6c 65 55 73 61 67 65 28 57 68 65 72 65 4d 61  bleUsage(WhereMa
25e0: 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c  skSet *pMaskSet,
25f0: 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 42 69 74   Expr *p){.  Bit
2600: 6d 61 73 6b 20 6d 61 73 6b 20 3d 20 30 3b 0a 20  mask mask = 0;. 
2610: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
2620: 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 6f  rn 0;.  if( p->o
2630: 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a  p==TK_COLUMN ){.
2640: 20 20 20 20 6d 61 73 6b 20 3d 20 67 65 74 4d 61      mask = getMa
2650: 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d 3e  sk(pMaskSet, p->
2660: 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 72 65 74  iTable);.    ret
2670: 75 72 6e 20 6d 61 73 6b 3b 0a 20 20 7d 0a 20 20  urn mask;.  }.  
2680: 6d 61 73 6b 20 3d 20 65 78 70 72 54 61 62 6c 65  mask = exprTable
2690: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
26a0: 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 6d 61  p->pRight);.  ma
26b0: 73 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c 65 55  sk |= exprTableU
26c0: 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70  sage(pMaskSet, p
26d0: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66 28 20  ->pLeft);.  if( 
26e0: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
26f0: 70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  p, EP_xIsSelect)
2700: 20 29 7b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20   ){.    mask |= 
2710: 65 78 70 72 53 65 6c 65 63 74 54 61 62 6c 65 55  exprSelectTableU
2720: 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70  sage(pMaskSet, p
2730: 2d 3e 78 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20  ->x.pSelect);.  
2740: 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 61 73 6b 20  }else{.    mask 
2750: 7c 3d 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65  |= exprListTable
2760: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
2770: 70 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 7d  p->x.pList);.  }
2780: 0a 20 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b 0a  .  return mask;.
2790: 7d 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b  }.static Bitmask
27a0: 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73   exprListTableUs
27b0: 61 67 65 28 57 68 65 72 65 4d 61 73 6b 53 65 74  age(WhereMaskSet
27c0: 20 2a 70 4d 61 73 6b 53 65 74 2c 20 45 78 70 72   *pMaskSet, Expr
27d0: 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20  List *pList){.  
27e0: 69 6e 74 20 69 3b 0a 20 20 42 69 74 6d 61 73 6b  int i;.  Bitmask
27f0: 20 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 69 66 28   mask = 0;.  if(
2800: 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 66 6f   pList ){.    fo
2810: 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
2820: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
2830: 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 54     mask |= exprT
2840: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
2850: 65 74 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  et, pList->a[i].
2860: 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20  pExpr);.    }.  
2870: 7d 0a 20 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b  }.  return mask;
2880: 0a 7d 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73  .}.static Bitmas
2890: 6b 20 65 78 70 72 53 65 6c 65 63 74 54 61 62 6c  k exprSelectTabl
28a0: 65 55 73 61 67 65 28 57 68 65 72 65 4d 61 73 6b  eUsage(WhereMask
28b0: 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 53  Set *pMaskSet, S
28c0: 65 6c 65 63 74 20 2a 70 53 29 7b 0a 20 20 42 69  elect *pS){.  Bi
28d0: 74 6d 61 73 6b 20 6d 61 73 6b 20 3d 20 30 3b 0a  tmask mask = 0;.
28e0: 20 20 77 68 69 6c 65 28 20 70 53 20 29 7b 0a 20    while( pS ){. 
28f0: 20 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63     SrcList *pSrc
2900: 20 3d 20 70 53 2d 3e 70 53 72 63 3b 0a 20 20 20   = pS->pSrc;.   
2910: 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69 73   mask |= exprLis
2920: 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  tTableUsage(pMas
2930: 6b 53 65 74 2c 20 70 53 2d 3e 70 45 4c 69 73 74  kSet, pS->pEList
2940: 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65  );.    mask |= e
2950: 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67  xprListTableUsag
2960: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e  e(pMaskSet, pS->
2970: 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 6d  pGroupBy);.    m
2980: 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69 73 74 54  ask |= exprListT
2990: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
29a0: 65 74 2c 20 70 53 2d 3e 70 4f 72 64 65 72 42 79  et, pS->pOrderBy
29b0: 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65  );.    mask |= e
29c0: 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d  xprTableUsage(pM
29d0: 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70 57 68 65  askSet, pS->pWhe
29e0: 72 65 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d  re);.    mask |=
29f0: 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28   exprTableUsage(
2a00: 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70 48  pMaskSet, pS->pH
2a10: 61 76 69 6e 67 29 3b 0a 20 20 20 20 69 66 28 20  aving);.    if( 
2a20: 41 4c 57 41 59 53 28 70 53 72 63 21 3d 30 29 20  ALWAYS(pSrc!=0) 
2a30: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  ){.      int i;.
2a40: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
2a50: 3c 70 53 72 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b  <pSrc->nSrc; i++
2a60: 29 7b 0a 20 20 20 20 20 20 20 20 6d 61 73 6b 20  ){.        mask 
2a70: 7c 3d 20 65 78 70 72 53 65 6c 65 63 74 54 61 62  |= exprSelectTab
2a80: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
2a90: 2c 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 53 65  , pSrc->a[i].pSe
2aa0: 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20 6d  lect);.        m
2ab0: 61 73 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c 65  ask |= exprTable
2ac0: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
2ad0: 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 4f 6e 29 3b  pSrc->a[i].pOn);
2ae0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2af0: 20 20 20 70 53 20 3d 20 70 53 2d 3e 70 50 72 69     pS = pS->pPri
2b00: 6f 72 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  or;.  }.  return
2b10: 20 6d 61 73 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   mask;.}../*.** 
2b20: 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
2b30: 68 65 20 67 69 76 65 6e 20 6f 70 65 72 61 74 6f  he given operato
2b40: 72 20 69 73 20 6f 6e 65 20 6f 66 20 74 68 65 20  r is one of the 
2b50: 6f 70 65 72 61 74 6f 72 73 20 74 68 61 74 20 69  operators that i
2b60: 73 0a 2a 2a 20 61 6c 6c 6f 77 65 64 20 66 6f 72  s.** allowed for
2b70: 20 61 6e 20 69 6e 64 65 78 61 62 6c 65 20 57 48   an indexable WH
2b80: 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 2e  ERE clause term.
2b90: 20 20 54 68 65 20 61 6c 6c 6f 77 65 64 20 6f 70    The allowed op
2ba0: 65 72 61 74 6f 72 73 20 61 72 65 0a 2a 2a 20 22  erators are.** "
2bb0: 3d 22 2c 20 22 3c 22 2c 20 22 3e 22 2c 20 22 3c  =", "<", ">", "<
2bc0: 3d 22 2c 20 22 3e 3d 22 2c 20 22 49 4e 22 2c 20  =", ">=", "IN", 
2bd0: 61 6e 64 20 22 49 53 20 4e 55 4c 4c 22 0a 2a 2f  and "IS NULL".*/
2be0: 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f  .static int allo
2bf0: 77 65 64 4f 70 28 69 6e 74 20 6f 70 29 7b 0a 20  wedOp(int op){. 
2c00: 20 61 73 73 65 72 74 28 20 54 4b 5f 47 54 3e 54   assert( TK_GT>T
2c10: 4b 5f 45 51 20 26 26 20 54 4b 5f 47 54 3c 54 4b  K_EQ && TK_GT<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 4c 54 3e 54 4b 5f 45 51 20 26 26 20   TK_LT>TK_EQ && 
2c40: 54 4b 5f 4c 54 3c 54 4b 5f 47 45 20 29 3b 0a 20  TK_LT<TK_GE );. 
2c50: 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 45 3e 54   assert( TK_LE>T
2c60: 4b 5f 45 51 20 26 26 20 54 4b 5f 4c 45 3c 54 4b  K_EQ && TK_LE<TK
2c70: 5f 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _GE );.  assert(
2c80: 20 54 4b 5f 47 45 3d 3d 54 4b 5f 45 51 2b 34 20   TK_GE==TK_EQ+4 
2c90: 29 3b 0a 20 20 72 65 74 75 72 6e 20 6f 70 3d 3d  );.  return op==
2ca0: 54 4b 5f 49 4e 20 7c 7c 20 28 6f 70 3e 3d 54 4b  TK_IN || (op>=TK
2cb0: 5f 45 51 20 26 26 20 6f 70 3c 3d 54 4b 5f 47 45  _EQ && op<=TK_GE
2cc0: 29 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55  ) || op==TK_ISNU
2cd0: 4c 4c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  LL;.}../*.** Com
2ce0: 6d 75 74 65 20 61 20 63 6f 6d 70 61 72 69 73 6f  mute a compariso
2cf0: 6e 20 6f 70 65 72 61 74 6f 72 2e 20 20 45 78 70  n operator.  Exp
2d00: 72 65 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 20  ressions of the 
2d10: 66 6f 72 6d 20 22 58 20 6f 70 20 59 22 0a 2a 2a  form "X op Y".**
2d20: 20 61 72 65 20 63 6f 6e 76 65 72 74 65 64 20 69   are converted i
2d30: 6e 74 6f 20 22 59 20 6f 70 20 58 22 2e 0a 2a 2a  nto "Y op X"..**
2d40: 0a 2a 2a 20 49 66 20 6c 65 66 74 2f 72 69 67 68  .** If left/righ
2d50: 74 20 70 72 65 63 65 64 65 6e 63 65 20 72 75 6c  t precedence rul
2d60: 65 73 20 63 6f 6d 65 20 69 6e 74 6f 20 70 6c 61  es come into pla
2d70: 79 20 77 68 65 6e 20 64 65 74 65 72 6d 69 6e 69  y when determini
2d80: 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 6c 6c 61 74  ng the.** collat
2d90: 69 6e 67 20 73 65 71 75 65 6e 63 65 2c 20 74 68  ing sequence, th
2da0: 65 6e 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61  en COLLATE opera
2db0: 74 6f 72 73 20 61 72 65 20 61 64 6a 75 73 74 65  tors are adjuste
2dc0: 64 20 74 6f 20 65 6e 73 75 72 65 0a 2a 2a 20 74  d to ensure.** t
2dd0: 68 61 74 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e  hat the collatin
2de0: 67 20 73 65 71 75 65 6e 63 65 20 64 6f 65 73 20  g sequence does 
2df0: 6e 6f 74 20 63 68 61 6e 67 65 2e 20 20 46 6f 72  not change.  For
2e00: 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 20 22 59 20   example:.** "Y 
2e10: 63 6f 6c 6c 61 74 65 20 4e 4f 43 41 53 45 20 6f  collate NOCASE o
2e20: 70 20 58 22 20 62 65 63 6f 6d 65 73 20 22 58 20  p X" becomes "X 
2e30: 6f 70 20 59 22 20 62 65 63 61 75 73 65 20 61 6e  op Y" because an
2e40: 79 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  y collation sequ
2e50: 65 6e 63 65 20 6f 6e 0a 2a 2a 20 74 68 65 20 6c  ence on.** the l
2e60: 65 66 74 20 68 61 6e 64 20 73 69 64 65 20 6f 66  eft hand side of
2e70: 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 76   a comparison ov
2e80: 65 72 72 69 64 65 73 20 61 6e 79 20 63 6f 6c 6c  errides any coll
2e90: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 0a  ation sequence .
2ea0: 2a 2a 20 61 74 74 61 63 68 65 64 20 74 6f 20 74  ** attached to t
2eb0: 68 65 20 72 69 67 68 74 2e 20 46 6f 72 20 74 68  he right. For th
2ec0: 65 20 73 61 6d 65 20 72 65 61 73 6f 6e 20 74 68  e same reason th
2ed0: 65 20 45 50 5f 43 6f 6c 6c 61 74 65 20 66 6c 61  e EP_Collate fla
2ee0: 67 0a 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6d 6d  g.** is not comm
2ef0: 75 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  uted..*/.static 
2f00: 76 6f 69 64 20 65 78 70 72 43 6f 6d 6d 75 74 65  void exprCommute
2f10: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
2f20: 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
2f30: 75 31 36 20 65 78 70 52 69 67 68 74 20 3d 20 28  u16 expRight = (
2f40: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2d 3e 66  pExpr->pRight->f
2f50: 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74  lags & EP_Collat
2f60: 65 29 3b 0a 20 20 75 31 36 20 65 78 70 4c 65 66  e);.  u16 expLef
2f70: 74 20 3d 20 28 70 45 78 70 72 2d 3e 70 4c 65 66  t = (pExpr->pLef
2f80: 74 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 43 6f  t->flags & EP_Co
2f90: 6c 6c 61 74 65 29 3b 0a 20 20 61 73 73 65 72 74  llate);.  assert
2fa0: 28 20 61 6c 6c 6f 77 65 64 4f 70 28 70 45 78 70  ( allowedOp(pExp
2fb0: 72 2d 3e 6f 70 29 20 26 26 20 70 45 78 70 72 2d  r->op) && pExpr-
2fc0: 3e 6f 70 21 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20  >op!=TK_IN );.  
2fd0: 69 66 28 20 65 78 70 52 69 67 68 74 3d 3d 65 78  if( expRight==ex
2fe0: 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 2f 2a 20  pLeft ){.    /* 
2ff0: 45 69 74 68 65 72 20 58 20 61 6e 64 20 59 20 62  Either X and Y b
3000: 6f 74 68 20 68 61 76 65 20 43 4f 4c 4c 41 54 45  oth have COLLATE
3010: 20 6f 70 65 72 61 74 6f 72 20 6f 72 20 6e 65 69   operator or nei
3020: 74 68 65 72 20 64 6f 20 2a 2f 0a 20 20 20 20 69  ther do */.    i
3030: 66 28 20 65 78 70 52 69 67 68 74 20 29 7b 0a 20  f( expRight ){. 
3040: 20 20 20 20 20 2f 2a 20 42 6f 74 68 20 58 20 61       /* Both X a
3050: 6e 64 20 59 20 68 61 76 65 20 43 4f 4c 4c 41 54  nd Y have COLLAT
3060: 45 20 6f 70 65 72 61 74 6f 72 73 2e 20 20 4d 61  E operators.  Ma
3070: 6b 65 20 73 75 72 65 20 58 20 69 73 20 61 6c 77  ke sure X is alw
3080: 61 79 73 0a 20 20 20 20 20 20 2a 2a 20 75 73 65  ays.      ** use
3090: 64 20 62 79 20 63 6c 65 61 72 69 6e 67 20 74 68  d by clearing th
30a0: 65 20 45 50 5f 43 6f 6c 6c 61 74 65 20 66 6c 61  e EP_Collate fla
30b0: 67 20 66 72 6f 6d 20 59 2e 20 2a 2f 0a 20 20 20  g from Y. */.   
30c0: 20 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74     pExpr->pRight
30d0: 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 45 50 5f 43  ->flags &= ~EP_C
30e0: 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 7d 65 6c 73  ollate;.    }els
30f0: 65 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70  e if( sqlite3Exp
3100: 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
3110: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 21 3d   pExpr->pLeft)!=
3120: 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 65  0 ){.      /* Ne
3130: 69 74 68 65 72 20 58 20 6e 6f 72 20 59 20 68 61  ither X nor Y ha
3140: 76 65 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61  ve COLLATE opera
3150: 74 6f 72 73 2c 20 62 75 74 20 58 20 68 61 73 20  tors, but X has 
3160: 61 20 6e 6f 6e 2d 64 65 66 61 75 6c 74 0a 20 20  a non-default.  
3170: 20 20 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6e 67      ** collating
3180: 20 73 65 71 75 65 6e 63 65 2e 20 20 53 6f 20 61   sequence.  So a
3190: 64 64 20 74 68 65 20 45 50 5f 43 6f 6c 6c 61 74  dd the EP_Collat
31a0: 65 20 6d 61 72 6b 65 72 20 6f 6e 20 58 20 74 6f  e marker on X to
31b0: 20 63 61 75 73 65 0a 20 20 20 20 20 20 2a 2a 20   cause.      ** 
31c0: 69 74 20 74 6f 20 62 65 20 73 65 61 72 63 68 65  it to be searche
31d0: 64 20 66 69 72 73 74 2e 20 2a 2f 0a 20 20 20 20  d first. */.    
31e0: 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e    pExpr->pLeft->
31f0: 66 6c 61 67 73 20 7c 3d 20 45 50 5f 43 6f 6c 6c  flags |= EP_Coll
3200: 61 74 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ate;.    }.  }. 
3210: 20 53 57 41 50 28 45 78 70 72 2a 2c 70 45 78 70   SWAP(Expr*,pExp
3220: 72 2d 3e 70 52 69 67 68 74 2c 70 45 78 70 72 2d  r->pRight,pExpr-
3230: 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66 28 20 70  >pLeft);.  if( p
3240: 45 78 70 72 2d 3e 6f 70 3e 3d 54 4b 5f 47 54 20  Expr->op>=TK_GT 
3250: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 54  ){.    assert( T
3260: 4b 5f 4c 54 3d 3d 54 4b 5f 47 54 2b 32 20 29 3b  K_LT==TK_GT+2 );
3270: 0a 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f  .    assert( TK_
3280: 47 45 3d 3d 54 4b 5f 4c 45 2b 32 20 29 3b 0a 20  GE==TK_LE+2 );. 
3290: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 54     assert( TK_GT
32a0: 3e 54 4b 5f 45 51 20 29 3b 0a 20 20 20 20 61 73  >TK_EQ );.    as
32b0: 73 65 72 74 28 20 54 4b 5f 47 54 3c 54 4b 5f 4c  sert( TK_GT<TK_L
32c0: 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  E );.    assert(
32d0: 20 70 45 78 70 72 2d 3e 6f 70 3e 3d 54 4b 5f 47   pExpr->op>=TK_G
32e0: 54 20 26 26 20 70 45 78 70 72 2d 3e 6f 70 3c 3d  T && pExpr->op<=
32f0: 54 4b 5f 47 45 20 29 3b 0a 20 20 20 20 70 45 78  TK_GE );.    pEx
3300: 70 72 2d 3e 6f 70 20 3d 20 28 28 70 45 78 70 72  pr->op = ((pExpr
3310: 2d 3e 6f 70 2d 54 4b 5f 47 54 29 5e 32 29 2b 54  ->op-TK_GT)^2)+T
3320: 4b 5f 47 54 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  K_GT;.  }.}../*.
3330: 2a 2a 20 54 72 61 6e 73 6c 61 74 65 20 66 72 6f  ** Translate fro
3340: 6d 20 54 4b 5f 78 78 20 6f 70 65 72 61 74 6f 72  m TK_xx operator
3350: 20 74 6f 20 57 4f 5f 78 78 20 62 69 74 6d 61 73   to WO_xx bitmas
3360: 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 31 36  k..*/.static u16
3370: 20 6f 70 65 72 61 74 6f 72 4d 61 73 6b 28 69 6e   operatorMask(in
3380: 74 20 6f 70 29 7b 0a 20 20 75 31 36 20 63 3b 0a  t op){.  u16 c;.
3390: 20 20 61 73 73 65 72 74 28 20 61 6c 6c 6f 77 65    assert( allowe
33a0: 64 4f 70 28 6f 70 29 20 29 3b 0a 20 20 69 66 28  dOp(op) );.  if(
33b0: 20 6f 70 3d 3d 54 4b 5f 49 4e 20 29 7b 0a 20 20   op==TK_IN ){.  
33c0: 20 20 63 20 3d 20 57 4f 5f 49 4e 3b 0a 20 20 7d    c = WO_IN;.  }
33d0: 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  else if( op==TK_
33e0: 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 63 20  ISNULL ){.    c 
33f0: 3d 20 57 4f 5f 49 53 4e 55 4c 4c 3b 0a 20 20 7d  = WO_ISNULL;.  }
3400: 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
3410: 28 20 28 57 4f 5f 45 51 3c 3c 28 6f 70 2d 54 4b  ( (WO_EQ<<(op-TK
3420: 5f 45 51 29 29 20 3c 20 30 78 37 66 66 66 20 29  _EQ)) < 0x7fff )
3430: 3b 0a 20 20 20 20 63 20 3d 20 28 75 31 36 29 28  ;.    c = (u16)(
3440: 57 4f 5f 45 51 3c 3c 28 6f 70 2d 54 4b 5f 45 51  WO_EQ<<(op-TK_EQ
3450: 29 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  ));.  }.  assert
3460: 28 20 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20  ( op!=TK_ISNULL 
3470: 7c 7c 20 63 3d 3d 57 4f 5f 49 53 4e 55 4c 4c 20  || c==WO_ISNULL 
3480: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21  );.  assert( op!
3490: 3d 54 4b 5f 49 4e 20 7c 7c 20 63 3d 3d 57 4f 5f  =TK_IN || c==WO_
34a0: 49 4e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  IN );.  assert( 
34b0: 6f 70 21 3d 54 4b 5f 45 51 20 7c 7c 20 63 3d 3d  op!=TK_EQ || c==
34c0: 57 4f 5f 45 51 20 29 3b 0a 20 20 61 73 73 65 72  WO_EQ );.  asser
34d0: 74 28 20 6f 70 21 3d 54 4b 5f 4c 54 20 7c 7c 20  t( op!=TK_LT || 
34e0: 63 3d 3d 57 4f 5f 4c 54 20 29 3b 0a 20 20 61 73  c==WO_LT );.  as
34f0: 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 4c 45 20  sert( op!=TK_LE 
3500: 7c 7c 20 63 3d 3d 57 4f 5f 4c 45 20 29 3b 0a 20  || c==WO_LE );. 
3510: 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f   assert( op!=TK_
3520: 47 54 20 7c 7c 20 63 3d 3d 57 4f 5f 47 54 20 29  GT || c==WO_GT )
3530: 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d  ;.  assert( op!=
3540: 54 4b 5f 47 45 20 7c 7c 20 63 3d 3d 57 4f 5f 47  TK_GE || c==WO_G
3550: 45 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 63 3b  E );.  return c;
3560: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63  .}../*.** Advanc
3570: 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20 57 68  e to the next Wh
3580: 65 72 65 54 65 72 6d 20 74 68 61 74 20 6d 61 74  ereTerm that mat
3590: 63 68 65 73 20 61 63 63 6f 72 64 69 6e 67 20 74  ches according t
35a0: 6f 20 74 68 65 20 63 72 69 74 65 72 69 61 0a 2a  o the criteria.*
35b0: 2a 20 65 73 74 61 62 6c 69 73 68 65 64 20 77 68  * established wh
35c0: 65 6e 20 74 68 65 20 70 53 63 61 6e 20 6f 62 6a  en the pScan obj
35d0: 65 63 74 20 77 61 73 20 69 6e 69 74 69 61 6c 69  ect was initiali
35e0: 7a 65 64 20 62 79 20 77 68 65 72 65 53 63 61 6e  zed by whereScan
35f0: 49 6e 69 74 28 29 2e 0a 2a 2a 20 52 65 74 75 72  Init()..** Retur
3600: 6e 20 4e 55 4c 4c 20 69 66 20 74 68 65 72 65 20  n NULL if there 
3610: 61 72 65 20 6e 6f 20 6d 6f 72 65 20 6d 61 74 63  are no more matc
3620: 68 69 6e 67 20 57 68 65 72 65 54 65 72 6d 73 2e  hing WhereTerms.
3630: 0a 2a 2f 0a 73 74 61 74 69 63 20 57 68 65 72 65  .*/.static Where
3640: 54 65 72 6d 20 2a 77 68 65 72 65 53 63 61 6e 4e  Term *whereScanN
3650: 65 78 74 28 57 68 65 72 65 53 63 61 6e 20 2a 70  ext(WhereScan *p
3660: 53 63 61 6e 29 7b 0a 20 20 69 6e 74 20 69 43 75  Scan){.  int iCu
3670: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  r;            /*
3680: 20 54 68 65 20 63 75 72 73 6f 72 20 6f 6e 20 74   The cursor on t
3690: 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20 74 65  he LHS of the te
36a0: 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c  rm */.  int iCol
36b0: 75 6d 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  umn;         /* 
36c0: 54 68 65 20 63 6f 6c 75 6d 6e 20 6f 6e 20 74 68  The column on th
36d0: 65 20 4c 48 53 20 6f 66 20 74 68 65 20 74 65 72  e LHS of the ter
36e0: 6d 2e 20 20 2d 31 20 66 6f 72 20 49 50 4b 20 2a  m.  -1 for IPK *
36f0: 2f 0a 20 20 45 78 70 72 20 2a 70 58 3b 20 20 20  /.  Expr *pX;   
3700: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65           /* An e
3710: 78 70 72 65 73 73 69 6f 6e 20 62 65 69 6e 67 20  xpression being 
3720: 74 65 73 74 65 64 20 2a 2f 0a 20 20 57 68 65 72  tested */.  Wher
3730: 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 20 20 20  eClause *pWC;   
3740: 20 2f 2a 20 53 68 6f 72 74 68 61 6e 64 20 66 6f   /* Shorthand fo
3750: 72 20 70 53 63 61 6e 2d 3e 70 57 43 20 2a 2f 0a  r pScan->pWC */.
3760: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
3770: 72 6d 3b 20 20 20 20 2f 2a 20 54 68 65 20 74 65  rm;    /* The te
3780: 72 6d 20 62 65 69 6e 67 20 74 65 73 74 65 64 20  rm being tested 
3790: 2a 2f 0a 20 20 69 6e 74 20 6b 20 3d 20 70 53 63  */.  int k = pSc
37a0: 61 6e 2d 3e 6b 3b 20 20 20 20 2f 2a 20 57 68 65  an->k;    /* Whe
37b0: 72 65 20 74 6f 20 73 74 61 72 74 20 73 63 61 6e  re to start scan
37c0: 6e 69 6e 67 20 2a 2f 0a 0a 20 20 77 68 69 6c 65  ning */..  while
37d0: 28 20 70 53 63 61 6e 2d 3e 69 45 71 75 69 76 3c  ( pScan->iEquiv<
37e0: 3d 70 53 63 61 6e 2d 3e 6e 45 71 75 69 76 20 29  =pScan->nEquiv )
37f0: 7b 0a 20 20 20 20 69 43 75 72 20 3d 20 70 53 63  {.    iCur = pSc
3800: 61 6e 2d 3e 61 45 71 75 69 76 5b 70 53 63 61 6e  an->aEquiv[pScan
3810: 2d 3e 69 45 71 75 69 76 2d 32 5d 3b 0a 20 20 20  ->iEquiv-2];.   
3820: 20 69 43 6f 6c 75 6d 6e 20 3d 20 70 53 63 61 6e   iColumn = pScan
3830: 2d 3e 61 45 71 75 69 76 5b 70 53 63 61 6e 2d 3e  ->aEquiv[pScan->
3840: 69 45 71 75 69 76 2d 31 5d 3b 0a 20 20 20 20 77  iEquiv-1];.    w
3850: 68 69 6c 65 28 20 28 70 57 43 20 3d 20 70 53 63  hile( (pWC = pSc
3860: 61 6e 2d 3e 70 57 43 29 21 3d 30 20 29 7b 0a 20  an->pWC)!=0 ){. 
3870: 20 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d 70       for(pTerm=p
3880: 57 43 2d 3e 61 2b 6b 3b 20 6b 3c 70 57 43 2d 3e  WC->a+k; k<pWC->
3890: 6e 54 65 72 6d 3b 20 6b 2b 2b 2c 20 70 54 65 72  nTerm; k++, pTer
38a0: 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  m++){.        if
38b0: 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72  ( pTerm->leftCur
38c0: 73 6f 72 3d 3d 69 43 75 72 0a 20 20 20 20 20 20  sor==iCur.      
38d0: 20 20 20 26 26 20 70 54 65 72 6d 2d 3e 75 2e 6c     && pTerm->u.l
38e0: 65 66 74 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 75  eftColumn==iColu
38f0: 6d 6e 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  mn.         && (
3900: 70 53 63 61 6e 2d 3e 69 45 71 75 69 76 3c 3d 32  pScan->iEquiv<=2
3910: 20 7c 7c 20 21 45 78 70 72 48 61 73 50 72 6f 70   || !ExprHasProp
3920: 65 72 74 79 28 70 54 65 72 6d 2d 3e 70 45 78 70  erty(pTerm->pExp
3930: 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 29  r, EP_FromJoin))
3940: 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
3950: 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d        if( (pTerm
3960: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
3970: 5f 45 51 55 49 56 29 21 3d 30 0a 20 20 20 20 20  _EQUIV)!=0.     
3980: 20 20 20 20 20 20 26 26 20 70 53 63 61 6e 2d 3e        && pScan->
3990: 6e 45 71 75 69 76 3c 41 72 72 61 79 53 69 7a 65  nEquiv<ArraySize
39a0: 28 70 53 63 61 6e 2d 3e 61 45 71 75 69 76 29 0a  (pScan->aEquiv).
39b0: 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20            ){.   
39c0: 20 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a           int j;.
39d0: 20 20 20 20 20 20 20 20 20 20 20 20 70 58 20 3d              pX =
39e0: 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70   sqlite3ExprSkip
39f0: 43 6f 6c 6c 61 74 65 28 70 54 65 72 6d 2d 3e 70  Collate(pTerm->p
3a00: 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20  Expr->pRight);. 
3a10: 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
3a20: 74 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  t( pX->op==TK_CO
3a30: 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 20 20  LUMN );.        
3a40: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
3a50: 53 63 61 6e 2d 3e 6e 45 71 75 69 76 3b 20 6a 2b  Scan->nEquiv; j+
3a60: 3d 32 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  =2){.           
3a70: 20 20 20 69 66 28 20 70 53 63 61 6e 2d 3e 61 45     if( pScan->aE
3a80: 71 75 69 76 5b 6a 5d 3d 3d 70 58 2d 3e 69 54 61  quiv[j]==pX->iTa
3a90: 62 6c 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  ble.            
3aa0: 20 20 20 26 26 20 70 53 63 61 6e 2d 3e 61 45 71     && pScan->aEq
3ab0: 75 69 76 5b 6a 2b 31 5d 3d 3d 70 58 2d 3e 69 43  uiv[j+1]==pX->iC
3ac0: 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20  olumn ){.       
3ad0: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
3ae0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
3af0: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  }.            }.
3b00: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
3b10: 6a 3d 3d 70 53 63 61 6e 2d 3e 6e 45 71 75 69 76  j==pScan->nEquiv
3b20: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
3b30: 20 20 70 53 63 61 6e 2d 3e 61 45 71 75 69 76 5b    pScan->aEquiv[
3b40: 6a 5d 20 3d 20 70 58 2d 3e 69 54 61 62 6c 65 3b  j] = pX->iTable;
3b50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
3b60: 53 63 61 6e 2d 3e 61 45 71 75 69 76 5b 6a 2b 31  Scan->aEquiv[j+1
3b70: 5d 20 3d 20 70 58 2d 3e 69 43 6f 6c 75 6d 6e 3b  ] = pX->iColumn;
3b80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
3b90: 53 63 61 6e 2d 3e 6e 45 71 75 69 76 20 2b 3d 20  Scan->nEquiv += 
3ba0: 32 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  2;.            }
3bb0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
3bc0: 20 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72         if( (pTer
3bd0: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 70  m->eOperator & p
3be0: 53 63 61 6e 2d 3e 6f 70 4d 61 73 6b 29 21 3d 30  Scan->opMask)!=0
3bf0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
3c00: 2f 2a 20 56 65 72 69 66 79 20 74 68 65 20 61 66  /* Verify the af
3c10: 66 69 6e 69 74 79 20 61 6e 64 20 63 6f 6c 6c 61  finity and colla
3c20: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 6d 61  ting sequence ma
3c30: 74 63 68 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  tch */.         
3c40: 20 20 20 69 66 28 20 70 53 63 61 6e 2d 3e 7a 43     if( pScan->zC
3c50: 6f 6c 6c 4e 61 6d 65 20 26 26 20 28 70 54 65 72  ollName && (pTer
3c60: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
3c70: 4f 5f 49 53 4e 55 4c 4c 29 3d 3d 30 20 29 7b 0a  O_ISNULL)==0 ){.
3c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 43 6f                Co
3c90: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20  llSeq *pColl;.  
3ca0: 20 20 20 20 20 20 20 20 20 20 20 20 50 61 72 73              Pars
3cb0: 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 43 2d  e *pParse = pWC-
3cc0: 3e 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b  >pWInfo->pParse;
3cd0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
3ce0: 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  X = pTerm->pExpr
3cf0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
3d00: 69 66 28 20 21 73 71 6c 69 74 65 33 49 6e 64 65  if( !sqlite3Inde
3d10: 78 41 66 66 69 6e 69 74 79 4f 6b 28 70 58 2c 20  xAffinityOk(pX, 
3d20: 70 53 63 61 6e 2d 3e 69 64 78 61 66 66 29 20 29  pScan->idxaff) )
3d30: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
3d40: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
3d50: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
3d60: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
3d70: 28 70 58 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  (pX->pLeft);.   
3d80: 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 6c             pColl
3d90: 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79   = sqlite3Binary
3da0: 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70  CompareCollSeq(p
3db0: 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20  Parse,.         
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 70 58 2d 3e 70 4c 65           pX->pLe
3df0: 66 74 2c 20 70 58 2d 3e 70 52 69 67 68 74 29 3b  ft, pX->pRight);
3e00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
3e10: 66 28 20 70 43 6f 6c 6c 3d 3d 30 20 29 20 70 43  f( pColl==0 ) pC
3e20: 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  oll = pParse->db
3e30: 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20  ->pDfltColl;.   
3e40: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73             if( s
3e50: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 43  qlite3StrICmp(pC
3e60: 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 70 53 63 61  oll->zName, pSca
3e70: 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65 29 20 29 7b  n->zCollName) ){
3e80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3e90: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
3ea0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
3eb0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
3ec0: 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d       if( (pTerm-
3ed0: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
3ee0: 45 51 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20  EQ)!=0.         
3ef0: 20 20 20 20 26 26 20 28 70 58 20 3d 20 70 54 65      && (pX = pTe
3f00: 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68  rm->pExpr->pRigh
3f10: 74 29 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  t)->op==TK_COLUM
3f20: 4e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26  N.             &
3f30: 26 20 70 58 2d 3e 69 54 61 62 6c 65 3d 3d 70 53  & pX->iTable==pS
3f40: 63 61 6e 2d 3e 61 45 71 75 69 76 5b 30 5d 0a 20  can->aEquiv[0]. 
3f50: 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 70              && p
3f60: 58 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 53 63 61  X->iColumn==pSca
3f70: 6e 2d 3e 61 45 71 75 69 76 5b 31 5d 0a 20 20 20  n->aEquiv[1].   
3f80: 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20           ){.    
3f90: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
3fa0: 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
3fb0: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 53  }.            pS
3fc0: 63 61 6e 2d 3e 6b 20 3d 20 6b 2b 31 3b 0a 20 20  can->k = k+1;.  
3fd0: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
3fe0: 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20   pTerm;.        
3ff0: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
4000: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 53 63 61      }.      pSca
4010: 6e 2d 3e 70 57 43 20 3d 20 70 53 63 61 6e 2d 3e  n->pWC = pScan->
4020: 70 57 43 2d 3e 70 4f 75 74 65 72 3b 0a 20 20 20  pWC->pOuter;.   
4030: 20 20 20 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 0a     k = 0;.    }.
4040: 20 20 20 20 70 53 63 61 6e 2d 3e 70 57 43 20 3d      pScan->pWC =
4050: 20 70 53 63 61 6e 2d 3e 70 4f 72 69 67 57 43 3b   pScan->pOrigWC;
4060: 0a 20 20 20 20 6b 20 3d 20 30 3b 0a 20 20 20 20  .    k = 0;.    
4070: 70 53 63 61 6e 2d 3e 69 45 71 75 69 76 20 2b 3d  pScan->iEquiv +=
4080: 20 32 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   2;.  }.  return
4090: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69   0;.}../*.** Ini
40a0: 74 69 61 6c 69 7a 65 20 61 20 57 48 45 52 45 20  tialize a WHERE 
40b0: 63 6c 61 75 73 65 20 73 63 61 6e 6e 65 72 20 6f  clause scanner o
40c0: 62 6a 65 63 74 2e 20 20 52 65 74 75 72 6e 20 61  bject.  Return a
40d0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 0a   pointer to the.
40e0: 2a 2a 20 66 69 72 73 74 20 6d 61 74 63 68 2e 20  ** first match. 
40f0: 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20   Return NULL if 
4100: 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 61 74  there are no mat
4110: 63 68 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ches..**.** The 
4120: 73 63 61 6e 6e 65 72 20 77 69 6c 6c 20 62 65 20  scanner will be 
4130: 73 65 61 72 63 68 69 6e 67 20 74 68 65 20 57 48  searching the WH
4140: 45 52 45 20 63 6c 61 75 73 65 20 70 57 43 2e 20  ERE clause pWC. 
4150: 20 49 74 20 77 69 6c 6c 20 6c 6f 6f 6b 0a 2a 2a   It will look.**
4160: 20 66 6f 72 20 74 65 72 6d 73 20 6f 66 20 74 68   for terms of th
4170: 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 3c  e form "X <op> <
4180: 65 78 70 72 3e 22 20 77 68 65 72 65 20 58 20 69  expr>" where X i
4190: 73 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 75 6d 6e  s column iColumn
41a0: 20 6f 66 20 74 61 62 6c 65 0a 2a 2a 20 69 43 75   of table.** iCu
41b0: 72 2e 20 20 54 68 65 20 3c 6f 70 3e 20 6d 75 73  r.  The <op> mus
41c0: 74 20 62 65 20 6f 6e 65 20 6f 66 20 74 68 65 20  t be one of the 
41d0: 6f 70 65 72 61 74 6f 72 73 20 64 65 73 63 72 69  operators descri
41e0: 62 65 64 20 62 79 20 6f 70 4d 61 73 6b 2e 0a 2a  bed by opMask..*
41f0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 65 61 72  *.** If the sear
4200: 63 68 20 69 73 20 66 6f 72 20 58 20 61 6e 64 20  ch is for X and 
4210: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
4220: 20 63 6f 6e 74 61 69 6e 73 20 74 65 72 6d 73 20   contains terms 
4230: 6f 66 20 74 68 65 0a 2a 2a 20 66 6f 72 6d 20 58  of the.** form X
4240: 3d 59 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75  =Y then this rou
4250: 74 69 6e 65 20 6d 69 67 68 74 20 61 6c 73 6f 20  tine might also 
4260: 72 65 74 75 72 6e 20 74 65 72 6d 73 20 6f 66 20  return terms of 
4270: 74 68 65 20 66 6f 72 6d 0a 2a 2a 20 22 59 20 3c  the form.** "Y <
4280: 6f 70 3e 20 3c 65 78 70 72 3e 22 2e 20 20 54 68  op> <expr>".  Th
4290: 65 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65 76 65  e number of leve
42a0: 6c 73 20 6f 66 20 74 72 61 6e 73 69 74 69 76 69  ls of transitivi
42b0: 74 79 20 69 73 20 6c 69 6d 69 74 65 64 2c 0a 2a  ty is limited,.*
42c0: 2a 20 62 75 74 20 69 73 20 65 6e 6f 75 67 68 20  * but is enough 
42d0: 74 6f 20 68 61 6e 64 6c 65 20 6d 6f 73 74 20 63  to handle most c
42e0: 6f 6d 6d 6f 6e 6c 79 20 6f 63 63 75 72 72 69 6e  ommonly occurrin
42f0: 67 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73  g SQL statements
4300: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 58 20 69 73 20  ..**.** If X is 
4310: 6e 6f 74 20 74 68 65 20 49 4e 54 45 47 45 52 20  not the INTEGER 
4320: 50 52 49 4d 41 52 59 20 4b 45 59 20 74 68 65 6e  PRIMARY KEY then
4330: 20 58 20 6d 75 73 74 20 62 65 20 63 6f 6d 70 61   X must be compa
4340: 74 69 62 6c 65 20 77 69 74 68 0a 2a 2a 20 69 6e  tible with.** in
4350: 64 65 78 20 70 49 64 78 2e 0a 2a 2f 0a 73 74 61  dex pIdx..*/.sta
4360: 74 69 63 20 57 68 65 72 65 54 65 72 6d 20 2a 77  tic WhereTerm *w
4370: 68 65 72 65 53 63 61 6e 49 6e 69 74 28 0a 20 20  hereScanInit(.  
4380: 57 68 65 72 65 53 63 61 6e 20 2a 70 53 63 61 6e  WhereScan *pScan
4390: 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57  ,       /* The W
43a0: 68 65 72 65 53 63 61 6e 20 6f 62 6a 65 63 74 20  hereScan object 
43b0: 62 65 69 6e 67 20 69 6e 69 74 69 61 6c 69 7a 65  being initialize
43c0: 64 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75  d */.  WhereClau
43d0: 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20 2f  se *pWC,       /
43e0: 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
43f0: 73 65 20 74 6f 20 62 65 20 73 63 61 6e 6e 65 64  se to be scanned
4400: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 2c 20   */.  int iCur, 
4410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4420: 20 43 75 72 73 6f 72 20 74 6f 20 73 63 61 6e 20   Cursor to scan 
4430: 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f  for */.  int iCo
4440: 6c 75 6d 6e 2c 20 20 20 20 20 20 20 20 20 20 20  lumn,           
4450: 20 2f 2a 20 43 6f 6c 75 6d 6e 20 74 6f 20 73 63   /* Column to sc
4460: 61 6e 20 66 6f 72 20 2a 2f 0a 20 20 75 33 32 20  an for */.  u32 
4470: 6f 70 4d 61 73 6b 2c 20 20 20 20 20 20 20 20 20  opMask,         
4480: 20 20 20 20 2f 2a 20 4f 70 65 72 61 74 6f 72 28      /* Operator(
4490: 73 29 20 74 6f 20 73 63 61 6e 20 66 6f 72 20 2a  s) to scan for *
44a0: 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20  /.  Index *pIdx 
44b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
44c0: 75 73 74 20 62 65 20 63 6f 6d 70 61 74 69 62 6c  ust be compatibl
44d0: 65 20 77 69 74 68 20 74 68 69 73 20 69 6e 64 65  e with this inde
44e0: 78 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6a 3b  x */.){.  int j;
44f0: 0a 0a 20 20 2f 2a 20 6d 65 6d 73 65 74 28 70 53  ..  /* memset(pS
4500: 63 61 6e 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  can, 0, sizeof(*
4510: 70 53 63 61 6e 29 29 3b 20 2a 2f 0a 20 20 70 53  pScan)); */.  pS
4520: 63 61 6e 2d 3e 70 4f 72 69 67 57 43 20 3d 20 70  can->pOrigWC = p
4530: 57 43 3b 0a 20 20 70 53 63 61 6e 2d 3e 70 57 43  WC;.  pScan->pWC
4540: 20 3d 20 70 57 43 3b 0a 20 20 69 66 28 20 70 49   = pWC;.  if( pI
4550: 64 78 20 26 26 20 69 43 6f 6c 75 6d 6e 3e 3d 30  dx && iColumn>=0
4560: 20 29 7b 0a 20 20 20 20 70 53 63 61 6e 2d 3e 69   ){.    pScan->i
4570: 64 78 61 66 66 20 3d 20 70 49 64 78 2d 3e 70 54  dxaff = pIdx->pT
4580: 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 75  able->aCol[iColu
4590: 6d 6e 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20  mn].affinity;.  
45a0: 20 20 66 6f 72 28 6a 3d 30 3b 20 70 49 64 78 2d    for(j=0; pIdx-
45b0: 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 21 3d 69 43  >aiColumn[j]!=iC
45c0: 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20  olumn; j++){.   
45d0: 20 20 20 69 66 28 20 4e 45 56 45 52 28 6a 3e 70     if( NEVER(j>p
45e0: 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 20 29 20  Idx->nColumn) ) 
45f0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
4600: 20 20 20 20 70 53 63 61 6e 2d 3e 7a 43 6f 6c 6c      pScan->zColl
4610: 4e 61 6d 65 20 3d 20 70 49 64 78 2d 3e 61 7a 43  Name = pIdx->azC
4620: 6f 6c 6c 5b 6a 5d 3b 0a 20 20 7d 65 6c 73 65 7b  oll[j];.  }else{
4630: 0a 20 20 20 20 70 53 63 61 6e 2d 3e 69 64 78 61  .    pScan->idxa
4640: 66 66 20 3d 20 30 3b 0a 20 20 20 20 70 53 63 61  ff = 0;.    pSca
4650: 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65 20 3d 20 30  n->zCollName = 0
4660: 3b 0a 20 20 7d 0a 20 20 70 53 63 61 6e 2d 3e 6f  ;.  }.  pScan->o
4670: 70 4d 61 73 6b 20 3d 20 6f 70 4d 61 73 6b 3b 0a  pMask = opMask;.
4680: 20 20 70 53 63 61 6e 2d 3e 6b 20 3d 20 30 3b 0a    pScan->k = 0;.
4690: 20 20 70 53 63 61 6e 2d 3e 61 45 71 75 69 76 5b    pScan->aEquiv[
46a0: 30 5d 20 3d 20 69 43 75 72 3b 0a 20 20 70 53 63  0] = iCur;.  pSc
46b0: 61 6e 2d 3e 61 45 71 75 69 76 5b 31 5d 20 3d 20  an->aEquiv[1] = 
46c0: 69 43 6f 6c 75 6d 6e 3b 0a 20 20 70 53 63 61 6e  iColumn;.  pScan
46d0: 2d 3e 6e 45 71 75 69 76 20 3d 20 32 3b 0a 20 20  ->nEquiv = 2;.  
46e0: 70 53 63 61 6e 2d 3e 69 45 71 75 69 76 20 3d 20  pScan->iEquiv = 
46f0: 32 3b 0a 20 20 72 65 74 75 72 6e 20 77 68 65 72  2;.  return wher
4700: 65 53 63 61 6e 4e 65 78 74 28 70 53 63 61 6e 29  eScanNext(pScan)
4710: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63  ;.}../*.** Searc
4720: 68 20 66 6f 72 20 61 20 74 65 72 6d 20 69 6e 20  h for a term in 
4730: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
4740: 20 74 68 61 74 20 69 73 20 6f 66 20 74 68 65 20   that is of the 
4750: 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 3c 65 78  form "X <op> <ex
4760: 70 72 3e 22 0a 2a 2a 20 77 68 65 72 65 20 58 20  pr>".** where X 
4770: 69 73 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  is a reference t
4780: 6f 20 74 68 65 20 69 43 6f 6c 75 6d 6e 20 6f 66  o the iColumn of
4790: 20 74 61 62 6c 65 20 69 43 75 72 20 61 6e 64 20   table iCur and 
47a0: 3c 6f 70 3e 20 69 73 20 6f 6e 65 20 6f 66 0a 2a  <op> is one of.*
47b0: 2a 20 74 68 65 20 57 4f 5f 78 78 20 6f 70 65 72  * the WO_xx oper
47c0: 61 74 6f 72 20 63 6f 64 65 73 20 73 70 65 63 69  ator codes speci
47d0: 66 69 65 64 20 62 79 20 74 68 65 20 6f 70 20 70  fied by the op p
47e0: 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 20 52 65 74  arameter..** Ret
47f0: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
4800: 20 74 68 65 20 74 65 72 6d 2e 20 20 52 65 74 75   the term.  Retu
4810: 72 6e 20 30 20 69 66 20 6e 6f 74 20 66 6f 75 6e  rn 0 if not foun
4820: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 65 72  d..**.** The ter
4830: 6d 20 72 65 74 75 72 6e 65 64 20 6d 69 67 68 74  m returned might
4840: 20 62 79 20 59 3d 3c 65 78 70 72 3e 20 69 66 20   by Y=<expr> if 
4850: 74 68 65 72 65 20 69 73 20 61 6e 6f 74 68 65 72  there is another
4860: 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 6e 0a 2a   constraint in.*
4870: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
4880: 73 65 20 74 68 61 74 20 73 70 65 63 69 66 69 65  se that specifie
4890: 73 20 74 68 61 74 20 58 3d 59 2e 20 20 41 6e 79  s that X=Y.  Any
48a0: 20 73 75 63 68 20 63 6f 6e 73 74 72 61 69 6e 74   such constraint
48b0: 73 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 69 64 65  s will be.** ide
48c0: 6e 74 69 66 69 65 64 20 62 79 20 74 68 65 20 57  ntified by the W
48d0: 4f 5f 45 51 55 49 56 20 62 69 74 20 69 6e 20 74  O_EQUIV bit in t
48e0: 68 65 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  he pTerm->eOpera
48f0: 74 6f 72 20 66 69 65 6c 64 2e 20 20 54 68 65 0a  tor field.  The.
4900: 2a 2a 20 61 45 71 75 69 76 5b 5d 20 61 72 72 61  ** aEquiv[] arra
4910: 79 20 68 6f 6c 64 73 20 58 20 61 6e 64 20 61 6c  y holds X and al
4920: 6c 20 69 74 73 20 65 71 75 69 76 61 6c 65 6e 74  l its equivalent
4930: 73 2c 20 77 69 74 68 20 65 61 63 68 20 53 51 4c  s, with each SQL
4940: 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 74 61 6b   variable.** tak
4950: 69 6e 67 20 75 70 20 74 77 6f 20 73 6c 6f 74 73  ing up two slots
4960: 20 69 6e 20 61 45 71 75 69 76 5b 5d 2e 20 20 54   in aEquiv[].  T
4970: 68 65 20 66 69 72 73 74 20 73 6c 6f 74 20 69 73  he first slot is
4980: 20 66 6f 72 20 74 68 65 20 63 75 72 73 6f 72 20   for the cursor 
4990: 6e 75 6d 62 65 72 0a 2a 2a 20 61 6e 64 20 74 68  number.** and th
49a0: 65 20 73 65 63 6f 6e 64 20 69 73 20 66 6f 72 20  e second is for 
49b0: 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65  the column numbe
49c0: 72 2e 20 20 54 68 65 72 65 20 61 72 65 20 32 32  r.  There are 22
49d0: 20 73 6c 6f 74 73 20 69 6e 20 61 45 71 75 69 76   slots in aEquiv
49e0: 5b 5d 0a 2a 2a 20 73 6f 20 74 68 61 74 20 6d 65  [].** so that me
49f0: 61 6e 73 20 77 65 20 63 61 6e 20 6c 6f 6f 6b 20  ans we can look 
4a00: 66 6f 72 20 58 20 70 6c 75 73 20 75 70 20 74 6f  for X plus up to
4a10: 20 31 30 20 6f 74 68 65 72 20 65 71 75 69 76 61   10 other equiva
4a20: 6c 65 6e 74 20 76 61 6c 75 65 73 2e 0a 2a 2a 20  lent values..** 
4a30: 48 65 6e 63 65 20 61 20 73 65 61 72 63 68 20 66  Hence a search f
4a40: 6f 72 20 58 20 77 69 6c 6c 20 72 65 74 75 72 6e  or X will return
4a50: 20 3c 65 78 70 72 3e 20 69 66 20 58 3d 41 31 20   <expr> if X=A1 
4a60: 61 6e 64 20 41 31 3d 41 32 20 61 6e 64 20 41 32  and A1=A2 and A2
4a70: 3d 41 33 0a 2a 2a 20 61 6e 64 20 2e 2e 2e 20 61  =A3.** and ... a
4a80: 6e 64 20 41 39 3d 41 31 30 20 61 6e 64 20 41 31  nd A9=A10 and A1
4a90: 30 3d 3c 65 78 70 72 3e 2e 0a 2a 2a 0a 2a 2a 20  0=<expr>..**.** 
4aa0: 49 66 20 74 68 65 72 65 20 61 72 65 20 6d 75 6c  If there are mul
4ab0: 74 69 70 6c 65 20 74 65 72 6d 73 20 69 6e 20 74  tiple terms in t
4ac0: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
4ad0: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 58 20 3c  of the form "X <
4ae0: 6f 70 3e 20 3c 65 78 70 72 3e 22 0a 2a 2a 20 74  op> <expr>".** t
4af0: 68 65 6e 20 74 72 79 20 66 6f 72 20 74 68 65 20  hen try for the 
4b00: 6f 6e 65 20 77 69 74 68 20 6e 6f 20 64 65 70 65  one with no depe
4b10: 6e 64 65 6e 63 69 65 73 20 6f 6e 20 3c 65 78 70  ndencies on <exp
4b20: 72 3e 20 2d 20 69 6e 20 6f 74 68 65 72 20 77 6f  r> - in other wo
4b30: 72 64 73 20 77 68 65 72 65 0a 2a 2a 20 3c 65 78  rds where.** <ex
4b40: 70 72 3e 20 69 73 20 61 20 63 6f 6e 73 74 61 6e  pr> is a constan
4b50: 74 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 66 20  t expression of 
4b60: 73 6f 6d 65 20 6b 69 6e 64 2e 20 20 4f 6e 6c 79  some kind.  Only
4b70: 20 72 65 74 75 72 6e 20 65 6e 74 72 69 65 73 20   return entries 
4b80: 6f 66 0a 2a 2a 20 74 68 65 20 66 6f 72 6d 20 22  of.** the form "
4b90: 58 20 3c 6f 70 3e 20 59 22 20 77 68 65 72 65 20  X <op> Y" where 
4ba0: 59 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 69 6e  Y is a column in
4bb0: 20 61 6e 6f 74 68 65 72 20 74 61 62 6c 65 20 69   another table i
4bc0: 66 20 6e 6f 20 74 65 72 6d 73 20 6f 66 0a 2a 2a  f no terms of.**
4bd0: 20 74 68 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70   the form "X <op
4be0: 3e 20 3c 63 6f 6e 73 74 2d 65 78 70 72 3e 22 20  > <const-expr>" 
4bf0: 65 78 69 73 74 2e 20 20 20 49 66 20 6e 6f 20 74  exist.   If no t
4c00: 65 72 6d 73 20 77 69 74 68 20 61 20 63 6f 6e 73  erms with a cons
4c10: 74 61 6e 74 20 52 48 53 0a 2a 2a 20 65 78 69 73  tant RHS.** exis
4c20: 74 2c 20 74 72 79 20 74 6f 20 72 65 74 75 72 6e  t, try to return
4c30: 20 61 20 74 65 72 6d 20 74 68 61 74 20 64 6f 65   a term that doe
4c40: 73 20 6e 6f 74 20 75 73 65 20 57 4f 5f 45 51 55  s not use WO_EQU
4c50: 49 56 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 57 68  IV..*/.static Wh
4c60: 65 72 65 54 65 72 6d 20 2a 66 69 6e 64 54 65 72  ereTerm *findTer
4c70: 6d 28 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  m(.  WhereClause
4c80: 20 2a 70 57 43 2c 20 20 20 20 20 2f 2a 20 54 68   *pWC,     /* Th
4c90: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
4ca0: 6f 20 62 65 20 73 65 61 72 63 68 65 64 20 2a 2f  o be searched */
4cb0: 0a 20 20 69 6e 74 20 69 43 75 72 2c 20 20 20 20  .  int iCur,    
4cc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
4cd0: 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 4c 48 53  or number of LHS
4ce0: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d   */.  int iColum
4cf0: 6e 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  n,          /* C
4d00: 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 6f 66 20  olumn number of 
4d10: 4c 48 53 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  LHS */.  Bitmask
4d20: 20 6e 6f 74 52 65 61 64 79 2c 20 20 20 20 20 2f   notReady,     /
4d30: 2a 20 52 48 53 20 6d 75 73 74 20 6e 6f 74 20 6f  * RHS must not o
4d40: 76 65 72 6c 61 70 20 77 69 74 68 20 74 68 69 73  verlap with this
4d50: 20 6d 61 73 6b 20 2a 2f 0a 20 20 75 33 32 20 6f   mask */.  u32 o
4d60: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
4d70: 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 57 4f 5f 78   /* Mask of WO_x
4d80: 78 20 76 61 6c 75 65 73 20 64 65 73 63 72 69 62  x values describ
4d90: 69 6e 67 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a  ing operator */.
4da0: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 20 20    Index *pIdx   
4db0: 20 20 20 20 20 20 20 20 2f 2a 20 4d 75 73 74 20          /* Must 
4dc0: 62 65 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69  be compatible wi
4dd0: 74 68 20 74 68 69 73 20 69 6e 64 65 78 2c 20 69  th this index, i
4de0: 66 20 6e 6f 74 20 4e 55 4c 4c 20 2a 2f 0a 29 7b  f not NULL */.){
4df0: 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 52  .  WhereTerm *pR
4e00: 65 73 75 6c 74 20 3d 20 30 3b 0a 20 20 57 68 65  esult = 0;.  Whe
4e10: 72 65 54 65 72 6d 20 2a 70 3b 0a 20 20 57 68 65  reTerm *p;.  Whe
4e20: 72 65 53 63 61 6e 20 73 63 61 6e 3b 0a 0a 20 20  reScan scan;..  
4e30: 70 20 3d 20 77 68 65 72 65 53 63 61 6e 49 6e 69  p = whereScanIni
4e40: 74 28 26 73 63 61 6e 2c 20 70 57 43 2c 20 69 43  t(&scan, pWC, iC
4e50: 75 72 2c 20 69 43 6f 6c 75 6d 6e 2c 20 6f 70 2c  ur, iColumn, op,
4e60: 20 70 49 64 78 29 3b 0a 20 20 77 68 69 6c 65 28   pIdx);.  while(
4e70: 20 70 20 29 7b 0a 20 20 20 20 69 66 28 20 28 70   p ){.    if( (p
4e80: 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20  ->prereqRight & 
4e90: 6e 6f 74 52 65 61 64 79 29 3d 3d 30 20 29 7b 0a  notReady)==0 ){.
4ea0: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 72 65        if( p->pre
4eb0: 72 65 71 52 69 67 68 74 3d 3d 30 20 26 26 20 28  reqRight==0 && (
4ec0: 70 2d 3e 65 4f 70 65 72 61 74 6f 72 26 57 4f 5f  p->eOperator&WO_
4ed0: 45 51 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  EQ)!=0 ){.      
4ee0: 20 20 72 65 74 75 72 6e 20 70 3b 0a 20 20 20 20    return p;.    
4ef0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 52    }.      if( pR
4f00: 65 73 75 6c 74 3d 3d 30 20 29 20 70 52 65 73 75  esult==0 ) pResu
4f10: 6c 74 20 3d 20 70 3b 0a 20 20 20 20 7d 0a 20 20  lt = p;.    }.  
4f20: 20 20 70 20 3d 20 77 68 65 72 65 53 63 61 6e 4e    p = whereScanN
4f30: 65 78 74 28 26 73 63 61 6e 29 3b 0a 20 20 7d 0a  ext(&scan);.  }.
4f40: 20 20 72 65 74 75 72 6e 20 70 52 65 73 75 6c 74    return pResult
4f50: 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20  ;.}../* Forward 
4f60: 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61  reference */.sta
4f70: 74 69 63 20 76 6f 69 64 20 65 78 70 72 41 6e 61  tic void exprAna
4f80: 6c 79 7a 65 28 53 72 63 4c 69 73 74 2a 2c 20 57  lyze(SrcList*, W
4f90: 68 65 72 65 43 6c 61 75 73 65 2a 2c 20 69 6e 74  hereClause*, int
4fa0: 29 3b 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 65  );../*.** Call e
4fb0: 78 70 72 41 6e 61 6c 79 7a 65 20 6f 6e 20 61 6c  xprAnalyze on al
4fc0: 6c 20 74 65 72 6d 73 20 69 6e 20 61 20 57 48 45  l terms in a WHE
4fd0: 52 45 20 63 6c 61 75 73 65 2e 20 20 0a 2a 2f 0a  RE clause.  .*/.
4fe0: 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 72  static void expr
4ff0: 41 6e 61 6c 79 7a 65 41 6c 6c 28 0a 20 20 53 72  AnalyzeAll(.  Sr
5000: 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c  cList *pTabList,
5010: 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20 46 52         /* the FR
5020: 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57  OM clause */.  W
5030: 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 20  hereClause *pWC 
5040: 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20 57          /* the W
5050: 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20 62  HERE clause to b
5060: 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 29 7b  e analyzed */.){
5070: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
5080: 69 3d 70 57 43 2d 3e 6e 54 65 72 6d 2d 31 3b 20  i=pWC->nTerm-1; 
5090: 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20  i>=0; i--){.    
50a0: 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 54 61 62  exprAnalyze(pTab
50b0: 4c 69 73 74 2c 20 70 57 43 2c 20 69 29 3b 0a 20  List, pWC, i);. 
50c0: 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51   }.}..#ifndef SQ
50d0: 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f  LITE_OMIT_LIKE_O
50e0: 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 2f 2a 0a 2a  PTIMIZATION./*.*
50f0: 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
5100: 66 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72  f the given expr
5110: 65 73 73 69 6f 6e 20 69 73 20 61 20 4c 49 4b 45  ession is a LIKE
5120: 20 6f 72 20 47 4c 4f 42 20 6f 70 65 72 61 74 6f   or GLOB operato
5130: 72 20 74 68 61 74 0a 2a 2a 20 63 61 6e 20 62 65  r that.** can be
5140: 20 6f 70 74 69 6d 69 7a 65 64 20 75 73 69 6e 67   optimized using
5150: 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73   inequality cons
5160: 74 72 61 69 6e 74 73 2e 20 20 52 65 74 75 72 6e  traints.  Return
5170: 20 54 52 55 45 20 69 66 20 69 74 20 69 73 0a 2a   TRUE if it is.*
5180: 2a 20 73 6f 20 61 6e 64 20 66 61 6c 73 65 20 69  * so and false i
5190: 66 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20  f not..**.** In 
51a0: 6f 72 64 65 72 20 66 6f 72 20 74 68 65 20 6f 70  order for the op
51b0: 65 72 61 74 6f 72 20 74 6f 20 62 65 20 6f 70 74  erator to be opt
51c0: 69 6d 69 7a 69 62 6c 65 2c 20 74 68 65 20 52 48  imizible, the RH
51d0: 53 20 6d 75 73 74 20 62 65 20 61 20 73 74 72 69  S must be a stri
51e0: 6e 67 0a 2a 2a 20 6c 69 74 65 72 61 6c 20 74 68  ng.** literal th
51f0: 61 74 20 64 6f 65 73 20 6e 6f 74 20 62 65 67 69  at does not begi
5200: 6e 20 77 69 74 68 20 61 20 77 69 6c 64 63 61 72  n with a wildcar
5210: 64 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69  d.  .*/.static i
5220: 6e 74 20 69 73 4c 69 6b 65 4f 72 47 6c 6f 62 28  nt isLikeOrGlob(
5230: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
5240: 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20  ,    /* Parsing 
5250: 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74  and code generat
5260: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
5270: 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20   Expr *pExpr,   
5280: 20 20 20 2f 2a 20 54 65 73 74 20 74 68 69 73 20     /* Test this 
5290: 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20  expression */.  
52a0: 45 78 70 72 20 2a 2a 70 70 50 72 65 66 69 78 2c  Expr **ppPrefix,
52b0: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
52c0: 54 4b 5f 53 54 52 49 4e 47 20 65 78 70 72 65 73  TK_STRING expres
52d0: 73 69 6f 6e 20 77 69 74 68 20 70 61 74 74 65 72  sion with patter
52e0: 6e 20 70 72 65 66 69 78 20 2a 2f 0a 20 20 69 6e  n prefix */.  in
52f0: 74 20 2a 70 69 73 43 6f 6d 70 6c 65 74 65 2c 20  t *pisComplete, 
5300: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 6f  /* True if the o
5310: 6e 6c 79 20 77 69 6c 64 63 61 72 64 20 69 73 20  nly wildcard is 
5320: 25 20 69 6e 20 74 68 65 20 6c 61 73 74 20 63 68  % in the last ch
5330: 61 72 61 63 74 65 72 20 2a 2f 0a 20 20 69 6e 74  aracter */.  int
5340: 20 2a 70 6e 6f 43 61 73 65 20 20 20 20 20 20 2f   *pnoCase      /
5350: 2a 20 54 72 75 65 20 69 66 20 75 70 70 65 72 63  * True if upperc
5360: 61 73 65 20 69 73 20 65 71 75 69 76 61 6c 65 6e  ase is equivalen
5370: 74 20 74 6f 20 6c 6f 77 65 72 63 61 73 65 20 2a  t to lowercase *
5380: 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  /.){.  const cha
5390: 72 20 2a 7a 20 3d 20 30 3b 20 20 20 20 20 20 20  r *z = 0;       
53a0: 20 20 2f 2a 20 53 74 72 69 6e 67 20 6f 6e 20 52    /* String on R
53b0: 48 53 20 6f 66 20 4c 49 4b 45 20 6f 70 65 72 61  HS of LIKE opera
53c0: 74 6f 72 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  tor */.  Expr *p
53d0: 52 69 67 68 74 2c 20 2a 70 4c 65 66 74 3b 20 20  Right, *pLeft;  
53e0: 20 20 20 20 2f 2a 20 52 69 67 68 74 20 61 6e 64      /* Right and
53f0: 20 6c 65 66 74 20 73 69 7a 65 20 6f 66 20 4c 49   left size of LI
5400: 4b 45 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  KE operator */. 
5410: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
5420: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c  ;           /* L
5430: 69 73 74 20 6f 66 20 6f 70 65 72 61 6e 64 73 20  ist of operands 
5440: 74 6f 20 74 68 65 20 4c 49 4b 45 20 6f 70 65 72  to the LIKE oper
5450: 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 63 3b  ator */.  int c;
5460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5470: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 63 68 61 72       /* One char
5480: 61 63 74 65 72 20 69 6e 20 7a 5b 5d 20 2a 2f 0a  acter in z[] */.
5490: 20 20 69 6e 74 20 63 6e 74 3b 20 20 20 20 20 20    int cnt;      
54a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
54b0: 4e 75 6d 62 65 72 20 6f 66 20 6e 6f 6e 2d 77 69  Number of non-wi
54c0: 6c 64 63 61 72 64 20 70 72 65 66 69 78 20 63 68  ldcard prefix ch
54d0: 61 72 61 63 74 65 72 73 20 2a 2f 0a 20 20 63 68  aracters */.  ch
54e0: 61 72 20 77 63 5b 33 5d 3b 20 20 20 20 20 20 20  ar wc[3];       
54f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 69 6c 64           /* Wild
5500: 63 61 72 64 20 63 68 61 72 61 63 74 65 72 73 20  card characters 
5510: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
5520: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20   = pParse->db;  
5530: 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
5540: 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69  ection */.  sqli
5550: 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 20  te3_value *pVal 
5560: 3d 20 30 3b 0a 20 20 69 6e 74 20 6f 70 3b 20 20  = 0;.  int op;  
5570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5580: 20 20 2f 2a 20 4f 70 63 6f 64 65 20 6f 66 20 70    /* Opcode of p
5590: 52 69 67 68 74 20 2a 2f 0a 0a 20 20 69 66 28 20  Right */..  if( 
55a0: 21 73 71 6c 69 74 65 33 49 73 4c 69 6b 65 46 75  !sqlite3IsLikeFu
55b0: 6e 63 74 69 6f 6e 28 64 62 2c 20 70 45 78 70 72  nction(db, pExpr
55c0: 2c 20 70 6e 6f 43 61 73 65 2c 20 77 63 29 20 29  , pnoCase, wc) )
55d0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
55e0: 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
55f0: 45 5f 45 42 43 44 49 43 0a 20 20 69 66 28 20 2a  E_EBCDIC.  if( *
5600: 70 6e 6f 43 61 73 65 20 29 20 72 65 74 75 72 6e  pnoCase ) return
5610: 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 70 4c 69   0;.#endif.  pLi
5620: 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c  st = pExpr->x.pL
5630: 69 73 74 3b 0a 20 20 70 4c 65 66 74 20 3d 20 70  ist;.  pLeft = p
5640: 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72  List->a[1].pExpr
5650: 3b 0a 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f  ;.  if( pLeft->o
5660: 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 0a 20 20  p!=TK_COLUMN .  
5670: 20 7c 7c 20 73 71 6c 69 74 65 33 45 78 70 72 41   || sqlite3ExprA
5680: 66 66 69 6e 69 74 79 28 70 4c 65 66 74 29 21 3d  ffinity(pLeft)!=
5690: 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20  SQLITE_AFF_TEXT 
56a0: 0a 20 20 20 7c 7c 20 49 73 56 69 72 74 75 61 6c  .   || IsVirtual
56b0: 28 70 4c 65 66 74 2d 3e 70 54 61 62 29 0a 20 20  (pLeft->pTab).  
56c0: 29 7b 0a 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52  ){.    /* IMP: R
56d0: 2d 30 32 30 36 35 2d 34 39 34 36 35 20 54 68 65  -02065-49465 The
56e0: 20 6c 65 66 74 2d 68 61 6e 64 20 73 69 64 65 20   left-hand side 
56f0: 6f 66 20 74 68 65 20 4c 49 4b 45 20 6f 72 20 47  of the LIKE or G
5700: 4c 4f 42 20 6f 70 65 72 61 74 6f 72 20 6d 75 73  LOB operator mus
5710: 74 0a 20 20 20 20 2a 2a 20 62 65 20 74 68 65 20  t.    ** be the 
5720: 6e 61 6d 65 20 6f 66 20 61 6e 20 69 6e 64 65 78  name of an index
5730: 65 64 20 63 6f 6c 75 6d 6e 20 77 69 74 68 20 54  ed column with T
5740: 45 58 54 20 61 66 66 69 6e 69 74 79 2e 20 2a 2f  EXT affinity. */
5750: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
5760: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4c 65   }.  assert( pLe
5770: 66 74 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 28 2d 31  ft->iColumn!=(-1
5780: 29 20 29 3b 20 2f 2a 20 42 65 63 61 75 73 65 20  ) ); /* Because 
5790: 49 50 4b 20 6e 65 76 65 72 20 68 61 73 20 41 46  IPK never has AF
57a0: 46 5f 54 45 58 54 20 2a 2f 0a 0a 20 20 70 52 69  F_TEXT */..  pRi
57b0: 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ght = sqlite3Exp
57c0: 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4c 69  rSkipCollate(pLi
57d0: 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b  st->a[0].pExpr);
57e0: 0a 20 20 6f 70 20 3d 20 70 52 69 67 68 74 2d 3e  .  op = pRight->
57f0: 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b  op;.  if( op==TK
5800: 5f 56 41 52 49 41 42 4c 45 20 29 7b 0a 20 20 20  _VARIABLE ){.   
5810: 20 56 64 62 65 20 2a 70 52 65 70 72 65 70 61 72   Vdbe *pReprepar
5820: 65 20 3d 20 70 50 61 72 73 65 2d 3e 70 52 65 70  e = pParse->pRep
5830: 72 65 70 61 72 65 3b 0a 20 20 20 20 69 6e 74 20  repare;.    int 
5840: 69 43 6f 6c 20 3d 20 70 52 69 67 68 74 2d 3e 69  iCol = pRight->i
5850: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 70 56 61 6c  Column;.    pVal
5860: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47 65   = sqlite3VdbeGe
5870: 74 42 6f 75 6e 64 56 61 6c 75 65 28 70 52 65 70  tBoundValue(pRep
5880: 72 65 70 61 72 65 2c 20 69 43 6f 6c 2c 20 53 51  repare, iCol, SQ
5890: 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 29 3b 0a  LITE_AFF_NONE);.
58a0: 20 20 20 20 69 66 28 20 70 56 61 6c 20 26 26 20      if( pVal && 
58b0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
58c0: 70 65 28 70 56 61 6c 29 3d 3d 53 51 4c 49 54 45  pe(pVal)==SQLITE
58d0: 5f 54 45 58 54 20 29 7b 0a 20 20 20 20 20 20 7a  _TEXT ){.      z
58e0: 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74   = (char *)sqlit
58f0: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 70 56  e3_value_text(pV
5900: 61 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  al);.    }.    s
5910: 71 6c 69 74 65 33 56 64 62 65 53 65 74 56 61 72  qlite3VdbeSetVar
5920: 6d 61 73 6b 28 70 50 61 72 73 65 2d 3e 70 56 64  mask(pParse->pVd
5930: 62 65 2c 20 69 43 6f 6c 29 3b 0a 20 20 20 20 61  be, iCol);.    a
5940: 73 73 65 72 74 28 20 70 52 69 67 68 74 2d 3e 6f  ssert( pRight->o
5950: 70 3d 3d 54 4b 5f 56 41 52 49 41 42 4c 45 20 7c  p==TK_VARIABLE |
5960: 7c 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b  | pRight->op==TK
5970: 5f 52 45 47 49 53 54 45 52 20 29 3b 0a 20 20 7d  _REGISTER );.  }
5980: 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  else if( op==TK_
5990: 53 54 52 49 4e 47 20 29 7b 0a 20 20 20 20 7a 20  STRING ){.    z 
59a0: 3d 20 70 52 69 67 68 74 2d 3e 75 2e 7a 54 6f 6b  = pRight->u.zTok
59b0: 65 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 20  en;.  }.  if( z 
59c0: 29 7b 0a 20 20 20 20 63 6e 74 20 3d 20 30 3b 0a  ){.    cnt = 0;.
59d0: 20 20 20 20 77 68 69 6c 65 28 20 28 63 3d 7a 5b      while( (c=z[
59e0: 63 6e 74 5d 29 21 3d 30 20 26 26 20 63 21 3d 77  cnt])!=0 && c!=w
59f0: 63 5b 30 5d 20 26 26 20 63 21 3d 77 63 5b 31 5d  c[0] && c!=wc[1]
5a00: 20 26 26 20 63 21 3d 77 63 5b 32 5d 20 29 7b 0a   && c!=wc[2] ){.
5a10: 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20        cnt++;.   
5a20: 20 7d 0a 20 20 20 20 69 66 28 20 63 6e 74 21 3d   }.    if( cnt!=
5a30: 30 20 26 26 20 32 35 35 21 3d 28 75 38 29 7a 5b  0 && 255!=(u8)z[
5a40: 63 6e 74 2d 31 5d 20 29 7b 0a 20 20 20 20 20 20  cnt-1] ){.      
5a50: 45 78 70 72 20 2a 70 50 72 65 66 69 78 3b 0a 20  Expr *pPrefix;. 
5a60: 20 20 20 20 20 2a 70 69 73 43 6f 6d 70 6c 65 74       *pisComplet
5a70: 65 20 3d 20 63 3d 3d 77 63 5b 30 5d 20 26 26 20  e = c==wc[0] && 
5a80: 7a 5b 63 6e 74 2b 31 5d 3d 3d 30 3b 0a 20 20 20  z[cnt+1]==0;.   
5a90: 20 20 20 70 50 72 65 66 69 78 20 3d 20 73 71 6c     pPrefix = sql
5aa0: 69 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f  ite3Expr(db, TK_
5ab0: 53 54 52 49 4e 47 2c 20 7a 29 3b 0a 20 20 20 20  STRING, z);.    
5ac0: 20 20 69 66 28 20 70 50 72 65 66 69 78 20 29 20    if( pPrefix ) 
5ad0: 70 50 72 65 66 69 78 2d 3e 75 2e 7a 54 6f 6b 65  pPrefix->u.zToke
5ae0: 6e 5b 63 6e 74 5d 20 3d 20 30 3b 0a 20 20 20 20  n[cnt] = 0;.    
5af0: 20 20 2a 70 70 50 72 65 66 69 78 20 3d 20 70 50    *ppPrefix = pP
5b00: 72 65 66 69 78 3b 0a 20 20 20 20 20 20 69 66 28  refix;.      if(
5b10: 20 6f 70 3d 3d 54 4b 5f 56 41 52 49 41 42 4c 45   op==TK_VARIABLE
5b20: 20 29 7b 0a 20 20 20 20 20 20 20 20 56 64 62 65   ){.        Vdbe
5b30: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
5b40: 64 62 65 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  dbe;.        sql
5b50: 69 74 65 33 56 64 62 65 53 65 74 56 61 72 6d 61  ite3VdbeSetVarma
5b60: 73 6b 28 76 2c 20 70 52 69 67 68 74 2d 3e 69 43  sk(v, pRight->iC
5b70: 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 20 20  olumn);.        
5b80: 69 66 28 20 2a 70 69 73 43 6f 6d 70 6c 65 74 65  if( *pisComplete
5b90: 20 26 26 20 70 52 69 67 68 74 2d 3e 75 2e 7a 54   && pRight->u.zT
5ba0: 6f 6b 65 6e 5b 31 5d 20 29 7b 0a 20 20 20 20 20  oken[1] ){.     
5bb0: 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 72       /* If the r
5bc0: 68 73 20 6f 66 20 74 68 65 20 4c 49 4b 45 20 65  hs of the LIKE e
5bd0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 76  xpression is a v
5be0: 61 72 69 61 62 6c 65 2c 20 61 6e 64 20 74 68 65  ariable, and the
5bf0: 20 63 75 72 72 65 6e 74 0a 20 20 20 20 20 20 20   current.       
5c00: 20 20 20 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74     ** value of t
5c10: 68 65 20 76 61 72 69 61 62 6c 65 20 6d 65 61 6e  he variable mean
5c20: 73 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65  s there is no ne
5c30: 65 64 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65  ed to invoke the
5c40: 20 4c 49 4b 45 0a 20 20 20 20 20 20 20 20 20 20   LIKE.          
5c50: 2a 2a 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65  ** function, the
5c60: 6e 20 6e 6f 20 4f 50 5f 56 61 72 69 61 62 6c 65  n no OP_Variable
5c70: 20 77 69 6c 6c 20 62 65 20 61 64 64 65 64 20 74   will be added t
5c80: 6f 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 0a 20  o the program.. 
5c90: 20 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73           ** This
5ca0: 20 63 61 75 73 65 73 20 70 72 6f 62 6c 65 6d 73   causes problems
5cb0: 20 66 6f 72 20 74 68 65 20 73 71 6c 69 74 65 33   for the sqlite3
5cc0: 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f  _bind_parameter_
5cd0: 6e 61 6d 65 28 29 0a 20 20 20 20 20 20 20 20 20  name().         
5ce0: 20 2a 2a 20 41 50 49 2e 20 54 6f 20 77 6f 72 6b   ** API. To work
5cf0: 20 61 72 6f 75 6e 64 20 74 68 65 6d 2c 20 61 64   around them, ad
5d00: 64 20 61 20 64 75 6d 6d 79 20 4f 50 5f 56 61 72  d a dummy OP_Var
5d10: 69 61 62 6c 65 20 68 65 72 65 2e 0a 20 20 20 20  iable here..    
5d20: 20 20 20 20 20 20 2a 2f 20 0a 20 20 20 20 20 20        */ .      
5d30: 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c      int r1 = sql
5d40: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
5d50: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
5d60: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
5d70: 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20  eTarget(pParse, 
5d80: 70 52 69 67 68 74 2c 20 72 31 29 3b 0a 20 20 20  pRight, r1);.   
5d90: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
5da0: 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 73 71  beChangeP3(v, sq
5db0: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
5dc0: 41 64 64 72 28 76 29 2d 31 2c 20 30 29 3b 0a 20  Addr(v)-1, 0);. 
5dd0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
5de0: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
5df0: 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20  Parse, r1);.    
5e00: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
5e10: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a    }else{.      z
5e20: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
5e30: 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46  .  sqlite3ValueF
5e40: 72 65 65 28 70 56 61 6c 29 3b 0a 20 20 72 65 74  ree(pVal);.  ret
5e50: 75 72 6e 20 28 7a 21 3d 30 29 3b 0a 7d 0a 23 65  urn (z!=0);.}.#e
5e60: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
5e70: 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a  MIT_LIKE_OPTIMIZ
5e80: 41 54 49 4f 4e 20 2a 2f 0a 0a 0a 23 69 66 6e 64  ATION */...#ifnd
5e90: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
5ea0: 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a  IRTUALTABLE./*.*
5eb0: 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
5ec0: 66 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72  f the given expr
5ed0: 65 73 73 69 6f 6e 20 69 73 20 6f 66 20 74 68 65  ession is of the
5ee0: 20 66 6f 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20   form.**.**     
5ef0: 20 20 20 20 63 6f 6c 75 6d 6e 20 4d 41 54 43 48      column MATCH
5f00: 20 65 78 70 72 0a 2a 2a 0a 2a 2a 20 49 66 20 69   expr.**.** If i
5f10: 74 20 69 73 20 74 68 65 6e 20 72 65 74 75 72 6e  t is then return
5f20: 20 54 52 55 45 2e 20 20 49 66 20 6e 6f 74 2c 20   TRUE.  If not, 
5f30: 72 65 74 75 72 6e 20 46 41 4c 53 45 2e 0a 2a 2f  return FALSE..*/
5f40: 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73 4d 61  .static int isMa
5f50: 74 63 68 4f 66 43 6f 6c 75 6d 6e 28 0a 20 20 45  tchOfColumn(.  E
5f60: 78 70 72 20 2a 70 45 78 70 72 20 20 20 20 20 20  xpr *pExpr      
5f70: 2f 2a 20 54 65 73 74 20 74 68 69 73 20 65 78 70  /* Test this exp
5f80: 72 65 73 73 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20  ression */.){.  
5f90: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b  ExprList *pList;
5fa0: 0a 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  ..  if( pExpr->o
5fb0: 70 21 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 29  p!=TK_FUNCTION )
5fc0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
5fd0: 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65    }.  if( sqlite
5fe0: 33 53 74 72 49 43 6d 70 28 70 45 78 70 72 2d 3e  3StrICmp(pExpr->
5ff0: 75 2e 7a 54 6f 6b 65 6e 2c 22 6d 61 74 63 68 22  u.zToken,"match"
6000: 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  )!=0 ){.    retu
6010: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4c 69 73  rn 0;.  }.  pLis
6020: 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  t = pExpr->x.pLi
6030: 73 74 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 2d  st;.  if( pList-
6040: 3e 6e 45 78 70 72 21 3d 32 20 29 7b 0a 20 20 20  >nExpr!=2 ){.   
6050: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
6060: 20 69 66 28 20 70 4c 69 73 74 2d 3e 61 5b 31 5d   if( pList->a[1]
6070: 2e 70 45 78 70 72 2d 3e 6f 70 20 21 3d 20 54 4b  .pExpr->op != TK
6080: 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 72  _COLUMN ){.    r
6090: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72  eturn 0;.  }.  r
60a0: 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69  eturn 1;.}.#endi
60b0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
60c0: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f  _VIRTUALTABLE */
60d0: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ../*.** If the p
60e0: 42 61 73 65 20 65 78 70 72 65 73 73 69 6f 6e 20  Base expression 
60f0: 6f 72 69 67 69 6e 61 74 65 64 20 69 6e 20 74 68  originated in th
6100: 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c  e ON or USING cl
6110: 61 75 73 65 20 6f 66 0a 2a 2a 20 61 20 6a 6f 69  ause of.** a joi
6120: 6e 2c 20 74 68 65 6e 20 74 72 61 6e 73 66 65 72  n, then transfer
6130: 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
6140: 20 6d 61 72 6b 69 6e 67 73 20 6f 76 65 72 20 74   markings over t
6150: 6f 20 64 65 72 69 76 65 64 2e 0a 2a 2f 0a 73 74  o derived..*/.st
6160: 61 74 69 63 20 76 6f 69 64 20 74 72 61 6e 73 66  atic void transf
6170: 65 72 4a 6f 69 6e 4d 61 72 6b 69 6e 67 73 28 45  erJoinMarkings(E
6180: 78 70 72 20 2a 70 44 65 72 69 76 65 64 2c 20 45  xpr *pDerived, E
6190: 78 70 72 20 2a 70 42 61 73 65 29 7b 0a 20 20 69  xpr *pBase){.  i
61a0: 66 28 20 70 44 65 72 69 76 65 64 20 29 7b 0a 20  f( pDerived ){. 
61b0: 20 20 20 70 44 65 72 69 76 65 64 2d 3e 66 6c 61     pDerived->fla
61c0: 67 73 20 7c 3d 20 70 42 61 73 65 2d 3e 66 6c 61  gs |= pBase->fla
61d0: 67 73 20 26 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  gs & EP_FromJoin
61e0: 3b 0a 20 20 20 20 70 44 65 72 69 76 65 64 2d 3e  ;.    pDerived->
61f0: 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20  iRightJoinTable 
6200: 3d 20 70 42 61 73 65 2d 3e 69 52 69 67 68 74 4a  = pBase->iRightJ
6210: 6f 69 6e 54 61 62 6c 65 3b 0a 20 20 7d 0a 7d 0a  oinTable;.  }.}.
6220: 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 74 65 72 6d  ./*.** Mark term
6230: 20 69 43 68 69 6c 64 20 61 73 20 62 65 69 6e 67   iChild as being
6240: 20 61 20 63 68 69 6c 64 20 6f 66 20 74 65 72 6d   a child of term
6250: 20 69 50 61 72 65 6e 74 0a 2a 2f 0a 73 74 61 74   iParent.*/.stat
6260: 69 63 20 76 6f 69 64 20 6d 61 72 6b 54 65 72 6d  ic void markTerm
6270: 41 73 43 68 69 6c 64 28 57 68 65 72 65 43 6c 61  AsChild(WhereCla
6280: 75 73 65 20 2a 70 57 43 2c 20 69 6e 74 20 69 43  use *pWC, int iC
6290: 68 69 6c 64 2c 20 69 6e 74 20 69 50 61 72 65 6e  hild, int iParen
62a0: 74 29 7b 0a 20 20 70 57 43 2d 3e 61 5b 69 43 68  t){.  pWC->a[iCh
62b0: 69 6c 64 5d 2e 69 50 61 72 65 6e 74 20 3d 20 69  ild].iParent = i
62c0: 50 61 72 65 6e 74 3b 0a 20 20 70 57 43 2d 3e 61  Parent;.  pWC->a
62d0: 5b 69 43 68 69 6c 64 5d 2e 74 72 75 74 68 50 72  [iChild].truthPr
62e0: 6f 62 20 3d 20 70 57 43 2d 3e 61 5b 69 50 61 72  ob = pWC->a[iPar
62f0: 65 6e 74 5d 2e 74 72 75 74 68 50 72 6f 62 3b 0a  ent].truthProb;.
6300: 20 20 70 57 43 2d 3e 61 5b 69 50 61 72 65 6e 74    pWC->a[iParent
6310: 5d 2e 6e 43 68 69 6c 64 2b 2b 3b 0a 7d 0a 0a 23  ].nChild++;.}..#
6320: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
6330: 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d  TE_OMIT_OR_OPTIM
6340: 49 5a 41 54 49 4f 4e 29 20 26 26 20 21 64 65 66  IZATION) && !def
6350: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
6360: 5f 53 55 42 51 55 45 52 59 29 0a 2f 2a 0a 2a 2a  _SUBQUERY)./*.**
6370: 20 41 6e 61 6c 79 7a 65 20 61 20 74 65 72 6d 20   Analyze a term 
6380: 74 68 61 74 20 63 6f 6e 73 69 73 74 73 20 6f 66  that consists of
6390: 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 4f 52 2d   two or more OR-
63a0: 63 6f 6e 6e 65 63 74 65 64 0a 2a 2a 20 73 75 62  connected.** sub
63b0: 74 65 72 6d 73 2e 20 20 53 6f 20 69 6e 3a 0a 2a  terms.  So in:.*
63c0: 2a 0a 2a 2a 20 20 20 20 20 2e 2e 2e 20 57 48 45  *.**     ... WHE
63d0: 52 45 20 20 28 61 3d 35 29 20 41 4e 44 20 28 62  RE  (a=5) AND (b
63e0: 3d 37 20 4f 52 20 63 3d 39 20 4f 52 20 64 3d 31  =7 OR c=9 OR d=1
63f0: 33 29 20 41 4e 44 20 28 64 3d 31 33 29 0a 2a 2a  3) AND (d=13).**
6400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6410: 20 20 20 20 20 20 20 20 20 20 5e 5e 5e 5e 5e 5e            ^^^^^^
6420: 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 0a 2a  ^^^^^^^^^^^^^^.*
6430: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
6440: 65 20 61 6e 61 6c 79 7a 65 73 20 74 65 72 6d 73  e analyzes terms
6450: 20 73 75 63 68 20 61 73 20 74 68 65 20 6d 69 64   such as the mid
6460: 64 6c 65 20 74 65 72 6d 20 69 6e 20 74 68 65 20  dle term in the 
6470: 61 62 6f 76 65 20 65 78 61 6d 70 6c 65 2e 0a 2a  above example..*
6480: 2a 20 41 20 57 68 65 72 65 4f 72 54 65 72 6d 20  * A WhereOrTerm 
6490: 6f 62 6a 65 63 74 20 69 73 20 63 6f 6d 70 75 74  object is comput
64a0: 65 64 20 61 6e 64 20 61 74 74 61 63 68 65 64 20  ed and attached 
64b0: 74 6f 20 74 68 65 20 74 65 72 6d 20 75 6e 64 65  to the term unde
64c0: 72 0a 2a 2a 20 61 6e 61 6c 79 73 69 73 2c 20 72  r.** analysis, r
64d0: 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65  egardless of the
64e0: 20 6f 75 74 63 6f 6d 65 20 6f 66 20 74 68 65 20   outcome of the 
64f0: 61 6e 61 6c 79 73 69 73 2e 20 20 48 65 6e 63 65  analysis.  Hence
6500: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 57 68 65 72  :.**.**     Wher
6510: 65 54 65 72 6d 2e 77 74 46 6c 61 67 73 20 20 20  eTerm.wtFlags   
6520: 7c 3d 20 20 54 45 52 4d 5f 4f 52 49 4e 46 4f 0a  |=  TERM_ORINFO.
6530: 2a 2a 20 20 20 20 20 57 68 65 72 65 54 65 72 6d  **     WhereTerm
6540: 2e 75 2e 70 4f 72 49 6e 66 6f 20 20 3d 20 20 61  .u.pOrInfo  =  a
6550: 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c   dynamically all
6560: 6f 63 61 74 65 64 20 57 68 65 72 65 4f 72 54 65  ocated WhereOrTe
6570: 72 6d 20 6f 62 6a 65 63 74 0a 2a 2a 0a 2a 2a 20  rm object.**.** 
6580: 54 68 65 20 74 65 72 6d 20 62 65 69 6e 67 20 61  The term being a
6590: 6e 61 6c 79 7a 65 64 20 6d 75 73 74 20 68 61 76  nalyzed must hav
65a0: 65 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 6f 66  e two or more of
65b0: 20 4f 52 2d 63 6f 6e 6e 65 63 74 65 64 20 73 75   OR-connected su
65c0: 62 74 65 72 6d 73 2e 0a 2a 2a 20 41 20 73 69 6e  bterms..** A sin
65d0: 67 6c 65 20 73 75 62 74 65 72 6d 20 6d 69 67 68  gle subterm migh
65e0: 74 20 62 65 20 61 20 73 65 74 20 6f 66 20 41 4e  t be a set of AN
65f0: 44 2d 63 6f 6e 6e 65 63 74 65 64 20 73 75 62 2d  D-connected sub-
6600: 73 75 62 74 65 72 6d 73 2e 0a 2a 2a 20 45 78 61  subterms..** Exa
6610: 6d 70 6c 65 73 20 6f 66 20 74 65 72 6d 73 20 75  mples of terms u
6620: 6e 64 65 72 20 61 6e 61 6c 79 73 69 73 3a 0a 2a  nder analysis:.*
6630: 2a 0a 2a 2a 20 20 20 20 20 28 41 29 20 20 20 20  *.**     (A)    
6640: 20 74 31 2e 78 3d 74 32 2e 79 20 4f 52 20 74 31   t1.x=t2.y OR t1
6650: 2e 78 3d 74 32 2e 7a 20 4f 52 20 74 31 2e 79 3d  .x=t2.z OR t1.y=
6660: 31 35 20 4f 52 20 74 31 2e 7a 3d 74 33 2e 61 2b  15 OR t1.z=t3.a+
6670: 35 0a 2a 2a 20 20 20 20 20 28 42 29 20 20 20 20  5.**     (B)    
6680: 20 78 3d 65 78 70 72 31 20 4f 52 20 65 78 70 72   x=expr1 OR expr
6690: 32 3d 78 20 4f 52 20 78 3d 65 78 70 72 33 0a 2a  2=x OR x=expr3.*
66a0: 2a 20 20 20 20 20 28 43 29 20 20 20 20 20 74 31  *     (C)     t1
66b0: 2e 78 3d 74 32 2e 79 20 4f 52 20 28 74 31 2e 78  .x=t2.y OR (t1.x
66c0: 3d 74 32 2e 7a 20 41 4e 44 20 74 31 2e 79 3d 31  =t2.z AND t1.y=1
66d0: 35 29 0a 2a 2a 20 20 20 20 20 28 44 29 20 20 20  5).**     (D)   
66e0: 20 20 78 3d 65 78 70 72 31 20 4f 52 20 28 79 3e    x=expr1 OR (y>
66f0: 31 31 20 41 4e 44 20 79 3c 32 32 20 41 4e 44 20  11 AND y<22 AND 
6700: 7a 20 4c 49 4b 45 20 27 2a 68 65 6c 6c 6f 2a 27  z LIKE '*hello*'
6710: 29 0a 2a 2a 20 20 20 20 20 28 45 29 20 20 20 20  ).**     (E)    
6720: 20 28 70 2e 61 3d 31 20 41 4e 44 20 71 2e 62 3d   (p.a=1 AND q.b=
6730: 32 20 41 4e 44 20 72 2e 63 3d 33 29 20 4f 52 20  2 AND r.c=3) OR 
6740: 28 70 2e 78 3d 34 20 41 4e 44 20 71 2e 79 3d 35  (p.x=4 AND q.y=5
6750: 20 41 4e 44 20 72 2e 7a 3d 36 29 0a 2a 2a 0a 2a   AND r.z=6).**.*
6760: 2a 20 43 41 53 45 20 31 3a 0a 2a 2a 0a 2a 2a 20  * CASE 1:.**.** 
6770: 49 66 20 61 6c 6c 20 73 75 62 74 65 72 6d 73 20  If all subterms 
6780: 61 72 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  are of the form 
6790: 54 2e 43 3d 65 78 70 72 20 66 6f 72 20 73 6f 6d  T.C=expr for som
67a0: 65 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20  e single column 
67b0: 6f 66 20 43 20 61 6e 64 0a 2a 2a 20 61 20 73 69  of C and.** a si
67c0: 6e 67 6c 65 20 74 61 62 6c 65 20 54 20 28 61 73  ngle table T (as
67d0: 20 73 68 6f 77 6e 20 69 6e 20 65 78 61 6d 70 6c   shown in exampl
67e0: 65 20 42 20 61 62 6f 76 65 29 20 74 68 65 6e 20  e B above) then 
67f0: 63 72 65 61 74 65 20 61 20 6e 65 77 20 76 69 72  create a new vir
6800: 74 75 61 6c 0a 2a 2a 20 74 65 72 6d 20 74 68 61  tual.** term tha
6810: 74 20 69 73 20 61 6e 20 65 71 75 69 76 61 6c 65  t is an equivale
6820: 6e 74 20 49 4e 20 65 78 70 72 65 73 73 69 6f 6e  nt IN expression
6830: 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
6840: 73 2c 20 69 66 20 74 68 65 20 74 65 72 6d 0a 2a  s, if the term.*
6850: 2a 20 62 65 69 6e 67 20 61 6e 61 6c 79 7a 65 64  * being analyzed
6860: 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20   is:.**.**      
6870: 78 20 3d 20 65 78 70 72 31 20 20 4f 52 20 20 65  x = expr1  OR  e
6880: 78 70 72 32 20 3d 20 78 20 20 4f 52 20 20 78 20  xpr2 = x  OR  x 
6890: 3d 20 65 78 70 72 33 0a 2a 2a 0a 2a 2a 20 74 68  = expr3.**.** th
68a0: 65 6e 20 63 72 65 61 74 65 20 61 20 6e 65 77 20  en create a new 
68b0: 76 69 72 74 75 61 6c 20 74 65 72 6d 20 6c 69 6b  virtual term lik
68c0: 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  e this:.**.**   
68d0: 20 20 20 78 20 49 4e 20 28 65 78 70 72 31 2c 65     x IN (expr1,e
68e0: 78 70 72 32 2c 65 78 70 72 33 29 0a 2a 2a 0a 2a  xpr2,expr3).**.*
68f0: 2a 20 43 41 53 45 20 32 3a 0a 2a 2a 0a 2a 2a 20  * CASE 2:.**.** 
6900: 49 66 20 61 6c 6c 20 73 75 62 74 65 72 6d 73 20  If all subterms 
6910: 61 72 65 20 69 6e 64 65 78 61 62 6c 65 20 62 79  are indexable by
6920: 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20   a single table 
6930: 54 2c 20 74 68 65 6e 20 73 65 74 0a 2a 2a 0a 2a  T, then set.**.*
6940: 2a 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 2e  *     WhereTerm.
6950: 65 4f 70 65 72 61 74 6f 72 20 20 20 20 20 20 20  eOperator       
6960: 20 20 20 20 20 20 20 3d 20 20 57 4f 5f 4f 52 0a         =  WO_OR.
6970: 2a 2a 20 20 20 20 20 57 68 65 72 65 54 65 72 6d  **     WhereTerm
6980: 2e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 69 6e 64 65  .u.pOrInfo->inde
6990: 78 61 62 6c 65 20 20 7c 3d 20 20 74 68 65 20 63  xable  |=  the c
69a0: 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72  ursor number for
69b0: 20 74 61 62 6c 65 20 54 0a 2a 2a 0a 2a 2a 20 41   table T.**.** A
69c0: 20 73 75 62 74 65 72 6d 20 69 73 20 22 69 6e 64   subterm is "ind
69d0: 65 78 61 62 6c 65 22 20 69 66 20 69 74 20 69 73  exable" if it is
69e0: 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a 2a 2a 20   of the form.** 
69f0: 22 54 2e 43 20 3c 6f 70 3e 20 3c 65 78 70 72 3e  "T.C <op> <expr>
6a00: 22 20 77 68 65 72 65 20 43 20 69 73 20 61 6e 79  " where C is any
6a10: 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65   column of table
6a20: 20 54 20 61 6e 64 20 0a 2a 2a 20 3c 6f 70 3e 20   T and .** <op> 
6a30: 69 73 20 6f 6e 65 20 6f 66 20 22 3d 22 2c 20 22  is one of "=", "
6a40: 3c 22 2c 20 22 3c 3d 22 2c 20 22 3e 22 2c 20 22  <", "<=", ">", "
6a50: 3e 3d 22 2c 20 22 49 53 20 4e 55 4c 4c 22 2c 20  >=", "IS NULL", 
6a60: 6f 72 20 22 49 4e 22 2e 0a 2a 2a 20 41 20 73 75  or "IN"..** A su
6a70: 62 74 65 72 6d 20 69 73 20 61 6c 73 6f 20 69 6e  bterm is also in
6a80: 64 65 78 61 62 6c 65 20 69 66 20 69 74 20 69 73  dexable if it is
6a90: 20 61 6e 20 41 4e 44 20 6f 66 20 74 77 6f 20 6f   an AND of two o
6aa0: 72 20 6d 6f 72 65 0a 2a 2a 20 73 75 62 73 75 62  r more.** subsub
6ab0: 74 65 72 6d 73 20 61 74 20 6c 65 61 73 74 20 6f  terms at least o
6ac0: 6e 65 20 6f 66 20 77 68 69 63 68 20 69 73 20 69  ne of which is i
6ad0: 6e 64 65 78 61 62 6c 65 2e 20 20 49 6e 64 65 78  ndexable.  Index
6ae0: 61 62 6c 65 20 41 4e 44 20 0a 2a 2a 20 73 75 62  able AND .** sub
6af0: 74 65 72 6d 73 20 68 61 76 65 20 74 68 65 69 72  terms have their
6b00: 20 65 4f 70 65 72 61 74 6f 72 20 73 65 74 20 74   eOperator set t
6b10: 6f 20 57 4f 5f 41 4e 44 20 61 6e 64 20 74 68 65  o WO_AND and the
6b20: 79 20 68 61 76 65 0a 2a 2a 20 75 2e 70 41 6e 64  y have.** u.pAnd
6b30: 49 6e 66 6f 20 73 65 74 20 74 6f 20 61 20 64 79  Info set to a dy
6b40: 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61  namically alloca
6b50: 74 65 64 20 57 68 65 72 65 41 6e 64 54 65 72 6d  ted WhereAndTerm
6b60: 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 46   object..**.** F
6b70: 72 6f 6d 20 61 6e 6f 74 68 65 72 20 70 6f 69 6e  rom another poin
6b80: 74 20 6f 66 20 76 69 65 77 2c 20 22 69 6e 64 65  t of view, "inde
6b90: 78 61 62 6c 65 22 20 6d 65 61 6e 73 20 74 68 61  xable" means tha
6ba0: 74 20 74 68 65 20 73 75 62 74 65 72 6d 20 63 6f  t the subterm co
6bb0: 75 6c 64 0a 2a 2a 20 70 6f 74 65 6e 74 69 61 6c  uld.** potential
6bc0: 6c 79 20 62 65 20 75 73 65 64 20 77 69 74 68 20  ly be used with 
6bd0: 61 6e 20 69 6e 64 65 78 20 69 66 20 61 6e 20 61  an index if an a
6be0: 70 70 72 6f 70 72 69 61 74 65 20 69 6e 64 65 78  ppropriate index
6bf0: 20 65 78 69 73 74 73 2e 0a 2a 2a 20 54 68 69 73   exists..** This
6c00: 20 61 6e 61 6c 79 73 69 73 20 64 6f 65 73 20 6e   analysis does n
6c10: 6f 74 20 63 6f 6e 73 69 64 65 72 20 77 68 65 74  ot consider whet
6c20: 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 69  her or not the i
6c30: 6e 64 65 78 20 65 78 69 73 74 73 3b 20 74 68 61  ndex exists; tha
6c40: 74 0a 2a 2a 20 69 73 20 64 65 63 69 64 65 64 20  t.** is decided 
6c50: 65 6c 73 65 77 68 65 72 65 2e 20 20 54 68 69 73  elsewhere.  This
6c60: 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 20 6c   analysis only l
6c70: 6f 6f 6b 73 20 61 74 20 77 68 65 74 68 65 72 20  ooks at whether 
6c80: 73 75 62 74 65 72 6d 73 0a 2a 2a 20 61 70 70 72  subterms.** appr
6c90: 6f 70 72 69 61 74 65 20 66 6f 72 20 69 6e 64 65  opriate for inde
6ca0: 78 69 6e 67 20 65 78 69 73 74 2e 0a 2a 2a 0a 2a  xing exist..**.*
6cb0: 2a 20 41 6c 6c 20 65 78 61 6d 70 6c 65 73 20 41  * All examples A
6cc0: 20 74 68 72 6f 75 67 68 20 45 20 61 62 6f 76 65   through E above
6cd0: 20 73 61 74 69 73 66 79 20 63 61 73 65 20 32 2e   satisfy case 2.
6ce0: 20 20 42 75 74 20 69 66 20 61 20 74 65 72 6d 0a    But if a term.
6cf0: 2a 2a 20 61 6c 73 6f 20 73 61 74 69 73 66 69 65  ** also satisfie
6d00: 73 20 63 61 73 65 20 31 20 28 73 75 63 68 20 61  s case 1 (such a
6d10: 73 20 42 29 20 77 65 20 6b 6e 6f 77 20 74 68 61  s B) we know tha
6d20: 74 20 74 68 65 20 6f 70 74 69 6d 69 7a 65 72 20  t the optimizer 
6d30: 77 69 6c 6c 0a 2a 2a 20 61 6c 77 61 79 73 20 70  will.** always p
6d40: 72 65 66 65 72 20 63 61 73 65 20 31 2c 20 73 6f  refer case 1, so
6d50: 20 69 6e 20 74 68 61 74 20 63 61 73 65 20 77 65   in that case we
6d60: 20 70 72 65 74 65 6e 64 20 74 68 61 74 20 63 61   pretend that ca
6d70: 73 65 20 32 20 69 73 20 6e 6f 74 0a 2a 2a 20 73  se 2 is not.** s
6d80: 61 74 69 73 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20  atisfied..**.** 
6d90: 49 74 20 6d 69 67 68 74 20 62 65 20 74 68 65 20  It might be the 
6da0: 63 61 73 65 20 74 68 61 74 20 6d 75 6c 74 69 70  case that multip
6db0: 6c 65 20 74 61 62 6c 65 73 20 61 72 65 20 69 6e  le tables are in
6dc0: 64 65 78 61 62 6c 65 2e 20 20 46 6f 72 20 65 78  dexable.  For ex
6dd0: 61 6d 70 6c 65 2c 0a 2a 2a 20 28 45 29 20 61 62  ample,.** (E) ab
6de0: 6f 76 65 20 69 73 20 69 6e 64 65 78 61 62 6c 65  ove is indexable
6df0: 20 6f 6e 20 74 61 62 6c 65 73 20 50 2c 20 51 2c   on tables P, Q,
6e00: 20 61 6e 64 20 52 2e 0a 2a 2a 0a 2a 2a 20 54 65   and R..**.** Te
6e10: 72 6d 73 20 74 68 61 74 20 73 61 74 69 73 66 79  rms that satisfy
6e20: 20 63 61 73 65 20 32 20 61 72 65 20 63 61 6e 64   case 2 are cand
6e30: 69 64 61 74 65 73 20 66 6f 72 20 6c 6f 6f 6b 75  idates for looku
6e40: 70 20 62 79 20 75 73 69 6e 67 0a 2a 2a 20 73 65  p by using.** se
6e50: 70 61 72 61 74 65 20 69 6e 64 69 63 65 73 20 74  parate indices t
6e60: 6f 20 66 69 6e 64 20 72 6f 77 69 64 73 20 66 6f  o find rowids fo
6e70: 72 20 65 61 63 68 20 73 75 62 74 65 72 6d 20 61  r each subterm a
6e80: 6e 64 20 63 6f 6d 70 6f 73 69 6e 67 0a 2a 2a 20  nd composing.** 
6e90: 74 68 65 20 75 6e 69 6f 6e 20 6f 66 20 61 6c 6c  the union of all
6ea0: 20 72 6f 77 69 64 73 20 75 73 69 6e 67 20 61 20   rowids using a 
6eb0: 52 6f 77 53 65 74 20 6f 62 6a 65 63 74 2e 20 20  RowSet object.  
6ec0: 54 68 69 73 20 69 73 20 73 69 6d 69 6c 61 72 0a  This is similar.
6ed0: 2a 2a 20 74 6f 20 22 62 69 74 6d 61 70 20 69 6e  ** to "bitmap in
6ee0: 64 69 63 65 73 22 20 69 6e 20 6f 74 68 65 72 20  dices" in other 
6ef0: 64 61 74 61 62 61 73 65 20 65 6e 67 69 6e 65 73  database engines
6f00: 2e 0a 2a 2a 0a 2a 2a 20 4f 54 48 45 52 57 49 53  ..**.** OTHERWIS
6f10: 45 3a 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 65 69 74  E:.**.** If neit
6f20: 68 65 72 20 63 61 73 65 20 31 20 6e 6f 72 20 63  her case 1 nor c
6f30: 61 73 65 20 32 20 61 70 70 6c 79 2c 20 74 68 65  ase 2 apply, the
6f40: 6e 20 6c 65 61 76 65 20 74 68 65 20 65 4f 70 65  n leave the eOpe
6f50: 72 61 74 6f 72 20 73 65 74 20 74 6f 0a 2a 2a 20  rator set to.** 
6f60: 7a 65 72 6f 2e 20 20 54 68 69 73 20 74 65 72 6d  zero.  This term
6f70: 20 69 73 20 6e 6f 74 20 75 73 65 66 75 6c 20 66   is not useful f
6f80: 6f 72 20 73 65 61 72 63 68 2e 0a 2a 2f 0a 73 74  or search..*/.st
6f90: 61 74 69 63 20 76 6f 69 64 20 65 78 70 72 41 6e  atic void exprAn
6fa0: 61 6c 79 7a 65 4f 72 54 65 72 6d 28 0a 20 20 53  alyzeOrTerm(.  S
6fb0: 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20  rcList *pSrc,   
6fc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20           /* the 
6fd0: 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20  FROM clause */. 
6fe0: 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
6ff0: 43 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68  C,         /* th
7000: 65 20 63 6f 6d 70 6c 65 74 65 20 57 48 45 52 45  e complete WHERE
7010: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74   clause */.  int
7020: 20 69 64 78 54 65 72 6d 20 20 20 20 20 20 20 20   idxTerm        
7030: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
7040: 6f 66 20 74 68 65 20 4f 52 2d 74 65 72 6d 20 74  of the OR-term t
7050: 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f  o be analyzed */
7060: 0a 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20  .){.  WhereInfo 
7070: 2a 70 57 49 6e 66 6f 20 3d 20 70 57 43 2d 3e 70  *pWInfo = pWC->p
7080: 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 2f 2a  WInfo;        /*
7090: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 70 72   WHERE clause pr
70a0: 6f 63 65 73 73 69 6e 67 20 63 6f 6e 74 65 78 74  ocessing context
70b0: 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61   */.  Parse *pPa
70c0: 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50  rse = pWInfo->pP
70d0: 61 72 73 65 3b 20 20 20 20 20 20 20 20 20 2f 2a  arse;         /*
70e0: 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20   Parser context 
70f0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
7100: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20   = pParse->db;  
7110: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7120: 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
7130: 69 6f 6e 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  ion */.  WhereTe
7140: 72 6d 20 2a 70 54 65 72 6d 20 3d 20 26 70 57 43  rm *pTerm = &pWC
7150: 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 20 20 20  ->a[idxTerm];   
7160: 20 2f 2a 20 54 68 65 20 74 65 72 6d 20 74 6f 20   /* The term to 
7170: 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20  be analyzed */. 
7180: 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70   Expr *pExpr = p
7190: 54 65 72 6d 2d 3e 70 45 78 70 72 3b 20 20 20 20  Term->pExpr;    
71a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
71b0: 65 78 70 72 65 73 73 69 6f 6e 20 6f 66 20 74 68  expression of th
71c0: 65 20 74 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20  e term */.  int 
71d0: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
71e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
71f0: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
7200: 74 65 72 73 20 2a 2f 0a 20 20 57 68 65 72 65 43  ters */.  WhereC
7210: 6c 61 75 73 65 20 2a 70 4f 72 57 63 3b 20 20 20  lause *pOrWc;   
7220: 20 20 20 20 2f 2a 20 42 72 65 61 6b 75 70 20 6f      /* Breakup o
7230: 66 20 70 54 65 72 6d 20 69 6e 74 6f 20 73 75 62  f pTerm into sub
7240: 74 65 72 6d 73 20 2a 2f 0a 20 20 57 68 65 72 65  terms */.  Where
7250: 54 65 72 6d 20 2a 70 4f 72 54 65 72 6d 3b 20 20  Term *pOrTerm;  
7260: 20 20 20 20 20 2f 2a 20 41 20 53 75 62 2d 74 65       /* A Sub-te
7270: 72 6d 20 77 69 74 68 69 6e 20 74 68 65 20 70 4f  rm within the pO
7280: 72 57 63 20 2a 2f 0a 20 20 57 68 65 72 65 4f 72  rWc */.  WhereOr
7290: 49 6e 66 6f 20 2a 70 4f 72 49 6e 66 6f 3b 20 20  Info *pOrInfo;  
72a0: 20 20 20 2f 2a 20 41 64 64 69 74 69 6f 6e 61 6c     /* Additional
72b0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 73 73   information ass
72c0: 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 54 65  ociated with pTe
72d0: 72 6d 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  rm */.  Bitmask 
72e0: 63 68 6e 67 54 6f 49 4e 3b 20 20 20 20 20 20 20  chngToIN;       
72f0: 20 20 2f 2a 20 54 61 62 6c 65 73 20 74 68 61 74    /* Tables that
7300: 20 6d 69 67 68 74 20 73 61 74 69 73 66 79 20 63   might satisfy c
7310: 61 73 65 20 31 20 2a 2f 0a 20 20 42 69 74 6d 61  ase 1 */.  Bitma
7320: 73 6b 20 69 6e 64 65 78 61 62 6c 65 3b 20 20 20  sk indexable;   
7330: 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 73 20 74       /* Tables t
7340: 68 61 74 20 61 72 65 20 69 6e 64 65 78 61 62 6c  hat are indexabl
7350: 65 2c 20 73 61 74 69 73 66 79 69 6e 67 20 63 61  e, satisfying ca
7360: 73 65 20 32 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20  se 2 */..  /*.  
7370: 2a 2a 20 42 72 65 61 6b 20 74 68 65 20 4f 52 20  ** Break the OR 
7380: 63 6c 61 75 73 65 20 69 6e 74 6f 20 69 74 73 20  clause into its 
7390: 73 65 70 61 72 61 74 65 20 73 75 62 74 65 72 6d  separate subterm
73a0: 73 2e 20 20 54 68 65 20 73 75 62 74 65 72 6d 73  s.  The subterms
73b0: 20 61 72 65 0a 20 20 2a 2a 20 73 74 6f 72 65 64   are.  ** stored
73c0: 20 69 6e 20 61 20 57 68 65 72 65 43 6c 61 75 73   in a WhereClaus
73d0: 65 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74  e structure cont
73e0: 61 69 6e 69 6e 67 20 77 69 74 68 69 6e 20 74 68  aining within th
73f0: 65 20 57 68 65 72 65 4f 72 49 6e 66 6f 0a 20 20  e WhereOrInfo.  
7400: 2a 2a 20 6f 62 6a 65 63 74 20 74 68 61 74 20 69  ** object that i
7410: 73 20 61 74 74 61 63 68 65 64 20 74 6f 20 74 68  s attached to th
7420: 65 20 6f 72 69 67 69 6e 61 6c 20 4f 52 20 63 6c  e original OR cl
7430: 61 75 73 65 20 74 65 72 6d 2e 0a 20 20 2a 2f 0a  ause term..  */.
7440: 20 20 61 73 73 65 72 74 28 20 28 70 54 65 72 6d    assert( (pTerm
7450: 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54 45 52  ->wtFlags & (TER
7460: 4d 5f 44 59 4e 41 4d 49 43 7c 54 45 52 4d 5f 4f  M_DYNAMIC|TERM_O
7470: 52 49 4e 46 4f 7c 54 45 52 4d 5f 41 4e 44 49 4e  RINFO|TERM_ANDIN
7480: 46 4f 29 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73  FO))==0 );.  ass
7490: 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ert( pExpr->op==
74a0: 54 4b 5f 4f 52 20 29 3b 0a 20 20 70 54 65 72 6d  TK_OR );.  pTerm
74b0: 2d 3e 75 2e 70 4f 72 49 6e 66 6f 20 3d 20 70 4f  ->u.pOrInfo = pO
74c0: 72 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44  rInfo = sqlite3D
74d0: 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
74e0: 73 69 7a 65 6f 66 28 2a 70 4f 72 49 6e 66 6f 29  sizeof(*pOrInfo)
74f0: 29 3b 0a 20 20 69 66 28 20 70 4f 72 49 6e 66 6f  );.  if( pOrInfo
7500: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
7510: 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c  pTerm->wtFlags |
7520: 3d 20 54 45 52 4d 5f 4f 52 49 4e 46 4f 3b 0a 20  = TERM_ORINFO;. 
7530: 20 70 4f 72 57 63 20 3d 20 26 70 4f 72 49 6e 66   pOrWc = &pOrInf
7540: 6f 2d 3e 77 63 3b 0a 20 20 77 68 65 72 65 43 6c  o->wc;.  whereCl
7550: 61 75 73 65 49 6e 69 74 28 70 4f 72 57 63 2c 20  auseInit(pOrWc, 
7560: 70 57 49 6e 66 6f 29 3b 0a 20 20 77 68 65 72 65  pWInfo);.  where
7570: 53 70 6c 69 74 28 70 4f 72 57 63 2c 20 70 45 78  Split(pOrWc, pEx
7580: 70 72 2c 20 54 4b 5f 4f 52 29 3b 0a 20 20 65 78  pr, TK_OR);.  ex
7590: 70 72 41 6e 61 6c 79 7a 65 41 6c 6c 28 70 53 72  prAnalyzeAll(pSr
75a0: 63 2c 20 70 4f 72 57 63 29 3b 0a 20 20 69 66 28  c, pOrWc);.  if(
75b0: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
75c0: 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73  d ) return;.  as
75d0: 73 65 72 74 28 20 70 4f 72 57 63 2d 3e 6e 54 65  sert( pOrWc->nTe
75e0: 72 6d 3e 3d 32 20 29 3b 0a 0a 20 20 2f 2a 0a 20  rm>=2 );..  /*. 
75f0: 20 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20   ** Compute the 
7600: 73 65 74 20 6f 66 20 74 61 62 6c 65 73 20 74 68  set of tables th
7610: 61 74 20 6d 69 67 68 74 20 73 61 74 69 73 66 79  at might satisfy
7620: 20 63 61 73 65 73 20 31 20 6f 72 20 32 2e 0a 20   cases 1 or 2.. 
7630: 20 2a 2f 0a 20 20 69 6e 64 65 78 61 62 6c 65 20   */.  indexable 
7640: 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b 0a 20  = ~(Bitmask)0;. 
7650: 20 63 68 6e 67 54 6f 49 4e 20 3d 20 7e 28 42 69   chngToIN = ~(Bi
7660: 74 6d 61 73 6b 29 30 3b 0a 20 20 66 6f 72 28 69  tmask)0;.  for(i
7670: 3d 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d 31 2c  =pOrWc->nTerm-1,
7680: 20 70 4f 72 54 65 72 6d 3d 70 4f 72 57 63 2d 3e   pOrTerm=pOrWc->
7690: 61 3b 20 69 3e 3d 30 20 26 26 20 69 6e 64 65 78  a; i>=0 && index
76a0: 61 62 6c 65 3b 20 69 2d 2d 2c 20 70 4f 72 54 65  able; i--, pOrTe
76b0: 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 28  rm++){.    if( (
76c0: 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  pOrTerm->eOperat
76d0: 6f 72 20 26 20 57 4f 5f 53 49 4e 47 4c 45 29 3d  or & WO_SINGLE)=
76e0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72  =0 ){.      Wher
76f0: 65 41 6e 64 49 6e 66 6f 20 2a 70 41 6e 64 49 6e  eAndInfo *pAndIn
7700: 66 6f 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  fo;.      assert
7710: 28 20 28 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c  ( (pOrTerm->wtFl
7720: 61 67 73 20 26 20 28 54 45 52 4d 5f 41 4e 44 49  ags & (TERM_ANDI
7730: 4e 46 4f 7c 54 45 52 4d 5f 4f 52 49 4e 46 4f 29  NFO|TERM_ORINFO)
7740: 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 63 68  )==0 );.      ch
7750: 6e 67 54 6f 49 4e 20 3d 20 30 3b 0a 20 20 20 20  ngToIN = 0;.    
7760: 20 20 70 41 6e 64 49 6e 66 6f 20 3d 20 73 71 6c    pAndInfo = sql
7770: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
7780: 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 41 6e 64  db, sizeof(*pAnd
7790: 49 6e 66 6f 29 29 3b 0a 20 20 20 20 20 20 69 66  Info));.      if
77a0: 28 20 70 41 6e 64 49 6e 66 6f 20 29 7b 0a 20 20  ( pAndInfo ){.  
77b0: 20 20 20 20 20 20 57 68 65 72 65 43 6c 61 75 73        WhereClaus
77c0: 65 20 2a 70 41 6e 64 57 43 3b 0a 20 20 20 20 20  e *pAndWC;.     
77d0: 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 41     WhereTerm *pA
77e0: 6e 64 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20  ndTerm;.        
77f0: 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20 20 42  int j;.        B
7800: 69 74 6d 61 73 6b 20 62 20 3d 20 30 3b 0a 20 20  itmask b = 0;.  
7810: 20 20 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 75        pOrTerm->u
7820: 2e 70 41 6e 64 49 6e 66 6f 20 3d 20 70 41 6e 64  .pAndInfo = pAnd
7830: 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 70 4f  Info;.        pO
7840: 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c  rTerm->wtFlags |
7850: 3d 20 54 45 52 4d 5f 41 4e 44 49 4e 46 4f 3b 0a  = TERM_ANDINFO;.
7860: 20 20 20 20 20 20 20 20 70 4f 72 54 65 72 6d 2d          pOrTerm-
7870: 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 57 4f 5f  >eOperator = WO_
7880: 41 4e 44 3b 0a 20 20 20 20 20 20 20 20 70 41 6e  AND;.        pAn
7890: 64 57 43 20 3d 20 26 70 41 6e 64 49 6e 66 6f 2d  dWC = &pAndInfo-
78a0: 3e 77 63 3b 0a 20 20 20 20 20 20 20 20 77 68 65  >wc;.        whe
78b0: 72 65 43 6c 61 75 73 65 49 6e 69 74 28 70 41 6e  reClauseInit(pAn
78c0: 64 57 43 2c 20 70 57 43 2d 3e 70 57 49 6e 66 6f  dWC, pWC->pWInfo
78d0: 29 3b 0a 20 20 20 20 20 20 20 20 77 68 65 72 65  );.        where
78e0: 53 70 6c 69 74 28 70 41 6e 64 57 43 2c 20 70 4f  Split(pAndWC, pO
78f0: 72 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 54 4b  rTerm->pExpr, TK
7900: 5f 41 4e 44 29 3b 0a 20 20 20 20 20 20 20 20 65  _AND);.        e
7910: 78 70 72 41 6e 61 6c 79 7a 65 41 6c 6c 28 70 53  xprAnalyzeAll(pS
7920: 72 63 2c 20 70 41 6e 64 57 43 29 3b 0a 20 20 20  rc, pAndWC);.   
7930: 20 20 20 20 20 70 41 6e 64 57 43 2d 3e 70 4f 75       pAndWC->pOu
7940: 74 65 72 20 3d 20 70 57 43 3b 0a 20 20 20 20 20  ter = pWC;.     
7950: 20 20 20 74 65 73 74 63 61 73 65 28 20 64 62 2d     testcase( db-
7960: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
7970: 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 64 62  .        if( !db
7980: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
7990: 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  {.          for(
79a0: 6a 3d 30 2c 20 70 41 6e 64 54 65 72 6d 3d 70 41  j=0, pAndTerm=pA
79b0: 6e 64 57 43 2d 3e 61 3b 20 6a 3c 70 41 6e 64 57  ndWC->a; j<pAndW
79c0: 43 2d 3e 6e 54 65 72 6d 3b 20 6a 2b 2b 2c 20 70  C->nTerm; j++, p
79d0: 41 6e 64 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  AndTerm++){.    
79e0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
79f0: 70 41 6e 64 54 65 72 6d 2d 3e 70 45 78 70 72 20  pAndTerm->pExpr 
7a00: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
7a10: 66 28 20 61 6c 6c 6f 77 65 64 4f 70 28 70 41 6e  f( allowedOp(pAn
7a20: 64 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 6f 70  dTerm->pExpr->op
7a30: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
7a40: 20 20 20 62 20 7c 3d 20 67 65 74 4d 61 73 6b 28     b |= getMask(
7a50: 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65  &pWInfo->sMaskSe
7a60: 74 2c 20 70 41 6e 64 54 65 72 6d 2d 3e 6c 65 66  t, pAndTerm->lef
7a70: 74 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20  tCursor);.      
7a80: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
7a90: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
7aa0: 20 20 20 20 20 20 69 6e 64 65 78 61 62 6c 65 20        indexable 
7ab0: 26 3d 20 62 3b 0a 20 20 20 20 20 20 7d 0a 20 20  &= b;.      }.  
7ac0: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 72 54    }else if( pOrT
7ad0: 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  erm->wtFlags & T
7ae0: 45 52 4d 5f 43 4f 50 49 45 44 20 29 7b 0a 20 20  ERM_COPIED ){.  
7af0: 20 20 20 20 2f 2a 20 53 6b 69 70 20 74 68 69 73      /* Skip this
7b00: 20 74 65 72 6d 20 66 6f 72 20 6e 6f 77 2e 20 20   term for now.  
7b10: 57 65 20 72 65 76 69 73 69 74 20 69 74 20 77 68  We revisit it wh
7b20: 65 6e 20 77 65 20 70 72 6f 63 65 73 73 20 74 68  en we process th
7b30: 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f 72 72 65  e.      ** corre
7b40: 73 70 6f 6e 64 69 6e 67 20 54 45 52 4d 5f 56 49  sponding TERM_VI
7b50: 52 54 55 41 4c 20 74 65 72 6d 20 2a 2f 0a 20 20  RTUAL term */.  
7b60: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 42    }else{.      B
7b70: 69 74 6d 61 73 6b 20 62 3b 0a 20 20 20 20 20 20  itmask b;.      
7b80: 62 20 3d 20 67 65 74 4d 61 73 6b 28 26 70 57 49  b = getMask(&pWI
7b90: 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 70  nfo->sMaskSet, p
7ba0: 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73  OrTerm->leftCurs
7bb0: 6f 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  or);.      if( p
7bc0: 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20  OrTerm->wtFlags 
7bd0: 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29  & TERM_VIRTUAL )
7be0: 7b 0a 20 20 20 20 20 20 20 20 57 68 65 72 65 54  {.        WhereT
7bf0: 65 72 6d 20 2a 70 4f 74 68 65 72 20 3d 20 26 70  erm *pOther = &p
7c00: 4f 72 57 63 2d 3e 61 5b 70 4f 72 54 65 72 6d 2d  OrWc->a[pOrTerm-
7c10: 3e 69 50 61 72 65 6e 74 5d 3b 0a 20 20 20 20 20  >iParent];.     
7c20: 20 20 20 62 20 7c 3d 20 67 65 74 4d 61 73 6b 28     b |= getMask(
7c30: 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65  &pWInfo->sMaskSe
7c40: 74 2c 20 70 4f 74 68 65 72 2d 3e 6c 65 66 74 43  t, pOther->leftC
7c50: 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a  ursor);.      }.
7c60: 20 20 20 20 20 20 69 6e 64 65 78 61 62 6c 65 20        indexable 
7c70: 26 3d 20 62 3b 0a 20 20 20 20 20 20 69 66 28 20  &= b;.      if( 
7c80: 28 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61  (pOrTerm->eOpera
7c90: 74 6f 72 20 26 20 57 4f 5f 45 51 29 3d 3d 30 20  tor & WO_EQ)==0 
7ca0: 29 7b 0a 20 20 20 20 20 20 20 20 63 68 6e 67 54  ){.        chngT
7cb0: 6f 49 4e 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  oIN = 0;.      }
7cc0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63 68  else{.        ch
7cd0: 6e 67 54 6f 49 4e 20 26 3d 20 62 3b 0a 20 20 20  ngToIN &= b;.   
7ce0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
7cf0: 20 20 2f 2a 0a 20 20 2a 2a 20 52 65 63 6f 72 64    /*.  ** Record
7d00: 20 74 68 65 20 73 65 74 20 6f 66 20 74 61 62 6c   the set of tabl
7d10: 65 73 20 74 68 61 74 20 73 61 74 69 73 66 79 20  es that satisfy 
7d20: 63 61 73 65 20 32 2e 20 20 54 68 65 20 73 65 74  case 2.  The set
7d30: 20 6d 69 67 68 74 20 62 65 0a 20 20 2a 2a 20 65   might be.  ** e
7d40: 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20 20 70 4f 72  mpty..  */.  pOr
7d50: 49 6e 66 6f 2d 3e 69 6e 64 65 78 61 62 6c 65 20  Info->indexable 
7d60: 3d 20 69 6e 64 65 78 61 62 6c 65 3b 0a 20 20 70  = indexable;.  p
7d70: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
7d80: 3d 20 69 6e 64 65 78 61 62 6c 65 3d 3d 30 20 3f  = indexable==0 ?
7d90: 20 30 20 3a 20 57 4f 5f 4f 52 3b 0a 0a 20 20 2f   0 : WO_OR;..  /
7da0: 2a 0a 20 20 2a 2a 20 63 68 6e 67 54 6f 49 4e 20  *.  ** chngToIN 
7db0: 68 6f 6c 64 73 20 61 20 73 65 74 20 6f 66 20 74  holds a set of t
7dc0: 61 62 6c 65 73 20 74 68 61 74 20 2a 6d 69 67 68  ables that *migh
7dd0: 74 2a 20 73 61 74 69 73 66 79 20 63 61 73 65 20  t* satisfy case 
7de0: 31 2e 20 20 42 75 74 0a 20 20 2a 2a 20 77 65 20  1.  But.  ** we 
7df0: 68 61 76 65 20 74 6f 20 64 6f 20 73 6f 6d 65 20  have to do some 
7e00: 61 64 64 69 74 69 6f 6e 61 6c 20 63 68 65 63 6b  additional check
7e10: 69 6e 67 20 74 6f 20 73 65 65 20 69 66 20 63 61  ing to see if ca
7e20: 73 65 20 31 20 72 65 61 6c 6c 79 0a 20 20 2a 2a  se 1 really.  **
7e30: 20 69 73 20 73 61 74 69 73 66 69 65 64 2e 0a 20   is satisfied.. 
7e40: 20 2a 2a 0a 20 20 2a 2a 20 63 68 6e 67 54 6f 49   **.  ** chngToI
7e50: 4e 20 77 69 6c 6c 20 68 6f 6c 64 20 65 69 74 68  N will hold eith
7e60: 65 72 20 30 2c 20 31 2c 20 6f 72 20 32 20 62 69  er 0, 1, or 2 bi
7e70: 74 73 2e 20 20 54 68 65 20 30 2d 62 69 74 20 63  ts.  The 0-bit c
7e80: 61 73 65 20 6d 65 61 6e 73 0a 20 20 2a 2a 20 74  ase means.  ** t
7e90: 68 61 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20  hat there is no 
7ea0: 70 6f 73 73 69 62 69 6c 69 74 79 20 6f 66 20 74  possibility of t
7eb0: 72 61 6e 73 66 6f 72 6d 69 6e 67 20 74 68 65 20  ransforming the 
7ec0: 4f 52 20 63 6c 61 75 73 65 20 69 6e 74 6f 20 61  OR clause into a
7ed0: 6e 0a 20 20 2a 2a 20 49 4e 20 6f 70 65 72 61 74  n.  ** IN operat
7ee0: 6f 72 20 62 65 63 61 75 73 65 20 6f 6e 65 20 6f  or because one o
7ef0: 72 20 6d 6f 72 65 20 74 65 72 6d 73 20 69 6e 20  r more terms in 
7f00: 74 68 65 20 4f 52 20 63 6c 61 75 73 65 20 63 6f  the OR clause co
7f10: 6e 74 61 69 6e 0a 20 20 2a 2a 20 73 6f 6d 65 74  ntain.  ** somet
7f20: 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20  hing other than 
7f30: 3d 3d 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20 69  == on a column i
7f40: 6e 20 74 68 65 20 73 69 6e 67 6c 65 20 74 61 62  n the single tab
7f50: 6c 65 2e 20 20 54 68 65 20 31 2d 62 69 74 0a 20  le.  The 1-bit. 
7f60: 20 2a 2a 20 63 61 73 65 20 6d 65 61 6e 73 20 74   ** case means t
7f70: 68 61 74 20 65 76 65 72 79 20 74 65 72 6d 20 6f  hat every term o
7f80: 66 20 74 68 65 20 4f 52 20 63 6c 61 75 73 65 20  f the OR clause 
7f90: 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a 20  is of the form. 
7fa0: 20 2a 2a 20 22 74 61 62 6c 65 2e 63 6f 6c 75 6d   ** "table.colum
7fb0: 6e 3d 65 78 70 72 22 20 66 6f 72 20 73 6f 6d 65  n=expr" for some
7fc0: 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 2e 20 20   single table.  
7fd0: 54 68 65 20 6f 6e 65 20 62 69 74 20 74 68 61 74  The one bit that
7fe0: 20 69 73 20 73 65 74 0a 20 20 2a 2a 20 77 69 6c   is set.  ** wil
7ff0: 6c 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20  l correspond to 
8000: 74 68 65 20 63 6f 6d 6d 6f 6e 20 74 61 62 6c 65  the common table
8010: 2e 20 20 57 65 20 73 74 69 6c 6c 20 6e 65 65 64  .  We still need
8020: 20 74 6f 20 63 68 65 63 6b 20 74 6f 20 6d 61 6b   to check to mak
8030: 65 0a 20 20 2a 2a 20 73 75 72 65 20 74 68 65 20  e.  ** sure the 
8040: 73 61 6d 65 20 63 6f 6c 75 6d 6e 20 69 73 20 75  same column is u
8050: 73 65 64 20 6f 6e 20 61 6c 6c 20 74 65 72 6d 73  sed on all terms
8060: 2e 20 20 54 68 65 20 32 2d 62 69 74 20 63 61 73  .  The 2-bit cas
8070: 65 20 69 73 20 77 68 65 6e 0a 20 20 2a 2a 20 74  e is when.  ** t
8080: 68 65 20 61 6c 6c 20 74 65 72 6d 73 20 61 72 65  he all terms are
8090: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 74 61   of the form "ta
80a0: 62 6c 65 31 2e 63 6f 6c 75 6d 6e 3d 74 61 62 6c  ble1.column=tabl
80b0: 65 32 2e 63 6f 6c 75 6d 6e 22 2e 20 20 49 74 0a  e2.column".  It.
80c0: 20 20 2a 2a 20 6d 69 67 68 74 20 62 65 20 70 6f    ** might be po
80d0: 73 73 69 62 6c 65 20 74 6f 20 66 6f 72 6d 20 61  ssible to form a
80e0: 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 77 69  n IN operator wi
80f0: 74 68 20 65 69 74 68 65 72 20 74 61 62 6c 65 31  th either table1
8100: 2e 63 6f 6c 75 6d 6e 0a 20 20 2a 2a 20 6f 72 20  .column.  ** or 
8110: 74 61 62 6c 65 32 2e 63 6f 6c 75 6d 6e 20 61 73  table2.column as
8120: 20 74 68 65 20 4c 48 53 20 69 66 20 65 69 74 68   the LHS if eith
8130: 65 72 20 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20  er is common to 
8140: 65 76 65 72 79 20 74 65 72 6d 20 6f 66 0a 20 20  every term of.  
8150: 2a 2a 20 74 68 65 20 4f 52 20 63 6c 61 75 73 65  ** the OR clause
8160: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65  ..  **.  ** Note
8170: 20 74 68 61 74 20 74 65 72 6d 73 20 6f 66 20 74   that terms of t
8180: 68 65 20 66 6f 72 6d 20 22 74 61 62 6c 65 2e 63  he form "table.c
8190: 6f 6c 75 6d 6e 31 3d 74 61 62 6c 65 2e 63 6f 6c  olumn1=table.col
81a0: 75 6d 6e 32 22 20 28 74 68 65 0a 20 20 2a 2a 20  umn2" (the.  ** 
81b0: 73 61 6d 65 20 74 61 62 6c 65 20 6f 6e 20 62 6f  same table on bo
81c0: 74 68 20 73 69 7a 65 73 20 6f 66 20 74 68 65 20  th sizes of the 
81d0: 3d 3d 29 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70  ==) cannot be op
81e0: 74 69 6d 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20  timized..  */.  
81f0: 69 66 28 20 63 68 6e 67 54 6f 49 4e 20 29 7b 0a  if( chngToIN ){.
8200: 20 20 20 20 69 6e 74 20 6f 6b 54 6f 43 68 6e 67      int okToChng
8210: 54 6f 49 4e 20 3d 20 30 3b 20 20 20 20 20 2f 2a  ToIN = 0;     /*
8220: 20 54 72 75 65 20 69 66 20 74 68 65 20 63 6f 6e   True if the con
8230: 76 65 72 73 69 6f 6e 20 74 6f 20 49 4e 20 69 73  version to IN is
8240: 20 76 61 6c 69 64 20 2a 2f 0a 20 20 20 20 69 6e   valid */.    in
8250: 74 20 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 20  t iColumn = -1; 
8260: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d          /* Colum
8270: 6e 20 69 6e 64 65 78 20 6f 6e 20 6c 68 73 20 6f  n index on lhs o
8280: 66 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f  f IN operator */
8290: 0a 20 20 20 20 69 6e 74 20 69 43 75 72 73 6f 72  .    int iCursor
82a0: 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20 2f   = -1;         /
82b0: 2a 20 54 61 62 6c 65 20 63 75 72 73 6f 72 20 63  * Table cursor c
82c0: 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 74 65 72  ommon to all ter
82d0: 6d 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6a 20  ms */.    int j 
82e0: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
82f0: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
8300: 74 65 72 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53  ter */..    /* S
8310: 65 61 72 63 68 20 66 6f 72 20 61 20 74 61 62 6c  earch for a tabl
8320: 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 74 68 61  e and column tha
8330: 74 20 61 70 70 65 61 72 73 20 6f 6e 20 6f 6e 65  t appears on one
8340: 20 73 69 64 65 20 6f 72 20 74 68 65 0a 20 20 20   side or the.   
8350: 20 2a 2a 20 6f 74 68 65 72 20 6f 66 20 74 68 65   ** other of the
8360: 20 3d 3d 20 6f 70 65 72 61 74 6f 72 20 69 6e 20   == operator in 
8370: 65 76 65 72 79 20 73 75 62 74 65 72 6d 2e 20 20  every subterm.  
8380: 54 68 61 74 20 74 61 62 6c 65 20 61 6e 64 20 63  That table and c
8390: 6f 6c 75 6d 6e 0a 20 20 20 20 2a 2a 20 77 69 6c  olumn.    ** wil
83a0: 6c 20 62 65 20 72 65 63 6f 72 64 65 64 20 69 6e  l be recorded in
83b0: 20 69 43 75 72 73 6f 72 20 61 6e 64 20 69 43 6f   iCursor and iCo
83c0: 6c 75 6d 6e 2e 20 20 54 68 65 72 65 20 6d 69 67  lumn.  There mig
83d0: 68 74 20 6e 6f 74 20 62 65 20 61 6e 79 0a 20 20  ht not be any.  
83e0: 20 20 2a 2a 20 73 75 63 68 20 74 61 62 6c 65 20    ** such table 
83f0: 61 6e 64 20 63 6f 6c 75 6d 6e 2e 20 20 53 65 74  and column.  Set
8400: 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 69 66   okToChngToIN if
8410: 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20   an appropriate 
8420: 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20 61 6e 64  table.    ** and
8430: 20 63 6f 6c 75 6d 6e 20 69 73 20 66 6f 75 6e 64   column is found
8440: 20 62 75 74 20 6c 65 61 76 65 20 6f 6b 54 6f 43   but leave okToC
8450: 68 6e 67 54 6f 49 4e 20 66 61 6c 73 65 20 69 66  hngToIN false if
8460: 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20 20 20 20   not found..    
8470: 2a 2f 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  */.    for(j=0; 
8480: 6a 3c 32 20 26 26 20 21 6f 6b 54 6f 43 68 6e 67  j<2 && !okToChng
8490: 54 6f 49 4e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  ToIN; j++){.    
84a0: 20 20 70 4f 72 54 65 72 6d 20 3d 20 70 4f 72 57    pOrTerm = pOrW
84b0: 63 2d 3e 61 3b 0a 20 20 20 20 20 20 66 6f 72 28  c->a;.      for(
84c0: 69 3d 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d 31  i=pOrWc->nTerm-1
84d0: 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 4f 72  ; i>=0; i--, pOr
84e0: 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Term++){.       
84f0: 20 61 73 73 65 72 74 28 20 70 4f 72 54 65 72 6d   assert( pOrTerm
8500: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
8510: 5f 45 51 20 29 3b 0a 20 20 20 20 20 20 20 20 70  _EQ );.        p
8520: 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20  OrTerm->wtFlags 
8530: 26 3d 20 7e 54 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a  &= ~TERM_OR_OK;.
8540: 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 72 54          if( pOrT
8550: 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d  erm->leftCursor=
8560: 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20  =iCursor ){.    
8570: 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73        /* This is
8580: 20 74 68 65 20 32 2d 62 69 74 20 63 61 73 65 20   the 2-bit case 
8590: 61 6e 64 20 77 65 20 61 72 65 20 6f 6e 20 74 68  and we are on th
85a0: 65 20 73 65 63 6f 6e 64 20 69 74 65 72 61 74 69  e second iterati
85b0: 6f 6e 20 61 6e 64 0a 20 20 20 20 20 20 20 20 20  on and.         
85c0: 20 2a 2a 20 63 75 72 72 65 6e 74 20 74 65 72 6d   ** current term
85d0: 20 69 73 20 66 72 6f 6d 20 74 68 65 20 66 69 72   is from the fir
85e0: 73 74 20 69 74 65 72 61 74 69 6f 6e 2e 20 20 53  st iteration.  S
85f0: 6f 20 73 6b 69 70 20 74 68 69 73 20 74 65 72 6d  o skip this term
8600: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61  . */.          a
8610: 73 73 65 72 74 28 20 6a 3d 3d 31 20 29 3b 0a 20  ssert( j==1 );. 
8620: 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
8630: 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
8640: 20 20 20 20 20 69 66 28 20 28 63 68 6e 67 54 6f       if( (chngTo
8650: 49 4e 20 26 20 67 65 74 4d 61 73 6b 28 26 70 57  IN & getMask(&pW
8660: 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20  Info->sMaskSet, 
8670: 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72  pOrTerm->leftCur
8680: 73 6f 72 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20  sor))==0 ){.    
8690: 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 74 65        /* This te
86a0: 72 6d 20 6d 75 73 74 20 62 65 20 6f 66 20 74 68  rm must be of th
86b0: 65 20 66 6f 72 6d 20 74 31 2e 61 3d 3d 74 32 2e  e form t1.a==t2.
86c0: 62 20 77 68 65 72 65 20 74 32 20 69 73 20 69 6e  b where t2 is in
86d0: 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a   the.          *
86e0: 2a 20 63 68 6e 67 54 6f 49 4e 20 73 65 74 20 62  * chngToIN set b
86f0: 75 74 20 74 31 20 69 73 20 6e 6f 74 2e 20 20 54  ut t1 is not.  T
8700: 68 69 73 20 74 65 72 6d 20 77 69 6c 6c 20 62 65  his term will be
8710: 20 65 69 74 68 65 72 20 70 72 65 63 65 64 65 64   either preceded
8720: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 72  .          ** or
8730: 20 66 6f 6c 6c 77 65 64 20 62 79 20 61 6e 20 69   follwed by an i
8740: 6e 76 65 72 74 65 64 20 63 6f 70 79 20 28 74 32  nverted copy (t2
8750: 2e 62 3d 3d 74 31 2e 61 29 2e 20 20 53 6b 69 70  .b==t1.a).  Skip
8760: 20 74 68 69 73 20 74 65 72 6d 20 0a 20 20 20 20   this term .    
8770: 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 75 73 65        ** and use
8780: 20 69 74 73 20 69 6e 76 65 72 73 69 6f 6e 2e 20   its inversion. 
8790: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65 73  */.          tes
87a0: 74 63 61 73 65 28 20 70 4f 72 54 65 72 6d 2d 3e  tcase( pOrTerm->
87b0: 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 43  wtFlags & TERM_C
87c0: 4f 50 49 45 44 20 29 3b 0a 20 20 20 20 20 20 20  OPIED );.       
87d0: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4f 72     testcase( pOr
87e0: 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
87f0: 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a  TERM_VIRTUAL );.
8800: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
8810: 28 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61  ( pOrTerm->wtFla
8820: 67 73 20 26 20 28 54 45 52 4d 5f 43 4f 50 49 45  gs & (TERM_COPIE
8830: 44 7c 54 45 52 4d 5f 56 49 52 54 55 41 4c 29 20  D|TERM_VIRTUAL) 
8840: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e  );.          con
8850: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d  tinue;.        }
8860: 0a 20 20 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e  .        iColumn
8870: 20 3d 20 70 4f 72 54 65 72 6d 2d 3e 75 2e 6c 65   = pOrTerm->u.le
8880: 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  ftColumn;.      
8890: 20 20 69 43 75 72 73 6f 72 20 3d 20 70 4f 72 54    iCursor = pOrT
88a0: 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3b  erm->leftCursor;
88b0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
88c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
88d0: 28 20 69 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  ( i<0 ){.       
88e0: 20 2f 2a 20 4e 6f 20 63 61 6e 64 69 64 61 74 65   /* No candidate
88f0: 20 74 61 62 6c 65 2b 63 6f 6c 75 6d 6e 20 77 61   table+column wa
8900: 73 20 66 6f 75 6e 64 2e 20 20 54 68 69 73 20 63  s found.  This c
8910: 61 6e 20 6f 6e 6c 79 20 6f 63 63 75 72 0a 20 20  an only occur.  
8920: 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20        ** on the 
8930: 73 65 63 6f 6e 64 20 69 74 65 72 61 74 69 6f 6e  second iteration
8940: 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65   */.        asse
8950: 72 74 28 20 6a 3d 3d 31 20 29 3b 0a 20 20 20 20  rt( j==1 );.    
8960: 20 20 20 20 61 73 73 65 72 74 28 20 49 73 50 6f      assert( IsPo
8970: 77 65 72 4f 66 54 77 6f 28 63 68 6e 67 54 6f 49  werOfTwo(chngToI
8980: 4e 29 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  N) );.        as
8990: 73 65 72 74 28 20 63 68 6e 67 54 6f 49 4e 3d 3d  sert( chngToIN==
89a0: 67 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d  getMask(&pWInfo-
89b0: 3e 73 4d 61 73 6b 53 65 74 2c 20 69 43 75 72 73  >sMaskSet, iCurs
89c0: 6f 72 29 20 29 3b 0a 20 20 20 20 20 20 20 20 62  or) );.        b
89d0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
89e0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 3d      testcase( j=
89f0: 3d 31 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  =1 );..      /* 
8a00: 57 65 20 68 61 76 65 20 66 6f 75 6e 64 20 61 20  We have found a 
8a10: 63 61 6e 64 69 64 61 74 65 20 74 61 62 6c 65 20  candidate table 
8a20: 61 6e 64 20 63 6f 6c 75 6d 6e 2e 20 20 43 68 65  and column.  Che
8a30: 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 61  ck to see if tha
8a40: 74 0a 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65  t.      ** table
8a50: 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 69 73 20 63   and column is c
8a60: 6f 6d 6d 6f 6e 20 74 6f 20 65 76 65 72 79 20 74  ommon to every t
8a70: 65 72 6d 20 69 6e 20 74 68 65 20 4f 52 20 63 6c  erm in the OR cl
8a80: 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 6f 6b  ause */.      ok
8a90: 54 6f 43 68 6e 67 54 6f 49 4e 20 3d 20 31 3b 0a  ToChngToIN = 1;.
8aa0: 20 20 20 20 20 20 66 6f 72 28 3b 20 69 3e 3d 30        for(; i>=0
8ab0: 20 26 26 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e   && okToChngToIN
8ac0: 3b 20 69 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b  ; i--, pOrTerm++
8ad0: 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
8ae0: 74 28 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65  t( pOrTerm->eOpe
8af0: 72 61 74 6f 72 20 26 20 57 4f 5f 45 51 20 29 3b  rator & WO_EQ );
8b00: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 72  .        if( pOr
8b10: 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
8b20: 21 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20 20 20  !=iCursor ){.   
8b30: 20 20 20 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e         pOrTerm->
8b40: 77 74 46 6c 61 67 73 20 26 3d 20 7e 54 45 52 4d  wtFlags &= ~TERM
8b50: 5f 4f 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  _OR_OK;.        
8b60: 7d 65 6c 73 65 20 69 66 28 20 70 4f 72 54 65 72  }else if( pOrTer
8b70: 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 21  m->u.leftColumn!
8b80: 3d 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20  =iColumn ){.    
8b90: 20 20 20 20 20 20 6f 6b 54 6f 43 68 6e 67 54 6f        okToChngTo
8ba0: 49 4e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  IN = 0;.        
8bb0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
8bc0: 20 69 6e 74 20 61 66 66 4c 65 66 74 2c 20 61 66   int affLeft, af
8bd0: 66 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20  fRight;.        
8be0: 20 20 2f 2a 20 49 66 20 74 68 65 20 72 69 67 68    /* If the righ
8bf0: 74 2d 68 61 6e 64 20 73 69 64 65 20 69 73 20 61  t-hand side is a
8c00: 6c 73 6f 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68  lso a column, th
8c10: 65 6e 20 74 68 65 20 61 66 66 69 6e 69 74 69 65  en the affinitie
8c20: 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f  s.          ** o
8c30: 66 20 62 6f 74 68 20 72 69 67 68 74 20 61 6e 64  f both right and
8c40: 20 6c 65 66 74 20 73 69 64 65 73 20 6d 75 73 74   left sides must
8c50: 20 62 65 20 73 75 63 68 20 74 68 61 74 20 6e 6f   be such that no
8c60: 20 74 79 70 65 0a 20 20 20 20 20 20 20 20 20 20   type.          
8c70: 2a 2a 20 63 6f 6e 76 65 72 73 69 6f 6e 73 20 61  ** conversions a
8c80: 72 65 20 72 65 71 75 69 72 65 64 20 6f 6e 20 74  re required on t
8c90: 68 65 20 72 69 67 68 74 2e 20 20 28 54 69 63 6b  he right.  (Tick
8ca0: 65 74 20 23 32 32 34 39 29 0a 20 20 20 20 20 20  et #2249).      
8cb0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
8cc0: 20 61 66 66 52 69 67 68 74 20 3d 20 73 71 6c 69   affRight = sqli
8cd0: 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28  te3ExprAffinity(
8ce0: 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e  pOrTerm->pExpr->
8cf0: 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20  pRight);.       
8d00: 20 20 20 61 66 66 4c 65 66 74 20 3d 20 73 71 6c     affLeft = sql
8d10: 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79  ite3ExprAffinity
8d20: 28 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72 2d  (pOrTerm->pExpr-
8d30: 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 20  >pLeft);.       
8d40: 20 20 20 69 66 28 20 61 66 66 52 69 67 68 74 21     if( affRight!
8d50: 3d 30 20 26 26 20 61 66 66 52 69 67 68 74 21 3d  =0 && affRight!=
8d60: 61 66 66 4c 65 66 74 20 29 7b 0a 20 20 20 20 20  affLeft ){.     
8d70: 20 20 20 20 20 20 20 6f 6b 54 6f 43 68 6e 67 54         okToChngT
8d80: 6f 49 4e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  oIN = 0;.       
8d90: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
8da0: 20 20 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 77        pOrTerm->w
8db0: 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 4f  tFlags |= TERM_O
8dc0: 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20  R_OK;.          
8dd0: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
8de0: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
8df0: 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c  * At this point,
8e00: 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 69 73   okToChngToIN is
8e10: 20 74 72 75 65 20 69 66 20 6f 72 69 67 69 6e 61   true if origina
8e20: 6c 20 70 54 65 72 6d 20 73 61 74 69 73 66 69 65  l pTerm satisfie
8e30: 73 0a 20 20 20 20 2a 2a 20 63 61 73 65 20 31 2e  s.    ** case 1.
8e40: 20 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20    In that case, 
8e50: 63 6f 6e 73 74 72 75 63 74 20 61 20 6e 65 77 20  construct a new 
8e60: 76 69 72 74 75 61 6c 20 74 65 72 6d 20 74 68 61  virtual term tha
8e70: 74 20 69 73 20 0a 20 20 20 20 2a 2a 20 70 54 65  t is .    ** pTe
8e80: 72 6d 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74  rm converted int
8e90: 6f 20 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72  o an IN operator
8ea0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
8eb0: 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 29 7b   okToChngToIN ){
8ec0: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 44 75  .      Expr *pDu
8ed0: 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p;            /*
8ee0: 20 41 20 74 72 61 6e 73 69 65 6e 74 20 64 75 70   A transient dup
8ef0: 6c 69 63 61 74 65 20 65 78 70 72 65 73 73 69 6f  licate expressio
8f00: 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 4c  n */.      ExprL
8f10: 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 30 3b 20  ist *pList = 0; 
8f20: 20 20 2f 2a 20 54 68 65 20 52 48 53 20 6f 66 20    /* The RHS of 
8f30: 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20  the IN operator 
8f40: 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  */.      Expr *p
8f50: 4c 65 66 74 20 3d 20 30 3b 20 20 20 20 20 20 20  Left = 0;       
8f60: 2f 2a 20 54 68 65 20 4c 48 53 20 6f 66 20 74 68  /* The LHS of th
8f70: 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f  e IN operator */
8f80: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65  .      Expr *pNe
8f90: 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  w;            /*
8fa0: 20 54 68 65 20 63 6f 6d 70 6c 65 74 65 20 49 4e   The complete IN
8fb0: 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 0a 20 20   operator */..  
8fc0: 20 20 20 20 66 6f 72 28 69 3d 70 4f 72 57 63 2d      for(i=pOrWc-
8fd0: 3e 6e 54 65 72 6d 2d 31 2c 20 70 4f 72 54 65 72  >nTerm-1, pOrTer
8fe0: 6d 3d 70 4f 72 57 63 2d 3e 61 3b 20 69 3e 3d 30  m=pOrWc->a; i>=0
8ff0: 3b 20 69 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b  ; i--, pOrTerm++
9000: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  ){.        if( (
9010: 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  pOrTerm->wtFlags
9020: 20 26 20 54 45 52 4d 5f 4f 52 5f 4f 4b 29 3d 3d   & TERM_OR_OK)==
9030: 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
9040: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f        assert( pO
9050: 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  rTerm->eOperator
9060: 20 26 20 57 4f 5f 45 51 20 29 3b 0a 20 20 20 20   & WO_EQ );.    
9070: 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 72 54      assert( pOrT
9080: 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d  erm->leftCursor=
9090: 3d 69 43 75 72 73 6f 72 20 29 3b 0a 20 20 20 20  =iCursor );.    
90a0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 72 54      assert( pOrT
90b0: 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d  erm->u.leftColum
90c0: 6e 3d 3d 69 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20  n==iColumn );.  
90d0: 20 20 20 20 20 20 70 44 75 70 20 3d 20 73 71 6c        pDup = sql
90e0: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
90f0: 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e  pOrTerm->pExpr->
9100: 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 20 20  pRight, 0);.    
9110: 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69      pList = sqli
9120: 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
9130: 64 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65  d(pWInfo->pParse
9140: 2c 20 70 4c 69 73 74 2c 20 70 44 75 70 29 3b 0a  , pList, pDup);.
9150: 20 20 20 20 20 20 20 20 70 4c 65 66 74 20 3d 20          pLeft = 
9160: 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e  pOrTerm->pExpr->
9170: 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 7d 0a 20  pLeft;.      }. 
9180: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 65       assert( pLe
9190: 66 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  ft!=0 );.      p
91a0: 44 75 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Dup = sqlite3Exp
91b0: 72 44 75 70 28 64 62 2c 20 70 4c 65 66 74 2c 20  rDup(db, pLeft, 
91c0: 30 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d  0);.      pNew =
91d0: 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
91e0: 61 72 73 65 2c 20 54 4b 5f 49 4e 2c 20 70 44 75  arse, TK_IN, pDu
91f0: 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  p, 0, 0);.      
9200: 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20  if( pNew ){.    
9210: 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77 3b 0a      int idxNew;.
9220: 20 20 20 20 20 20 20 20 74 72 61 6e 73 66 65 72          transfer
9230: 4a 6f 69 6e 4d 61 72 6b 69 6e 67 73 28 70 4e 65  JoinMarkings(pNe
9240: 77 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20  w, pExpr);.     
9250: 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
9260: 48 61 73 50 72 6f 70 65 72 74 79 28 70 4e 65 77  HasProperty(pNew
9270: 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
9280: 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  );.        pNew-
9290: 3e 78 2e 70 4c 69 73 74 20 3d 20 70 4c 69 73 74  >x.pList = pList
92a0: 3b 0a 20 20 20 20 20 20 20 20 69 64 78 4e 65 77  ;.        idxNew
92b0: 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e   = whereClauseIn
92c0: 73 65 72 74 28 70 57 43 2c 20 70 4e 65 77 2c 20  sert(pWC, pNew, 
92d0: 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52  TERM_VIRTUAL|TER
92e0: 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20  M_DYNAMIC);.    
92f0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 64      testcase( id
9300: 78 4e 65 77 3d 3d 30 20 29 3b 0a 20 20 20 20 20  xNew==0 );.     
9310: 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 70     exprAnalyze(p
9320: 53 72 63 2c 20 70 57 43 2c 20 69 64 78 4e 65 77  Src, pWC, idxNew
9330: 29 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d  );.        pTerm
9340: 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65   = &pWC->a[idxTe
9350: 72 6d 5d 3b 0a 20 20 20 20 20 20 20 20 6d 61 72  rm];.        mar
9360: 6b 54 65 72 6d 41 73 43 68 69 6c 64 28 70 57 43  kTermAsChild(pWC
9370: 2c 20 69 64 78 4e 65 77 2c 20 69 64 78 54 65 72  , idxNew, idxTer
9380: 6d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  m);.      }else{
9390: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
93a0: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
93b0: 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 20 20 20  b, pList);.     
93c0: 20 7d 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e   }.      pTerm->
93d0: 65 4f 70 65 72 61 74 6f 72 20 3d 20 57 4f 5f 4e  eOperator = WO_N
93e0: 4f 4f 50 3b 20 20 2f 2a 20 63 61 73 65 20 31 20  OOP;  /* case 1 
93f0: 74 72 75 6d 70 73 20 63 61 73 65 20 32 20 2a 2f  trumps case 2 */
9400: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e  .    }.  }.}.#en
9410: 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f  dif /* !SQLITE_O
9420: 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54  MIT_OR_OPTIMIZAT
9430: 49 4f 4e 20 26 26 20 21 53 51 4c 49 54 45 5f 4f  ION && !SQLITE_O
9440: 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a  MIT_SUBQUERY */.
9450: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 6e 70 75 74  ./*.** The input
9460: 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   to this routine
9470: 20 69 73 20 61 6e 20 57 68 65 72 65 54 65 72 6d   is an WhereTerm
9480: 20 73 74 72 75 63 74 75 72 65 20 77 69 74 68 20   structure with 
9490: 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 22 70 45 78  only the.** "pEx
94a0: 70 72 22 20 66 69 65 6c 64 20 66 69 6c 6c 65 64  pr" field filled
94b0: 20 69 6e 2e 20 20 54 68 65 20 6a 6f 62 20 6f 66   in.  The job of
94c0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
94d0: 20 74 6f 20 61 6e 61 6c 79 7a 65 20 74 68 65 0a   to analyze the.
94e0: 2a 2a 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  ** subexpression
94f0: 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 20 61 6c   and populate al
9500: 6c 20 74 68 65 20 6f 74 68 65 72 20 66 69 65 6c  l the other fiel
9510: 64 73 20 6f 66 20 74 68 65 20 57 68 65 72 65 54  ds of the WhereT
9520: 65 72 6d 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  erm.** structure
9530: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65  ..**.** If the e
9540: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6f 66 20  xpression is of 
9550: 74 68 65 20 66 6f 72 6d 20 22 3c 65 78 70 72 3e  the form "<expr>
9560: 20 3c 6f 70 3e 20 58 22 20 69 74 20 67 65 74 73   <op> X" it gets
9570: 20 63 6f 6d 6d 75 74 65 64 0a 2a 2a 20 74 6f 20   commuted.** to 
9580: 74 68 65 20 73 74 61 6e 64 61 72 64 20 66 6f 72  the standard for
9590: 6d 20 6f 66 20 22 58 20 3c 6f 70 3e 20 3c 65 78  m of "X <op> <ex
95a0: 70 72 3e 22 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  pr>"..**.** If t
95b0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
95c0: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 58 20   of the form "X 
95d0: 3c 6f 70 3e 20 59 22 20 77 68 65 72 65 20 62 6f  <op> Y" where bo
95e0: 74 68 20 58 20 61 6e 64 20 59 20 61 72 65 0a 2a  th X and Y are.*
95f0: 2a 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20  * columns, then 
9600: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 65 78 70  the original exp
9610: 72 65 73 73 69 6f 6e 20 69 73 20 75 6e 63 68 61  ression is uncha
9620: 6e 67 65 64 20 61 6e 64 20 61 20 6e 65 77 20 76  nged and a new v
9630: 69 72 74 75 61 6c 0a 2a 2a 20 74 65 72 6d 20 6f  irtual.** term o
9640: 66 20 74 68 65 20 66 6f 72 6d 20 22 59 20 3c 6f  f the form "Y <o
9650: 70 3e 20 58 22 20 69 73 20 61 64 64 65 64 20 74  p> X" is added t
9660: 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  o the WHERE clau
9670: 73 65 20 61 6e 64 0a 2a 2a 20 61 6e 61 6c 79 7a  se and.** analyz
9680: 65 64 20 73 65 70 61 72 61 74 65 6c 79 2e 20 20  ed separately.  
9690: 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 74 65 72  The original ter
96a0: 6d 20 69 73 20 6d 61 72 6b 65 64 20 77 69 74 68  m is marked with
96b0: 20 54 45 52 4d 5f 43 4f 50 49 45 44 0a 2a 2a 20   TERM_COPIED.** 
96c0: 61 6e 64 20 74 68 65 20 6e 65 77 20 74 65 72 6d  and the new term
96d0: 20 69 73 20 6d 61 72 6b 65 64 20 77 69 74 68 20   is marked with 
96e0: 54 45 52 4d 5f 44 59 4e 41 4d 49 43 20 28 62 65  TERM_DYNAMIC (be
96f0: 63 61 75 73 65 20 69 74 27 73 20 70 45 78 70 72  cause it's pExpr
9700: 0a 2a 2a 20 6e 65 65 64 73 20 74 6f 20 62 65 20  .** needs to be 
9710: 66 72 65 65 64 20 77 69 74 68 20 74 68 65 20 57  freed with the W
9720: 68 65 72 65 43 6c 61 75 73 65 29 20 61 6e 64 20  hereClause) and 
9730: 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 28 62 65  TERM_VIRTUAL (be
9740: 63 61 75 73 65 20 69 74 0a 2a 2a 20 69 73 20 61  cause it.** is a
9750: 20 63 6f 6d 6d 75 74 65 64 20 63 6f 70 79 20 6f   commuted copy o
9760: 66 20 61 20 70 72 69 6f 72 20 74 65 72 6d 2e 29  f a prior term.)
9770: 20 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 74    The original t
9780: 65 72 6d 20 68 61 73 20 6e 43 68 69 6c 64 3d 31  erm has nChild=1
9790: 0a 2a 2a 20 61 6e 64 20 74 68 65 20 63 6f 70 79  .** and the copy
97a0: 20 68 61 73 20 69 64 78 50 61 72 65 6e 74 20 73   has idxParent s
97b0: 65 74 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20  et to the index 
97c0: 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  of the original 
97d0: 74 65 72 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  term..*/.static 
97e0: 76 6f 69 64 20 65 78 70 72 41 6e 61 6c 79 7a 65  void exprAnalyze
97f0: 28 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72  (.  SrcList *pSr
9800: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  c,            /*
9810: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
9820: 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
9830: 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20  e *pWC,         
9840: 2f 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  /* the WHERE cla
9850: 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78  use */.  int idx
9860: 54 65 72 6d 20 20 20 20 20 20 20 20 20 20 20 20  Term            
9870: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74     /* Index of t
9880: 68 65 20 74 65 72 6d 20 74 6f 20 62 65 20 61 6e  he term to be an
9890: 61 6c 79 7a 65 64 20 2a 2f 0a 29 7b 0a 20 20 57  alyzed */.){.  W
98a0: 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
98b0: 20 3d 20 70 57 43 2d 3e 70 57 49 6e 66 6f 3b 20   = pWC->pWInfo; 
98c0: 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  /* WHERE clause 
98d0: 70 72 6f 63 65 73 73 69 6e 67 20 63 6f 6e 74 65  processing conte
98e0: 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  xt */.  WhereTer
98f0: 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20  m *pTerm;       
9900: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
9910: 74 65 72 6d 20 74 6f 20 62 65 20 61 6e 61 6c 79  term to be analy
9920: 7a 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 4d 61  zed */.  WhereMa
9930: 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 3b  skSet *pMaskSet;
9940: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74            /* Set
9950: 20 6f 66 20 74 61 62 6c 65 20 69 6e 64 65 78 20   of table index 
9960: 6d 61 73 6b 73 20 2a 2f 0a 20 20 45 78 70 72 20  masks */.  Expr 
9970: 2a 70 45 78 70 72 3b 20 20 20 20 20 20 20 20 20  *pExpr;         
9980: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
9990: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f  he expression to
99a0: 20 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a   be analyzed */.
99b0: 20 20 42 69 74 6d 61 73 6b 20 70 72 65 72 65 71    Bitmask prereq
99c0: 4c 65 66 74 3b 20 20 20 20 20 20 20 20 20 20 20  Left;           
99d0: 20 20 20 2f 2a 20 50 72 65 72 65 71 75 65 73 69     /* Prerequesi
99e0: 74 65 73 20 6f 66 20 74 68 65 20 70 45 78 70 72  tes of the pExpr
99f0: 2d 3e 70 4c 65 66 74 20 2a 2f 0a 20 20 42 69 74  ->pLeft */.  Bit
9a00: 6d 61 73 6b 20 70 72 65 72 65 71 41 6c 6c 3b 20  mask prereqAll; 
9a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9a20: 20 50 72 65 72 65 71 75 65 73 69 74 65 73 20 6f   Prerequesites o
9a30: 66 20 70 45 78 70 72 20 2a 2f 0a 20 20 42 69 74  f pExpr */.  Bit
9a40: 6d 61 73 6b 20 65 78 74 72 61 52 69 67 68 74 20  mask extraRight 
9a50: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  = 0;          /*
9a60: 20 45 78 74 72 61 20 64 65 70 65 6e 64 65 6e 63   Extra dependenc
9a70: 69 65 73 20 6f 6e 20 4c 45 46 54 20 4a 4f 49 4e  ies on LEFT JOIN
9a80: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 53 74 72   */.  Expr *pStr
9a90: 31 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  1 = 0;          
9aa0: 20 20 20 20 20 20 20 2f 2a 20 52 48 53 20 6f 66         /* RHS of
9ab0: 20 4c 49 4b 45 2f 47 4c 4f 42 20 6f 70 65 72 61   LIKE/GLOB opera
9ac0: 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43  tor */.  int isC
9ad0: 6f 6d 70 6c 65 74 65 20 3d 20 30 3b 20 20 20 20  omplete = 0;    
9ae0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 48 53            /* RHS
9af0: 20 6f 66 20 4c 49 4b 45 2f 47 4c 4f 42 20 65 6e   of LIKE/GLOB en
9b00: 64 73 20 77 69 74 68 20 77 69 6c 64 63 61 72 64  ds with wildcard
9b10: 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43 61 73 65   */.  int noCase
9b20: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
9b30: 20 20 20 20 20 20 20 2f 2a 20 4c 49 4b 45 2f 47         /* LIKE/G
9b40: 4c 4f 42 20 64 69 73 74 69 6e 67 75 69 73 68 65  LOB distinguishe
9b50: 73 20 63 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20  s case */.  int 
9b60: 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  op;             
9b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9b80: 54 6f 70 2d 6c 65 76 65 6c 20 6f 70 65 72 61 74  Top-level operat
9b90: 6f 72 2e 20 20 70 45 78 70 72 2d 3e 6f 70 20 2a  or.  pExpr->op *
9ba0: 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  /.  Parse *pPars
9bb0: 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72  e = pWInfo->pPar
9bc0: 73 65 3b 20 20 2f 2a 20 50 61 72 73 69 6e 67 20  se;  /* Parsing 
9bd0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73 71 6c  context */.  sql
9be0: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
9bf0: 65 2d 3e 64 62 3b 20 20 20 20 20 20 20 20 2f 2a  e->db;        /*
9c00: 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
9c10: 74 69 6f 6e 20 2a 2f 0a 0a 20 20 69 66 28 20 64  tion */..  if( d
9c20: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
9c30: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  ){.    return;. 
9c40: 20 7d 0a 20 20 70 54 65 72 6d 20 3d 20 26 70 57   }.  pTerm = &pW
9c50: 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20  C->a[idxTerm];. 
9c60: 20 70 4d 61 73 6b 53 65 74 20 3d 20 26 70 57 49   pMaskSet = &pWI
9c70: 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 3b 0a 20  nfo->sMaskSet;. 
9c80: 20 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e   pExpr = pTerm->
9c90: 70 45 78 70 72 3b 0a 20 20 61 73 73 65 72 74 28  pExpr;.  assert(
9ca0: 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41   pExpr->op!=TK_A
9cb0: 53 20 26 26 20 70 45 78 70 72 2d 3e 6f 70 21 3d  S && pExpr->op!=
9cc0: 54 4b 5f 43 4f 4c 4c 41 54 45 20 29 3b 0a 20 20  TK_COLLATE );.  
9cd0: 70 72 65 72 65 71 4c 65 66 74 20 3d 20 65 78 70  prereqLeft = exp
9ce0: 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  rTableUsage(pMas
9cf0: 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 70 4c 65  kSet, pExpr->pLe
9d00: 66 74 29 3b 0a 20 20 6f 70 20 3d 20 70 45 78 70  ft);.  op = pExp
9d10: 72 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d  r->op;.  if( op=
9d20: 3d 54 4b 5f 49 4e 20 29 7b 0a 20 20 20 20 61 73  =TK_IN ){.    as
9d30: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 52 69  sert( pExpr->pRi
9d40: 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66  ght==0 );.    if
9d50: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
9d60: 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
9d70: 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20  elect) ){.      
9d80: 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
9d90: 68 74 20 3d 20 65 78 70 72 53 65 6c 65 63 74 54  ht = exprSelectT
9da0: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
9db0: 65 74 2c 20 70 45 78 70 72 2d 3e 78 2e 70 53 65  et, pExpr->x.pSe
9dc0: 6c 65 63 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65  lect);.    }else
9dd0: 7b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 70  {.      pTerm->p
9de0: 72 65 72 65 71 52 69 67 68 74 20 3d 20 65 78 70  rereqRight = exp
9df0: 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65 28  rListTableUsage(
9e00: 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d  pMaskSet, pExpr-
9e10: 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20 7d  >x.pList);.    }
9e20: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d  .  }else if( op=
9e30: 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20  =TK_ISNULL ){.  
9e40: 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52    pTerm->prereqR
9e50: 69 67 68 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  ight = 0;.  }els
9e60: 65 7b 0a 20 20 20 20 70 54 65 72 6d 2d 3e 70 72  e{.    pTerm->pr
9e70: 65 72 65 71 52 69 67 68 74 20 3d 20 65 78 70 72  ereqRight = expr
9e80: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
9e90: 53 65 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  Set, pExpr->pRig
9ea0: 68 74 29 3b 0a 20 20 7d 0a 20 20 70 72 65 72 65  ht);.  }.  prere
9eb0: 71 41 6c 6c 20 3d 20 65 78 70 72 54 61 62 6c 65  qAll = exprTable
9ec0: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
9ed0: 70 45 78 70 72 29 3b 0a 20 20 69 66 28 20 45 78  pExpr);.  if( Ex
9ee0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
9ef0: 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  xpr, EP_FromJoin
9f00: 29 20 29 7b 0a 20 20 20 20 42 69 74 6d 61 73 6b  ) ){.    Bitmask
9f10: 20 78 20 3d 20 67 65 74 4d 61 73 6b 28 70 4d 61   x = getMask(pMa
9f20: 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 69 52  skSet, pExpr->iR
9f30: 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 29 3b 0a  ightJoinTable);.
9f40: 20 20 20 20 70 72 65 72 65 71 41 6c 6c 20 7c 3d      prereqAll |=
9f50: 20 78 3b 0a 20 20 20 20 65 78 74 72 61 52 69 67   x;.    extraRig
9f60: 68 74 20 3d 20 78 2d 31 3b 20 20 2f 2a 20 4f 4e  ht = x-1;  /* ON
9f70: 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 6d 61   clause terms ma
9f80: 79 20 6e 6f 74 20 62 65 20 75 73 65 64 20 77 69  y not be used wi
9f90: 74 68 20 61 6e 20 69 6e 64 65 78 0a 20 20 20 20  th an index.    
9fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9fb0: 20 20 20 2a 2a 20 6f 6e 20 6c 65 66 74 20 74 61     ** on left ta
9fc0: 62 6c 65 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f  ble of a LEFT JO
9fd0: 49 4e 2e 20 20 54 69 63 6b 65 74 20 23 33 30 31  IN.  Ticket #301
9fe0: 35 20 2a 2f 0a 20 20 7d 0a 20 20 70 54 65 72 6d  5 */.  }.  pTerm
9ff0: 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20 70 72  ->prereqAll = pr
a000: 65 72 65 71 41 6c 6c 3b 0a 20 20 70 54 65 72 6d  ereqAll;.  pTerm
a010: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 2d  ->leftCursor = -
a020: 31 3b 0a 20 20 70 54 65 72 6d 2d 3e 69 50 61 72  1;.  pTerm->iPar
a030: 65 6e 74 20 3d 20 2d 31 3b 0a 20 20 70 54 65 72  ent = -1;.  pTer
a040: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 30  m->eOperator = 0
a050: 3b 0a 20 20 69 66 28 20 61 6c 6c 6f 77 65 64 4f  ;.  if( allowedO
a060: 70 28 6f 70 29 20 29 7b 0a 20 20 20 20 45 78 70  p(op) ){.    Exp
a070: 72 20 2a 70 4c 65 66 74 20 3d 20 73 71 6c 69 74  r *pLeft = sqlit
a080: 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74  e3ExprSkipCollat
a090: 65 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  e(pExpr->pLeft);
a0a0: 0a 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68  .    Expr *pRigh
a0b0: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53  t = sqlite3ExprS
a0c0: 6b 69 70 43 6f 6c 6c 61 74 65 28 70 45 78 70 72  kipCollate(pExpr
a0d0: 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 75  ->pRight);.    u
a0e0: 31 36 20 6f 70 4d 61 73 6b 20 3d 20 28 70 54 65  16 opMask = (pTe
a0f0: 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20  rm->prereqRight 
a100: 26 20 70 72 65 72 65 71 4c 65 66 74 29 3d 3d 30  & prereqLeft)==0
a110: 20 3f 20 57 4f 5f 41 4c 4c 20 3a 20 57 4f 5f 45   ? WO_ALL : WO_E
a120: 51 55 49 56 3b 0a 20 20 20 20 69 66 28 20 70 4c  QUIV;.    if( pL
a130: 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  eft->op==TK_COLU
a140: 4d 4e 20 29 7b 0a 20 20 20 20 20 20 70 54 65 72  MN ){.      pTer
a150: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20  m->leftCursor = 
a160: 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20  pLeft->iTable;. 
a170: 20 20 20 20 20 70 54 65 72 6d 2d 3e 75 2e 6c 65       pTerm->u.le
a180: 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66 74  ftColumn = pLeft
a190: 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  ->iColumn;.     
a1a0: 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
a1b0: 72 20 3d 20 6f 70 65 72 61 74 6f 72 4d 61 73 6b  r = operatorMask
a1c0: 28 6f 70 29 20 26 20 6f 70 4d 61 73 6b 3b 0a 20  (op) & opMask;. 
a1d0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 52 69     }.    if( pRi
a1e0: 67 68 74 20 26 26 20 70 52 69 67 68 74 2d 3e 6f  ght && pRight->o
a1f0: 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a  p==TK_COLUMN ){.
a200: 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20        WhereTerm 
a210: 2a 70 4e 65 77 3b 0a 20 20 20 20 20 20 45 78 70  *pNew;.      Exp
a220: 72 20 2a 70 44 75 70 3b 0a 20 20 20 20 20 20 75  r *pDup;.      u
a230: 31 36 20 65 45 78 74 72 61 4f 70 20 3d 20 30 3b  16 eExtraOp = 0;
a240: 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61          /* Extra
a250: 20 62 69 74 73 20 66 6f 72 20 70 4e 65 77 2d 3e   bits for pNew->
a260: 65 4f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20  eOperator */.   
a270: 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65     if( pTerm->le
a280: 66 74 43 75 72 73 6f 72 3e 3d 30 20 29 7b 0a 20  ftCursor>=0 ){. 
a290: 20 20 20 20 20 20 20 69 6e 74 20 69 64 78 4e 65         int idxNe
a2a0: 77 3b 0a 20 20 20 20 20 20 20 20 70 44 75 70 20  w;.        pDup 
a2b0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
a2c0: 28 64 62 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a  (db, pExpr, 0);.
a2d0: 20 20 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e          if( db->
a2e0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
a2f0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
a300: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
a310: 70 44 75 70 29 3b 0a 20 20 20 20 20 20 20 20 20  pDup);.         
a320: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20   return;.       
a330: 20 7d 0a 20 20 20 20 20 20 20 20 69 64 78 4e 65   }.        idxNe
a340: 77 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49  w = whereClauseI
a350: 6e 73 65 72 74 28 70 57 43 2c 20 70 44 75 70 2c  nsert(pWC, pDup,
a360: 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45   TERM_VIRTUAL|TE
a370: 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20  RM_DYNAMIC);.   
a380: 20 20 20 20 20 69 66 28 20 69 64 78 4e 65 77 3d       if( idxNew=
a390: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  =0 ) return;.   
a3a0: 20 20 20 20 20 70 4e 65 77 20 3d 20 26 70 57 43       pNew = &pWC
a3b0: 2d 3e 61 5b 69 64 78 4e 65 77 5d 3b 0a 20 20 20  ->a[idxNew];.   
a3c0: 20 20 20 20 20 6d 61 72 6b 54 65 72 6d 41 73 43       markTermAsC
a3d0: 68 69 6c 64 28 70 57 43 2c 20 69 64 78 4e 65 77  hild(pWC, idxNew
a3e0: 2c 20 69 64 78 54 65 72 6d 29 3b 0a 20 20 20 20  , idxTerm);.    
a3f0: 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43      pTerm = &pWC
a400: 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20  ->a[idxTerm];.  
a410: 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46        pTerm->wtF
a420: 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 50  lags |= TERM_COP
a430: 49 45 44 3b 0a 20 20 20 20 20 20 20 20 69 66 28  IED;.        if(
a440: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45   pExpr->op==TK_E
a450: 51 0a 20 20 20 20 20 20 20 20 20 26 26 20 21 45  Q.         && !E
a460: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
a470: 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69  Expr, EP_FromJoi
a480: 6e 29 0a 20 20 20 20 20 20 20 20 20 26 26 20 4f  n).         && O
a490: 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c  ptimizationEnabl
a4a0: 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 54 72  ed(db, SQLITE_Tr
a4b0: 61 6e 73 69 74 69 76 65 29 0a 20 20 20 20 20 20  ansitive).      
a4c0: 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70    ){.          p
a4d0: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
a4e0: 7c 3d 20 57 4f 5f 45 51 55 49 56 3b 0a 20 20 20  |= WO_EQUIV;.   
a4f0: 20 20 20 20 20 20 20 65 45 78 74 72 61 4f 70 20         eExtraOp 
a500: 3d 20 57 4f 5f 45 51 55 49 56 3b 0a 20 20 20 20  = WO_EQUIV;.    
a510: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
a520: 65 7b 0a 20 20 20 20 20 20 20 20 70 44 75 70 20  e{.        pDup 
a530: 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  = pExpr;.       
a540: 20 70 4e 65 77 20 3d 20 70 54 65 72 6d 3b 0a 20   pNew = pTerm;. 
a550: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 65 78 70       }.      exp
a560: 72 43 6f 6d 6d 75 74 65 28 70 50 61 72 73 65 2c  rCommute(pParse,
a570: 20 70 44 75 70 29 3b 0a 20 20 20 20 20 20 70 4c   pDup);.      pL
a580: 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  eft = sqlite3Exp
a590: 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 44 75  rSkipCollate(pDu
a5a0: 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  p->pLeft);.     
a5b0: 20 70 4e 65 77 2d 3e 6c 65 66 74 43 75 72 73 6f   pNew->leftCurso
a5c0: 72 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c  r = pLeft->iTabl
a5d0: 65 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 75  e;.      pNew->u
a5e0: 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c  .leftColumn = pL
a5f0: 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  eft->iColumn;.  
a600: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28 70      testcase( (p
a610: 72 65 72 65 71 4c 65 66 74 20 7c 20 65 78 74 72  rereqLeft | extr
a620: 61 52 69 67 68 74 29 20 21 3d 20 70 72 65 72 65  aRight) != prere
a630: 71 4c 65 66 74 20 29 3b 0a 20 20 20 20 20 20 70  qLeft );.      p
a640: 4e 65 77 2d 3e 70 72 65 72 65 71 52 69 67 68 74  New->prereqRight
a650: 20 3d 20 70 72 65 72 65 71 4c 65 66 74 20 7c 20   = prereqLeft | 
a660: 65 78 74 72 61 52 69 67 68 74 3b 0a 20 20 20 20  extraRight;.    
a670: 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 41 6c    pNew->prereqAl
a680: 6c 20 3d 20 70 72 65 72 65 71 41 6c 6c 3b 0a 20  l = prereqAll;. 
a690: 20 20 20 20 20 70 4e 65 77 2d 3e 65 4f 70 65 72       pNew->eOper
a6a0: 61 74 6f 72 20 3d 20 28 6f 70 65 72 61 74 6f 72  ator = (operator
a6b0: 4d 61 73 6b 28 70 44 75 70 2d 3e 6f 70 29 20 2b  Mask(pDup->op) +
a6c0: 20 65 45 78 74 72 61 4f 70 29 20 26 20 6f 70 4d   eExtraOp) & opM
a6d0: 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ask;.    }.  }..
a6e0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
a6f0: 4d 49 54 5f 42 45 54 57 45 45 4e 5f 4f 50 54 49  MIT_BETWEEN_OPTI
a700: 4d 49 5a 41 54 49 4f 4e 0a 20 20 2f 2a 20 49 66  MIZATION.  /* If
a710: 20 61 20 74 65 72 6d 20 69 73 20 74 68 65 20 42   a term is the B
a720: 45 54 57 45 45 4e 20 6f 70 65 72 61 74 6f 72 2c  ETWEEN operator,
a730: 20 63 72 65 61 74 65 20 74 77 6f 20 6e 65 77 20   create two new 
a740: 76 69 72 74 75 61 6c 20 74 65 72 6d 73 0a 20 20  virtual terms.  
a750: 2a 2a 20 74 68 61 74 20 64 65 66 69 6e 65 20 74  ** that define t
a760: 68 65 20 72 61 6e 67 65 20 74 68 61 74 20 74 68  he range that th
a770: 65 20 42 45 54 57 45 45 4e 20 69 6d 70 6c 65 6d  e BETWEEN implem
a780: 65 6e 74 73 2e 20 20 46 6f 72 20 65 78 61 6d 70  ents.  For examp
a790: 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  le:.  **.  **   
a7a0: 20 20 20 61 20 42 45 54 57 45 45 4e 20 62 20 41     a BETWEEN b A
a7b0: 4e 44 20 63 0a 20 20 2a 2a 0a 20 20 2a 2a 20 69  ND c.  **.  ** i
a7c0: 73 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f  s converted into
a7d0: 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
a7e0: 20 28 61 20 42 45 54 57 45 45 4e 20 62 20 41 4e   (a BETWEEN b AN
a7f0: 44 20 63 29 20 41 4e 44 20 28 61 3e 3d 62 29 20  D c) AND (a>=b) 
a800: 41 4e 44 20 28 61 3c 3d 63 29 0a 20 20 2a 2a 0a  AND (a<=c).  **.
a810: 20 20 2a 2a 20 54 68 65 20 74 77 6f 20 6e 65 77    ** The two new
a820: 20 74 65 72 6d 73 20 61 72 65 20 61 64 64 65 64   terms are added
a830: 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66   onto the end of
a840: 20 74 68 65 20 57 68 65 72 65 43 6c 61 75 73 65   the WhereClause
a850: 20 6f 62 6a 65 63 74 2e 0a 20 20 2a 2a 20 54 68   object..  ** Th
a860: 65 20 6e 65 77 20 74 65 72 6d 73 20 61 72 65 20  e new terms are 
a870: 22 64 79 6e 61 6d 69 63 22 20 61 6e 64 20 61 72  "dynamic" and ar
a880: 65 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 74 68  e children of th
a890: 65 20 6f 72 69 67 69 6e 61 6c 20 42 45 54 57 45  e original BETWE
a8a0: 45 4e 0a 20 20 2a 2a 20 74 65 72 6d 2e 20 20 54  EN.  ** term.  T
a8b0: 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20 69  hat means that i
a8c0: 66 20 74 68 65 20 42 45 54 57 45 45 4e 20 74 65  f the BETWEEN te
a8d0: 72 6d 20 69 73 20 63 6f 64 65 64 2c 20 74 68 65  rm is coded, the
a8e0: 20 63 68 69 6c 64 72 65 6e 20 61 72 65 0a 20 20   children are.  
a8f0: 2a 2a 20 73 6b 69 70 70 65 64 2e 20 20 4f 72 2c  ** skipped.  Or,
a900: 20 69 66 20 74 68 65 20 63 68 69 6c 64 72 65 6e   if the children
a910: 20 61 72 65 20 73 61 74 69 73 66 69 65 64 20 62   are satisfied b
a920: 79 20 61 6e 20 69 6e 64 65 78 2c 20 74 68 65 20  y an index, the 
a930: 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 42 45  original.  ** BE
a940: 54 57 45 45 4e 20 74 65 72 6d 20 69 73 20 73 6b  TWEEN term is sk
a950: 69 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 65 6c  ipped..  */.  el
a960: 73 65 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  se if( pExpr->op
a970: 3d 3d 54 4b 5f 42 45 54 57 45 45 4e 20 26 26 20  ==TK_BETWEEN && 
a980: 70 57 43 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20  pWC->op==TK_AND 
a990: 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20  ){.    ExprList 
a9a0: 2a 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e  *pList = pExpr->
a9b0: 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 69 6e 74  x.pList;.    int
a9c0: 20 69 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63   i;.    static c
a9d0: 6f 6e 73 74 20 75 38 20 6f 70 73 5b 5d 20 3d 20  onst u8 ops[] = 
a9e0: 7b 54 4b 5f 47 45 2c 20 54 4b 5f 4c 45 7d 3b 0a  {TK_GE, TK_LE};.
a9f0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73      assert( pLis
aa00: 74 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  t!=0 );.    asse
aa10: 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  rt( pList->nExpr
aa20: 3d 3d 32 20 29 3b 0a 20 20 20 20 66 6f 72 28 69  ==2 );.    for(i
aa30: 3d 30 3b 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20  =0; i<2; i++){. 
aa40: 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 45       Expr *pNewE
aa50: 78 70 72 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  xpr;.      int i
aa60: 64 78 4e 65 77 3b 0a 20 20 20 20 20 20 70 4e 65  dxNew;.      pNe
aa70: 77 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50  wExpr = sqlite3P
aa80: 45 78 70 72 28 70 50 61 72 73 65 2c 20 6f 70 73  Expr(pParse, ops
aa90: 5b 69 5d 2c 20 0a 20 20 20 20 20 20 20 20 20 20  [i], .          
aaa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aab0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 75     sqlite3ExprDu
aac0: 70 28 64 62 2c 20 70 45 78 70 72 2d 3e 70 4c 65  p(db, pExpr->pLe
aad0: 66 74 2c 20 30 29 2c 0a 20 20 20 20 20 20 20 20  ft, 0),.        
aae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aaf0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
ab00: 44 75 70 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61  Dup(db, pList->a
ab10: 5b 69 5d 2e 70 45 78 70 72 2c 20 30 29 2c 20 30  [i].pExpr, 0), 0
ab20: 29 3b 0a 20 20 20 20 20 20 74 72 61 6e 73 66 65  );.      transfe
ab30: 72 4a 6f 69 6e 4d 61 72 6b 69 6e 67 73 28 70 4e  rJoinMarkings(pN
ab40: 65 77 45 78 70 72 2c 20 70 45 78 70 72 29 3b 0a  ewExpr, pExpr);.
ab50: 20 20 20 20 20 20 69 64 78 4e 65 77 20 3d 20 77        idxNew = w
ab60: 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74  hereClauseInsert
ab70: 28 70 57 43 2c 20 70 4e 65 77 45 78 70 72 2c 20  (pWC, pNewExpr, 
ab80: 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52  TERM_VIRTUAL|TER
ab90: 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20  M_DYNAMIC);.    
aba0: 20 20 74 65 73 74 63 61 73 65 28 20 69 64 78 4e    testcase( idxN
abb0: 65 77 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 65  ew==0 );.      e
abc0: 78 70 72 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c  xprAnalyze(pSrc,
abd0: 20 70 57 43 2c 20 69 64 78 4e 65 77 29 3b 0a 20   pWC, idxNew);. 
abe0: 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57       pTerm = &pW
abf0: 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20  C->a[idxTerm];. 
ac00: 20 20 20 20 20 6d 61 72 6b 54 65 72 6d 41 73 43       markTermAsC
ac10: 68 69 6c 64 28 70 57 43 2c 20 69 64 78 4e 65 77  hild(pWC, idxNew
ac20: 2c 20 69 64 78 54 65 72 6d 29 3b 0a 20 20 20 20  , idxTerm);.    
ac30: 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  }.  }.#endif /* 
ac40: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 45 54 57  SQLITE_OMIT_BETW
ac50: 45 45 4e 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e  EEN_OPTIMIZATION
ac60: 20 2a 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e 65   */..#if !define
ac70: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52  d(SQLITE_OMIT_OR
ac80: 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 29 20 26  _OPTIMIZATION) &
ac90: 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
aca0: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29  E_OMIT_SUBQUERY)
acb0: 0a 20 20 2f 2a 20 41 6e 61 6c 79 7a 65 20 61 20  .  /* Analyze a 
acc0: 74 65 72 6d 20 74 68 61 74 20 69 73 20 63 6f 6d  term that is com
acd0: 70 6f 73 65 64 20 6f 66 20 74 77 6f 20 6f 72 20  posed of two or 
ace0: 6d 6f 72 65 20 73 75 62 74 65 72 6d 73 20 63 6f  more subterms co
acf0: 6e 6e 65 63 74 65 64 20 62 79 0a 20 20 2a 2a 20  nnected by.  ** 
ad00: 61 6e 20 4f 52 20 6f 70 65 72 61 74 6f 72 2e 0a  an OR operator..
ad10: 20 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 28 20    */.  else if( 
ad20: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52  pExpr->op==TK_OR
ad30: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
ad40: 70 57 43 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20  pWC->op==TK_AND 
ad50: 29 3b 0a 20 20 20 20 65 78 70 72 41 6e 61 6c 79  );.    exprAnaly
ad60: 7a 65 4f 72 54 65 72 6d 28 70 53 72 63 2c 20 70  zeOrTerm(pSrc, p
ad70: 57 43 2c 20 69 64 78 54 65 72 6d 29 3b 0a 20 20  WC, idxTerm);.  
ad80: 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e    pTerm = &pWC->
ad90: 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 7d 0a  a[idxTerm];.  }.
ada0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
adb0: 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a  _OMIT_OR_OPTIMIZ
adc0: 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66 6e 64 65  ATION */..#ifnde
add0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49  f SQLITE_OMIT_LI
ade0: 4b 45 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a  KE_OPTIMIZATION.
adf0: 20 20 2f 2a 20 41 64 64 20 63 6f 6e 73 74 72 61    /* Add constra
ae00: 69 6e 74 73 20 74 6f 20 72 65 64 75 63 65 20 74  ints to reduce t
ae10: 68 65 20 73 65 61 72 63 68 20 73 70 61 63 65 20  he search space 
ae20: 6f 6e 20 61 20 4c 49 4b 45 20 6f 72 20 47 4c 4f  on a LIKE or GLO
ae30: 42 0a 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72 2e  B.  ** operator.
ae40: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 6c 69 6b  .  **.  ** A lik
ae50: 65 20 70 61 74 74 65 72 6e 20 6f 66 20 74 68 65  e pattern of the
ae60: 20 66 6f 72 6d 20 22 78 20 4c 49 4b 45 20 27 61   form "x LIKE 'a
ae70: 62 63 25 27 22 20 69 73 20 63 68 61 6e 67 65 64  bc%'" is changed
ae80: 20 69 6e 74 6f 20 63 6f 6e 73 74 72 61 69 6e 74   into constraint
ae90: 73 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  s.  **.  **     
aea0: 20 20 20 20 20 78 3e 3d 27 61 62 63 27 20 41 4e       x>='abc' AN
aeb0: 44 20 78 3c 27 61 62 64 27 20 41 4e 44 20 78 20  D x<'abd' AND x 
aec0: 4c 49 4b 45 20 27 61 62 63 25 27 0a 20 20 2a 2a  LIKE 'abc%'.  **
aed0: 0a 20 20 2a 2a 20 54 68 65 20 6c 61 73 74 20 63  .  ** The last c
aee0: 68 61 72 61 63 74 65 72 20 6f 66 20 74 68 65 20  haracter of the 
aef0: 70 72 65 66 69 78 20 22 61 62 63 22 20 69 73 20  prefix "abc" is 
af00: 69 6e 63 72 65 6d 65 6e 74 65 64 20 74 6f 20 66  incremented to f
af10: 6f 72 6d 20 74 68 65 0a 20 20 2a 2a 20 74 65 72  orm the.  ** ter
af20: 6d 69 6e 61 74 69 6f 6e 20 63 6f 6e 64 69 74 69  mination conditi
af30: 6f 6e 20 22 61 62 64 22 2e 0a 20 20 2a 2f 0a 20  on "abd"..  */. 
af40: 20 69 66 28 20 70 57 43 2d 3e 6f 70 3d 3d 54 4b   if( pWC->op==TK
af50: 5f 41 4e 44 20 0a 20 20 20 26 26 20 69 73 4c 69  _AND .   && isLi
af60: 6b 65 4f 72 47 6c 6f 62 28 70 50 61 72 73 65 2c  keOrGlob(pParse,
af70: 20 70 45 78 70 72 2c 20 26 70 53 74 72 31 2c 20   pExpr, &pStr1, 
af80: 26 69 73 43 6f 6d 70 6c 65 74 65 2c 20 26 6e 6f  &isComplete, &no
af90: 43 61 73 65 29 0a 20 20 29 7b 0a 20 20 20 20 45  Case).  ){.    E
afa0: 78 70 72 20 2a 70 4c 65 66 74 3b 20 20 20 20 20  xpr *pLeft;     
afb0: 20 20 2f 2a 20 4c 48 53 20 6f 66 20 4c 49 4b 45    /* LHS of LIKE
afc0: 2f 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72 20 2a  /GLOB operator *
afd0: 2f 0a 20 20 20 20 45 78 70 72 20 2a 70 53 74 72  /.    Expr *pStr
afe0: 32 3b 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79  2;       /* Copy
aff0: 20 6f 66 20 70 53 74 72 31 20 2d 20 52 48 53 20   of pStr1 - RHS 
b000: 6f 66 20 4c 49 4b 45 2f 47 4c 4f 42 20 6f 70 65  of LIKE/GLOB ope
b010: 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 45 78 70  rator */.    Exp
b020: 72 20 2a 70 4e 65 77 45 78 70 72 31 3b 0a 20 20  r *pNewExpr1;.  
b030: 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72    Expr *pNewExpr
b040: 32 3b 0a 20 20 20 20 69 6e 74 20 69 64 78 4e 65  2;.    int idxNe
b050: 77 31 3b 0a 20 20 20 20 69 6e 74 20 69 64 78 4e  w1;.    int idxN
b060: 65 77 32 3b 0a 20 20 20 20 54 6f 6b 65 6e 20 73  ew2;.    Token s
b070: 43 6f 6c 6c 53 65 71 4e 61 6d 65 3b 20 20 2f 2a  CollSeqName;  /*
b080: 20 4e 61 6d 65 20 6f 66 20 63 6f 6c 6c 61 74 69   Name of collati
b090: 6e 67 20 73 65 71 75 65 6e 63 65 20 2a 2f 0a 0a  ng sequence */..
b0a0: 20 20 20 20 70 4c 65 66 74 20 3d 20 70 45 78 70      pLeft = pExp
b0b0: 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 31 5d  r->x.pList->a[1]
b0c0: 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 53 74 72  .pExpr;.    pStr
b0d0: 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  2 = sqlite3ExprD
b0e0: 75 70 28 64 62 2c 20 70 53 74 72 31 2c 20 30 29  up(db, pStr1, 0)
b0f0: 3b 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e 6d  ;.    if( !db->m
b100: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
b110: 20 20 20 20 20 75 38 20 63 2c 20 2a 70 43 3b 20       u8 c, *pC; 
b120: 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 63 68        /* Last ch
b130: 61 72 61 63 74 65 72 20 62 65 66 6f 72 65 20 74  aracter before t
b140: 68 65 20 66 69 72 73 74 20 77 69 6c 64 63 61 72  he first wildcar
b150: 64 20 2a 2f 0a 20 20 20 20 20 20 70 43 20 3d 20  d */.      pC = 
b160: 28 75 38 2a 29 26 70 53 74 72 32 2d 3e 75 2e 7a  (u8*)&pStr2->u.z
b170: 54 6f 6b 65 6e 5b 73 71 6c 69 74 65 33 53 74 72  Token[sqlite3Str
b180: 6c 65 6e 33 30 28 70 53 74 72 32 2d 3e 75 2e 7a  len30(pStr2->u.z
b190: 54 6f 6b 65 6e 29 2d 31 5d 3b 0a 20 20 20 20 20  Token)-1];.     
b1a0: 20 63 20 3d 20 2a 70 43 3b 0a 20 20 20 20 20 20   c = *pC;.      
b1b0: 69 66 28 20 6e 6f 43 61 73 65 20 29 7b 0a 20 20  if( noCase ){.  
b1c0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69        /* The poi
b1d0: 6e 74 20 69 73 20 74 6f 20 69 6e 63 72 65 6d 65  nt is to increme
b1e0: 6e 74 20 74 68 65 20 6c 61 73 74 20 63 68 61 72  nt the last char
b1f0: 61 63 74 65 72 20 62 65 66 6f 72 65 20 74 68 65  acter before the
b200: 20 66 69 72 73 74 0a 20 20 20 20 20 20 20 20 2a   first.        *
b210: 2a 20 77 69 6c 64 63 61 72 64 2e 20 20 42 75 74  * wildcard.  But
b220: 20 69 66 20 77 65 20 69 6e 63 72 65 6d 65 6e 74   if we increment
b230: 20 27 40 27 2c 20 74 68 61 74 20 77 69 6c 6c 20   '@', that will 
b240: 70 75 73 68 20 69 74 20 69 6e 74 6f 20 74 68 65  push it into the
b250: 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 70 68  .        ** alph
b260: 61 62 65 74 69 63 20 72 61 6e 67 65 20 77 68 65  abetic range whe
b270: 72 65 20 63 61 73 65 20 63 6f 6e 76 65 72 73 69  re case conversi
b280: 6f 6e 73 20 77 69 6c 6c 20 6d 65 73 73 20 75 70  ons will mess up
b290: 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a   the .        **
b2a0: 20 69 6e 65 71 75 61 6c 69 74 79 2e 20 20 54 6f   inequality.  To
b2b0: 20 61 76 6f 69 64 20 74 68 69 73 2c 20 6d 61 6b   avoid this, mak
b2c0: 65 20 73 75 72 65 20 74 6f 20 61 6c 73 6f 20 72  e sure to also r
b2d0: 75 6e 20 74 68 65 20 66 75 6c 6c 0a 20 20 20 20  un the full.    
b2e0: 20 20 20 20 2a 2a 20 4c 49 4b 45 20 6f 6e 20 61      ** LIKE on a
b2f0: 6c 6c 20 63 61 6e 64 69 64 61 74 65 20 65 78 70  ll candidate exp
b300: 72 65 73 73 69 6f 6e 73 20 62 79 20 63 6c 65 61  ressions by clea
b310: 72 69 6e 67 20 74 68 65 20 69 73 43 6f 6d 70 6c  ring the isCompl
b320: 65 74 65 20 66 6c 61 67 0a 20 20 20 20 20 20 20  ete flag.       
b330: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
b340: 63 3d 3d 27 41 27 2d 31 20 29 20 69 73 43 6f 6d  c=='A'-1 ) isCom
b350: 70 6c 65 74 65 20 3d 20 30 3b 0a 20 20 20 20 20  plete = 0;.     
b360: 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33 55 70     c = sqlite3Up
b370: 70 65 72 54 6f 4c 6f 77 65 72 5b 63 5d 3b 0a 20  perToLower[c];. 
b380: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 70 43       }.      *pC
b390: 20 3d 20 63 20 2b 20 31 3b 0a 20 20 20 20 7d 0a   = c + 1;.    }.
b3a0: 20 20 20 20 73 43 6f 6c 6c 53 65 71 4e 61 6d 65      sCollSeqName
b3b0: 2e 7a 20 3d 20 6e 6f 43 61 73 65 20 3f 20 22 4e  .z = noCase ? "N
b3c0: 4f 43 41 53 45 22 20 3a 20 22 42 49 4e 41 52 59  OCASE" : "BINARY
b3d0: 22 3b 0a 20 20 20 20 73 43 6f 6c 6c 53 65 71 4e  ";.    sCollSeqN
b3e0: 61 6d 65 2e 6e 20 3d 20 36 3b 0a 20 20 20 20 70  ame.n = 6;.    p
b3f0: 4e 65 77 45 78 70 72 31 20 3d 20 73 71 6c 69 74  NewExpr1 = sqlit
b400: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4c  e3ExprDup(db, pL
b410: 65 66 74 2c 20 30 29 3b 0a 20 20 20 20 70 4e 65  eft, 0);.    pNe
b420: 77 45 78 70 72 31 20 3d 20 73 71 6c 69 74 65 33  wExpr1 = sqlite3
b430: 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
b440: 5f 47 45 2c 20 0a 20 20 20 20 20 20 20 20 20 20  _GE, .          
b450: 20 73 71 6c 69 74 65 33 45 78 70 72 41 64 64 43   sqlite3ExprAddC
b460: 6f 6c 6c 61 74 65 54 6f 6b 65 6e 28 70 50 61 72  ollateToken(pPar
b470: 73 65 2c 70 4e 65 77 45 78 70 72 31 2c 26 73 43  se,pNewExpr1,&sC
b480: 6f 6c 6c 53 65 71 4e 61 6d 65 29 2c 0a 20 20 20  ollSeqName),.   
b490: 20 20 20 20 20 20 20 20 70 53 74 72 31 2c 20 30          pStr1, 0
b4a0: 29 3b 0a 20 20 20 20 74 72 61 6e 73 66 65 72 4a  );.    transferJ
b4b0: 6f 69 6e 4d 61 72 6b 69 6e 67 73 28 70 4e 65 77  oinMarkings(pNew
b4c0: 45 78 70 72 31 2c 20 70 45 78 70 72 29 3b 0a 20  Expr1, pExpr);. 
b4d0: 20 20 20 69 64 78 4e 65 77 31 20 3d 20 77 68 65     idxNew1 = whe
b4e0: 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70  reClauseInsert(p
b4f0: 57 43 2c 20 70 4e 65 77 45 78 70 72 31 2c 20 54  WC, pNewExpr1, T
b500: 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d  ERM_VIRTUAL|TERM
b510: 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 74  _DYNAMIC);.    t
b520: 65 73 74 63 61 73 65 28 20 69 64 78 4e 65 77 31  estcase( idxNew1
b530: 3d 3d 30 20 29 3b 0a 20 20 20 20 65 78 70 72 41  ==0 );.    exprA
b540: 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20 70 57 43  nalyze(pSrc, pWC
b550: 2c 20 69 64 78 4e 65 77 31 29 3b 0a 20 20 20 20  , idxNew1);.    
b560: 70 4e 65 77 45 78 70 72 32 20 3d 20 73 71 6c 69  pNewExpr2 = sqli
b570: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
b580: 4c 65 66 74 2c 20 30 29 3b 0a 20 20 20 20 70 4e  Left, 0);.    pN
b590: 65 77 45 78 70 72 32 20 3d 20 73 71 6c 69 74 65  ewExpr2 = sqlite
b5a0: 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
b5b0: 4b 5f 4c 54 2c 0a 20 20 20 20 20 20 20 20 20 20  K_LT,.          
b5c0: 20 73 71 6c 69 74 65 33 45 78 70 72 41 64 64 43   sqlite3ExprAddC
b5d0: 6f 6c 6c 61 74 65 54 6f 6b 65 6e 28 70 50 61 72  ollateToken(pPar
b5e0: 73 65 2c 70 4e 65 77 45 78 70 72 32 2c 26 73 43  se,pNewExpr2,&sC
b5f0: 6f 6c 6c 53 65 71 4e 61 6d 65 29 2c 0a 20 20 20  ollSeqName),.   
b600: 20 20 20 20 20 20 20 20 70 53 74 72 32 2c 20 30          pStr2, 0
b610: 29 3b 0a 20 20 20 20 74 72 61 6e 73 66 65 72 4a  );.    transferJ
b620: 6f 69 6e 4d 61 72 6b 69 6e 67 73 28 70 4e 65 77  oinMarkings(pNew
b630: 45 78 70 72 32 2c 20 70 45 78 70 72 29 3b 0a 20  Expr2, pExpr);. 
b640: 20 20 20 69 64 78 4e 65 77 32 20 3d 20 77 68 65     idxNew2 = whe
b650: 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70  reClauseInsert(p
b660: 57 43 2c 20 70 4e 65 77 45 78 70 72 32 2c 20 54  WC, pNewExpr2, T
b670: 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d  ERM_VIRTUAL|TERM
b680: 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 74  _DYNAMIC);.    t
b690: 65 73 74 63 61 73 65 28 20 69 64 78 4e 65 77 32  estcase( idxNew2
b6a0: 3d 3d 30 20 29 3b 0a 20 20 20 20 65 78 70 72 41  ==0 );.    exprA
b6b0: 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20 70 57 43  nalyze(pSrc, pWC
b6c0: 2c 20 69 64 78 4e 65 77 32 29 3b 0a 20 20 20 20  , idxNew2);.    
b6d0: 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b  pTerm = &pWC->a[
b6e0: 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20 69 66  idxTerm];.    if
b6f0: 28 20 69 73 43 6f 6d 70 6c 65 74 65 20 29 7b 0a  ( isComplete ){.
b700: 20 20 20 20 20 20 6d 61 72 6b 54 65 72 6d 41 73        markTermAs
b710: 43 68 69 6c 64 28 70 57 43 2c 20 69 64 78 4e 65  Child(pWC, idxNe
b720: 77 31 2c 20 69 64 78 54 65 72 6d 29 3b 0a 20 20  w1, idxTerm);.  
b730: 20 20 20 20 6d 61 72 6b 54 65 72 6d 41 73 43 68      markTermAsCh
b740: 69 6c 64 28 70 57 43 2c 20 69 64 78 4e 65 77 32  ild(pWC, idxNew2
b750: 2c 20 69 64 78 54 65 72 6d 29 3b 0a 20 20 20 20  , idxTerm);.    
b760: 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  }.  }.#endif /* 
b770: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45  SQLITE_OMIT_LIKE
b780: 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f  _OPTIMIZATION */
b790: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
b7a0: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
b7b0: 4c 45 0a 20 20 2f 2a 20 41 64 64 20 61 20 57 4f  LE.  /* Add a WO
b7c0: 5f 4d 41 54 43 48 20 61 75 78 69 6c 69 61 72 79  _MATCH auxiliary
b7d0: 20 74 65 72 6d 20 74 6f 20 74 68 65 20 63 6f 6e   term to the con
b7e0: 73 74 72 61 69 6e 74 20 73 65 74 20 69 66 20 74  straint set if t
b7f0: 68 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74 20  he.  ** current 
b800: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6f 66  expression is of
b810: 20 74 68 65 20 66 6f 72 6d 3a 20 20 63 6f 6c 75   the form:  colu
b820: 6d 6e 20 4d 41 54 43 48 20 65 78 70 72 2e 0a 20  mn MATCH expr.. 
b830: 20 2a 2a 20 54 68 69 73 20 69 6e 66 6f 72 6d 61   ** This informa
b840: 74 69 6f 6e 20 69 73 20 75 73 65 64 20 62 79 20  tion is used by 
b850: 74 68 65 20 78 42 65 73 74 49 6e 64 65 78 20 6d  the xBestIndex m
b860: 65 74 68 6f 64 73 20 6f 66 0a 20 20 2a 2a 20 76  ethods of.  ** v
b870: 69 72 74 75 61 6c 20 74 61 62 6c 65 73 2e 20 20  irtual tables.  
b880: 54 68 65 20 6e 61 74 69 76 65 20 71 75 65 72 79  The native query
b890: 20 6f 70 74 69 6d 69 7a 65 72 20 64 6f 65 73 20   optimizer does 
b8a0: 6e 6f 74 20 61 74 74 65 6d 70 74 0a 20 20 2a 2a  not attempt.  **
b8b0: 20 74 6f 20 64 6f 20 61 6e 79 74 68 69 6e 67 20   to do anything 
b8c0: 77 69 74 68 20 4d 41 54 43 48 20 66 75 6e 63 74  with MATCH funct
b8d0: 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ions..  */.  if(
b8e0: 20 69 73 4d 61 74 63 68 4f 66 43 6f 6c 75 6d 6e   isMatchOfColumn
b8f0: 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 69  (pExpr) ){.    i
b900: 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20 20 20 45  nt idxNew;.    E
b910: 78 70 72 20 2a 70 52 69 67 68 74 2c 20 2a 70 4c  xpr *pRight, *pL
b920: 65 66 74 3b 0a 20 20 20 20 57 68 65 72 65 54 65  eft;.    WhereTe
b930: 72 6d 20 2a 70 4e 65 77 54 65 72 6d 3b 0a 20 20  rm *pNewTerm;.  
b940: 20 20 42 69 74 6d 61 73 6b 20 70 72 65 72 65 71    Bitmask prereq
b950: 43 6f 6c 75 6d 6e 2c 20 70 72 65 72 65 71 45 78  Column, prereqEx
b960: 70 72 3b 0a 0a 20 20 20 20 70 52 69 67 68 74 20  pr;..    pRight 
b970: 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  = pExpr->x.pList
b980: 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[0].pExpr;.  
b990: 20 20 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d    pLeft = pExpr-
b9a0: 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70  >x.pList->a[1].p
b9b0: 45 78 70 72 3b 0a 20 20 20 20 70 72 65 72 65 71  Expr;.    prereq
b9c0: 45 78 70 72 20 3d 20 65 78 70 72 54 61 62 6c 65  Expr = exprTable
b9d0: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
b9e0: 70 52 69 67 68 74 29 3b 0a 20 20 20 20 70 72 65  pRight);.    pre
b9f0: 72 65 71 43 6f 6c 75 6d 6e 20 3d 20 65 78 70 72  reqColumn = expr
ba00: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
ba10: 53 65 74 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20  Set, pLeft);.   
ba20: 20 69 66 28 20 28 70 72 65 72 65 71 45 78 70 72   if( (prereqExpr
ba30: 20 26 20 70 72 65 72 65 71 43 6f 6c 75 6d 6e 29   & prereqColumn)
ba40: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 45 78 70  ==0 ){.      Exp
ba50: 72 20 2a 70 4e 65 77 45 78 70 72 3b 0a 20 20 20  r *pNewExpr;.   
ba60: 20 20 20 70 4e 65 77 45 78 70 72 20 3d 20 73 71     pNewExpr = sq
ba70: 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
ba80: 65 2c 20 54 4b 5f 4d 41 54 43 48 2c 20 0a 20 20  e, TK_MATCH, .  
ba90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
baa0: 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 73              0, s
bab0: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
bac0: 2c 20 70 52 69 67 68 74 2c 20 30 29 2c 20 30 29  , pRight, 0), 0)
bad0: 3b 0a 20 20 20 20 20 20 69 64 78 4e 65 77 20 3d  ;.      idxNew =
bae0: 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65   whereClauseInse
baf0: 72 74 28 70 57 43 2c 20 70 4e 65 77 45 78 70 72  rt(pWC, pNewExpr
bb00: 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54  , TERM_VIRTUAL|T
bb10: 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20  ERM_DYNAMIC);.  
bb20: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 64      testcase( id
bb30: 78 4e 65 77 3d 3d 30 20 29 3b 0a 20 20 20 20 20  xNew==0 );.     
bb40: 20 70 4e 65 77 54 65 72 6d 20 3d 20 26 70 57 43   pNewTerm = &pWC
bb50: 2d 3e 61 5b 69 64 78 4e 65 77 5d 3b 0a 20 20 20  ->a[idxNew];.   
bb60: 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 70 72 65     pNewTerm->pre
bb70: 72 65 71 52 69 67 68 74 20 3d 20 70 72 65 72 65  reqRight = prere
bb80: 71 45 78 70 72 3b 0a 20 20 20 20 20 20 70 4e 65  qExpr;.      pNe
bb90: 77 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  wTerm->leftCurso
bba0: 72 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c  r = pLeft->iTabl
bbb0: 65 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72  e;.      pNewTer
bbc0: 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20  m->u.leftColumn 
bbd0: 3d 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e  = pLeft->iColumn
bbe0: 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d  ;.      pNewTerm
bbf0: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 57 4f  ->eOperator = WO
bc00: 5f 4d 41 54 43 48 3b 0a 20 20 20 20 20 20 6d 61  _MATCH;.      ma
bc10: 72 6b 54 65 72 6d 41 73 43 68 69 6c 64 28 70 57  rkTermAsChild(pW
bc20: 43 2c 20 69 64 78 4e 65 77 2c 20 69 64 78 54 65  C, idxNew, idxTe
bc30: 72 6d 29 3b 0a 20 20 20 20 20 20 70 54 65 72 6d  rm);.      pTerm
bc40: 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65   = &pWC->a[idxTe
bc50: 72 6d 5d 3b 0a 20 20 20 20 20 20 70 54 65 72 6d  rm];.      pTerm
bc60: 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52  ->wtFlags |= TER
bc70: 4d 5f 43 4f 50 49 45 44 3b 0a 20 20 20 20 20 20  M_COPIED;.      
bc80: 70 4e 65 77 54 65 72 6d 2d 3e 70 72 65 72 65 71  pNewTerm->prereq
bc90: 41 6c 6c 20 3d 20 70 54 65 72 6d 2d 3e 70 72 65  All = pTerm->pre
bca0: 72 65 71 41 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20  reqAll;.    }.  
bcb0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
bcc0: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
bcd0: 41 42 4c 45 20 2a 2f 0a 0a 23 69 66 64 65 66 20  ABLE */..#ifdef 
bce0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
bcf0: 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 2f  AT3_OR_STAT4.  /
bd00: 2a 20 57 68 65 6e 20 73 71 6c 69 74 65 5f 73 74  * When sqlite_st
bd10: 61 74 33 20 68 69 73 74 6f 67 72 61 6d 20 64 61  at3 histogram da
bd20: 74 61 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20  ta is available 
bd30: 61 6e 20 6f 70 65 72 61 74 6f 72 20 6f 66 20 74  an operator of t
bd40: 68 65 0a 20 20 2a 2a 20 66 6f 72 6d 20 22 78 20  he.  ** form "x 
bd50: 49 53 20 4e 4f 54 20 4e 55 4c 4c 22 20 63 61 6e  IS NOT NULL" can
bd60: 20 73 6f 6d 65 74 69 6d 65 73 20 62 65 20 65 76   sometimes be ev
bd70: 61 6c 75 61 74 65 64 20 6d 6f 72 65 20 65 66 66  aluated more eff
bd80: 69 63 69 65 6e 74 6c 79 0a 20 20 2a 2a 20 61 73  iciently.  ** as
bd90: 20 22 78 3e 4e 55 4c 4c 22 20 69 66 20 78 20 69   "x>NULL" if x i
bda0: 73 20 6e 6f 74 20 61 6e 20 49 4e 54 45 47 45 52  s not an INTEGER
bdb0: 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 20 20 53   PRIMARY KEY.  S
bdc0: 6f 20 63 6f 6e 73 74 72 75 63 74 20 61 0a 20 20  o construct a.  
bdd0: 2a 2a 20 76 69 72 74 75 61 6c 20 74 65 72 6d 20  ** virtual term 
bde0: 6f 66 20 74 68 61 74 20 66 6f 72 6d 2e 0a 20 20  of that form..  
bdf0: 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61  **.  ** Note tha
be00: 74 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 65  t the virtual te
be10: 72 6d 20 6d 75 73 74 20 62 65 20 74 61 67 67 65  rm must be tagge
be20: 64 20 77 69 74 68 20 54 45 52 4d 5f 56 4e 55 4c  d with TERM_VNUL
be30: 4c 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20 54 45  L.  This.  ** TE
be40: 52 4d 5f 56 4e 55 4c 4c 20 74 61 67 20 77 69 6c  RM_VNULL tag wil
be50: 6c 20 73 75 70 70 72 65 73 73 20 74 68 65 20 6e  l suppress the n
be60: 6f 74 2d 6e 75 6c 6c 20 63 68 65 63 6b 20 61 74  ot-null check at
be70: 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 0a 20   the beginning. 
be80: 20 2a 2a 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e   ** of the loop.
be90: 20 20 57 69 74 68 6f 75 74 20 74 68 65 20 54 45    Without the TE
bea0: 52 4d 5f 56 4e 55 4c 4c 20 66 6c 61 67 2c 20 74  RM_VNULL flag, t
beb0: 68 65 20 6e 6f 74 2d 6e 75 6c 6c 20 63 68 65 63  he not-null chec
bec0: 6b 20 61 74 0a 20 20 2a 2a 20 74 68 65 20 73 74  k at.  ** the st
bed0: 61 72 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  art of the loop 
bee0: 77 69 6c 6c 20 70 72 65 76 65 6e 74 20 61 6e 79  will prevent any
bef0: 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 62 65   results from be
bf00: 69 6e 67 20 72 65 74 75 72 6e 65 64 2e 0a 20 20  ing returned..  
bf10: 2a 2f 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  */.  if( pExpr->
bf20: 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 0a 20  op==TK_NOTNULL. 
bf30: 20 20 26 26 20 70 45 78 70 72 2d 3e 70 4c 65 66    && pExpr->pLef
bf40: 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  t->op==TK_COLUMN
bf50: 0a 20 20 20 26 26 20 70 45 78 70 72 2d 3e 70 4c  .   && pExpr->pL
bf60: 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 0a  eft->iColumn>=0.
bf70: 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69     && Optimizati
bf80: 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20 53 51  onEnabled(db, SQ
bf90: 4c 49 54 45 5f 53 74 61 74 33 34 29 0a 20 20 29  LITE_Stat34).  )
bfa0: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77  {.    Expr *pNew
bfb0: 45 78 70 72 3b 0a 20 20 20 20 45 78 70 72 20 2a  Expr;.    Expr *
bfc0: 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70  pLeft = pExpr->p
bfd0: 4c 65 66 74 3b 0a 20 20 20 20 69 6e 74 20 69 64  Left;.    int id
bfe0: 78 4e 65 77 3b 0a 20 20 20 20 57 68 65 72 65 54  xNew;.    WhereT
bff0: 65 72 6d 20 2a 70 4e 65 77 54 65 72 6d 3b 0a 0a  erm *pNewTerm;..
c000: 20 20 20 20 70 4e 65 77 45 78 70 72 20 3d 20 73      pNewExpr = s
c010: 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
c020: 73 65 2c 20 54 4b 5f 47 54 2c 0a 20 20 20 20 20  se, TK_GT,.     
c030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c040: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
c050: 70 72 44 75 70 28 64 62 2c 20 70 4c 65 66 74 2c  prDup(db, pLeft,
c060: 20 30 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20   0),.           
c070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c080: 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
c090: 61 72 73 65 2c 20 54 4b 5f 4e 55 4c 4c 2c 20 30  arse, TK_NULL, 0
c0a0: 2c 20 30 2c 20 30 29 2c 20 30 29 3b 0a 0a 20 20  , 0, 0), 0);..  
c0b0: 20 20 69 64 78 4e 65 77 20 3d 20 77 68 65 72 65    idxNew = where
c0c0: 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57 43  ClauseInsert(pWC
c0d0: 2c 20 70 4e 65 77 45 78 70 72 2c 0a 20 20 20 20  , pNewExpr,.    
c0e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c0f0: 20 20 20 20 20 20 20 20 20 20 54 45 52 4d 5f 56            TERM_V
c100: 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41  IRTUAL|TERM_DYNA
c110: 4d 49 43 7c 54 45 52 4d 5f 56 4e 55 4c 4c 29 3b  MIC|TERM_VNULL);
c120: 0a 20 20 20 20 69 66 28 20 69 64 78 4e 65 77 20  .    if( idxNew 
c130: 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72  ){.      pNewTer
c140: 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 4e  m = &pWC->a[idxN
c150: 65 77 5d 3b 0a 20 20 20 20 20 20 70 4e 65 77 54  ew];.      pNewT
c160: 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
c170: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4e 65 77   = 0;.      pNew
c180: 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
c190: 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65   = pLeft->iTable
c1a0: 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d  ;.      pNewTerm
c1b0: 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d  ->u.leftColumn =
c1c0: 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b   pLeft->iColumn;
c1d0: 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d  .      pNewTerm-
c1e0: 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 57 4f 5f  >eOperator = WO_
c1f0: 47 54 3b 0a 20 20 20 20 20 20 6d 61 72 6b 54 65  GT;.      markTe
c200: 72 6d 41 73 43 68 69 6c 64 28 70 57 43 2c 20 69  rmAsChild(pWC, i
c210: 64 78 4e 65 77 2c 20 69 64 78 54 65 72 6d 29 3b  dxNew, idxTerm);
c220: 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26  .      pTerm = &
c230: 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b  pWC->a[idxTerm];
c240: 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 77 74  .      pTerm->wt
c250: 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f  Flags |= TERM_CO
c260: 50 49 45 44 3b 0a 20 20 20 20 20 20 70 4e 65 77  PIED;.      pNew
c270: 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20  Term->prereqAll 
c280: 3d 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41  = pTerm->prereqA
c290: 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  ll;.    }.  }.#e
c2a0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45  ndif /* SQLITE_E
c2b0: 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53  NABLE_STAT3_OR_S
c2c0: 54 41 54 34 20 2a 2f 0a 0a 20 20 2f 2a 20 50 72  TAT4 */..  /* Pr
c2d0: 65 76 65 6e 74 20 4f 4e 20 63 6c 61 75 73 65 20  event ON clause 
c2e0: 74 65 72 6d 73 20 6f 66 20 61 20 4c 45 46 54 20  terms of a LEFT 
c2f0: 4a 4f 49 4e 20 66 72 6f 6d 20 62 65 69 6e 67 20  JOIN from being 
c300: 75 73 65 64 20 74 6f 20 64 72 69 76 65 0a 20 20  used to drive.  
c310: 2a 2a 20 61 6e 20 69 6e 64 65 78 20 66 6f 72 20  ** an index for 
c320: 74 61 62 6c 65 73 20 74 6f 20 74 68 65 20 6c 65  tables to the le
c330: 66 74 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 0a  ft of the join..
c340: 20 20 2a 2f 0a 20 20 70 54 65 72 6d 2d 3e 70 72    */.  pTerm->pr
c350: 65 72 65 71 52 69 67 68 74 20 7c 3d 20 65 78 74  ereqRight |= ext
c360: 72 61 52 69 67 68 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  raRight;.}../*.*
c370: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
c380: 73 65 61 72 63 68 65 73 20 70 4c 69 73 74 20 66  searches pList f
c390: 6f 72 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74  or an entry that
c3a0: 20 6d 61 74 63 68 65 73 20 74 68 65 20 69 43 6f   matches the iCo
c3b0: 6c 2d 74 68 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 6f  l-th column.** o
c3c0: 66 20 69 6e 64 65 78 20 70 49 64 78 2e 0a 2a 2a  f index pIdx..**
c3d0: 0a 2a 2a 20 49 66 20 73 75 63 68 20 61 6e 20 65  .** If such an e
c3e0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66 6f 75  xpression is fou
c3f0: 6e 64 2c 20 69 74 73 20 69 6e 64 65 78 20 69 6e  nd, its index in
c400: 20 70 4c 69 73 74 2d 3e 61 5b 5d 20 69 73 20 72   pList->a[] is r
c410: 65 74 75 72 6e 65 64 2e 20 49 66 0a 2a 2a 20 6e  eturned. If.** n
c420: 6f 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  o expression is 
c430: 66 6f 75 6e 64 2c 20 2d 31 20 69 73 20 72 65 74  found, -1 is ret
c440: 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
c450: 20 69 6e 74 20 66 69 6e 64 49 6e 64 65 78 43 6f   int findIndexCo
c460: 6c 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  l(.  Parse *pPar
c470: 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
c480: 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f       /* Parse co
c490: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c  ntext */.  ExprL
c4a0: 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20  ist *pList,     
c4b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
c4c0: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 74 6f  pression list to
c4d0: 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 69 6e 74   search */.  int
c4e0: 20 69 42 61 73 65 2c 20 20 20 20 20 20 20 20 20   iBase,         
c4f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c500: 43 75 72 73 6f 72 20 66 6f 72 20 74 61 62 6c 65  Cursor for table
c510: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
c520: 20 70 49 64 78 20 2a 2f 0a 20 20 49 6e 64 65 78   pIdx */.  Index
c530: 20 2a 70 49 64 78 2c 20 20 20 20 20 20 20 20 20   *pIdx,         
c540: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
c550: 64 65 78 20 74 6f 20 6d 61 74 63 68 20 63 6f 6c  dex to match col
c560: 75 6d 6e 20 6f 66 20 2a 2f 0a 20 20 69 6e 74 20  umn of */.  int 
c570: 69 43 6f 6c 20 20 20 20 20 20 20 20 20 20 20 20  iCol            
c580: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
c590: 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20 74  olumn of index t
c5a0: 6f 20 6d 61 74 63 68 20 2a 2f 0a 29 7b 0a 20 20  o match */.){.  
c5b0: 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74 20 63  int i;.  const c
c5c0: 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70 49 64  har *zColl = pId
c5d0: 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 43 6f 6c 5d 3b  x->azColl[iCol];
c5e0: 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ..  for(i=0; i<p
c5f0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
c600: 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 20 3d  ){.    Expr *p =
c610: 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70   sqlite3ExprSkip
c620: 43 6f 6c 6c 61 74 65 28 70 4c 69 73 74 2d 3e 61  Collate(pList->a
c630: 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [i].pExpr);.    
c640: 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  if( p->op==TK_CO
c650: 4c 55 4d 4e 0a 20 20 20 20 20 26 26 20 70 2d 3e  LUMN.     && p->
c660: 69 43 6f 6c 75 6d 6e 3d 3d 70 49 64 78 2d 3e 61  iColumn==pIdx->a
c670: 69 43 6f 6c 75 6d 6e 5b 69 43 6f 6c 5d 0a 20 20  iColumn[iCol].  
c680: 20 20 20 26 26 20 70 2d 3e 69 54 61 62 6c 65 3d     && p->iTable=
c690: 3d 69 42 61 73 65 0a 20 20 20 20 29 7b 0a 20 20  =iBase.    ){.  
c6a0: 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
c6b0: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
c6c0: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
c6d0: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
c6e0: 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 41 4c  r);.      if( AL
c6f0: 57 41 59 53 28 70 43 6f 6c 6c 29 20 26 26 20 30  WAYS(pColl) && 0
c700: 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ==sqlite3StrICmp
c710: 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a  (pColl->zName, z
c720: 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20 20  Coll) ){.       
c730: 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 20 20 20   return i;.     
c740: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
c750: 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a  return -1;.}../*
c760: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
c770: 69 66 20 74 68 65 20 44 49 53 54 49 4e 43 54 20  if the DISTINCT 
c780: 65 78 70 72 65 73 73 69 6f 6e 2d 6c 69 73 74 20  expression-list 
c790: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 74 68  passed as the th
c7a0: 69 72 64 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20  ird argument.** 
c7b0: 69 73 20 72 65 64 75 6e 64 61 6e 74 2e 0a 2a 2a  is redundant..**
c7c0: 0a 2a 2a 20 41 20 44 49 53 54 49 4e 43 54 20 6c  .** A DISTINCT l
c7d0: 69 73 74 20 69 73 20 72 65 64 75 6e 64 61 6e 74  ist is redundant
c7e0: 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
c7f0: 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20 73   contains some s
c800: 75 62 73 65 74 20 6f 66 0a 2a 2a 20 63 6f 6c 75  ubset of.** colu
c810: 6d 6e 73 20 74 68 61 74 20 61 72 65 20 75 6e 69  mns that are uni
c820: 71 75 65 20 61 6e 64 20 6e 6f 6e 2d 6e 75 6c 6c  que and non-null
c830: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
c840: 69 73 44 69 73 74 69 6e 63 74 52 65 64 75 6e 64  isDistinctRedund
c850: 61 6e 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ant(.  Parse *pP
c860: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  arse,           
c870: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
c880: 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ext */.  SrcList
c890: 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 20 20 20   *pTabList,     
c8a0: 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63     /* The FROM c
c8b0: 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65  lause */.  Where
c8c0: 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20  Clause *pWC,    
c8d0: 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
c8e0: 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78  E clause */.  Ex
c8f0: 70 72 4c 69 73 74 20 2a 70 44 69 73 74 69 6e 63  prList *pDistinc
c900: 74 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72  t       /* The r
c910: 65 73 75 6c 74 20 73 65 74 20 74 68 61 74 20 6e  esult set that n
c920: 65 65 64 73 20 74 6f 20 62 65 20 44 49 53 54 49  eeds to be DISTI
c930: 4e 43 54 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c  NCT */.){.  Tabl
c940: 65 20 2a 70 54 61 62 3b 0a 20 20 49 6e 64 65 78  e *pTab;.  Index
c950: 20 2a 70 49 64 78 3b 0a 20 20 69 6e 74 20 69 3b   *pIdx;.  int i;
c960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c970: 20 20 20 20 20 20 20 20 20 20 0a 20 20 69 6e 74            .  int
c980: 20 69 42 61 73 65 3b 0a 0a 20 20 2f 2a 20 49 66   iBase;..  /* If
c990: 20 74 68 65 72 65 20 69 73 20 6d 6f 72 65 20 74   there is more t
c9a0: 68 61 6e 20 6f 6e 65 20 74 61 62 6c 65 20 6f 72  han one table or
c9b0: 20 73 75 62 2d 73 65 6c 65 63 74 20 69 6e 20 74   sub-select in t
c9c0: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
c9d0: 66 0a 20 20 2a 2a 20 74 68 69 73 20 71 75 65 72  f.  ** this quer
c9e0: 79 2c 20 74 68 65 6e 20 69 74 20 77 69 6c 6c 20  y, then it will 
c9f0: 6e 6f 74 20 62 65 20 70 6f 73 73 69 62 6c 65 20  not be possible 
ca00: 74 6f 20 73 68 6f 77 20 74 68 61 74 20 74 68 65  to show that the
ca10: 20 44 49 53 54 49 4e 43 54 20 0a 20 20 2a 2a 20   DISTINCT .  ** 
ca20: 63 6c 61 75 73 65 20 69 73 20 72 65 64 75 6e 64  clause is redund
ca30: 61 6e 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 54  ant. */.  if( pT
ca40: 61 62 4c 69 73 74 2d 3e 6e 53 72 63 21 3d 31 20  abList->nSrc!=1 
ca50: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 42  ) return 0;.  iB
ca60: 61 73 65 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e  ase = pTabList->
ca70: 61 5b 30 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20  a[0].iCursor;.  
ca80: 70 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d  pTab = pTabList-
ca90: 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 0a 20 20 2f  >a[0].pTab;..  /
caa0: 2a 20 49 66 20 61 6e 79 20 6f 66 20 74 68 65 20  * If any of the 
cab0: 65 78 70 72 65 73 73 69 6f 6e 73 20 69 73 20 61  expressions is a
cac0: 6e 20 49 50 4b 20 63 6f 6c 75 6d 6e 20 6f 6e 20  n IPK column on 
cad0: 74 61 62 6c 65 20 69 42 61 73 65 2c 20 74 68 65  table iBase, the
cae0: 6e 20 72 65 74 75 72 6e 20 0a 20 20 2a 2a 20 74  n return .  ** t
caf0: 72 75 65 2e 20 4e 6f 74 65 3a 20 54 68 65 20 28  rue. Note: The (
cb00: 70 2d 3e 69 54 61 62 6c 65 3d 3d 69 42 61 73 65  p->iTable==iBase
cb10: 29 20 70 61 72 74 20 6f 66 20 74 68 69 73 20 74  ) part of this t
cb20: 65 73 74 20 6d 61 79 20 62 65 20 66 61 6c 73 65  est may be false
cb30: 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 63 75 72   if the.  ** cur
cb40: 72 65 6e 74 20 53 45 4c 45 43 54 20 69 73 20 61  rent SELECT is a
cb50: 20 63 6f 72 72 65 6c 61 74 65 64 20 73 75 62 2d   correlated sub-
cb60: 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f  query..  */.  fo
cb70: 72 28 69 3d 30 3b 20 69 3c 70 44 69 73 74 69 6e  r(i=0; i<pDistin
cb80: 63 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  ct->nExpr; i++){
cb90: 0a 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 73  .    Expr *p = s
cba0: 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f  qlite3ExprSkipCo
cbb0: 6c 6c 61 74 65 28 70 44 69 73 74 69 6e 63 74 2d  llate(pDistinct-
cbc0: 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[i].pExpr);.  
cbd0: 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f    if( p->op==TK_
cbe0: 43 4f 4c 55 4d 4e 20 26 26 20 70 2d 3e 69 54 61  COLUMN && p->iTa
cbf0: 62 6c 65 3d 3d 69 42 61 73 65 20 26 26 20 70 2d  ble==iBase && p-
cc00: 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 20 72 65 74  >iColumn<0 ) ret
cc10: 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  urn 1;.  }..  /*
cc20: 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 61 6c   Loop through al
cc30: 6c 20 69 6e 64 69 63 65 73 20 6f 6e 20 74 68 65  l indices on the
cc40: 20 74 61 62 6c 65 2c 20 63 68 65 63 6b 69 6e 67   table, checking
cc50: 20 65 61 63 68 20 74 6f 20 73 65 65 20 69 66 20   each to see if 
cc60: 69 74 20 6d 61 6b 65 73 0a 20 20 2a 2a 20 74 68  it makes.  ** th
cc70: 65 20 44 49 53 54 49 4e 43 54 20 71 75 61 6c 69  e DISTINCT quali
cc80: 66 69 65 72 20 72 65 64 75 6e 64 61 6e 74 2e 20  fier redundant. 
cc90: 49 74 20 64 6f 65 73 20 73 6f 20 69 66 3a 0a 20  It does so if:. 
cca0: 20 2a 2a 0a 20 20 2a 2a 20 20 20 31 2e 20 54 68   **.  **   1. Th
ccb0: 65 20 69 6e 64 65 78 20 69 73 20 69 74 73 65 6c  e index is itsel
ccc0: 66 20 55 4e 49 51 55 45 2c 20 61 6e 64 0a 20 20  f UNIQUE, and.  
ccd0: 2a 2a 0a 20 20 2a 2a 20 20 20 32 2e 20 41 6c 6c  **.  **   2. All
cce0: 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20   of the columns 
ccf0: 69 6e 20 74 68 65 20 69 6e 64 65 78 20 61 72 65  in the index are
cd00: 20 65 69 74 68 65 72 20 70 61 72 74 20 6f 66 20   either part of 
cd10: 74 68 65 20 70 44 69 73 74 69 6e 63 74 0a 20 20  the pDistinct.  
cd20: 2a 2a 20 20 20 20 20 20 6c 69 73 74 2c 20 6f 72  **      list, or
cd30: 20 65 6c 73 65 20 74 68 65 20 57 48 45 52 45 20   else the WHERE 
cd40: 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20  clause contains 
cd50: 61 20 74 65 72 6d 20 6f 66 20 74 68 65 20 66 6f  a term of the fo
cd60: 72 6d 20 22 63 6f 6c 3d 58 22 2c 0a 20 20 2a 2a  rm "col=X",.  **
cd70: 20 20 20 20 20 20 77 68 65 72 65 20 58 20 69 73        where X is
cd80: 20 61 20 63 6f 6e 73 74 61 6e 74 20 76 61 6c 75   a constant valu
cd90: 65 2e 20 54 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  e. The collation
cda0: 20 73 65 71 75 65 6e 63 65 73 20 6f 66 20 74 68   sequences of th
cdb0: 65 0a 20 20 2a 2a 20 20 20 20 20 20 63 6f 6d 70  e.  **      comp
cdc0: 61 72 69 73 6f 6e 20 61 6e 64 20 73 65 6c 65 63  arison and selec
cdd0: 74 2d 6c 69 73 74 20 65 78 70 72 65 73 73 69 6f  t-list expressio
cde0: 6e 73 20 6d 75 73 74 20 6d 61 74 63 68 20 74 68  ns must match th
cdf0: 6f 73 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78  ose of the index
ce00: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 33 2e  ..  **.  **   3.
ce10: 20 41 6c 6c 20 6f 66 20 74 68 6f 73 65 20 69 6e   All of those in
ce20: 64 65 78 20 63 6f 6c 75 6d 6e 73 20 66 6f 72 20  dex columns for 
ce30: 77 68 69 63 68 20 74 68 65 20 57 48 45 52 45 20  which the WHERE 
ce40: 63 6c 61 75 73 65 20 64 6f 65 73 20 6e 6f 74 0a  clause does not.
ce50: 20 20 2a 2a 20 20 20 20 20 20 63 6f 6e 74 61 69    **      contai
ce60: 6e 20 61 20 22 63 6f 6c 3d 58 22 20 74 65 72 6d  n a "col=X" term
ce70: 20 61 72 65 20 73 75 62 6a 65 63 74 20 74 6f 20   are subject to 
ce80: 61 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e 73 74  a NOT NULL const
ce90: 72 61 69 6e 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f  raint..  */.  fo
cea0: 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  r(pIdx=pTab->pIn
ceb0: 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d  dex; pIdx; pIdx=
cec0: 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pIdx->pNext){.  
ced0: 20 20 69 66 28 20 21 49 73 55 6e 69 71 75 65 49    if( !IsUniqueI
cee0: 6e 64 65 78 28 70 49 64 78 29 20 29 20 63 6f 6e  ndex(pIdx) ) con
cef0: 74 69 6e 75 65 3b 0a 20 20 20 20 66 6f 72 28 69  tinue;.    for(i
cf00: 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 4b 65 79  =0; i<pIdx->nKey
cf10: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
cf20: 20 69 31 36 20 69 43 6f 6c 20 3d 20 70 49 64 78   i16 iCol = pIdx
cf30: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20  ->aiColumn[i];. 
cf40: 20 20 20 20 20 69 66 28 20 30 3d 3d 66 69 6e 64       if( 0==find
cf50: 54 65 72 6d 28 70 57 43 2c 20 69 42 61 73 65 2c  Term(pWC, iBase,
cf60: 20 69 43 6f 6c 2c 20 7e 28 42 69 74 6d 61 73 6b   iCol, ~(Bitmask
cf70: 29 30 2c 20 57 4f 5f 45 51 2c 20 70 49 64 78 29  )0, WO_EQ, pIdx)
cf80: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
cf90: 69 49 64 78 43 6f 6c 20 3d 20 66 69 6e 64 49 6e  iIdxCol = findIn
cfa0: 64 65 78 43 6f 6c 28 70 50 61 72 73 65 2c 20 70  dexCol(pParse, p
cfb0: 44 69 73 74 69 6e 63 74 2c 20 69 42 61 73 65 2c  Distinct, iBase,
cfc0: 20 70 49 64 78 2c 20 69 29 3b 0a 20 20 20 20 20   pIdx, i);.     
cfd0: 20 20 20 69 66 28 20 69 49 64 78 43 6f 6c 3c 30     if( iIdxCol<0
cfe0: 20 7c 7c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69   || pTab->aCol[i
cff0: 43 6f 6c 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 20  Col].notNull==0 
d000: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  ){.          bre
d010: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
d020: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
d030: 69 66 28 20 69 3d 3d 70 49 64 78 2d 3e 6e 4b 65  if( i==pIdx->nKe
d040: 79 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 2f 2a  yCol ){.      /*
d050: 20 54 68 69 73 20 69 6e 64 65 78 20 69 6d 70 6c   This index impl
d060: 69 65 73 20 74 68 61 74 20 74 68 65 20 44 49 53  ies that the DIS
d070: 54 49 4e 43 54 20 71 75 61 6c 69 66 69 65 72 20  TINCT qualifier 
d080: 69 73 20 72 65 64 75 6e 64 61 6e 74 2e 20 2a 2f  is redundant. */
d090: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
d0a0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
d0b0: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  turn 0;.}.../*.*
d0c0: 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65 20 6c  * Estimate the l
d0d0: 6f 67 61 72 69 74 68 6d 20 6f 66 20 74 68 65 20  ogarithm of the 
d0e0: 69 6e 70 75 74 20 76 61 6c 75 65 20 74 6f 20 62  input value to b
d0f0: 61 73 65 20 32 2e 0a 2a 2f 0a 73 74 61 74 69 63  ase 2..*/.static
d100: 20 4c 6f 67 45 73 74 20 65 73 74 4c 6f 67 28 4c   LogEst estLog(L
d110: 6f 67 45 73 74 20 4e 29 7b 0a 20 20 72 65 74 75  ogEst N){.  retu
d120: 72 6e 20 4e 3c 3d 31 30 20 3f 20 30 20 3a 20 73  rn N<=10 ? 0 : s
d130: 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 4e 29 20  qlite3LogEst(N) 
d140: 2d 20 33 33 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  - 33;.}../*.** T
d150: 77 6f 20 72 6f 75 74 69 6e 65 73 20 66 6f 72 20  wo routines for 
d160: 70 72 69 6e 74 69 6e 67 20 74 68 65 20 63 6f 6e  printing the con
d170: 74 65 6e 74 20 6f 66 20 61 6e 20 73 71 6c 69 74  tent of an sqlit
d180: 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 0a 2a 2a  e3_index_info.**
d190: 20 73 74 72 75 63 74 75 72 65 2e 20 20 55 73 65   structure.  Use
d1a0: 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e  d for testing an
d1b0: 64 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79  d debugging only
d1c0: 2e 20 20 49 66 20 6e 65 69 74 68 65 72 0a 2a 2a  .  If neither.**
d1d0: 20 53 51 4c 49 54 45 5f 54 45 53 54 20 6f 72 20   SQLITE_TEST or 
d1e0: 53 51 4c 49 54 45 5f 44 45 42 55 47 20 61 72 65  SQLITE_DEBUG are
d1f0: 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 74   defined, then t
d200: 68 65 73 65 20 72 6f 75 74 69 6e 65 73 0a 2a 2a  hese routines.**
d210: 20 61 72 65 20 6e 6f 2d 6f 70 73 2e 0a 2a 2f 0a   are no-ops..*/.
d220: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
d230: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
d240: 54 41 42 4c 45 29 20 26 26 20 64 65 66 69 6e 65  TABLE) && define
d250: 64 28 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  d(WHERETRACE_ENA
d260: 42 4c 45 44 29 0a 73 74 61 74 69 63 20 76 6f 69  BLED).static voi
d270: 64 20 54 52 41 43 45 5f 49 44 58 5f 49 4e 50 55  d TRACE_IDX_INPU
d280: 54 53 28 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  TS(sqlite3_index
d290: 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 6e 74  _info *p){.  int
d2a0: 20 69 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74   i;.  if( !sqlit
d2b0: 65 33 57 68 65 72 65 54 72 61 63 65 20 29 20 72  e3WhereTrace ) r
d2c0: 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30  eturn;.  for(i=0
d2d0: 3b 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61 69  ; i<p->nConstrai
d2e0: 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71  nt; i++){.    sq
d2f0: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
d300: 28 22 20 20 63 6f 6e 73 74 72 61 69 6e 74 5b 25  ("  constraint[%
d310: 64 5d 3a 20 63 6f 6c 3d 25 64 20 74 65 72 6d 69  d]: col=%d termi
d320: 64 3d 25 64 20 6f 70 3d 25 64 20 75 73 61 62 6c  d=%d op=%d usabl
d330: 65 64 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  ed=%d\n",.      
d340: 20 69 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43   i,.       p->aC
d350: 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 69 43 6f  onstraint[i].iCo
d360: 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 70 2d 3e  lumn,.       p->
d370: 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 69  aConstraint[i].i
d380: 54 65 72 6d 4f 66 66 73 65 74 2c 0a 20 20 20 20  TermOffset,.    
d390: 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e     p->aConstrain
d3a0: 74 5b 69 5d 2e 6f 70 2c 0a 20 20 20 20 20 20 20  t[i].op,.       
d3b0: 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69  p->aConstraint[i
d3c0: 5d 2e 75 73 61 62 6c 65 29 3b 0a 20 20 7d 0a 20  ].usable);.  }. 
d3d0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
d3e0: 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20  OrderBy; i++){. 
d3f0: 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
d400: 72 69 6e 74 66 28 22 20 20 6f 72 64 65 72 62 79  rintf("  orderby
d410: 5b 25 64 5d 3a 20 63 6f 6c 3d 25 64 20 64 65 73  [%d]: col=%d des
d420: 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  c=%d\n",.       
d430: 69 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 4f 72  i,.       p->aOr
d440: 64 65 72 42 79 5b 69 5d 2e 69 43 6f 6c 75 6d 6e  derBy[i].iColumn
d450: 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 4f 72 64  ,.       p->aOrd
d460: 65 72 42 79 5b 69 5d 2e 64 65 73 63 29 3b 0a 20  erBy[i].desc);. 
d470: 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64   }.}.static void
d480: 20 54 52 41 43 45 5f 49 44 58 5f 4f 55 54 50 55   TRACE_IDX_OUTPU
d490: 54 53 28 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  TS(sqlite3_index
d4a0: 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 6e 74  _info *p){.  int
d4b0: 20 69 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74   i;.  if( !sqlit
d4c0: 65 33 57 68 65 72 65 54 72 61 63 65 20 29 20 72  e3WhereTrace ) r
d4d0: 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30  eturn;.  for(i=0
d4e0: 3b 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61 69  ; i<p->nConstrai
d4f0: 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71  nt; i++){.    sq
d500: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
d510: 28 22 20 20 75 73 61 67 65 5b 25 64 5d 3a 20 61  ("  usage[%d]: a
d520: 72 67 76 49 64 78 3d 25 64 20 6f 6d 69 74 3d 25  rgvIdx=%d omit=%
d530: 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69 2c 0a  d\n",.       i,.
d540: 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74         p->aConst
d550: 72 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e 61 72  raintUsage[i].ar
d560: 67 76 49 6e 64 65 78 2c 0a 20 20 20 20 20 20 20  gvIndex,.       
d570: 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73  p->aConstraintUs
d580: 61 67 65 5b 69 5d 2e 6f 6d 69 74 29 3b 0a 20 20  age[i].omit);.  
d590: 7d 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67  }.  sqlite3Debug
d5a0: 50 72 69 6e 74 66 28 22 20 20 69 64 78 4e 75 6d  Printf("  idxNum
d5b0: 3d 25 64 5c 6e 22 2c 20 70 2d 3e 69 64 78 4e 75  =%d\n", p->idxNu
d5c0: 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62  m);.  sqlite3Deb
d5d0: 75 67 50 72 69 6e 74 66 28 22 20 20 69 64 78 53  ugPrintf("  idxS
d5e0: 74 72 3d 25 73 5c 6e 22 2c 20 70 2d 3e 69 64 78  tr=%s\n", p->idx
d5f0: 53 74 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  Str);.  sqlite3D
d600: 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 6f 72  ebugPrintf("  or
d610: 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 3d 25 64  derByConsumed=%d
d620: 5c 6e 22 2c 20 70 2d 3e 6f 72 64 65 72 42 79 43  \n", p->orderByC
d630: 6f 6e 73 75 6d 65 64 29 3b 0a 20 20 73 71 6c 69  onsumed);.  sqli
d640: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
d650: 20 20 65 73 74 69 6d 61 74 65 64 43 6f 73 74 3d    estimatedCost=
d660: 25 67 5c 6e 22 2c 20 70 2d 3e 65 73 74 69 6d 61  %g\n", p->estima
d670: 74 65 64 43 6f 73 74 29 3b 0a 20 20 73 71 6c 69  tedCost);.  sqli
d680: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
d690: 20 20 65 73 74 69 6d 61 74 65 64 52 6f 77 73 3d    estimatedRows=
d6a0: 25 6c 6c 64 5c 6e 22 2c 20 70 2d 3e 65 73 74 69  %lld\n", p->esti
d6b0: 6d 61 74 65 64 52 6f 77 73 29 3b 0a 7d 0a 23 65  matedRows);.}.#e
d6c0: 6c 73 65 0a 23 64 65 66 69 6e 65 20 54 52 41 43  lse.#define TRAC
d6d0: 45 5f 49 44 58 5f 49 4e 50 55 54 53 28 41 29 0a  E_IDX_INPUTS(A).
d6e0: 23 64 65 66 69 6e 65 20 54 52 41 43 45 5f 49 44  #define TRACE_ID
d6f0: 58 5f 4f 55 54 50 55 54 53 28 41 29 0a 23 65 6e  X_OUTPUTS(A).#en
d700: 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  dif..#ifndef SQL
d710: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54  ITE_OMIT_AUTOMAT
d720: 49 43 5f 49 4e 44 45 58 0a 2f 2a 0a 2a 2a 20 52  IC_INDEX./*.** R
d730: 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
d740: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
d750: 65 72 6d 20 70 54 65 72 6d 20 69 73 20 6f 66 20  erm pTerm is of 
d760: 61 20 66 6f 72 6d 20 77 68 65 72 65 20 69 74 0a  a form where it.
d770: 2a 2a 20 63 6f 75 6c 64 20 62 65 20 75 73 65 64  ** could be used
d780: 20 77 69 74 68 20 61 6e 20 69 6e 64 65 78 20 74   with an index t
d790: 6f 20 61 63 63 65 73 73 20 70 53 72 63 2c 20 61  o access pSrc, a
d7a0: 73 73 75 6d 69 6e 67 20 61 6e 20 61 70 70 72 6f  ssuming an appro
d7b0: 70 72 69 61 74 65 0a 2a 2a 20 69 6e 64 65 78 20  priate.** index 
d7c0: 65 78 69 73 74 65 64 2e 0a 2a 2f 0a 73 74 61 74  existed..*/.stat
d7d0: 69 63 20 69 6e 74 20 74 65 72 6d 43 61 6e 44 72  ic int termCanDr
d7e0: 69 76 65 49 6e 64 65 78 28 0a 20 20 57 68 65 72  iveIndex(.  Wher
d7f0: 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 20 20  eTerm *pTerm,   
d800: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 48             /* WH
d810: 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20  ERE clause term 
d820: 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20 73 74  to check */.  st
d830: 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
d840: 6d 20 2a 70 53 72 63 2c 20 20 20 20 20 2f 2a 20  m *pSrc,     /* 
d850: 54 61 62 6c 65 20 77 65 20 61 72 65 20 74 72 79  Table we are try
d860: 69 6e 67 20 74 6f 20 61 63 63 65 73 73 20 2a 2f  ing to access */
d870: 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65  .  Bitmask notRe
d880: 61 64 79 20 20 20 20 20 20 20 20 20 20 20 20 20  ady             
d890: 20 20 2f 2a 20 54 61 62 6c 65 73 20 69 6e 20 6f    /* Tables in o
d8a0: 75 74 65 72 20 6c 6f 6f 70 73 20 6f 66 20 74 68  uter loops of th
d8b0: 65 20 6a 6f 69 6e 20 2a 2f 0a 29 7b 0a 20 20 63  e join */.){.  c
d8c0: 68 61 72 20 61 66 66 3b 0a 20 20 69 66 28 20 70  har aff;.  if( p
d8d0: 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
d8e0: 21 3d 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20  !=pSrc->iCursor 
d8f0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
d900: 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  ( (pTerm->eOpera
d910: 74 6f 72 20 26 20 57 4f 5f 45 51 29 3d 3d 30 20  tor & WO_EQ)==0 
d920: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
d930: 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71  ( (pTerm->prereq
d940: 52 69 67 68 74 20 26 20 6e 6f 74 52 65 61 64 79  Right & notReady
d950: 29 21 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  )!=0 ) return 0;
d960: 0a 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 75 2e  .  if( pTerm->u.
d970: 6c 65 66 74 43 6f 6c 75 6d 6e 3c 30 20 29 20 72  leftColumn<0 ) r
d980: 65 74 75 72 6e 20 30 3b 0a 20 20 61 66 66 20 3d  eturn 0;.  aff =
d990: 20 70 53 72 63 2d 3e 70 54 61 62 2d 3e 61 43 6f   pSrc->pTab->aCo
d9a0: 6c 5b 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43  l[pTerm->u.leftC
d9b0: 6f 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69 74 79 3b  olumn].affinity;
d9c0: 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 49  .  if( !sqlite3I
d9d0: 6e 64 65 78 41 66 66 69 6e 69 74 79 4f 6b 28 70  ndexAffinityOk(p
d9e0: 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 61 66 66  Term->pExpr, aff
d9f0: 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
da00: 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64  return 1;.}.#end
da10: 69 66 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  if...#ifndef SQL
da20: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54  ITE_OMIT_AUTOMAT
da30: 49 43 5f 49 4e 44 45 58 0a 2f 2a 0a 2a 2a 20 47  IC_INDEX./*.** G
da40: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
da50: 63 6f 6e 73 74 72 75 63 74 20 74 68 65 20 49 6e  construct the In
da60: 64 65 78 20 6f 62 6a 65 63 74 20 66 6f 72 20 61  dex object for a
da70: 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65  n automatic inde
da80: 78 0a 2a 2a 20 61 6e 64 20 74 6f 20 73 65 74 20  x.** and to set 
da90: 75 70 20 74 68 65 20 57 68 65 72 65 4c 65 76 65  up the WhereLeve
daa0: 6c 20 6f 62 6a 65 63 74 20 70 4c 65 76 65 6c 20  l object pLevel 
dab0: 73 6f 20 74 68 61 74 20 74 68 65 20 63 6f 64 65  so that the code
dac0: 20 67 65 6e 65 72 61 74 6f 72 0a 2a 2a 20 6d 61   generator.** ma
dad0: 6b 65 73 20 75 73 65 20 6f 66 20 74 68 65 20 61  kes use of the a
dae0: 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 2e 0a  utomatic index..
daf0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
db00: 6f 6e 73 74 72 75 63 74 41 75 74 6f 6d 61 74 69  onstructAutomati
db10: 63 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65 20  cIndex(.  Parse 
db20: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
db30: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
db40: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
db50: 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
db60: 57 43 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  WC,           /*
db70: 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
db80: 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72  e */.  struct Sr
db90: 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63  cList_item *pSrc
dba0: 2c 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63  ,  /* The FROM c
dbb0: 6c 61 75 73 65 20 74 65 72 6d 20 74 6f 20 67 65  lause term to ge
dbc0: 74 20 74 68 65 20 6e 65 78 74 20 69 6e 64 65 78  t the next index
dbd0: 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f   */.  Bitmask no
dbe0: 74 52 65 61 64 79 2c 20 20 20 20 20 20 20 20 20  tReady,         
dbf0: 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 63 75 72    /* Mask of cur
dc00: 73 6f 72 73 20 74 68 61 74 20 61 72 65 20 6e 6f  sors that are no
dc10: 74 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 20  t available */. 
dc20: 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65   WhereLevel *pLe
dc30: 76 65 6c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  vel          /* 
dc40: 57 72 69 74 65 20 6e 65 77 20 69 6e 64 65 78 20  Write new index 
dc50: 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
dc60: 20 6e 4b 65 79 43 6f 6c 3b 20 20 20 20 20 20 20   nKeyCol;       
dc70: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
dc80: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
dc90: 20 74 68 65 20 63 6f 6e 73 74 72 75 63 74 65 64   the constructed
dca0: 20 69 6e 64 65 78 20 2a 2f 0a 20 20 57 68 65 72   index */.  Wher
dcb0: 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20  eTerm *pTerm;   
dcc0: 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e          /* A sin
dcd0: 67 6c 65 20 74 65 72 6d 20 6f 66 20 74 68 65 20  gle term of the 
dce0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
dcf0: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 57 43    WhereTerm *pWC
dd00: 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  End;          /*
dd10: 20 45 6e 64 20 6f 66 20 70 57 43 2d 3e 61 5b 5d   End of pWC->a[]
dd20: 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64   */.  Index *pId
dd30: 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
dd40: 20 20 2f 2a 20 4f 62 6a 65 63 74 20 64 65 73 63    /* Object desc
dd50: 72 69 62 69 6e 67 20 74 68 65 20 74 72 61 6e 73  ribing the trans
dd60: 69 65 6e 74 20 69 6e 64 65 78 20 2a 2f 0a 20 20  ient index */.  
dd70: 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20  Vdbe *v;        
dd80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
dd90: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
dda0: 74 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  t under construc
ddb0: 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tion */.  int ad
ddc0: 64 72 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20  drInit;         
ddd0: 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
dde0: 20 6f 66 20 74 68 65 20 69 6e 69 74 69 61 6c 69   of the initiali
ddf0: 7a 61 74 69 6f 6e 20 62 79 70 61 73 73 20 6a 75  zation bypass ju
de00: 6d 70 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70  mp */.  Table *p
de10: 54 61 62 6c 65 3b 20 20 20 20 20 20 20 20 20 20  Table;          
de20: 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65      /* The table
de30: 20 62 65 69 6e 67 20 69 6e 64 65 78 65 64 20 2a   being indexed *
de40: 2f 0a 20 20 69 6e 74 20 61 64 64 72 54 6f 70 3b  /.  int addrTop;
de50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de60: 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 69 6e  /* Top of the in
de70: 64 65 78 20 66 69 6c 6c 20 6c 6f 6f 70 20 2a 2f  dex fill loop */
de80: 0a 20 20 69 6e 74 20 72 65 67 52 65 63 6f 72 64  .  int regRecord
de90: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
dea0: 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69  * Register holdi
deb0: 6e 67 20 61 6e 20 69 6e 64 65 78 20 72 65 63 6f  ng an index reco
dec0: 72 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20  rd */.  int n;  
ded0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dee0: 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 63 6f      /* Column co
def0: 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69  unter */.  int i
df00: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
df10: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
df20: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
df30: 6d 78 42 69 74 43 6f 6c 3b 20 20 20 20 20 20 20  mxBitCol;       
df40: 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d          /* Maxim
df50: 75 6d 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 53 72  um column in pSr
df60: 63 2d 3e 63 6f 6c 55 73 65 64 20 2a 2f 0a 20 20  c->colUsed */.  
df70: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20  CollSeq *pColl; 
df80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
df90: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
dfa0: 65 20 74 6f 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e  e to on a column
dfb0: 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20   */.  WhereLoop 
dfc0: 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20  *pLoop;         
dfd0: 20 20 2f 2a 20 54 68 65 20 4c 6f 6f 70 20 6f 62    /* The Loop ob
dfe0: 6a 65 63 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ject */.  char *
dff0: 7a 4e 6f 74 55 73 65 64 3b 20 20 20 20 20 20 20  zNotUsed;       
e000: 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 73        /* Extra s
e010: 70 61 63 65 20 6f 6e 20 74 68 65 20 65 6e 64 20  pace on the end 
e020: 6f 66 20 70 49 64 78 20 2a 2f 0a 20 20 42 69 74  of pIdx */.  Bit
e030: 6d 61 73 6b 20 69 64 78 43 6f 6c 73 3b 20 20 20  mask idxCols;   
e040: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69 74 6d           /* Bitm
e050: 61 70 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 75 73  ap of columns us
e060: 65 64 20 66 6f 72 20 69 6e 64 65 78 69 6e 67 20  ed for indexing 
e070: 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 65 78 74  */.  Bitmask ext
e080: 72 61 43 6f 6c 73 3b 20 20 20 20 20 20 20 20 20  raCols;         
e090: 20 2f 2a 20 42 69 74 6d 61 70 20 6f 66 20 61 64   /* Bitmap of ad
e0a0: 64 69 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 73  ditional columns
e0b0: 20 2a 2f 0a 20 20 75 38 20 73 65 6e 74 57 61 72   */.  u8 sentWar
e0c0: 6e 69 6e 67 20 3d 20 30 3b 20 20 20 20 20 20 20  ning = 0;       
e0d0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 77    /* True if a w
e0e0: 61 72 6e 6e 69 6e 67 20 68 61 73 20 62 65 65 6e  arnning has been
e0f0: 20 69 73 73 75 65 64 20 2a 2f 0a 20 20 45 78 70   issued */.  Exp
e100: 72 20 2a 70 50 61 72 74 69 61 6c 20 3d 20 30 3b  r *pPartial = 0;
e110: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 74           /* Part
e120: 69 61 6c 20 49 6e 64 65 78 20 45 78 70 72 65 73  ial Index Expres
e130: 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 43  sion */.  int iC
e140: 6f 6e 74 69 6e 75 65 20 3d 20 30 3b 20 20 20 20  ontinue = 0;    
e150: 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
e160: 72 65 20 74 6f 20 73 6b 69 70 20 65 78 63 6c 75  re to skip exclu
e170: 64 65 64 20 72 6f 77 73 20 2a 2f 0a 0a 20 20 2f  ded rows */..  /
e180: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
e190: 74 6f 20 73 6b 69 70 20 6f 76 65 72 20 74 68 65  to skip over the
e1a0: 20 63 72 65 61 74 69 6f 6e 20 61 6e 64 20 69 6e   creation and in
e1b0: 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20  itialization of 
e1c0: 74 68 65 0a 20 20 2a 2a 20 74 72 61 6e 73 69 65  the.  ** transie
e1d0: 6e 74 20 69 6e 64 65 78 20 6f 6e 20 32 6e 64 20  nt index on 2nd 
e1e0: 61 6e 64 20 73 75 62 73 65 71 75 65 6e 74 20 69  and subsequent i
e1f0: 74 65 72 61 74 69 6f 6e 73 20 6f 66 20 74 68 65  terations of the
e200: 20 6c 6f 6f 70 2e 20 2a 2f 0a 20 20 76 20 3d 20   loop. */.  v = 
e210: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
e220: 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b   assert( v!=0 );
e230: 0a 20 20 61 64 64 72 49 6e 69 74 20 3d 20 73 71  .  addrInit = sq
e240: 6c 69 74 65 33 43 6f 64 65 4f 6e 63 65 28 70 50  lite3CodeOnce(pP
e250: 61 72 73 65 29 3b 20 56 64 62 65 43 6f 76 65 72  arse); VdbeCover
e260: 61 67 65 28 76 29 3b 0a 0a 20 20 2f 2a 20 43 6f  age(v);..  /* Co
e270: 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  unt the number o
e280: 66 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 77  f columns that w
e290: 69 6c 6c 20 62 65 20 61 64 64 65 64 20 74 6f 20  ill be added to 
e2a0: 74 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20 61  the index.  ** a
e2b0: 6e 64 20 75 73 65 64 20 74 6f 20 6d 61 74 63 68  nd used to match
e2c0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f   WHERE clause co
e2d0: 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 6e  nstraints */.  n
e2e0: 4b 65 79 43 6f 6c 20 3d 20 30 3b 0a 20 20 70 54  KeyCol = 0;.  pT
e2f0: 61 62 6c 65 20 3d 20 70 53 72 63 2d 3e 70 54 61  able = pSrc->pTa
e300: 62 3b 0a 20 20 70 57 43 45 6e 64 20 3d 20 26 70  b;.  pWCEnd = &p
e310: 57 43 2d 3e 61 5b 70 57 43 2d 3e 6e 54 65 72 6d  WC->a[pWC->nTerm
e320: 5d 3b 0a 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65  ];.  pLoop = pLe
e330: 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 69  vel->pWLoop;.  i
e340: 64 78 43 6f 6c 73 20 3d 20 30 3b 0a 20 20 66 6f  dxCols = 0;.  fo
e350: 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20  r(pTerm=pWC->a; 
e360: 70 54 65 72 6d 3c 70 57 43 45 6e 64 3b 20 70 54  pTerm<pWCEnd; pT
e370: 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  erm++){.    if( 
e380: 70 4c 6f 6f 70 2d 3e 70 72 65 72 65 71 3d 3d 30  pLoop->prereq==0
e390: 0a 20 20 20 20 20 26 26 20 28 70 54 65 72 6d 2d  .     && (pTerm-
e3a0: 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
e3b0: 56 49 52 54 55 41 4c 29 3d 3d 30 0a 20 20 20 20  VIRTUAL)==0.    
e3c0: 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 49   && sqlite3ExprI
e3d0: 73 54 61 62 6c 65 43 6f 6e 73 74 61 6e 74 28 70  sTableConstant(p
e3e0: 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 70 53 72  Term->pExpr, pSr
e3f0: 63 2d 3e 69 43 75 72 73 6f 72 29 20 29 7b 0a 20  c->iCursor) ){. 
e400: 20 20 20 20 20 70 50 61 72 74 69 61 6c 20 3d 20       pPartial = 
e410: 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 70  sqlite3ExprAnd(p
e420: 50 61 72 73 65 2d 3e 64 62 2c 20 70 50 61 72 74  Parse->db, pPart
e430: 69 61 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ial,.           
e440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e450: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
e460: 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  Dup(pParse->db, 
e470: 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 30 29  pTerm->pExpr, 0)
e480: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
e490: 20 74 65 72 6d 43 61 6e 44 72 69 76 65 49 6e 64   termCanDriveInd
e4a0: 65 78 28 70 54 65 72 6d 2c 20 70 53 72 63 2c 20  ex(pTerm, pSrc, 
e4b0: 6e 6f 74 52 65 61 64 79 29 20 29 7b 0a 20 20 20  notReady) ){.   
e4c0: 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 54     int iCol = pT
e4d0: 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d  erm->u.leftColum
e4e0: 6e 3b 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b  n;.      Bitmask
e4f0: 20 63 4d 61 73 6b 20 3d 20 69 43 6f 6c 3e 3d 42   cMask = iCol>=B
e500: 4d 53 20 3f 20 4d 41 53 4b 42 49 54 28 42 4d 53  MS ? MASKBIT(BMS
e510: 2d 31 29 20 3a 20 4d 41 53 4b 42 49 54 28 69 43  -1) : MASKBIT(iC
e520: 6f 6c 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  ol);.      testc
e530: 61 73 65 28 20 69 43 6f 6c 3d 3d 42 4d 53 20 29  ase( iCol==BMS )
e540: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
e550: 28 20 69 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b  ( iCol==BMS-1 );
e560: 0a 20 20 20 20 20 20 69 66 28 20 21 73 65 6e 74  .      if( !sent
e570: 57 61 72 6e 69 6e 67 20 29 7b 0a 20 20 20 20 20  Warning ){.     
e580: 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53     sqlite3_log(S
e590: 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 5f 41 55  QLITE_WARNING_AU
e5a0: 54 4f 49 4e 44 45 58 2c 0a 20 20 20 20 20 20 20  TOINDEX,.       
e5b0: 20 20 20 20 20 22 61 75 74 6f 6d 61 74 69 63 20       "automatic 
e5c0: 69 6e 64 65 78 20 6f 6e 20 25 73 28 25 73 29 22  index on %s(%s)"
e5d0: 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 2c  , pTable->zName,
e5e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 54 61  .            pTa
e5f0: 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  ble->aCol[iCol].
e600: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
e610: 73 65 6e 74 57 61 72 6e 69 6e 67 20 3d 20 31 3b  sentWarning = 1;
e620: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
e630: 66 28 20 28 69 64 78 43 6f 6c 73 20 26 20 63 4d  f( (idxCols & cM
e640: 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ask)==0 ){.     
e650: 20 20 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70     if( whereLoop
e660: 52 65 73 69 7a 65 28 70 50 61 72 73 65 2d 3e 64  Resize(pParse->d
e670: 62 2c 20 70 4c 6f 6f 70 2c 20 6e 4b 65 79 43 6f  b, pLoop, nKeyCo
e680: 6c 2b 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20  l+1) ){.        
e690: 20 20 67 6f 74 6f 20 65 6e 64 5f 61 75 74 6f 5f    goto end_auto_
e6a0: 69 6e 64 65 78 5f 63 72 65 61 74 65 3b 0a 20 20  index_create;.  
e6b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
e6c0: 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6e 4b  pLoop->aLTerm[nK
e6d0: 65 79 43 6f 6c 2b 2b 5d 20 3d 20 70 54 65 72 6d  eyCol++] = pTerm
e6e0: 3b 0a 20 20 20 20 20 20 20 20 69 64 78 43 6f 6c  ;.        idxCol
e6f0: 73 20 7c 3d 20 63 4d 61 73 6b 3b 0a 20 20 20 20  s |= cMask;.    
e700: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
e710: 61 73 73 65 72 74 28 20 6e 4b 65 79 43 6f 6c 3e  assert( nKeyCol>
e720: 30 20 29 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 75 2e  0 );.  pLoop->u.
e730: 62 74 72 65 65 2e 6e 45 71 20 3d 20 70 4c 6f 6f  btree.nEq = pLoo
e740: 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20 6e 4b 65 79  p->nLTerm = nKey
e750: 43 6f 6c 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 77 73  Col;.  pLoop->ws
e760: 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 43 4f  Flags = WHERE_CO
e770: 4c 55 4d 4e 5f 45 51 20 7c 20 57 48 45 52 45 5f  LUMN_EQ | WHERE_
e780: 49 44 58 5f 4f 4e 4c 59 20 7c 20 57 48 45 52 45  IDX_ONLY | WHERE
e790: 5f 49 4e 44 45 58 45 44 0a 20 20 20 20 20 20 20  _INDEXED.       
e7a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
e7b0: 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58  WHERE_AUTO_INDEX
e7c0: 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 74 68  ;..  /* Count th
e7d0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 64 64 69  e number of addi
e7e0: 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 73 20 6e  tional columns n
e7f0: 65 65 64 65 64 20 74 6f 20 63 72 65 61 74 65 20  eeded to create 
e800: 61 0a 20 20 2a 2a 20 63 6f 76 65 72 69 6e 67 20  a.  ** covering 
e810: 69 6e 64 65 78 2e 20 20 41 20 22 63 6f 76 65 72  index.  A "cover
e820: 69 6e 67 20 69 6e 64 65 78 22 20 69 73 20 61 6e  ing index" is an
e830: 20 69 6e 64 65 78 20 74 68 61 74 20 63 6f 6e 74   index that cont
e840: 61 69 6e 73 20 61 6c 6c 0a 20 20 2a 2a 20 63 6f  ains all.  ** co
e850: 6c 75 6d 6e 73 20 74 68 61 74 20 61 72 65 20 6e  lumns that are n
e860: 65 65 64 65 64 20 62 79 20 74 68 65 20 71 75 65  eeded by the que
e870: 72 79 2e 20 20 57 69 74 68 20 61 20 63 6f 76 65  ry.  With a cove
e880: 72 69 6e 67 20 69 6e 64 65 78 2c 20 74 68 65 0a  ring index, the.
e890: 20 20 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 74 61    ** original ta
e8a0: 62 6c 65 20 6e 65 76 65 72 20 6e 65 65 64 73 20  ble never needs 
e8b0: 74 6f 20 62 65 20 61 63 63 65 73 73 65 64 2e 20  to be accessed. 
e8c0: 20 41 75 74 6f 6d 61 74 69 63 20 69 6e 64 69 63   Automatic indic
e8d0: 65 73 20 6d 75 73 74 0a 20 20 2a 2a 20 62 65 20  es must.  ** be 
e8e0: 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78  a covering index
e8f0: 20 62 65 63 61 75 73 65 20 74 68 65 20 69 6e 64   because the ind
e900: 65 78 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75  ex will not be u
e910: 70 64 61 74 65 64 20 69 66 20 74 68 65 0a 20 20  pdated if the.  
e920: 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 74 61 62 6c  ** original tabl
e930: 65 20 63 68 61 6e 67 65 73 20 61 6e 64 20 74 68  e changes and th
e940: 65 20 69 6e 64 65 78 20 61 6e 64 20 74 61 62 6c  e index and tabl
e950: 65 20 63 61 6e 6e 6f 74 20 62 6f 74 68 20 62 65  e cannot both be
e960: 20 75 73 65 64 0a 20 20 2a 2a 20 69 66 20 74 68   used.  ** if th
e970: 65 79 20 67 6f 20 6f 75 74 20 6f 66 20 73 79 6e  ey go out of syn
e980: 63 2e 0a 20 20 2a 2f 0a 20 20 65 78 74 72 61 43  c..  */.  extraC
e990: 6f 6c 73 20 3d 20 70 53 72 63 2d 3e 63 6f 6c 55  ols = pSrc->colU
e9a0: 73 65 64 20 26 20 28 7e 69 64 78 43 6f 6c 73 20  sed & (~idxCols 
e9b0: 7c 20 4d 41 53 4b 42 49 54 28 42 4d 53 2d 31 29  | MASKBIT(BMS-1)
e9c0: 29 3b 0a 20 20 6d 78 42 69 74 43 6f 6c 20 3d 20  );.  mxBitCol = 
e9d0: 4d 49 4e 28 42 4d 53 2d 31 2c 70 54 61 62 6c 65  MIN(BMS-1,pTable
e9e0: 2d 3e 6e 43 6f 6c 29 3b 0a 20 20 74 65 73 74 63  ->nCol);.  testc
e9f0: 61 73 65 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f  ase( pTable->nCo
ea00: 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 74 65  l==BMS-1 );.  te
ea10: 73 74 63 61 73 65 28 20 70 54 61 62 6c 65 2d 3e  stcase( pTable->
ea20: 6e 43 6f 6c 3d 3d 42 4d 53 2d 32 20 29 3b 0a 20  nCol==BMS-2 );. 
ea30: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6d 78 42 69   for(i=0; i<mxBi
ea40: 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  tCol; i++){.    
ea50: 69 66 28 20 65 78 74 72 61 43 6f 6c 73 20 26 20  if( extraCols & 
ea60: 4d 41 53 4b 42 49 54 28 69 29 20 29 20 6e 4b 65  MASKBIT(i) ) nKe
ea70: 79 43 6f 6c 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66  yCol++;.  }.  if
ea80: 28 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20  ( pSrc->colUsed 
ea90: 26 20 4d 41 53 4b 42 49 54 28 42 4d 53 2d 31 29  & MASKBIT(BMS-1)
eaa0: 20 29 7b 0a 20 20 20 20 6e 4b 65 79 43 6f 6c 20   ){.    nKeyCol 
eab0: 2b 3d 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20  += pTable->nCol 
eac0: 2d 20 42 4d 53 20 2b 20 31 3b 0a 20 20 7d 0a 0a  - BMS + 1;.  }..
ead0: 20 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20 74    /* Construct t
eae0: 68 65 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20  he Index object 
eaf0: 74 6f 20 64 65 73 63 72 69 62 65 20 74 68 69 73  to describe this
eb00: 20 69 6e 64 65 78 20 2a 2f 0a 20 20 70 49 64 78   index */.  pIdx
eb10: 20 3d 20 73 71 6c 69 74 65 33 41 6c 6c 6f 63 61   = sqlite3Alloca
eb20: 74 65 49 6e 64 65 78 4f 62 6a 65 63 74 28 70 50  teIndexObject(pP
eb30: 61 72 73 65 2d 3e 64 62 2c 20 6e 4b 65 79 43 6f  arse->db, nKeyCo
eb40: 6c 2b 31 2c 20 30 2c 20 26 7a 4e 6f 74 55 73 65  l+1, 0, &zNotUse
eb50: 64 29 3b 0a 20 20 69 66 28 20 70 49 64 78 3d 3d  d);.  if( pIdx==
eb60: 30 20 29 20 67 6f 74 6f 20 65 6e 64 5f 61 75 74  0 ) goto end_aut
eb70: 6f 5f 69 6e 64 65 78 5f 63 72 65 61 74 65 3b 0a  o_index_create;.
eb80: 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65    pLoop->u.btree
eb90: 2e 70 49 6e 64 65 78 20 3d 20 70 49 64 78 3b 0a  .pIndex = pIdx;.
eba0: 20 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 20 3d 20    pIdx->zName = 
ebb0: 22 61 75 74 6f 2d 69 6e 64 65 78 22 3b 0a 20 20  "auto-index";.  
ebc0: 70 49 64 78 2d 3e 70 54 61 62 6c 65 20 3d 20 70  pIdx->pTable = p
ebd0: 54 61 62 6c 65 3b 0a 20 20 6e 20 3d 20 30 3b 0a  Table;.  n = 0;.
ebe0: 20 20 69 64 78 43 6f 6c 73 20 3d 20 30 3b 0a 20    idxCols = 0;. 
ebf0: 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e   for(pTerm=pWC->
ec00: 61 3b 20 70 54 65 72 6d 3c 70 57 43 45 6e 64 3b  a; pTerm<pWCEnd;
ec10: 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69   pTerm++){.    i
ec20: 66 28 20 74 65 72 6d 43 61 6e 44 72 69 76 65 49  f( termCanDriveI
ec30: 6e 64 65 78 28 70 54 65 72 6d 2c 20 70 53 72 63  ndex(pTerm, pSrc
ec40: 2c 20 6e 6f 74 52 65 61 64 79 29 20 29 7b 0a 20  , notReady) ){. 
ec50: 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20       int iCol = 
ec60: 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c  pTerm->u.leftCol
ec70: 75 6d 6e 3b 0a 20 20 20 20 20 20 42 69 74 6d 61  umn;.      Bitma
ec80: 73 6b 20 63 4d 61 73 6b 20 3d 20 69 43 6f 6c 3e  sk cMask = iCol>
ec90: 3d 42 4d 53 20 3f 20 4d 41 53 4b 42 49 54 28 42  =BMS ? MASKBIT(B
eca0: 4d 53 2d 31 29 20 3a 20 4d 41 53 4b 42 49 54 28  MS-1) : MASKBIT(
ecb0: 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20 74 65 73  iCol);.      tes
ecc0: 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d 42 4d 53  tcase( iCol==BMS
ecd0: 2d 31 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  -1 );.      test
ece0: 63 61 73 65 28 20 69 43 6f 6c 3d 3d 42 4d 53 20  case( iCol==BMS 
ecf0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 69 64  );.      if( (id
ed00: 78 43 6f 6c 73 20 26 20 63 4d 61 73 6b 29 3d 3d  xCols & cMask)==
ed10: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70  0 ){.        Exp
ed20: 72 20 2a 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70  r *pX = pTerm->p
ed30: 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 69 64  Expr;.        id
ed40: 78 43 6f 6c 73 20 7c 3d 20 63 4d 61 73 6b 3b 0a  xCols |= cMask;.
ed50: 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61 69          pIdx->ai
ed60: 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 70 54 65 72  Column[n] = pTer
ed70: 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b  m->u.leftColumn;
ed80: 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d  .        pColl =
ed90: 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f   sqlite3BinaryCo
eda0: 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61  mpareCollSeq(pPa
edb0: 72 73 65 2c 20 70 58 2d 3e 70 4c 65 66 74 2c 20  rse, pX->pLeft, 
edc0: 70 58 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20  pX->pRight);.   
edd0: 20 20 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c       pIdx->azCol
ede0: 6c 5b 6e 5d 20 3d 20 41 4c 57 41 59 53 28 70 43  l[n] = ALWAYS(pC
edf0: 6f 6c 6c 29 20 3f 20 70 43 6f 6c 6c 2d 3e 7a 4e  oll) ? pColl->zN
ee00: 61 6d 65 20 3a 20 22 42 49 4e 41 52 59 22 3b 0a  ame : "BINARY";.
ee10: 20 20 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20          n++;.   
ee20: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
ee30: 20 61 73 73 65 72 74 28 20 28 75 33 32 29 6e 3d   assert( (u32)n=
ee40: 3d 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e  =pLoop->u.btree.
ee50: 6e 45 71 20 29 3b 0a 0a 20 20 2f 2a 20 41 64 64  nEq );..  /* Add
ee60: 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6c 75   additional colu
ee70: 6d 6e 73 20 6e 65 65 64 65 64 20 74 6f 20 6d 61  mns needed to ma
ee80: 6b 65 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63  ke the automatic
ee90: 20 69 6e 64 65 78 20 69 6e 74 6f 0a 20 20 2a 2a   index into.  **
eea0: 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65   a covering inde
eeb0: 78 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20  x */.  for(i=0; 
eec0: 69 3c 6d 78 42 69 74 43 6f 6c 3b 20 69 2b 2b 29  i<mxBitCol; i++)
eed0: 7b 0a 20 20 20 20 69 66 28 20 65 78 74 72 61 43  {.    if( extraC
eee0: 6f 6c 73 20 26 20 4d 41 53 4b 42 49 54 28 69 29  ols & MASKBIT(i)
eef0: 20 29 7b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e   ){.      pIdx->
ef00: 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 69 3b  aiColumn[n] = i;
ef10: 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a 43  .      pIdx->azC
ef20: 6f 6c 6c 5b 6e 5d 20 3d 20 22 42 49 4e 41 52 59  oll[n] = "BINARY
ef30: 22 3b 0a 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20  ";.      n++;.  
ef40: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 53    }.  }.  if( pS
ef50: 72 63 2d 3e 63 6f 6c 55 73 65 64 20 26 20 4d 41  rc->colUsed & MA
ef60: 53 4b 42 49 54 28 42 4d 53 2d 31 29 20 29 7b 0a  SKBIT(BMS-1) ){.
ef70: 20 20 20 20 66 6f 72 28 69 3d 42 4d 53 2d 31 3b      for(i=BMS-1;
ef80: 20 69 3c 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b   i<pTable->nCol;
ef90: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 49 64   i++){.      pId
efa0: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d  x->aiColumn[n] =
efb0: 20 69 3b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e   i;.      pIdx->
efc0: 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 22 42 49 4e  azColl[n] = "BIN
efd0: 41 52 59 22 3b 0a 20 20 20 20 20 20 6e 2b 2b 3b  ARY";.      n++;
efe0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73  .    }.  }.  ass
eff0: 65 72 74 28 20 6e 3d 3d 6e 4b 65 79 43 6f 6c 20  ert( n==nKeyCol 
f000: 29 3b 0a 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c  );.  pIdx->aiCol
f010: 75 6d 6e 5b 6e 5d 20 3d 20 2d 31 3b 0a 20 20 70  umn[n] = -1;.  p
f020: 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d  Idx->azColl[n] =
f030: 20 22 42 49 4e 41 52 59 22 3b 0a 0a 20 20 2f 2a   "BINARY";..  /*
f040: 20 43 72 65 61 74 65 20 74 68 65 20 61 75 74 6f   Create the auto
f050: 6d 61 74 69 63 20 69 6e 64 65 78 20 2a 2f 0a 20  matic index */. 
f060: 20 61 73 73 65 72 74 28 20 70 4c 65 76 65 6c 2d   assert( pLevel-
f070: 3e 69 49 64 78 43 75 72 3e 3d 30 20 29 3b 0a 20  >iIdxCur>=0 );. 
f080: 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72   pLevel->iIdxCur
f090: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
f0a0: 2b 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  +;.  sqlite3Vdbe
f0b0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65  AddOp2(v, OP_Ope
f0c0: 6e 41 75 74 6f 69 6e 64 65 78 2c 20 70 4c 65 76  nAutoindex, pLev
f0d0: 65 6c 2d 3e 69 49 64 78 43 75 72 2c 20 6e 4b 65  el->iIdxCur, nKe
f0e0: 79 43 6f 6c 2b 31 29 3b 0a 20 20 73 71 6c 69 74  yCol+1);.  sqlit
f0f0: 65 33 56 64 62 65 53 65 74 50 34 4b 65 79 49 6e  e3VdbeSetP4KeyIn
f100: 66 6f 28 70 50 61 72 73 65 2c 20 70 49 64 78 29  fo(pParse, pIdx)
f110: 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28  ;.  VdbeComment(
f120: 28 76 2c 20 22 66 6f 72 20 25 73 22 2c 20 70 54  (v, "for %s", pT
f130: 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 0a  able->zName));..
f140: 20 20 2f 2a 20 46 69 6c 6c 20 74 68 65 20 61 75    /* Fill the au
f150: 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 77 69  tomatic index wi
f160: 74 68 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20  th content */.  
f170: 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
f180: 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20  Push(pParse);.  
f190: 61 64 64 72 54 6f 70 20 3d 20 73 71 6c 69 74 65  addrTop = sqlite
f1a0: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
f1b0: 50 5f 52 65 77 69 6e 64 2c 20 70 4c 65 76 65 6c  P_Rewind, pLevel
f1c0: 2d 3e 69 54 61 62 43 75 72 29 3b 20 56 64 62 65  ->iTabCur); Vdbe
f1d0: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 69  Coverage(v);.  i
f1e0: 66 28 20 70 50 61 72 74 69 61 6c 20 29 7b 0a 20  f( pPartial ){. 
f1f0: 20 20 20 69 43 6f 6e 74 69 6e 75 65 20 3d 20 73     iContinue = s
f200: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
f210: 62 65 6c 28 76 29 3b 0a 20 20 20 20 73 71 6c 69  bel(v);.    sqli
f220: 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
f230: 50 61 72 73 65 2c 20 70 50 61 72 74 69 61 6c 2c  Parse, pPartial,
f240: 20 69 43 6f 6e 74 69 6e 75 65 2c 20 53 51 4c 49   iContinue, SQLI
f250: 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a  TE_JUMPIFNULL);.
f260: 20 20 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61      pLoop->wsFla
f270: 67 73 20 7c 3d 20 57 48 45 52 45 5f 50 41 52 54  gs |= WHERE_PART
f280: 49 41 4c 49 44 58 3b 0a 20 20 7d 0a 20 20 72 65  IALIDX;.  }.  re
f290: 67 52 65 63 6f 72 64 20 3d 20 73 71 6c 69 74 65  gRecord = sqlite
f2a0: 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
f2b0: 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 47 65  se);.  sqlite3Ge
f2c0: 6e 65 72 61 74 65 49 6e 64 65 78 4b 65 79 28 70  nerateIndexKey(p
f2d0: 50 61 72 73 65 2c 20 70 49 64 78 2c 20 70 4c 65  Parse, pIdx, pLe
f2e0: 76 65 6c 2d 3e 69 54 61 62 43 75 72 2c 20 72 65  vel->iTabCur, re
f2f0: 67 52 65 63 6f 72 64 2c 20 30 2c 20 30 2c 20 30  gRecord, 0, 0, 0
f300: 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  , 0);.  sqlite3V
f310: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
f320: 49 64 78 49 6e 73 65 72 74 2c 20 70 4c 65 76 65  IdxInsert, pLeve
f330: 6c 2d 3e 69 49 64 78 43 75 72 2c 20 72 65 67 52  l->iIdxCur, regR
f340: 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65  ecord);.  sqlite
f350: 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
f360: 20 4f 50 46 4c 41 47 5f 55 53 45 53 45 45 4b 52   OPFLAG_USESEEKR
f370: 45 53 55 4c 54 29 3b 0a 20 20 69 66 28 20 70 50  ESULT);.  if( pP
f380: 61 72 74 69 61 6c 20 29 20 73 71 6c 69 74 65 33  artial ) sqlite3
f390: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
f3a0: 28 76 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a  (v, iContinue);.
f3b0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
f3c0: 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20  Op2(v, OP_Next, 
f3d0: 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 2c  pLevel->iTabCur,
f3e0: 20 61 64 64 72 54 6f 70 2b 31 29 3b 20 56 64 62   addrTop+1); Vdb
f3f0: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
f400: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
f410: 65 50 35 28 76 2c 20 53 51 4c 49 54 45 5f 53 54  eP5(v, SQLITE_ST
f420: 4d 54 53 54 41 54 55 53 5f 41 55 54 4f 49 4e 44  MTSTATUS_AUTOIND
f430: 45 58 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  EX);.  sqlite3Vd
f440: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
f450: 64 72 54 6f 70 29 3b 0a 20 20 73 71 6c 69 74 65  drTop);.  sqlite
f460: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
f470: 70 50 61 72 73 65 2c 20 72 65 67 52 65 63 6f 72  pParse, regRecor
f480: 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  d);.  sqlite3Exp
f490: 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65  rCachePop(pParse
f4a0: 29 3b 0a 20 20 0a 20 20 2f 2a 20 4a 75 6d 70 20  );.  .  /* Jump 
f4b0: 68 65 72 65 20 77 68 65 6e 20 73 6b 69 70 70 69  here when skippi
f4c0: 6e 67 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a  ng the initializ
f4d0: 61 74 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74  ation */.  sqlit
f4e0: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
f4f0: 2c 20 61 64 64 72 49 6e 69 74 29 3b 0a 0a 65 6e  , addrInit);..en
f500: 64 5f 61 75 74 6f 5f 69 6e 64 65 78 5f 63 72 65  d_auto_index_cre
f510: 61 74 65 3a 0a 20 20 73 71 6c 69 74 65 33 45 78  ate:.  sqlite3Ex
f520: 70 72 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d  prDelete(pParse-
f530: 3e 64 62 2c 20 70 50 61 72 74 69 61 6c 29 3b 0a  >db, pPartial);.
f540: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
f550: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49  TE_OMIT_AUTOMATI
f560: 43 5f 49 4e 44 45 58 20 2a 2f 0a 0a 23 69 66 6e  C_INDEX */..#ifn
f570: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
f580: 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a  VIRTUALTABLE./*.
f590: 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20  ** Allocate and 
f5a0: 70 6f 70 75 6c 61 74 65 20 61 6e 20 73 71 6c 69  populate an sqli
f5b0: 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73  te3_index_info s
f5c0: 74 72 75 63 74 75 72 65 2e 20 49 74 20 69 73 20  tructure. It is 
f5d0: 74 68 65 20 0a 2a 2a 20 72 65 73 70 6f 6e 73 69  the .** responsi
f5e0: 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61  bility of the ca
f5f0: 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c  ller to eventual
f600: 6c 79 20 72 65 6c 65 61 73 65 20 74 68 65 20 73  ly release the s
f610: 74 72 75 63 74 75 72 65 0a 2a 2a 20 62 79 20 70  tructure.** by p
f620: 61 73 73 69 6e 67 20 74 68 65 20 70 6f 69 6e 74  assing the point
f630: 65 72 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  er returned by t
f640: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20  his function to 
f650: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29 2e 0a  sqlite3_free()..
f660: 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65  */.static sqlite
f670: 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 61 6c  3_index_info *al
f680: 6c 6f 63 61 74 65 49 6e 64 65 78 49 6e 66 6f 28  locateIndexInfo(
f690: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
f6a0: 2c 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  ,.  WhereClause 
f6b0: 2a 70 57 43 2c 0a 20 20 73 74 72 75 63 74 20 53  *pWC,.  struct S
f6c0: 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72  rcList_item *pSr
f6d0: 63 2c 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  c,.  ExprList *p
f6e0: 4f 72 64 65 72 42 79 0a 29 7b 0a 20 20 69 6e 74  OrderBy.){.  int
f6f0: 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 6e 54 65   i, j;.  int nTe
f700: 72 6d 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c  rm;.  struct sql
f710: 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
f720: 72 61 69 6e 74 20 2a 70 49 64 78 43 6f 6e 73 3b  raint *pIdxCons;
f730: 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69 74 65  .  struct sqlite
f740: 33 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62 79 20  3_index_orderby 
f750: 2a 70 49 64 78 4f 72 64 65 72 42 79 3b 0a 20 20  *pIdxOrderBy;.  
f760: 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
f770: 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f  ndex_constraint_
f780: 75 73 61 67 65 20 2a 70 55 73 61 67 65 3b 0a 20  usage *pUsage;. 
f790: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
f7a0: 6d 3b 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72 42  m;.  int nOrderB
f7b0: 79 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 64  y;.  sqlite3_ind
f7c0: 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e 66  ex_info *pIdxInf
f7d0: 6f 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 74  o;..  /* Count t
f7e0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 6f 73  he number of pos
f7f0: 73 69 62 6c 65 20 57 48 45 52 45 20 63 6c 61 75  sible WHERE clau
f800: 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 72  se constraints r
f810: 65 66 65 72 72 69 6e 67 0a 20 20 2a 2a 20 74 6f  eferring.  ** to
f820: 20 74 68 69 73 20 76 69 72 74 75 61 6c 20 74 61   this virtual ta
f830: 62 6c 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6e  ble */.  for(i=n
f840: 54 65 72 6d 3d 30 2c 20 70 54 65 72 6d 3d 70 57  Term=0, pTerm=pW
f850: 43 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65  C->a; i<pWC->nTe
f860: 72 6d 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b  rm; i++, pTerm++
f870: 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d  ){.    if( pTerm
f880: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 21 3d 20  ->leftCursor != 
f890: 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 20  pSrc->iCursor ) 
f8a0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73  continue;.    as
f8b0: 73 65 72 74 28 20 49 73 50 6f 77 65 72 4f 66 54  sert( IsPowerOfT
f8c0: 77 6f 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  wo(pTerm->eOpera
f8d0: 74 6f 72 20 26 20 7e 57 4f 5f 45 51 55 49 56 29  tor & ~WO_EQUIV)
f8e0: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
f8f0: 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
f900: 6f 72 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20 20  or & WO_IN );.  
f910: 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
f920: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
f930: 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20  O_ISNULL );.    
f940: 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
f950: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
f960: 41 4c 4c 20 29 3b 0a 20 20 20 20 69 66 28 20 28  ALL );.    if( (
f970: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
f980: 20 26 20 7e 28 57 4f 5f 49 53 4e 55 4c 4c 7c 57   & ~(WO_ISNULL|W
f990: 4f 5f 45 51 55 49 56 29 29 3d 3d 30 20 29 20 63  O_EQUIV))==0 ) c
f9a0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
f9b0: 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
f9c0: 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 20 29 20 63  & TERM_VNULL ) c
f9d0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 6e 54 65  ontinue;.    nTe
f9e0: 72 6d 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rm++;.  }..  /* 
f9f0: 49 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  If the ORDER BY 
fa00: 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20  clause contains 
fa10: 6f 6e 6c 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  only columns in 
fa20: 74 68 65 20 63 75 72 72 65 6e 74 20 0a 20 20 2a  the current .  *
fa30: 2a 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  * virtual table 
fa40: 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65 20 73 70  then allocate sp
fa50: 61 63 65 20 66 6f 72 20 74 68 65 20 61 4f 72 64  ace for the aOrd
fa60: 65 72 42 79 20 70 61 72 74 20 6f 66 0a 20 20 2a  erBy part of.  *
fa70: 2a 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e  * the sqlite3_in
fa80: 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75  dex_info structu
fa90: 72 65 2e 0a 20 20 2a 2f 0a 20 20 6e 4f 72 64 65  re..  */.  nOrde
faa0: 72 42 79 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  rBy = 0;.  if( p
fab0: 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 69  OrderBy ){.    i
fac0: 6e 74 20 6e 20 3d 20 70 4f 72 64 65 72 42 79 2d  nt n = pOrderBy-
fad0: 3e 6e 45 78 70 72 3b 0a 20 20 20 20 66 6f 72 28  >nExpr;.    for(
fae0: 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a  i=0; i<n; i++){.
faf0: 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70        Expr *pExp
fb00: 72 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  r = pOrderBy->a[
fb10: 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  i].pExpr;.      
fb20: 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  if( pExpr->op!=T
fb30: 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 45 78 70  K_COLUMN || pExp
fb40: 72 2d 3e 69 54 61 62 6c 65 21 3d 70 53 72 63 2d  r->iTable!=pSrc-
fb50: 3e 69 43 75 72 73 6f 72 20 29 20 62 72 65 61 6b  >iCursor ) break
fb60: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
fb70: 69 3d 3d 6e 29 7b 0a 20 20 20 20 20 20 6e 4f 72  i==n){.      nOr
fb80: 64 65 72 42 79 20 3d 20 6e 3b 0a 20 20 20 20 7d  derBy = n;.    }
fb90: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  .  }..  /* Alloc
fba0: 61 74 65 20 74 68 65 20 73 71 6c 69 74 65 33 5f  ate the sqlite3_
fbb0: 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63  index_info struc
fbc0: 74 75 72 65 0a 20 20 2a 2f 0a 20 20 70 49 64 78  ture.  */.  pIdx
fbd0: 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62  Info = sqlite3Db
fbe0: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 50 61 72 73  MallocZero(pPars
fbf0: 65 2d 3e 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70  e->db, sizeof(*p
fc00: 49 64 78 49 6e 66 6f 29 0a 20 20 20 20 20 20 20  IdxInfo).       
fc10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc20: 20 20 20 20 2b 20 28 73 69 7a 65 6f 66 28 2a 70      + (sizeof(*p
fc30: 49 64 78 43 6f 6e 73 29 20 2b 20 73 69 7a 65 6f  IdxCons) + sizeo
fc40: 66 28 2a 70 55 73 61 67 65 29 29 2a 6e 54 65 72  f(*pUsage))*nTer
fc50: 6d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m.              
fc60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 20 73               + s
fc70: 69 7a 65 6f 66 28 2a 70 49 64 78 4f 72 64 65 72  izeof(*pIdxOrder
fc80: 42 79 29 2a 6e 4f 72 64 65 72 42 79 20 29 3b 0a  By)*nOrderBy );.
fc90: 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f 3d 3d    if( pIdxInfo==
fca0: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
fcb0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
fcc0: 20 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 22   "out of memory"
fcd0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
fce0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69  .  }..  /* Initi
fcf0: 61 6c 69 7a 65 20 74 68 65 20 73 74 72 75 63 74  alize the struct
fd00: 75 72 65 2e 20 20 54 68 65 20 73 71 6c 69 74 65  ure.  The sqlite
fd10: 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72  3_index_info str
fd20: 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 0a  ucture contains.
fd30: 20 20 2a 2a 20 6d 61 6e 79 20 66 69 65 6c 64 73    ** many fields
fd40: 20 74 68 61 74 20 61 72 65 20 64 65 63 6c 61 72   that are declar
fd50: 65 64 20 22 63 6f 6e 73 74 22 20 74 6f 20 70 72  ed "const" to pr
fd60: 65 76 65 6e 74 20 78 42 65 73 74 49 6e 64 65 78  event xBestIndex
fd70: 20 66 72 6f 6d 0a 20 20 2a 2a 20 63 68 61 6e 67   from.  ** chang
fd80: 69 6e 67 20 74 68 65 6d 2e 20 20 57 65 20 68 61  ing them.  We ha
fd90: 76 65 20 74 6f 20 64 6f 20 73 6f 6d 65 20 66 75  ve to do some fu
fda0: 6e 6b 79 20 63 61 73 74 69 6e 67 20 69 6e 20 6f  nky casting in o
fdb0: 72 64 65 72 20 74 6f 0a 20 20 2a 2a 20 69 6e 69  rder to.  ** ini
fdc0: 74 69 61 6c 69 7a 65 20 74 68 6f 73 65 20 66 69  tialize those fi
fdd0: 65 6c 64 73 2e 0a 20 20 2a 2f 0a 20 20 70 49 64  elds..  */.  pId
fde0: 78 43 6f 6e 73 20 3d 20 28 73 74 72 75 63 74 20  xCons = (struct 
fdf0: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f  sqlite3_index_co
fe00: 6e 73 74 72 61 69 6e 74 2a 29 26 70 49 64 78 49  nstraint*)&pIdxI
fe10: 6e 66 6f 5b 31 5d 3b 0a 20 20 70 49 64 78 4f 72  nfo[1];.  pIdxOr
fe20: 64 65 72 42 79 20 3d 20 28 73 74 72 75 63 74 20  derBy = (struct 
fe30: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f 72  sqlite3_index_or
fe40: 64 65 72 62 79 2a 29 26 70 49 64 78 43 6f 6e 73  derby*)&pIdxCons
fe50: 5b 6e 54 65 72 6d 5d 3b 0a 20 20 70 55 73 61 67  [nTerm];.  pUsag
fe60: 65 20 3d 20 28 73 74 72 75 63 74 20 73 71 6c 69  e = (struct sqli
fe70: 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72  te3_index_constr
fe80: 61 69 6e 74 5f 75 73 61 67 65 2a 29 26 70 49 64  aint_usage*)&pId
fe90: 78 4f 72 64 65 72 42 79 5b 6e 4f 72 64 65 72 42  xOrderBy[nOrderB
fea0: 79 5d 3b 0a 20 20 2a 28 69 6e 74 2a 29 26 70 49  y];.  *(int*)&pI
feb0: 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61  dxInfo->nConstra
fec0: 69 6e 74 20 3d 20 6e 54 65 72 6d 3b 0a 20 20 2a  int = nTerm;.  *
fed0: 28 69 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f 2d  (int*)&pIdxInfo-
fee0: 3e 6e 4f 72 64 65 72 42 79 20 3d 20 6e 4f 72 64  >nOrderBy = nOrd
fef0: 65 72 42 79 3b 0a 20 20 2a 28 73 74 72 75 63 74  erBy;.  *(struct
ff00: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63   sqlite3_index_c
ff10: 6f 6e 73 74 72 61 69 6e 74 2a 2a 29 26 70 49 64  onstraint**)&pId
ff20: 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69  xInfo->aConstrai
ff30: 6e 74 20 3d 20 70 49 64 78 43 6f 6e 73 3b 0a 20  nt = pIdxCons;. 
ff40: 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74 65   *(struct sqlite
ff50: 33 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62 79 2a  3_index_orderby*
ff60: 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 4f 72  *)&pIdxInfo->aOr
ff70: 64 65 72 42 79 20 3d 20 70 49 64 78 4f 72 64 65  derBy = pIdxOrde
ff80: 72 42 79 3b 0a 20 20 2a 28 73 74 72 75 63 74 20  rBy;.  *(struct 
ff90: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f  sqlite3_index_co
ffa0: 6e 73 74 72 61 69 6e 74 5f 75 73 61 67 65 2a 2a  nstraint_usage**
ffb0: 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e  )&pIdxInfo->aCon
ffc0: 73 74 72 61 69 6e 74 55 73 61 67 65 20 3d 0a 20  straintUsage =. 
ffd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ffe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10010 20 20 70 55 73 61 67 65 3b 0a 0a 20 20 66 6f 72    pUsage;..  for
10020 28 69 3d 6a 3d 30 2c 20 70 54 65 72 6d 3d 70 57  (i=j=0, pTerm=pW
10030 43 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65  C->a; i<pWC->nTe
10040 72 6d 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b  rm; i++, pTerm++
10050 29 7b 0a 20 20 20 20 75 38 20 6f 70 3b 0a 20 20  ){.    u8 op;.  
10060 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66    if( pTerm->lef
10070 74 43 75 72 73 6f 72 20 21 3d 20 70 53 72 63 2d  tCursor != pSrc-
10080 3e 69 43 75 72 73 6f 72 20 29 20 63 6f 6e 74 69  >iCursor ) conti
10090 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28  nue;.    assert(
100a0 20 49 73 50 6f 77 65 72 4f 66 54 77 6f 28 70 54   IsPowerOfTwo(pT
100b0 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
100c0 20 7e 57 4f 5f 45 51 55 49 56 29 20 29 3b 0a 20   ~WO_EQUIV) );. 
100d0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
100e0 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
100f0 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 74 65 73  WO_IN );.    tes
10100 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f  tcase( pTerm->eO
10110 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 4e  perator & WO_ISN
10120 55 4c 4c 20 29 3b 0a 20 20 20 20 74 65 73 74 63  ULL );.    testc
10130 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65  ase( pTerm->eOpe
10140 72 61 74 6f 72 20 26 20 57 4f 5f 41 4c 4c 20 29  rator & WO_ALL )
10150 3b 0a 20 20 20 20 69 66 28 20 28 70 54 65 72 6d  ;.    if( (pTerm
10160 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 7e 28  ->eOperator & ~(
10170 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 45 51 55  WO_ISNULL|WO_EQU
10180 49 56 29 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  IV))==0 ) contin
10190 75 65 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72  ue;.    if( pTer
101a0 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
101b0 4d 5f 56 4e 55 4c 4c 20 29 20 63 6f 6e 74 69 6e  M_VNULL ) contin
101c0 75 65 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e 73  ue;.    pIdxCons
101d0 5b 6a 5d 2e 69 43 6f 6c 75 6d 6e 20 3d 20 70 54  [j].iColumn = pT
101e0 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d  erm->u.leftColum
101f0 6e 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 5b  n;.    pIdxCons[
10200 6a 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74 20 3d  j].iTermOffset =
10210 20 69 3b 0a 20 20 20 20 6f 70 20 3d 20 28 75 38   i;.    op = (u8
10220 29 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  )pTerm->eOperato
10230 72 20 26 20 57 4f 5f 41 4c 4c 3b 0a 20 20 20 20  r & WO_ALL;.    
10240 69 66 28 20 6f 70 3d 3d 57 4f 5f 49 4e 20 29 20  if( op==WO_IN ) 
10250 6f 70 20 3d 20 57 4f 5f 45 51 3b 0a 20 20 20 20  op = WO_EQ;.    
10260 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 6f 70 20 3d  pIdxCons[j].op =
10270 20 6f 70 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20   op;.    /* The 
10280 64 69 72 65 63 74 20 61 73 73 69 67 6e 6d 65 6e  direct assignmen
10290 74 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75  t in the previou
102a0 73 20 6c 69 6e 65 20 69 73 20 70 6f 73 73 69 62  s line is possib
102b0 6c 65 20 6f 6e 6c 79 20 62 65 63 61 75 73 65 0a  le only because.
102c0 20 20 20 20 2a 2a 20 74 68 65 20 57 4f 5f 20 61      ** the WO_ a
102d0 6e 64 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f  nd SQLITE_INDEX_
102e0 43 4f 4e 53 54 52 41 49 4e 54 5f 20 63 6f 64 65  CONSTRAINT_ code
102f0 73 20 61 72 65 20 69 64 65 6e 74 69 63 61 6c 2e  s are identical.
10300 20 20 54 68 65 0a 20 20 20 20 2a 2a 20 66 6f 6c    The.    ** fol
10310 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 73 20 76  lowing asserts v
10320 65 72 69 66 79 20 74 68 69 73 20 66 61 63 74 2e  erify this fact.
10330 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
10340 57 4f 5f 45 51 3d 3d 53 51 4c 49 54 45 5f 49 4e  WO_EQ==SQLITE_IN
10350 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 45  DEX_CONSTRAINT_E
10360 51 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  Q );.    assert(
10370 20 57 4f 5f 4c 54 3d 3d 53 51 4c 49 54 45 5f 49   WO_LT==SQLITE_I
10380 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  NDEX_CONSTRAINT_
10390 4c 54 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  LT );.    assert
103a0 28 20 57 4f 5f 4c 45 3d 3d 53 51 4c 49 54 45 5f  ( WO_LE==SQLITE_
103b0 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54  INDEX_CONSTRAINT
103c0 5f 4c 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72  _LE );.    asser
103d0 74 28 20 57 4f 5f 47 54 3d 3d 53 51 4c 49 54 45  t( WO_GT==SQLITE
103e0 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e  _INDEX_CONSTRAIN
103f0 54 5f 47 54 20 29 3b 0a 20 20 20 20 61 73 73 65  T_GT );.    asse
10400 72 74 28 20 57 4f 5f 47 45 3d 3d 53 51 4c 49 54  rt( WO_GE==SQLIT
10410 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49  E_INDEX_CONSTRAI
10420 4e 54 5f 47 45 20 29 3b 0a 20 20 20 20 61 73 73  NT_GE );.    ass
10430 65 72 74 28 20 57 4f 5f 4d 41 54 43 48 3d 3d 53  ert( WO_MATCH==S
10440 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53  QLITE_INDEX_CONS
10450 54 52 41 49 4e 54 5f 4d 41 54 43 48 20 29 3b 0a  TRAINT_MATCH );.
10460 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72      assert( pTer
10470 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28  m->eOperator & (
10480 57 4f 5f 49 4e 7c 57 4f 5f 45 51 7c 57 4f 5f 4c  WO_IN|WO_EQ|WO_L
10490 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c 57 4f  T|WO_LE|WO_GT|WO
104a0 5f 47 45 7c 57 4f 5f 4d 41 54 43 48 29 20 29 3b  _GE|WO_MATCH) );
104b0 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20  .    j++;.  }.  
104c0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65  for(i=0; i<nOrde
104d0 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45  rBy; i++){.    E
104e0 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4f 72  xpr *pExpr = pOr
104f0 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70  derBy->a[i].pExp
10500 72 3b 0a 20 20 20 20 70 49 64 78 4f 72 64 65 72  r;.    pIdxOrder
10510 42 79 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 20 3d 20  By[i].iColumn = 
10520 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a  pExpr->iColumn;.
10530 20 20 20 20 70 49 64 78 4f 72 64 65 72 42 79 5b      pIdxOrderBy[
10540 69 5d 2e 64 65 73 63 20 3d 20 70 4f 72 64 65 72  i].desc = pOrder
10550 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64  By->a[i].sortOrd
10560 65 72 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  er;.  }..  retur
10570 6e 20 70 49 64 78 49 6e 66 6f 3b 0a 7d 0a 0a 2f  n pIdxInfo;.}../
10580 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65 20 6f  *.** The table o
10590 62 6a 65 63 74 20 72 65 66 65 72 65 6e 63 65 20  bject reference 
105a0 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
105b0 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f  cond argument to
105c0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a   this function.*
105d0 2a 20 6d 75 73 74 20 72 65 70 72 65 73 65 6e 74  * must represent
105e0 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65   a virtual table
105f0 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
10600 69 6e 76 6f 6b 65 73 20 74 68 65 20 78 42 65 73  invokes the xBes
10610 74 49 6e 64 65 78 28 29 0a 2a 2a 20 6d 65 74 68  tIndex().** meth
10620 6f 64 20 6f 66 20 74 68 65 20 76 69 72 74 75 61  od of the virtua
10630 6c 20 74 61 62 6c 65 20 77 69 74 68 20 74 68 65  l table with the
10640 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
10650 6e 66 6f 20 6f 62 6a 65 63 74 20 74 68 61 74 0a  nfo object that.
10660 2a 2a 20 63 6f 6d 65 73 20 69 6e 20 61 73 20 74  ** comes in as t
10670 68 65 20 33 72 64 20 61 72 67 75 6d 65 6e 74 20  he 3rd argument 
10680 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
10690 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
106a0 72 6f 72 20 6f 63 63 75 72 73 2c 20 70 50 61 72  ror occurs, pPar
106b0 73 65 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20  se is populated 
106c0 77 69 74 68 20 61 6e 20 65 72 72 6f 72 20 6d 65  with an error me
106d0 73 73 61 67 65 20 61 6e 64 20 61 0a 2a 2a 20 6e  ssage and a.** n
106e0 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 69 73  on-zero value is
106f0 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72   returned. Other
10700 77 69 73 65 2c 20 30 20 69 73 20 72 65 74 75 72  wise, 0 is retur
10710 6e 65 64 20 61 6e 64 20 74 68 65 20 6f 75 74 70  ned and the outp
10720 75 74 0a 2a 2a 20 70 61 72 74 20 6f 66 20 74 68  ut.** part of th
10730 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  e sqlite3_index_
10740 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69  info structure i
10750 73 20 6c 65 66 74 20 70 6f 70 75 6c 61 74 65 64  s left populated
10760 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68 65 72 20  ..**.** Whether 
10770 6f 72 20 6e 6f 74 20 61 6e 20 65 72 72 6f 72 20  or not an error 
10780 69 73 20 72 65 74 75 72 6e 65 64 2c 20 69 74 20  is returned, it 
10790 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62  is the responsib
107a0 69 6c 69 74 79 20 6f 66 20 74 68 65 0a 2a 2a 20  ility of the.** 
107b0 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75  caller to eventu
107c0 61 6c 6c 79 20 66 72 65 65 20 70 2d 3e 69 64 78  ally free p->idx
107d0 53 74 72 20 69 66 20 70 2d 3e 6e 65 65 64 54 6f  Str if p->needTo
107e0 46 72 65 65 49 64 78 53 74 72 20 69 6e 64 69 63  FreeIdxStr indic
107f0 61 74 65 73 0a 2a 2a 20 74 68 61 74 20 74 68 69  ates.** that thi
10800 73 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a 2a  s is required..*
10810 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 74 61  /.static int vta
10820 62 42 65 73 74 49 6e 64 65 78 28 50 61 72 73 65  bBestIndex(Parse
10830 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20   *pParse, Table 
10840 2a 70 54 61 62 2c 20 73 71 6c 69 74 65 33 5f 69  *pTab, sqlite3_i
10850 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20  ndex_info *p){. 
10860 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70   sqlite3_vtab *p
10870 56 74 61 62 20 3d 20 73 71 6c 69 74 65 33 47 65  Vtab = sqlite3Ge
10880 74 56 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e  tVTable(pParse->
10890 64 62 2c 20 70 54 61 62 29 2d 3e 70 56 74 61 62  db, pTab)->pVtab
108a0 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ;.  int i;.  int
108b0 20 72 63 3b 0a 0a 20 20 54 52 41 43 45 5f 49 44   rc;..  TRACE_ID
108c0 58 5f 49 4e 50 55 54 53 28 70 29 3b 0a 20 20 72  X_INPUTS(p);.  r
108d0 63 20 3d 20 70 56 74 61 62 2d 3e 70 4d 6f 64 75  c = pVtab->pModu
108e0 6c 65 2d 3e 78 42 65 73 74 49 6e 64 65 78 28 70  le->xBestIndex(p
108f0 56 74 61 62 2c 20 70 29 3b 0a 20 20 54 52 41 43  Vtab, p);.  TRAC
10900 45 5f 49 44 58 5f 4f 55 54 50 55 54 53 28 70 29  E_IDX_OUTPUTS(p)
10910 3b 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  ;..  if( rc!=SQL
10920 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
10930 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ( rc==SQLITE_NOM
10940 45 4d 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72  EM ){.      pPar
10950 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
10960 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 65  iled = 1;.    }e
10970 6c 73 65 20 69 66 28 20 21 70 56 74 61 62 2d 3e  lse if( !pVtab->
10980 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 20  zErrMsg ){.     
10990 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
109a0 28 70 50 61 72 73 65 2c 20 22 25 73 22 2c 20 73  (pParse, "%s", s
109b0 71 6c 69 74 65 33 45 72 72 53 74 72 28 72 63 29  qlite3ErrStr(rc)
109c0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
109d0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
109e0 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25 73 22  Msg(pParse, "%s"
109f0 2c 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67  , pVtab->zErrMsg
10a00 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  );.    }.  }.  s
10a10 71 6c 69 74 65 33 5f 66 72 65 65 28 70 56 74 61  qlite3_free(pVta
10a20 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70  b->zErrMsg);.  p
10a30 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20 3d 20  Vtab->zErrMsg = 
10a40 30 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  0;..  for(i=0; i
10a50 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b  <p->nConstraint;
10a60 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 21   i++){.    if( !
10a70 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69  p->aConstraint[i
10a80 5d 2e 75 73 61 62 6c 65 20 26 26 20 70 2d 3e 61  ].usable && p->a
10a90 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b  ConstraintUsage[
10aa0 69 5d 2e 61 72 67 76 49 6e 64 65 78 3e 30 20 29  i].argvIndex>0 )
10ab0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
10ac0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
10ad0 0a 20 20 20 20 20 20 20 20 20 20 22 74 61 62 6c  .          "tabl
10ae0 65 20 25 73 3a 20 78 42 65 73 74 49 6e 64 65 78  e %s: xBestIndex
10af0 20 72 65 74 75 72 6e 65 64 20 61 6e 20 69 6e 76   returned an inv
10b00 61 6c 69 64 20 70 6c 61 6e 22 2c 20 70 54 61 62  alid plan", pTab
10b10 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a  ->zName);.    }.
10b20 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 50    }..  return pP
10b30 61 72 73 65 2d 3e 6e 45 72 72 3b 0a 7d 0a 23 65  arse->nErr;.}.#e
10b40 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
10b50 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52  (SQLITE_OMIT_VIR
10b60 54 55 41 4c 54 41 42 4c 45 29 20 2a 2f 0a 0a 23  TUALTABLE) */..#
10b70 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
10b80 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41  BLE_STAT3_OR_STA
10b90 54 34 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74  T4./*.** Estimat
10ba0 65 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f  e the location o
10bb0 66 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 6b  f a particular k
10bc0 65 79 20 61 6d 6f 6e 67 20 61 6c 6c 20 6b 65 79  ey among all key
10bd0 73 20 69 6e 20 61 6e 0a 2a 2a 20 69 6e 64 65 78  s in an.** index
10be0 2e 20 20 53 74 6f 72 65 20 74 68 65 20 72 65 73  .  Store the res
10bf0 75 6c 74 73 20 69 6e 20 61 53 74 61 74 20 61 73  ults in aStat as
10c00 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
10c10 20 20 20 61 53 74 61 74 5b 30 5d 20 20 20 20 20     aStat[0]     
10c20 20 45 73 74 2e 20 6e 75 6d 62 65 72 20 6f 66 20   Est. number of 
10c30 72 6f 77 73 20 6c 65 73 73 20 74 68 61 6e 20 70  rows less than p
10c40 56 61 6c 0a 2a 2a 20 20 20 20 61 53 74 61 74 5b  Val.**    aStat[
10c50 31 5d 20 20 20 20 20 20 45 73 74 2e 20 6e 75 6d  1]      Est. num
10c60 62 65 72 20 6f 66 20 72 6f 77 73 20 65 71 75 61  ber of rows equa
10c70 6c 20 74 6f 20 70 56 61 6c 0a 2a 2a 0a 2a 2a 20  l to pVal.**.** 
10c80 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78  Return the index
10c90 20 6f 66 20 74 68 65 20 73 61 6d 70 6c 65 20 74   of the sample t
10ca0 68 61 74 20 69 73 20 74 68 65 20 73 6d 61 6c 6c  hat is the small
10cb0 65 73 74 20 73 61 6d 70 6c 65 20 74 68 61 74 0a  est sample that.
10cc0 2a 2a 20 69 73 20 67 72 65 61 74 65 72 20 74 68  ** is greater th
10cd0 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 70  an or equal to p
10ce0 52 65 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  Rec..*/.static i
10cf0 6e 74 20 77 68 65 72 65 4b 65 79 53 74 61 74 73  nt whereKeyStats
10d00 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
10d10 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
10d20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
10d30 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 49 6e 64 65  ection */.  Inde
10d40 78 20 2a 70 49 64 78 2c 20 20 20 20 20 20 20 20  x *pIdx,        
10d50 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
10d60 20 74 6f 20 63 6f 6e 73 69 64 65 72 20 64 6f 6d   to consider dom
10d70 61 69 6e 20 6f 66 20 2a 2f 0a 20 20 55 6e 70 61  ain of */.  Unpa
10d80 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 52 65 63  ckedRecord *pRec
10d90 2c 20 20 20 20 20 20 20 2f 2a 20 56 65 63 74 6f  ,       /* Vecto
10da0 72 20 6f 66 20 76 61 6c 75 65 73 20 74 6f 20 63  r of values to c
10db0 6f 6e 73 69 64 65 72 20 2a 2f 0a 20 20 69 6e 74  onsider */.  int
10dc0 20 72 6f 75 6e 64 55 70 2c 20 20 20 20 20 20 20   roundUp,       
10dd0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 75 6e           /* Roun
10de0 64 20 75 70 20 69 66 20 74 72 75 65 2e 20 20 52  d up if true.  R
10df0 6f 75 6e 64 20 64 6f 77 6e 20 69 66 20 66 61 6c  ound down if fal
10e00 73 65 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20  se */.  tRowcnt 
10e10 2a 61 53 74 61 74 20 20 20 20 20 20 20 20 20 20  *aStat          
10e20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 73 74 61 74      /* OUT: stat
10e30 73 20 77 72 69 74 74 65 6e 20 68 65 72 65 20 2a  s written here *
10e40 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 53 61 6d 70  /.){.  IndexSamp
10e50 6c 65 20 2a 61 53 61 6d 70 6c 65 20 3d 20 70 49  le *aSample = pI
10e60 64 78 2d 3e 61 53 61 6d 70 6c 65 3b 0a 20 20 69  dx->aSample;.  i
10e70 6e 74 20 69 43 6f 6c 3b 20 20 20 20 20 20 20 20  nt iCol;        
10e80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
10e90 64 65 78 20 6f 66 20 72 65 71 75 69 72 65 64 20  dex of required 
10ea0 73 74 61 74 73 20 69 6e 20 61 6e 45 71 5b 5d 20  stats in anEq[] 
10eb0 65 74 63 2e 20 2a 2f 0a 20 20 69 6e 74 20 69 4d  etc. */.  int iM
10ec0 69 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  in = 0;         
10ed0 20 20 20 20 20 20 2f 2a 20 53 6d 61 6c 6c 65 73        /* Smalles
10ee0 74 20 73 61 6d 70 6c 65 20 6e 6f 74 20 79 65 74  t sample not yet
10ef0 20 74 65 73 74 65 64 20 2a 2f 0a 20 20 69 6e 74   tested */.  int
10f00 20 69 20 3d 20 70 49 64 78 2d 3e 6e 53 61 6d 70   i = pIdx->nSamp
10f10 6c 65 3b 20 20 20 20 20 20 2f 2a 20 53 6d 61 6c  le;      /* Smal
10f20 6c 65 73 74 20 73 61 6d 70 6c 65 20 6c 61 72 67  lest sample larg
10f30 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  er than or equal
10f40 20 74 6f 20 70 52 65 63 20 2a 2f 0a 20 20 69 6e   to pRec */.  in
10f50 74 20 69 54 65 73 74 3b 20 20 20 20 20 20 20 20  t iTest;        
10f60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78            /* Nex
10f70 74 20 73 61 6d 70 6c 65 20 74 6f 20 74 65 73 74  t sample to test
10f80 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73 3b 20 20   */.  int res;  
10f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10fa0 20 20 2f 2a 20 52 65 73 75 6c 74 20 6f 66 20 63    /* Result of c
10fb0 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74  omparison operat
10fc0 69 6f 6e 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  ion */..#ifndef 
10fd0 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 55  SQLITE_DEBUG.  U
10fe0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
10ff0 20 70 50 61 72 73 65 20 29 3b 0a 23 65 6e 64 69   pParse );.#endi
11000 66 0a 20 20 61 73 73 65 72 74 28 20 70 52 65 63  f.  assert( pRec
11010 21 3d 30 20 29 3b 0a 20 20 69 43 6f 6c 20 3d 20  !=0 );.  iCol = 
11020 70 52 65 63 2d 3e 6e 46 69 65 6c 64 20 2d 20 31  pRec->nField - 1
11030 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 64 78  ;.  assert( pIdx
11040 2d 3e 6e 53 61 6d 70 6c 65 3e 30 20 29 3b 0a 20  ->nSample>0 );. 
11050 20 61 73 73 65 72 74 28 20 70 52 65 63 2d 3e 6e   assert( pRec->n
11060 46 69 65 6c 64 3e 30 20 26 26 20 69 43 6f 6c 3c  Field>0 && iCol<
11070 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 43 6f 6c  pIdx->nSampleCol
11080 20 29 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 69 54   );.  do{.    iT
11090 65 73 74 20 3d 20 28 69 4d 69 6e 2b 69 29 2f 32  est = (iMin+i)/2
110a0 3b 0a 20 20 20 20 72 65 73 20 3d 20 73 71 6c 69  ;.    res = sqli
110b0 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
110c0 70 61 72 65 28 61 53 61 6d 70 6c 65 5b 69 54 65  pare(aSample[iTe
110d0 73 74 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b 69  st].n, aSample[i
110e0 54 65 73 74 5d 2e 70 2c 20 70 52 65 63 29 3b 0a  Test].p, pRec);.
110f0 20 20 20 20 69 66 28 20 72 65 73 3c 30 20 29 7b      if( res<0 ){
11100 0a 20 20 20 20 20 20 69 4d 69 6e 20 3d 20 69 54  .      iMin = iT
11110 65 73 74 2b 31 3b 0a 20 20 20 20 7d 65 6c 73 65  est+1;.    }else
11120 7b 0a 20 20 20 20 20 20 69 20 3d 20 69 54 65 73  {.      i = iTes
11130 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c  t;.    }.  }whil
11140 65 28 20 72 65 73 20 26 26 20 69 4d 69 6e 3c 69  e( res && iMin<i
11150 20 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   );..#ifdef SQLI
11160 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 54 68  TE_DEBUG.  /* Th
11170 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65  e following asse
11180 72 74 20 73 74 61 74 65 6d 65 6e 74 73 20 63 68  rt statements ch
11190 65 63 6b 20 74 68 61 74 20 74 68 65 20 62 69 6e  eck that the bin
111a0 61 72 79 20 73 65 61 72 63 68 20 63 6f 64 65 0a  ary search code.
111b0 20 20 2a 2a 20 61 62 6f 76 65 20 66 6f 75 6e 64    ** above found
111c0 20 74 68 65 20 72 69 67 68 74 20 61 6e 73 77 65   the right answe
111d0 72 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20 73 65  r. This block se
111e0 72 76 65 73 20 6e 6f 20 70 75 72 70 6f 73 65 20  rves no purpose 
111f0 6f 74 68 65 72 0a 20 20 2a 2a 20 74 68 61 6e 20  other.  ** than 
11200 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20 61 73  to invoke the as
11210 73 65 72 74 73 2e 20 20 2a 2f 0a 20 20 69 66 28  serts.  */.  if(
11220 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 2f   res==0 ){.    /
11230 2a 20 49 66 20 28 72 65 73 3d 3d 30 29 20 69 73  * If (res==0) is
11240 20 74 72 75 65 2c 20 74 68 65 6e 20 73 61 6d 70   true, then samp
11250 6c 65 20 24 69 20 6d 75 73 74 20 62 65 20 65 71  le $i must be eq
11260 75 61 6c 20 74 6f 20 70 52 65 63 20 2a 2f 0a 20  ual to pRec */. 
11270 20 20 20 61 73 73 65 72 74 28 20 69 3c 70 49 64     assert( i<pId
11280 78 2d 3e 6e 53 61 6d 70 6c 65 20 29 3b 0a 20 20  x->nSample );.  
11290 20 20 61 73 73 65 72 74 28 20 30 3d 3d 73 71 6c    assert( 0==sql
112a0 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
112b0 6d 70 61 72 65 28 61 53 61 6d 70 6c 65 5b 69 5d  mpare(aSample[i]
112c0 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 70  .n, aSample[i].p
112d0 2c 20 70 52 65 63 29 0a 20 20 20 20 20 20 20 20  , pRec).        
112e0 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e   || pParse->db->
112f0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
11300 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
11310 4f 74 68 65 72 77 69 73 65 2c 20 70 52 65 63 20  Otherwise, pRec 
11320 6d 75 73 74 20 62 65 20 73 6d 61 6c 6c 65 72 20  must be smaller 
11330 74 68 61 6e 20 73 61 6d 70 6c 65 20 24 69 20 61  than sample $i a
11340 6e 64 20 6c 61 72 67 65 72 20 74 68 61 6e 0a 20  nd larger than. 
11350 20 20 20 2a 2a 20 73 61 6d 70 6c 65 20 28 24 69     ** sample ($i
11360 2d 31 29 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73  -1).  */.    ass
11370 65 72 74 28 20 69 3d 3d 70 49 64 78 2d 3e 6e 53  ert( i==pIdx->nS
11380 61 6d 70 6c 65 20 0a 20 20 20 20 20 20 20 20 20  ample .         
11390 7c 7c 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  || sqlite3VdbeRe
113a0 63 6f 72 64 43 6f 6d 70 61 72 65 28 61 53 61 6d  cordCompare(aSam
113b0 70 6c 65 5b 69 5d 2e 6e 2c 20 61 53 61 6d 70 6c  ple[i].n, aSampl
113c0 65 5b 69 5d 2e 70 2c 20 70 52 65 63 29 3e 30 0a  e[i].p, pRec)>0.
113d0 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61 72           || pPar
113e0 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
113f0 69 6c 65 64 20 29 3b 0a 20 20 20 20 61 73 73 65  iled );.    asse
11400 72 74 28 20 69 3d 3d 30 0a 20 20 20 20 20 20 20  rt( i==0.       
11410 20 20 7c 7c 20 73 71 6c 69 74 65 33 56 64 62 65    || sqlite3Vdbe
11420 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 61 53  RecordCompare(aS
11430 61 6d 70 6c 65 5b 69 2d 31 5d 2e 6e 2c 20 61 53  ample[i-1].n, aS
11440 61 6d 70 6c 65 5b 69 2d 31 5d 2e 70 2c 20 70 52  ample[i-1].p, pR
11450 65 63 29 3c 30 0a 20 20 20 20 20 20 20 20 20 7c  ec)<0.         |
11460 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  | pParse->db->ma
11470 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
11480 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 69 66 64 65  }.#endif /* ifde
11490 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a  f SQLITE_DEBUG *
114a0 2f 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20  /..  /* At this 
114b0 70 6f 69 6e 74 2c 20 61 53 61 6d 70 6c 65 5b 69  point, aSample[i
114c0 5d 20 69 73 20 74 68 65 20 66 69 72 73 74 20 73  ] is the first s
114d0 61 6d 70 6c 65 20 74 68 61 74 20 69 73 20 67 72  ample that is gr
114e0 65 61 74 65 72 20 74 68 61 6e 0a 20 20 2a 2a 20  eater than.  ** 
114f0 6f 72 20 65 71 75 61 6c 20 74 6f 20 70 56 61 6c  or equal to pVal
11500 2e 20 20 4f 72 20 69 66 20 69 3d 3d 70 49 64 78  .  Or if i==pIdx
11510 2d 3e 6e 53 61 6d 70 6c 65 2c 20 74 68 65 6e 20  ->nSample, then 
11520 61 6c 6c 20 73 61 6d 70 6c 65 73 20 61 72 65 20  all samples are 
11530 6c 65 73 73 0a 20 20 2a 2a 20 74 68 61 6e 20 70  less.  ** than p
11540 56 61 6c 2e 20 20 49 66 20 61 53 61 6d 70 6c 65  Val.  If aSample
11550 5b 69 5d 3d 3d 70 56 61 6c 2c 20 74 68 65 6e 20  [i]==pVal, then 
11560 72 65 73 3d 3d 30 2e 0a 20 20 2a 2f 0a 20 20 69  res==0..  */.  i
11570 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20  f( res==0 ){.   
11580 20 61 53 74 61 74 5b 30 5d 20 3d 20 61 53 61 6d   aStat[0] = aSam
11590 70 6c 65 5b 69 5d 2e 61 6e 4c 74 5b 69 43 6f 6c  ple[i].anLt[iCol
115a0 5d 3b 0a 20 20 20 20 61 53 74 61 74 5b 31 5d 20  ];.    aStat[1] 
115b0 3d 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 61 6e 45  = aSample[i].anE
115c0 71 5b 69 43 6f 6c 5d 3b 0a 20 20 7d 65 6c 73 65  q[iCol];.  }else
115d0 7b 0a 20 20 20 20 74 52 6f 77 63 6e 74 20 69 4c  {.    tRowcnt iL
115e0 6f 77 65 72 2c 20 69 55 70 70 65 72 2c 20 69 47  ower, iUpper, iG
115f0 61 70 3b 0a 20 20 20 20 69 66 28 20 69 3d 3d 30  ap;.    if( i==0
11600 20 29 7b 0a 20 20 20 20 20 20 69 4c 6f 77 65 72   ){.      iLower
11610 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 55 70 70   = 0;.      iUpp
11620 65 72 20 3d 20 61 53 61 6d 70 6c 65 5b 30 5d 2e  er = aSample[0].
11630 61 6e 4c 74 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20  anLt[iCol];.    
11640 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 36 34  }else{.      i64
11650 20 6e 52 6f 77 30 20 3d 20 73 71 6c 69 74 65 33   nRow0 = sqlite3
11660 4c 6f 67 45 73 74 54 6f 49 6e 74 28 70 49 64 78  LogEstToInt(pIdx
11670 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 30 5d  ->aiRowLogEst[0]
11680 29 3b 0a 20 20 20 20 20 20 69 55 70 70 65 72 20  );.      iUpper 
11690 3d 20 69 3e 3d 70 49 64 78 2d 3e 6e 53 61 6d 70  = i>=pIdx->nSamp
116a0 6c 65 20 3f 20 6e 52 6f 77 30 20 3a 20 61 53 61  le ? nRow0 : aSa
116b0 6d 70 6c 65 5b 69 5d 2e 61 6e 4c 74 5b 69 43 6f  mple[i].anLt[iCo
116c0 6c 5d 3b 0a 20 20 20 20 20 20 69 4c 6f 77 65 72  l];.      iLower
116d0 20 3d 20 61 53 61 6d 70 6c 65 5b 69 2d 31 5d 2e   = aSample[i-1].
116e0 61 6e 45 71 5b 69 43 6f 6c 5d 20 2b 20 61 53 61  anEq[iCol] + aSa
116f0 6d 70 6c 65 5b 69 2d 31 5d 2e 61 6e 4c 74 5b 69  mple[i-1].anLt[i
11700 43 6f 6c 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Col];.    }.    
11710 61 53 74 61 74 5b 31 5d 20 3d 20 70 49 64 78 2d  aStat[1] = pIdx-
11720 3e 61 41 76 67 45 71 5b 69 43 6f 6c 5d 3b 0a 20  >aAvgEq[iCol];. 
11730 20 20 20 69 66 28 20 69 4c 6f 77 65 72 3e 3d 69     if( iLower>=i
11740 55 70 70 65 72 20 29 7b 0a 20 20 20 20 20 20 69  Upper ){.      i
11750 47 61 70 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  Gap = 0;.    }el
11760 73 65 7b 0a 20 20 20 20 20 20 69 47 61 70 20 3d  se{.      iGap =
11770 20 69 55 70 70 65 72 20 2d 20 69 4c 6f 77 65 72   iUpper - iLower
11780 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
11790 72 6f 75 6e 64 55 70 20 29 7b 0a 20 20 20 20 20  roundUp ){.     
117a0 20 69 47 61 70 20 3d 20 28 69 47 61 70 2a 32 29   iGap = (iGap*2)
117b0 2f 33 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  /3;.    }else{. 
117c0 20 20 20 20 20 69 47 61 70 20 3d 20 69 47 61 70       iGap = iGap
117d0 2f 33 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 53  /3;.    }.    aS
117e0 74 61 74 5b 30 5d 20 3d 20 69 4c 6f 77 65 72 20  tat[0] = iLower 
117f0 2b 20 69 47 61 70 3b 0a 20 20 7d 0a 20 20 72 65  + iGap;.  }.  re
11800 74 75 72 6e 20 69 3b 0a 7d 0a 23 65 6e 64 69 66  turn i;.}.#endif
11810 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   /* SQLITE_ENABL
11820 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34  E_STAT3_OR_STAT4
11830 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 69 74   */../*.** If it
11840 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 70 54   is not NULL, pT
11850 65 72 6d 20 69 73 20 61 20 74 65 72 6d 20 74 68  erm is a term th
11860 61 74 20 70 72 6f 76 69 64 65 73 20 61 6e 20 75  at provides an u
11870 70 70 65 72 20 6f 72 20 6c 6f 77 65 72 0a 2a 2a  pper or lower.**
11880 20 62 6f 75 6e 64 20 6f 6e 20 61 20 72 61 6e 67   bound on a rang
11890 65 20 73 63 61 6e 2e 20 57 69 74 68 6f 75 74 20  e scan. Without 
118a0 63 6f 6e 73 69 64 65 72 69 6e 67 20 70 54 65 72  considering pTer
118b0 6d 2c 20 69 74 20 69 73 20 65 73 74 69 6d 61 74  m, it is estimat
118c0 65 64 20 0a 2a 2a 20 74 68 61 74 20 74 68 65 20  ed .** that the 
118d0 73 63 61 6e 20 77 69 6c 6c 20 76 69 73 69 74 20  scan will visit 
118e0 6e 4e 65 77 20 72 6f 77 73 2e 20 54 68 69 73 20  nNew rows. This 
118f0 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
11900 20 74 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 65   the number.** e
11910 73 74 69 6d 61 74 65 64 20 74 6f 20 62 65 20 76  stimated to be v
11920 69 73 69 74 65 64 20 61 66 74 65 72 20 74 61 6b  isited after tak
11930 69 6e 67 20 70 54 65 72 6d 20 69 6e 74 6f 20 61  ing pTerm into a
11940 63 63 6f 75 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  ccount..**.** If
11950 20 74 68 65 20 75 73 65 72 20 65 78 70 6c 69 63   the user explic
11960 69 74 6c 79 20 73 70 65 63 69 66 69 65 64 20 61  itly specified a
11970 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 29 20 76 61   likelihood() va
11980 6c 75 65 20 66 6f 72 20 74 68 69 73 20 74 65 72  lue for this ter
11990 6d 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 72  m,.** then the r
119a0 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74  eturn value is t
119b0 68 65 20 6c 69 6b 65 6c 69 68 6f 6f 64 20 6d 75  he likelihood mu
119c0 6c 74 69 70 6c 69 65 64 20 62 79 20 74 68 65 20  ltiplied by the 
119d0 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 69 6e 70  number of.** inp
119e0 75 74 20 72 6f 77 73 2e 20 4f 74 68 65 72 77 69  ut rows. Otherwi
119f0 73 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  se, this functio
11a00 6e 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 61  n assumes that a
11a10 6e 20 22 49 53 20 4e 4f 54 20 4e 55 4c 4c 22 20  n "IS NOT NULL" 
11a20 74 65 72 6d 0a 2a 2a 20 68 61 73 20 61 20 6c 69  term.** has a li
11a30 6b 65 6c 69 68 6f 6f 64 20 6f 66 20 30 2e 35 30  kelihood of 0.50
11a40 2c 20 61 6e 64 20 61 6e 79 20 6f 74 68 65 72 20  , and any other 
11a50 74 65 72 6d 20 61 20 6c 69 6b 65 6c 69 68 6f 6f  term a likelihoo
11a60 64 20 6f 66 20 30 2e 32 35 2e 0a 2a 2f 0a 73 74  d of 0.25..*/.st
11a70 61 74 69 63 20 4c 6f 67 45 73 74 20 77 68 65 72  atic LogEst wher
11a80 65 52 61 6e 67 65 41 64 6a 75 73 74 28 57 68 65  eRangeAdjust(Whe
11a90 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 4c  reTerm *pTerm, L
11aa0 6f 67 45 73 74 20 6e 4e 65 77 29 7b 0a 20 20 4c  ogEst nNew){.  L
11ab0 6f 67 45 73 74 20 6e 52 65 74 20 3d 20 6e 4e 65  ogEst nRet = nNe
11ac0 77 3b 0a 20 20 69 66 28 20 70 54 65 72 6d 20 29  w;.  if( pTerm )
11ad0 7b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  {.    if( pTerm-
11ae0 3e 74 72 75 74 68 50 72 6f 62 3c 3d 30 20 29 7b  >truthProb<=0 ){
11af0 0a 20 20 20 20 20 20 6e 52 65 74 20 2b 3d 20 70  .      nRet += p
11b00 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3b  Term->truthProb;
11b10 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28  .    }else if( (
11b20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
11b30 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20   TERM_VNULL)==0 
11b40 29 7b 0a 20 20 20 20 20 20 6e 52 65 74 20 2d 3d  ){.      nRet -=
11b50 20 32 30 3b 20 20 20 20 20 20 20 20 61 73 73 65   20;        asse
11b60 72 74 28 20 32 30 3d 3d 73 71 6c 69 74 65 33 4c  rt( 20==sqlite3L
11b70 6f 67 45 73 74 28 34 29 20 29 3b 0a 20 20 20 20  ogEst(4) );.    
11b80 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e  }.  }.  return n
11b90 52 65 74 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53  Ret;.}..#ifdef S
11ba0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
11bb0 54 33 5f 4f 52 5f 53 54 41 54 34 0a 2f 2a 20 0a  T3_OR_STAT4./* .
11bc0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
11bd0 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 65 73   is called to es
11be0 74 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65  timate the numbe
11bf0 72 20 6f 66 20 72 6f 77 73 20 76 69 73 69 74 65  r of rows visite
11c00 64 20 62 79 20 61 0a 2a 2a 20 72 61 6e 67 65 2d  d by a.** range-
11c10 73 63 61 6e 20 6f 6e 20 61 20 73 6b 69 70 2d 73  scan on a skip-s
11c20 63 61 6e 20 69 6e 64 65 78 2e 20 46 6f 72 20 65  can index. For e
11c30 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  xample:.**.**   
11c40 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 31 20  CREATE INDEX i1 
11c50 4f 4e 20 74 31 28 61 2c 20 62 2c 20 63 29 3b 0a  ON t1(a, b, c);.
11c60 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  **   SELECT * FR
11c70 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3d 3f 20  OM t1 WHERE a=? 
11c80 41 4e 44 20 63 20 42 45 54 57 45 45 4e 20 3f 20  AND c BETWEEN ? 
11c90 41 4e 44 20 3f 3b 0a 2a 2a 0a 2a 2a 20 56 61 6c  AND ?;.**.** Val
11ca0 75 65 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 69  ue pLoop->nOut i
11cb0 73 20 63 75 72 72 65 6e 74 6c 79 20 73 65 74 20  s currently set 
11cc0 74 6f 20 74 68 65 20 65 73 74 69 6d 61 74 65 64  to the estimated
11cd0 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
11ce0 0a 2a 2a 20 76 69 73 69 74 65 64 20 66 6f 72 20  .** visited for 
11cf0 73 63 61 6e 6e 69 6e 67 20 28 61 3d 3f 20 41 4e  scanning (a=? AN
11d00 44 20 62 3d 3f 29 2e 20 54 68 69 73 20 66 75 6e  D b=?). This fun
11d10 63 74 69 6f 6e 20 72 65 64 75 63 65 73 20 74 68  ction reduces th
11d20 61 74 20 65 73 74 69 6d 61 74 65 20 0a 2a 2a 20  at estimate .** 
11d30 62 79 20 73 6f 6d 65 20 66 61 63 74 6f 72 20 74  by some factor t
11d40 6f 20 61 63 63 6f 75 6e 74 20 66 6f 72 20 74 68  o account for th
11d50 65 20 28 63 20 42 45 54 57 45 45 4e 20 3f 20 41  e (c BETWEEN ? A
11d60 4e 44 20 3f 29 20 65 78 70 72 65 73 73 69 6f 6e  ND ?) expression
11d70 20 62 61 73 65 64 0a 2a 2a 20 6f 6e 20 74 68 65   based.** on the
11d80 20 73 74 61 74 34 20 64 61 74 61 20 66 6f 72 20   stat4 data for 
11d90 74 68 65 20 69 6e 64 65 78 2e 20 74 68 69 73 20  the index. this 
11da0 73 63 61 6e 20 77 69 6c 6c 20 62 65 20 70 65 66  scan will be pef
11db0 6f 72 6d 65 64 20 6d 75 6c 74 69 70 6c 65 20 0a  ormed multiple .
11dc0 2a 2a 20 74 69 6d 65 73 20 28 6f 6e 63 65 20 66  ** times (once f
11dd0 6f 72 20 65 61 63 68 20 28 61 2c 62 29 20 63 6f  or each (a,b) co
11de0 6d 62 69 6e 61 74 69 6f 6e 20 74 68 61 74 20 6d  mbination that m
11df0 61 74 63 68 65 73 20 61 3d 3f 29 20 69 73 20 64  atches a=?) is d
11e00 65 61 6c 74 20 77 69 74 68 20 0a 2a 2a 20 62 79  ealt with .** by
11e10 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a   the caller..**.
11e20 2a 2a 20 49 74 20 64 6f 65 73 20 74 68 69 73 20  ** It does this 
11e30 62 79 20 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f  by scanning thro
11e40 75 67 68 20 61 6c 6c 20 73 74 61 74 34 20 73 61  ugh all stat4 sa
11e50 6d 70 6c 65 73 2c 20 63 6f 6d 70 61 72 69 6e 67  mples, comparing
11e60 20 76 61 6c 75 65 73 0a 2a 2a 20 65 78 74 72 61   values.** extra
11e70 63 74 65 64 20 66 72 6f 6d 20 70 4c 6f 77 65 72  cted from pLower
11e80 20 61 6e 64 20 70 55 70 70 65 72 20 77 69 74 68   and pUpper with
11e90 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
11ea0 6e 67 20 63 6f 6c 75 6d 6e 20 69 6e 20 65 61 63  ng column in eac
11eb0 68 0a 2a 2a 20 73 61 6d 70 6c 65 2e 20 49 66 20  h.** sample. If 
11ec0 4c 20 61 6e 64 20 55 20 61 72 65 20 74 68 65 20  L and U are the 
11ed0 6e 75 6d 62 65 72 20 6f 66 20 73 61 6d 70 6c 65  number of sample
11ee0 73 20 66 6f 75 6e 64 20 74 6f 20 62 65 20 6c 65  s found to be le
11ef0 73 73 20 74 68 61 6e 20 6f 72 0a 2a 2a 20 65 71  ss than or.** eq
11f00 75 61 6c 20 74 6f 20 74 68 65 20 76 61 6c 75 65  ual to the value
11f10 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  s extracted from
11f20 20 70 4c 6f 77 65 72 20 61 6e 64 20 70 55 70 70   pLower and pUpp
11f30 65 72 20 72 65 73 70 65 63 74 69 76 65 6c 79 2c  er respectively,
11f40 20 61 6e 64 0a 2a 2a 20 4e 20 69 73 20 74 68 65   and.** N is the
11f50 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
11f60 20 73 61 6d 70 6c 65 73 2c 20 74 68 65 20 70 4c   samples, the pL
11f70 6f 6f 70 2d 3e 6e 4f 75 74 20 76 61 6c 75 65 20  oop->nOut value 
11f80 69 73 20 61 64 6a 75 73 74 65 64 0a 2a 2a 20 61  is adjusted.** a
11f90 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
11fa0 20 20 20 6e 4f 75 74 20 3d 20 6e 4f 75 74 20 2a     nOut = nOut *
11fb0 20 28 20 6d 69 6e 28 55 20 2d 20 4c 2c 20 31 29   ( min(U - L, 1)
11fc0 20 2f 20 4e 20 29 0a 2a 2a 0a 2a 2a 20 49 66 20   / N ).**.** If 
11fd0 70 4c 6f 77 65 72 20 69 73 20 4e 55 4c 4c 2c 20  pLower is NULL, 
11fe0 6f 72 20 61 20 76 61 6c 75 65 20 63 61 6e 6e 6f  or a value canno
11ff0 74 20 62 65 20 65 78 74 72 61 63 74 65 64 20 66  t be extracted f
12000 72 6f 6d 20 74 68 65 20 74 65 72 6d 2c 20 4c 20  rom the term, L 
12010 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 7a 65 72  is.** set to zer
12020 6f 2e 20 49 66 20 70 55 70 70 65 72 20 69 73 20  o. If pUpper is 
12030 4e 55 4c 4c 2c 20 6f 72 20 61 20 76 61 6c 75 65  NULL, or a value
12040 20 63 61 6e 6e 6f 74 20 62 65 20 65 78 74 72 61   cannot be extra
12050 63 74 65 64 20 66 72 6f 6d 20 69 74 2c 0a 2a 2a  cted from it,.**
12060 20 55 20 69 73 20 73 65 74 20 74 6f 20 4e 2e 0a   U is set to N..
12070 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20  **.** Normally, 
12080 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 65  this function se
12090 74 73 20 2a 70 62 44 6f 6e 65 20 74 6f 20 31 20  ts *pbDone to 1 
120a0 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
120b0 2e 20 48 6f 77 65 76 65 72 2c 0a 2a 2a 20 69 66  . However,.** if
120c0 20 6e 6f 20 76 61 6c 75 65 20 63 61 6e 20 62 65   no value can be
120d0 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
120e0 65 69 74 68 65 72 20 70 4c 6f 77 65 72 20 6f 72  either pLower or
120f0 20 70 55 70 70 65 72 20 28 61 6e 64 20 73 6f 20   pUpper (and so 
12100 74 68 65 0a 2a 2a 20 65 73 74 69 6d 61 74 65 20  the.** estimate 
12110 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  of the number of
12120 20 72 6f 77 73 20 64 65 6c 69 76 65 72 65 64 20   rows delivered 
12130 72 65 6d 61 69 6e 73 20 75 6e 63 68 61 6e 67 65  remains unchange
12140 64 29 2c 20 2a 70 62 44 6f 6e 65 0a 2a 2a 20 69  d), *pbDone.** i
12150 73 20 6c 65 66 74 20 61 73 20 69 73 2e 0a 2a 2a  s left as is..**
12160 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
12170 6f 63 63 75 72 73 2c 20 61 6e 20 53 51 4c 69 74  occurs, an SQLit
12180 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  e error code is 
12190 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77  returned. Otherw
121a0 69 73 65 2c 20 0a 2a 2a 20 53 51 4c 49 54 45 5f  ise, .** SQLITE_
121b0 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  OK..*/.static in
121c0 74 20 77 68 65 72 65 52 61 6e 67 65 53 6b 69 70  t whereRangeSkip
121d0 53 63 61 6e 45 73 74 28 0a 20 20 50 61 72 73 65  ScanEst(.  Parse
121e0 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
121f0 2f 2a 20 50 61 72 73 69 6e 67 20 26 20 63 6f 64  /* Parsing & cod
12200 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e  e generating con
12210 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 54  text */.  WhereT
12220 65 72 6d 20 2a 70 4c 6f 77 65 72 2c 20 20 20 2f  erm *pLower,   /
12230 2a 20 4c 6f 77 65 72 20 62 6f 75 6e 64 20 6f 6e  * Lower bound on
12240 20 74 68 65 20 72 61 6e 67 65 2e 20 65 78 3a 20   the range. ex: 
12250 22 78 3e 31 32 33 22 20 4d 69 67 68 74 20 62 65  "x>123" Might be
12260 20 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68 65 72 65   NULL */.  Where
12270 54 65 72 6d 20 2a 70 55 70 70 65 72 2c 20 20 20  Term *pUpper,   
12280 2f 2a 20 55 70 70 65 72 20 62 6f 75 6e 64 20 6f  /* Upper bound o
12290 6e 20 74 68 65 20 72 61 6e 67 65 2e 20 65 78 3a  n the range. ex:
122a0 20 22 78 3c 34 35 35 22 20 4d 69 67 68 74 20 62   "x<455" Might b
122b0 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68 65 72  e NULL */.  Wher
122c0 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 2c 20 20 20  eLoop *pLoop,   
122d0 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 2e   /* Update the .
122e0 6e 4f 75 74 20 76 61 6c 75 65 20 6f 66 20 74 68  nOut value of th
122f0 69 73 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74  is loop */.  int
12300 20 2a 70 62 44 6f 6e 65 20 20 20 20 20 20 20 20   *pbDone        
12310 20 20 2f 2a 20 53 65 74 20 74 6f 20 74 72 75 65    /* Set to true
12320 20 69 66 20 61 74 20 6c 65 61 73 74 20 6f 6e 65   if at least one
12330 20 65 78 70 72 2e 20 76 61 6c 75 65 20 65 78 74   expr. value ext
12340 72 61 63 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 49  racted */.){.  I
12350 6e 64 65 78 20 2a 70 20 3d 20 70 4c 6f 6f 70 2d  ndex *p = pLoop-
12360 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b  >u.btree.pIndex;
12370 0a 20 20 69 6e 74 20 6e 45 71 20 3d 20 70 4c 6f  .  int nEq = pLo
12380 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b  op->u.btree.nEq;
12390 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
123a0 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
123b0 6e 74 20 6e 4c 6f 77 65 72 20 3d 20 2d 31 3b 0a  nt nLower = -1;.
123c0 20 20 69 6e 74 20 6e 55 70 70 65 72 20 3d 20 70    int nUpper = p
123d0 2d 3e 6e 53 61 6d 70 6c 65 2b 31 3b 0a 20 20 69  ->nSample+1;.  i
123e0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
123f0 4b 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20  K;.  int iCol = 
12400 70 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 45 71 5d  p->aiColumn[nEq]
12410 3b 0a 20 20 75 38 20 61 66 66 20 3d 20 69 43 6f  ;.  u8 aff = iCo
12420 6c 3e 3d 30 20 3f 20 70 2d 3e 70 54 61 62 6c 65  l>=0 ? p->pTable
12430 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 61 66 66  ->aCol[iCol].aff
12440 69 6e 69 74 79 20 3a 20 53 51 4c 49 54 45 5f 41  inity : SQLITE_A
12450 46 46 5f 49 4e 54 45 47 45 52 3b 0a 20 20 43 6f  FF_INTEGER;.  Co
12460 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20  llSeq *pColl;.  
12470 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
12480 20 2a 70 31 20 3d 20 30 3b 20 20 20 20 20 20 20   *p1 = 0;       
12490 20 20 20 2f 2a 20 56 61 6c 75 65 20 65 78 74 72     /* Value extr
124a0 61 63 74 65 64 20 66 72 6f 6d 20 70 4c 6f 77 65  acted from pLowe
124b0 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76  r */.  sqlite3_v
124c0 61 6c 75 65 20 2a 70 32 20 3d 20 30 3b 20 20 20  alue *p2 = 0;   
124d0 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
124e0 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 70  extracted from p
124f0 55 70 70 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74  Upper */.  sqlit
12500 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 20 3d  e3_value *pVal =
12510 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 56 61   0;        /* Va
12520 6c 75 65 20 65 78 74 72 61 63 74 65 64 20 66 72  lue extracted fr
12530 6f 6d 20 72 65 63 6f 72 64 20 2a 2f 0a 0a 20 20  om record */..  
12540 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 4c  pColl = sqlite3L
12550 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 70 50 61  ocateCollSeq(pPa
12560 72 73 65 2c 20 70 2d 3e 61 7a 43 6f 6c 6c 5b 6e  rse, p->azColl[n
12570 45 71 5d 29 3b 0a 20 20 69 66 28 20 70 4c 6f 77  Eq]);.  if( pLow
12580 65 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  er ){.    rc = s
12590 71 6c 69 74 65 33 53 74 61 74 34 56 61 6c 75 65  qlite3Stat4Value
125a0 46 72 6f 6d 45 78 70 72 28 70 50 61 72 73 65 2c  FromExpr(pParse,
125b0 20 70 4c 6f 77 65 72 2d 3e 70 45 78 70 72 2d 3e   pLower->pExpr->
125c0 70 52 69 67 68 74 2c 20 61 66 66 2c 20 26 70 31  pRight, aff, &p1
125d0 29 3b 0a 20 20 20 20 6e 4c 6f 77 65 72 20 3d 20  );.    nLower = 
125e0 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 55 70  0;.  }.  if( pUp
125f0 70 65 72 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  per && rc==SQLIT
12600 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
12610 20 73 71 6c 69 74 65 33 53 74 61 74 34 56 61 6c   sqlite3Stat4Val
12620 75 65 46 72 6f 6d 45 78 70 72 28 70 50 61 72 73  ueFromExpr(pPars
12630 65 2c 20 70 55 70 70 65 72 2d 3e 70 45 78 70 72  e, pUpper->pExpr
12640 2d 3e 70 52 69 67 68 74 2c 20 61 66 66 2c 20 26  ->pRight, aff, &
12650 70 32 29 3b 0a 20 20 20 20 6e 55 70 70 65 72 20  p2);.    nUpper 
12660 3d 20 70 32 20 3f 20 30 20 3a 20 70 2d 3e 6e 53  = p2 ? 0 : p->nS
12670 61 6d 70 6c 65 3b 0a 20 20 7d 0a 0a 20 20 69 66  ample;.  }..  if
12680 28 20 70 31 20 7c 7c 20 70 32 20 29 7b 0a 20 20  ( p1 || p2 ){.  
12690 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74    int i;.    int
126a0 20 6e 44 69 66 66 3b 0a 20 20 20 20 66 6f 72 28   nDiff;.    for(
126b0 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=0; rc==SQLITE_
126c0 4f 4b 20 26 26 20 69 3c 70 2d 3e 6e 53 61 6d 70  OK && i<p->nSamp
126d0 6c 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  le; i++){.      
126e0 72 63 20 3d 20 73 71 6c 69 74 65 33 53 74 61 74  rc = sqlite3Stat
126f0 34 43 6f 6c 75 6d 6e 28 64 62 2c 20 70 2d 3e 61  4Column(db, p->a
12700 53 61 6d 70 6c 65 5b 69 5d 2e 70 2c 20 70 2d 3e  Sample[i].p, p->
12710 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e 2c 20 6e 45  aSample[i].n, nE
12720 71 2c 20 26 70 56 61 6c 29 3b 0a 20 20 20 20 20  q, &pVal);.     
12730 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
12740 4f 4b 20 26 26 20 70 31 20 29 7b 0a 20 20 20 20  OK && p1 ){.    
12750 20 20 20 20 69 6e 74 20 72 65 73 20 3d 20 73 71      int res = sq
12760 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28  lite3MemCompare(
12770 70 31 2c 20 70 56 61 6c 2c 20 70 43 6f 6c 6c 29  p1, pVal, pColl)
12780 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 65  ;.        if( re
12790 73 3e 3d 30 20 29 20 6e 4c 6f 77 65 72 2b 2b 3b  s>=0 ) nLower++;
127a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
127b0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
127c0 20 26 26 20 70 32 20 29 7b 0a 20 20 20 20 20 20   && p2 ){.      
127d0 20 20 69 6e 74 20 72 65 73 20 3d 20 73 71 6c 69    int res = sqli
127e0 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 70 32  te3MemCompare(p2
127f0 2c 20 70 56 61 6c 2c 20 70 43 6f 6c 6c 29 3b 0a  , pVal, pColl);.
12800 20 20 20 20 20 20 20 20 69 66 28 20 72 65 73 3e          if( res>
12810 3d 30 20 29 20 6e 55 70 70 65 72 2b 2b 3b 0a 20  =0 ) nUpper++;. 
12820 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
12830 20 6e 44 69 66 66 20 3d 20 28 6e 55 70 70 65 72   nDiff = (nUpper
12840 20 2d 20 6e 4c 6f 77 65 72 29 3b 0a 20 20 20 20   - nLower);.    
12850 69 66 28 20 6e 44 69 66 66 3c 3d 30 20 29 20 6e  if( nDiff<=0 ) n
12860 44 69 66 66 20 3d 20 31 3b 0a 0a 20 20 20 20 2f  Diff = 1;..    /
12870 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 62 6f  * If there is bo
12880 74 68 20 61 6e 20 75 70 70 65 72 20 61 6e 64 20  th an upper and 
12890 6c 6f 77 65 72 20 62 6f 75 6e 64 20 73 70 65 63  lower bound spec
128a0 69 66 69 65 64 2c 20 61 6e 64 20 74 68 65 20 0a  ified, and the .
128b0 20 20 20 20 2a 2a 20 63 6f 6d 70 61 72 69 73 6f      ** compariso
128c0 6e 73 20 69 6e 64 69 63 61 74 65 20 74 68 61 74  ns indicate that
128d0 20 74 68 65 79 20 61 72 65 20 63 6c 6f 73 65 20   they are close 
128e0 74 6f 67 65 74 68 65 72 2c 20 75 73 65 20 74 68  together, use th
128f0 65 20 66 61 6c 6c 62 61 63 6b 0a 20 20 20 20 2a  e fallback.    *
12900 2a 20 6d 65 74 68 6f 64 20 28 61 73 73 75 6d 65  * method (assume
12910 20 74 68 61 74 20 74 68 65 20 73 63 61 6e 20 76   that the scan v
12920 69 73 69 74 73 20 31 2f 36 34 20 6f 66 20 74 68  isits 1/64 of th
12930 65 20 72 6f 77 73 29 20 66 6f 72 20 65 73 74 69  e rows) for esti
12940 6d 61 74 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68  mating.    ** th
12950 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
12960 20 76 69 73 69 74 65 64 2e 20 4f 74 68 65 72 77   visited. Otherw
12970 69 73 65 2c 20 65 73 74 69 6d 61 74 65 20 74 68  ise, estimate th
12980 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
12990 0a 20 20 20 20 2a 2a 20 75 73 69 6e 67 20 74 68  .    ** using th
129a0 65 20 6d 65 74 68 6f 64 20 64 65 73 63 72 69 62  e method describ
129b0 65 64 20 69 6e 20 74 68 65 20 68 65 61 64 65 72  ed in the header
129c0 20 63 6f 6d 6d 65 6e 74 20 66 6f 72 20 74 68 69   comment for thi
129d0 73 20 66 75 6e 63 74 69 6f 6e 2e 20 2a 2f 0a 20  s function. */. 
129e0 20 20 20 69 66 28 20 6e 44 69 66 66 21 3d 31 20     if( nDiff!=1 
129f0 7c 7c 20 70 55 70 70 65 72 3d 3d 30 20 7c 7c 20  || pUpper==0 || 
12a00 70 4c 6f 77 65 72 3d 3d 30 20 29 7b 0a 20 20 20  pLower==0 ){.   
12a10 20 20 20 69 6e 74 20 6e 41 64 6a 75 73 74 20 3d     int nAdjust =
12a20 20 28 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28   (sqlite3LogEst(
12a30 70 2d 3e 6e 53 61 6d 70 6c 65 29 20 2d 20 73 71  p->nSample) - sq
12a40 6c 69 74 65 33 4c 6f 67 45 73 74 28 6e 44 69 66  lite3LogEst(nDif
12a50 66 29 29 3b 0a 20 20 20 20 20 20 70 4c 6f 6f 70  f));.      pLoop
12a60 2d 3e 6e 4f 75 74 20 2d 3d 20 6e 41 64 6a 75 73  ->nOut -= nAdjus
12a70 74 3b 0a 20 20 20 20 20 20 2a 70 62 44 6f 6e 65  t;.      *pbDone
12a80 20 3d 20 31 3b 0a 20 20 20 20 20 20 57 48 45 52   = 1;.      WHER
12a90 45 54 52 41 43 45 28 30 78 31 30 2c 20 28 22 72  ETRACE(0x10, ("r
12aa0 61 6e 67 65 20 73 6b 69 70 2d 73 63 61 6e 20 72  ange skip-scan r
12ab0 65 67 69 6f 6e 73 3a 20 25 75 2e 2e 25 75 20 20  egions: %u..%u  
12ac0 61 64 6a 75 73 74 3d 25 64 20 65 73 74 3d 25 64  adjust=%d est=%d
12ad0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
12ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12af0 6e 4c 6f 77 65 72 2c 20 6e 55 70 70 65 72 2c 20  nLower, nUpper, 
12b00 6e 41 64 6a 75 73 74 2a 2d 31 2c 20 70 4c 6f 6f  nAdjust*-1, pLoo
12b10 70 2d 3e 6e 4f 75 74 29 29 3b 0a 20 20 20 20 7d  p->nOut));.    }
12b20 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ..  }else{.    a
12b30 73 73 65 72 74 28 20 2a 70 62 44 6f 6e 65 3d 3d  ssert( *pbDone==
12b40 30 20 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69  0 );.  }..  sqli
12b50 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 31 29  te3ValueFree(p1)
12b60 3b 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65  ;.  sqlite3Value
12b70 46 72 65 65 28 70 32 29 3b 0a 20 20 73 71 6c 69  Free(p2);.  sqli
12b80 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 56 61  te3ValueFree(pVa
12b90 6c 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63  l);..  return rc
12ba0 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
12bb0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
12bc0 33 5f 4f 52 5f 53 54 41 54 34 20 2a 2f 0a 0a 2f  3_OR_STAT4 */../
12bd0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
12be0 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 65 73  on is used to es
12bf0 74 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65  timate the numbe
12c00 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77  r of rows that w
12c10 69 6c 6c 20 62 65 20 76 69 73 69 74 65 64 0a 2a  ill be visited.*
12c20 2a 20 62 79 20 73 63 61 6e 6e 69 6e 67 20 61 6e  * by scanning an
12c30 20 69 6e 64 65 78 20 66 6f 72 20 61 20 72 61 6e   index for a ran
12c40 67 65 20 6f 66 20 76 61 6c 75 65 73 2e 20 54 68  ge of values. Th
12c50 65 20 72 61 6e 67 65 20 6d 61 79 20 68 61 76 65  e range may have
12c60 20 61 6e 20 75 70 70 65 72 0a 2a 2a 20 62 6f 75   an upper.** bou
12c70 6e 64 2c 20 61 20 6c 6f 77 65 72 20 62 6f 75 6e  nd, a lower boun
12c80 64 2c 20 6f 72 20 62 6f 74 68 2e 20 54 68 65 20  d, or both. The 
12c90 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
12ca0 6d 73 20 74 68 61 74 20 73 65 74 20 74 68 65 20  ms that set the 
12cb0 75 70 70 65 72 0a 2a 2a 20 61 6e 64 20 6c 6f 77  upper.** and low
12cc0 65 72 20 62 6f 75 6e 64 73 20 61 72 65 20 72 65  er bounds are re
12cd0 70 72 65 73 65 6e 74 65 64 20 62 79 20 70 4c 6f  presented by pLo
12ce0 77 65 72 20 61 6e 64 20 70 55 70 70 65 72 20 72  wer and pUpper r
12cf0 65 73 70 65 63 74 69 76 65 6c 79 2e 20 46 6f 72  espectively. For
12d00 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 61 73 73  .** example, ass
12d10 75 6d 69 6e 67 20 74 68 61 74 20 69 6e 64 65 78  uming that index
12d20 20 70 20 69 73 20 6f 6e 20 74 31 28 61 29 3a 0a   p is on t1(a):.
12d30 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d  **.**   ... FROM
12d40 20 74 31 20 57 48 45 52 45 20 61 20 3e 20 3f 20   t1 WHERE a > ? 
12d50 41 4e 44 20 61 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a  AND a < ? ....**
12d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d70 20 20 20 20 7c 5f 5f 5f 5f 5f 7c 20 20 20 7c 5f      |_____|   |_
12d80 5f 5f 5f 5f 7c 0a 2a 2a 20 20 20 20 20 20 20 20  ____|.**        
12d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
12da0 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20           |.**   
12db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12dc0 20 20 70 4c 6f 77 65 72 20 20 20 20 70 55 70 70    pLower    pUpp
12dd0 65 72 0a 2a 2a 0a 2a 2a 20 49 66 20 65 69 74 68  er.**.** If eith
12de0 65 72 20 6f 66 20 74 68 65 20 75 70 70 65 72 20  er of the upper 
12df0 6f 72 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20 69  or lower bound i
12e00 73 20 6e 6f 74 20 70 72 65 73 65 6e 74 2c 20 74  s not present, t
12e10 68 65 6e 20 4e 55 4c 4c 20 69 73 20 70 61 73 73  hen NULL is pass
12e20 65 64 20 69 6e 0a 2a 2a 20 70 6c 61 63 65 20 6f  ed in.** place o
12e30 66 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  f the correspond
12e40 69 6e 67 20 57 68 65 72 65 54 65 72 6d 2e 0a 2a  ing WhereTerm..*
12e50 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 69  *.** The value i
12e60 6e 20 28 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65  n (pBuilder->pNe
12e70 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 29 20  w->u.btree.nEq) 
12e80 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
12e90 20 74 68 65 20 69 6e 64 65 78 0a 2a 2a 20 63 6f   the index.** co
12ea0 6c 75 6d 6e 20 73 75 62 6a 65 63 74 20 74 6f 20  lumn subject to 
12eb0 74 68 65 20 72 61 6e 67 65 20 63 6f 6e 73 74 72  the range constr
12ec0 61 69 6e 74 2e 20 4f 72 2c 20 65 71 75 69 76 61  aint. Or, equiva
12ed0 6c 65 6e 74 6c 79 2c 20 74 68 65 20 6e 75 6d 62  lently, the numb
12ee0 65 72 20 6f 66 0a 2a 2a 20 65 71 75 61 6c 69 74  er of.** equalit
12ef0 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 70  y constraints op
12f00 74 69 6d 69 7a 65 64 20 62 79 20 74 68 65 20 70  timized by the p
12f10 72 6f 70 6f 73 65 64 20 69 6e 64 65 78 20 73 63  roposed index sc
12f20 61 6e 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  an. For example,
12f30 0a 2a 2a 20 61 73 73 75 6d 69 6e 67 20 69 6e 64  .** assuming ind
12f40 65 78 20 70 20 69 73 20 6f 6e 20 74 31 28 61 2c  ex p is on t1(a,
12f50 20 62 29 2c 20 61 6e 64 20 74 68 65 20 53 51 4c   b), and the SQL
12f60 20 71 75 65 72 79 20 69 73 3a 0a 2a 2a 0a 2a 2a   query is:.**.**
12f70 20 20 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 57     ... FROM t1 W
12f80 48 45 52 45 20 61 20 3d 20 3f 20 41 4e 44 20 62  HERE a = ? AND b
12f90 20 3e 20 3f 20 41 4e 44 20 62 20 3c 20 3f 20 2e   > ? AND b < ? .
12fa0 2e 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 6e 45  ...**.** then nE
12fb0 71 20 69 73 20 73 65 74 20 74 6f 20 31 20 28 61  q is set to 1 (a
12fc0 73 20 74 68 65 20 72 61 6e 67 65 20 72 65 73 74  s the range rest
12fd0 72 69 63 74 65 64 20 63 6f 6c 75 6d 6e 2c 20 62  ricted column, b
12fe0 2c 20 69 73 20 74 68 65 20 73 65 63 6f 6e 64 20  , is the second 
12ff0 0a 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f  .** left-most co
13000 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64 65  lumn of the inde
13010 78 29 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 71  x). Or, if the q
13020 75 65 72 79 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  uery is:.**.**  
13030 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 57 48 45   ... FROM t1 WHE
13040 52 45 20 61 20 3e 20 3f 20 41 4e 44 20 61 20 3c  RE a > ? AND a <
13050 20 3f 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 74 68 65   ? ....**.** the
13060 6e 20 6e 45 71 20 69 73 20 73 65 74 20 74 6f 20  n nEq is set to 
13070 30 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  0..**.** When th
13080 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
13090 61 6c 6c 65 64 2c 20 2a 70 6e 4f 75 74 20 69 73  alled, *pnOut is
130a0 20 73 65 74 20 74 6f 20 74 68 65 20 73 71 6c 69   set to the sqli
130b0 74 65 33 4c 6f 67 45 73 74 28 29 20 6f 66 20 74  te3LogEst() of t
130c0 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20  he.** number of 
130d0 72 6f 77 73 20 74 68 61 74 20 74 68 65 20 69 6e  rows that the in
130e0 64 65 78 20 73 63 61 6e 20 69 73 20 65 78 70 65  dex scan is expe
130f0 63 74 65 64 20 74 6f 20 76 69 73 69 74 20 77 69  cted to visit wi
13100 74 68 6f 75 74 20 0a 2a 2a 20 63 6f 6e 73 69 64  thout .** consid
13110 65 72 69 6e 67 20 74 68 65 20 72 61 6e 67 65 20  ering the range 
13120 63 6f 6e 73 74 72 61 69 6e 74 73 2e 20 49 66 20  constraints. If 
13130 6e 45 71 20 69 73 20 30 2c 20 74 68 65 6e 20 2a  nEq is 0, then *
13140 70 6e 4f 75 74 20 69 73 20 74 68 65 20 6e 75 6d  pnOut is the num
13150 62 65 72 20 6f 66 20 0a 2a 2a 20 72 6f 77 73 20  ber of .** rows 
13160 69 6e 20 74 68 65 20 69 6e 64 65 78 2e 20 41 73  in the index. As
13170 73 75 6d 69 6e 67 20 6e 6f 20 65 72 72 6f 72 20  suming no error 
13180 6f 63 63 75 72 73 2c 20 2a 70 6e 4f 75 74 20 69  occurs, *pnOut i
13190 73 20 61 64 6a 75 73 74 65 64 20 28 72 65 64 75  s adjusted (redu
131a0 63 65 64 29 0a 2a 2a 20 74 6f 20 61 63 63 6f 75  ced).** to accou
131b0 6e 74 20 66 6f 72 20 74 68 65 20 72 61 6e 67 65  nt for the range
131c0 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 70 4c 6f   constraints pLo
131d0 77 65 72 20 61 6e 64 20 70 55 70 70 65 72 2e 0a  wer and pUpper..
131e0 2a 2a 20 0a 2a 2a 20 49 6e 20 74 68 65 20 61 62  ** .** In the ab
131f0 73 65 6e 63 65 20 6f 66 20 73 71 6c 69 74 65 5f  sence of sqlite_
13200 73 74 61 74 34 20 41 4e 41 4c 59 5a 45 20 64 61  stat4 ANALYZE da
13210 74 61 2c 20 6f 72 20 69 66 20 73 75 63 68 20 64  ta, or if such d
13220 61 74 61 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a  ata cannot be.**
13230 20 75 73 65 64 2c 20 61 20 73 69 6e 67 6c 65 20   used, a single 
13240 72 61 6e 67 65 20 69 6e 65 71 75 61 6c 69 74 79  range inequality
13250 20 72 65 64 75 63 65 73 20 74 68 65 20 73 65 61   reduces the sea
13260 72 63 68 20 73 70 61 63 65 20 62 79 20 61 20 66  rch space by a f
13270 61 63 74 6f 72 20 6f 66 20 34 2e 20 0a 2a 2a 20  actor of 4. .** 
13280 61 6e 64 20 61 20 70 61 69 72 20 6f 66 20 63 6f  and a pair of co
13290 6e 73 74 72 61 69 6e 74 73 20 28 78 3e 3f 20 41  nstraints (x>? A
132a0 4e 44 20 78 3c 3f 29 20 72 65 64 75 63 65 73 20  ND x<?) reduces 
132b0 74 68 65 20 65 78 70 65 63 74 65 64 20 6e 75 6d  the expected num
132c0 62 65 72 20 6f 66 0a 2a 2a 20 72 6f 77 73 20 76  ber of.** rows v
132d0 69 73 69 74 65 64 20 62 79 20 61 20 66 61 63 74  isited by a fact
132e0 6f 72 20 6f 66 20 36 34 2e 0a 2a 2f 0a 73 74 61  or of 64..*/.sta
132f0 74 69 63 20 69 6e 74 20 77 68 65 72 65 52 61 6e  tic int whereRan
13300 67 65 53 63 61 6e 45 73 74 28 0a 20 20 50 61 72  geScanEst(.  Par
13310 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
13320 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 26 20 63    /* Parsing & c
13330 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63  ode generating c
13340 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72  ontext */.  Wher
13350 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42  eLoopBuilder *pB
13360 75 69 6c 64 65 72 2c 0a 20 20 57 68 65 72 65 54  uilder,.  WhereT
13370 65 72 6d 20 2a 70 4c 6f 77 65 72 2c 20 20 20 2f  erm *pLower,   /
13380 2a 20 4c 6f 77 65 72 20 62 6f 75 6e 64 20 6f 6e  * Lower bound on
13390 20 74 68 65 20 72 61 6e 67 65 2e 20 65 78 3a 20   the range. ex: 
133a0 22 78 3e 31 32 33 22 20 4d 69 67 68 74 20 62 65  "x>123" Might be
133b0 20 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68 65 72 65   NULL */.  Where
133c0 54 65 72 6d 20 2a 70 55 70 70 65 72 2c 20 20 20  Term *pUpper,   
133d0 2f 2a 20 55 70 70 65 72 20 62 6f 75 6e 64 20 6f  /* Upper bound o
133e0 6e 20 74 68 65 20 72 61 6e 67 65 2e 20 65 78 3a  n the range. ex:
133f0 20 22 78 3c 34 35 35 22 20 4d 69 67 68 74 20 62   "x<455" Might b
13400 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68 65 72  e NULL */.  Wher
13410 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 20 20 20 20  eLoop *pLoop    
13420 20 2f 2a 20 4d 6f 64 69 66 79 20 74 68 65 20 2e   /* Modify the .
13430 6e 4f 75 74 20 61 6e 64 20 6d 61 79 62 65 20 2e  nOut and maybe .
13440 72 52 75 6e 20 66 69 65 6c 64 73 20 2a 2f 0a 29  rRun fields */.)
13450 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
13460 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 4f  ITE_OK;.  int nO
13470 75 74 20 3d 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74  ut = pLoop->nOut
13480 3b 0a 20 20 4c 6f 67 45 73 74 20 6e 4e 65 77 3b  ;.  LogEst nNew;
13490 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
134a0 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f  ENABLE_STAT3_OR_
134b0 53 54 41 54 34 0a 20 20 49 6e 64 65 78 20 2a 70  STAT4.  Index *p
134c0 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65   = pLoop->u.btre
134d0 65 2e 70 49 6e 64 65 78 3b 0a 20 20 69 6e 74 20  e.pIndex;.  int 
134e0 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62  nEq = pLoop->u.b
134f0 74 72 65 65 2e 6e 45 71 3b 0a 0a 20 20 69 66 28  tree.nEq;..  if(
13500 20 70 2d 3e 6e 53 61 6d 70 6c 65 3e 30 20 26 26   p->nSample>0 &&
13510 20 6e 45 71 3c 70 2d 3e 6e 53 61 6d 70 6c 65 43   nEq<p->nSampleC
13520 6f 6c 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 45  ol ){.    if( nE
13530 71 3d 3d 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65  q==pBuilder->nRe
13540 63 56 61 6c 69 64 20 29 7b 0a 20 20 20 20 20 20  cValid ){.      
13550 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
13560 70 52 65 63 20 3d 20 70 42 75 69 6c 64 65 72 2d  pRec = pBuilder-
13570 3e 70 52 65 63 3b 0a 20 20 20 20 20 20 74 52 6f  >pRec;.      tRo
13580 77 63 6e 74 20 61 5b 32 5d 3b 0a 20 20 20 20 20  wcnt a[2];.     
13590 20 75 38 20 61 66 66 3b 0a 0a 20 20 20 20 20 20   u8 aff;..      
135a0 2f 2a 20 56 61 72 69 61 62 6c 65 20 69 4c 6f 77  /* Variable iLow
135b0 65 72 20 77 69 6c 6c 20 62 65 20 73 65 74 20 74  er will be set t
135c0 6f 20 74 68 65 20 65 73 74 69 6d 61 74 65 20 6f  o the estimate o
135d0 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
135e0 72 6f 77 73 20 69 6e 20 0a 20 20 20 20 20 20 2a  rows in .      *
135f0 2a 20 74 68 65 20 69 6e 64 65 78 20 74 68 61 74  * the index that
13600 20 61 72 65 20 6c 65 73 73 20 74 68 61 6e 20 74   are less than t
13610 68 65 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20 6f  he lower bound o
13620 66 20 74 68 65 20 72 61 6e 67 65 20 71 75 65 72  f the range quer
13630 79 2e 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20  y. The.      ** 
13640 6c 6f 77 65 72 20 62 6f 75 6e 64 20 62 65 69 6e  lower bound bein
13650 67 20 74 68 65 20 63 6f 6e 63 61 74 65 6e 61 74  g the concatenat
13660 69 6f 6e 20 6f 66 20 24 50 20 61 6e 64 20 24 4c  ion of $P and $L
13670 2c 20 77 68 65 72 65 20 24 50 20 69 73 20 74 68  , where $P is th
13680 65 0a 20 20 20 20 20 20 2a 2a 20 6b 65 79 2d 70  e.      ** key-p
13690 72 65 66 69 78 20 66 6f 72 6d 65 64 20 62 79 20  refix formed by 
136a0 74 68 65 20 6e 45 71 20 76 61 6c 75 65 73 20 6d  the nEq values m
136b0 61 74 63 68 65 64 20 61 67 61 69 6e 73 74 20 74  atched against t
136c0 68 65 20 6e 45 71 20 6c 65 66 74 2d 6d 6f 73 74  he nEq left-most
136d0 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e  .      ** column
136e0 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2c 20  s of the index, 
136f0 61 6e 64 20 24 4c 20 69 73 20 74 68 65 20 76 61  and $L is the va
13700 6c 75 65 20 69 6e 20 70 4c 6f 77 65 72 2e 0a 20  lue in pLower.. 
13710 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
13720 20 4f 72 2c 20 69 66 20 70 4c 6f 77 65 72 20 69   Or, if pLower i
13730 73 20 4e 55 4c 4c 20 6f 72 20 24 4c 20 63 61 6e  s NULL or $L can
13740 6e 6f 74 20 62 65 20 65 78 74 72 61 63 74 65 64  not be extracted
13750 20 66 72 6f 6d 20 69 74 20 28 62 65 63 61 75 73   from it (becaus
13760 65 20 69 74 0a 20 20 20 20 20 20 2a 2a 20 69 73  e it.      ** is
13770 20 6e 6f 74 20 61 20 73 69 6d 70 6c 65 20 76 61   not a simple va
13780 72 69 61 62 6c 65 20 6f 72 20 6c 69 74 65 72 61  riable or litera
13790 6c 20 76 61 6c 75 65 29 2c 20 74 68 65 20 6c 6f  l value), the lo
137a0 77 65 72 20 62 6f 75 6e 64 20 6f 66 20 74 68 65  wer bound of the
137b0 0a 20 20 20 20 20 20 2a 2a 20 72 61 6e 67 65 20  .      ** range 
137c0 69 73 20 24 50 2e 20 44 75 65 20 74 6f 20 61 20  is $P. Due to a 
137d0 71 75 69 72 6b 20 69 6e 20 74 68 65 20 77 61 79  quirk in the way
137e0 20 77 68 65 72 65 4b 65 79 53 74 61 74 73 28 29   whereKeyStats()
137f0 20 77 6f 72 6b 73 2c 20 65 76 65 6e 0a 20 20 20   works, even.   
13800 20 20 20 2a 2a 20 69 66 20 24 4c 20 69 73 20 61     ** if $L is a
13810 76 61 69 6c 61 62 6c 65 2c 20 77 68 65 72 65 4b  vailable, whereK
13820 65 79 53 74 61 74 73 28 29 20 69 73 20 63 61 6c  eyStats() is cal
13830 6c 65 64 20 66 6f 72 20 62 6f 74 68 20 28 24 50  led for both ($P
13840 29 20 61 6e 64 20 0a 20 20 20 20 20 20 2a 2a 20  ) and .      ** 
13850 28 24 50 3a 24 4c 29 20 61 6e 64 20 74 68 65 20  ($P:$L) and the 
13860 6c 61 72 67 65 72 20 6f 66 20 74 68 65 20 74 77  larger of the tw
13870 6f 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65  o returned value
13880 73 20 69 73 20 75 73 65 64 2e 0a 20 20 20 20 20  s is used..     
13890 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 53 69 6d   **.      ** Sim
138a0 69 6c 61 72 6c 79 2c 20 69 55 70 70 65 72 20 69  ilarly, iUpper i
138b0 73 20 74 6f 20 62 65 20 73 65 74 20 74 6f 20 74  s to be set to t
138c0 68 65 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74  he estimate of t
138d0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
138e0 73 0a 20 20 20 20 20 20 2a 2a 20 6c 65 73 73 20  s.      ** less 
138f0 74 68 61 6e 20 74 68 65 20 75 70 70 65 72 20 62  than the upper b
13900 6f 75 6e 64 20 6f 66 20 74 68 65 20 72 61 6e 67  ound of the rang
13910 65 20 71 75 65 72 79 2e 20 57 68 65 72 65 20 74  e query. Where t
13920 68 65 20 75 70 70 65 72 20 62 6f 75 6e 64 0a 20  he upper bound. 
13930 20 20 20 20 20 2a 2a 20 69 73 20 65 69 74 68 65       ** is eithe
13940 72 20 28 24 50 29 20 6f 72 20 28 24 50 3a 24 55  r ($P) or ($P:$U
13950 29 2e 20 41 67 61 69 6e 2c 20 65 76 65 6e 20 69  ). Again, even i
13960 66 20 24 55 20 69 73 20 61 76 61 69 6c 61 62 6c  f $U is availabl
13970 65 2c 20 62 6f 74 68 20 76 61 6c 75 65 73 0a 20  e, both values. 
13980 20 20 20 20 20 2a 2a 20 6f 66 20 69 55 70 70 65       ** of iUppe
13990 72 20 61 72 65 20 72 65 71 75 65 73 74 65 64 20  r are requested 
139a0 6f 66 20 77 68 65 72 65 4b 65 79 53 74 61 74 73  of whereKeyStats
139b0 28 29 20 61 6e 64 20 74 68 65 20 73 6d 61 6c 6c  () and the small
139c0 65 72 20 75 73 65 64 2e 0a 20 20 20 20 20 20 2a  er used..      *
139d0 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 20 6e  *.      ** The n
139e0 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 62 65  umber of rows be
139f0 74 77 65 65 6e 20 74 68 65 20 74 77 6f 20 62 6f  tween the two bo
13a00 75 6e 64 73 20 69 73 20 74 68 65 6e 20 6a 75 73  unds is then jus
13a10 74 20 69 55 70 70 65 72 2d 69 4c 6f 77 65 72 2e  t iUpper-iLower.
13a20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
13a30 74 52 6f 77 63 6e 74 20 69 4c 6f 77 65 72 3b 20  tRowcnt iLower; 
13a40 20 20 20 20 2f 2a 20 52 6f 77 73 20 6c 65 73 73      /* Rows less
13a50 20 74 68 61 6e 20 74 68 65 20 6c 6f 77 65 72 20   than the lower 
13a60 62 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 74  bound */.      t
13a70 52 6f 77 63 6e 74 20 69 55 70 70 65 72 3b 20 20  Rowcnt iUpper;  
13a80 20 20 20 2f 2a 20 52 6f 77 73 20 6c 65 73 73 20     /* Rows less 
13a90 74 68 61 6e 20 74 68 65 20 75 70 70 65 72 20 62  than the upper b
13aa0 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ound */.      in
13ab0 74 20 69 4c 77 72 49 64 78 20 3d 20 2d 32 3b 20  t iLwrIdx = -2; 
13ac0 20 20 2f 2a 20 61 53 61 6d 70 6c 65 5b 5d 20 66    /* aSample[] f
13ad0 6f 72 20 74 68 65 20 6c 6f 77 65 72 20 62 6f 75  or the lower bou
13ae0 6e 64 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  nd */.      int 
13af0 69 55 70 72 49 64 78 20 3d 20 2d 31 3b 20 20 20  iUprIdx = -1;   
13b00 2f 2a 20 61 53 61 6d 70 6c 65 5b 5d 20 66 6f 72  /* aSample[] for
13b10 20 74 68 65 20 75 70 70 65 72 20 62 6f 75 6e 64   the upper bound
13b20 20 2a 2f 0a 0a 20 20 20 20 20 20 69 66 28 20 70   */..      if( p
13b30 52 65 63 20 29 7b 0a 20 20 20 20 20 20 20 20 74  Rec ){.        t
13b40 65 73 74 63 61 73 65 28 20 70 52 65 63 2d 3e 6e  estcase( pRec->n
13b50 46 69 65 6c 64 21 3d 70 42 75 69 6c 64 65 72 2d  Field!=pBuilder-
13b60 3e 6e 52 65 63 56 61 6c 69 64 20 29 3b 0a 20 20  >nRecValid );.  
13b70 20 20 20 20 20 20 70 52 65 63 2d 3e 6e 46 69 65        pRec->nFie
13b80 6c 64 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 6e  ld = pBuilder->n
13b90 52 65 63 56 61 6c 69 64 3b 0a 20 20 20 20 20 20  RecValid;.      
13ba0 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 45 71 3d  }.      if( nEq=
13bb0 3d 70 2d 3e 6e 4b 65 79 43 6f 6c 20 29 7b 0a 20  =p->nKeyCol ){. 
13bc0 20 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c         aff = SQL
13bd0 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 3b  ITE_AFF_INTEGER;
13be0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
13bf0 20 20 20 20 20 20 61 66 66 20 3d 20 70 2d 3e 70        aff = p->p
13c00 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 70 2d 3e 61  Table->aCol[p->a
13c10 69 43 6f 6c 75 6d 6e 5b 6e 45 71 5d 5d 2e 61 66  iColumn[nEq]].af
13c20 66 69 6e 69 74 79 3b 0a 20 20 20 20 20 20 7d 0a  finity;.      }.
13c30 20 20 20 20 20 20 2f 2a 20 44 65 74 65 72 6d 69        /* Determi
13c40 6e 65 20 69 4c 6f 77 65 72 20 61 6e 64 20 69 55  ne iLower and iU
13c50 70 70 65 72 20 75 73 69 6e 67 20 28 24 50 29 20  pper using ($P) 
13c60 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 20 20 20 20 69  only. */.      i
13c70 66 28 20 6e 45 71 3d 3d 30 20 29 7b 0a 20 20 20  f( nEq==0 ){.   
13c80 20 20 20 20 20 69 4c 6f 77 65 72 20 3d 20 30 3b       iLower = 0;
13c90 0a 20 20 20 20 20 20 20 20 69 55 70 70 65 72 20  .        iUpper 
13ca0 3d 20 70 2d 3e 6e 52 6f 77 45 73 74 30 3b 0a 20  = p->nRowEst0;. 
13cb0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
13cc0 20 20 20 20 2f 2a 20 4e 6f 74 65 3a 20 74 68 69      /* Note: thi
13cd0 73 20 63 61 6c 6c 20 63 6f 75 6c 64 20 62 65 20  s call could be 
13ce0 6f 70 74 69 6d 69 7a 65 64 20 61 77 61 79 20 2d  optimized away -
13cf0 20 73 69 6e 63 65 20 74 68 65 20 73 61 6d 65 20   since the same 
13d00 76 61 6c 75 65 73 20 6d 75 73 74 20 0a 20 20 20  values must .   
13d10 20 20 20 20 20 2a 2a 20 68 61 76 65 20 62 65 65       ** have bee
13d20 6e 20 72 65 71 75 65 73 74 65 64 20 77 68 65 6e  n requested when
13d30 20 74 65 73 74 69 6e 67 20 6b 65 79 20 24 50 20   testing key $P 
13d40 69 6e 20 77 68 65 72 65 45 71 75 61 6c 53 63 61  in whereEqualSca
13d50 6e 45 73 74 28 29 2e 20 20 2a 2f 0a 20 20 20 20  nEst().  */.    
13d60 20 20 20 20 77 68 65 72 65 4b 65 79 53 74 61 74      whereKeyStat
13d70 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70 52 65  s(pParse, p, pRe
13d80 63 2c 20 30 2c 20 61 29 3b 0a 20 20 20 20 20 20  c, 0, a);.      
13d90 20 20 69 4c 6f 77 65 72 20 3d 20 61 5b 30 5d 3b    iLower = a[0];
13da0 0a 20 20 20 20 20 20 20 20 69 55 70 70 65 72 20  .        iUpper 
13db0 3d 20 61 5b 30 5d 20 2b 20 61 5b 31 5d 3b 0a 20  = a[0] + a[1];. 
13dc0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 73       }..      as
13dd0 73 65 72 74 28 20 70 4c 6f 77 65 72 3d 3d 30 20  sert( pLower==0 
13de0 7c 7c 20 28 70 4c 6f 77 65 72 2d 3e 65 4f 70 65  || (pLower->eOpe
13df0 72 61 74 6f 72 20 26 20 28 57 4f 5f 47 54 7c 57  rator & (WO_GT|W
13e00 4f 5f 47 45 29 29 21 3d 30 20 29 3b 0a 20 20 20  O_GE))!=0 );.   
13e10 20 20 20 61 73 73 65 72 74 28 20 70 55 70 70 65     assert( pUppe
13e20 72 3d 3d 30 20 7c 7c 20 28 70 55 70 70 65 72 2d  r==0 || (pUpper-
13e30 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f  >eOperator & (WO
13e40 5f 4c 54 7c 57 4f 5f 4c 45 29 29 21 3d 30 20 29  _LT|WO_LE))!=0 )
13e50 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
13e60 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d 30  p->aSortOrder!=0
13e70 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d   );.      if( p-
13e80 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6e 45 71 5d  >aSortOrder[nEq]
13e90 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
13ea0 68 65 20 72 6f 6c 65 73 20 6f 66 20 70 4c 6f 77  he roles of pLow
13eb0 65 72 20 61 6e 64 20 70 55 70 70 65 72 20 61 72  er and pUpper ar
13ec0 65 20 73 77 61 70 70 65 64 20 66 6f 72 20 61 20  e swapped for a 
13ed0 44 45 53 43 20 69 6e 64 65 78 20 2a 2f 0a 20 20  DESC index */.  
13ee0 20 20 20 20 20 20 53 57 41 50 28 57 68 65 72 65        SWAP(Where
13ef0 54 65 72 6d 2a 2c 20 70 4c 6f 77 65 72 2c 20 70  Term*, pLower, p
13f00 55 70 70 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a  Upper);.      }.
13f10 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70 6f 73  .      /* If pos
13f20 73 69 62 6c 65 2c 20 69 6d 70 72 6f 76 65 20 6f  sible, improve o
13f30 6e 20 74 68 65 20 69 4c 6f 77 65 72 20 65 73 74  n the iLower est
13f40 69 6d 61 74 65 20 75 73 69 6e 67 20 28 24 50 3a  imate using ($P:
13f50 24 4c 29 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66  $L). */.      if
13f60 28 20 70 4c 6f 77 65 72 20 29 7b 0a 20 20 20 20  ( pLower ){.    
13f70 20 20 20 20 69 6e 74 20 62 4f 6b 3b 20 20 20 20      int bOk;    
13f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f90 2f 2a 20 54 72 75 65 20 69 66 20 76 61 6c 75 65  /* True if value
13fa0 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66 72   is extracted fr
13fb0 6f 6d 20 70 45 78 70 72 20 2a 2f 0a 20 20 20 20  om pExpr */.    
13fc0 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20      Expr *pExpr 
13fd0 3d 20 70 4c 6f 77 65 72 2d 3e 70 45 78 70 72 2d  = pLower->pExpr-
13fe0 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20  >pRight;.       
13ff0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 74 61   rc = sqlite3Sta
14000 74 34 50 72 6f 62 65 53 65 74 56 61 6c 75 65 28  t4ProbeSetValue(
14010 70 50 61 72 73 65 2c 20 70 2c 20 26 70 52 65 63  pParse, p, &pRec
14020 2c 20 70 45 78 70 72 2c 20 61 66 66 2c 20 6e 45  , pExpr, aff, nE
14030 71 2c 20 26 62 4f 6b 29 3b 0a 20 20 20 20 20 20  q, &bOk);.      
14040 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
14050 5f 4f 4b 20 26 26 20 62 4f 6b 20 29 7b 0a 20 20  _OK && bOk ){.  
14060 20 20 20 20 20 20 20 20 74 52 6f 77 63 6e 74 20          tRowcnt 
14070 69 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 20 20  iNew;.          
14080 69 4c 77 72 49 64 78 20 3d 20 77 68 65 72 65 4b  iLwrIdx = whereK
14090 65 79 53 74 61 74 73 28 70 50 61 72 73 65 2c 20  eyStats(pParse, 
140a0 70 2c 20 70 52 65 63 2c 20 30 2c 20 61 29 3b 0a  p, pRec, 0, a);.
140b0 20 20 20 20 20 20 20 20 20 20 69 4e 65 77 20 3d            iNew =
140c0 20 61 5b 30 5d 20 2b 20 28 28 70 4c 6f 77 65 72   a[0] + ((pLower
140d0 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57  ->eOperator & (W
140e0 4f 5f 47 54 7c 57 4f 5f 4c 45 29 29 20 3f 20 61  O_GT|WO_LE)) ? a
140f0 5b 31 5d 20 3a 20 30 29 3b 0a 20 20 20 20 20 20  [1] : 0);.      
14100 20 20 20 20 69 66 28 20 69 4e 65 77 3e 69 4c 6f      if( iNew>iLo
14110 77 65 72 20 29 20 69 4c 6f 77 65 72 20 3d 20 69  wer ) iLower = i
14120 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 20 20 6e  New;.          n
14130 4f 75 74 2d 2d 3b 0a 20 20 20 20 20 20 20 20 20  Out--;.         
14140 20 70 4c 6f 77 65 72 20 3d 20 30 3b 0a 20 20 20   pLower = 0;.   
14150 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a       }.      }..
14160 20 20 20 20 20 20 2f 2a 20 49 66 20 70 6f 73 73        /* If poss
14170 69 62 6c 65 2c 20 69 6d 70 72 6f 76 65 20 6f 6e  ible, improve on
14180 20 74 68 65 20 69 55 70 70 65 72 20 65 73 74 69   the iUpper esti
14190 6d 61 74 65 20 75 73 69 6e 67 20 28 24 50 3a 24  mate using ($P:$
141a0 55 29 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  U). */.      if(
141b0 20 70 55 70 70 65 72 20 29 7b 0a 20 20 20 20 20   pUpper ){.     
141c0 20 20 20 69 6e 74 20 62 4f 6b 3b 20 20 20 20 20     int bOk;     
141d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
141e0 2a 20 54 72 75 65 20 69 66 20 76 61 6c 75 65 20  * True if value 
141f0 69 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  is extracted fro
14200 6d 20 70 45 78 70 72 20 2a 2f 0a 20 20 20 20 20  m pExpr */.     
14210 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d     Expr *pExpr =
14220 20 70 55 70 70 65 72 2d 3e 70 45 78 70 72 2d 3e   pUpper->pExpr->
14230 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20  pRight;.        
14240 72 63 20 3d 20 73 71 6c 69 74 65 33 53 74 61 74  rc = sqlite3Stat
14250 34 50 72 6f 62 65 53 65 74 56 61 6c 75 65 28 70  4ProbeSetValue(p
14260 50 61 72 73 65 2c 20 70 2c 20 26 70 52 65 63 2c  Parse, p, &pRec,
14270 20 70 45 78 70 72 2c 20 61 66 66 2c 20 6e 45 71   pExpr, aff, nEq
14280 2c 20 26 62 4f 6b 29 3b 0a 20 20 20 20 20 20 20  , &bOk);.       
14290 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
142a0 4f 4b 20 26 26 20 62 4f 6b 20 29 7b 0a 20 20 20  OK && bOk ){.   
142b0 20 20 20 20 20 20 20 74 52 6f 77 63 6e 74 20 69         tRowcnt i
142c0 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 20 20 69  New;.          i
142d0 55 70 72 49 64 78 20 3d 20 77 68 65 72 65 4b 65  UprIdx = whereKe
142e0 79 53 74 61 74 73 28 70 50 61 72 73 65 2c 20 70  yStats(pParse, p
142f0 2c 20 70 52 65 63 2c 20 31 2c 20 61 29 3b 0a 20  , pRec, 1, a);. 
14300 20 20 20 20 20 20 20 20 20 69 4e 65 77 20 3d 20           iNew = 
14310 61 5b 30 5d 20 2b 20 28 28 70 55 70 70 65 72 2d  a[0] + ((pUpper-
14320 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f  >eOperator & (WO
14330 5f 47 54 7c 57 4f 5f 4c 45 29 29 20 3f 20 61 5b  _GT|WO_LE)) ? a[
14340 31 5d 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 20  1] : 0);.       
14350 20 20 20 69 66 28 20 69 4e 65 77 3c 69 55 70 70     if( iNew<iUpp
14360 65 72 20 29 20 69 55 70 70 65 72 20 3d 20 69 4e  er ) iUpper = iN
14370 65 77 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 4f  ew;.          nO
14380 75 74 2d 2d 3b 0a 20 20 20 20 20 20 20 20 20 20  ut--;.          
14390 70 55 70 70 65 72 20 3d 20 30 3b 0a 20 20 20 20  pUpper = 0;.    
143a0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20      }.      }.. 
143b0 20 20 20 20 20 70 42 75 69 6c 64 65 72 2d 3e 70       pBuilder->p
143c0 52 65 63 20 3d 20 70 52 65 63 3b 0a 20 20 20 20  Rec = pRec;.    
143d0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
143e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69  _OK ){.        i
143f0 66 28 20 69 55 70 70 65 72 3e 69 4c 6f 77 65 72  f( iUpper>iLower
14400 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 4e   ){.          nN
14410 65 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  ew = sqlite3LogE
14420 73 74 28 69 55 70 70 65 72 20 2d 20 69 4c 6f 77  st(iUpper - iLow
14430 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2f  er);.          /
14440 2a 20 54 55 4e 49 4e 47 3a 20 20 49 66 20 62 6f  * TUNING:  If bo
14450 74 68 20 69 55 70 70 65 72 20 61 6e 64 20 69 4c  th iUpper and iL
14460 6f 77 65 72 20 61 72 65 20 64 65 72 69 76 65 64  ower are derived
14470 20 66 72 6f 6d 20 74 68 65 20 73 61 6d 65 0a 20   from the same. 
14480 20 20 20 20 20 20 20 20 20 2a 2a 20 73 61 6d 70           ** samp
14490 6c 65 2c 20 74 68 65 6e 20 61 73 73 75 6d 65 20  le, then assume 
144a0 74 68 65 79 20 61 72 65 20 34 78 20 6d 6f 72 65  they are 4x more
144b0 20 73 65 6c 65 63 74 69 76 65 2e 20 20 54 68 69   selective.  Thi
144c0 73 20 62 72 69 6e 67 73 0a 20 20 20 20 20 20 20  s brings.       
144d0 20 20 20 2a 2a 20 74 68 65 20 65 73 74 69 6d 61     ** the estima
144e0 74 65 64 20 73 65 6c 65 63 74 69 76 69 74 79 20  ted selectivity 
144f0 6d 6f 72 65 20 69 6e 20 6c 69 6e 65 20 77 69 74  more in line wit
14500 68 20 77 68 61 74 20 69 74 20 77 6f 75 6c 64 20  h what it would 
14510 62 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  be.          ** 
14520 69 66 20 65 73 74 69 6d 61 74 65 64 20 77 69 74  if estimated wit
14530 68 6f 75 74 20 74 68 65 20 75 73 65 20 6f 66 20  hout the use of 
14540 53 54 41 54 33 2f 34 20 74 61 62 6c 65 73 2e 20  STAT3/4 tables. 
14550 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
14560 20 69 4c 77 72 49 64 78 3d 3d 69 55 70 72 49 64   iLwrIdx==iUprId
14570 78 20 29 20 6e 4e 65 77 20 2d 3d 20 32 30 3b 20  x ) nNew -= 20; 
14580 20 61 73 73 65 72 74 28 20 32 30 3d 3d 73 71 6c   assert( 20==sql
14590 69 74 65 33 4c 6f 67 45 73 74 28 34 29 20 29 3b  ite3LogEst(4) );
145a0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
145b0 20 20 20 20 20 20 20 20 20 20 6e 4e 65 77 20 3d            nNew =
145c0 20 31 30 3b 20 20 20 20 20 20 20 20 61 73 73 65   10;        asse
145d0 72 74 28 20 31 30 3d 3d 73 71 6c 69 74 65 33 4c  rt( 10==sqlite3L
145e0 6f 67 45 73 74 28 32 29 20 29 3b 0a 20 20 20 20  ogEst(2) );.    
145f0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
14600 28 20 6e 4e 65 77 3c 6e 4f 75 74 20 29 7b 0a 20  ( nNew<nOut ){. 
14610 20 20 20 20 20 20 20 20 20 6e 4f 75 74 20 3d 20           nOut = 
14620 6e 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 7d 0a  nNew;.        }.
14630 20 20 20 20 20 20 20 20 57 48 45 52 45 54 52 41          WHERETRA
14640 43 45 28 30 78 31 30 2c 20 28 22 53 54 41 54 34  CE(0x10, ("STAT4
14650 20 72 61 6e 67 65 20 73 63 61 6e 3a 20 25 75 2e   range scan: %u.
14660 2e 25 75 20 20 65 73 74 3d 25 64 5c 6e 22 2c 0a  .%u  est=%d\n",.
14670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14680 20 20 20 20 20 20 20 20 20 20 20 28 75 33 32 29             (u32)
14690 69 4c 6f 77 65 72 2c 20 28 75 33 32 29 69 55 70  iLower, (u32)iUp
146a0 70 65 72 2c 20 6e 4f 75 74 29 29 3b 0a 20 20 20  per, nOut));.   
146b0 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
146c0 20 20 20 20 20 20 69 6e 74 20 62 44 6f 6e 65 20        int bDone 
146d0 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  = 0;.      rc = 
146e0 77 68 65 72 65 52 61 6e 67 65 53 6b 69 70 53 63  whereRangeSkipSc
146f0 61 6e 45 73 74 28 70 50 61 72 73 65 2c 20 70 4c  anEst(pParse, pL
14700 6f 77 65 72 2c 20 70 55 70 70 65 72 2c 20 70 4c  ower, pUpper, pL
14710 6f 6f 70 2c 20 26 62 44 6f 6e 65 29 3b 0a 20 20  oop, &bDone);.  
14720 20 20 20 20 69 66 28 20 62 44 6f 6e 65 20 29 20      if( bDone ) 
14730 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
14740 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 55 4e 55  .  }.#else.  UNU
14750 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 50  SED_PARAMETER(pP
14760 61 72 73 65 29 3b 0a 20 20 55 4e 55 53 45 44 5f  arse);.  UNUSED_
14770 50 41 52 41 4d 45 54 45 52 28 70 42 75 69 6c 64  PARAMETER(pBuild
14780 65 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  er);.  assert( p
14790 4c 6f 77 65 72 20 7c 7c 20 70 55 70 70 65 72 20  Lower || pUpper 
147a0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65  );.#endif.  asse
147b0 72 74 28 20 70 55 70 70 65 72 3d 3d 30 20 7c 7c  rt( pUpper==0 ||
147c0 20 28 70 55 70 70 65 72 2d 3e 77 74 46 6c 61 67   (pUpper->wtFlag
147d0 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d  s & TERM_VNULL)=
147e0 3d 30 20 29 3b 0a 20 20 6e 4e 65 77 20 3d 20 77  =0 );.  nNew = w
147f0 68 65 72 65 52 61 6e 67 65 41 64 6a 75 73 74 28  hereRangeAdjust(
14800 70 4c 6f 77 65 72 2c 20 6e 4f 75 74 29 3b 0a 20  pLower, nOut);. 
14810 20 6e 4e 65 77 20 3d 20 77 68 65 72 65 52 61 6e   nNew = whereRan
14820 67 65 41 64 6a 75 73 74 28 70 55 70 70 65 72 2c  geAdjust(pUpper,
14830 20 6e 4e 65 77 29 3b 0a 0a 20 20 2f 2a 20 54 55   nNew);..  /* TU
14840 4e 49 4e 47 3a 20 49 66 20 74 68 65 72 65 20 69  NING: If there i
14850 73 20 62 6f 74 68 20 61 6e 20 75 70 70 65 72 20  s both an upper 
14860 61 6e 64 20 6c 6f 77 65 72 20 6c 69 6d 69 74 20  and lower limit 
14870 61 6e 64 20 6e 65 69 74 68 65 72 20 6c 69 6d 69  and neither limi
14880 74 0a 20 20 2a 2a 20 68 61 73 20 61 6e 20 61 70  t.  ** has an ap
14890 70 6c 69 63 61 74 69 6f 6e 2d 64 65 66 69 6e 65  plication-define
148a0 64 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 29 2c 20  d likelihood(), 
148b0 61 73 73 75 6d 65 20 74 68 65 20 72 61 6e 67 65  assume the range
148c0 20 69 73 0a 20 20 2a 2a 20 72 65 64 75 63 65 64   is.  ** reduced
148d0 20 62 79 20 61 6e 20 61 64 64 69 74 69 6f 6e 61   by an additiona
148e0 6c 20 37 35 25 2e 20 54 68 69 73 20 6d 65 61 6e  l 75%. This mean
148f0 73 20 74 68 61 74 2c 20 62 79 20 64 65 66 61 75  s that, by defau
14900 6c 74 2c 20 61 6e 20 6f 70 65 6e 2d 65 6e 64 65  lt, an open-ende
14910 64 0a 20 20 2a 2a 20 72 61 6e 67 65 20 71 75 65  d.  ** range que
14920 72 79 20 28 65 2e 67 2e 20 63 6f 6c 20 3e 20 3f  ry (e.g. col > ?
14930 29 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20  ) is assumed to 
14940 6d 61 74 63 68 20 31 2f 34 20 6f 66 20 74 68 65  match 1/4 of the
14950 20 72 6f 77 73 20 69 6e 20 74 68 65 0a 20 20 2a   rows in the.  *
14960 2a 20 69 6e 64 65 78 2e 20 57 68 69 6c 65 20 61  * index. While a
14970 20 63 6c 6f 73 65 64 20 72 61 6e 67 65 20 28 65   closed range (e
14980 2e 67 2e 20 63 6f 6c 20 42 45 54 57 45 45 4e 20  .g. col BETWEEN 
14990 3f 20 41 4e 44 20 3f 29 20 69 73 20 65 73 74 69  ? AND ?) is esti
149a0 6d 61 74 65 64 20 74 6f 0a 20 20 2a 2a 20 6d 61  mated to.  ** ma
149b0 74 63 68 20 31 2f 36 34 20 6f 66 20 74 68 65 20  tch 1/64 of the 
149c0 69 6e 64 65 78 2e 20 2a 2f 20 0a 20 20 69 66 28  index. */ .  if(
149d0 20 70 4c 6f 77 65 72 20 26 26 20 70 4c 6f 77 65   pLower && pLowe
149e0 72 2d 3e 74 72 75 74 68 50 72 6f 62 3e 30 20 26  r->truthProb>0 &
149f0 26 20 70 55 70 70 65 72 20 26 26 20 70 55 70 70  & pUpper && pUpp
14a00 65 72 2d 3e 74 72 75 74 68 50 72 6f 62 3e 30 20  er->truthProb>0 
14a10 29 7b 0a 20 20 20 20 6e 4e 65 77 20 2d 3d 20 32  ){.    nNew -= 2
14a20 30 3b 0a 20 20 7d 0a 0a 20 20 6e 4f 75 74 20 2d  0;.  }..  nOut -
14a30 3d 20 28 70 4c 6f 77 65 72 21 3d 30 29 20 2b 20  = (pLower!=0) + 
14a40 28 70 55 70 70 65 72 21 3d 30 29 3b 0a 20 20 69  (pUpper!=0);.  i
14a50 66 28 20 6e 4e 65 77 3c 31 30 20 29 20 6e 4e 65  f( nNew<10 ) nNe
14a60 77 20 3d 20 31 30 3b 0a 20 20 69 66 28 20 6e 4e  w = 10;.  if( nN
14a70 65 77 3c 6e 4f 75 74 20 29 20 6e 4f 75 74 20 3d  ew<nOut ) nOut =
14a80 20 6e 4e 65 77 3b 0a 23 69 66 20 64 65 66 69 6e   nNew;.#if defin
14a90 65 64 28 57 48 45 52 45 54 52 41 43 45 5f 45 4e  ed(WHERETRACE_EN
14aa0 41 42 4c 45 44 29 0a 20 20 69 66 28 20 70 4c 6f  ABLED).  if( pLo
14ab0 6f 70 2d 3e 6e 4f 75 74 3e 6e 4f 75 74 20 29 7b  op->nOut>nOut ){
14ac0 0a 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28  .    WHERETRACE(
14ad0 30 78 31 30 2c 28 22 52 61 6e 67 65 20 73 63 61  0x10,("Range sca
14ae0 6e 20 6c 6f 77 65 72 73 20 6e 4f 75 74 20 66 72  n lowers nOut fr
14af0 6f 6d 20 25 64 20 74 6f 20 25 64 5c 6e 22 2c 0a  om %d to %d\n",.
14b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14b10 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 2c      pLoop->nOut,
14b20 20 6e 4f 75 74 29 29 3b 0a 20 20 7d 0a 23 65 6e   nOut));.  }.#en
14b30 64 69 66 0a 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75  dif.  pLoop->nOu
14b40 74 20 3d 20 28 4c 6f 67 45 73 74 29 6e 4f 75 74  t = (LogEst)nOut
14b50 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
14b60 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
14b70 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f  ENABLE_STAT3_OR_
14b80 53 54 41 54 34 0a 2f 2a 0a 2a 2a 20 45 73 74 69  STAT4./*.** Esti
14b90 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20  mate the number 
14ba0 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77 69 6c  of rows that wil
14bb0 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 61  l be returned ba
14bc0 73 65 64 20 6f 6e 0a 2a 2a 20 61 6e 20 65 71 75  sed on.** an equ
14bd0 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
14be0 20 78 3d 56 41 4c 55 45 20 61 6e 64 20 77 68 65   x=VALUE and whe
14bf0 72 65 20 74 68 61 74 20 56 41 4c 55 45 20 6f 63  re that VALUE oc
14c00 63 75 72 73 20 69 6e 0a 2a 2a 20 74 68 65 20 68  curs in.** the h
14c10 69 73 74 6f 67 72 61 6d 20 64 61 74 61 2e 20 20  istogram data.  
14c20 54 68 69 73 20 6f 6e 6c 79 20 77 6f 72 6b 73 20  This only works 
14c30 77 68 65 6e 20 78 20 69 73 20 74 68 65 20 6c 65  when x is the le
14c40 66 74 2d 6d 6f 73 74 0a 2a 2a 20 63 6f 6c 75 6d  ft-most.** colum
14c50 6e 20 6f 66 20 61 6e 20 69 6e 64 65 78 20 61 6e  n of an index an
14c60 64 20 73 71 6c 69 74 65 5f 73 74 61 74 33 20 68  d sqlite_stat3 h
14c70 69 73 74 6f 67 72 61 6d 20 64 61 74 61 20 69 73  istogram data is
14c80 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 66 6f   available.** fo
14c90 72 20 74 68 61 74 20 69 6e 64 65 78 2e 20 20 57  r that index.  W
14ca0 68 65 6e 20 70 45 78 70 72 3d 3d 4e 55 4c 4c 20  hen pExpr==NULL 
14cb0 74 68 61 74 20 6d 65 61 6e 73 20 74 68 65 20 63  that means the c
14cc0 6f 6e 73 74 72 61 69 6e 74 20 69 73 0a 2a 2a 20  onstraint is.** 
14cd0 22 78 20 49 53 20 4e 55 4c 4c 22 20 69 6e 73 74  "x IS NULL" inst
14ce0 65 61 64 20 6f 66 20 22 78 3d 56 41 4c 55 45 22  ead of "x=VALUE"
14cf0 2e 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68  ..**.** Write th
14d00 65 20 65 73 74 69 6d 61 74 65 64 20 72 6f 77 20  e estimated row 
14d10 63 6f 75 6e 74 20 69 6e 74 6f 20 2a 70 6e 52 6f  count into *pnRo
14d20 77 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c  w and return SQL
14d30 49 54 45 5f 4f 4b 2e 20 0a 2a 2a 20 49 66 20 75  ITE_OK. .** If u
14d40 6e 61 62 6c 65 20 74 6f 20 6d 61 6b 65 20 61 6e  nable to make an
14d50 20 65 73 74 69 6d 61 74 65 2c 20 6c 65 61 76 65   estimate, leave
14d60 20 2a 70 6e 52 6f 77 20 75 6e 63 68 61 6e 67 65   *pnRow unchange
14d70 64 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20  d and return.** 
14d80 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20  non-zero..**.** 
14d90 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e  This routine can
14da0 20 66 61 69 6c 20 69 66 20 69 74 20 69 73 20 75   fail if it is u
14db0 6e 61 62 6c 65 20 74 6f 20 6c 6f 61 64 20 61 20  nable to load a 
14dc0 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
14dd0 63 65 0a 2a 2a 20 72 65 71 75 69 72 65 64 20 66  ce.** required f
14de0 6f 72 20 73 74 72 69 6e 67 20 63 6f 6d 70 61 72  or string compar
14df0 69 73 6f 6e 2c 20 6f 72 20 69 66 20 75 6e 61 62  ison, or if unab
14e00 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d  le to allocate m
14e10 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20 61 20 55  emory.** for a U
14e20 54 46 20 63 6f 6e 76 65 72 73 69 6f 6e 20 72 65  TF conversion re
14e30 71 75 69 72 65 64 20 66 6f 72 20 63 6f 6d 70 61  quired for compa
14e40 72 69 73 6f 6e 2e 20 20 54 68 65 20 65 72 72 6f  rison.  The erro
14e50 72 20 69 73 20 73 74 6f 72 65 64 0a 2a 2a 20 69  r is stored.** i
14e60 6e 20 74 68 65 20 70 50 61 72 73 65 20 73 74 72  n the pParse str
14e70 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69  ucture..*/.stati
14e80 63 20 69 6e 74 20 77 68 65 72 65 45 71 75 61 6c  c int whereEqual
14e90 53 63 61 6e 45 73 74 28 0a 20 20 50 61 72 73 65  ScanEst(.  Parse
14ea0 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
14eb0 2f 2a 20 50 61 72 73 69 6e 67 20 26 20 63 6f 64  /* Parsing & cod
14ec0 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e  e generating con
14ed0 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c  text */.  WhereL
14ee0 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69  oopBuilder *pBui
14ef0 6c 64 65 72 2c 0a 20 20 45 78 70 72 20 2a 70 45  lder,.  Expr *pE
14f00 78 70 72 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  xpr,         /* 
14f10 45 78 70 72 65 73 73 69 6f 6e 20 66 6f 72 20 56  Expression for V
14f20 41 4c 55 45 20 69 6e 20 74 68 65 20 78 3d 56 41  ALUE in the x=VA
14f30 4c 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a  LUE constraint *
14f40 2f 0a 20 20 74 52 6f 77 63 6e 74 20 2a 70 6e 52  /.  tRowcnt *pnR
14f50 6f 77 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74  ow       /* Writ
14f60 65 20 74 68 65 20 72 65 76 69 73 65 64 20 72 6f  e the revised ro
14f70 77 20 65 73 74 69 6d 61 74 65 20 68 65 72 65 20  w estimate here 
14f80 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70  */.){.  Index *p
14f90 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65   = pBuilder->pNe
14fa0 77 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  w->u.btree.pInde
14fb0 78 3b 0a 20 20 69 6e 74 20 6e 45 71 20 3d 20 70  x;.  int nEq = p
14fc0 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 75  Builder->pNew->u
14fd0 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20 55 6e  .btree.nEq;.  Un
14fe0 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 52  packedRecord *pR
14ff0 65 63 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  ec = pBuilder->p
15000 52 65 63 3b 0a 20 20 75 38 20 61 66 66 3b 20 20  Rec;.  u8 aff;  
15010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15020 20 2f 2a 20 43 6f 6c 75 6d 6e 20 61 66 66 69 6e   /* Column affin
15030 69 74 79 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  ity */.  int rc;
15040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15050 20 20 20 2f 2a 20 53 75 62 66 75 6e 63 74 69 6f     /* Subfunctio
15060 6e 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  n return code */
15070 0a 20 20 74 52 6f 77 63 6e 74 20 61 5b 32 5d 3b  .  tRowcnt a[2];
15080 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15090 53 74 61 74 69 73 74 69 63 73 20 2a 2f 0a 20 20  Statistics */.  
150a0 69 6e 74 20 62 4f 6b 3b 0a 0a 20 20 61 73 73 65  int bOk;..  asse
150b0 72 74 28 20 6e 45 71 3e 3d 31 20 29 3b 0a 20 20  rt( nEq>=1 );.  
150c0 61 73 73 65 72 74 28 20 6e 45 71 3c 3d 70 2d 3e  assert( nEq<=p->
150d0 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 61 73 73  nColumn );.  ass
150e0 65 72 74 28 20 70 2d 3e 61 53 61 6d 70 6c 65 21  ert( p->aSample!
150f0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
15100 70 2d 3e 6e 53 61 6d 70 6c 65 3e 30 20 29 3b 0a  p->nSample>0 );.
15110 20 20 61 73 73 65 72 74 28 20 70 42 75 69 6c 64    assert( pBuild
15120 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3c 6e 45  er->nRecValid<nE
15130 71 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 76 61  q );..  /* If va
15140 6c 75 65 73 20 61 72 65 20 6e 6f 74 20 61 76 61  lues are not ava
15150 69 6c 61 62 6c 65 20 66 6f 72 20 61 6c 6c 20 66  ilable for all f
15160 69 65 6c 64 73 20 6f 66 20 74 68 65 20 69 6e 64  ields of the ind
15170 65 78 20 74 6f 20 74 68 65 20 6c 65 66 74 0a 20  ex to the left. 
15180 20 2a 2a 20 6f 66 20 74 68 69 73 20 6f 6e 65 2c   ** of this one,
15190 20 6e 6f 20 65 73 74 69 6d 61 74 65 20 63 61 6e   no estimate can
151a0 20 62 65 20 6d 61 64 65 2e 20 52 65 74 75 72 6e   be made. Return
151b0 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44   SQLITE_NOTFOUND
151c0 2e 20 2a 2f 0a 20 20 69 66 28 20 70 42 75 69 6c  . */.  if( pBuil
151d0 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3c 28  der->nRecValid<(
151e0 6e 45 71 2d 31 29 20 29 7b 0a 20 20 20 20 72 65  nEq-1) ){.    re
151f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46  turn SQLITE_NOTF
15200 4f 55 4e 44 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  OUND;.  }..  /* 
15210 54 68 69 73 20 69 73 20 61 6e 20 6f 70 74 69 6d  This is an optim
15220 69 7a 61 74 69 6f 6e 20 6f 6e 6c 79 2e 20 54 68  ization only. Th
15230 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  e call to sqlite
15240 33 53 74 61 74 34 50 72 6f 62 65 53 65 74 56 61  3Stat4ProbeSetVa
15250 6c 75 65 28 29 0a 20 20 2a 2a 20 62 65 6c 6f 77  lue().  ** below
15260 20 77 6f 75 6c 64 20 72 65 74 75 72 6e 20 74 68   would return th
15270 65 20 73 61 6d 65 20 76 61 6c 75 65 2e 20 20 2a  e same value.  *
15280 2f 0a 20 20 69 66 28 20 6e 45 71 3e 3d 70 2d 3e  /.  if( nEq>=p->
15290 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 2a  nColumn ){.    *
152a0 70 6e 52 6f 77 20 3d 20 31 3b 0a 20 20 20 20 72  pnRow = 1;.    r
152b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
152c0 0a 20 20 7d 0a 0a 20 20 61 66 66 20 3d 20 70 2d  .  }..  aff = p-
152d0 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 70 2d  >pTable->aCol[p-
152e0 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 45 71 2d 31 5d  >aiColumn[nEq-1]
152f0 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 72 63  ].affinity;.  rc
15300 20 3d 20 73 71 6c 69 74 65 33 53 74 61 74 34 50   = sqlite3Stat4P
15310 72 6f 62 65 53 65 74 56 61 6c 75 65 28 70 50 61  robeSetValue(pPa
15320 72 73 65 2c 20 70 2c 20 26 70 52 65 63 2c 20 70  rse, p, &pRec, p
15330 45 78 70 72 2c 20 61 66 66 2c 20 6e 45 71 2d 31  Expr, aff, nEq-1
15340 2c 20 26 62 4f 6b 29 3b 0a 20 20 70 42 75 69 6c  , &bOk);.  pBuil
15350 64 65 72 2d 3e 70 52 65 63 20 3d 20 70 52 65 63  der->pRec = pRec
15360 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
15370 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
15380 63 3b 0a 20 20 69 66 28 20 62 4f 6b 3d 3d 30 20  c;.  if( bOk==0 
15390 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
153a0 4e 4f 54 46 4f 55 4e 44 3b 0a 20 20 70 42 75 69  NOTFOUND;.  pBui
153b0 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20  lder->nRecValid 
153c0 3d 20 6e 45 71 3b 0a 0a 20 20 77 68 65 72 65 4b  = nEq;..  whereK
153d0 65 79 53 74 61 74 73 28 70 50 61 72 73 65 2c 20  eyStats(pParse, 
153e0 70 2c 20 70 52 65 63 2c 20 30 2c 20 61 29 3b 0a  p, pRec, 0, a);.
153f0 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78 31    WHERETRACE(0x1
15400 30 2c 28 22 65 71 75 61 6c 69 74 79 20 73 63 61  0,("equality sca
15410 6e 20 72 65 67 69 6f 6e 73 3a 20 25 64 5c 6e 22  n regions: %d\n"
15420 2c 20 28 69 6e 74 29 61 5b 31 5d 29 29 3b 0a 20  , (int)a[1]));. 
15430 20 2a 70 6e 52 6f 77 20 3d 20 61 5b 31 5d 3b 0a   *pnRow = a[1];.
15440 20 20 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a    .  return rc;.
15450 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
15460 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f  TE_ENABLE_STAT3_
15470 4f 52 5f 53 54 41 54 34 20 2a 2f 0a 0a 23 69 66  OR_STAT4 */..#if
15480 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
15490 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34  E_STAT3_OR_STAT4
154a0 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20  ./*.** Estimate 
154b0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
154c0 77 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  ws that will be 
154d0 72 65 74 75 72 6e 65 64 20 62 61 73 65 64 20 6f  returned based o
154e0 6e 0a 2a 2a 20 61 6e 20 49 4e 20 63 6f 6e 73 74  n.** an IN const
154f0 72 61 69 6e 74 20 77 68 65 72 65 20 74 68 65 20  raint where the 
15500 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20  right-hand side 
15510 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74  of the IN operat
15520 6f 72 0a 2a 2a 20 69 73 20 61 20 6c 69 73 74 20  or.** is a list 
15530 6f 66 20 76 61 6c 75 65 73 2e 20 20 45 78 61 6d  of values.  Exam
15540 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  ple:.**.**      
15550 20 20 57 48 45 52 45 20 78 20 49 4e 20 28 31 2c    WHERE x IN (1,
15560 32 2c 33 2c 34 29 0a 2a 2a 0a 2a 2a 20 57 72 69  2,3,4).**.** Wri
15570 74 65 20 74 68 65 20 65 73 74 69 6d 61 74 65 64  te the estimated
15580 20 72 6f 77 20 63 6f 75 6e 74 20 69 6e 74 6f 20   row count into 
15590 2a 70 6e 52 6f 77 20 61 6e 64 20 72 65 74 75 72  *pnRow and retur
155a0 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 0a 2a 2a  n SQLITE_OK. .**
155b0 20 49 66 20 75 6e 61 62 6c 65 20 74 6f 20 6d 61   If unable to ma
155c0 6b 65 20 61 6e 20 65 73 74 69 6d 61 74 65 2c 20  ke an estimate, 
155d0 6c 65 61 76 65 20 2a 70 6e 52 6f 77 20 75 6e 63  leave *pnRow unc
155e0 68 61 6e 67 65 64 20 61 6e 64 20 72 65 74 75 72  hanged and retur
155f0 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a  n.** non-zero..*
15600 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
15610 65 20 63 61 6e 20 66 61 69 6c 20 69 66 20 69 74  e can fail if it
15620 20 69 73 20 75 6e 61 62 6c 65 20 74 6f 20 6c 6f   is unable to lo
15630 61 64 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73  ad a collating s
15640 65 71 75 65 6e 63 65 0a 2a 2a 20 72 65 71 75 69  equence.** requi
15650 72 65 64 20 66 6f 72 20 73 74 72 69 6e 67 20 63  red for string c
15660 6f 6d 70 61 72 69 73 6f 6e 2c 20 6f 72 20 69 66  omparison, or if
15670 20 75 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63   unable to alloc
15680 61 74 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20 66 6f  ate memory.** fo
15690 72 20 61 20 55 54 46 20 63 6f 6e 76 65 72 73 69  r a UTF conversi
156a0 6f 6e 20 72 65 71 75 69 72 65 64 20 66 6f 72 20  on required for 
156b0 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 20 54 68 65  comparison.  The
156c0 20 65 72 72 6f 72 20 69 73 20 73 74 6f 72 65 64   error is stored
156d0 0a 2a 2a 20 69 6e 20 74 68 65 20 70 50 61 72 73  .** in the pPars
156e0 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  e structure..*/.
156f0 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
15700 49 6e 53 63 61 6e 45 73 74 28 0a 20 20 50 61 72  InScanEst(.  Par
15710 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
15720 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 26 20 63    /* Parsing & c
15730 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63  ode generating c
15740 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72  ontext */.  Wher
15750 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42  eLoopBuilder *pB
15760 75 69 6c 64 65 72 2c 0a 20 20 45 78 70 72 4c 69  uilder,.  ExprLi
15770 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f  st *pList,     /
15780 2a 20 54 68 65 20 76 61 6c 75 65 20 6c 69 73 74  * The value list
15790 20 6f 6e 20 74 68 65 20 52 48 53 20 6f 66 20 22   on the RHS of "
157a0 78 20 49 4e 20 28 76 31 2c 76 32 2c 76 33 2c 2e  x IN (v1,v2,v3,.
157b0 2e 2e 29 22 20 2a 2f 0a 20 20 74 52 6f 77 63 6e  ..)" */.  tRowcn
157c0 74 20 2a 70 6e 52 6f 77 20 20 20 20 20 20 20 2f  t *pnRow       /
157d0 2a 20 57 72 69 74 65 20 74 68 65 20 72 65 76 69  * Write the revi
157e0 73 65 64 20 72 6f 77 20 65 73 74 69 6d 61 74 65  sed row estimate
157f0 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 49 6e   here */.){.  In
15800 64 65 78 20 2a 70 20 3d 20 70 42 75 69 6c 64 65  dex *p = pBuilde
15810 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65  r->pNew->u.btree
15820 2e 70 49 6e 64 65 78 3b 0a 20 20 69 36 34 20 6e  .pIndex;.  i64 n
15830 52 6f 77 30 20 3d 20 73 71 6c 69 74 65 33 4c 6f  Row0 = sqlite3Lo
15840 67 45 73 74 54 6f 49 6e 74 28 70 2d 3e 61 69 52  gEstToInt(p->aiR
15850 6f 77 4c 6f 67 45 73 74 5b 30 5d 29 3b 0a 20 20  owLogEst[0]);.  
15860 69 6e 74 20 6e 52 65 63 56 61 6c 69 64 20 3d 20  int nRecValid = 
15870 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61  pBuilder->nRecVa
15880 6c 69 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  lid;.  int rc = 
15890 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 2f  SQLITE_OK;     /
158a0 2a 20 53 75 62 66 75 6e 63 74 69 6f 6e 20 72 65  * Subfunction re
158b0 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 74  turn code */.  t
158c0 52 6f 77 63 6e 74 20 6e 45 73 74 3b 20 20 20 20  Rowcnt nEst;    
158d0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
158e0 20 6f 66 20 72 6f 77 73 20 66 6f 72 20 61 20 73   of rows for a s
158f0 69 6e 67 6c 65 20 74 65 72 6d 20 2a 2f 0a 20 20  ingle term */.  
15900 74 52 6f 77 63 6e 74 20 6e 52 6f 77 45 73 74 20  tRowcnt nRowEst 
15910 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 65 77 20 65  = 0;    /* New e
15920 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20 6e  stimate of the n
15930 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 2a 2f  umber of rows */
15940 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
15950 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
15960 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20  op counter */.. 
15970 20 61 73 73 65 72 74 28 20 70 2d 3e 61 53 61 6d   assert( p->aSam
15980 70 6c 65 21 3d 30 20 29 3b 0a 20 20 66 6f 72 28  ple!=0 );.  for(
15990 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=0; rc==SQLITE_
159a0 4f 4b 20 26 26 20 69 3c 70 4c 69 73 74 2d 3e 6e  OK && i<pList->n
159b0 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
159c0 6e 45 73 74 20 3d 20 6e 52 6f 77 30 3b 0a 20 20  nEst = nRow0;.  
159d0 20 20 72 63 20 3d 20 77 68 65 72 65 45 71 75 61    rc = whereEqua
159e0 6c 53 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c  lScanEst(pParse,
159f0 20 70 42 75 69 6c 64 65 72 2c 20 70 4c 69 73 74   pBuilder, pList
15a00 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 26 6e  ->a[i].pExpr, &n
15a10 45 73 74 29 3b 0a 20 20 20 20 6e 52 6f 77 45 73  Est);.    nRowEs
15a20 74 20 2b 3d 20 6e 45 73 74 3b 0a 20 20 20 20 70  t += nEst;.    p
15a30 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c  Builder->nRecVal
15a40 69 64 20 3d 20 6e 52 65 63 56 61 6c 69 64 3b 0a  id = nRecValid;.
15a50 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53    }..  if( rc==S
15a60 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
15a70 69 66 28 20 6e 52 6f 77 45 73 74 20 3e 20 6e 52  if( nRowEst > nR
15a80 6f 77 30 20 29 20 6e 52 6f 77 45 73 74 20 3d 20  ow0 ) nRowEst = 
15a90 6e 52 6f 77 30 3b 0a 20 20 20 20 2a 70 6e 52 6f  nRow0;.    *pnRo
15aa0 77 20 3d 20 6e 52 6f 77 45 73 74 3b 0a 20 20 20  w = nRowEst;.   
15ab0 20 57 48 45 52 45 54 52 41 43 45 28 30 78 31 30   WHERETRACE(0x10
15ac0 2c 28 22 49 4e 20 72 6f 77 20 65 73 74 69 6d 61  ,("IN row estima
15ad0 74 65 3a 20 65 73 74 3d 25 64 5c 6e 22 2c 20 6e  te: est=%d\n", n
15ae0 52 6f 77 45 73 74 29 29 3b 0a 20 20 7d 0a 20 20  RowEst));.  }.  
15af0 61 73 73 65 72 74 28 20 70 42 75 69 6c 64 65 72  assert( pBuilder
15b00 2d 3e 6e 52 65 63 56 61 6c 69 64 3d 3d 6e 52 65  ->nRecValid==nRe
15b10 63 56 61 6c 69 64 20 29 3b 0a 20 20 72 65 74 75  cValid );.  retu
15b20 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20  rn rc;.}.#endif 
15b30 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
15b40 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 20  _STAT3_OR_STAT4 
15b50 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 61 62 6c  */../*.** Disabl
15b60 65 20 61 20 74 65 72 6d 20 69 6e 20 74 68 65 20  e a term in the 
15b70 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 45  WHERE clause.  E
15b80 78 63 65 70 74 2c 20 64 6f 20 6e 6f 74 20 64 69  xcept, do not di
15b90 73 61 62 6c 65 20 74 68 65 20 74 65 72 6d 0a 2a  sable the term.*
15ba0 2a 20 69 66 20 69 74 20 63 6f 6e 74 72 6f 6c 73  * if it controls
15bb0 20 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f   a LEFT OUTER JO
15bc0 49 4e 20 61 6e 64 20 69 74 20 64 69 64 20 6e 6f  IN and it did no
15bd0 74 20 6f 72 69 67 69 6e 61 74 65 20 69 6e 20 74  t originate in t
15be0 68 65 20 4f 4e 0a 2a 2a 20 6f 72 20 55 53 49 4e  he ON.** or USIN
15bf0 47 20 63 6c 61 75 73 65 20 6f 66 20 74 68 61 74  G clause of that
15c00 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e   join..**.** Con
15c10 73 69 64 65 72 20 74 68 65 20 74 65 72 6d 20 74  sider the term t
15c20 32 2e 7a 3d 27 6f 6b 27 20 69 6e 20 74 68 65 20  2.z='ok' in the 
15c30 66 6f 6c 6c 6f 77 69 6e 67 20 71 75 65 72 69 65  following querie
15c40 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 20  s:.**.**   (1)  
15c50 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
15c60 20 4c 45 46 54 20 4a 4f 49 4e 20 74 32 20 4f 4e   LEFT JOIN t2 ON
15c70 20 74 31 2e 61 3d 74 32 2e 78 20 57 48 45 52 45   t1.a=t2.x WHERE
15c80 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 20 20 20   t2.z='ok'.**   
15c90 28 32 29 20 20 53 45 4c 45 43 54 20 2a 20 46 52  (2)  SELECT * FR
15ca0 4f 4d 20 74 31 20 4c 45 46 54 20 4a 4f 49 4e 20  OM t1 LEFT JOIN 
15cb0 74 32 20 4f 4e 20 74 31 2e 61 3d 74 32 2e 78 20  t2 ON t1.a=t2.x 
15cc0 41 4e 44 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a  AND t2.z='ok'.**
15cd0 20 20 20 28 33 29 20 20 53 45 4c 45 43 54 20 2a     (3)  SELECT *
15ce0 20 46 52 4f 4d 20 74 31 2c 20 74 32 20 57 48 45   FROM t1, t2 WHE
15cf0 52 45 20 74 31 2e 61 3d 74 32 2e 78 20 41 4e 44  RE t1.a=t2.x AND
15d00 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 0a 2a 2a   t2.z='ok'.**.**
15d10 20 54 68 65 20 74 32 2e 7a 3d 27 6f 6b 27 20 69   The t2.z='ok' i
15d20 73 20 64 69 73 61 62 6c 65 64 20 69 6e 20 74 68  s disabled in th
15d30 65 20 69 6e 20 28 32 29 20 62 65 63 61 75 73 65  e in (2) because
15d40 20 69 74 20 6f 72 69 67 69 6e 61 74 65 73 0a 2a   it originates.*
15d50 2a 20 69 6e 20 74 68 65 20 4f 4e 20 63 6c 61 75  * in the ON clau
15d60 73 65 2e 20 20 54 68 65 20 74 65 72 6d 20 69 73  se.  The term is
15d70 20 64 69 73 61 62 6c 65 64 20 69 6e 20 28 33 29   disabled in (3)
15d80 20 62 65 63 61 75 73 65 20 69 74 20 69 73 20 6e   because it is n
15d90 6f 74 20 70 61 72 74 0a 2a 2a 20 6f 66 20 61 20  ot part.** of a 
15da0 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 2e  LEFT OUTER JOIN.
15db0 20 20 49 6e 20 28 31 29 2c 20 74 68 65 20 74 65    In (1), the te
15dc0 72 6d 20 69 73 20 6e 6f 74 20 64 69 73 61 62 6c  rm is not disabl
15dd0 65 64 2e 0a 2a 2a 0a 2a 2a 20 44 69 73 61 62 6c  ed..**.** Disabl
15de0 69 6e 67 20 61 20 74 65 72 6d 20 63 61 75 73 65  ing a term cause
15df0 73 20 74 68 61 74 20 74 65 72 6d 20 74 6f 20 6e  s that term to n
15e00 6f 74 20 62 65 20 74 65 73 74 65 64 20 69 6e 20  ot be tested in 
15e10 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a 2a  the inner loop.*
15e20 2a 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20 20  * of the join.  
15e30 44 69 73 61 62 6c 69 6e 67 20 69 73 20 61 6e 20  Disabling is an 
15e40 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 57  optimization.  W
15e50 68 65 6e 20 74 65 72 6d 73 20 61 72 65 20 73 61  hen terms are sa
15e60 74 69 73 66 69 65 64 0a 2a 2a 20 62 79 20 69 6e  tisfied.** by in
15e70 64 69 63 65 73 2c 20 77 65 20 64 69 73 61 62 6c  dices, we disabl
15e80 65 20 74 68 65 6d 20 74 6f 20 70 72 65 76 65 6e  e them to preven
15e90 74 20 72 65 64 75 6e 64 61 6e 74 20 74 65 73 74  t redundant test
15ea0 73 20 69 6e 20 74 68 65 20 69 6e 6e 65 72 0a 2a  s in the inner.*
15eb0 2a 20 6c 6f 6f 70 2e 20 20 57 65 20 77 6f 75 6c  * loop.  We woul
15ec0 64 20 67 65 74 20 74 68 65 20 63 6f 72 72 65 63  d get the correc
15ed0 74 20 72 65 73 75 6c 74 73 20 69 66 20 6e 6f 74  t results if not
15ee0 68 69 6e 67 20 77 65 72 65 20 65 76 65 72 20 64  hing were ever d
15ef0 69 73 61 62 6c 65 64 2c 0a 2a 2a 20 62 75 74 20  isabled,.** but 
15f00 6a 6f 69 6e 73 20 6d 69 67 68 74 20 72 75 6e 20  joins might run 
15f10 61 20 6c 69 74 74 6c 65 20 73 6c 6f 77 65 72 2e  a little slower.
15f20 20 20 54 68 65 20 74 72 69 63 6b 20 69 73 20 74    The trick is t
15f30 6f 20 64 69 73 61 62 6c 65 20 61 73 20 6d 75 63  o disable as muc
15f40 68 0a 2a 2a 20 61 73 20 77 65 20 63 61 6e 20 77  h.** as we can w
15f50 69 74 68 6f 75 74 20 64 69 73 61 62 6c 69 6e 67  ithout disabling
15f60 20 74 6f 6f 20 6d 75 63 68 2e 20 20 49 66 20 77   too much.  If w
15f70 65 20 64 69 73 61 62 6c 65 64 20 69 6e 20 28 31  e disabled in (1
15f80 29 2c 20 77 65 27 64 20 67 65 74 0a 2a 2a 20 74  ), we'd get.** t
15f90 68 65 20 77 72 6f 6e 67 20 61 6e 73 77 65 72 2e  he wrong answer.
15fa0 20 20 53 65 65 20 74 69 63 6b 65 74 20 23 38 31    See ticket #81
15fb0 33 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  3..*/.static voi
15fc0 64 20 64 69 73 61 62 6c 65 54 65 72 6d 28 57 68  d disableTerm(Wh
15fd0 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c  ereLevel *pLevel
15fe0 2c 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65  , WhereTerm *pTe
15ff0 72 6d 29 7b 0a 20 20 69 66 28 20 70 54 65 72 6d  rm){.  if( pTerm
16000 0a 20 20 20 20 20 20 26 26 20 28 70 54 65 72 6d  .      && (pTerm
16010 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
16020 5f 43 4f 44 45 44 29 3d 3d 30 0a 20 20 20 20 20  _CODED)==0.     
16030 20 26 26 20 28 70 4c 65 76 65 6c 2d 3e 69 4c 65   && (pLevel->iLe
16040 66 74 4a 6f 69 6e 3d 3d 30 20 7c 7c 20 45 78 70  ftJoin==0 || Exp
16050 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 54 65  rHasProperty(pTe
16060 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f 46 72  rm->pExpr, EP_Fr
16070 6f 6d 4a 6f 69 6e 29 29 0a 20 20 20 20 20 20 26  omJoin)).      &
16080 26 20 28 70 4c 65 76 65 6c 2d 3e 6e 6f 74 52 65  & (pLevel->notRe
16090 61 64 79 20 26 20 70 54 65 72 6d 2d 3e 70 72 65  ady & pTerm->pre
160a0 72 65 71 41 6c 6c 29 3d 3d 30 0a 20 20 29 7b 0a  reqAll)==0.  ){.
160b0 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61      pTerm->wtFla
160c0 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44  gs |= TERM_CODED
160d0 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  ;.    if( pTerm-
160e0 3e 69 50 61 72 65 6e 74 3e 3d 30 20 29 7b 0a 20  >iParent>=0 ){. 
160f0 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a       WhereTerm *
16100 70 4f 74 68 65 72 20 3d 20 26 70 54 65 72 6d 2d  pOther = &pTerm-
16110 3e 70 57 43 2d 3e 61 5b 70 54 65 72 6d 2d 3e 69  >pWC->a[pTerm->i
16120 50 61 72 65 6e 74 5d 3b 0a 20 20 20 20 20 20 69  Parent];.      i
16130 66 28 20 28 2d 2d 70 4f 74 68 65 72 2d 3e 6e 43  f( (--pOther->nC
16140 68 69 6c 64 29 3d 3d 30 20 29 7b 0a 20 20 20 20  hild)==0 ){.    
16150 20 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28      disableTerm(
16160 70 4c 65 76 65 6c 2c 20 70 4f 74 68 65 72 29 3b  pLevel, pOther);
16170 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
16180 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65   }.}../*.** Code
16190 20 61 6e 20 4f 50 5f 41 66 66 69 6e 69 74 79 20   an OP_Affinity 
161a0 6f 70 63 6f 64 65 20 74 6f 20 61 70 70 6c 79 20  opcode to apply 
161b0 74 68 65 20 63 6f 6c 75 6d 6e 20 61 66 66 69 6e  the column affin
161c0 69 74 79 20 73 74 72 69 6e 67 20 7a 41 66 66 0a  ity string zAff.
161d0 2a 2a 20 74 6f 20 74 68 65 20 6e 20 72 65 67 69  ** to the n regi
161e0 73 74 65 72 73 20 73 74 61 72 74 69 6e 67 20 61  sters starting a
161f0 74 20 62 61 73 65 2e 20 0a 2a 2a 0a 2a 2a 20 41  t base. .**.** A
16200 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f  s an optimizatio
16210 6e 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f  n, SQLITE_AFF_NO
16220 4e 45 20 65 6e 74 72 69 65 73 20 28 77 68 69 63  NE entries (whic
16230 68 20 61 72 65 20 6e 6f 2d 6f 70 73 29 20 61 74  h are no-ops) at
16240 20 74 68 65 0a 2a 2a 20 62 65 67 69 6e 6e 69 6e   the.** beginnin
16250 67 20 61 6e 64 20 65 6e 64 20 6f 66 20 7a 41 66  g and end of zAf
16260 66 20 61 72 65 20 69 67 6e 6f 72 65 64 2e 20 20  f are ignored.  
16270 49 66 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 69  If all entries i
16280 6e 20 7a 41 66 66 20 61 72 65 0a 2a 2a 20 53 51  n zAff are.** SQ
16290 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 2c 20 74  LITE_AFF_NONE, t
162a0 68 65 6e 20 6e 6f 20 63 6f 64 65 20 67 65 74 73  hen no code gets
162b0 20 67 65 6e 65 72 61 74 65 64 2e 0a 2a 2a 0a 2a   generated..**.*
162c0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  * This routine m
162d0 61 6b 65 73 20 69 74 73 20 6f 77 6e 20 63 6f 70  akes its own cop
162e0 79 20 6f 66 20 7a 41 66 66 20 73 6f 20 74 68 61  y of zAff so tha
162f0 74 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20  t the caller is 
16300 66 72 65 65 0a 2a 2a 20 74 6f 20 6d 6f 64 69 66  free.** to modif
16310 79 20 7a 41 66 66 20 61 66 74 65 72 20 74 68 69  y zAff after thi
16320 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
16330 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
16340 64 20 63 6f 64 65 41 70 70 6c 79 41 66 66 69 6e  d codeApplyAffin
16350 69 74 79 28 50 61 72 73 65 20 2a 70 50 61 72 73  ity(Parse *pPars
16360 65 2c 20 69 6e 74 20 62 61 73 65 2c 20 69 6e 74  e, int base, int
16370 20 6e 2c 20 63 68 61 72 20 2a 7a 41 66 66 29 7b   n, char *zAff){
16380 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
16390 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 66  rse->pVdbe;.  if
163a0 28 20 7a 41 66 66 3d 3d 30 20 29 7b 0a 20 20 20  ( zAff==0 ){.   
163b0 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
163c0 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
163d0 64 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  d );.    return;
163e0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 76  .  }.  assert( v
163f0 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 64 6a  !=0 );..  /* Adj
16400 75 73 74 20 62 61 73 65 20 61 6e 64 20 6e 20 74  ust base and n t
16410 6f 20 73 6b 69 70 20 6f 76 65 72 20 53 51 4c 49  o skip over SQLI
16420 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 65 6e 74 72  TE_AFF_NONE entr
16430 69 65 73 20 61 74 20 74 68 65 20 62 65 67 69 6e  ies at the begin
16440 6e 69 6e 67 0a 20 20 2a 2a 20 61 6e 64 20 65 6e  ning.  ** and en
16450 64 20 6f 66 20 74 68 65 20 61 66 66 69 6e 69 74  d of the affinit
16460 79 20 73 74 72 69 6e 67 2e 0a 20 20 2a 2f 0a 20  y string..  */. 
16470 20 77 68 69 6c 65 28 20 6e 3e 30 20 26 26 20 7a   while( n>0 && z
16480 41 66 66 5b 30 5d 3d 3d 53 51 4c 49 54 45 5f 41  Aff[0]==SQLITE_A
16490 46 46 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 6e  FF_NONE ){.    n
164a0 2d 2d 3b 0a 20 20 20 20 62 61 73 65 2b 2b 3b 0a  --;.    base++;.
164b0 20 20 20 20 7a 41 66 66 2b 2b 3b 0a 20 20 7d 0a      zAff++;.  }.
164c0 20 20 77 68 69 6c 65 28 20 6e 3e 31 20 26 26 20    while( n>1 && 
164d0 7a 41 66 66 5b 6e 2d 31 5d 3d 3d 53 51 4c 49 54  zAff[n-1]==SQLIT
164e0 45 5f 41 46 46 5f 4e 4f 4e 45 20 29 7b 0a 20 20  E_AFF_NONE ){.  
164f0 20 20 6e 2d 2d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a    n--;.  }..  /*
16500 20 43 6f 64 65 20 74 68 65 20 4f 50 5f 41 66 66   Code the OP_Aff
16510 69 6e 69 74 79 20 6f 70 63 6f 64 65 20 69 66 20  inity opcode if 
16520 74 68 65 72 65 20 69 73 20 61 6e 79 74 68 69 6e  there is anythin
16530 67 20 6c 65 66 74 20 74 6f 20 64 6f 2e 20 2a 2f  g left to do. */
16540 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20  .  if( n>0 ){.  
16550 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
16560 4f 70 32 28 76 2c 20 4f 50 5f 41 66 66 69 6e 69  Op2(v, OP_Affini
16570 74 79 2c 20 62 61 73 65 2c 20 6e 29 3b 0a 20 20  ty, base, n);.  
16580 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
16590 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 7a 41 66  ngeP4(v, -1, zAf
165a0 66 2c 20 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74  f, n);.    sqlit
165b0 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e  e3ExprCacheAffin
165c0 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65  ityChange(pParse
165d0 2c 20 62 61 73 65 2c 20 6e 29 3b 0a 20 20 7d 0a  , base, n);.  }.
165e0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  }.../*.** Genera
165f0 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20 73 69  te code for a si
16600 6e 67 6c 65 20 65 71 75 61 6c 69 74 79 20 74 65  ngle equality te
16610 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  rm of the WHERE 
16620 63 6c 61 75 73 65 2e 20 20 41 6e 20 65 71 75 61  clause.  An equa
16630 6c 69 74 79 0a 2a 2a 20 74 65 72 6d 20 63 61 6e  lity.** term can
16640 20 62 65 20 65 69 74 68 65 72 20 58 3d 65 78 70   be either X=exp
16650 72 20 6f 72 20 58 20 49 4e 20 28 2e 2e 2e 29 2e  r or X IN (...).
16660 20 20 20 70 54 65 72 6d 20 69 73 20 74 68 65 20     pTerm is the 
16670 74 65 72 6d 20 74 6f 20 62 65 20 0a 2a 2a 20 63  term to be .** c
16680 6f 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  oded..**.** The 
16690 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 66 6f  current value fo
166a0 72 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74  r the constraint
166b0 20 69 73 20 6c 65 66 74 20 69 6e 20 72 65 67 69   is left in regi
166c0 73 74 65 72 20 69 52 65 67 2e 0a 2a 2a 0a 2a 2a  ster iReg..**.**
166d0 20 46 6f 72 20 61 20 63 6f 6e 73 74 72 61 69 6e   For a constrain
166e0 74 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 58 3d  t of the form X=
166f0 65 78 70 72 2c 20 74 68 65 20 65 78 70 72 65 73  expr, the expres
16700 73 69 6f 6e 20 69 73 20 65 76 61 6c 75 61 74 65  sion is evaluate
16710 64 20 61 6e 64 20 69 74 73 0a 2a 2a 20 72 65 73  d and its.** res
16720 75 6c 74 20 69 73 20 6c 65 66 74 20 6f 6e 20 74  ult is left on t
16730 68 65 20 73 74 61 63 6b 2e 20 20 46 6f 72 20 63  he stack.  For c
16740 6f 6e 73 74 72 61 69 6e 74 73 20 6f 66 20 74 68  onstraints of th
16750 65 20 66 6f 72 6d 20 58 20 49 4e 20 28 2e 2e 2e  e form X IN (...
16760 29 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  ).** this routin
16770 65 20 73 65 74 73 20 75 70 20 61 20 6c 6f 6f 70  e sets up a loop
16780 20 74 68 61 74 20 77 69 6c 6c 20 69 74 65 72 61   that will itera
16790 74 65 20 6f 76 65 72 20 61 6c 6c 20 76 61 6c 75  te over all valu
167a0 65 73 20 6f 66 20 58 2e 0a 2a 2f 0a 73 74 61 74  es of X..*/.stat
167b0 69 63 20 69 6e 74 20 63 6f 64 65 45 71 75 61 6c  ic int codeEqual
167c0 69 74 79 54 65 72 6d 28 0a 20 20 50 61 72 73 65  ityTerm(.  Parse
167d0 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f   *pParse,      /
167e0 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f  * The parsing co
167f0 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65  ntext */.  Where
16800 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 20 20 2f  Term *pTerm,   /
16810 2a 20 54 68 65 20 74 65 72 6d 20 6f 66 20 74 68  * The term of th
16820 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
16830 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20  o be coded */.  
16840 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76  WhereLevel *pLev
16850 65 6c 2c 20 2f 2a 20 54 68 65 20 6c 65 76 65 6c  el, /* The level
16860 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   of the FROM cla
16870 75 73 65 20 77 65 20 61 72 65 20 77 6f 72 6b 69  use we are worki
16880 6e 67 20 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  ng on */.  int i
16890 45 71 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  Eq,            /
168a0 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20 65  * Index of the e
168b0 71 75 61 6c 69 74 79 20 74 65 72 6d 20 77 69 74  quality term wit
168c0 68 69 6e 20 74 68 69 73 20 6c 65 76 65 6c 20 2a  hin this level *
168d0 2f 0a 20 20 69 6e 74 20 62 52 65 76 2c 20 20 20  /.  int bRev,   
168e0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
168f0 66 6f 72 20 72 65 76 65 72 73 65 2d 6f 72 64 65  for reverse-orde
16900 72 20 49 4e 20 6f 70 65 72 61 74 69 6f 6e 73 20  r IN operations 
16910 2a 2f 0a 20 20 69 6e 74 20 69 54 61 72 67 65 74  */.  int iTarget
16920 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74 74 65           /* Atte
16930 6d 70 74 20 74 6f 20 6c 65 61 76 65 20 72 65 73  mpt to leave res
16940 75 6c 74 73 20 69 6e 20 74 68 69 73 20 72 65 67  ults in this reg
16950 69 73 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 45 78  ister */.){.  Ex
16960 70 72 20 2a 70 58 20 3d 20 70 54 65 72 6d 2d 3e  pr *pX = pTerm->
16970 70 45 78 70 72 3b 0a 20 20 56 64 62 65 20 2a 76  pExpr;.  Vdbe *v
16980 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
16990 3b 0a 20 20 69 6e 74 20 69 52 65 67 3b 20 20 20  ;.  int iReg;   
169a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
169b0 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69  * Register holdi
169c0 6e 67 20 72 65 73 75 6c 74 73 20 2a 2f 0a 0a 20  ng results */.. 
169d0 20 61 73 73 65 72 74 28 20 69 54 61 72 67 65 74   assert( iTarget
169e0 3e 30 20 29 3b 0a 20 20 69 66 28 20 70 58 2d 3e  >0 );.  if( pX->
169f0 6f 70 3d 3d 54 4b 5f 45 51 20 29 7b 0a 20 20 20  op==TK_EQ ){.   
16a00 20 69 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45   iReg = sqlite3E
16a10 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50  xprCodeTarget(pP
16a20 61 72 73 65 2c 20 70 58 2d 3e 70 52 69 67 68 74  arse, pX->pRight
16a30 2c 20 69 54 61 72 67 65 74 29 3b 0a 20 20 7d 65  , iTarget);.  }e
16a40 6c 73 65 20 69 66 28 20 70 58 2d 3e 6f 70 3d 3d  lse if( pX->op==
16a50 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20  TK_ISNULL ){.   
16a60 20 69 52 65 67 20 3d 20 69 54 61 72 67 65 74 3b   iReg = iTarget;
16a70 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
16a80 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp2(v, OP_Nul
16a90 6c 2c 20 30 2c 20 69 52 65 67 29 3b 0a 23 69 66  l, 0, iReg);.#if
16aa0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
16ab0 5f 53 55 42 51 55 45 52 59 0a 20 20 7d 65 6c 73  _SUBQUERY.  }els
16ac0 65 7b 0a 20 20 20 20 69 6e 74 20 65 54 79 70 65  e{.    int eType
16ad0 3b 0a 20 20 20 20 69 6e 74 20 69 54 61 62 3b 0a  ;.    int iTab;.
16ae0 20 20 20 20 73 74 72 75 63 74 20 49 6e 4c 6f 6f      struct InLoo
16af0 70 20 2a 70 49 6e 3b 0a 20 20 20 20 57 68 65 72  p *pIn;.    Wher
16b00 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 20 3d 20 70  eLoop *pLoop = p
16b10 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 0a  Level->pWLoop;..
16b20 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e      if( (pLoop->
16b30 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
16b40 56 49 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30  VIRTUALTABLE)==0
16b50 0a 20 20 20 20 20 20 26 26 20 70 4c 6f 6f 70 2d  .      && pLoop-
16b60 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 21  >u.btree.pIndex!
16b70 3d 30 0a 20 20 20 20 20 20 26 26 20 70 4c 6f 6f  =0.      && pLoo
16b80 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
16b90 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 45  x->aSortOrder[iE
16ba0 71 5d 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  q].    ){.      
16bb0 74 65 73 74 63 61 73 65 28 20 69 45 71 3d 3d 30  testcase( iEq==0
16bc0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
16bd0 73 65 28 20 62 52 65 76 20 29 3b 0a 20 20 20 20  se( bRev );.    
16be0 20 20 62 52 65 76 20 3d 20 21 62 52 65 76 3b 0a    bRev = !bRev;.
16bf0 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
16c00 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20  ( pX->op==TK_IN 
16c10 29 3b 0a 20 20 20 20 69 52 65 67 20 3d 20 69 54  );.    iReg = iT
16c20 61 72 67 65 74 3b 0a 20 20 20 20 65 54 79 70 65  arget;.    eType
16c30 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e   = sqlite3FindIn
16c40 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 58  Index(pParse, pX
16c50 2c 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 2c  , IN_INDEX_LOOP,
16c60 20 30 29 3b 0a 20 20 20 20 69 66 28 20 65 54 79   0);.    if( eTy
16c70 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 49 4e 44  pe==IN_INDEX_IND
16c80 45 58 5f 44 45 53 43 20 29 7b 0a 20 20 20 20 20  EX_DESC ){.     
16c90 20 74 65 73 74 63 61 73 65 28 20 62 52 65 76 20   testcase( bRev 
16ca0 29 3b 0a 20 20 20 20 20 20 62 52 65 76 20 3d 20  );.      bRev = 
16cb0 21 62 52 65 76 3b 0a 20 20 20 20 7d 0a 20 20 20  !bRev;.    }.   
16cc0 20 69 54 61 62 20 3d 20 70 58 2d 3e 69 54 61 62   iTab = pX->iTab
16cd0 6c 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  le;.    sqlite3V
16ce0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 62 52 65  dbeAddOp2(v, bRe
16cf0 76 20 3f 20 4f 50 5f 4c 61 73 74 20 3a 20 4f 50  v ? OP_Last : OP
16d00 5f 52 65 77 69 6e 64 2c 20 69 54 61 62 2c 20 30  _Rewind, iTab, 0
16d10 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72  );.    VdbeCover
16d20 61 67 65 49 66 28 76 2c 20 62 52 65 76 29 3b 0a  ageIf(v, bRev);.
16d30 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
16d40 49 66 28 76 2c 20 21 62 52 65 76 29 3b 0a 20 20  If(v, !bRev);.  
16d50 20 20 61 73 73 65 72 74 28 20 28 70 4c 6f 6f 70    assert( (pLoop
16d60 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
16d70 45 5f 4d 55 4c 54 49 5f 4f 52 29 3d 3d 30 20 29  E_MULTI_OR)==0 )
16d80 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 77 73 46  ;.    pLoop->wsF
16d90 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 49 4e  lags |= WHERE_IN
16da0 5f 41 42 4c 45 3b 0a 20 20 20 20 69 66 28 20 70  _ABLE;.    if( p
16db0 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 3d  Level->u.in.nIn=
16dc0 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 4c 65 76  =0 ){.      pLev
16dd0 65 6c 2d 3e 61 64 64 72 4e 78 74 20 3d 20 73 71  el->addrNxt = sq
16de0 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
16df0 65 6c 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20  el(v);.    }.   
16e00 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49   pLevel->u.in.nI
16e10 6e 2b 2b 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  n++;.    pLevel-
16e20 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 20 3d 0a  >u.in.aInLoop =.
16e30 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62         sqlite3Db
16e40 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 70 50  ReallocOrFree(pP
16e50 61 72 73 65 2d 3e 64 62 2c 20 70 4c 65 76 65 6c  arse->db, pLevel
16e60 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 2c 0a  ->u.in.aInLoop,.
16e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69                si
16e90 7a 65 6f 66 28 70 4c 65 76 65 6c 2d 3e 75 2e 69  zeof(pLevel->u.i
16ea0 6e 2e 61 49 6e 4c 6f 6f 70 5b 30 5d 29 2a 70 4c  n.aInLoop[0])*pL
16eb0 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 29 3b  evel->u.in.nIn);
16ec0 0a 20 20 20 20 70 49 6e 20 3d 20 70 4c 65 76 65  .    pIn = pLeve
16ed0 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 3b  l->u.in.aInLoop;
16ee0 0a 20 20 20 20 69 66 28 20 70 49 6e 20 29 7b 0a  .    if( pIn ){.
16ef0 20 20 20 20 20 20 70 49 6e 20 2b 3d 20 70 4c 65        pIn += pLe
16f00 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 20 2d 20  vel->u.in.nIn - 
16f10 31 3b 0a 20 20 20 20 20 20 70 49 6e 2d 3e 69 43  1;.      pIn->iC
16f20 75 72 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 20  ur = iTab;.     
16f30 20 69 66 28 20 65 54 79 70 65 3d 3d 49 4e 5f 49   if( eType==IN_I
16f40 4e 44 45 58 5f 52 4f 57 49 44 20 29 7b 0a 20 20  NDEX_ROWID ){.  
16f50 20 20 20 20 20 20 70 49 6e 2d 3e 61 64 64 72 49        pIn->addrI
16f60 6e 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64  nTop = sqlite3Vd
16f70 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
16f80 6f 77 69 64 2c 20 69 54 61 62 2c 20 69 52 65 67  owid, iTab, iReg
16f90 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
16fa0 20 20 20 20 20 20 20 20 70 49 6e 2d 3e 61 64 64          pIn->add
16fb0 72 49 6e 54 6f 70 20 3d 20 73 71 6c 69 74 65 33  rInTop = sqlite3
16fc0 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
16fd0 5f 43 6f 6c 75 6d 6e 2c 20 69 54 61 62 2c 20 30  _Column, iTab, 0
16fe0 2c 20 69 52 65 67 29 3b 0a 20 20 20 20 20 20 7d  , iReg);.      }
16ff0 0a 20 20 20 20 20 20 70 49 6e 2d 3e 65 45 6e 64  .      pIn->eEnd
17000 4c 6f 6f 70 4f 70 20 3d 20 62 52 65 76 20 3f 20  LoopOp = bRev ? 
17010 4f 50 5f 50 72 65 76 49 66 4f 70 65 6e 20 3a 20  OP_PrevIfOpen : 
17020 4f 50 5f 4e 65 78 74 49 66 4f 70 65 6e 3b 0a 20  OP_NextIfOpen;. 
17030 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
17040 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 73 4e  AddOp1(v, OP_IsN
17050 75 6c 6c 2c 20 69 52 65 67 29 3b 20 56 64 62 65  ull, iReg); Vdbe
17060 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
17070 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c   }else{.      pL
17080 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 20 3d  evel->u.in.nIn =
17090 20 30 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66   0;.    }.#endif
170a0 0a 20 20 7d 0a 20 20 64 69 73 61 62 6c 65 54 65  .  }.  disableTe
170b0 72 6d 28 70 4c 65 76 65 6c 2c 20 70 54 65 72 6d  rm(pLevel, pTerm
170c0 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 52 65 67  );.  return iReg
170d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
170e0 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69  ate code that wi
170f0 6c 6c 20 65 76 61 6c 75 61 74 65 20 61 6c 6c 20  ll evaluate all 
17100 3d 3d 20 61 6e 64 20 49 4e 20 63 6f 6e 73 74 72  == and IN constr
17110 61 69 6e 74 73 20 66 6f 72 20 61 6e 0a 2a 2a 20  aints for an.** 
17120 69 6e 64 65 78 20 73 63 61 6e 2e 0a 2a 2a 0a 2a  index scan..**.*
17130 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 63  * For example, c
17140 6f 6e 73 69 64 65 72 20 74 61 62 6c 65 20 74 31  onsider table t1
17150 28 61 2c 62 2c 63 2c 64 2c 65 2c 66 29 20 77 69  (a,b,c,d,e,f) wi
17160 74 68 20 69 6e 64 65 78 20 69 31 28 61 2c 62 2c  th index i1(a,b,
17170 63 29 2e 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74  c)..** Suppose t
17180 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
17190 69 73 20 74 68 69 73 3a 20 20 61 3d 3d 35 20 41  is this:  a==5 A
171a0 4e 44 20 62 20 49 4e 20 28 31 2c 32 2c 33 29 20  ND b IN (1,2,3) 
171b0 41 4e 44 20 63 3e 35 20 41 4e 44 20 63 3c 31 30  AND c>5 AND c<10
171c0 0a 2a 2a 20 54 68 65 20 69 6e 64 65 78 20 68 61  .** The index ha
171d0 73 20 61 73 20 6d 61 6e 79 20 61 73 20 74 68 72  s as many as thr
171e0 65 65 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73  ee equality cons
171f0 74 72 61 69 6e 74 73 2c 20 62 75 74 20 69 6e 20  traints, but in 
17200 74 68 69 73 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c  this.** example,
17210 20 74 68 65 20 74 68 69 72 64 20 22 63 22 20 76   the third "c" v
17220 61 6c 75 65 20 69 73 20 61 6e 20 69 6e 65 71 75  alue is an inequ
17230 61 6c 69 74 79 2e 20 20 53 6f 20 6f 6e 6c 79 20  ality.  So only 
17240 74 77 6f 20 0a 2a 2a 20 63 6f 6e 73 74 72 61 69  two .** constrai
17250 6e 74 73 20 61 72 65 20 63 6f 64 65 64 2e 20 20  nts are coded.  
17260 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
17270 6c 20 67 65 6e 65 72 61 74 65 20 63 6f 64 65 20  l generate code 
17280 74 6f 20 65 76 61 6c 75 61 74 65 0a 2a 2a 20 61  to evaluate.** a
17290 3d 3d 35 20 61 6e 64 20 62 20 49 4e 20 28 31 2c  ==5 and b IN (1,
172a0 32 2c 33 29 2e 20 20 54 68 65 20 63 75 72 72 65  2,3).  The curre
172b0 6e 74 20 76 61 6c 75 65 73 20 66 6f 72 20 61 20  nt values for a 
172c0 61 6e 64 20 62 20 77 69 6c 6c 20 62 65 20 73 74  and b will be st
172d0 6f 72 65 64 0a 2a 2a 20 69 6e 20 63 6f 6e 73 65  ored.** in conse
172e0 63 75 74 69 76 65 20 72 65 67 69 73 74 65 72 73  cutive registers
172f0 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20 6f   and the index o
17300 66 20 74 68 65 20 66 69 72 73 74 20 72 65 67 69  f the first regi
17310 73 74 65 72 20 69 73 20 72 65 74 75 72 6e 65 64  ster is returned
17320 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 65  ..**.** In the e
17330 78 61 6d 70 6c 65 20 61 62 6f 76 65 20 6e 45 71  xample above nEq
17340 3d 3d 32 2e 20 20 42 75 74 20 74 68 69 73 20 73  ==2.  But this s
17350 75 62 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20  ubroutine works 
17360 66 6f 72 20 61 6e 79 20 76 61 6c 75 65 0a 2a 2a  for any value.**
17370 20 6f 66 20 6e 45 71 20 69 6e 63 6c 75 64 69 6e   of nEq includin
17380 67 20 30 2e 20 20 49 66 20 6e 45 71 3d 3d 30 2c  g 0.  If nEq==0,
17390 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
173a0 20 6e 65 61 72 6c 79 20 61 20 6e 6f 2d 6f 70 2e   nearly a no-op.
173b0 0a 2a 2a 20 54 68 65 20 6f 6e 6c 79 20 74 68 69  .** The only thi
173c0 6e 67 20 69 74 20 64 6f 65 73 20 69 73 20 61 6c  ng it does is al
173d0 6c 6f 63 61 74 65 20 74 68 65 20 70 4c 65 76 65  locate the pLeve
173e0 6c 2d 3e 69 4d 65 6d 20 6d 65 6d 6f 72 79 20 63  l->iMem memory c
173f0 65 6c 6c 20 61 6e 64 0a 2a 2a 20 63 6f 6d 70 75  ell and.** compu
17400 74 65 20 74 68 65 20 61 66 66 69 6e 69 74 79 20  te the affinity 
17410 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  string..**.** Th
17420 65 20 6e 45 78 74 72 61 52 65 67 20 70 61 72 61  e nExtraReg para
17430 6d 65 74 65 72 20 69 73 20 30 20 6f 72 20 31 2e  meter is 0 or 1.
17440 20 20 49 74 20 69 73 20 30 20 69 66 20 61 6c 6c    It is 0 if all
17450 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f   WHERE clause co
17460 6e 73 74 72 61 69 6e 74 73 0a 2a 2a 20 61 72 65  nstraints.** are
17470 20 3d 3d 20 6f 72 20 49 4e 20 61 6e 64 20 61 72   == or IN and ar
17480 65 20 63 6f 76 65 72 65 64 20 62 79 20 74 68 65  e covered by the
17490 20 6e 45 71 2e 20 20 6e 45 78 74 72 61 52 65 67   nEq.  nExtraReg
174a0 20 69 73 20 31 20 69 66 20 74 68 65 72 65 20 69   is 1 if there i
174b0 73 0a 2a 2a 20 61 6e 20 69 6e 65 71 75 61 6c 69  s.** an inequali
174c0 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 28 73  ty constraint (s
174d0 75 63 68 20 61 73 20 74 68 65 20 22 63 3e 3d 35  uch as the "c>=5
174e0 20 41 4e 44 20 63 3c 31 30 22 20 69 6e 20 74 68   AND c<10" in th
174f0 65 20 65 78 61 6d 70 6c 65 29 20 74 68 61 74 0a  e example) that.
17500 2a 2a 20 6f 63 63 75 72 73 20 61 66 74 65 72 20  ** occurs after 
17510 74 68 65 20 6e 45 71 20 71 75 61 6c 69 74 79 20  the nEq quality 
17520 63 6f 6e 73 74 72 61 69 6e 74 73 2e 0a 2a 2a 0a  constraints..**.
17530 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
17540 61 6c 6c 6f 63 61 74 65 73 20 61 20 72 61 6e 67  allocates a rang
17550 65 20 6f 66 20 6e 45 71 2b 6e 45 78 74 72 61 52  e of nEq+nExtraR
17560 65 67 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20  eg memory cells 
17570 61 6e 64 20 72 65 74 75 72 6e 73 0a 2a 2a 20 74  and returns.** t
17580 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20  he index of the 
17590 66 69 72 73 74 20 6d 65 6d 6f 72 79 20 63 65 6c  first memory cel
175a0 6c 20 69 6e 20 74 68 61 74 20 72 61 6e 67 65 2e  l in that range.
175b0 20 54 68 65 20 63 6f 64 65 20 74 68 61 74 0a 2a   The code that.*
175c0 2a 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75  * calls this rou
175d0 74 69 6e 65 20 77 69 6c 6c 20 75 73 65 20 74 68  tine will use th
175e0 61 74 20 6d 65 6d 6f 72 79 20 72 61 6e 67 65 20  at memory range 
175f0 74 6f 20 73 74 6f 72 65 20 6b 65 79 73 20 66 6f  to store keys fo
17600 72 0a 2a 2a 20 73 74 61 72 74 20 61 6e 64 20 74  r.** start and t
17610 65 72 6d 69 6e 61 74 69 6f 6e 20 63 6f 6e 64 69  ermination condi
17620 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 6c 6f 6f  tions of the loo
17630 70 2e 0a 2a 2a 20 6b 65 79 20 76 61 6c 75 65 20  p..** key value 
17640 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20 20 49 66  of the loop.  If
17650 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 49 4e 20   one or more IN 
17660 6f 70 65 72 61 74 6f 72 73 20 61 70 70 65 61 72  operators appear
17670 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72  , then.** this r
17680 6f 75 74 69 6e 65 20 61 6c 6c 6f 63 61 74 65 73  outine allocates
17690 20 61 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20 6e   an additional n
176a0 45 71 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20  Eq memory cells 
176b0 66 6f 72 20 69 6e 74 65 72 6e 61 6c 0a 2a 2a 20  for internal.** 
176c0 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72  use..**.** Befor
176d0 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 2a 70 7a  e returning, *pz
176e0 41 66 66 20 69 73 20 73 65 74 20 74 6f 20 70 6f  Aff is set to po
176f0 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72 20  int to a buffer 
17700 63 6f 6e 74 61 69 6e 69 6e 67 20 61 0a 2a 2a 20  containing a.** 
17710 63 6f 70 79 20 6f 66 20 74 68 65 20 63 6f 6c 75  copy of the colu
17720 6d 6e 20 61 66 66 69 6e 69 74 79 20 73 74 72 69  mn affinity stri
17730 6e 67 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  ng of the index 
17740 61 6c 6c 6f 63 61 74 65 64 20 75 73 69 6e 67 0a  allocated using.
17750 2a 2a 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c  ** sqlite3DbMall
17760 6f 63 28 29 2e 20 45 78 63 65 70 74 2c 20 65 6e  oc(). Except, en
17770 74 72 69 65 73 20 69 6e 20 74 68 65 20 63 6f 70  tries in the cop
17780 79 20 6f 66 20 74 68 65 20 73 74 72 69 6e 67 20  y of the string 
17790 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69  associated.** wi
177a0 74 68 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73  th equality cons
177b0 74 72 61 69 6e 74 73 20 74 68 61 74 20 75 73 65  traints that use
177c0 20 4e 4f 4e 45 20 61 66 66 69 6e 69 74 79 20 61   NONE affinity a
177d0 72 65 20 73 65 74 20 74 6f 0a 2a 2a 20 53 51 4c  re set to.** SQL
177e0 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 2e 20 54 68  ITE_AFF_NONE. Th
177f0 69 73 20 69 73 20 74 6f 20 64 65 61 6c 20 77 69  is is to deal wi
17800 74 68 20 53 51 4c 20 73 75 63 68 20 61 73 20 74  th SQL such as t
17810 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a  he following:.**
17820 0a 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41 42  .**   CREATE TAB
17830 4c 45 20 74 31 28 61 20 54 45 58 54 20 50 52 49  LE t1(a TEXT PRI
17840 4d 41 52 59 20 4b 45 59 2c 20 62 29 3b 0a 2a 2a  MARY KEY, b);.**
17850 20 20 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52     SELECT ... FR
17860 4f 4d 20 74 31 20 41 53 20 74 32 2c 20 74 31 20  OM t1 AS t2, t1 
17870 57 48 45 52 45 20 74 31 2e 61 20 3d 20 74 32 2e  WHERE t1.a = t2.
17880 62 3b 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20  b;.**.** In the 
17890 65 78 61 6d 70 6c 65 20 61 62 6f 76 65 2c 20 74  example above, t
178a0 68 65 20 69 6e 64 65 78 20 6f 6e 20 74 31 28 61  he index on t1(a
178b0 29 20 68 61 73 20 54 45 58 54 20 61 66 66 69 6e  ) has TEXT affin
178c0 69 74 79 2e 20 42 75 74 20 73 69 6e 63 65 0a 2a  ity. But since.*
178d0 2a 20 74 68 65 20 72 69 67 68 74 20 68 61 6e 64  * the right hand
178e0 20 73 69 64 65 20 6f 66 20 74 68 65 20 65 71 75   side of the equ
178f0 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
17900 20 28 74 32 2e 62 29 20 68 61 73 20 4e 4f 4e 45   (t2.b) has NONE
17910 20 61 66 66 69 6e 69 74 79 2c 0a 2a 2a 20 6e 6f   affinity,.** no
17920 20 63 6f 6e 76 65 72 73 69 6f 6e 20 73 68 6f 75   conversion shou
17930 6c 64 20 62 65 20 61 74 74 65 6d 70 74 65 64 20  ld be attempted 
17940 62 65 66 6f 72 65 20 75 73 69 6e 67 20 61 20 74  before using a t
17950 32 2e 62 20 76 61 6c 75 65 20 61 73 20 70 61 72  2.b value as par
17960 74 20 6f 66 0a 2a 2a 20 61 20 6b 65 79 20 74 6f  t of.** a key to
17970 20 73 65 61 72 63 68 20 74 68 65 20 69 6e 64 65   search the inde
17980 78 2e 20 48 65 6e 63 65 20 74 68 65 20 66 69 72  x. Hence the fir
17990 73 74 20 62 79 74 65 20 69 6e 20 74 68 65 20 72  st byte in the r
179a0 65 74 75 72 6e 65 64 20 61 66 66 69 6e 69 74 79  eturned affinity
179b0 0a 2a 2a 20 73 74 72 69 6e 67 20 69 6e 20 74 68  .** string in th
179c0 69 73 20 65 78 61 6d 70 6c 65 20 77 6f 75 6c 64  is example would
179d0 20 62 65 20 73 65 74 20 74 6f 20 53 51 4c 49 54   be set to SQLIT
179e0 45 5f 41 46 46 5f 4e 4f 4e 45 2e 0a 2a 2f 0a 73  E_AFF_NONE..*/.s
179f0 74 61 74 69 63 20 69 6e 74 20 63 6f 64 65 41 6c  tatic int codeAl
17a00 6c 45 71 75 61 6c 69 74 79 54 65 72 6d 73 28 0a  lEqualityTerms(.
17a10 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
17a20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
17a30 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
17a40 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76  WhereLevel *pLev
17a50 65 6c 2c 20 20 20 2f 2a 20 57 68 69 63 68 20 6e  el,   /* Which n
17a60 65 73 74 65 64 20 6c 6f 6f 70 20 6f 66 20 74 68  ested loop of th
17a70 65 20 46 52 4f 4d 20 77 65 20 61 72 65 20 63 6f  e FROM we are co
17a80 64 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 62 52  ding */.  int bR
17a90 65 76 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ev,             
17aa0 2f 2a 20 52 65 76 65 72 73 65 20 74 68 65 20 6f  /* Reverse the o
17ab0 72 64 65 72 20 6f 66 20 49 4e 20 6f 70 65 72 61  rder of IN opera
17ac0 74 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 45  tors */.  int nE
17ad0 78 74 72 61 52 65 67 2c 20 20 20 20 20 20 20 20  xtraReg,        
17ae0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 78 74  /* Number of ext
17af0 72 61 20 72 65 67 69 73 74 65 72 73 20 74 6f 20  ra registers to 
17b00 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 63 68  allocate */.  ch
17b10 61 72 20 2a 2a 70 7a 41 66 66 20 20 20 20 20 20  ar **pzAff      
17b20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 65 74 20      /* OUT: Set 
17b30 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 66 66 69  to point to affi
17b40 6e 69 74 79 20 73 74 72 69 6e 67 20 2a 2f 0a 29  nity string */.)
17b50 7b 0a 20 20 75 31 36 20 6e 45 71 3b 20 20 20 20  {.  u16 nEq;    
17b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17b70 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20    /* The number 
17b80 6f 66 20 3d 3d 20 6f 72 20 49 4e 20 63 6f 6e 73  of == or IN cons
17b90 74 72 61 69 6e 74 73 20 74 6f 20 63 6f 64 65 20  traints to code 
17ba0 2a 2f 0a 20 20 75 31 36 20 6e 53 6b 69 70 3b 20  */.  u16 nSkip; 
17bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17bc0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
17bd0 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e  left-most column
17be0 73 20 74 6f 20 73 6b 69 70 20 2a 2f 0a 20 20 56  s to skip */.  V
17bf0 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
17c00 3e 70 56 64 62 65 3b 20 20 20 20 20 20 2f 2a 20  >pVdbe;      /* 
17c10 54 68 65 20 76 6d 20 75 6e 64 65 72 20 63 6f 6e  The vm under con
17c20 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 49  struction */.  I
17c30 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20  ndex *pIdx;     
17c40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17c50 54 68 65 20 69 6e 64 65 78 20 62 65 69 6e 67 20  The index being 
17c60 75 73 65 64 20 66 6f 72 20 74 68 69 73 20 6c 6f  used for this lo
17c70 6f 70 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  op */.  WhereTer
17c80 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20  m *pTerm;       
17c90 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c        /* A singl
17ca0 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 65 72  e constraint ter
17cb0 6d 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70  m */.  WhereLoop
17cc0 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20   *pLoop;        
17cd0 20 20 20 20 20 2f 2a 20 54 68 65 20 57 68 65 72       /* The Wher
17ce0 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 2a 2f 0a  eLoop object */.
17cf0 20 20 69 6e 74 20 6a 3b 20 20 20 20 20 20 20 20    int j;        
17d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17d10 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
17d20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 42 61 73 65  */.  int regBase
17d30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
17d40 20 20 20 2f 2a 20 42 61 73 65 20 72 65 67 69 73     /* Base regis
17d50 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65  ter */.  int nRe
17d60 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g;              
17d70 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
17d80 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 74 6f   of registers to
17d90 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 63   allocate */.  c
17da0 68 61 72 20 2a 7a 41 66 66 3b 20 20 20 20 20 20  har *zAff;      
17db0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17dc0 41 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20  Affinity string 
17dd0 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 0a 20 20  to return */..  
17de0 2f 2a 20 54 68 69 73 20 6d 6f 64 75 6c 65 20 69  /* This module i
17df0 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 6f 6e  s only called on
17e00 20 71 75 65 72 79 20 70 6c 61 6e 73 20 74 68 61   query plans tha
17e10 74 20 75 73 65 20 61 6e 20 69 6e 64 65 78 2e 20  t use an index. 
17e20 2a 2f 0a 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65  */.  pLoop = pLe
17e30 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 61  vel->pWLoop;.  a
17e40 73 73 65 72 74 28 20 28 70 4c 6f 6f 70 2d 3e 77  ssert( (pLoop->w
17e50 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56  sFlags & WHERE_V
17e60 49 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30 20  IRTUALTABLE)==0 
17e70 29 3b 0a 20 20 6e 45 71 20 3d 20 70 4c 6f 6f 70  );.  nEq = pLoop
17e80 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20  ->u.btree.nEq;. 
17e90 20 6e 53 6b 69 70 20 3d 20 70 4c 6f 6f 70 2d 3e   nSkip = pLoop->
17ea0 6e 53 6b 69 70 3b 0a 20 20 70 49 64 78 20 3d 20  nSkip;.  pIdx = 
17eb0 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70  pLoop->u.btree.p
17ec0 49 6e 64 65 78 3b 0a 20 20 61 73 73 65 72 74 28  Index;.  assert(
17ed0 20 70 49 64 78 21 3d 30 20 29 3b 0a 0a 20 20 2f   pIdx!=0 );..  /
17ee0 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77  * Figure out how
17ef0 20 6d 61 6e 79 20 6d 65 6d 6f 72 79 20 63 65 6c   many memory cel
17f00 6c 73 20 77 65 20 77 69 6c 6c 20 6e 65 65 64 20  ls we will need 
17f10 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65 20 74 68  then allocate th
17f20 65 6d 2e 0a 20 20 2a 2f 0a 20 20 72 65 67 42 61  em..  */.  regBa
17f30 73 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  se = pParse->nMe
17f40 6d 20 2b 20 31 3b 0a 20 20 6e 52 65 67 20 3d 20  m + 1;.  nReg = 
17f50 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e  pLoop->u.btree.n
17f60 45 71 20 2b 20 6e 45 78 74 72 61 52 65 67 3b 0a  Eq + nExtraReg;.
17f70 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
17f80 3d 20 6e 52 65 67 3b 0a 0a 20 20 7a 41 66 66 20  = nReg;..  zAff 
17f90 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
17fa0 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 73 71  p(pParse->db, sq
17fb0 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e 69  lite3IndexAffini
17fc0 74 79 53 74 72 28 76 2c 20 70 49 64 78 29 29 3b  tyStr(v, pIdx));
17fd0 0a 20 20 69 66 28 20 21 7a 41 66 66 20 29 7b 0a  .  if( !zAff ){.
17fe0 20 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e      pParse->db->
17ff0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31  mallocFailed = 1
18000 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6e 53 6b  ;.  }..  if( nSk
18010 69 70 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 49  ip ){.    int iI
18020 64 78 43 75 72 20 3d 20 70 4c 65 76 65 6c 2d 3e  dxCur = pLevel->
18030 69 49 64 78 43 75 72 3b 0a 20 20 20 20 73 71 6c  iIdxCur;.    sql
18040 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
18050 2c 20 28 62 52 65 76 3f 4f 50 5f 4c 61 73 74 3a  , (bRev?OP_Last:
18060 4f 50 5f 52 65 77 69 6e 64 29 2c 20 69 49 64 78  OP_Rewind), iIdx
18070 43 75 72 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  Cur);.    VdbeCo
18080 76 65 72 61 67 65 49 66 28 76 2c 20 62 52 65 76  verageIf(v, bRev
18090 3d 3d 30 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  ==0);.    VdbeCo
180a0 76 65 72 61 67 65 49 66 28 76 2c 20 62 52 65 76  verageIf(v, bRev
180b0 21 3d 30 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  !=0);.    VdbeCo
180c0 6d 6d 65 6e 74 28 28 76 2c 20 22 62 65 67 69 6e  mment((v, "begin
180d0 20 73 6b 69 70 2d 73 63 61 6e 20 6f 6e 20 25 73   skip-scan on %s
180e0 22 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 29  ", pIdx->zName))
180f0 3b 0a 20 20 20 20 6a 20 3d 20 73 71 6c 69 74 65  ;.    j = sqlite
18100 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f  3VdbeAddOp0(v, O
18110 50 5f 47 6f 74 6f 29 3b 0a 20 20 20 20 70 4c 65  P_Goto);.    pLe
18120 76 65 6c 2d 3e 61 64 64 72 53 6b 69 70 20 3d 20  vel->addrSkip = 
18130 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
18140 34 49 6e 74 28 76 2c 20 28 62 52 65 76 3f 4f 50  4Int(v, (bRev?OP
18150 5f 53 65 65 6b 4c 54 3a 4f 50 5f 53 65 65 6b 47  _SeekLT:OP_SeekG
18160 54 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  T),.            
18170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18180 69 49 64 78 43 75 72 2c 20 30 2c 20 72 65 67 42  iIdxCur, 0, regB
18190 61 73 65 2c 20 6e 53 6b 69 70 29 3b 0a 20 20 20  ase, nSkip);.   
181a0 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
181b0 76 2c 20 62 52 65 76 3d 3d 30 29 3b 0a 20 20 20  v, bRev==0);.   
181c0 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
181d0 76 2c 20 62 52 65 76 21 3d 30 29 3b 0a 20 20 20  v, bRev!=0);.   
181e0 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
181f0 48 65 72 65 28 76 2c 20 6a 29 3b 0a 20 20 20 20  Here(v, j);.    
18200 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 53 6b 69 70  for(j=0; j<nSkip
18210 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71  ; j++){.      sq
18220 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
18230 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 49  v, OP_Column, iI
18240 64 78 43 75 72 2c 20 6a 2c 20 72 65 67 42 61 73  dxCur, j, regBas
18250 65 2b 6a 29 3b 0a 20 20 20 20 20 20 61 73 73 65  e+j);.      asse
18260 72 74 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  rt( pIdx->aiColu
18270 6d 6e 5b 6a 5d 3e 3d 30 20 29 3b 0a 20 20 20 20  mn[j]>=0 );.    
18280 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
18290 2c 20 22 25 73 22 2c 20 70 49 64 78 2d 3e 70 54  , "%s", pIdx->pT
182a0 61 62 6c 65 2d 3e 61 43 6f 6c 5b 70 49 64 78 2d  able->aCol[pIdx-
182b0 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 5d 2e 7a 4e  >aiColumn[j]].zN
182c0 61 6d 65 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ame));.    }.  }
182d0 20 20 20 20 0a 0a 20 20 2f 2a 20 45 76 61 6c 75      ..  /* Evalu
182e0 61 74 65 20 74 68 65 20 65 71 75 61 6c 69 74 79  ate the equality
182f0 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a   constraints.  *
18300 2f 0a 20 20 61 73 73 65 72 74 28 20 7a 41 66 66  /.  assert( zAff
18310 3d 3d 30 20 7c 7c 20 28 69 6e 74 29 73 74 72 6c  ==0 || (int)strl
18320 65 6e 28 7a 41 66 66 29 3e 3d 6e 45 71 20 29 3b  en(zAff)>=nEq );
18330 0a 20 20 66 6f 72 28 6a 3d 6e 53 6b 69 70 3b 20  .  for(j=nSkip; 
18340 6a 3c 6e 45 71 3b 20 6a 2b 2b 29 7b 0a 20 20 20  j<nEq; j++){.   
18350 20 69 6e 74 20 72 31 3b 0a 20 20 20 20 70 54 65   int r1;.    pTe
18360 72 6d 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65  rm = pLoop->aLTe
18370 72 6d 5b 6a 5d 3b 0a 20 20 20 20 61 73 73 65 72  rm[j];.    asser
18380 74 28 20 70 54 65 72 6d 21 3d 30 20 29 3b 0a 20  t( pTerm!=0 );. 
18390 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77     /* The follow
183a0 69 6e 67 20 74 65 73 74 63 61 73 65 20 69 73 20  ing testcase is 
183b0 74 72 75 65 20 66 6f 72 20 69 6e 64 69 63 65 73  true for indices
183c0 20 77 69 74 68 20 72 65 64 75 6e 64 61 6e 74 20   with redundant 
183d0 63 6f 6c 75 6d 6e 73 2e 20 0a 20 20 20 20 2a 2a  columns. .    **
183e0 20 45 78 3a 20 43 52 45 41 54 45 20 49 4e 44 45   Ex: CREATE INDE
183f0 58 20 69 31 20 4f 4e 20 74 31 28 61 2c 62 2c 61  X i1 ON t1(a,b,a
18400 29 3b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  ); SELECT * FROM
18410 20 74 31 20 57 48 45 52 45 20 61 3d 30 20 41 4e   t1 WHERE a=0 AN
18420 44 20 62 3d 30 3b 20 2a 2f 0a 20 20 20 20 74 65  D b=0; */.    te
18430 73 74 63 61 73 65 28 20 28 70 54 65 72 6d 2d 3e  stcase( (pTerm->
18440 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 43  wtFlags & TERM_C
18450 4f 44 45 44 29 21 3d 30 20 29 3b 0a 20 20 20 20  ODED)!=0 );.    
18460 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
18470 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
18480 56 49 52 54 55 41 4c 20 29 3b 0a 20 20 20 20 72  VIRTUAL );.    r
18490 31 20 3d 20 63 6f 64 65 45 71 75 61 6c 69 74 79  1 = codeEquality
184a0 54 65 72 6d 28 70 50 61 72 73 65 2c 20 70 54 65  Term(pParse, pTe
184b0 72 6d 2c 20 70 4c 65 76 65 6c 2c 20 6a 2c 20 62  rm, pLevel, j, b
184c0 52 65 76 2c 20 72 65 67 42 61 73 65 2b 6a 29 3b  Rev, regBase+j);
184d0 0a 20 20 20 20 69 66 28 20 72 31 21 3d 72 65 67  .    if( r1!=reg
184e0 42 61 73 65 2b 6a 20 29 7b 0a 20 20 20 20 20 20  Base+j ){.      
184f0 69 66 28 20 6e 52 65 67 3d 3d 31 20 29 7b 0a 20  if( nReg==1 ){. 
18500 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65         sqlite3Re
18510 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
18520 72 73 65 2c 20 72 65 67 42 61 73 65 29 3b 0a 20  rse, regBase);. 
18530 20 20 20 20 20 20 20 72 65 67 42 61 73 65 20 3d         regBase =
18540 20 72 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   r1;.      }else
18550 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
18560 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
18570 50 5f 53 43 6f 70 79 2c 20 72 31 2c 20 72 65 67  P_SCopy, r1, reg
18580 42 61 73 65 2b 6a 29 3b 0a 20 20 20 20 20 20 7d  Base+j);.      }
18590 0a 20 20 20 20 7d 0a 20 20 20 20 74 65 73 74 63  .    }.    testc
185a0 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65  ase( pTerm->eOpe
185b0 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 4e 55 4c  rator & WO_ISNUL
185c0 4c 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  L );.    testcas
185d0 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  e( pTerm->eOpera
185e0 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20  tor & WO_IN );. 
185f0 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65     if( (pTerm->e
18600 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 49  Operator & (WO_I
18610 53 4e 55 4c 4c 7c 57 4f 5f 49 4e 29 29 3d 3d 30  SNULL|WO_IN))==0
18620 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a   ){.      Expr *
18630 70 52 69 67 68 74 20 3d 20 70 54 65 72 6d 2d 3e  pRight = pTerm->
18640 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20  pExpr->pRight;. 
18650 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
18660 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28 70 52  ExprCanBeNull(pR
18670 69 67 68 74 29 20 29 7b 0a 20 20 20 20 20 20 20  ight) ){.       
18680 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
18690 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c  p2(v, OP_IsNull,
186a0 20 72 65 67 42 61 73 65 2b 6a 2c 20 70 4c 65 76   regBase+j, pLev
186b0 65 6c 2d 3e 61 64 64 72 42 72 6b 29 3b 0a 20 20  el->addrBrk);.  
186c0 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
186d0 67 65 28 76 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ge(v);.      }. 
186e0 20 20 20 20 20 69 66 28 20 7a 41 66 66 20 29 7b       if( zAff ){
186f0 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
18700 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e  ite3CompareAffin
18710 69 74 79 28 70 52 69 67 68 74 2c 20 7a 41 66 66  ity(pRight, zAff
18720 5b 6a 5d 29 3d 3d 53 51 4c 49 54 45 5f 41 46 46  [j])==SQLITE_AFF
18730 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20  _NONE ){.       
18740 20 20 20 7a 41 66 66 5b 6a 5d 20 3d 20 53 51 4c     zAff[j] = SQL
18750 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20  ITE_AFF_NONE;.  
18760 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
18770 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 4e  if( sqlite3ExprN
18780 65 65 64 73 4e 6f 41 66 66 69 6e 69 74 79 43 68  eedsNoAffinityCh
18790 61 6e 67 65 28 70 52 69 67 68 74 2c 20 7a 41 66  ange(pRight, zAf
187a0 66 5b 6a 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  f[j]) ){.       
187b0 20 20 20 7a 41 66 66 5b 6a 5d 20 3d 20 53 51 4c     zAff[j] = SQL
187c0 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20  ITE_AFF_NONE;.  
187d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
187e0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 7a 41      }.  }.  *pzA
187f0 66 66 20 3d 20 7a 41 66 66 3b 0a 20 20 72 65 74  ff = zAff;.  ret
18800 75 72 6e 20 72 65 67 42 61 73 65 3b 0a 7d 0a 0a  urn regBase;.}..
18810 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
18820 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a  MIT_EXPLAIN./*.*
18830 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
18840 73 20 61 20 68 65 6c 70 65 72 20 66 6f 72 20 65  s a helper for e
18850 78 70 6c 61 69 6e 49 6e 64 65 78 52 61 6e 67 65  xplainIndexRange
18860 28 29 20 62 65 6c 6f 77 0a 2a 2a 0a 2a 2a 20 70  () below.**.** p
18870 53 74 72 20 68 6f 6c 64 73 20 74 68 65 20 74 65  Str holds the te
18880 78 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73  xt of an express
18890 69 6f 6e 20 74 68 61 74 20 77 65 20 61 72 65 20  ion that we are 
188a0 62 75 69 6c 64 69 6e 67 20 75 70 20 6f 6e 65 20  building up one 
188b0 74 65 72 6d 0a 2a 2a 20 61 74 20 61 20 74 69 6d  term.** at a tim
188c0 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
188d0 20 61 64 64 73 20 61 20 6e 65 77 20 74 65 72 6d   adds a new term
188e0 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74   to the end of t
188f0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a  he expression..*
18900 2a 20 54 65 72 6d 73 20 61 72 65 20 73 65 70 61  * Terms are sepa
18910 72 61 74 65 64 20 62 79 20 41 4e 44 20 73 6f 20  rated by AND so 
18920 61 64 64 20 74 68 65 20 22 41 4e 44 22 20 74 65  add the "AND" te
18930 78 74 20 66 6f 72 20 73 65 63 6f 6e 64 20 61 6e  xt for second an
18940 64 20 73 75 62 73 65 71 75 65 6e 74 0a 2a 2a 20  d subsequent.** 
18950 74 65 72 6d 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73  terms only..*/.s
18960 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 6c 61  tatic void expla
18970 69 6e 41 70 70 65 6e 64 54 65 72 6d 28 0a 20 20  inAppendTerm(.  
18980 53 74 72 41 63 63 75 6d 20 2a 70 53 74 72 2c 20  StrAccum *pStr, 
18990 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
189a0 68 65 20 74 65 78 74 20 65 78 70 72 65 73 73 69  he text expressi
189b0 6f 6e 20 62 65 69 6e 67 20 62 75 69 6c 74 20 2a  on being built *
189c0 2f 0a 20 20 69 6e 74 20 69 54 65 72 6d 2c 20 20  /.  int iTerm,  
189d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
189e0 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 69 73  /* Index of this
189f0 20 74 65 72 6d 2e 20 20 46 69 72 73 74 20 69 73   term.  First is
18a00 20 7a 65 72 6f 20 2a 2f 0a 20 20 63 6f 6e 73 74   zero */.  const
18a10 20 63 68 61 72 20 2a 7a 43 6f 6c 75 6d 6e 2c 20   char *zColumn, 
18a20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
18a30 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a  f the column */.
18a40 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f    const char *zO
18a50 70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p             /*
18a60 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f 70 65   Name of the ope
18a70 72 61 74 6f 72 20 2a 2f 0a 29 7b 0a 20 20 69 66  rator */.){.  if
18a80 28 20 69 54 65 72 6d 20 29 20 73 71 6c 69 74 65  ( iTerm ) sqlite
18a90 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28  3StrAccumAppend(
18aa0 70 53 74 72 2c 20 22 20 41 4e 44 20 22 2c 20 35  pStr, " AND ", 5
18ab0 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41  );.  sqlite3StrA
18ac0 63 63 75 6d 41 70 70 65 6e 64 41 6c 6c 28 70 53  ccumAppendAll(pS
18ad0 74 72 2c 20 7a 43 6f 6c 75 6d 6e 29 3b 0a 20 20  tr, zColumn);.  
18ae0 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41  sqlite3StrAccumA
18af0 70 70 65 6e 64 28 70 53 74 72 2c 20 7a 4f 70 2c  ppend(pStr, zOp,
18b00 20 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 74   1);.  sqlite3St
18b10 72 41 63 63 75 6d 41 70 70 65 6e 64 28 70 53 74  rAccumAppend(pSt
18b20 72 2c 20 22 3f 22 2c 20 31 29 3b 0a 7d 0a 0a 2f  r, "?", 1);.}../
18b30 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 4c  *.** Argument pL
18b40 65 76 65 6c 20 64 65 73 63 72 69 62 65 73 20 61  evel describes a
18b50 20 73 74 72 61 74 65 67 79 20 66 6f 72 20 73 63   strategy for sc
18b60 61 6e 6e 69 6e 67 20 74 61 62 6c 65 20 70 54 61  anning table pTa
18b70 62 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63  b. This .** func
18b80 74 69 6f 6e 20 61 70 70 65 6e 64 73 20 74 65 78  tion appends tex
18b90 74 20 74 6f 20 70 53 74 72 20 74 68 61 74 20 64  t to pStr that d
18ba0 65 73 63 72 69 62 65 73 20 74 68 65 20 73 75 62  escribes the sub
18bb0 73 65 74 20 6f 66 20 74 61 62 6c 65 0a 2a 2a 20  set of table.** 
18bc0 72 6f 77 73 20 73 63 61 6e 6e 65 64 20 62 79 20  rows scanned by 
18bd0 74 68 65 20 73 74 72 61 74 65 67 79 20 69 6e 20  the strategy in 
18be0 74 68 65 20 66 6f 72 6d 20 6f 66 20 61 6e 20 53  the form of an S
18bf0 51 4c 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a  QL expression..*
18c00 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65  *.** For example
18c10 2c 20 69 66 20 74 68 65 20 71 75 65 72 79 3a 0a  , if the query:.
18c20 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a  **.**   SELECT *
18c30 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61   FROM t1 WHERE a
18c40 3d 31 20 41 4e 44 20 62 3e 32 3b 0a 2a 2a 0a 2a  =1 AND b>2;.**.*
18c50 2a 20 69 73 20 72 75 6e 20 61 6e 64 20 74 68 65  * is run and the
18c60 72 65 20 69 73 20 61 6e 20 69 6e 64 65 78 20 6f  re is an index o
18c70 6e 20 28 61 2c 20 62 29 2c 20 74 68 65 6e 20 74  n (a, b), then t
18c80 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
18c90 75 72 6e 73 20 61 0a 2a 2a 20 73 74 72 69 6e 67  urns a.** string
18ca0 20 73 69 6d 69 6c 61 72 20 74 6f 3a 0a 2a 2a 0a   similar to:.**.
18cb0 2a 2a 20 20 20 22 61 3d 3f 20 41 4e 44 20 62 3e  **   "a=? AND b>
18cc0 3f 22 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ?".*/.static voi
18cd0 64 20 65 78 70 6c 61 69 6e 49 6e 64 65 78 52 61  d explainIndexRa
18ce0 6e 67 65 28 53 74 72 41 63 63 75 6d 20 2a 70 53  nge(StrAccum *pS
18cf0 74 72 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  tr, WhereLoop *p
18d00 4c 6f 6f 70 2c 20 54 61 62 6c 65 20 2a 70 54 61  Loop, Table *pTa
18d10 62 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e  b){.  Index *pIn
18d20 64 65 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62  dex = pLoop->u.b
18d30 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 75  tree.pIndex;.  u
18d40 31 36 20 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e  16 nEq = pLoop->
18d50 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20 75  u.btree.nEq;.  u
18d60 31 36 20 6e 53 6b 69 70 20 3d 20 70 4c 6f 6f 70  16 nSkip = pLoop
18d70 2d 3e 6e 53 6b 69 70 3b 0a 20 20 69 6e 74 20 69  ->nSkip;.  int i
18d80 2c 20 6a 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 61  , j;.  Column *a
18d90 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c  Col = pTab->aCol
18da0 3b 0a 20 20 69 31 36 20 2a 61 69 43 6f 6c 75 6d  ;.  i16 *aiColum
18db0 6e 20 3d 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f  n = pIndex->aiCo
18dc0 6c 75 6d 6e 3b 0a 0a 20 20 69 66 28 20 6e 45 71  lumn;..  if( nEq
18dd0 3d 3d 30 20 26 26 20 28 70 4c 6f 6f 70 2d 3e 77  ==0 && (pLoop->w
18de0 73 46 6c 61 67 73 26 28 57 48 45 52 45 5f 42 54  sFlags&(WHERE_BT
18df0 4d 5f 4c 49 4d 49 54 7c 57 48 45 52 45 5f 54 4f  M_LIMIT|WHERE_TO
18e00 50 5f 4c 49 4d 49 54 29 29 3d 3d 30 20 29 20 72  P_LIMIT))==0 ) r
18e10 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33  eturn;.  sqlite3
18e20 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 70  StrAccumAppend(p
18e30 53 74 72 2c 20 22 20 28 22 2c 20 32 29 3b 0a 20  Str, " (", 2);. 
18e40 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 71 3b   for(i=0; i<nEq;
18e50 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72 20   i++){.    char 
18e60 2a 7a 20 3d 20 61 69 43 6f 6c 75 6d 6e 5b 69 5d  *z = aiColumn[i]
18e70 20 3c 20 30 20 3f 20 22 72 6f 77 69 64 22 20 3a   < 0 ? "rowid" :
18e80 20 61 43 6f 6c 5b 61 69 43 6f 6c 75 6d 6e 5b 69   aCol[aiColumn[i
18e90 5d 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66  ]].zName;.    if
18ea0 28 20 69 3e 3d 6e 53 6b 69 70 20 29 7b 0a 20 20  ( i>=nSkip ){.  
18eb0 20 20 20 20 65 78 70 6c 61 69 6e 41 70 70 65 6e      explainAppen
18ec0 64 54 65 72 6d 28 70 53 74 72 2c 20 69 2c 20 7a  dTerm(pStr, i, z
18ed0 2c 20 22 3d 22 29 3b 0a 20 20 20 20 7d 65 6c 73  , "=");.    }els
18ee0 65 7b 0a 20 20 20 20 20 20 69 66 28 20 69 20 29  e{.      if( i )
18ef0 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
18f00 41 70 70 65 6e 64 28 70 53 74 72 2c 20 22 20 41  Append(pStr, " A
18f10 4e 44 20 22 2c 20 35 29 3b 0a 20 20 20 20 20 20  ND ", 5);.      
18f20 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28 70  sqlite3XPrintf(p
18f30 53 74 72 2c 20 30 2c 20 22 41 4e 59 28 25 73 29  Str, 0, "ANY(%s)
18f40 22 2c 20 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ", z);.    }.  }
18f50 0a 0a 20 20 6a 20 3d 20 69 3b 0a 20 20 69 66 28  ..  j = i;.  if(
18f60 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 26   pLoop->wsFlags&
18f70 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20  WHERE_BTM_LIMIT 
18f80 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 20 3d  ){.    char *z =
18f90 20 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 20 3c 20 30   aiColumn[j] < 0
18fa0 20 3f 20 22 72 6f 77 69 64 22 20 3a 20 61 43 6f   ? "rowid" : aCo
18fb0 6c 5b 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 5d 2e 7a  l[aiColumn[j]].z
18fc0 4e 61 6d 65 3b 0a 20 20 20 20 65 78 70 6c 61 69  Name;.    explai
18fd0 6e 41 70 70 65 6e 64 54 65 72 6d 28 70 53 74 72  nAppendTerm(pStr
18fe0 2c 20 69 2b 2b 2c 20 7a 2c 20 22 3e 22 29 3b 0a  , i++, z, ">");.
18ff0 20 20 7d 0a 20 20 69 66 28 20 70 4c 6f 6f 70 2d    }.  if( pLoop-
19000 3e 77 73 46 6c 61 67 73 26 57 48 45 52 45 5f 54  >wsFlags&WHERE_T
19010 4f 50 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20  OP_LIMIT ){.    
19020 63 68 61 72 20 2a 7a 20 3d 20 61 69 43 6f 6c 75  char *z = aiColu
19030 6d 6e 5b 6a 5d 20 3c 20 30 20 3f 20 22 72 6f 77  mn[j] < 0 ? "row
19040 69 64 22 20 3a 20 61 43 6f 6c 5b 61 69 43 6f 6c  id" : aCol[aiCol
19050 75 6d 6e 5b 6a 5d 5d 2e 7a 4e 61 6d 65 3b 0a 20  umn[j]].zName;. 
19060 20 20 20 65 78 70 6c 61 69 6e 41 70 70 65 6e 64     explainAppend
19070 54 65 72 6d 28 70 53 74 72 2c 20 69 2c 20 7a 2c  Term(pStr, i, z,
19080 20 22 3c 22 29 3b 0a 20 20 7d 0a 20 20 73 71 6c   "<");.  }.  sql
19090 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65  ite3StrAccumAppe
190a0 6e 64 28 70 53 74 72 2c 20 22 29 22 2c 20 31 29  nd(pStr, ")", 1)
190b0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
190c0 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
190d0 2d 6f 70 20 75 6e 6c 65 73 73 20 63 75 72 72 65  -op unless curre
190e0 6e 74 6c 79 20 70 72 6f 63 65 73 73 69 6e 67 20  ntly processing 
190f0 61 6e 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59  an EXPLAIN QUERY
19100 20 50 4c 41 4e 0a 2a 2a 20 63 6f 6d 6d 61 6e 64   PLAN.** command
19110 2c 20 6f 72 20 69 66 20 65 69 74 68 65 72 20 53  , or if either S
19120 51 4c 49 54 45 5f 44 45 42 55 47 20 6f 72 20 53  QLITE_DEBUG or S
19130 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d  QLITE_ENABLE_STM
19140 54 5f 53 43 41 4e 53 54 41 54 55 53 20 77 61 73  T_SCANSTATUS was
19150 0a 2a 2a 20 64 65 66 69 6e 65 64 20 61 74 20 63  .** defined at c
19160 6f 6d 70 69 6c 65 2d 74 69 6d 65 2e 20 49 66 20  ompile-time. If 
19170 69 74 20 69 73 20 6e 6f 74 20 61 20 6e 6f 2d 6f  it is not a no-o
19180 70 2c 20 61 20 73 69 6e 67 6c 65 20 4f 50 5f 45  p, a single OP_E
19190 78 70 6c 61 69 6e 20 6f 70 63 6f 64 65 20 0a 2a  xplain opcode .*
191a0 2a 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68  * is added to th
191b0 65 20 6f 75 74 70 75 74 20 74 6f 20 64 65 73 63  e output to desc
191c0 72 69 62 65 20 74 68 65 20 74 61 62 6c 65 20 73  ribe the table s
191d0 63 61 6e 20 73 74 72 61 74 65 67 79 20 69 6e 20  can strategy in 
191e0 70 4c 65 76 65 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66  pLevel..**.** If
191f0 20 61 6e 20 4f 50 5f 45 78 70 6c 61 69 6e 20 6f   an OP_Explain o
19200 70 63 6f 64 65 20 69 73 20 61 64 64 65 64 20 74  pcode is added t
19210 6f 20 74 68 65 20 56 4d 2c 20 69 74 73 20 61 64  o the VM, its ad
19220 64 72 65 73 73 20 69 73 20 72 65 74 75 72 6e 65  dress is returne
19230 64 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  d..** Otherwise,
19240 20 69 66 20 6e 6f 20 4f 50 5f 45 78 70 6c 61 69   if no OP_Explai
19250 6e 20 69 73 20 63 6f 64 65 64 2c 20 7a 65 72 6f  n is coded, zero
19260 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
19270 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 6c  .static int expl
19280 61 69 6e 4f 6e 65 53 63 61 6e 28 0a 20 20 50 61  ainOneScan(.  Pa
19290 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
192a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
192b0 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a   Parse context *
192c0 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  /.  SrcList *pTa
192d0 62 4c 69 73 74 2c 20 20 20 20 20 20 20 20 20 20  bList,          
192e0 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 6c 69 73      /* Table lis
192f0 74 20 74 68 69 73 20 6c 6f 6f 70 20 72 65 66 65  t this loop refe
19300 72 73 20 74 6f 20 2a 2f 0a 20 20 57 68 65 72 65  rs to */.  Where
19310 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 20  Level *pLevel,  
19320 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 63             /* Sc
19330 61 6e 20 74 6f 20 77 72 69 74 65 20 4f 50 5f 45  an to write OP_E
19340 78 70 6c 61 69 6e 20 6f 70 63 6f 64 65 20 66 6f  xplain opcode fo
19350 72 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 76 65  r */.  int iLeve
19360 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
19370 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
19380 66 6f 72 20 22 6c 65 76 65 6c 22 20 63 6f 6c 75  for "level" colu
19390 6d 6e 20 6f 66 20 6f 75 74 70 75 74 20 2a 2f 0a  mn of output */.
193a0 20 20 69 6e 74 20 69 46 72 6f 6d 2c 20 20 20 20    int iFrom,    
193b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
193c0 20 20 2f 2a 20 56 61 6c 75 65 20 66 6f 72 20 22    /* Value for "
193d0 66 72 6f 6d 22 20 63 6f 6c 75 6d 6e 20 6f 66 20  from" column of 
193e0 6f 75 74 70 75 74 20 2a 2f 0a 20 20 75 31 36 20  output */.  u16 
193f0 77 63 74 72 6c 46 6c 61 67 73 20 20 20 20 20 20  wctrlFlags      
19400 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
19410 6c 61 67 73 20 70 61 73 73 65 64 20 74 6f 20 73  lags passed to s
19420 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
19430 28 29 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  () */.){.  int r
19440 65 74 20 3d 20 30 3b 0a 23 69 66 20 21 64 65 66  et = 0;.#if !def
19450 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
19460 47 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  G) && !defined(S
19470 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d  QLITE_ENABLE_STM
19480 54 5f 53 43 41 4e 53 54 41 54 55 53 29 0a 20 20  T_SCANSTATUS).  
19490 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c  if( pParse->expl
194a0 61 69 6e 3d 3d 32 20 29 0a 23 65 6e 64 69 66 0a  ain==2 ).#endif.
194b0 20 20 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53    {.    struct S
194c0 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
194d0 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e  em = &pTabList->
194e0 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d  a[pLevel->iFrom]
194f0 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20  ;.    Vdbe *v = 
19500 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20  pParse->pVdbe;  
19510 20 20 20 20 2f 2a 20 56 4d 20 62 65 69 6e 67 20      /* VM being 
19520 63 6f 6e 73 74 72 75 63 74 65 64 20 2a 2f 0a 20  constructed */. 
19530 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d     sqlite3 *db =
19540 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20   pParse->db;    
19550 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 61 6e   /* Database han
19560 64 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  dle */.    int i
19570 49 64 20 3d 20 70 50 61 72 73 65 2d 3e 69 53 65  Id = pParse->iSe
19580 6c 65 63 74 49 64 3b 20 20 2f 2a 20 53 65 6c 65  lectId;  /* Sele
19590 63 74 20 69 64 20 28 6c 65 66 74 2d 6d 6f 73 74  ct id (left-most
195a0 20 6f 75 74 70 75 74 20 63 6f 6c 75 6d 6e 29 20   output column) 
195b0 2a 2f 0a 20 20 20 20 69 6e 74 20 69 73 53 65 61  */.    int isSea
195c0 72 63 68 3b 20 20 20 20 20 20 20 20 20 20 20 20  rch;            
195d0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
195e0 20 61 20 53 45 41 52 43 48 2e 20 46 61 6c 73 65   a SEARCH. False
195f0 20 66 6f 72 20 53 43 41 4e 2e 20 2a 2f 0a 20 20   for SCAN. */.  
19600 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f    WhereLoop *pLo
19610 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  op;             
19620 2f 2a 20 54 68 65 20 63 6f 6e 74 72 6f 6c 6c 69  /* The controlli
19630 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a  ng WhereLoop obj
19640 65 63 74 20 2a 2f 0a 20 20 20 20 75 33 32 20 66  ect */.    u32 f
19650 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
19660 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67           /* Flag
19670 73 20 74 68 61 74 20 64 65 73 63 72 69 62 65 20  s that describe 
19680 74 68 69 73 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20  this loop */.   
19690 20 63 68 61 72 20 2a 7a 4d 73 67 3b 20 20 20 20   char *zMsg;    
196a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
196b0 2a 20 54 65 78 74 20 74 6f 20 61 64 64 20 74 6f  * Text to add to
196c0 20 45 51 50 20 6f 75 74 70 75 74 20 2a 2f 0a 20   EQP output */. 
196d0 20 20 20 53 74 72 41 63 63 75 6d 20 73 74 72 3b     StrAccum str;
196e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
196f0 20 2f 2a 20 45 51 50 20 6f 75 74 70 75 74 20 73   /* EQP output s
19700 74 72 69 6e 67 20 2a 2f 0a 20 20 20 20 63 68 61  tring */.    cha
19710 72 20 7a 42 75 66 5b 31 30 30 5d 3b 20 20 20 20  r zBuf[100];    
19720 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
19730 69 74 69 61 6c 20 73 70 61 63 65 20 66 6f 72 20  itial space for 
19740 45 51 50 20 6f 75 74 70 75 74 20 73 74 72 69 6e  EQP output strin
19750 67 20 2a 2f 0a 0a 20 20 20 20 70 4c 6f 6f 70 20  g */..    pLoop 
19760 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70  = pLevel->pWLoop
19770 3b 0a 20 20 20 20 66 6c 61 67 73 20 3d 20 70 4c  ;.    flags = pL
19780 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 3b 0a 20 20  oop->wsFlags;.  
19790 20 20 69 66 28 20 28 66 6c 61 67 73 26 57 48 45    if( (flags&WHE
197a0 52 45 5f 4d 55 4c 54 49 5f 4f 52 29 20 7c 7c 20  RE_MULTI_OR) || 
197b0 28 77 63 74 72 6c 46 6c 61 67 73 26 57 48 45 52  (wctrlFlags&WHER
197c0 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 29  E_ONETABLE_ONLY)
197d0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20   ) return 0;..  
197e0 20 20 69 73 53 65 61 72 63 68 20 3d 20 28 66 6c    isSearch = (fl
197f0 61 67 73 26 28 57 48 45 52 45 5f 42 54 4d 5f 4c  ags&(WHERE_BTM_L
19800 49 4d 49 54 7c 57 48 45 52 45 5f 54 4f 50 5f 4c  IMIT|WHERE_TOP_L
19810 49 4d 49 54 29 29 21 3d 30 0a 20 20 20 20 20 20  IMIT))!=0.      
19820 20 20 20 20 20 20 7c 7c 20 28 28 66 6c 61 67 73        || ((flags
19830 26 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41  &WHERE_VIRTUALTA
19840 42 4c 45 29 3d 3d 30 20 26 26 20 28 70 4c 6f 6f  BLE)==0 && (pLoo
19850 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3e 30  p->u.btree.nEq>0
19860 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  )).            |
19870 7c 20 28 77 63 74 72 6c 46 6c 61 67 73 26 28 57  | (wctrlFlags&(W
19880 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e  HERE_ORDERBY_MIN
19890 7c 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d  |WHERE_ORDERBY_M
198a0 41 58 29 29 3b 0a 0a 20 20 20 20 73 71 6c 69 74  AX));..    sqlit
198b0 65 33 53 74 72 41 63 63 75 6d 49 6e 69 74 28 26  e3StrAccumInit(&
198c0 73 74 72 2c 20 7a 42 75 66 2c 20 73 69 7a 65 6f  str, zBuf, sizeo
198d0 66 28 7a 42 75 66 29 2c 20 53 51 4c 49 54 45 5f  f(zBuf), SQLITE_
198e0 4d 41 58 5f 4c 45 4e 47 54 48 29 3b 0a 20 20 20  MAX_LENGTH);.   
198f0 20 73 74 72 2e 64 62 20 3d 20 64 62 3b 0a 20 20   str.db = db;.  
19900 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75    sqlite3StrAccu
19910 6d 41 70 70 65 6e 64 41 6c 6c 28 26 73 74 72 2c  mAppendAll(&str,
19920 20 69 73 53 65 61 72 63 68 20 3f 20 22 53 45 41   isSearch ? "SEA
19930 52 43 48 22 20 3a 20 22 53 43 41 4e 22 29 3b 0a  RCH" : "SCAN");.
19940 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 70      if( pItem->p
19950 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Select ){.      
19960 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28 26  sqlite3XPrintf(&
19970 73 74 72 2c 20 30 2c 20 22 20 53 55 42 51 55 45  str, 0, " SUBQUE
19980 52 59 20 25 64 22 2c 20 70 49 74 65 6d 2d 3e 69  RY %d", pItem->i
19990 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 7d  SelectId);.    }
199a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
199b0 74 65 33 58 50 72 69 6e 74 66 28 26 73 74 72 2c  te3XPrintf(&str,
199c0 20 30 2c 20 22 20 54 41 42 4c 45 20 25 73 22 2c   0, " TABLE %s",
199d0 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a   pItem->zName);.
199e0 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70      }..    if( p
199f0 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 29 7b 0a  Item->zAlias ){.
19a00 20 20 20 20 20 20 73 71 6c 69 74 65 33 58 50 72        sqlite3XPr
19a10 69 6e 74 66 28 26 73 74 72 2c 20 30 2c 20 22 20  intf(&str, 0, " 
19a20 41 53 20 25 73 22 2c 20 70 49 74 65 6d 2d 3e 7a  AS %s", pItem->z
19a30 41 6c 69 61 73 29 3b 0a 20 20 20 20 7d 0a 20 20  Alias);.    }.  
19a40 20 20 69 66 28 20 28 66 6c 61 67 73 20 26 20 28    if( (flags & (
19a50 57 48 45 52 45 5f 49 50 4b 7c 57 48 45 52 45 5f  WHERE_IPK|WHERE_
19a60 56 49 52 54 55 41 4c 54 41 42 4c 45 29 29 3d 3d  VIRTUALTABLE))==
19a70 30 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  0 ){.      const
19a80 20 63 68 61 72 20 2a 7a 46 6d 74 20 3d 20 30 3b   char *zFmt = 0;
19a90 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49  .      Index *pI
19aa0 64 78 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72  dx;..      asser
19ab0 74 28 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65  t( pLoop->u.btre
19ac0 65 2e 70 49 6e 64 65 78 21 3d 30 20 29 3b 0a 20  e.pIndex!=0 );. 
19ad0 20 20 20 20 20 70 49 64 78 20 3d 20 70 4c 6f 6f       pIdx = pLoo
19ae0 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
19af0 78 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  x;.      assert(
19b00 20 21 28 66 6c 61 67 73 26 57 48 45 52 45 5f 41   !(flags&WHERE_A
19b10 55 54 4f 5f 49 4e 44 45 58 29 20 7c 7c 20 28 66  UTO_INDEX) || (f
19b20 6c 61 67 73 26 57 48 45 52 45 5f 49 44 58 5f 4f  lags&WHERE_IDX_O
19b30 4e 4c 59 29 20 29 3b 0a 20 20 20 20 20 20 69 66  NLY) );.      if
19b40 28 20 21 48 61 73 52 6f 77 69 64 28 70 49 74 65  ( !HasRowid(pIte
19b50 6d 2d 3e 70 54 61 62 29 20 26 26 20 49 73 50 72  m->pTab) && IsPr
19b60 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 49  imaryKeyIndex(pI
19b70 64 78 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  dx) ){.        i
19b80 66 28 20 69 73 53 65 61 72 63 68 20 29 7b 0a 20  f( isSearch ){. 
19b90 20 20 20 20 20 20 20 20 20 7a 46 6d 74 20 3d 20           zFmt = 
19ba0 22 50 52 49 4d 41 52 59 20 4b 45 59 22 3b 0a 20  "PRIMARY KEY";. 
19bb0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
19bc0 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20 26  else if( flags &
19bd0 20 57 48 45 52 45 5f 50 41 52 54 49 41 4c 49 44   WHERE_PARTIALID
19be0 58 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 46 6d  X ){.        zFm
19bf0 74 20 3d 20 22 41 55 54 4f 4d 41 54 49 43 20 50  t = "AUTOMATIC P
19c00 41 52 54 49 41 4c 20 43 4f 56 45 52 49 4e 47 20  ARTIAL COVERING 
19c10 49 4e 44 45 58 22 3b 0a 20 20 20 20 20 20 7d 65  INDEX";.      }e
19c20 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20 26 20  lse if( flags & 
19c30 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58  WHERE_AUTO_INDEX
19c40 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 46 6d 74   ){.        zFmt
19c50 20 3d 20 22 41 55 54 4f 4d 41 54 49 43 20 43 4f   = "AUTOMATIC CO
19c60 56 45 52 49 4e 47 20 49 4e 44 45 58 22 3b 0a 20  VERING INDEX";. 
19c70 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 66       }else if( f
19c80 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 44 58  lags & WHERE_IDX
19c90 5f 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20 20  _ONLY ){.       
19ca0 20 7a 46 6d 74 20 3d 20 22 43 4f 56 45 52 49 4e   zFmt = "COVERIN
19cb0 47 20 49 4e 44 45 58 20 25 73 22 3b 0a 20 20 20  G INDEX %s";.   
19cc0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
19cd0 20 20 7a 46 6d 74 20 3d 20 22 49 4e 44 45 58 20    zFmt = "INDEX 
19ce0 25 73 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  %s";.      }.   
19cf0 20 20 20 69 66 28 20 7a 46 6d 74 20 29 7b 0a 20     if( zFmt ){. 
19d00 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 74         sqlite3St
19d10 72 41 63 63 75 6d 41 70 70 65 6e 64 28 26 73 74  rAccumAppend(&st
19d20 72 2c 20 22 20 55 53 49 4e 47 20 22 2c 20 37 29  r, " USING ", 7)
19d30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
19d40 33 58 50 72 69 6e 74 66 28 26 73 74 72 2c 20 30  3XPrintf(&str, 0
19d50 2c 20 7a 46 6d 74 2c 20 70 49 64 78 2d 3e 7a 4e  , zFmt, pIdx->zN
19d60 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 65 78  ame);.        ex
19d70 70 6c 61 69 6e 49 6e 64 65 78 52 61 6e 67 65 28  plainIndexRange(
19d80 26 73 74 72 2c 20 70 4c 6f 6f 70 2c 20 70 49 74  &str, pLoop, pIt
19d90 65 6d 2d 3e 70 54 61 62 29 3b 0a 20 20 20 20 20  em->pTab);.     
19da0 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28   }.    }else if(
19db0 20 28 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f   (flags & WHERE_
19dc0 49 50 4b 29 21 3d 30 20 26 26 20 28 66 6c 61 67  IPK)!=0 && (flag
19dd0 73 20 26 20 57 48 45 52 45 5f 43 4f 4e 53 54 52  s & WHERE_CONSTR
19de0 41 49 4e 54 29 21 3d 30 20 29 7b 0a 20 20 20 20  AINT)!=0 ){.    
19df0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52    const char *zR
19e00 61 6e 67 65 3b 0a 20 20 20 20 20 20 69 66 28 20  ange;.      if( 
19e10 66 6c 61 67 73 26 28 57 48 45 52 45 5f 43 4f 4c  flags&(WHERE_COL
19e20 55 4d 4e 5f 45 51 7c 57 48 45 52 45 5f 43 4f 4c  UMN_EQ|WHERE_COL
19e30 55 4d 4e 5f 49 4e 29 20 29 7b 0a 20 20 20 20 20  UMN_IN) ){.     
19e40 20 20 20 7a 52 61 6e 67 65 20 3d 20 22 28 72 6f     zRange = "(ro
19e50 77 69 64 3d 3f 29 22 3b 0a 20 20 20 20 20 20 7d  wid=?)";.      }
19e60 65 6c 73 65 20 69 66 28 20 28 66 6c 61 67 73 26  else if( (flags&
19e70 57 48 45 52 45 5f 42 4f 54 48 5f 4c 49 4d 49 54  WHERE_BOTH_LIMIT
19e80 29 3d 3d 57 48 45 52 45 5f 42 4f 54 48 5f 4c 49  )==WHERE_BOTH_LI
19e90 4d 49 54 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  MIT ){.        z
19ea0 52 61 6e 67 65 20 3d 20 22 28 72 6f 77 69 64 3e  Range = "(rowid>
19eb0 3f 20 41 4e 44 20 72 6f 77 69 64 3c 3f 29 22 3b  ? AND rowid<?)";
19ec0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
19ed0 20 66 6c 61 67 73 26 57 48 45 52 45 5f 42 54 4d   flags&WHERE_BTM
19ee0 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 20 20  _LIMIT ){.      
19ef0 20 20 7a 52 61 6e 67 65 20 3d 20 22 28 72 6f 77    zRange = "(row
19f00 69 64 3e 3f 29 22 3b 0a 20 20 20 20 20 20 7d 65  id>?)";.      }e
19f10 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73  lse{.        ass
19f20 65 72 74 28 20 66 6c 61 67 73 26 57 48 45 52 45  ert( flags&WHERE
19f30 5f 54 4f 50 5f 4c 49 4d 49 54 29 3b 0a 20 20 20  _TOP_LIMIT);.   
19f40 20 20 20 20 20 7a 52 61 6e 67 65 20 3d 20 22 28       zRange = "(
19f50 72 6f 77 69 64 3c 3f 29 22 3b 0a 20 20 20 20 20  rowid<?)";.     
19f60 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
19f70 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 41 6c  StrAccumAppendAl
19f80 6c 28 26 73 74 72 2c 20 22 20 55 53 49 4e 47 20  l(&str, " USING 
19f90 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
19fa0 4b 45 59 20 22 29 3b 0a 20 20 20 20 20 20 73 71  KEY ");.      sq
19fb0 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70  lite3StrAccumApp
19fc0 65 6e 64 41 6c 6c 28 26 73 74 72 2c 20 7a 52 61  endAll(&str, zRa
19fd0 6e 67 65 29 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  nge);.    }.#ifn
19fe0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
19ff0 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20  VIRTUALTABLE.   
1a000 20 65 6c 73 65 20 69 66 28 20 28 66 6c 61 67 73   else if( (flags
1a010 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c   & WHERE_VIRTUAL
1a020 54 41 42 4c 45 29 21 3d 30 20 29 7b 0a 20 20 20  TABLE)!=0 ){.   
1a030 20 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74     sqlite3XPrint
1a040 66 28 26 73 74 72 2c 20 30 2c 20 22 20 56 49 52  f(&str, 0, " VIR
1a050 54 55 41 4c 20 54 41 42 4c 45 20 49 4e 44 45 58  TUAL TABLE INDEX
1a060 20 25 64 3a 25 73 22 2c 0a 20 20 20 20 20 20 20   %d:%s",.       
1a070 20 20 20 20 20 20 20 20 20 20 20 70 4c 6f 6f 70             pLoop
1a080 2d 3e 75 2e 76 74 61 62 2e 69 64 78 4e 75 6d 2c  ->u.vtab.idxNum,
1a090 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 69   pLoop->u.vtab.i
1a0a0 64 78 53 74 72 29 3b 0a 20 20 20 20 7d 0a 23 65  dxStr);.    }.#e
1a0b0 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49  ndif.#ifdef SQLI
1a0c0 54 45 5f 45 58 50 4c 41 49 4e 5f 45 53 54 49 4d  TE_EXPLAIN_ESTIM
1a0d0 41 54 45 44 5f 52 4f 57 53 0a 20 20 20 20 69 66  ATED_ROWS.    if
1a0e0 28 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 3e 3d 31  ( pLoop->nOut>=1
1a0f0 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
1a100 65 33 58 50 72 69 6e 74 66 28 26 73 74 72 2c 20  e3XPrintf(&str, 
1a110 30 2c 20 22 20 28 7e 25 6c 6c 75 20 72 6f 77 73  0, " (~%llu rows
1a120 29 22 2c 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  )", sqlite3LogEs
1a130 74 54 6f 49 6e 74 28 70 4c 6f 6f 70 2d 3e 6e 4f  tToInt(pLoop->nO
1a140 75 74 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ut));.    }else{
1a150 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 74  .      sqlite3St
1a160 72 41 63 63 75 6d 41 70 70 65 6e 64 28 26 73 74  rAccumAppend(&st
1a170 72 2c 20 22 20 28 7e 31 20 72 6f 77 29 22 2c 20  r, " (~1 row)", 
1a180 39 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  9);.    }.#endif
1a190 0a 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69  .    zMsg = sqli
1a1a0 74 65 33 53 74 72 41 63 63 75 6d 46 69 6e 69 73  te3StrAccumFinis
1a1b0 68 28 26 73 74 72 29 3b 0a 20 20 20 20 72 65 74  h(&str);.    ret
1a1c0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
1a1d0 64 4f 70 34 28 76 2c 20 4f 50 5f 45 78 70 6c 61  dOp4(v, OP_Expla
1a1e0 69 6e 2c 20 69 49 64 2c 20 69 4c 65 76 65 6c 2c  in, iId, iLevel,
1a1f0 20 69 46 72 6f 6d 2c 20 7a 4d 73 67 2c 50 34 5f   iFrom, zMsg,P4_
1a200 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 20 20  DYNAMIC);.  }.  
1a210 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 23 65  return ret;.}.#e
1a220 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 65 78 70  lse.# define exp
1a230 6c 61 69 6e 4f 6e 65 53 63 61 6e 28 75 2c 76 2c  lainOneScan(u,v,
1a240 77 2c 78 2c 79 2c 7a 29 20 30 0a 23 65 6e 64 69  w,x,y,z) 0.#endi
1a250 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
1a260 5f 45 58 50 4c 41 49 4e 20 2a 2f 0a 0a 23 69 66  _EXPLAIN */..#if
1a270 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
1a280 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41 54 55  E_STMT_SCANSTATU
1a290 53 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75 72  S./*.** Configur
1a2a0 65 20 74 68 65 20 56 4d 20 70 61 73 73 65 64 20  e the VM passed 
1a2b0 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67  as the first arg
1a2c0 75 6d 65 6e 74 20 77 69 74 68 20 61 6e 0a 2a 2a  ument with an.**
1a2d0 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63   sqlite3_stmt_sc
1a2e0 61 6e 73 74 61 74 75 73 28 29 20 65 6e 74 72 79  anstatus() entry
1a2f0 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
1a300 6f 20 74 68 65 20 73 63 61 6e 20 75 73 65 64 20  o the scan used 
1a310 74 6f 20 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74  to .** implement
1a320 20 6c 65 76 65 6c 20 70 4c 76 6c 2e 20 41 72 67   level pLvl. Arg
1a330 75 6d 65 6e 74 20 70 53 72 63 6c 69 73 74 20 69  ument pSrclist i
1a340 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  s a pointer to t
1a350 68 65 20 46 52 4f 4d 20 0a 2a 2a 20 63 6c 61 75  he FROM .** clau
1a360 73 65 20 74 68 61 74 20 74 68 65 20 73 63 61 6e  se that the scan
1a370 20 72 65 61 64 73 20 64 61 74 61 20 66 72 6f 6d   reads data from
1a380 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d  ..**.** If argum
1a390 65 6e 74 20 61 64 64 72 45 78 70 6c 61 69 6e 20  ent addrExplain 
1a3a0 69 73 20 6e 6f 74 20 30 2c 20 69 74 20 6d 75 73  is not 0, it mus
1a3b0 74 20 62 65 20 74 68 65 20 61 64 64 72 65 73 73  t be the address
1a3c0 20 6f 66 20 61 6e 20 0a 2a 2a 20 4f 50 5f 45 78   of an .** OP_Ex
1a3d0 70 6c 61 69 6e 20 69 6e 73 74 72 75 63 74 69 6f  plain instructio
1a3e0 6e 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73  n that describes
1a3f0 20 74 68 65 20 73 61 6d 65 20 6c 6f 6f 70 2e 0a   the same loop..
1a400 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61  */.static void a
1a410 64 64 53 63 61 6e 53 74 61 74 75 73 28 0a 20 20  ddScanStatus(.  
1a420 56 64 62 65 20 2a 76 2c 20 20 20 20 20 20 20 20  Vdbe *v,        
1a430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a440 2f 2a 20 56 64 62 65 20 74 6f 20 61 64 64 20 73  /* Vdbe to add s
1a450 63 61 6e 73 74 61 74 75 73 20 65 6e 74 72 79 20  canstatus entry 
1a460 74 6f 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  to */.  SrcList 
1a470 2a 70 53 72 63 6c 69 73 74 2c 20 20 20 20 20 20  *pSrclist,      
1a480 20 20 20 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20          /* FROM 
1a490 63 6c 61 75 73 65 20 70 4c 76 6c 20 72 65 61 64  clause pLvl read
1a4a0 73 20 64 61 74 61 20 66 72 6f 6d 20 2a 2f 0a 20  s data from */. 
1a4b0 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 76   WhereLevel *pLv
1a4c0 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
1a4d0 20 2f 2a 20 4c 65 76 65 6c 20 74 6f 20 61 64 64   /* Level to add
1a4e0 20 73 63 61 6e 73 74 61 74 75 73 28 29 20 65 6e   scanstatus() en
1a4f0 74 72 79 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74  try for */.  int
1a500 20 61 64 64 72 45 78 70 6c 61 69 6e 20 20 20 20   addrExplain    
1a510 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a520 41 64 64 72 65 73 73 20 6f 66 20 4f 50 5f 45 78  Address of OP_Ex
1a530 70 6c 61 69 6e 20 28 6f 72 20 30 29 20 2a 2f 0a  plain (or 0) */.
1a540 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
1a550 2a 7a 4f 62 6a 20 3d 20 30 3b 0a 20 20 57 68 65  *zObj = 0;.  Whe
1a560 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 20 3d 20  reLoop *pLoop = 
1a570 70 4c 76 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20  pLvl->pWLoop;.  
1a580 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c  if( (pLoop->wsFl
1a590 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54  ags & WHERE_VIRT
1a5a0 55 41 4c 54 41 42 4c 45 29 3d 3d 30 20 20 26 26  UALTABLE)==0  &&
1a5b0 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65    pLoop->u.btree
1a5c0 2e 70 49 6e 64 65 78 21 3d 30 20 29 7b 0a 20 20  .pIndex!=0 ){.  
1a5d0 20 20 7a 4f 62 6a 20 3d 20 70 4c 6f 6f 70 2d 3e    zObj = pLoop->
1a5e0 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 2d 3e  u.btree.pIndex->
1a5f0 7a 4e 61 6d 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a  zName;.  }else{.
1a600 20 20 20 20 7a 4f 62 6a 20 3d 20 70 53 72 63 6c      zObj = pSrcl
1a610 69 73 74 2d 3e 61 5b 70 4c 76 6c 2d 3e 69 46 72  ist->a[pLvl->iFr
1a620 6f 6d 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 7d 0a 20  om].zName;.  }. 
1a630 20 73 71 6c 69 74 65 33 56 64 62 65 53 63 61 6e   sqlite3VdbeScan
1a640 53 74 61 74 75 73 28 0a 20 20 20 20 20 20 76 2c  Status(.      v,
1a650 20 61 64 64 72 45 78 70 6c 61 69 6e 2c 20 70 4c   addrExplain, pL
1a660 76 6c 2d 3e 61 64 64 72 42 6f 64 79 2c 20 70 4c  vl->addrBody, pL
1a670 76 6c 2d 3e 61 64 64 72 56 69 73 69 74 2c 20 70  vl->addrVisit, p
1a680 4c 6f 6f 70 2d 3e 6e 4f 75 74 2c 20 7a 4f 62 6a  Loop->nOut, zObj
1a690 0a 20 20 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20  .  );.}.#else.# 
1a6a0 64 65 66 69 6e 65 20 61 64 64 53 63 61 6e 53 74  define addScanSt
1a6b0 61 74 75 73 28 61 2c 20 62 2c 20 63 2c 20 64 29  atus(a, b, c, d)
1a6c0 20 28 28 76 6f 69 64 29 64 29 0a 23 65 6e 64 69   ((void)d).#endi
1a6d0 66 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  f..../*.** Gener
1a6e0 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65  ate code for the
1a6f0 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 69 4c   start of the iL
1a700 65 76 65 6c 2d 74 68 20 6c 6f 6f 70 20 69 6e 20  evel-th loop in 
1a710 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
1a720 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  .** implementati
1a730 6f 6e 20 64 65 73 63 72 69 62 65 64 20 62 79 20  on described by 
1a740 70 57 49 6e 66 6f 2e 0a 2a 2f 0a 73 74 61 74 69  pWInfo..*/.stati
1a750 63 20 42 69 74 6d 61 73 6b 20 63 6f 64 65 4f 6e  c Bitmask codeOn
1a760 65 4c 6f 6f 70 53 74 61 72 74 28 0a 20 20 57 68  eLoopStart(.  Wh
1a770 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c  ereInfo *pWInfo,
1a780 20 20 20 2f 2a 20 43 6f 6d 70 6c 65 74 65 20 69     /* Complete i
1a790 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
1a7a0 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
1a7b0 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 76 65  e */.  int iLeve
1a7c0 6c 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  l,          /* W
1a7d0 68 69 63 68 20 6c 65 76 65 6c 20 6f 66 20 70 57  hich level of pW
1a7e0 49 6e 66 6f 2d 3e 61 5b 5d 20 73 68 6f 75 6c 64  Info->a[] should
1a7f0 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 42   be coded */.  B
1a800 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 20  itmask notReady 
1a810 20 20 20 20 2f 2a 20 57 68 69 63 68 20 74 61 62      /* Which tab
1a820 6c 65 73 20 61 72 65 20 63 75 72 72 65 6e 74 6c  les are currentl
1a830 79 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 29  y available */.)
1a840 7b 0a 20 20 69 6e 74 20 6a 2c 20 6b 3b 20 20 20  {.  int j, k;   
1a850 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
1a860 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69   counters */.  i
1a870 6e 74 20 69 43 75 72 3b 20 20 20 20 20 20 20 20  nt iCur;        
1a880 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20      /* The VDBE 
1a890 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20 74  cursor for the t
1a8a0 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  able */.  int ad
1a8b0 64 72 4e 78 74 3b 20 20 20 20 20 20 20 20 20 2f  drNxt;         /
1a8c0 2a 20 57 68 65 72 65 20 74 6f 20 6a 75 6d 70 20  * Where to jump 
1a8d0 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68  to continue with
1a8e0 20 74 68 65 20 6e 65 78 74 20 49 4e 20 63 61 73   the next IN cas
1a8f0 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 6d 69 74 54  e */.  int omitT
1a900 61 62 6c 65 3b 20 20 20 20 20 20 20 2f 2a 20 54  able;       /* T
1a910 72 75 65 20 69 66 20 77 65 20 75 73 65 20 74 68  rue if we use th
1a920 65 20 69 6e 64 65 78 20 6f 6e 6c 79 20 2a 2f 0a  e index only */.
1a930 20 20 69 6e 74 20 62 52 65 76 3b 20 20 20 20 20    int bRev;     
1a940 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
1a950 66 20 77 65 20 6e 65 65 64 20 74 6f 20 73 63 61  f we need to sca
1a960 6e 20 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64  n in reverse ord
1a970 65 72 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76  er */.  WhereLev
1a980 65 6c 20 2a 70 4c 65 76 65 6c 3b 20 20 2f 2a 20  el *pLevel;  /* 
1a990 54 68 65 20 77 68 65 72 65 20 6c 65 76 65 6c 20  The where level 
1a9a0 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20  to be coded */. 
1a9b0 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f   WhereLoop *pLoo
1a9c0 70 3b 20 20 20 20 2f 2a 20 54 68 65 20 57 68 65  p;    /* The Whe
1a9d0 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 62 65  reLoop object be
1a9e0 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 57  ing coded */.  W
1a9f0 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b  hereClause *pWC;
1aa00 20 20 20 20 2f 2a 20 44 65 63 6f 6d 70 6f 73 69      /* Decomposi
1aa10 74 69 6f 6e 20 6f 66 20 74 68 65 20 65 6e 74 69  tion of the enti
1aa20 72 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  re WHERE clause 
1aa30 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  */.  WhereTerm *
1aa40 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20  pTerm;          
1aa50 20 20 20 20 20 2f 2a 20 41 20 57 48 45 52 45 20       /* A WHERE 
1aa60 63 6c 61 75 73 65 20 74 65 72 6d 20 2a 2f 0a 20  clause term */. 
1aa70 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20   Parse *pParse; 
1aa80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aa90 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
1aaa0 65 78 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ext */.  sqlite3
1aab0 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20   *db;           
1aac0 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
1aad0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
1aae0 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20  */.  Vdbe *v;   
1aaf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ab00 20 20 20 20 20 2f 2a 20 54 68 65 20 70 72 65 70       /* The prep
1ab10 61 72 65 64 20 73 74 6d 74 20 75 6e 64 65 72 20  ared stmt under 
1ab20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 73 20 2a 2f  constructions */
1ab30 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
1ab40 74 5f 69 74 65 6d 20 2a 70 54 61 62 49 74 65 6d  t_item *pTabItem
1ab50 3b 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73  ;  /* FROM claus
1ab60 65 20 74 65 72 6d 20 62 65 69 6e 67 20 63 6f 64  e term being cod
1ab70 65 64 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ed */.  int addr
1ab80 42 72 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  Brk;            
1ab90 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
1aba0 68 65 72 65 20 74 6f 20 62 72 65 61 6b 20 6f 75  here to break ou
1abb0 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 2a 2f  t of the loop */
1abc0 0a 20 20 69 6e 74 20 61 64 64 72 43 6f 6e 74 3b  .  int addrCont;
1abd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1abe0 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
1abf0 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68  to continue with
1ac00 20 6e 65 78 74 20 63 79 63 6c 65 20 2a 2f 0a 20   next cycle */. 
1ac10 20 69 6e 74 20 69 52 6f 77 69 64 52 65 67 20 3d   int iRowidReg =
1ac20 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 52 6f   0;        /* Ro
1ac30 77 69 64 20 69 73 20 73 74 6f 72 65 64 20 69 6e  wid is stored in
1ac40 20 74 68 69 73 20 72 65 67 69 73 74 65 72 2c 20   this register, 
1ac50 69 66 20 6e 6f 74 20 7a 65 72 6f 20 2a 2f 0a 20  if not zero */. 
1ac60 20 69 6e 74 20 69 52 65 6c 65 61 73 65 52 65 67   int iReleaseReg
1ac70 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 54 65   = 0;      /* Te
1ac80 6d 70 20 72 65 67 69 73 74 65 72 20 74 6f 20 66  mp register to f
1ac90 72 65 65 20 62 65 66 6f 72 65 20 72 65 74 75 72  ree before retur
1aca0 6e 69 6e 67 20 2a 2f 0a 0a 20 20 70 50 61 72 73  ning */..  pPars
1acb0 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72  e = pWInfo->pPar
1acc0 73 65 3b 0a 20 20 76 20 3d 20 70 50 61 72 73 65  se;.  v = pParse
1acd0 2d 3e 70 56 64 62 65 3b 0a 20 20 70 57 43 20 3d  ->pVdbe;.  pWC =
1ace0 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43 3b 0a 20   &pWInfo->sWC;. 
1acf0 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   db = pParse->db
1ad00 3b 0a 20 20 70 4c 65 76 65 6c 20 3d 20 26 70 57  ;.  pLevel = &pW
1ad10 49 6e 66 6f 2d 3e 61 5b 69 4c 65 76 65 6c 5d 3b  Info->a[iLevel];
1ad20 0a 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65  .  pLoop = pLeve
1ad30 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 70 54 61  l->pWLoop;.  pTa
1ad40 62 49 74 65 6d 20 3d 20 26 70 57 49 6e 66 6f 2d  bItem = &pWInfo-
1ad50 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65  >pTabList->a[pLe
1ad60 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 69  vel->iFrom];.  i
1ad70 43 75 72 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e  Cur = pTabItem->
1ad80 69 43 75 72 73 6f 72 3b 0a 20 20 70 4c 65 76 65  iCursor;.  pLeve
1ad90 6c 2d 3e 6e 6f 74 52 65 61 64 79 20 3d 20 6e 6f  l->notReady = no
1ada0 74 52 65 61 64 79 20 26 20 7e 67 65 74 4d 61 73  tReady & ~getMas
1adb0 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b  k(&pWInfo->sMask
1adc0 53 65 74 2c 20 69 43 75 72 29 3b 0a 20 20 62 52  Set, iCur);.  bR
1add0 65 76 20 3d 20 28 70 57 49 6e 66 6f 2d 3e 72 65  ev = (pWInfo->re
1ade0 76 4d 61 73 6b 3e 3e 69 4c 65 76 65 6c 29 26 31  vMask>>iLevel)&1
1adf0 3b 0a 20 20 6f 6d 69 74 54 61 62 6c 65 20 3d 20  ;.  omitTable = 
1ae00 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  (pLoop->wsFlags 
1ae10 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59  & WHERE_IDX_ONLY
1ae20 29 21 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20  )!=0 .          
1ae30 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74   && (pWInfo->wct
1ae40 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
1ae50 46 4f 52 43 45 5f 54 41 42 4c 45 29 3d 3d 30 3b  FORCE_TABLE)==0;
1ae60 0a 20 20 56 64 62 65 4d 6f 64 75 6c 65 43 6f 6d  .  VdbeModuleCom
1ae70 6d 65 6e 74 28 28 76 2c 20 22 42 65 67 69 6e 20  ment((v, "Begin 
1ae80 57 48 45 52 45 2d 6c 6f 6f 70 25 64 3a 20 25 73  WHERE-loop%d: %s
1ae90 22 2c 69 4c 65 76 65 6c 2c 70 54 61 62 49 74 65  ",iLevel,pTabIte
1aea0 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29  m->pTab->zName))
1aeb0 3b 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 20 6c  ;..  /* Create l
1aec0 61 62 65 6c 73 20 66 6f 72 20 74 68 65 20 22 62  abels for the "b
1aed0 72 65 61 6b 22 20 61 6e 64 20 22 63 6f 6e 74 69  reak" and "conti
1aee0 6e 75 65 22 20 69 6e 73 74 72 75 63 74 69 6f 6e  nue" instruction
1aef0 73 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 63  s.  ** for the c
1af00 75 72 72 65 6e 74 20 6c 6f 6f 70 2e 20 20 4a 75  urrent loop.  Ju
1af10 6d 70 20 74 6f 20 61 64 64 72 42 72 6b 20 74 6f  mp to addrBrk to
1af20 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 61 20   break out of a 
1af30 6c 6f 6f 70 2e 0a 20 20 2a 2a 20 4a 75 6d 70 20  loop..  ** Jump 
1af40 74 6f 20 63 6f 6e 74 20 74 6f 20 67 6f 20 69 6d  to cont to go im
1af50 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 74 68 65  mediately to the
1af60 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e 20   next iteration 
1af70 6f 66 20 74 68 65 0a 20 20 2a 2a 20 6c 6f 6f 70  of the.  ** loop
1af80 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e  ..  **.  ** When
1af90 20 74 68 65 72 65 20 69 73 20 61 6e 20 49 4e 20   there is an IN 
1afa0 6f 70 65 72 61 74 6f 72 2c 20 77 65 20 61 6c 73  operator, we als
1afb0 6f 20 68 61 76 65 20 61 20 22 61 64 64 72 4e 78  o have a "addrNx
1afc0 74 22 20 6c 61 62 65 6c 20 74 68 61 74 0a 20 20  t" label that.  
1afd0 2a 2a 20 6d 65 61 6e 73 20 74 6f 20 63 6f 6e 74  ** means to cont
1afe0 69 6e 75 65 20 77 69 74 68 20 74 68 65 20 6e 65  inue with the ne
1aff0 78 74 20 49 4e 20 76 61 6c 75 65 20 63 6f 6d 62  xt IN value comb
1b000 69 6e 61 74 69 6f 6e 2e 20 20 57 68 65 6e 0a 20  ination.  When. 
1b010 20 2a 2a 20 74 68 65 72 65 20 61 72 65 20 6e 6f   ** there are no
1b020 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 20 69 6e   IN operators in
1b030 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 73   the constraints
1b040 2c 20 74 68 65 20 22 61 64 64 72 4e 78 74 22 20  , the "addrNxt" 
1b050 6c 61 62 65 6c 0a 20 20 2a 2a 20 69 73 20 74 68  label.  ** is th
1b060 65 20 73 61 6d 65 20 61 73 20 22 61 64 64 72 42  e same as "addrB
1b070 72 6b 22 2e 0a 20 20 2a 2f 0a 20 20 61 64 64 72  rk"..  */.  addr
1b080 42 72 6b 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64  Brk = pLevel->ad
1b090 64 72 42 72 6b 20 3d 20 70 4c 65 76 65 6c 2d 3e  drBrk = pLevel->
1b0a0 61 64 64 72 4e 78 74 20 3d 20 73 71 6c 69 74 65  addrNxt = sqlite
1b0b0 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
1b0c0 29 3b 0a 20 20 61 64 64 72 43 6f 6e 74 20 3d 20  );.  addrCont = 
1b0d0 70 4c 65 76 65 6c 2d 3e 61 64 64 72 43 6f 6e 74  pLevel->addrCont
1b0e0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
1b0f0 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 2f  keLabel(v);..  /
1b100 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  * If this is the
1b110 20 72 69 67 68 74 20 74 61 62 6c 65 20 6f 66 20   right table of 
1b120 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49  a LEFT OUTER JOI
1b130 4e 2c 20 61 6c 6c 6f 63 61 74 65 20 61 6e 64 0a  N, allocate and.
1b140 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 20    ** initialize 
1b150 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 68  a memory cell th
1b160 61 74 20 72 65 63 6f 72 64 73 20 69 66 20 74 68  at records if th
1b170 69 73 20 74 61 62 6c 65 20 6d 61 74 63 68 65 73  is table matches
1b180 20 61 6e 79 0a 20 20 2a 2a 20 72 6f 77 20 6f 66   any.  ** row of
1b190 20 74 68 65 20 6c 65 66 74 20 74 61 62 6c 65 20   the left table 
1b1a0 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 0a 20 20 2a  of the join..  *
1b1b0 2f 0a 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e  /.  if( pLevel->
1b1c0 69 46 72 6f 6d 3e 30 20 26 26 20 28 70 54 61 62  iFrom>0 && (pTab
1b1d0 49 74 65 6d 5b 30 5d 2e 6a 6f 69 6e 74 79 70 65  Item[0].jointype
1b1e0 20 26 20 4a 54 5f 4c 45 46 54 29 21 3d 30 20 29   & JT_LEFT)!=0 )
1b1f0 7b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 4c  {.    pLevel->iL
1b200 65 66 74 4a 6f 69 6e 20 3d 20 2b 2b 70 50 61 72  eftJoin = ++pPar
1b210 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71  se->nMem;.    sq
1b220 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1b230 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
1b240 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a  , pLevel->iLeftJ
1b250 6f 69 6e 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  oin);.    VdbeCo
1b260 6d 6d 65 6e 74 28 28 76 2c 20 22 69 6e 69 74 20  mment((v, "init 
1b270 4c 45 46 54 20 4a 4f 49 4e 20 6e 6f 2d 6d 61 74  LEFT JOIN no-mat
1b280 63 68 20 66 6c 61 67 22 29 29 3b 0a 20 20 7d 0a  ch flag"));.  }.
1b290 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c 20 63 61  .  /* Special ca
1b2a0 73 65 20 6f 66 20 61 20 46 52 4f 4d 20 63 6c 61  se of a FROM cla
1b2b0 75 73 65 20 73 75 62 71 75 65 72 79 20 69 6d 70  use subquery imp
1b2c0 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 20 63 6f  lemented as a co
1b2d0 2d 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 66  -routine */.  if
1b2e0 28 20 70 54 61 62 49 74 65 6d 2d 3e 76 69 61 43  ( pTabItem->viaC
1b2f0 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20  oroutine ){.    
1b300 69 6e 74 20 72 65 67 59 69 65 6c 64 20 3d 20 70  int regYield = p
1b310 54 61 62 49 74 65 6d 2d 3e 72 65 67 52 65 74 75  TabItem->regRetu
1b320 72 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  rn;.    sqlite3V
1b330 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
1b340 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 2c 20 72  InitCoroutine, r
1b350 65 67 59 69 65 6c 64 2c 20 30 2c 20 70 54 61 62  egYield, 0, pTab
1b360 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75  Item->addrFillSu
1b370 62 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  b);.    pLevel->
1b380 70 32 20 3d 20 20 73 71 6c 69 74 65 33 56 64 62  p2 =  sqlite3Vdb
1b390 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69  eAddOp2(v, OP_Yi
1b3a0 65 6c 64 2c 20 72 65 67 59 69 65 6c 64 2c 20 61  eld, regYield, a
1b3b0 64 64 72 42 72 6b 29 3b 0a 20 20 20 20 56 64 62  ddrBrk);.    Vdb
1b3c0 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
1b3d0 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
1b3e0 2c 20 22 6e 65 78 74 20 72 6f 77 20 6f 66 20 5c  , "next row of \
1b3f0 22 25 73 5c 22 22 2c 20 70 54 61 62 49 74 65 6d  "%s\"", pTabItem
1b400 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b  ->pTab->zName));
1b410 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20  .    pLevel->op 
1b420 3d 20 4f 50 5f 47 6f 74 6f 3b 0a 20 20 7d 65 6c  = OP_Goto;.  }el
1b430 73 65 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  se..#ifndef SQLI
1b440 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
1b450 41 42 4c 45 0a 20 20 69 66 28 20 20 28 70 4c 6f  ABLE.  if(  (pLo
1b460 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
1b470 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  ERE_VIRTUALTABLE
1b480 29 21 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 43  )!=0 ){.    /* C
1b490 61 73 65 20 31 3a 20 20 54 68 65 20 74 61 62 6c  ase 1:  The tabl
1b4a0 65 20 69 73 20 61 20 76 69 72 74 75 61 6c 2d 74  e is a virtual-t
1b4b0 61 62 6c 65 2e 20 20 55 73 65 20 74 68 65 20 56  able.  Use the V
1b4c0 46 69 6c 74 65 72 20 61 6e 64 20 56 4e 65 78 74  Filter and VNext
1b4d0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
1b4e0 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 64   to access the d
1b4f0 61 74 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ata..    */.    
1b500 69 6e 74 20 69 52 65 67 3b 20 20 20 2f 2a 20 50  int iReg;   /* P
1b510 33 20 56 61 6c 75 65 20 66 6f 72 20 4f 50 5f 56  3 Value for OP_V
1b520 46 69 6c 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e  Filter */.    in
1b530 74 20 61 64 64 72 4e 6f 74 46 6f 75 6e 64 3b 0a  t addrNotFound;.
1b540 20 20 20 20 69 6e 74 20 6e 43 6f 6e 73 74 72 61      int nConstra
1b550 69 6e 74 20 3d 20 70 4c 6f 6f 70 2d 3e 6e 4c 54  int = pLoop->nLT
1b560 65 72 6d 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65  erm;..    sqlite
1b570 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70  3ExprCachePush(p
1b580 50 61 72 73 65 29 3b 0a 20 20 20 20 69 52 65 67  Parse);.    iReg
1b590 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
1b5a0 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e  pRange(pParse, n
1b5b0 43 6f 6e 73 74 72 61 69 6e 74 2b 32 29 3b 0a 20  Constraint+2);. 
1b5c0 20 20 20 61 64 64 72 4e 6f 74 46 6f 75 6e 64 20     addrNotFound 
1b5d0 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72  = pLevel->addrBr
1b5e0 6b 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  k;.    for(j=0; 
1b5f0 6a 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 6a  j<nConstraint; j
1b600 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  ++){.      int i
1b610 54 61 72 67 65 74 20 3d 20 69 52 65 67 2b 6a 2b  Target = iReg+j+
1b620 32 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d  2;.      pTerm =
1b630 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a   pLoop->aLTerm[j
1b640 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65  ];.      if( pTe
1b650 72 6d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  rm==0 ) continue
1b660 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72  ;.      if( pTer
1b670 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
1b680 4f 5f 49 4e 20 29 7b 0a 20 20 20 20 20 20 20 20  O_IN ){.        
1b690 63 6f 64 65 45 71 75 61 6c 69 74 79 54 65 72 6d  codeEqualityTerm
1b6a0 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2c 20  (pParse, pTerm, 
1b6b0 70 4c 65 76 65 6c 2c 20 6a 2c 20 62 52 65 76 2c  pLevel, j, bRev,
1b6c0 20 69 54 61 72 67 65 74 29 3b 0a 20 20 20 20 20   iTarget);.     
1b6d0 20 20 20 61 64 64 72 4e 6f 74 46 6f 75 6e 64 20     addrNotFound 
1b6e0 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78  = pLevel->addrNx
1b6f0 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  t;.      }else{.
1b700 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1b710 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
1b720 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52  pTerm->pExpr->pR
1b730 69 67 68 74 2c 20 69 54 61 72 67 65 74 29 3b 0a  ight, iTarget);.
1b740 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1b750 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1b760 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
1b770 72 2c 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62  r, pLoop->u.vtab
1b780 2e 69 64 78 4e 75 6d 2c 20 69 52 65 67 29 3b 0a  .idxNum, iReg);.
1b790 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1b7a0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
1b7b0 67 65 72 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74  ger, nConstraint
1b7c0 2c 20 69 52 65 67 2b 31 29 3b 0a 20 20 20 20 73  , iReg+1);.    s
1b7d0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
1b7e0 28 76 2c 20 4f 50 5f 56 46 69 6c 74 65 72 2c 20  (v, OP_VFilter, 
1b7f0 69 43 75 72 2c 20 61 64 64 72 4e 6f 74 46 6f 75  iCur, addrNotFou
1b800 6e 64 2c 20 69 52 65 67 2c 0a 20 20 20 20 20 20  nd, iReg,.      
1b810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b820 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 69 64  pLoop->u.vtab.id
1b830 78 53 74 72 2c 0a 20 20 20 20 20 20 20 20 20 20  xStr,.          
1b840 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 6f 6f              pLoo
1b850 70 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72  p->u.vtab.needFr
1b860 65 65 20 3f 20 50 34 5f 4d 50 52 49 4e 54 46 20  ee ? P4_MPRINTF 
1b870 3a 20 50 34 5f 53 54 41 54 49 43 29 3b 0a 20 20  : P4_STATIC);.  
1b880 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
1b890 29 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e  );.    pLoop->u.
1b8a0 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3d 20  vtab.needFree = 
1b8b0 30 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  0;.    for(j=0; 
1b8c0 6a 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 20 26 26  j<nConstraint &&
1b8d0 20 6a 3c 31 36 3b 20 6a 2b 2b 29 7b 0a 20 20 20   j<16; j++){.   
1b8e0 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 75     if( (pLoop->u
1b8f0 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 3e 3e  .vtab.omitMask>>
1b900 6a 29 26 31 20 29 7b 0a 20 20 20 20 20 20 20 20  j)&1 ){.        
1b910 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76  disableTerm(pLev
1b920 65 6c 2c 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72  el, pLoop->aLTer
1b930 6d 5b 6a 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  m[j]);.      }. 
1b940 20 20 20 7d 0a 20 20 20 20 70 4c 65 76 65 6c 2d     }.    pLevel-
1b950 3e 6f 70 20 3d 20 4f 50 5f 56 4e 65 78 74 3b 0a  >op = OP_VNext;.
1b960 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d      pLevel->p1 =
1b970 20 69 43 75 72 3b 0a 20 20 20 20 70 4c 65 76 65   iCur;.    pLeve
1b980 6c 2d 3e 70 32 20 3d 20 73 71 6c 69 74 65 33 56  l->p2 = sqlite3V
1b990 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
1b9a0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  );.    sqlite3Re
1b9b0 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70  leaseTempRange(p
1b9c0 50 61 72 73 65 2c 20 69 52 65 67 2c 20 6e 43 6f  Parse, iReg, nCo
1b9d0 6e 73 74 72 61 69 6e 74 2b 32 29 3b 0a 20 20 20  nstraint+2);.   
1b9e0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
1b9f0 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20  ePop(pParse);.  
1ba00 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20  }else.#endif /* 
1ba10 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
1ba20 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 20 20 69  UALTABLE */..  i
1ba30 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  f( (pLoop->wsFla
1ba40 67 73 20 26 20 57 48 45 52 45 5f 49 50 4b 29 21  gs & WHERE_IPK)!
1ba50 3d 30 0a 20 20 20 26 26 20 28 70 4c 6f 6f 70 2d  =0.   && (pLoop-
1ba60 3e 77 73 46 6c 61 67 73 20 26 20 28 57 48 45 52  >wsFlags & (WHER
1ba70 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 7c 57 48 45 52  E_COLUMN_IN|WHER
1ba80 45 5f 43 4f 4c 55 4d 4e 5f 45 51 29 29 21 3d 30  E_COLUMN_EQ))!=0
1ba90 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73  .  ){.    /* Cas
1baa0 65 20 32 3a 20 20 57 65 20 63 61 6e 20 64 69 72  e 2:  We can dir
1bab0 65 63 74 6c 79 20 72 65 66 65 72 65 6e 63 65 20  ectly reference 
1bac0 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 75 73 69  a single row usi
1bad0 6e 67 20 61 6e 0a 20 20 20 20 2a 2a 20 20 20 20  ng an.    **    
1bae0 20 20 20 20 20 20 65 71 75 61 6c 69 74 79 20 63        equality c
1baf0 6f 6d 70 61 72 69 73 6f 6e 20 61 67 61 69 6e 73  omparison agains
1bb00 74 20 74 68 65 20 52 4f 57 49 44 20 66 69 65 6c  t the ROWID fiel
1bb10 64 2e 20 20 4f 72 0a 20 20 20 20 2a 2a 20 20 20  d.  Or.    **   
1bb20 20 20 20 20 20 20 20 77 65 20 72 65 66 65 72 65         we refere
1bb30 6e 63 65 20 6d 75 6c 74 69 70 6c 65 20 72 6f 77  nce multiple row
1bb40 73 20 75 73 69 6e 67 20 61 20 22 72 6f 77 69 64  s using a "rowid
1bb50 20 49 4e 20 28 2e 2e 2e 29 22 0a 20 20 20 20 2a   IN (...)".    *
1bb60 2a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74  *          const
1bb70 72 75 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ruct..    */.   
1bb80 20 61 73 73 65 72 74 28 20 70 4c 6f 6f 70 2d 3e   assert( pLoop->
1bb90 75 2e 62 74 72 65 65 2e 6e 45 71 3d 3d 31 20 29  u.btree.nEq==1 )
1bba0 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 70 4c  ;.    pTerm = pL
1bbb0 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d 3b 0a  oop->aLTerm[0];.
1bbc0 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72      assert( pTer
1bbd0 6d 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  m!=0 );.    asse
1bbe0 72 74 28 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  rt( pTerm->pExpr
1bbf0 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  !=0 );.    asser
1bc00 74 28 20 6f 6d 69 74 54 61 62 6c 65 3d 3d 30 20  t( omitTable==0 
1bc10 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
1bc20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
1bc30 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29  & TERM_VIRTUAL )
1bc40 3b 0a 20 20 20 20 69 52 65 6c 65 61 73 65 52 65  ;.    iReleaseRe
1bc50 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  g = ++pParse->nM
1bc60 65 6d 3b 0a 20 20 20 20 69 52 6f 77 69 64 52 65  em;.    iRowidRe
1bc70 67 20 3d 20 63 6f 64 65 45 71 75 61 6c 69 74 79  g = codeEquality
1bc80 54 65 72 6d 28 70 50 61 72 73 65 2c 20 70 54 65  Term(pParse, pTe
1bc90 72 6d 2c 20 70 4c 65 76 65 6c 2c 20 30 2c 20 62  rm, pLevel, 0, b
1bca0 52 65 76 2c 20 69 52 65 6c 65 61 73 65 52 65 67  Rev, iReleaseReg
1bcb0 29 3b 0a 20 20 20 20 69 66 28 20 69 52 6f 77 69  );.    if( iRowi
1bcc0 64 52 65 67 21 3d 69 52 65 6c 65 61 73 65 52 65  dReg!=iReleaseRe
1bcd0 67 20 29 20 73 71 6c 69 74 65 33 52 65 6c 65 61  g ) sqlite3Relea
1bce0 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
1bcf0 2c 20 69 52 65 6c 65 61 73 65 52 65 67 29 3b 0a  , iReleaseReg);.
1bd00 20 20 20 20 61 64 64 72 4e 78 74 20 3d 20 70 4c      addrNxt = pL
1bd10 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 3b 0a 20  evel->addrNxt;. 
1bd20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1bd30 64 4f 70 32 28 76 2c 20 4f 50 5f 4d 75 73 74 42  dOp2(v, OP_MustB
1bd40 65 49 6e 74 2c 20 69 52 6f 77 69 64 52 65 67 2c  eInt, iRowidReg,
1bd50 20 61 64 64 72 4e 78 74 29 3b 20 56 64 62 65 43   addrNxt); VdbeC
1bd60 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
1bd70 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1bd80 33 28 76 2c 20 4f 50 5f 4e 6f 74 45 78 69 73 74  3(v, OP_NotExist
1bd90 73 2c 20 69 43 75 72 2c 20 61 64 64 72 4e 78 74  s, iCur, addrNxt
1bda0 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20  , iRowidReg);.  
1bdb0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
1bdc0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
1bdd0 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43  prCacheAffinityC
1bde0 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 69 52  hange(pParse, iR
1bdf0 6f 77 69 64 52 65 67 2c 20 31 29 3b 0a 20 20 20  owidReg, 1);.   
1be00 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
1be10 65 53 74 6f 72 65 28 70 50 61 72 73 65 2c 20 69  eStore(pParse, i
1be20 43 75 72 2c 20 2d 31 2c 20 69 52 6f 77 69 64 52  Cur, -1, iRowidR
1be30 65 67 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d  eg);.    VdbeCom
1be40 6d 65 6e 74 28 28 76 2c 20 22 70 6b 22 29 29 3b  ment((v, "pk"));
1be50 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20  .    pLevel->op 
1be60 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 7d 65 6c  = OP_Noop;.  }el
1be70 73 65 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77  se if( (pLoop->w
1be80 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
1be90 50 4b 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20  PK)!=0.         
1bea0 26 26 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  && (pLoop->wsFla
1beb0 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d  gs & WHERE_COLUM
1bec0 4e 5f 52 41 4e 47 45 29 21 3d 30 0a 20 20 29 7b  N_RANGE)!=0.  ){
1bed0 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 33 3a 20  .    /* Case 3: 
1bee0 20 57 65 20 68 61 76 65 20 61 6e 20 69 6e 65 71   We have an ineq
1bef0 75 61 6c 69 74 79 20 63 6f 6d 70 61 72 69 73 6f  uality compariso
1bf00 6e 20 61 67 61 69 6e 73 74 20 74 68 65 20 52 4f  n against the RO
1bf10 57 49 44 20 66 69 65 6c 64 2e 0a 20 20 20 20 2a  WID field..    *
1bf20 2f 0a 20 20 20 20 69 6e 74 20 74 65 73 74 4f 70  /.    int testOp
1bf30 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20   = OP_Noop;.    
1bf40 69 6e 74 20 73 74 61 72 74 3b 0a 20 20 20 20 69  int start;.    i
1bf50 6e 74 20 6d 65 6d 45 6e 64 56 61 6c 75 65 20 3d  nt memEndValue =
1bf60 20 30 3b 0a 20 20 20 20 57 68 65 72 65 54 65 72   0;.    WhereTer
1bf70 6d 20 2a 70 53 74 61 72 74 2c 20 2a 70 45 6e 64  m *pStart, *pEnd
1bf80 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f  ;..    assert( o
1bf90 6d 69 74 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20  mitTable==0 );. 
1bfa0 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20 70 53     j = 0;.    pS
1bfb0 74 61 72 74 20 3d 20 70 45 6e 64 20 3d 20 30 3b  tart = pEnd = 0;
1bfc0 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e  .    if( pLoop->
1bfd0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
1bfe0 42 54 4d 5f 4c 49 4d 49 54 20 29 20 70 53 74 61  BTM_LIMIT ) pSta
1bff0 72 74 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65  rt = pLoop->aLTe
1c000 72 6d 5b 6a 2b 2b 5d 3b 0a 20 20 20 20 69 66 28  rm[j++];.    if(
1c010 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20   pLoop->wsFlags 
1c020 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49  & WHERE_TOP_LIMI
1c030 54 20 29 20 70 45 6e 64 20 3d 20 70 4c 6f 6f 70  T ) pEnd = pLoop
1c040 2d 3e 61 4c 54 65 72 6d 5b 6a 2b 2b 5d 3b 0a 20  ->aLTerm[j++];. 
1c050 20 20 20 61 73 73 65 72 74 28 20 70 53 74 61 72     assert( pStar
1c060 74 21 3d 30 20 7c 7c 20 70 45 6e 64 21 3d 30 20  t!=0 || pEnd!=0 
1c070 29 3b 0a 20 20 20 20 69 66 28 20 62 52 65 76 20  );.    if( bRev 
1c080 29 7b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d  ){.      pTerm =
1c090 20 70 53 74 61 72 74 3b 0a 20 20 20 20 20 20 70   pStart;.      p
1c0a0 53 74 61 72 74 20 3d 20 70 45 6e 64 3b 0a 20 20  Start = pEnd;.  
1c0b0 20 20 20 20 70 45 6e 64 20 3d 20 70 54 65 72 6d      pEnd = pTerm
1c0c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1c0d0 70 53 74 61 72 74 20 29 7b 0a 20 20 20 20 20 20  pStart ){.      
1c0e0 45 78 70 72 20 2a 70 58 3b 20 20 20 20 20 20 20  Expr *pX;       
1c0f0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70        /* The exp
1c100 72 65 73 73 69 6f 6e 20 74 68 61 74 20 64 65 66  ression that def
1c110 69 6e 65 73 20 74 68 65 20 73 74 61 72 74 20 62  ines the start b
1c120 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ound */.      in
1c130 74 20 72 31 2c 20 72 54 65 6d 70 3b 20 20 20 20  t r1, rTemp;    
1c140 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 73      /* Registers
1c150 20 66 6f 72 20 68 6f 6c 64 69 6e 67 20 74 68 65   for holding the
1c160 20 73 74 61 72 74 20 62 6f 75 6e 64 61 72 79 20   start boundary 
1c170 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  */..      /* The
1c180 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6e 73 74   following const
1c190 61 6e 74 20 6d 61 70 73 20 54 4b 5f 78 78 20 63  ant maps TK_xx c
1c1a0 6f 64 65 73 20 69 6e 74 6f 20 63 6f 72 72 65 73  odes into corres
1c1b0 70 6f 6e 64 69 6e 67 20 0a 20 20 20 20 20 20 2a  ponding .      *
1c1c0 2a 20 73 65 65 6b 20 6f 70 63 6f 64 65 73 2e 20  * seek opcodes. 
1c1d0 20 49 74 20 64 65 70 65 6e 64 73 20 6f 6e 20 61   It depends on a
1c1e0 20 70 61 72 74 69 63 75 6c 61 72 20 6f 72 64 65   particular orde
1c1f0 72 69 6e 67 20 6f 66 20 54 4b 5f 78 78 0a 20 20  ring of TK_xx.  
1c200 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e      */.      con
1c210 73 74 20 75 38 20 61 4d 6f 76 65 4f 70 5b 5d 20  st u8 aMoveOp[] 
1c220 3d 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 2f  = {.           /
1c230 2a 20 54 4b 5f 47 54 20 2a 2f 20 20 4f 50 5f 53  * TK_GT */  OP_S
1c240 65 65 6b 47 54 2c 0a 20 20 20 20 20 20 20 20 20  eekGT,.         
1c250 20 20 2f 2a 20 54 4b 5f 4c 45 20 2a 2f 20 20 4f    /* TK_LE */  O
1c260 50 5f 53 65 65 6b 4c 45 2c 0a 20 20 20 20 20 20  P_SeekLE,.      
1c270 20 20 20 20 20 2f 2a 20 54 4b 5f 4c 54 20 2a 2f       /* TK_LT */
1c280 20 20 4f 50 5f 53 65 65 6b 4c 54 2c 0a 20 20 20    OP_SeekLT,.   
1c290 20 20 20 20 20 20 20 20 2f 2a 20 54 4b 5f 47 45          /* TK_GE
1c2a0 20 2a 2f 20 20 4f 50 5f 53 65 65 6b 47 45 0a 20   */  OP_SeekGE. 
1c2b0 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 61 73       };.      as
1c2c0 73 65 72 74 28 20 54 4b 5f 4c 45 3d 3d 54 4b 5f  sert( TK_LE==TK_
1c2d0 47 54 2b 31 20 29 3b 20 20 20 20 20 20 2f 2a 20  GT+1 );      /* 
1c2e0 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6f 72  Make sure the or
1c2f0 64 65 72 69 6e 67 2e 2e 20 2a 2f 0a 20 20 20 20  dering.. */.    
1c300 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 54 3d    assert( TK_LT=
1c310 3d 54 4b 5f 47 54 2b 32 20 29 3b 20 20 20 20 20  =TK_GT+2 );     
1c320 20 2f 2a 20 20 2e 2e 2e 20 6f 66 20 74 68 65 20   /*  ... of the 
1c330 54 4b 5f 78 78 20 76 61 6c 75 65 73 2e 2e 2e 20  TK_xx values... 
1c340 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
1c350 20 54 4b 5f 47 45 3d 3d 54 4b 5f 47 54 2b 33 20   TK_GE==TK_GT+3 
1c360 29 3b 20 20 20 20 20 20 2f 2a 20 20 2e 2e 2e 20  );      /*  ... 
1c370 69 73 20 63 6f 72 72 65 63 63 74 2e 20 2a 2f 0a  is correcct. */.
1c380 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28  .      assert( (
1c390 70 53 74 61 72 74 2d 3e 77 74 46 6c 61 67 73 20  pStart->wtFlags 
1c3a0 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30  & TERM_VNULL)==0
1c3b0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
1c3c0 73 65 28 20 70 53 74 61 72 74 2d 3e 77 74 46 6c  se( pStart->wtFl
1c3d0 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55  ags & TERM_VIRTU
1c3e0 41 4c 20 29 3b 0a 20 20 20 20 20 20 70 58 20 3d  AL );.      pX =
1c3f0 20 70 53 74 61 72 74 2d 3e 70 45 78 70 72 3b 0a   pStart->pExpr;.
1c400 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 58        assert( pX
1c410 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73  !=0 );.      tes
1c420 74 63 61 73 65 28 20 70 53 74 61 72 74 2d 3e 6c  tcase( pStart->l
1c430 65 66 74 43 75 72 73 6f 72 21 3d 69 43 75 72 20  eftCursor!=iCur 
1c440 29 3b 20 2f 2a 20 74 72 61 6e 73 69 74 69 76 65  ); /* transitive
1c450 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a   constraints */.
1c460 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
1c470 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
1c480 50 61 72 73 65 2c 20 70 58 2d 3e 70 52 69 67 68  Parse, pX->pRigh
1c490 74 2c 20 26 72 54 65 6d 70 29 3b 0a 20 20 20 20  t, &rTemp);.    
1c4a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1c4b0 4f 70 33 28 76 2c 20 61 4d 6f 76 65 4f 70 5b 70  Op3(v, aMoveOp[p
1c4c0 58 2d 3e 6f 70 2d 54 4b 5f 47 54 5d 2c 20 69 43  X->op-TK_GT], iC
1c4d0 75 72 2c 20 61 64 64 72 42 72 6b 2c 20 72 31 29  ur, addrBrk, r1)
1c4e0 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
1c4f0 65 6e 74 28 28 76 2c 20 22 70 6b 22 29 29 3b 0a  ent((v, "pk"));.
1c500 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
1c510 67 65 49 66 28 76 2c 20 70 58 2d 3e 6f 70 3d 3d  geIf(v, pX->op==
1c520 54 4b 5f 47 54 29 3b 0a 20 20 20 20 20 20 56 64  TK_GT);.      Vd
1c530 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
1c540 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45 29 3b 0a  pX->op==TK_LE);.
1c550 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
1c560 67 65 49 66 28 76 2c 20 70 58 2d 3e 6f 70 3d 3d  geIf(v, pX->op==
1c570 54 4b 5f 4c 54 29 3b 0a 20 20 20 20 20 20 56 64  TK_LT);.      Vd
1c580 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
1c590 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 47 45 29 3b 0a  pX->op==TK_GE);.
1c5a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1c5b0 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68  rCacheAffinityCh
1c5c0 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 31 2c  ange(pParse, r1,
1c5d0 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   1);.      sqlit
1c5e0 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
1c5f0 28 70 50 61 72 73 65 2c 20 72 54 65 6d 70 29 3b  (pParse, rTemp);
1c600 0a 20 20 20 20 20 20 64 69 73 61 62 6c 65 54 65  .      disableTe
1c610 72 6d 28 70 4c 65 76 65 6c 2c 20 70 53 74 61 72  rm(pLevel, pStar
1c620 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  t);.    }else{. 
1c630 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1c640 41 64 64 4f 70 32 28 76 2c 20 62 52 65 76 20 3f  AddOp2(v, bRev ?
1c650 20 4f 50 5f 4c 61 73 74 20 3a 20 4f 50 5f 52 65   OP_Last : OP_Re
1c660 77 69 6e 64 2c 20 69 43 75 72 2c 20 61 64 64 72  wind, iCur, addr
1c670 42 72 6b 29 3b 0a 20 20 20 20 20 20 56 64 62 65  Brk);.      Vdbe
1c680 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 62 52  CoverageIf(v, bR
1c690 65 76 3d 3d 30 29 3b 0a 20 20 20 20 20 20 56 64  ev==0);.      Vd
1c6a0 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
1c6b0 62 52 65 76 21 3d 30 29 3b 0a 20 20 20 20 7d 0a  bRev!=0);.    }.
1c6c0 20 20 20 20 69 66 28 20 70 45 6e 64 20 29 7b 0a      if( pEnd ){.
1c6d0 20 20 20 20 20 20 45 78 70 72 20 2a 70 58 3b 0a        Expr *pX;.
1c6e0 20 20 20 20 20 20 70 58 20 3d 20 70 45 6e 64 2d        pX = pEnd-
1c6f0 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73  >pExpr;.      as
1c700 73 65 72 74 28 20 70 58 21 3d 30 20 29 3b 0a 20  sert( pX!=0 );. 
1c710 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 45       assert( (pE
1c720 6e 64 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  nd->wtFlags & TE
1c730 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29 3b 0a  RM_VNULL)==0 );.
1c740 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1c750 70 45 6e 64 2d 3e 6c 65 66 74 43 75 72 73 6f 72  pEnd->leftCursor
1c760 21 3d 69 43 75 72 20 29 3b 20 2f 2a 20 54 72 61  !=iCur ); /* Tra
1c770 6e 73 69 74 69 76 65 20 63 6f 6e 73 74 72 61 69  nsitive constrai
1c780 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 74 65 73  nts */.      tes
1c790 74 63 61 73 65 28 20 70 45 6e 64 2d 3e 77 74 46  tcase( pEnd->wtF
1c7a0 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54  lags & TERM_VIRT
1c7b0 55 41 4c 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d  UAL );.      mem
1c7c0 45 6e 64 56 61 6c 75 65 20 3d 20 2b 2b 70 50 61  EndValue = ++pPa
1c7d0 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
1c7e0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1c7f0 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 52 69  (pParse, pX->pRi
1c800 67 68 74 2c 20 6d 65 6d 45 6e 64 56 61 6c 75 65  ght, memEndValue
1c810 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 58 2d  );.      if( pX-
1c820 3e 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 20 70 58  >op==TK_LT || pX
1c830 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20 29 7b 0a 20  ->op==TK_GT ){. 
1c840 20 20 20 20 20 20 20 74 65 73 74 4f 70 20 3d 20         testOp = 
1c850 62 52 65 76 20 3f 20 4f 50 5f 4c 65 20 3a 20 4f  bRev ? OP_Le : O
1c860 50 5f 47 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73  P_Ge;.      }els
1c870 65 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74 4f  e{.        testO
1c880 70 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f 4c 74  p = bRev ? OP_Lt
1c890 20 3a 20 4f 50 5f 47 74 3b 0a 20 20 20 20 20 20   : OP_Gt;.      
1c8a0 7d 0a 20 20 20 20 20 20 64 69 73 61 62 6c 65 54  }.      disableT
1c8b0 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 45 6e 64  erm(pLevel, pEnd
1c8c0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 74 61  );.    }.    sta
1c8d0 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rt = sqlite3Vdbe
1c8e0 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
1c8f0 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d      pLevel->op =
1c900 20 62 52 65 76 20 3f 20 4f 50 5f 50 72 65 76 20   bRev ? OP_Prev 
1c910 3a 20 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20 70  : OP_Next;.    p
1c920 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69 43 75 72  Level->p1 = iCur
1c930 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32  ;.    pLevel->p2
1c940 20 3d 20 73 74 61 72 74 3b 0a 20 20 20 20 61 73   = start;.    as
1c950 73 65 72 74 28 20 70 4c 65 76 65 6c 2d 3e 70 35  sert( pLevel->p5
1c960 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 74  ==0 );.    if( t
1c970 65 73 74 4f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29  estOp!=OP_Noop )
1c980 7b 0a 20 20 20 20 20 20 69 52 6f 77 69 64 52 65  {.      iRowidRe
1c990 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  g = ++pParse->nM
1c9a0 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  em;.      sqlite
1c9b0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1c9c0 50 5f 52 6f 77 69 64 2c 20 69 43 75 72 2c 20 69  P_Rowid, iCur, i
1c9d0 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20 20  RowidReg);.     
1c9e0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
1c9f0 65 53 74 6f 72 65 28 70 50 61 72 73 65 2c 20 69  eStore(pParse, i
1ca00 43 75 72 2c 20 2d 31 2c 20 69 52 6f 77 69 64 52  Cur, -1, iRowidR
1ca10 65 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  eg);.      sqlit
1ca20 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
1ca30 74 65 73 74 4f 70 2c 20 6d 65 6d 45 6e 64 56 61  testOp, memEndVa
1ca40 6c 75 65 2c 20 61 64 64 72 42 72 6b 2c 20 69 52  lue, addrBrk, iR
1ca50 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20 20 20  owidReg);.      
1ca60 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
1ca70 2c 20 74 65 73 74 4f 70 3d 3d 4f 50 5f 4c 65 29  , testOp==OP_Le)
1ca80 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
1ca90 72 61 67 65 49 66 28 76 2c 20 74 65 73 74 4f 70  rageIf(v, testOp
1caa0 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20 20 20 20 20  ==OP_Lt);.      
1cab0 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
1cac0 2c 20 74 65 73 74 4f 70 3d 3d 4f 50 5f 47 65 29  , testOp==OP_Ge)
1cad0 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
1cae0 72 61 67 65 49 66 28 76 2c 20 74 65 73 74 4f 70  rageIf(v, testOp
1caf0 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20 20 20 20 20  ==OP_Gt);.      
1cb00 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
1cb10 65 50 35 28 76 2c 20 53 51 4c 49 54 45 5f 41 46  eP5(v, SQLITE_AF
1cb20 46 5f 4e 55 4d 45 52 49 43 20 7c 20 53 51 4c 49  F_NUMERIC | SQLI
1cb30 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a  TE_JUMPIFNULL);.
1cb40 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
1cb50 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  ( pLoop->wsFlags
1cb60 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44   & WHERE_INDEXED
1cb70 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20   ){.    /* Case 
1cb80 34 3a 20 41 20 73 63 61 6e 20 75 73 69 6e 67 20  4: A scan using 
1cb90 61 6e 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2a  an index..    **
1cba0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
1cbb0 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
1cbc0 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 7a 65 72   may contain zer
1cbd0 6f 20 6f 72 20 6d 6f 72 65 20 65 71 75 61 6c 69  o or more equali
1cbe0 74 79 20 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  ty .    **      
1cbf0 20 20 20 74 65 72 6d 73 20 28 22 3d 3d 22 20 6f     terms ("==" o
1cc00 72 20 22 49 4e 22 20 6f 70 65 72 61 74 6f 72 73  r "IN" operators
1cc10 29 20 74 68 61 74 20 72 65 66 65 72 20 74 6f 20  ) that refer to 
1cc20 74 68 65 20 4e 0a 20 20 20 20 2a 2a 20 20 20 20  the N.    **    
1cc30 20 20 20 20 20 6c 65 66 74 2d 6d 6f 73 74 20 63       left-most c
1cc40 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 69 6e  olumns of the in
1cc50 64 65 78 2e 20 49 74 20 6d 61 79 20 61 6c 73 6f  dex. It may also
1cc60 20 63 6f 6e 74 61 69 6e 0a 20 20 20 20 2a 2a 20   contain.    ** 
1cc70 20 20 20 20 20 20 20 20 69 6e 65 71 75 61 6c 69          inequali
1cc80 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 28  ty constraints (
1cc90 3e 2c 20 3c 2c 20 3e 3d 20 6f 72 20 3c 3d 29 20  >, <, >= or <=) 
1cca0 6f 6e 20 74 68 65 20 69 6e 64 65 78 65 64 0a 20  on the indexed. 
1ccb0 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 63 6f     **         co
1ccc0 6c 75 6d 6e 20 74 68 61 74 20 69 6d 6d 65 64 69  lumn that immedi
1ccd0 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 73 20 74 68  ately follows th
1cce0 65 20 4e 20 65 71 75 61 6c 69 74 69 65 73 2e 20  e N equalities. 
1ccf0 4f 6e 6c 79 20 0a 20 20 20 20 2a 2a 20 20 20 20  Only .    **    
1cd00 20 20 20 20 20 74 68 65 20 72 69 67 68 74 2d 6d       the right-m
1cd10 6f 73 74 20 63 6f 6c 75 6d 6e 20 63 61 6e 20 62  ost column can b
1cd20 65 20 61 6e 20 69 6e 65 71 75 61 6c 69 74 79 20  e an inequality 
1cd30 2d 20 74 68 65 20 72 65 73 74 20 6d 75 73 74 0a  - the rest must.
1cd40 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 75      **         u
1cd50 73 65 20 74 68 65 20 22 3d 3d 22 20 61 6e 64 20  se the "==" and 
1cd60 22 49 4e 22 20 6f 70 65 72 61 74 6f 72 73 2e 20  "IN" operators. 
1cd70 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20  For example, if 
1cd80 74 68 65 20 0a 20 20 20 20 2a 2a 20 20 20 20 20  the .    **     
1cd90 20 20 20 20 69 6e 64 65 78 20 69 73 20 6f 6e 20      index is on 
1cda0 28 78 2c 79 2c 7a 29 2c 20 74 68 65 6e 20 74 68  (x,y,z), then th
1cdb0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6c 61 75  e following clau
1cdc0 73 65 73 20 61 72 65 20 61 6c 6c 20 0a 20 20 20  ses are all .   
1cdd0 20 2a 2a 20 20 20 20 20 20 20 20 20 6f 70 74 69   **         opti
1cde0 6d 69 7a 65 64 3a 0a 20 20 20 20 2a 2a 0a 20 20  mized:.    **.  
1cdf0 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20    **            
1ce00 78 3d 35 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  x=5.    **      
1ce10 20 20 20 20 20 20 78 3d 35 20 41 4e 44 20 79 3d        x=5 AND y=
1ce20 31 30 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  10.    **       
1ce30 20 20 20 20 20 78 3d 35 20 41 4e 44 20 79 3c 31       x=5 AND y<1
1ce40 30 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  0.    **        
1ce50 20 20 20 20 78 3d 35 20 41 4e 44 20 79 3e 35 20      x=5 AND y>5 
1ce60 41 4e 44 20 79 3c 31 30 0a 20 20 20 20 2a 2a 20  AND y<10.    ** 
1ce70 20 20 20 20 20 20 20 20 20 20 20 78 3d 35 20 41             x=5 A
1ce80 4e 44 20 79 3d 35 20 41 4e 44 20 7a 3c 3d 31 30  ND y=5 AND z<=10
1ce90 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
1cea0 20 20 20 20 20 20 20 54 68 65 20 7a 3c 31 30 20         The z<10 
1ceb0 74 65 72 6d 20 6f 66 20 74 68 65 20 66 6f 6c 6c  term of the foll
1cec0 6f 77 69 6e 67 20 63 61 6e 6e 6f 74 20 62 65 20  owing cannot be 
1ced0 75 73 65 64 2c 20 6f 6e 6c 79 0a 20 20 20 20 2a  used, only.    *
1cee0 2a 20 20 20 20 20 20 20 20 20 74 68 65 20 78 3d  *         the x=
1cef0 35 20 74 65 72 6d 3a 0a 20 20 20 20 2a 2a 0a 20  5 term:.    **. 
1cf00 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20     **           
1cf10 20 78 3d 35 20 41 4e 44 20 7a 3c 31 30 0a 20 20   x=5 AND z<10.  
1cf20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20    **.    **     
1cf30 20 20 20 20 4e 20 6d 61 79 20 62 65 20 7a 65 72      N may be zer
1cf40 6f 20 69 66 20 74 68 65 72 65 20 61 72 65 20 69  o if there are i
1cf50 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72  nequality constr
1cf60 61 69 6e 74 73 2e 0a 20 20 20 20 2a 2a 20 20 20  aints..    **   
1cf70 20 20 20 20 20 20 49 66 20 74 68 65 72 65 20 61        If there a
1cf80 72 65 20 6e 6f 20 69 6e 65 71 75 61 6c 69 74 79  re no inequality
1cf90 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20 74 68   constraints, th
1cfa0 65 6e 20 4e 20 69 73 20 61 74 0a 20 20 20 20 2a  en N is at.    *
1cfb0 2a 20 20 20 20 20 20 20 20 20 6c 65 61 73 74 20  *         least 
1cfc0 6f 6e 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  one..    **.    
1cfd0 2a 2a 20 20 20 20 20 20 20 20 20 54 68 69 73 20  **         This 
1cfe0 63 61 73 65 20 69 73 20 61 6c 73 6f 20 75 73 65  case is also use
1cff0 64 20 77 68 65 6e 20 74 68 65 72 65 20 61 72 65  d when there are
1d000 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65   no WHERE clause
1d010 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
1d020 63 6f 6e 73 74 72 61 69 6e 74 73 20 62 75 74 20  constraints but 
1d030 61 6e 20 69 6e 64 65 78 20 69 73 20 73 65 6c 65  an index is sele
1d040 63 74 65 64 20 61 6e 79 77 61 79 2c 20 69 6e 20  cted anyway, in 
1d050 6f 72 64 65 72 0a 20 20 20 20 2a 2a 20 20 20 20  order.    **    
1d060 20 20 20 20 20 74 6f 20 66 6f 72 63 65 20 74 68       to force th
1d070 65 20 6f 75 74 70 75 74 20 6f 72 64 65 72 20 74  e output order t
1d080 6f 20 63 6f 6e 66 6f 72 6d 20 74 6f 20 61 6e 20  o conform to an 
1d090 4f 52 44 45 52 20 42 59 2e 0a 20 20 20 20 2a 2f  ORDER BY..    */
1d0a0 20 20 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f    .    static co
1d0b0 6e 73 74 20 75 38 20 61 53 74 61 72 74 4f 70 5b  nst u8 aStartOp[
1d0c0 5d 20 3d 20 7b 0a 20 20 20 20 20 20 30 2c 0a 20  ] = {.      0,. 
1d0d0 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20 4f 50       0,.      OP
1d0e0 5f 52 65 77 69 6e 64 2c 20 20 20 20 20 20 20 20  _Rewind,        
1d0f0 20 20 20 2f 2a 20 32 3a 20 28 21 73 74 61 72 74     /* 2: (!start
1d100 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 26 26 20  _constraints && 
1d110 73 74 61 72 74 45 71 20 26 26 20 20 21 62 52 65  startEq &&  !bRe
1d120 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 4c  v) */.      OP_L
1d130 61 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  ast,            
1d140 20 2f 2a 20 33 3a 20 28 21 73 74 61 72 74 5f 63   /* 3: (!start_c
1d150 6f 6e 73 74 72 61 69 6e 74 73 20 26 26 20 73 74  onstraints && st
1d160 61 72 74 45 71 20 26 26 20 20 20 62 52 65 76 29  artEq &&   bRev)
1d170 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 53 65 65   */.      OP_See
1d180 6b 47 54 2c 20 20 20 20 20 20 20 20 20 20 20 2f  kGT,           /
1d190 2a 20 34 3a 20 28 73 74 61 72 74 5f 63 6f 6e 73  * 4: (start_cons
1d1a0 74 72 61 69 6e 74 73 20 20 26 26 20 21 73 74 61  traints  && !sta
1d1b0 72 74 45 71 20 26 26 20 21 62 52 65 76 29 20 2a  rtEq && !bRev) *
1d1c0 2f 0a 20 20 20 20 20 20 4f 50 5f 53 65 65 6b 4c  /.      OP_SeekL
1d1d0 54 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  T,           /* 
1d1e0 35 3a 20 28 73 74 61 72 74 5f 63 6f 6e 73 74 72  5: (start_constr
1d1f0 61 69 6e 74 73 20 20 26 26 20 21 73 74 61 72 74  aints  && !start
1d200 45 71 20 26 26 20 20 62 52 65 76 29 20 2a 2f 0a  Eq &&  bRev) */.
1d210 20 20 20 20 20 20 4f 50 5f 53 65 65 6b 47 45 2c        OP_SeekGE,
1d220 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 36 3a             /* 6:
1d230 20 28 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69   (start_constrai
1d240 6e 74 73 20 20 26 26 20 20 73 74 61 72 74 45 71  nts  &&  startEq
1d250 20 26 26 20 21 62 52 65 76 29 20 2a 2f 0a 20 20   && !bRev) */.  
1d260 20 20 20 20 4f 50 5f 53 65 65 6b 4c 45 20 20 20      OP_SeekLE   
1d270 20 20 20 20 20 20 20 20 20 2f 2a 20 37 3a 20 28           /* 7: (
1d280 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74  start_constraint
1d290 73 20 20 26 26 20 20 73 74 61 72 74 45 71 20 26  s  &&  startEq &
1d2a0 26 20 20 62 52 65 76 29 20 2a 2f 0a 20 20 20 20  &  bRev) */.    
1d2b0 7d 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f  };.    static co
1d2c0 6e 73 74 20 75 38 20 61 45 6e 64 4f 70 5b 5d 20  nst u8 aEndOp[] 
1d2d0 3d 20 7b 0a 20 20 20 20 20 20 4f 50 5f 49 64 78  = {.      OP_Idx
1d2e0 47 45 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  GE,            /
1d2f0 2a 20 30 3a 20 28 65 6e 64 5f 63 6f 6e 73 74 72  * 0: (end_constr
1d300 61 69 6e 74 73 20 26 26 20 21 62 52 65 76 20 26  aints && !bRev &
1d310 26 20 21 65 6e 64 45 71 29 20 2a 2f 0a 20 20 20  & !endEq) */.   
1d320 20 20 20 4f 50 5f 49 64 78 47 54 2c 20 20 20 20     OP_IdxGT,    
1d330 20 20 20 20 20 20 20 20 2f 2a 20 31 3a 20 28 65          /* 1: (e
1d340 6e 64 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 26  nd_constraints &
1d350 26 20 21 62 52 65 76 20 26 26 20 20 65 6e 64 45  & !bRev &&  endE
1d360 71 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 49  q) */.      OP_I
1d370 64 78 4c 45 2c 20 20 20 20 20 20 20 20 20 20 20  dxLE,           
1d380 20 2f 2a 20 32 3a 20 28 65 6e 64 5f 63 6f 6e 73   /* 2: (end_cons
1d390 74 72 61 69 6e 74 73 20 26 26 20 20 62 52 65 76  traints &&  bRev
1d3a0 20 26 26 20 21 65 6e 64 45 71 29 20 2a 2f 0a 20   && !endEq) */. 
1d3b0 20 20 20 20 20 4f 50 5f 49 64 78 4c 54 2c 20 20       OP_IdxLT,  
1d3c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 33 3a 20            /* 3: 
1d3d0 28 65 6e 64 5f 63 6f 6e 73 74 72 61 69 6e 74 73  (end_constraints
1d3e0 20 26 26 20 20 62 52 65 76 20 26 26 20 20 65 6e   &&  bRev &&  en
1d3f0 64 45 71 29 20 2a 2f 0a 20 20 20 20 7d 3b 0a 20  dEq) */.    };. 
1d400 20 20 20 75 31 36 20 6e 45 71 20 3d 20 70 4c 6f     u16 nEq = pLo
1d410 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b  op->u.btree.nEq;
1d420 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1d430 66 20 3d 3d 20 6f 72 20 49 4e 20 74 65 72 6d 73  f == or IN terms
1d440 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65 67 42   */.    int regB
1d450 61 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ase;            
1d460 20 20 20 20 20 2f 2a 20 42 61 73 65 20 72 65 67       /* Base reg
1d470 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 63 6f  ister holding co
1d480 6e 73 74 72 61 69 6e 74 20 76 61 6c 75 65 73 20  nstraint values 
1d490 2a 2f 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d  */.    WhereTerm
1d4a0 20 2a 70 52 61 6e 67 65 53 74 61 72 74 20 3d 20   *pRangeStart = 
1d4b0 30 3b 20 20 2f 2a 20 49 6e 65 71 75 61 6c 69 74  0;  /* Inequalit
1d4c0 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 74 20  y constraint at 
1d4d0 72 61 6e 67 65 20 73 74 61 72 74 20 2a 2f 0a 20  range start */. 
1d4e0 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 52     WhereTerm *pR
1d4f0 61 6e 67 65 45 6e 64 20 3d 20 30 3b 20 20 20 20  angeEnd = 0;    
1d500 2f 2a 20 49 6e 65 71 75 61 6c 69 74 79 20 63 6f  /* Inequality co
1d510 6e 73 74 72 61 69 6e 74 20 61 74 20 72 61 6e 67  nstraint at rang
1d520 65 20 65 6e 64 20 2a 2f 0a 20 20 20 20 69 6e 74  e end */.    int
1d530 20 73 74 61 72 74 45 71 3b 20 20 20 20 20 20 20   startEq;       
1d540 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
1d550 65 20 69 66 20 72 61 6e 67 65 20 73 74 61 72 74  e if range start
1d560 20 75 73 65 73 20 3d 3d 2c 20 3e 3d 20 6f 72 20   uses ==, >= or 
1d570 3c 3d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 65 6e  <= */.    int en
1d580 64 45 71 3b 20 20 20 20 20 20 20 20 20 20 20 20  dEq;            
1d590 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
1d5a0 66 20 72 61 6e 67 65 20 65 6e 64 20 75 73 65 73  f range end uses
1d5b0 20 3d 3d 2c 20 3e 3d 20 6f 72 20 3c 3d 20 2a 2f   ==, >= or <= */
1d5c0 0a 20 20 20 20 69 6e 74 20 73 74 61 72 74 5f 63  .    int start_c
1d5d0 6f 6e 73 74 72 61 69 6e 74 73 3b 20 20 20 20 20  onstraints;     
1d5e0 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 72 61    /* Start of ra
1d5f0 6e 67 65 20 69 73 20 63 6f 6e 73 74 72 61 69 6e  nge is constrain
1d600 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 43  ed */.    int nC
1d610 6f 6e 73 74 72 61 69 6e 74 3b 20 20 20 20 20 20  onstraint;      
1d620 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1d630 20 6f 66 20 63 6f 6e 73 74 72 61 69 6e 74 20 74   of constraint t
1d640 65 72 6d 73 20 2a 2f 0a 20 20 20 20 49 6e 64 65  erms */.    Inde
1d650 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20  x *pIdx;        
1d660 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1d670 69 6e 64 65 78 20 77 65 20 77 69 6c 6c 20 62 65  index we will be
1d680 20 75 73 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e   using */.    in
1d690 74 20 69 49 64 78 43 75 72 3b 20 20 20 20 20 20  t iIdxCur;      
1d6a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1d6b0 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 66 6f  e VDBE cursor fo
1d6c0 72 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20  r the index */. 
1d6d0 20 20 20 69 6e 74 20 6e 45 78 74 72 61 52 65 67     int nExtraReg
1d6e0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
1d6f0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 78 74  /* Number of ext
1d700 72 61 20 72 65 67 69 73 74 65 72 73 20 6e 65 65  ra registers nee
1d710 64 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6f  ded */.    int o
1d720 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
1d730 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 73 74 72          /* Instr
1d740 75 63 74 69 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f  uction opcode */
1d750 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 74 61 72  .    char *zStar
1d760 74 41 66 66 3b 20 20 20 20 20 20 20 20 20 20 20  tAff;           
1d770 20 20 2f 2a 20 41 66 66 69 6e 69 74 79 20 66 6f    /* Affinity fo
1d780 72 20 73 74 61 72 74 20 6f 66 20 72 61 6e 67 65  r start of range
1d790 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20   constraint */. 
1d7a0 20 20 20 63 68 61 72 20 63 45 6e 64 41 66 66 20     char cEndAff 
1d7b0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
1d7c0 2f 2a 20 41 66 66 69 6e 69 74 79 20 66 6f 72 20  /* Affinity for 
1d7d0 65 6e 64 20 6f 66 20 72 61 6e 67 65 20 63 6f 6e  end of range con
1d7e0 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20 20 75  straint */.    u
1d7f0 38 20 62 53 65 65 6b 50 61 73 74 4e 75 6c 6c 20  8 bSeekPastNull 
1d800 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  = 0;        /* T
1d810 72 75 65 20 74 6f 20 73 65 65 6b 20 70 61 73 74  rue to seek past
1d820 20 69 6e 69 74 69 61 6c 20 6e 75 6c 6c 73 20 2a   initial nulls *
1d830 2f 0a 20 20 20 20 75 38 20 62 53 74 6f 70 41 74  /.    u8 bStopAt
1d840 4e 75 6c 6c 20 3d 20 30 3b 20 20 20 20 20 20 20  Null = 0;       
1d850 20 20 20 2f 2a 20 41 64 64 20 63 6f 6e 64 69 74     /* Add condit
1d860 69 6f 6e 20 74 6f 20 74 65 72 6d 69 6e 61 74 65  ion to terminate
1d870 20 61 74 20 4e 55 4c 4c 73 20 2a 2f 0a 0a 20 20   at NULLs */..  
1d880 20 20 70 49 64 78 20 3d 20 70 4c 6f 6f 70 2d 3e    pIdx = pLoop->
1d890 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a  u.btree.pIndex;.
1d8a0 20 20 20 20 69 49 64 78 43 75 72 20 3d 20 70 4c      iIdxCur = pL
1d8b0 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20  evel->iIdxCur;. 
1d8c0 20 20 20 61 73 73 65 72 74 28 20 6e 45 71 3e 3d     assert( nEq>=
1d8d0 70 4c 6f 6f 70 2d 3e 6e 53 6b 69 70 20 29 3b 0a  pLoop->nSkip );.
1d8e0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
1d8f0 6c 6f 6f 70 20 73 61 74 69 73 66 69 65 73 20 61  loop satisfies a
1d900 20 73 6f 72 74 20 6f 72 64 65 72 20 28 70 4f 72   sort order (pOr
1d910 64 65 72 42 79 29 20 72 65 71 75 65 73 74 20 74  derBy) request t
1d920 68 61 74 20 0a 20 20 20 20 2a 2a 20 77 61 73 20  hat .    ** was 
1d930 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 66  passed to this f
1d940 75 6e 63 74 69 6f 6e 20 74 6f 20 69 6d 70 6c 65  unction to imple
1d950 6d 65 6e 74 20 61 20 22 53 45 4c 45 43 54 20 6d  ment a "SELECT m
1d960 69 6e 28 78 29 20 2e 2e 2e 22 20 0a 20 20 20 20  in(x) ..." .    
1d970 2a 2a 20 71 75 65 72 79 2c 20 74 68 65 6e 20 74  ** query, then t
1d980 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6f  he caller will o
1d990 6e 6c 79 20 61 6c 6c 6f 77 20 74 68 65 20 6c 6f  nly allow the lo
1d9a0 6f 70 20 74 6f 20 72 75 6e 20 66 6f 72 0a 20 20  op to run for.  
1d9b0 20 20 2a 2a 20 61 20 73 69 6e 67 6c 65 20 69 74    ** a single it
1d9c0 65 72 61 74 69 6f 6e 2e 20 54 68 69 73 20 6d 65  eration. This me
1d9d0 61 6e 73 20 74 68 61 74 20 74 68 65 20 66 69 72  ans that the fir
1d9e0 73 74 20 72 6f 77 20 72 65 74 75 72 6e 65 64 0a  st row returned.
1d9f0 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20 6e 6f      ** should no
1da00 74 20 68 61 76 65 20 61 20 4e 55 4c 4c 20 76 61  t have a NULL va
1da10 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20 27 78  lue stored in 'x
1da20 27 2e 20 49 66 20 63 6f 6c 75 6d 6e 20 27 78 27  '. If column 'x'
1da30 20 69 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 66   is.    ** the f
1da40 69 72 73 74 20 6f 6e 65 20 61 66 74 65 72 20 74  irst one after t
1da50 68 65 20 6e 45 71 20 65 71 75 61 6c 69 74 79 20  he nEq equality 
1da60 63 6f 6e 73 74 72 61 69 6e 74 73 20 69 6e 20 74  constraints in t
1da70 68 65 20 69 6e 64 65 78 2c 0a 20 20 20 20 2a 2a  he index,.    **
1da80 20 74 68 69 73 20 72 65 71 75 69 72 65 73 20 73   this requires s
1da90 6f 6d 65 20 73 70 65 63 69 61 6c 20 68 61 6e 64  ome special hand
1daa0 6c 69 6e 67 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ling..    */.   
1dab0 20 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d   assert( pWInfo-
1dac0 3e 70 4f 72 64 65 72 42 79 3d 3d 30 0a 20 20 20  >pOrderBy==0.   
1dad0 20 20 20 20 20 20 7c 7c 20 70 57 49 6e 66 6f 2d        || pWInfo-
1dae0 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  >pOrderBy->nExpr
1daf0 3d 3d 31 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  ==1.         || 
1db00 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c  (pWInfo->wctrlFl
1db10 61 67 73 26 57 48 45 52 45 5f 4f 52 44 45 52 42  ags&WHERE_ORDERB
1db20 59 5f 4d 49 4e 29 3d 3d 30 20 29 3b 0a 20 20 20  Y_MIN)==0 );.   
1db30 20 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63   if( (pWInfo->wc
1db40 74 72 6c 46 6c 61 67 73 26 57 48 45 52 45 5f 4f  trlFlags&WHERE_O
1db50 52 44 45 52 42 59 5f 4d 49 4e 29 21 3d 30 0a 20  RDERBY_MIN)!=0. 
1db60 20 20 20 20 26 26 20 70 57 49 6e 66 6f 2d 3e 6e      && pWInfo->n
1db70 4f 42 53 61 74 3e 30 0a 20 20 20 20 20 26 26 20  OBSat>0.     && 
1db80 28 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3e 6e  (pIdx->nKeyCol>n
1db90 45 71 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  Eq).    ){.     
1dba0 20 61 73 73 65 72 74 28 20 70 4c 6f 6f 70 2d 3e   assert( pLoop->
1dbb0 6e 53 6b 69 70 3d 3d 30 20 29 3b 0a 20 20 20 20  nSkip==0 );.    
1dbc0 20 20 62 53 65 65 6b 50 61 73 74 4e 75 6c 6c 20    bSeekPastNull 
1dbd0 3d 20 31 3b 0a 20 20 20 20 20 20 6e 45 78 74 72  = 1;.      nExtr
1dbe0 61 52 65 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  aReg = 1;.    }.
1dbf0 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20 61 6e 79  .    /* Find any
1dc00 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73   inequality cons
1dc10 74 72 61 69 6e 74 20 74 65 72 6d 73 20 66 6f 72  traint terms for
1dc20 20 74 68 65 20 73 74 61 72 74 20 61 6e 64 20 65   the start and e
1dc30 6e 64 20 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68  nd .    ** of th
1dc40 65 20 72 61 6e 67 65 2e 20 0a 20 20 20 20 2a 2f  e range. .    */
1dc50 0a 20 20 20 20 6a 20 3d 20 6e 45 71 3b 0a 20 20  .    j = nEq;.  
1dc60 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46    if( pLoop->wsF
1dc70 6c 61 67 73 20 26 20 57 48 45 52 45 5f 42 54 4d  lags & WHERE_BTM
1dc80 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 20 20  _LIMIT ){.      
1dc90 70 52 61 6e 67 65 53 74 61 72 74 20 3d 20 70 4c  pRangeStart = pL
1dca0 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 2b 2b 5d  oop->aLTerm[j++]
1dcb0 3b 0a 20 20 20 20 20 20 6e 45 78 74 72 61 52 65  ;.      nExtraRe
1dcc0 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  g = 1;.    }.   
1dcd0 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c   if( pLoop->wsFl
1dce0 61 67 73 20 26 20 57 48 45 52 45 5f 54 4f 50 5f  ags & WHERE_TOP_
1dcf0 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 20 20 70  LIMIT ){.      p
1dd00 52 61 6e 67 65 45 6e 64 20 3d 20 70 4c 6f 6f 70  RangeEnd = pLoop
1dd10 2d 3e 61 4c 54 65 72 6d 5b 6a 2b 2b 5d 3b 0a 20  ->aLTerm[j++];. 
1dd20 20 20 20 20 20 6e 45 78 74 72 61 52 65 67 20 3d       nExtraReg =
1dd30 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20 70 52   1;.      if( pR
1dd40 61 6e 67 65 53 74 61 72 74 3d 3d 30 0a 20 20 20  angeStart==0.   
1dd50 20 20 20 20 26 26 20 28 6a 20 3d 20 70 49 64 78      && (j = pIdx
1dd60 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 45 71 5d 29  ->aiColumn[nEq])
1dd70 3e 3d 30 20 0a 20 20 20 20 20 20 20 26 26 20 70  >=0 .       && p
1dd80 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f  Idx->pTable->aCo
1dd90 6c 5b 6a 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 0a  l[j].notNull==0.
1dda0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
1ddb0 20 62 53 65 65 6b 50 61 73 74 4e 75 6c 6c 20 3d   bSeekPastNull =
1ddc0 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
1ddd0 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 52  }.    assert( pR
1dde0 61 6e 67 65 45 6e 64 3d 3d 30 20 7c 7c 20 28 70  angeEnd==0 || (p
1ddf0 52 61 6e 67 65 45 6e 64 2d 3e 77 74 46 6c 61 67  RangeEnd->wtFlag
1de00 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d  s & TERM_VNULL)=
1de10 3d 30 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 47 65  =0 );..    /* Ge
1de20 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 65  nerate code to e
1de30 76 61 6c 75 61 74 65 20 61 6c 6c 20 63 6f 6e 73  valuate all cons
1de40 74 72 61 69 6e 74 20 74 65 72 6d 73 20 75 73 69  traint terms usi
1de50 6e 67 20 3d 3d 20 6f 72 20 49 4e 0a 20 20 20 20  ng == or IN.    
1de60 2a 2a 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65  ** and store the
1de70 20 76 61 6c 75 65 73 20 6f 66 20 74 68 6f 73 65   values of those
1de80 20 74 65 72 6d 73 20 69 6e 20 61 6e 20 61 72 72   terms in an arr
1de90 61 79 20 6f 66 20 72 65 67 69 73 74 65 72 73 0a  ay of registers.
1dea0 20 20 20 20 2a 2a 20 73 74 61 72 74 69 6e 67 20      ** starting 
1deb0 61 74 20 72 65 67 42 61 73 65 2e 0a 20 20 20 20  at regBase..    
1dec0 2a 2f 0a 20 20 20 20 72 65 67 42 61 73 65 20 3d  */.    regBase =
1ded0 20 63 6f 64 65 41 6c 6c 45 71 75 61 6c 69 74 79   codeAllEquality
1dee0 54 65 72 6d 73 28 70 50 61 72 73 65 2c 70 4c 65  Terms(pParse,pLe
1def0 76 65 6c 2c 62 52 65 76 2c 6e 45 78 74 72 61 52  vel,bRev,nExtraR
1df00 65 67 2c 26 7a 53 74 61 72 74 41 66 66 29 3b 0a  eg,&zStartAff);.
1df10 20 20 20 20 61 73 73 65 72 74 28 20 7a 53 74 61      assert( zSta
1df20 72 74 41 66 66 3d 3d 30 20 7c 7c 20 73 71 6c 69  rtAff==0 || sqli
1df30 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 53 74 61  te3Strlen30(zSta
1df40 72 74 41 66 66 29 3e 3d 6e 45 71 20 29 3b 0a 20  rtAff)>=nEq );. 
1df50 20 20 20 69 66 28 20 7a 53 74 61 72 74 41 66 66     if( zStartAff
1df60 20 29 20 63 45 6e 64 41 66 66 20 3d 20 7a 53 74   ) cEndAff = zSt
1df70 61 72 74 41 66 66 5b 6e 45 71 5d 3b 0a 20 20 20  artAff[nEq];.   
1df80 20 61 64 64 72 4e 78 74 20 3d 20 70 4c 65 76 65   addrNxt = pLeve
1df90 6c 2d 3e 61 64 64 72 4e 78 74 3b 0a 0a 20 20 20  l->addrNxt;..   
1dfa0 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 64 6f   /* If we are do
1dfb0 69 6e 67 20 61 20 72 65 76 65 72 73 65 20 6f 72  ing a reverse or
1dfc0 64 65 72 20 73 63 61 6e 20 6f 6e 20 61 6e 20 61  der scan on an a
1dfd0 73 63 65 6e 64 69 6e 67 20 69 6e 64 65 78 2c 20  scending index, 
1dfe0 6f 72 0a 20 20 20 20 2a 2a 20 61 20 66 6f 72 77  or.    ** a forw
1dff0 61 72 64 20 6f 72 64 65 72 20 73 63 61 6e 20 6f  ard order scan o
1e000 6e 20 61 20 64 65 73 63 65 6e 64 69 6e 67 20 69  n a descending i
1e010 6e 64 65 78 2c 20 69 6e 74 65 72 63 68 61 6e 67  ndex, interchang
1e020 65 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 73 74  e the .    ** st
1e030 61 72 74 20 61 6e 64 20 65 6e 64 20 74 65 72 6d  art and end term
1e040 73 20 28 70 52 61 6e 67 65 53 74 61 72 74 20 61  s (pRangeStart a
1e050 6e 64 20 70 52 61 6e 67 65 45 6e 64 29 2e 0a 20  nd pRangeEnd).. 
1e060 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 6e     */.    if( (n
1e070 45 71 3c 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c  Eq<pIdx->nKeyCol
1e080 20 26 26 20 62 52 65 76 3d 3d 28 70 49 64 78 2d   && bRev==(pIdx-
1e090 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6e 45 71 5d  >aSortOrder[nEq]
1e0a0 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43 29  ==SQLITE_SO_ASC)
1e0b0 29 0a 20 20 20 20 20 7c 7c 20 28 62 52 65 76 20  ).     || (bRev 
1e0c0 26 26 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c  && pIdx->nKeyCol
1e0d0 3d 3d 6e 45 71 29 0a 20 20 20 20 29 7b 0a 20 20  ==nEq).    ){.  
1e0e0 20 20 20 20 53 57 41 50 28 57 68 65 72 65 54 65      SWAP(WhereTe
1e0f0 72 6d 20 2a 2c 20 70 52 61 6e 67 65 45 6e 64 2c  rm *, pRangeEnd,
1e100 20 70 52 61 6e 67 65 53 74 61 72 74 29 3b 0a 20   pRangeStart);. 
1e110 20 20 20 20 20 53 57 41 50 28 75 38 2c 20 62 53       SWAP(u8, bS
1e120 65 65 6b 50 61 73 74 4e 75 6c 6c 2c 20 62 53 74  eekPastNull, bSt
1e130 6f 70 41 74 4e 75 6c 6c 29 3b 0a 20 20 20 20 7d  opAtNull);.    }
1e140 0a 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ..    testcase( 
1e150 70 52 61 6e 67 65 53 74 61 72 74 20 26 26 20 28  pRangeStart && (
1e160 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 65 4f 70  pRangeStart->eOp
1e170 65 72 61 74 6f 72 20 26 20 57 4f 5f 4c 45 29 21  erator & WO_LE)!
1e180 3d 30 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  =0 );.    testca
1e190 73 65 28 20 70 52 61 6e 67 65 53 74 61 72 74 20  se( pRangeStart 
1e1a0 26 26 20 28 70 52 61 6e 67 65 53 74 61 72 74 2d  && (pRangeStart-
1e1b0 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
1e1c0 47 45 29 21 3d 30 20 29 3b 0a 20 20 20 20 74 65  GE)!=0 );.    te
1e1d0 73 74 63 61 73 65 28 20 70 52 61 6e 67 65 45 6e  stcase( pRangeEn
1e1e0 64 20 26 26 20 28 70 52 61 6e 67 65 45 6e 64 2d  d && (pRangeEnd-
1e1f0 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
1e200 4c 45 29 21 3d 30 20 29 3b 0a 20 20 20 20 74 65  LE)!=0 );.    te
1e210 73 74 63 61 73 65 28 20 70 52 61 6e 67 65 45 6e  stcase( pRangeEn
1e220 64 20 26 26 20 28 70 52 61 6e 67 65 45 6e 64 2d  d && (pRangeEnd-
1e230 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
1e240 47 45 29 21 3d 30 20 29 3b 0a 20 20 20 20 73 74  GE)!=0 );.    st
1e250 61 72 74 45 71 20 3d 20 21 70 52 61 6e 67 65 53  artEq = !pRangeS
1e260 74 61 72 74 20 7c 7c 20 70 52 61 6e 67 65 53 74  tart || pRangeSt
1e270 61 72 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  art->eOperator &
1e280 20 28 57 4f 5f 4c 45 7c 57 4f 5f 47 45 29 3b 0a   (WO_LE|WO_GE);.
1e290 20 20 20 20 65 6e 64 45 71 20 3d 20 20 20 21 70      endEq =   !p
1e2a0 52 61 6e 67 65 45 6e 64 20 7c 7c 20 70 52 61 6e  RangeEnd || pRan
1e2b0 67 65 45 6e 64 2d 3e 65 4f 70 65 72 61 74 6f 72  geEnd->eOperator
1e2c0 20 26 20 28 57 4f 5f 4c 45 7c 57 4f 5f 47 45 29   & (WO_LE|WO_GE)
1e2d0 3b 0a 20 20 20 20 73 74 61 72 74 5f 63 6f 6e 73  ;.    start_cons
1e2e0 74 72 61 69 6e 74 73 20 3d 20 70 52 61 6e 67 65  traints = pRange
1e2f0 53 74 61 72 74 20 7c 7c 20 6e 45 71 3e 30 3b 0a  Start || nEq>0;.
1e300 0a 20 20 20 20 2f 2a 20 53 65 65 6b 20 74 68 65  .    /* Seek the
1e310 20 69 6e 64 65 78 20 63 75 72 73 6f 72 20 74 6f   index cursor to
1e320 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
1e330 65 20 72 61 6e 67 65 2e 20 2a 2f 0a 20 20 20 20  e range. */.    
1e340 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 6e 45  nConstraint = nE
1e350 71 3b 0a 20 20 20 20 69 66 28 20 70 52 61 6e 67  q;.    if( pRang
1e360 65 53 74 61 72 74 20 29 7b 0a 20 20 20 20 20 20  eStart ){.      
1e370 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70  Expr *pRight = p
1e380 52 61 6e 67 65 53 74 61 72 74 2d 3e 70 45 78 70  RangeStart->pExp
1e390 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20  r->pRight;.     
1e3a0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1e3b0 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 2c  (pParse, pRight,
1e3c0 20 72 65 67 42 61 73 65 2b 6e 45 71 29 3b 0a 20   regBase+nEq);. 
1e3d0 20 20 20 20 20 69 66 28 20 28 70 52 61 6e 67 65       if( (pRange
1e3e0 53 74 61 72 74 2d 3e 77 74 46 6c 61 67 73 20 26  Start->wtFlags &
1e3f0 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 0a   TERM_VNULL)==0.
1e400 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65         && sqlite
1e410 33 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28 70  3ExprCanBeNull(p
1e420 52 69 67 68 74 29 0a 20 20 20 20 20 20 29 7b 0a  Right).      ){.
1e430 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1e440 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1e450 49 73 4e 75 6c 6c 2c 20 72 65 67 42 61 73 65 2b  IsNull, regBase+
1e460 6e 45 71 2c 20 61 64 64 72 4e 78 74 29 3b 0a 20  nEq, addrNxt);. 
1e470 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
1e480 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 7d 0a  age(v);.      }.
1e490 20 20 20 20 20 20 69 66 28 20 7a 53 74 61 72 74        if( zStart
1e4a0 41 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20 69  Aff ){.        i
1e4b0 66 28 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72  f( sqlite3Compar
1e4c0 65 41 66 66 69 6e 69 74 79 28 70 52 69 67 68 74  eAffinity(pRight
1e4d0 2c 20 7a 53 74 61 72 74 41 66 66 5b 6e 45 71 5d  , zStartAff[nEq]
1e4e0 29 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f  )==SQLITE_AFF_NO
1e4f0 4e 45 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  NE){.          /
1e500 2a 20 53 69 6e 63 65 20 74 68 65 20 63 6f 6d 70  * Since the comp
1e510 61 72 69 73 6f 6e 20 69 73 20 74 6f 20 62 65 20  arison is to be 
1e520 70 65 72 66 6f 72 6d 65 64 20 77 69 74 68 20 6e  performed with n
1e530 6f 20 63 6f 6e 76 65 72 73 69 6f 6e 73 0a 20 20  o conversions.  
1e540 20 20 20 20 20 20 20 20 2a 2a 20 61 70 70 6c 69          ** appli
1e550 65 64 20 74 6f 20 74 68 65 20 6f 70 65 72 61 6e  ed to the operan
1e560 64 73 2c 20 73 65 74 20 74 68 65 20 61 66 66 69  ds, set the affi
1e570 6e 69 74 79 20 74 6f 20 61 70 70 6c 79 20 74 6f  nity to apply to
1e580 20 70 52 69 67 68 74 20 74 6f 20 0a 20 20 20 20   pRight to .    
1e590 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f        ** SQLITE_
1e5a0 41 46 46 5f 4e 4f 4e 45 2e 20 20 2a 2f 0a 20 20  AFF_NONE.  */.  
1e5b0 20 20 20 20 20 20 20 20 7a 53 74 61 72 74 41 66          zStartAf
1e5c0 66 5b 6e 45 71 5d 20 3d 20 53 51 4c 49 54 45 5f  f[nEq] = SQLITE_
1e5d0 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20  AFF_NONE;.      
1e5e0 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
1e5f0 73 71 6c 69 74 65 33 45 78 70 72 4e 65 65 64 73  sqlite3ExprNeeds
1e600 4e 6f 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  NoAffinityChange
1e610 28 70 52 69 67 68 74 2c 20 7a 53 74 61 72 74 41  (pRight, zStartA
1e620 66 66 5b 6e 45 71 5d 29 20 29 7b 0a 20 20 20 20  ff[nEq]) ){.    
1e630 20 20 20 20 20 20 7a 53 74 61 72 74 41 66 66 5b        zStartAff[
1e640 6e 45 71 5d 20 3d 20 53 51 4c 49 54 45 5f 41 46  nEq] = SQLITE_AF
1e650 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20  F_NONE;.        
1e660 7d 0a 20 20 20 20 20 20 7d 20 20 0a 20 20 20 20  }.      }  .    
1e670 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b    nConstraint++;
1e680 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1e690 20 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 77 74   pRangeStart->wt
1e6a0 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52  Flags & TERM_VIR
1e6b0 54 55 41 4c 20 29 3b 0a 20 20 20 20 7d 65 6c 73  TUAL );.    }els
1e6c0 65 20 69 66 28 20 62 53 65 65 6b 50 61 73 74 4e  e if( bSeekPastN
1e6d0 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ull ){.      sql
1e6e0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1e6f0 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65  , OP_Null, 0, re
1e700 67 42 61 73 65 2b 6e 45 71 29 3b 0a 20 20 20 20  gBase+nEq);.    
1e710 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b    nConstraint++;
1e720 0a 20 20 20 20 20 20 73 74 61 72 74 45 71 20 3d  .      startEq =
1e730 20 30 3b 0a 20 20 20 20 20 20 73 74 61 72 74 5f   0;.      start_
1e740 63 6f 6e 73 74 72 61 69 6e 74 73 20 3d 20 31 3b  constraints = 1;
1e750 0a 20 20 20 20 7d 0a 20 20 20 20 63 6f 64 65 41  .    }.    codeA
1e760 70 70 6c 79 41 66 66 69 6e 69 74 79 28 70 50 61  pplyAffinity(pPa
1e770 72 73 65 2c 20 72 65 67 42 61 73 65 2c 20 6e 43  rse, regBase, nC
1e780 6f 6e 73 74 72 61 69 6e 74 20 2d 20 62 53 65 65  onstraint - bSee
1e790 6b 50 61 73 74 4e 75 6c 6c 2c 20 7a 53 74 61 72  kPastNull, zStar
1e7a0 74 41 66 66 29 3b 0a 20 20 20 20 6f 70 20 3d 20  tAff);.    op = 
1e7b0 61 53 74 61 72 74 4f 70 5b 28 73 74 61 72 74 5f  aStartOp[(start_
1e7c0 63 6f 6e 73 74 72 61 69 6e 74 73 3c 3c 32 29 20  constraints<<2) 
1e7d0 2b 20 28 73 74 61 72 74 45 71 3c 3c 31 29 20 2b  + (startEq<<1) +
1e7e0 20 62 52 65 76 5d 3b 0a 20 20 20 20 61 73 73 65   bRev];.    asse
1e7f0 72 74 28 20 6f 70 21 3d 30 20 29 3b 0a 20 20 20  rt( op!=0 );.   
1e800 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1e810 70 34 49 6e 74 28 76 2c 20 6f 70 2c 20 69 49 64  p4Int(v, op, iId
1e820 78 43 75 72 2c 20 61 64 64 72 4e 78 74 2c 20 72  xCur, addrNxt, r
1e830 65 67 42 61 73 65 2c 20 6e 43 6f 6e 73 74 72 61  egBase, nConstra
1e840 69 6e 74 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  int);.    VdbeCo
1e850 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 56  verage(v);.    V
1e860 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
1e870 20 6f 70 3d 3d 4f 50 5f 52 65 77 69 6e 64 29 3b   op==OP_Rewind);
1e880 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1e890 4f 50 5f 52 65 77 69 6e 64 20 29 3b 0a 20 20 20  OP_Rewind );.   
1e8a0 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
1e8b0 76 2c 20 6f 70 3d 3d 4f 50 5f 4c 61 73 74 29 3b  v, op==OP_Last);
1e8c0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
1e8d0 3d 3d 4f 50 5f 4c 61 73 74 20 29 3b 0a 20 20 20  ==OP_Last );.   
1e8e0 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
1e8f0 76 2c 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 47 54  v, op==OP_SeekGT
1e900 29 3b 20 20 74 65 73 74 63 61 73 65 28 20 6f 70  );  testcase( op
1e910 3d 3d 4f 50 5f 53 65 65 6b 47 54 20 29 3b 0a 20  ==OP_SeekGT );. 
1e920 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
1e930 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b  f(v, op==OP_Seek
1e940 47 45 29 3b 20 20 74 65 73 74 63 61 73 65 28 20  GE);  testcase( 
1e950 6f 70 3d 3d 4f 50 5f 53 65 65 6b 47 45 20 29 3b  op==OP_SeekGE );
1e960 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67  .    VdbeCoverag
1e970 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 53 65  eIf(v, op==OP_Se
1e980 65 6b 4c 45 29 3b 20 20 74 65 73 74 63 61 73 65  ekLE);  testcase
1e990 28 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 4c 45 20  ( op==OP_SeekLE 
1e9a0 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72  );.    VdbeCover
1e9b0 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f  ageIf(v, op==OP_
1e9c0 53 65 65 6b 4c 54 29 3b 20 20 74 65 73 74 63 61  SeekLT);  testca
1e9d0 73 65 28 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 4c  se( op==OP_SeekL
1e9e0 54 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 4c 6f 61  T );..    /* Loa
1e9f0 64 20 74 68 65 20 76 61 6c 75 65 20 66 6f 72 20  d the value for 
1ea00 74 68 65 20 69 6e 65 71 75 61 6c 69 74 79 20 63  the inequality c
1ea10 6f 6e 73 74 72 61 69 6e 74 20 61 74 20 74 68 65  onstraint at the
1ea20 20 65 6e 64 20 6f 66 20 74 68 65 0a 20 20 20 20   end of the.    
1ea30 2a 2a 20 72 61 6e 67 65 20 28 69 66 20 61 6e 79  ** range (if any
1ea40 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e 43  )..    */.    nC
1ea50 6f 6e 73 74 72 61 69 6e 74 20 3d 20 6e 45 71 3b  onstraint = nEq;
1ea60 0a 20 20 20 20 69 66 28 20 70 52 61 6e 67 65 45  .    if( pRangeE
1ea70 6e 64 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72  nd ){.      Expr
1ea80 20 2a 70 52 69 67 68 74 20 3d 20 70 52 61 6e 67   *pRight = pRang
1ea90 65 45 6e 64 2d 3e 70 45 78 70 72 2d 3e 70 52 69  eEnd->pExpr->pRi
1eaa0 67 68 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ght;.      sqlit
1eab0 65 33 45 78 70 72 43 61 63 68 65 52 65 6d 6f 76  e3ExprCacheRemov
1eac0 65 28 70 50 61 72 73 65 2c 20 72 65 67 42 61 73  e(pParse, regBas
1ead0 65 2b 6e 45 71 2c 20 31 29 3b 0a 20 20 20 20 20  e+nEq, 1);.     
1eae0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1eaf0 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 2c  (pParse, pRight,
1eb00 20 72 65 67 42 61 73 65 2b 6e 45 71 29 3b 0a 20   regBase+nEq);. 
1eb10 20 20 20 20 20 69 66 28 20 28 70 52 61 6e 67 65       if( (pRange
1eb20 45 6e 64 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  End->wtFlags & T
1eb30 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 0a 20 20  ERM_VNULL)==0.  
1eb40 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 45       && sqlite3E
1eb50 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28 70 52 69  xprCanBeNull(pRi
1eb60 67 68 74 29 0a 20 20 20 20 20 20 29 7b 0a 20 20  ght).      ){.  
1eb70 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1eb80 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73  eAddOp2(v, OP_Is
1eb90 4e 75 6c 6c 2c 20 72 65 67 42 61 73 65 2b 6e 45  Null, regBase+nE
1eba0 71 2c 20 61 64 64 72 4e 78 74 29 3b 0a 20 20 20  q, addrNxt);.   
1ebb0 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
1ebc0 65 28 76 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  e(v);.      }.  
1ebd0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 43      if( sqlite3C
1ebe0 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 70  ompareAffinity(p
1ebf0 52 69 67 68 74 2c 20 63 45 6e 64 41 66 66 29 21  Right, cEndAff)!
1ec00 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45  =SQLITE_AFF_NONE
1ec10 0a 20 20 20 20 20 20 20 26 26 20 21 73 71 6c 69  .       && !sqli
1ec20 74 65 33 45 78 70 72 4e 65 65 64 73 4e 6f 41 66  te3ExprNeedsNoAf
1ec30 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 52 69  finityChange(pRi
1ec40 67 68 74 2c 20 63 45 6e 64 41 66 66 29 0a 20 20  ght, cEndAff).  
1ec50 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 63      ){.        c
1ec60 6f 64 65 41 70 70 6c 79 41 66 66 69 6e 69 74 79  odeApplyAffinity
1ec70 28 70 50 61 72 73 65 2c 20 72 65 67 42 61 73 65  (pParse, regBase
1ec80 2b 6e 45 71 2c 20 31 2c 20 26 63 45 6e 64 41 66  +nEq, 1, &cEndAf
1ec90 66 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  f);.      }.    
1eca0 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b    nConstraint++;
1ecb0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1ecc0 20 70 52 61 6e 67 65 45 6e 64 2d 3e 77 74 46 6c   pRangeEnd->wtFl
1ecd0 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55  ags & TERM_VIRTU
1ece0 41 4c 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  AL );.    }else 
1ecf0 69 66 28 20 62 53 74 6f 70 41 74 4e 75 6c 6c 20  if( bStopAtNull 
1ed00 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1ed10 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1ed20 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65 67 42 61 73  _Null, 0, regBas
1ed30 65 2b 6e 45 71 29 3b 0a 20 20 20 20 20 20 65 6e  e+nEq);.      en
1ed40 64 45 71 20 3d 20 30 3b 0a 20 20 20 20 20 20 6e  dEq = 0;.      n
1ed50 43 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b 0a 20 20  Constraint++;.  
1ed60 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44    }.    sqlite3D
1ed70 62 46 72 65 65 28 64 62 2c 20 7a 53 74 61 72 74  bFree(db, zStart
1ed80 41 66 66 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 6f  Aff);..    /* To
1ed90 70 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 62 6f  p of the loop bo
1eda0 64 79 20 2a 2f 0a 20 20 20 20 70 4c 65 76 65 6c  dy */.    pLevel
1edb0 2d 3e 70 32 20 3d 20 73 71 6c 69 74 65 33 56 64  ->p2 = sqlite3Vd
1edc0 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
1edd0 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  ;..    /* Check 
1ede0 69 66 20 74 68 65 20 69 6e 64 65 78 20 63 75 72  if the index cur
1edf0 73 6f 72 20 69 73 20 70 61 73 74 20 74 68 65 20  sor is past the 
1ee00 65 6e 64 20 6f 66 20 74 68 65 20 72 61 6e 67 65  end of the range
1ee10 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 43 6f  . */.    if( nCo
1ee20 6e 73 74 72 61 69 6e 74 20 29 7b 0a 20 20 20 20  nstraint ){.    
1ee30 20 20 6f 70 20 3d 20 61 45 6e 64 4f 70 5b 62 52    op = aEndOp[bR
1ee40 65 76 2a 32 20 2b 20 65 6e 64 45 71 5d 3b 0a 20  ev*2 + endEq];. 
1ee50 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1ee60 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 6f 70 2c  AddOp4Int(v, op,
1ee70 20 69 49 64 78 43 75 72 2c 20 61 64 64 72 4e 78   iIdxCur, addrNx
1ee80 74 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f 6e  t, regBase, nCon
1ee90 73 74 72 61 69 6e 74 29 3b 0a 20 20 20 20 20 20  straint);.      
1eea0 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50  testcase( op==OP
1eeb0 5f 49 64 78 47 54 20 29 3b 20 20 56 64 62 65 43  _IdxGT );  VdbeC
1eec0 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d  overageIf(v, op=
1eed0 3d 4f 50 5f 49 64 78 47 54 20 29 3b 0a 20 20 20  =OP_IdxGT );.   
1eee0 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
1eef0 3d 4f 50 5f 49 64 78 47 45 20 29 3b 20 20 56 64  =OP_IdxGE );  Vd
1ef00 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
1ef10 6f 70 3d 3d 4f 50 5f 49 64 78 47 45 20 29 3b 0a  op==OP_IdxGE );.
1ef20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1ef30 6f 70 3d 3d 4f 50 5f 49 64 78 4c 54 20 29 3b 20  op==OP_IdxLT ); 
1ef40 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
1ef50 76 2c 20 6f 70 3d 3d 4f 50 5f 49 64 78 4c 54 20  v, op==OP_IdxLT 
1ef60 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1ef70 65 28 20 6f 70 3d 3d 4f 50 5f 49 64 78 4c 45 20  e( op==OP_IdxLE 
1ef80 29 3b 20 20 56 64 62 65 43 6f 76 65 72 61 67 65  );  VdbeCoverage
1ef90 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 49 64 78  If(v, op==OP_Idx
1efa0 4c 45 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  LE );.    }..   
1efb0 20 2f 2a 20 53 65 65 6b 20 74 68 65 20 74 61 62   /* Seek the tab
1efc0 6c 65 20 63 75 72 73 6f 72 2c 20 69 66 20 72 65  le cursor, if re
1efd0 71 75 69 72 65 64 20 2a 2f 0a 20 20 20 20 64 69  quired */.    di
1efe0 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c  sableTerm(pLevel
1eff0 2c 20 70 52 61 6e 67 65 53 74 61 72 74 29 3b 0a  , pRangeStart);.
1f000 20 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28      disableTerm(
1f010 70 4c 65 76 65 6c 2c 20 70 52 61 6e 67 65 45 6e  pLevel, pRangeEn
1f020 64 29 3b 0a 20 20 20 20 69 66 28 20 6f 6d 69 74  d);.    if( omit
1f030 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 2f  Table ){.      /
1f040 2a 20 70 49 64 78 20 69 73 20 61 20 63 6f 76 65  * pIdx is a cove
1f050 72 69 6e 67 20 69 6e 64 65 78 2e 20 20 4e 6f 20  ring index.  No 
1f060 6e 65 65 64 20 74 6f 20 61 63 63 65 73 73 20 74  need to access t
1f070 68 65 20 6d 61 69 6e 20 74 61 62 6c 65 2e 20 2a  he main table. *
1f080 2f 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  /.    }else if( 
1f090 48 61 73 52 6f 77 69 64 28 70 49 64 78 2d 3e 70  HasRowid(pIdx->p
1f0a0 54 61 62 6c 65 29 20 29 7b 0a 20 20 20 20 20 20  Table) ){.      
1f0b0 69 52 6f 77 69 64 52 65 67 20 3d 20 2b 2b 70 50  iRowidReg = ++pP
1f0c0 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
1f0d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1f0e0 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 52 6f 77  Op2(v, OP_IdxRow
1f0f0 69 64 2c 20 69 49 64 78 43 75 72 2c 20 69 52 6f  id, iIdxCur, iRo
1f100 77 69 64 52 65 67 29 3b 0a 20 20 20 20 20 20 73  widReg);.      s
1f110 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 53  qlite3ExprCacheS
1f120 74 6f 72 65 28 70 50 61 72 73 65 2c 20 69 43 75  tore(pParse, iCu
1f130 72 2c 20 2d 31 2c 20 69 52 6f 77 69 64 52 65 67  r, -1, iRowidReg
1f140 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1f150 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1f160 5f 53 65 65 6b 2c 20 69 43 75 72 2c 20 69 52 6f  _Seek, iCur, iRo
1f170 77 69 64 52 65 67 29 3b 20 20 2f 2a 20 44 65 66  widReg);  /* Def
1f180 65 72 72 65 64 20 73 65 65 6b 20 2a 2f 0a 20 20  erred seek */.  
1f190 20 20 7d 65 6c 73 65 20 69 66 28 20 69 43 75 72    }else if( iCur
1f1a0 21 3d 69 49 64 78 43 75 72 20 29 7b 0a 20 20 20  !=iIdxCur ){.   
1f1b0 20 20 20 49 6e 64 65 78 20 2a 70 50 6b 20 3d 20     Index *pPk = 
1f1c0 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65  sqlite3PrimaryKe
1f1d0 79 49 6e 64 65 78 28 70 49 64 78 2d 3e 70 54 61  yIndex(pIdx->pTa
1f1e0 62 6c 65 29 3b 0a 20 20 20 20 20 20 69 52 6f 77  ble);.      iRow
1f1f0 69 64 52 65 67 20 3d 20 73 71 6c 69 74 65 33 47  idReg = sqlite3G
1f200 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  etTempRange(pPar
1f210 73 65 2c 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c  se, pPk->nKeyCol
1f220 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  );.      for(j=0
1f230 3b 20 6a 3c 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c  ; j<pPk->nKeyCol
1f240 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
1f250 6b 20 3d 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d  k = sqlite3Colum
1f260 6e 4f 66 49 6e 64 65 78 28 70 49 64 78 2c 20 70  nOfIndex(pIdx, p
1f270 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 29  Pk->aiColumn[j])
1f280 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
1f290 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
1f2a0 50 5f 43 6f 6c 75 6d 6e 2c 20 69 49 64 78 43 75  P_Column, iIdxCu
1f2b0 72 2c 20 6b 2c 20 69 52 6f 77 69 64 52 65 67 2b  r, k, iRowidReg+
1f2c0 6a 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  j);.      }.    
1f2d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1f2e0 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 4e 6f 74  Op4Int(v, OP_Not
1f2f0 46 6f 75 6e 64 2c 20 69 43 75 72 2c 20 61 64 64  Found, iCur, add
1f300 72 43 6f 6e 74 2c 0a 20 20 20 20 20 20 20 20 20  rCont,.         
1f310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f320 20 20 69 52 6f 77 69 64 52 65 67 2c 20 70 50 6b    iRowidReg, pPk
1f330 2d 3e 6e 4b 65 79 43 6f 6c 29 3b 20 56 64 62 65  ->nKeyCol); Vdbe
1f340 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
1f350 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 63 6f 72   }..    /* Recor
1f360 64 20 74 68 65 20 69 6e 73 74 72 75 63 74 69 6f  d the instructio
1f370 6e 20 75 73 65 64 20 74 6f 20 74 65 72 6d 69 6e  n used to termin
1f380 61 74 65 20 74 68 65 20 6c 6f 6f 70 2e 20 44 69  ate the loop. Di
1f390 73 61 62 6c 65 20 0a 20 20 20 20 2a 2a 20 57 48  sable .    ** WH
1f3a0 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73  ERE clause terms
1f3b0 20 6d 61 64 65 20 72 65 64 75 6e 64 61 6e 74 20   made redundant 
1f3c0 62 79 20 74 68 65 20 69 6e 64 65 78 20 72 61 6e  by the index ran
1f3d0 67 65 20 73 63 61 6e 2e 0a 20 20 20 20 2a 2f 0a  ge scan..    */.
1f3e0 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77      if( pLoop->w
1f3f0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  sFlags & WHERE_O
1f400 4e 45 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 70  NEROW ){.      p
1f410 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e  Level->op = OP_N
1f420 6f 6f 70 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  oop;.    }else i
1f430 66 28 20 62 52 65 76 20 29 7b 0a 20 20 20 20 20  f( bRev ){.     
1f440 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50   pLevel->op = OP
1f450 5f 50 72 65 76 3b 0a 20 20 20 20 7d 65 6c 73 65  _Prev;.    }else
1f460 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e  {.      pLevel->
1f470 6f 70 20 3d 20 4f 50 5f 4e 65 78 74 3b 0a 20 20  op = OP_Next;.  
1f480 20 20 7d 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e    }.    pLevel->
1f490 70 31 20 3d 20 69 49 64 78 43 75 72 3b 0a 20 20  p1 = iIdxCur;.  
1f4a0 20 20 70 4c 65 76 65 6c 2d 3e 70 33 20 3d 20 28    pLevel->p3 = (
1f4b0 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 26 57  pLoop->wsFlags&W
1f4c0 48 45 52 45 5f 55 4e 51 5f 57 41 4e 54 45 44 29  HERE_UNQ_WANTED)
1f4d0 21 3d 30 20 3f 20 31 3a 30 3b 0a 20 20 20 20 69  !=0 ? 1:0;.    i
1f4e0 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  f( (pLoop->wsFla
1f4f0 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4e 53 54  gs & WHERE_CONST
1f500 52 41 49 4e 54 29 3d 3d 30 20 29 7b 0a 20 20 20  RAINT)==0 ){.   
1f510 20 20 20 70 4c 65 76 65 6c 2d 3e 70 35 20 3d 20     pLevel->p5 = 
1f520 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55  SQLITE_STMTSTATU
1f530 53 5f 46 55 4c 4c 53 43 41 4e 5f 53 54 45 50 3b  S_FULLSCAN_STEP;
1f540 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1f550 20 20 61 73 73 65 72 74 28 20 70 4c 65 76 65 6c    assert( pLevel
1f560 2d 3e 70 35 3d 3d 30 20 29 3b 0a 20 20 20 20 7d  ->p5==0 );.    }
1f570 0a 20 20 7d 65 6c 73 65 0a 0a 23 69 66 6e 64 65  .  }else..#ifnde
1f580 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52  f SQLITE_OMIT_OR
1f590 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 20 20  _OPTIMIZATION.  
1f5a0 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  if( pLoop->wsFla
1f5b0 67 73 20 26 20 57 48 45 52 45 5f 4d 55 4c 54 49  gs & WHERE_MULTI
1f5c0 5f 4f 52 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61  _OR ){.    /* Ca
1f5d0 73 65 20 35 3a 20 20 54 77 6f 20 6f 72 20 6d 6f  se 5:  Two or mo
1f5e0 72 65 20 73 65 70 61 72 61 74 65 6c 79 20 69 6e  re separately in
1f5f0 64 65 78 65 64 20 74 65 72 6d 73 20 63 6f 6e 6e  dexed terms conn
1f600 65 63 74 65 64 20 62 79 20 4f 52 0a 20 20 20 20  ected by OR.    
1f610 2a 2a 0a 20 20 20 20 2a 2a 20 45 78 61 6d 70 6c  **.    ** Exampl
1f620 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e:.    **.    **
1f630 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
1f640 74 31 28 61 2c 62 2c 63 2c 64 29 3b 0a 20 20 20  t1(a,b,c,d);.   
1f650 20 2a 2a 20 20 20 43 52 45 41 54 45 20 49 4e 44   **   CREATE IND
1f660 45 58 20 69 31 20 4f 4e 20 74 31 28 61 29 3b 0a  EX i1 ON t1(a);.
1f670 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20      **   CREATE 
1f680 49 4e 44 45 58 20 69 32 20 4f 4e 20 74 31 28 62  INDEX i2 ON t1(b
1f690 29 3b 0a 20 20 20 20 2a 2a 20 20 20 43 52 45 41  );.    **   CREA
1f6a0 54 45 20 49 4e 44 45 58 20 69 33 20 4f 4e 20 74  TE INDEX i3 ON t
1f6b0 31 28 63 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20  1(c);.    **.   
1f6c0 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a 20 46   **   SELECT * F
1f6d0 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3d 35  ROM t1 WHERE a=5
1f6e0 20 4f 52 20 62 3d 37 20 4f 52 20 28 63 3d 31 31   OR b=7 OR (c=11
1f6f0 20 41 4e 44 20 64 3d 31 33 29 0a 20 20 20 20 2a   AND d=13).    *
1f700 2a 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68 65 20  *.    ** In the 
1f710 65 78 61 6d 70 6c 65 2c 20 74 68 65 72 65 20 61  example, there a
1f720 72 65 20 74 68 72 65 65 20 69 6e 64 65 78 65 64  re three indexed
1f730 20 74 65 72 6d 73 20 63 6f 6e 6e 65 63 74 65 64   terms connected
1f740 20 62 79 20 4f 52 2e 0a 20 20 20 20 2a 2a 20 54   by OR..    ** T
1f750 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 6c 6f  he top of the lo
1f760 6f 70 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 74 68  op looks like th
1f770 69 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  is:.    **.    *
1f780 2a 20 20 20 20 20 20 20 20 20 20 4e 75 6c 6c 20  *          Null 
1f790 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20 20        1         
1f7a0 20 20 20 20 20 20 20 23 20 5a 65 72 6f 20 74 68         # Zero th
1f7b0 65 20 72 6f 77 73 65 74 20 69 6e 20 72 65 67 20  e rowset in reg 
1f7c0 31 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  1.    **.    ** 
1f7d0 54 68 65 6e 2c 20 66 6f 72 20 65 61 63 68 20 69  Then, for each i
1f7e0 6e 64 65 78 65 64 20 74 65 72 6d 2c 20 74 68 65  ndexed term, the
1f7f0 20 66 6f 6c 6c 6f 77 69 6e 67 2e 20 54 68 65 20   following. The 
1f800 61 72 67 75 6d 65 6e 74 73 20 74 6f 0a 20 20 20  arguments to.   
1f810 20 2a 2a 20 52 6f 77 53 65 74 54 65 73 74 20 61   ** RowSetTest a
1f820 72 65 20 73 75 63 68 20 74 68 61 74 20 74 68 65  re such that the
1f830 20 72 6f 77 69 64 20 6f 66 20 74 68 65 20 63 75   rowid of the cu
1f840 72 72 65 6e 74 20 72 6f 77 20 69 73 20 69 6e 73  rrent row is ins
1f850 65 72 74 65 64 0a 20 20 20 20 2a 2a 20 69 6e 74  erted.    ** int
1f860 6f 20 74 68 65 20 52 6f 77 53 65 74 2e 20 49 66  o the RowSet. If
1f870 20 69 74 20 69 73 20 61 6c 72 65 61 64 79 20 70   it is already p
1f880 72 65 73 65 6e 74 2c 20 63 6f 6e 74 72 6f 6c 20  resent, control 
1f890 73 6b 69 70 73 20 74 68 65 0a 20 20 20 20 2a 2a  skips the.    **
1f8a0 20 47 6f 73 75 62 20 6f 70 63 6f 64 65 20 61 6e   Gosub opcode an
1f8b0 64 20 6a 75 6d 70 73 20 73 74 72 61 69 67 68 74  d jumps straight
1f8c0 20 74 6f 20 74 68 65 20 63 6f 64 65 20 67 65 6e   to the code gen
1f8d0 65 72 61 74 65 64 20 62 79 20 57 68 65 72 65 45  erated by WhereE
1f8e0 6e 64 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  nd()..    **.   
1f8f0 20 2a 2a 20 20 20 20 20 20 20 20 73 71 6c 69 74   **        sqlit
1f900 65 33 57 68 65 72 65 42 65 67 69 6e 28 3c 74 65  e3WhereBegin(<te
1f910 72 6d 3e 29 0a 20 20 20 20 2a 2a 20 20 20 20 20  rm>).    **     
1f920 20 20 20 20 20 52 6f 77 53 65 74 54 65 73 74 20       RowSetTest 
1f930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f940 20 23 20 49 6e 73 65 72 74 20 72 6f 77 69 64 20   # Insert rowid 
1f950 69 6e 74 6f 20 72 6f 77 73 65 74 0a 20 20 20 20  into rowset.    
1f960 2a 2a 20 20 20 20 20 20 20 20 20 20 47 6f 73 75  **          Gosu
1f970 62 20 20 20 20 20 20 32 20 41 0a 20 20 20 20 2a  b      2 A.    *
1f980 2a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  *        sqlite3
1f990 57 68 65 72 65 45 6e 64 28 29 0a 20 20 20 20 2a  WhereEnd().    *
1f9a0 2a 0a 20 20 20 20 2a 2a 20 46 6f 6c 6c 6f 77 69  *.    ** Followi
1f9b0 6e 67 20 74 68 65 20 61 62 6f 76 65 2c 20 63 6f  ng the above, co
1f9c0 64 65 20 74 6f 20 74 65 72 6d 69 6e 61 74 65 20  de to terminate 
1f9d0 74 68 65 20 6c 6f 6f 70 2e 20 4c 61 62 65 6c 20  the loop. Label 
1f9e0 41 2c 20 74 68 65 20 74 61 72 67 65 74 0a 20 20  A, the target.  
1f9f0 20 20 2a 2a 20 6f 66 20 74 68 65 20 47 6f 73 75    ** of the Gosu
1fa00 62 20 61 62 6f 76 65 2c 20 6a 75 6d 70 73 20 74  b above, jumps t
1fa10 6f 20 74 68 65 20 69 6e 73 74 72 75 63 74 69 6f  o the instructio
1fa20 6e 20 72 69 67 68 74 20 61 66 74 65 72 20 74 68  n right after th
1fa30 65 20 47 6f 74 6f 2e 0a 20 20 20 20 2a 2a 0a 20  e Goto..    **. 
1fa40 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 4e     **          N
1fa50 75 6c 6c 20 20 20 20 20 20 20 31 20 20 20 20 20  ull       1     
1fa60 20 20 20 20 20 20 20 20 20 20 20 23 20 5a 65 72             # Zer
1fa70 6f 20 74 68 65 20 72 6f 77 73 65 74 20 69 6e 20  o the rowset in 
1fa80 72 65 67 20 31 0a 20 20 20 20 2a 2a 20 20 20 20  reg 1.    **    
1fa90 20 20 20 20 20 20 47 6f 74 6f 20 20 20 20 20 20        Goto      
1faa0 20 42 20 20 20 20 20 20 20 20 20 20 20 20 20 20   B              
1fab0 20 20 23 20 54 68 65 20 6c 6f 6f 70 20 69 73 20    # The loop is 
1fac0 66 69 6e 69 73 68 65 64 2e 0a 20 20 20 20 2a 2a  finished..    **
1fad0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 41 3a  .    **       A:
1fae0 20 3c 6c 6f 6f 70 20 62 6f 64 79 3e 20 20 20 20   <loop body>    
1faf0 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 52               # R
1fb00 65 74 75 72 6e 20 64 61 74 61 2c 20 77 68 61 74  eturn data, what
1fb10 65 76 65 72 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  ever..    **.   
1fb20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 52 65 74   **          Ret
1fb30 75 72 6e 20 20 20 20 20 32 20 20 20 20 20 20 20  urn     2       
1fb40 20 20 20 20 20 20 20 20 20 23 20 4a 75 6d 70 20           # Jump 
1fb50 62 61 63 6b 20 74 6f 20 74 68 65 20 47 6f 73 75  back to the Gosu
1fb60 62 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  b.    **.    ** 
1fb70 20 20 20 20 20 20 42 3a 20 3c 61 66 74 65 72 20        B: <after 
1fb80 74 68 65 20 6c 6f 6f 70 3e 0a 20 20 20 20 2a 2a  the loop>.    **
1fb90 0a 20 20 20 20 2a 2a 20 41 64 64 65 64 20 32 30  .    ** Added 20
1fba0 31 34 2d 30 35 2d 32 36 3a 20 49 66 20 74 68 65  14-05-26: If the
1fbb0 20 74 61 62 6c 65 20 69 73 20 61 20 57 49 54 48   table is a WITH
1fbc0 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65 2c  OUT ROWID table,
1fbd0 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 75 73 65   then.    ** use
1fbe0 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 69 6e   an ephemeral in
1fbf0 64 65 78 20 69 6e 73 74 65 61 64 20 6f 66 20 61  dex instead of a
1fc00 20 52 6f 77 53 65 74 20 74 6f 20 72 65 63 6f 72   RowSet to recor
1fc10 64 20 74 68 65 20 70 72 69 6d 61 72 79 0a 20 20  d the primary.  
1fc20 20 20 2a 2a 20 6b 65 79 73 20 6f 66 20 74 68 65    ** keys of the
1fc30 20 72 6f 77 73 20 77 65 20 68 61 76 65 20 61 6c   rows we have al
1fc40 72 65 61 64 79 20 73 65 65 6e 2e 0a 20 20 20 20  ready seen..    
1fc50 2a 2a 0a 20 20 20 20 2a 2f 0a 20 20 20 20 57 68  **.    */.    Wh
1fc60 65 72 65 43 6c 61 75 73 65 20 2a 70 4f 72 57 63  ereClause *pOrWc
1fc70 3b 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 2d 63  ;    /* The OR-c
1fc80 6c 61 75 73 65 20 62 72 6f 6b 65 6e 20 6f 75 74  lause broken out
1fc90 20 69 6e 74 6f 20 73 75 62 74 65 72 6d 73 20 2a   into subterms *
1fca0 2f 0a 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70  /.    SrcList *p
1fcb0 4f 72 54 61 62 3b 20 20 20 20 20 20 20 2f 2a 20  OrTab;       /* 
1fcc0 53 68 6f 72 74 65 6e 65 64 20 74 61 62 6c 65 20  Shortened table 
1fcd0 6c 69 73 74 20 6f 72 20 4f 52 2d 63 6c 61 75 73  list or OR-claus
1fce0 65 20 67 65 6e 65 72 61 74 69 6f 6e 20 2a 2f 0a  e generation */.
1fcf0 20 20 20 20 49 6e 64 65 78 20 2a 70 43 6f 76 20      Index *pCov 
1fd00 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
1fd10 20 2f 2a 20 50 6f 74 65 6e 74 69 61 6c 20 63 6f   /* Potential co
1fd20 76 65 72 69 6e 67 20 69 6e 64 65 78 20 28 6f 72  vering index (or
1fd30 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 20 20 69 6e   NULL) */.    in
1fd40 74 20 69 43 6f 76 43 75 72 20 3d 20 70 50 61 72  t iCovCur = pPar
1fd50 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 2f 2a 20  se->nTab++;  /* 
1fd60 43 75 72 73 6f 72 20 75 73 65 64 20 66 6f 72 20  Cursor used for 
1fd70 69 6e 64 65 78 20 73 63 61 6e 73 20 28 69 66 20  index scans (if 
1fd80 61 6e 79 29 20 2a 2f 0a 0a 20 20 20 20 69 6e 74  any) */..    int
1fd90 20 72 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70   regReturn = ++p
1fda0 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 20 20 20 20  Parse->nMem;    
1fdb0 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74         /* Regist
1fdc0 65 72 20 75 73 65 64 20 77 69 74 68 20 4f 50 5f  er used with OP_
1fdd0 47 6f 73 75 62 20 2a 2f 0a 20 20 20 20 69 6e 74  Gosub */.    int
1fde0 20 72 65 67 52 6f 77 73 65 74 20 3d 20 30 3b 20   regRowset = 0; 
1fdf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fe00 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74         /* Regist
1fe10 65 72 20 66 6f 72 20 52 6f 77 53 65 74 20 6f 62  er for RowSet ob
1fe20 6a 65 63 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ject */.    int 
1fe30 72 65 67 52 6f 77 69 64 20 3d 20 30 3b 20 20 20  regRowid = 0;   
1fe40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fe50 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
1fe60 72 20 68 6f 6c 64 69 6e 67 20 72 6f 77 69 64 20  r holding rowid 
1fe70 2a 2f 0a 20 20 20 20 69 6e 74 20 69 4c 6f 6f 70  */.    int iLoop
1fe80 42 6f 64 79 20 3d 20 73 71 6c 69 74 65 33 56 64  Body = sqlite3Vd
1fe90 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 20  beMakeLabel(v); 
1fea0 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 6c 6f 6f   /* Start of loo
1feb0 70 20 62 6f 64 79 20 2a 2f 0a 20 20 20 20 69 6e  p body */.    in
1fec0 74 20 69 52 65 74 49 6e 69 74 3b 20 20 20 20 20  t iRetInit;     
1fed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fee0 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
1fef0 73 73 20 6f 66 20 72 65 67 52 65 74 75 72 6e 20  ss of regReturn 
1ff00 69 6e 69 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20  init */.    int 
1ff10 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20 3d 20  untestedTerms = 
1ff20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
1ff30 2a 20 53 6f 6d 65 20 74 65 72 6d 73 20 6e 6f 74  * Some terms not
1ff40 20 63 6f 6d 70 6c 65 74 65 6c 79 20 74 65 73 74   completely test
1ff50 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69  ed */.    int ii
1ff60 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1ff70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ff80 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
1ff90 20 20 20 20 75 31 36 20 77 63 74 72 6c 46 6c 61      u16 wctrlFla
1ffa0 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  gs;             
1ffb0 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20         /* Flags 
1ffc0 66 6f 72 20 73 75 62 2d 57 48 45 52 45 20 63 6c  for sub-WHERE cl
1ffd0 61 75 73 65 20 2a 2f 0a 20 20 20 20 45 78 70 72  ause */.    Expr
1ffe0 20 2a 70 41 6e 64 45 78 70 72 20 3d 20 30 3b 20   *pAndExpr = 0; 
1fff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20000 2a 20 41 6e 20 22 2e 2e 20 41 4e 44 20 28 2e 2e  * An ".. AND (..
20010 2e 29 22 20 65 78 70 72 65 73 73 69 6f 6e 20 2a  .)" expression *
20020 2f 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  /.    Table *pTa
20030 62 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70 54  b = pTabItem->pT
20040 61 62 3b 0a 20 20 20 0a 20 20 20 20 70 54 65 72  ab;.   .    pTer
20050 6d 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72  m = pLoop->aLTer
20060 6d 5b 30 5d 3b 0a 20 20 20 20 61 73 73 65 72 74  m[0];.    assert
20070 28 20 70 54 65 72 6d 21 3d 30 20 29 3b 0a 20 20  ( pTerm!=0 );.  
20080 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d    assert( pTerm-
20090 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
200a0 4f 52 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  OR );.    assert
200b0 28 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  ( (pTerm->wtFlag
200c0 73 20 26 20 54 45 52 4d 5f 4f 52 49 4e 46 4f 29  s & TERM_ORINFO)
200d0 21 3d 30 20 29 3b 0a 20 20 20 20 70 4f 72 57 63  !=0 );.    pOrWc
200e0 20 3d 20 26 70 54 65 72 6d 2d 3e 75 2e 70 4f 72   = &pTerm->u.pOr
200f0 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20 20 70 4c  Info->wc;.    pL
20100 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 52 65  evel->op = OP_Re
20110 74 75 72 6e 3b 0a 20 20 20 20 70 4c 65 76 65 6c  turn;.    pLevel
20120 2d 3e 70 31 20 3d 20 72 65 67 52 65 74 75 72 6e  ->p1 = regReturn
20130 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 75 70  ;..    /* Set up
20140 20 61 20 6e 65 77 20 53 72 63 4c 69 73 74 20 69   a new SrcList i
20150 6e 20 70 4f 72 54 61 62 20 63 6f 6e 74 61 69 6e  n pOrTab contain
20160 69 6e 67 20 74 68 65 20 74 61 62 6c 65 20 62 65  ing the table be
20170 69 6e 67 20 73 63 61 6e 6e 65 64 0a 20 20 20 20  ing scanned.    
20180 2a 2a 20 62 79 20 74 68 69 73 20 6c 6f 6f 70 20  ** by this loop 
20190 69 6e 20 74 68 65 20 61 5b 30 5d 20 73 6c 6f 74  in the a[0] slot
201a0 20 61 6e 64 20 61 6c 6c 20 6e 6f 74 52 65 61 64   and all notRead
201b0 79 20 74 61 62 6c 65 73 20 69 6e 20 61 5b 31 2e  y tables in a[1.
201c0 2e 5d 20 73 6c 6f 74 73 2e 0a 20 20 20 20 2a 2a  .] slots..    **
201d0 20 54 68 69 73 20 62 65 63 6f 6d 65 73 20 74 68   This becomes th
201e0 65 20 53 72 63 4c 69 73 74 20 69 6e 20 74 68 65  e SrcList in the
201f0 20 72 65 63 75 72 73 69 76 65 20 63 61 6c 6c 20   recursive call 
20200 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  to sqlite3WhereB
20210 65 67 69 6e 28 29 2e 0a 20 20 20 20 2a 2f 0a 20  egin()..    */. 
20220 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6e     if( pWInfo->n
20230 4c 65 76 65 6c 3e 31 20 29 7b 0a 20 20 20 20 20  Level>1 ){.     
20240 20 69 6e 74 20 6e 4e 6f 74 52 65 61 64 79 3b 20   int nNotReady; 
20250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20260 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66  /* The number of
20270 20 6e 6f 74 52 65 61 64 79 20 74 61 62 6c 65 73   notReady tables
20280 20 2a 2f 0a 20 20 20 20 20 20 73 74 72 75 63 74   */.      struct
20290 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 6f   SrcList_item *o
202a0 72 69 67 53 72 63 3b 20 20 20 20 20 2f 2a 20 4f  rigSrc;     /* O
202b0 72 69 67 69 6e 61 6c 20 6c 69 73 74 20 6f 66 20  riginal list of 
202c0 74 61 62 6c 65 73 20 2a 2f 0a 20 20 20 20 20 20  tables */.      
202d0 6e 4e 6f 74 52 65 61 64 79 20 3d 20 70 57 49 6e  nNotReady = pWIn
202e0 66 6f 2d 3e 6e 4c 65 76 65 6c 20 2d 20 69 4c 65  fo->nLevel - iLe
202f0 76 65 6c 20 2d 20 31 3b 0a 20 20 20 20 20 20 70  vel - 1;.      p
20300 4f 72 54 61 62 20 3d 20 73 71 6c 69 74 65 33 53  OrTab = sqlite3S
20310 74 61 63 6b 41 6c 6c 6f 63 52 61 77 28 64 62 2c  tackAllocRaw(db,
20320 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
20330 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a               siz
20340 65 6f 66 28 2a 70 4f 72 54 61 62 29 2b 20 6e 4e  eof(*pOrTab)+ nN
20350 6f 74 52 65 61 64 79 2a 73 69 7a 65 6f 66 28 70  otReady*sizeof(p
20360 4f 72 54 61 62 2d 3e 61 5b 30 5d 29 29 3b 0a 20  OrTab->a[0]));. 
20370 20 20 20 20 20 69 66 28 20 70 4f 72 54 61 62 3d       if( pOrTab=
20380 3d 30 20 29 20 72 65 74 75 72 6e 20 6e 6f 74 52  =0 ) return notR
20390 65 61 64 79 3b 0a 20 20 20 20 20 20 70 4f 72 54  eady;.      pOrT
203a0 61 62 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 28 75 38  ab->nAlloc = (u8
203b0 29 28 6e 4e 6f 74 52 65 61 64 79 20 2b 20 31 29  )(nNotReady + 1)
203c0 3b 0a 20 20 20 20 20 20 70 4f 72 54 61 62 2d 3e  ;.      pOrTab->
203d0 6e 53 72 63 20 3d 20 70 4f 72 54 61 62 2d 3e 6e  nSrc = pOrTab->n
203e0 41 6c 6c 6f 63 3b 0a 20 20 20 20 20 20 6d 65 6d  Alloc;.      mem
203f0 63 70 79 28 70 4f 72 54 61 62 2d 3e 61 2c 20 70  cpy(pOrTab->a, p
20400 54 61 62 49 74 65 6d 2c 20 73 69 7a 65 6f 66 28  TabItem, sizeof(
20410 2a 70 54 61 62 49 74 65 6d 29 29 3b 0a 20 20 20  *pTabItem));.   
20420 20 20 20 6f 72 69 67 53 72 63 20 3d 20 70 57 49     origSrc = pWI
20430 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61  nfo->pTabList->a
20440 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 31 3b  ;.      for(k=1;
20450 20 6b 3c 3d 6e 4e 6f 74 52 65 61 64 79 3b 20 6b   k<=nNotReady; k
20460 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  ++){.        mem
20470 63 70 79 28 26 70 4f 72 54 61 62 2d 3e 61 5b 6b  cpy(&pOrTab->a[k
20480 5d 2c 20 26 6f 72 69 67 53 72 63 5b 70 4c 65 76  ], &origSrc[pLev
20490 65 6c 5b 6b 5d 2e 69 46 72 6f 6d 5d 2c 20 73 69  el[k].iFrom], si
204a0 7a 65 6f 66 28 70 4f 72 54 61 62 2d 3e 61 5b 6b  zeof(pOrTab->a[k
204b0 5d 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ]));.      }.   
204c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4f   }else{.      pO
204d0 72 54 61 62 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  rTab = pWInfo->p
204e0 54 61 62 4c 69 73 74 3b 0a 20 20 20 20 7d 0a 0a  TabList;.    }..
204f0 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a      /* Initializ
20500 65 20 74 68 65 20 72 6f 77 73 65 74 20 72 65 67  e the rowset reg
20510 69 73 74 65 72 20 74 6f 20 63 6f 6e 74 61 69 6e  ister to contain
20520 20 4e 55 4c 4c 2e 20 41 6e 20 53 51 4c 20 4e 55   NULL. An SQL NU
20530 4c 4c 20 69 73 20 0a 20 20 20 20 2a 2a 20 65 71  LL is .    ** eq
20540 75 69 76 61 6c 65 6e 74 20 74 6f 20 61 6e 20 65  uivalent to an e
20550 6d 70 74 79 20 72 6f 77 73 65 74 2e 20 20 4f 72  mpty rowset.  Or
20560 2c 20 63 72 65 61 74 65 20 61 6e 20 65 70 68 65  , create an ephe
20570 6d 65 72 61 6c 20 69 6e 64 65 78 0a 20 20 20 20  meral index.    
20580 2a 2a 20 63 61 70 61 62 6c 65 20 6f 66 20 68 6f  ** capable of ho
20590 6c 64 69 6e 67 20 70 72 69 6d 61 72 79 20 6b 65  lding primary ke
205a0 79 73 20 69 6e 20 74 68 65 20 63 61 73 65 20 6f  ys in the case o
205b0 66 20 61 20 57 49 54 48 4f 55 54 20 52 4f 57 49  f a WITHOUT ROWI
205c0 44 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  D..    **.    **
205d0 20 41 6c 73 6f 20 69 6e 69 74 69 61 6c 69 7a 65   Also initialize
205e0 20 72 65 67 52 65 74 75 72 6e 20 74 6f 20 63 6f   regReturn to co
205f0 6e 74 61 69 6e 20 74 68 65 20 61 64 64 72 65 73  ntain the addres
20600 73 20 6f 66 20 74 68 65 20 69 6e 73 74 72 75 63  s of the instruc
20610 74 69 6f 6e 20 0a 20 20 20 20 2a 2a 20 69 6d 6d  tion .    ** imm
20620 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69  ediately followi
20630 6e 67 20 74 68 65 20 4f 50 5f 52 65 74 75 72 6e  ng the OP_Return
20640 20 61 74 20 74 68 65 20 62 6f 74 74 6f 6d 20 6f   at the bottom o
20650 66 20 74 68 65 20 6c 6f 6f 70 2e 20 54 68 69 73  f the loop. This
20660 0a 20 20 20 20 2a 2a 20 69 73 20 72 65 71 75 69  .    ** is requi
20670 72 65 64 20 69 6e 20 61 20 66 65 77 20 6f 62 73  red in a few obs
20680 63 75 72 65 20 4c 45 46 54 20 4a 4f 49 4e 20 63  cure LEFT JOIN c
20690 61 73 65 73 20 77 68 65 72 65 20 63 6f 6e 74 72  ases where contr
206a0 6f 6c 20 6a 75 6d 70 73 0a 20 20 20 20 2a 2a 20  ol jumps.    ** 
206b0 6f 76 65 72 20 74 68 65 20 74 6f 70 20 6f 66 20  over the top of 
206c0 74 68 65 20 6c 6f 6f 70 20 69 6e 74 6f 20 74 68  the loop into th
206d0 65 20 62 6f 64 79 20 6f 66 20 69 74 2e 20 49 6e  e body of it. In
206e0 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 0a   this case the .
206f0 20 20 20 20 2a 2a 20 63 6f 72 72 65 63 74 20 72      ** correct r
20700 65 73 70 6f 6e 73 65 20 66 6f 72 20 74 68 65 20  esponse for the 
20710 65 6e 64 2d 6f 66 2d 6c 6f 6f 70 20 63 6f 64 65  end-of-loop code
20720 20 28 74 68 65 20 4f 50 5f 52 65 74 75 72 6e 29   (the OP_Return)
20730 20 69 73 20 74 6f 20 0a 20 20 20 20 2a 2a 20 66   is to .    ** f
20740 61 6c 6c 20 74 68 72 6f 75 67 68 20 74 6f 20 74  all through to t
20750 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74  he next instruct
20760 69 6f 6e 2c 20 6a 75 73 74 20 61 73 20 61 6e 20  ion, just as an 
20770 4f 50 5f 4e 65 78 74 20 64 6f 65 73 20 69 66 0a  OP_Next does if.
20780 20 20 20 20 2a 2a 20 63 61 6c 6c 65 64 20 6f 6e      ** called on
20790 20 61 6e 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65   an uninitialize
207a0 64 20 63 75 72 73 6f 72 2e 0a 20 20 20 20 2a 2f  d cursor..    */
207b0 0a 20 20 20 20 69 66 28 20 28 70 57 49 6e 66 6f  .    if( (pWInfo
207c0 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ->wctrlFlags & W
207d0 48 45 52 45 5f 44 55 50 4c 49 43 41 54 45 53 5f  HERE_DUPLICATES_
207e0 4f 4b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  OK)==0 ){.      
207f0 69 66 28 20 48 61 73 52 6f 77 69 64 28 70 54 61  if( HasRowid(pTa
20800 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  b) ){.        re
20810 67 52 6f 77 73 65 74 20 3d 20 2b 2b 70 50 61 72  gRowset = ++pPar
20820 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
20830 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
20840 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  Op2(v, OP_Null, 
20850 30 2c 20 72 65 67 52 6f 77 73 65 74 29 3b 0a 20  0, regRowset);. 
20860 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
20870 20 20 20 20 49 6e 64 65 78 20 2a 70 50 6b 20 3d      Index *pPk =
20880 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b   sqlite3PrimaryK
20890 65 79 49 6e 64 65 78 28 70 54 61 62 29 3b 0a 20  eyIndex(pTab);. 
208a0 20 20 20 20 20 20 20 72 65 67 52 6f 77 73 65 74         regRowset
208b0 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
208c0 2b 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  +;.        sqlit
208d0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
208e0 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
208f0 2c 20 72 65 67 52 6f 77 73 65 74 2c 20 70 50 6b  , regRowset, pPk
20900 2d 3e 6e 4b 65 79 43 6f 6c 29 3b 0a 20 20 20 20  ->nKeyCol);.    
20910 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
20920 65 74 50 34 4b 65 79 49 6e 66 6f 28 70 50 61 72  etP4KeyInfo(pPar
20930 73 65 2c 20 70 50 6b 29 3b 0a 20 20 20 20 20 20  se, pPk);.      
20940 7d 0a 20 20 20 20 20 20 72 65 67 52 6f 77 69 64  }.      regRowid
20950 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
20960 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 52 65  m;.    }.    iRe
20970 74 49 6e 69 74 20 3d 20 73 71 6c 69 74 65 33 56  tInit = sqlite3V
20980 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
20990 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67 52  Integer, 0, regR
209a0 65 74 75 72 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20  eturn);..    /* 
209b0 49 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  If the original 
209c0 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 73 20  WHERE clause is 
209d0 7a 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 20 20  z of the form:  
209e0 28 78 31 20 4f 52 20 78 32 20 4f 52 20 2e 2e 2e  (x1 OR x2 OR ...
209f0 29 20 41 4e 44 20 79 0a 20 20 20 20 2a 2a 20 54  ) AND y.    ** T
20a00 68 65 6e 20 66 6f 72 20 65 76 65 72 79 20 74 65  hen for every te
20a10 72 6d 20 78 4e 2c 20 65 76 61 6c 75 61 74 65 20  rm xN, evaluate 
20a20 61 73 20 74 68 65 20 73 75 62 65 78 70 72 65 73  as the subexpres
20a30 73 69 6f 6e 3a 20 78 4e 20 41 4e 44 20 7a 0a 20  sion: xN AND z. 
20a40 20 20 20 2a 2a 20 54 68 61 74 20 77 61 79 2c 20     ** That way, 
20a50 74 65 72 6d 73 20 69 6e 20 79 20 74 68 61 74 20  terms in y that 
20a60 61 72 65 20 66 61 63 74 6f 72 65 64 20 69 6e 74  are factored int
20a70 6f 20 74 68 65 20 64 69 73 6a 75 6e 63 74 69 6f  o the disjunctio
20a80 6e 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65  n will.    ** be
20a90 20 70 69 63 6b 65 64 20 75 70 20 62 79 20 74 68   picked up by th
20aa0 65 20 72 65 63 75 72 73 69 76 65 20 63 61 6c 6c  e recursive call
20ab0 73 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72  s to sqlite3Wher
20ac0 65 42 65 67 69 6e 28 29 20 62 65 6c 6f 77 2e 0a  eBegin() below..
20ad0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 63      **.    ** Ac
20ae0 74 75 61 6c 6c 79 2c 20 65 61 63 68 20 73 75 62  tually, each sub
20af0 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f  expression is co
20b00 6e 76 65 72 74 65 64 20 74 6f 20 22 78 4e 20 41  nverted to "xN A
20b10 4e 44 20 77 22 20 77 68 65 72 65 20 77 20 69 73  ND w" where w is
20b20 0a 20 20 20 20 2a 2a 20 74 68 65 20 22 69 6e 74  .    ** the "int
20b30 65 72 65 73 74 69 6e 67 22 20 74 65 72 6d 73 20  eresting" terms 
20b40 6f 66 20 7a 20 2d 20 74 65 72 6d 73 20 74 68 61  of z - terms tha
20b50 74 20 64 69 64 20 6e 6f 74 20 6f 72 69 67 69 6e  t did not origin
20b60 61 74 65 20 69 6e 20 74 68 65 0a 20 20 20 20 2a  ate in the.    *
20b70 2a 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c  * ON or USING cl
20b80 61 75 73 65 20 6f 66 20 61 20 4c 45 46 54 20 4a  ause of a LEFT J
20b90 4f 49 4e 2c 20 61 6e 64 20 74 65 72 6d 73 20 74  OIN, and terms t
20ba0 68 61 74 20 61 72 65 20 75 73 61 62 6c 65 20 61  hat are usable a
20bb0 73 20 0a 20 20 20 20 2a 2a 20 69 6e 64 69 63 65  s .    ** indice
20bc0 73 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  s..    **.    **
20bd0 20 54 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69   This optimizati
20be0 6f 6e 20 61 6c 73 6f 20 6f 6e 6c 79 20 61 70 70  on also only app
20bf0 6c 69 65 73 20 69 66 20 74 68 65 20 28 78 31 20  lies if the (x1 
20c00 4f 52 20 78 32 20 4f 52 20 2e 2e 2e 29 20 74 65  OR x2 OR ...) te
20c10 72 6d 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74  rm.    ** is not
20c20 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68   contained in th
20c30 65 20 4f 4e 20 63 6c 61 75 73 65 20 6f 66 20 61  e ON clause of a
20c40 20 4c 45 46 54 20 4a 4f 49 4e 2e 0a 20 20 20 20   LEFT JOIN..    
20c50 2a 2a 20 53 65 65 20 74 69 63 6b 65 74 20 68 74  ** See ticket ht
20c60 74 70 3a 2f 2f 77 77 77 2e 73 71 6c 69 74 65 2e  tp://www.sqlite.
20c70 6f 72 67 2f 73 72 63 2f 69 6e 66 6f 2f 66 32 33  org/src/info/f23
20c80 36 39 33 30 34 65 34 0a 20 20 20 20 2a 2f 0a 20  69304e4.    */. 
20c90 20 20 20 69 66 28 20 70 57 43 2d 3e 6e 54 65 72     if( pWC->nTer
20ca0 6d 3e 31 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  m>1 ){.      int
20cb0 20 69 54 65 72 6d 3b 0a 20 20 20 20 20 20 66 6f   iTerm;.      fo
20cc0 72 28 69 54 65 72 6d 3d 30 3b 20 69 54 65 72 6d  r(iTerm=0; iTerm
20cd0 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 54 65  <pWC->nTerm; iTe
20ce0 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 45  rm++){.        E
20cf0 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 57 43  xpr *pExpr = pWC
20d00 2d 3e 61 5b 69 54 65 72 6d 5d 2e 70 45 78 70 72  ->a[iTerm].pExpr
20d10 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 26 70  ;.        if( &p
20d20 57 43 2d 3e 61 5b 69 54 65 72 6d 5d 20 3d 3d 20  WC->a[iTerm] == 
20d30 70 54 65 72 6d 20 29 20 63 6f 6e 74 69 6e 75 65  pTerm ) continue
20d40 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 45 78  ;.        if( Ex
20d50 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
20d60 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  xpr, EP_FromJoin
20d70 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
20d80 20 20 20 20 20 20 69 66 28 20 28 70 57 43 2d 3e        if( (pWC->
20d90 61 5b 69 54 65 72 6d 5d 2e 77 74 46 6c 61 67 73  a[iTerm].wtFlags
20da0 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 29   & TERM_VIRTUAL)
20db0 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  !=0 ) continue;.
20dc0 20 20 20 20 20 20 20 20 69 66 28 20 28 70 57 43          if( (pWC
20dd0 2d 3e 61 5b 69 54 65 72 6d 5d 2e 65 4f 70 65 72  ->a[iTerm].eOper
20de0 61 74 6f 72 20 26 20 57 4f 5f 41 4c 4c 29 3d 3d  ator & WO_ALL)==
20df0 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
20e00 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
20e10 70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d 2e 77 74  pWC->a[iTerm].wt
20e20 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 4f 52 49  Flags & TERM_ORI
20e30 4e 46 4f 20 29 3b 0a 20 20 20 20 20 20 20 20 70  NFO );.        p
20e40 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78  Expr = sqlite3Ex
20e50 70 72 44 75 70 28 64 62 2c 20 70 45 78 70 72 2c  prDup(db, pExpr,
20e60 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 41 6e   0);.        pAn
20e70 64 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45  dExpr = sqlite3E
20e80 78 70 72 41 6e 64 28 64 62 2c 20 70 41 6e 64 45  xprAnd(db, pAndE
20e90 78 70 72 2c 20 70 45 78 70 72 29 3b 0a 20 20 20  xpr, pExpr);.   
20ea0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
20eb0 41 6e 64 45 78 70 72 20 29 7b 0a 20 20 20 20 20  AndExpr ){.     
20ec0 20 20 20 70 41 6e 64 45 78 70 72 20 3d 20 73 71     pAndExpr = sq
20ed0 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
20ee0 65 2c 20 54 4b 5f 41 4e 44 2c 20 30 2c 20 70 41  e, TK_AND, 0, pA
20ef0 6e 64 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20  ndExpr, 0);.    
20f00 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
20f10 2a 20 52 75 6e 20 61 20 73 65 70 61 72 61 74 65  * Run a separate
20f20 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 66 6f   WHERE clause fo
20f30 72 20 65 61 63 68 20 74 65 72 6d 20 6f 66 20 74  r each term of t
20f40 68 65 20 4f 52 20 63 6c 61 75 73 65 2e 20 20 41  he OR clause.  A
20f50 66 74 65 72 0a 20 20 20 20 2a 2a 20 65 6c 69 6d  fter.    ** elim
20f60 69 6e 61 74 69 6e 67 20 64 75 70 6c 69 63 61 74  inating duplicat
20f70 65 73 20 66 72 6f 6d 20 6f 74 68 65 72 20 57 48  es from other WH
20f80 45 52 45 20 63 6c 61 75 73 65 73 2c 20 74 68 65  ERE clauses, the
20f90 20 61 63 74 69 6f 6e 20 66 6f 72 20 65 61 63 68   action for each
20fa0 0a 20 20 20 20 2a 2a 20 73 75 62 2d 57 48 45 52  .    ** sub-WHER
20fb0 45 20 63 6c 61 75 73 65 20 69 73 20 74 6f 20 74  E clause is to t
20fc0 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20 6d 61 69  o invoke the mai
20fd0 6e 20 6c 6f 6f 70 20 62 6f 64 79 20 61 73 20 61  n loop body as a
20fe0 20 73 75 62 72 6f 75 74 69 6e 65 2e 0a 20 20 20   subroutine..   
20ff0 20 2a 2f 0a 20 20 20 20 77 63 74 72 6c 46 6c 61   */.    wctrlFla
21000 67 73 20 3d 20 20 57 48 45 52 45 5f 4f 4d 49 54  gs =  WHERE_OMIT
21010 5f 4f 50 45 4e 5f 43 4c 4f 53 45 0a 20 20 20 20  _OPEN_CLOSE.    
21020 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 57 48              | WH
21030 45 52 45 5f 46 4f 52 43 45 5f 54 41 42 4c 45 0a  ERE_FORCE_TABLE.
21040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21050 7c 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45  | WHERE_ONETABLE
21060 5f 4f 4e 4c 59 3b 0a 20 20 20 20 66 6f 72 28 69  _ONLY;.    for(i
21070 69 3d 30 3b 20 69 69 3c 70 4f 72 57 63 2d 3e 6e  i=0; ii<pOrWc->n
21080 54 65 72 6d 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  Term; ii++){.   
21090 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f     WhereTerm *pO
210a0 72 54 65 72 6d 20 3d 20 26 70 4f 72 57 63 2d 3e  rTerm = &pOrWc->
210b0 61 5b 69 69 5d 3b 0a 20 20 20 20 20 20 69 66 28  a[ii];.      if(
210c0 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75   pOrTerm->leftCu
210d0 72 73 6f 72 3d 3d 69 43 75 72 20 7c 7c 20 28 70  rsor==iCur || (p
210e0 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  OrTerm->eOperato
210f0 72 20 26 20 57 4f 5f 41 4e 44 29 21 3d 30 20 29  r & WO_AND)!=0 )
21100 7b 0a 20 20 20 20 20 20 20 20 57 68 65 72 65 49  {.        WhereI
21110 6e 66 6f 20 2a 70 53 75 62 57 49 6e 66 6f 3b 20  nfo *pSubWInfo; 
21120 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 66            /* Inf
21130 6f 20 66 6f 72 20 73 69 6e 67 6c 65 20 4f 52 2d  o for single OR-
21140 74 65 72 6d 20 73 63 61 6e 20 2a 2f 0a 20 20 20  term scan */.   
21150 20 20 20 20 20 45 78 70 72 20 2a 70 4f 72 45 78       Expr *pOrEx
21160 70 72 20 3d 20 70 4f 72 54 65 72 6d 2d 3e 70 45  pr = pOrTerm->pE
21170 78 70 72 3b 20 2f 2a 20 43 75 72 72 65 6e 74 20  xpr; /* Current 
21180 4f 52 20 63 6c 61 75 73 65 20 74 65 72 6d 20 2a  OR clause term *
21190 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6a 31  /.        int j1
211a0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
211b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
211c0 72 65 73 73 20 6f 66 20 6a 75 6d 70 20 6f 70 65  ress of jump ope
211d0 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  ration */.      
211e0 20 20 69 66 28 20 70 41 6e 64 45 78 70 72 20 26    if( pAndExpr &
211f0 26 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  & !ExprHasProper
21200 74 79 28 70 4f 72 45 78 70 72 2c 20 45 50 5f 46  ty(pOrExpr, EP_F
21210 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20  romJoin) ){.    
21220 20 20 20 20 20 20 70 41 6e 64 45 78 70 72 2d 3e        pAndExpr->
21230 70 4c 65 66 74 20 3d 20 70 4f 72 45 78 70 72 3b  pLeft = pOrExpr;
21240 0a 20 20 20 20 20 20 20 20 20 20 70 4f 72 45 78  .          pOrEx
21250 70 72 20 3d 20 70 41 6e 64 45 78 70 72 3b 0a 20  pr = pAndExpr;. 
21260 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
21270 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68   /* Loop through
21280 20 74 61 62 6c 65 20 65 6e 74 72 69 65 73 20 74   table entries t
21290 68 61 74 20 6d 61 74 63 68 20 74 65 72 6d 20 70  hat match term p
212a0 4f 72 54 65 72 6d 2e 20 2a 2f 0a 20 20 20 20 20  OrTerm. */.     
212b0 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78     WHERETRACE(0x
212c0 66 66 66 66 2c 20 28 22 53 75 62 70 6c 61 6e 20  ffff, ("Subplan 
212d0 66 6f 72 20 4f 52 2d 63 6c 61 75 73 65 3a 5c 6e  for OR-clause:\n
212e0 22 29 29 3b 0a 20 20 20 20 20 20 20 20 70 53 75  "));.        pSu
212f0 62 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33  bWInfo = sqlite3
21300 57 68 65 72 65 42 65 67 69 6e 28 70 50 61 72 73  WhereBegin(pPars
21310 65 2c 20 70 4f 72 54 61 62 2c 20 70 4f 72 45 78  e, pOrTab, pOrEx
21320 70 72 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20  pr, 0, 0,.      
21330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21350 77 63 74 72 6c 46 6c 61 67 73 2c 20 69 43 6f 76  wctrlFlags, iCov
21360 43 75 72 29 3b 0a 20 20 20 20 20 20 20 20 61 73  Cur);.        as
21370 73 65 72 74 28 20 70 53 75 62 57 49 6e 66 6f 20  sert( pSubWInfo 
21380 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  || pParse->nErr 
21390 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
213a0 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20 20 69  led );.        i
213b0 66 28 20 70 53 75 62 57 49 6e 66 6f 20 29 7b 0a  f( pSubWInfo ){.
213c0 20 20 20 20 20 20 20 20 20 20 57 68 65 72 65 4c            WhereL
213d0 6f 6f 70 20 2a 70 53 75 62 4c 6f 6f 70 3b 0a 20  oop *pSubLoop;. 
213e0 20 20 20 20 20 20 20 20 20 69 6e 74 20 61 64 64           int add
213f0 72 45 78 70 6c 61 69 6e 20 3d 20 65 78 70 6c 61  rExplain = expla
21400 69 6e 4f 6e 65 53 63 61 6e 28 0a 20 20 20 20 20  inOneScan(.     
21410 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2c           pParse,
21420 20 70 4f 72 54 61 62 2c 20 26 70 53 75 62 57 49   pOrTab, &pSubWI
21430 6e 66 6f 2d 3e 61 5b 30 5d 2c 20 69 4c 65 76 65  nfo->a[0], iLeve
21440 6c 2c 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d  l, pLevel->iFrom
21450 2c 20 30 0a 20 20 20 20 20 20 20 20 20 20 29 3b  , 0.          );
21460 0a 20 20 20 20 20 20 20 20 20 20 61 64 64 53 63  .          addSc
21470 61 6e 53 74 61 74 75 73 28 76 2c 20 70 4f 72 54  anStatus(v, pOrT
21480 61 62 2c 20 26 70 53 75 62 57 49 6e 66 6f 2d 3e  ab, &pSubWInfo->
21490 61 5b 30 5d 2c 20 61 64 64 72 45 78 70 6c 61 69  a[0], addrExplai
214a0 6e 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 2f  n);..          /
214b0 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 73 75  * This is the su
214c0 62 2d 57 48 45 52 45 20 63 6c 61 75 73 65 20 62  b-WHERE clause b
214d0 6f 64 79 2e 20 20 46 69 72 73 74 20 73 6b 69 70  ody.  First skip
214e0 20 6f 76 65 72 0a 20 20 20 20 20 20 20 20 20 20   over.          
214f0 2a 2a 20 64 75 70 6c 69 63 61 74 65 20 72 6f 77  ** duplicate row
21500 73 20 66 72 6f 6d 20 70 72 69 6f 72 20 73 75 62  s from prior sub
21510 2d 57 48 45 52 45 20 63 6c 61 75 73 65 73 2c 20  -WHERE clauses, 
21520 61 6e 64 20 72 65 63 6f 72 64 20 74 68 65 0a 20  and record the. 
21530 20 20 20 20 20 20 20 20 20 2a 2a 20 72 6f 77 69           ** rowi
21540 64 20 28 6f 72 20 50 52 49 4d 41 52 59 20 4b 45  d (or PRIMARY KE
21550 59 29 20 66 6f 72 20 74 68 65 20 63 75 72 72 65  Y) for the curre
21560 6e 74 20 72 6f 77 20 73 6f 20 74 68 61 74 20 74  nt row so that t
21570 68 65 20 73 61 6d 65 0a 20 20 20 20 20 20 20 20  he same.        
21580 20 20 2a 2a 20 72 6f 77 20 77 69 6c 6c 20 62 65    ** row will be
21590 20 73 6b 69 70 70 65 64 20 69 6e 20 73 75 62 73   skipped in subs
215a0 65 71 75 65 6e 74 20 73 75 62 2d 57 48 45 52 45  equent sub-WHERE
215b0 20 63 6c 61 75 73 65 73 2e 0a 20 20 20 20 20 20   clauses..      
215c0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
215d0 20 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63   if( (pWInfo->wc
215e0 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
215f0 5f 44 55 50 4c 49 43 41 54 45 53 5f 4f 4b 29 3d  _DUPLICATES_OK)=
21600 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
21610 20 20 69 6e 74 20 72 3b 0a 20 20 20 20 20 20 20    int r;.       
21620 20 20 20 20 20 69 6e 74 20 69 53 65 74 20 3d 20       int iSet = 
21630 28 28 69 69 3d 3d 70 4f 72 57 63 2d 3e 6e 54 65  ((ii==pOrWc->nTe
21640 72 6d 2d 31 29 3f 2d 31 3a 69 69 29 3b 0a 20 20  rm-1)?-1:ii);.  
21650 20 20 20 20 20 20 20 20 20 20 69 66 28 20 48 61            if( Ha
21660 73 52 6f 77 69 64 28 70 54 61 62 29 20 29 7b 0a  sRowid(pTab) ){.
21670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 20                r 
21680 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
21690 65 47 65 74 43 6f 6c 75 6d 6e 28 70 50 61 72 73  eGetColumn(pPars
216a0 65 2c 20 70 54 61 62 2c 20 2d 31 2c 20 69 43 75  e, pTab, -1, iCu
216b0 72 2c 20 72 65 67 52 6f 77 69 64 2c 20 30 29 3b  r, regRowid, 0);
216c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6a  .              j
216d0 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  1 = sqlite3VdbeA
216e0 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 52  ddOp4Int(v, OP_R
216f0 6f 77 53 65 74 54 65 73 74 2c 20 72 65 67 52 6f  owSetTest, regRo
21700 77 73 65 74 2c 20 30 2c 20 72 2c 69 53 65 74 29  wset, 0, r,iSet)
21710 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
21720 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
21730 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c  .            }el
21740 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
21750 20 20 49 6e 64 65 78 20 2a 70 50 6b 20 3d 20 73    Index *pPk = s
21760 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79  qlite3PrimaryKey
21770 49 6e 64 65 78 28 70 54 61 62 29 3b 0a 20 20 20  Index(pTab);.   
21780 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e             int n
21790 50 6b 20 3d 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f  Pk = pPk->nKeyCo
217a0 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  l;.             
217b0 20 69 6e 74 20 69 50 6b 3b 0a 0a 20 20 20 20 20   int iPk;..     
217c0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 61 64           /* Read
217d0 20 74 68 65 20 50 4b 20 69 6e 74 6f 20 61 6e 20   the PK into an 
217e0 61 72 72 61 79 20 6f 66 20 74 65 6d 70 20 72 65  array of temp re
217f0 67 69 73 74 65 72 73 2e 20 2a 2f 0a 20 20 20 20  gisters. */.    
21800 20 20 20 20 20 20 20 20 20 20 72 20 3d 20 73 71            r = sq
21810 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67  lite3GetTempRang
21820 65 28 70 50 61 72 73 65 2c 20 6e 50 6b 29 3b 0a  e(pParse, nPk);.
21830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f                fo
21840 72 28 69 50 6b 3d 30 3b 20 69 50 6b 3c 6e 50 6b  r(iPk=0; iPk<nPk
21850 3b 20 69 50 6b 2b 2b 29 7b 0a 20 20 20 20 20 20  ; iPk++){.      
21860 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 43            int iC
21870 6f 6c 20 3d 20 70 50 6b 2d 3e 61 69 43 6f 6c 75  ol = pPk->aiColu
21880 6d 6e 5b 69 50 6b 5d 3b 0a 20 20 20 20 20 20 20  mn[iPk];.       
21890 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
218a0 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d  ExprCodeGetColum
218b0 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20  n(pParse, pTab, 
218c0 69 43 6f 6c 2c 20 69 43 75 72 2c 20 72 2b 69 50  iCol, iCur, r+iP
218d0 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  k, 0);.         
218e0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
218f0 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 69        /* Check i
21900 66 20 74 68 65 20 74 65 6d 70 20 74 61 62 6c 65  f the temp table
21910 20 61 6c 72 65 61 64 79 20 63 6f 6e 74 61 69 6e   already contain
21920 73 20 74 68 69 73 20 6b 65 79 2e 20 49 66 20 73  s this key. If s
21930 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
21940 20 2a 2a 20 74 68 65 20 72 6f 77 20 68 61 73 20   ** the row has 
21950 61 6c 72 65 61 64 79 20 62 65 65 6e 20 69 6e 63  already been inc
21960 6c 75 64 65 64 20 69 6e 20 74 68 65 20 72 65 73  luded in the res
21970 75 6c 74 20 73 65 74 20 61 6e 64 0a 20 20 20 20  ult set and.    
21980 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 61 6e            ** can
21990 20 62 65 20 69 67 6e 6f 72 65 64 20 28 62 79 20   be ignored (by 
219a0 6a 75 6d 70 69 6e 67 20 70 61 73 74 20 74 68 65  jumping past the
219b0 20 47 6f 73 75 62 20 62 65 6c 6f 77 29 2e 20 4f   Gosub below). O
219c0 74 68 65 72 77 69 73 65 2c 0a 20 20 20 20 20 20  therwise,.      
219d0 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 73 65 72          ** inser
219e0 74 20 74 68 65 20 6b 65 79 20 69 6e 74 6f 20 74  t the key into t
219f0 68 65 20 74 65 6d 70 20 74 61 62 6c 65 20 61 6e  he temp table an
21a00 64 20 70 72 6f 63 65 65 64 20 77 69 74 68 20 70  d proceed with p
21a10 72 6f 63 65 73 73 69 6e 67 0a 20 20 20 20 20 20  rocessing.      
21a20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 72          ** the r
21a30 6f 77 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  ow..            
21a40 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 20 20 20    **.           
21a50 20 20 20 2a 2a 20 55 73 65 20 73 6f 6d 65 20 6f     ** Use some o
21a60 66 20 74 68 65 20 73 61 6d 65 20 6f 70 74 69 6d  f the same optim
21a70 69 7a 61 74 69 6f 6e 73 20 61 73 20 4f 50 5f 52  izations as OP_R
21a80 6f 77 53 65 74 54 65 73 74 3a 20 49 66 20 69 53  owSetTest: If iS
21a90 65 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  et.             
21aa0 20 2a 2a 20 69 73 20 7a 65 72 6f 2c 20 61 73 73   ** is zero, ass
21ab0 75 6d 65 20 74 68 61 74 20 74 68 65 20 6b 65 79  ume that the key
21ac0 20 63 61 6e 6e 6f 74 20 61 6c 72 65 61 64 79 20   cannot already 
21ad0 62 65 20 70 72 65 73 65 6e 74 20 69 6e 0a 20 20  be present in.  
21ae0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74              ** t
21af0 68 65 20 74 65 6d 70 20 74 61 62 6c 65 2e 20 41  he temp table. A
21b00 6e 64 20 69 66 20 69 53 65 74 20 69 73 20 2d 31  nd if iSet is -1
21b10 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20 74 68  , assume that th
21b20 65 72 65 20 69 73 20 6e 6f 20 0a 20 20 20 20 20  ere is no .     
21b30 20 20 20 20 20 20 20 20 20 2a 2a 20 6e 65 65 64           ** need
21b40 20 74 6f 20 69 6e 73 65 72 74 20 74 68 65 20 6b   to insert the k
21b50 65 79 20 69 6e 74 6f 20 74 68 65 20 74 65 6d 70  ey into the temp
21b60 20 74 61 62 6c 65 2c 20 61 73 20 69 74 20 77 69   table, as it wi
21b70 6c 6c 20 6e 65 76 65 72 20 0a 20 20 20 20 20 20  ll never .      
21b80 20 20 20 20 20 20 20 20 2a 2a 20 62 65 20 74 65          ** be te
21b90 73 74 65 64 20 66 6f 72 2e 20 20 2a 2f 20 0a 20  sted for.  */ . 
21ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
21bb0 20 69 53 65 74 20 29 7b 0a 20 20 20 20 20 20 20   iSet ){.       
21bc0 20 20 20 20 20 20 20 20 20 6a 31 20 3d 20 73 71           j1 = sq
21bd0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
21be0 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20  nt(v, OP_Found, 
21bf0 72 65 67 52 6f 77 73 65 74 2c 20 30 2c 20 72 2c  regRowset, 0, r,
21c00 20 6e 50 6b 29 3b 0a 20 20 20 20 20 20 20 20 20   nPk);.         
21c10 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
21c20 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
21c30 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
21c40 20 20 20 20 20 20 69 66 28 20 69 53 65 74 3e 3d        if( iSet>=
21c50 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
21c60 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
21c70 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b  AddOp3(v, OP_Mak
21c80 65 52 65 63 6f 72 64 2c 20 72 2c 20 6e 50 6b 2c  eRecord, r, nPk,
21c90 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20   regRowid);.    
21ca0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
21cb0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
21cc0 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 72   OP_IdxInsert, r
21cd0 65 67 52 6f 77 73 65 74 2c 20 72 65 67 52 6f 77  egRowset, regRow
21ce0 69 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  id, 0);.        
21cf0 20 20 20 20 20 20 20 20 69 66 28 20 69 53 65 74          if( iSet
21d00 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 43 68   ) sqlite3VdbeCh
21d10 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47  angeP5(v, OPFLAG
21d20 5f 55 53 45 53 45 45 4b 52 45 53 55 4c 54 29 3b  _USESEEKRESULT);
21d30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
21d40 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
21d50 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20 61  /* Release the a
21d60 72 72 61 79 20 6f 66 20 74 65 6d 70 20 72 65 67  rray of temp reg
21d70 69 73 74 65 72 73 20 2a 2f 0a 20 20 20 20 20 20  isters */.      
21d80 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
21d90 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28  eleaseTempRange(
21da0 70 50 61 72 73 65 2c 20 72 2c 20 6e 50 6b 29 3b  pParse, r, nPk);
21db0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
21dc0 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20           }..    
21dd0 20 20 20 20 20 20 2f 2a 20 49 6e 76 6f 6b 65 20        /* Invoke 
21de0 74 68 65 20 6d 61 69 6e 20 6c 6f 6f 70 20 62 6f  the main loop bo
21df0 64 79 20 61 73 20 61 20 73 75 62 72 6f 75 74 69  dy as a subrouti
21e00 6e 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ne */.          
21e10 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
21e20 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72  2(v, OP_Gosub, r
21e30 65 67 52 65 74 75 72 6e 2c 20 69 4c 6f 6f 70 42  egReturn, iLoopB
21e40 6f 64 79 29 3b 0a 0a 20 20 20 20 20 20 20 20 20  ody);..         
21e50 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 28 73   /* Jump here (s
21e60 6b 69 70 70 69 6e 67 20 74 68 65 20 6d 61 69 6e  kipping the main
21e70 20 6c 6f 6f 70 20 62 6f 64 79 20 73 75 62 72 6f   loop body subro
21e80 75 74 69 6e 65 29 20 69 66 20 74 68 65 0a 20 20  utine) if the.  
21e90 20 20 20 20 20 20 20 20 2a 2a 20 63 75 72 72 65          ** curre
21ea0 6e 74 20 73 75 62 2d 57 48 45 52 45 20 72 6f 77  nt sub-WHERE row
21eb0 20 69 73 20 61 20 64 75 70 6c 69 63 61 74 65 20   is a duplicate 
21ec0 66 72 6f 6d 20 70 72 69 6f 72 20 73 75 62 2d 57  from prior sub-W
21ed0 48 45 52 45 73 2e 20 2a 2f 0a 20 20 20 20 20 20  HEREs. */.      
21ee0 20 20 20 20 69 66 28 20 6a 31 20 29 20 73 71 6c      if( j1 ) sql
21ef0 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
21f00 28 76 2c 20 6a 31 29 3b 0a 0a 20 20 20 20 20 20  (v, j1);..      
21f10 20 20 20 20 2f 2a 20 54 68 65 20 70 53 75 62 57      /* The pSubW
21f20 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54 65  Info->untestedTe
21f30 72 6d 73 20 66 6c 61 67 20 6d 65 61 6e 73 20 74  rms flag means t
21f40 68 61 74 20 74 68 69 73 20 4f 52 20 74 65 72 6d  hat this OR term
21f50 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f  .          ** co
21f60 6e 74 61 69 6e 65 64 20 6f 6e 65 20 6f 72 20 6d  ntained one or m
21f70 6f 72 65 20 41 4e 44 20 74 65 72 6d 20 66 72 6f  ore AND term fro
21f80 6d 20 61 20 6e 6f 74 52 65 61 64 79 20 74 61 62  m a notReady tab
21f90 6c 65 2e 20 20 54 68 65 0a 20 20 20 20 20 20 20  le.  The.       
21fa0 20 20 20 2a 2a 20 74 65 72 6d 73 20 66 72 6f 6d     ** terms from
21fb0 20 74 68 65 20 6e 6f 74 52 65 61 64 79 20 74 61   the notReady ta
21fc0 62 6c 65 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65  ble could not be
21fd0 20 74 65 73 74 65 64 20 61 6e 64 20 77 69 6c 6c   tested and will
21fe0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6e 65  .          ** ne
21ff0 65 64 20 74 6f 20 62 65 20 74 65 73 74 65 64 20  ed to be tested 
22000 6c 61 74 65 72 2e 0a 20 20 20 20 20 20 20 20 20  later..         
22010 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
22020 28 20 70 53 75 62 57 49 6e 66 6f 2d 3e 75 6e 74  ( pSubWInfo->unt
22030 65 73 74 65 64 54 65 72 6d 73 20 29 20 75 6e 74  estedTerms ) unt
22040 65 73 74 65 64 54 65 72 6d 73 20 3d 20 31 3b 0a  estedTerms = 1;.
22050 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66  .          /* If
22060 20 61 6c 6c 20 6f 66 20 74 68 65 20 4f 52 2d 63   all of the OR-c
22070 6f 6e 6e 65 63 74 65 64 20 74 65 72 6d 73 20 61  onnected terms a
22080 72 65 20 6f 70 74 69 6d 69 7a 65 64 20 75 73 69  re optimized usi
22090 6e 67 20 74 68 65 20 73 61 6d 65 0a 20 20 20 20  ng the same.    
220a0 20 20 20 20 20 20 2a 2a 20 69 6e 64 65 78 2c 20        ** index, 
220b0 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20 69 73  and the index is
220c0 20 6f 70 65 6e 65 64 20 75 73 69 6e 67 20 74 68   opened using th
220d0 65 20 73 61 6d 65 20 63 75 72 73 6f 72 20 6e 75  e same cursor nu
220e0 6d 62 65 72 0a 20 20 20 20 20 20 20 20 20 20 2a  mber.          *
220f0 2a 20 62 79 20 65 61 63 68 20 63 61 6c 6c 20 74  * by each call t
22100 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  o sqlite3WhereBe
22110 67 69 6e 28 29 20 6d 61 64 65 20 62 79 20 74 68  gin() made by th
22120 69 73 20 6c 6f 6f 70 2c 20 69 74 20 6d 61 79 0a  is loop, it may.
22130 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 65 20            ** be 
22140 70 6f 73 73 69 62 6c 65 20 74 6f 20 75 73 65 20  possible to use 
22150 74 68 61 74 20 69 6e 64 65 78 20 61 73 20 61 20  that index as a 
22160 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 2e 0a  covering index..
22170 20 20 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20            **.   
22180 20 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65         ** If the
22190 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
221a0 57 68 65 72 65 42 65 67 69 6e 28 29 20 61 62 6f  WhereBegin() abo
221b0 76 65 20 72 65 73 75 6c 74 65 64 20 69 6e 20 61  ve resulted in a
221c0 20 73 63 61 6e 20 74 68 61 74 0a 20 20 20 20 20   scan that.     
221d0 20 20 20 20 20 2a 2a 20 75 73 65 73 20 61 6e 20       ** uses an 
221e0 69 6e 64 65 78 2c 20 61 6e 64 20 74 68 69 73 20  index, and this 
221f0 69 73 20 65 69 74 68 65 72 20 74 68 65 20 66 69  is either the fi
22200 72 73 74 20 4f 52 2d 63 6f 6e 6e 65 63 74 65 64  rst OR-connected
22210 20 74 65 72 6d 0a 20 20 20 20 20 20 20 20 20 20   term.          
22220 2a 2a 20 70 72 6f 63 65 73 73 65 64 20 6f 72 20  ** processed or 
22230 74 68 65 20 69 6e 64 65 78 20 69 73 20 74 68 65  the index is the
22240 20 73 61 6d 65 20 61 73 20 74 68 61 74 20 75 73   same as that us
22250 65 64 20 62 79 20 61 6c 6c 20 70 72 65 76 69 6f  ed by all previo
22260 75 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  us.          ** 
22270 74 65 72 6d 73 2c 20 73 65 74 20 70 43 6f 76 20  terms, set pCov 
22280 74 6f 20 74 68 65 20 63 61 6e 64 69 64 61 74 65  to the candidate
22290 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 2e   covering index.
222a0 20 4f 74 68 65 72 77 69 73 65 2c 20 73 65 74 20   Otherwise, set 
222b0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 43  .          ** pC
222c0 6f 76 20 74 6f 20 4e 55 4c 4c 20 74 6f 20 69 6e  ov to NULL to in
222d0 64 69 63 61 74 65 20 74 68 61 74 20 6e 6f 20 63  dicate that no c
222e0 61 6e 64 69 64 61 74 65 20 63 6f 76 65 72 69 6e  andidate coverin
222f0 67 20 69 6e 64 65 78 20 77 69 6c 6c 20 0a 20 20  g index will .  
22300 20 20 20 20 20 20 20 20 2a 2a 20 62 65 20 61 76          ** be av
22310 61 69 6c 61 62 6c 65 2e 0a 20 20 20 20 20 20 20  ailable..       
22320 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
22330 70 53 75 62 4c 6f 6f 70 20 3d 20 70 53 75 62 57  pSubLoop = pSubW
22340 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70 57 4c 6f 6f  Info->a[0].pWLoo
22350 70 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  p;.          ass
22360 65 72 74 28 20 28 70 53 75 62 4c 6f 6f 70 2d 3e  ert( (pSubLoop->
22370 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
22380 41 55 54 4f 5f 49 4e 44 45 58 29 3d 3d 30 20 29  AUTO_INDEX)==0 )
22390 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
223a0 28 70 53 75 62 4c 6f 6f 70 2d 3e 77 73 46 6c 61  (pSubLoop->wsFla
223b0 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58  gs & WHERE_INDEX
223c0 45 44 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20  ED)!=0.         
223d0 20 20 26 26 20 28 69 69 3d 3d 30 20 7c 7c 20 70    && (ii==0 || p
223e0 53 75 62 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  SubLoop->u.btree
223f0 2e 70 49 6e 64 65 78 3d 3d 70 43 6f 76 29 0a 20  .pIndex==pCov). 
22400 20 20 20 20 20 20 20 20 20 20 26 26 20 28 48 61            && (Ha
22410 73 52 6f 77 69 64 28 70 54 61 62 29 20 7c 7c 20  sRowid(pTab) || 
22420 21 49 73 50 72 69 6d 61 72 79 4b 65 79 49 6e 64  !IsPrimaryKeyInd
22430 65 78 28 70 53 75 62 4c 6f 6f 70 2d 3e 75 2e 62  ex(pSubLoop->u.b
22440 74 72 65 65 2e 70 49 6e 64 65 78 29 29 0a 20 20  tree.pIndex)).  
22450 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
22460 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
22470 53 75 62 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 69  SubWInfo->a[0].i
22480 49 64 78 43 75 72 3d 3d 69 43 6f 76 43 75 72 20  IdxCur==iCovCur 
22490 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  );.            p
224a0 43 6f 76 20 3d 20 70 53 75 62 4c 6f 6f 70 2d 3e  Cov = pSubLoop->
224b0 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a  u.btree.pIndex;.
224c0 20 20 20 20 20 20 20 20 20 20 20 20 77 63 74 72              wctr
224d0 6c 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f  lFlags |= WHERE_
224e0 52 45 4f 50 45 4e 5f 49 44 58 3b 0a 20 20 20 20  REOPEN_IDX;.    
224f0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
22500 20 20 20 20 20 20 20 20 20 70 43 6f 76 20 3d 20           pCov = 
22510 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 0a  0;.          }..
22520 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e            /* Fin
22530 69 73 68 20 74 68 65 20 6c 6f 6f 70 20 74 68 72  ish the loop thr
22540 6f 75 67 68 20 74 61 62 6c 65 20 65 6e 74 72 69  ough table entri
22550 65 73 20 74 68 61 74 20 6d 61 74 63 68 20 74 65  es that match te
22560 72 6d 20 70 4f 72 54 65 72 6d 2e 20 2a 2f 0a 20  rm pOrTerm. */. 
22570 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
22580 57 68 65 72 65 45 6e 64 28 70 53 75 62 57 49 6e  WhereEnd(pSubWIn
22590 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  fo);.        }. 
225a0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
225b0 20 70 4c 65 76 65 6c 2d 3e 75 2e 70 43 6f 76 69   pLevel->u.pCovi
225c0 64 78 20 3d 20 70 43 6f 76 3b 0a 20 20 20 20 69  dx = pCov;.    i
225d0 66 28 20 70 43 6f 76 20 29 20 70 4c 65 76 65 6c  f( pCov ) pLevel
225e0 2d 3e 69 49 64 78 43 75 72 20 3d 20 69 43 6f 76  ->iIdxCur = iCov
225f0 43 75 72 3b 0a 20 20 20 20 69 66 28 20 70 41 6e  Cur;.    if( pAn
22600 64 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 70  dExpr ){.      p
22610 41 6e 64 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d  AndExpr->pLeft =
22620 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   0;.      sqlite
22630 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
22640 70 41 6e 64 45 78 70 72 29 3b 0a 20 20 20 20 7d  pAndExpr);.    }
22650 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
22660 43 68 61 6e 67 65 50 31 28 76 2c 20 69 52 65 74  ChangeP1(v, iRet
22670 49 6e 69 74 2c 20 73 71 6c 69 74 65 33 56 64 62  Init, sqlite3Vdb
22680 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 29  eCurrentAddr(v))
22690 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
226a0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
226b0 74 6f 2c 20 30 2c 20 70 4c 65 76 65 6c 2d 3e 61  to, 0, pLevel->a
226c0 64 64 72 42 72 6b 29 3b 0a 20 20 20 20 73 71 6c  ddrBrk);.    sql
226d0 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
226e0 61 62 65 6c 28 76 2c 20 69 4c 6f 6f 70 42 6f 64  abel(v, iLoopBod
226f0 79 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 57 49  y);..    if( pWI
22700 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3e 31 20 29 20  nfo->nLevel>1 ) 
22710 73 71 6c 69 74 65 33 53 74 61 63 6b 46 72 65 65  sqlite3StackFree
22720 28 64 62 2c 20 70 4f 72 54 61 62 29 3b 0a 20 20  (db, pOrTab);.  
22730 20 20 69 66 28 20 21 75 6e 74 65 73 74 65 64 54    if( !untestedT
22740 65 72 6d 73 20 29 20 64 69 73 61 62 6c 65 54 65  erms ) disableTe
22750 72 6d 28 70 4c 65 76 65 6c 2c 20 70 54 65 72 6d  rm(pLevel, pTerm
22760 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69  );.  }else.#endi
22770 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
22780 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e  _OR_OPTIMIZATION
22790 20 2a 2f 0a 0a 20 20 7b 0a 20 20 20 20 2f 2a 20   */..  {.    /* 
227a0 43 61 73 65 20 36 3a 20 20 54 68 65 72 65 20 69  Case 6:  There i
227b0 73 20 6e 6f 20 75 73 61 62 6c 65 20 69 6e 64 65  s no usable inde
227c0 78 2e 20 20 57 65 20 6d 75 73 74 20 64 6f 20 61  x.  We must do a
227d0 20 63 6f 6d 70 6c 65 74 65 0a 20 20 20 20 2a 2a   complete.    **
227e0 20 20 20 20 20 20 20 20 20 20 73 63 61 6e 20 6f            scan o
227f0 66 20 74 68 65 20 65 6e 74 69 72 65 20 74 61 62  f the entire tab
22800 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  le..    */.    s
22810 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61  tatic const u8 a
22820 53 74 65 70 5b 5d 20 3d 20 7b 20 4f 50 5f 4e 65  Step[] = { OP_Ne
22830 78 74 2c 20 4f 50 5f 50 72 65 76 20 7d 3b 0a 20  xt, OP_Prev };. 
22840 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
22850 75 38 20 61 53 74 61 72 74 5b 5d 20 3d 20 7b 20  u8 aStart[] = { 
22860 4f 50 5f 52 65 77 69 6e 64 2c 20 4f 50 5f 4c 61  OP_Rewind, OP_La
22870 73 74 20 7d 3b 0a 20 20 20 20 61 73 73 65 72 74  st };.    assert
22880 28 20 62 52 65 76 3d 3d 30 20 7c 7c 20 62 52 65  ( bRev==0 || bRe
22890 76 3d 3d 31 20 29 3b 0a 20 20 20 20 69 66 28 20  v==1 );.    if( 
228a0 70 54 61 62 49 74 65 6d 2d 3e 69 73 52 65 63 75  pTabItem->isRecu
228b0 72 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20 2f  rsive ){.      /
228c0 2a 20 54 61 62 6c 65 73 20 6d 61 72 6b 65 64 20  * Tables marked 
228d0 69 73 52 65 63 75 72 73 69 76 65 20 68 61 76 65  isRecursive have
228e0 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 72   only a single r
228f0 6f 77 20 74 68 61 74 20 69 73 20 73 74 6f 72 65  ow that is store
22900 64 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 61 20  d in.      ** a 
22910 70 73 65 75 64 6f 2d 63 75 72 73 6f 72 2e 20 20  pseudo-cursor.  
22920 4e 6f 20 6e 65 65 64 20 74 6f 20 52 65 77 69 6e  No need to Rewin
22930 64 20 6f 72 20 4e 65 78 74 20 73 75 63 68 20 63  d or Next such c
22940 75 72 73 6f 72 73 2e 20 2a 2f 0a 20 20 20 20 20  ursors. */.     
22950 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50   pLevel->op = OP
22960 5f 4e 6f 6f 70 3b 0a 20 20 20 20 7d 65 6c 73 65  _Noop;.    }else
22970 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e  {.      pLevel->
22980 6f 70 20 3d 20 61 53 74 65 70 5b 62 52 65 76 5d  op = aStep[bRev]
22990 3b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e  ;.      pLevel->
229a0 70 31 20 3d 20 69 43 75 72 3b 0a 20 20 20 20 20  p1 = iCur;.     
229b0 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 31 20   pLevel->p2 = 1 
229c0 2b 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  + sqlite3VdbeAdd
229d0 4f 70 32 28 76 2c 20 61 53 74 61 72 74 5b 62 52  Op2(v, aStart[bR
229e0 65 76 5d 2c 20 69 43 75 72 2c 20 61 64 64 72 42  ev], iCur, addrB
229f0 72 6b 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  rk);.      VdbeC
22a00 6f 76 65 72 61 67 65 49 66 28 76 2c 20 62 52 65  overageIf(v, bRe
22a10 76 3d 3d 30 29 3b 0a 20 20 20 20 20 20 56 64 62  v==0);.      Vdb
22a20 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 62  eCoverageIf(v, b
22a30 52 65 76 21 3d 30 29 3b 0a 20 20 20 20 20 20 70  Rev!=0);.      p
22a40 4c 65 76 65 6c 2d 3e 70 35 20 3d 20 53 51 4c 49  Level->p5 = SQLI
22a50 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 46 55  TE_STMTSTATUS_FU
22a60 4c 4c 53 43 41 4e 5f 53 54 45 50 3b 0a 20 20 20  LLSCAN_STEP;.   
22a70 20 7d 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53   }.  }..#ifdef S
22a80 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d  QLITE_ENABLE_STM
22a90 54 5f 53 43 41 4e 53 54 41 54 55 53 0a 20 20 70  T_SCANSTATUS.  p
22aa0 4c 65 76 65 6c 2d 3e 61 64 64 72 56 69 73 69 74  Level->addrVisit
22ab0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
22ac0 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 23 65  rrentAddr(v);.#e
22ad0 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 6e 73 65 72  ndif..  /* Inser
22ae0 74 20 63 6f 64 65 20 74 6f 20 74 65 73 74 20 65  t code to test e
22af0 76 65 72 79 20 73 75 62 65 78 70 72 65 73 73 69  very subexpressi
22b00 6f 6e 20 74 68 61 74 20 63 61 6e 20 62 65 20 63  on that can be c
22b10 6f 6d 70 6c 65 74 65 6c 79 0a 20 20 2a 2a 20 63  ompletely.  ** c
22b20 6f 6d 70 75 74 65 64 20 75 73 69 6e 67 20 74 68  omputed using th
22b30 65 20 63 75 72 72 65 6e 74 20 73 65 74 20 6f 66  e current set of
22b40 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20   tables..  */.  
22b50 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61  for(pTerm=pWC->a
22b60 2c 20 6a 3d 70 57 43 2d 3e 6e 54 65 72 6d 3b 20  , j=pWC->nTerm; 
22b70 6a 3e 30 3b 20 6a 2d 2d 2c 20 70 54 65 72 6d 2b  j>0; j--, pTerm+
22b80 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45  +){.    Expr *pE
22b90 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
22ba0 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
22bb0 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b   TERM_VIRTUAL );
22bc0 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
22bd0 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
22be0 54 45 52 4d 5f 43 4f 44 45 44 20 29 3b 0a 20 20  TERM_CODED );.  
22bf0 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46    if( pTerm->wtF
22c00 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 56 49 52  lags & (TERM_VIR
22c10 54 55 41 4c 7c 54 45 52 4d 5f 43 4f 44 45 44 29  TUAL|TERM_CODED)
22c20 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
22c30 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65   if( (pTerm->pre
22c40 72 65 71 41 6c 6c 20 26 20 70 4c 65 76 65 6c 2d  reqAll & pLevel-
22c50 3e 6e 6f 74 52 65 61 64 79 29 21 3d 30 20 29 7b  >notReady)!=0 ){
22c60 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
22c70 20 70 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65   pWInfo->unteste
22c80 64 54 65 72 6d 73 3d 3d 30 0a 20 20 20 20 20 20  dTerms==0.      
22c90 20 20 20 20 20 20 20 20 20 26 26 20 28 70 57 49           && (pWI
22ca0 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
22cb0 26 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45  & WHERE_ONETABLE
22cc0 5f 4f 4e 4c 59 29 21 3d 30 20 29 3b 0a 20 20 20  _ONLY)!=0 );.   
22cd0 20 20 20 70 57 49 6e 66 6f 2d 3e 75 6e 74 65 73     pWInfo->untes
22ce0 74 65 64 54 65 72 6d 73 20 3d 20 31 3b 0a 20 20  tedTerms = 1;.  
22cf0 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
22d00 20 20 7d 0a 20 20 20 20 70 45 20 3d 20 70 54 65    }.    pE = pTe
22d10 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 61  rm->pExpr;.    a
22d20 73 73 65 72 74 28 20 70 45 21 3d 30 20 29 3b 0a  ssert( pE!=0 );.
22d30 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e      if( pLevel->
22d40 69 4c 65 66 74 4a 6f 69 6e 20 26 26 20 21 45 78  iLeftJoin && !Ex
22d50 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
22d60 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29  , EP_FromJoin) )
22d70 7b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  {.      continue
22d80 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
22d90 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
22da0 50 61 72 73 65 2c 20 70 45 2c 20 61 64 64 72 43  Parse, pE, addrC
22db0 6f 6e 74 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50  ont, SQLITE_JUMP
22dc0 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 70 54 65  IFNULL);.    pTe
22dd0 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54  rm->wtFlags |= T
22de0 45 52 4d 5f 43 4f 44 45 44 3b 0a 20 20 7d 0a 0a  ERM_CODED;.  }..
22df0 20 20 2f 2a 20 49 6e 73 65 72 74 20 63 6f 64 65    /* Insert code
22e00 20 74 6f 20 74 65 73 74 20 66 6f 72 20 69 6d 70   to test for imp
22e10 6c 69 65 64 20 63 6f 6e 73 74 72 61 69 6e 74 73  lied constraints
22e20 20 62 61 73 65 64 20 6f 6e 20 74 72 61 6e 73 69   based on transi
22e30 74 69 76 69 74 79 0a 20 20 2a 2a 20 6f 66 20 74  tivity.  ** of t
22e40 68 65 20 22 3d 3d 22 20 6f 70 65 72 61 74 6f 72  he "==" operator
22e50 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 61 6d  ..  **.  ** Exam
22e60 70 6c 65 3a 20 49 66 20 74 68 65 20 57 48 45 52  ple: If the WHER
22e70 45 20 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e  E clause contain
22e80 73 20 22 74 31 2e 61 3d 74 32 2e 62 22 20 61 6e  s "t1.a=t2.b" an
22e90 64 20 22 74 32 2e 62 3d 31 32 33 22 0a 20 20 2a  d "t2.b=123".  *
22ea0 2a 20 61 6e 64 20 77 65 20 61 72 65 20 63 6f 64  * and we are cod
22eb0 69 6e 67 20 74 68 65 20 74 31 20 6c 6f 6f 70 20  ing the t1 loop 
22ec0 61 6e 64 20 74 68 65 20 74 32 20 6c 6f 6f 70 20  and the t2 loop 
22ed0 68 61 73 20 6e 6f 74 20 79 65 74 20 63 6f 64 65  has not yet code
22ee0 64 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 77 65 20  d,.  ** then we 
22ef0 63 61 6e 6e 6f 74 20 75 73 65 20 74 68 65 20 22  cannot use the "
22f00 74 31 2e 61 3d 74 32 2e 62 22 20 63 6f 6e 73 74  t1.a=t2.b" const
22f10 72 61 69 6e 74 2c 20 62 75 74 20 77 65 20 63 61  raint, but we ca
22f20 6e 20 63 6f 64 65 0a 20 20 2a 2a 20 74 68 65 20  n code.  ** the 
22f30 69 6d 70 6c 69 65 64 20 22 74 31 2e 61 3d 31 32  implied "t1.a=12
22f40 33 22 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 20  3" constraint.. 
22f50 20 2a 2f 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d   */.  for(pTerm=
22f60 70 57 43 2d 3e 61 2c 20 6a 3d 70 57 43 2d 3e 6e  pWC->a, j=pWC->n
22f70 54 65 72 6d 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c 20  Term; j>0; j--, 
22f80 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 45 78  pTerm++){.    Ex
22f90 70 72 20 2a 70 45 2c 20 2a 70 45 41 6c 74 3b 0a  pr *pE, *pEAlt;.
22fa0 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
22fb0 41 6c 74 3b 0a 20 20 20 20 69 66 28 20 70 54 65  Alt;.    if( pTe
22fc0 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54  rm->wtFlags & (T
22fd0 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d  ERM_VIRTUAL|TERM
22fe0 5f 43 4f 44 45 44 29 20 29 20 63 6f 6e 74 69 6e  _CODED) ) contin
22ff0 75 65 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72  ue;.    if( pTer
23000 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 21 3d 28 57  m->eOperator!=(W
23010 4f 5f 45 51 55 49 56 7c 57 4f 5f 45 51 29 20 29  O_EQUIV|WO_EQ) )
23020 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
23030 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75  f( pTerm->leftCu
23040 72 73 6f 72 21 3d 69 43 75 72 20 29 20 63 6f 6e  rsor!=iCur ) con
23050 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70  tinue;.    if( p
23060 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e  Level->iLeftJoin
23070 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
23080 20 70 45 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78   pE = pTerm->pEx
23090 70 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  pr;.    assert( 
230a0 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
230b0 28 70 45 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  (pE, EP_FromJoin
230c0 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ) );.    assert(
230d0 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52   (pTerm->prereqR
230e0 69 67 68 74 20 26 20 70 4c 65 76 65 6c 2d 3e 6e  ight & pLevel->n
230f0 6f 74 52 65 61 64 79 29 21 3d 30 20 29 3b 0a 20  otReady)!=0 );. 
23100 20 20 20 70 41 6c 74 20 3d 20 66 69 6e 64 54 65     pAlt = findTe
23110 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 70 54  rm(pWC, iCur, pT
23120 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d  erm->u.leftColum
23130 6e 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f  n, notReady, WO_
23140 45 51 7c 57 4f 5f 49 4e 2c 20 30 29 3b 0a 20 20  EQ|WO_IN, 0);.  
23150 20 20 69 66 28 20 70 41 6c 74 3d 3d 30 20 29 20    if( pAlt==0 ) 
23160 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
23170 28 20 70 41 6c 74 2d 3e 77 74 46 6c 61 67 73 20  ( pAlt->wtFlags 
23180 26 20 28 54 45 52 4d 5f 43 4f 44 45 44 29 20 29  & (TERM_CODED) )
23190 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 74   continue;.    t
231a0 65 73 74 63 61 73 65 28 20 70 41 6c 74 2d 3e 65  estcase( pAlt->e
231b0 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45 51  Operator & WO_EQ
231c0 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
231d0 28 20 70 41 6c 74 2d 3e 65 4f 70 65 72 61 74 6f  ( pAlt->eOperato
231e0 72 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20 20 20  r & WO_IN );.   
231f0 20 56 64 62 65 4d 6f 64 75 6c 65 43 6f 6d 6d 65   VdbeModuleComme
23200 6e 74 28 28 76 2c 20 22 62 65 67 69 6e 20 74 72  nt((v, "begin tr
23210 61 6e 73 69 74 69 76 65 20 63 6f 6e 73 74 72 61  ansitive constra
23220 69 6e 74 22 29 29 3b 0a 20 20 20 20 70 45 41 6c  int"));.    pEAl
23230 74 20 3d 20 73 71 6c 69 74 65 33 53 74 61 63 6b  t = sqlite3Stack
23240 41 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a  AllocRaw(db, siz
23250 65 6f 66 28 2a 70 45 41 6c 74 29 29 3b 0a 20 20  eof(*pEAlt));.  
23260 20 20 69 66 28 20 70 45 41 6c 74 20 29 7b 0a 20    if( pEAlt ){. 
23270 20 20 20 20 20 2a 70 45 41 6c 74 20 3d 20 2a 70       *pEAlt = *p
23280 41 6c 74 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  Alt->pExpr;.    
23290 20 20 70 45 41 6c 74 2d 3e 70 4c 65 66 74 20 3d    pEAlt->pLeft =
232a0 20 70 45 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20   pE->pLeft;.    
232b0 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
232c0 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 41  alse(pParse, pEA
232d0 6c 74 2c 20 61 64 64 72 43 6f 6e 74 2c 20 53 51  lt, addrCont, SQ
232e0 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29  LITE_JUMPIFNULL)
232f0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  ;.      sqlite3S
23300 74 61 63 6b 46 72 65 65 28 64 62 2c 20 70 45 41  tackFree(db, pEA
23310 6c 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  lt);.    }.  }..
23320 20 20 2f 2a 20 46 6f 72 20 61 20 4c 45 46 54 20    /* For a LEFT 
23330 4f 55 54 45 52 20 4a 4f 49 4e 2c 20 67 65 6e 65  OUTER JOIN, gene
23340 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77  rate code that w
23350 69 6c 6c 20 72 65 63 6f 72 64 20 74 68 65 20 66  ill record the f
23360 61 63 74 20 74 68 61 74 0a 20 20 2a 2a 20 61 74  act that.  ** at
23370 20 6c 65 61 73 74 20 6f 6e 65 20 72 6f 77 20 6f   least one row o
23380 66 20 74 68 65 20 72 69 67 68 74 20 74 61 62 6c  f the right tabl
23390 65 20 68 61 73 20 6d 61 74 63 68 65 64 20 74 68  e has matched th
233a0 65 20 6c 65 66 74 20 74 61 62 6c 65 2e 20 20 0a  e left table.  .
233b0 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c 65 76 65    */.  if( pLeve
233c0 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 29 7b 0a  l->iLeftJoin ){.
233d0 20 20 20 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72      pLevel->addr
233e0 46 69 72 73 74 20 3d 20 73 71 6c 69 74 65 33 56  First = sqlite3V
233f0 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
23400 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
23410 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
23420 6e 74 65 67 65 72 2c 20 31 2c 20 70 4c 65 76 65  nteger, 1, pLeve
23430 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b 0a 20  l->iLeftJoin);. 
23440 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
23450 76 2c 20 22 72 65 63 6f 72 64 20 4c 45 46 54 20  v, "record LEFT 
23460 4a 4f 49 4e 20 68 69 74 22 29 29 3b 0a 20 20 20  JOIN hit"));.   
23470 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
23480 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a  eClear(pParse);.
23490 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57      for(pTerm=pW
234a0 43 2d 3e 61 2c 20 6a 3d 30 3b 20 6a 3c 70 57 43  C->a, j=0; j<pWC
234b0 2d 3e 6e 54 65 72 6d 3b 20 6a 2b 2b 2c 20 70 54  ->nTerm; j++, pT
234c0 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 74 65  erm++){.      te
234d0 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 77  stcase( pTerm->w
234e0 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49  tFlags & TERM_VI
234f0 52 54 55 41 4c 20 29 3b 0a 20 20 20 20 20 20 74  RTUAL );.      t
23500 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
23510 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 43  wtFlags & TERM_C
23520 4f 44 45 44 20 29 3b 0a 20 20 20 20 20 20 69 66  ODED );.      if
23530 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  ( pTerm->wtFlags
23540 20 26 20 28 54 45 52 4d 5f 56 49 52 54 55 41 4c   & (TERM_VIRTUAL
23550 7c 54 45 52 4d 5f 43 4f 44 45 44 29 20 29 20 63  |TERM_CODED) ) c
23560 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69  ontinue;.      i
23570 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65  f( (pTerm->prere
23580 71 41 6c 6c 20 26 20 70 4c 65 76 65 6c 2d 3e 6e  qAll & pLevel->n
23590 6f 74 52 65 61 64 79 29 21 3d 30 20 29 7b 0a 20  otReady)!=0 ){. 
235a0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
235b0 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54  WInfo->untestedT
235c0 65 72 6d 73 20 29 3b 0a 20 20 20 20 20 20 20 20  erms );.        
235d0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
235e0 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
235f0 70 54 65 72 6d 2d 3e 70 45 78 70 72 20 29 3b 0a  pTerm->pExpr );.
23600 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
23610 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
23620 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 61   pTerm->pExpr, a
23630 64 64 72 43 6f 6e 74 2c 20 53 51 4c 49 54 45 5f  ddrCont, SQLITE_
23640 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20  JUMPIFNULL);.   
23650 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67     pTerm->wtFlag
23660 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44 3b  s |= TERM_CODED;
23670 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
23680 74 75 72 6e 20 70 4c 65 76 65 6c 2d 3e 6e 6f 74  turn pLevel->not
23690 52 65 61 64 79 3b 0a 7d 0a 0a 23 69 66 64 65 66  Ready;.}..#ifdef
236a0 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42   WHERETRACE_ENAB
236b0 4c 45 44 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20  LED./*.** Print 
236c0 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61  the content of a
236d0 20 57 68 65 72 65 54 65 72 6d 20 6f 62 6a 65 63   WhereTerm objec
236e0 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  t.*/.static void
236f0 20 77 68 65 72 65 54 65 72 6d 50 72 69 6e 74 28   whereTermPrint(
23700 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
23710 2c 20 69 6e 74 20 69 54 65 72 6d 29 7b 0a 20 20  , int iTerm){.  
23720 69 66 28 20 70 54 65 72 6d 3d 3d 30 20 29 7b 0a  if( pTerm==0 ){.
23730 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
23740 50 72 69 6e 74 66 28 22 54 45 52 4d 2d 25 2d 33  Printf("TERM-%-3
23750 64 20 4e 55 4c 4c 5c 6e 22 2c 20 69 54 65 72 6d  d NULL\n", iTerm
23760 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
23770 63 68 61 72 20 7a 54 79 70 65 5b 34 5d 3b 0a 20  char zType[4];. 
23780 20 20 20 6d 65 6d 63 70 79 28 7a 54 79 70 65 2c     memcpy(zType,
23790 20 22 2e 2e 2e 22 2c 20 34 29 3b 0a 20 20 20 20   "...", 4);.    
237a0 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61  if( pTerm->wtFla
237b0 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41  gs & TERM_VIRTUA
237c0 4c 20 29 20 7a 54 79 70 65 5b 30 5d 20 3d 20 27  L ) zType[0] = '
237d0 56 27 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72  V';.    if( pTer
237e0 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
237f0 4f 5f 45 51 55 49 56 20 20 29 20 7a 54 79 70 65  O_EQUIV  ) zType
23800 5b 31 5d 20 3d 20 27 45 27 3b 0a 20 20 20 20 69  [1] = 'E';.    i
23810 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
23820 74 79 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c  ty(pTerm->pExpr,
23830 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 20   EP_FromJoin) ) 
23840 7a 54 79 70 65 5b 32 5d 20 3d 20 27 4c 27 3b 0a  zType[2] = 'L';.
23850 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
23860 50 72 69 6e 74 66 28 22 54 45 52 4d 2d 25 2d 33  Printf("TERM-%-3
23870 64 20 25 70 20 25 73 20 63 75 72 73 6f 72 3d 25  d %p %s cursor=%
23880 2d 33 64 20 70 72 6f 62 3d 25 2d 33 64 20 6f 70  -3d prob=%-3d op
23890 3d 30 78 25 30 33 78 5c 6e 22 2c 0a 20 20 20 20  =0x%03x\n",.    
238a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
238b0 20 20 20 69 54 65 72 6d 2c 20 70 54 65 72 6d 2c     iTerm, pTerm,
238c0 20 7a 54 79 70 65 2c 20 70 54 65 72 6d 2d 3e 6c   zType, pTerm->l
238d0 65 66 74 43 75 72 73 6f 72 2c 20 70 54 65 72 6d  eftCursor, pTerm
238e0 2d 3e 74 72 75 74 68 50 72 6f 62 2c 0a 20 20 20  ->truthProb,.   
238f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23900 20 20 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72      pTerm->eOper
23910 61 74 6f 72 29 3b 0a 20 20 20 20 73 71 6c 69 74  ator);.    sqlit
23920 65 33 54 72 65 65 56 69 65 77 45 78 70 72 28 30  e3TreeViewExpr(0
23930 2c 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20  , pTerm->pExpr, 
23940 30 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  0);.  }.}.#endif
23950 0a 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52  ..#ifdef WHERETR
23960 41 43 45 5f 45 4e 41 42 4c 45 44 0a 2f 2a 0a 2a  ACE_ENABLED./*.*
23970 2a 20 50 72 69 6e 74 20 61 20 57 68 65 72 65 4c  * Print a WhereL
23980 6f 6f 70 20 6f 62 6a 65 63 74 20 66 6f 72 20 64  oop object for d
23990 65 62 75 67 67 69 6e 67 20 70 75 72 70 6f 73 65  ebugging purpose
239a0 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  s.*/.static void
239b0 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28   whereLoopPrint(
239c0 57 68 65 72 65 4c 6f 6f 70 20 2a 70 2c 20 57 68  WhereLoop *p, Wh
239d0 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 29 7b  ereClause *pWC){
239e0 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  .  WhereInfo *pW
239f0 49 6e 66 6f 20 3d 20 70 57 43 2d 3e 70 57 49 6e  Info = pWC->pWIn
23a00 66 6f 3b 0a 20 20 69 6e 74 20 6e 62 20 3d 20 31  fo;.  int nb = 1
23a10 2b 28 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69  +(pWInfo->pTabLi
23a20 73 74 2d 3e 6e 53 72 63 2b 37 29 2f 38 3b 0a 20  st->nSrc+7)/8;. 
23a30 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
23a40 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 70 57  item *pItem = pW
23a50 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e  Info->pTabList->
23a60 61 20 2b 20 70 2d 3e 69 54 61 62 3b 0a 20 20 54  a + p->iTab;.  T
23a70 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 74  able *pTab = pIt
23a80 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 73 71 6c 69  em->pTab;.  sqli
23a90 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
23aa0 25 63 25 32 64 2e 25 30 2a 6c 6c 78 2e 25 30 2a  %c%2d.%0*llx.%0*
23ab0 6c 6c 78 22 2c 20 70 2d 3e 63 49 64 2c 0a 20 20  llx", p->cId,.  
23ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23ad0 20 20 20 70 2d 3e 69 54 61 62 2c 20 6e 62 2c 20     p->iTab, nb, 
23ae0 70 2d 3e 6d 61 73 6b 53 65 6c 66 2c 20 6e 62 2c  p->maskSelf, nb,
23af0 20 70 2d 3e 70 72 65 72 65 71 29 3b 0a 20 20 73   p->prereq);.  s
23b00 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
23b10 66 28 22 20 25 31 32 73 22 2c 0a 20 20 20 20 20  f(" %12s",.     
23b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23b30 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3f 20  pItem->zAlias ? 
23b40 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3a 20  pItem->zAlias : 
23b50 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
23b60 69 66 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20  if( (p->wsFlags 
23b70 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54  & WHERE_VIRTUALT
23b80 41 42 4c 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ABLE)==0 ){.    
23b90 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
23ba0 65 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 75 2e  e;.    if( p->u.
23bb0 62 74 72 65 65 2e 70 49 6e 64 65 78 20 26 26 20  btree.pIndex && 
23bc0 28 7a 4e 61 6d 65 20 3d 20 70 2d 3e 75 2e 62 74  (zName = p->u.bt
23bd0 72 65 65 2e 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d  ree.pIndex->zNam
23be0 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  e)!=0 ){.      i
23bf0 66 28 20 73 74 72 6e 63 6d 70 28 7a 4e 61 6d 65  f( strncmp(zName
23c00 2c 20 22 73 71 6c 69 74 65 5f 61 75 74 6f 69 6e  , "sqlite_autoin
23c10 64 65 78 5f 22 2c 20 31 37 29 3d 3d 30 20 29 7b  dex_", 17)==0 ){
23c20 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 20 3d  .        int i =
23c30 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
23c40 28 7a 4e 61 6d 65 29 20 2d 20 31 3b 0a 20 20 20  (zName) - 1;.   
23c50 20 20 20 20 20 77 68 69 6c 65 28 20 7a 4e 61 6d       while( zNam
23c60 65 5b 69 5d 21 3d 27 5f 27 20 29 20 69 2d 2d 3b  e[i]!='_' ) i--;
23c70 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 2b  .        zName +
23c80 3d 20 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = i;.      }.   
23c90 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
23ca0 72 69 6e 74 66 28 22 2e 25 2d 31 36 73 20 25 32  rintf(".%-16s %2
23cb0 64 22 2c 20 7a 4e 61 6d 65 2c 20 70 2d 3e 75 2e  d", zName, p->u.
23cc0 62 74 72 65 65 2e 6e 45 71 29 3b 0a 20 20 20 20  btree.nEq);.    
23cd0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
23ce0 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
23cf0 22 25 32 30 73 22 2c 22 22 29 3b 0a 20 20 20 20  "%20s","");.    
23d00 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63  }.  }else{.    c
23d10 68 61 72 20 2a 7a 3b 0a 20 20 20 20 69 66 28 20  har *z;.    if( 
23d20 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72  p->u.vtab.idxStr
23d30 20 29 7b 0a 20 20 20 20 20 20 7a 20 3d 20 73 71   ){.      z = sq
23d40 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 28  lite3_mprintf("(
23d50 25 64 2c 5c 22 25 73 5c 22 2c 25 78 29 22 2c 0a  %d,\"%s\",%x)",.
23d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23d70 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 4e 75 6d  p->u.vtab.idxNum
23d80 2c 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53  , p->u.vtab.idxS
23d90 74 72 2c 20 70 2d 3e 75 2e 76 74 61 62 2e 6f 6d  tr, p->u.vtab.om
23da0 69 74 4d 61 73 6b 29 3b 0a 20 20 20 20 7d 65 6c  itMask);.    }el
23db0 73 65 7b 0a 20 20 20 20 20 20 7a 20 3d 20 73 71  se{.      z = sq
23dc0 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 28  lite3_mprintf("(
23dd0 25 64 2c 25 78 29 22 2c 20 70 2d 3e 75 2e 76 74  %d,%x)", p->u.vt
23de0 61 62 2e 69 64 78 4e 75 6d 2c 20 70 2d 3e 75 2e  ab.idxNum, p->u.
23df0 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 29 3b 0a  vtab.omitMask);.
23e00 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
23e10 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 25  3DebugPrintf(" %
23e20 2d 31 39 73 22 2c 20 7a 29 3b 0a 20 20 20 20 73  -19s", z);.    s
23e30 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a  qlite3_free(z);.
23e40 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 77 73 46    }.  if( p->wsF
23e50 6c 61 67 73 20 26 20 57 48 45 52 45 5f 53 4b 49  lags & WHERE_SKI
23e60 50 53 43 41 4e 20 29 7b 0a 20 20 20 20 73 71 6c  PSCAN ){.    sql
23e70 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
23e80 22 20 66 20 25 30 35 78 20 25 64 2d 25 64 22 2c  " f %05x %d-%d",
23e90 20 70 2d 3e 77 73 46 6c 61 67 73 2c 20 70 2d 3e   p->wsFlags, p->
23ea0 6e 4c 54 65 72 6d 2c 70 2d 3e 6e 53 6b 69 70 29  nLTerm,p->nSkip)
23eb0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
23ec0 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
23ed0 66 28 22 20 66 20 25 30 35 78 20 4e 20 25 64 22  f(" f %05x N %d"
23ee0 2c 20 70 2d 3e 77 73 46 6c 61 67 73 2c 20 70 2d  , p->wsFlags, p-
23ef0 3e 6e 4c 54 65 72 6d 29 3b 0a 20 20 7d 0a 20 20  >nLTerm);.  }.  
23f00 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
23f10 74 66 28 22 20 63 6f 73 74 20 25 64 2c 25 64 2c  tf(" cost %d,%d,
23f20 25 64 5c 6e 22 2c 20 70 2d 3e 72 53 65 74 75 70  %d\n", p->rSetup
23f30 2c 20 70 2d 3e 72 52 75 6e 2c 20 70 2d 3e 6e 4f  , p->rRun, p->nO
23f40 75 74 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4c  ut);.  if( p->nL
23f50 54 65 72 6d 20 26 26 20 28 73 71 6c 69 74 65 33  Term && (sqlite3
23f60 57 68 65 72 65 54 72 61 63 65 20 26 20 30 78 31  WhereTrace & 0x1
23f70 30 30 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e  00)!=0 ){.    in
23f80 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t i;.    for(i=0
23f90 3b 20 69 3c 70 2d 3e 6e 4c 54 65 72 6d 3b 20 69  ; i<p->nLTerm; i
23fa0 2b 2b 29 7b 0a 20 20 20 20 20 20 77 68 65 72 65  ++){.      where
23fb0 54 65 72 6d 50 72 69 6e 74 28 70 2d 3e 61 4c 54  TermPrint(p->aLT
23fc0 65 72 6d 5b 69 5d 2c 20 69 29 3b 0a 20 20 20 20  erm[i], i);.    
23fd0 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  }.  }.}.#endif..
23fe0 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 62 75  /*.** Convert bu
23ff0 6c 6b 20 6d 65 6d 6f 72 79 20 69 6e 74 6f 20 61  lk memory into a
24000 20 76 61 6c 69 64 20 57 68 65 72 65 4c 6f 6f 70   valid WhereLoop
24010 20 74 68 61 74 20 63 61 6e 20 62 65 20 70 61 73   that can be pas
24020 73 65 64 0a 2a 2a 20 74 6f 20 77 68 65 72 65 4c  sed.** to whereL
24030 6f 6f 70 43 6c 65 61 72 20 68 61 72 6d 6c 65 73  oopClear harmles
24040 73 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  sly..*/.static v
24050 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69  oid whereLoopIni
24060 74 28 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29 7b  t(WhereLoop *p){
24070 0a 20 20 70 2d 3e 61 4c 54 65 72 6d 20 3d 20 70  .  p->aLTerm = p
24080 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 3b 0a 20  ->aLTermSpace;. 
24090 20 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20 30 3b 0a   p->nLTerm = 0;.
240a0 20 20 70 2d 3e 6e 4c 53 6c 6f 74 20 3d 20 41 72    p->nLSlot = Ar
240b0 72 61 79 53 69 7a 65 28 70 2d 3e 61 4c 54 65 72  raySize(p->aLTer
240c0 6d 53 70 61 63 65 29 3b 0a 20 20 70 2d 3e 77 73  mSpace);.  p->ws
240d0 46 6c 61 67 73 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  Flags = 0;.}../*
240e0 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 57 68  .** Clear the Wh
240f0 65 72 65 4c 6f 6f 70 2e 75 20 75 6e 69 6f 6e 2e  ereLoop.u union.
24100 20 20 4c 65 61 76 65 20 57 68 65 72 65 4c 6f 6f    Leave WhereLoo
24110 70 2e 70 4c 54 65 72 6d 20 69 6e 74 61 63 74 2e  p.pLTerm intact.
24120 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
24130 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 55 6e  whereLoopClearUn
24140 69 6f 6e 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ion(sqlite3 *db,
24150 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a   WhereLoop *p){.
24160 20 20 69 66 28 20 70 2d 3e 77 73 46 6c 61 67 73    if( p->wsFlags
24170 20 26 20 28 57 48 45 52 45 5f 56 49 52 54 55 41   & (WHERE_VIRTUA
24180 4c 54 41 42 4c 45 7c 57 48 45 52 45 5f 41 55 54  LTABLE|WHERE_AUT
24190 4f 5f 49 4e 44 45 58 29 20 29 7b 0a 20 20 20 20  O_INDEX) ){.    
241a0 69 66 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20  if( (p->wsFlags 
241b0 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54  & WHERE_VIRTUALT
241c0 41 42 4c 45 29 21 3d 30 20 26 26 20 70 2d 3e 75  ABLE)!=0 && p->u
241d0 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20 29  .vtab.needFree )
241e0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
241f0 66 72 65 65 28 70 2d 3e 75 2e 76 74 61 62 2e 69  free(p->u.vtab.i
24200 64 78 53 74 72 29 3b 0a 20 20 20 20 20 20 70 2d  dxStr);.      p-
24210 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65  >u.vtab.needFree
24220 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 75   = 0;.      p->u
24230 2e 76 74 61 62 2e 69 64 78 53 74 72 20 3d 20 30  .vtab.idxStr = 0
24240 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
24250 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  (p->wsFlags & WH
24260 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 21  ERE_AUTO_INDEX)!
24270 3d 30 20 26 26 20 70 2d 3e 75 2e 62 74 72 65 65  =0 && p->u.btree
24280 2e 70 49 6e 64 65 78 21 3d 30 20 29 7b 0a 20 20  .pIndex!=0 ){.  
24290 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
242a0 65 28 64 62 2c 20 70 2d 3e 75 2e 62 74 72 65 65  e(db, p->u.btree
242b0 2e 70 49 6e 64 65 78 2d 3e 7a 43 6f 6c 41 66 66  .pIndex->zColAff
242c0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
242d0 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 75 2e  DbFree(db, p->u.
242e0 62 74 72 65 65 2e 70 49 6e 64 65 78 29 3b 0a 20  btree.pIndex);. 
242f0 20 20 20 20 20 70 2d 3e 75 2e 62 74 72 65 65 2e       p->u.btree.
24300 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20 20  pIndex = 0;.    
24310 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  }.  }.}../*.** D
24320 65 61 6c 6c 6f 63 61 74 65 20 69 6e 74 65 72 6e  eallocate intern
24330 61 6c 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 62  al memory used b
24340 79 20 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62  y a WhereLoop ob
24350 6a 65 63 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ject.*/.static v
24360 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65  oid whereLoopCle
24370 61 72 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ar(sqlite3 *db, 
24380 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20  WhereLoop *p){. 
24390 20 69 66 28 20 70 2d 3e 61 4c 54 65 72 6d 21 3d   if( p->aLTerm!=
243a0 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 20 29  p->aLTermSpace )
243b0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
243c0 62 2c 20 70 2d 3e 61 4c 54 65 72 6d 29 3b 0a 20  b, p->aLTerm);. 
243d0 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 55   whereLoopClearU
243e0 6e 69 6f 6e 28 64 62 2c 20 70 29 3b 0a 20 20 77  nion(db, p);.  w
243f0 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28 70 29 3b  hereLoopInit(p);
24400 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65 61  .}../*.** Increa
24410 73 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c  se the memory al
24420 6c 6f 63 61 74 69 6f 6e 20 66 6f 72 20 70 4c 6f  location for pLo
24430 6f 70 2d 3e 61 4c 54 65 72 6d 5b 5d 20 74 6f 20  op->aLTerm[] to 
24440 62 65 20 61 74 20 6c 65 61 73 74 20 6e 2e 0a 2a  be at least n..*
24450 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  /.static int whe
24460 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 73 71 6c  reLoopResize(sql
24470 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c  ite3 *db, WhereL
24480 6f 6f 70 20 2a 70 2c 20 69 6e 74 20 6e 29 7b 0a  oop *p, int n){.
24490 20 20 57 68 65 72 65 54 65 72 6d 20 2a 2a 70 61    WhereTerm **pa
244a0 4e 65 77 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4c  New;.  if( p->nL
244b0 53 6c 6f 74 3e 3d 6e 20 29 20 72 65 74 75 72 6e  Slot>=n ) return
244c0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 6e 20   SQLITE_OK;.  n 
244d0 3d 20 28 6e 2b 37 29 26 7e 37 3b 0a 20 20 70 61  = (n+7)&~7;.  pa
244e0 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  New = sqlite3DbM
244f0 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a  allocRaw(db, siz
24500 65 6f 66 28 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d  eof(p->aLTerm[0]
24510 29 2a 6e 29 3b 0a 20 20 69 66 28 20 70 61 4e 65  )*n);.  if( paNe
24520 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  w==0 ) return SQ
24530 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d 65  LITE_NOMEM;.  me
24540 6d 63 70 79 28 70 61 4e 65 77 2c 20 70 2d 3e 61  mcpy(paNew, p->a
24550 4c 54 65 72 6d 2c 20 73 69 7a 65 6f 66 28 70 2d  LTerm, sizeof(p-
24560 3e 61 4c 54 65 72 6d 5b 30 5d 29 2a 70 2d 3e 6e  >aLTerm[0])*p->n
24570 4c 53 6c 6f 74 29 3b 0a 20 20 69 66 28 20 70 2d  LSlot);.  if( p-
24580 3e 61 4c 54 65 72 6d 21 3d 70 2d 3e 61 4c 54 65  >aLTerm!=p->aLTe
24590 72 6d 53 70 61 63 65 20 29 20 73 71 6c 69 74 65  rmSpace ) sqlite
245a0 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61  3DbFree(db, p->a
245b0 4c 54 65 72 6d 29 3b 0a 20 20 70 2d 3e 61 4c 54  LTerm);.  p->aLT
245c0 65 72 6d 20 3d 20 70 61 4e 65 77 3b 0a 20 20 70  erm = paNew;.  p
245d0 2d 3e 6e 4c 53 6c 6f 74 20 3d 20 6e 3b 0a 20 20  ->nLSlot = n;.  
245e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
245f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73  ;.}../*.** Trans
24600 66 65 72 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d  fer content from
24610 20 74 68 65 20 73 65 63 6f 6e 64 20 70 4c 6f 6f   the second pLoo
24620 70 20 69 6e 74 6f 20 74 68 65 20 66 69 72 73 74  p into the first
24630 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
24640 77 68 65 72 65 4c 6f 6f 70 58 66 65 72 28 73 71  whereLoopXfer(sq
24650 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65  lite3 *db, Where
24660 4c 6f 6f 70 20 2a 70 54 6f 2c 20 57 68 65 72 65  Loop *pTo, Where
24670 4c 6f 6f 70 20 2a 70 46 72 6f 6d 29 7b 0a 20 20  Loop *pFrom){.  
24680 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 55 6e  whereLoopClearUn
24690 69 6f 6e 28 64 62 2c 20 70 54 6f 29 3b 0a 20 20  ion(db, pTo);.  
246a0 69 66 28 20 77 68 65 72 65 4c 6f 6f 70 52 65 73  if( whereLoopRes
246b0 69 7a 65 28 64 62 2c 20 70 54 6f 2c 20 70 46 72  ize(db, pTo, pFr
246c0 6f 6d 2d 3e 6e 4c 54 65 72 6d 29 20 29 7b 0a 20  om->nLTerm) ){. 
246d0 20 20 20 6d 65 6d 73 65 74 28 26 70 54 6f 2d 3e     memset(&pTo->
246e0 75 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 54 6f  u, 0, sizeof(pTo
246f0 2d 3e 75 29 29 3b 0a 20 20 20 20 72 65 74 75 72  ->u));.    retur
24700 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
24710 20 20 7d 0a 20 20 6d 65 6d 63 70 79 28 70 54 6f    }.  memcpy(pTo
24720 2c 20 70 46 72 6f 6d 2c 20 57 48 45 52 45 5f 4c  , pFrom, WHERE_L
24730 4f 4f 50 5f 58 46 45 52 5f 53 5a 29 3b 0a 20 20  OOP_XFER_SZ);.  
24740 6d 65 6d 63 70 79 28 70 54 6f 2d 3e 61 4c 54 65  memcpy(pTo->aLTe
24750 72 6d 2c 20 70 46 72 6f 6d 2d 3e 61 4c 54 65 72  rm, pFrom->aLTer
24760 6d 2c 20 70 54 6f 2d 3e 6e 4c 54 65 72 6d 2a 73  m, pTo->nLTerm*s
24770 69 7a 65 6f 66 28 70 54 6f 2d 3e 61 4c 54 65 72  izeof(pTo->aLTer
24780 6d 5b 30 5d 29 29 3b 0a 20 20 69 66 28 20 70 46  m[0]));.  if( pF
24790 72 6f 6d 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  rom->wsFlags & W
247a0 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c  HERE_VIRTUALTABL
247b0 45 20 29 7b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e  E ){.    pFrom->
247c0 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20  u.vtab.needFree 
247d0 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  = 0;.  }else if(
247e0 20 28 70 46 72 6f 6d 2d 3e 77 73 46 6c 61 67 73   (pFrom->wsFlags
247f0 20 26 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e   & WHERE_AUTO_IN
24800 44 45 58 29 21 3d 30 20 29 7b 0a 20 20 20 20 70  DEX)!=0 ){.    p
24810 46 72 6f 6d 2d 3e 75 2e 62 74 72 65 65 2e 70 49  From->u.btree.pI
24820 6e 64 65 78 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  ndex = 0;.  }.  
24830 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
24840 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  ;.}../*.** Delet
24850 65 20 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62  e a WhereLoop ob
24860 6a 65 63 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ject.*/.static v
24870 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 44 65 6c  oid whereLoopDel
24880 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ete(sqlite3 *db,
24890 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a   WhereLoop *p){.
248a0 20 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72    whereLoopClear
248b0 28 64 62 2c 20 70 29 3b 0a 20 20 73 71 6c 69 74  (db, p);.  sqlit
248c0 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b  e3DbFree(db, p);
248d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61  .}../*.** Free a
248e0 20 57 68 65 72 65 49 6e 66 6f 20 73 74 72 75 63   WhereInfo struc
248f0 74 75 72 65 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ture.*/.static v
24900 6f 69 64 20 77 68 65 72 65 49 6e 66 6f 46 72 65  oid whereInfoFre
24910 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57  e(sqlite3 *db, W
24920 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
24930 29 7b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28  ){.  if( ALWAYS(
24940 70 57 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20 77  pWInfo) ){.    w
24950 68 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28  hereClauseClear(
24960 26 70 57 49 6e 66 6f 2d 3e 73 57 43 29 3b 0a 20  &pWInfo->sWC);. 
24970 20 20 20 77 68 69 6c 65 28 20 70 57 49 6e 66 6f     while( pWInfo
24980 2d 3e 70 4c 6f 6f 70 73 20 29 7b 0a 20 20 20 20  ->pLoops ){.    
24990 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 20 3d    WhereLoop *p =
249a0 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 3b   pWInfo->pLoops;
249b0 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 70  .      pWInfo->p
249c0 4c 6f 6f 70 73 20 3d 20 70 2d 3e 70 4e 65 78 74  Loops = p->pNext
249d0 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 77 68 65 72  Loop;.      wher
249e0 65 4c 6f 6f 70 44 65 6c 65 74 65 28 64 62 2c 20  eLoopDelete(db, 
249f0 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  p);.    }.    sq
24a00 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
24a10 70 57 49 6e 66 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a  pWInfo);.  }.}..
24a20 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
24a30 45 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 20  E if all of the 
24a40 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72  following are tr
24a50 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20  ue:.**.**   (1) 
24a60 20 58 20 68 61 73 20 74 68 65 20 73 61 6d 65 20   X has the same 
24a70 6f 72 20 6c 6f 77 65 72 20 63 6f 73 74 20 74 68  or lower cost th
24a80 61 74 20 59 0a 2a 2a 20 20 20 28 32 29 20 20 58  at Y.**   (2)  X
24a90 20 69 73 20 61 20 70 72 6f 70 65 72 20 73 75 62   is a proper sub
24aa0 73 65 74 20 6f 66 20 59 0a 2a 2a 20 20 20 28 33  set of Y.**   (3
24ab0 29 20 20 58 20 73 6b 69 70 73 20 61 74 20 6c 65  )  X skips at le
24ac0 61 73 74 20 61 73 20 6d 61 6e 79 20 63 6f 6c 75  ast as many colu
24ad0 6d 6e 73 20 61 73 20 59 0a 2a 2a 0a 2a 2a 20 42  mns as Y.**.** B
24ae0 79 20 22 70 72 6f 70 65 72 20 73 75 62 73 65 74  y "proper subset
24af0 22 20 77 65 20 6d 65 61 6e 20 74 68 61 74 20 58  " we mean that X
24b00 20 75 73 65 73 20 66 65 77 65 72 20 57 48 45 52   uses fewer WHER
24b10 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 0a 2a  E clause terms.*
24b20 2a 20 74 68 61 6e 20 59 20 61 6e 64 20 74 68 61  * than Y and tha
24b30 74 20 65 76 65 72 79 20 57 48 45 52 45 20 63 6c  t every WHERE cl
24b40 61 75 73 65 20 74 65 72 6d 20 75 73 65 64 20 62  ause term used b
24b50 79 20 58 20 69 73 20 61 6c 73 6f 20 75 73 65 64  y X is also used
24b60 0a 2a 2a 20 62 79 20 59 2e 0a 2a 2a 0a 2a 2a 20  .** by Y..**.** 
24b70 49 66 20 58 20 69 73 20 61 20 70 72 6f 70 65 72  If X is a proper
24b80 20 73 75 62 73 65 74 20 6f 66 20 59 20 74 68 65   subset of Y the
24b90 6e 20 59 20 69 73 20 61 20 62 65 74 74 65 72 20  n Y is a better 
24ba0 63 68 6f 69 63 65 20 61 6e 64 20 6f 75 67 68 74  choice and ought
24bb0 0a 2a 2a 20 74 6f 20 68 61 76 65 20 61 20 6c 6f  .** to have a lo
24bc0 77 65 72 20 63 6f 73 74 2e 20 20 54 68 69 73 20  wer cost.  This 
24bd0 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
24be0 54 52 55 45 20 77 68 65 6e 20 74 68 61 74 20 63  TRUE when that c
24bf0 6f 73 74 20 0a 2a 2a 20 72 65 6c 61 74 69 6f 6e  ost .** relation
24c00 73 68 69 70 20 69 73 20 69 6e 76 65 72 74 65 64  ship is inverted
24c10 20 61 6e 64 20 6e 65 65 64 73 20 74 6f 20 62 65   and needs to be
24c20 20 61 64 6a 75 73 74 65 64 2e 20 20 54 68 65 20   adjusted.  The 
24c30 74 68 69 72 64 20 72 75 6c 65 0a 2a 2a 20 77 61  third rule.** wa
24c40 73 20 61 64 64 65 64 20 62 65 63 61 75 73 65 20  s added because 
24c50 69 66 20 58 20 75 73 65 73 20 73 6b 69 70 2d 73  if X uses skip-s
24c60 63 61 6e 20 6c 65 73 73 20 74 68 61 6e 20 59 20  can less than Y 
24c70 69 74 20 73 74 69 6c 6c 20 6d 69 67 68 74 0a 2a  it still might.*
24c80 2a 20 64 65 73 65 72 76 65 20 61 20 6c 6f 77 65  * deserve a lowe
24c90 72 20 63 6f 73 74 20 65 76 65 6e 20 69 66 20 69  r cost even if i
24ca0 74 20 69 73 20 61 20 70 72 6f 70 65 72 20 73 75  t is a proper su
24cb0 62 73 65 74 20 6f 66 20 59 2e 0a 2a 2f 0a 73 74  bset of Y..*/.st
24cc0 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f  atic int whereLo
24cd0 6f 70 43 68 65 61 70 65 72 50 72 6f 70 65 72 53  opCheaperProperS
24ce0 75 62 73 65 74 28 0a 20 20 63 6f 6e 73 74 20 57  ubset(.  const W
24cf0 68 65 72 65 4c 6f 6f 70 20 2a 70 58 2c 20 20 20  hereLoop *pX,   
24d00 20 20 20 20 2f 2a 20 46 69 72 73 74 20 57 68 65      /* First Whe
24d10 72 65 4c 6f 6f 70 20 74 6f 20 63 6f 6d 70 61 72  reLoop to compar
24d20 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 57 68 65  e */.  const Whe
24d30 72 65 4c 6f 6f 70 20 2a 70 59 20 20 20 20 20 20  reLoop *pY      
24d40 20 20 2f 2a 20 43 6f 6d 70 61 72 65 20 61 67 61    /* Compare aga
24d50 69 6e 73 74 20 74 68 69 73 20 57 68 65 72 65 4c  inst this WhereL
24d60 6f 6f 70 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  oop */.){.  int 
24d70 69 2c 20 6a 3b 0a 20 20 69 66 28 20 70 58 2d 3e  i, j;.  if( pX->
24d80 6e 4c 54 65 72 6d 2d 70 58 2d 3e 6e 53 6b 69 70  nLTerm-pX->nSkip
24d90 20 3e 3d 20 70 59 2d 3e 6e 4c 54 65 72 6d 2d 70   >= pY->nLTerm-p
24da0 59 2d 3e 6e 53 6b 69 70 20 29 7b 0a 20 20 20 20  Y->nSkip ){.    
24db0 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 58 20 69  return 0; /* X i
24dc0 73 20 6e 6f 74 20 61 20 73 75 62 73 65 74 20 6f  s not a subset o
24dd0 66 20 59 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28  f Y */.  }.  if(
24de0 20 70 59 2d 3e 6e 53 6b 69 70 20 3e 20 70 58 2d   pY->nSkip > pX-
24df0 3e 6e 53 6b 69 70 20 29 20 72 65 74 75 72 6e 20  >nSkip ) return 
24e00 30 3b 0a 20 20 69 66 28 20 70 58 2d 3e 72 52 75  0;.  if( pX->rRu
24e10 6e 20 3e 3d 20 70 59 2d 3e 72 52 75 6e 20 29 7b  n >= pY->rRun ){
24e20 0a 20 20 20 20 69 66 28 20 70 58 2d 3e 72 52 75  .    if( pX->rRu
24e30 6e 20 3e 20 70 59 2d 3e 72 52 75 6e 20 29 20 72  n > pY->rRun ) r
24e40 65 74 75 72 6e 20 30 3b 20 20 20 20 2f 2a 20 58  eturn 0;    /* X
24e50 20 63 6f 73 74 73 20 6d 6f 72 65 20 74 68 61 6e   costs more than
24e60 20 59 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 58   Y */.    if( pX
24e70 2d 3e 6e 4f 75 74 20 3e 20 70 59 2d 3e 6e 4f 75  ->nOut > pY->nOu
24e80 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  t ) return 0;   
24e90 20 2f 2a 20 58 20 63 6f 73 74 73 20 6d 6f 72 65   /* X costs more
24ea0 20 74 68 61 6e 20 59 20 2a 2f 0a 20 20 7d 0a 20   than Y */.  }. 
24eb0 20 66 6f 72 28 69 3d 70 58 2d 3e 6e 4c 54 65 72   for(i=pX->nLTer
24ec0 6d 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b  m-1; i>=0; i--){
24ed0 0a 20 20 20 20 69 66 28 20 70 58 2d 3e 61 4c 54  .    if( pX->aLT
24ee0 65 72 6d 5b 69 5d 3d 3d 30 20 29 20 63 6f 6e 74  erm[i]==0 ) cont
24ef0 69 6e 75 65 3b 0a 20 20 20 20 66 6f 72 28 6a 3d  inue;.    for(j=
24f00 70 59 2d 3e 6e 4c 54 65 72 6d 2d 31 3b 20 6a 3e  pY->nLTerm-1; j>
24f10 3d 30 3b 20 6a 2d 2d 29 7b 0a 20 20 20 20 20 20  =0; j--){.      
24f20 69 66 28 20 70 59 2d 3e 61 4c 54 65 72 6d 5b 6a  if( pY->aLTerm[j
24f30 5d 3d 3d 70 58 2d 3e 61 4c 54 65 72 6d 5b 69 5d  ]==pX->aLTerm[i]
24f40 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a   ) break;.    }.
24f50 20 20 20 20 69 66 28 20 6a 3c 30 20 29 20 72 65      if( j<0 ) re
24f60 74 75 72 6e 20 30 3b 20 20 2f 2a 20 58 20 6e 6f  turn 0;  /* X no
24f70 74 20 61 20 73 75 62 73 65 74 20 6f 66 20 59 20  t a subset of Y 
24f80 73 69 6e 63 65 20 74 65 72 6d 20 58 5b 69 5d 20  since term X[i] 
24f90 6e 6f 74 20 75 73 65 64 20 62 79 20 59 20 2a 2f  not used by Y */
24fa0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b  .  }.  return 1;
24fb0 20 20 2f 2a 20 41 6c 6c 20 63 6f 6e 64 69 74 69    /* All conditi
24fc0 6f 6e 73 20 6d 65 65 74 20 2a 2f 0a 7d 0a 0a 2f  ons meet */.}../
24fd0 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 61 64 6a 75  *.** Try to adju
24fe0 73 74 20 74 68 65 20 63 6f 73 74 20 6f 66 20 57  st the cost of W
24ff0 68 65 72 65 4c 6f 6f 70 20 70 54 65 6d 70 6c 61  hereLoop pTempla
25000 74 65 20 75 70 77 61 72 64 73 20 6f 72 20 64 6f  te upwards or do
25010 77 6e 77 61 72 64 73 20 73 6f 0a 2a 2a 20 74 68  wnwards so.** th
25020 61 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20  at:.**.**   (1) 
25030 70 54 65 6d 70 6c 61 74 65 20 63 6f 73 74 73 20  pTemplate costs 
25040 6c 65 73 73 20 74 68 61 6e 20 61 6e 79 20 6f 74  less than any ot
25050 68 65 72 20 57 68 65 72 65 4c 6f 6f 70 73 20 74  her WhereLoops t
25060 68 61 74 20 61 72 65 20 61 20 70 72 6f 70 65 72  hat are a proper
25070 0a 2a 2a 20 20 20 20 20 20 20 73 75 62 73 65 74  .**       subset
25080 20 6f 66 20 70 54 65 6d 70 6c 61 74 65 0a 2a 2a   of pTemplate.**
25090 0a 2a 2a 20 20 20 28 32 29 20 70 54 65 6d 70 6c  .**   (2) pTempl
250a0 61 74 65 20 63 6f 73 74 73 20 6d 6f 72 65 20 74  ate costs more t
250b0 68 61 6e 20 61 6e 79 20 6f 74 68 65 72 20 57 68  han any other Wh
250c0 65 72 65 4c 6f 6f 70 73 20 66 6f 72 20 77 68 69  ereLoops for whi
250d0 63 68 20 70 54 65 6d 70 6c 61 74 65 0a 2a 2a 20  ch pTemplate.** 
250e0 20 20 20 20 20 20 69 73 20 61 20 70 72 6f 70 65        is a prope
250f0 72 20 73 75 62 73 65 74 2e 0a 2a 2a 0a 2a 2a 20  r subset..**.** 
25100 54 6f 20 73 61 79 20 22 57 68 65 72 65 4c 6f 6f  To say "WhereLoo
25110 70 20 58 20 69 73 20 61 20 70 72 6f 70 65 72 20  p X is a proper 
25120 73 75 62 73 65 74 20 6f 66 20 59 22 20 6d 65 61  subset of Y" mea
25130 6e 73 20 74 68 61 74 20 58 20 75 73 65 73 20 66  ns that X uses f
25140 65 77 65 72 0a 2a 2a 20 57 48 45 52 45 20 63 6c  ewer.** WHERE cl
25150 61 75 73 65 20 74 65 72 6d 73 20 74 68 61 6e 20  ause terms than 
25160 59 20 61 6e 64 20 74 68 61 74 20 65 76 65 72 79  Y and that every
25170 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65   WHERE clause te
25180 72 6d 20 75 73 65 64 20 62 79 20 58 20 69 73 0a  rm used by X is.
25190 2a 2a 20 61 6c 73 6f 20 75 73 65 64 20 62 79 20  ** also used by 
251a0 59 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  Y..*/.static voi
251b0 64 20 77 68 65 72 65 4c 6f 6f 70 41 64 6a 75 73  d whereLoopAdjus
251c0 74 43 6f 73 74 28 63 6f 6e 73 74 20 57 68 65 72  tCost(const Wher
251d0 65 4c 6f 6f 70 20 2a 70 2c 20 57 68 65 72 65 4c  eLoop *p, WhereL
251e0 6f 6f 70 20 2a 70 54 65 6d 70 6c 61 74 65 29 7b  oop *pTemplate){
251f0 0a 20 20 69 66 28 20 28 70 54 65 6d 70 6c 61 74  .  if( (pTemplat
25200 65 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  e->wsFlags & WHE
25210 52 45 5f 49 4e 44 45 58 45 44 29 3d 3d 30 20 29  RE_INDEXED)==0 )
25220 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 3b   return;.  for(;
25230 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 4c 6f   p; p=p->pNextLo
25240 6f 70 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  op){.    if( p->
25250 69 54 61 62 21 3d 70 54 65 6d 70 6c 61 74 65 2d  iTab!=pTemplate-
25260 3e 69 54 61 62 20 29 20 63 6f 6e 74 69 6e 75 65  >iTab ) continue
25270 3b 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 77 73  ;.    if( (p->ws
25280 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e  Flags & WHERE_IN
25290 44 45 58 45 44 29 3d 3d 30 20 29 20 63 6f 6e 74  DEXED)==0 ) cont
252a0 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 77 68  inue;.    if( wh
252b0 65 72 65 4c 6f 6f 70 43 68 65 61 70 65 72 50 72  ereLoopCheaperPr
252c0 6f 70 65 72 53 75 62 73 65 74 28 70 2c 20 70 54  operSubset(p, pT
252d0 65 6d 70 6c 61 74 65 29 20 29 7b 0a 20 20 20 20  emplate) ){.    
252e0 20 20 2f 2a 20 41 64 6a 75 73 74 20 70 54 65 6d    /* Adjust pTem
252f0 70 6c 61 74 65 20 63 6f 73 74 20 64 6f 77 6e 77  plate cost downw
25300 61 72 64 20 73 6f 20 74 68 61 74 20 69 74 20 69  ard so that it i
25310 73 20 63 68 65 61 70 65 72 20 74 68 61 6e 20 69  s cheaper than i
25320 74 73 20 0a 20 20 20 20 20 20 2a 2a 20 73 75 62  ts .      ** sub
25330 73 65 74 20 70 2e 20 2a 2f 0a 20 20 20 20 20 20  set p. */.      
25340 57 48 45 52 45 54 52 41 43 45 28 30 78 38 30 2c  WHERETRACE(0x80,
25350 28 22 73 75 62 73 65 74 20 63 6f 73 74 20 61 64  ("subset cost ad
25360 6a 75 73 74 6d 65 6e 74 20 25 64 2c 25 64 20 74  justment %d,%d t
25370 6f 20 25 64 2c 25 64 5c 6e 22 2c 0a 20 20 20 20  o %d,%d\n",.    
25380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25390 20 20 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52     pTemplate->rR
253a0 75 6e 2c 20 70 54 65 6d 70 6c 61 74 65 2d 3e 6e  un, pTemplate->n
253b0 4f 75 74 2c 20 70 2d 3e 72 52 75 6e 2c 20 70 2d  Out, p->rRun, p-
253c0 3e 6e 4f 75 74 2d 31 29 29 3b 0a 20 20 20 20 20  >nOut-1));.     
253d0 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e   pTemplate->rRun
253e0 20 3d 20 70 2d 3e 72 52 75 6e 3b 0a 20 20 20 20   = p->rRun;.    
253f0 20 20 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75    pTemplate->nOu
25400 74 20 3d 20 70 2d 3e 6e 4f 75 74 20 2d 20 31 3b  t = p->nOut - 1;
25410 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 77  .    }else if( w
25420 68 65 72 65 4c 6f 6f 70 43 68 65 61 70 65 72 50  hereLoopCheaperP
25430 72 6f 70 65 72 53 75 62 73 65 74 28 70 54 65 6d  roperSubset(pTem
25440 70 6c 61 74 65 2c 20 70 29 20 29 7b 0a 20 20 20  plate, p) ){.   
25450 20 20 20 2f 2a 20 41 64 6a 75 73 74 20 70 54 65     /* Adjust pTe
25460 6d 70 6c 61 74 65 20 63 6f 73 74 20 75 70 77 61  mplate cost upwa
25470 72 64 20 73 6f 20 74 68 61 74 20 69 74 20 69 73  rd so that it is
25480 20 63 6f 73 74 6c 69 65 72 20 74 68 61 6e 20 70   costlier than p
25490 20 73 69 6e 63 65 0a 20 20 20 20 20 20 2a 2a 20   since.      ** 
254a0 70 54 65 6d 70 6c 61 74 65 20 69 73 20 61 20 70  pTemplate is a p
254b0 72 6f 70 65 72 20 73 75 62 73 65 74 20 6f 66 20  roper subset of 
254c0 70 20 2a 2f 0a 20 20 20 20 20 20 57 48 45 52 45  p */.      WHERE
254d0 54 52 41 43 45 28 30 78 38 30 2c 28 22 73 75 62  TRACE(0x80,("sub
254e0 73 65 74 20 63 6f 73 74 20 61 64 6a 75 73 74 6d  set cost adjustm
254f0 65 6e 74 20 25 64 2c 25 64 20 74 6f 20 25 64 2c  ent %d,%d to %d,
25500 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
25510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54                pT
25520 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 2c 20 70  emplate->rRun, p
25530 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74 2c 20  Template->nOut, 
25540 70 2d 3e 72 52 75 6e 2c 20 70 2d 3e 6e 4f 75 74  p->rRun, p->nOut
25550 2b 31 29 29 3b 0a 20 20 20 20 20 20 70 54 65 6d  +1));.      pTem
25560 70 6c 61 74 65 2d 3e 72 52 75 6e 20 3d 20 70 2d  plate->rRun = p-
25570 3e 72 52 75 6e 3b 0a 20 20 20 20 20 20 70 54 65  >rRun;.      pTe
25580 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74 20 3d 20 70  mplate->nOut = p
25590 2d 3e 6e 4f 75 74 20 2b 20 31 3b 0a 20 20 20 20  ->nOut + 1;.    
255a0 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  }.  }.}../*.** S
255b0 65 61 72 63 68 20 74 68 65 20 6c 69 73 74 20 6f  earch the list o
255c0 66 20 57 68 65 72 65 4c 6f 6f 70 73 20 69 6e 20  f WhereLoops in 
255d0 2a 70 70 50 72 65 76 20 6c 6f 6f 6b 69 6e 67 20  *ppPrev looking 
255e0 66 6f 72 20 6f 6e 65 20 74 68 61 74 20 63 61 6e  for one that can
255f0 20 62 65 0a 2a 2a 20 73 75 70 70 6c 61 6e 74 65   be.** supplante
25600 64 20 62 79 20 70 54 65 6d 70 6c 61 74 65 2e 0a  d by pTemplate..
25610 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 4e 55 4c  **.** Return NUL
25620 4c 20 69 66 20 74 68 65 20 57 68 65 72 65 4c 6f  L if the WhereLo
25630 6f 70 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e 73  op list contains
25640 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 20 63   an entry that c
25650 61 6e 20 73 75 70 70 6c 61 6e 74 0a 2a 2a 20 70  an supplant.** p
25660 54 65 6d 70 6c 61 74 65 2c 20 69 6e 20 6f 74 68  Template, in oth
25670 65 72 20 77 6f 72 64 73 20 69 66 20 70 54 65 6d  er words if pTem
25680 70 6c 61 74 65 20 64 6f 65 73 20 6e 6f 74 20 62  plate does not b
25690 65 6c 6f 6e 67 20 6f 6e 20 74 68 65 20 6c 69 73  elong on the lis
256a0 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 58 20 69  t..**.** If pX i
256b0 73 20 61 20 57 68 65 72 65 4c 6f 6f 70 20 74 68  s a WhereLoop th
256c0 61 74 20 70 54 65 6d 70 6c 61 74 65 20 63 61 6e  at pTemplate can
256d0 20 73 75 70 70 6c 61 6e 74 2c 20 74 68 65 6e 20   supplant, then 
256e0 72 65 74 75 72 6e 20 74 68 65 0a 2a 2a 20 6c 69  return the.** li
256f0 6e 6b 20 74 68 61 74 20 70 6f 69 6e 74 73 20 74  nk that points t
25700 6f 20 70 58 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  o pX..**.** If p
25710 54 65 6d 70 6c 61 74 65 20 63 61 6e 6e 6f 74 20  Template cannot 
25720 73 75 70 70 6c 61 6e 74 20 61 6e 79 20 65 78 69  supplant any exi
25730 73 74 69 6e 67 20 65 6c 65 6d 65 6e 74 20 6f 66  sting element of
25740 20 74 68 65 20 6c 69 73 74 20 62 75 74 20 6e 65   the list but ne
25750 65 64 73 0a 2a 2a 20 74 6f 20 62 65 20 61 64 64  eds.** to be add
25760 65 64 20 74 6f 20 74 68 65 20 6c 69 73 74 2c 20  ed to the list, 
25770 74 68 65 6e 20 72 65 74 75 72 6e 20 61 20 70 6f  then return a po
25780 69 6e 74 65 72 20 74 6f 20 74 68 65 20 74 61 69  inter to the tai
25790 6c 20 6f 66 20 74 68 65 20 6c 69 73 74 2e 0a 2a  l of the list..*
257a0 2f 0a 73 74 61 74 69 63 20 57 68 65 72 65 4c 6f  /.static WhereLo
257b0 6f 70 20 2a 2a 77 68 65 72 65 4c 6f 6f 70 46 69  op **whereLoopFi
257c0 6e 64 4c 65 73 73 65 72 28 0a 20 20 57 68 65 72  ndLesser(.  Wher
257d0 65 4c 6f 6f 70 20 2a 2a 70 70 50 72 65 76 2c 0a  eLoop **ppPrev,.
257e0 20 20 63 6f 6e 73 74 20 57 68 65 72 65 4c 6f 6f    const WhereLoo
257f0 70 20 2a 70 54 65 6d 70 6c 61 74 65 0a 29 7b 0a  p *pTemplate.){.
25800 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 3b 0a    WhereLoop *p;.
25810 20 20 66 6f 72 28 70 3d 28 2a 70 70 50 72 65 76    for(p=(*ppPrev
25820 29 3b 20 70 3b 20 70 70 50 72 65 76 3d 26 70 2d  ); p; ppPrev=&p-
25830 3e 70 4e 65 78 74 4c 6f 6f 70 2c 20 70 3d 2a 70  >pNextLoop, p=*p
25840 70 50 72 65 76 29 7b 0a 20 20 20 20 69 66 28 20  pPrev){.    if( 
25850 70 2d 3e 69 54 61 62 21 3d 70 54 65 6d 70 6c 61  p->iTab!=pTempla
25860 74 65 2d 3e 69 54 61 62 20 7c 7c 20 70 2d 3e 69  te->iTab || p->i
25870 53 6f 72 74 49 64 78 21 3d 70 54 65 6d 70 6c 61  SortIdx!=pTempla
25880 74 65 2d 3e 69 53 6f 72 74 49 64 78 20 29 7b 0a  te->iSortIdx ){.
25890 20 20 20 20 20 20 2f 2a 20 49 66 20 65 69 74 68        /* If eith
258a0 65 72 20 74 68 65 20 69 54 61 62 20 6f 72 20 69  er the iTab or i
258b0 53 6f 72 74 49 64 78 20 76 61 6c 75 65 73 20 66  SortIdx values f
258c0 6f 72 20 74 77 6f 20 57 68 65 72 65 4c 6f 6f 70  or two WhereLoop
258d0 20 61 72 65 20 64 69 66 66 65 72 65 6e 74 0a 20   are different. 
258e0 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 6f       ** then tho
258f0 73 65 20 57 68 65 72 65 4c 6f 6f 70 73 20 6e 65  se WhereLoops ne
25900 65 64 20 74 6f 20 62 65 20 63 6f 6e 73 69 64 65  ed to be conside
25910 72 65 64 20 73 65 70 61 72 61 74 65 6c 79 2e 20  red separately. 
25920 20 4e 65 69 74 68 65 72 20 69 73 0a 20 20 20 20   Neither is.    
25930 20 20 2a 2a 20 61 20 63 61 6e 64 69 64 61 74 65    ** a candidate
25940 20 74 6f 20 72 65 70 6c 61 63 65 20 74 68 65 20   to replace the 
25950 6f 74 68 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  other. */.      
25960 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a  continue;.    }.
25970 20 20 20 20 2f 2a 20 49 6e 20 74 68 65 20 63 75      /* In the cu
25980 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61  rrent implementa
25990 74 69 6f 6e 2c 20 74 68 65 20 72 53 65 74 75 70  tion, the rSetup
259a0 20 76 61 6c 75 65 20 69 73 20 65 69 74 68 65 72   value is either
259b0 20 7a 65 72 6f 0a 20 20 20 20 2a 2a 20 6f 72 20   zero.    ** or 
259c0 74 68 65 20 63 6f 73 74 20 6f 66 20 62 75 69 6c  the cost of buil
259d0 64 69 6e 67 20 61 6e 20 61 75 74 6f 6d 61 74 69  ding an automati
259e0 63 20 69 6e 64 65 78 20 28 4e 6c 6f 67 4e 29 20  c index (NlogN) 
259f0 61 6e 64 20 74 68 65 20 4e 6c 6f 67 4e 0a 20 20  and the NlogN.  
25a00 20 20 2a 2a 20 69 73 20 74 68 65 20 73 61 6d 65    ** is the same
25a10 20 66 6f 72 20 63 6f 6d 70 61 74 69 62 6c 65 20   for compatible 
25a20 57 68 65 72 65 4c 6f 6f 70 73 2e 20 2a 2f 0a 20  WhereLoops. */. 
25a30 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 53     assert( p->rS
25a40 65 74 75 70 3d 3d 30 20 7c 7c 20 70 54 65 6d 70  etup==0 || pTemp
25a50 6c 61 74 65 2d 3e 72 53 65 74 75 70 3d 3d 30 20  late->rSetup==0 
25a60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
25a70 20 20 7c 7c 20 70 2d 3e 72 53 65 74 75 70 3d 3d    || p->rSetup==
25a80 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75  pTemplate->rSetu
25a90 70 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 77 68 65  p );..    /* whe
25aa0 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 28 29  reLoopAddBtree()
25ab0 20 61 6c 77 61 79 73 20 67 65 6e 65 72 61 74 65   always generate
25ac0 73 20 61 6e 64 20 69 6e 73 65 72 74 73 20 74 68  s and inserts th
25ad0 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65  e automatic inde
25ae0 78 0a 20 20 20 20 2a 2a 20 63 61 73 65 20 66 69  x.    ** case fi
25af0 72 73 74 2e 20 20 48 65 6e 63 65 20 63 6f 6d 70  rst.  Hence comp
25b00 61 74 69 62 6c 65 20 63 61 6e 64 69 64 61 74 65  atible candidate
25b10 20 57 68 65 72 65 4c 6f 6f 70 73 20 6e 65 76 65   WhereLoops neve
25b20 72 20 68 61 76 65 20 61 20 6c 61 72 67 65 72 0a  r have a larger.
25b30 20 20 20 20 2a 2a 20 72 53 65 74 75 70 2e 20 43      ** rSetup. C
25b40 61 6c 6c 20 74 68 69 73 20 53 45 54 55 50 2d 49  all this SETUP-I
25b50 4e 56 41 52 49 41 4e 54 20 2a 2f 0a 20 20 20 20  NVARIANT */.    
25b60 61 73 73 65 72 74 28 20 70 2d 3e 72 53 65 74 75  assert( p->rSetu
25b70 70 3e 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53  p>=pTemplate->rS
25b80 65 74 75 70 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  etup );..    /* 
25b90 41 6e 79 20 6c 6f 6f 70 20 75 73 69 6e 67 20 61  Any loop using a
25ba0 6e 20 61 70 70 6c 69 61 74 69 6f 6e 2d 64 65 66  n appliation-def
25bb0 69 6e 65 64 20 69 6e 64 65 78 20 28 6f 72 20 50  ined index (or P
25bc0 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 0a 20 20  RIMARY KEY or.  
25bd0 20 20 2a 2a 20 55 4e 49 51 55 45 20 63 6f 6e 73    ** UNIQUE cons
25be0 74 72 61 69 6e 74 29 20 77 69 74 68 20 6f 6e 65  traint) with one
25bf0 20 6f 72 20 6d 6f 72 65 20 3d 3d 20 63 6f 6e 73   or more == cons
25c00 74 72 61 69 6e 74 73 20 69 73 20 62 65 74 74 65  traints is bette
25c10 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20 61 6e  r.    ** than an
25c20 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78   automatic index
25c30 2e 20 55 6e 6c 65 73 73 20 69 74 20 69 73 20 61  . Unless it is a
25c40 20 73 6b 69 70 2d 73 63 61 6e 2e 20 2a 2f 0a 20   skip-scan. */. 
25c50 20 20 20 69 66 28 20 28 70 2d 3e 77 73 46 6c 61     if( (p->wsFla
25c60 67 73 20 26 20 57 48 45 52 45 5f 41 55 54 4f 5f  gs & WHERE_AUTO_
25c70 49 4e 44 45 58 29 21 3d 30 0a 20 20 20 20 20 26  INDEX)!=0.     &
25c80 26 20 28 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 53  & (pTemplate->nS
25c90 6b 69 70 29 3d 3d 30 0a 20 20 20 20 20 26 26 20  kip)==0.     && 
25ca0 28 70 54 65 6d 70 6c 61 74 65 2d 3e 77 73 46 6c  (pTemplate->wsFl
25cb0 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45  ags & WHERE_INDE
25cc0 58 45 44 29 21 3d 30 0a 20 20 20 20 20 26 26 20  XED)!=0.     && 
25cd0 28 70 54 65 6d 70 6c 61 74 65 2d 3e 77 73 46 6c  (pTemplate->wsFl
25ce0 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55  ags & WHERE_COLU
25cf0 4d 4e 5f 45 51 29 21 3d 30 0a 20 20 20 20 20 26  MN_EQ)!=0.     &
25d00 26 20 28 70 2d 3e 70 72 65 72 65 71 20 26 20 70  & (p->prereq & p
25d10 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65 71  Template->prereq
25d20 29 3d 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72  )==pTemplate->pr
25d30 65 72 65 71 0a 20 20 20 20 29 7b 0a 20 20 20 20  ereq.    ){.    
25d40 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
25d50 20 20 20 20 2f 2a 20 49 66 20 65 78 69 73 74 69      /* If existi
25d60 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 70 20 69  ng WhereLoop p i
25d70 73 20 62 65 74 74 65 72 20 74 68 61 6e 20 70 54  s better than pT
25d80 65 6d 70 6c 61 74 65 2c 20 70 54 65 6d 70 6c 61  emplate, pTempla
25d90 74 65 20 63 61 6e 20 62 65 0a 20 20 20 20 2a 2a  te can be.    **
25da0 20 64 69 73 63 61 72 64 65 64 2e 20 20 57 68 65   discarded.  Whe
25db0 72 65 4c 6f 6f 70 20 70 20 69 73 20 62 65 74 74  reLoop p is bett
25dc0 65 72 20 69 66 3a 0a 20 20 20 20 2a 2a 20 20 20  er if:.    **   
25dd0 28 31 29 20 20 70 20 68 61 73 20 6e 6f 20 6d 6f  (1)  p has no mo
25de0 72 65 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20  re dependencies 
25df0 74 68 61 6e 20 70 54 65 6d 70 6c 61 74 65 2c 20  than pTemplate, 
25e00 61 6e 64 0a 20 20 20 20 2a 2a 20 20 20 28 32 29  and.    **   (2)
25e10 20 20 70 20 68 61 73 20 61 6e 20 65 71 75 61 6c    p has an equal
25e20 20 6f 72 20 6c 6f 77 65 72 20 63 6f 73 74 20 74   or lower cost t
25e30 68 61 6e 20 70 54 65 6d 70 6c 61 74 65 0a 20 20  han pTemplate.  
25e40 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 2d    */.    if( (p-
25e50 3e 70 72 65 72 65 71 20 26 20 70 54 65 6d 70 6c  >prereq & pTempl
25e60 61 74 65 2d 3e 70 72 65 72 65 71 29 3d 3d 70 2d  ate->prereq)==p-
25e70 3e 70 72 65 72 65 71 20 20 20 20 2f 2a 20 28 31  >prereq    /* (1
25e80 29 20 20 2a 2f 0a 20 20 20 20 20 26 26 20 70 2d  )  */.     && p-
25e90 3e 72 53 65 74 75 70 3c 3d 70 54 65 6d 70 6c 61  >rSetup<=pTempla
25ea0 74 65 2d 3e 72 53 65 74 75 70 20 20 20 20 20 20  te->rSetup      
25eb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28              /* (
25ec0 32 61 29 20 2a 2f 0a 20 20 20 20 20 26 26 20 70  2a) */.     && p
25ed0 2d 3e 72 52 75 6e 3c 3d 70 54 65 6d 70 6c 61 74  ->rRun<=pTemplat
25ee0 65 2d 3e 72 52 75 6e 20 20 20 20 20 20 20 20 20  e->rRun         
25ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25f00 28 32 62 29 20 2a 2f 0a 20 20 20 20 20 26 26 20  (2b) */.     && 
25f10 70 2d 3e 6e 4f 75 74 3c 3d 70 54 65 6d 70 6c 61  p->nOut<=pTempla
25f20 74 65 2d 3e 6e 4f 75 74 20 20 20 20 20 20 20 20  te->nOut        
25f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25f40 20 28 32 63 29 20 2a 2f 0a 20 20 20 20 29 7b 0a   (2c) */.    ){.
25f50 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20        return 0; 
25f60 20 2f 2a 20 44 69 73 63 61 72 64 20 70 54 65 6d   /* Discard pTem
25f70 70 6c 61 74 65 20 2a 2f 0a 20 20 20 20 7d 0a 0a  plate */.    }..
25f80 20 20 20 20 2f 2a 20 49 66 20 70 54 65 6d 70 6c      /* If pTempl
25f90 61 74 65 20 69 73 20 61 6c 77 61 79 73 20 62 65  ate is always be
25fa0 74 74 65 72 20 74 68 61 6e 20 70 2c 20 74 68 65  tter than p, the
25fb0 6e 20 63 61 75 73 65 20 70 20 74 6f 20 62 65 20  n cause p to be 
25fc0 6f 76 65 72 77 72 69 74 74 65 6e 0a 20 20 20 20  overwritten.    
25fd0 2a 2a 20 77 69 74 68 20 70 54 65 6d 70 6c 61 74  ** with pTemplat
25fe0 65 2e 20 20 70 54 65 6d 70 6c 61 74 65 20 69 73  e.  pTemplate is
25ff0 20 62 65 74 74 65 72 20 74 68 61 6e 20 70 20 69   better than p i
26000 66 3a 0a 20 20 20 20 2a 2a 20 20 20 28 31 29 20  f:.    **   (1) 
26010 20 70 54 65 6d 70 6c 61 74 65 20 68 61 73 20 6e   pTemplate has n
26020 6f 20 6d 6f 72 65 20 64 65 70 65 6e 64 65 6e 63  o more dependenc
26030 65 73 20 74 68 61 6e 20 70 2c 20 61 6e 64 0a 20  es than p, and. 
26040 20 20 20 2a 2a 20 20 20 28 32 29 20 20 70 54 65     **   (2)  pTe
26050 6d 70 6c 61 74 65 20 68 61 73 20 61 6e 20 65 71  mplate has an eq
26060 75 61 6c 20 6f 72 20 6c 6f 77 65 72 20 63 6f 73  ual or lower cos
26070 74 20 74 68 61 6e 20 70 2e 0a 20 20 20 20 2a 2f  t than p..    */
26080 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 70 72 65  .    if( (p->pre
26090 72 65 71 20 26 20 70 54 65 6d 70 6c 61 74 65 2d  req & pTemplate-
260a0 3e 70 72 65 72 65 71 29 3d 3d 70 54 65 6d 70 6c  >prereq)==pTempl
260b0 61 74 65 2d 3e 70 72 65 72 65 71 20 20 20 2f 2a  ate->prereq   /*
260c0 20 28 31 29 20 20 2a 2f 0a 20 20 20 20 20 26 26   (1)  */.     &&
260d0 20 70 2d 3e 72 52 75 6e 3e 3d 70 54 65 6d 70 6c   p->rRun>=pTempl
260e0 61 74 65 2d 3e 72 52 75 6e 20 20 20 20 20 20 20  ate->rRun       
260f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26100 20 20 20 20 20 20 2f 2a 20 28 32 61 29 20 2a 2f        /* (2a) */
26110 0a 20 20 20 20 20 26 26 20 70 2d 3e 6e 4f 75 74  .     && p->nOut
26120 3e 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75  >=pTemplate->nOu
26130 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
26140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26150 20 28 32 62 29 20 2a 2f 0a 20 20 20 20 29 7b 0a   (2b) */.    ){.
26160 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
26170 3e 72 53 65 74 75 70 3e 3d 70 54 65 6d 70 6c 61  >rSetup>=pTempla
26180 74 65 2d 3e 72 53 65 74 75 70 20 29 3b 20 2f 2a  te->rSetup ); /*
26190 20 53 45 54 55 50 2d 49 4e 56 41 52 49 41 4e 54   SETUP-INVARIANT
261a0 20 61 62 6f 76 65 20 2a 2f 0a 20 20 20 20 20 20   above */.      
261b0 62 72 65 61 6b 3b 20 20 20 2f 2a 20 43 61 75 73  break;   /* Caus
261c0 65 20 70 20 74 6f 20 62 65 20 6f 76 65 72 77 72  e p to be overwr
261d0 69 74 74 65 6e 20 62 79 20 70 54 65 6d 70 6c 61  itten by pTempla
261e0 74 65 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a  te */.    }.  }.
261f0 20 20 72 65 74 75 72 6e 20 70 70 50 72 65 76 3b    return ppPrev;
26200 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74  .}../*.** Insert
26210 20 6f 72 20 72 65 70 6c 61 63 65 20 61 20 57 68   or replace a Wh
26220 65 72 65 4c 6f 6f 70 20 65 6e 74 72 79 20 75 73  ereLoop entry us
26230 69 6e 67 20 74 68 65 20 74 65 6d 70 6c 61 74 65  ing the template
26240 20 73 75 70 70 6c 69 65 64 2e 0a 2a 2a 0a 2a 2a   supplied..**.**
26250 20 41 6e 20 65 78 69 73 74 69 6e 67 20 57 68 65   An existing Whe
26260 72 65 4c 6f 6f 70 20 65 6e 74 72 79 20 6d 69 67  reLoop entry mig
26270 68 74 20 62 65 20 6f 76 65 72 77 72 69 74 74 65  ht be overwritte
26280 6e 20 69 66 20 74 68 65 20 6e 65 77 20 74 65 6d  n if the new tem
26290 70 6c 61 74 65 0a 2a 2a 20 69 73 20 62 65 74 74  plate.** is bett
262a0 65 72 20 61 6e 64 20 68 61 73 20 66 65 77 65 72  er and has fewer
262b0 20 64 65 70 65 6e 64 65 6e 63 69 65 73 2e 20 20   dependencies.  
262c0 4f 72 20 74 68 65 20 74 65 6d 70 6c 61 74 65 20  Or the template 
262d0 77 69 6c 6c 20 62 65 20 69 67 6e 6f 72 65 64 0a  will be ignored.
262e0 2a 2a 20 61 6e 64 20 6e 6f 20 69 6e 73 65 72 74  ** and no insert
262f0 20 77 69 6c 6c 20 6f 63 63 75 72 20 69 66 20 61   will occur if a
26300 6e 20 65 78 69 73 74 69 6e 67 20 57 68 65 72 65  n existing Where
26310 4c 6f 6f 70 20 69 73 20 66 61 73 74 65 72 20 61  Loop is faster a
26320 6e 64 20 68 61 73 0a 2a 2a 20 66 65 77 65 72 20  nd has.** fewer 
26330 64 65 70 65 6e 64 65 6e 63 69 65 73 20 74 68 61  dependencies tha
26340 6e 20 74 68 65 20 74 65 6d 70 6c 61 74 65 2e 20  n the template. 
26350 20 4f 74 68 65 72 77 69 73 65 20 61 20 6e 65 77   Otherwise a new
26360 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 0a 2a 2a   WhereLoop is.**
26370 20 61 64 64 65 64 20 62 61 73 65 64 20 6f 6e 20   added based on 
26380 74 68 65 20 74 65 6d 70 6c 61 74 65 2e 0a 2a 2a  the template..**
26390 0a 2a 2a 20 49 66 20 70 42 75 69 6c 64 65 72 2d  .** If pBuilder-
263a0 3e 70 4f 72 53 65 74 20 69 73 20 6e 6f 74 20 4e  >pOrSet is not N
263b0 55 4c 4c 20 74 68 65 6e 20 77 65 20 63 61 72 65  ULL then we care
263c0 20 61 62 6f 75 74 20 6f 6e 6c 79 20 74 68 65 0a   about only the.
263d0 2a 2a 20 70 72 65 72 65 71 75 69 73 69 74 65 73  ** prerequisites
263e0 20 61 6e 64 20 72 52 75 6e 20 61 6e 64 20 6e 4f   and rRun and nO
263f0 75 74 20 63 6f 73 74 73 20 6f 66 20 74 68 65 20  ut costs of the 
26400 4e 20 62 65 73 74 20 6c 6f 6f 70 73 2e 20 20 54  N best loops.  T
26410 68 61 74 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69  hat.** informati
26420 6f 6e 20 69 73 20 67 61 74 68 65 72 65 64 20 69  on is gathered i
26430 6e 20 74 68 65 20 70 42 75 69 6c 64 65 72 2d 3e  n the pBuilder->
26440 70 4f 72 53 65 74 20 6f 62 6a 65 63 74 2e 20 20  pOrSet object.  
26450 54 68 69 73 20 73 70 65 63 69 61 6c 0a 2a 2a 20  This special.** 
26460 70 72 6f 63 65 73 73 69 6e 67 20 6d 6f 64 65 20  processing mode 
26470 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 66 6f 72  is used only for
26480 20 4f 52 20 63 6c 61 75 73 65 20 70 72 6f 63 65   OR clause proce
26490 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  ssing..**.** Whe
264a0 6e 20 61 63 63 75 6d 75 6c 61 74 69 6e 67 20 6d  n accumulating m
264b0 75 6c 74 69 70 6c 65 20 6c 6f 6f 70 73 20 28 77  ultiple loops (w
264c0 68 65 6e 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f  hen pBuilder->pO
264d0 72 53 65 74 20 69 73 20 4e 55 4c 4c 29 20 77 65  rSet is NULL) we
264e0 0a 2a 2a 20 73 74 69 6c 6c 20 6d 69 67 68 74 20  .** still might 
264f0 6f 76 65 72 77 72 69 74 65 20 73 69 6d 69 6c 61  overwrite simila
26500 72 20 6c 6f 6f 70 73 20 77 69 74 68 20 74 68 65  r loops with the
26510 20 6e 65 77 20 74 65 6d 70 6c 61 74 65 20 69 66   new template if
26520 20 74 68 65 0a 2a 2a 20 6e 65 77 20 74 65 6d 70   the.** new temp
26530 6c 61 74 65 20 69 73 20 62 65 74 74 65 72 2e 20  late is better. 
26540 20 4c 6f 6f 70 73 20 6d 61 79 20 62 65 20 6f 76   Loops may be ov
26550 65 72 77 72 69 74 74 65 6e 20 69 66 20 74 68 65  erwritten if the
26560 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a 2a 2a 20 63   following .** c
26570 6f 6e 64 69 74 69 6f 6e 73 20 61 72 65 20 6d 65  onditions are me
26580 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20  t:.**.**    (1) 
26590 20 54 68 65 79 20 68 61 76 65 20 74 68 65 20 73   They have the s
265a0 61 6d 65 20 69 54 61 62 2e 0a 2a 2a 20 20 20 20  ame iTab..**    
265b0 28 32 29 20 20 54 68 65 79 20 68 61 76 65 20 74  (2)  They have t
265c0 68 65 20 73 61 6d 65 20 69 53 6f 72 74 49 64 78  he same iSortIdx
265d0 2e 0a 2a 2a 20 20 20 20 28 33 29 20 20 54 68 65  ..**    (3)  The
265e0 20 74 65 6d 70 6c 61 74 65 20 68 61 73 20 73 61   template has sa
265f0 6d 65 20 6f 72 20 66 65 77 65 72 20 64 65 70 65  me or fewer depe
26600 6e 64 65 6e 63 69 65 73 20 74 68 61 6e 20 74 68  ndencies than th
26610 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f 70 0a 2a  e current loop.*
26620 2a 20 20 20 20 28 34 29 20 20 54 68 65 20 74 65  *    (4)  The te
26630 6d 70 6c 61 74 65 20 68 61 73 20 74 68 65 20 73  mplate has the s
26640 61 6d 65 20 6f 72 20 6c 6f 77 65 72 20 63 6f 73  ame or lower cos
26650 74 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65  t than the curre
26660 6e 74 20 6c 6f 6f 70 0a 2a 2f 0a 73 74 61 74 69  nt loop.*/.stati
26670 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 49  c int whereLoopI
26680 6e 73 65 72 74 28 57 68 65 72 65 4c 6f 6f 70 42  nsert(WhereLoopB
26690 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72  uilder *pBuilder
266a0 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 54 65  , WhereLoop *pTe
266b0 6d 70 6c 61 74 65 29 7b 0a 20 20 57 68 65 72 65  mplate){.  Where
266c0 4c 6f 6f 70 20 2a 2a 70 70 50 72 65 76 2c 20 2a  Loop **ppPrev, *
266d0 70 3b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  p;.  WhereInfo *
266e0 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65  pWInfo = pBuilde
266f0 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 73 71 6c  r->pWInfo;.  sql
26700 69 74 65 33 20 2a 64 62 20 3d 20 70 57 49 6e 66  ite3 *db = pWInf
26710 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a  o->pParse->db;..
26720 20 20 2f 2a 20 49 66 20 70 42 75 69 6c 64 65 72    /* If pBuilder
26730 2d 3e 70 4f 72 53 65 74 20 69 73 20 64 65 66 69  ->pOrSet is defi
26740 6e 65 64 2c 20 74 68 65 6e 20 6f 6e 6c 79 20 6b  ned, then only k
26750 65 65 70 20 74 72 61 63 6b 20 6f 66 20 74 68 65  eep track of the
26760 20 63 6f 73 74 73 0a 20 20 2a 2a 20 61 6e 64 20   costs.  ** and 
26770 70 72 65 72 65 71 73 2e 0a 20 20 2a 2f 0a 20 20  prereqs..  */.  
26780 69 66 28 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f  if( pBuilder->pO
26790 72 53 65 74 21 3d 30 20 29 7b 0a 23 69 66 20 57  rSet!=0 ){.#if W
267a0 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
267b0 44 0a 20 20 20 20 75 31 36 20 6e 20 3d 20 70 42  D.    u16 n = pB
267c0 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 2d 3e  uilder->pOrSet->
267d0 6e 3b 0a 20 20 20 20 69 6e 74 20 78 20 3d 0a 23  n;.    int x =.#
267e0 65 6e 64 69 66 0a 20 20 20 20 77 68 65 72 65 4f  endif.    whereO
267f0 72 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72  rInsert(pBuilder
26800 2d 3e 70 4f 72 53 65 74 2c 20 70 54 65 6d 70 6c  ->pOrSet, pTempl
26810 61 74 65 2d 3e 70 72 65 72 65 71 2c 20 70 54 65  ate->prereq, pTe
26820 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 2c 0a 20 20  mplate->rRun,.  
26830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26850 20 20 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75    pTemplate->nOu
26860 74 29 3b 0a 23 69 66 20 57 48 45 52 45 54 52 41  t);.#if WHERETRA
26870 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78  CE_ENABLED /* 0x
26880 38 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c  8 */.    if( sql
26890 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20 26  ite3WhereTrace &
268a0 20 30 78 38 20 29 7b 0a 20 20 20 20 20 20 73 71   0x8 ){.      sq
268b0 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
268c0 28 78 3f 22 20 20 20 6f 72 2d 25 64 3a 20 20 22  (x?"   or-%d:  "
268d0 3a 22 20 20 20 6f 72 2d 58 3a 20 20 22 2c 20 6e  :"   or-X:  ", n
268e0 29 3b 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f  );.      whereLo
268f0 6f 70 50 72 69 6e 74 28 70 54 65 6d 70 6c 61 74  opPrint(pTemplat
26900 65 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43  e, pBuilder->pWC
26910 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
26920 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
26930 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  E_OK;.  }..  /* 
26940 4c 6f 6f 6b 20 66 6f 72 20 61 6e 20 65 78 69 73  Look for an exis
26950 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 74  ting WhereLoop t
26960 6f 20 72 65 70 6c 61 63 65 20 77 69 74 68 20 70  o replace with p
26970 54 65 6d 70 6c 61 74 65 0a 20 20 2a 2f 0a 20 20  Template.  */.  
26980 77 68 65 72 65 4c 6f 6f 70 41 64 6a 75 73 74 43  whereLoopAdjustC
26990 6f 73 74 28 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f  ost(pWInfo->pLoo
269a0 70 73 2c 20 70 54 65 6d 70 6c 61 74 65 29 3b 0a  ps, pTemplate);.
269b0 20 20 70 70 50 72 65 76 20 3d 20 77 68 65 72 65    ppPrev = where
269c0 4c 6f 6f 70 46 69 6e 64 4c 65 73 73 65 72 28 26  LoopFindLesser(&
269d0 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 2c 20  pWInfo->pLoops, 
269e0 70 54 65 6d 70 6c 61 74 65 29 3b 0a 0a 20 20 69  pTemplate);..  i
269f0 66 28 20 70 70 50 72 65 76 3d 3d 30 20 29 7b 0a  f( ppPrev==0 ){.
26a00 20 20 20 20 2f 2a 20 54 68 65 72 65 20 61 6c 72      /* There alr
26a10 65 61 64 79 20 65 78 69 73 74 73 20 61 20 57 68  eady exists a Wh
26a20 65 72 65 4c 6f 6f 70 20 6f 6e 20 74 68 65 20 6c  ereLoop on the l
26a30 69 73 74 20 74 68 61 74 20 69 73 20 62 65 74 74  ist that is bett
26a40 65 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20 70  er.    ** than p
26a50 54 65 6d 70 6c 61 74 65 2c 20 73 6f 20 6a 75 73  Template, so jus
26a60 74 20 69 67 6e 6f 72 65 20 70 54 65 6d 70 6c 61  t ignore pTempla
26a70 74 65 20 2a 2f 0a 23 69 66 20 57 48 45 52 45 54  te */.#if WHERET
26a80 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20  RACE_ENABLED /* 
26a90 30 78 38 20 2a 2f 0a 20 20 20 20 69 66 28 20 73  0x8 */.    if( s
26aa0 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65  qlite3WhereTrace
26ab0 20 26 20 30 78 38 20 29 7b 0a 20 20 20 20 20 20   & 0x8 ){.      
26ac0 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
26ad0 74 66 28 22 20 20 20 73 6b 69 70 3a 20 22 29 3b  tf("   skip: ");
26ae0 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70  .      whereLoop
26af0 50 72 69 6e 74 28 70 54 65 6d 70 6c 61 74 65 2c  Print(pTemplate,
26b00 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 29 3b   pBuilder->pWC);
26b10 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
26b20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
26b30 4f 4b 3b 20 20 0a 20 20 7d 65 6c 73 65 7b 0a 20  OK;  .  }else{. 
26b40 20 20 20 70 20 3d 20 2a 70 70 50 72 65 76 3b 0a     p = *ppPrev;.
26b50 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20    }..  /* If we 
26b60 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74  reach this point
26b70 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 65   it means that e
26b80 69 74 68 65 72 20 70 5b 5d 20 73 68 6f 75 6c 64  ither p[] should
26b90 20 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e 0a   be overwritten.
26ba0 20 20 2a 2a 20 77 69 74 68 20 70 54 65 6d 70 6c    ** with pTempl
26bb0 61 74 65 5b 5d 20 69 66 20 70 5b 5d 20 65 78 69  ate[] if p[] exi
26bc0 73 74 73 2c 20 6f 72 20 69 66 20 70 3d 3d 4e 55  sts, or if p==NU
26bd0 4c 4c 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65  LL then allocate
26be0 20 61 20 6e 65 77 0a 20 20 2a 2a 20 57 68 65 72   a new.  ** Wher
26bf0 65 4c 6f 6f 70 20 61 6e 64 20 69 6e 73 65 72 74  eLoop and insert
26c00 20 69 74 2e 0a 20 20 2a 2f 0a 23 69 66 20 57 48   it..  */.#if WH
26c10 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
26c20 20 2f 2a 20 30 78 38 20 2a 2f 0a 20 20 69 66 28   /* 0x8 */.  if(
26c30 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61   sqlite3WhereTra
26c40 63 65 20 26 20 30 78 38 20 29 7b 0a 20 20 20 20  ce & 0x8 ){.    
26c50 69 66 28 20 70 21 3d 30 20 29 7b 0a 20 20 20 20  if( p!=0 ){.    
26c60 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
26c70 69 6e 74 66 28 22 72 65 70 6c 61 63 65 3a 20 22  intf("replace: "
26c80 29 3b 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f  );.      whereLo
26c90 6f 70 50 72 69 6e 74 28 70 2c 20 70 42 75 69 6c  opPrint(p, pBuil
26ca0 64 65 72 2d 3e 70 57 43 29 3b 0a 20 20 20 20 7d  der->pWC);.    }
26cb0 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
26cc0 67 50 72 69 6e 74 66 28 22 20 20 20 20 61 64 64  gPrintf("    add
26cd0 3a 20 22 29 3b 0a 20 20 20 20 77 68 65 72 65 4c  : ");.    whereL
26ce0 6f 6f 70 50 72 69 6e 74 28 70 54 65 6d 70 6c 61  oopPrint(pTempla
26cf0 74 65 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 57  te, pBuilder->pW
26d00 43 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  C);.  }.#endif. 
26d10 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20   if( p==0 ){.   
26d20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e   /* Allocate a n
26d30 65 77 20 57 68 65 72 65 4c 6f 6f 70 20 74 6f 20  ew WhereLoop to 
26d40 61 64 64 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  add to the end o
26d50 66 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a 20 20  f the list */.  
26d60 20 20 2a 70 70 50 72 65 76 20 3d 20 70 20 3d 20    *ppPrev = p = 
26d70 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
26d80 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 57 68  aw(db, sizeof(Wh
26d90 65 72 65 4c 6f 6f 70 29 29 3b 0a 20 20 20 20 69  ereLoop));.    i
26da0 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
26db0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
26dc0 20 20 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69 74     whereLoopInit
26dd0 28 70 29 3b 0a 20 20 20 20 70 2d 3e 70 4e 65 78  (p);.    p->pNex
26de0 74 4c 6f 6f 70 20 3d 20 30 3b 0a 20 20 7d 65 6c  tLoop = 0;.  }el
26df0 73 65 7b 0a 20 20 20 20 2f 2a 20 57 65 20 77 69  se{.    /* We wi
26e00 6c 6c 20 62 65 20 6f 76 65 72 77 72 69 74 69 6e  ll be overwritin
26e10 67 20 57 68 65 72 65 4c 6f 6f 70 20 70 5b 5d 2e  g WhereLoop p[].
26e20 20 20 42 75 74 20 62 65 66 6f 72 65 20 77 65 20    But before we 
26e30 64 6f 2c 20 66 69 72 73 74 0a 20 20 20 20 2a 2a  do, first.    **
26e40 20 67 6f 20 74 68 72 6f 75 67 68 20 74 68 65 20   go through the 
26e50 72 65 73 74 20 6f 66 20 74 68 65 20 6c 69 73 74  rest of the list
26e60 20 61 6e 64 20 64 65 6c 65 74 65 20 61 6e 79 20   and delete any 
26e70 6f 74 68 65 72 20 65 6e 74 72 69 65 73 20 62 65  other entries be
26e80 73 69 64 65 73 0a 20 20 20 20 2a 2a 20 70 5b 5d  sides.    ** p[]
26e90 20 74 68 61 74 20 61 72 65 20 61 6c 73 6f 20 73   that are also s
26ea0 75 70 70 6c 61 74 65 64 20 62 79 20 70 54 65 6d  upplated by pTem
26eb0 70 6c 61 74 65 20 2a 2f 0a 20 20 20 20 57 68 65  plate */.    Whe
26ec0 72 65 4c 6f 6f 70 20 2a 2a 70 70 54 61 69 6c 20  reLoop **ppTail 
26ed0 3d 20 26 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 3b  = &p->pNextLoop;
26ee0 0a 20 20 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  .    WhereLoop *
26ef0 70 54 6f 44 65 6c 3b 0a 20 20 20 20 77 68 69 6c  pToDel;.    whil
26f00 65 28 20 2a 70 70 54 61 69 6c 20 29 7b 0a 20 20  e( *ppTail ){.  
26f10 20 20 20 20 70 70 54 61 69 6c 20 3d 20 77 68 65      ppTail = whe
26f20 72 65 4c 6f 6f 70 46 69 6e 64 4c 65 73 73 65 72  reLoopFindLesser
26f30 28 70 70 54 61 69 6c 2c 20 70 54 65 6d 70 6c 61  (ppTail, pTempla
26f40 74 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  te);.      if( p
26f50 70 54 61 69 6c 3d 3d 30 20 29 20 62 72 65 61 6b  pTail==0 ) break
26f60 3b 0a 20 20 20 20 20 20 70 54 6f 44 65 6c 20 3d  ;.      pToDel =
26f70 20 2a 70 70 54 61 69 6c 3b 0a 20 20 20 20 20 20   *ppTail;.      
26f80 69 66 28 20 70 54 6f 44 65 6c 3d 3d 30 20 29 20  if( pToDel==0 ) 
26f90 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 2a 70 70  break;.      *pp
26fa0 54 61 69 6c 20 3d 20 70 54 6f 44 65 6c 2d 3e 70  Tail = pToDel->p
26fb0 4e 65 78 74 4c 6f 6f 70 3b 0a 23 69 66 20 57 48  NextLoop;.#if WH
26fc0 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
26fd0 20 2f 2a 20 30 78 38 20 2a 2f 0a 20 20 20 20 20   /* 0x8 */.     
26fe0 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72   if( sqlite3Wher
26ff0 65 54 72 61 63 65 20 26 20 30 78 38 20 29 7b 0a  eTrace & 0x8 ){.
27000 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
27010 65 62 75 67 50 72 69 6e 74 66 28 22 20 64 65 6c  ebugPrintf(" del
27020 65 74 65 3a 20 22 29 3b 0a 20 20 20 20 20 20 20  ete: ");.       
27030 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28   whereLoopPrint(
27040 70 54 6f 44 65 6c 2c 20 70 42 75 69 6c 64 65 72  pToDel, pBuilder
27050 2d 3e 70 57 43 29 3b 0a 20 20 20 20 20 20 7d 0a  ->pWC);.      }.
27060 23 65 6e 64 69 66 0a 20 20 20 20 20 20 77 68 65  #endif.      whe
27070 72 65 4c 6f 6f 70 44 65 6c 65 74 65 28 64 62 2c  reLoopDelete(db,
27080 20 70 54 6f 44 65 6c 29 3b 0a 20 20 20 20 7d 0a   pToDel);.    }.
27090 20 20 7d 0a 20 20 77 68 65 72 65 4c 6f 6f 70 58    }.  whereLoopX
270a0 66 65 72 28 64 62 2c 20 70 2c 20 70 54 65 6d 70  fer(db, p, pTemp
270b0 6c 61 74 65 29 3b 0a 20 20 69 66 28 20 28 70 2d  late);.  if( (p-
270c0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
270d0 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d  _VIRTUALTABLE)==
270e0 30 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a  0 ){.    Index *
270f0 70 49 6e 64 65 78 20 3d 20 70 2d 3e 75 2e 62 74  pIndex = p->u.bt
27100 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 20 20  ree.pIndex;.    
27110 69 66 28 20 70 49 6e 64 65 78 20 26 26 20 70 49  if( pIndex && pI
27120 6e 64 65 78 2d 3e 74 6e 75 6d 3d 3d 30 20 29 7b  ndex->tnum==0 ){
27130 0a 20 20 20 20 20 20 70 2d 3e 75 2e 62 74 72 65  .      p->u.btre
27140 65 2e 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20  e.pIndex = 0;.  
27150 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
27160 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
27170 2a 0a 2a 2a 20 41 64 6a 75 73 74 20 74 68 65 20  *.** Adjust the 
27180 57 68 65 72 65 4c 6f 6f 70 2e 6e 4f 75 74 20 76  WhereLoop.nOut v
27190 61 6c 75 65 20 64 6f 77 6e 77 61 72 64 20 74 6f  alue downward to
271a0 20 61 63 63 6f 75 6e 74 20 66 6f 72 20 74 65 72   account for ter
271b0 6d 73 20 6f 66 20 74 68 65 0a 2a 2a 20 57 48 45  ms of the.** WHE
271c0 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 20 72  RE clause that r
271d0 65 66 65 72 65 6e 63 65 20 74 68 65 20 6c 6f 6f  eference the loo
271e0 70 20 62 75 74 20 77 68 69 63 68 20 61 72 65 20  p but which are 
271f0 6e 6f 74 20 75 73 65 64 20 62 79 20 61 6e 0a 2a  not used by an.*
27200 2a 20 69 6e 64 65 78 2e 0a 2a 0a 2a 2a 20 46 6f  * index..*.** Fo
27210 72 20 65 76 65 72 79 20 57 48 45 52 45 20 63 6c  r every WHERE cl
27220 61 75 73 65 20 74 65 72 6d 20 74 68 61 74 20 69  ause term that i
27230 73 20 6e 6f 74 20 75 73 65 64 20 62 79 20 74 68  s not used by th
27240 65 20 69 6e 64 65 78 0a 2a 2a 20 61 6e 64 20 77  e index.** and w
27250 68 69 63 68 20 68 61 73 20 61 20 74 72 75 74 68  hich has a truth
27260 20 70 72 6f 62 61 62 69 6c 69 74 79 20 61 73 73   probability ass
27270 69 67 6e 65 64 20 62 79 20 6f 6e 65 20 6f 66 20  igned by one of 
27280 74 68 65 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 29  the likelihood()
27290 2c 0a 2a 2a 20 6c 69 6b 65 6c 79 28 29 2c 20 6f  ,.** likely(), o
272a0 72 20 75 6e 6c 69 6b 65 6c 79 28 29 20 53 51 4c  r unlikely() SQL
272b0 20 66 75 6e 63 74 69 6f 6e 73 2c 20 72 65 64 75   functions, redu
272c0 63 65 20 74 68 65 20 65 73 74 69 6d 61 74 65 64  ce the estimated
272d0 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 6f 75   number.** of ou
272e0 74 70 75 74 20 72 6f 77 73 20 62 79 20 74 68 65  tput rows by the
272f0 20 70 72 6f 62 61 62 69 6c 69 74 79 20 73 70 65   probability spe
27300 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 55  cified..**.** TU
27310 4e 49 4e 47 3a 20 20 46 6f 72 20 65 76 65 72 79  NING:  For every
27320 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65   WHERE clause te
27330 72 6d 20 74 68 61 74 20 69 73 20 6e 6f 74 20 75  rm that is not u
27340 73 65 64 20 62 79 20 74 68 65 20 69 6e 64 65 78  sed by the index
27350 0a 2a 2a 20 61 6e 64 20 77 68 69 63 68 20 64 6f  .** and which do
27360 65 73 20 6e 6f 74 20 68 61 76 65 20 61 6e 20 61  es not have an a
27370 73 73 69 67 6e 65 64 20 74 72 75 74 68 20 70 72  ssigned truth pr
27380 6f 62 61 62 69 6c 69 74 79 2c 20 68 65 75 72 69  obability, heuri
27390 73 74 69 63 73 0a 2a 2a 20 64 65 73 63 72 69 62  stics.** describ
273a0 65 64 20 62 65 6c 6f 77 20 61 72 65 20 75 73 65  ed below are use
273b0 64 20 74 6f 20 74 72 79 20 74 6f 20 65 73 74 69  d to try to esti
273c0 6d 61 74 65 20 74 68 65 20 74 72 75 74 68 20 70  mate the truth p
273d0 72 6f 62 61 62 69 6c 69 74 79 2e 0a 2a 2a 20 54  robability..** T
273e0 4f 44 4f 20 2d 2d 3e 20 50 65 72 68 61 70 73 20  ODO --> Perhaps 
273f0 74 68 69 73 20 69 73 20 73 6f 6d 65 74 68 69 6e  this is somethin
27400 67 20 74 68 61 74 20 63 6f 75 6c 64 20 62 65 20  g that could be 
27410 69 6d 70 72 6f 76 65 64 20 62 79 20 62 65 74 74  improved by bett
27420 65 72 0a 2a 2a 20 74 61 62 6c 65 20 73 74 61 74  er.** table stat
27430 69 73 74 69 63 73 2e 0a 2a 2a 0a 2a 2a 20 48 65  istics..**.** He
27440 75 72 69 73 74 69 63 20 31 3a 20 20 45 73 74 69  uristic 1:  Esti
27450 6d 61 74 65 20 74 68 65 20 74 72 75 74 68 20 70  mate the truth p
27460 72 6f 62 61 62 69 6c 69 74 79 20 61 73 20 39 33  robability as 93
27470 2e 37 35 25 2e 20 20 54 68 65 20 39 33 2e 37 35  .75%.  The 93.75
27480 25 0a 2a 2a 20 76 61 6c 75 65 20 63 6f 72 72 65  %.** value corre
27490 73 70 6f 6e 64 73 20 74 6f 20 2d 31 20 69 6e 20  sponds to -1 in 
274a0 4c 6f 67 45 73 74 20 6e 6f 74 61 74 69 6f 6e 2c  LogEst notation,
274b0 20 73 6f 20 74 68 69 73 20 6d 65 61 6e 73 20 64   so this means d
274c0 65 63 72 65 6d 65 6e 74 0a 2a 2a 20 74 68 65 20  ecrement.** the 
274d0 57 68 65 72 65 4c 6f 6f 70 2e 6e 4f 75 74 20 66  WhereLoop.nOut f
274e0 69 65 6c 64 20 66 6f 72 20 65 76 65 72 79 20 73  ield for every s
274f0 75 63 68 20 57 48 45 52 45 20 63 6c 61 75 73 65  uch WHERE clause
27500 20 74 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20 48 65 75   term..**.** Heu
27510 72 69 73 74 69 63 20 32 3a 20 20 49 66 20 74 68  ristic 2:  If th
27520 65 72 65 20 65 78 69 73 74 73 20 6f 6e 65 20 6f  ere exists one o
27530 72 20 6d 6f 72 65 20 57 48 45 52 45 20 63 6c 61  r more WHERE cla
27540 75 73 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65  use terms of the
27550 0a 2a 2a 20 66 6f 72 6d 20 22 78 3d 3d 45 58 50  .** form "x==EXP
27560 52 22 20 61 6e 64 20 45 58 50 52 20 69 73 20 6e  R" and EXPR is n
27570 6f 74 20 61 20 63 6f 6e 73 74 61 6e 74 20 30 20  ot a constant 0 
27580 6f 72 20 31 2c 20 74 68 65 6e 20 6d 61 6b 65 20  or 1, then make 
27590 73 75 72 65 20 74 68 65 0a 2a 2a 20 66 69 6e 61  sure the.** fina
275a0 6c 20 6f 75 74 70 75 74 20 72 6f 77 20 65 73 74  l output row est
275b0 69 6d 61 74 65 20 69 73 20 6e 6f 20 67 72 65 61  imate is no grea
275c0 74 65 72 20 74 68 61 6e 20 31 2f 34 20 6f 66 20  ter than 1/4 of 
275d0 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  the total number
275e0 0a 2a 2a 20 6f 66 20 72 6f 77 73 20 69 6e 20 74  .** of rows in t
275f0 68 65 20 74 61 62 6c 65 2e 20 20 49 6e 20 6f 74  he table.  In ot
27600 68 65 72 20 77 6f 72 64 73 2c 20 61 73 73 75 6d  her words, assum
27610 65 20 74 68 61 74 20 78 3d 3d 45 58 50 52 20 77  e that x==EXPR w
27620 69 6c 6c 20 66 69 6c 74 65 72 0a 2a 2a 20 6f 75  ill filter.** ou
27630 74 20 61 74 20 6c 65 61 73 74 20 33 20 6f 75 74  t at least 3 out
27640 20 6f 66 20 34 20 72 6f 77 73 2e 20 20 49 66 20   of 4 rows.  If 
27650 45 58 50 52 20 69 73 20 2d 31 20 6f 72 20 30 20  EXPR is -1 or 0 
27660 6f 72 20 31 2c 20 74 68 65 6e 20 6d 61 79 62 65  or 1, then maybe
27670 20 74 68 65 0a 2a 2a 20 22 78 22 20 63 6f 6c 75   the.** "x" colu
27680 6d 6e 20 69 73 20 62 6f 6f 6c 65 61 6e 20 6f 72  mn is boolean or
27690 20 65 6c 73 65 20 2d 31 20 6f 72 20 30 20 6f 72   else -1 or 0 or
276a0 20 31 20 69 73 20 61 20 63 6f 6d 6d 6f 6e 20 64   1 is a common d
276b0 65 66 61 75 6c 74 20 76 61 6c 75 65 0a 2a 2a 20  efault value.** 
276c0 6f 6e 20 74 68 65 20 22 78 22 20 63 6f 6c 75 6d  on the "x" colum
276d0 6e 20 61 6e 64 20 73 6f 20 69 6e 20 74 68 61 74  n and so in that
276e0 20 63 61 73 65 20 6f 6e 6c 79 20 63 61 70 20 74   case only cap t
276f0 68 65 20 6f 75 74 70 75 74 20 72 6f 77 20 65 73  he output row es
27700 74 69 6d 61 74 65 0a 2a 2a 20 61 74 20 31 2f 32  timate.** at 1/2
27710 20 69 6e 73 74 65 61 64 20 6f 66 20 31 2f 34 2e   instead of 1/4.
27720 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
27730 77 68 65 72 65 4c 6f 6f 70 4f 75 74 70 75 74 41  whereLoopOutputA
27740 64 6a 75 73 74 28 0a 20 20 57 68 65 72 65 43 6c  djust(.  WhereCl
27750 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20  ause *pWC,      
27760 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
27770 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f  use */.  WhereLo
27780 6f 70 20 2a 70 4c 6f 6f 70 2c 20 20 20 20 20 20  op *pLoop,      
27790 2f 2a 20 54 68 65 20 6c 6f 6f 70 20 74 6f 20 61  /* The loop to a
277a0 64 6a 75 73 74 20 64 6f 77 6e 77 61 72 64 20 2a  djust downward *
277b0 2f 0a 20 20 4c 6f 67 45 73 74 20 6e 52 6f 77 20  /.  LogEst nRow 
277c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
277d0 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20  mber of rows in 
277e0 74 68 65 20 65 6e 74 69 72 65 20 74 61 62 6c 65  the entire table
277f0 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 54 65   */.){.  WhereTe
27800 72 6d 20 2a 70 54 65 72 6d 2c 20 2a 70 58 3b 0a  rm *pTerm, *pX;.
27810 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 41 6c 6c    Bitmask notAll
27820 6f 77 65 64 20 3d 20 7e 28 70 4c 6f 6f 70 2d 3e  owed = ~(pLoop->
27830 70 72 65 72 65 71 7c 70 4c 6f 6f 70 2d 3e 6d 61  prereq|pLoop->ma
27840 73 6b 53 65 6c 66 29 3b 0a 20 20 69 6e 74 20 69  skSelf);.  int i
27850 2c 20 6a 2c 20 6b 3b 0a 20 20 4c 6f 67 45 73 74  , j, k;.  LogEst
27860 20 69 52 65 64 75 63 65 20 3d 20 30 3b 20 20 20   iReduce = 0;   
27870 20 2f 2a 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20   /* pLoop->nOut 
27880 73 68 6f 75 6c 64 20 6e 6f 74 20 65 78 63 65 65  should not excee
27890 64 20 6e 52 6f 77 2d 69 52 65 64 75 63 65 20 2a  d nRow-iReduce *
278a0 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 28 70 4c  /..  assert( (pL
278b0 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
278c0 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29  HERE_AUTO_INDEX)
278d0 3d 3d 30 20 29 3b 0a 20 20 66 6f 72 28 69 3d 70  ==0 );.  for(i=p
278e0 57 43 2d 3e 6e 54 65 72 6d 2c 20 70 54 65 72 6d  WC->nTerm, pTerm
278f0 3d 70 57 43 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d  =pWC->a; i>0; i-
27900 2d 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  -, pTerm++){.   
27910 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 77 74 46   if( (pTerm->wtF
27920 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54  lags & TERM_VIRT
27930 55 41 4c 29 21 3d 30 20 29 20 62 72 65 61 6b 3b  UAL)!=0 ) break;
27940 0a 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d  .    if( (pTerm-
27950 3e 70 72 65 72 65 71 41 6c 6c 20 26 20 70 4c 6f  >prereqAll & pLo
27960 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 29 3d 3d 30  op->maskSelf)==0
27970 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
27980 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65   if( (pTerm->pre
27990 72 65 71 41 6c 6c 20 26 20 6e 6f 74 41 6c 6c 6f  reqAll & notAllo
279a0 77 65 64 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e  wed)!=0 ) contin
279b0 75 65 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 70 4c  ue;.    for(j=pL
279c0 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 2d 31 3b 20 6a  oop->nLTerm-1; j
279d0 3e 3d 30 3b 20 6a 2d 2d 29 7b 0a 20 20 20 20 20  >=0; j--){.     
279e0 20 70 58 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54   pX = pLoop->aLT
279f0 65 72 6d 5b 6a 5d 3b 0a 20 20 20 20 20 20 69 66  erm[j];.      if
27a00 28 20 70 58 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  ( pX==0 ) contin
27a10 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70 58  ue;.      if( pX
27a20 3d 3d 70 54 65 72 6d 20 29 20 62 72 65 61 6b 3b  ==pTerm ) break;
27a30 0a 20 20 20 20 20 20 69 66 28 20 70 58 2d 3e 69  .      if( pX->i
27a40 50 61 72 65 6e 74 3e 3d 30 20 26 26 20 28 26 70  Parent>=0 && (&p
27a50 57 43 2d 3e 61 5b 70 58 2d 3e 69 50 61 72 65 6e  WC->a[pX->iParen
27a60 74 5d 29 3d 3d 70 54 65 72 6d 20 29 20 62 72 65  t])==pTerm ) bre
27a70 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ak;.    }.    if
27a80 28 20 6a 3c 30 20 29 7b 0a 20 20 20 20 20 20 69  ( j<0 ){.      i
27a90 66 28 20 70 54 65 72 6d 2d 3e 74 72 75 74 68 50  f( pTerm->truthP
27aa0 72 6f 62 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20  rob<=0 ){.      
27ab0 20 20 2f 2a 20 49 66 20 61 20 74 72 75 74 68 20    /* If a truth 
27ac0 70 72 6f 62 61 62 69 6c 69 74 79 20 69 73 20 73  probability is s
27ad0 70 65 63 69 66 69 65 64 20 75 73 69 6e 67 20 74  pecified using t
27ae0 68 65 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 29 20  he likelihood() 
27af0 68 69 6e 74 73 2c 0a 20 20 20 20 20 20 20 20 2a  hints,.        *
27b00 2a 20 74 68 65 6e 20 75 73 65 20 74 68 65 20 70  * then use the p
27b10 72 6f 62 61 62 69 6c 69 74 79 20 70 72 6f 76 69  robability provi
27b20 64 65 64 20 62 79 20 74 68 65 20 61 70 70 6c 69  ded by the appli
27b30 63 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20  cation. */.     
27b40 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 2b     pLoop->nOut +
27b50 3d 20 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72  = pTerm->truthPr
27b60 6f 62 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ob;.      }else{
27b70 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 74  .        /* In t
27b80 68 65 20 61 62 73 65 6e 63 65 20 6f 66 20 65 78  he absence of ex
27b90 70 6c 69 63 69 74 20 74 72 75 74 68 20 70 72 6f  plicit truth pro
27ba0 62 61 62 69 6c 69 74 69 65 73 2c 20 75 73 65 20  babilities, use 
27bb0 68 65 75 72 69 73 74 69 63 73 20 74 6f 0a 20 20  heuristics to.  
27bc0 20 20 20 20 20 20 2a 2a 20 67 75 65 73 73 20 61        ** guess a
27bd0 20 72 65 61 73 6f 6e 61 62 6c 65 20 74 72 75 74   reasonable trut
27be0 68 20 70 72 6f 62 61 62 69 6c 69 74 79 2e 20 2a  h probability. *
27bf0 2f 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d  /.        pLoop-
27c00 3e 6e 4f 75 74 2d 2d 3b 0a 20 20 20 20 20 20 20  >nOut--;.       
27c10 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65   if( pTerm->eOpe
27c20 72 61 74 6f 72 26 57 4f 5f 45 51 20 29 7b 0a 20  rator&WO_EQ ){. 
27c30 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70           Expr *p
27c40 52 69 67 68 74 20 3d 20 70 54 65 72 6d 2d 3e 70  Right = pTerm->p
27c50 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20  Expr->pRight;.  
27c60 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
27c70 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72  te3ExprIsInteger
27c80 28 70 52 69 67 68 74 2c 20 26 6b 29 20 26 26 20  (pRight, &k) && 
27c90 6b 3e 3d 28 2d 31 29 20 26 26 20 6b 3c 3d 31 20  k>=(-1) && k<=1 
27ca0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6b  ){.            k
27cb0 20 3d 20 31 30 3b 0a 20 20 20 20 20 20 20 20 20   = 10;.         
27cc0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
27cd0 20 20 20 20 6b 20 3d 20 32 30 3b 0a 20 20 20 20      k = 20;.    
27ce0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
27cf0 20 20 69 66 28 20 69 52 65 64 75 63 65 3c 6b 20    if( iReduce<k 
27d00 29 20 69 52 65 64 75 63 65 20 3d 20 6b 3b 0a 20  ) iReduce = k;. 
27d10 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
27d20 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
27d30 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 3e 20 6e   pLoop->nOut > n
27d40 52 6f 77 2d 69 52 65 64 75 63 65 20 29 20 20 70  Row-iReduce )  p
27d50 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 3d 20 6e 52 6f  Loop->nOut = nRo
27d60 77 20 2d 20 69 52 65 64 75 63 65 3b 0a 7d 0a 0a  w - iReduce;.}..
27d70 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20 74 68 65  /*.** Adjust the
27d80 20 63 6f 73 74 20 43 20 62 79 20 74 68 65 20 63   cost C by the c
27d90 6f 73 74 4d 75 6c 74 20 66 61 63 74 65 72 20 54  ostMult facter T
27da0 2e 20 20 54 68 69 73 20 6f 6e 6c 79 20 6f 63 63  .  This only occ
27db0 75 72 73 20 69 66 0a 2a 2a 20 63 6f 6d 70 69 6c  urs if.** compil
27dc0 65 64 20 77 69 74 68 20 2d 44 53 51 4c 49 54 45  ed with -DSQLITE
27dd0 5f 45 4e 41 42 4c 45 5f 43 4f 53 54 4d 55 4c 54  _ENABLE_COSTMULT
27de0 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
27df0 45 5f 45 4e 41 42 4c 45 5f 43 4f 53 54 4d 55 4c  E_ENABLE_COSTMUL
27e00 54 0a 23 20 64 65 66 69 6e 65 20 41 70 70 6c 79  T.# define Apply
27e10 43 6f 73 74 4d 75 6c 74 69 70 6c 69 65 72 28 43  CostMultiplier(C
27e20 2c 54 29 20 20 43 20 2b 3d 20 54 0a 23 65 6c 73  ,T)  C += T.#els
27e30 65 0a 23 20 64 65 66 69 6e 65 20 41 70 70 6c 79  e.# define Apply
27e40 43 6f 73 74 4d 75 6c 74 69 70 6c 69 65 72 28 43  CostMultiplier(C
27e50 2c 54 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ,T).#endif../*.*
27e60 2a 20 57 65 20 68 61 76 65 20 73 6f 20 66 61 72  * We have so far
27e70 20 6d 61 74 63 68 65 64 20 70 42 75 69 6c 64 65   matched pBuilde
27e80 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65  r->pNew->u.btree
27e90 2e 6e 45 71 20 74 65 72 6d 73 20 6f 66 20 74 68  .nEq terms of th
27ea0 65 20 0a 2a 2a 20 69 6e 64 65 78 20 70 49 6e 64  e .** index pInd
27eb0 65 78 2e 20 54 72 79 20 74 6f 20 6d 61 74 63 68  ex. Try to match
27ec0 20 6f 6e 65 20 6d 6f 72 65 2e 0a 2a 2a 0a 2a 2a   one more..**.**
27ed0 20 57 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   When this funct
27ee0 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 70  ion is called, p
27ef0 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 6e  Builder->pNew->n
27f00 4f 75 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  Out contains the
27f10 20 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72   .** number of r
27f20 6f 77 73 20 65 78 70 65 63 74 65 64 20 74 6f 20  ows expected to 
27f30 62 65 20 76 69 73 69 74 65 64 20 62 79 20 66 69  be visited by fi
27f40 6c 74 65 72 69 6e 67 20 75 73 69 6e 67 20 74 68  ltering using th
27f50 65 20 6e 45 71 20 0a 2a 2a 20 74 65 72 6d 73 20  e nEq .** terms 
27f60 6f 6e 6c 79 2e 20 49 66 20 69 74 20 69 73 20 6d  only. If it is m
27f70 6f 64 69 66 69 65 64 2c 20 74 68 69 73 20 76 61  odified, this va
27f80 6c 75 65 20 69 73 20 72 65 73 74 6f 72 65 64 20  lue is restored 
27f90 62 65 66 6f 72 65 20 74 68 69 73 20 0a 2a 2a 20  before this .** 
27fa0 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
27fb0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 50 72 6f 62  ..**.** If pProb
27fc0 65 2d 3e 74 6e 75 6d 3d 3d 30 2c 20 74 68 61 74  e->tnum==0, that
27fd0 20 6d 65 61 6e 73 20 70 49 6e 64 65 78 20 69 73   means pIndex is
27fe0 20 61 20 66 61 6b 65 20 69 6e 64 65 78 20 75 73   a fake index us
27ff0 65 64 20 66 6f 72 20 74 68 65 0a 2a 2a 20 49 4e  ed for the.** IN
28000 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
28010 59 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  Y..*/.static int
28020 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72   whereLoopAddBtr
28030 65 65 49 6e 64 65 78 28 0a 20 20 57 68 65 72 65  eeIndex(.  Where
28040 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75  LoopBuilder *pBu
28050 69 6c 64 65 72 2c 20 20 20 20 20 2f 2a 20 54 68  ilder,     /* Th
28060 65 20 57 68 65 72 65 4c 6f 6f 70 20 66 61 63 74  e WhereLoop fact
28070 6f 72 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ory */.  struct 
28080 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53  SrcList_item *pS
28090 72 63 2c 20 20 20 20 20 20 2f 2a 20 46 52 4f 4d  rc,      /* FROM
280a0 20 63 6c 61 75 73 65 20 74 65 72 6d 20 62 65 69   clause term bei
280b0 6e 67 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20  ng analyzed */. 
280c0 20 49 6e 64 65 78 20 2a 70 50 72 6f 62 65 2c 20   Index *pProbe, 
280d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
280e0 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 6f 6e 20   /* An index on 
280f0 70 53 72 63 20 2a 2f 0a 20 20 4c 6f 67 45 73 74  pSrc */.  LogEst
28100 20 6e 49 6e 4d 75 6c 20 20 20 20 20 20 20 20 20   nInMul         
28110 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6c 6f 67            /* log
28120 28 4e 75 6d 62 65 72 20 6f 66 20 69 74 65 72 61  (Number of itera
28130 74 69 6f 6e 73 20 64 75 65 20 74 6f 20 49 4e 29  tions due to IN)
28140 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 49 6e   */.){.  WhereIn
28150 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70 42 75  fo *pWInfo = pBu
28160 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 20 20  ilder->pWInfo;  
28170 2f 2a 20 57 48 45 52 45 20 61 6e 61 6c 79 73 65  /* WHERE analyse
28180 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 50 61   context */.  Pa
28190 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57  rse *pParse = pW
281a0 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 20 20 20  Info->pParse;   
281b0 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
281c0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73 71 6c  context */.  sql
281d0 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
281e0 65 2d 3e 64 62 3b 20 20 20 20 20 20 20 2f 2a 20  e->db;       /* 
281f0 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
28200 69 6f 6e 20 6d 61 6c 6c 6f 63 20 63 6f 6e 74 65  ion malloc conte
28210 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f  xt */.  WhereLoo
28220 70 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20  p *pNew;        
28230 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6c          /* Templ
28240 61 74 65 20 57 68 65 72 65 4c 6f 6f 70 20 75 6e  ate WhereLoop un
28250 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
28260 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
28270 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20  *pTerm;         
28280 20 20 20 20 20 20 2f 2a 20 41 20 57 68 65 72 65        /* A Where
28290 54 65 72 6d 20 75 6e 64 65 72 20 63 6f 6e 73 69  Term under consi
282a0 64 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  deration */.  in
282b0 74 20 6f 70 4d 61 73 6b 3b 20 20 20 20 20 20 20  t opMask;       
282c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
282d0 20 56 61 6c 69 64 20 6f 70 65 72 61 74 6f 72 73   Valid operators
282e0 20 66 6f 72 20 63 6f 6e 73 74 72 61 69 6e 74 73   for constraints
282f0 20 2a 2f 0a 20 20 57 68 65 72 65 53 63 61 6e 20   */.  WhereScan 
28300 73 63 61 6e 3b 20 20 20 20 20 20 20 20 20 20 20  scan;           
28310 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f        /* Iterato
28320 72 20 66 6f 72 20 57 48 45 52 45 20 74 65 72 6d  r for WHERE term
28330 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 73  s */.  Bitmask s
28340 61 76 65 64 5f 70 72 65 72 65 71 3b 20 20 20 20  aved_prereq;    
28350 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e         /* Origin
28360 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77  al value of pNew
28370 2d 3e 70 72 65 72 65 71 20 2a 2f 0a 20 20 75 31  ->prereq */.  u1
28380 36 20 73 61 76 65 64 5f 6e 4c 54 65 72 6d 3b 20  6 saved_nLTerm; 
28390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
283a0 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20   Original value 
283b0 6f 66 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20  of pNew->nLTerm 
283c0 2a 2f 0a 20 20 75 31 36 20 73 61 76 65 64 5f 6e  */.  u16 saved_n
283d0 45 71 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Eq;             
283e0 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c       /* Original
283f0 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e   value of pNew->
28400 75 2e 62 74 72 65 65 2e 6e 45 71 20 2a 2f 0a 20  u.btree.nEq */. 
28410 20 75 31 36 20 73 61 76 65 64 5f 6e 53 6b 69 70   u16 saved_nSkip
28420 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
28430 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c   /* Original val
28440 75 65 20 6f 66 20 70 4e 65 77 2d 3e 6e 53 6b 69  ue of pNew->nSki
28450 70 20 2a 2f 0a 20 20 75 33 32 20 73 61 76 65 64  p */.  u32 saved
28460 5f 77 73 46 6c 61 67 73 3b 20 20 20 20 20 20 20  _wsFlags;       
28470 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e         /* Origin
28480 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77  al value of pNew
28490 2d 3e 77 73 46 6c 61 67 73 20 2a 2f 0a 20 20 4c  ->wsFlags */.  L
284a0 6f 67 45 73 74 20 73 61 76 65 64 5f 6e 4f 75 74  ogEst saved_nOut
284b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
284c0 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65  * Original value
284d0 20 6f 66 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2a   of pNew->nOut *
284e0 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 20 20 20  /.  int iCol;   
284f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28500 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
28510 74 68 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68  the column in th
28520 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  e table */.  int
28530 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
28540 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28550 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
28560 20 4c 6f 67 45 73 74 20 72 53 69 7a 65 3b 20 20   LogEst rSize;  
28570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28580 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 6f   /* Number of ro
28590 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  ws in the table 
285a0 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 72 4c 6f 67  */.  LogEst rLog
285b0 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
285c0 20 20 20 20 20 2f 2a 20 4c 6f 67 61 72 69 74 68       /* Logarith
285d0 6d 20 6f 66 20 74 61 62 6c 65 20 73 69 7a 65 20  m of table size 
285e0 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  */.  WhereTerm *
285f0 70 54 6f 70 20 3d 20 30 2c 20 2a 70 42 74 6d 20  pTop = 0, *pBtm 
28600 3d 20 30 3b 20 2f 2a 20 54 6f 70 20 61 6e 64 20  = 0; /* Top and 
28610 62 6f 74 74 6f 6d 20 72 61 6e 67 65 20 63 6f 6e  bottom range con
28620 73 74 72 61 69 6e 74 73 20 2a 2f 0a 0a 20 20 70  straints */..  p
28630 4e 65 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  New = pBuilder->
28640 70 4e 65 77 3b 0a 20 20 69 66 28 20 64 62 2d 3e  pNew;.  if( db->
28650 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72  mallocFailed ) r
28660 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
28670 45 4d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 28  EM;..  assert( (
28680 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20  pNew->wsFlags & 
28690 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42  WHERE_VIRTUALTAB
286a0 4c 45 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  LE)==0 );.  asse
286b0 72 74 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61  rt( (pNew->wsFla
286c0 67 73 20 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c  gs & WHERE_TOP_L
286d0 49 4d 49 54 29 3d 3d 30 20 29 3b 0a 20 20 69 66  IMIT)==0 );.  if
286e0 28 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20  ( pNew->wsFlags 
286f0 26 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49  & WHERE_BTM_LIMI
28700 54 20 29 7b 0a 20 20 20 20 6f 70 4d 61 73 6b 20  T ){.    opMask 
28710 3d 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 3b 0a 20  = WO_LT|WO_LE;. 
28720 20 7d 65 6c 73 65 20 69 66 28 20 70 50 72 6f 62   }else if( pProb
28730 65 2d 3e 74 6e 75 6d 3c 3d 30 20 7c 7c 20 28 70  e->tnum<=0 || (p
28740 53 72 63 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20  Src->jointype & 
28750 4a 54 5f 4c 45 46 54 29 21 3d 30 20 29 7b 0a 20  JT_LEFT)!=0 ){. 
28760 20 20 20 6f 70 4d 61 73 6b 20 3d 20 57 4f 5f 45     opMask = WO_E
28770 51 7c 57 4f 5f 49 4e 7c 57 4f 5f 47 54 7c 57 4f  Q|WO_IN|WO_GT|WO
28780 5f 47 45 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 3b  _GE|WO_LT|WO_LE;
28790 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 70  .  }else{.    op
287a0 4d 61 73 6b 20 3d 20 57 4f 5f 45 51 7c 57 4f 5f  Mask = WO_EQ|WO_
287b0 49 4e 7c 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f  IN|WO_ISNULL|WO_
287c0 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4c 54 7c 57  GT|WO_GE|WO_LT|W
287d0 4f 5f 4c 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20  O_LE;.  }.  if( 
287e0 70 50 72 6f 62 65 2d 3e 62 55 6e 6f 72 64 65 72  pProbe->bUnorder
287f0 65 64 20 29 20 6f 70 4d 61 73 6b 20 26 3d 20 7e  ed ) opMask &= ~
28800 28 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f  (WO_GT|WO_GE|WO_
28810 4c 54 7c 57 4f 5f 4c 45 29 3b 0a 0a 20 20 61 73  LT|WO_LE);..  as
28820 73 65 72 74 28 20 70 4e 65 77 2d 3e 75 2e 62 74  sert( pNew->u.bt
28830 72 65 65 2e 6e 45 71 3c 70 50 72 6f 62 65 2d 3e  ree.nEq<pProbe->
28840 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 69 43 6f  nColumn );.  iCo
28850 6c 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69 43 6f  l = pProbe->aiCo
28860 6c 75 6d 6e 5b 70 4e 65 77 2d 3e 75 2e 62 74 72  lumn[pNew->u.btr
28870 65 65 2e 6e 45 71 5d 3b 0a 0a 20 20 70 54 65 72  ee.nEq];..  pTer
28880 6d 20 3d 20 77 68 65 72 65 53 63 61 6e 49 6e 69  m = whereScanIni
28890 74 28 26 73 63 61 6e 2c 20 70 42 75 69 6c 64 65  t(&scan, pBuilde
288a0 72 2d 3e 70 57 43 2c 20 70 53 72 63 2d 3e 69 43  r->pWC, pSrc->iC
288b0 75 72 73 6f 72 2c 20 69 43 6f 6c 2c 0a 20 20 20  ursor, iCol,.   
288c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
288d0 20 20 20 20 20 6f 70 4d 61 73 6b 2c 20 70 50 72       opMask, pPr
288e0 6f 62 65 29 3b 0a 20 20 73 61 76 65 64 5f 6e 45  obe);.  saved_nE
288f0 71 20 3d 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65  q = pNew->u.btre
28900 65 2e 6e 45 71 3b 0a 20 20 73 61 76 65 64 5f 6e  e.nEq;.  saved_n
28910 53 6b 69 70 20 3d 20 70 4e 65 77 2d 3e 6e 53 6b  Skip = pNew->nSk
28920 69 70 3b 0a 20 20 73 61 76 65 64 5f 6e 4c 54 65  ip;.  saved_nLTe
28930 72 6d 20 3d 20 70 4e 65 77 2d 3e 6e 4c 54 65 72  rm = pNew->nLTer
28940 6d 3b 0a 20 20 73 61 76 65 64 5f 77 73 46 6c 61  m;.  saved_wsFla
28950 67 73 20 3d 20 70 4e 65 77 2d 3e 77 73 46 6c 61  gs = pNew->wsFla
28960 67 73 3b 0a 20 20 73 61 76 65 64 5f 70 72 65 72  gs;.  saved_prer
28970 65 71 20 3d 20 70 4e 65 77 2d 3e 70 72 65 72 65  eq = pNew->prere
28980 71 3b 0a 20 20 73 61 76 65 64 5f 6e 4f 75 74 20  q;.  saved_nOut 
28990 3d 20 70 4e 65 77 2d 3e 6e 4f 75 74 3b 0a 20 20  = pNew->nOut;.  
289a0 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 30  pNew->rSetup = 0
289b0 3b 0a 20 20 72 53 69 7a 65 20 3d 20 70 50 72 6f  ;.  rSize = pPro
289c0 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b  be->aiRowLogEst[
289d0 30 5d 3b 0a 20 20 72 4c 6f 67 53 69 7a 65 20 3d  0];.  rLogSize =
289e0 20 65 73 74 4c 6f 67 28 72 53 69 7a 65 29 3b 0a   estLog(rSize);.
289f0 20 20 66 6f 72 28 3b 20 72 63 3d 3d 53 51 4c 49    for(; rc==SQLI
28a00 54 45 5f 4f 4b 20 26 26 20 70 54 65 72 6d 21 3d  TE_OK && pTerm!=
28a10 30 3b 20 70 54 65 72 6d 20 3d 20 77 68 65 72 65  0; pTerm = where
28a20 53 63 61 6e 4e 65 78 74 28 26 73 63 61 6e 29 29  ScanNext(&scan))
28a30 7b 0a 20 20 20 20 75 31 36 20 65 4f 70 20 3d 20  {.    u16 eOp = 
28a40 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
28a50 3b 20 20 20 2f 2a 20 53 68 6f 72 74 68 61 6e 64  ;   /* Shorthand
28a60 20 66 6f 72 20 70 54 65 72 6d 2d 3e 65 4f 70 65   for pTerm->eOpe
28a70 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 4c 6f 67  rator */.    Log
28a80 45 73 74 20 72 43 6f 73 74 49 64 78 3b 0a 20 20  Est rCostIdx;.  
28a90 20 20 4c 6f 67 45 73 74 20 6e 4f 75 74 55 6e 61    LogEst nOutUna
28aa0 64 6a 75 73 74 65 64 3b 20 20 20 20 20 20 20 20  djusted;        
28ab0 2f 2a 20 6e 4f 75 74 20 62 65 66 6f 72 65 20 49  /* nOut before I
28ac0 4e 28 29 20 61 6e 64 20 57 48 45 52 45 20 61 64  N() and WHERE ad
28ad0 6a 75 73 74 6d 65 6e 74 73 20 2a 2f 0a 20 20 20  justments */.   
28ae0 20 69 6e 74 20 6e 49 6e 20 3d 20 30 3b 0a 23 69   int nIn = 0;.#i
28af0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
28b00 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54  LE_STAT3_OR_STAT
28b10 34 0a 20 20 20 20 69 6e 74 20 6e 52 65 63 56 61  4.    int nRecVa
28b20 6c 69 64 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  lid = pBuilder->
28b30 6e 52 65 63 56 61 6c 69 64 3b 0a 23 65 6e 64 69  nRecValid;.#endi
28b40 66 0a 20 20 20 20 69 66 28 20 28 65 4f 70 3d 3d  f.    if( (eOp==
28b50 57 4f 5f 49 53 4e 55 4c 4c 20 7c 7c 20 28 70 54  WO_ISNULL || (pT
28b60 65 72 6d 2d 3e 77 74 46 6c 61 67 73 26 54 45 52  erm->wtFlags&TER
28b70 4d 5f 56 4e 55 4c 4c 29 21 3d 30 29 0a 20 20 20  M_VNULL)!=0).   
28b80 20 20 26 26 20 28 69 43 6f 6c 3c 30 20 7c 7c 20    && (iCol<0 || 
28b90 70 53 72 63 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c  pSrc->pTab->aCol
28ba0 5b 69 43 6f 6c 5d 2e 6e 6f 74 4e 75 6c 6c 29 0a  [iCol].notNull).
28bb0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e      ){.      con
28bc0 74 69 6e 75 65 3b 20 2f 2a 20 69 67 6e 6f 72 65  tinue; /* ignore
28bd0 20 49 53 20 5b 4e 4f 54 5d 20 4e 55 4c 4c 20 63   IS [NOT] NULL c
28be0 6f 6e 73 74 72 61 69 6e 74 73 20 6f 6e 20 4e 4f  onstraints on NO
28bf0 54 20 4e 55 4c 4c 20 63 6f 6c 75 6d 6e 73 20 2a  T NULL columns *
28c00 2f 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  /.    }.    if( 
28c10 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
28c20 68 74 20 26 20 70 4e 65 77 2d 3e 6d 61 73 6b 53  ht & pNew->maskS
28c30 65 6c 66 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  elf ) continue;.
28c40 0a 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61  .    pNew->wsFla
28c50 67 73 20 3d 20 73 61 76 65 64 5f 77 73 46 6c 61  gs = saved_wsFla
28c60 67 73 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e  gs;.    pNew->u.
28c70 62 74 72 65 65 2e 6e 45 71 20 3d 20 73 61 76 65  btree.nEq = save
28c80 64 5f 6e 45 71 3b 0a 20 20 20 20 70 4e 65 77 2d  d_nEq;.    pNew-
28c90 3e 6e 4c 54 65 72 6d 20 3d 20 73 61 76 65 64 5f  >nLTerm = saved_
28ca0 6e 4c 54 65 72 6d 3b 0a 20 20 20 20 69 66 28 20  nLTerm;.    if( 
28cb0 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28  whereLoopResize(
28cc0 64 62 2c 20 70 4e 65 77 2c 20 70 4e 65 77 2d 3e  db, pNew, pNew->
28cd0 6e 4c 54 65 72 6d 2b 31 29 20 29 20 62 72 65 61  nLTerm+1) ) brea
28ce0 6b 3b 20 2f 2a 20 4f 4f 4d 20 2a 2f 0a 20 20 20  k; /* OOM */.   
28cf0 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 70 4e   pNew->aLTerm[pN
28d00 65 77 2d 3e 6e 4c 54 65 72 6d 2b 2b 5d 20 3d 20  ew->nLTerm++] = 
28d10 70 54 65 72 6d 3b 0a 20 20 20 20 70 4e 65 77 2d  pTerm;.    pNew-
28d20 3e 70 72 65 72 65 71 20 3d 20 28 73 61 76 65 64  >prereq = (saved
28d30 5f 70 72 65 72 65 71 20 7c 20 70 54 65 72 6d 2d  _prereq | pTerm-
28d40 3e 70 72 65 72 65 71 52 69 67 68 74 29 20 26 20  >prereqRight) & 
28d50 7e 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 3b  ~pNew->maskSelf;
28d60 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 49  ..    assert( nI
28d70 6e 4d 75 6c 3d 3d 30 0a 20 20 20 20 20 20 20 20  nMul==0.        
28d80 7c 7c 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67  || (pNew->wsFlag
28d90 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  s & WHERE_COLUMN
28da0 5f 4e 55 4c 4c 29 21 3d 30 20 0a 20 20 20 20 20  _NULL)!=0 .     
28db0 20 20 20 7c 7c 20 28 70 4e 65 77 2d 3e 77 73 46     || (pNew->wsF
28dc0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c  lags & WHERE_COL
28dd0 55 4d 4e 5f 49 4e 29 21 3d 30 20 0a 20 20 20 20  UMN_IN)!=0 .    
28de0 20 20 20 20 7c 7c 20 28 70 4e 65 77 2d 3e 77 73      || (pNew->ws
28df0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 53 4b  Flags & WHERE_SK
28e00 49 50 53 43 41 4e 29 21 3d 30 20 0a 20 20 20 20  IPSCAN)!=0 .    
28e10 29 3b 0a 0a 20 20 20 20 69 66 28 20 65 4f 70 20  );..    if( eOp 
28e20 26 20 57 4f 5f 49 4e 20 29 7b 0a 20 20 20 20 20  & WO_IN ){.     
28e30 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70   Expr *pExpr = p
28e40 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Term->pExpr;.   
28e50 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73     pNew->wsFlags
28e60 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e   |= WHERE_COLUMN
28e70 5f 49 4e 3b 0a 20 20 20 20 20 20 69 66 28 20 45  _IN;.      if( E
28e80 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
28e90 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
28ea0 63 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ct) ){.        /
28eb0 2a 20 22 78 20 49 4e 20 28 53 45 4c 45 43 54 20  * "x IN (SELECT 
28ec0 2e 2e 2e 29 22 3a 20 20 54 55 4e 49 4e 47 3a 20  ...)":  TUNING: 
28ed0 74 68 65 20 53 45 4c 45 43 54 20 72 65 74 75 72  the SELECT retur
28ee0 6e 73 20 32 35 20 72 6f 77 73 20 2a 2f 0a 20 20  ns 25 rows */.  
28ef0 20 20 20 20 20 20 6e 49 6e 20 3d 20 34 36 3b 20        nIn = 46; 
28f00 20 61 73 73 65 72 74 28 20 34 36 3d 3d 73 71 6c   assert( 46==sql
28f10 69 74 65 33 4c 6f 67 45 73 74 28 32 35 29 20 29  ite3LogEst(25) )
28f20 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
28f30 28 20 41 4c 57 41 59 53 28 70 45 78 70 72 2d 3e  ( ALWAYS(pExpr->
28f40 78 2e 70 4c 69 73 74 20 26 26 20 70 45 78 70 72  x.pList && pExpr
28f50 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ->x.pList->nExpr
28f60 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
28f70 22 78 20 49 4e 20 28 76 61 6c 75 65 2c 20 76 61  "x IN (value, va
28f80 6c 75 65 2c 20 2e 2e 2e 29 22 20 2a 2f 0a 20 20  lue, ...)" */.  
28f90 20 20 20 20 20 20 6e 49 6e 20 3d 20 73 71 6c 69        nIn = sqli
28fa0 74 65 33 4c 6f 67 45 73 74 28 70 45 78 70 72 2d  te3LogEst(pExpr-
28fb0 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 29  >x.pList->nExpr)
28fc0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
28fd0 61 73 73 65 72 74 28 20 6e 49 6e 3e 30 20 29 3b  assert( nIn>0 );
28fe0 20 20 2f 2a 20 52 48 53 20 61 6c 77 61 79 73 20    /* RHS always 
28ff0 68 61 73 20 32 20 6f 72 20 6d 6f 72 65 20 74 65  has 2 or more te
29000 72 6d 73 2e 2e 2e 20 20 54 68 65 20 70 61 72 73  rms...  The pars
29010 65 72 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  er.             
29020 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 68             ** ch
29030 61 6e 67 65 73 20 22 78 20 49 4e 20 28 3f 29 22  anges "x IN (?)"
29040 20 69 6e 74 6f 20 22 78 3d 3f 22 2e 20 2a 2f 0a   into "x=?". */.
29050 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65  .    }else if( e
29060 4f 70 20 26 20 28 57 4f 5f 45 51 29 20 29 7b 0a  Op & (WO_EQ) ){.
29070 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c        pNew->wsFl
29080 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c  ags |= WHERE_COL
29090 55 4d 4e 5f 45 51 3b 0a 20 20 20 20 20 20 69 66  UMN_EQ;.      if
290a0 28 20 69 43 6f 6c 3c 30 20 7c 7c 20 28 6e 49 6e  ( iCol<0 || (nIn
290b0 4d 75 6c 3d 3d 30 20 26 26 20 70 4e 65 77 2d 3e  Mul==0 && pNew->
290c0 75 2e 62 74 72 65 65 2e 6e 45 71 3d 3d 70 50 72  u.btree.nEq==pPr
290d0 6f 62 65 2d 3e 6e 4b 65 79 43 6f 6c 2d 31 29 20  obe->nKeyCol-1) 
290e0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  ){.        if( i
290f0 43 6f 6c 3e 3d 30 20 26 26 20 21 49 73 55 6e 69  Col>=0 && !IsUni
29100 71 75 65 49 6e 64 65 78 28 70 50 72 6f 62 65 29  queIndex(pProbe)
29110 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e   ){.          pN
29120 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57  ew->wsFlags |= W
29130 48 45 52 45 5f 55 4e 51 5f 57 41 4e 54 45 44 3b  HERE_UNQ_WANTED;
29140 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
29150 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
29160 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45  wsFlags |= WHERE
29170 5f 4f 4e 45 52 4f 57 3b 0a 20 20 20 20 20 20 20  _ONEROW;.       
29180 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
29190 65 6c 73 65 20 69 66 28 20 65 4f 70 20 26 20 57  else if( eOp & W
291a0 4f 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20  O_ISNULL ){.    
291b0 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20    pNew->wsFlags 
291c0 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  |= WHERE_COLUMN_
291d0 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 20  NULL;.    }else 
291e0 69 66 28 20 65 4f 70 20 26 20 28 57 4f 5f 47 54  if( eOp & (WO_GT
291f0 7c 57 4f 5f 47 45 29 20 29 7b 0a 20 20 20 20 20  |WO_GE) ){.     
29200 20 74 65 73 74 63 61 73 65 28 20 65 4f 70 20 26   testcase( eOp &
29210 20 57 4f 5f 47 54 20 29 3b 0a 20 20 20 20 20 20   WO_GT );.      
29220 74 65 73 74 63 61 73 65 28 20 65 4f 70 20 26 20  testcase( eOp & 
29230 57 4f 5f 47 45 20 29 3b 0a 20 20 20 20 20 20 70  WO_GE );.      p
29240 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20  New->wsFlags |= 
29250 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e  WHERE_COLUMN_RAN
29260 47 45 7c 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d  GE|WHERE_BTM_LIM
29270 49 54 3b 0a 20 20 20 20 20 20 70 42 74 6d 20 3d  IT;.      pBtm =
29280 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 54   pTerm;.      pT
29290 6f 70 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  op = 0;.    }els
292a0 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
292b0 20 65 4f 70 20 26 20 28 57 4f 5f 4c 54 7c 57 4f   eOp & (WO_LT|WO
292c0 5f 4c 45 29 20 29 3b 0a 20 20 20 20 20 20 74 65  _LE) );.      te
292d0 73 74 63 61 73 65 28 20 65 4f 70 20 26 20 57 4f  stcase( eOp & WO
292e0 5f 4c 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _LT );.      tes
292f0 74 63 61 73 65 28 20 65 4f 70 20 26 20 57 4f 5f  tcase( eOp & WO_
29300 4c 45 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77  LE );.      pNew
29310 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45  ->wsFlags |= WHE
29320 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c  RE_COLUMN_RANGE|
29330 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 3b  WHERE_TOP_LIMIT;
29340 0a 20 20 20 20 20 20 70 54 6f 70 20 3d 20 70 54  .      pTop = pT
29350 65 72 6d 3b 0a 20 20 20 20 20 20 70 42 74 6d 20  erm;.      pBtm 
29360 3d 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73  = (pNew->wsFlags
29370 20 26 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d   & WHERE_BTM_LIM
29380 49 54 29 21 3d 30 20 3f 0a 20 20 20 20 20 20 20  IT)!=0 ?.       
29390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4e                pN
293a0 65 77 2d 3e 61 4c 54 65 72 6d 5b 70 4e 65 77 2d  ew->aLTerm[pNew-
293b0 3e 6e 4c 54 65 72 6d 2d 32 5d 20 3a 20 30 3b 0a  >nLTerm-2] : 0;.
293c0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 74      }..    /* At
293d0 20 74 68 69 73 20 70 6f 69 6e 74 20 70 4e 65 77   this point pNew
293e0 2d 3e 6e 4f 75 74 20 69 73 20 73 65 74 20 74 6f  ->nOut is set to
293f0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
29400 6f 77 73 20 65 78 70 65 63 74 65 64 20 74 6f 0a  ows expected to.
29410 20 20 20 20 2a 2a 20 62 65 20 76 69 73 69 74 65      ** be visite
29420 64 20 62 79 20 74 68 65 20 69 6e 64 65 78 20 73  d by the index s
29430 63 61 6e 20 62 65 66 6f 72 65 20 63 6f 6e 73 69  can before consi
29440 64 65 72 69 6e 67 20 74 65 72 6d 20 70 54 65 72  dering term pTer
29450 6d 2c 20 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a  m, or the.    **
29460 20 76 61 6c 75 65 73 20 6f 66 20 6e 49 6e 20 61   values of nIn a
29470 6e 64 20 6e 49 6e 4d 75 6c 2e 20 49 6e 20 6f 74  nd nInMul. In ot
29480 68 65 72 20 77 6f 72 64 73 2c 20 61 73 73 75 6d  her words, assum
29490 69 6e 67 20 74 68 61 74 20 61 6c 6c 20 0a 20 20  ing that all .  
294a0 20 20 2a 2a 20 22 78 20 49 4e 28 2e 2e 2e 29 22    ** "x IN(...)"
294b0 20 74 65 72 6d 73 20 61 72 65 20 72 65 70 6c 61   terms are repla
294c0 63 65 64 20 77 69 74 68 20 22 78 20 3d 20 3f 22  ced with "x = ?"
294d0 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20 75 70 64  . This block upd
294e0 61 74 65 73 0a 20 20 20 20 2a 2a 20 74 68 65 20  ates.    ** the 
294f0 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 6e  value of pNew->n
29500 4f 75 74 20 74 6f 20 61 63 63 6f 75 6e 74 20 66  Out to account f
29510 6f 72 20 70 54 65 72 6d 20 28 62 75 74 20 6e 6f  or pTerm (but no
29520 74 20 6e 49 6e 2f 6e 49 6e 4d 75 6c 29 2e 20 20  t nIn/nInMul).  
29530 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
29540 4e 65 77 2d 3e 6e 4f 75 74 3d 3d 73 61 76 65 64  New->nOut==saved
29550 5f 6e 4f 75 74 20 29 3b 0a 20 20 20 20 69 66 28  _nOut );.    if(
29560 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26   pNew->wsFlags &
29570 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41   WHERE_COLUMN_RA
29580 4e 47 45 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  NGE ){.      /* 
29590 41 64 6a 75 73 74 20 6e 4f 75 74 20 75 73 69 6e  Adjust nOut usin
295a0 67 20 73 74 61 74 33 2f 73 74 61 74 34 20 64 61  g stat3/stat4 da
295b0 74 61 2e 20 4f 72 2c 20 69 66 20 74 68 65 72 65  ta. Or, if there
295c0 20 69 73 20 6e 6f 20 73 74 61 74 33 2f 73 74 61   is no stat3/sta
295d0 74 34 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61  t4.      ** data
295e0 2c 20 75 73 69 6e 67 20 73 6f 6d 65 20 6f 74 68  , using some oth
295f0 65 72 20 65 73 74 69 6d 61 74 65 2e 20 20 2a 2f  er estimate.  */
29600 0a 20 20 20 20 20 20 77 68 65 72 65 52 61 6e 67  .      whereRang
29610 65 53 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c  eScanEst(pParse,
29620 20 70 42 75 69 6c 64 65 72 2c 20 70 42 74 6d 2c   pBuilder, pBtm,
29630 20 70 54 6f 70 2c 20 70 4e 65 77 29 3b 0a 20 20   pTop, pNew);.  
29640 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
29650 6e 74 20 6e 45 71 20 3d 20 2b 2b 70 4e 65 77 2d  nt nEq = ++pNew-
29660 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20  >u.btree.nEq;.  
29670 20 20 20 20 61 73 73 65 72 74 28 20 65 4f 70 20      assert( eOp 
29680 26 20 28 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f  & (WO_ISNULL|WO_
29690 45 51 7c 57 4f 5f 49 4e 29 20 29 3b 0a 0a 20 20  EQ|WO_IN) );..  
296a0 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77      assert( pNew
296b0 2d 3e 6e 4f 75 74 3d 3d 73 61 76 65 64 5f 6e 4f  ->nOut==saved_nO
296c0 75 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ut );.      if( 
296d0 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62  pTerm->truthProb
296e0 3c 3d 30 20 26 26 20 69 43 6f 6c 3e 3d 30 20 29  <=0 && iCol>=0 )
296f0 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
29700 28 20 28 65 4f 70 20 26 20 57 4f 5f 49 4e 29 20  ( (eOp & WO_IN) 
29710 7c 7c 20 6e 49 6e 3d 3d 30 20 29 3b 0a 20 20 20  || nIn==0 );.   
29720 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65       testcase( e
29730 4f 70 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20 20  Op & WO_IN );.  
29740 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74        pNew->nOut
29750 20 2b 3d 20 70 54 65 72 6d 2d 3e 74 72 75 74 68   += pTerm->truth
29760 50 72 6f 62 3b 0a 20 20 20 20 20 20 20 20 70 4e  Prob;.        pN
29770 65 77 2d 3e 6e 4f 75 74 20 2d 3d 20 6e 49 6e 3b  ew->nOut -= nIn;
29780 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 23 69  .      }else{.#i
29790 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
297a0 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54  LE_STAT3_OR_STAT
297b0 34 0a 20 20 20 20 20 20 20 20 74 52 6f 77 63 6e  4.        tRowcn
297c0 74 20 6e 4f 75 74 20 3d 20 30 3b 0a 20 20 20 20  t nOut = 0;.    
297d0 20 20 20 20 69 66 28 20 6e 49 6e 4d 75 6c 3d 3d      if( nInMul==
297e0 30 20 0a 20 20 20 20 20 20 20 20 20 26 26 20 70  0 .         && p
297f0 50 72 6f 62 65 2d 3e 6e 53 61 6d 70 6c 65 20 0a  Probe->nSample .
29800 20 20 20 20 20 20 20 20 20 26 26 20 70 4e 65 77           && pNew
29810 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3c 3d 70  ->u.btree.nEq<=p
29820 50 72 6f 62 65 2d 3e 6e 53 61 6d 70 6c 65 43 6f  Probe->nSampleCo
29830 6c 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 28  l.         && ((
29840 65 4f 70 20 26 20 57 4f 5f 49 4e 29 3d 3d 30 20  eOp & WO_IN)==0 
29850 7c 7c 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  || !ExprHasPrope
29860 72 74 79 28 70 54 65 72 6d 2d 3e 70 45 78 70 72  rty(pTerm->pExpr
29870 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 29  , EP_xIsSelect))
29880 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
29890 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70        Expr *pExp
298a0 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  r = pTerm->pExpr
298b0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
298c0 28 65 4f 70 20 26 20 28 57 4f 5f 45 51 7c 57 4f  (eOp & (WO_EQ|WO
298d0 5f 49 53 4e 55 4c 4c 29 29 21 3d 30 20 29 7b 0a  _ISNULL))!=0 ){.
298e0 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
298f0 63 61 73 65 28 20 65 4f 70 20 26 20 57 4f 5f 45  case( eOp & WO_E
29900 51 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Q );.           
29910 20 74 65 73 74 63 61 73 65 28 20 65 4f 70 20 26   testcase( eOp &
29920 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20   WO_ISNULL );.  
29930 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 77            rc = w
29940 68 65 72 65 45 71 75 61 6c 53 63 61 6e 45 73 74  hereEqualScanEst
29950 28 70 50 61 72 73 65 2c 20 70 42 75 69 6c 64 65  (pParse, pBuilde
29960 72 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  r, pExpr->pRight
29970 2c 20 26 6e 4f 75 74 29 3b 0a 20 20 20 20 20 20  , &nOut);.      
29980 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
29990 20 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72         rc = wher
299a0 65 49 6e 53 63 61 6e 45 73 74 28 70 50 61 72 73  eInScanEst(pPars
299b0 65 2c 20 70 42 75 69 6c 64 65 72 2c 20 70 45 78  e, pBuilder, pEx
299c0 70 72 2d 3e 78 2e 70 4c 69 73 74 2c 20 26 6e 4f  pr->x.pList, &nO
299d0 75 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ut);.          }
299e0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
299f0 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55  c==SQLITE_NOTFOU
29a00 4e 44 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45  ND ) rc = SQLITE
29a10 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 69  _OK;.          i
29a20 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
29a30 20 29 20 62 72 65 61 6b 3b 20 20 20 20 20 20 20   ) break;       
29a40 20 20 20 2f 2a 20 4a 75 6d 70 20 6f 75 74 20 6f     /* Jump out o
29a50 66 20 74 68 65 20 70 54 65 72 6d 20 6c 6f 6f 70  f the pTerm loop
29a60 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
29a70 28 20 6e 4f 75 74 20 29 7b 0a 20 20 20 20 20 20  ( nOut ){.      
29a80 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74        pNew->nOut
29a90 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
29aa0 28 6e 4f 75 74 29 3b 0a 20 20 20 20 20 20 20 20  (nOut);.        
29ab0 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 6e 4f      if( pNew->nO
29ac0 75 74 3e 73 61 76 65 64 5f 6e 4f 75 74 20 29 20  ut>saved_nOut ) 
29ad0 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76  pNew->nOut = sav
29ae0 65 64 5f 6e 4f 75 74 3b 0a 20 20 20 20 20 20 20  ed_nOut;.       
29af0 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20       pNew->nOut 
29b00 2d 3d 20 6e 49 6e 3b 0a 20 20 20 20 20 20 20 20  -= nIn;.        
29b10 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
29b20 20 20 20 20 20 20 69 66 28 20 6e 4f 75 74 3d 3d        if( nOut==
29b30 30 20 29 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  0 ).#endif.     
29b40 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 70     {.          p
29b50 4e 65 77 2d 3e 6e 4f 75 74 20 2b 3d 20 28 70 50  New->nOut += (pP
29b60 72 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73  robe->aiRowLogEs
29b70 74 5b 6e 45 71 5d 20 2d 20 70 50 72 6f 62 65 2d  t[nEq] - pProbe-
29b80 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 6e 45 71  >aiRowLogEst[nEq
29b90 2d 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  -1]);.          
29ba0 69 66 28 20 65 4f 70 20 26 20 57 4f 5f 49 53 4e  if( eOp & WO_ISN
29bb0 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ULL ){.         
29bc0 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 49 66     /* TUNING: If
29bd0 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6c 69 6b   there is no lik
29be0 65 6c 69 68 6f 6f 64 28 29 20 76 61 6c 75 65 2c  elihood() value,
29bf0 20 61 73 73 75 6d 65 20 74 68 61 74 20 61 20 0a   assume that a .
29c00 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 22              ** "
29c10 63 6f 6c 20 49 53 20 4e 55 4c 4c 22 20 65 78 70  col IS NULL" exp
29c20 72 65 73 73 69 6f 6e 20 6d 61 74 63 68 65 73 20  ression matches 
29c30 74 77 69 63 65 20 61 73 20 6d 61 6e 79 20 72 6f  twice as many ro
29c40 77 73 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  ws .            
29c50 2a 2a 20 61 73 20 28 63 6f 6c 3d 3f 29 2e 20 2a  ** as (col=?). *
29c60 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4e  /.            pN
29c70 65 77 2d 3e 6e 4f 75 74 20 2b 3d 20 31 30 3b 0a  ew->nOut += 10;.
29c80 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
29c90 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
29ca0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20    }..    /* Set 
29cb0 72 43 6f 73 74 49 64 78 20 74 6f 20 74 68 65 20  rCostIdx to the 
29cc0 63 6f 73 74 20 6f 66 20 76 69 73 69 74 69 6e 67  cost of visiting
29cd0 20 73 65 6c 65 63 74 65 64 20 72 6f 77 73 20 69   selected rows i
29ce0 6e 20 69 6e 64 65 78 2e 20 41 64 64 0a 20 20 20  n index. Add.   
29cf0 20 2a 2a 20 69 74 20 74 6f 20 70 4e 65 77 2d 3e   ** it to pNew->
29d00 72 52 75 6e 2c 20 77 68 69 63 68 20 69 73 20 63  rRun, which is c
29d10 75 72 72 65 6e 74 6c 79 20 73 65 74 20 74 6f 20  urrently set to 
29d20 74 68 65 20 63 6f 73 74 20 6f 66 20 74 68 65 20  the cost of the 
29d30 69 6e 64 65 78 0a 20 20 20 20 2a 2a 20 73 65 65  index.    ** see
29d40 6b 20 6f 6e 6c 79 2e 20 54 68 65 6e 2c 20 69 66  k only. Then, if
29d50 20 74 68 69 73 20 69 73 20 61 20 6e 6f 6e 2d 63   this is a non-c
29d60 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 2c 20 61  overing index, a
29d70 64 64 20 74 68 65 20 63 6f 73 74 20 6f 66 0a 20  dd the cost of. 
29d80 20 20 20 2a 2a 20 76 69 73 69 74 69 6e 67 20 74     ** visiting t
29d90 68 65 20 72 6f 77 73 20 69 6e 20 74 68 65 20 6d  he rows in the m
29da0 61 69 6e 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20  ain table.  */. 
29db0 20 20 20 72 43 6f 73 74 49 64 78 20 3d 20 70 4e     rCostIdx = pN
29dc0 65 77 2d 3e 6e 4f 75 74 20 2b 20 31 20 2b 20 28  ew->nOut + 1 + (
29dd0 31 35 2a 70 50 72 6f 62 65 2d 3e 73 7a 49 64 78  15*pProbe->szIdx
29de0 52 6f 77 29 2f 70 53 72 63 2d 3e 70 54 61 62 2d  Row)/pSrc->pTab-
29df0 3e 73 7a 54 61 62 52 6f 77 3b 0a 20 20 20 20 70  >szTabRow;.    p
29e00 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 73 71 6c 69  New->rRun = sqli
29e10 74 65 33 4c 6f 67 45 73 74 41 64 64 28 72 4c 6f  te3LogEstAdd(rLo
29e20 67 53 69 7a 65 2c 20 72 43 6f 73 74 49 64 78 29  gSize, rCostIdx)
29e30 3b 0a 20 20 20 20 69 66 28 20 28 70 4e 65 77 2d  ;.    if( (pNew-
29e40 3e 77 73 46 6c 61 67 73 20 26 20 28 57 48 45 52  >wsFlags & (WHER
29e50 45 5f 49 44 58 5f 4f 4e 4c 59 7c 57 48 45 52 45  E_IDX_ONLY|WHERE
29e60 5f 49 50 4b 29 29 3d 3d 30 20 29 7b 0a 20 20 20  _IPK))==0 ){.   
29e70 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20     pNew->rRun = 
29e80 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64  sqlite3LogEstAdd
29e90 28 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 70 4e 65  (pNew->rRun, pNe
29ea0 77 2d 3e 6e 4f 75 74 20 2b 20 31 36 29 3b 0a 20  w->nOut + 16);. 
29eb0 20 20 20 7d 0a 20 20 20 20 41 70 70 6c 79 43 6f     }.    ApplyCo
29ec0 73 74 4d 75 6c 74 69 70 6c 69 65 72 28 70 4e 65  stMultiplier(pNe
29ed0 77 2d 3e 72 52 75 6e 2c 20 70 50 72 6f 62 65 2d  w->rRun, pProbe-
29ee0 3e 70 54 61 62 6c 65 2d 3e 63 6f 73 74 4d 75 6c  >pTable->costMul
29ef0 74 29 3b 0a 0a 20 20 20 20 6e 4f 75 74 55 6e 61  t);..    nOutUna
29f00 64 6a 75 73 74 65 64 20 3d 20 70 4e 65 77 2d 3e  djusted = pNew->
29f10 6e 4f 75 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  nOut;.    pNew->
29f20 72 52 75 6e 20 2b 3d 20 6e 49 6e 4d 75 6c 20 2b  rRun += nInMul +
29f30 20 6e 49 6e 3b 0a 20 20 20 20 70 4e 65 77 2d 3e   nIn;.    pNew->
29f40 6e 4f 75 74 20 2b 3d 20 6e 49 6e 4d 75 6c 20 2b  nOut += nInMul +
29f50 20 6e 49 6e 3b 0a 20 20 20 20 77 68 65 72 65 4c   nIn;.    whereL
29f60 6f 6f 70 4f 75 74 70 75 74 41 64 6a 75 73 74 28  oopOutputAdjust(
29f70 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 2c 20 70  pBuilder->pWC, p
29f80 4e 65 77 2c 20 72 53 69 7a 65 29 3b 0a 20 20 20  New, rSize);.   
29f90 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49   rc = whereLoopI
29fa0 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20  nsert(pBuilder, 
29fb0 70 4e 65 77 29 3b 0a 0a 20 20 20 20 69 66 28 20  pNew);..    if( 
29fc0 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20  pNew->wsFlags & 
29fd0 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e  WHERE_COLUMN_RAN
29fe0 47 45 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77  GE ){.      pNew
29ff0 2d 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e  ->nOut = saved_n
2a000 4f 75 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  Out;.    }else{.
2a010 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74        pNew->nOut
2a020 20 3d 20 6e 4f 75 74 55 6e 61 64 6a 75 73 74 65   = nOutUnadjuste
2a030 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  d;.    }..    if
2a040 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73  ( (pNew->wsFlags
2a050 20 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d   & WHERE_TOP_LIM
2a060 49 54 29 3d 3d 30 0a 20 20 20 20 20 26 26 20 70  IT)==0.     && p
2a070 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
2a080 3c 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e  <pProbe->nColumn
2a090 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 77 68  .    ){.      wh
2a0a0 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 49  ereLoopAddBtreeI
2a0b0 6e 64 65 78 28 70 42 75 69 6c 64 65 72 2c 20 70  ndex(pBuilder, p
2a0c0 53 72 63 2c 20 70 50 72 6f 62 65 2c 20 6e 49 6e  Src, pProbe, nIn
2a0d0 4d 75 6c 2b 6e 49 6e 29 3b 0a 20 20 20 20 7d 0a  Mul+nIn);.    }.
2a0e0 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d      pNew->nOut =
2a0f0 20 73 61 76 65 64 5f 6e 4f 75 74 3b 0a 23 69 66   saved_nOut;.#if
2a100 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
2a110 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34  E_STAT3_OR_STAT4
2a120 0a 20 20 20 20 70 42 75 69 6c 64 65 72 2d 3e 6e  .    pBuilder->n
2a130 52 65 63 56 61 6c 69 64 20 3d 20 6e 52 65 63 56  RecValid = nRecV
2a140 61 6c 69 64 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  alid;.#endif.  }
2a150 0a 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20  .  pNew->prereq 
2a160 3d 20 73 61 76 65 64 5f 70 72 65 72 65 71 3b 0a  = saved_prereq;.
2a170 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e    pNew->u.btree.
2a180 6e 45 71 20 3d 20 73 61 76 65 64 5f 6e 45 71 3b  nEq = saved_nEq;
2a190 0a 20 20 70 4e 65 77 2d 3e 6e 53 6b 69 70 20 3d  .  pNew->nSkip =
2a1a0 20 73 61 76 65 64 5f 6e 53 6b 69 70 3b 0a 20 20   saved_nSkip;.  
2a1b0 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20  pNew->wsFlags = 
2a1c0 73 61 76 65 64 5f 77 73 46 6c 61 67 73 3b 0a 20  saved_wsFlags;. 
2a1d0 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 61   pNew->nOut = sa
2a1e0 76 65 64 5f 6e 4f 75 74 3b 0a 20 20 70 4e 65 77  ved_nOut;.  pNew
2a1f0 2d 3e 6e 4c 54 65 72 6d 20 3d 20 73 61 76 65 64  ->nLTerm = saved
2a200 5f 6e 4c 54 65 72 6d 3b 0a 0a 20 20 2f 2a 20 43  _nLTerm;..  /* C
2a210 6f 6e 73 69 64 65 72 20 75 73 69 6e 67 20 61 20  onsider using a 
2a220 73 6b 69 70 2d 73 63 61 6e 20 69 66 20 74 68 65  skip-scan if the
2a230 72 65 20 61 72 65 20 6e 6f 20 57 48 45 52 45 20  re are no WHERE 
2a240 63 6c 61 75 73 65 20 63 6f 6e 73 74 72 61 69 6e  clause constrain
2a250 74 73 0a 20 20 2a 2a 20 61 76 61 69 6c 61 62 6c  ts.  ** availabl
2a260 65 20 66 6f 72 20 74 68 65 20 6c 65 66 74 2d 6d  e for the left-m
2a270 6f 73 74 20 74 65 72 6d 73 20 6f 66 20 74 68 65  ost terms of the
2a280 20 69 6e 64 65 78 2c 20 61 6e 64 20 69 66 20 74   index, and if t
2a290 68 65 20 61 76 65 72 61 67 65 0a 20 20 2a 2a 20  he average.  ** 
2a2a0 6e 75 6d 62 65 72 20 6f 66 20 72 65 70 65 61 74  number of repeat
2a2b0 73 20 69 6e 20 74 68 65 20 6c 65 66 74 2d 6d 6f  s in the left-mo
2a2c0 73 74 20 74 65 72 6d 73 20 69 73 20 61 74 20 6c  st terms is at l
2a2d0 65 61 73 74 20 31 38 2e 20 0a 20 20 2a 2a 0a 20  east 18. .  **. 
2a2e0 20 2a 2a 20 54 68 65 20 6d 61 67 69 63 20 6e 75   ** The magic nu
2a2f0 6d 62 65 72 20 31 38 20 69 73 20 73 65 6c 65 63  mber 18 is selec
2a300 74 65 64 20 6f 6e 20 74 68 65 20 62 61 73 69 73  ted on the basis
2a310 20 74 68 61 74 20 73 63 61 6e 6e 69 6e 67 20 31   that scanning 1
2a320 37 20 72 6f 77 73 0a 20 20 2a 2a 20 69 73 20 61  7 rows.  ** is a
2a330 6c 6d 6f 73 74 20 61 6c 77 61 79 73 20 71 75 69  lmost always qui
2a340 63 6b 65 72 20 74 68 61 6e 20 61 6e 20 69 6e 64  cker than an ind
2a350 65 78 20 73 65 65 6b 20 28 65 76 65 6e 20 74 68  ex seek (even th
2a360 6f 75 67 68 20 69 66 20 74 68 65 20 69 6e 64 65  ough if the inde
2a370 78 0a 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20  x.  ** contains 
2a380 66 65 77 65 72 20 74 68 61 6e 20 32 5e 31 37 20  fewer than 2^17 
2a390 72 6f 77 73 20 77 65 20 61 73 73 75 6d 65 20 6f  rows we assume o
2a3a0 74 68 65 72 77 69 73 65 20 69 6e 20 6f 74 68 65  therwise in othe
2a3b0 72 20 70 61 72 74 73 20 6f 66 0a 20 20 2a 2a 20  r parts of.  ** 
2a3c0 74 68 65 20 63 6f 64 65 29 2e 20 41 6e 64 2c 20  the code). And, 
2a3d0 65 76 65 6e 20 69 66 20 69 74 20 69 73 20 6e 6f  even if it is no
2a3e0 74 2c 20 69 74 20 73 68 6f 75 6c 64 20 6e 6f 74  t, it should not
2a3f0 20 62 65 20 74 6f 6f 20 6d 75 63 68 20 73 6c 6f   be too much slo
2a400 77 65 72 2e 20 0a 20 20 2a 2a 20 4f 6e 20 74 68  wer. .  ** On th
2a410 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 74 68  e other hand, th
2a420 65 20 65 78 74 72 61 20 73 65 65 6b 73 20 63 6f  e extra seeks co
2a430 75 6c 64 20 65 6e 64 20 75 70 20 62 65 69 6e 67  uld end up being
2a440 20 73 69 67 6e 69 66 69 63 61 6e 74 6c 79 0a 20   significantly. 
2a450 20 2a 2a 20 6d 6f 72 65 20 65 78 70 65 6e 73 69   ** more expensi
2a460 76 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  ve.  */.  assert
2a470 28 20 34 32 3d 3d 73 71 6c 69 74 65 33 4c 6f 67  ( 42==sqlite3Log
2a480 45 73 74 28 31 38 29 20 29 3b 0a 20 20 69 66 28  Est(18) );.  if(
2a490 20 73 61 76 65 64 5f 6e 45 71 3d 3d 73 61 76 65   saved_nEq==save
2a4a0 64 5f 6e 53 6b 69 70 0a 20 20 20 26 26 20 73 61  d_nSkip.   && sa
2a4b0 76 65 64 5f 6e 45 71 2b 31 3c 70 50 72 6f 62 65  ved_nEq+1<pProbe
2a4c0 2d 3e 6e 4b 65 79 43 6f 6c 0a 20 20 20 26 26 20  ->nKeyCol.   && 
2a4d0 70 50 72 6f 62 65 2d 3e 6e 6f 53 6b 69 70 53 63  pProbe->noSkipSc
2a4e0 61 6e 3d 3d 30 0a 20 20 20 26 26 20 70 50 72 6f  an==0.   && pPro
2a4f0 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b  be->aiRowLogEst[
2a500 73 61 76 65 64 5f 6e 45 71 2b 31 5d 3e 3d 34 32  saved_nEq+1]>=42
2a510 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 4d 69 6e    /* TUNING: Min
2a520 69 6d 75 6d 20 66 6f 72 20 73 6b 69 70 2d 73 63  imum for skip-sc
2a530 61 6e 20 2a 2f 0a 20 20 20 26 26 20 28 72 63 20  an */.   && (rc 
2a540 3d 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a  = whereLoopResiz
2a550 65 28 64 62 2c 20 70 4e 65 77 2c 20 70 4e 65 77  e(db, pNew, pNew
2a560 2d 3e 6e 4c 54 65 72 6d 2b 31 29 29 3d 3d 53 51  ->nLTerm+1))==SQ
2a570 4c 49 54 45 5f 4f 4b 0a 20 20 29 7b 0a 20 20 20  LITE_OK.  ){.   
2a580 20 4c 6f 67 45 73 74 20 6e 49 74 65 72 3b 0a 20   LogEst nIter;. 
2a590 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65     pNew->u.btree
2a5a0 2e 6e 45 71 2b 2b 3b 0a 20 20 20 20 70 4e 65 77  .nEq++;.    pNew
2a5b0 2d 3e 6e 53 6b 69 70 2b 2b 3b 0a 20 20 20 20 70  ->nSkip++;.    p
2a5c0 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 70 4e 65 77  New->aLTerm[pNew
2a5d0 2d 3e 6e 4c 54 65 72 6d 2b 2b 5d 20 3d 20 30 3b  ->nLTerm++] = 0;
2a5e0 0a 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61  .    pNew->wsFla
2a5f0 67 73 20 7c 3d 20 57 48 45 52 45 5f 53 4b 49 50  gs |= WHERE_SKIP
2a600 53 43 41 4e 3b 0a 20 20 20 20 6e 49 74 65 72 20  SCAN;.    nIter 
2a610 3d 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77 4c  = pProbe->aiRowL
2a620 6f 67 45 73 74 5b 73 61 76 65 64 5f 6e 45 71 5d  ogEst[saved_nEq]
2a630 20 2d 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77   - pProbe->aiRow
2a640 4c 6f 67 45 73 74 5b 73 61 76 65 64 5f 6e 45 71  LogEst[saved_nEq
2a650 2b 31 5d 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e  +1];.    pNew->n
2a660 4f 75 74 20 2d 3d 20 6e 49 74 65 72 3b 0a 20 20  Out -= nIter;.  
2a670 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 20 42 65    /* TUNING:  Be
2a680 63 61 75 73 65 20 75 6e 63 65 72 74 61 69 6e 74  cause uncertaint
2a690 69 65 73 20 69 6e 20 74 68 65 20 65 73 74 69 6d  ies in the estim
2a6a0 61 74 65 73 20 66 6f 72 20 73 6b 69 70 2d 73 63  ates for skip-sc
2a6b0 61 6e 20 71 75 65 72 69 65 73 2c 0a 20 20 20 20  an queries,.    
2a6c0 2a 2a 20 61 64 64 20 61 20 31 2e 33 37 35 20 66  ** add a 1.375 f
2a6d0 75 64 67 65 20 66 61 63 74 6f 72 20 74 6f 20 6d  udge factor to m
2a6e0 61 6b 65 20 73 6b 69 70 2d 73 63 61 6e 20 73 6c  ake skip-scan sl
2a6f0 69 67 68 74 6c 79 20 6c 65 73 73 20 6c 69 6b 65  ightly less like
2a700 6c 79 2e 20 2a 2f 0a 20 20 20 20 6e 49 74 65 72  ly. */.    nIter
2a710 20 2b 3d 20 35 3b 0a 20 20 20 20 77 68 65 72 65   += 5;.    where
2a720 4c 6f 6f 70 41 64 64 42 74 72 65 65 49 6e 64 65  LoopAddBtreeInde
2a730 78 28 70 42 75 69 6c 64 65 72 2c 20 70 53 72 63  x(pBuilder, pSrc
2a740 2c 20 70 50 72 6f 62 65 2c 20 6e 49 74 65 72 20  , pProbe, nIter 
2a750 2b 20 6e 49 6e 4d 75 6c 29 3b 0a 20 20 20 20 70  + nInMul);.    p
2a760 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76 65  New->nOut = save
2a770 64 5f 6e 4f 75 74 3b 0a 20 20 20 20 70 4e 65 77  d_nOut;.    pNew
2a780 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20  ->u.btree.nEq = 
2a790 73 61 76 65 64 5f 6e 45 71 3b 0a 20 20 20 20 70  saved_nEq;.    p
2a7a0 4e 65 77 2d 3e 6e 53 6b 69 70 20 3d 20 73 61 76  New->nSkip = sav
2a7b0 65 64 5f 6e 53 6b 69 70 3b 0a 20 20 20 20 70 4e  ed_nSkip;.    pN
2a7c0 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 73 61  ew->wsFlags = sa
2a7d0 76 65 64 5f 77 73 46 6c 61 67 73 3b 0a 20 20 7d  ved_wsFlags;.  }
2a7e0 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
2a7f0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
2a800 72 75 65 20 69 66 20 69 74 20 69 73 20 70 6f 73  rue if it is pos
2a810 73 69 62 6c 65 20 74 68 61 74 20 70 49 6e 64 65  sible that pInde
2a820 78 20 6d 69 67 68 74 20 62 65 20 75 73 65 66 75  x might be usefu
2a830 6c 20 69 6e 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e  l in.** implemen
2a840 74 69 6e 67 20 74 68 65 20 4f 52 44 45 52 20 42  ting the ORDER B
2a850 59 20 63 6c 61 75 73 65 20 69 6e 20 70 42 75 69  Y clause in pBui
2a860 6c 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  lder..**.** Retu
2a870 72 6e 20 46 61 6c 73 65 20 69 66 20 70 42 75 69  rn False if pBui
2a880 6c 64 65 72 20 64 6f 65 73 20 6e 6f 74 20 63 6f  lder does not co
2a890 6e 74 61 69 6e 20 61 6e 20 4f 52 44 45 52 20 42  ntain an ORDER B
2a8a0 59 20 63 6c 61 75 73 65 20 6f 72 0a 2a 2a 20 69  Y clause or.** i
2a8b0 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77 61  f there is no wa
2a8c0 79 20 66 6f 72 20 70 49 6e 64 65 78 20 74 6f 20  y for pIndex to 
2a8d0 62 65 20 75 73 65 66 75 6c 20 69 6e 20 69 6d 70  be useful in imp
2a8e0 6c 65 6d 65 6e 74 69 6e 67 20 74 68 61 74 0a 2a  lementing that.*
2a8f0 2a 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  * ORDER BY claus
2a900 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
2a910 20 69 6e 64 65 78 4d 69 67 68 74 48 65 6c 70 57   indexMightHelpW
2a920 69 74 68 4f 72 64 65 72 42 79 28 0a 20 20 57 68  ithOrderBy(.  Wh
2a930 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a  ereLoopBuilder *
2a940 70 42 75 69 6c 64 65 72 2c 0a 20 20 49 6e 64 65  pBuilder,.  Inde
2a950 78 20 2a 70 49 6e 64 65 78 2c 0a 20 20 69 6e 74  x *pIndex,.  int
2a960 20 69 43 75 72 73 6f 72 0a 29 7b 0a 20 20 45 78   iCursor.){.  Ex
2a970 70 72 4c 69 73 74 20 2a 70 4f 42 3b 0a 20 20 69  prList *pOB;.  i
2a980 6e 74 20 69 69 2c 20 6a 6a 3b 0a 0a 20 20 69 66  nt ii, jj;..  if
2a990 28 20 70 49 6e 64 65 78 2d 3e 62 55 6e 6f 72 64  ( pIndex->bUnord
2a9a0 65 72 65 64 20 29 20 72 65 74 75 72 6e 20 30 3b  ered ) return 0;
2a9b0 0a 20 20 69 66 28 20 28 70 4f 42 20 3d 20 70 42  .  if( (pOB = pB
2a9c0 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 2d 3e  uilder->pWInfo->
2a9d0 70 4f 72 64 65 72 42 79 29 3d 3d 30 20 29 20 72  pOrderBy)==0 ) r
2a9e0 65 74 75 72 6e 20 30 3b 0a 20 20 66 6f 72 28 69  eturn 0;.  for(i
2a9f0 69 3d 30 3b 20 69 69 3c 70 4f 42 2d 3e 6e 45 78  i=0; ii<pOB->nEx
2aa00 70 72 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 45  pr; ii++){.    E
2aa10 78 70 72 20 2a 70 45 78 70 72 20 3d 20 73 71 6c  xpr *pExpr = sql
2aa20 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c  ite3ExprSkipColl
2aa30 61 74 65 28 70 4f 42 2d 3e 61 5b 69 69 5d 2e 70  ate(pOB->a[ii].p
2aa40 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20 70  Expr);.    if( p
2aa50 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c  Expr->op!=TK_COL
2aa60 55 4d 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  UMN ) return 0;.
2aa70 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69      if( pExpr->i
2aa80 54 61 62 6c 65 3d 3d 69 43 75 72 73 6f 72 20 29  Table==iCursor )
2aa90 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  {.      if( pExp
2aaa0 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 20 72  r->iColumn<0 ) r
2aab0 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 66  eturn 1;.      f
2aac0 6f 72 28 6a 6a 3d 30 3b 20 6a 6a 3c 70 49 6e 64  or(jj=0; jj<pInd
2aad0 65 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 6a 2b  ex->nKeyCol; jj+
2aae0 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
2aaf0 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d  pExpr->iColumn==
2ab00 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e  pIndex->aiColumn
2ab10 5b 6a 6a 5d 20 29 20 72 65 74 75 72 6e 20 31 3b  [jj] ) return 1;
2ab20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2ab30 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
2ab40 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
2ab50 20 62 69 74 6d 61 73 6b 20 77 68 65 72 65 20 31   bitmask where 1
2ab60 73 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20  s indicate that 
2ab70 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
2ab80 67 20 63 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a 20 74  g column of.** t
2ab90 68 65 20 74 61 62 6c 65 20 69 73 20 75 73 65 64  he table is used
2aba0 20 62 79 20 61 6e 20 69 6e 64 65 78 2e 20 20 4f   by an index.  O
2abb0 6e 6c 79 20 74 68 65 20 66 69 72 73 74 20 36 33  nly the first 63
2abc0 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 63 6f 6e   columns are con
2abd0 73 69 64 65 72 65 64 2e 0a 2a 2f 0a 73 74 61 74  sidered..*/.stat
2abe0 69 63 20 42 69 74 6d 61 73 6b 20 63 6f 6c 75 6d  ic Bitmask colum
2abf0 6e 73 49 6e 49 6e 64 65 78 28 49 6e 64 65 78 20  nsInIndex(Index 
2ac00 2a 70 49 64 78 29 7b 0a 20 20 42 69 74 6d 61 73  *pIdx){.  Bitmas
2ac10 6b 20 6d 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6a  k m = 0;.  int j
2ac20 3b 0a 20 20 66 6f 72 28 6a 3d 70 49 64 78 2d 3e  ;.  for(j=pIdx->
2ac30 6e 43 6f 6c 75 6d 6e 2d 31 3b 20 6a 3e 3d 30 3b  nColumn-1; j>=0;
2ac40 20 6a 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20 78   j--){.    int x
2ac50 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d   = pIdx->aiColum
2ac60 6e 5b 6a 5d 3b 0a 20 20 20 20 69 66 28 20 78 3e  n[j];.    if( x>
2ac70 3d 30 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74  =0 ){.      test
2ac80 63 61 73 65 28 20 78 3d 3d 42 4d 53 2d 31 20 29  case( x==BMS-1 )
2ac90 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
2aca0 28 20 78 3d 3d 42 4d 53 2d 32 20 29 3b 0a 20 20  ( x==BMS-2 );.  
2acb0 20 20 20 20 69 66 28 20 78 3c 42 4d 53 2d 31 20      if( x<BMS-1 
2acc0 29 20 6d 20 7c 3d 20 4d 41 53 4b 42 49 54 28 78  ) m |= MASKBIT(x
2acd0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
2ace0 65 74 75 72 6e 20 6d 3b 0a 7d 0a 0a 2f 2a 20 43  eturn m;.}../* C
2acf0 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 61  heck to see if a
2ad00 20 70 61 72 74 69 61 6c 20 69 6e 64 65 78 20 77   partial index w
2ad10 69 74 68 20 70 50 61 72 74 49 6e 64 65 78 57 68  ith pPartIndexWh
2ad20 65 72 65 20 63 61 6e 20 62 65 20 75 73 65 64 0a  ere can be used.
2ad30 2a 2a 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e  ** in the curren
2ad40 74 20 71 75 65 72 79 2e 20 20 52 65 74 75 72 6e  t query.  Return
2ad50 20 74 72 75 65 20 69 66 20 69 74 20 63 61 6e 20   true if it can 
2ad60 62 65 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20  be and false if 
2ad70 6e 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  not..*/.static i
2ad80 6e 74 20 77 68 65 72 65 55 73 61 62 6c 65 50 61  nt whereUsablePa
2ad90 72 74 69 61 6c 49 6e 64 65 78 28 69 6e 74 20 69  rtialIndex(int i
2ada0 54 61 62 2c 20 57 68 65 72 65 43 6c 61 75 73 65  Tab, WhereClause
2adb0 20 2a 70 57 43 2c 20 45 78 70 72 20 2a 70 57 68   *pWC, Expr *pWh
2adc0 65 72 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ere){.  int i;. 
2add0 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
2ade0 6d 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 54  m;.  for(i=0, pT
2adf0 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c 70 57  erm=pWC->a; i<pW
2ae00 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c 20 70  C->nTerm; i++, p
2ae10 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28  Term++){.    if(
2ae20 20 73 71 6c 69 74 65 33 45 78 70 72 49 6d 70 6c   sqlite3ExprImpl
2ae30 69 65 73 45 78 70 72 28 70 54 65 72 6d 2d 3e 70  iesExpr(pTerm->p
2ae40 45 78 70 72 2c 20 70 57 68 65 72 65 2c 20 69 54  Expr, pWhere, iT
2ae50 61 62 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ab) ) return 1;.
2ae60 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
2ae70 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6c 6c  }../*.** Add all
2ae80 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63   WhereLoop objec
2ae90 74 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20  ts for a single 
2aea0 74 61 62 6c 65 20 6f 66 20 74 68 65 20 6a 6f 69  table of the joi
2aeb0 6e 20 77 68 65 72 65 20 74 68 65 20 74 61 62 6c  n where the tabl
2aec0 65 0a 2a 2a 20 69 73 20 69 64 65 6e 66 69 65 64  e.** is idenfied
2aed0 20 62 79 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e   by pBuilder->pN
2aee0 65 77 2d 3e 69 54 61 62 2e 20 20 54 68 61 74 20  ew->iTab.  That 
2aef0 74 61 62 6c 65 20 69 73 20 67 75 61 72 61 6e 74  table is guarant
2af00 65 65 64 20 74 6f 20 62 65 0a 2a 2a 20 61 20 62  eed to be.** a b
2af10 2d 74 72 65 65 20 74 61 62 6c 65 2c 20 6e 6f 74  -tree table, not
2af20 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65   a virtual table
2af30 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 73 74  ..**.** The cost
2af40 73 20 28 57 68 65 72 65 4c 6f 6f 70 2e 72 52 75  s (WhereLoop.rRu
2af50 6e 29 20 6f 66 20 74 68 65 20 62 2d 74 72 65 65  n) of the b-tree
2af60 20 6c 6f 6f 70 73 20 61 64 64 65 64 20 62 79 20   loops added by 
2af70 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  this function.**
2af80 20 61 72 65 20 63 61 6c 63 75 6c 61 74 65 64 20   are calculated 
2af90 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
2afa0 2a 20 46 6f 72 20 61 20 66 75 6c 6c 20 73 63 61  * For a full sca
2afb0 6e 2c 20 61 73 73 75 6d 69 6e 67 20 74 68 65 20  n, assuming the 
2afc0 74 61 62 6c 65 20 28 6f 72 20 69 6e 64 65 78 29  table (or index)
2afd0 20 63 6f 6e 74 61 69 6e 73 20 6e 52 6f 77 20 72   contains nRow r
2afe0 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 63  ows:.**.**     c
2aff0 6f 73 74 20 3d 20 6e 52 6f 77 20 2a 20 33 2e 30  ost = nRow * 3.0
2b000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b010 20 20 20 20 2f 2f 20 66 75 6c 6c 2d 74 61 62 6c      // full-tabl
2b020 65 20 73 63 61 6e 0a 2a 2a 20 20 20 20 20 63 6f  e scan.**     co
2b030 73 74 20 3d 20 6e 52 6f 77 20 2a 20 4b 20 20 20  st = nRow * K   
2b040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b050 20 20 20 2f 2f 20 73 63 61 6e 20 6f 66 20 63 6f     // scan of co
2b060 76 65 72 69 6e 67 20 69 6e 64 65 78 0a 2a 2a 20  vering index.** 
2b070 20 20 20 20 63 6f 73 74 20 3d 20 6e 52 6f 77 20      cost = nRow 
2b080 2a 20 28 4b 2b 33 2e 30 29 20 20 20 20 20 20 20  * (K+3.0)       
2b090 20 20 20 20 20 20 20 20 20 2f 2f 20 73 63 61 6e           // scan
2b0a0 20 6f 66 20 6e 6f 6e 2d 63 6f 76 65 72 69 6e 67   of non-covering
2b0b0 20 69 6e 64 65 78 0a 2a 2a 0a 2a 2a 20 77 68 65   index.**.** whe
2b0c0 72 65 20 4b 20 69 73 20 61 20 76 61 6c 75 65 20  re K is a value 
2b0d0 62 65 74 77 65 65 6e 20 31 2e 31 20 61 6e 64 20  between 1.1 and 
2b0e0 33 2e 30 20 73 65 74 20 62 61 73 65 64 20 6f 6e  3.0 set based on
2b0f0 20 74 68 65 20 72 65 6c 61 74 69 76 65 20 0a 2a   the relative .*
2b100 2a 20 65 73 74 69 6d 61 74 65 64 20 61 76 65 72  * estimated aver
2b110 61 67 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  age size of the 
2b120 69 6e 64 65 78 20 61 6e 64 20 74 61 62 6c 65 20  index and table 
2b130 72 65 63 6f 72 64 73 2e 0a 2a 2a 0a 2a 2a 20 46  records..**.** F
2b140 6f 72 20 61 6e 20 69 6e 64 65 78 20 73 63 61 6e  or an index scan
2b150 2c 20 77 68 65 72 65 20 6e 56 69 73 69 74 20 69  , where nVisit i
2b160 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
2b170 69 6e 64 65 78 20 72 6f 77 73 20 76 69 73 69 74  index rows visit
2b180 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 73 63 61  ed.** by the sca
2b190 6e 2c 20 61 6e 64 20 6e 53 65 65 6b 20 69 73 20  n, and nSeek is 
2b1a0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 65  the number of se
2b1b0 65 6b 20 6f 70 65 72 61 74 69 6f 6e 73 20 72 65  ek operations re
2b1c0 71 75 69 72 65 64 20 6f 6e 20 0a 2a 2a 20 74 68  quired on .** th
2b1d0 65 20 69 6e 64 65 78 20 62 2d 74 72 65 65 3a 0a  e index b-tree:.
2b1e0 2a 2a 0a 2a 2a 20 20 20 20 20 63 6f 73 74 20 3d  **.**     cost =
2b1f0 20 6e 53 65 65 6b 20 2a 20 28 6c 6f 67 28 6e 52   nSeek * (log(nR
2b200 6f 77 29 20 2b 20 4b 20 2a 20 6e 56 69 73 69 74  ow) + K * nVisit
2b210 29 20 20 20 20 20 20 20 20 20 20 2f 2f 20 63 6f  )          // co
2b220 76 65 72 69 6e 67 20 69 6e 64 65 78 0a 2a 2a 20  vering index.** 
2b230 20 20 20 20 63 6f 73 74 20 3d 20 6e 53 65 65 6b      cost = nSeek
2b240 20 2a 20 28 6c 6f 67 28 6e 52 6f 77 29 20 2b 20   * (log(nRow) + 
2b250 28 4b 2b 33 2e 30 29 20 2a 20 6e 56 69 73 69 74  (K+3.0) * nVisit
2b260 29 20 20 20 20 2f 2f 20 6e 6f 6e 2d 63 6f 76 65  )    // non-cove
2b270 72 69 6e 67 20 69 6e 64 65 78 0a 2a 2a 0a 2a 2a  ring index.**.**
2b280 20 4e 6f 72 6d 61 6c 6c 79 2c 20 6e 53 65 65 6b   Normally, nSeek
2b290 20 69 73 20 31 2e 20 6e 53 65 65 6b 20 76 61 6c   is 1. nSeek val
2b2a0 75 65 73 20 67 72 65 61 74 65 72 20 74 68 61 6e  ues greater than
2b2b0 20 31 20 63 6f 6d 65 20 61 62 6f 75 74 20 69 66   1 come about if
2b2c0 20 74 68 65 20 0a 2a 2a 20 57 48 45 52 45 20 63   the .** WHERE c
2b2d0 6c 61 75 73 65 20 69 6e 63 6c 75 64 65 73 20 22  lause includes "
2b2e0 78 20 49 4e 20 28 2e 2e 2e 2e 29 22 20 74 65 72  x IN (....)" ter
2b2f0 6d 73 20 75 73 65 64 20 69 6e 20 70 6c 61 63 65  ms used in place
2b300 20 6f 66 20 22 78 3d 3f 22 2e 20 4f 72 20 77 68   of "x=?". Or wh
2b310 65 6e 20 0a 2a 2a 20 69 6d 70 6c 69 63 69 74 20  en .** implicit 
2b320 22 78 20 49 4e 20 28 53 45 4c 45 43 54 20 78 20  "x IN (SELECT x 
2b330 46 52 4f 4d 20 74 62 6c 29 22 20 74 65 72 6d 73  FROM tbl)" terms
2b340 20 61 72 65 20 61 64 64 65 64 20 66 6f 72 20 73   are added for s
2b350 6b 69 70 2d 73 63 61 6e 73 2e 0a 2a 2a 0a 2a 2a  kip-scans..**.**
2b360 20 54 68 65 20 65 73 74 69 6d 61 74 65 64 20 76   The estimated v
2b370 61 6c 75 65 73 20 28 6e 52 6f 77 2c 20 6e 56 69  alues (nRow, nVi
2b380 73 69 74 2c 20 6e 53 65 65 6b 29 20 6f 66 74 65  sit, nSeek) ofte
2b390 6e 20 63 6f 6e 74 61 69 6e 20 61 20 6c 61 72 67  n contain a larg
2b3a0 65 20 61 6d 6f 75 6e 74 0a 2a 2a 20 6f 66 20 75  e amount.** of u
2b3b0 6e 63 65 72 74 61 69 6e 74 79 2e 20 20 46 6f 72  ncertainty.  For
2b3c0 20 74 68 69 73 20 72 65 61 73 6f 6e 2c 20 73 63   this reason, sc
2b3d0 6f 72 69 6e 67 20 69 73 20 64 65 73 69 67 6e 65  oring is designe
2b3e0 64 20 74 6f 20 70 69 63 6b 20 70 6c 61 6e 73 20  d to pick plans 
2b3f0 74 68 61 74 0a 2a 2a 20 22 64 6f 20 74 68 65 20  that.** "do the 
2b400 6c 65 61 73 74 20 68 61 72 6d 22 20 69 66 20 74  least harm" if t
2b410 68 65 20 65 73 74 69 6d 61 74 65 73 20 61 72 65  he estimates are
2b420 20 69 6e 61 63 63 75 72 61 74 65 2e 20 20 46 6f   inaccurate.  Fo
2b430 72 20 65 78 61 6d 70 6c 65 2c 20 61 0a 2a 2a 20  r example, a.** 
2b440 6c 6f 67 28 6e 52 6f 77 29 20 66 61 63 74 6f 72  log(nRow) factor
2b450 20 69 73 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d   is omitted from
2b460 20 61 20 6e 6f 6e 2d 63 6f 76 65 72 69 6e 67 20   a non-covering 
2b470 69 6e 64 65 78 20 73 63 61 6e 20 69 6e 20 6f 72  index scan in or
2b480 64 65 72 20 74 6f 0a 2a 2a 20 62 69 61 73 20 74  der to.** bias t
2b490 68 65 20 73 63 6f 72 69 6e 67 20 69 6e 20 66 61  he scoring in fa
2b4a0 76 6f 72 20 6f 66 20 75 73 69 6e 67 20 61 6e 20  vor of using an 
2b4b0 69 6e 64 65 78 2c 20 73 69 6e 63 65 20 74 68 65  index, since the
2b4c0 20 77 6f 72 73 74 2d 63 61 73 65 0a 2a 2a 20 70   worst-case.** p
2b4d0 65 72 66 6f 72 6d 61 6e 63 65 20 6f 66 20 75 73  erformance of us
2b4e0 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 69 73 20  ing an index is 
2b4f0 66 61 72 20 62 65 74 74 65 72 20 74 68 61 6e 20  far better than 
2b500 74 68 65 20 77 6f 72 73 74 2d 63 61 73 65 20 70  the worst-case p
2b510 65 72 66 6f 72 6d 61 6e 63 65 0a 2a 2a 20 6f 66  erformance.** of
2b520 20 61 20 66 75 6c 6c 20 74 61 62 6c 65 20 73 63   a full table sc
2b530 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  an..*/.static in
2b540 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74  t whereLoopAddBt
2b550 72 65 65 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70  ree(.  WhereLoop
2b560 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65  Builder *pBuilde
2b570 72 2c 20 2f 2a 20 57 48 45 52 45 20 63 6c 61 75  r, /* WHERE clau
2b580 73 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a  se information *
2b590 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6d 45 78 74  /.  Bitmask mExt
2b5a0 72 61 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ra              
2b5b0 2f 2a 20 45 78 74 72 61 20 70 72 65 72 65 71 75  /* Extra prerequ
2b5c0 65 73 69 74 65 73 20 66 6f 72 20 75 73 69 6e 67  esites for using
2b5d0 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 29   this table */.)
2b5e0 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  {.  WhereInfo *p
2b5f0 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20  WInfo;          
2b600 2f 2a 20 57 48 45 52 45 20 61 6e 61 6c 79 73 69  /* WHERE analysi
2b610 73 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 49  s context */.  I
2b620 6e 64 65 78 20 2a 70 50 72 6f 62 65 3b 20 20 20  ndex *pProbe;   
2b630 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e             /* An
2b640 20 69 6e 64 65 78 20 77 65 20 61 72 65 20 65 76   index we are ev
2b650 61 6c 75 61 74 69 6e 67 20 2a 2f 0a 20 20 49 6e  aluating */.  In
2b660 64 65 78 20 73 50 6b 3b 20 20 20 20 20 20 20 20  dex sPk;        
2b670 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 66            /* A f
2b680 61 6b 65 20 69 6e 64 65 78 20 6f 62 6a 65 63 74  ake index object
2b690 20 66 6f 72 20 74 68 65 20 70 72 69 6d 61 72 79   for the primary
2b6a0 20 6b 65 79 20 2a 2f 0a 20 20 4c 6f 67 45 73 74   key */.  LogEst
2b6b0 20 61 69 52 6f 77 45 73 74 50 6b 5b 32 5d 3b 20   aiRowEstPk[2]; 
2b6c0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61 69 52        /* The aiR
2b6d0 6f 77 4c 6f 67 45 73 74 5b 5d 20 76 61 6c 75 65  owLogEst[] value
2b6e0 20 66 6f 72 20 74 68 65 20 73 50 6b 20 69 6e 64   for the sPk ind
2b6f0 65 78 20 2a 2f 0a 20 20 69 31 36 20 61 69 43 6f  ex */.  i16 aiCo
2b700 6c 75 6d 6e 50 6b 20 3d 20 2d 31 3b 20 20 20 20  lumnPk = -1;    
2b710 20 20 20 20 2f 2a 20 54 68 65 20 61 43 6f 6c 75      /* The aColu
2b720 6d 6e 5b 5d 20 76 61 6c 75 65 20 66 6f 72 20 74  mn[] value for t
2b730 68 65 20 73 50 6b 20 69 6e 64 65 78 20 2a 2f 0a  he sPk index */.
2b740 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
2b750 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ist;          /*
2b760 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   The FROM clause
2b770 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63   */.  struct Src
2b780 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 3b  List_item *pSrc;
2b790 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c    /* The FROM cl
2b7a0 61 75 73 65 20 62 74 72 65 65 20 74 65 72 6d 20  ause btree term 
2b7b0 74 6f 20 61 64 64 20 2a 2f 0a 20 20 57 68 65 72  to add */.  Wher
2b7c0 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 20 20 20 20  eLoop *pNew;    
2b7d0 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6c          /* Templ
2b7e0 61 74 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62  ate WhereLoop ob
2b7f0 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ject */.  int rc
2b800 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
2b810 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
2b820 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 53  code */.  int iS
2b830 6f 72 74 49 64 78 20 3d 20 31 3b 20 20 20 20 20  ortIdx = 1;     
2b840 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6e        /* Index n
2b850 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20 62  umber */.  int b
2b860 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2b870 20 20 20 20 20 20 20 2f 2a 20 41 20 62 6f 6f 6c         /* A bool
2b880 65 61 6e 20 76 61 6c 75 65 20 2a 2f 0a 20 20 4c  ean value */.  L
2b890 6f 67 45 73 74 20 72 53 69 7a 65 3b 20 20 20 20  ogEst rSize;    
2b8a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6e 75             /* nu
2b8b0 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20  mber of rows in 
2b8c0 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 4c  the table */.  L
2b8d0 6f 67 45 73 74 20 72 4c 6f 67 53 69 7a 65 3b 20  ogEst rLogSize; 
2b8e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
2b8f0 67 61 72 69 74 68 6d 20 6f 66 20 74 68 65 20 6e  garithm of the n
2b900 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e  umber of rows in
2b910 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20   the table */.  
2b920 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
2b930 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ;           /* T
2b940 68 65 20 70 61 72 73 65 64 20 57 48 45 52 45 20  he parsed WHERE 
2b950 63 6c 61 75 73 65 20 2a 2f 0a 20 20 54 61 62 6c  clause */.  Tabl
2b960 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20  e *pTab;        
2b970 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
2b980 20 62 65 69 6e 67 20 71 75 65 72 69 65 64 20 2a   being queried *
2b990 2f 0a 20 20 0a 20 20 70 4e 65 77 20 3d 20 70 42  /.  .  pNew = pB
2b9a0 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20  uilder->pNew;.  
2b9b0 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65  pWInfo = pBuilde
2b9c0 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 70 54 61  r->pWInfo;.  pTa
2b9d0 62 4c 69 73 74 20 3d 20 70 57 49 6e 66 6f 2d 3e  bList = pWInfo->
2b9e0 70 54 61 62 4c 69 73 74 3b 0a 20 20 70 53 72 63  pTabList;.  pSrc
2b9f0 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 20 2b   = pTabList->a +
2ba00 20 70 4e 65 77 2d 3e 69 54 61 62 3b 0a 20 20 70   pNew->iTab;.  p
2ba10 54 61 62 20 3d 20 70 53 72 63 2d 3e 70 54 61 62  Tab = pSrc->pTab
2ba20 3b 0a 20 20 70 57 43 20 3d 20 70 42 75 69 6c 64  ;.  pWC = pBuild
2ba30 65 72 2d 3e 70 57 43 3b 0a 20 20 61 73 73 65 72  er->pWC;.  asser
2ba40 74 28 20 21 49 73 56 69 72 74 75 61 6c 28 70 53  t( !IsVirtual(pS
2ba50 72 63 2d 3e 70 54 61 62 29 20 29 3b 0a 0a 20 20  rc->pTab) );..  
2ba60 69 66 28 20 70 53 72 63 2d 3e 70 49 6e 64 65 78  if( pSrc->pIndex
2ba70 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6e 20 49 4e   ){.    /* An IN
2ba80 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 20  DEXED BY clause 
2ba90 73 70 65 63 69 66 69 65 73 20 61 20 70 61 72 74  specifies a part
2baa0 69 63 75 6c 61 72 20 69 6e 64 65 78 20 74 6f 20  icular index to 
2bab0 75 73 65 20 2a 2f 0a 20 20 20 20 70 50 72 6f 62  use */.    pProb
2bac0 65 20 3d 20 70 53 72 63 2d 3e 70 49 6e 64 65 78  e = pSrc->pIndex
2bad0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 48  ;.  }else if( !H
2bae0 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 29 7b  asRowid(pTab) ){
2baf0 0a 20 20 20 20 70 50 72 6f 62 65 20 3d 20 70 54  .    pProbe = pT
2bb00 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 7d 65  ab->pIndex;.  }e
2bb10 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72  lse{.    /* Ther
2bb20 65 20 69 73 20 6e 6f 20 49 4e 44 45 58 45 44 20  e is no INDEXED 
2bb30 42 59 20 63 6c 61 75 73 65 2e 20 20 43 72 65 61  BY clause.  Crea
2bb40 74 65 20 61 20 66 61 6b 65 20 49 6e 64 65 78 20  te a fake Index 
2bb50 6f 62 6a 65 63 74 20 69 6e 20 6c 6f 63 61 6c 0a  object in local.
2bb60 20 20 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 20      ** variable 
2bb70 73 50 6b 20 74 6f 20 72 65 70 72 65 73 65 6e 74  sPk to represent
2bb80 20 74 68 65 20 72 6f 77 69 64 20 70 72 69 6d 61   the rowid prima
2bb90 72 79 20 6b 65 79 20 69 6e 64 65 78 2e 20 20 4d  ry key index.  M
2bba0 61 6b 65 20 74 68 69 73 0a 20 20 20 20 2a 2a 20  ake this.    ** 
2bbb0 66 61 6b 65 20 69 6e 64 65 78 20 74 68 65 20 66  fake index the f
2bbc0 69 72 73 74 20 69 6e 20 61 20 63 68 61 69 6e 20  irst in a chain 
2bbd0 6f 66 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 73  of Index objects
2bbe0 20 77 69 74 68 20 61 6c 6c 20 6f 66 20 74 68 65   with all of the
2bbf0 20 72 65 61 6c 0a 20 20 20 20 2a 2a 20 69 6e 64   real.    ** ind
2bc00 69 63 65 73 20 74 6f 20 66 6f 6c 6c 6f 77 20 2a  ices to follow *
2bc10 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 46 69  /.    Index *pFi
2bc20 72 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  rst;            
2bc30 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 6f        /* First o
2bc40 66 20 72 65 61 6c 20 69 6e 64 69 63 65 73 20 6f  f real indices o
2bc50 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20  n the table */. 
2bc60 20 20 20 6d 65 6d 73 65 74 28 26 73 50 6b 2c 20     memset(&sPk, 
2bc70 30 2c 20 73 69 7a 65 6f 66 28 49 6e 64 65 78 29  0, sizeof(Index)
2bc80 29 3b 0a 20 20 20 20 73 50 6b 2e 6e 4b 65 79 43  );.    sPk.nKeyC
2bc90 6f 6c 20 3d 20 31 3b 0a 20 20 20 20 73 50 6b 2e  ol = 1;.    sPk.
2bca0 6e 43 6f 6c 75 6d 6e 20 3d 20 31 3b 0a 20 20 20  nColumn = 1;.   
2bcb0 20 73 50 6b 2e 61 69 43 6f 6c 75 6d 6e 20 3d 20   sPk.aiColumn = 
2bcc0 26 61 69 43 6f 6c 75 6d 6e 50 6b 3b 0a 20 20 20  &aiColumnPk;.   
2bcd0 20 73 50 6b 2e 61 69 52 6f 77 4c 6f 67 45 73 74   sPk.aiRowLogEst
2bce0 20 3d 20 61 69 52 6f 77 45 73 74 50 6b 3b 0a 20   = aiRowEstPk;. 
2bcf0 20 20 20 73 50 6b 2e 6f 6e 45 72 72 6f 72 20 3d     sPk.onError =
2bd00 20 4f 45 5f 52 65 70 6c 61 63 65 3b 0a 20 20 20   OE_Replace;.   
2bd10 20 73 50 6b 2e 70 54 61 62 6c 65 20 3d 20 70 54   sPk.pTable = pT
2bd20 61 62 3b 0a 20 20 20 20 73 50 6b 2e 73 7a 49 64  ab;.    sPk.szId
2bd30 78 52 6f 77 20 3d 20 70 54 61 62 2d 3e 73 7a 54  xRow = pTab->szT
2bd40 61 62 52 6f 77 3b 0a 20 20 20 20 61 69 52 6f 77  abRow;.    aiRow
2bd50 45 73 74 50 6b 5b 30 5d 20 3d 20 70 54 61 62 2d  EstPk[0] = pTab-
2bd60 3e 6e 52 6f 77 4c 6f 67 45 73 74 3b 0a 20 20 20  >nRowLogEst;.   
2bd70 20 61 69 52 6f 77 45 73 74 50 6b 5b 31 5d 20 3d   aiRowEstPk[1] =
2bd80 20 30 3b 0a 20 20 20 20 70 46 69 72 73 74 20 3d   0;.    pFirst =
2bd90 20 70 53 72 63 2d 3e 70 54 61 62 2d 3e 70 49 6e   pSrc->pTab->pIn
2bda0 64 65 78 3b 0a 20 20 20 20 69 66 28 20 70 53 72  dex;.    if( pSr
2bdb0 63 2d 3e 6e 6f 74 49 6e 64 65 78 65 64 3d 3d 30  c->notIndexed==0
2bdc0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65   ){.      /* The
2bdd0 20 72 65 61 6c 20 69 6e 64 69 63 65 73 20 6f 66   real indices of
2bde0 20 74 68 65 20 74 61 62 6c 65 20 61 72 65 20 6f   the table are o
2bdf0 6e 6c 79 20 63 6f 6e 73 69 64 65 72 65 64 20 69  nly considered i
2be00 66 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 4e  f the.      ** N
2be10 4f 54 20 49 4e 44 45 58 45 44 20 71 75 61 6c 69  OT INDEXED quali
2be20 66 69 65 72 20 69 73 20 6f 6d 69 74 74 65 64 20  fier is omitted 
2be30 66 72 6f 6d 20 74 68 65 20 46 52 4f 4d 20 63 6c  from the FROM cl
2be40 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 73 50  ause */.      sP
2be50 6b 2e 70 4e 65 78 74 20 3d 20 70 46 69 72 73 74  k.pNext = pFirst
2be60 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 72 6f  ;.    }.    pPro
2be70 62 65 20 3d 20 26 73 50 6b 3b 0a 20 20 7d 0a 20  be = &sPk;.  }. 
2be80 20 72 53 69 7a 65 20 3d 20 70 54 61 62 2d 3e 6e   rSize = pTab->n
2be90 52 6f 77 4c 6f 67 45 73 74 3b 0a 20 20 72 4c 6f  RowLogEst;.  rLo
2bea0 67 53 69 7a 65 20 3d 20 65 73 74 4c 6f 67 28 72  gSize = estLog(r
2beb0 53 69 7a 65 29 3b 0a 0a 23 69 66 6e 64 65 66 20  Size);..#ifndef 
2bec0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
2bed0 4d 41 54 49 43 5f 49 4e 44 45 58 0a 20 20 2f 2a  MATIC_INDEX.  /*
2bee0 20 41 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78   Automatic index
2bef0 65 73 20 2a 2f 0a 20 20 69 66 28 20 21 70 42 75  es */.  if( !pBu
2bf00 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 0a 20 20  ilder->pOrSet.  
2bf10 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 70 50 61   && (pWInfo->pPa
2bf20 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26  rse->db->flags &
2bf30 20 53 51 4c 49 54 45 5f 41 75 74 6f 49 6e 64 65   SQLITE_AutoInde
2bf40 78 29 21 3d 30 0a 20 20 20 26 26 20 70 53 72 63  x)!=0.   && pSrc
2bf50 2d 3e 70 49 6e 64 65 78 3d 3d 30 0a 20 20 20 26  ->pIndex==0.   &
2bf60 26 20 21 70 53 72 63 2d 3e 76 69 61 43 6f 72 6f  & !pSrc->viaCoro
2bf70 75 74 69 6e 65 0a 20 20 20 26 26 20 21 70 53 72  utine.   && !pSr
2bf80 63 2d 3e 6e 6f 74 49 6e 64 65 78 65 64 0a 20 20  c->notIndexed.  
2bf90 20 26 26 20 48 61 73 52 6f 77 69 64 28 70 54 61   && HasRowid(pTa
2bfa0 62 29 0a 20 20 20 26 26 20 21 70 53 72 63 2d 3e  b).   && !pSrc->
2bfb0 69 73 43 6f 72 72 65 6c 61 74 65 64 0a 20 20 20  isCorrelated.   
2bfc0 26 26 20 21 70 53 72 63 2d 3e 69 73 52 65 63 75  && !pSrc->isRecu
2bfd0 72 73 69 76 65 0a 20 20 29 7b 0a 20 20 20 20 2f  rsive.  ){.    /
2bfe0 2a 20 47 65 6e 65 72 61 74 65 20 61 75 74 6f 2d  * Generate auto-
2bff0 69 6e 64 65 78 20 57 68 65 72 65 4c 6f 6f 70 73  index WhereLoops
2c000 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 54 65 72   */.    WhereTer
2c010 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 20 20 57 68  m *pTerm;.    Wh
2c020 65 72 65 54 65 72 6d 20 2a 70 57 43 45 6e 64 20  ereTerm *pWCEnd 
2c030 3d 20 70 57 43 2d 3e 61 20 2b 20 70 57 43 2d 3e  = pWC->a + pWC->
2c040 6e 54 65 72 6d 3b 0a 20 20 20 20 66 6f 72 28 70  nTerm;.    for(p
2c050 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 72 63 3d  Term=pWC->a; rc=
2c060 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 54  =SQLITE_OK && pT
2c070 65 72 6d 3c 70 57 43 45 6e 64 3b 20 70 54 65 72  erm<pWCEnd; pTer
2c080 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  m++){.      if( 
2c090 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
2c0a0 68 74 20 26 20 70 4e 65 77 2d 3e 6d 61 73 6b 53  ht & pNew->maskS
2c0b0 65 6c 66 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  elf ) continue;.
2c0c0 20 20 20 20 20 20 69 66 28 20 74 65 72 6d 43 61        if( termCa
2c0d0 6e 44 72 69 76 65 49 6e 64 65 78 28 70 54 65 72  nDriveIndex(pTer
2c0e0 6d 2c 20 70 53 72 63 2c 20 30 29 20 29 7b 0a 20  m, pSrc, 0) ){. 
2c0f0 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62         pNew->u.b
2c100 74 72 65 65 2e 6e 45 71 20 3d 20 31 3b 0a 20 20  tree.nEq = 1;.  
2c110 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 53 6b 69        pNew->nSki
2c120 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70  p = 0;.        p
2c130 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  New->u.btree.pIn
2c140 64 65 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  dex = 0;.       
2c150 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20   pNew->nLTerm = 
2c160 31 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  1;.        pNew-
2c170 3e 61 4c 54 65 72 6d 5b 30 5d 20 3d 20 70 54 65  >aLTerm[0] = pTe
2c180 72 6d 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54  rm;.        /* T
2c190 55 4e 49 4e 47 3a 20 4f 6e 65 2d 74 69 6d 65 20  UNING: One-time 
2c1a0 63 6f 73 74 20 66 6f 72 20 63 6f 6d 70 75 74 69  cost for computi
2c1b0 6e 67 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63  ng the automatic
2c1c0 20 69 6e 64 65 78 20 69 73 0a 20 20 20 20 20 20   index is.      
2c1d0 20 20 2a 2a 20 65 73 74 69 6d 61 74 65 64 20 74    ** estimated t
2c1e0 6f 20 62 65 20 58 2a 4e 2a 6c 6f 67 32 28 4e 29  o be X*N*log2(N)
2c1f0 20 77 68 65 72 65 20 4e 20 69 73 20 74 68 65 20   where N is the 
2c200 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69  number of rows i
2c210 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  n.        ** the
2c220 20 74 61 62 6c 65 20 62 65 69 6e 67 20 69 6e 64   table being ind
2c230 65 78 65 64 20 61 6e 64 20 77 68 65 72 65 20 58  exed and where X
2c240 20 69 73 20 37 20 28 4c 6f 67 45 73 74 3d 32 38   is 7 (LogEst=28
2c250 29 20 66 6f 72 20 6e 6f 72 6d 61 6c 0a 20 20 20  ) for normal.   
2c260 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 73 20 6f       ** tables o
2c270 72 20 31 2e 33 37 35 20 28 4c 6f 67 45 73 74 3d  r 1.375 (LogEst=
2c280 34 29 20 66 6f 72 20 76 69 65 77 73 20 61 6e 64  4) for views and
2c290 20 73 75 62 71 75 65 72 69 65 73 2e 20 20 54 68   subqueries.  Th
2c2a0 65 20 76 61 6c 75 65 0a 20 20 20 20 20 20 20 20  e value.        
2c2b0 2a 2a 20 6f 66 20 58 20 69 73 20 73 6d 61 6c 6c  ** of X is small
2c2c0 65 72 20 66 6f 72 20 76 69 65 77 73 20 61 6e 64  er for views and
2c2d0 20 73 75 62 71 75 65 72 69 65 73 20 73 6f 20 74   subqueries so t
2c2e0 68 61 74 20 74 68 65 20 71 75 65 72 79 20 70 6c  hat the query pl
2c2f0 61 6e 6e 65 72 0a 20 20 20 20 20 20 20 20 2a 2a  anner.        **
2c300 20 77 69 6c 6c 20 62 65 20 6d 6f 72 65 20 61 67   will be more ag
2c310 67 72 65 73 73 69 76 65 20 61 62 6f 75 74 20 67  gressive about g
2c320 65 6e 65 72 61 74 69 6e 67 20 61 75 74 6f 6d 61  enerating automa
2c330 74 69 63 20 69 6e 64 65 78 65 73 20 66 6f 72 0a  tic indexes for.
2c340 20 20 20 20 20 20 20 20 2a 2a 20 74 68 6f 73 65          ** those
2c350 20 6f 62 6a 65 63 74 73 2c 20 73 69 6e 63 65 20   objects, since 
2c360 74 68 65 72 65 20 69 73 20 6e 6f 20 6f 70 70 6f  there is no oppo
2c370 72 74 75 6e 69 74 79 20 74 6f 20 61 64 64 20 73  rtunity to add s
2c380 63 68 65 6d 61 0a 20 20 20 20 20 20 20 20 2a 2a  chema.        **
2c390 20 69 6e 64 65 78 65 73 20 6f 6e 20 73 75 62 71   indexes on subq
2c3a0 75 65 72 69 65 73 20 61 6e 64 20 76 69 65 77 73  ueries and views
2c3b0 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65  . */.        pNe
2c3c0 77 2d 3e 72 53 65 74 75 70 20 3d 20 72 4c 6f 67  w->rSetup = rLog
2c3d0 53 69 7a 65 20 2b 20 72 53 69 7a 65 20 2b 20 34  Size + rSize + 4
2c3e0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54  ;.        if( pT
2c3f0 61 62 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 26  ab->pSelect==0 &
2c400 26 20 28 70 54 61 62 2d 3e 74 61 62 46 6c 61 67  & (pTab->tabFlag
2c410 73 20 26 20 54 46 5f 45 70 68 65 6d 65 72 61 6c  s & TF_Ephemeral
2c420 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
2c430 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 2b    pNew->rSetup +
2c440 3d 20 32 34 3b 0a 20 20 20 20 20 20 20 20 7d 0a  = 24;.        }.
2c450 20 20 20 20 20 20 20 20 41 70 70 6c 79 43 6f 73          ApplyCos
2c460 74 4d 75 6c 74 69 70 6c 69 65 72 28 70 4e 65 77  tMultiplier(pNew
2c470 2d 3e 72 53 65 74 75 70 2c 20 70 54 61 62 2d 3e  ->rSetup, pTab->
2c480 63 6f 73 74 4d 75 6c 74 29 3b 0a 20 20 20 20 20  costMult);.     
2c490 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 45 61     /* TUNING: Ea
2c4a0 63 68 20 69 6e 64 65 78 20 6c 6f 6f 6b 75 70 20  ch index lookup 
2c4b0 79 69 65 6c 64 73 20 32 30 20 72 6f 77 73 20 69  yields 20 rows i
2c4c0 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20 54 68  n the table.  Th
2c4d0 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73  is.        ** is
2c4e0 20 6d 6f 72 65 20 74 68 61 6e 20 74 68 65 20 75   more than the u
2c4f0 73 75 61 6c 20 67 75 65 73 73 20 6f 66 20 31 30  sual guess of 10
2c500 20 72 6f 77 73 2c 20 73 69 6e 63 65 20 77 65 20   rows, since we 
2c510 68 61 76 65 20 6e 6f 20 77 61 79 0a 20 20 20 20  have no way.    
2c520 20 20 20 20 2a 2a 20 6f 66 20 6b 6e 6f 77 69 6e      ** of knowin
2c530 67 20 68 6f 77 20 73 65 6c 65 63 74 69 76 65 20  g how selective 
2c540 74 68 65 20 69 6e 64 65 78 20 77 69 6c 6c 20 75  the index will u
2c550 6c 74 69 6d 61 74 65 6c 79 20 62 65 2e 20 20 49  ltimately be.  I
2c560 74 20 77 6f 75 6c 64 0a 20 20 20 20 20 20 20 20  t would.        
2c570 2a 2a 20 6e 6f 74 20 62 65 20 75 6e 72 65 61 73  ** not be unreas
2c580 6f 6e 61 62 6c 65 20 74 6f 20 6d 61 6b 65 20 74  onable to make t
2c590 68 69 73 20 76 61 6c 75 65 20 6d 75 63 68 20 6c  his value much l
2c5a0 61 72 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  arger. */.      
2c5b0 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 34    pNew->nOut = 4
2c5c0 33 3b 20 20 61 73 73 65 72 74 28 20 34 33 3d 3d  3;  assert( 43==
2c5d0 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 32 30  sqlite3LogEst(20
2c5e0 29 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  ) );.        pNe
2c5f0 77 2d 3e 72 52 75 6e 20 3d 20 73 71 6c 69 74 65  w->rRun = sqlite
2c600 33 4c 6f 67 45 73 74 41 64 64 28 72 4c 6f 67 53  3LogEstAdd(rLogS
2c610 69 7a 65 2c 70 4e 65 77 2d 3e 6e 4f 75 74 29 3b  ize,pNew->nOut);
2c620 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 77  .        pNew->w
2c630 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 41  sFlags = WHERE_A
2c640 55 54 4f 5f 49 4e 44 45 58 3b 0a 20 20 20 20 20  UTO_INDEX;.     
2c650 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20     pNew->prereq 
2c660 3d 20 6d 45 78 74 72 61 20 7c 20 70 54 65 72 6d  = mExtra | pTerm
2c670 2d 3e 70 72 65 72 65 71 52 69 67 68 74 3b 0a 20  ->prereqRight;. 
2c680 20 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72         rc = wher
2c690 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69  eLoopInsert(pBui
2c6a0 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20  lder, pNew);.   
2c6b0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23     }.    }.  }.#
2c6c0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
2c6d0 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49  OMIT_AUTOMATIC_I
2c6e0 4e 44 45 58 20 2a 2f 0a 0a 20 20 2f 2a 20 4c 6f  NDEX */..  /* Lo
2c6f0 6f 70 20 6f 76 65 72 20 61 6c 6c 20 69 6e 64 69  op over all indi
2c700 63 65 73 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 3b  ces.  */.  for(;
2c710 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
2c720 26 20 70 50 72 6f 62 65 3b 20 70 50 72 6f 62 65  & pProbe; pProbe
2c730 3d 70 50 72 6f 62 65 2d 3e 70 4e 65 78 74 2c 20  =pProbe->pNext, 
2c740 69 53 6f 72 74 49 64 78 2b 2b 29 7b 0a 20 20 20  iSortIdx++){.   
2c750 20 69 66 28 20 70 50 72 6f 62 65 2d 3e 70 50 61   if( pProbe->pPa
2c760 72 74 49 64 78 57 68 65 72 65 21 3d 30 0a 20 20  rtIdxWhere!=0.  
2c770 20 20 20 26 26 20 21 77 68 65 72 65 55 73 61 62     && !whereUsab
2c780 6c 65 50 61 72 74 69 61 6c 49 6e 64 65 78 28 70  lePartialIndex(p
2c790 53 72 63 2d 3e 69 43 75 72 73 6f 72 2c 20 70 57  Src->iCursor, pW
2c7a0 43 2c 20 70 50 72 6f 62 65 2d 3e 70 50 61 72 74  C, pProbe->pPart
2c7b0 49 64 78 57 68 65 72 65 29 20 29 7b 0a 20 20 20  IdxWhere) ){.   
2c7c0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4e 65     testcase( pNe
2c7d0 77 2d 3e 69 54 61 62 21 3d 70 53 72 63 2d 3e 69  w->iTab!=pSrc->i
2c7e0 43 75 72 73 6f 72 20 29 3b 20 20 2f 2a 20 53 65  Cursor );  /* Se
2c7f0 65 20 74 69 63 6b 65 74 20 5b 39 38 64 39 37 33  e ticket [98d973
2c800 62 38 66 35 5d 20 2a 2f 0a 20 20 20 20 20 20 63  b8f5] */.      c
2c810 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 50 61 72  ontinue;  /* Par
2c820 74 69 61 6c 20 69 6e 64 65 78 20 69 6e 61 70 70  tial index inapp
2c830 72 6f 70 72 69 61 74 65 20 66 6f 72 20 74 68 69  ropriate for thi
2c840 73 20 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 7d  s query */.    }
2c850 0a 20 20 20 20 72 53 69 7a 65 20 3d 20 70 50 72  .    rSize = pPr
2c860 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74  obe->aiRowLogEst
2c870 5b 30 5d 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75  [0];.    pNew->u
2c880 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 30 3b 0a  .btree.nEq = 0;.
2c890 20 20 20 20 70 4e 65 77 2d 3e 6e 53 6b 69 70 20      pNew->nSkip 
2c8a0 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e  = 0;.    pNew->n
2c8b0 4c 54 65 72 6d 20 3d 20 30 3b 0a 20 20 20 20 70  LTerm = 0;.    p
2c8c0 4e 65 77 2d 3e 69 53 6f 72 74 49 64 78 20 3d 20  New->iSortIdx = 
2c8d0 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 72 53 65  0;.    pNew->rSe
2c8e0 74 75 70 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65  tup = 0;.    pNe
2c8f0 77 2d 3e 70 72 65 72 65 71 20 3d 20 6d 45 78 74  w->prereq = mExt
2c900 72 61 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4f  ra;.    pNew->nO
2c910 75 74 20 3d 20 72 53 69 7a 65 3b 0a 20 20 20 20  ut = rSize;.    
2c920 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 70 49  pNew->u.btree.pI
2c930 6e 64 65 78 20 3d 20 70 50 72 6f 62 65 3b 0a 20  ndex = pProbe;. 
2c940 20 20 20 62 20 3d 20 69 6e 64 65 78 4d 69 67 68     b = indexMigh
2c950 74 48 65 6c 70 57 69 74 68 4f 72 64 65 72 42 79  tHelpWithOrderBy
2c960 28 70 42 75 69 6c 64 65 72 2c 20 70 50 72 6f 62  (pBuilder, pProb
2c970 65 2c 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72  e, pSrc->iCursor
2c980 29 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20 4f 4e  );.    /* The ON
2c990 45 50 41 53 53 5f 44 45 53 49 52 45 44 20 66 6c  EPASS_DESIRED fl
2c9a0 61 67 73 20 6e 65 76 65 72 20 6f 63 63 75 72 73  ags never occurs
2c9b0 20 74 6f 67 65 74 68 65 72 20 77 69 74 68 20 4f   together with O
2c9c0 52 44 45 52 20 42 59 20 2a 2f 0a 20 20 20 20 61  RDER BY */.    a
2c9d0 73 73 65 72 74 28 20 28 70 57 49 6e 66 6f 2d 3e  ssert( (pWInfo->
2c9e0 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
2c9f0 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52  RE_ONEPASS_DESIR
2ca00 45 44 29 3d 3d 30 20 7c 7c 20 62 3d 3d 30 20 29  ED)==0 || b==0 )
2ca10 3b 0a 20 20 20 20 69 66 28 20 70 50 72 6f 62 65  ;.    if( pProbe
2ca20 2d 3e 74 6e 75 6d 3c 3d 30 20 29 7b 0a 20 20 20  ->tnum<=0 ){.   
2ca30 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 70 72     /* Integer pr
2ca40 69 6d 61 72 79 20 6b 65 79 20 69 6e 64 65 78 20  imary key index 
2ca50 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77  */.      pNew->w
2ca60 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 49  sFlags = WHERE_I
2ca70 50 4b 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 46 75  PK;..      /* Fu
2ca80 6c 6c 20 74 61 62 6c 65 20 73 63 61 6e 20 2a 2f  ll table scan */
2ca90 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 69 53 6f  .      pNew->iSo
2caa0 72 74 49 64 78 20 3d 20 62 20 3f 20 69 53 6f 72  rtIdx = b ? iSor
2cab0 74 49 64 78 20 3a 20 30 3b 0a 20 20 20 20 20 20  tIdx : 0;.      
2cac0 2f 2a 20 54 55 4e 49 4e 47 3a 20 43 6f 73 74 20  /* TUNING: Cost 
2cad0 6f 66 20 66 75 6c 6c 20 74 61 62 6c 65 20 73 63  of full table sc
2cae0 61 6e 20 69 73 20 28 4e 2a 33 2e 30 29 2e 20 2a  an is (N*3.0). *
2caf0 2f 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52  /.      pNew->rR
2cb00 75 6e 20 3d 20 72 53 69 7a 65 20 2b 20 31 36 3b  un = rSize + 16;
2cb10 0a 20 20 20 20 20 20 41 70 70 6c 79 43 6f 73 74  .      ApplyCost
2cb20 4d 75 6c 74 69 70 6c 69 65 72 28 70 4e 65 77 2d  Multiplier(pNew-
2cb30 3e 72 52 75 6e 2c 20 70 54 61 62 2d 3e 63 6f 73  >rRun, pTab->cos
2cb40 74 4d 75 6c 74 29 3b 0a 20 20 20 20 20 20 77 68  tMult);.      wh
2cb50 65 72 65 4c 6f 6f 70 4f 75 74 70 75 74 41 64 6a  ereLoopOutputAdj
2cb60 75 73 74 28 70 57 43 2c 20 70 4e 65 77 2c 20 72  ust(pWC, pNew, r
2cb70 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 72 63 20  Size);.      rc 
2cb80 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72  = whereLoopInser
2cb90 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e 65 77  t(pBuilder, pNew
2cba0 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e  );.      pNew->n
2cbb0 4f 75 74 20 3d 20 72 53 69 7a 65 3b 0a 20 20 20  Out = rSize;.   
2cbc0 20 20 20 69 66 28 20 72 63 20 29 20 62 72 65 61     if( rc ) brea
2cbd0 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  k;.    }else{.  
2cbe0 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 3b 0a 20      Bitmask m;. 
2cbf0 20 20 20 20 20 69 66 28 20 70 50 72 6f 62 65 2d       if( pProbe-
2cc00 3e 69 73 43 6f 76 65 72 69 6e 67 20 29 7b 0a 20  >isCovering ){. 
2cc10 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46         pNew->wsF
2cc20 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 49 44 58  lags = WHERE_IDX
2cc30 5f 4f 4e 4c 59 20 7c 20 57 48 45 52 45 5f 49 4e  _ONLY | WHERE_IN
2cc40 44 45 58 45 44 3b 0a 20 20 20 20 20 20 20 20 6d  DEXED;.        m
2cc50 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 0;.      }els
2cc60 65 7b 0a 20 20 20 20 20 20 20 20 6d 20 3d 20 70  e{.        m = p
2cc70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20 26 20 7e  Src->colUsed & ~
2cc80 63 6f 6c 75 6d 6e 73 49 6e 49 6e 64 65 78 28 70  columnsInIndex(p
2cc90 50 72 6f 62 65 29 3b 0a 20 20 20 20 20 20 20 20  Probe);.        
2cca0 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20  pNew->wsFlags = 
2ccb0 28 6d 3d 3d 30 29 20 3f 20 28 57 48 45 52 45 5f  (m==0) ? (WHERE_
2ccc0 49 44 58 5f 4f 4e 4c 59 7c 57 48 45 52 45 5f 49  IDX_ONLY|WHERE_I
2ccd0 4e 44 45 58 45 44 29 20 3a 20 57 48 45 52 45 5f  NDEXED) : WHERE_
2cce0 49 4e 44 45 58 45 44 3b 0a 20 20 20 20 20 20 7d  INDEXED;.      }
2ccf0 0a 0a 20 20 20 20 20 20 2f 2a 20 46 75 6c 6c 20  ..      /* Full 
2cd00 73 63 61 6e 20 76 69 61 20 69 6e 64 65 78 20 2a  scan via index *
2cd10 2f 0a 20 20 20 20 20 20 69 66 28 20 62 0a 20 20  /.      if( b.  
2cd20 20 20 20 20 20 7c 7c 20 21 48 61 73 52 6f 77 69       || !HasRowi
2cd30 64 28 70 54 61 62 29 0a 20 20 20 20 20 20 20 7c  d(pTab).       |
2cd40 7c 20 28 20 6d 3d 3d 30 0a 20 20 20 20 20 20 20  | ( m==0.       
2cd50 20 20 26 26 20 70 50 72 6f 62 65 2d 3e 62 55 6e    && pProbe->bUn
2cd60 6f 72 64 65 72 65 64 3d 3d 30 0a 20 20 20 20 20  ordered==0.     
2cd70 20 20 20 20 26 26 20 28 70 50 72 6f 62 65 2d 3e      && (pProbe->
2cd80 73 7a 49 64 78 52 6f 77 3c 70 54 61 62 2d 3e 73  szIdxRow<pTab->s
2cd90 7a 54 61 62 52 6f 77 29 0a 20 20 20 20 20 20 20  zTabRow).       
2cda0 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63    && (pWInfo->wc
2cdb0 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
2cdc0 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44  _ONEPASS_DESIRED
2cdd0 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26  )==0.         &&
2cde0 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
2cdf0 6e 66 69 67 2e 62 55 73 65 43 69 73 0a 20 20 20  nfig.bUseCis.   
2ce00 20 20 20 20 20 20 26 26 20 4f 70 74 69 6d 69 7a        && Optimiz
2ce10 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 70 57 49  ationEnabled(pWI
2ce20 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2c  nfo->pParse->db,
2ce30 20 53 51 4c 49 54 45 5f 43 6f 76 65 72 49 64 78   SQLITE_CoverIdx
2ce40 53 63 61 6e 29 0a 20 20 20 20 20 20 20 20 20 20  Scan).          
2ce50 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  ).      ){.     
2ce60 20 20 20 70 4e 65 77 2d 3e 69 53 6f 72 74 49 64     pNew->iSortId
2ce70 78 20 3d 20 62 20 3f 20 69 53 6f 72 74 49 64 78  x = b ? iSortIdx
2ce80 20 3a 20 30 3b 0a 0a 20 20 20 20 20 20 20 20 2f   : 0;..        /
2ce90 2a 20 54 68 65 20 63 6f 73 74 20 6f 66 20 76 69  * The cost of vi
2cea0 73 69 74 69 6e 67 20 74 68 65 20 69 6e 64 65 78  siting the index
2ceb0 20 72 6f 77 73 20 69 73 20 4e 2a 4b 2c 20 77 68   rows is N*K, wh
2cec0 65 72 65 20 4b 20 69 73 0a 20 20 20 20 20 20 20  ere K is.       
2ced0 20 2a 2a 20 62 65 74 77 65 65 6e 20 31 2e 31 20   ** between 1.1 
2cee0 61 6e 64 20 33 2e 30 2c 20 64 65 70 65 6e 64 69  and 3.0, dependi
2cef0 6e 67 20 6f 6e 20 74 68 65 20 72 65 6c 61 74 69  ng on the relati
2cf00 76 65 20 73 69 7a 65 73 20 6f 66 20 74 68 65 0a  ve sizes of the.
2cf10 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 64 65 78          ** index
2cf20 20 61 6e 64 20 74 61 62 6c 65 20 72 6f 77 73 2e   and table rows.
2cf30 20 49 66 20 74 68 69 73 20 69 73 20 61 20 6e 6f   If this is a no
2cf40 6e 2d 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78  n-covering index
2cf50 20 73 63 61 6e 2c 0a 20 20 20 20 20 20 20 20 2a   scan,.        *
2cf60 2a 20 61 6c 73 6f 20 61 64 64 20 74 68 65 20 63  * also add the c
2cf70 6f 73 74 20 6f 66 20 76 69 73 69 74 69 6e 67 20  ost of visiting 
2cf80 74 61 62 6c 65 20 72 6f 77 73 20 28 4e 2a 33 2e  table rows (N*3.
2cf90 30 29 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  0).  */.        
2cfa0 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 72 53 69  pNew->rRun = rSi
2cfb0 7a 65 20 2b 20 31 20 2b 20 28 31 35 2a 70 50 72  ze + 1 + (15*pPr
2cfc0 6f 62 65 2d 3e 73 7a 49 64 78 52 6f 77 29 2f 70  obe->szIdxRow)/p
2cfd0 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 3b 0a 20  Tab->szTabRow;. 
2cfe0 20 20 20 20 20 20 20 69 66 28 20 6d 21 3d 30 20         if( m!=0 
2cff0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65  ){.          pNe
2d000 77 2d 3e 72 52 75 6e 20 3d 20 73 71 6c 69 74 65  w->rRun = sqlite
2d010 33 4c 6f 67 45 73 74 41 64 64 28 70 4e 65 77 2d  3LogEstAdd(pNew-
2d020 3e 72 52 75 6e 2c 20 72 53 69 7a 65 2b 31 36 29  >rRun, rSize+16)
2d030 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2d040 20 20 20 20 41 70 70 6c 79 43 6f 73 74 4d 75 6c      ApplyCostMul
2d050 74 69 70 6c 69 65 72 28 70 4e 65 77 2d 3e 72 52  tiplier(pNew->rR
2d060 75 6e 2c 20 70 54 61 62 2d 3e 63 6f 73 74 4d 75  un, pTab->costMu
2d070 6c 74 29 3b 0a 20 20 20 20 20 20 20 20 77 68 65  lt);.        whe
2d080 72 65 4c 6f 6f 70 4f 75 74 70 75 74 41 64 6a 75  reLoopOutputAdju
2d090 73 74 28 70 57 43 2c 20 70 4e 65 77 2c 20 72 53  st(pWC, pNew, rS
2d0a0 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 72 63  ize);.        rc
2d0b0 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65   = whereLoopInse
2d0c0 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e 65  rt(pBuilder, pNe
2d0d0 77 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  w);.        pNew
2d0e0 2d 3e 6e 4f 75 74 20 3d 20 72 53 69 7a 65 3b 0a  ->nOut = rSize;.
2d0f0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
2d100 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
2d110 20 20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20      }..    rc = 
2d120 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65  whereLoopAddBtre
2d130 65 49 6e 64 65 78 28 70 42 75 69 6c 64 65 72 2c  eIndex(pBuilder,
2d140 20 70 53 72 63 2c 20 70 50 72 6f 62 65 2c 20 30   pSrc, pProbe, 0
2d150 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
2d160 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52  _ENABLE_STAT3_OR
2d170 5f 53 54 41 54 34 0a 20 20 20 20 73 71 6c 69 74  _STAT4.    sqlit
2d180 65 33 53 74 61 74 34 50 72 6f 62 65 46 72 65 65  e3Stat4ProbeFree
2d190 28 70 42 75 69 6c 64 65 72 2d 3e 70 52 65 63 29  (pBuilder->pRec)
2d1a0 3b 0a 20 20 20 20 70 42 75 69 6c 64 65 72 2d 3e  ;.    pBuilder->
2d1b0 6e 52 65 63 56 61 6c 69 64 20 3d 20 30 3b 0a 20  nRecValid = 0;. 
2d1c0 20 20 20 70 42 75 69 6c 64 65 72 2d 3e 70 52 65     pBuilder->pRe
2d1d0 63 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 20  c = 0;.#endif.. 
2d1e0 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 77     /* If there w
2d1f0 61 73 20 61 6e 20 49 4e 44 45 58 45 44 20 42 59  as an INDEXED BY
2d200 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 6f 6e   clause, then on
2d210 6c 79 20 74 68 61 74 20 6f 6e 65 20 69 6e 64 65  ly that one inde
2d220 78 20 69 73 0a 20 20 20 20 2a 2a 20 63 6f 6e 73  x is.    ** cons
2d230 69 64 65 72 65 64 2e 20 2a 2f 0a 20 20 20 20 69  idered. */.    i
2d240 66 28 20 70 53 72 63 2d 3e 70 49 6e 64 65 78 20  f( pSrc->pIndex 
2d250 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72  ) break;.  }.  r
2d260 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
2d270 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2d280 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a  _VIRTUALTABLE./*
2d290 0a 2a 2a 20 41 64 64 20 61 6c 6c 20 57 68 65 72  .** Add all Wher
2d2a0 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 66 6f  eLoop objects fo
2d2b0 72 20 61 20 74 61 62 6c 65 20 6f 66 20 74 68 65  r a table of the
2d2c0 20 6a 6f 69 6e 20 69 64 65 6e 74 69 66 69 65 64   join identified
2d2d0 20 62 79 0a 2a 2a 20 70 42 75 69 6c 64 65 72 2d   by.** pBuilder-
2d2e0 3e 70 4e 65 77 2d 3e 69 54 61 62 2e 20 20 54 68  >pNew->iTab.  Th
2d2f0 61 74 20 74 61 62 6c 65 20 69 73 20 67 75 61 72  at table is guar
2d300 61 6e 74 65 65 64 20 74 6f 20 62 65 20 61 20 76  anteed to be a v
2d310 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2f  irtual table..*/
2d320 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
2d330 65 4c 6f 6f 70 41 64 64 56 69 72 74 75 61 6c 28  eLoopAddVirtual(
2d340 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c  .  WhereLoopBuil
2d350 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 20 20  der *pBuilder,  
2d360 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  /* WHERE clause 
2d370 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20  information */. 
2d380 20 42 69 74 6d 61 73 6b 20 6d 45 78 74 72 61 0a   Bitmask mExtra.
2d390 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  ){.  WhereInfo *
2d3a0 70 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20  pWInfo;         
2d3b0 20 20 2f 2a 20 57 48 45 52 45 20 61 6e 61 6c 79    /* WHERE analy
2d3c0 73 69 73 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  sis context */. 
2d3d0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20   Parse *pParse; 
2d3e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2d3f0 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e   The parsing con
2d400 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 43  text */.  WhereC
2d410 6c 61 75 73 65 20 2a 70 57 43 3b 20 20 20 20 20  lause *pWC;     
2d420 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48         /* The WH
2d430 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
2d440 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
2d450 74 65 6d 20 2a 70 53 72 63 3b 20 20 20 2f 2a 20  tem *pSrc;   /* 
2d460 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  The FROM clause 
2d470 74 65 72 6d 20 74 6f 20 73 65 61 72 63 68 20 2a  term to search *
2d480 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  /.  Table *pTab;
2d490 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
2d4a0 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f    sqlite3_index_
2d4b0 69 6e 66 6f 20 2a 70 49 64 78 49 6e 66 6f 3b 0a  info *pIdxInfo;.
2d4c0 20 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33    struct sqlite3
2d4d0 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e  _index_constrain
2d4e0 74 20 2a 70 49 64 78 43 6f 6e 73 3b 0a 20 20 73  t *pIdxCons;.  s
2d4f0 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
2d500 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75  dex_constraint_u
2d510 73 61 67 65 20 2a 70 55 73 61 67 65 3b 0a 20 20  sage *pUsage;.  
2d520 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
2d530 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  ;.  int i, j;.  
2d540 69 6e 74 20 69 54 65 72 6d 2c 20 6d 78 54 65 72  int iTerm, mxTer
2d550 6d 3b 0a 20 20 69 6e 74 20 6e 43 6f 6e 73 74 72  m;.  int nConstr
2d560 61 69 6e 74 3b 0a 20 20 69 6e 74 20 73 65 65 6e  aint;.  int seen
2d570 49 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  In = 0;         
2d580 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
2d590 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 69  an IN operator i
2d5a0 73 20 73 65 65 6e 20 2a 2f 0a 20 20 69 6e 74 20  s seen */.  int 
2d5b0 73 65 65 6e 56 61 72 20 3d 20 30 3b 20 20 20 20  seenVar = 0;    
2d5c0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
2d5d0 20 69 66 20 61 20 6e 6f 6e 2d 63 6f 6e 73 74 61   if a non-consta
2d5e0 6e 74 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73  nt constraint is
2d5f0 20 73 65 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 69   seen */.  int i
2d600 50 68 61 73 65 3b 20 20 20 20 20 20 20 20 20 20  Phase;          
2d610 20 20 20 20 20 20 20 20 2f 2a 20 30 3a 20 63 6f          /* 0: co
2d620 6e 73 74 20 77 2f 6f 20 49 4e 2c 20 31 3a 20 63  nst w/o IN, 1: c
2d630 6f 6e 73 74 2c 20 32 3a 20 6e 6f 20 49 4e 2c 20  onst, 2: no IN, 
2d640 20 32 3a 20 49 4e 20 2a 2f 0a 20 20 57 68 65 72   2: IN */.  Wher
2d650 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a 20 20 69  eLoop *pNew;.  i
2d660 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2d670 4b 3b 0a 0a 20 20 70 57 49 6e 66 6f 20 3d 20 70  K;..  pWInfo = p
2d680 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b  Builder->pWInfo;
2d690 0a 20 20 70 50 61 72 73 65 20 3d 20 70 57 49 6e  .  pParse = pWIn
2d6a0 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20 64 62  fo->pParse;.  db
2d6b0 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
2d6c0 20 70 57 43 20 3d 20 70 42 75 69 6c 64 65 72 2d   pWC = pBuilder-
2d6d0 3e 70 57 43 3b 0a 20 20 70 4e 65 77 20 3d 20 70  >pWC;.  pNew = p
2d6e0 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20  Builder->pNew;. 
2d6f0 20 70 53 72 63 20 3d 20 26 70 57 49 6e 66 6f 2d   pSrc = &pWInfo-
2d700 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4e 65  >pTabList->a[pNe
2d710 77 2d 3e 69 54 61 62 5d 3b 0a 20 20 70 54 61 62  w->iTab];.  pTab
2d720 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 3b 0a 20   = pSrc->pTab;. 
2d730 20 61 73 73 65 72 74 28 20 49 73 56 69 72 74 75   assert( IsVirtu
2d740 61 6c 28 70 54 61 62 29 20 29 3b 0a 20 20 70 49  al(pTab) );.  pI
2d750 64 78 49 6e 66 6f 20 3d 20 61 6c 6c 6f 63 61 74  dxInfo = allocat
2d760 65 49 6e 64 65 78 49 6e 66 6f 28 70 50 61 72 73  eIndexInfo(pPars
2d770 65 2c 20 70 57 43 2c 20 70 53 72 63 2c 20 70 42  e, pWC, pSrc, pB
2d780 75 69 6c 64 65 72 2d 3e 70 4f 72 64 65 72 42 79  uilder->pOrderBy
2d790 29 3b 0a 20 20 69 66 28 20 70 49 64 78 49 6e 66  );.  if( pIdxInf
2d7a0 6f 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  o==0 ) return SQ
2d7b0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 70 4e  LITE_NOMEM;.  pN
2d7c0 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 30 3b 0a  ew->prereq = 0;.
2d7d0 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d    pNew->rSetup =
2d7e0 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 77 73 46 6c   0;.  pNew->wsFl
2d7f0 61 67 73 20 3d 20 57 48 45 52 45 5f 56 49 52 54  ags = WHERE_VIRT
2d800 55 41 4c 54 41 42 4c 45 3b 0a 20 20 70 4e 65 77  UALTABLE;.  pNew
2d810 2d 3e 6e 4c 54 65 72 6d 20 3d 20 30 3b 0a 20 20  ->nLTerm = 0;.  
2d820 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65  pNew->u.vtab.nee
2d830 64 46 72 65 65 20 3d 20 30 3b 0a 20 20 70 55 73  dFree = 0;.  pUs
2d840 61 67 65 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e  age = pIdxInfo->
2d850 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65  aConstraintUsage
2d860 3b 0a 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20  ;.  nConstraint 
2d870 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e  = pIdxInfo->nCon
2d880 73 74 72 61 69 6e 74 3b 0a 20 20 69 66 28 20 77  straint;.  if( w
2d890 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 64  hereLoopResize(d
2d8a0 62 2c 20 70 4e 65 77 2c 20 6e 43 6f 6e 73 74 72  b, pNew, nConstr
2d8b0 61 69 6e 74 29 20 29 7b 0a 20 20 20 20 73 71 6c  aint) ){.    sql
2d8c0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
2d8d0 49 64 78 49 6e 66 6f 29 3b 0a 20 20 20 20 72 65  IdxInfo);.    re
2d8e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
2d8f0 4d 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 69 50  M;.  }..  for(iP
2d900 68 61 73 65 3d 30 3b 20 69 50 68 61 73 65 3c 3d  hase=0; iPhase<=
2d910 33 3b 20 69 50 68 61 73 65 2b 2b 29 7b 0a 20 20  3; iPhase++){.  
2d920 20 20 69 66 28 20 21 73 65 65 6e 49 6e 20 26 26    if( !seenIn &&
2d930 20 28 69 50 68 61 73 65 26 31 29 21 3d 30 20 29   (iPhase&1)!=0 )
2d940 7b 0a 20 20 20 20 20 20 69 50 68 61 73 65 2b 2b  {.      iPhase++
2d950 3b 0a 20 20 20 20 20 20 69 66 28 20 69 50 68 61  ;.      if( iPha
2d960 73 65 3e 33 20 29 20 62 72 65 61 6b 3b 0a 20 20  se>3 ) break;.  
2d970 20 20 7d 0a 20 20 20 20 69 66 28 20 21 73 65 65    }.    if( !see
2d980 6e 56 61 72 20 26 26 20 69 50 68 61 73 65 3e 31  nVar && iPhase>1
2d990 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 70 49   ) break;.    pI
2d9a0 64 78 43 6f 6e 73 20 3d 20 2a 28 73 74 72 75 63  dxCons = *(struc
2d9b0 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  t sqlite3_index_
2d9c0 63 6f 6e 73 74 72 61 69 6e 74 2a 2a 29 26 70 49  constraint**)&pI
2d9d0 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61  dxInfo->aConstra
2d9e0 69 6e 74 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  int;.    for(i=0
2d9f0 3b 20 69 3c 70 49 64 78 49 6e 66 6f 2d 3e 6e 43  ; i<pIdxInfo->nC
2da00 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 2c 20  onstraint; i++, 
2da10 70 49 64 78 43 6f 6e 73 2b 2b 29 7b 0a 20 20 20  pIdxCons++){.   
2da20 20 20 20 6a 20 3d 20 70 49 64 78 43 6f 6e 73 2d     j = pIdxCons-
2da30 3e 69 54 65 72 6d 4f 66 66 73 65 74 3b 0a 20 20  >iTermOffset;.  
2da40 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43      pTerm = &pWC
2da50 2d 3e 61 5b 6a 5d 3b 0a 20 20 20 20 20 20 73 77  ->a[j];.      sw
2da60 69 74 63 68 28 20 69 50 68 61 73 65 20 29 7b 0a  itch( iPhase ){.
2da70 20 20 20 20 20 20 20 20 63 61 73 65 20 30 3a 20          case 0: 
2da80 20 20 20 2f 2a 20 43 6f 6e 73 74 61 6e 74 73 20     /* Constants 
2da90 77 69 74 68 6f 75 74 20 49 4e 20 6f 70 65 72 61  without IN opera
2daa0 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  tor */.         
2dab0 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c   pIdxCons->usabl
2dac0 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  e = 0;.         
2dad0 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70   if( (pTerm->eOp
2dae0 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 29 21  erator & WO_IN)!
2daf0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
2db00 20 20 73 65 65 6e 49 6e 20 3d 20 31 3b 0a 20 20    seenIn = 1;.  
2db10 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2db20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 70      if( pTerm->p
2db30 72 65 72 65 71 52 69 67 68 74 21 3d 30 20 29 7b  rereqRight!=0 ){
2db40 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65 65  .            see
2db50 6e 56 61 72 20 3d 20 31 3b 0a 20 20 20 20 20 20  nVar = 1;.      
2db60 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70      }else if( (p
2db70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
2db80 26 20 57 4f 5f 49 4e 29 3d 3d 30 20 29 7b 0a 20  & WO_IN)==0 ){. 
2db90 20 20 20 20 20 20 20 20 20 20 20 70 49 64 78 43             pIdxC
2dba0 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20 31 3b  ons->usable = 1;
2dbb0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2dbc0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
2dbd0 20 20 20 20 20 20 63 61 73 65 20 31 3a 20 20 20        case 1:   
2dbe0 20 2f 2a 20 43 6f 6e 73 74 61 6e 74 73 20 77 69   /* Constants wi
2dbf0 74 68 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 20  th IN operators 
2dc00 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  */.          ass
2dc10 65 72 74 28 20 73 65 65 6e 49 6e 20 29 3b 0a 20  ert( seenIn );. 
2dc20 20 20 20 20 20 20 20 20 20 70 49 64 78 43 6f 6e           pIdxCon
2dc30 73 2d 3e 75 73 61 62 6c 65 20 3d 20 28 70 54 65  s->usable = (pTe
2dc40 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 3d  rm->prereqRight=
2dc50 3d 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62  =0);.          b
2dc60 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61  reak;.        ca
2dc70 73 65 20 32 3a 20 20 20 20 2f 2a 20 56 61 72 69  se 2:    /* Vari
2dc80 61 62 6c 65 73 20 77 69 74 68 6f 75 74 20 49 4e  ables without IN
2dc90 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73   */.          as
2dca0 73 65 72 74 28 20 73 65 65 6e 56 61 72 20 29 3b  sert( seenVar );
2dcb0 0a 20 20 20 20 20 20 20 20 20 20 70 49 64 78 43  .          pIdxC
2dcc0 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20 28 70  ons->usable = (p
2dcd0 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
2dce0 26 20 57 4f 5f 49 4e 29 3d 3d 30 3b 0a 20 20 20  & WO_IN)==0;.   
2dcf0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
2dd00 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20 20        default:  
2dd10 20 2f 2a 20 56 61 72 69 61 62 6c 65 73 20 77 69   /* Variables wi
2dd20 74 68 20 49 4e 20 2a 2f 0a 20 20 20 20 20 20 20  th IN */.       
2dd30 20 20 20 61 73 73 65 72 74 28 20 73 65 65 6e 56     assert( seenV
2dd40 61 72 20 26 26 20 73 65 65 6e 49 6e 20 29 3b 0a  ar && seenIn );.
2dd50 20 20 20 20 20 20 20 20 20 20 70 49 64 78 43 6f            pIdxCo
2dd60 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20 31 3b 0a  ns->usable = 1;.
2dd70 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
2dd80 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2dd90 20 20 20 6d 65 6d 73 65 74 28 70 55 73 61 67 65     memset(pUsage
2dda0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 55 73 61  , 0, sizeof(pUsa
2ddb0 67 65 5b 30 5d 29 2a 70 49 64 78 49 6e 66 6f 2d  ge[0])*pIdxInfo-
2ddc0 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 29 3b 0a 20  >nConstraint);. 
2ddd0 20 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f 2d     if( pIdxInfo-
2dde0 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74  >needToFreeIdxSt
2ddf0 72 20 29 20 73 71 6c 69 74 65 33 5f 66 72 65 65  r ) sqlite3_free
2de00 28 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74  (pIdxInfo->idxSt
2de10 72 29 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f  r);.    pIdxInfo
2de20 2d 3e 69 64 78 53 74 72 20 3d 20 30 3b 0a 20 20  ->idxStr = 0;.  
2de30 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 4e    pIdxInfo->idxN
2de40 75 6d 20 3d 20 30 3b 0a 20 20 20 20 70 49 64 78  um = 0;.    pIdx
2de50 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65  Info->needToFree
2de60 49 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 20 20  IdxStr = 0;.    
2de70 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42  pIdxInfo->orderB
2de80 79 43 6f 6e 73 75 6d 65 64 20 3d 20 30 3b 0a 20  yConsumed = 0;. 
2de90 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74     pIdxInfo->est
2dea0 69 6d 61 74 65 64 43 6f 73 74 20 3d 20 53 51 4c  imatedCost = SQL
2deb0 49 54 45 5f 42 49 47 5f 44 42 4c 20 2f 20 28 64  ITE_BIG_DBL / (d
2dec0 6f 75 62 6c 65 29 32 3b 0a 20 20 20 20 70 49 64  ouble)2;.    pId
2ded0 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64  xInfo->estimated
2dee0 52 6f 77 73 20 3d 20 32 35 3b 0a 20 20 20 20 72  Rows = 25;.    r
2def0 63 20 3d 20 76 74 61 62 42 65 73 74 49 6e 64 65  c = vtabBestInde
2df00 78 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20  x(pParse, pTab, 
2df10 70 49 64 78 49 6e 66 6f 29 3b 0a 20 20 20 20 69  pIdxInfo);.    i
2df20 66 28 20 72 63 20 29 20 67 6f 74 6f 20 77 68 65  f( rc ) goto whe
2df30 72 65 4c 6f 6f 70 41 64 64 56 74 61 62 5f 65 78  reLoopAddVtab_ex
2df40 69 74 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e 73  it;.    pIdxCons
2df50 20 3d 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69   = *(struct sqli
2df60 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72  te3_index_constr
2df70 61 69 6e 74 2a 2a 29 26 70 49 64 78 49 6e 66 6f  aint**)&pIdxInfo
2df80 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20  ->aConstraint;. 
2df90 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20     pNew->prereq 
2dfa0 3d 20 6d 45 78 74 72 61 3b 0a 20 20 20 20 6d 78  = mExtra;.    mx
2dfb0 54 65 72 6d 20 3d 20 2d 31 3b 0a 20 20 20 20 61  Term = -1;.    a
2dfc0 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4c 53  ssert( pNew->nLS
2dfd0 6c 6f 74 3e 3d 6e 43 6f 6e 73 74 72 61 69 6e 74  lot>=nConstraint
2dfe0 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   );.    for(i=0;
2dff0 20 69 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20   i<nConstraint; 
2e000 69 2b 2b 29 20 70 4e 65 77 2d 3e 61 4c 54 65 72  i++) pNew->aLTer
2e010 6d 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 70 4e  m[i] = 0;.    pN
2e020 65 77 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69 74 4d  ew->u.vtab.omitM
2e030 61 73 6b 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72  ask = 0;.    for
2e040 28 69 3d 30 3b 20 69 3c 6e 43 6f 6e 73 74 72 61  (i=0; i<nConstra
2e050 69 6e 74 3b 20 69 2b 2b 2c 20 70 49 64 78 43 6f  int; i++, pIdxCo
2e060 6e 73 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28  ns++){.      if(
2e070 20 28 69 54 65 72 6d 20 3d 20 70 55 73 61 67 65   (iTerm = pUsage
2e080 5b 69 5d 2e 61 72 67 76 49 6e 64 65 78 20 2d 20  [i].argvIndex - 
2e090 31 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  1)>=0 ){.       
2e0a0 20 6a 20 3d 20 70 49 64 78 43 6f 6e 73 2d 3e 69   j = pIdxCons->i
2e0b0 54 65 72 6d 4f 66 66 73 65 74 3b 0a 20 20 20 20  TermOffset;.    
2e0c0 20 20 20 20 69 66 28 20 69 54 65 72 6d 3e 3d 6e      if( iTerm>=n
2e0d0 43 6f 6e 73 74 72 61 69 6e 74 0a 20 20 20 20 20  Constraint.     
2e0e0 20 20 20 20 7c 7c 20 6a 3c 30 0a 20 20 20 20 20      || j<0.     
2e0f0 20 20 20 20 7c 7c 20 6a 3e 3d 70 57 43 2d 3e 6e      || j>=pWC->n
2e100 54 65 72 6d 0a 20 20 20 20 20 20 20 20 20 7c 7c  Term.         ||
2e110 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 69 54   pNew->aLTerm[iT
2e120 65 72 6d 5d 21 3d 30 0a 20 20 20 20 20 20 20 20  erm]!=0.        
2e130 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
2e140 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
2e150 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2e160 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
2e170 2c 20 22 25 73 2e 78 42 65 73 74 49 6e 64 65 78  , "%s.xBestIndex
2e180 28 29 20 6d 61 6c 66 75 6e 63 74 69 6f 6e 22 2c  () malfunction",
2e190 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
2e1a0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 77 68           goto wh
2e1b0 65 72 65 4c 6f 6f 70 41 64 64 56 74 61 62 5f 65  ereLoopAddVtab_e
2e1c0 78 69 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  xit;.        }. 
2e1d0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
2e1e0 20 69 54 65 72 6d 3d 3d 6e 43 6f 6e 73 74 72 61   iTerm==nConstra
2e1f0 69 6e 74 2d 31 20 29 3b 0a 20 20 20 20 20 20 20  int-1 );.       
2e200 20 74 65 73 74 63 61 73 65 28 20 6a 3d 3d 30 20   testcase( j==0 
2e210 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
2e220 61 73 65 28 20 6a 3d 3d 70 57 43 2d 3e 6e 54 65  ase( j==pWC->nTe
2e230 72 6d 2d 31 20 29 3b 0a 20 20 20 20 20 20 20 20  rm-1 );.        
2e240 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b  pTerm = &pWC->a[
2e250 6a 5d 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  j];.        pNew
2e260 2d 3e 70 72 65 72 65 71 20 7c 3d 20 70 54 65 72  ->prereq |= pTer
2e270 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 3b 0a  m->prereqRight;.
2e280 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2e290 69 54 65 72 6d 3c 70 4e 65 77 2d 3e 6e 4c 53 6c  iTerm<pNew->nLSl
2e2a0 6f 74 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4e  ot );.        pN
2e2b0 65 77 2d 3e 61 4c 54 65 72 6d 5b 69 54 65 72 6d  ew->aLTerm[iTerm
2e2c0 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20  ] = pTerm;.     
2e2d0 20 20 20 69 66 28 20 69 54 65 72 6d 3e 6d 78 54     if( iTerm>mxT
2e2e0 65 72 6d 20 29 20 6d 78 54 65 72 6d 20 3d 20 69  erm ) mxTerm = i
2e2f0 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 74 65  Term;.        te
2e300 73 74 63 61 73 65 28 20 69 54 65 72 6d 3d 3d 31  stcase( iTerm==1
2e310 35 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  5 );.        tes
2e320 74 63 61 73 65 28 20 69 54 65 72 6d 3d 3d 31 36  tcase( iTerm==16
2e330 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
2e340 69 54 65 72 6d 3c 31 36 20 26 26 20 70 55 73 61  iTerm<16 && pUsa
2e350 67 65 5b 69 5d 2e 6f 6d 69 74 20 29 20 70 4e 65  ge[i].omit ) pNe
2e360 77 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61  w->u.vtab.omitMa
2e370 73 6b 20 7c 3d 20 31 3c 3c 69 54 65 72 6d 3b 0a  sk |= 1<<iTerm;.
2e380 20 20 20 20 20 20 20 20 69 66 28 20 28 70 54 65          if( (pTe
2e390 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
2e3a0 57 4f 5f 49 4e 29 21 3d 30 20 29 7b 0a 20 20 20  WO_IN)!=0 ){.   
2e3b0 20 20 20 20 20 20 20 69 66 28 20 70 55 73 61 67         if( pUsag
2e3c0 65 5b 69 5d 2e 6f 6d 69 74 3d 3d 30 20 29 7b 0a  e[i].omit==0 ){.
2e3d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
2e3e0 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 6f  o not attempt to
2e3f0 20 75 73 65 20 61 6e 20 49 4e 20 63 6f 6e 73 74   use an IN const
2e400 72 61 69 6e 74 20 69 66 20 74 68 65 20 76 69 72  raint if the vir
2e410 74 75 61 6c 20 74 61 62 6c 65 0a 20 20 20 20 20  tual table.     
2e420 20 20 20 20 20 20 20 2a 2a 20 73 61 79 73 20 74         ** says t
2e430 68 61 74 20 74 68 65 20 65 71 75 69 76 61 6c 65  hat the equivale
2e440 6e 74 20 45 51 20 63 6f 6e 73 74 72 61 69 6e 74  nt EQ constraint
2e450 20 63 61 6e 6e 6f 74 20 62 65 20 73 61 66 65 6c   cannot be safel
2e460 79 20 6f 6d 69 74 74 65 64 2e 0a 20 20 20 20 20  y omitted..     
2e470 20 20 20 20 20 20 20 2a 2a 20 49 66 20 77 65 20         ** If we 
2e480 64 6f 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73  do attempt to us
2e490 65 20 73 75 63 68 20 61 20 63 6f 6e 73 74 72 61  e such a constra
2e4a0 69 6e 74 2c 20 73 6f 6d 65 20 72 6f 77 73 20 6d  int, some rows m
2e4b0 69 67 68 74 20 62 65 0a 20 20 20 20 20 20 20 20  ight be.        
2e4c0 20 20 20 20 2a 2a 20 72 65 70 65 61 74 65 64 20      ** repeated 
2e4d0 69 6e 20 74 68 65 20 6f 75 74 70 75 74 2e 20 2a  in the output. *
2e4e0 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  /.            br
2e4f0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  eak;.          }
2e500 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20  .          /* A 
2e510 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 74 68  virtual table th
2e520 61 74 20 69 73 20 63 6f 6e 73 74 72 61 69 6e 65  at is constraine
2e530 64 20 62 79 20 61 6e 20 49 4e 20 63 6c 61 75 73  d by an IN claus
2e540 65 20 6d 61 79 20 6e 6f 74 0a 20 20 20 20 20 20  e may not.      
2e550 20 20 20 20 2a 2a 20 63 6f 6e 73 75 6d 65 20 74      ** consume t
2e560 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
2e570 73 65 20 62 65 63 61 75 73 65 20 28 31 29 20 74  se because (1) t
2e580 68 65 20 6f 72 64 65 72 20 6f 66 20 49 4e 20 74  he order of IN t
2e590 65 72 6d 73 0a 20 20 20 20 20 20 20 20 20 20 2a  erms.          *
2e5a0 2a 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61  * is not necessa
2e5b0 72 69 6c 79 20 72 65 6c 61 74 65 64 20 74 6f 20  rily related to 
2e5c0 74 68 65 20 6f 72 64 65 72 20 6f 66 20 6f 75 74  the order of out
2e5d0 70 75 74 20 74 65 72 6d 73 20 61 6e 64 0a 20 20  put terms and.  
2e5e0 20 20 20 20 20 20 20 20 2a 2a 20 28 32 29 20 4d          ** (2) M
2e5f0 75 6c 74 69 70 6c 65 20 6f 75 74 70 75 74 73 20  ultiple outputs 
2e600 66 72 6f 6d 20 61 20 73 69 6e 67 6c 65 20 49 4e  from a single IN
2e610 20 76 61 6c 75 65 20 77 69 6c 6c 20 6e 6f 74 20   value will not 
2e620 6d 65 72 67 65 0a 20 20 20 20 20 20 20 20 20 20  merge.          
2e630 2a 2a 20 74 6f 67 65 74 68 65 72 2e 20 20 2a 2f  ** together.  */
2e640 0a 20 20 20 20 20 20 20 20 20 20 70 49 64 78 49  .          pIdxI
2e650 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73  nfo->orderByCons
2e660 75 6d 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20  umed = 0;.      
2e670 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
2e680 7d 0a 20 20 20 20 69 66 28 20 69 3e 3d 6e 43 6f  }.    if( i>=nCo
2e690 6e 73 74 72 61 69 6e 74 20 29 7b 0a 20 20 20 20  nstraint ){.    
2e6a0 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d    pNew->nLTerm =
2e6b0 20 6d 78 54 65 72 6d 2b 31 3b 0a 20 20 20 20 20   mxTerm+1;.     
2e6c0 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e   assert( pNew->n
2e6d0 4c 54 65 72 6d 3c 3d 70 4e 65 77 2d 3e 6e 4c 53  LTerm<=pNew->nLS
2e6e0 6c 6f 74 20 29 3b 0a 20 20 20 20 20 20 70 4e 65  lot );.      pNe
2e6f0 77 2d 3e 75 2e 76 74 61 62 2e 69 64 78 4e 75 6d  w->u.vtab.idxNum
2e700 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78   = pIdxInfo->idx
2e710 4e 75 6d 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  Num;.      pNew-
2e720 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65  >u.vtab.needFree
2e730 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65   = pIdxInfo->nee
2e740 64 54 6f 46 72 65 65 49 64 78 53 74 72 3b 0a 20  dToFreeIdxStr;. 
2e750 20 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6e       pIdxInfo->n
2e760 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 20  eedToFreeIdxStr 
2e770 3d 20 30 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  = 0;.      pNew-
2e780 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72 20 3d  >u.vtab.idxStr =
2e790 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74   pIdxInfo->idxSt
2e7a0 72 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 75  r;.      pNew->u
2e7b0 2e 76 74 61 62 2e 69 73 4f 72 64 65 72 65 64 20  .vtab.isOrdered 
2e7c0 3d 20 28 69 38 29 28 70 49 64 78 49 6e 66 6f 2d  = (i8)(pIdxInfo-
2e7d0 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64  >orderByConsumed
2e7e0 20 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   ?.             
2e7f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e800 20 20 20 20 20 20 20 20 20 70 49 64 78 49 6e 66           pIdxInf
2e810 6f 2d 3e 6e 4f 72 64 65 72 42 79 20 3a 20 30 29  o->nOrderBy : 0)
2e820 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 53  ;.      pNew->rS
2e830 65 74 75 70 20 3d 20 30 3b 0a 20 20 20 20 20 20  etup = 0;.      
2e840 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 73 71 6c  pNew->rRun = sql
2e850 69 74 65 33 4c 6f 67 45 73 74 46 72 6f 6d 44 6f  ite3LogEstFromDo
2e860 75 62 6c 65 28 70 49 64 78 49 6e 66 6f 2d 3e 65  uble(pIdxInfo->e
2e870 73 74 69 6d 61 74 65 64 43 6f 73 74 29 3b 0a 20  stimatedCost);. 
2e880 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20       pNew->nOut 
2e890 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  = sqlite3LogEst(
2e8a0 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61  pIdxInfo->estima
2e8b0 74 65 64 52 6f 77 73 29 3b 0a 20 20 20 20 20 20  tedRows);.      
2e8c0 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28  whereLoopInsert(
2e8d0 70 42 75 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b  pBuilder, pNew);
2e8e0 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 2d  .      if( pNew-
2e8f0 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65  >u.vtab.needFree
2e900 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
2e910 74 65 33 5f 66 72 65 65 28 70 4e 65 77 2d 3e 75  te3_free(pNew->u
2e920 2e 76 74 61 62 2e 69 64 78 53 74 72 29 3b 0a 20  .vtab.idxStr);. 
2e930 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76         pNew->u.v
2e940 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3d 20 30  tab.needFree = 0
2e950 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2e960 20 20 7d 20 20 0a 0a 77 68 65 72 65 4c 6f 6f 70    }  ..whereLoop
2e970 41 64 64 56 74 61 62 5f 65 78 69 74 3a 0a 20 20  AddVtab_exit:.  
2e980 69 66 28 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65  if( pIdxInfo->ne
2e990 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 20 29  edToFreeIdxStr )
2e9a0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49   sqlite3_free(pI
2e9b0 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72 29 3b  dxInfo->idxStr);
2e9c0 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
2e9d0 28 64 62 2c 20 70 49 64 78 49 6e 66 6f 29 3b 0a  (db, pIdxInfo);.
2e9e0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
2e9f0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
2ea00 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
2ea10 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  E */../*.** Add 
2ea20 57 68 65 72 65 4c 6f 6f 70 20 65 6e 74 72 69 65  WhereLoop entrie
2ea30 73 20 74 6f 20 68 61 6e 64 6c 65 20 4f 52 20 74  s to handle OR t
2ea40 65 72 6d 73 2e 20 20 54 68 69 73 20 77 6f 72 6b  erms.  This work
2ea50 73 20 66 6f 72 20 65 69 74 68 65 72 0a 2a 2a 20  s for either.** 
2ea60 62 74 72 65 65 73 20 6f 72 20 76 69 72 74 75 61  btrees or virtua
2ea70 6c 20 74 61 62 6c 65 73 2e 0a 2a 2f 0a 73 74 61  l tables..*/.sta
2ea80 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f  tic int whereLoo
2ea90 70 41 64 64 4f 72 28 57 68 65 72 65 4c 6f 6f 70  pAddOr(WhereLoop
2eaa0 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65  Builder *pBuilde
2eab0 72 2c 20 42 69 74 6d 61 73 6b 20 6d 45 78 74 72  r, Bitmask mExtr
2eac0 61 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20  a){.  WhereInfo 
2ead0 2a 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64  *pWInfo = pBuild
2eae0 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 57 68  er->pWInfo;.  Wh
2eaf0 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 0a  ereClause *pWC;.
2eb00 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65    WhereLoop *pNe
2eb10 77 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  w;.  WhereTerm *
2eb20 70 54 65 72 6d 2c 20 2a 70 57 43 45 6e 64 3b 0a  pTerm, *pWCEnd;.
2eb30 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
2eb40 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 43 75 72  E_OK;.  int iCur
2eb50 3b 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  ;.  WhereClause 
2eb60 74 65 6d 70 57 43 3b 0a 20 20 57 68 65 72 65 4c  tempWC;.  WhereL
2eb70 6f 6f 70 42 75 69 6c 64 65 72 20 73 53 75 62 42  oopBuilder sSubB
2eb80 75 69 6c 64 3b 0a 20 20 57 68 65 72 65 4f 72 53  uild;.  WhereOrS
2eb90 65 74 20 73 53 75 6d 2c 20 73 43 75 72 3b 0a 20  et sSum, sCur;. 
2eba0 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
2ebb0 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 0a  item *pItem;.  .
2ebc0 20 20 70 57 43 20 3d 20 70 42 75 69 6c 64 65 72    pWC = pBuilder
2ebd0 2d 3e 70 57 43 3b 0a 20 20 70 57 43 45 6e 64 20  ->pWC;.  pWCEnd 
2ebe0 3d 20 70 57 43 2d 3e 61 20 2b 20 70 57 43 2d 3e  = pWC->a + pWC->
2ebf0 6e 54 65 72 6d 3b 0a 20 20 70 4e 65 77 20 3d 20  nTerm;.  pNew = 
2ec00 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a  pBuilder->pNew;.
2ec10 20 20 6d 65 6d 73 65 74 28 26 73 53 75 6d 2c 20    memset(&sSum, 
2ec20 30 2c 20 73 69 7a 65 6f 66 28 73 53 75 6d 29 29  0, sizeof(sSum))
2ec30 3b 0a 20 20 70 49 74 65 6d 20 3d 20 70 57 49 6e  ;.  pItem = pWIn
2ec40 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 20  fo->pTabList->a 
2ec50 2b 20 70 4e 65 77 2d 3e 69 54 61 62 3b 0a 20 20  + pNew->iTab;.  
2ec60 69 43 75 72 20 3d 20 70 49 74 65 6d 2d 3e 69 43  iCur = pItem->iC
2ec70 75 72 73 6f 72 3b 0a 0a 20 20 66 6f 72 28 70 54  ursor;..  for(pT
2ec80 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 70 54 65 72  erm=pWC->a; pTer
2ec90 6d 3c 70 57 43 45 6e 64 20 26 26 20 72 63 3d 3d  m<pWCEnd && rc==
2eca0 53 51 4c 49 54 45 5f 4f 4b 3b 20 70 54 65 72 6d  SQLITE_OK; pTerm
2ecb0 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 28 70 54  ++){.    if( (pT
2ecc0 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
2ecd0 20 57 4f 5f 4f 52 29 21 3d 30 0a 20 20 20 20 20   WO_OR)!=0.     
2ece0 26 26 20 28 70 54 65 72 6d 2d 3e 75 2e 70 4f 72  && (pTerm->u.pOr
2ecf0 49 6e 66 6f 2d 3e 69 6e 64 65 78 61 62 6c 65 20  Info->indexable 
2ed00 26 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66  & pNew->maskSelf
2ed10 29 21 3d 30 20 0a 20 20 20 20 29 7b 0a 20 20 20  )!=0 .    ){.   
2ed20 20 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a     WhereClause *
2ed30 20 63 6f 6e 73 74 20 70 4f 72 57 43 20 3d 20 26   const pOrWC = &
2ed40 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f  pTerm->u.pOrInfo
2ed50 2d 3e 77 63 3b 0a 20 20 20 20 20 20 57 68 65 72  ->wc;.      Wher
2ed60 65 54 65 72 6d 20 2a 20 63 6f 6e 73 74 20 70 4f  eTerm * const pO
2ed70 72 57 43 45 6e 64 20 3d 20 26 70 4f 72 57 43 2d  rWCEnd = &pOrWC-
2ed80 3e 61 5b 70 4f 72 57 43 2d 3e 6e 54 65 72 6d 5d  >a[pOrWC->nTerm]
2ed90 3b 0a 20 20 20 20 20 20 57 68 65 72 65 54 65 72  ;.      WhereTer
2eda0 6d 20 2a 70 4f 72 54 65 72 6d 3b 0a 20 20 20 20  m *pOrTerm;.    
2edb0 20 20 69 6e 74 20 6f 6e 63 65 20 3d 20 31 3b 0a    int once = 1;.
2edc0 20 20 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a        int i, j;.
2edd0 20 20 20 20 0a 20 20 20 20 20 20 73 53 75 62 42      .      sSubB
2ede0 75 69 6c 64 20 3d 20 2a 70 42 75 69 6c 64 65 72  uild = *pBuilder
2edf0 3b 0a 20 20 20 20 20 20 73 53 75 62 42 75 69 6c  ;.      sSubBuil
2ee00 64 2e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  d.pOrderBy = 0;.
2ee10 20 20 20 20 20 20 73 53 75 62 42 75 69 6c 64 2e        sSubBuild.
2ee20 70 4f 72 53 65 74 20 3d 20 26 73 43 75 72 3b 0a  pOrSet = &sCur;.
2ee30 0a 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43  .      WHERETRAC
2ee40 45 28 30 78 32 30 30 2c 20 28 22 42 65 67 69 6e  E(0x200, ("Begin
2ee50 20 70 72 6f 63 65 73 73 69 6e 67 20 4f 52 2d 63   processing OR-c
2ee60 6c 61 75 73 65 20 25 70 5c 6e 22 2c 20 70 54 65  lause %p\n", pTe
2ee70 72 6d 29 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  rm));.      for(
2ee80 70 4f 72 54 65 72 6d 3d 70 4f 72 57 43 2d 3e 61  pOrTerm=pOrWC->a
2ee90 3b 20 70 4f 72 54 65 72 6d 3c 70 4f 72 57 43 45  ; pOrTerm<pOrWCE
2eea0 6e 64 3b 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a  nd; pOrTerm++){.
2eeb0 20 20 20 20 20 20 20 20 69 66 28 20 28 70 4f 72          if( (pOr
2eec0 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
2eed0 26 20 57 4f 5f 41 4e 44 29 21 3d 30 20 29 7b 0a  & WO_AND)!=0 ){.
2eee0 20 20 20 20 20 20 20 20 20 20 73 53 75 62 42 75            sSubBu
2eef0 69 6c 64 2e 70 57 43 20 3d 20 26 70 4f 72 54 65  ild.pWC = &pOrTe
2ef00 72 6d 2d 3e 75 2e 70 41 6e 64 49 6e 66 6f 2d 3e  rm->u.pAndInfo->
2ef10 77 63 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  wc;.        }els
2ef20 65 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c  e if( pOrTerm->l
2ef30 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 20  eftCursor==iCur 
2ef40 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74 65 6d  ){.          tem
2ef50 70 57 43 2e 70 57 49 6e 66 6f 20 3d 20 70 57 43  pWC.pWInfo = pWC
2ef60 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 20 20 20 20  ->pWInfo;.      
2ef70 20 20 20 20 74 65 6d 70 57 43 2e 70 4f 75 74 65      tempWC.pOute
2ef80 72 20 3d 20 70 57 43 3b 0a 20 20 20 20 20 20 20  r = pWC;.       
2ef90 20 20 20 74 65 6d 70 57 43 2e 6f 70 20 3d 20 54     tempWC.op = T
2efa0 4b 5f 41 4e 44 3b 0a 20 20 20 20 20 20 20 20 20  K_AND;.         
2efb0 20 74 65 6d 70 57 43 2e 6e 54 65 72 6d 20 3d 20   tempWC.nTerm = 
2efc0 31 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 6d  1;.          tem
2efd0 70 57 43 2e 61 20 3d 20 70 4f 72 54 65 72 6d 3b  pWC.a = pOrTerm;
2efe0 0a 20 20 20 20 20 20 20 20 20 20 73 53 75 62 42  .          sSubB
2eff0 75 69 6c 64 2e 70 57 43 20 3d 20 26 74 65 6d 70  uild.pWC = &temp
2f000 57 43 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  WC;.        }els
2f010 65 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e  e{.          con
2f020 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d  tinue;.        }
2f030 0a 20 20 20 20 20 20 20 20 73 43 75 72 2e 6e 20  .        sCur.n 
2f040 3d 20 30 3b 0a 23 69 66 64 65 66 20 57 48 45 52  = 0;.#ifdef WHER
2f050 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20  ETRACE_ENABLED. 
2f060 20 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43         WHERETRAC
2f070 45 28 30 78 32 30 30 2c 20 28 22 4f 52 2d 74 65  E(0x200, ("OR-te
2f080 72 6d 20 25 64 20 6f 66 20 25 70 20 68 61 73 20  rm %d of %p has 
2f090 25 64 20 73 75 62 74 65 72 6d 73 3a 5c 6e 22 2c  %d subterms:\n",
2f0a0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
2f0b0 20 20 20 20 20 28 69 6e 74 29 28 70 4f 72 54 65       (int)(pOrTe
2f0c0 72 6d 2d 70 4f 72 57 43 2d 3e 61 29 2c 20 70 54  rm-pOrWC->a), pT
2f0d0 65 72 6d 2c 20 73 53 75 62 42 75 69 6c 64 2e 70  erm, sSubBuild.p
2f0e0 57 43 2d 3e 6e 54 65 72 6d 29 29 3b 0a 20 20 20  WC->nTerm));.   
2f0f0 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
2f100 57 68 65 72 65 54 72 61 63 65 20 26 20 30 78 34  WhereTrace & 0x4
2f110 30 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  00 ){.          
2f120 66 6f 72 28 69 3d 30 3b 20 69 3c 73 53 75 62 42  for(i=0; i<sSubB
2f130 75 69 6c 64 2e 70 57 43 2d 3e 6e 54 65 72 6d 3b  uild.pWC->nTerm;
2f140 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
2f150 20 20 20 77 68 65 72 65 54 65 72 6d 50 72 69 6e     whereTermPrin
2f160 74 28 26 73 53 75 62 42 75 69 6c 64 2e 70 57 43  t(&sSubBuild.pWC
2f170 2d 3e 61 5b 69 5d 2c 20 69 29 3b 0a 20 20 20 20  ->a[i], i);.    
2f180 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2f190 7d 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66  }.#endif.#ifndef
2f1a0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
2f1b0 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 20 20  TUALTABLE.      
2f1c0 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28    if( IsVirtual(
2f1d0 70 49 74 65 6d 2d 3e 70 54 61 62 29 20 29 7b 0a  pItem->pTab) ){.
2f1e0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 77            rc = w
2f1f0 68 65 72 65 4c 6f 6f 70 41 64 64 56 69 72 74 75  hereLoopAddVirtu
2f200 61 6c 28 26 73 53 75 62 42 75 69 6c 64 2c 20 6d  al(&sSubBuild, m
2f210 45 78 74 72 61 29 3b 0a 20 20 20 20 20 20 20 20  Extra);.        
2f220 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20  }else.#endif.   
2f230 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20       {.         
2f240 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41   rc = whereLoopA
2f250 64 64 42 74 72 65 65 28 26 73 53 75 62 42 75 69  ddBtree(&sSubBui
2f260 6c 64 2c 20 6d 45 78 74 72 61 29 3b 0a 20 20 20  ld, mExtra);.   
2f270 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
2f280 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2f290 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
2f2a0 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 4f   = whereLoopAddO
2f2b0 72 28 26 73 53 75 62 42 75 69 6c 64 2c 20 6d 45  r(&sSubBuild, mE
2f2c0 78 74 72 61 29 3b 0a 20 20 20 20 20 20 20 20 7d  xtra);.        }
2f2d0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2f2e0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc==SQLITE_OK |
2f2f0 7c 20 73 43 75 72 2e 6e 3d 3d 30 20 29 3b 0a 20  | sCur.n==0 );. 
2f300 20 20 20 20 20 20 20 69 66 28 20 73 43 75 72 2e         if( sCur.
2f310 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  n==0 ){.        
2f320 20 20 73 53 75 6d 2e 6e 20 3d 20 30 3b 0a 20 20    sSum.n = 0;.  
2f330 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
2f340 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
2f350 20 6f 6e 63 65 20 29 7b 0a 20 20 20 20 20 20 20   once ){.       
2f360 20 20 20 77 68 65 72 65 4f 72 4d 6f 76 65 28 26     whereOrMove(&
2f370 73 53 75 6d 2c 20 26 73 43 75 72 29 3b 0a 20 20  sSum, &sCur);.  
2f380 20 20 20 20 20 20 20 20 6f 6e 63 65 20 3d 20 30          once = 0
2f390 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
2f3a0 0a 20 20 20 20 20 20 20 20 20 20 57 68 65 72 65  .          Where
2f3b0 4f 72 53 65 74 20 73 50 72 65 76 3b 0a 20 20 20  OrSet sPrev;.   
2f3c0 20 20 20 20 20 20 20 77 68 65 72 65 4f 72 4d 6f         whereOrMo
2f3d0 76 65 28 26 73 50 72 65 76 2c 20 26 73 53 75 6d  ve(&sPrev, &sSum
2f3e0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 53 75  );.          sSu
2f3f0 6d 2e 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  m.n = 0;.       
2f400 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 50     for(i=0; i<sP
2f410 72 65 76 2e 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  rev.n; i++){.   
2f420 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30           for(j=0
2f430 3b 20 6a 3c 73 43 75 72 2e 6e 3b 20 6a 2b 2b 29  ; j<sCur.n; j++)
2f440 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2f450 77 68 65 72 65 4f 72 49 6e 73 65 72 74 28 26 73  whereOrInsert(&s
2f460 53 75 6d 2c 20 73 50 72 65 76 2e 61 5b 69 5d 2e  Sum, sPrev.a[i].
2f470 70 72 65 72 65 71 20 7c 20 73 43 75 72 2e 61 5b  prereq | sCur.a[
2f480 6a 5d 2e 70 72 65 72 65 71 2c 0a 20 20 20 20 20  j].prereq,.     
2f490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f4a0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4c 6f         sqlite3Lo
2f4b0 67 45 73 74 41 64 64 28 73 50 72 65 76 2e 61 5b  gEstAdd(sPrev.a[
2f4c0 69 5d 2e 72 52 75 6e 2c 20 73 43 75 72 2e 61 5b  i].rRun, sCur.a[
2f4d0 6a 5d 2e 72 52 75 6e 29 2c 0a 20 20 20 20 20 20  j].rRun),.      
2f4e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f4f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 4c 6f 67        sqlite3Log
2f500 45 73 74 41 64 64 28 73 50 72 65 76 2e 61 5b 69  EstAdd(sPrev.a[i
2f510 5d 2e 6e 4f 75 74 2c 20 73 43 75 72 2e 61 5b 6a  ].nOut, sCur.a[j
2f520 5d 2e 6e 4f 75 74 29 29 3b 0a 20 20 20 20 20 20  ].nOut));.      
2f530 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2f540 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
2f550 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4e 65 77      }.      pNew
2f560 2d 3e 6e 4c 54 65 72 6d 20 3d 20 31 3b 0a 20 20  ->nLTerm = 1;.  
2f570 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d      pNew->aLTerm
2f580 5b 30 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20  [0] = pTerm;.   
2f590 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73     pNew->wsFlags
2f5a0 20 3d 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f   = WHERE_MULTI_O
2f5b0 52 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 72  R;.      pNew->r
2f5c0 53 65 74 75 70 20 3d 20 30 3b 0a 20 20 20 20 20  Setup = 0;.     
2f5d0 20 70 4e 65 77 2d 3e 69 53 6f 72 74 49 64 78 20   pNew->iSortIdx 
2f5e0 3d 20 30 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65  = 0;.      memse
2f5f0 74 28 26 70 4e 65 77 2d 3e 75 2c 20 30 2c 20 73  t(&pNew->u, 0, s
2f600 69 7a 65 6f 66 28 70 4e 65 77 2d 3e 75 29 29 3b  izeof(pNew->u));
2f610 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
2f620 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
2f630 20 69 3c 73 53 75 6d 2e 6e 3b 20 69 2b 2b 29 7b   i<sSum.n; i++){
2f640 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 55 4e 49  .        /* TUNI
2f650 4e 47 3a 20 43 75 72 72 65 6e 74 6c 79 20 73 53  NG: Currently sS
2f660 75 6d 2e 61 5b 69 5d 2e 72 52 75 6e 20 69 73 20  um.a[i].rRun is 
2f670 73 65 74 20 74 6f 20 74 68 65 20 73 75 6d 20 6f  set to the sum o
2f680 66 20 74 68 65 20 63 6f 73 74 73 0a 20 20 20 20  f the costs.    
2f690 20 20 20 20 2a 2a 20 6f 66 20 61 6c 6c 20 73 75      ** of all su
2f6a0 62 2d 73 63 61 6e 73 20 72 65 71 75 69 72 65 64  b-scans required
2f6b0 20 62 79 20 74 68 65 20 4f 52 2d 73 63 61 6e 2e   by the OR-scan.
2f6c0 20 48 6f 77 65 76 65 72 2c 20 64 75 65 20 74 6f   However, due to
2f6d0 20 72 6f 75 6e 64 69 6e 67 0a 20 20 20 20 20 20   rounding.      
2f6e0 20 20 2a 2a 20 65 72 72 6f 72 73 2c 20 69 74 20    ** errors, it 
2f6f0 6d 61 79 20 62 65 20 74 68 61 74 20 74 68 65 20  may be that the 
2f700 63 6f 73 74 20 6f 66 20 74 68 65 20 4f 52 2d 73  cost of the OR-s
2f710 63 61 6e 20 69 73 20 65 71 75 61 6c 20 74 6f 20  can is equal to 
2f720 69 74 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d  its.        ** m
2f730 6f 73 74 20 65 78 70 65 6e 73 69 76 65 20 73 75  ost expensive su
2f740 62 2d 73 63 61 6e 2e 20 41 64 64 20 74 68 65 20  b-scan. Add the 
2f750 73 6d 61 6c 6c 65 73 74 20 70 6f 73 73 69 62 6c  smallest possibl
2f760 65 20 70 65 6e 61 6c 74 79 20 0a 20 20 20 20 20  e penalty .     
2f770 20 20 20 2a 2a 20 28 65 71 75 69 76 61 6c 65 6e     ** (equivalen
2f780 74 20 74 6f 20 6d 75 6c 74 69 70 6c 79 69 6e 67  t to multiplying
2f790 20 74 68 65 20 63 6f 73 74 20 62 79 20 31 2e 30   the cost by 1.0
2f7a0 37 29 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61  7) to ensure tha
2f7b0 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  t .        ** th
2f7c0 69 73 20 64 6f 65 73 20 6e 6f 74 20 68 61 70 70  is does not happ
2f7d0 65 6e 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 66  en. Otherwise, f
2f7e0 6f 72 20 57 48 45 52 45 20 63 6c 61 75 73 65 73  or WHERE clauses
2f7f0 20 73 75 63 68 20 61 73 20 74 68 65 0a 20 20 20   such as the.   
2f800 20 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e       ** followin
2f810 67 20 77 68 65 72 65 20 74 68 65 72 65 20 69 73  g where there is
2f820 20 61 6e 20 69 6e 64 65 78 20 6f 6e 20 22 79 22   an index on "y"
2f830 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  :.        **.   
2f840 20 20 20 20 20 2a 2a 20 20 20 20 20 57 48 45 52       **     WHER
2f850 45 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 78 3d 3f  E likelihood(x=?
2f860 2c 20 30 2e 39 39 29 20 4f 52 20 79 3d 3f 0a 20  , 0.99) OR y=?. 
2f870 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
2f880 20 20 2a 2a 20 74 68 65 20 70 6c 61 6e 6e 65 72    ** the planner
2f890 20 6d 61 79 20 65 6c 65 63 74 20 74 6f 20 22 4f   may elect to "O
2f8a0 52 22 20 74 6f 67 65 74 68 65 72 20 61 20 66 75  R" together a fu
2f8b0 6c 6c 2d 74 61 62 6c 65 20 73 63 61 6e 20 61 6e  ll-table scan an
2f8c0 64 20 61 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  d an.        ** 
2f8d0 69 6e 64 65 78 20 6c 6f 6f 6b 75 70 2e 20 41 6e  index lookup. An
2f8e0 64 20 6f 74 68 65 72 20 73 69 6d 69 6c 61 72 6c  d other similarl
2f8f0 79 20 6f 64 64 20 72 65 73 75 6c 74 73 2e 20 20  y odd results.  
2f900 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  */.        pNew-
2f910 3e 72 52 75 6e 20 3d 20 73 53 75 6d 2e 61 5b 69  >rRun = sSum.a[i
2f920 5d 2e 72 52 75 6e 20 2b 20 31 3b 0a 20 20 20 20  ].rRun + 1;.    
2f930 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d      pNew->nOut =
2f940 20 73 53 75 6d 2e 61 5b 69 5d 2e 6e 4f 75 74 3b   sSum.a[i].nOut;
2f950 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70  .        pNew->p
2f960 72 65 72 65 71 20 3d 20 73 53 75 6d 2e 61 5b 69  rereq = sSum.a[i
2f970 5d 2e 70 72 65 72 65 71 3b 0a 20 20 20 20 20 20  ].prereq;.      
2f980 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70    rc = whereLoop
2f990 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c  Insert(pBuilder,
2f9a0 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 7d 0a   pNew);.      }.
2f9b0 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45        WHERETRACE
2f9c0 28 30 78 32 30 30 2c 20 28 22 45 6e 64 20 70 72  (0x200, ("End pr
2f9d0 6f 63 65 73 73 69 6e 67 20 4f 52 2d 63 6c 61 75  ocessing OR-clau
2f9e0 73 65 20 25 70 5c 6e 22 2c 20 70 54 65 72 6d 29  se %p\n", pTerm)
2f9f0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
2fa00 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
2fa10 2a 2a 20 41 64 64 20 61 6c 6c 20 57 68 65 72 65  ** Add all Where
2fa20 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 66 6f 72  Loop objects for
2fa30 20 61 6c 6c 20 74 61 62 6c 65 73 20 0a 2a 2f 0a   all tables .*/.
2fa40 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
2fa50 4c 6f 6f 70 41 64 64 41 6c 6c 28 57 68 65 72 65  LoopAddAll(Where
2fa60 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75  LoopBuilder *pBu
2fa70 69 6c 64 65 72 29 7b 0a 20 20 57 68 65 72 65 49  ilder){.  WhereI
2fa80 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70 42  nfo *pWInfo = pB
2fa90 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a  uilder->pWInfo;.
2faa0 20 20 42 69 74 6d 61 73 6b 20 6d 45 78 74 72 61    Bitmask mExtra
2fab0 20 3d 20 30 3b 0a 20 20 42 69 74 6d 61 73 6b 20   = 0;.  Bitmask 
2fac0 6d 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 69 6e  mPrior = 0;.  in
2fad0 74 20 69 54 61 62 3b 0a 20 20 53 72 63 4c 69 73  t iTab;.  SrcLis
2fae0 74 20 2a 70 54 61 62 4c 69 73 74 20 3d 20 70 57  t *pTabList = pW
2faf0 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 3b 0a  Info->pTabList;.
2fb00 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
2fb10 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
2fb20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 57  sqlite3 *db = pW
2fb30 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62  Info->pParse->db
2fb40 3b 0a 20 20 69 6e 74 20 6e 54 61 62 4c 69 73 74  ;.  int nTabList
2fb50 20 3d 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65   = pWInfo->nLeve
2fb60 6c 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  l;.  int rc = SQ
2fb70 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 38 20 70 72  LITE_OK;.  u8 pr
2fb80 69 6f 72 4a 6f 69 6e 54 79 70 65 20 3d 20 30 3b  iorJoinType = 0;
2fb90 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e  .  WhereLoop *pN
2fba0 65 77 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20 6f  ew;..  /* Loop o
2fbb0 76 65 72 20 74 68 65 20 74 61 62 6c 65 73 20 69  ver the tables i
2fbc0 6e 20 74 68 65 20 6a 6f 69 6e 2c 20 66 72 6f 6d  n the join, from
2fbd0 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74 20 2a   left to right *
2fbe0 2f 0a 20 20 70 4e 65 77 20 3d 20 70 42 75 69 6c  /.  pNew = pBuil
2fbf0 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 77 68 65  der->pNew;.  whe
2fc00 72 65 4c 6f 6f 70 49 6e 69 74 28 70 4e 65 77 29  reLoopInit(pNew)
2fc10 3b 0a 20 20 66 6f 72 28 69 54 61 62 3d 30 2c 20  ;.  for(iTab=0, 
2fc20 70 49 74 65 6d 3d 70 54 61 62 4c 69 73 74 2d 3e  pItem=pTabList->
2fc30 61 3b 20 69 54 61 62 3c 6e 54 61 62 4c 69 73 74  a; iTab<nTabList
2fc40 3b 20 69 54 61 62 2b 2b 2c 20 70 49 74 65 6d 2b  ; iTab++, pItem+
2fc50 2b 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 54  +){.    pNew->iT
2fc60 61 62 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 70  ab = iTab;.    p
2fc70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 20 3d 20  New->maskSelf = 
2fc80 67 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d  getMask(&pWInfo-
2fc90 3e 73 4d 61 73 6b 53 65 74 2c 20 70 49 74 65 6d  >sMaskSet, pItem
2fca0 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  ->iCursor);.    
2fcb0 69 66 28 20 28 28 70 49 74 65 6d 2d 3e 6a 6f 69  if( ((pItem->joi
2fcc0 6e 74 79 70 65 7c 70 72 69 6f 72 4a 6f 69 6e 54  ntype|priorJoinT
2fcd0 79 70 65 29 20 26 20 28 4a 54 5f 4c 45 46 54 7c  ype) & (JT_LEFT|
2fce0 4a 54 5f 43 52 4f 53 53 29 29 21 3d 30 20 29 7b  JT_CROSS))!=0 ){
2fcf0 0a 20 20 20 20 20 20 6d 45 78 74 72 61 20 3d 20  .      mExtra = 
2fd00 6d 50 72 69 6f 72 3b 0a 20 20 20 20 7d 0a 20 20  mPrior;.    }.  
2fd10 20 20 70 72 69 6f 72 4a 6f 69 6e 54 79 70 65 20    priorJoinType 
2fd20 3d 20 70 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70  = pItem->jointyp
2fd30 65 3b 0a 20 20 20 20 69 66 28 20 49 73 56 69 72  e;.    if( IsVir
2fd40 74 75 61 6c 28 70 49 74 65 6d 2d 3e 70 54 61 62  tual(pItem->pTab
2fd50 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) ){.      rc = 
2fd60 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 69 72 74  whereLoopAddVirt
2fd70 75 61 6c 28 70 42 75 69 6c 64 65 72 2c 20 6d 45  ual(pBuilder, mE
2fd80 78 74 72 61 29 3b 0a 20 20 20 20 7d 65 6c 73 65  xtra);.    }else
2fd90 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68 65  {.      rc = whe
2fda0 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 28 70  reLoopAddBtree(p
2fdb0 42 75 69 6c 64 65 72 2c 20 6d 45 78 74 72 61 29  Builder, mExtra)
2fdc0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2fdd0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2fde0 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72  .      rc = wher
2fdf0 65 4c 6f 6f 70 41 64 64 4f 72 28 70 42 75 69 6c  eLoopAddOr(pBuil
2fe00 64 65 72 2c 20 6d 45 78 74 72 61 29 3b 0a 20 20  der, mExtra);.  
2fe10 20 20 7d 0a 20 20 20 20 6d 50 72 69 6f 72 20 7c    }.    mPrior |
2fe20 3d 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66  = pNew->maskSelf
2fe30 3b 0a 20 20 20 20 69 66 28 20 72 63 20 7c 7c 20  ;.    if( rc || 
2fe40 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
2fe50 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20   ) break;.  }.  
2fe60 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 28 64  whereLoopClear(d
2fe70 62 2c 20 70 4e 65 77 29 3b 0a 20 20 72 65 74 75  b, pNew);.  retu
2fe80 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
2fe90 45 78 61 6d 69 6e 65 20 61 20 57 68 65 72 65 50  Examine a WhereP
2fea0 61 74 68 20 28 77 69 74 68 20 74 68 65 20 61 64  ath (with the ad
2feb0 64 69 74 69 6f 6e 20 6f 66 20 74 68 65 20 65 78  dition of the ex
2fec0 74 72 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f 66  tra WhereLoop of
2fed0 20 74 68 65 20 35 74 68 0a 2a 2a 20 70 61 72 61   the 5th.** para
2fee0 6d 65 74 65 72 73 29 20 74 6f 20 73 65 65 20 69  meters) to see i
2fef0 66 20 69 74 20 6f 75 74 70 75 74 73 20 72 6f 77  f it outputs row
2ff00 73 20 69 6e 20 74 68 65 20 72 65 71 75 65 73 74  s in the request
2ff10 65 64 20 4f 52 44 45 52 20 42 59 0a 2a 2a 20 28  ed ORDER BY.** (
2ff20 6f 72 20 47 52 4f 55 50 20 42 59 29 20 77 69 74  or GROUP BY) wit
2ff30 68 6f 75 74 20 72 65 71 75 69 72 69 6e 67 20 61  hout requiring a
2ff40 20 73 65 70 61 72 61 74 65 20 73 6f 72 74 20 6f   separate sort o
2ff50 70 65 72 61 74 69 6f 6e 2e 20 20 52 65 74 75 72  peration.  Retur
2ff60 6e 20 4e 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 4e 3e  n N:.** .**   N>
2ff70 30 3a 20 20 20 4e 20 74 65 72 6d 73 20 6f 66 20  0:   N terms of 
2ff80 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
2ff90 75 73 65 20 61 72 65 20 73 61 74 69 73 66 69 65  use are satisfie
2ffa0 64 0a 2a 2a 20 20 20 4e 3d 3d 30 3a 20 20 4e 6f  d.**   N==0:  No
2ffb0 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 4f 52   terms of the OR
2ffc0 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 72  DER BY clause ar
2ffd0 65 20 73 61 74 69 73 66 69 65 64 0a 2a 2a 20 20  e satisfied.**  
2ffe0 20 4e 3c 30 3a 20 20 20 55 6e 6b 6e 6f 77 6e 20   N<0:   Unknown 
2fff0 79 65 74 20 68 6f 77 20 6d 61 6e 79 20 74 65 72  yet how many ter
30000 6d 73 20 6f 66 20 4f 52 44 45 52 20 42 59 20 6d  ms of ORDER BY m
30010 69 67 68 74 20 62 65 20 73 61 74 69 73 66 69 65  ight be satisfie
30020 64 2e 20 20 20 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65  d.   .**.** Note
30030 20 74 68 61 74 20 70 72 6f 63 65 73 73 69 6e 67   that processing
30040 20 66 6f 72 20 57 48 45 52 45 5f 47 52 4f 55 50   for WHERE_GROUP
30050 42 59 20 61 6e 64 20 57 48 45 52 45 5f 44 49 53  BY and WHERE_DIS
30060 54 49 4e 43 54 42 59 20 69 73 20 6e 6f 74 20 61  TINCTBY is not a
30070 73 0a 2a 2a 20 73 74 72 69 63 74 2e 20 20 57 69  s.** strict.  Wi
30080 74 68 20 47 52 4f 55 50 20 42 59 20 61 6e 64 20  th GROUP BY and 
30090 44 49 53 54 49 4e 43 54 20 74 68 65 20 6f 6e 6c  DISTINCT the onl
300a0 79 20 72 65 71 75 69 72 65 6d 65 6e 74 20 69 73  y requirement is
300b0 20 74 68 61 74 0a 2a 2a 20 65 71 75 69 76 61 6c   that.** equival
300c0 65 6e 74 20 72 6f 77 73 20 61 70 70 65 61 72 20  ent rows appear 
300d0 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 64 6a 61  immediately adja
300e0 63 65 6e 74 20 74 6f 20 6f 6e 65 20 61 6e 6f 74  cent to one anot
300f0 68 65 72 2e 20 20 47 52 4f 55 50 20 42 59 0a 2a  her.  GROUP BY.*
30100 2a 20 61 6e 64 20 44 49 53 54 49 4e 43 54 20 64  * and DISTINCT d
30110 6f 20 6e 6f 74 20 72 65 71 75 69 72 65 20 72 6f  o not require ro
30120 77 73 20 74 6f 20 61 70 70 65 61 72 20 69 6e 20  ws to appear in 
30130 61 6e 79 20 70 61 72 74 69 63 75 6c 61 72 20 6f  any particular o
30140 72 64 65 72 20 61 73 20 6c 6f 6e 67 0a 2a 2a 20  rder as long.** 
30150 61 73 20 65 71 75 69 76 61 6c 65 6e 74 20 72 6f  as equivalent ro
30160 77 73 20 61 72 65 20 67 72 6f 75 70 65 64 20 74  ws are grouped t
30170 6f 67 65 74 68 65 72 2e 20 20 54 68 75 73 20 66  ogether.  Thus f
30180 6f 72 20 47 52 4f 55 50 20 42 59 20 61 6e 64 20  or GROUP BY and 
30190 44 49 53 54 49 4e 43 54 0a 2a 2a 20 74 68 65 20  DISTINCT.** the 
301a0 70 4f 72 64 65 72 42 79 20 74 65 72 6d 73 20 63  pOrderBy terms c
301b0 61 6e 20 62 65 20 6d 61 74 63 68 65 64 20 69 6e  an be matched in
301c0 20 61 6e 79 20 6f 72 64 65 72 2e 20 20 57 69 74   any order.  Wit
301d0 68 20 4f 52 44 45 52 20 42 59 2c 20 74 68 65 20  h ORDER BY, the 
301e0 0a 2a 2a 20 70 4f 72 64 65 72 42 79 20 74 65 72  .** pOrderBy ter
301f0 6d 73 20 6d 75 73 74 20 62 65 20 6d 61 74 63 68  ms must be match
30200 65 64 20 69 6e 20 73 74 72 69 63 74 20 6c 65 66  ed in strict lef
30210 74 2d 74 6f 2d 72 69 67 68 74 20 6f 72 64 65 72  t-to-right order
30220 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 38 20 77  ..*/.static i8 w
30230 68 65 72 65 50 61 74 68 53 61 74 69 73 66 69 65  herePathSatisfie
30240 73 4f 72 64 65 72 42 79 28 0a 20 20 57 68 65 72  sOrderBy(.  Wher
30250 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 20 20  eInfo *pWInfo,  
30260 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63    /* The WHERE c
30270 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c  lause */.  ExprL
30280 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20  ist *pOrderBy,  
30290 20 2f 2a 20 4f 52 44 45 52 20 42 59 20 6f 72 20   /* ORDER BY or 
302a0 47 52 4f 55 50 20 42 59 20 6f 72 20 44 49 53 54  GROUP BY or DIST
302b0 49 4e 43 54 20 63 6c 61 75 73 65 20 74 6f 20 63  INCT clause to c
302c0 68 65 63 6b 20 2a 2f 0a 20 20 57 68 65 72 65 50  heck */.  WhereP
302d0 61 74 68 20 2a 70 50 61 74 68 2c 20 20 20 20 20  ath *pPath,     
302e0 2f 2a 20 54 68 65 20 57 68 65 72 65 50 61 74 68  /* The WherePath
302f0 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20 75   to check */.  u
30300 31 36 20 77 63 74 72 6c 46 6c 61 67 73 2c 20 20  16 wctrlFlags,  
30310 20 20 20 20 20 2f 2a 20 4d 69 67 68 74 20 63 6f       /* Might co
30320 6e 74 61 69 6e 20 57 48 45 52 45 5f 47 52 4f 55  ntain WHERE_GROU
30330 50 42 59 20 6f 72 20 57 48 45 52 45 5f 44 49 53  PBY or WHERE_DIS
30340 54 49 4e 43 54 42 59 20 2a 2f 0a 20 20 75 31 36  TINCTBY */.  u16
30350 20 6e 4c 6f 6f 70 2c 20 20 20 20 20 20 20 20 20   nLoop,         
30360 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
30370 65 6e 74 72 69 65 73 20 69 6e 20 70 50 61 74 68  entries in pPath
30380 2d 3e 61 4c 6f 6f 70 5b 5d 20 2a 2f 0a 20 20 57  ->aLoop[] */.  W
30390 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 61 73 74 2c  hereLoop *pLast,
303a0 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 69 73       /* Add this
303b0 20 57 68 65 72 65 4c 6f 6f 70 20 74 6f 20 74 68   WhereLoop to th
303c0 65 20 65 6e 64 20 6f 66 20 70 50 61 74 68 2d 3e  e end of pPath->
303d0 61 4c 6f 6f 70 5b 5d 20 2a 2f 0a 20 20 42 69 74  aLoop[] */.  Bit
303e0 6d 61 73 6b 20 2a 70 52 65 76 4d 61 73 6b 20 20  mask *pRevMask  
303f0 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 61 73 6b 20     /* OUT: Mask 
30400 6f 66 20 57 68 65 72 65 4c 6f 6f 70 73 20 74 6f  of WhereLoops to
30410 20 72 75 6e 20 69 6e 20 72 65 76 65 72 73 65 20   run in reverse 
30420 6f 72 64 65 72 20 2a 2f 0a 29 7b 0a 20 20 75 38  order */.){.  u8
30430 20 72 65 76 53 65 74 3b 20 20 20 20 20 20 20 20   revSet;        
30440 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 72      /* True if r
30450 65 76 20 69 73 20 6b 6e 6f 77 6e 20 2a 2f 0a 20  ev is known */. 
30460 20 75 38 20 72 65 76 3b 20 20 20 20 20 20 20 20   u8 rev;        
30470 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 6f 73         /* Compos
30480 69 74 65 20 73 6f 72 74 20 6f 72 64 65 72 20 2a  ite sort order *
30490 2f 0a 20 20 75 38 20 72 65 76 49 64 78 3b 20 20  /.  u8 revIdx;  
304a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
304b0 65 78 20 73 6f 72 74 20 6f 72 64 65 72 20 2a 2f  ex sort order */
304c0 0a 20 20 75 38 20 69 73 4f 72 64 65 72 44 69 73  .  u8 isOrderDis
304d0 74 69 6e 63 74 3b 20 20 20 2f 2a 20 41 6c 6c 20  tinct;   /* All 
304e0 70 72 69 6f 72 20 57 68 65 72 65 4c 6f 6f 70 73  prior WhereLoops
304f0 20 61 72 65 20 6f 72 64 65 72 2d 64 69 73 74 69   are order-disti
30500 6e 63 74 20 2a 2f 0a 20 20 75 38 20 64 69 73 74  nct */.  u8 dist
30510 69 6e 63 74 43 6f 6c 75 6d 6e 73 3b 20 20 20 2f  inctColumns;   /
30520 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 6c 6f  * True if the lo
30530 6f 70 20 68 61 73 20 55 4e 49 51 55 45 20 4e 4f  op has UNIQUE NO
30540 54 20 4e 55 4c 4c 20 63 6f 6c 75 6d 6e 73 20 2a  T NULL columns *
30550 2f 0a 20 20 75 38 20 69 73 4d 61 74 63 68 3b 20  /.  u8 isMatch; 
30560 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 43 6f            /* iCo
30570 6c 75 6d 6e 20 6d 61 74 63 68 65 73 20 61 20 74  lumn matches a t
30580 65 72 6d 20 6f 66 20 74 68 65 20 4f 52 44 45 52  erm of the ORDER
30590 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
305a0 75 31 36 20 6e 4b 65 79 43 6f 6c 3b 20 20 20 20  u16 nKeyCol;    
305b0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
305c0 6f 66 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 20 69  of key columns i
305d0 6e 20 70 49 6e 64 65 78 20 2a 2f 0a 20 20 75 31  n pIndex */.  u1
305e0 36 20 6e 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20  6 nColumn;      
305f0 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d      /* Total num
30600 62 65 72 20 6f 66 20 6f 72 64 65 72 65 64 20 63  ber of ordered c
30610 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 69 6e  olumns in the in
30620 64 65 78 20 2a 2f 0a 20 20 75 31 36 20 6e 4f 72  dex */.  u16 nOr
30630 64 65 72 42 79 3b 20 20 20 20 20 20 20 20 20 2f  derBy;         /
30640 2a 20 4e 75 6d 62 65 72 20 74 65 72 6d 73 20 69  * Number terms i
30650 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  n the ORDER BY c
30660 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69  lause */.  int i
30670 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  Loop;           
30680 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 57 68 65   /* Index of Whe
30690 72 65 4c 6f 6f 70 20 69 6e 20 70 50 61 74 68 20  reLoop in pPath 
306a0 62 65 69 6e 67 20 70 72 6f 63 65 73 73 65 64 20  being processed 
306b0 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20  */.  int i, j;  
306c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
306d0 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20  op counters */. 
306e0 20 69 6e 74 20 69 43 75 72 3b 20 20 20 20 20 20   int iCur;      
306f0 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72         /* Cursor
30700 20 6e 75 6d 62 65 72 20 66 6f 72 20 63 75 72 72   number for curr
30710 65 6e 74 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2f  ent WhereLoop */
30720 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 3b 20  .  int iColumn; 
30730 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 63 6f           /* A co
30740 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 77 69 74 68  lumn number with
30750 69 6e 20 74 61 62 6c 65 20 69 43 75 72 20 2a 2f  in table iCur */
30760 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c  .  WhereLoop *pL
30770 6f 6f 70 20 3d 20 30 3b 20 2f 2a 20 43 75 72 72  oop = 0; /* Curr
30780 65 6e 74 20 57 68 65 72 65 4c 6f 6f 70 20 62 65  ent WhereLoop be
30790 69 6e 67 20 70 72 6f 63 65 73 73 65 64 2e 20 2a  ing processed. *
307a0 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  /.  WhereTerm *p
307b0 54 65 72 6d 3b 20 20 20 20 20 2f 2a 20 41 20 73  Term;     /* A s
307c0 69 6e 67 6c 65 20 74 65 72 6d 20 6f 66 20 74 68  ingle term of th
307d0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
307e0 2f 0a 20 20 45 78 70 72 20 2a 70 4f 42 45 78 70  /.  Expr *pOBExp
307f0 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20  r;        /* An 
30800 65 78 70 72 65 73 73 69 6f 6e 20 66 72 6f 6d 20  expression from 
30810 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
30820 75 73 65 20 2a 2f 0a 20 20 43 6f 6c 6c 53 65 71  use */.  CollSeq
30830 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20 2f   *pColl;       /
30840 2a 20 43 4f 4c 4c 41 54 45 20 66 75 6e 63 74 69  * COLLATE functi
30850 6f 6e 20 66 72 6f 6d 20 61 6e 20 4f 52 44 45 52  on from an ORDER
30860 20 42 59 20 63 6c 61 75 73 65 20 74 65 72 6d 20   BY clause term 
30870 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64  */.  Index *pInd
30880 65 78 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ex;        /* Th
30890 65 20 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74  e index associat
308a0 65 64 20 77 69 74 68 20 70 4c 6f 6f 70 20 2a 2f  ed with pLoop */
308b0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
308c0 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d   pWInfo->pParse-
308d0 3e 64 62 3b 20 20 2f 2a 20 44 61 74 61 62 61 73  >db;  /* Databas
308e0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
308f0 20 20 42 69 74 6d 61 73 6b 20 6f 62 53 61 74 20    Bitmask obSat 
30900 3d 20 30 3b 20 20 20 20 2f 2a 20 4d 61 73 6b 20  = 0;    /* Mask 
30910 6f 66 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d  of ORDER BY term
30920 73 20 73 61 74 69 73 66 69 65 64 20 73 6f 20 66  s satisfied so f
30930 61 72 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  ar */.  Bitmask 
30940 6f 62 44 6f 6e 65 3b 20 20 20 20 20 20 20 2f 2a  obDone;       /*
30950 20 4d 61 73 6b 20 6f 66 20 61 6c 6c 20 4f 52 44   Mask of all ORD
30960 45 52 20 42 59 20 74 65 72 6d 73 20 2a 2f 0a 20  ER BY terms */. 
30970 20 42 69 74 6d 61 73 6b 20 6f 72 64 65 72 44 69   Bitmask orderDi
30980 73 74 69 6e 63 74 4d 61 73 6b 3b 20 20 2f 2a 20  stinctMask;  /* 
30990 4d 61 73 6b 20 6f 66 20 61 6c 6c 20 77 65 6c 6c  Mask of all well
309a0 2d 6f 72 64 65 72 65 64 20 6c 6f 6f 70 73 20 2a  -ordered loops *
309b0 2f 0a 20 20 42 69 74 6d 61 73 6b 20 72 65 61 64  /.  Bitmask read
309c0 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y;              
309d0 2f 2a 20 4d 61 73 6b 20 6f 66 20 69 6e 6e 65 72  /* Mask of inner
309e0 20 6c 6f 6f 70 73 20 2a 2f 0a 0a 20 20 2f 2a 0a   loops */..  /*.
309f0 20 20 2a 2a 20 57 65 20 73 61 79 20 74 68 65 20    ** We say the 
30a00 57 68 65 72 65 4c 6f 6f 70 20 69 73 20 22 6f 6e  WhereLoop is "on
30a10 65 2d 72 6f 77 22 20 69 66 20 69 74 20 67 65 6e  e-row" if it gen
30a20 65 72 61 74 65 73 20 6e 6f 20 6d 6f 72 65 20 74  erates no more t
30a30 68 61 6e 20 6f 6e 65 0a 20 20 2a 2a 20 72 6f 77  han one.  ** row
30a40 20 6f 66 20 6f 75 74 70 75 74 2e 20 20 41 20 57   of output.  A W
30a50 68 65 72 65 4c 6f 6f 70 20 69 73 20 6f 6e 65 2d  hereLoop is one-
30a60 72 6f 77 20 69 66 20 61 6c 6c 20 6f 66 20 74 68  row if all of th
30a70 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20  e following are 
30a80 74 72 75 65 3a 0a 20 20 2a 2a 20 20 28 61 29 20  true:.  **  (a) 
30a90 41 6c 6c 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e  All index column
30aa0 73 20 6d 61 74 63 68 20 77 69 74 68 20 57 48 45  s match with WHE
30ab0 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 2e 0a 20 20  RE_COLUMN_EQ..  
30ac0 2a 2a 20 20 28 62 29 20 54 68 65 20 69 6e 64 65  **  (b) The inde
30ad0 78 20 69 73 20 75 6e 69 71 75 65 0a 20 20 2a 2a  x is unique.  **
30ae0 20 41 6e 79 20 57 68 65 72 65 4c 6f 6f 70 20 77   Any WhereLoop w
30af0 69 74 68 20 61 6e 20 57 48 45 52 45 5f 43 4f 4c  ith an WHERE_COL
30b00 55 4d 4e 5f 45 51 20 63 6f 6e 73 74 72 61 69 6e  UMN_EQ constrain
30b10 74 20 6f 6e 20 74 68 65 20 72 6f 77 69 64 20 69  t on the rowid i
30b20 73 20 6f 6e 65 2d 72 6f 77 2e 0a 20 20 2a 2a 20  s one-row..  ** 
30b30 45 76 65 72 79 20 6f 6e 65 2d 72 6f 77 20 57 68  Every one-row Wh
30b40 65 72 65 4c 6f 6f 70 20 77 69 6c 6c 20 68 61 76  ereLoop will hav
30b50 65 20 74 68 65 20 57 48 45 52 45 5f 4f 4e 45 52  e the WHERE_ONER
30b60 4f 57 20 62 69 74 20 73 65 74 20 69 6e 20 77 73  OW bit set in ws
30b70 46 6c 61 67 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  Flags..  **.  **
30b80 20 57 65 20 73 61 79 20 74 68 65 20 57 68 65 72   We say the Wher
30b90 65 4c 6f 6f 70 20 69 73 20 22 6f 72 64 65 72 2d  eLoop is "order-
30ba0 64 69 73 74 69 6e 63 74 22 20 69 66 20 74 68 65  distinct" if the
30bb0 20 73 65 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20   set of columns 
30bc0 66 72 6f 6d 0a 20 20 2a 2a 20 74 68 61 74 20 57  from.  ** that W
30bd0 68 65 72 65 4c 6f 6f 70 20 74 68 61 74 20 61 72  hereLoop that ar
30be0 65 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42  e in the ORDER B
30bf0 59 20 63 6c 61 75 73 65 20 61 72 65 20 64 69 66  Y clause are dif
30c00 66 65 72 65 6e 74 20 66 6f 72 20 65 76 65 72 79  ferent for every
30c10 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20 74 68 65  .  ** row of the
30c20 20 57 68 65 72 65 4c 6f 6f 70 2e 20 20 45 76 65   WhereLoop.  Eve
30c30 72 79 20 6f 6e 65 2d 72 6f 77 20 57 68 65 72 65  ry one-row Where
30c40 4c 6f 6f 70 20 69 73 20 61 75 74 6f 6d 61 74 69  Loop is automati
30c50 63 61 6c 6c 79 0a 20 20 2a 2a 20 6f 72 64 65 72  cally.  ** order
30c60 2d 64 69 73 74 69 6e 63 74 2e 20 20 20 41 20 57  -distinct.   A W
30c70 68 65 72 65 4c 6f 6f 70 20 74 68 61 74 20 68 61  hereLoop that ha
30c80 73 20 6e 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  s no columns in 
30c90 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
30ca0 75 73 65 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20  use.  ** is not 
30cb0 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74 2e 20  order-distinct. 
30cc0 54 6f 20 62 65 20 6f 72 64 65 72 2d 64 69 73 74  To be order-dist
30cd0 69 6e 63 74 20 69 73 20 6e 6f 74 20 71 75 69 74  inct is not quit
30ce0 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 62 65  e the same as be
30cf0 69 6e 67 0a 20 20 2a 2a 20 55 4e 49 51 55 45 20  ing.  ** UNIQUE 
30d00 73 69 6e 63 65 20 61 20 55 4e 49 51 55 45 20 63  since a UNIQUE c
30d10 6f 6c 75 6d 6e 20 6f 72 20 69 6e 64 65 78 20 63  olumn or index c
30d20 61 6e 20 68 61 76 65 20 6d 75 6c 74 69 70 6c 65  an have multiple
30d30 20 72 6f 77 73 20 74 68 61 74 20 0a 20 20 2a 2a   rows that .  **
30d40 20 61 72 65 20 4e 55 4c 4c 20 61 6e 64 20 4e 55   are NULL and NU
30d50 4c 4c 20 76 61 6c 75 65 73 20 61 72 65 20 65 71  LL values are eq
30d60 75 69 76 61 6c 65 6e 74 20 66 6f 72 20 74 68 65  uivalent for the
30d70 20 70 75 72 70 6f 73 65 20 6f 66 20 6f 72 64 65   purpose of orde
30d80 72 2d 64 69 73 74 69 6e 63 74 2e 0a 20 20 2a 2a  r-distinct..  **
30d90 20 54 6f 20 62 65 20 6f 72 64 65 72 2d 64 69 73   To be order-dis
30da0 74 69 6e 63 74 2c 20 74 68 65 20 63 6f 6c 75 6d  tinct, the colum
30db0 6e 73 20 6d 75 73 74 20 62 65 20 55 4e 49 51 55  ns must be UNIQU
30dc0 45 20 61 6e 64 20 4e 4f 54 20 4e 55 4c 4c 2e 0a  E and NOT NULL..
30dd0 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 72 6f    **.  ** The ro
30de0 77 69 64 20 66 6f 72 20 61 20 74 61 62 6c 65 20  wid for a table 
30df0 69 73 20 61 6c 77 61 79 73 20 55 4e 49 51 55 45  is always UNIQUE
30e00 20 61 6e 64 20 4e 4f 54 20 4e 55 4c 4c 20 73 6f   and NOT NULL so
30e10 20 77 68 65 6e 65 76 65 72 20 74 68 65 0a 20 20   whenever the.  
30e20 2a 2a 20 72 6f 77 69 64 20 61 70 70 65 61 72 73  ** rowid appears
30e30 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59   in the ORDER BY
30e40 20 63 6c 61 75 73 65 2c 20 74 68 65 20 63 6f 72   clause, the cor
30e50 72 65 73 70 6f 6e 64 69 6e 67 20 57 68 65 72 65  responding Where
30e60 4c 6f 6f 70 20 69 73 0a 20 20 2a 2a 20 61 75 74  Loop is.  ** aut
30e70 6f 6d 61 74 69 63 61 6c 6c 79 20 6f 72 64 65 72  omatically order
30e80 2d 64 69 73 74 69 6e 63 74 2e 0a 20 20 2a 2f 0a  -distinct..  */.
30e90 0a 20 20 61 73 73 65 72 74 28 20 70 4f 72 64 65  .  assert( pOrde
30ea0 72 42 79 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  rBy!=0 );.  if( 
30eb0 6e 4c 6f 6f 70 20 26 26 20 4f 70 74 69 6d 69 7a  nLoop && Optimiz
30ec0 61 74 69 6f 6e 44 69 73 61 62 6c 65 64 28 64 62  ationDisabled(db
30ed0 2c 20 53 51 4c 49 54 45 5f 4f 72 64 65 72 42 79  , SQLITE_OrderBy
30ee0 49 64 78 4a 6f 69 6e 29 20 29 20 72 65 74 75 72  IdxJoin) ) retur
30ef0 6e 20 30 3b 0a 0a 20 20 6e 4f 72 64 65 72 42 79  n 0;..  nOrderBy
30f00 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78   = pOrderBy->nEx
30f10 70 72 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20  pr;.  testcase( 
30f20 6e 4f 72 64 65 72 42 79 3d 3d 42 4d 53 2d 31 20  nOrderBy==BMS-1 
30f30 29 3b 0a 20 20 69 66 28 20 6e 4f 72 64 65 72 42  );.  if( nOrderB
30f40 79 3e 42 4d 53 2d 31 20 29 20 72 65 74 75 72 6e  y>BMS-1 ) return
30f50 20 30 3b 20 20 2f 2a 20 43 61 6e 6e 6f 74 20 6f   0;  /* Cannot o
30f60 70 74 69 6d 69 7a 65 20 6f 76 65 72 6c 79 20 6c  ptimize overly l
30f70 61 72 67 65 20 4f 52 44 45 52 20 42 59 73 20 2a  arge ORDER BYs *
30f80 2f 0a 20 20 69 73 4f 72 64 65 72 44 69 73 74 69  /.  isOrderDisti
30f90 6e 63 74 20 3d 20 31 3b 0a 20 20 6f 62 44 6f 6e  nct = 1;.  obDon
30fa0 65 20 3d 20 4d 41 53 4b 42 49 54 28 6e 4f 72 64  e = MASKBIT(nOrd
30fb0 65 72 42 79 29 2d 31 3b 0a 20 20 6f 72 64 65 72  erBy)-1;.  order
30fc0 44 69 73 74 69 6e 63 74 4d 61 73 6b 20 3d 20 30  DistinctMask = 0
30fd0 3b 0a 20 20 72 65 61 64 79 20 3d 20 30 3b 0a 20  ;.  ready = 0;. 
30fe0 20 66 6f 72 28 69 4c 6f 6f 70 3d 30 3b 20 69 73   for(iLoop=0; is
30ff0 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 26 26  OrderDistinct &&
31000 20 6f 62 53 61 74 3c 6f 62 44 6f 6e 65 20 26 26   obSat<obDone &&
31010 20 69 4c 6f 6f 70 3c 3d 6e 4c 6f 6f 70 3b 20 69   iLoop<=nLoop; i
31020 4c 6f 6f 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28  Loop++){.    if(
31030 20 69 4c 6f 6f 70 3e 30 20 29 20 72 65 61 64 79   iLoop>0 ) ready
31040 20 7c 3d 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53   |= pLoop->maskS
31050 65 6c 66 3b 0a 20 20 20 20 70 4c 6f 6f 70 20 3d  elf;.    pLoop =
31060 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70 20 3f 20 70   iLoop<nLoop ? p
31070 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b 69 4c 6f 6f  Path->aLoop[iLoo
31080 70 5d 20 3a 20 70 4c 61 73 74 3b 0a 20 20 20 20  p] : pLast;.    
31090 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  if( pLoop->wsFla
310a0 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55  gs & WHERE_VIRTU
310b0 41 4c 54 41 42 4c 45 20 29 7b 0a 20 20 20 20 20  ALTABLE ){.     
310c0 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74   if( pLoop->u.vt
310d0 61 62 2e 69 73 4f 72 64 65 72 65 64 20 29 20 6f  ab.isOrdered ) o
310e0 62 53 61 74 20 3d 20 6f 62 44 6f 6e 65 3b 0a 20  bSat = obDone;. 
310f0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
31100 7d 0a 20 20 20 20 69 43 75 72 20 3d 20 70 57 49  }.    iCur = pWI
31110 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61  nfo->pTabList->a
31120 5b 70 4c 6f 6f 70 2d 3e 69 54 61 62 5d 2e 69 43  [pLoop->iTab].iC
31130 75 72 73 6f 72 3b 0a 0a 20 20 20 20 2f 2a 20 4d  ursor;..    /* M
31140 61 72 6b 20 6f 66 66 20 61 6e 79 20 4f 52 44 45  ark off any ORDE
31150 52 20 42 59 20 74 65 72 6d 20 58 20 74 68 61 74  R BY term X that
31160 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20   is a column in 
31170 74 68 65 20 74 61 62 6c 65 20 6f 66 0a 20 20 20  the table of.   
31180 20 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20   ** the current 
31190 6c 6f 6f 70 20 66 6f 72 20 77 68 69 63 68 20 74  loop for which t
311a0 68 65 72 65 20 69 73 20 74 65 72 6d 20 69 6e 20  here is term in 
311b0 74 68 65 20 57 48 45 52 45 0a 20 20 20 20 2a 2a  the WHERE.    **
311c0 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 66   clause of the f
311d0 6f 72 6d 20 58 20 49 53 20 4e 55 4c 4c 20 6f 72  orm X IS NULL or
311e0 20 58 3d 3f 20 74 68 61 74 20 72 65 66 65 72 65   X=? that refere
311f0 6e 63 65 20 6f 6e 6c 79 20 6f 75 74 65 72 0a 20  nce only outer. 
31200 20 20 20 2a 2a 20 6c 6f 6f 70 73 2e 0a 20 20 20     ** loops..   
31210 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   */.    for(i=0;
31220 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b   i<nOrderBy; i++
31230 29 7b 0a 20 20 20 20 20 20 69 66 28 20 4d 41 53  ){.      if( MAS
31240 4b 42 49 54 28 69 29 20 26 20 6f 62 53 61 74 20  KBIT(i) & obSat 
31250 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
31260 20 20 70 4f 42 45 78 70 72 20 3d 20 73 71 6c 69    pOBExpr = sqli
31270 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61  te3ExprSkipColla
31280 74 65 28 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69  te(pOrderBy->a[i
31290 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
312a0 69 66 28 20 70 4f 42 45 78 70 72 2d 3e 6f 70 21  if( pOBExpr->op!
312b0 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 63 6f 6e  =TK_COLUMN ) con
312c0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28  tinue;.      if(
312d0 20 70 4f 42 45 78 70 72 2d 3e 69 54 61 62 6c 65   pOBExpr->iTable
312e0 21 3d 69 43 75 72 20 29 20 63 6f 6e 74 69 6e 75  !=iCur ) continu
312f0 65 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d  e;.      pTerm =
31300 20 66 69 6e 64 54 65 72 6d 28 26 70 57 49 6e 66   findTerm(&pWInf
31310 6f 2d 3e 73 57 43 2c 20 69 43 75 72 2c 20 70 4f  o->sWC, iCur, pO
31320 42 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 0a  BExpr->iColumn,.
31330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31340 20 20 20 20 20 20 20 7e 72 65 61 64 79 2c 20 57         ~ready, W
31350 4f 5f 45 51 7c 57 4f 5f 49 53 4e 55 4c 4c 2c 20  O_EQ|WO_ISNULL, 
31360 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54  0);.      if( pT
31370 65 72 6d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  erm==0 ) continu
31380 65 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 54  e;.      if( (pT
31390 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 26 57  erm->eOperator&W
313a0 4f 5f 45 51 29 21 3d 30 20 26 26 20 70 4f 42 45  O_EQ)!=0 && pOBE
313b0 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20  xpr->iColumn>=0 
313c0 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  ){.        const
313d0 20 63 68 61 72 20 2a 7a 31 2c 20 2a 7a 32 3b 0a   char *z1, *z2;.
313e0 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20          pColl = 
313f0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
31400 65 71 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73  eq(pWInfo->pPars
31410 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69  e, pOrderBy->a[i
31420 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
31430 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 20 70    if( !pColl ) p
31440 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74  Coll = db->pDflt
31450 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 7a 31  Coll;.        z1
31460 20 3d 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 3b   = pColl->zName;
31470 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d  .        pColl =
31480 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
31490 53 65 71 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72  Seq(pWInfo->pPar
314a0 73 65 2c 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  se, pTerm->pExpr
314b0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  );.        if( !
314c0 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20  pColl ) pColl = 
314d0 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20  db->pDfltColl;. 
314e0 20 20 20 20 20 20 20 7a 32 20 3d 20 70 43 6f 6c         z2 = pCol
314f0 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  l->zName;.      
31500 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
31510 49 43 6d 70 28 7a 31 2c 20 7a 32 29 21 3d 30 20  ICmp(z1, z2)!=0 
31520 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
31530 20 20 7d 0a 20 20 20 20 20 20 6f 62 53 61 74 20    }.      obSat 
31540 7c 3d 20 4d 41 53 4b 42 49 54 28 69 29 3b 0a 20  |= MASKBIT(i);. 
31550 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 28 70     }..    if( (p
31560 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
31570 57 48 45 52 45 5f 4f 4e 45 52 4f 57 29 3d 3d 30  WHERE_ONEROW)==0
31580 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4c   ){.      if( pL
31590 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
315a0 48 45 52 45 5f 49 50 4b 20 29 7b 0a 20 20 20 20  HERE_IPK ){.    
315b0 20 20 20 20 70 49 6e 64 65 78 20 3d 20 30 3b 0a      pIndex = 0;.
315c0 20 20 20 20 20 20 20 20 6e 4b 65 79 43 6f 6c 20          nKeyCol 
315d0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 6e 43 6f  = 0;.        nCo
315e0 6c 75 6d 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20  lumn = 1;.      
315f0 7d 65 6c 73 65 20 69 66 28 20 28 70 49 6e 64 65  }else if( (pInde
31600 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72  x = pLoop->u.btr
31610 65 65 2e 70 49 6e 64 65 78 29 3d 3d 30 20 7c 7c  ee.pIndex)==0 ||
31620 20 70 49 6e 64 65 78 2d 3e 62 55 6e 6f 72 64 65   pIndex->bUnorde
31630 72 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 72  red ){.        r
31640 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d  eturn 0;.      }
31650 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6e 4b  else{.        nK
31660 65 79 43 6f 6c 20 3d 20 70 49 6e 64 65 78 2d 3e  eyCol = pIndex->
31670 6e 4b 65 79 43 6f 6c 3b 0a 20 20 20 20 20 20 20  nKeyCol;.       
31680 20 6e 43 6f 6c 75 6d 6e 20 3d 20 70 49 6e 64 65   nColumn = pInde
31690 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  x->nColumn;.    
316a0 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c      assert( nCol
316b0 75 6d 6e 3d 3d 6e 4b 65 79 43 6f 6c 2b 31 20 7c  umn==nKeyCol+1 |
316c0 7c 20 21 48 61 73 52 6f 77 69 64 28 70 49 6e 64  | !HasRowid(pInd
316d0 65 78 2d 3e 70 54 61 62 6c 65 29 20 29 3b 0a 20  ex->pTable) );. 
316e0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
316f0 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  Index->aiColumn[
31700 6e 43 6f 6c 75 6d 6e 2d 31 5d 3d 3d 28 2d 31 29  nColumn-1]==(-1)
31710 20 7c 7c 20 21 48 61 73 52 6f 77 69 64 28 70 49   || !HasRowid(pI
31720 6e 64 65 78 2d 3e 70 54 61 62 6c 65 29 29 3b 0a  ndex->pTable));.
31730 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 44          isOrderD
31740 69 73 74 69 6e 63 74 20 3d 20 49 73 55 6e 69 71  istinct = IsUniq
31750 75 65 49 6e 64 65 78 28 70 49 6e 64 65 78 29 3b  ueIndex(pIndex);
31760 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
31770 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20  /* Loop through 
31780 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74  all columns of t
31790 68 65 20 69 6e 64 65 78 20 61 6e 64 20 64 65 61  he index and dea
317a0 6c 20 77 69 74 68 20 74 68 65 20 6f 6e 65 73 0a  l with the ones.
317b0 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 61 72        ** that ar
317c0 65 20 6e 6f 74 20 63 6f 6e 73 74 72 61 69 6e 65  e not constraine
317d0 64 20 62 79 20 3d 3d 20 6f 72 20 49 4e 2e 0a 20  d by == or IN.. 
317e0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65       */.      re
317f0 76 20 3d 20 72 65 76 53 65 74 20 3d 20 30 3b 0a  v = revSet = 0;.
31800 20 20 20 20 20 20 64 69 73 74 69 6e 63 74 43 6f        distinctCo
31810 6c 75 6d 6e 73 20 3d 20 30 3b 0a 20 20 20 20 20  lumns = 0;.     
31820 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 43 6f 6c   for(j=0; j<nCol
31830 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  umn; j++){.     
31840 20 20 20 75 38 20 62 4f 6e 63 65 3b 20 20 20 2f     u8 bOnce;   /
31850 2a 20 54 72 75 65 20 74 6f 20 72 75 6e 20 74 68  * True to run th
31860 65 20 4f 52 44 45 52 20 42 59 20 73 65 61 72 63  e ORDER BY searc
31870 68 20 6c 6f 6f 70 20 2a 2f 0a 0a 20 20 20 20 20  h loop */..     
31880 20 20 20 2f 2a 20 53 6b 69 70 20 6f 76 65 72 20     /* Skip over 
31890 3d 3d 20 61 6e 64 20 49 53 20 4e 55 4c 4c 20 74  == and IS NULL t
318a0 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  erms */.        
318b0 69 66 28 20 6a 3c 70 4c 6f 6f 70 2d 3e 75 2e 62  if( j<pLoop->u.b
318c0 74 72 65 65 2e 6e 45 71 0a 20 20 20 20 20 20 20  tree.nEq.       
318d0 20 20 26 26 20 70 4c 6f 6f 70 2d 3e 6e 53 6b 69    && pLoop->nSki
318e0 70 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26  p==0.         &&
318f0 20 28 28 69 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c   ((i = pLoop->aL
31900 54 65 72 6d 5b 6a 5d 2d 3e 65 4f 70 65 72 61 74  Term[j]->eOperat
31910 6f 72 29 20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f  or) & (WO_EQ|WO_
31920 49 53 4e 55 4c 4c 29 29 21 3d 30 0a 20 20 20 20  ISNULL))!=0.    
31930 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
31940 20 69 66 28 20 69 20 26 20 57 4f 5f 49 53 4e 55   if( i & WO_ISNU
31950 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  LL ){.          
31960 20 20 74 65 73 74 63 61 73 65 28 20 69 73 4f 72    testcase( isOr
31970 64 65 72 44 69 73 74 69 6e 63 74 20 29 3b 0a 20  derDistinct );. 
31980 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64             isOrd
31990 65 72 44 69 73 74 69 6e 63 74 20 3d 20 30 3b 0a  erDistinct = 0;.
319a0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
319b0 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20        continue; 
319c0 20 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20   .        }..   
319d0 20 20 20 20 20 2f 2a 20 47 65 74 20 74 68 65 20       /* Get the 
319e0 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 69 6e  column number in
319f0 20 74 68 65 20 74 61 62 6c 65 20 28 69 43 6f 6c   the table (iCol
31a00 75 6d 6e 29 20 61 6e 64 20 73 6f 72 74 20 6f 72  umn) and sort or
31a10 64 65 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 28  der.        ** (
31a20 72 65 76 49 64 78 29 20 66 6f 72 20 74 68 65 20  revIdx) for the 
31a30 6a 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  j-th column of t
31a40 68 65 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20  he index..      
31a50 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
31a60 20 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 20   pIndex ){.     
31a70 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 70       iColumn = p
31a80 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  Index->aiColumn[
31a90 6a 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  j];.          re
31aa0 76 49 64 78 20 3d 20 70 49 6e 64 65 78 2d 3e 61  vIdx = pIndex->a
31ab0 53 6f 72 74 4f 72 64 65 72 5b 6a 5d 3b 0a 20 20  SortOrder[j];.  
31ac0 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c          if( iCol
31ad0 75 6d 6e 3d 3d 70 49 6e 64 65 78 2d 3e 70 54 61  umn==pIndex->pTa
31ae0 62 6c 65 2d 3e 69 50 4b 65 79 20 29 20 69 43 6f  ble->iPKey ) iCo
31af0 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20  lumn = -1;.     
31b00 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
31b10 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31      iColumn = -1
31b20 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 76 49  ;.          revI
31b30 64 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  dx = 0;.        
31b40 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 6e  }..        /* An
31b50 20 75 6e 63 6f 6e 73 74 72 61 69 6e 65 64 20 63   unconstrained c
31b60 6f 6c 75 6d 6e 20 74 68 61 74 20 6d 69 67 68 74  olumn that might
31b70 20 62 65 20 4e 55 4c 4c 20 6d 65 61 6e 73 20 74   be NULL means t
31b80 68 61 74 20 74 68 69 73 0a 20 20 20 20 20 20 20  hat this.       
31b90 20 2a 2a 20 57 68 65 72 65 4c 6f 6f 70 20 69 73   ** WhereLoop is
31ba0 20 6e 6f 74 20 77 65 6c 6c 2d 6f 72 64 65 72 65   not well-ordere
31bb0 64 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  d.        */.   
31bc0 20 20 20 20 20 69 66 28 20 69 73 4f 72 64 65 72       if( isOrder
31bd0 44 69 73 74 69 6e 63 74 0a 20 20 20 20 20 20 20  Distinct.       
31be0 20 20 26 26 20 69 43 6f 6c 75 6d 6e 3e 3d 30 0a    && iColumn>=0.
31bf0 20 20 20 20 20 20 20 20 20 26 26 20 6a 3e 3d 70           && j>=p
31c00 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  Loop->u.btree.nE
31c10 71 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 49  q.         && pI
31c20 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 61 43  ndex->pTable->aC
31c30 6f 6c 5b 69 43 6f 6c 75 6d 6e 5d 2e 6e 6f 74 4e  ol[iColumn].notN
31c40 75 6c 6c 3d 3d 30 0a 20 20 20 20 20 20 20 20 29  ull==0.        )
31c50 7b 0a 20 20 20 20 20 20 20 20 20 20 69 73 4f 72  {.          isOr
31c60 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20 30 3b  derDistinct = 0;
31c70 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
31c80 20 20 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20      /* Find the 
31c90 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20 74 68  ORDER BY term th
31ca0 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74  at corresponds t
31cb0 6f 20 74 68 65 20 6a 2d 74 68 20 63 6f 6c 75 6d  o the j-th colum
31cc0 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20  n.        ** of 
31cd0 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20 6d 61  the index and ma
31ce0 72 6b 20 74 68 61 74 20 4f 52 44 45 52 20 42 59  rk that ORDER BY
31cf0 20 74 65 72 6d 20 6f 66 66 20 0a 20 20 20 20 20   term off .     
31d00 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 4f     */.        bO
31d10 6e 63 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  nce = 1;.       
31d20 20 69 73 4d 61 74 63 68 20 3d 20 30 3b 0a 20 20   isMatch = 0;.  
31d30 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 62        for(i=0; b
31d40 4f 6e 63 65 20 26 26 20 69 3c 6e 4f 72 64 65 72  Once && i<nOrder
31d50 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  By; i++){.      
31d60 20 20 20 20 69 66 28 20 4d 41 53 4b 42 49 54 28      if( MASKBIT(
31d70 69 29 20 26 20 6f 62 53 61 74 20 29 20 63 6f 6e  i) & obSat ) con
31d80 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
31d90 20 70 4f 42 45 78 70 72 20 3d 20 73 71 6c 69 74   pOBExpr = sqlit
31da0 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74  e3ExprSkipCollat
31db0 65 28 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  e(pOrderBy->a[i]
31dc0 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20  .pExpr);.       
31dd0 20 20 20 74 65 73 74 63 61 73 65 28 20 77 63 74     testcase( wct
31de0 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
31df0 47 52 4f 55 50 42 59 20 29 3b 0a 20 20 20 20 20  GROUPBY );.     
31e00 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 77       testcase( w
31e10 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
31e20 45 5f 44 49 53 54 49 4e 43 54 42 59 20 29 3b 0a  E_DISTINCTBY );.
31e30 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 77            if( (w
31e40 63 74 72 6c 46 6c 61 67 73 20 26 20 28 57 48 45  ctrlFlags & (WHE
31e50 52 45 5f 47 52 4f 55 50 42 59 7c 57 48 45 52 45  RE_GROUPBY|WHERE
31e60 5f 44 49 53 54 49 4e 43 54 42 59 29 29 3d 3d 30  _DISTINCTBY))==0
31e70 20 29 20 62 4f 6e 63 65 20 3d 20 30 3b 0a 20 20   ) bOnce = 0;.  
31e80 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 42 45          if( pOBE
31e90 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55  xpr->op!=TK_COLU
31ea0 4d 4e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  MN ) continue;. 
31eb0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 42           if( pOB
31ec0 45 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d 69 43  Expr->iTable!=iC
31ed0 75 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ur ) continue;. 
31ee0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 42           if( pOB
31ef0 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 69  Expr->iColumn!=i
31f00 43 6f 6c 75 6d 6e 20 29 20 63 6f 6e 74 69 6e 75  Column ) continu
31f10 65 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  e;.          if(
31f20 20 69 43 6f 6c 75 6d 6e 3e 3d 30 20 29 7b 0a 20   iColumn>=0 ){. 
31f30 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 6c             pColl
31f40 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
31f50 6c 6c 53 65 71 28 70 57 49 6e 66 6f 2d 3e 70 50  llSeq(pWInfo->pP
31f60 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e  arse, pOrderBy->
31f70 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[i].pExpr);.   
31f80 20 20 20 20 20 20 20 20 20 69 66 28 20 21 70 43           if( !pC
31f90 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62  oll ) pColl = db
31fa0 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20  ->pDfltColl;.   
31fb0 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
31fc0 69 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c  ite3StrICmp(pCol
31fd0 6c 2d 3e 7a 4e 61 6d 65 2c 20 70 49 6e 64 65 78  l->zName, pIndex
31fe0 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 29 21 3d 30 20  ->azColl[j])!=0 
31ff0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
32000 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
32010 20 20 69 73 4d 61 74 63 68 20 3d 20 31 3b 0a 20    isMatch = 1;. 
32020 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
32030 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
32040 20 20 69 66 28 20 69 73 4d 61 74 63 68 20 26 26    if( isMatch &&
32050 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57   (wctrlFlags & W
32060 48 45 52 45 5f 47 52 4f 55 50 42 59 29 3d 3d 30  HERE_GROUPBY)==0
32070 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
32080 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 73   Make sure the s
32090 6f 72 74 20 6f 72 64 65 72 20 69 73 20 63 6f 6d  ort order is com
320a0 70 61 74 69 62 6c 65 20 69 6e 20 61 6e 20 4f 52  patible in an OR
320b0 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 0a 20  DER BY clause.. 
320c0 20 20 20 20 20 20 20 20 20 2a 2a 20 53 6f 72 74           ** Sort
320d0 20 6f 72 64 65 72 20 69 73 20 69 72 72 65 6c 65   order is irrele
320e0 76 61 6e 74 20 66 6f 72 20 61 20 47 52 4f 55 50  vant for a GROUP
320f0 20 42 59 20 63 6c 61 75 73 65 2e 20 2a 2f 0a 20   BY clause. */. 
32100 20 20 20 20 20 20 20 20 20 69 66 28 20 72 65 76           if( rev
32110 53 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Set ){.         
32120 20 20 20 69 66 28 20 28 72 65 76 20 5e 20 72 65     if( (rev ^ re
32130 76 49 64 78 29 21 3d 70 4f 72 64 65 72 42 79 2d  vIdx)!=pOrderBy-
32140 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 20  >a[i].sortOrder 
32150 29 20 69 73 4d 61 74 63 68 20 3d 20 30 3b 0a 20  ) isMatch = 0;. 
32160 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
32170 20 20 20 20 20 20 20 20 20 20 20 20 72 65 76 20              rev 
32180 3d 20 72 65 76 49 64 78 20 5e 20 70 4f 72 64 65  = revIdx ^ pOrde
32190 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72  rBy->a[i].sortOr
321a0 64 65 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20  der;.           
321b0 20 69 66 28 20 72 65 76 20 29 20 2a 70 52 65 76   if( rev ) *pRev
321c0 4d 61 73 6b 20 7c 3d 20 4d 41 53 4b 42 49 54 28  Mask |= MASKBIT(
321d0 69 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 20 20  iLoop);.        
321e0 20 20 20 20 72 65 76 53 65 74 20 3d 20 31 3b 0a      revSet = 1;.
321f0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
32200 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
32210 28 20 69 73 4d 61 74 63 68 20 29 7b 0a 20 20 20  ( isMatch ){.   
32220 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 75         if( iColu
32230 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  mn<0 ){.        
32240 20 20 20 20 74 65 73 74 63 61 73 65 28 20 64 69      testcase( di
32250 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 3d 3d 30  stinctColumns==0
32260 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
32270 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 20  distinctColumns 
32280 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 1;.          }
32290 0a 20 20 20 20 20 20 20 20 20 20 6f 62 53 61 74  .          obSat
322a0 20 7c 3d 20 4d 41 53 4b 42 49 54 28 69 29 3b 0a   |= MASKBIT(i);.
322b0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
322c0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20 6d           /* No m
322d0 61 74 63 68 20 66 6f 75 6e 64 20 2a 2f 0a 20 20  atch found */.  
322e0 20 20 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 30          if( j==0
322f0 20 7c 7c 20 6a 3c 6e 4b 65 79 43 6f 6c 20 29 7b   || j<nKeyCol ){
32300 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73  .            tes
32310 74 63 61 73 65 28 20 69 73 4f 72 64 65 72 44 69  tcase( isOrderDi
32320 73 74 69 6e 63 74 21 3d 30 20 29 3b 0a 20 20 20  stinct!=0 );.   
32330 20 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72           isOrder
32340 44 69 73 74 69 6e 63 74 20 3d 20 30 3b 0a 20 20  Distinct = 0;.  
32350 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
32360 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
32370 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 2f 2a 20     }.      } /* 
32380 65 6e 64 20 4c 6f 6f 70 20 6f 76 65 72 20 61 6c  end Loop over al
32390 6c 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20  l index columns 
323a0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 64 69 73  */.      if( dis
323b0 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 20 29 7b 0a  tinctColumns ){.
323c0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
323d0 28 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63  ( isOrderDistinc
323e0 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  t==0 );.        
323f0 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20  isOrderDistinct 
32400 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
32410 20 7d 20 2f 2a 20 65 6e 64 2d 69 66 20 6e 6f 74   } /* end-if not
32420 20 6f 6e 65 2d 72 6f 77 20 2a 2f 0a 0a 20 20 20   one-row */..   
32430 20 2f 2a 20 4d 61 72 6b 20 6f 66 66 20 61 6e 79   /* Mark off any
32440 20 6f 74 68 65 72 20 4f 52 44 45 52 20 42 59 20   other ORDER BY 
32450 74 65 72 6d 73 20 74 68 61 74 20 72 65 66 65 72  terms that refer
32460 65 6e 63 65 20 70 4c 6f 6f 70 20 2a 2f 0a 20 20  ence pLoop */.  
32470 20 20 69 66 28 20 69 73 4f 72 64 65 72 44 69 73    if( isOrderDis
32480 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 20 20 6f  tinct ){.      o
32490 72 64 65 72 44 69 73 74 69 6e 63 74 4d 61 73 6b  rderDistinctMask
324a0 20 7c 3d 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53   |= pLoop->maskS
324b0 65 6c 66 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  elf;.      for(i
324c0 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20  =0; i<nOrderBy; 
324d0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 45 78  i++){.        Ex
324e0 70 72 20 2a 70 3b 0a 20 20 20 20 20 20 20 20 42  pr *p;.        B
324f0 69 74 6d 61 73 6b 20 6d 54 65 72 6d 3b 0a 20 20  itmask mTerm;.  
32500 20 20 20 20 20 20 69 66 28 20 4d 41 53 4b 42 49        if( MASKBI
32510 54 28 69 29 20 26 20 6f 62 53 61 74 20 29 20 63  T(i) & obSat ) c
32520 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
32530 20 70 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61   p = pOrderBy->a
32540 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [i].pExpr;.     
32550 20 20 20 6d 54 65 72 6d 20 3d 20 65 78 70 72 54     mTerm = exprT
32560 61 62 6c 65 55 73 61 67 65 28 26 70 57 49 6e 66  ableUsage(&pWInf
32570 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 70 29 3b 0a  o->sMaskSet,p);.
32580 20 20 20 20 20 20 20 20 69 66 28 20 6d 54 65 72          if( mTer
32590 6d 3d 3d 30 20 26 26 20 21 73 71 6c 69 74 65 33  m==0 && !sqlite3
325a0 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70  ExprIsConstant(p
325b0 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
325c0 20 20 20 20 20 20 69 66 28 20 28 6d 54 65 72 6d        if( (mTerm
325d0 26 7e 6f 72 64 65 72 44 69 73 74 69 6e 63 74 4d  &~orderDistinctM
325e0 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ask)==0 ){.     
325f0 20 20 20 20 20 6f 62 53 61 74 20 7c 3d 20 4d 41       obSat |= MA
32600 53 4b 42 49 54 28 69 29 3b 0a 20 20 20 20 20 20  SKBIT(i);.      
32610 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
32620 7d 0a 20 20 7d 20 2f 2a 20 45 6e 64 20 74 68 65  }.  } /* End the
32630 20 6c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20 57   loop over all W
32640 68 65 72 65 4c 6f 6f 70 73 20 66 72 6f 6d 20 6f  hereLoops from o
32650 75 74 65 72 2d 6d 6f 73 74 20 64 6f 77 6e 20 74  uter-most down t
32660 6f 20 69 6e 6e 65 72 2d 6d 6f 73 74 20 2a 2f 0a  o inner-most */.
32670 20 20 69 66 28 20 6f 62 53 61 74 3d 3d 6f 62 44    if( obSat==obD
32680 6f 6e 65 20 29 20 72 65 74 75 72 6e 20 28 69 38  one ) return (i8
32690 29 6e 4f 72 64 65 72 42 79 3b 0a 20 20 69 66 28  )nOrderBy;.  if(
326a0 20 21 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63   !isOrderDistinc
326b0 74 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 6e  t ){.    for(i=n
326c0 4f 72 64 65 72 42 79 2d 31 3b 20 69 3e 30 3b 20  OrderBy-1; i>0; 
326d0 69 2d 2d 29 7b 0a 20 20 20 20 20 20 42 69 74 6d  i--){.      Bitm
326e0 61 73 6b 20 6d 20 3d 20 4d 41 53 4b 42 49 54 28  ask m = MASKBIT(
326f0 69 29 20 2d 20 31 3b 0a 20 20 20 20 20 20 69 66  i) - 1;.      if
32700 28 20 28 6f 62 53 61 74 26 6d 29 3d 3d 6d 20 29  ( (obSat&m)==m )
32710 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 20 20 7d   return i;.    }
32720 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
32730 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a   }.  return -1;.
32740 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  }.../*.** If the
32750 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20 66   WHERE_GROUPBY f
32760 6c 61 67 20 69 73 20 73 65 74 20 69 6e 20 74 68  lag is set in th
32770 65 20 6d 61 73 6b 20 70 61 73 73 65 64 20 74 6f  e mask passed to
32780 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
32790 69 6e 28 29 2c 0a 2a 2a 20 74 68 65 20 70 6c 61  in(),.** the pla
327a0 6e 6e 65 72 20 61 73 73 75 6d 65 73 20 74 68 61  nner assumes tha
327b0 74 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  t the specified 
327c0 70 4f 72 64 65 72 42 79 20 6c 69 73 74 20 69 73  pOrderBy list is
327d0 20 61 63 74 75 61 6c 6c 79 20 61 20 47 52 4f 55   actually a GROU
327e0 50 0a 2a 2a 20 42 59 20 63 6c 61 75 73 65 20 2d  P.** BY clause -
327f0 20 61 6e 64 20 73 6f 20 61 6e 79 20 6f 72 64 65   and so any orde
32800 72 20 74 68 61 74 20 67 72 6f 75 70 73 20 72 6f  r that groups ro
32810 77 73 20 61 73 20 72 65 71 75 69 72 65 64 20 73  ws as required s
32820 61 74 69 73 66 69 65 73 20 74 68 65 0a 2a 2a 20  atisfies the.** 
32830 72 65 71 75 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 4e  request..**.** N
32840 6f 72 6d 61 6c 6c 79 2c 20 69 6e 20 74 68 69 73  ormally, in this
32850 20 63 61 73 65 20 69 74 20 69 73 20 6e 6f 74 20   case it is not 
32860 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 74 68 65  possible for the
32870 20 63 61 6c 6c 65 72 20 74 6f 20 64 65 74 65 72   caller to deter
32880 6d 69 6e 65 0a 2a 2a 20 77 68 65 74 68 65 72 20  mine.** whether 
32890 6f 72 20 6e 6f 74 20 74 68 65 20 72 6f 77 73 20  or not the rows 
328a0 61 72 65 20 72 65 61 6c 6c 79 20 62 65 69 6e 67  are really being
328b0 20 64 65 6c 69 76 65 72 65 64 20 69 6e 20 73 6f   delivered in so
328c0 72 74 65 64 20 6f 72 64 65 72 2c 20 6f 72 0a 2a  rted order, or.*
328d0 2a 20 6a 75 73 74 20 69 6e 20 73 6f 6d 65 20 6f  * just in some o
328e0 74 68 65 72 20 6f 72 64 65 72 20 74 68 61 74 20  ther order that 
328f0 70 72 6f 76 69 64 65 73 20 74 68 65 20 72 65 71  provides the req
32900 75 69 72 65 64 20 67 72 6f 75 70 69 6e 67 2e 20  uired grouping. 
32910 48 6f 77 65 76 65 72 2c 0a 2a 2a 20 69 66 20 74  However,.** if t
32920 68 65 20 57 48 45 52 45 5f 53 4f 52 54 42 59 47  he WHERE_SORTBYG
32930 52 4f 55 50 20 66 6c 61 67 20 69 73 20 61 6c 73  ROUP flag is als
32940 6f 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c 69  o passed to sqli
32950 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 2c  te3WhereBegin(),
32960 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20 66 75   then.** this fu
32970 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 63 61  nction may be ca
32980 6c 6c 65 64 20 6f 6e 20 74 68 65 20 72 65 74 75  lled on the retu
32990 72 6e 65 64 20 57 68 65 72 65 49 6e 66 6f 20 6f  rned WhereInfo o
329a0 62 6a 65 63 74 2e 20 49 74 20 72 65 74 75 72 6e  bject. It return
329b0 73 0a 2a 2a 20 74 72 75 65 20 69 66 20 74 68 65  s.** true if the
329c0 20 72 6f 77 73 20 72 65 61 6c 6c 79 20 77 69 6c   rows really wil
329d0 6c 20 62 65 20 73 6f 72 74 65 64 20 69 6e 20 74  l be sorted in t
329e0 68 65 20 73 70 65 63 69 66 69 65 64 20 6f 72 64  he specified ord
329f0 65 72 2c 20 6f 72 20 66 61 6c 73 65 0a 2a 2a 20  er, or false.** 
32a00 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a  otherwise..**.**
32a10 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 61 73   For example, as
32a20 73 75 6d 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20  suming:.**.**   
32a30 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 31 20  CREATE INDEX i1 
32a40 4f 4e 20 74 31 28 78 2c 20 59 29 3b 0a 2a 2a 0a  ON t1(x, Y);.**.
32a50 2a 2a 20 74 68 65 6e 0a 2a 2a 0a 2a 2a 20 20 20  ** then.**.**   
32a60 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
32a70 20 47 52 4f 55 50 20 42 59 20 78 2c 79 20 4f 52   GROUP BY x,y OR
32a80 44 45 52 20 42 59 20 78 2c 79 3b 20 20 20 2d 2d  DER BY x,y;   --
32a90 20 49 73 53 6f 72 74 65 64 28 29 3d 3d 31 0a 2a   IsSorted()==1.*
32aa0 2a 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  *   SELECT * FRO
32ab0 4d 20 74 31 20 47 52 4f 55 50 20 42 59 20 79 2c  M t1 GROUP BY y,
32ac0 78 20 4f 52 44 45 52 20 42 59 20 79 2c 78 3b 20  x ORDER BY y,x; 
32ad0 20 20 2d 2d 20 49 73 53 6f 72 74 65 64 28 29 3d    -- IsSorted()=
32ae0 3d 30 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  =0.*/.int sqlite
32af0 33 57 68 65 72 65 49 73 53 6f 72 74 65 64 28 57  3WhereIsSorted(W
32b00 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
32b10 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 57 49  ){.  assert( pWI
32b20 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
32b30 26 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20  & WHERE_GROUPBY 
32b40 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 57 49  );.  assert( pWI
32b50 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
32b60 26 20 57 48 45 52 45 5f 53 4f 52 54 42 59 47 52  & WHERE_SORTBYGR
32b70 4f 55 50 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  OUP );.  return 
32b80 70 57 49 6e 66 6f 2d 3e 73 6f 72 74 65 64 3b 0a  pWInfo->sorted;.
32b90 7d 0a 0a 23 69 66 64 65 66 20 57 48 45 52 45 54  }..#ifdef WHERET
32ba0 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 2f 2a 20  RACE_ENABLED./* 
32bb0 46 6f 72 20 64 65 62 75 67 67 69 6e 67 20 75 73  For debugging us
32bc0 65 20 6f 6e 6c 79 3a 20 2a 2f 0a 73 74 61 74 69  e only: */.stati
32bd0 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 77 68  c const char *wh
32be0 65 72 65 50 61 74 68 4e 61 6d 65 28 57 68 65 72  erePathName(Wher
32bf0 65 50 61 74 68 20 2a 70 50 61 74 68 2c 20 69 6e  ePath *pPath, in
32c00 74 20 6e 4c 6f 6f 70 2c 20 57 68 65 72 65 4c 6f  t nLoop, WhereLo
32c10 6f 70 20 2a 70 4c 61 73 74 29 7b 0a 20 20 73 74  op *pLast){.  st
32c20 61 74 69 63 20 63 68 61 72 20 7a 4e 61 6d 65 5b  atic char zName[
32c30 36 35 5d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  65];.  int i;.  
32c40 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4c 6f 6f 70  for(i=0; i<nLoop
32c50 3b 20 69 2b 2b 29 7b 20 7a 4e 61 6d 65 5b 69 5d  ; i++){ zName[i]
32c60 20 3d 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b   = pPath->aLoop[
32c70 69 5d 2d 3e 63 49 64 3b 20 7d 0a 20 20 69 66 28  i]->cId; }.  if(
32c80 20 70 4c 61 73 74 20 29 20 7a 4e 61 6d 65 5b 69   pLast ) zName[i
32c90 2b 2b 5d 20 3d 20 70 4c 61 73 74 2d 3e 63 49 64  ++] = pLast->cId
32ca0 3b 0a 20 20 7a 4e 61 6d 65 5b 69 5d 20 3d 20 30  ;.  zName[i] = 0
32cb0 3b 0a 20 20 72 65 74 75 72 6e 20 7a 4e 61 6d 65  ;.  return zName
32cc0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
32cd0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 6f 73  * Return the cos
32ce0 74 20 6f 66 20 73 6f 72 74 69 6e 67 20 6e 52 6f  t of sorting nRo
32cf0 77 20 72 6f 77 73 2c 20 61 73 73 75 6d 69 6e 67  w rows, assuming
32d00 20 74 68 61 74 20 74 68 65 20 6b 65 79 73 20 68   that the keys h
32d10 61 76 65 20 0a 2a 2a 20 6e 4f 72 64 65 72 62 79  ave .** nOrderby
32d20 20 63 6f 6c 75 6d 6e 73 20 61 6e 64 20 74 68 61   columns and tha
32d30 74 20 74 68 65 20 66 69 72 73 74 20 6e 53 6f 72  t the first nSor
32d40 74 65 64 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20  ted columns are 
32d50 61 6c 72 65 61 64 79 20 69 6e 0a 2a 2a 20 6f 72  already in.** or
32d60 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4c  der..*/.static L
32d70 6f 67 45 73 74 20 77 68 65 72 65 53 6f 72 74 69  ogEst whereSorti
32d80 6e 67 43 6f 73 74 28 0a 20 20 57 68 65 72 65 49  ngCost(.  WhereI
32d90 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 0a 20 20 4c  nfo *pWInfo,.  L
32da0 6f 67 45 73 74 20 6e 52 6f 77 2c 0a 20 20 69 6e  ogEst nRow,.  in
32db0 74 20 6e 4f 72 64 65 72 42 79 2c 0a 20 20 69 6e  t nOrderBy,.  in
32dc0 74 20 6e 53 6f 72 74 65 64 0a 29 7b 0a 20 20 2f  t nSorted.){.  /
32dd0 2a 20 54 55 4e 49 4e 47 3a 20 45 73 74 69 6d 61  * TUNING: Estima
32de0 74 65 64 20 63 6f 73 74 20 6f 66 20 61 20 66 75  ted cost of a fu
32df0 6c 6c 20 65 78 74 65 72 6e 61 6c 20 73 6f 72 74  ll external sort
32e00 2c 20 77 68 65 72 65 20 4e 20 69 73 20 0a 20 20  , where N is .  
32e10 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ** the number of
32e20 20 72 6f 77 73 20 74 6f 20 73 6f 72 74 20 69 73   rows to sort is
32e30 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 63 6f  :.  **.  **   co
32e40 73 74 20 3d 20 28 33 2e 30 20 2a 20 4e 20 2a 20  st = (3.0 * N * 
32e50 6c 6f 67 28 4e 29 29 2e 0a 20 20 2a 2a 20 0a 20  log(N))..  ** . 
32e60 20 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65 20 6f   ** Or, if the o
32e70 72 64 65 72 2d 62 79 20 63 6c 61 75 73 65 20 68  rder-by clause h
32e80 61 73 20 58 20 74 65 72 6d 73 20 62 75 74 20 6f  as X terms but o
32e90 6e 6c 79 20 74 68 65 20 6c 61 73 74 20 59 20 0a  nly the last Y .
32ea0 20 20 2a 2a 20 74 65 72 6d 73 20 61 72 65 20 6f    ** terms are o
32eb0 75 74 20 6f 66 20 6f 72 64 65 72 2c 20 74 68 65  ut of order, the
32ec0 6e 20 62 6c 6f 63 6b 2d 73 6f 72 74 69 6e 67 20  n block-sorting 
32ed0 77 69 6c 6c 20 72 65 64 75 63 65 20 74 68 65 20  will reduce the 
32ee0 0a 20 20 2a 2a 20 73 6f 72 74 69 6e 67 20 63 6f  .  ** sorting co
32ef0 73 74 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  st to:.  **.  **
32f00 20 20 20 63 6f 73 74 20 3d 20 28 33 2e 30 20 2a     cost = (3.0 *
32f10 20 4e 20 2a 20 6c 6f 67 28 4e 29 29 20 2a 20 28   N * log(N)) * (
32f20 59 2f 58 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  Y/X).  **.  ** T
32f30 68 65 20 28 59 2f 58 29 20 74 65 72 6d 20 69 73  he (Y/X) term is
32f40 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 75 73 69   implemented usi
32f50 6e 67 20 73 74 61 63 6b 20 76 61 72 69 61 62 6c  ng stack variabl
32f60 65 20 72 53 63 61 6c 65 0a 20 20 2a 2a 20 62 65  e rScale.  ** be
32f70 6c 6f 77 2e 20 20 2a 2f 0a 20 20 4c 6f 67 45 73  low.  */.  LogEs
32f80 74 20 72 53 63 61 6c 65 2c 20 72 53 6f 72 74 43  t rScale, rSortC
32f90 6f 73 74 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  ost;.  assert( n
32fa0 4f 72 64 65 72 42 79 3e 30 20 26 26 20 36 36 3d  OrderBy>0 && 66=
32fb0 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31  =sqlite3LogEst(1
32fc0 30 30 29 20 29 3b 0a 20 20 72 53 63 61 6c 65 20  00) );.  rScale 
32fd0 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  = sqlite3LogEst(
32fe0 28 6e 4f 72 64 65 72 42 79 2d 6e 53 6f 72 74 65  (nOrderBy-nSorte
32ff0 64 29 2a 31 30 30 2f 6e 4f 72 64 65 72 42 79 29  d)*100/nOrderBy)
33000 20 2d 20 36 36 3b 0a 20 20 72 53 6f 72 74 43 6f   - 66;.  rSortCo
33010 73 74 20 3d 20 6e 52 6f 77 20 2b 20 65 73 74 4c  st = nRow + estL
33020 6f 67 28 6e 52 6f 77 29 20 2b 20 72 53 63 61 6c  og(nRow) + rScal
33030 65 20 2b 20 31 36 3b 0a 0a 20 20 2f 2a 20 54 55  e + 16;..  /* TU
33040 4e 49 4e 47 3a 20 54 68 65 20 63 6f 73 74 20 6f  NING: The cost o
33050 66 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 44  f implementing D
33060 49 53 54 49 4e 43 54 20 75 73 69 6e 67 20 61 20  ISTINCT using a 
33070 42 2d 54 52 45 45 20 69 73 0a 20 20 2a 2a 20 73  B-TREE is.  ** s
33080 69 6d 69 6c 61 72 20 62 75 74 20 77 69 74 68 20  imilar but with 
33090 61 20 6c 61 72 67 65 72 20 63 6f 6e 73 74 61 6e  a larger constan
330a0 74 20 6f 66 20 70 72 6f 70 6f 72 74 69 6f 6e 61  t of proportiona
330b0 6c 69 74 79 2e 20 0a 20 20 2a 2a 20 4d 75 6c 74  lity. .  ** Mult
330c0 69 70 6c 79 20 62 79 20 61 6e 20 61 64 64 69 74  iply by an addit
330d0 69 6f 6e 61 6c 20 66 61 63 74 6f 72 20 6f 66 20  ional factor of 
330e0 33 2e 30 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70  3.0.  */.  if( p
330f0 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67  WInfo->wctrlFlag
33100 73 20 26 20 57 48 45 52 45 5f 57 41 4e 54 5f 44  s & WHERE_WANT_D
33110 49 53 54 49 4e 43 54 20 29 7b 0a 20 20 20 20 72  ISTINCT ){.    r
33120 53 6f 72 74 43 6f 73 74 20 2b 3d 20 31 36 3b 0a  SortCost += 16;.
33130 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 53    }..  return rS
33140 6f 72 74 43 6f 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  ortCost;.}../*.*
33150 2a 20 47 69 76 65 6e 20 74 68 65 20 6c 69 73 74  * Given the list
33160 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62   of WhereLoop ob
33170 6a 65 63 74 73 20 61 74 20 70 57 49 6e 66 6f 2d  jects at pWInfo-
33180 3e 70 4c 6f 6f 70 73 2c 20 74 68 69 73 20 72 6f  >pLoops, this ro
33190 75 74 69 6e 65 0a 2a 2a 20 61 74 74 65 6d 70 74  utine.** attempt
331a0 73 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6c 6f  s to find the lo
331b0 77 65 73 74 20 63 6f 73 74 20 70 61 74 68 20 74  west cost path t
331c0 68 61 74 20 76 69 73 69 74 73 20 65 61 63 68 20  hat visits each 
331d0 57 68 65 72 65 4c 6f 6f 70 0a 2a 2a 20 6f 6e 63  WhereLoop.** onc
331e0 65 2e 20 20 54 68 69 73 20 70 61 74 68 20 69 73  e.  This path is
331f0 20 74 68 65 6e 20 6c 6f 61 64 65 64 20 69 6e 74   then loaded int
33200 6f 20 74 68 65 20 70 57 49 6e 66 6f 2d 3e 61 5b  o the pWInfo->a[
33210 5d 2e 70 57 4c 6f 6f 70 20 66 69 65 6c 64 73 2e  ].pWLoop fields.
33220 0a 2a 2a 0a 2a 2a 20 41 73 73 75 6d 65 20 74 68  .**.** Assume th
33230 61 74 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  at the total num
33240 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20 72 6f  ber of output ro
33250 77 73 20 74 68 61 74 20 77 69 6c 6c 20 6e 65 65  ws that will nee
33260 64 20 74 6f 20 62 65 20 73 6f 72 74 65 64 0a 2a  d to be sorted.*
33270 2a 20 77 69 6c 6c 20 62 65 20 6e 52 6f 77 45 73  * will be nRowEs
33280 74 20 28 69 6e 20 74 68 65 20 31 30 2a 6c 6f 67  t (in the 10*log
33290 32 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  2 representation
332a0 29 2e 20 20 4f 72 2c 20 69 67 6e 6f 72 65 20 73  ).  Or, ignore s
332b0 6f 72 74 69 6e 67 0a 2a 2a 20 63 6f 73 74 73 20  orting.** costs 
332c0 69 66 20 6e 52 6f 77 45 73 74 3d 3d 30 2e 0a 2a  if nRowEst==0..*
332d0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
332e0 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
332f0 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d   or SQLITE_NOMEM
33300 20 6f 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c   of a memory all
33310 6f 63 61 74 69 6f 6e 0a 2a 2a 20 65 72 72 6f 72  ocation.** error
33320 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73 74 61 74   occurs..*/.stat
33330 69 63 20 69 6e 74 20 77 68 65 72 65 50 61 74 68  ic int wherePath
33340 53 6f 6c 76 65 72 28 57 68 65 72 65 49 6e 66 6f  Solver(WhereInfo
33350 20 2a 70 57 49 6e 66 6f 2c 20 4c 6f 67 45 73 74   *pWInfo, LogEst
33360 20 6e 52 6f 77 45 73 74 29 7b 0a 20 20 69 6e 74   nRowEst){.  int
33370 20 6d 78 43 68 6f 69 63 65 3b 20 20 20 20 20 20   mxChoice;      
33380 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75         /* Maximu
33390 6d 20 6e 75 6d 62 65 72 20 6f 66 20 73 69 6d 75  m number of simu
333a0 6c 74 61 6e 65 6f 75 73 20 70 61 74 68 73 20 74  ltaneous paths t
333b0 72 61 63 6b 65 64 20 2a 2f 0a 20 20 69 6e 74 20  racked */.  int 
333c0 6e 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20  nLoop;          
333d0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
333e0 6f 66 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20  of terms in the 
333f0 6a 6f 69 6e 20 2a 2f 0a 20 20 50 61 72 73 65 20  join */.  Parse 
33400 2a 70 50 61 72 73 65 3b 20 20 20 20 20 20 20 20  *pParse;        
33410 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
33420 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73 71 6c 69  ontext */.  sqli
33430 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20  te3 *db;        
33440 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
33450 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
33460 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 6f 6f 70 3b   */.  int iLoop;
33470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33480 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
33490 6f 76 65 72 20 74 68 65 20 74 65 72 6d 73 20 6f  over the terms o
334a0 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20  f the join */.  
334b0 69 6e 74 20 69 69 2c 20 6a 6a 3b 20 20 20 20 20  int ii, jj;     
334c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
334d0 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20  p counters */.  
334e0 69 6e 74 20 6d 78 49 20 3d 20 30 3b 20 20 20 20  int mxI = 0;    
334f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
33500 65 78 20 6f 66 20 6e 65 78 74 20 65 6e 74 72 79  ex of next entry
33510 20 74 6f 20 72 65 70 6c 61 63 65 20 2a 2f 0a 20   to replace */. 
33520 20 69 6e 74 20 6e 4f 72 64 65 72 42 79 3b 20 20   int nOrderBy;  
33530 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
33540 6d 62 65 72 20 6f 66 20 4f 52 44 45 52 20 42 59  mber of ORDER BY
33550 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 2a 2f   clause terms */
33560 0a 20 20 4c 6f 67 45 73 74 20 6d 78 43 6f 73 74  .  LogEst mxCost
33570 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20   = 0;        /* 
33580 4d 61 78 69 6d 75 6d 20 63 6f 73 74 20 6f 66 20  Maximum cost of 
33590 61 20 73 65 74 20 6f 66 20 70 61 74 68 73 20 2a  a set of paths *
335a0 2f 0a 20 20 4c 6f 67 45 73 74 20 6d 78 55 6e 73  /.  LogEst mxUns
335b0 6f 72 74 65 64 20 3d 20 30 3b 20 20 20 20 2f 2a  orted = 0;    /*
335c0 20 4d 61 78 69 6d 75 6d 20 75 6e 73 6f 72 74 65   Maximum unsorte
335d0 64 20 63 6f 73 74 20 6f 66 20 61 20 73 65 74 20  d cost of a set 
335e0 6f 66 20 70 61 74 68 20 2a 2f 0a 20 20 69 6e 74  of path */.  int
335f0 20 6e 54 6f 2c 20 6e 46 72 6f 6d 3b 20 20 20 20   nTo, nFrom;    
33600 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
33610 20 6f 66 20 76 61 6c 69 64 20 65 6e 74 72 69 65   of valid entrie
33620 73 20 69 6e 20 61 54 6f 5b 5d 20 61 6e 64 20 61  s in aTo[] and a
33630 46 72 6f 6d 5b 5d 20 2a 2f 0a 20 20 57 68 65 72  From[] */.  Wher
33640 65 50 61 74 68 20 2a 61 46 72 6f 6d 3b 20 20 20  ePath *aFrom;   
33650 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 6e 46 72        /* All nFr
33660 6f 6d 20 70 61 74 68 73 20 61 74 20 74 68 65 20  om paths at the 
33670 70 72 65 76 69 6f 75 73 20 6c 65 76 65 6c 20 2a  previous level *
33680 2f 0a 20 20 57 68 65 72 65 50 61 74 68 20 2a 61  /.  WherePath *a
33690 54 6f 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  To;           /*
336a0 20 54 68 65 20 6e 54 6f 20 62 65 73 74 20 70 61   The nTo best pa
336b0 74 68 73 20 61 74 20 74 68 65 20 63 75 72 72 65  ths at the curre
336c0 6e 74 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 57 68  nt level */.  Wh
336d0 65 72 65 50 61 74 68 20 2a 70 46 72 6f 6d 3b 20  erePath *pFrom; 
336e0 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 6c          /* An el
336f0 65 6d 65 6e 74 20 6f 66 20 61 46 72 6f 6d 5b 5d  ement of aFrom[]
33700 20 74 68 61 74 20 77 65 20 61 72 65 20 77 6f 72   that we are wor
33710 6b 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20 57 68 65  king on */.  Whe
33720 72 65 50 61 74 68 20 2a 70 54 6f 3b 20 20 20 20  rePath *pTo;    
33730 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 6c 65         /* An ele
33740 6d 65 6e 74 20 6f 66 20 61 54 6f 5b 5d 20 74 68  ment of aTo[] th
33750 61 74 20 77 65 20 61 72 65 20 77 6f 72 6b 69 6e  at we are workin
33760 67 20 6f 6e 20 2a 2f 0a 20 20 57 68 65 72 65 4c  g on */.  WhereL
33770 6f 6f 70 20 2a 70 57 4c 6f 6f 70 3b 20 20 20 20  oop *pWLoop;    
33780 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68      /* One of th
33790 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65  e WhereLoop obje
337a0 63 74 73 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f  cts */.  WhereLo
337b0 6f 70 20 2a 2a 70 58 3b 20 20 20 20 20 20 20 20  op **pX;        
337c0 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 64 69     /* Used to di
337d0 76 79 20 75 70 20 74 68 65 20 70 53 70 61 63 65  vy up the pSpace
337e0 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 4c 6f 67   memory */.  Log
337f0 45 73 74 20 2a 61 53 6f 72 74 43 6f 73 74 20 3d  Est *aSortCost =
33800 20 30 3b 20 20 20 20 2f 2a 20 53 6f 72 74 69 6e   0;    /* Sortin
33810 67 20 61 6e 64 20 70 61 72 74 69 61 6c 20 73 6f  g and partial so
33820 72 74 69 6e 67 20 63 6f 73 74 73 20 2a 2f 0a 20  rting costs */. 
33830 20 63 68 61 72 20 2a 70 53 70 61 63 65 3b 20 20   char *pSpace;  
33840 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
33850 6d 70 6f 72 61 72 79 20 6d 65 6d 6f 72 79 20 75  mporary memory u
33860 73 65 64 20 62 79 20 74 68 69 73 20 72 6f 75 74  sed by this rout
33870 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 70  ine */.  int nSp
33880 61 63 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ace;            
33890 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 73     /* Bytes of s
338a0 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 61  pace allocated a
338b0 74 20 70 53 70 61 63 65 20 2a 2f 0a 0a 20 20 70  t pSpace */..  p
338c0 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e  Parse = pWInfo->
338d0 70 50 61 72 73 65 3b 0a 20 20 64 62 20 3d 20 70  pParse;.  db = p
338e0 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 6e 4c 6f  Parse->db;.  nLo
338f0 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65  op = pWInfo->nLe
33900 76 65 6c 3b 0a 20 20 2f 2a 20 54 55 4e 49 4e 47  vel;.  /* TUNING
33910 3a 20 46 6f 72 20 73 69 6d 70 6c 65 20 71 75 65  : For simple que
33920 72 69 65 73 2c 20 6f 6e 6c 79 20 74 68 65 20 62  ries, only the b
33930 65 73 74 20 70 61 74 68 20 69 73 20 74 72 61 63  est path is trac
33940 6b 65 64 2e 0a 20 20 2a 2a 20 46 6f 72 20 32 2d  ked..  ** For 2-
33950 77 61 79 20 6a 6f 69 6e 73 2c 20 74 68 65 20 35  way joins, the 5
33960 20 62 65 73 74 20 70 61 74 68 73 20 61 72 65 20   best paths are 
33970 66 6f 6c 6c 6f 77 65 64 2e 0a 20 20 2a 2a 20 46  followed..  ** F
33980 6f 72 20 6a 6f 69 6e 73 20 6f 66 20 33 20 6f 72  or joins of 3 or
33990 20 6d 6f 72 65 20 74 61 62 6c 65 73 2c 20 74 72   more tables, tr
339a0 61 63 6b 20 74 68 65 20 31 30 20 62 65 73 74 20  ack the 10 best 
339b0 70 61 74 68 73 20 2a 2f 0a 20 20 6d 78 43 68 6f  paths */.  mxCho
339c0 69 63 65 20 3d 20 28 6e 4c 6f 6f 70 3c 3d 31 29  ice = (nLoop<=1)
339d0 20 3f 20 31 20 3a 20 28 6e 4c 6f 6f 70 3d 3d 32   ? 1 : (nLoop==2
339e0 20 3f 20 35 20 3a 20 31 30 29 3b 0a 20 20 61 73   ? 5 : 10);.  as
339f0 73 65 72 74 28 20 6e 4c 6f 6f 70 3c 3d 70 57 49  sert( nLoop<=pWI
33a00 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 6e  nfo->pTabList->n
33a10 53 72 63 20 29 3b 0a 20 20 57 48 45 52 45 54 52  Src );.  WHERETR
33a20 41 43 45 28 30 78 30 30 32 2c 20 28 22 2d 2d 2d  ACE(0x002, ("---
33a30 2d 20 62 65 67 69 6e 20 73 6f 6c 76 65 72 2e 20  - begin solver. 
33a40 20 28 6e 52 6f 77 45 73 74 3d 25 64 29 5c 6e 22   (nRowEst=%d)\n"
33a50 2c 20 6e 52 6f 77 45 73 74 29 29 3b 0a 0a 20 20  , nRowEst));..  
33a60 2f 2a 20 49 66 20 6e 52 6f 77 45 73 74 20 69 73  /* If nRowEst is
33a70 20 7a 65 72 6f 20 61 6e 64 20 74 68 65 72 65 20   zero and there 
33a80 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  is an ORDER BY c
33a90 6c 61 75 73 65 2c 20 69 67 6e 6f 72 65 20 69 74  lause, ignore it
33aa0 2e 20 49 6e 20 74 68 69 73 0a 20 20 2a 2a 20 63  . In this.  ** c
33ab0 61 73 65 20 74 68 65 20 70 75 72 70 6f 73 65 20  ase the purpose 
33ac0 6f 66 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20  of this call is 
33ad0 74 6f 20 65 73 74 69 6d 61 74 65 20 74 68 65 20  to estimate the 
33ae0 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 72  number of rows r
33af0 65 74 75 72 6e 65 64 0a 20 20 2a 2a 20 62 79 20  eturned.  ** by 
33b00 74 68 65 20 6f 76 65 72 61 6c 6c 20 71 75 65 72  the overall quer
33b10 79 2e 20 4f 6e 63 65 20 74 68 69 73 20 65 73 74  y. Once this est
33b20 69 6d 61 74 65 20 68 61 73 20 62 65 65 6e 20 6f  imate has been o
33b30 62 74 61 69 6e 65 64 2c 20 74 68 65 20 63 61 6c  btained, the cal
33b40 6c 65 72 0a 20 20 2a 2a 20 77 69 6c 6c 20 69 6e  ler.  ** will in
33b50 76 6f 6b 65 20 74 68 69 73 20 66 75 6e 63 74 69  voke this functi
33b60 6f 6e 20 61 20 73 65 63 6f 6e 64 20 74 69 6d 65  on a second time
33b70 2c 20 70 61 73 73 69 6e 67 20 74 68 65 20 65 73  , passing the es
33b80 74 69 6d 61 74 65 20 61 73 20 74 68 65 0a 20 20  timate as the.  
33b90 2a 2a 20 6e 52 6f 77 45 73 74 20 70 61 72 61 6d  ** nRowEst param
33ba0 65 74 65 72 2e 20 20 2a 2f 0a 20 20 69 66 28 20  eter.  */.  if( 
33bb0 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79  pWInfo->pOrderBy
33bc0 3d 3d 30 20 7c 7c 20 6e 52 6f 77 45 73 74 3d 3d  ==0 || nRowEst==
33bd0 30 20 29 7b 0a 20 20 20 20 6e 4f 72 64 65 72 42  0 ){.    nOrderB
33be0 79 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  y = 0;.  }else{.
33bf0 20 20 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 70      nOrderBy = p
33c00 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2d  WInfo->pOrderBy-
33c10 3e 6e 45 78 70 72 3b 0a 20 20 7d 0a 0a 20 20 2f  >nExpr;.  }..  /
33c20 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69  * Allocate and i
33c30 6e 69 74 69 61 6c 69 7a 65 20 73 70 61 63 65 20  nitialize space 
33c40 66 6f 72 20 61 54 6f 2c 20 61 46 72 6f 6d 20 61  for aTo, aFrom a
33c50 6e 64 20 61 53 6f 72 74 43 6f 73 74 5b 5d 20 2a  nd aSortCost[] *
33c60 2f 0a 20 20 6e 53 70 61 63 65 20 3d 20 28 73 69  /.  nSpace = (si
33c70 7a 65 6f 66 28 57 68 65 72 65 50 61 74 68 29 2b  zeof(WherePath)+
33c80 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70  sizeof(WhereLoop
33c90 2a 29 2a 6e 4c 6f 6f 70 29 2a 6d 78 43 68 6f 69  *)*nLoop)*mxChoi
33ca0 63 65 2a 32 3b 0a 20 20 6e 53 70 61 63 65 20 2b  ce*2;.  nSpace +
33cb0 3d 20 73 69 7a 65 6f 66 28 4c 6f 67 45 73 74 29  = sizeof(LogEst)
33cc0 20 2a 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20 70   * nOrderBy;.  p
33cd0 53 70 61 63 65 20 3d 20 73 71 6c 69 74 65 33 44  Space = sqlite3D
33ce0 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 6e  bMallocRaw(db, n
33cf0 53 70 61 63 65 29 3b 0a 20 20 69 66 28 20 70 53  Space);.  if( pS
33d00 70 61 63 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  pace==0 ) return
33d10 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
33d20 20 61 54 6f 20 3d 20 28 57 68 65 72 65 50 61 74   aTo = (WherePat
33d30 68 2a 29 70 53 70 61 63 65 3b 0a 20 20 61 46 72  h*)pSpace;.  aFr
33d40 6f 6d 20 3d 20 61 54 6f 2b 6d 78 43 68 6f 69 63  om = aTo+mxChoic
33d50 65 3b 0a 20 20 6d 65 6d 73 65 74 28 61 46 72 6f  e;.  memset(aFro
33d60 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61 46 72  m, 0, sizeof(aFr
33d70 6f 6d 5b 30 5d 29 29 3b 0a 20 20 70 58 20 3d 20  om[0]));.  pX = 
33d80 28 57 68 65 72 65 4c 6f 6f 70 2a 2a 29 28 61 46  (WhereLoop**)(aF
33d90 72 6f 6d 2b 6d 78 43 68 6f 69 63 65 29 3b 0a 20  rom+mxChoice);. 
33da0 20 66 6f 72 28 69 69 3d 6d 78 43 68 6f 69 63 65   for(ii=mxChoice
33db0 2a 32 2c 20 70 46 72 6f 6d 3d 61 54 6f 3b 20 69  *2, pFrom=aTo; i
33dc0 69 3e 30 3b 20 69 69 2d 2d 2c 20 70 46 72 6f 6d  i>0; ii--, pFrom
33dd0 2b 2b 2c 20 70 58 20 2b 3d 20 6e 4c 6f 6f 70 29  ++, pX += nLoop)
33de0 7b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 61 4c 6f  {.    pFrom->aLo
33df0 6f 70 20 3d 20 70 58 3b 0a 20 20 7d 0a 20 20 69  op = pX;.  }.  i
33e00 66 28 20 6e 4f 72 64 65 72 42 79 20 29 7b 0a 20  f( nOrderBy ){. 
33e10 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69     /* If there i
33e20 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  s an ORDER BY cl
33e30 61 75 73 65 20 61 6e 64 20 69 74 20 69 73 20 6e  ause and it is n
33e40 6f 74 20 62 65 69 6e 67 20 69 67 6e 6f 72 65 64  ot being ignored
33e50 2c 20 73 65 74 20 75 70 0a 20 20 20 20 2a 2a 20  , set up.    ** 
33e60 73 70 61 63 65 20 66 6f 72 20 74 68 65 20 61 53  space for the aS
33e70 6f 72 74 43 6f 73 74 5b 5d 20 61 72 72 61 79 2e  ortCost[] array.
33e80 20 45 61 63 68 20 65 6c 65 6d 65 6e 74 20 6f 66   Each element of
33e90 20 74 68 65 20 61 53 6f 72 74 43 6f 73 74 20 61   the aSortCost a
33ea0 72 72 61 79 0a 20 20 20 20 2a 2a 20 69 73 20 65  rray.    ** is e
33eb0 69 74 68 65 72 20 7a 65 72 6f 20 2d 20 6d 65 61  ither zero - mea
33ec0 6e 69 6e 67 20 69 74 20 68 61 73 20 6e 6f 74 20  ning it has not 
33ed0 79 65 74 20 62 65 65 6e 20 69 6e 69 74 69 61 6c  yet been initial
33ee0 69 7a 65 64 20 2d 20 6f 72 20 74 68 65 0a 20 20  ized - or the.  
33ef0 20 20 2a 2a 20 63 6f 73 74 20 6f 66 20 73 6f 72    ** cost of sor
33f00 74 69 6e 67 20 6e 52 6f 77 45 73 74 20 72 6f 77  ting nRowEst row
33f10 73 20 6f 66 20 64 61 74 61 20 77 68 65 72 65 20  s of data where 
33f20 74 68 65 20 66 69 72 73 74 20 58 20 74 65 72 6d  the first X term
33f30 73 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20  s of.    ** the 
33f40 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
33f50 61 72 65 20 61 6c 72 65 61 64 79 20 69 6e 20 6f  are already in o
33f60 72 64 65 72 2c 20 77 68 65 72 65 20 58 20 69 73  rder, where X is
33f70 20 74 68 65 20 61 72 72 61 79 20 0a 20 20 20 20   the array .    
33f80 2a 2a 20 69 6e 64 65 78 2e 20 20 2a 2f 0a 20 20  ** index.  */.  
33f90 20 20 61 53 6f 72 74 43 6f 73 74 20 3d 20 28 4c    aSortCost = (L
33fa0 6f 67 45 73 74 2a 29 70 58 3b 0a 20 20 20 20 6d  ogEst*)pX;.    m
33fb0 65 6d 73 65 74 28 61 53 6f 72 74 43 6f 73 74 2c  emset(aSortCost,
33fc0 20 30 2c 20 73 69 7a 65 6f 66 28 4c 6f 67 45 73   0, sizeof(LogEs
33fd0 74 29 20 2a 20 6e 4f 72 64 65 72 42 79 29 3b 0a  t) * nOrderBy);.
33fe0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 61 53    }.  assert( aS
33ff0 6f 72 74 43 6f 73 74 3d 3d 30 20 7c 7c 20 26 70  ortCost==0 || &p
34000 53 70 61 63 65 5b 6e 53 70 61 63 65 5d 3d 3d 28  Space[nSpace]==(
34010 63 68 61 72 2a 29 26 61 53 6f 72 74 43 6f 73 74  char*)&aSortCost
34020 5b 6e 4f 72 64 65 72 42 79 5d 20 29 3b 0a 20 20  [nOrderBy] );.  
34030 61 73 73 65 72 74 28 20 61 53 6f 72 74 43 6f 73  assert( aSortCos
34040 74 21 3d 30 20 7c 7c 20 26 70 53 70 61 63 65 5b  t!=0 || &pSpace[
34050 6e 53 70 61 63 65 5d 3d 3d 28 63 68 61 72 2a 29  nSpace]==(char*)
34060 70 58 20 29 3b 0a 0a 20 20 2f 2a 20 53 65 65 64  pX );..  /* Seed
34070 20 74 68 65 20 73 65 61 72 63 68 20 77 69 74 68   the search with
34080 20 61 20 73 69 6e 67 6c 65 20 57 68 65 72 65 50   a single WhereP
34090 61 74 68 20 63 6f 6e 74 61 69 6e 69 6e 67 20 7a  ath containing z
340a0 65 72 6f 20 57 68 65 72 65 4c 6f 6f 70 73 2e 0a  ero WhereLoops..
340b0 20 20 2a 2a 0a 20 20 2a 2a 20 54 55 4e 49 4e 47    **.  ** TUNING
340c0 3a 20 44 6f 20 6e 6f 74 20 6c 65 74 20 74 68 65  : Do not let the
340d0 20 6e 75 6d 62 65 72 20 6f 66 20 69 74 65 72 61   number of itera
340e0 74 69 6f 6e 73 20 67 6f 20 61 62 6f 76 65 20 32  tions go above 2
340f0 35 2e 20 20 49 66 20 74 68 65 20 63 6f 73 74 0a  5.  If the cost.
34100 20 20 2a 2a 20 6f 66 20 63 6f 6d 70 75 74 69 6e    ** of computin
34110 67 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 69  g an automatic i
34120 6e 64 65 78 20 69 73 20 6e 6f 74 20 70 61 69 64  ndex is not paid
34130 20 62 61 63 6b 20 77 69 74 68 69 6e 20 74 68 65   back within the
34140 20 66 69 72 73 74 20 32 35 0a 20 20 2a 2a 20 72   first 25.  ** r
34150 6f 77 73 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74  ows, then do not
34160 20 75 73 65 20 74 68 65 20 61 75 74 6f 6d 61 74   use the automat
34170 69 63 20 69 6e 64 65 78 2e 20 2a 2f 0a 20 20 61  ic index. */.  a
34180 46 72 6f 6d 5b 30 5d 2e 6e 52 6f 77 20 3d 20 4d  From[0].nRow = M
34190 49 4e 28 70 50 61 72 73 65 2d 3e 6e 51 75 65 72  IN(pParse->nQuer
341a0 79 4c 6f 6f 70 2c 20 34 36 29 3b 20 20 61 73 73  yLoop, 46);  ass
341b0 65 72 74 28 20 34 36 3d 3d 73 71 6c 69 74 65 33  ert( 46==sqlite3
341c0 4c 6f 67 45 73 74 28 32 35 29 20 29 3b 0a 20 20  LogEst(25) );.  
341d0 6e 46 72 6f 6d 20 3d 20 31 3b 0a 20 20 61 73 73  nFrom = 1;.  ass
341e0 65 72 74 28 20 61 46 72 6f 6d 5b 30 5d 2e 69 73  ert( aFrom[0].is
341f0 4f 72 64 65 72 65 64 3d 3d 30 20 29 3b 0a 20 20  Ordered==0 );.  
34200 69 66 28 20 6e 4f 72 64 65 72 42 79 20 29 7b 0a  if( nOrderBy ){.
34210 20 20 20 20 2f 2a 20 49 66 20 6e 4c 6f 6f 70 20      /* If nLoop 
34220 69 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  is zero, then th
34230 65 72 65 20 61 72 65 20 6e 6f 20 46 52 4f 4d 20  ere are no FROM 
34240 74 65 72 6d 73 20 69 6e 20 74 68 65 20 71 75 65  terms in the que
34250 72 79 2e 20 53 69 6e 63 65 0a 20 20 20 20 2a 2a  ry. Since.    **
34260 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   in this case th
34270 65 20 71 75 65 72 79 20 6d 61 79 20 72 65 74 75  e query may retu
34280 72 6e 20 61 20 6d 61 78 69 6d 75 6d 20 6f 66 20  rn a maximum of 
34290 6f 6e 65 20 72 6f 77 2c 20 74 68 65 20 72 65 73  one row, the res
342a0 75 6c 74 73 0a 20 20 20 20 2a 2a 20 61 72 65 20  ults.    ** are 
342b0 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 72  already in the r
342c0 65 71 75 65 73 74 65 64 20 6f 72 64 65 72 2e 20  equested order. 
342d0 53 65 74 20 69 73 4f 72 64 65 72 65 64 20 74 6f  Set isOrdered to
342e0 20 6e 4f 72 64 65 72 42 79 20 74 6f 0a 20 20 20   nOrderBy to.   
342f0 20 2a 2a 20 69 6e 64 69 63 61 74 65 20 74 68 69   ** indicate thi
34300 73 2e 20 4f 72 2c 20 69 66 20 6e 4c 6f 6f 70 20  s. Or, if nLoop 
34310 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
34320 7a 65 72 6f 2c 20 73 65 74 20 69 73 4f 72 64 65  zero, set isOrde
34330 72 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 2d 31  red to.    ** -1
34340 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61  , indicating tha
34350 74 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  t the result set
34360 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20   may or may not 
34370 62 65 20 6f 72 64 65 72 65 64 2c 20 0a 20 20 20  be ordered, .   
34380 20 2a 2a 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e   ** depending on
34390 20 74 68 65 20 6c 6f 6f 70 73 20 61 64 64 65 64   the loops added
343a0 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20   to the current 
343b0 70 6c 61 6e 2e 20 20 2a 2f 0a 20 20 20 20 61 46  plan.  */.    aF
343c0 72 6f 6d 5b 30 5d 2e 69 73 4f 72 64 65 72 65 64  rom[0].isOrdered
343d0 20 3d 20 6e 4c 6f 6f 70 3e 30 20 3f 20 2d 31 20   = nLoop>0 ? -1 
343e0 3a 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20 7d 0a  : nOrderBy;.  }.
343f0 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 73 75  .  /* Compute su
34400 63 63 65 73 73 69 76 65 6c 79 20 6c 6f 6e 67 65  ccessively longe
34410 72 20 57 68 65 72 65 50 61 74 68 73 20 75 73 69  r WherePaths usi
34420 6e 67 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  ng the previous 
34430 67 65 6e 65 72 61 74 69 6f 6e 0a 20 20 2a 2a 20  generation.  ** 
34440 6f 66 20 57 68 65 72 65 50 61 74 68 73 20 61 73  of WherePaths as
34450 20 74 68 65 20 62 61 73 69 73 20 66 6f 72 20 74   the basis for t
34460 68 65 20 6e 65 78 74 2e 20 20 4b 65 65 70 20 74  he next.  Keep t
34470 72 61 63 6b 20 6f 66 20 74 68 65 20 6d 78 43 68  rack of the mxCh
34480 6f 69 63 65 0a 20 20 2a 2a 20 62 65 73 74 20 70  oice.  ** best p
34490 61 74 68 73 20 61 74 20 65 61 63 68 20 67 65 6e  aths at each gen
344a0 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 66 6f 72  eration */.  for
344b0 28 69 4c 6f 6f 70 3d 30 3b 20 69 4c 6f 6f 70 3c  (iLoop=0; iLoop<
344c0 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f 70 2b 2b 29 7b  nLoop; iLoop++){
344d0 0a 20 20 20 20 6e 54 6f 20 3d 20 30 3b 0a 20 20  .    nTo = 0;.  
344e0 20 20 66 6f 72 28 69 69 3d 30 2c 20 70 46 72 6f    for(ii=0, pFro
344f0 6d 3d 61 46 72 6f 6d 3b 20 69 69 3c 6e 46 72 6f  m=aFrom; ii<nFro
34500 6d 3b 20 69 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b  m; ii++, pFrom++
34510 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 70 57 4c  ){.      for(pWL
34520 6f 6f 70 3d 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f  oop=pWInfo->pLoo
34530 70 73 3b 20 70 57 4c 6f 6f 70 3b 20 70 57 4c 6f  ps; pWLoop; pWLo
34540 6f 70 3d 70 57 4c 6f 6f 70 2d 3e 70 4e 65 78 74  op=pWLoop->pNext
34550 4c 6f 6f 70 29 7b 0a 20 20 20 20 20 20 20 20 4c  Loop){.        L
34560 6f 67 45 73 74 20 6e 4f 75 74 3b 20 20 20 20 20  ogEst nOut;     
34570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34580 20 2f 2a 20 52 6f 77 73 20 76 69 73 69 74 65 64   /* Rows visited
34590 20 62 79 20 28 70 46 72 6f 6d 2b 70 57 4c 6f 6f   by (pFrom+pWLoo
345a0 70 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 4c 6f  p) */.        Lo
345b0 67 45 73 74 20 72 43 6f 73 74 3b 20 20 20 20 20  gEst rCost;     
345c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
345d0 2f 2a 20 43 6f 73 74 20 6f 66 20 70 61 74 68 20  /* Cost of path 
345e0 28 70 46 72 6f 6d 2b 70 57 4c 6f 6f 70 29 20 2a  (pFrom+pWLoop) *
345f0 2f 0a 20 20 20 20 20 20 20 20 4c 6f 67 45 73 74  /.        LogEst
34600 20 72 55 6e 73 6f 72 74 65 64 3b 20 20 20 20 20   rUnsorted;     
34610 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
34620 6e 73 6f 72 74 65 64 20 63 6f 73 74 20 6f 66 20  nsorted cost of 
34630 28 70 46 72 6f 6d 2b 70 57 4c 6f 6f 70 29 20 2a  (pFrom+pWLoop) *
34640 2f 0a 20 20 20 20 20 20 20 20 69 38 20 69 73 4f  /.        i8 isO
34650 72 64 65 72 65 64 20 3d 20 70 46 72 6f 6d 2d 3e  rdered = pFrom->
34660 69 73 4f 72 64 65 72 65 64 3b 20 20 2f 2a 20 69  isOrdered;  /* i
34670 73 4f 72 64 65 72 65 64 20 66 6f 72 20 28 70 46  sOrdered for (pF
34680 72 6f 6d 2b 70 57 4c 6f 6f 70 29 20 2a 2f 0a 20  rom+pWLoop) */. 
34690 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d         Bitmask m
346a0 61 73 6b 4e 65 77 3b 20 20 20 20 20 20 20 20 20  askNew;         
346b0 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b           /* Mask
346c0 20 6f 66 20 73 72 63 20 76 69 73 69 74 65 64 20   of src visited 
346d0 62 79 20 28 2e 2e 29 20 2a 2f 0a 20 20 20 20 20  by (..) */.     
346e0 20 20 20 42 69 74 6d 61 73 6b 20 72 65 76 4d 61     Bitmask revMa
346f0 73 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  sk = 0;         
34700 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
34710 72 65 76 2d 6f 72 64 65 72 20 6c 6f 6f 70 73 20  rev-order loops 
34720 66 6f 72 20 28 2e 2e 29 20 2a 2f 0a 0a 20 20 20  for (..) */..   
34730 20 20 20 20 20 69 66 28 20 28 70 57 4c 6f 6f 70       if( (pWLoop
34740 2d 3e 70 72 65 72 65 71 20 26 20 7e 70 46 72 6f  ->prereq & ~pFro
34750 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 29 21 3d 30 20  m->maskLoop)!=0 
34760 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
34770 20 20 20 20 69 66 28 20 28 70 57 4c 6f 6f 70 2d      if( (pWLoop-
34780 3e 6d 61 73 6b 53 65 6c 66 20 26 20 70 46 72 6f  >maskSelf & pFro
34790 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 29 21 3d 30 20  m->maskLoop)!=0 
347a0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
347b0 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70      /* At this p
347c0 6f 69 6e 74 2c 20 70 57 4c 6f 6f 70 20 69 73 20  oint, pWLoop is 
347d0 61 20 63 61 6e 64 69 64 61 74 65 20 74 6f 20 62  a candidate to b
347e0 65 20 74 68 65 20 6e 65 78 74 20 6c 6f 6f 70 2e  e the next loop.
347f0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 43 6f 6d   .        ** Com
34800 70 75 74 65 20 69 74 73 20 63 6f 73 74 20 2a 2f  pute its cost */
34810 0a 20 20 20 20 20 20 20 20 72 55 6e 73 6f 72 74  .        rUnsort
34820 65 64 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  ed = sqlite3LogE
34830 73 74 41 64 64 28 70 57 4c 6f 6f 70 2d 3e 72 53  stAdd(pWLoop->rS
34840 65 74 75 70 2c 70 57 4c 6f 6f 70 2d 3e 72 52 75  etup,pWLoop->rRu
34850 6e 20 2b 20 70 46 72 6f 6d 2d 3e 6e 52 6f 77 29  n + pFrom->nRow)
34860 3b 0a 20 20 20 20 20 20 20 20 72 55 6e 73 6f 72  ;.        rUnsor
34870 74 65 64 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  ted = sqlite3Log
34880 45 73 74 41 64 64 28 72 55 6e 73 6f 72 74 65 64  EstAdd(rUnsorted
34890 2c 20 70 46 72 6f 6d 2d 3e 72 55 6e 73 6f 72 74  , pFrom->rUnsort
348a0 65 64 29 3b 0a 20 20 20 20 20 20 20 20 6e 4f 75  ed);.        nOu
348b0 74 20 3d 20 70 46 72 6f 6d 2d 3e 6e 52 6f 77 20  t = pFrom->nRow 
348c0 2b 20 70 57 4c 6f 6f 70 2d 3e 6e 4f 75 74 3b 0a  + pWLoop->nOut;.
348d0 20 20 20 20 20 20 20 20 6d 61 73 6b 4e 65 77 20          maskNew 
348e0 3d 20 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f  = pFrom->maskLoo
348f0 70 20 7c 20 70 57 4c 6f 6f 70 2d 3e 6d 61 73 6b  p | pWLoop->mask
34900 53 65 6c 66 3b 0a 20 20 20 20 20 20 20 20 69 66  Self;.        if
34910 28 20 69 73 4f 72 64 65 72 65 64 3c 30 20 29 7b  ( isOrdered<0 ){
34920 0a 20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64  .          isOrd
34930 65 72 65 64 20 3d 20 77 68 65 72 65 50 61 74 68  ered = wherePath
34940 53 61 74 69 73 66 69 65 73 4f 72 64 65 72 42 79  SatisfiesOrderBy
34950 28 70 57 49 6e 66 6f 2c 0a 20 20 20 20 20 20 20  (pWInfo,.       
34960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34970 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79  pWInfo->pOrderBy
34980 2c 20 70 46 72 6f 6d 2c 20 70 57 49 6e 66 6f 2d  , pFrom, pWInfo-
34990 3e 77 63 74 72 6c 46 6c 61 67 73 2c 0a 20 20 20  >wctrlFlags,.   
349a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
349b0 20 20 20 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f      iLoop, pWLoo
349c0 70 2c 20 26 72 65 76 4d 61 73 6b 29 3b 0a 20 20  p, &revMask);.  
349d0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
349e0 20 20 20 20 20 20 20 72 65 76 4d 61 73 6b 20 3d         revMask =
349f0 20 70 46 72 6f 6d 2d 3e 72 65 76 4c 6f 6f 70 3b   pFrom->revLoop;
34a00 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
34a10 20 20 20 69 66 28 20 69 73 4f 72 64 65 72 65 64     if( isOrdered
34a20 3e 3d 30 20 26 26 20 69 73 4f 72 64 65 72 65 64  >=0 && isOrdered
34a30 3c 6e 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  <nOrderBy ){.   
34a40 20 20 20 20 20 20 20 69 66 28 20 61 53 6f 72 74         if( aSort
34a50 43 6f 73 74 5b 69 73 4f 72 64 65 72 65 64 5d 3d  Cost[isOrdered]=
34a60 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
34a70 20 20 61 53 6f 72 74 43 6f 73 74 5b 69 73 4f 72    aSortCost[isOr
34a80 64 65 72 65 64 5d 20 3d 20 77 68 65 72 65 53 6f  dered] = whereSo
34a90 72 74 69 6e 67 43 6f 73 74 28 0a 20 20 20 20 20  rtingCost(.     
34aa0 20 20 20 20 20 20 20 20 20 20 20 70 57 49 6e 66             pWInf
34ab0 6f 2c 20 6e 52 6f 77 45 73 74 2c 20 6e 4f 72 64  o, nRowEst, nOrd
34ac0 65 72 42 79 2c 20 69 73 4f 72 64 65 72 65 64 0a  erBy, isOrdered.
34ad0 20 20 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20              );. 
34ae0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
34af0 20 20 20 20 20 72 43 6f 73 74 20 3d 20 73 71 6c       rCost = sql
34b00 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28 72 55  ite3LogEstAdd(rU
34b10 6e 73 6f 72 74 65 64 2c 20 61 53 6f 72 74 43 6f  nsorted, aSortCo
34b20 73 74 5b 69 73 4f 72 64 65 72 65 64 5d 29 3b 0a  st[isOrdered]);.
34b30 0a 20 20 20 20 20 20 20 20 20 20 57 48 45 52 45  .          WHERE
34b40 54 52 41 43 45 28 30 78 30 30 32 2c 0a 20 20 20  TRACE(0x002,.   
34b50 20 20 20 20 20 20 20 20 20 20 20 28 22 2d 2d 2d             ("---
34b60 2d 20 73 6f 72 74 20 63 6f 73 74 3d 25 2d 33 64  - sort cost=%-3d
34b70 20 28 25 64 2f 25 64 29 20 69 6e 63 72 65 61 73   (%d/%d) increas
34b80 65 73 20 63 6f 73 74 20 25 33 64 20 74 6f 20 25  es cost %3d to %
34b90 2d 33 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  -3d\n",.        
34ba0 20 20 20 20 20 20 20 61 53 6f 72 74 43 6f 73 74         aSortCost
34bb0 5b 69 73 4f 72 64 65 72 65 64 5d 2c 20 28 6e 4f  [isOrdered], (nO
34bc0 72 64 65 72 42 79 2d 69 73 4f 72 64 65 72 65 64  rderBy-isOrdered
34bd0 29 2c 20 6e 4f 72 64 65 72 42 79 2c 20 0a 20 20  ), nOrderBy, .  
34be0 20 20 20 20 20 20 20 20 20 20 20 20 20 72 55 6e               rUn
34bf0 73 6f 72 74 65 64 2c 20 72 43 6f 73 74 29 29 3b  sorted, rCost));
34c00 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
34c10 20 20 20 20 20 20 20 20 20 20 72 43 6f 73 74 20            rCost 
34c20 3d 20 72 55 6e 73 6f 72 74 65 64 3b 0a 20 20 20  = rUnsorted;.   
34c30 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
34c40 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  /* Check to see 
34c50 69 66 20 70 57 4c 6f 6f 70 20 73 68 6f 75 6c 64  if pWLoop should
34c60 20 62 65 20 61 64 64 65 64 20 74 6f 20 74 68 65   be added to the
34c70 20 73 65 74 20 6f 66 0a 20 20 20 20 20 20 20 20   set of.        
34c80 2a 2a 20 6d 78 43 68 6f 69 63 65 20 62 65 73 74  ** mxChoice best
34c90 2d 73 6f 2d 66 61 72 20 70 61 74 68 73 2e 0a 20  -so-far paths.. 
34ca0 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
34cb0 20 20 2a 2a 20 46 69 72 73 74 20 6c 6f 6f 6b 20    ** First look 
34cc0 66 6f 72 20 61 6e 20 65 78 69 73 74 69 6e 67 20  for an existing 
34cd0 70 61 74 68 20 61 6d 6f 6e 67 20 62 65 73 74 2d  path among best-
34ce0 73 6f 2d 66 61 72 20 70 61 74 68 73 0a 20 20 20  so-far paths.   
34cf0 20 20 20 20 20 2a 2a 20 74 68 61 74 20 63 6f 76       ** that cov
34d00 65 72 73 20 74 68 65 20 73 61 6d 65 20 73 65 74  ers the same set
34d10 20 6f 66 20 6c 6f 6f 70 73 20 61 6e 64 20 68 61   of loops and ha
34d20 73 20 74 68 65 20 73 61 6d 65 20 69 73 4f 72 64  s the same isOrd
34d30 65 72 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20  ered.        ** 
34d40 73 65 74 74 69 6e 67 20 61 73 20 74 68 65 20 63  setting as the c
34d50 75 72 72 65 6e 74 20 70 61 74 68 20 63 61 6e 64  urrent path cand
34d60 69 64 61 74 65 2e 0a 20 20 20 20 20 20 20 20 2a  idate..        *
34d70 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 65  *.        ** The
34d80 20 74 65 72 6d 20 22 28 28 70 54 6f 2d 3e 69 73   term "((pTo->is
34d90 4f 72 64 65 72 65 64 5e 69 73 4f 72 64 65 72 65  Ordered^isOrdere
34da0 64 29 26 30 78 38 30 29 3d 3d 30 22 20 69 73 20  d)&0x80)==0" is 
34db0 65 71 75 69 76 61 6c 65 6e 74 0a 20 20 20 20 20  equivalent.     
34dc0 20 20 20 2a 2a 20 74 6f 20 28 70 54 6f 2d 3e 69     ** to (pTo->i
34dd0 73 4f 72 64 65 72 65 64 3d 3d 28 2d 31 29 29 3d  sOrdered==(-1))=
34de0 3d 28 69 73 4f 72 64 65 72 65 64 3d 3d 28 2d 31  =(isOrdered==(-1
34df0 29 29 22 20 66 6f 72 20 74 68 65 20 72 61 6e 67  ))" for the rang
34e00 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20  e.        ** of 
34e10 6c 65 67 61 6c 20 76 61 6c 75 65 73 20 66 6f 72  legal values for
34e20 20 69 73 4f 72 64 65 72 65 64 2c 20 2d 31 2e 2e   isOrdered, -1..
34e30 36 34 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  64..        */. 
34e40 20 20 20 20 20 20 20 66 6f 72 28 6a 6a 3d 30 2c         for(jj=0,
34e50 20 70 54 6f 3d 61 54 6f 3b 20 6a 6a 3c 6e 54 6f   pTo=aTo; jj<nTo
34e60 3b 20 6a 6a 2b 2b 2c 20 70 54 6f 2b 2b 29 7b 0a  ; jj++, pTo++){.
34e70 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 54            if( pT
34e80 6f 2d 3e 6d 61 73 6b 4c 6f 6f 70 3d 3d 6d 61 73  o->maskLoop==mas
34e90 6b 4e 65 77 0a 20 20 20 20 20 20 20 20 20 20 20  kNew.           
34ea0 26 26 20 28 28 70 54 6f 2d 3e 69 73 4f 72 64 65  && ((pTo->isOrde
34eb0 72 65 64 5e 69 73 4f 72 64 65 72 65 64 29 26 30  red^isOrdered)&0
34ec0 78 38 30 29 3d 3d 30 0a 20 20 20 20 20 20 20 20  x80)==0.        
34ed0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20    ){.           
34ee0 20 74 65 73 74 63 61 73 65 28 20 6a 6a 3d 3d 6e   testcase( jj==n
34ef0 54 6f 2d 31 20 29 3b 0a 20 20 20 20 20 20 20 20  To-1 );.        
34f00 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
34f10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
34f20 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a 6a 3e  .        if( jj>
34f30 3d 6e 54 6f 20 29 7b 0a 20 20 20 20 20 20 20 20  =nTo ){.        
34f40 20 20 2f 2a 20 4e 6f 6e 65 20 6f 66 20 74 68 65    /* None of the
34f50 20 65 78 69 73 74 69 6e 67 20 62 65 73 74 2d 73   existing best-s
34f60 6f 2d 66 61 72 20 70 61 74 68 73 20 6d 61 74 63  o-far paths matc
34f70 68 20 74 68 65 20 63 61 6e 64 69 64 61 74 65 2e  h the candidate.
34f80 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
34f90 28 20 6e 54 6f 3e 3d 6d 78 43 68 6f 69 63 65 0a  ( nTo>=mxChoice.
34fa0 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28 72             && (r
34fb0 43 6f 73 74 3e 6d 78 43 6f 73 74 20 7c 7c 20 28  Cost>mxCost || (
34fc0 72 43 6f 73 74 3d 3d 6d 78 43 6f 73 74 20 26 26  rCost==mxCost &&
34fd0 20 72 55 6e 73 6f 72 74 65 64 3e 3d 6d 78 55 6e   rUnsorted>=mxUn
34fe0 73 6f 72 74 65 64 29 29 0a 20 20 20 20 20 20 20  sorted)).       
34ff0 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
35000 20 20 2f 2a 20 54 68 65 20 63 75 72 72 65 6e 74    /* The current
35010 20 63 61 6e 64 69 64 61 74 65 20 69 73 20 6e 6f   candidate is no
35020 20 62 65 74 74 65 72 20 74 68 61 6e 20 61 6e 79   better than any
35030 20 6f 66 20 74 68 65 20 6d 78 43 68 6f 69 63 65   of the mxChoice
35040 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
35050 70 61 74 68 73 20 63 75 72 72 65 6e 74 6c 79 20  paths currently 
35060 69 6e 20 74 68 65 20 62 65 73 74 2d 73 6f 2d 66  in the best-so-f
35070 61 72 20 62 75 66 66 65 72 2e 20 20 53 6f 20 64  ar buffer.  So d
35080 69 73 63 61 72 64 0a 20 20 20 20 20 20 20 20 20  iscard.         
35090 20 20 20 2a 2a 20 74 68 69 73 20 63 61 6e 64 69     ** this candi
350a0 64 61 74 65 20 61 73 20 6e 6f 74 20 76 69 61 62  date as not viab
350b0 6c 65 2e 20 2a 2f 0a 23 69 66 64 65 66 20 57 48  le. */.#ifdef WH
350c0 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
350d0 20 2f 2a 20 30 78 34 20 2a 2f 0a 20 20 20 20 20   /* 0x4 */.     
350e0 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
350f0 65 33 57 68 65 72 65 54 72 61 63 65 26 30 78 34  e3WhereTrace&0x4
35100 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
35110 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
35120 69 6e 74 66 28 22 53 6b 69 70 20 20 20 25 73 20  intf("Skip   %s 
35130 63 6f 73 74 3d 25 2d 33 64 2c 25 33 64 20 6f 72  cost=%-3d,%3d or
35140 64 65 72 3d 25 63 5c 6e 22 2c 0a 20 20 20 20 20  der=%c\n",.     
35150 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65               whe
35160 72 65 50 61 74 68 4e 61 6d 65 28 70 46 72 6f 6d  rePathName(pFrom
35170 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29  , iLoop, pWLoop)
35180 2c 20 72 43 6f 73 74 2c 20 6e 4f 75 74 2c 0a 20  , rCost, nOut,. 
35190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
351a0 20 69 73 4f 72 64 65 72 65 64 3e 3d 30 20 3f 20   isOrdered>=0 ? 
351b0 69 73 4f 72 64 65 72 65 64 2b 27 30 27 20 3a 20  isOrdered+'0' : 
351c0 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20  '?');.          
351d0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
351e0 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
351f0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
35200 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20         /* If we 
35210 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74  reach this point
35220 73 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  s it means that 
35230 74 68 65 20 6e 65 77 20 63 61 6e 64 69 64 61 74  the new candidat
35240 65 20 70 61 74 68 0a 20 20 20 20 20 20 20 20 20  e path.         
35250 20 2a 2a 20 6e 65 65 64 73 20 74 6f 20 62 65 20   ** needs to be 
35260 61 64 64 65 64 20 74 6f 20 74 68 65 20 73 65 74  added to the set
35270 20 6f 66 20 62 65 73 74 2d 73 6f 2d 66 61 72 20   of best-so-far 
35280 70 61 74 68 73 2e 20 2a 2f 0a 20 20 20 20 20 20  paths. */.      
35290 20 20 20 20 69 66 28 20 6e 54 6f 3c 6d 78 43 68      if( nTo<mxCh
352a0 6f 69 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20  oice ){.        
352b0 20 20 20 20 2f 2a 20 49 6e 63 72 65 61 73 65 20      /* Increase 
352c0 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
352d0 61 54 6f 20 73 65 74 20 62 79 20 6f 6e 65 20 2a  aTo set by one *
352e0 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a 6a  /.            jj
352f0 20 3d 20 6e 54 6f 2b 2b 3b 0a 20 20 20 20 20 20   = nTo++;.      
35300 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
35310 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 70 61         /* New pa
35320 74 68 20 72 65 70 6c 61 63 65 73 20 74 68 65 20  th replaces the 
35330 70 72 69 6f 72 20 77 6f 72 73 74 20 74 6f 20 6b  prior worst to k
35340 65 65 70 20 63 6f 75 6e 74 20 62 65 6c 6f 77 20  eep count below 
35350 6d 78 43 68 6f 69 63 65 20 2a 2f 0a 20 20 20 20  mxChoice */.    
35360 20 20 20 20 20 20 20 20 6a 6a 20 3d 20 6d 78 49          jj = mxI
35370 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
35380 20 20 20 20 20 20 20 20 70 54 6f 20 3d 20 26 61          pTo = &a
35390 54 6f 5b 6a 6a 5d 3b 0a 23 69 66 64 65 66 20 57  To[jj];.#ifdef W
353a0 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
353b0 44 20 2f 2a 20 30 78 34 20 2a 2f 0a 20 20 20 20  D /* 0x4 */.    
353c0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
353d0 33 57 68 65 72 65 54 72 61 63 65 26 30 78 34 20  3WhereTrace&0x4 
353e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
353f0 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
35400 66 28 22 4e 65 77 20 20 20 20 25 73 20 63 6f 73  f("New    %s cos
35410 74 3d 25 2d 33 64 2c 25 33 64 20 6f 72 64 65 72  t=%-3d,%3d order
35420 3d 25 63 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%c\n",.        
35430 20 20 20 20 20 20 20 20 77 68 65 72 65 50 61 74          wherePat
35440 68 4e 61 6d 65 28 70 46 72 6f 6d 2c 20 69 4c 6f  hName(pFrom, iLo
35450 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c 20 72 43 6f  op, pWLoop), rCo
35460 73 74 2c 20 6e 4f 75 74 2c 0a 20 20 20 20 20 20  st, nOut,.      
35470 20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64 65            isOrde
35480 72 65 64 3e 3d 30 20 3f 20 69 73 4f 72 64 65 72  red>=0 ? isOrder
35490 65 64 2b 27 30 27 20 3a 20 27 3f 27 29 3b 0a 20  ed+'0' : '?');. 
354a0 20 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69           }.#endi
354b0 66 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  f.        }else{
354c0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  .          /* Co
354d0 6e 74 72 6f 6c 20 72 65 61 63 68 65 73 20 68 65  ntrol reaches he
354e0 72 65 20 69 66 20 62 65 73 74 2d 73 6f 2d 66 61  re if best-so-fa
354f0 72 20 70 61 74 68 20 70 54 6f 3d 61 54 6f 5b 6a  r path pTo=aTo[j
35500 6a 5d 20 63 6f 76 65 72 73 20 74 68 65 0a 20 20  j] covers the.  
35510 20 20 20 20 20 20 20 20 2a 2a 20 73 61 6d 65 20          ** same 
35520 73 65 74 20 6f 66 20 6c 6f 6f 70 73 20 61 6e 64  set of loops and
35530 20 68 61 73 20 74 68 65 20 73 61 6d 20 69 73 4f   has the sam isO
35540 72 64 65 72 65 64 20 73 65 74 74 69 6e 67 20 61  rdered setting a
35550 73 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20  s the.          
35560 2a 2a 20 63 61 6e 64 69 64 61 74 65 20 70 61 74  ** candidate pat
35570 68 2e 20 20 43 68 65 63 6b 20 74 6f 20 73 65 65  h.  Check to see
35580 20 69 66 20 74 68 65 20 63 61 6e 64 69 64 61 74   if the candidat
35590 65 20 73 68 6f 75 6c 64 20 72 65 70 6c 61 63 65  e should replace
355a0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 54  .          ** pT
355b0 6f 20 6f 72 20 69 66 20 74 68 65 20 63 61 6e 64  o or if the cand
355c0 69 64 61 74 65 20 73 68 6f 75 6c 64 20 62 65 20  idate should be 
355d0 73 6b 69 70 70 65 64 20 2a 2f 0a 20 20 20 20 20  skipped */.     
355e0 20 20 20 20 20 69 66 28 20 70 54 6f 2d 3e 72 43       if( pTo->rC
355f0 6f 73 74 3c 72 43 6f 73 74 20 7c 7c 20 28 70 54  ost<rCost || (pT
35600 6f 2d 3e 72 43 6f 73 74 3d 3d 72 43 6f 73 74 20  o->rCost==rCost 
35610 26 26 20 70 54 6f 2d 3e 6e 52 6f 77 3c 3d 6e 4f  && pTo->nRow<=nO
35620 75 74 29 20 29 7b 0a 23 69 66 64 65 66 20 57 48  ut) ){.#ifdef WH
35630 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
35640 20 2f 2a 20 30 78 34 20 2a 2f 0a 20 20 20 20 20   /* 0x4 */.     
35650 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
35660 65 33 57 68 65 72 65 54 72 61 63 65 26 30 78 34  e3WhereTrace&0x4
35670 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
35680 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
35690 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20 20  intf(.          
356a0 20 20 20 20 20 20 20 20 22 53 6b 69 70 20 20 20          "Skip   
356b0 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25 33 64  %s cost=%-3d,%3d
356c0 20 6f 72 64 65 72 3d 25 63 22 2c 0a 20 20 20 20   order=%c",.    
356d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68                wh
356e0 65 72 65 50 61 74 68 4e 61 6d 65 28 70 46 72 6f  erePathName(pFro
356f0 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70  m, iLoop, pWLoop
35700 29 2c 20 72 43 6f 73 74 2c 20 6e 4f 75 74 2c 0a  ), rCost, nOut,.
35710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35720 20 20 69 73 4f 72 64 65 72 65 64 3e 3d 30 20 3f    isOrdered>=0 ?
35730 20 69 73 4f 72 64 65 72 65 64 2b 27 30 27 20 3a   isOrdered+'0' :
35740 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20   '?');.         
35750 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
35760 67 50 72 69 6e 74 66 28 22 20 20 20 76 73 20 25  gPrintf("   vs %
35770 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25 64 20 6f  s cost=%-3d,%d o
35780 72 64 65 72 3d 25 63 5c 6e 22 2c 0a 20 20 20 20  rder=%c\n",.    
35790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68                wh
357a0 65 72 65 50 61 74 68 4e 61 6d 65 28 70 54 6f 2c  erePathName(pTo,
357b0 20 69 4c 6f 6f 70 2b 31 2c 20 30 29 2c 20 70 54   iLoop+1, 0), pT
357c0 6f 2d 3e 72 43 6f 73 74 2c 20 70 54 6f 2d 3e 6e  o->rCost, pTo->n
357d0 52 6f 77 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Row,.           
357e0 20 20 20 20 20 20 20 70 54 6f 2d 3e 69 73 4f 72         pTo->isOr
357f0 64 65 72 65 64 3e 3d 30 20 3f 20 70 54 6f 2d 3e  dered>=0 ? pTo->
35800 69 73 4f 72 64 65 72 65 64 2b 27 30 27 20 3a 20  isOrdered+'0' : 
35810 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20  '?');.          
35820 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
35830 20 20 20 20 20 20 20 2f 2a 20 44 69 73 63 61 72         /* Discar
35840 64 20 74 68 65 20 63 61 6e 64 69 64 61 74 65 20  d the candidate 
35850 70 61 74 68 20 66 72 6f 6d 20 66 75 72 74 68 65  path from furthe
35860 72 20 63 6f 6e 73 69 64 65 72 61 74 69 6f 6e 20  r consideration 
35870 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  */.            t
35880 65 73 74 63 61 73 65 28 20 70 54 6f 2d 3e 72 43  estcase( pTo->rC
35890 6f 73 74 3d 3d 72 43 6f 73 74 20 29 3b 0a 20 20  ost==rCost );.  
358a0 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
358b0 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ue;.          }.
358c0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
358d0 73 65 28 20 70 54 6f 2d 3e 72 43 6f 73 74 3d 3d  se( pTo->rCost==
358e0 72 43 6f 73 74 2b 31 20 29 3b 0a 20 20 20 20 20  rCost+1 );.     
358f0 20 20 20 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20       /* Control 
35900 72 65 61 63 68 65 73 20 68 65 72 65 20 69 66 20  reaches here if 
35910 74 68 65 20 63 61 6e 64 69 64 61 74 65 20 70 61  the candidate pa
35920 74 68 20 69 73 20 62 65 74 74 65 72 20 74 68 61  th is better tha
35930 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20  n the.          
35940 2a 2a 20 70 54 6f 20 70 61 74 68 2e 20 20 52 65  ** pTo path.  Re
35950 70 6c 61 63 65 20 70 54 6f 20 77 69 74 68 20 74  place pTo with t
35960 68 65 20 63 61 6e 64 69 64 61 74 65 2e 20 2a 2f  he candidate. */
35970 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41  .#ifdef WHERETRA
35980 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78  CE_ENABLED /* 0x
35990 34 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69  4 */.          i
359a0 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54  f( sqlite3WhereT
359b0 72 61 63 65 26 30 78 34 20 29 7b 0a 20 20 20 20  race&0x4 ){.    
359c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
359d0 65 62 75 67 50 72 69 6e 74 66 28 0a 20 20 20 20  ebugPrintf(.    
359e0 20 20 20 20 20 20 20 20 20 20 20 20 22 55 70 64              "Upd
359f0 61 74 65 20 25 73 20 63 6f 73 74 3d 25 2d 33 64  ate %s cost=%-3d
35a00 2c 25 33 64 20 6f 72 64 65 72 3d 25 63 22 2c 0a  ,%3d order=%c",.
35a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35a20 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70 46  wherePathName(pF
35a30 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f  rom, iLoop, pWLo
35a40 6f 70 29 2c 20 72 43 6f 73 74 2c 20 6e 4f 75 74  op), rCost, nOut
35a50 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
35a60 20 20 69 73 4f 72 64 65 72 65 64 3e 3d 30 20 3f    isOrdered>=0 ?
35a70 20 69 73 4f 72 64 65 72 65 64 2b 27 30 27 20 3a   isOrdered+'0' :
35a80 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20   '?');.         
35a90 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
35aa0 72 69 6e 74 66 28 22 20 20 77 61 73 20 25 73 20  rintf("  was %s 
35ab0 63 6f 73 74 3d 25 2d 33 64 2c 25 33 64 20 6f 72  cost=%-3d,%3d or
35ac0 64 65 72 3d 25 63 5c 6e 22 2c 0a 20 20 20 20 20  der=%c\n",.     
35ad0 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65             where
35ae0 50 61 74 68 4e 61 6d 65 28 70 54 6f 2c 20 69 4c  PathName(pTo, iL
35af0 6f 6f 70 2b 31 2c 20 30 29 2c 20 70 54 6f 2d 3e  oop+1, 0), pTo->
35b00 72 43 6f 73 74 2c 20 70 54 6f 2d 3e 6e 52 6f 77  rCost, pTo->nRow
35b10 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
35b20 20 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64    pTo->isOrdered
35b30 3e 3d 30 20 3f 20 70 54 6f 2d 3e 69 73 4f 72 64  >=0 ? pTo->isOrd
35b40 65 72 65 64 2b 27 30 27 20 3a 20 27 3f 27 29 3b  ered+'0' : '?');
35b50 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 23 65 6e  .          }.#en
35b60 64 69 66 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  dif.        }.  
35b70 20 20 20 20 20 20 2f 2a 20 70 57 4c 6f 6f 70 20        /* pWLoop 
35b80 69 73 20 61 20 77 69 6e 6e 65 72 2e 20 20 41 64  is a winner.  Ad
35b90 64 20 69 74 20 74 6f 20 74 68 65 20 73 65 74 20  d it to the set 
35ba0 6f 66 20 62 65 73 74 20 73 6f 20 66 61 72 20 2a  of best so far *
35bb0 2f 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 6d  /.        pTo->m
35bc0 61 73 6b 4c 6f 6f 70 20 3d 20 70 46 72 6f 6d 2d  askLoop = pFrom-
35bd0 3e 6d 61 73 6b 4c 6f 6f 70 20 7c 20 70 57 4c 6f  >maskLoop | pWLo
35be0 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20  op->maskSelf;.  
35bf0 20 20 20 20 20 20 70 54 6f 2d 3e 72 65 76 4c 6f        pTo->revLo
35c00 6f 70 20 3d 20 72 65 76 4d 61 73 6b 3b 0a 20 20  op = revMask;.  
35c10 20 20 20 20 20 20 70 54 6f 2d 3e 6e 52 6f 77 20        pTo->nRow 
35c20 3d 20 6e 4f 75 74 3b 0a 20 20 20 20 20 20 20 20  = nOut;.        
35c30 70 54 6f 2d 3e 72 43 6f 73 74 20 3d 20 72 43 6f  pTo->rCost = rCo
35c40 73 74 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 2d  st;.        pTo-
35c50 3e 72 55 6e 73 6f 72 74 65 64 20 3d 20 72 55 6e  >rUnsorted = rUn
35c60 73 6f 72 74 65 64 3b 0a 20 20 20 20 20 20 20 20  sorted;.        
35c70 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 20 3d  pTo->isOrdered =
35c80 20 69 73 4f 72 64 65 72 65 64 3b 0a 20 20 20 20   isOrdered;.    
35c90 20 20 20 20 6d 65 6d 63 70 79 28 70 54 6f 2d 3e      memcpy(pTo->
35ca0 61 4c 6f 6f 70 2c 20 70 46 72 6f 6d 2d 3e 61 4c  aLoop, pFrom->aL
35cb0 6f 6f 70 2c 20 73 69 7a 65 6f 66 28 57 68 65 72  oop, sizeof(Wher
35cc0 65 4c 6f 6f 70 2a 29 2a 69 4c 6f 6f 70 29 3b 0a  eLoop*)*iLoop);.
35cd0 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 61 4c 6f          pTo->aLo
35ce0 6f 70 5b 69 4c 6f 6f 70 5d 20 3d 20 70 57 4c 6f  op[iLoop] = pWLo
35cf0 6f 70 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  op;.        if( 
35d00 6e 54 6f 3e 3d 6d 78 43 68 6f 69 63 65 20 29 7b  nTo>=mxChoice ){
35d10 0a 20 20 20 20 20 20 20 20 20 20 6d 78 49 20 3d  .          mxI =
35d20 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 78   0;.          mx
35d30 43 6f 73 74 20 3d 20 61 54 6f 5b 30 5d 2e 72 43  Cost = aTo[0].rC
35d40 6f 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 6d  ost;.          m
35d50 78 55 6e 73 6f 72 74 65 64 20 3d 20 61 54 6f 5b  xUnsorted = aTo[
35d60 30 5d 2e 6e 52 6f 77 3b 0a 20 20 20 20 20 20 20  0].nRow;.       
35d70 20 20 20 66 6f 72 28 6a 6a 3d 31 2c 20 70 54 6f     for(jj=1, pTo
35d80 3d 26 61 54 6f 5b 31 5d 3b 20 6a 6a 3c 6d 78 43  =&aTo[1]; jj<mxC
35d90 68 6f 69 63 65 3b 20 6a 6a 2b 2b 2c 20 70 54 6f  hoice; jj++, pTo
35da0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
35db0 20 69 66 28 20 70 54 6f 2d 3e 72 43 6f 73 74 3e   if( pTo->rCost>
35dc0 6d 78 43 6f 73 74 20 0a 20 20 20 20 20 20 20 20  mxCost .        
35dd0 20 20 20 20 20 7c 7c 20 28 70 54 6f 2d 3e 72 43       || (pTo->rC
35de0 6f 73 74 3d 3d 6d 78 43 6f 73 74 20 26 26 20 70  ost==mxCost && p
35df0 54 6f 2d 3e 72 55 6e 73 6f 72 74 65 64 3e 6d 78  To->rUnsorted>mx
35e00 55 6e 73 6f 72 74 65 64 29 20 0a 20 20 20 20 20  Unsorted) .     
35e10 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
35e20 20 20 20 20 20 20 20 20 6d 78 43 6f 73 74 20 3d          mxCost =
35e30 20 70 54 6f 2d 3e 72 43 6f 73 74 3b 0a 20 20 20   pTo->rCost;.   
35e40 20 20 20 20 20 20 20 20 20 20 20 6d 78 55 6e 73             mxUns
35e50 6f 72 74 65 64 20 3d 20 70 54 6f 2d 3e 72 55 6e  orted = pTo->rUn
35e60 73 6f 72 74 65 64 3b 0a 20 20 20 20 20 20 20 20  sorted;.        
35e70 20 20 20 20 20 20 6d 78 49 20 3d 20 6a 6a 3b 0a        mxI = jj;.
35e80 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
35e90 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
35ea0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
35eb0 7d 0a 0a 23 69 66 64 65 66 20 57 48 45 52 45 54  }..#ifdef WHERET
35ec0 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 20 2f 2a  RACE_ENABLED  /*
35ed0 20 3e 3d 32 20 2a 2f 0a 20 20 20 20 69 66 28 20   >=2 */.    if( 
35ee0 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63  sqlite3WhereTrac
35ef0 65 20 26 20 30 78 30 32 20 29 7b 0a 20 20 20 20  e & 0x02 ){.    
35f00 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
35f10 69 6e 74 66 28 22 2d 2d 2d 2d 20 61 66 74 65 72  intf("---- after
35f20 20 72 6f 75 6e 64 20 25 64 20 2d 2d 2d 2d 5c 6e   round %d ----\n
35f30 22 2c 20 69 4c 6f 6f 70 29 3b 0a 20 20 20 20 20  ", iLoop);.     
35f40 20 66 6f 72 28 69 69 3d 30 2c 20 70 54 6f 3d 61   for(ii=0, pTo=a
35f50 54 6f 3b 20 69 69 3c 6e 54 6f 3b 20 69 69 2b 2b  To; ii<nTo; ii++
35f60 2c 20 70 54 6f 2b 2b 29 7b 0a 20 20 20 20 20 20  , pTo++){.      
35f70 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
35f80 69 6e 74 66 28 22 20 25 73 20 63 6f 73 74 3d 25  intf(" %s cost=%
35f90 2d 33 64 20 6e 72 6f 77 3d 25 2d 33 64 20 6f 72  -3d nrow=%-3d or
35fa0 64 65 72 3d 25 63 22 2c 0a 20 20 20 20 20 20 20  der=%c",.       
35fb0 20 20 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d      wherePathNam
35fc0 65 28 70 54 6f 2c 20 69 4c 6f 6f 70 2b 31 2c 20  e(pTo, iLoop+1, 
35fd0 30 29 2c 20 70 54 6f 2d 3e 72 43 6f 73 74 2c 20  0), pTo->rCost, 
35fe0 70 54 6f 2d 3e 6e 52 6f 77 2c 0a 20 20 20 20 20  pTo->nRow,.     
35ff0 20 20 20 20 20 20 70 54 6f 2d 3e 69 73 4f 72 64        pTo->isOrd
36000 65 72 65 64 3e 3d 30 20 3f 20 28 70 54 6f 2d 3e  ered>=0 ? (pTo->
36010 69 73 4f 72 64 65 72 65 64 2b 27 30 27 29 20 3a  isOrdered+'0') :
36020 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 69   '?');.        i
36030 66 28 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65  f( pTo->isOrdere
36040 64 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  d>0 ){.         
36050 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
36060 6e 74 66 28 22 20 72 65 76 3d 30 78 25 6c 6c 78  ntf(" rev=0x%llx
36070 5c 6e 22 2c 20 70 54 6f 2d 3e 72 65 76 4c 6f 6f  \n", pTo->revLoo
36080 70 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  p);.        }els
36090 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  e{.          sql
360a0 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
360b0 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 7d  "\n");.        }
360c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
360d0 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 53 77  endif..    /* Sw
360e0 61 70 20 74 68 65 20 72 6f 6c 65 73 20 6f 66 20  ap the roles of 
360f0 61 46 72 6f 6d 20 61 6e 64 20 61 54 6f 20 66 6f  aFrom and aTo fo
36100 72 20 74 68 65 20 6e 65 78 74 20 67 65 6e 65 72  r the next gener
36110 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 70 46 72  ation */.    pFr
36120 6f 6d 20 3d 20 61 54 6f 3b 0a 20 20 20 20 61 54  om = aTo;.    aT
36130 6f 20 3d 20 61 46 72 6f 6d 3b 0a 20 20 20 20 61  o = aFrom;.    a
36140 46 72 6f 6d 20 3d 20 70 46 72 6f 6d 3b 0a 20 20  From = pFrom;.  
36150 20 20 6e 46 72 6f 6d 20 3d 20 6e 54 6f 3b 0a 20    nFrom = nTo;. 
36160 20 7d 0a 0a 20 20 69 66 28 20 6e 46 72 6f 6d 3d   }..  if( nFrom=
36170 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
36180 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
36190 2c 20 22 6e 6f 20 71 75 65 72 79 20 73 6f 6c 75  , "no query solu
361a0 74 69 6f 6e 22 29 3b 0a 20 20 20 20 73 71 6c 69  tion");.    sqli
361b0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 53  te3DbFree(db, pS
361c0 70 61 63 65 29 3b 0a 20 20 20 20 72 65 74 75 72  pace);.    retur
361d0 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
361e0 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 46 69 6e 64    }.  .  /* Find
361f0 20 74 68 65 20 6c 6f 77 65 73 74 20 63 6f 73 74   the lowest cost
36200 20 70 61 74 68 2e 20 20 70 46 72 6f 6d 20 77 69   path.  pFrom wi
36210 6c 6c 20 62 65 20 6c 65 66 74 20 70 6f 69 6e 74  ll be left point
36220 69 6e 67 20 74 6f 20 74 68 61 74 20 70 61 74 68  ing to that path
36230 20 2a 2f 0a 20 20 70 46 72 6f 6d 20 3d 20 61 46   */.  pFrom = aF
36240 72 6f 6d 3b 0a 20 20 66 6f 72 28 69 69 3d 31 3b  rom;.  for(ii=1;
36250 20 69 69 3c 6e 46 72 6f 6d 3b 20 69 69 2b 2b 29   ii<nFrom; ii++)
36260 7b 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d  {.    if( pFrom-
36270 3e 72 43 6f 73 74 3e 61 46 72 6f 6d 5b 69 69 5d  >rCost>aFrom[ii]
36280 2e 72 43 6f 73 74 20 29 20 70 46 72 6f 6d 20 3d  .rCost ) pFrom =
36290 20 26 61 46 72 6f 6d 5b 69 69 5d 3b 0a 20 20 7d   &aFrom[ii];.  }
362a0 0a 20 20 61 73 73 65 72 74 28 20 70 57 49 6e 66  .  assert( pWInf
362b0 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d 6e 4c 6f 6f 70  o->nLevel==nLoop
362c0 20 29 3b 0a 20 20 2f 2a 20 4c 6f 61 64 20 74 68   );.  /* Load th
362d0 65 20 6c 6f 77 65 73 74 20 63 6f 73 74 20 70 61  e lowest cost pa
362e0 74 68 20 69 6e 74 6f 20 70 57 49 6e 66 6f 20 2a  th into pWInfo *
362f0 2f 0a 20 20 66 6f 72 28 69 4c 6f 6f 70 3d 30 3b  /.  for(iLoop=0;
36300 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70 3b 20 69 4c   iLoop<nLoop; iL
36310 6f 6f 70 2b 2b 29 7b 0a 20 20 20 20 57 68 65 72  oop++){.    Wher
36320 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 20 3d  eLevel *pLevel =
36330 20 70 57 49 6e 66 6f 2d 3e 61 20 2b 20 69 4c 6f   pWInfo->a + iLo
36340 6f 70 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  op;.    pLevel->
36350 70 57 4c 6f 6f 70 20 3d 20 70 57 4c 6f 6f 70 20  pWLoop = pWLoop 
36360 3d 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 5b 69  = pFrom->aLoop[i
36370 4c 6f 6f 70 5d 3b 0a 20 20 20 20 70 4c 65 76 65  Loop];.    pLeve
36380 6c 2d 3e 69 46 72 6f 6d 20 3d 20 70 57 4c 6f 6f  l->iFrom = pWLoo
36390 70 2d 3e 69 54 61 62 3b 0a 20 20 20 20 70 4c 65  p->iTab;.    pLe
363a0 76 65 6c 2d 3e 69 54 61 62 43 75 72 20 3d 20 70  vel->iTabCur = p
363b0 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d  WInfo->pTabList-
363c0 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d  >a[pLevel->iFrom
363d0 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20 7d 0a 20  ].iCursor;.  }. 
363e0 20 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63   if( (pWInfo->wc
363f0 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
36400 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 29 21  _WANT_DISTINCT)!
36410 3d 30 0a 20 20 20 26 26 20 28 70 57 49 6e 66 6f  =0.   && (pWInfo
36420 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ->wctrlFlags & W
36430 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59 29  HERE_DISTINCTBY)
36440 3d 3d 30 0a 20 20 20 26 26 20 70 57 49 6e 66 6f  ==0.   && pWInfo
36450 2d 3e 65 44 69 73 74 69 6e 63 74 3d 3d 57 48 45  ->eDistinct==WHE
36460 52 45 5f 44 49 53 54 49 4e 43 54 5f 4e 4f 4f 50  RE_DISTINCT_NOOP
36470 0a 20 20 20 26 26 20 6e 52 6f 77 45 73 74 0a 20  .   && nRowEst. 
36480 20 29 7b 0a 20 20 20 20 42 69 74 6d 61 73 6b 20   ){.    Bitmask 
36490 6e 6f 74 55 73 65 64 3b 0a 20 20 20 20 69 6e 74  notUsed;.    int
364a0 20 72 63 20 3d 20 77 68 65 72 65 50 61 74 68 53   rc = wherePathS
364b0 61 74 69 73 66 69 65 73 4f 72 64 65 72 42 79 28  atisfiesOrderBy(
364c0 70 57 49 6e 66 6f 2c 20 70 57 49 6e 66 6f 2d 3e  pWInfo, pWInfo->
364d0 70 52 65 73 75 6c 74 53 65 74 2c 20 70 46 72 6f  pResultSet, pFro
364e0 6d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  m,.             
364f0 20 20 20 20 57 48 45 52 45 5f 44 49 53 54 49 4e      WHERE_DISTIN
36500 43 54 42 59 2c 20 6e 4c 6f 6f 70 2d 31 2c 20 70  CTBY, nLoop-1, p
36510 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 5b 6e 4c 6f 6f  From->aLoop[nLoo
36520 70 2d 31 5d 2c 20 26 6e 6f 74 55 73 65 64 29 3b  p-1], &notUsed);
36530 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 70 57 49  .    if( rc==pWI
36540 6e 66 6f 2d 3e 70 52 65 73 75 6c 74 53 65 74 2d  nfo->pResultSet-
36550 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20  >nExpr ){.      
36560 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63  pWInfo->eDistinc
36570 74 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e  t = WHERE_DISTIN
36580 43 54 5f 4f 52 44 45 52 45 44 3b 0a 20 20 20 20  CT_ORDERED;.    
36590 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 57 49 6e  }.  }.  if( pWIn
365a0 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a  fo->pOrderBy ){.
365b0 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e      if( pWInfo->
365c0 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
365d0 52 45 5f 44 49 53 54 49 4e 43 54 42 59 20 29 7b  RE_DISTINCTBY ){
365e0 0a 20 20 20 20 20 20 69 66 28 20 70 46 72 6f 6d  .      if( pFrom
365f0 2d 3e 69 73 4f 72 64 65 72 65 64 3d 3d 70 57 49  ->isOrdered==pWI
36600 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e  nfo->pOrderBy->n
36610 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20  Expr ){.        
36620 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63  pWInfo->eDistinc
36630 74 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e  t = WHERE_DISTIN
36640 43 54 5f 4f 52 44 45 52 45 44 3b 0a 20 20 20 20  CT_ORDERED;.    
36650 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
36660 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42       pWInfo->nOB
36670 53 61 74 20 3d 20 70 46 72 6f 6d 2d 3e 69 73 4f  Sat = pFrom->isO
36680 72 64 65 72 65 64 3b 0a 20 20 20 20 20 20 69 66  rdered;.      if
36690 28 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74  ( pWInfo->nOBSat
366a0 3c 30 20 29 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42  <0 ) pWInfo->nOB
366b0 53 61 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  Sat = 0;.      p
366c0 57 49 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b 20 3d  WInfo->revMask =
366d0 20 70 46 72 6f 6d 2d 3e 72 65 76 4c 6f 6f 70 3b   pFrom->revLoop;
366e0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28  .    }.    if( (
366f0 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
36700 67 73 20 26 20 57 48 45 52 45 5f 53 4f 52 54 42  gs & WHERE_SORTB
36710 59 47 52 4f 55 50 29 0a 20 20 20 20 20 20 20 20  YGROUP).        
36720 26 26 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61  && pWInfo->nOBSa
36730 74 3d 3d 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65  t==pWInfo->pOrde
36740 72 42 79 2d 3e 6e 45 78 70 72 0a 20 20 20 20 29  rBy->nExpr.    )
36750 7b 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20  {.      Bitmask 
36760 72 65 76 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 20  revMask = 0;.   
36770 20 20 20 69 6e 74 20 6e 4f 72 64 65 72 20 3d 20     int nOrder = 
36780 77 68 65 72 65 50 61 74 68 53 61 74 69 73 66 69  wherePathSatisfi
36790 65 73 4f 72 64 65 72 42 79 28 70 57 49 6e 66 6f  esOrderBy(pWInfo
367a0 2c 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72  , pWInfo->pOrder
367b0 42 79 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70  By, .          p
367c0 46 72 6f 6d 2c 20 30 2c 20 6e 4c 6f 6f 70 2d 31  From, 0, nLoop-1
367d0 2c 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 5b 6e  , pFrom->aLoop[n
367e0 4c 6f 6f 70 2d 31 5d 2c 20 26 72 65 76 4d 61 73  Loop-1], &revMas
367f0 6b 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20  k.      );.     
36800 20 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d   assert( pWInfo-
36810 3e 73 6f 72 74 65 64 3d 3d 30 20 29 3b 0a 20 20  >sorted==0 );.  
36820 20 20 20 20 69 66 28 20 6e 4f 72 64 65 72 3d 3d      if( nOrder==
36830 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79  pWInfo->pOrderBy
36840 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20  ->nExpr ){.     
36850 20 20 20 70 57 49 6e 66 6f 2d 3e 73 6f 72 74 65     pWInfo->sorte
36860 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70  d = 1;.        p
36870 57 49 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b 20 3d  WInfo->revMask =
36880 20 72 65 76 4d 61 73 6b 3b 0a 20 20 20 20 20 20   revMask;.      
36890 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20  }.    }.  }...  
368a0 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 20  pWInfo->nRowOut 
368b0 3d 20 70 46 72 6f 6d 2d 3e 6e 52 6f 77 3b 0a 0a  = pFrom->nRow;..
368c0 20 20 2f 2a 20 46 72 65 65 20 74 65 6d 70 6f 72    /* Free tempor
368d0 61 72 79 20 6d 65 6d 6f 72 79 20 61 6e 64 20 72  ary memory and r
368e0 65 74 75 72 6e 20 73 75 63 63 65 73 73 20 2a 2f  eturn success */
368f0 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
36900 28 64 62 2c 20 70 53 70 61 63 65 29 3b 0a 20 20  (db, pSpace);.  
36910 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
36920 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 73 74 20  ;.}../*.** Most 
36930 71 75 65 72 69 65 73 20 75 73 65 20 6f 6e 6c 79  queries use only
36940 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20   a single table 
36950 28 74 68 65 79 20 61 72 65 20 6e 6f 74 20 6a 6f  (they are not jo
36960 69 6e 73 29 20 61 6e 64 20 68 61 76 65 0a 2a 2a  ins) and have.**
36970 20 73 69 6d 70 6c 65 20 3d 3d 20 63 6f 6e 73 74   simple == const
36980 72 61 69 6e 74 73 20 61 67 61 69 6e 73 74 20 69  raints against i
36990 6e 64 65 78 65 64 20 66 69 65 6c 64 73 2e 20 20  ndexed fields.  
369a0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74  This routine att
369b0 65 6d 70 74 73 0a 2a 2a 20 74 6f 20 70 6c 61 6e  empts.** to plan
369c0 20 74 68 6f 73 65 20 73 69 6d 70 6c 65 20 63 61   those simple ca
369d0 73 65 73 20 75 73 69 6e 67 20 6d 75 63 68 20 6c  ses using much l
369e0 65 73 73 20 63 65 72 65 6d 6f 6e 79 20 74 68 61  ess ceremony tha
369f0 6e 20 74 68 65 0a 2a 2a 20 67 65 6e 65 72 61 6c  n the.** general
36a00 2d 70 75 72 70 6f 73 65 20 71 75 65 72 79 20 70  -purpose query p
36a10 6c 61 6e 6e 65 72 2c 20 61 6e 64 20 74 68 65 72  lanner, and ther
36a20 65 62 79 20 79 69 65 6c 64 20 66 61 73 74 65 72  eby yield faster
36a30 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
36a40 28 29 0a 2a 2a 20 74 69 6d 65 73 20 66 6f 72 20  ().** times for 
36a50 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e  the common case.
36a60 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 6e 6f  .**.** Return no
36a70 6e 2d 7a 65 72 6f 20 6f 6e 20 73 75 63 63 65 73  n-zero on succes
36a80 73 2c 20 69 66 20 74 68 69 73 20 71 75 65 72 79  s, if this query
36a90 20 63 61 6e 20 62 65 20 68 61 6e 64 6c 65 64 20   can be handled 
36aa0 62 79 20 74 68 69 73 0a 2a 2a 20 6e 6f 2d 66 72  by this.** no-fr
36ab0 69 6c 6c 73 20 71 75 65 72 79 20 70 6c 61 6e 6e  ills query plann
36ac0 65 72 2e 20 20 52 65 74 75 72 6e 20 7a 65 72 6f  er.  Return zero
36ad0 20 69 66 20 74 68 69 73 20 71 75 65 72 79 20 6e   if this query n
36ae0 65 65 64 73 20 74 68 65 20 0a 2a 2a 20 67 65 6e  eeds the .** gen
36af0 65 72 61 6c 2d 70 75 72 70 6f 73 65 20 71 75 65  eral-purpose que
36b00 72 79 20 70 6c 61 6e 6e 65 72 2e 0a 2a 2f 0a 73  ry planner..*/.s
36b10 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 53  tatic int whereS
36b20 68 6f 72 74 43 75 74 28 57 68 65 72 65 4c 6f 6f  hortCut(WhereLoo
36b30 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64  pBuilder *pBuild
36b40 65 72 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f  er){.  WhereInfo
36b50 20 2a 70 57 49 6e 66 6f 3b 0a 20 20 73 74 72 75   *pWInfo;.  stru
36b60 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
36b70 2a 70 49 74 65 6d 3b 0a 20 20 57 68 65 72 65 43  *pItem;.  WhereC
36b80 6c 61 75 73 65 20 2a 70 57 43 3b 0a 20 20 57 68  lause *pWC;.  Wh
36b90 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a  ereTerm *pTerm;.
36ba0 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f    WhereLoop *pLo
36bb0 6f 70 3b 0a 20 20 69 6e 74 20 69 43 75 72 3b 0a  op;.  int iCur;.
36bc0 20 20 69 6e 74 20 6a 3b 0a 20 20 54 61 62 6c 65    int j;.  Table
36bd0 20 2a 70 54 61 62 3b 0a 20 20 49 6e 64 65 78 20   *pTab;.  Index 
36be0 2a 70 49 64 78 3b 0a 20 20 0a 20 20 70 57 49 6e  *pIdx;.  .  pWIn
36bf0 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  fo = pBuilder->p
36c00 57 49 6e 66 6f 3b 0a 20 20 69 66 28 20 70 57 49  WInfo;.  if( pWI
36c10 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
36c20 26 20 57 48 45 52 45 5f 46 4f 52 43 45 5f 54 41  & WHERE_FORCE_TA
36c30 42 4c 45 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  BLE ) return 0;.
36c40 20 20 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f    assert( pWInfo
36c50 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  ->pTabList->nSrc
36c60 3e 3d 31 20 29 3b 0a 20 20 70 49 74 65 6d 20 3d  >=1 );.  pItem =
36c70 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73   pWInfo->pTabLis
36c80 74 2d 3e 61 3b 0a 20 20 70 54 61 62 20 3d 20 70  t->a;.  pTab = p
36c90 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 69 66  Item->pTab;.  if
36ca0 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  ( IsVirtual(pTab
36cb0 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
36cc0 69 66 28 20 70 49 74 65 6d 2d 3e 7a 49 6e 64 65  if( pItem->zInde
36cd0 78 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  x ) return 0;.  
36ce0 69 43 75 72 20 3d 20 70 49 74 65 6d 2d 3e 69 43  iCur = pItem->iC
36cf0 75 72 73 6f 72 3b 0a 20 20 70 57 43 20 3d 20 26  ursor;.  pWC = &
36d00 70 57 49 6e 66 6f 2d 3e 73 57 43 3b 0a 20 20 70  pWInfo->sWC;.  p
36d10 4c 6f 6f 70 20 3d 20 70 42 75 69 6c 64 65 72 2d  Loop = pBuilder-
36d20 3e 70 4e 65 77 3b 0a 20 20 70 4c 6f 6f 70 2d 3e  >pNew;.  pLoop->
36d30 77 73 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 70  wsFlags = 0;.  p
36d40 4c 6f 6f 70 2d 3e 6e 53 6b 69 70 20 3d 20 30 3b  Loop->nSkip = 0;
36d50 0a 20 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54  .  pTerm = findT
36d60 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 2d  erm(pWC, iCur, -
36d70 31 2c 20 30 2c 20 57 4f 5f 45 51 2c 20 30 29 3b  1, 0, WO_EQ, 0);
36d80 0a 20 20 69 66 28 20 70 54 65 72 6d 20 29 7b 0a  .  if( pTerm ){.
36d90 20 20 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61      pLoop->wsFla
36da0 67 73 20 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d  gs = WHERE_COLUM
36db0 4e 5f 45 51 7c 57 48 45 52 45 5f 49 50 4b 7c 57  N_EQ|WHERE_IPK|W
36dc0 48 45 52 45 5f 4f 4e 45 52 4f 57 3b 0a 20 20 20  HERE_ONEROW;.   
36dd0 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 30   pLoop->aLTerm[0
36de0 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 70  ] = pTerm;.    p
36df0 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20 31  Loop->nLTerm = 1
36e00 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62  ;.    pLoop->u.b
36e10 74 72 65 65 2e 6e 45 71 20 3d 20 31 3b 0a 20 20  tree.nEq = 1;.  
36e20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 43 6f 73    /* TUNING: Cos
36e30 74 20 6f 66 20 61 20 72 6f 77 69 64 20 6c 6f 6f  t of a rowid loo
36e40 6b 75 70 20 69 73 20 31 30 20 2a 2f 0a 20 20 20  kup is 10 */.   
36e50 20 70 4c 6f 6f 70 2d 3e 72 52 75 6e 20 3d 20 33   pLoop->rRun = 3
36e60 33 3b 20 20 2f 2a 20 33 33 3d 3d 73 71 6c 69 74  3;  /* 33==sqlit
36e70 65 33 4c 6f 67 45 73 74 28 31 30 29 20 2a 2f 0a  e3LogEst(10) */.
36e80 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72    }else{.    for
36e90 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64  (pIdx=pTab->pInd
36ea0 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70  ex; pIdx; pIdx=p
36eb0 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Idx->pNext){.   
36ec0 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 6f 70     assert( pLoop
36ed0 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 3d 3d 70  ->aLTermSpace==p
36ee0 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 20 29 3b 0a  Loop->aLTerm );.
36ef0 20 20 20 20 20 20 69 66 28 20 21 49 73 55 6e 69        if( !IsUni
36f00 71 75 65 49 6e 64 65 78 28 70 49 64 78 29 0a 20  queIndex(pIdx). 
36f10 20 20 20 20 20 20 7c 7c 20 70 49 64 78 2d 3e 70        || pIdx->p
36f20 50 61 72 74 49 64 78 57 68 65 72 65 21 3d 30 20  PartIdxWhere!=0 
36f30 0a 20 20 20 20 20 20 20 7c 7c 20 70 49 64 78 2d  .       || pIdx-
36f40 3e 6e 4b 65 79 43 6f 6c 3e 41 72 72 61 79 53 69  >nKeyCol>ArraySi
36f50 7a 65 28 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d  ze(pLoop->aLTerm
36f60 53 70 61 63 65 29 20 0a 20 20 20 20 20 20 29 20  Space) .      ) 
36f70 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
36f80 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 49 64 78 2d  for(j=0; j<pIdx-
36f90 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a  >nKeyCol; j++){.
36fa0 20 20 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20          pTerm = 
36fb0 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43  findTerm(pWC, iC
36fc0 75 72 2c 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  ur, pIdx->aiColu
36fd0 6d 6e 5b 6a 5d 2c 20 30 2c 20 57 4f 5f 45 51 2c  mn[j], 0, WO_EQ,
36fe0 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20 20 20   pIdx);.        
36ff0 69 66 28 20 70 54 65 72 6d 3d 3d 30 20 29 20 62  if( pTerm==0 ) b
37000 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 70 4c  reak;.        pL
37010 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 20 3d  oop->aLTerm[j] =
37020 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 7d 0a   pTerm;.      }.
37030 20 20 20 20 20 20 69 66 28 20 6a 21 3d 70 49 64        if( j!=pId
37040 78 2d 3e 6e 4b 65 79 43 6f 6c 20 29 20 63 6f 6e  x->nKeyCol ) con
37050 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 4c 6f  tinue;.      pLo
37060 6f 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48  op->wsFlags = WH
37070 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 7c 57 48  ERE_COLUMN_EQ|WH
37080 45 52 45 5f 4f 4e 45 52 4f 57 7c 57 48 45 52 45  ERE_ONEROW|WHERE
37090 5f 49 4e 44 45 58 45 44 3b 0a 20 20 20 20 20 20  _INDEXED;.      
370a0 69 66 28 20 70 49 64 78 2d 3e 69 73 43 6f 76 65  if( pIdx->isCove
370b0 72 69 6e 67 20 7c 7c 20 28 70 49 74 65 6d 2d 3e  ring || (pItem->
370c0 63 6f 6c 55 73 65 64 20 26 20 7e 63 6f 6c 75 6d  colUsed & ~colum
370d0 6e 73 49 6e 49 6e 64 65 78 28 70 49 64 78 29 29  nsInIndex(pIdx))
370e0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
370f0 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 7c 3d  Loop->wsFlags |=
37100 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 3b   WHERE_IDX_ONLY;
37110 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
37120 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20 6a  Loop->nLTerm = j
37130 3b 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 75  ;.      pLoop->u
37140 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 6a 3b 0a  .btree.nEq = j;.
37150 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62        pLoop->u.b
37160 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 70 49  tree.pIndex = pI
37170 64 78 3b 0a 20 20 20 20 20 20 2f 2a 20 54 55 4e  dx;.      /* TUN
37180 49 4e 47 3a 20 43 6f 73 74 20 6f 66 20 61 20 75  ING: Cost of a u
37190 6e 69 71 75 65 20 69 6e 64 65 78 20 6c 6f 6f 6b  nique index look
371a0 75 70 20 69 73 20 31 35 20 2a 2f 0a 20 20 20 20  up is 15 */.    
371b0 20 20 70 4c 6f 6f 70 2d 3e 72 52 75 6e 20 3d 20    pLoop->rRun = 
371c0 33 39 3b 20 20 2f 2a 20 33 39 3d 3d 73 71 6c 69  39;  /* 39==sqli
371d0 74 65 33 4c 6f 67 45 73 74 28 31 35 29 20 2a 2f  te3LogEst(15) */
371e0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
371f0 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c    }.  }.  if( pL
37200 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 29 7b 0a  oop->wsFlags ){.
37210 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20      pLoop->nOut 
37220 3d 20 28 4c 6f 67 45 73 74 29 31 3b 0a 20 20 20  = (LogEst)1;.   
37230 20 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70 57   pWInfo->a[0].pW
37240 4c 6f 6f 70 20 3d 20 70 4c 6f 6f 70 3b 0a 20 20  Loop = pLoop;.  
37250 20 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c    pLoop->maskSel
37260 66 20 3d 20 67 65 74 4d 61 73 6b 28 26 70 57 49  f = getMask(&pWI
37270 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 69  nfo->sMaskSet, i
37280 43 75 72 29 3b 0a 20 20 20 20 70 57 49 6e 66 6f  Cur);.    pWInfo
37290 2d 3e 61 5b 30 5d 2e 69 54 61 62 43 75 72 20 3d  ->a[0].iTabCur =
372a0 20 69 43 75 72 3b 0a 20 20 20 20 70 57 49 6e 66   iCur;.    pWInf
372b0 6f 2d 3e 6e 52 6f 77 4f 75 74 20 3d 20 31 3b 0a  o->nRowOut = 1;.
372c0 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e      if( pWInfo->
372d0 70 4f 72 64 65 72 42 79 20 29 20 70 57 49 6e 66  pOrderBy ) pWInf
372e0 6f 2d 3e 6e 4f 42 53 61 74 20 3d 20 20 70 57 49  o->nOBSat =  pWI
372f0 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e  nfo->pOrderBy->n
37300 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70 57  Expr;.    if( pW
37310 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
37320 20 26 20 57 48 45 52 45 5f 57 41 4e 54 5f 44 49   & WHERE_WANT_DI
37330 53 54 49 4e 43 54 20 29 7b 0a 20 20 20 20 20 20  STINCT ){.      
37340 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63  pWInfo->eDistinc
37350 74 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e  t = WHERE_DISTIN
37360 43 54 5f 55 4e 49 51 55 45 3b 0a 20 20 20 20 7d  CT_UNIQUE;.    }
37370 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
37380 45 42 55 47 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e  EBUG.    pLoop->
37390 63 49 64 20 3d 20 27 30 27 3b 0a 23 65 6e 64 69  cId = '0';.#endi
373a0 66 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  f.    return 1;.
373b0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
373c0 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
373d0 65 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  e the beginning 
373e0 6f 66 20 74 68 65 20 6c 6f 6f 70 20 75 73 65 64  of the loop used
373f0 20 66 6f 72 20 57 48 45 52 45 20 63 6c 61 75 73   for WHERE claus
37400 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a  e processing..**
37410 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
37420 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  e is a pointer t
37430 6f 20 61 6e 20 6f 70 61 71 75 65 20 73 74 72 75  o an opaque stru
37440 63 74 75 72 65 20 74 68 61 74 20 63 6f 6e 74 61  cture that conta
37450 69 6e 73 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69  ins.** informati
37460 6f 6e 20 6e 65 65 64 65 64 20 74 6f 20 74 65 72  on needed to ter
37470 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 2e  minate the loop.
37480 20 20 4c 61 74 65 72 2c 20 74 68 65 20 63 61 6c    Later, the cal
37490 6c 69 6e 67 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  ling routine.** 
374a0 73 68 6f 75 6c 64 20 69 6e 76 6f 6b 65 20 73 71  should invoke sq
374b0 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 29 20  lite3WhereEnd() 
374c0 77 69 74 68 20 74 68 65 20 72 65 74 75 72 6e 20  with the return 
374d0 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20 66 75  value of this fu
374e0 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20 6f 72 64  nction.** in ord
374f0 65 72 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20 74  er to complete t
37500 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
37510 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a  processing..**.*
37520 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
37530 63 75 72 73 2c 20 74 68 69 73 20 72 6f 75 74 69  curs, this routi
37540 6e 65 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 2e  ne returns NULL.
37550 0a 2a 2a 0a 2a 2a 20 54 68 65 20 62 61 73 69 63  .**.** The basic
37560 20 69 64 65 61 20 69 73 20 74 6f 20 64 6f 20 61   idea is to do a
37570 20 6e 65 73 74 65 64 20 6c 6f 6f 70 2c 20 6f 6e   nested loop, on
37580 65 20 6c 6f 6f 70 20 66 6f 72 20 65 61 63 68 20  e loop for each 
37590 74 61 62 6c 65 20 69 6e 0a 2a 2a 20 74 68 65 20  table in.** the 
375a0 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61  FROM clause of a
375b0 20 73 65 6c 65 63 74 2e 20 20 28 49 4e 53 45 52   select.  (INSER
375c0 54 20 61 6e 64 20 55 50 44 41 54 45 20 73 74 61  T and UPDATE sta
375d0 74 65 6d 65 6e 74 73 20 61 72 65 20 74 68 65 0a  tements are the.
375e0 2a 2a 20 73 61 6d 65 20 61 73 20 61 20 53 45 4c  ** same as a SEL
375f0 45 43 54 20 77 69 74 68 20 6f 6e 6c 79 20 61 20  ECT with only a 
37600 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 69 6e 20  single table in 
37610 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e  the FROM clause.
37620 29 20 20 46 6f 72 0a 2a 2a 20 65 78 61 6d 70 6c  )  For.** exampl
37630 65 2c 20 69 66 20 74 68 65 20 53 51 4c 20 69 73  e, if the SQL is
37640 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   this:.**.**    
37650 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
37660 20 74 31 2c 20 74 32 2c 20 74 33 20 57 48 45 52   t1, t2, t3 WHER
37670 45 20 2e 2e 2e 3b 0a 2a 2a 0a 2a 2a 20 54 68 65  E ...;.**.** The
37680 6e 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72  n the code gener
37690 61 74 65 64 20 69 73 20 63 6f 6e 63 65 70 74 75  ated is conceptu
376a0 61 6c 6c 79 20 6c 69 6b 65 20 74 68 65 20 66 6f  ally like the fo
376b0 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
376c0 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 31      foreach row1
376d0 20 69 6e 20 74 31 20 64 6f 20 20 20 20 20 20 20   in t1 do       
376e0 5c 20 20 20 20 43 6f 64 65 20 67 65 6e 65 72 61  \    Code genera
376f0 74 65 64 0a 2a 2a 20 20 20 20 20 20 20 20 66 6f  ted.**        fo
37700 72 65 61 63 68 20 72 6f 77 32 20 69 6e 20 74 32  reach row2 in t2
37710 20 64 6f 20 20 20 20 20 20 7c 2d 2d 20 62 79 20   do      |-- by 
37720 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
37730 6e 28 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  n().**          
37740 66 6f 72 65 61 63 68 20 72 6f 77 33 20 69 6e 20  foreach row3 in 
37750 74 33 20 64 6f 20 20 20 2f 0a 2a 2a 20 20 20 20  t3 do   /.**    
37760 20 20 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20          ....**  
37770 20 20 20 20 20 20 20 20 65 6e 64 20 20 20 20 20          end     
37780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37790 5c 20 20 20 20 43 6f 64 65 20 67 65 6e 65 72 61  \    Code genera
377a0 74 65 64 0a 2a 2a 20 20 20 20 20 20 20 20 65 6e  ted.**        en
377b0 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d               
377c0 20 20 20 20 20 20 20 20 20 7c 2d 2d 20 62 79 20           |-- by 
377d0 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
377e0 29 0a 2a 2a 20 20 20 20 20 20 65 6e 64 20 20 20  ).**      end   
377f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37800 20 20 20 20 20 20 2f 0a 2a 2a 0a 2a 2a 20 4e 6f        /.**.** No
37810 74 65 20 74 68 61 74 20 74 68 65 20 6c 6f 6f 70  te that the loop
37820 73 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 20 6e  s might not be n
37830 65 73 74 65 64 20 69 6e 20 74 68 65 20 6f 72 64  ested in the ord
37840 65 72 20 69 6e 20 77 68 69 63 68 20 74 68 65 79  er in which they
37850 0a 2a 2a 20 61 70 70 65 61 72 20 69 6e 20 74 68  .** appear in th
37860 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 66  e FROM clause if
37870 20 61 20 64 69 66 66 65 72 65 6e 74 20 6f 72 64   a different ord
37880 65 72 20 69 73 20 62 65 74 74 65 72 20 61 62 6c  er is better abl
37890 65 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20 75 73 65  e to make.** use
378a0 20 6f 66 20 69 6e 64 69 63 65 73 2e 20 20 4e 6f   of indices.  No
378b0 74 65 20 61 6c 73 6f 20 74 68 61 74 20 77 68 65  te also that whe
378c0 6e 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f  n the IN operato
378d0 72 20 61 70 70 65 61 72 73 20 69 6e 0a 2a 2a 20  r appears in.** 
378e0 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
378f0 2c 20 69 74 20 6d 69 67 68 74 20 72 65 73 75 6c  , it might resul
37900 74 20 69 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20  t in additional 
37910 6e 65 73 74 65 64 20 6c 6f 6f 70 73 20 66 6f 72  nested loops for
37920 0a 2a 2a 20 73 63 61 6e 6e 69 6e 67 20 74 68 72  .** scanning thr
37930 6f 75 67 68 20 61 6c 6c 20 76 61 6c 75 65 73 20  ough all values 
37940 6f 6e 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e  on the right-han
37950 64 20 73 69 64 65 20 6f 66 20 74 68 65 20 49 4e  d side of the IN
37960 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72  ..**.** There ar
37970 65 20 42 74 72 65 65 20 63 75 72 73 6f 72 73 20  e Btree cursors 
37980 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
37990 65 61 63 68 20 74 61 62 6c 65 2e 20 20 74 31 20  each table.  t1 
379a0 75 73 65 73 20 63 75 72 73 6f 72 0a 2a 2a 20 6e  uses cursor.** n
379b0 75 6d 62 65 72 20 70 54 61 62 4c 69 73 74 2d 3e  umber pTabList->
379c0 61 5b 30 5d 2e 69 43 75 72 73 6f 72 2e 20 20 74  a[0].iCursor.  t
379d0 32 20 75 73 65 73 20 74 68 65 20 63 75 72 73 6f  2 uses the curso
379e0 72 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 31 5d  r pTabList->a[1]
379f0 2e 69 43 75 72 73 6f 72 2e 0a 2a 2a 20 41 6e 64  .iCursor..** And
37a00 20 73 6f 20 66 6f 72 74 68 2e 20 20 54 68 69 73   so forth.  This
37a10 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74   routine generat
37a20 65 73 20 63 6f 64 65 20 74 6f 20 6f 70 65 6e 20  es code to open 
37a30 74 68 6f 73 65 20 56 44 42 45 20 63 75 72 73 6f  those VDBE curso
37a40 72 73 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74 65  rs.** and sqlite
37a50 33 57 68 65 72 65 45 6e 64 28 29 20 67 65 6e 65  3WhereEnd() gene
37a60 72 61 74 65 73 20 74 68 65 20 63 6f 64 65 20 74  rates the code t
37a70 6f 20 63 6c 6f 73 65 20 74 68 65 6d 2e 0a 2a 2a  o close them..**
37a80 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 74 68 61  .** The code tha
37a90 74 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  t sqlite3WhereBe
37aa0 67 69 6e 28 29 20 67 65 6e 65 72 61 74 65 73 20  gin() generates 
37ab0 6c 65 61 76 65 73 20 74 68 65 20 63 75 72 73 6f  leaves the curso
37ac0 72 73 20 6e 61 6d 65 64 0a 2a 2a 20 69 6e 20 70  rs named.** in p
37ad0 54 61 62 4c 69 73 74 20 70 6f 69 6e 74 69 6e 67  TabList pointing
37ae0 20 61 74 20 74 68 65 69 72 20 61 70 70 72 6f 70   at their approp
37af0 72 69 61 74 65 20 65 6e 74 72 69 65 73 2e 20 20  riate entries.  
37b00 54 68 65 20 5b 2e 2e 2e 5d 20 63 6f 64 65 0a 2a  The [...] code.*
37b10 2a 20 63 61 6e 20 75 73 65 20 4f 50 5f 43 6f 6c  * can use OP_Col
37b20 75 6d 6e 20 61 6e 64 20 4f 50 5f 52 6f 77 69 64  umn and OP_Rowid
37b30 20 6f 70 63 6f 64 65 73 20 6f 6e 20 74 68 65 73   opcodes on thes
37b40 65 20 63 75 72 73 6f 72 73 20 74 6f 20 65 78 74  e cursors to ext
37b50 72 61 63 74 0a 2a 2a 20 64 61 74 61 20 66 72 6f  ract.** data fro
37b60 6d 20 74 68 65 20 76 61 72 69 6f 75 73 20 74 61  m the various ta
37b70 62 6c 65 73 20 6f 66 20 74 68 65 20 6c 6f 6f 70  bles of the loop
37b80 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 57  ..**.** If the W
37b90 48 45 52 45 20 63 6c 61 75 73 65 20 69 73 20 65  HERE clause is e
37ba0 6d 70 74 79 2c 20 74 68 65 20 66 6f 72 65 61 63  mpty, the foreac
37bb0 68 20 6c 6f 6f 70 73 20 6d 75 73 74 20 65 61 63  h loops must eac
37bc0 68 20 73 63 61 6e 20 74 68 65 69 72 0a 2a 2a 20  h scan their.** 
37bd0 65 6e 74 69 72 65 20 74 61 62 6c 65 73 2e 20 20  entire tables.  
37be0 54 68 75 73 20 61 20 74 68 72 65 65 2d 77 61 79  Thus a three-way
37bf0 20 6a 6f 69 6e 20 69 73 20 61 6e 20 4f 28 4e 5e   join is an O(N^
37c00 33 29 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 42  3) operation.  B
37c10 75 74 20 69 66 0a 2a 2a 20 74 68 65 20 74 61 62  ut if.** the tab
37c20 6c 65 73 20 68 61 76 65 20 69 6e 64 69 63 65 73  les have indices
37c30 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 74   and there are t
37c40 65 72 6d 73 20 69 6e 20 74 68 65 20 57 48 45 52  erms in the WHER
37c50 45 20 63 6c 61 75 73 65 20 74 68 61 74 0a 2a 2a  E clause that.**
37c60 20 72 65 66 65 72 20 74 6f 20 74 68 6f 73 65 20   refer to those 
37c70 69 6e 64 69 63 65 73 2c 20 61 20 63 6f 6d 70 6c  indices, a compl
37c80 65 74 65 20 74 61 62 6c 65 20 73 63 61 6e 20 63  ete table scan c
37c90 61 6e 20 62 65 20 61 76 6f 69 64 65 64 20 61 6e  an be avoided an
37ca0 64 20 74 68 65 0a 2a 2a 20 63 6f 64 65 20 77 69  d the.** code wi
37cb0 6c 6c 20 72 75 6e 20 6d 75 63 68 20 66 61 73 74  ll run much fast
37cc0 65 72 2e 20 20 4d 6f 73 74 20 6f 66 20 74 68 65  er.  Most of the
37cd0 20 77 6f 72 6b 20 6f 66 20 74 68 69 73 20 72 6f   work of this ro
37ce0 75 74 69 6e 65 20 69 73 20 63 68 65 63 6b 69 6e  utine is checkin
37cf0 67 0a 2a 2a 20 74 6f 20 73 65 65 20 69 66 20 74  g.** to see if t
37d00 68 65 72 65 20 61 72 65 20 69 6e 64 69 63 65 73  here are indices
37d10 20 74 68 61 74 20 63 61 6e 20 62 65 20 75 73 65   that can be use
37d20 64 20 74 6f 20 73 70 65 65 64 20 75 70 20 74 68  d to speed up th
37d30 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 65  e loop..**.** Te
37d40 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52 45  rms of the WHERE
37d50 20 63 6c 61 75 73 65 20 61 72 65 20 61 6c 73 6f   clause are also
37d60 20 75 73 65 64 20 74 6f 20 6c 69 6d 69 74 20 77   used to limit w
37d70 68 69 63 68 20 72 6f 77 73 20 61 63 74 75 61 6c  hich rows actual
37d80 6c 79 0a 2a 2a 20 6d 61 6b 65 20 69 74 20 74 6f  ly.** make it to
37d90 20 74 68 65 20 22 2e 2e 2e 22 20 69 6e 20 74 68   the "..." in th
37da0 65 20 6d 69 64 64 6c 65 20 6f 66 20 74 68 65 20  e middle of the 
37db0 6c 6f 6f 70 2e 20 20 41 66 74 65 72 20 65 61 63  loop.  After eac
37dc0 68 20 22 66 6f 72 65 61 63 68 22 2c 0a 2a 2a 20  h "foreach",.** 
37dd0 74 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45  terms of the WHE
37de0 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 20 75  RE clause that u
37df0 73 65 20 6f 6e 6c 79 20 74 65 72 6d 73 20 69 6e  se only terms in
37e00 20 74 68 61 74 20 6c 6f 6f 70 20 61 6e 64 20 6f   that loop and o
37e10 75 74 65 72 0a 2a 2a 20 6c 6f 6f 70 73 20 61 72  uter.** loops ar
37e20 65 20 65 76 61 6c 75 61 74 65 64 20 61 6e 64 20  e evaluated and 
37e30 69 66 20 66 61 6c 73 65 20 61 20 6a 75 6d 70 20  if false a jump 
37e40 69 73 20 6d 61 64 65 20 61 72 6f 75 6e 64 20 61  is made around a
37e50 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 0a 2a 2a  ll subsequent.**
37e60 20 69 6e 6e 65 72 20 6c 6f 6f 70 73 20 28 6f 72   inner loops (or
37e70 20 61 72 6f 75 6e 64 20 74 68 65 20 22 2e 2e 2e   around the "...
37e80 22 20 69 66 20 74 68 65 20 74 65 73 74 20 6f 63  " if the test oc
37e90 63 75 72 73 20 77 69 74 68 69 6e 20 74 68 65 20  curs within the 
37ea0 69 6e 6e 65 72 2d 0a 2a 2a 20 6d 6f 73 74 20 6c  inner-.** most l
37eb0 6f 6f 70 29 0a 2a 2a 0a 2a 2a 20 4f 55 54 45 52  oop).**.** OUTER
37ec0 20 4a 4f 49 4e 53 0a 2a 2a 0a 2a 2a 20 41 6e 20   JOINS.**.** An 
37ed0 6f 75 74 65 72 20 6a 6f 69 6e 20 6f 66 20 74 61  outer join of ta
37ee0 62 6c 65 73 20 74 31 20 61 6e 64 20 74 32 20 69  bles t1 and t2 i
37ef0 73 20 63 6f 6e 63 65 70 74 61 6c 6c 79 20 63 6f  s conceptally co
37f00 64 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  ded as follows:.
37f10 2a 2a 0a 2a 2a 20 20 20 20 66 6f 72 65 61 63 68  **.**    foreach
37f20 20 72 6f 77 31 20 69 6e 20 74 31 20 64 6f 0a 2a   row1 in t1 do.*
37f30 2a 20 20 20 20 20 20 66 6c 61 67 20 3d 20 30 0a  *      flag = 0.
37f40 2a 2a 20 20 20 20 20 20 66 6f 72 65 61 63 68 20  **      foreach 
37f50 72 6f 77 32 20 69 6e 20 74 32 20 64 6f 0a 2a 2a  row2 in t2 do.**
37f60 20 20 20 20 20 20 20 20 73 74 61 72 74 3a 0a 2a          start:.*
37f70 2a 20 20 20 20 20 20 20 20 20 20 2e 2e 2e 0a 2a  *          ....*
37f80 2a 20 20 20 20 20 20 20 20 20 20 66 6c 61 67 20  *          flag 
37f90 3d 20 31 0a 2a 2a 20 20 20 20 20 20 65 6e 64 0a  = 1.**      end.
37fa0 2a 2a 20 20 20 20 20 20 69 66 20 66 6c 61 67 3d  **      if flag=
37fb0 3d 30 20 74 68 65 6e 0a 2a 2a 20 20 20 20 20 20  =0 then.**      
37fc0 20 20 6d 6f 76 65 20 74 68 65 20 72 6f 77 32 20    move the row2 
37fd0 63 75 72 73 6f 72 20 74 6f 20 61 20 6e 75 6c 6c  cursor to a null
37fe0 20 72 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20 67   row.**        g
37ff0 6f 74 6f 20 73 74 61 72 74 0a 2a 2a 20 20 20 20  oto start.**    
38000 20 20 66 69 0a 2a 2a 20 20 20 20 65 6e 64 0a 2a    fi.**    end.*
38010 2a 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20 43 4c  *.** ORDER BY CL
38020 41 55 53 45 20 50 52 4f 43 45 53 53 49 4e 47 0a  AUSE PROCESSING.
38030 2a 2a 0a 2a 2a 20 70 4f 72 64 65 72 42 79 20 69  **.** pOrderBy i
38040 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  s a pointer to t
38050 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
38060 73 65 20 28 6f 72 20 74 68 65 20 47 52 4f 55 50  se (or the GROUP
38070 20 42 59 20 63 6c 61 75 73 65 0a 2a 2a 20 69 66   BY clause.** if
38080 20 74 68 65 20 57 48 45 52 45 5f 47 52 4f 55 50   the WHERE_GROUP
38090 42 59 20 66 6c 61 67 20 69 73 20 73 65 74 20 69  BY flag is set i
380a0 6e 20 77 63 74 72 6c 46 6c 61 67 73 29 20 6f 66  n wctrlFlags) of
380b0 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
380c0 65 6e 74 0a 2a 2a 20 69 66 20 74 68 65 72 65 20  ent.** if there 
380d0 69 73 20 6f 6e 65 2e 20 20 49 66 20 74 68 65 72  is one.  If ther
380e0 65 20 69 73 20 6e 6f 20 4f 52 44 45 52 20 42 59  e is no ORDER BY
380f0 20 63 6c 61 75 73 65 20 6f 72 20 69 66 20 74 68   clause or if th
38100 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 6