/ Hex Artifact Content
Login

Artifact bc7276b6e7d4d50055e17cba1d495f804737f872:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d  ******.** This m
0180: 6f 64 75 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43  odule contains C
0190: 20 63 6f 64 65 20 74 68 61 74 20 67 65 6e 65 72   code that gener
01a0: 61 74 65 73 20 56 44 42 45 20 63 6f 64 65 20 75  ates VDBE code u
01b0: 73 65 64 20 74 6f 20 70 72 6f 63 65 73 73 0a 2a  sed to process.*
01c0: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
01d0: 73 65 20 6f 66 20 53 51 4c 20 73 74 61 74 65 6d  se of SQL statem
01e0: 65 6e 74 73 2e 20 20 54 68 69 73 20 6d 6f 64 75  ents.  This modu
01f0: 6c 65 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  le is responsibl
0200: 65 20 66 6f 72 0a 2a 2a 20 67 65 6e 65 72 61 74  e for.** generat
0210: 69 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68 61  ing the code tha
0220: 74 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20  t loops through 
0230: 61 20 74 61 62 6c 65 20 6c 6f 6f 6b 69 6e 67 20  a table looking 
0240: 66 6f 72 20 61 70 70 6c 69 63 61 62 6c 65 0a 2a  for applicable.*
0250: 2a 20 72 6f 77 73 2e 20 20 49 6e 64 69 63 65 73  * rows.  Indices
0260: 20 61 72 65 20 73 65 6c 65 63 74 65 64 20 61 6e   are selected an
0270: 64 20 75 73 65 64 20 74 6f 20 73 70 65 65 64 20  d used to speed 
0280: 74 68 65 20 73 65 61 72 63 68 20 77 68 65 6e 20  the search when 
0290: 64 6f 69 6e 67 0a 2a 2a 20 73 6f 20 69 73 20 61  doing.** so is a
02a0: 70 70 6c 69 63 61 62 6c 65 2e 20 20 42 65 63 61  pplicable.  Beca
02b0: 75 73 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 20  use this module 
02c0: 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
02d0: 6f 72 20 73 65 6c 65 63 74 69 6e 67 0a 2a 2a 20  or selecting.** 
02e0: 69 6e 64 69 63 65 73 2c 20 79 6f 75 20 6d 69 67  indices, you mig
02f0: 68 74 20 61 6c 73 6f 20 74 68 69 6e 6b 20 6f 66  ht also think of
0300: 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 61 73 20   this module as 
0310: 74 68 65 20 22 71 75 65 72 79 20 6f 70 74 69 6d  the "query optim
0320: 69 7a 65 72 22 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  izer"..*/.#inclu
0330: 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22  de "sqliteInt.h"
0340: 0a 23 69 6e 63 6c 75 64 65 20 22 77 68 65 72 65  .#include "where
0350: 49 6e 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 52 65  Int.h"../*.** Re
0360: 74 75 72 6e 20 74 68 65 20 65 73 74 69 6d 61 74  turn the estimat
0370: 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74  ed number of out
0380: 70 75 74 20 72 6f 77 73 20 66 72 6f 6d 20 61 20  put rows from a 
0390: 57 48 45 52 45 20 63 6c 61 75 73 65 0a 2a 2f 0a  WHERE clause.*/.
03a0: 75 36 34 20 73 71 6c 69 74 65 33 57 68 65 72 65  u64 sqlite3Where
03b0: 4f 75 74 70 75 74 52 6f 77 43 6f 75 6e 74 28 57  OutputRowCount(W
03c0: 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
03d0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
03e0: 74 65 33 4c 6f 67 45 73 74 54 6f 49 6e 74 28 70  te3LogEstToInt(p
03f0: 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 29 3b  WInfo->nRowOut);
0400: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
0410: 20 6f 6e 65 20 6f 66 20 74 68 65 20 57 48 45 52   one of the WHER
0420: 45 5f 44 49 53 54 49 4e 43 54 5f 78 78 78 78 78  E_DISTINCT_xxxxx
0430: 20 76 61 6c 75 65 73 20 74 6f 20 69 6e 64 69 63   values to indic
0440: 61 74 65 20 68 6f 77 20 74 68 69 73 0a 2a 2a 20  ate how this.** 
0450: 57 48 45 52 45 20 63 6c 61 75 73 65 20 72 65 74  WHERE clause ret
0460: 75 72 6e 73 20 6f 75 74 70 75 74 73 20 66 6f 72  urns outputs for
0470: 20 44 49 53 54 49 4e 43 54 20 70 72 6f 63 65 73   DISTINCT proces
0480: 73 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  sing..*/.int sql
0490: 69 74 65 33 57 68 65 72 65 49 73 44 69 73 74 69  ite3WhereIsDisti
04a0: 6e 63 74 28 57 68 65 72 65 49 6e 66 6f 20 2a 70  nct(WhereInfo *p
04b0: 57 49 6e 66 6f 29 7b 0a 20 20 72 65 74 75 72 6e  WInfo){.  return
04c0: 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e   pWInfo->eDistin
04d0: 63 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ct;.}../*.** Ret
04e0: 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
04f0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 72 65 74  WHERE clause ret
0500: 75 72 6e 73 20 72 6f 77 73 20 69 6e 20 4f 52 44  urns rows in ORD
0510: 45 52 20 42 59 20 6f 72 64 65 72 2e 0a 2a 2a 20  ER BY order..** 
0520: 52 65 74 75 72 6e 20 46 41 4c 53 45 20 69 66 20  Return FALSE if 
0530: 74 68 65 20 6f 75 74 70 75 74 20 6e 65 65 64 73  the output needs
0540: 20 74 6f 20 62 65 20 73 6f 72 74 65 64 2e 0a 2a   to be sorted..*
0550: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65  /.int sqlite3Whe
0560: 72 65 49 73 4f 72 64 65 72 65 64 28 57 68 65 72  reIsOrdered(Wher
0570: 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a  eInfo *pWInfo){.
0580: 20 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 2d    return pWInfo-
0590: 3e 6e 4f 42 53 61 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  >nOBSat;.}../*.*
05a0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 56 44 42  * Return the VDB
05b0: 45 20 61 64 64 72 65 73 73 20 6f 72 20 6c 61 62  E address or lab
05c0: 65 6c 20 74 6f 20 6a 75 6d 70 20 74 6f 20 69 6e  el to jump to in
05d0: 20 6f 72 64 65 72 20 74 6f 20 63 6f 6e 74 69 6e   order to contin
05e0: 75 65 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c  ue.** immediatel
05f0: 79 20 77 69 74 68 20 74 68 65 20 6e 65 78 74 20  y with the next 
0600: 72 6f 77 20 6f 66 20 61 20 57 48 45 52 45 20 63  row of a WHERE c
0610: 6c 61 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  lause..*/.int sq
0620: 6c 69 74 65 33 57 68 65 72 65 43 6f 6e 74 69 6e  lite3WhereContin
0630: 75 65 4c 61 62 65 6c 28 57 68 65 72 65 49 6e 66  ueLabel(WhereInf
0640: 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 61 73  o *pWInfo){.  as
0650: 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 69 43  sert( pWInfo->iC
0660: 6f 6e 74 69 6e 75 65 21 3d 30 20 29 3b 0a 20 20  ontinue!=0 );.  
0670: 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 69  return pWInfo->i
0680: 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a  Continue;.}../*.
0690: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 56 44  ** Return the VD
06a0: 42 45 20 61 64 64 72 65 73 73 20 6f 72 20 6c 61  BE address or la
06b0: 62 65 6c 20 74 6f 20 6a 75 6d 70 20 74 6f 20 69  bel to jump to i
06c0: 6e 20 6f 72 64 65 72 20 74 6f 20 62 72 65 61 6b  n order to break
06d0: 0a 2a 2a 20 6f 75 74 20 6f 66 20 61 20 57 48 45  .** out of a WHE
06e0: 52 45 20 6c 6f 6f 70 2e 0a 2a 2f 0a 69 6e 74 20  RE loop..*/.int 
06f0: 73 71 6c 69 74 65 33 57 68 65 72 65 42 72 65 61  sqlite3WhereBrea
0700: 6b 4c 61 62 65 6c 28 57 68 65 72 65 49 6e 66 6f  kLabel(WhereInfo
0710: 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 72 65 74   *pWInfo){.  ret
0720: 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65  urn pWInfo->iBre
0730: 61 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ak;.}../*.** Ret
0740: 75 72 6e 20 54 52 55 45 20 69 66 20 61 6e 20 55  urn TRUE if an U
0750: 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20  PDATE or DELETE 
0760: 73 74 61 74 65 6d 65 6e 74 20 63 61 6e 20 6f 70  statement can op
0770: 65 72 61 74 65 20 64 69 72 65 63 74 6c 79 20 6f  erate directly o
0780: 6e 0a 2a 2a 20 74 68 65 20 72 6f 77 69 64 73 20  n.** the rowids 
0790: 72 65 74 75 72 6e 65 64 20 62 79 20 61 20 57 48  returned by a WH
07a0: 45 52 45 20 63 6c 61 75 73 65 2e 20 20 52 65 74  ERE clause.  Ret
07b0: 75 72 6e 20 46 41 4c 53 45 20 69 66 20 64 6f 69  urn FALSE if doi
07c0: 6e 67 20 61 6e 0a 2a 2a 20 55 50 44 41 54 45 20  ng an.** UPDATE 
07d0: 6f 72 20 44 45 4c 45 54 45 20 6d 69 67 68 74 20  or DELETE might 
07e0: 63 68 61 6e 67 65 20 73 75 62 73 65 71 75 65 6e  change subsequen
07f0: 74 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 72  t WHERE clause r
0800: 65 73 75 6c 74 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  esults..**.** If
0810: 20 74 68 65 20 4f 4e 45 50 41 53 53 20 6f 70 74   the ONEPASS opt
0820: 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 75 73 65  imization is use
0830: 64 20 28 69 66 20 74 68 69 73 20 72 6f 75 74 69  d (if this routi
0840: 6e 65 20 72 65 74 75 72 6e 73 20 74 72 75 65 29  ne returns true)
0850: 0a 2a 2a 20 74 68 65 6e 20 61 6c 73 6f 20 77 72  .** then also wr
0860: 69 74 65 20 74 68 65 20 69 6e 64 69 63 65 73 20  ite the indices 
0870: 6f 66 20 6f 70 65 6e 20 63 75 72 73 6f 72 73 20  of open cursors 
0880: 75 73 65 64 20 62 79 20 4f 4e 45 50 41 53 53 0a  used by ONEPASS.
0890: 2a 2a 20 69 6e 74 6f 20 61 69 43 75 72 5b 30 5d  ** into aiCur[0]
08a0: 20 61 6e 64 20 61 69 43 75 72 5b 31 5d 2e 20 20   and aiCur[1].  
08b0: 69 61 43 75 72 5b 30 5d 20 67 65 74 73 20 74 68  iaCur[0] gets th
08c0: 65 20 63 75 72 73 6f 72 20 6f 66 20 74 68 65 20  e cursor of the 
08d0: 64 61 74 61 0a 2a 2a 20 74 61 62 6c 65 20 61 6e  data.** table an
08e0: 64 20 69 61 43 75 72 5b 31 5d 20 67 65 74 73 20  d iaCur[1] gets 
08f0: 74 68 65 20 63 75 72 73 6f 72 20 75 73 65 64 20  the cursor used 
0900: 62 79 20 61 6e 20 61 75 78 69 6c 69 61 72 79 20  by an auxiliary 
0910: 69 6e 64 65 78 2e 0a 2a 2a 20 45 69 74 68 65 72  index..** Either
0920: 20 76 61 6c 75 65 20 6d 61 79 20 62 65 20 2d 31   value may be -1
0930: 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61  , indicating tha
0940: 74 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20  t cursor is not 
0950: 75 73 65 64 2e 0a 2a 2a 20 41 6e 79 20 63 75 72  used..** Any cur
0960: 73 6f 72 73 20 72 65 74 75 72 6e 65 64 20 77 69  sors returned wi
0970: 6c 6c 20 68 61 76 65 20 62 65 65 6e 20 6f 70 65  ll have been ope
0980: 6e 65 64 20 66 6f 72 20 77 72 69 74 69 6e 67 2e  ned for writing.
0990: 0a 2a 2a 0a 2a 2a 20 61 69 43 75 72 5b 30 5d 20  .**.** aiCur[0] 
09a0: 61 6e 64 20 61 69 43 75 72 5b 31 5d 20 62 6f 74  and aiCur[1] bot
09b0: 68 20 67 65 74 20 2d 31 20 69 66 20 74 68 65 20  h get -1 if the 
09c0: 77 68 65 72 65 2d 63 6c 61 75 73 65 20 6c 6f 67  where-clause log
09d0: 69 63 20 69 73 0a 2a 2a 20 75 6e 61 62 6c 65 20  ic is.** unable 
09e0: 74 6f 20 75 73 65 20 74 68 65 20 4f 4e 45 50 41  to use the ONEPA
09f0: 53 53 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e  SS optimization.
0a00: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 57  .*/.int sqlite3W
0a10: 68 65 72 65 4f 6b 4f 6e 65 50 61 73 73 28 57 68  hereOkOnePass(Wh
0a20: 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c  ereInfo *pWInfo,
0a30: 20 69 6e 74 20 2a 61 69 43 75 72 29 7b 0a 20 20   int *aiCur){.  
0a40: 6d 65 6d 63 70 79 28 61 69 43 75 72 2c 20 70 57  memcpy(aiCur, pW
0a50: 49 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e 65 50 61  Info->aiCurOnePa
0a60: 73 73 2c 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a  ss, sizeof(int)*
0a70: 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 57 49  2);.  return pWI
0a80: 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 3b 0a  nfo->okOnePass;.
0a90: 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  }../*.** Move th
0aa0: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 53 72  e content of pSr
0ab0: 63 20 69 6e 74 6f 20 70 44 65 73 74 0a 2a 2f 0a  c into pDest.*/.
0ac0: 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72  static void wher
0ad0: 65 4f 72 4d 6f 76 65 28 57 68 65 72 65 4f 72 53  eOrMove(WhereOrS
0ae0: 65 74 20 2a 70 44 65 73 74 2c 20 57 68 65 72 65  et *pDest, Where
0af0: 4f 72 53 65 74 20 2a 70 53 72 63 29 7b 0a 20 20  OrSet *pSrc){.  
0b00: 70 44 65 73 74 2d 3e 6e 20 3d 20 70 53 72 63 2d  pDest->n = pSrc-
0b10: 3e 6e 3b 0a 20 20 6d 65 6d 63 70 79 28 70 44 65  >n;.  memcpy(pDe
0b20: 73 74 2d 3e 61 2c 20 70 53 72 63 2d 3e 61 2c 20  st->a, pSrc->a, 
0b30: 70 44 65 73 74 2d 3e 6e 2a 73 69 7a 65 6f 66 28  pDest->n*sizeof(
0b40: 70 44 65 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 7d  pDest->a[0]));.}
0b50: 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 69  ../*.** Try to i
0b60: 6e 73 65 72 74 20 61 20 6e 65 77 20 70 72 65 72  nsert a new prer
0b70: 65 71 75 69 73 69 74 65 2f 63 6f 73 74 20 65 6e  equisite/cost en
0b80: 74 72 79 20 69 6e 74 6f 20 74 68 65 20 57 68 65  try into the Whe
0b90: 72 65 4f 72 53 65 74 20 70 53 65 74 2e 0a 2a 2a  reOrSet pSet..**
0ba0: 0a 2a 2a 20 54 68 65 20 6e 65 77 20 65 6e 74 72  .** The new entr
0bb0: 79 20 6d 69 67 68 74 20 6f 76 65 72 77 72 69 74  y might overwrit
0bc0: 65 20 61 6e 20 65 78 69 73 74 69 6e 67 20 65 6e  e an existing en
0bd0: 74 72 79 2c 20 6f 72 20 69 74 20 6d 69 67 68 74  try, or it might
0be0: 20 62 65 0a 2a 2a 20 61 70 70 65 6e 64 65 64 2c   be.** appended,
0bf0: 20 6f 72 20 69 74 20 6d 69 67 68 74 20 62 65 20   or it might be 
0c00: 64 69 73 63 61 72 64 65 64 2e 20 20 44 6f 20 77  discarded.  Do w
0c10: 68 61 74 65 76 65 72 20 69 73 20 74 68 65 20 72  hatever is the r
0c20: 69 67 68 74 20 74 68 69 6e 67 0a 2a 2a 20 73 6f  ight thing.** so
0c30: 20 74 68 61 74 20 70 53 65 74 20 6b 65 65 70 73   that pSet keeps
0c40: 20 74 68 65 20 4e 5f 4f 52 5f 43 4f 53 54 20 62   the N_OR_COST b
0c50: 65 73 74 20 65 6e 74 72 69 65 73 20 73 65 65 6e  est entries seen
0c60: 20 73 6f 20 66 61 72 2e 0a 2a 2f 0a 73 74 61 74   so far..*/.stat
0c70: 69 63 20 69 6e 74 20 77 68 65 72 65 4f 72 49 6e  ic int whereOrIn
0c80: 73 65 72 74 28 0a 20 20 57 68 65 72 65 4f 72 53  sert(.  WhereOrS
0c90: 65 74 20 2a 70 53 65 74 2c 20 20 20 20 20 20 2f  et *pSet,      /
0ca0: 2a 20 54 68 65 20 57 68 65 72 65 4f 72 53 65 74  * The WhereOrSet
0cb0: 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 20 2a   to be updated *
0cc0: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 70 72 65 72  /.  Bitmask prer
0cd0: 65 71 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 72  eq,        /* Pr
0ce0: 65 72 65 71 75 69 73 69 74 65 73 20 6f 66 20 74  erequisites of t
0cf0: 68 65 20 6e 65 77 20 65 6e 74 72 79 20 2a 2f 0a  he new entry */.
0d00: 20 20 4c 6f 67 45 73 74 20 72 52 75 6e 2c 20 20    LogEst rRun,  
0d10: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 75 6e 2d           /* Run-
0d20: 63 6f 73 74 20 6f 66 20 74 68 65 20 6e 65 77 20  cost of the new 
0d30: 65 6e 74 72 79 20 2a 2f 0a 20 20 4c 6f 67 45 73  entry */.  LogEs
0d40: 74 20 6e 4f 75 74 20 20 20 20 20 20 20 20 20 20  t nOut          
0d50: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f    /* Number of o
0d60: 75 74 70 75 74 73 20 66 6f 72 20 74 68 65 20 6e  utputs for the n
0d70: 65 77 20 65 6e 74 72 79 20 2a 2f 0a 29 7b 0a 20  ew entry */.){. 
0d80: 20 75 31 36 20 69 3b 0a 20 20 57 68 65 72 65 4f   u16 i;.  WhereO
0d90: 72 43 6f 73 74 20 2a 70 3b 0a 20 20 66 6f 72 28  rCost *p;.  for(
0da0: 69 3d 70 53 65 74 2d 3e 6e 2c 20 70 3d 70 53 65  i=pSet->n, p=pSe
0db0: 74 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20  t->a; i>0; i--, 
0dc0: 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 72 52  p++){.    if( rR
0dd0: 75 6e 3c 3d 70 2d 3e 72 52 75 6e 20 26 26 20 28  un<=p->rRun && (
0de0: 70 72 65 72 65 71 20 26 20 70 2d 3e 70 72 65 72  prereq & p->prer
0df0: 65 71 29 3d 3d 70 72 65 72 65 71 20 29 7b 0a 20  eq)==prereq ){. 
0e00: 20 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65 4f       goto whereO
0e10: 72 49 6e 73 65 72 74 5f 64 6f 6e 65 3b 0a 20 20  rInsert_done;.  
0e20: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 72    }.    if( p->r
0e30: 52 75 6e 3c 3d 72 52 75 6e 20 26 26 20 28 70 2d  Run<=rRun && (p-
0e40: 3e 70 72 65 72 65 71 20 26 20 70 72 65 72 65 71  >prereq & prereq
0e50: 29 3d 3d 70 2d 3e 70 72 65 72 65 71 20 29 7b 0a  )==p->prereq ){.
0e60: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
0e70: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
0e80: 70 53 65 74 2d 3e 6e 3c 4e 5f 4f 52 5f 43 4f 53  pSet->n<N_OR_COS
0e90: 54 20 29 7b 0a 20 20 20 20 70 20 3d 20 26 70 53  T ){.    p = &pS
0ea0: 65 74 2d 3e 61 5b 70 53 65 74 2d 3e 6e 2b 2b 5d  et->a[pSet->n++]
0eb0: 3b 0a 20 20 20 20 70 2d 3e 6e 4f 75 74 20 3d 20  ;.    p->nOut = 
0ec0: 6e 4f 75 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  nOut;.  }else{. 
0ed0: 20 20 20 70 20 3d 20 70 53 65 74 2d 3e 61 3b 0a     p = pSet->a;.
0ee0: 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 70      for(i=1; i<p
0ef0: 53 65 74 2d 3e 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Set->n; i++){.  
0f00: 20 20 20 20 69 66 28 20 70 2d 3e 72 52 75 6e 3e      if( p->rRun>
0f10: 70 53 65 74 2d 3e 61 5b 69 5d 2e 72 52 75 6e 20  pSet->a[i].rRun 
0f20: 29 20 70 20 3d 20 70 53 65 74 2d 3e 61 20 2b 20  ) p = pSet->a + 
0f30: 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  i;.    }.    if(
0f40: 20 70 2d 3e 72 52 75 6e 3c 3d 72 52 75 6e 20 29   p->rRun<=rRun )
0f50: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 77   return 0;.  }.w
0f60: 68 65 72 65 4f 72 49 6e 73 65 72 74 5f 64 6f 6e  hereOrInsert_don
0f70: 65 3a 0a 20 20 70 2d 3e 70 72 65 72 65 71 20 3d  e:.  p->prereq =
0f80: 20 70 72 65 72 65 71 3b 0a 20 20 70 2d 3e 72 52   prereq;.  p->rR
0f90: 75 6e 20 3d 20 72 52 75 6e 3b 0a 20 20 69 66 28  un = rRun;.  if(
0fa0: 20 70 2d 3e 6e 4f 75 74 3e 6e 4f 75 74 20 29 20   p->nOut>nOut ) 
0fb0: 70 2d 3e 6e 4f 75 74 20 3d 20 6e 4f 75 74 3b 0a  p->nOut = nOut;.
0fc0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f    return 1;.}../
0fd0: 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
0fe0: 61 20 70 72 65 61 6c 6c 6f 63 61 74 65 64 20 57  a preallocated W
0ff0: 68 65 72 65 43 6c 61 75 73 65 20 73 74 72 75 63  hereClause struc
1000: 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ture..*/.static 
1010: 76 6f 69 64 20 77 68 65 72 65 43 6c 61 75 73 65  void whereClause
1020: 49 6e 69 74 28 0a 20 20 57 68 65 72 65 43 6c 61  Init(.  WhereCla
1030: 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20  use *pWC,       
1040: 20 2f 2a 20 54 68 65 20 57 68 65 72 65 43 6c 61   /* The WhereCla
1050: 75 73 65 20 74 6f 20 62 65 20 69 6e 69 74 69 61  use to be initia
1060: 6c 69 7a 65 64 20 2a 2f 0a 20 20 57 68 65 72 65  lized */.  Where
1070: 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 20 20 20  Info *pWInfo    
1080: 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
1090: 20 70 72 6f 63 65 73 73 69 6e 67 20 63 6f 6e 74   processing cont
10a0: 65 78 74 20 2a 2f 0a 29 7b 0a 20 20 70 57 43 2d  ext */.){.  pWC-
10b0: 3e 70 57 49 6e 66 6f 20 3d 20 70 57 49 6e 66 6f  >pWInfo = pWInfo
10c0: 3b 0a 20 20 70 57 43 2d 3e 70 4f 75 74 65 72 20  ;.  pWC->pOuter 
10d0: 3d 20 30 3b 0a 20 20 70 57 43 2d 3e 6e 54 65 72  = 0;.  pWC->nTer
10e0: 6d 20 3d 20 30 3b 0a 20 20 70 57 43 2d 3e 6e 53  m = 0;.  pWC->nS
10f0: 6c 6f 74 20 3d 20 41 72 72 61 79 53 69 7a 65 28  lot = ArraySize(
1100: 70 57 43 2d 3e 61 53 74 61 74 69 63 29 3b 0a 20  pWC->aStatic);. 
1110: 20 70 57 43 2d 3e 61 20 3d 20 70 57 43 2d 3e 61   pWC->a = pWC->a
1120: 53 74 61 74 69 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f  Static;.}../* Fo
1130: 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20  rward reference 
1140: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
1150: 68 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28  hereClauseClear(
1160: 57 68 65 72 65 43 6c 61 75 73 65 2a 29 3b 0a 0a  WhereClause*);..
1170: 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65  /*.** Deallocate
1180: 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 73 73 6f   all memory asso
1190: 63 69 61 74 65 64 20 77 69 74 68 20 61 20 57 68  ciated with a Wh
11a0: 65 72 65 4f 72 49 6e 66 6f 20 6f 62 6a 65 63 74  ereOrInfo object
11b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
11c0: 20 77 68 65 72 65 4f 72 49 6e 66 6f 44 65 6c 65   whereOrInfoDele
11d0: 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  te(sqlite3 *db, 
11e0: 57 68 65 72 65 4f 72 49 6e 66 6f 20 2a 70 29 7b  WhereOrInfo *p){
11f0: 0a 20 20 77 68 65 72 65 43 6c 61 75 73 65 43 6c  .  whereClauseCl
1200: 65 61 72 28 26 70 2d 3e 77 63 29 3b 0a 20 20 73  ear(&p->wc);.  s
1210: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
1220: 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65   p);.}../*.** De
1230: 61 6c 6c 6f 63 61 74 65 20 61 6c 6c 20 6d 65 6d  allocate all mem
1240: 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77  ory associated w
1250: 69 74 68 20 61 20 57 68 65 72 65 41 6e 64 49 6e  ith a WhereAndIn
1260: 66 6f 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74  fo object..*/.st
1270: 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 41  atic void whereA
1280: 6e 64 49 6e 66 6f 44 65 6c 65 74 65 28 73 71 6c  ndInfoDelete(sql
1290: 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 41  ite3 *db, WhereA
12a0: 6e 64 49 6e 66 6f 20 2a 70 29 7b 0a 20 20 77 68  ndInfo *p){.  wh
12b0: 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28 26  ereClauseClear(&
12c0: 70 2d 3e 77 63 29 3b 0a 20 20 73 71 6c 69 74 65  p->wc);.  sqlite
12d0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a  3DbFree(db, p);.
12e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63  }../*.** Dealloc
12f0: 61 74 65 20 61 20 57 68 65 72 65 43 6c 61 75 73  ate a WhereClaus
1300: 65 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68  e structure.  Th
1310: 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 73 74  e WhereClause st
1320: 72 75 63 74 75 72 65 0a 2a 2a 20 69 74 73 65 6c  ructure.** itsel
1330: 66 20 69 73 20 6e 6f 74 20 66 72 65 65 64 2e 20  f is not freed. 
1340: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
1350: 20 74 68 65 20 69 6e 76 65 72 73 65 20 6f 66 20   the inverse of 
1360: 77 68 65 72 65 43 6c 61 75 73 65 49 6e 69 74 28  whereClauseInit(
1370: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  )..*/.static voi
1380: 64 20 77 68 65 72 65 43 6c 61 75 73 65 43 6c 65  d whereClauseCle
1390: 61 72 28 57 68 65 72 65 43 6c 61 75 73 65 20 2a  ar(WhereClause *
13a0: 70 57 43 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  pWC){.  int i;. 
13b0: 20 57 68 65 72 65 54 65 72 6d 20 2a 61 3b 0a 20   WhereTerm *a;. 
13c0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
13d0: 57 43 2d 3e 70 57 49 6e 66 6f 2d 3e 70 50 61 72  WC->pWInfo->pPar
13e0: 73 65 2d 3e 64 62 3b 0a 20 20 66 6f 72 28 69 3d  se->db;.  for(i=
13f0: 70 57 43 2d 3e 6e 54 65 72 6d 2d 31 2c 20 61 3d  pWC->nTerm-1, a=
1400: 70 57 43 2d 3e 61 3b 20 69 3e 3d 30 3b 20 69 2d  pWC->a; i>=0; i-
1410: 2d 2c 20 61 2b 2b 29 7b 0a 20 20 20 20 69 66 28  -, a++){.    if(
1420: 20 61 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45   a->wtFlags & TE
1430: 52 4d 5f 44 59 4e 41 4d 49 43 20 29 7b 0a 20 20  RM_DYNAMIC ){.  
1440: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
1450: 65 6c 65 74 65 28 64 62 2c 20 61 2d 3e 70 45 78  elete(db, a->pEx
1460: 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  pr);.    }.    i
1470: 66 28 20 61 2d 3e 77 74 46 6c 61 67 73 20 26 20  f( a->wtFlags & 
1480: 54 45 52 4d 5f 4f 52 49 4e 46 4f 20 29 7b 0a 20  TERM_ORINFO ){. 
1490: 20 20 20 20 20 77 68 65 72 65 4f 72 49 6e 66 6f       whereOrInfo
14a0: 44 65 6c 65 74 65 28 64 62 2c 20 61 2d 3e 75 2e  Delete(db, a->u.
14b0: 70 4f 72 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 65  pOrInfo);.    }e
14c0: 6c 73 65 20 69 66 28 20 61 2d 3e 77 74 46 6c 61  lse if( a->wtFla
14d0: 67 73 20 26 20 54 45 52 4d 5f 41 4e 44 49 4e 46  gs & TERM_ANDINF
14e0: 4f 20 29 7b 0a 20 20 20 20 20 20 77 68 65 72 65  O ){.      where
14f0: 41 6e 64 49 6e 66 6f 44 65 6c 65 74 65 28 64 62  AndInfoDelete(db
1500: 2c 20 61 2d 3e 75 2e 70 41 6e 64 49 6e 66 6f 29  , a->u.pAndInfo)
1510: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
1520: 28 20 70 57 43 2d 3e 61 21 3d 70 57 43 2d 3e 61  ( pWC->a!=pWC->a
1530: 53 74 61 74 69 63 20 29 7b 0a 20 20 20 20 73 71  Static ){.    sq
1540: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
1550: 70 57 43 2d 3e 61 29 3b 0a 20 20 7d 0a 7d 0a 0a  pWC->a);.  }.}..
1560: 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 73 69 6e 67  /*.** Add a sing
1570: 6c 65 20 6e 65 77 20 57 68 65 72 65 54 65 72 6d  le new WhereTerm
1580: 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20 57 68   entry to the Wh
1590: 65 72 65 43 6c 61 75 73 65 20 6f 62 6a 65 63 74  ereClause object
15a0: 20 70 57 43 2e 0a 2a 2a 20 54 68 65 20 6e 65 77   pWC..** The new
15b0: 20 57 68 65 72 65 54 65 72 6d 20 6f 62 6a 65 63   WhereTerm objec
15c0: 74 20 69 73 20 63 6f 6e 73 74 72 75 63 74 65 64  t is constructed
15d0: 20 66 72 6f 6d 20 45 78 70 72 20 70 20 61 6e 64   from Expr p and
15e0: 20 77 69 74 68 20 77 74 46 6c 61 67 73 2e 0a 2a   with wtFlags..*
15f0: 2a 20 54 68 65 20 69 6e 64 65 78 20 69 6e 20 70  * The index in p
1600: 57 43 2d 3e 61 5b 5d 20 6f 66 20 74 68 65 20 6e  WC->a[] of the n
1610: 65 77 20 57 68 65 72 65 54 65 72 6d 20 69 73 20  ew WhereTerm is 
1620: 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63  returned on succ
1630: 65 73 73 2e 0a 2a 2a 20 30 20 69 73 20 72 65 74  ess..** 0 is ret
1640: 75 72 6e 65 64 20 69 66 20 74 68 65 20 6e 65 77  urned if the new
1650: 20 57 68 65 72 65 54 65 72 6d 20 63 6f 75 6c 64   WhereTerm could
1660: 20 6e 6f 74 20 62 65 20 61 64 64 65 64 20 64 75   not be added du
1670: 65 20 74 6f 20 61 20 6d 65 6d 6f 72 79 0a 2a 2a  e to a memory.**
1680: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f   allocation erro
1690: 72 2e 20 20 54 68 65 20 6d 65 6d 6f 72 79 20 61  r.  The memory a
16a0: 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 75 72  llocation failur
16b0: 65 20 77 69 6c 6c 20 62 65 20 72 65 63 6f 72 64  e will be record
16c0: 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 64 62 2d  ed in.** the db-
16d0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c  >mallocFailed fl
16e0: 61 67 20 73 6f 20 74 68 61 74 20 68 69 67 68 65  ag so that highe
16f0: 72 2d 6c 65 76 65 6c 20 66 75 6e 63 74 69 6f 6e  r-level function
1700: 73 20 63 61 6e 20 64 65 74 65 63 74 20 69 74 2e  s can detect it.
1710: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
1720: 69 6e 65 20 77 69 6c 6c 20 69 6e 63 72 65 61 73  ine will increas
1730: 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  e the size of th
1740: 65 20 70 57 43 2d 3e 61 5b 5d 20 61 72 72 61 79  e pWC->a[] array
1750: 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a   as necessary..*
1760: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 77 74 46 6c  *.** If the wtFl
1770: 61 67 73 20 61 72 67 75 6d 65 6e 74 20 69 6e 63  ags argument inc
1780: 6c 75 64 65 73 20 54 45 52 4d 5f 44 59 4e 41 4d  ludes TERM_DYNAM
1790: 49 43 2c 20 74 68 65 6e 20 72 65 73 70 6f 6e 73  IC, then respons
17a0: 69 62 69 6c 69 74 79 0a 2a 2a 20 66 6f 72 20 66  ibility.** for f
17b0: 72 65 65 69 6e 67 20 74 68 65 20 65 78 70 72 65  reeing the expre
17c0: 73 73 69 6f 6e 20 70 20 69 73 20 61 73 73 75 6d  ssion p is assum
17d0: 65 64 20 62 79 20 74 68 65 20 57 68 65 72 65 43  ed by the WhereC
17e0: 6c 61 75 73 65 20 6f 62 6a 65 63 74 20 70 57 43  lause object pWC
17f0: 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 72 75  ..** This is tru
1800: 65 20 65 76 65 6e 20 69 66 20 74 68 69 73 20 72  e even if this r
1810: 6f 75 74 69 6e 65 20 66 61 69 6c 73 20 74 6f 20  outine fails to 
1820: 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 57  allocate a new W
1830: 68 65 72 65 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20  hereTerm..**.** 
1840: 57 41 52 4e 49 4e 47 3a 20 20 54 68 69 73 20 72  WARNING:  This r
1850: 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 72 65 61  outine might rea
1860: 6c 6c 6f 63 61 74 65 20 74 68 65 20 73 70 61 63  llocate the spac
1870: 65 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a  e used to store.
1880: 2a 2a 20 57 68 65 72 65 54 65 72 6d 73 2e 20 20  ** WhereTerms.  
1890: 41 6c 6c 20 70 6f 69 6e 74 65 72 73 20 74 6f 20  All pointers to 
18a0: 57 68 65 72 65 54 65 72 6d 73 20 73 68 6f 75 6c  WhereTerms shoul
18b0: 64 20 62 65 20 69 6e 76 61 6c 69 64 61 74 65 64  d be invalidated
18c0: 20 61 66 74 65 72 0a 2a 2a 20 63 61 6c 6c 69 6e   after.** callin
18d0: 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20  g this routine. 
18e0: 20 53 75 63 68 20 70 6f 69 6e 74 65 72 73 20 6d   Such pointers m
18f0: 61 79 20 62 65 20 72 65 69 6e 69 74 69 61 6c 69  ay be reinitiali
1900: 7a 65 64 20 62 79 20 72 65 66 65 72 65 6e 63 69  zed by referenci
1910: 6e 67 0a 2a 2a 20 74 68 65 20 70 57 43 2d 3e 61  ng.** the pWC->a
1920: 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a 73 74 61  [] array..*/.sta
1930: 74 69 63 20 69 6e 74 20 77 68 65 72 65 43 6c 61  tic int whereCla
1940: 75 73 65 49 6e 73 65 72 74 28 57 68 65 72 65 43  useInsert(WhereC
1950: 6c 61 75 73 65 20 2a 70 57 43 2c 20 45 78 70 72  lause *pWC, Expr
1960: 20 2a 70 2c 20 75 31 36 20 77 74 46 6c 61 67 73   *p, u16 wtFlags
1970: 29 7b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  ){.  WhereTerm *
1980: 70 54 65 72 6d 3b 0a 20 20 69 6e 74 20 69 64 78  pTerm;.  int idx
1990: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 77 74  ;.  testcase( wt
19a0: 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52  Flags & TERM_VIR
19b0: 54 55 41 4c 20 29 3b 0a 20 20 69 66 28 20 70 57  TUAL );.  if( pW
19c0: 43 2d 3e 6e 54 65 72 6d 3e 3d 70 57 43 2d 3e 6e  C->nTerm>=pWC->n
19d0: 53 6c 6f 74 20 29 7b 0a 20 20 20 20 57 68 65 72  Slot ){.    Wher
19e0: 65 54 65 72 6d 20 2a 70 4f 6c 64 20 3d 20 70 57  eTerm *pOld = pW
19f0: 43 2d 3e 61 3b 0a 20 20 20 20 73 71 6c 69 74 65  C->a;.    sqlite
1a00: 33 20 2a 64 62 20 3d 20 70 57 43 2d 3e 70 57 49  3 *db = pWC->pWI
1a10: 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b  nfo->pParse->db;
1a20: 0a 20 20 20 20 70 57 43 2d 3e 61 20 3d 20 73 71  .    pWC->a = sq
1a30: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
1a40: 28 64 62 2c 20 73 69 7a 65 6f 66 28 70 57 43 2d  (db, sizeof(pWC-
1a50: 3e 61 5b 30 5d 29 2a 70 57 43 2d 3e 6e 53 6c 6f  >a[0])*pWC->nSlo
1a60: 74 2a 32 20 29 3b 0a 20 20 20 20 69 66 28 20 70  t*2 );.    if( p
1a70: 57 43 2d 3e 61 3d 3d 30 20 29 7b 0a 20 20 20 20  WC->a==0 ){.    
1a80: 20 20 69 66 28 20 77 74 46 6c 61 67 73 20 26 20    if( wtFlags & 
1a90: 54 45 52 4d 5f 44 59 4e 41 4d 49 43 20 29 7b 0a  TERM_DYNAMIC ){.
1aa0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1ab0: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 29  xprDelete(db, p)
1ac0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1ad0: 70 57 43 2d 3e 61 20 3d 20 70 4f 6c 64 3b 0a 20  pWC->a = pOld;. 
1ae0: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
1af0: 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28     }.    memcpy(
1b00: 70 57 43 2d 3e 61 2c 20 70 4f 6c 64 2c 20 73 69  pWC->a, pOld, si
1b10: 7a 65 6f 66 28 70 57 43 2d 3e 61 5b 30 5d 29 2a  zeof(pWC->a[0])*
1b20: 70 57 43 2d 3e 6e 54 65 72 6d 29 3b 0a 20 20 20  pWC->nTerm);.   
1b30: 20 69 66 28 20 70 4f 6c 64 21 3d 70 57 43 2d 3e   if( pOld!=pWC->
1b40: 61 53 74 61 74 69 63 20 29 7b 0a 20 20 20 20 20  aStatic ){.     
1b50: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
1b60: 62 2c 20 70 4f 6c 64 29 3b 0a 20 20 20 20 7d 0a  b, pOld);.    }.
1b70: 20 20 20 20 70 57 43 2d 3e 6e 53 6c 6f 74 20 3d      pWC->nSlot =
1b80: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
1b90: 53 69 7a 65 28 64 62 2c 20 70 57 43 2d 3e 61 29  Size(db, pWC->a)
1ba0: 2f 73 69 7a 65 6f 66 28 70 57 43 2d 3e 61 5b 30  /sizeof(pWC->a[0
1bb0: 5d 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26  ]);.    memset(&
1bc0: 70 57 43 2d 3e 61 5b 70 57 43 2d 3e 6e 54 65 72  pWC->a[pWC->nTer
1bd0: 6d 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 57  m], 0, sizeof(pW
1be0: 43 2d 3e 61 5b 30 5d 29 2a 28 70 57 43 2d 3e 6e  C->a[0])*(pWC->n
1bf0: 53 6c 6f 74 2d 70 57 43 2d 3e 6e 54 65 72 6d 29  Slot-pWC->nTerm)
1c00: 29 3b 0a 20 20 7d 0a 20 20 70 54 65 72 6d 20 3d  );.  }.  pTerm =
1c10: 20 26 70 57 43 2d 3e 61 5b 69 64 78 20 3d 20 70   &pWC->a[idx = p
1c20: 57 43 2d 3e 6e 54 65 72 6d 2b 2b 5d 3b 0a 20 20  WC->nTerm++];.  
1c30: 69 66 28 20 70 20 26 26 20 45 78 70 72 48 61 73  if( p && ExprHas
1c40: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 55  Property(p, EP_U
1c50: 6e 6c 69 6b 65 6c 79 29 20 29 7b 0a 20 20 20 20  nlikely) ){.    
1c60: 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62  pTerm->truthProb
1c70: 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
1c80: 28 70 2d 3e 69 54 61 62 6c 65 29 20 2d 20 32 37  (p->iTable) - 27
1c90: 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
1ca0: 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62  pTerm->truthProb
1cb0: 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 70 54 65 72   = 1;.  }.  pTer
1cc0: 6d 2d 3e 70 45 78 70 72 20 3d 20 73 71 6c 69 74  m->pExpr = sqlit
1cd0: 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74  e3ExprSkipCollat
1ce0: 65 28 70 29 3b 0a 20 20 70 54 65 72 6d 2d 3e 77  e(p);.  pTerm->w
1cf0: 74 46 6c 61 67 73 20 3d 20 77 74 46 6c 61 67 73  tFlags = wtFlags
1d00: 3b 0a 20 20 70 54 65 72 6d 2d 3e 70 57 43 20 3d  ;.  pTerm->pWC =
1d10: 20 70 57 43 3b 0a 20 20 70 54 65 72 6d 2d 3e 69   pWC;.  pTerm->i
1d20: 50 61 72 65 6e 74 20 3d 20 2d 31 3b 0a 20 20 72  Parent = -1;.  r
1d30: 65 74 75 72 6e 20 69 64 78 3b 0a 7d 0a 0a 2f 2a  eturn idx;.}../*
1d40: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1d50: 20 69 64 65 6e 74 69 66 69 65 73 20 73 75 62 65   identifies sube
1d60: 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68  xpressions in th
1d70: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 77  e WHERE clause w
1d80: 68 65 72 65 0a 2a 2a 20 65 61 63 68 20 73 75 62  here.** each sub
1d90: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 73 65  expression is se
1da0: 70 61 72 61 74 65 64 20 62 79 20 74 68 65 20 41  parated by the A
1db0: 4e 44 20 6f 70 65 72 61 74 6f 72 20 6f 72 20 73  ND operator or s
1dc0: 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 6f 70 65  ome other.** ope
1dd0: 72 61 74 6f 72 20 73 70 65 63 69 66 69 65 64 20  rator specified 
1de0: 69 6e 20 74 68 65 20 6f 70 20 70 61 72 61 6d 65  in the op parame
1df0: 74 65 72 2e 20 20 54 68 65 20 57 68 65 72 65 43  ter.  The WhereC
1e00: 6c 61 75 73 65 20 73 74 72 75 63 74 75 72 65 0a  lause structure.
1e10: 2a 2a 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74  ** is filled wit
1e20: 68 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 73 75  h pointers to su
1e30: 62 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 20 46  bexpressions.  F
1e40: 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a  or example:.**.*
1e50: 2a 20 20 20 20 57 48 45 52 45 20 20 61 3d 3d 27  *    WHERE  a=='
1e60: 68 65 6c 6c 6f 27 20 41 4e 44 20 63 6f 61 6c 65  hello' AND coale
1e70: 73 63 65 28 62 2c 31 31 29 3c 31 30 20 41 4e 44  sce(b,11)<10 AND
1e80: 20 28 63 2b 31 32 21 3d 64 20 4f 52 20 63 3d 3d   (c+12!=d OR c==
1e90: 32 32 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  22).**          
1ea0: 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20   \________/     
1eb0: 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  \_______________
1ec0: 2f 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f  /     \_________
1ed0: 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 20 20 20 20 20  _______/.**     
1ee0: 20 20 20 20 20 20 20 73 6c 6f 74 5b 30 5d 20 20         slot[0]  
1ef0: 20 20 20 20 20 20 20 20 20 20 73 6c 6f 74 5b 31            slot[1
1f00: 5d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ]               
1f10: 73 6c 6f 74 5b 32 5d 0a 2a 2a 0a 2a 2a 20 54 68  slot[2].**.** Th
1f20: 65 20 6f 72 69 67 69 6e 61 6c 20 57 48 45 52 45  e original WHERE
1f30: 20 63 6c 61 75 73 65 20 69 6e 20 70 45 78 70 72   clause in pExpr
1f40: 20 69 73 20 75 6e 61 6c 74 65 72 65 64 2e 20 20   is unaltered.  
1f50: 41 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  All this routine
1f60: 0a 2a 2a 20 64 6f 65 73 20 69 73 20 6d 61 6b 65  .** does is make
1f70: 20 73 6c 6f 74 5b 5d 20 65 6e 74 72 69 65 73 20   slot[] entries 
1f80: 70 6f 69 6e 74 20 74 6f 20 73 75 62 73 74 72 75  point to substru
1f90: 63 74 75 72 65 20 77 69 74 68 69 6e 20 70 45 78  cture within pEx
1fa0: 70 72 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65  pr..**.** In the
1fb0: 20 70 72 65 76 69 6f 75 73 20 73 65 6e 74 65 6e   previous senten
1fc0: 63 65 20 61 6e 64 20 69 6e 20 74 68 65 20 64 69  ce and in the di
1fd0: 61 67 72 61 6d 2c 20 22 73 6c 6f 74 5b 5d 22 20  agram, "slot[]" 
1fe0: 72 65 66 65 72 73 20 74 6f 0a 2a 2a 20 74 68 65  refers to.** the
1ff0: 20 57 68 65 72 65 43 6c 61 75 73 65 2e 61 5b 5d   WhereClause.a[]
2000: 20 61 72 72 61 79 2e 20 20 54 68 65 20 73 6c 6f   array.  The slo
2010: 74 5b 5d 20 61 72 72 61 79 20 67 72 6f 77 73 20  t[] array grows 
2020: 61 73 20 6e 65 65 64 65 64 20 74 6f 20 63 6f 6e  as needed to con
2030: 74 61 69 6e 0a 2a 2a 20 61 6c 6c 20 74 65 72 6d  tain.** all term
2040: 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  s of the WHERE c
2050: 6c 61 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  lause..*/.static
2060: 20 76 6f 69 64 20 77 68 65 72 65 53 70 6c 69 74   void whereSplit
2070: 28 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57  (WhereClause *pW
2080: 43 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  C, Expr *pExpr, 
2090: 75 38 20 6f 70 29 7b 0a 20 20 70 57 43 2d 3e 6f  u8 op){.  pWC->o
20a0: 70 20 3d 20 6f 70 3b 0a 20 20 69 66 28 20 70 45  p = op;.  if( pE
20b0: 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  xpr==0 ) return;
20c0: 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  .  if( pExpr->op
20d0: 21 3d 6f 70 20 29 7b 0a 20 20 20 20 77 68 65 72  !=op ){.    wher
20e0: 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57  eClauseInsert(pW
20f0: 43 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20  C, pExpr, 0);.  
2100: 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 65 72 65  }else{.    where
2110: 53 70 6c 69 74 28 70 57 43 2c 20 70 45 78 70 72  Split(pWC, pExpr
2120: 2d 3e 70 4c 65 66 74 2c 20 6f 70 29 3b 0a 20 20  ->pLeft, op);.  
2130: 20 20 77 68 65 72 65 53 70 6c 69 74 28 70 57 43    whereSplit(pWC
2140: 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
2150: 20 6f 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   op);.  }.}../*.
2160: 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 20  ** Initialize a 
2170: 57 68 65 72 65 4d 61 73 6b 53 65 74 20 6f 62 6a  WhereMaskSet obj
2180: 65 63 74 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 69  ect.*/.#define i
2190: 6e 69 74 4d 61 73 6b 53 65 74 28 50 29 20 20 28  nitMaskSet(P)  (
21a0: 50 29 2d 3e 6e 3d 30 0a 0a 2f 2a 0a 2a 2a 20 52  P)->n=0../*.** R
21b0: 65 74 75 72 6e 20 74 68 65 20 62 69 74 6d 61 73  eturn the bitmas
21c0: 6b 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20  k for the given 
21d0: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 2e 20 20  cursor number.  
21e0: 52 65 74 75 72 6e 20 30 20 69 66 0a 2a 2a 20 69  Return 0 if.** i
21f0: 43 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 69 6e  Cursor is not in
2200: 20 74 68 65 20 73 65 74 2e 0a 2a 2f 0a 73 74 61   the set..*/.sta
2210: 74 69 63 20 42 69 74 6d 61 73 6b 20 67 65 74 4d  tic Bitmask getM
2220: 61 73 6b 28 57 68 65 72 65 4d 61 73 6b 53 65 74  ask(WhereMaskSet
2230: 20 2a 70 4d 61 73 6b 53 65 74 2c 20 69 6e 74 20   *pMaskSet, int 
2240: 69 43 75 72 73 6f 72 29 7b 0a 20 20 69 6e 74 20  iCursor){.  int 
2250: 69 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4d 61  i;.  assert( pMa
2260: 73 6b 53 65 74 2d 3e 6e 3c 3d 28 69 6e 74 29 73  skSet->n<=(int)s
2270: 69 7a 65 6f 66 28 42 69 74 6d 61 73 6b 29 2a 38  izeof(Bitmask)*8
2280: 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   );.  for(i=0; i
2290: 3c 70 4d 61 73 6b 53 65 74 2d 3e 6e 3b 20 69 2b  <pMaskSet->n; i+
22a0: 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 4d 61 73  +){.    if( pMas
22b0: 6b 53 65 74 2d 3e 69 78 5b 69 5d 3d 3d 69 43 75  kSet->ix[i]==iCu
22c0: 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 72 65  rsor ){.      re
22d0: 74 75 72 6e 20 4d 41 53 4b 42 49 54 28 69 29 3b  turn MASKBIT(i);
22e0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
22f0: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
2300: 43 72 65 61 74 65 20 61 20 6e 65 77 20 6d 61 73  Create a new mas
2310: 6b 20 66 6f 72 20 63 75 72 73 6f 72 20 69 43 75  k for cursor iCu
2320: 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72  rsor..**.** Ther
2330: 65 20 69 73 20 6f 6e 65 20 63 75 72 73 6f 72 20  e is one cursor 
2340: 70 65 72 20 74 61 62 6c 65 20 69 6e 20 74 68 65  per table in the
2350: 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 54   FROM clause.  T
2360: 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  he number of.** 
2370: 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52  tables in the FR
2380: 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 6c 69 6d  OM clause is lim
2390: 69 74 65 64 20 62 79 20 61 20 74 65 73 74 20 65  ited by a test e
23a0: 61 72 6c 79 20 69 6e 20 74 68 65 0a 2a 2a 20 73  arly in the.** s
23b0: 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
23c0: 28 29 20 72 6f 75 74 69 6e 65 2e 20 20 53 6f 20  () routine.  So 
23d0: 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65  we know that the
23e0: 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 5d 0a   pMaskSet->ix[].
23f0: 2a 2a 20 61 72 72 61 79 20 77 69 6c 6c 20 6e 65  ** array will ne
2400: 76 65 72 20 6f 76 65 72 66 6c 6f 77 2e 0a 2a 2f  ver overflow..*/
2410: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 72 65  .static void cre
2420: 61 74 65 4d 61 73 6b 28 57 68 65 72 65 4d 61 73  ateMask(WhereMas
2430: 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20  kSet *pMaskSet, 
2440: 69 6e 74 20 69 43 75 72 73 6f 72 29 7b 0a 20 20  int iCursor){.  
2450: 61 73 73 65 72 74 28 20 70 4d 61 73 6b 53 65 74  assert( pMaskSet
2460: 2d 3e 6e 20 3c 20 41 72 72 61 79 53 69 7a 65 28  ->n < ArraySize(
2470: 70 4d 61 73 6b 53 65 74 2d 3e 69 78 29 20 29 3b  pMaskSet->ix) );
2480: 0a 20 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b  .  pMaskSet->ix[
2490: 70 4d 61 73 6b 53 65 74 2d 3e 6e 2b 2b 5d 20 3d  pMaskSet->n++] =
24a0: 20 69 43 75 72 73 6f 72 3b 0a 7d 0a 0a 2f 2a 0a   iCursor;.}../*.
24b0: 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65  ** These routine
24c0: 73 20 77 61 6c 6b 20 28 72 65 63 75 72 73 69 76  s walk (recursiv
24d0: 65 6c 79 29 20 61 6e 20 65 78 70 72 65 73 73 69  ely) an expressi
24e0: 6f 6e 20 74 72 65 65 20 61 6e 64 20 67 65 6e 65  on tree and gene
24f0: 72 61 74 65 0a 2a 2a 20 61 20 62 69 74 6d 61 73  rate.** a bitmas
2500: 6b 20 69 6e 64 69 63 61 74 69 6e 67 20 77 68 69  k indicating whi
2510: 63 68 20 74 61 62 6c 65 73 20 61 72 65 20 75 73  ch tables are us
2520: 65 64 20 69 6e 20 74 68 61 74 20 65 78 70 72 65  ed in that expre
2530: 73 73 69 6f 6e 0a 2a 2a 20 74 72 65 65 2e 0a 2a  ssion.** tree..*
2540: 2f 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b  /.static Bitmask
2550: 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73   exprListTableUs
2560: 61 67 65 28 57 68 65 72 65 4d 61 73 6b 53 65 74  age(WhereMaskSet
2570: 2a 2c 20 45 78 70 72 4c 69 73 74 2a 29 3b 0a 73  *, ExprList*);.s
2580: 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20 65 78  tatic Bitmask ex
2590: 70 72 53 65 6c 65 63 74 54 61 62 6c 65 55 73 61  prSelectTableUsa
25a0: 67 65 28 57 68 65 72 65 4d 61 73 6b 53 65 74 2a  ge(WhereMaskSet*
25b0: 2c 20 53 65 6c 65 63 74 2a 29 3b 0a 73 74 61 74  , Select*);.stat
25c0: 69 63 20 42 69 74 6d 61 73 6b 20 65 78 70 72 54  ic Bitmask exprT
25d0: 61 62 6c 65 55 73 61 67 65 28 57 68 65 72 65 4d  ableUsage(WhereM
25e0: 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74  askSet *pMaskSet
25f0: 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 42 69  , Expr *p){.  Bi
2600: 74 6d 61 73 6b 20 6d 61 73 6b 20 3d 20 30 3b 0a  tmask mask = 0;.
2610: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
2620: 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e  urn 0;.  if( p->
2630: 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b  op==TK_COLUMN ){
2640: 0a 20 20 20 20 6d 61 73 6b 20 3d 20 67 65 74 4d  .    mask = getM
2650: 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d  ask(pMaskSet, p-
2660: 3e 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 72 65  >iTable);.    re
2670: 74 75 72 6e 20 6d 61 73 6b 3b 0a 20 20 7d 0a 20  turn mask;.  }. 
2680: 20 6d 61 73 6b 20 3d 20 65 78 70 72 54 61 62 6c   mask = exprTabl
2690: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
26a0: 20 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 6d   p->pRight);.  m
26b0: 61 73 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c 65  ask |= exprTable
26c0: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
26d0: 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66 28  p->pLeft);.  if(
26e0: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
26f0: 28 70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  (p, EP_xIsSelect
2700: 29 20 29 7b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d  ) ){.    mask |=
2710: 20 65 78 70 72 53 65 6c 65 63 74 54 61 62 6c 65   exprSelectTable
2720: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
2730: 70 2d 3e 78 2e 70 53 65 6c 65 63 74 29 3b 0a 20  p->x.pSelect);. 
2740: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 61 73 6b   }else{.    mask
2750: 20 7c 3d 20 65 78 70 72 4c 69 73 74 54 61 62 6c   |= exprListTabl
2760: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
2770: 20 70 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20   p->x.pList);.  
2780: 7d 0a 20 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b  }.  return mask;
2790: 0a 7d 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73  .}.static Bitmas
27a0: 6b 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55  k exprListTableU
27b0: 73 61 67 65 28 57 68 65 72 65 4d 61 73 6b 53 65  sage(WhereMaskSe
27c0: 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 45 78 70  t *pMaskSet, Exp
27d0: 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20  rList *pList){. 
27e0: 20 69 6e 74 20 69 3b 0a 20 20 42 69 74 6d 61 73   int i;.  Bitmas
27f0: 6b 20 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 69 66  k mask = 0;.  if
2800: 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 66  ( pList ){.    f
2810: 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  or(i=0; i<pList-
2820: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
2830: 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72      mask |= expr
2840: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
2850: 53 65 74 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d  Set, pList->a[i]
2860: 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20  .pExpr);.    }. 
2870: 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d 61 73 6b   }.  return mask
2880: 3b 0a 7d 0a 73 74 61 74 69 63 20 42 69 74 6d 61  ;.}.static Bitma
2890: 73 6b 20 65 78 70 72 53 65 6c 65 63 74 54 61 62  sk exprSelectTab
28a0: 6c 65 55 73 61 67 65 28 57 68 65 72 65 4d 61 73  leUsage(WhereMas
28b0: 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20  kSet *pMaskSet, 
28c0: 53 65 6c 65 63 74 20 2a 70 53 29 7b 0a 20 20 42  Select *pS){.  B
28d0: 69 74 6d 61 73 6b 20 6d 61 73 6b 20 3d 20 30 3b  itmask mask = 0;
28e0: 0a 20 20 77 68 69 6c 65 28 20 70 53 20 29 7b 0a  .  while( pS ){.
28f0: 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72      SrcList *pSr
2900: 63 20 3d 20 70 53 2d 3e 70 53 72 63 3b 0a 20 20  c = pS->pSrc;.  
2910: 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69    mask |= exprLi
2920: 73 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  stTableUsage(pMa
2930: 73 6b 53 65 74 2c 20 70 53 2d 3e 70 45 4c 69 73  skSet, pS->pELis
2940: 74 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20  t);.    mask |= 
2950: 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61  exprListTableUsa
2960: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d  ge(pMaskSet, pS-
2970: 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20  >pGroupBy);.    
2980: 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69 73 74  mask |= exprList
2990: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
29a0: 53 65 74 2c 20 70 53 2d 3e 70 4f 72 64 65 72 42  Set, pS->pOrderB
29b0: 79 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20  y);.    mask |= 
29c0: 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70  exprTableUsage(p
29d0: 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70 57 68  MaskSet, pS->pWh
29e0: 65 72 65 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c  ere);.    mask |
29f0: 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65  = exprTableUsage
2a00: 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70  (pMaskSet, pS->p
2a10: 48 61 76 69 6e 67 29 3b 0a 20 20 20 20 69 66 28  Having);.    if(
2a20: 20 41 4c 57 41 59 53 28 70 53 72 63 21 3d 30 29   ALWAYS(pSrc!=0)
2a30: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   ){.      int i;
2a40: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
2a50: 69 3c 70 53 72 63 2d 3e 6e 53 72 63 3b 20 69 2b  i<pSrc->nSrc; i+
2a60: 2b 29 7b 0a 20 20 20 20 20 20 20 20 6d 61 73 6b  +){.        mask
2a70: 20 7c 3d 20 65 78 70 72 53 65 6c 65 63 74 54 61   |= exprSelectTa
2a80: 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65  bleUsage(pMaskSe
2a90: 74 2c 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 53  t, pSrc->a[i].pS
2aa0: 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20  elect);.        
2ab0: 6d 61 73 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c  mask |= exprTabl
2ac0: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
2ad0: 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 4f 6e 29   pSrc->a[i].pOn)
2ae0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2af0: 20 20 20 20 70 53 20 3d 20 70 53 2d 3e 70 50 72      pS = pS->pPr
2b00: 69 6f 72 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ior;.  }.  retur
2b10: 6e 20 6d 61 73 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n mask;.}../*.**
2b20: 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
2b30: 74 68 65 20 67 69 76 65 6e 20 6f 70 65 72 61 74  the given operat
2b40: 6f 72 20 69 73 20 6f 6e 65 20 6f 66 20 74 68 65  or is one of the
2b50: 20 6f 70 65 72 61 74 6f 72 73 20 74 68 61 74 20   operators that 
2b60: 69 73 0a 2a 2a 20 61 6c 6c 6f 77 65 64 20 66 6f  is.** allowed fo
2b70: 72 20 61 6e 20 69 6e 64 65 78 61 62 6c 65 20 57  r an indexable W
2b80: 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d  HERE clause term
2b90: 2e 20 20 54 68 65 20 61 6c 6c 6f 77 65 64 20 6f  .  The allowed o
2ba0: 70 65 72 61 74 6f 72 73 20 61 72 65 0a 2a 2a 20  perators are.** 
2bb0: 22 3d 22 2c 20 22 3c 22 2c 20 22 3e 22 2c 20 22  "=", "<", ">", "
2bc0: 3c 3d 22 2c 20 22 3e 3d 22 2c 20 22 49 4e 22 2c  <=", ">=", "IN",
2bd0: 20 61 6e 64 20 22 49 53 20 4e 55 4c 4c 22 0a 2a   and "IS NULL".*
2be0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c  /.static int all
2bf0: 6f 77 65 64 4f 70 28 69 6e 74 20 6f 70 29 7b 0a  owedOp(int op){.
2c00: 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 54 3e    assert( TK_GT>
2c10: 54 4b 5f 45 51 20 26 26 20 54 4b 5f 47 54 3c 54  TK_EQ && TK_GT<T
2c20: 4b 5f 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74  K_GE );.  assert
2c30: 28 20 54 4b 5f 4c 54 3e 54 4b 5f 45 51 20 26 26  ( TK_LT>TK_EQ &&
2c40: 20 54 4b 5f 4c 54 3c 54 4b 5f 47 45 20 29 3b 0a   TK_LT<TK_GE );.
2c50: 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 45 3e    assert( TK_LE>
2c60: 54 4b 5f 45 51 20 26 26 20 54 4b 5f 4c 45 3c 54  TK_EQ && TK_LE<T
2c70: 4b 5f 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74  K_GE );.  assert
2c80: 28 20 54 4b 5f 47 45 3d 3d 54 4b 5f 45 51 2b 34  ( TK_GE==TK_EQ+4
2c90: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 6f 70 3d   );.  return op=
2ca0: 3d 54 4b 5f 49 4e 20 7c 7c 20 28 6f 70 3e 3d 54  =TK_IN || (op>=T
2cb0: 4b 5f 45 51 20 26 26 20 6f 70 3c 3d 54 4b 5f 47  K_EQ && op<=TK_G
2cc0: 45 29 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 53 4e  E) || op==TK_ISN
2cd0: 55 4c 4c 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 53  ULL || op==TK_IS
2ce0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 75  ;.}../*.** Commu
2cf0: 74 65 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20  te a comparison 
2d00: 6f 70 65 72 61 74 6f 72 2e 20 20 45 78 70 72 65  operator.  Expre
2d10: 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 66 6f  ssions of the fo
2d20: 72 6d 20 22 58 20 6f 70 20 59 22 0a 2a 2a 20 61  rm "X op Y".** a
2d30: 72 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74  re converted int
2d40: 6f 20 22 59 20 6f 70 20 58 22 2e 0a 2a 2a 0a 2a  o "Y op X"..**.*
2d50: 2a 20 49 66 20 6c 65 66 74 2f 72 69 67 68 74 20  * If left/right 
2d60: 70 72 65 63 65 64 65 6e 63 65 20 72 75 6c 65 73  precedence rules
2d70: 20 63 6f 6d 65 20 69 6e 74 6f 20 70 6c 61 79 20   come into play 
2d80: 77 68 65 6e 20 64 65 74 65 72 6d 69 6e 69 6e 67  when determining
2d90: 20 74 68 65 0a 2a 2a 20 63 6f 6c 6c 61 74 69 6e   the.** collatin
2da0: 67 20 73 65 71 75 65 6e 63 65 2c 20 74 68 65 6e  g sequence, then
2db0: 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f   COLLATE operato
2dc0: 72 73 20 61 72 65 20 61 64 6a 75 73 74 65 64 20  rs are adjusted 
2dd0: 74 6f 20 65 6e 73 75 72 65 0a 2a 2a 20 74 68 61  to ensure.** tha
2de0: 74 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20  t the collating 
2df0: 73 65 71 75 65 6e 63 65 20 64 6f 65 73 20 6e 6f  sequence does no
2e00: 74 20 63 68 61 6e 67 65 2e 20 20 46 6f 72 20 65  t change.  For e
2e10: 78 61 6d 70 6c 65 3a 0a 2a 2a 20 22 59 20 63 6f  xample:.** "Y co
2e20: 6c 6c 61 74 65 20 4e 4f 43 41 53 45 20 6f 70 20  llate NOCASE op 
2e30: 58 22 20 62 65 63 6f 6d 65 73 20 22 58 20 6f 70  X" becomes "X op
2e40: 20 59 22 20 62 65 63 61 75 73 65 20 61 6e 79 20   Y" because any 
2e50: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
2e60: 63 65 20 6f 6e 0a 2a 2a 20 74 68 65 20 6c 65 66  ce on.** the lef
2e70: 74 20 68 61 6e 64 20 73 69 64 65 20 6f 66 20 61  t hand side of a
2e80: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 76 65 72   comparison over
2e90: 72 69 64 65 73 20 61 6e 79 20 63 6f 6c 6c 61 74  rides any collat
2ea0: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 0a 2a 2a  ion sequence .**
2eb0: 20 61 74 74 61 63 68 65 64 20 74 6f 20 74 68 65   attached to the
2ec0: 20 72 69 67 68 74 2e 20 46 6f 72 20 74 68 65 20   right. For the 
2ed0: 73 61 6d 65 20 72 65 61 73 6f 6e 20 74 68 65 20  same reason the 
2ee0: 45 50 5f 43 6f 6c 6c 61 74 65 20 66 6c 61 67 0a  EP_Collate flag.
2ef0: 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6d 6d 75 74  ** is not commut
2f00: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
2f10: 69 64 20 65 78 70 72 43 6f 6d 6d 75 74 65 28 50  id exprCommute(P
2f20: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
2f30: 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 75 31  pr *pExpr){.  u1
2f40: 36 20 65 78 70 52 69 67 68 74 20 3d 20 28 70 45  6 expRight = (pE
2f50: 78 70 72 2d 3e 70 52 69 67 68 74 2d 3e 66 6c 61  xpr->pRight->fla
2f60: 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 29  gs & EP_Collate)
2f70: 3b 0a 20 20 75 31 36 20 65 78 70 4c 65 66 74 20  ;.  u16 expLeft 
2f80: 3d 20 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d  = (pExpr->pLeft-
2f90: 3e 66 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c  >flags & EP_Coll
2fa0: 61 74 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ate);.  assert( 
2fb0: 61 6c 6c 6f 77 65 64 4f 70 28 70 45 78 70 72 2d  allowedOp(pExpr-
2fc0: 3e 6f 70 29 20 26 26 20 70 45 78 70 72 2d 3e 6f  >op) && pExpr->o
2fd0: 70 21 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20 69 66  p!=TK_IN );.  if
2fe0: 28 20 65 78 70 52 69 67 68 74 3d 3d 65 78 70 4c  ( expRight==expL
2ff0: 65 66 74 20 29 7b 0a 20 20 20 20 2f 2a 20 45 69  eft ){.    /* Ei
3000: 74 68 65 72 20 58 20 61 6e 64 20 59 20 62 6f 74  ther X and Y bot
3010: 68 20 68 61 76 65 20 43 4f 4c 4c 41 54 45 20 6f  h have COLLATE o
3020: 70 65 72 61 74 6f 72 20 6f 72 20 6e 65 69 74 68  perator or neith
3030: 65 72 20 64 6f 20 2a 2f 0a 20 20 20 20 69 66 28  er do */.    if(
3040: 20 65 78 70 52 69 67 68 74 20 29 7b 0a 20 20 20   expRight ){.   
3050: 20 20 20 2f 2a 20 42 6f 74 68 20 58 20 61 6e 64     /* Both X and
3060: 20 59 20 68 61 76 65 20 43 4f 4c 4c 41 54 45 20   Y have COLLATE 
3070: 6f 70 65 72 61 74 6f 72 73 2e 20 20 4d 61 6b 65  operators.  Make
3080: 20 73 75 72 65 20 58 20 69 73 20 61 6c 77 61 79   sure X is alway
3090: 73 0a 20 20 20 20 20 20 2a 2a 20 75 73 65 64 20  s.      ** used 
30a0: 62 79 20 63 6c 65 61 72 69 6e 67 20 74 68 65 20  by clearing the 
30b0: 45 50 5f 43 6f 6c 6c 61 74 65 20 66 6c 61 67 20  EP_Collate flag 
30c0: 66 72 6f 6d 20 59 2e 20 2a 2f 0a 20 20 20 20 20  from Y. */.     
30d0: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2d 3e   pExpr->pRight->
30e0: 66 6c 61 67 73 20 26 3d 20 7e 45 50 5f 43 6f 6c  flags &= ~EP_Col
30f0: 6c 61 74 65 3b 0a 20 20 20 20 7d 65 6c 73 65 20  late;.    }else 
3100: 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43  if( sqlite3ExprC
3110: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
3120: 45 78 70 72 2d 3e 70 4c 65 66 74 29 21 3d 30 20  Expr->pLeft)!=0 
3130: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 65 69 74  ){.      /* Neit
3140: 68 65 72 20 58 20 6e 6f 72 20 59 20 68 61 76 65  her X nor Y have
3150: 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f   COLLATE operato
3160: 72 73 2c 20 62 75 74 20 58 20 68 61 73 20 61 20  rs, but X has a 
3170: 6e 6f 6e 2d 64 65 66 61 75 6c 74 0a 20 20 20 20  non-default.    
3180: 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6e 67 20 73    ** collating s
3190: 65 71 75 65 6e 63 65 2e 20 20 53 6f 20 61 64 64  equence.  So add
31a0: 20 74 68 65 20 45 50 5f 43 6f 6c 6c 61 74 65 20   the EP_Collate 
31b0: 6d 61 72 6b 65 72 20 6f 6e 20 58 20 74 6f 20 63  marker on X to c
31c0: 61 75 73 65 0a 20 20 20 20 20 20 2a 2a 20 69 74  ause.      ** it
31d0: 20 74 6f 20 62 65 20 73 65 61 72 63 68 65 64 20   to be searched 
31e0: 66 69 72 73 74 2e 20 2a 2f 0a 20 20 20 20 20 20  first. */.      
31f0: 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 66 6c  pExpr->pLeft->fl
3200: 61 67 73 20 7c 3d 20 45 50 5f 43 6f 6c 6c 61 74  ags |= EP_Collat
3210: 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 53  e;.    }.  }.  S
3220: 57 41 50 28 45 78 70 72 2a 2c 70 45 78 70 72 2d  WAP(Expr*,pExpr-
3230: 3e 70 52 69 67 68 74 2c 70 45 78 70 72 2d 3e 70  >pRight,pExpr->p
3240: 4c 65 66 74 29 3b 0a 20 20 69 66 28 20 70 45 78  Left);.  if( pEx
3250: 70 72 2d 3e 6f 70 3e 3d 54 4b 5f 47 54 20 29 7b  pr->op>=TK_GT ){
3260: 0a 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f  .    assert( TK_
3270: 4c 54 3d 3d 54 4b 5f 47 54 2b 32 20 29 3b 0a 20  LT==TK_GT+2 );. 
3280: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 45     assert( TK_GE
3290: 3d 3d 54 4b 5f 4c 45 2b 32 20 29 3b 0a 20 20 20  ==TK_LE+2 );.   
32a0: 20 61 73 73 65 72 74 28 20 54 4b 5f 47 54 3e 54   assert( TK_GT>T
32b0: 4b 5f 45 51 20 29 3b 0a 20 20 20 20 61 73 73 65  K_EQ );.    asse
32c0: 72 74 28 20 54 4b 5f 47 54 3c 54 4b 5f 4c 45 20  rt( TK_GT<TK_LE 
32d0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
32e0: 45 78 70 72 2d 3e 6f 70 3e 3d 54 4b 5f 47 54 20  Expr->op>=TK_GT 
32f0: 26 26 20 70 45 78 70 72 2d 3e 6f 70 3c 3d 54 4b  && pExpr->op<=TK
3300: 5f 47 45 20 29 3b 0a 20 20 20 20 70 45 78 70 72  _GE );.    pExpr
3310: 2d 3e 6f 70 20 3d 20 28 28 70 45 78 70 72 2d 3e  ->op = ((pExpr->
3320: 6f 70 2d 54 4b 5f 47 54 29 5e 32 29 2b 54 4b 5f  op-TK_GT)^2)+TK_
3330: 47 54 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  GT;.  }.}../*.**
3340: 20 54 72 61 6e 73 6c 61 74 65 20 66 72 6f 6d 20   Translate from 
3350: 54 4b 5f 78 78 20 6f 70 65 72 61 74 6f 72 20 74  TK_xx operator t
3360: 6f 20 57 4f 5f 78 78 20 62 69 74 6d 61 73 6b 2e  o WO_xx bitmask.
3370: 0a 2a 2f 0a 73 74 61 74 69 63 20 75 31 36 20 6f  .*/.static u16 o
3380: 70 65 72 61 74 6f 72 4d 61 73 6b 28 69 6e 74 20  peratorMask(int 
3390: 6f 70 29 7b 0a 20 20 75 31 36 20 63 3b 0a 20 20  op){.  u16 c;.  
33a0: 61 73 73 65 72 74 28 20 61 6c 6c 6f 77 65 64 4f  assert( allowedO
33b0: 70 28 6f 70 29 20 29 3b 0a 20 20 69 66 28 20 6f  p(op) );.  if( o
33c0: 70 3d 3d 54 4b 5f 49 4e 20 29 7b 0a 20 20 20 20  p==TK_IN ){.    
33d0: 63 20 3d 20 57 4f 5f 49 4e 3b 0a 20 20 7d 65 6c  c = WO_IN;.  }el
33e0: 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 53  se if( op==TK_IS
33f0: 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 63 20 3d 20  NULL ){.    c = 
3400: 57 4f 5f 49 53 4e 55 4c 4c 3b 0a 20 20 7d 65 6c  WO_ISNULL;.  }el
3410: 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 53  se if( op==TK_IS
3420: 20 29 7b 0a 20 20 20 20 63 20 3d 20 57 4f 5f 49   ){.    c = WO_I
3430: 53 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  S;.  }else{.    
3440: 61 73 73 65 72 74 28 20 28 57 4f 5f 45 51 3c 3c  assert( (WO_EQ<<
3450: 28 6f 70 2d 54 4b 5f 45 51 29 29 20 3c 20 30 78  (op-TK_EQ)) < 0x
3460: 37 66 66 66 20 29 3b 0a 20 20 20 20 63 20 3d 20  7fff );.    c = 
3470: 28 75 31 36 29 28 57 4f 5f 45 51 3c 3c 28 6f 70  (u16)(WO_EQ<<(op
3480: 2d 54 4b 5f 45 51 29 29 3b 0a 20 20 7d 0a 20 20  -TK_EQ));.  }.  
3490: 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 49  assert( op!=TK_I
34a0: 53 4e 55 4c 4c 20 7c 7c 20 63 3d 3d 57 4f 5f 49  SNULL || c==WO_I
34b0: 53 4e 55 4c 4c 20 29 3b 0a 20 20 61 73 73 65 72  SNULL );.  asser
34c0: 74 28 20 6f 70 21 3d 54 4b 5f 49 4e 20 7c 7c 20  t( op!=TK_IN || 
34d0: 63 3d 3d 57 4f 5f 49 4e 20 29 3b 0a 20 20 61 73  c==WO_IN );.  as
34e0: 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 45 51 20  sert( op!=TK_EQ 
34f0: 7c 7c 20 63 3d 3d 57 4f 5f 45 51 20 29 3b 0a 20  || c==WO_EQ );. 
3500: 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f   assert( op!=TK_
3510: 4c 54 20 7c 7c 20 63 3d 3d 57 4f 5f 4c 54 20 29  LT || c==WO_LT )
3520: 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d  ;.  assert( op!=
3530: 54 4b 5f 4c 45 20 7c 7c 20 63 3d 3d 57 4f 5f 4c  TK_LE || c==WO_L
3540: 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f  E );.  assert( o
3550: 70 21 3d 54 4b 5f 47 54 20 7c 7c 20 63 3d 3d 57  p!=TK_GT || c==W
3560: 4f 5f 47 54 20 29 3b 0a 20 20 61 73 73 65 72 74  O_GT );.  assert
3570: 28 20 6f 70 21 3d 54 4b 5f 47 45 20 7c 7c 20 63  ( op!=TK_GE || c
3580: 3d 3d 57 4f 5f 47 45 20 29 3b 0a 20 20 72 65 74  ==WO_GE );.  ret
3590: 75 72 6e 20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn c;.}../*.** 
35a0: 41 64 76 61 6e 63 65 20 74 6f 20 74 68 65 20 6e  Advance to the n
35b0: 65 78 74 20 57 68 65 72 65 54 65 72 6d 20 74 68  ext WhereTerm th
35c0: 61 74 20 6d 61 74 63 68 65 73 20 61 63 63 6f 72  at matches accor
35d0: 64 69 6e 67 20 74 6f 20 74 68 65 20 63 72 69 74  ding to the crit
35e0: 65 72 69 61 0a 2a 2a 20 65 73 74 61 62 6c 69 73  eria.** establis
35f0: 68 65 64 20 77 68 65 6e 20 74 68 65 20 70 53 63  hed when the pSc
3600: 61 6e 20 6f 62 6a 65 63 74 20 77 61 73 20 69 6e  an object was in
3610: 69 74 69 61 6c 69 7a 65 64 20 62 79 20 77 68 65  itialized by whe
3620: 72 65 53 63 61 6e 49 6e 69 74 28 29 2e 0a 2a 2a  reScanInit()..**
3630: 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20   Return NULL if 
3640: 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72  there are no mor
3650: 65 20 6d 61 74 63 68 69 6e 67 20 57 68 65 72 65  e matching Where
3660: 54 65 72 6d 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  Terms..*/.static
3670: 20 57 68 65 72 65 54 65 72 6d 20 2a 77 68 65 72   WhereTerm *wher
3680: 65 53 63 61 6e 4e 65 78 74 28 57 68 65 72 65 53  eScanNext(WhereS
3690: 63 61 6e 20 2a 70 53 63 61 6e 29 7b 0a 20 20 69  can *pScan){.  i
36a0: 6e 74 20 69 43 75 72 3b 20 20 20 20 20 20 20 20  nt iCur;        
36b0: 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f      /* The curso
36c0: 72 20 6f 6e 20 74 68 65 20 4c 48 53 20 6f 66 20  r on the LHS of 
36d0: 74 68 65 20 74 65 72 6d 20 2a 2f 0a 20 20 69 6e  the term */.  in
36e0: 74 20 69 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20  t iColumn;      
36f0: 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c 75 6d 6e     /* The column
3700: 20 6f 6e 20 74 68 65 20 4c 48 53 20 6f 66 20 74   on the LHS of t
3710: 68 65 20 74 65 72 6d 2e 20 20 2d 31 20 66 6f 72  he term.  -1 for
3720: 20 49 50 4b 20 2a 2f 0a 20 20 45 78 70 72 20 2a   IPK */.  Expr *
3730: 70 58 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  pX;            /
3740: 2a 20 41 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  * An expression 
3750: 62 65 69 6e 67 20 74 65 73 74 65 64 20 2a 2f 0a  being tested */.
3760: 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
3770: 57 43 3b 20 20 20 20 2f 2a 20 53 68 6f 72 74 68  WC;    /* Shorth
3780: 61 6e 64 20 66 6f 72 20 70 53 63 61 6e 2d 3e 70  and for pScan->p
3790: 57 43 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  WC */.  WhereTer
37a0: 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 2f 2a 20  m *pTerm;    /* 
37b0: 54 68 65 20 74 65 72 6d 20 62 65 69 6e 67 20 74  The term being t
37c0: 65 73 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6b  ested */.  int k
37d0: 20 3d 20 70 53 63 61 6e 2d 3e 6b 3b 20 20 20 20   = pScan->k;    
37e0: 2f 2a 20 57 68 65 72 65 20 74 6f 20 73 74 61 72  /* Where to star
37f0: 74 20 73 63 61 6e 6e 69 6e 67 20 2a 2f 0a 0a 20  t scanning */.. 
3800: 20 77 68 69 6c 65 28 20 70 53 63 61 6e 2d 3e 69   while( pScan->i
3810: 45 71 75 69 76 3c 3d 70 53 63 61 6e 2d 3e 6e 45  Equiv<=pScan->nE
3820: 71 75 69 76 20 29 7b 0a 20 20 20 20 69 43 75 72  quiv ){.    iCur
3830: 20 3d 20 70 53 63 61 6e 2d 3e 61 45 71 75 69 76   = pScan->aEquiv
3840: 5b 70 53 63 61 6e 2d 3e 69 45 71 75 69 76 2d 32  [pScan->iEquiv-2
3850: 5d 3b 0a 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d  ];.    iColumn =
3860: 20 70 53 63 61 6e 2d 3e 61 45 71 75 69 76 5b 70   pScan->aEquiv[p
3870: 53 63 61 6e 2d 3e 69 45 71 75 69 76 2d 31 5d 3b  Scan->iEquiv-1];
3880: 0a 20 20 20 20 77 68 69 6c 65 28 20 28 70 57 43  .    while( (pWC
3890: 20 3d 20 70 53 63 61 6e 2d 3e 70 57 43 29 21 3d   = pScan->pWC)!=
38a0: 30 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 70  0 ){.      for(p
38b0: 54 65 72 6d 3d 70 57 43 2d 3e 61 2b 6b 3b 20 6b  Term=pWC->a+k; k
38c0: 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 6b 2b 2b  <pWC->nTerm; k++
38d0: 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  , pTerm++){.    
38e0: 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c      if( pTerm->l
38f0: 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 0a  eftCursor==iCur.
3900: 20 20 20 20 20 20 20 20 20 26 26 20 70 54 65 72           && pTer
3910: 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3d  m->u.leftColumn=
3920: 3d 69 43 6f 6c 75 6d 6e 0a 20 20 20 20 20 20 20  =iColumn.       
3930: 20 20 26 26 20 28 70 53 63 61 6e 2d 3e 69 45 71    && (pScan->iEq
3940: 75 69 76 3c 3d 32 20 7c 7c 20 21 45 78 70 72 48  uiv<=2 || !ExprH
3950: 61 73 50 72 6f 70 65 72 74 79 28 70 54 65 72 6d  asProperty(pTerm
3960: 2d 3e 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d  ->pExpr, EP_From
3970: 4a 6f 69 6e 29 29 0a 20 20 20 20 20 20 20 20 29  Join)).        )
3980: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
3990: 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  (pTerm->eOperato
39a0: 72 20 26 20 57 4f 5f 45 51 55 49 56 29 21 3d 30  r & WO_EQUIV)!=0
39b0: 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20 70  .           && p
39c0: 53 63 61 6e 2d 3e 6e 45 71 75 69 76 3c 41 72 72  Scan->nEquiv<Arr
39d0: 61 79 53 69 7a 65 28 70 53 63 61 6e 2d 3e 61 45  aySize(pScan->aE
39e0: 71 75 69 76 29 0a 20 20 20 20 20 20 20 20 20 20  quiv).          
39f0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
3a00: 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20  nt j;.          
3a10: 20 20 70 58 20 3d 20 73 71 6c 69 74 65 33 45 78    pX = sqlite3Ex
3a20: 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 54  prSkipCollate(pT
3a30: 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67  erm->pExpr->pRig
3a40: 68 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ht);.           
3a50: 20 61 73 73 65 72 74 28 20 70 58 2d 3e 6f 70 3d   assert( pX->op=
3a60: 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20  =TK_COLUMN );.  
3a70: 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d            for(j=
3a80: 30 3b 20 6a 3c 70 53 63 61 6e 2d 3e 6e 45 71 75  0; j<pScan->nEqu
3a90: 69 76 3b 20 6a 2b 3d 32 29 7b 0a 20 20 20 20 20  iv; j+=2){.     
3aa0: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 53 63           if( pSc
3ab0: 61 6e 2d 3e 61 45 71 75 69 76 5b 6a 5d 3d 3d 70  an->aEquiv[j]==p
3ac0: 58 2d 3e 69 54 61 62 6c 65 0a 20 20 20 20 20 20  X->iTable.      
3ad0: 20 20 20 20 20 20 20 20 20 26 26 20 70 53 63 61           && pSca
3ae0: 6e 2d 3e 61 45 71 75 69 76 5b 6a 2b 31 5d 3d 3d  n->aEquiv[j+1]==
3af0: 70 58 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20  pX->iColumn ){. 
3b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3b10: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
3b20: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
3b30: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
3b40: 20 20 69 66 28 20 6a 3d 3d 70 53 63 61 6e 2d 3e    if( j==pScan->
3b50: 6e 45 71 75 69 76 20 29 7b 0a 20 20 20 20 20 20  nEquiv ){.      
3b60: 20 20 20 20 20 20 20 20 70 53 63 61 6e 2d 3e 61          pScan->a
3b70: 45 71 75 69 76 5b 6a 5d 20 3d 20 70 58 2d 3e 69  Equiv[j] = pX->i
3b80: 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 20  Table;.         
3b90: 20 20 20 20 20 70 53 63 61 6e 2d 3e 61 45 71 75       pScan->aEqu
3ba0: 69 76 5b 6a 2b 31 5d 20 3d 20 70 58 2d 3e 69 43  iv[j+1] = pX->iC
3bb0: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 20  olumn;.         
3bc0: 20 20 20 20 20 70 53 63 61 6e 2d 3e 6e 45 71 75       pScan->nEqu
3bd0: 69 76 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 20  iv += 2;.       
3be0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
3bf0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
3c00: 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74   (pTerm->eOperat
3c10: 6f 72 20 26 20 70 53 63 61 6e 2d 3e 6f 70 4d 61  or & pScan->opMa
3c20: 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  sk)!=0 ){.      
3c30: 20 20 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20        /* Verify 
3c40: 74 68 65 20 61 66 66 69 6e 69 74 79 20 61 6e 64  the affinity and
3c50: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
3c60: 6e 63 65 20 6d 61 74 63 68 20 2a 2f 0a 20 20 20  nce match */.   
3c70: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 53 63           if( pSc
3c80: 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65 20 26 26  an->zCollName &&
3c90: 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74   (pTerm->eOperat
3ca0: 6f 72 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 29 3d  or & WO_ISNULL)=
3cb0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
3cc0: 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
3cd0: 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ll;.            
3ce0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20    Parse *pParse 
3cf0: 3d 20 70 57 43 2d 3e 70 57 49 6e 66 6f 2d 3e 70  = pWC->pWInfo->p
3d00: 50 61 72 73 65 3b 0a 20 20 20 20 20 20 20 20 20  Parse;.         
3d10: 20 20 20 20 20 70 58 20 3d 20 70 54 65 72 6d 2d       pX = pTerm-
3d20: 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  >pExpr;.        
3d30: 20 20 20 20 20 20 69 66 28 20 21 73 71 6c 69 74        if( !sqlit
3d40: 65 33 49 6e 64 65 78 41 66 66 69 6e 69 74 79 4f  e3IndexAffinityO
3d50: 6b 28 70 58 2c 20 70 53 63 61 6e 2d 3e 69 64 78  k(pX, pScan->idx
3d60: 61 66 66 29 20 29 7b 0a 20 20 20 20 20 20 20 20  aff) ){.        
3d70: 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
3d80: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
3d90: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
3da0: 61 73 73 65 72 74 28 70 58 2d 3e 70 4c 65 66 74  assert(pX->pLeft
3db0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
3dc0: 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
3dd0: 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c  BinaryCompareCol
3de0: 6c 53 65 71 28 70 50 61 72 73 65 2c 0a 20 20 20  lSeq(pParse,.   
3df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
3e20: 58 2d 3e 70 4c 65 66 74 2c 20 70 58 2d 3e 70 52  X->pLeft, pX->pR
3e30: 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20 20  ight);.         
3e40: 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 3d 3d       if( pColl==
3e50: 30 20 29 20 70 43 6f 6c 6c 20 3d 20 70 50 61 72  0 ) pColl = pPar
3e60: 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c  se->db->pDfltCol
3e70: 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  l;.             
3e80: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
3e90: 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  Cmp(pColl->zName
3ea0: 2c 20 70 53 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61  , pScan->zCollNa
3eb0: 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  me) ){.         
3ec0: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
3ed0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
3ee0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
3ef0: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28             if( (
3f00: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
3f10: 20 26 20 57 4f 5f 45 51 29 21 3d 30 0a 20 20 20   & WO_EQ)!=0.   
3f20: 20 20 20 20 20 20 20 20 20 20 26 26 20 28 70 58            && (pX
3f30: 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d   = pTerm->pExpr-
3f40: 3e 70 52 69 67 68 74 29 2d 3e 6f 70 3d 3d 54 4b  >pRight)->op==TK
3f50: 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20 20 20 20 20  _COLUMN.        
3f60: 20 20 20 20 20 26 26 20 70 58 2d 3e 69 54 61 62       && pX->iTab
3f70: 6c 65 3d 3d 70 53 63 61 6e 2d 3e 61 45 71 75 69  le==pScan->aEqui
3f80: 76 5b 30 5d 0a 20 20 20 20 20 20 20 20 20 20 20  v[0].           
3f90: 20 20 26 26 20 70 58 2d 3e 69 43 6f 6c 75 6d 6e    && pX->iColumn
3fa0: 3d 3d 70 53 63 61 6e 2d 3e 61 45 71 75 69 76 5b  ==pScan->aEquiv[
3fb0: 31 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 29  1].            )
3fc0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
3fd0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
3fe0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
3ff0: 20 20 20 20 70 53 63 61 6e 2d 3e 6b 20 3d 20 6b      pScan->k = k
4000: 2b 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +1;.            
4010: 72 65 74 75 72 6e 20 70 54 65 72 6d 3b 0a 20 20  return pTerm;.  
4020: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
4030: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
4040: 20 20 70 53 63 61 6e 2d 3e 70 57 43 20 3d 20 70    pScan->pWC = p
4050: 53 63 61 6e 2d 3e 70 57 43 2d 3e 70 4f 75 74 65  Scan->pWC->pOute
4060: 72 3b 0a 20 20 20 20 20 20 6b 20 3d 20 30 3b 0a  r;.      k = 0;.
4070: 20 20 20 20 7d 0a 20 20 20 20 70 53 63 61 6e 2d      }.    pScan-
4080: 3e 70 57 43 20 3d 20 70 53 63 61 6e 2d 3e 70 4f  >pWC = pScan->pO
4090: 72 69 67 57 43 3b 0a 20 20 20 20 6b 20 3d 20 30  rigWC;.    k = 0
40a0: 3b 0a 20 20 20 20 70 53 63 61 6e 2d 3e 69 45 71  ;.    pScan->iEq
40b0: 75 69 76 20 2b 3d 20 32 3b 0a 20 20 7d 0a 20 20  uiv += 2;.  }.  
40c0: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
40d0: 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 20  ** Initialize a 
40e0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 73 63 61  WHERE clause sca
40f0: 6e 6e 65 72 20 6f 62 6a 65 63 74 2e 20 20 52 65  nner object.  Re
4100: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
4110: 6f 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 6d  o the.** first m
4120: 61 74 63 68 2e 20 20 52 65 74 75 72 6e 20 4e 55  atch.  Return NU
4130: 4c 4c 20 69 66 20 74 68 65 72 65 20 61 72 65 20  LL if there are 
4140: 6e 6f 20 6d 61 74 63 68 65 73 2e 0a 2a 2a 0a 2a  no matches..**.*
4150: 2a 20 54 68 65 20 73 63 61 6e 6e 65 72 20 77 69  * The scanner wi
4160: 6c 6c 20 62 65 20 73 65 61 72 63 68 69 6e 67 20  ll be searching 
4170: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
4180: 20 70 57 43 2e 20 20 49 74 20 77 69 6c 6c 20 6c   pWC.  It will l
4190: 6f 6f 6b 0a 2a 2a 20 66 6f 72 20 74 65 72 6d 73  ook.** for terms
41a0: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 58 20   of the form "X 
41b0: 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 20 77 68 65  <op> <expr>" whe
41c0: 72 65 20 58 20 69 73 20 63 6f 6c 75 6d 6e 20 69  re X is column i
41d0: 43 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65 0a  Column of table.
41e0: 2a 2a 20 69 43 75 72 2e 20 20 54 68 65 20 3c 6f  ** iCur.  The <o
41f0: 70 3e 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f  p> must be one o
4200: 66 20 74 68 65 20 6f 70 65 72 61 74 6f 72 73 20  f the operators 
4210: 64 65 73 63 72 69 62 65 64 20 62 79 20 6f 70 4d  described by opM
4220: 61 73 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ask..**.** If th
4230: 65 20 73 65 61 72 63 68 20 69 73 20 66 6f 72 20  e search is for 
4240: 58 20 61 6e 64 20 74 68 65 20 57 48 45 52 45 20  X and the WHERE 
4250: 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20  clause contains 
4260: 74 65 72 6d 73 20 6f 66 20 74 68 65 0a 2a 2a 20  terms of the.** 
4270: 66 6f 72 6d 20 58 3d 59 20 74 68 65 6e 20 74 68  form X=Y then th
4280: 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74  is routine might
4290: 20 61 6c 73 6f 20 72 65 74 75 72 6e 20 74 65 72   also return ter
42a0: 6d 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a 2a  ms of the form.*
42b0: 2a 20 22 59 20 3c 6f 70 3e 20 3c 65 78 70 72 3e  * "Y <op> <expr>
42c0: 22 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20 6f  ".  The number o
42d0: 66 20 6c 65 76 65 6c 73 20 6f 66 20 74 72 61 6e  f levels of tran
42e0: 73 69 74 69 76 69 74 79 20 69 73 20 6c 69 6d 69  sitivity is limi
42f0: 74 65 64 2c 0a 2a 2a 20 62 75 74 20 69 73 20 65  ted,.** but is e
4300: 6e 6f 75 67 68 20 74 6f 20 68 61 6e 64 6c 65 20  nough to handle 
4310: 6d 6f 73 74 20 63 6f 6d 6d 6f 6e 6c 79 20 6f 63  most commonly oc
4320: 63 75 72 72 69 6e 67 20 53 51 4c 20 73 74 61 74  curring SQL stat
4330: 65 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  ements..**.** If
4340: 20 58 20 69 73 20 6e 6f 74 20 74 68 65 20 49 4e   X is not the IN
4350: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
4360: 59 20 74 68 65 6e 20 58 20 6d 75 73 74 20 62 65  Y then X must be
4370: 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68   compatible with
4380: 0a 2a 2a 20 69 6e 64 65 78 20 70 49 64 78 2e 0a  .** index pIdx..
4390: 2a 2f 0a 73 74 61 74 69 63 20 57 68 65 72 65 54  */.static WhereT
43a0: 65 72 6d 20 2a 77 68 65 72 65 53 63 61 6e 49 6e  erm *whereScanIn
43b0: 69 74 28 0a 20 20 57 68 65 72 65 53 63 61 6e 20  it(.  WhereScan 
43c0: 2a 70 53 63 61 6e 2c 20 20 20 20 20 20 20 2f 2a  *pScan,       /*
43d0: 20 54 68 65 20 57 68 65 72 65 53 63 61 6e 20 6f   The WhereScan o
43e0: 62 6a 65 63 74 20 62 65 69 6e 67 20 69 6e 69 74  bject being init
43f0: 69 61 6c 69 7a 65 64 20 2a 2f 0a 20 20 57 68 65  ialized */.  Whe
4400: 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20  reClause *pWC,  
4410: 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
4420: 45 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20 73  E clause to be s
4430: 63 61 6e 6e 65 64 20 2a 2f 0a 20 20 69 6e 74 20  canned */.  int 
4440: 69 43 75 72 2c 20 20 20 20 20 20 20 20 20 20 20  iCur,           
4450: 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 74 6f      /* Cursor to
4460: 20 73 63 61 6e 20 66 6f 72 20 2a 2f 0a 20 20 69   scan for */.  i
4470: 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20  nt iColumn,     
4480: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e         /* Column
4490: 20 74 6f 20 73 63 61 6e 20 66 6f 72 20 2a 2f 0a   to scan for */.
44a0: 20 20 75 33 32 20 6f 70 4d 61 73 6b 2c 20 20 20    u32 opMask,   
44b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65            /* Ope
44c0: 72 61 74 6f 72 28 73 29 20 74 6f 20 73 63 61 6e  rator(s) to scan
44d0: 20 66 6f 72 20 2a 2f 0a 20 20 49 6e 64 65 78 20   for */.  Index 
44e0: 2a 70 49 64 78 20 20 20 20 20 20 20 20 20 20 20  *pIdx           
44f0: 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 63 6f 6d    /* Must be com
4500: 70 61 74 69 62 6c 65 20 77 69 74 68 20 74 68 69  patible with thi
4510: 73 20 69 6e 64 65 78 20 2a 2f 0a 29 7b 0a 20 20  s index */.){.  
4520: 69 6e 74 20 6a 3b 0a 0a 20 20 2f 2a 20 6d 65 6d  int j;..  /* mem
4530: 73 65 74 28 70 53 63 61 6e 2c 20 30 2c 20 73 69  set(pScan, 0, si
4540: 7a 65 6f 66 28 2a 70 53 63 61 6e 29 29 3b 20 2a  zeof(*pScan)); *
4550: 2f 0a 20 20 70 53 63 61 6e 2d 3e 70 4f 72 69 67  /.  pScan->pOrig
4560: 57 43 20 3d 20 70 57 43 3b 0a 20 20 70 53 63 61  WC = pWC;.  pSca
4570: 6e 2d 3e 70 57 43 20 3d 20 70 57 43 3b 0a 20 20  n->pWC = pWC;.  
4580: 69 66 28 20 70 49 64 78 20 26 26 20 69 43 6f 6c  if( pIdx && iCol
4590: 75 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20 20 70 53  umn>=0 ){.    pS
45a0: 63 61 6e 2d 3e 69 64 78 61 66 66 20 3d 20 70 49  can->idxaff = pI
45b0: 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c  dx->pTable->aCol
45c0: 5b 69 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69  [iColumn].affini
45d0: 74 79 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ty;.    for(j=0;
45e0: 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
45f0: 6a 5d 21 3d 69 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b  j]!=iColumn; j++
4600: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 4e 45 56  ){.      if( NEV
4610: 45 52 28 6a 3e 70 49 64 78 2d 3e 6e 43 6f 6c 75  ER(j>pIdx->nColu
4620: 6d 6e 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  mn) ) return 0;.
4630: 20 20 20 20 7d 0a 20 20 20 20 70 53 63 61 6e 2d      }.    pScan-
4640: 3e 7a 43 6f 6c 6c 4e 61 6d 65 20 3d 20 70 49 64  >zCollName = pId
4650: 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20  x->azColl[j];.  
4660: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 53 63 61 6e  }else{.    pScan
4670: 2d 3e 69 64 78 61 66 66 20 3d 20 30 3b 0a 20 20  ->idxaff = 0;.  
4680: 20 20 70 53 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61    pScan->zCollNa
4690: 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 53  me = 0;.  }.  pS
46a0: 63 61 6e 2d 3e 6f 70 4d 61 73 6b 20 3d 20 6f 70  can->opMask = op
46b0: 4d 61 73 6b 3b 0a 20 20 70 53 63 61 6e 2d 3e 6b  Mask;.  pScan->k
46c0: 20 3d 20 30 3b 0a 20 20 70 53 63 61 6e 2d 3e 61   = 0;.  pScan->a
46d0: 45 71 75 69 76 5b 30 5d 20 3d 20 69 43 75 72 3b  Equiv[0] = iCur;
46e0: 0a 20 20 70 53 63 61 6e 2d 3e 61 45 71 75 69 76  .  pScan->aEquiv
46f0: 5b 31 5d 20 3d 20 69 43 6f 6c 75 6d 6e 3b 0a 20  [1] = iColumn;. 
4700: 20 70 53 63 61 6e 2d 3e 6e 45 71 75 69 76 20 3d   pScan->nEquiv =
4710: 20 32 3b 0a 20 20 70 53 63 61 6e 2d 3e 69 45 71   2;.  pScan->iEq
4720: 75 69 76 20 3d 20 32 3b 0a 20 20 72 65 74 75 72  uiv = 2;.  retur
4730: 6e 20 77 68 65 72 65 53 63 61 6e 4e 65 78 74 28  n whereScanNext(
4740: 70 53 63 61 6e 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pScan);.}../*.**
4750: 20 53 65 61 72 63 68 20 66 6f 72 20 61 20 74 65   Search for a te
4760: 72 6d 20 69 6e 20 74 68 65 20 57 48 45 52 45 20  rm in the WHERE 
4770: 63 6c 61 75 73 65 20 74 68 61 74 20 69 73 20 6f  clause that is o
4780: 66 20 74 68 65 20 66 6f 72 6d 20 22 58 20 3c 6f  f the form "X <o
4790: 70 3e 20 3c 65 78 70 72 3e 22 0a 2a 2a 20 77 68  p> <expr>".** wh
47a0: 65 72 65 20 58 20 69 73 20 61 20 72 65 66 65 72  ere X is a refer
47b0: 65 6e 63 65 20 74 6f 20 74 68 65 20 69 43 6f 6c  ence to the iCol
47c0: 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20 69 43 75  umn of table iCu
47d0: 72 20 61 6e 64 20 3c 6f 70 3e 20 69 73 20 6f 6e  r and <op> is on
47e0: 65 20 6f 66 0a 2a 2a 20 74 68 65 20 57 4f 5f 78  e of.** the WO_x
47f0: 78 20 6f 70 65 72 61 74 6f 72 20 63 6f 64 65 73  x operator codes
4800: 20 73 70 65 63 69 66 69 65 64 20 62 79 20 74 68   specified by th
4810: 65 20 6f 70 20 70 61 72 61 6d 65 74 65 72 2e 0a  e op parameter..
4820: 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
4830: 74 65 72 20 74 6f 20 74 68 65 20 74 65 72 6d 2e  ter to the term.
4840: 20 20 52 65 74 75 72 6e 20 30 20 69 66 20 6e 6f    Return 0 if no
4850: 74 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 54  t found..**.** T
4860: 68 65 20 74 65 72 6d 20 72 65 74 75 72 6e 65 64  he term returned
4870: 20 6d 69 67 68 74 20 62 79 20 59 3d 3c 65 78 70   might by Y=<exp
4880: 72 3e 20 69 66 20 74 68 65 72 65 20 69 73 20 61  r> if there is a
4890: 6e 6f 74 68 65 72 20 63 6f 6e 73 74 72 61 69 6e  nother constrain
48a0: 74 20 69 6e 0a 2a 2a 20 74 68 65 20 57 48 45 52  t in.** the WHER
48b0: 45 20 63 6c 61 75 73 65 20 74 68 61 74 20 73 70  E clause that sp
48c0: 65 63 69 66 69 65 73 20 74 68 61 74 20 58 3d 59  ecifies that X=Y
48d0: 2e 20 20 41 6e 79 20 73 75 63 68 20 63 6f 6e 73  .  Any such cons
48e0: 74 72 61 69 6e 74 73 20 77 69 6c 6c 20 62 65 0a  traints will be.
48f0: 2a 2a 20 69 64 65 6e 74 69 66 69 65 64 20 62 79  ** identified by
4900: 20 74 68 65 20 57 4f 5f 45 51 55 49 56 20 62 69   the WO_EQUIV bi
4910: 74 20 69 6e 20 74 68 65 20 70 54 65 72 6d 2d 3e  t in the pTerm->
4920: 65 4f 70 65 72 61 74 6f 72 20 66 69 65 6c 64 2e  eOperator field.
4930: 20 20 54 68 65 0a 2a 2a 20 61 45 71 75 69 76 5b    The.** aEquiv[
4940: 5d 20 61 72 72 61 79 20 68 6f 6c 64 73 20 58 20  ] array holds X 
4950: 61 6e 64 20 61 6c 6c 20 69 74 73 20 65 71 75 69  and all its equi
4960: 76 61 6c 65 6e 74 73 2c 20 77 69 74 68 20 65 61  valents, with ea
4970: 63 68 20 53 51 4c 20 76 61 72 69 61 62 6c 65 0a  ch SQL variable.
4980: 2a 2a 20 74 61 6b 69 6e 67 20 75 70 20 74 77 6f  ** taking up two
4990: 20 73 6c 6f 74 73 20 69 6e 20 61 45 71 75 69 76   slots in aEquiv
49a0: 5b 5d 2e 20 20 54 68 65 20 66 69 72 73 74 20 73  [].  The first s
49b0: 6c 6f 74 20 69 73 20 66 6f 72 20 74 68 65 20 63  lot is for the c
49c0: 75 72 73 6f 72 20 6e 75 6d 62 65 72 0a 2a 2a 20  ursor number.** 
49d0: 61 6e 64 20 74 68 65 20 73 65 63 6f 6e 64 20 69  and the second i
49e0: 73 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e  s for the column
49f0: 20 6e 75 6d 62 65 72 2e 20 20 54 68 65 72 65 20   number.  There 
4a00: 61 72 65 20 32 32 20 73 6c 6f 74 73 20 69 6e 20  are 22 slots in 
4a10: 61 45 71 75 69 76 5b 5d 0a 2a 2a 20 73 6f 20 74  aEquiv[].** so t
4a20: 68 61 74 20 6d 65 61 6e 73 20 77 65 20 63 61 6e  hat means we can
4a30: 20 6c 6f 6f 6b 20 66 6f 72 20 58 20 70 6c 75 73   look for X plus
4a40: 20 75 70 20 74 6f 20 31 30 20 6f 74 68 65 72 20   up to 10 other 
4a50: 65 71 75 69 76 61 6c 65 6e 74 20 76 61 6c 75 65  equivalent value
4a60: 73 2e 0a 2a 2a 20 48 65 6e 63 65 20 61 20 73 65  s..** Hence a se
4a70: 61 72 63 68 20 66 6f 72 20 58 20 77 69 6c 6c 20  arch for X will 
4a80: 72 65 74 75 72 6e 20 3c 65 78 70 72 3e 20 69 66  return <expr> if
4a90: 20 58 3d 41 31 20 61 6e 64 20 41 31 3d 41 32 20   X=A1 and A1=A2 
4aa0: 61 6e 64 20 41 32 3d 41 33 0a 2a 2a 20 61 6e 64  and A2=A3.** and
4ab0: 20 2e 2e 2e 20 61 6e 64 20 41 39 3d 41 31 30 20   ... and A9=A10 
4ac0: 61 6e 64 20 41 31 30 3d 3c 65 78 70 72 3e 2e 0a  and A10=<expr>..
4ad0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61  **.** If there a
4ae0: 72 65 20 6d 75 6c 74 69 70 6c 65 20 74 65 72 6d  re multiple term
4af0: 73 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63  s in the WHERE c
4b00: 6c 61 75 73 65 20 6f 66 20 74 68 65 20 66 6f 72  lause of the for
4b10: 6d 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e  m "X <op> <expr>
4b20: 22 0a 2a 2a 20 74 68 65 6e 20 74 72 79 20 66 6f  ".** then try fo
4b30: 72 20 74 68 65 20 6f 6e 65 20 77 69 74 68 20 6e  r the one with n
4b40: 6f 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20 6f  o dependencies o
4b50: 6e 20 3c 65 78 70 72 3e 20 2d 20 69 6e 20 6f 74  n <expr> - in ot
4b60: 68 65 72 20 77 6f 72 64 73 20 77 68 65 72 65 0a  her words where.
4b70: 2a 2a 20 3c 65 78 70 72 3e 20 69 73 20 61 20 63  ** <expr> is a c
4b80: 6f 6e 73 74 61 6e 74 20 65 78 70 72 65 73 73 69  onstant expressi
4b90: 6f 6e 20 6f 66 20 73 6f 6d 65 20 6b 69 6e 64 2e  on of some kind.
4ba0: 20 20 4f 6e 6c 79 20 72 65 74 75 72 6e 20 65 6e    Only return en
4bb0: 74 72 69 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20  tries of.** the 
4bc0: 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 59 22 20  form "X <op> Y" 
4bd0: 77 68 65 72 65 20 59 20 69 73 20 61 20 63 6f 6c  where Y is a col
4be0: 75 6d 6e 20 69 6e 20 61 6e 6f 74 68 65 72 20 74  umn in another t
4bf0: 61 62 6c 65 20 69 66 20 6e 6f 20 74 65 72 6d 73  able if no terms
4c00: 20 6f 66 0a 2a 2a 20 74 68 65 20 66 6f 72 6d 20   of.** the form 
4c10: 22 58 20 3c 6f 70 3e 20 3c 63 6f 6e 73 74 2d 65  "X <op> <const-e
4c20: 78 70 72 3e 22 20 65 78 69 73 74 2e 20 20 20 49  xpr>" exist.   I
4c30: 66 20 6e 6f 20 74 65 72 6d 73 20 77 69 74 68 20  f no terms with 
4c40: 61 20 63 6f 6e 73 74 61 6e 74 20 52 48 53 0a 2a  a constant RHS.*
4c50: 2a 20 65 78 69 73 74 2c 20 74 72 79 20 74 6f 20  * exist, try to 
4c60: 72 65 74 75 72 6e 20 61 20 74 65 72 6d 20 74 68  return a term th
4c70: 61 74 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  at does not use 
4c80: 57 4f 5f 45 51 55 49 56 2e 0a 2a 2f 0a 73 74 61  WO_EQUIV..*/.sta
4c90: 74 69 63 20 57 68 65 72 65 54 65 72 6d 20 2a 66  tic WhereTerm *f
4ca0: 69 6e 64 54 65 72 6d 28 0a 20 20 57 68 65 72 65  indTerm(.  Where
4cb0: 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20  Clause *pWC,    
4cc0: 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c   /* The WHERE cl
4cd0: 61 75 73 65 20 74 6f 20 62 65 20 73 65 61 72 63  ause to be searc
4ce0: 68 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75  hed */.  int iCu
4cf0: 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  r,             /
4d00: 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  * Cursor number 
4d10: 6f 66 20 4c 48 53 20 2a 2f 0a 20 20 69 6e 74 20  of LHS */.  int 
4d20: 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 20 20  iColumn,        
4d30: 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62    /* Column numb
4d40: 65 72 20 6f 66 20 4c 48 53 20 2a 2f 0a 20 20 42  er of LHS */.  B
4d50: 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c  itmask notReady,
4d60: 20 20 20 20 20 2f 2a 20 52 48 53 20 6d 75 73 74       /* RHS must
4d70: 20 6e 6f 74 20 6f 76 65 72 6c 61 70 20 77 69 74   not overlap wit
4d80: 68 20 74 68 69 73 20 6d 61 73 6b 20 2a 2f 0a 20  h this mask */. 
4d90: 20 75 33 32 20 6f 70 2c 20 20 20 20 20 20 20 20   u32 op,        
4da0: 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
4db0: 66 20 57 4f 5f 78 78 20 76 61 6c 75 65 73 20 64  f WO_xx values d
4dc0: 65 73 63 72 69 62 69 6e 67 20 6f 70 65 72 61 74  escribing operat
4dd0: 6f 72 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  or */.  Index *p
4de0: 49 64 78 20 20 20 20 20 20 20 20 20 20 20 2f 2a  Idx           /*
4df0: 20 4d 75 73 74 20 62 65 20 63 6f 6d 70 61 74 69   Must be compati
4e00: 62 6c 65 20 77 69 74 68 20 74 68 69 73 20 69 6e  ble with this in
4e10: 64 65 78 2c 20 69 66 20 6e 6f 74 20 4e 55 4c 4c  dex, if not NULL
4e20: 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 54 65   */.){.  WhereTe
4e30: 72 6d 20 2a 70 52 65 73 75 6c 74 20 3d 20 30 3b  rm *pResult = 0;
4e40: 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 3b  .  WhereTerm *p;
4e50: 0a 20 20 57 68 65 72 65 53 63 61 6e 20 73 63 61  .  WhereScan sca
4e60: 6e 3b 0a 0a 20 20 70 20 3d 20 77 68 65 72 65 53  n;..  p = whereS
4e70: 63 61 6e 49 6e 69 74 28 26 73 63 61 6e 2c 20 70  canInit(&scan, p
4e80: 57 43 2c 20 69 43 75 72 2c 20 69 43 6f 6c 75 6d  WC, iCur, iColum
4e90: 6e 2c 20 6f 70 2c 20 70 49 64 78 29 3b 0a 20 20  n, op, pIdx);.  
4ea0: 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20  while( p ){.    
4eb0: 69 66 28 20 28 70 2d 3e 70 72 65 72 65 71 52 69  if( (p->prereqRi
4ec0: 67 68 74 20 26 20 6e 6f 74 52 65 61 64 79 29 3d  ght & notReady)=
4ed0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
4ee0: 70 2d 3e 70 72 65 72 65 71 52 69 67 68 74 3d 3d  p->prereqRight==
4ef0: 30 20 26 26 20 28 70 2d 3e 65 4f 70 65 72 61 74  0 && (p->eOperat
4f00: 6f 72 26 57 4f 5f 45 51 29 21 3d 30 20 29 7b 0a  or&WO_EQ)!=0 ){.
4f10: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70          return p
4f20: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
4f30: 69 66 28 20 70 52 65 73 75 6c 74 3d 3d 30 20 29  if( pResult==0 )
4f40: 20 70 52 65 73 75 6c 74 20 3d 20 70 3b 0a 20 20   pResult = p;.  
4f50: 20 20 7d 0a 20 20 20 20 70 20 3d 20 77 68 65 72    }.    p = wher
4f60: 65 53 63 61 6e 4e 65 78 74 28 26 73 63 61 6e 29  eScanNext(&scan)
4f70: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
4f80: 52 65 73 75 6c 74 3b 0a 7d 0a 0a 2f 2a 20 46 6f  Result;.}../* Fo
4f90: 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20  rward reference 
4fa0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
4fb0: 78 70 72 41 6e 61 6c 79 7a 65 28 53 72 63 4c 69  xprAnalyze(SrcLi
4fc0: 73 74 2a 2c 20 57 68 65 72 65 43 6c 61 75 73 65  st*, WhereClause
4fd0: 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20  *, int);../*.** 
4fe0: 43 61 6c 6c 20 65 78 70 72 41 6e 61 6c 79 7a 65  Call exprAnalyze
4ff0: 20 6f 6e 20 61 6c 6c 20 74 65 72 6d 73 20 69 6e   on all terms in
5000: 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e   a WHERE clause.
5010: 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69    .*/.static voi
5020: 64 20 65 78 70 72 41 6e 61 6c 79 7a 65 41 6c 6c  d exprAnalyzeAll
5030: 28 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  (.  SrcList *pTa
5040: 62 4c 69 73 74 2c 20 20 20 20 20 20 20 2f 2a 20  bList,       /* 
5050: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
5060: 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  */.  WhereClause
5070: 20 2a 70 57 43 20 20 20 20 20 20 20 20 20 2f 2a   *pWC         /*
5080: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
5090: 65 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64  e to be analyzed
50a0: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   */.){.  int i;.
50b0: 20 20 66 6f 72 28 69 3d 70 57 43 2d 3e 6e 54 65    for(i=pWC->nTe
50c0: 72 6d 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29  rm-1; i>=0; i--)
50d0: 7b 0a 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a  {.    exprAnalyz
50e0: 65 28 70 54 61 62 4c 69 73 74 2c 20 70 57 43 2c  e(pTabList, pWC,
50f0: 20 69 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e   i);.  }.}..#ifn
5100: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
5110: 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  LIKE_OPTIMIZATIO
5120: 4e 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f  N./*.** Check to
5130: 20 73 65 65 20 69 66 20 74 68 65 20 67 69 76 65   see if the give
5140: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  n expression is 
5150: 61 20 4c 49 4b 45 20 6f 72 20 47 4c 4f 42 20 6f  a LIKE or GLOB o
5160: 70 65 72 61 74 6f 72 20 74 68 61 74 0a 2a 2a 20  perator that.** 
5170: 63 61 6e 20 62 65 20 6f 70 74 69 6d 69 7a 65 64  can be optimized
5180: 20 75 73 69 6e 67 20 69 6e 65 71 75 61 6c 69 74   using inequalit
5190: 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 20 20  y constraints.  
51a0: 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 69  Return TRUE if i
51b0: 74 20 69 73 0a 2a 2a 20 73 6f 20 61 6e 64 20 66  t is.** so and f
51c0: 61 6c 73 65 20 69 66 20 6e 6f 74 2e 0a 2a 2a 0a  alse if not..**.
51d0: 2a 2a 20 49 6e 20 6f 72 64 65 72 20 66 6f 72 20  ** In order for 
51e0: 74 68 65 20 6f 70 65 72 61 74 6f 72 20 74 6f 20  the operator to 
51f0: 62 65 20 6f 70 74 69 6d 69 7a 69 62 6c 65 2c 20  be optimizible, 
5200: 74 68 65 20 52 48 53 20 6d 75 73 74 20 62 65 20  the RHS must be 
5210: 61 20 73 74 72 69 6e 67 0a 2a 2a 20 6c 69 74 65  a string.** lite
5220: 72 61 6c 20 74 68 61 74 20 64 6f 65 73 20 6e 6f  ral that does no
5230: 74 20 62 65 67 69 6e 20 77 69 74 68 20 61 20 77  t begin with a w
5240: 69 6c 64 63 61 72 64 2e 20 20 54 68 65 20 4c 48  ildcard.  The LH
5250: 53 20 6d 75 73 74 20 62 65 20 61 20 63 6f 6c 75  S must be a colu
5260: 6d 6e 0a 2a 2a 20 74 68 61 74 20 6d 61 79 20 6f  mn.** that may o
5270: 6e 6c 79 20 62 65 20 4e 55 4c 4c 2c 20 61 20 73  nly be NULL, a s
5280: 74 72 69 6e 67 2c 20 6f 72 20 61 20 42 4c 4f 42  tring, or a BLOB
5290: 2c 20 6e 65 76 65 72 20 61 20 6e 75 6d 62 65 72  , never a number
52a0: 2e 20 28 54 68 69 73 20 6d 65 61 6e 73 0a 2a 2a  . (This means.**
52b0: 20 74 68 61 74 20 76 69 72 74 75 61 6c 20 74 61   that virtual ta
52c0: 62 6c 65 73 20 63 61 6e 6e 6f 74 20 70 61 72 74  bles cannot part
52d0: 69 63 69 70 61 74 65 20 69 6e 20 74 68 65 20 4c  icipate in the L
52e0: 49 4b 45 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  IKE optimization
52f0: 2e 29 20 20 49 66 20 74 68 65 0a 2a 2a 20 63 6f  .)  If the.** co
5300: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
5310: 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20   for the column 
5320: 6f 6e 20 74 68 65 20 4c 48 53 20 6d 75 73 74 20  on the LHS must 
5330: 62 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 66  be appropriate f
5340: 6f 72 0a 2a 2a 20 74 68 65 20 6f 70 65 72 61 74  or.** the operat
5350: 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  or..*/.static in
5360: 74 20 69 73 4c 69 6b 65 4f 72 47 6c 6f 62 28 0a  t isLikeOrGlob(.
5370: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
5380: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61      /* Parsing a
5390: 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69  nd code generati
53a0: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
53b0: 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20  Expr *pExpr,    
53c0: 20 20 2f 2a 20 54 65 73 74 20 74 68 69 73 20 65    /* Test this e
53d0: 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 45  xpression */.  E
53e0: 78 70 72 20 2a 2a 70 70 50 72 65 66 69 78 2c 20  xpr **ppPrefix, 
53f0: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 54   /* Pointer to T
5400: 4b 5f 53 54 52 49 4e 47 20 65 78 70 72 65 73 73  K_STRING express
5410: 69 6f 6e 20 77 69 74 68 20 70 61 74 74 65 72 6e  ion with pattern
5420: 20 70 72 65 66 69 78 20 2a 2f 0a 20 20 69 6e 74   prefix */.  int
5430: 20 2a 70 69 73 43 6f 6d 70 6c 65 74 65 2c 20 2f   *pisComplete, /
5440: 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 6f 6e  * True if the on
5450: 6c 79 20 77 69 6c 64 63 61 72 64 20 69 73 20 25  ly wildcard is %
5460: 20 69 6e 20 74 68 65 20 6c 61 73 74 20 63 68 61   in the last cha
5470: 72 61 63 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  racter */.  int 
5480: 2a 70 6e 6f 43 61 73 65 20 20 20 20 20 20 2f 2a  *pnoCase      /*
5490: 20 54 72 75 65 20 69 66 20 75 70 70 65 72 63 61   True if upperca
54a0: 73 65 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74  se is equivalent
54b0: 20 74 6f 20 6c 6f 77 65 72 63 61 73 65 20 2a 2f   to lowercase */
54c0: 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  .){.  const char
54d0: 20 2a 7a 20 3d 20 30 3b 20 20 20 20 20 20 20 20   *z = 0;        
54e0: 20 2f 2a 20 53 74 72 69 6e 67 20 6f 6e 20 52 48   /* String on RH
54f0: 53 20 6f 66 20 4c 49 4b 45 20 6f 70 65 72 61 74  S of LIKE operat
5500: 6f 72 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 52  or */.  Expr *pR
5510: 69 67 68 74 2c 20 2a 70 4c 65 66 74 3b 20 20 20  ight, *pLeft;   
5520: 20 20 20 2f 2a 20 52 69 67 68 74 20 61 6e 64 20     /* Right and 
5530: 6c 65 66 74 20 73 69 7a 65 20 6f 66 20 4c 49 4b  left size of LIK
5540: 45 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  E operator */.  
5550: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b  ExprList *pList;
5560: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69             /* Li
5570: 73 74 20 6f 66 20 6f 70 65 72 61 6e 64 73 20 74  st of operands t
5580: 6f 20 74 68 65 20 4c 49 4b 45 20 6f 70 65 72 61  o the LIKE opera
5590: 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 63 3b 20  tor */.  int c; 
55a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
55b0: 20 20 20 20 2f 2a 20 4f 6e 65 20 63 68 61 72 61      /* One chara
55c0: 63 74 65 72 20 69 6e 20 7a 5b 5d 20 2a 2f 0a 20  cter in z[] */. 
55d0: 20 69 6e 74 20 63 6e 74 3b 20 20 20 20 20 20 20   int cnt;       
55e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
55f0: 75 6d 62 65 72 20 6f 66 20 6e 6f 6e 2d 77 69 6c  umber of non-wil
5600: 64 63 61 72 64 20 70 72 65 66 69 78 20 63 68 61  dcard prefix cha
5610: 72 61 63 74 65 72 73 20 2a 2f 0a 20 20 63 68 61  racters */.  cha
5620: 72 20 77 63 5b 33 5d 3b 20 20 20 20 20 20 20 20  r wc[3];        
5630: 20 20 20 20 20 20 20 20 2f 2a 20 57 69 6c 64 63          /* Wildc
5640: 61 72 64 20 63 68 61 72 61 63 74 65 72 73 20 2a  ard characters *
5650: 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
5660: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 2f  = pParse->db;  /
5670: 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
5680: 63 74 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74  ction */.  sqlit
5690: 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 20 3d  e3_value *pVal =
56a0: 20 30 3b 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20   0;.  int op;   
56b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
56c0: 20 2f 2a 20 4f 70 63 6f 64 65 20 6f 66 20 70 52   /* Opcode of pR
56d0: 69 67 68 74 20 2a 2f 0a 0a 20 20 69 66 28 20 21  ight */..  if( !
56e0: 73 71 6c 69 74 65 33 49 73 4c 69 6b 65 46 75 6e  sqlite3IsLikeFun
56f0: 63 74 69 6f 6e 28 64 62 2c 20 70 45 78 70 72 2c  ction(db, pExpr,
5700: 20 70 6e 6f 43 61 73 65 2c 20 77 63 29 20 29 7b   pnoCase, wc) ){
5710: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
5720: 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
5730: 5f 45 42 43 44 49 43 0a 20 20 69 66 28 20 2a 70  _EBCDIC.  if( *p
5740: 6e 6f 43 61 73 65 20 29 20 72 65 74 75 72 6e 20  noCase ) return 
5750: 30 3b 0a 23 65 6e 64 69 66 0a 20 20 70 4c 69 73  0;.#endif.  pLis
5760: 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  t = pExpr->x.pLi
5770: 73 74 3b 0a 20 20 70 4c 65 66 74 20 3d 20 70 4c  st;.  pLeft = pL
5780: 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b  ist->a[1].pExpr;
5790: 0a 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70  .  if( pLeft->op
57a0: 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 0a 20 20 20  !=TK_COLUMN .   
57b0: 7c 7c 20 73 71 6c 69 74 65 33 45 78 70 72 41 66  || sqlite3ExprAf
57c0: 66 69 6e 69 74 79 28 70 4c 65 66 74 29 21 3d 53  finity(pLeft)!=S
57d0: 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20 0a  QLITE_AFF_TEXT .
57e0: 20 20 20 7c 7c 20 49 73 56 69 72 74 75 61 6c 28     || IsVirtual(
57f0: 70 4c 65 66 74 2d 3e 70 54 61 62 29 20 20 2f 2a  pLeft->pTab)  /*
5800: 20 56 61 6c 75 65 20 6d 69 67 68 74 20 62 65 20   Value might be 
5810: 6e 75 6d 65 72 69 63 20 2a 2f 0a 20 20 29 7b 0a  numeric */.  ){.
5820: 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 30 32      /* IMP: R-02
5830: 30 36 35 2d 34 39 34 36 35 20 54 68 65 20 6c 65  065-49465 The le
5840: 66 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20  ft-hand side of 
5850: 74 68 65 20 4c 49 4b 45 20 6f 72 20 47 4c 4f 42  the LIKE or GLOB
5860: 20 6f 70 65 72 61 74 6f 72 20 6d 75 73 74 0a 20   operator must. 
5870: 20 20 20 2a 2a 20 62 65 20 74 68 65 20 6e 61 6d     ** be the nam
5880: 65 20 6f 66 20 61 6e 20 69 6e 64 65 78 65 64 20  e of an indexed 
5890: 63 6f 6c 75 6d 6e 20 77 69 74 68 20 54 45 58 54  column with TEXT
58a0: 20 61 66 66 69 6e 69 74 79 2e 20 2a 2f 0a 20 20   affinity. */.  
58b0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
58c0: 20 20 61 73 73 65 72 74 28 20 70 4c 65 66 74 2d    assert( pLeft-
58d0: 3e 69 43 6f 6c 75 6d 6e 21 3d 28 2d 31 29 20 29  >iColumn!=(-1) )
58e0: 3b 20 2f 2a 20 42 65 63 61 75 73 65 20 49 50 4b  ; /* Because IPK
58f0: 20 6e 65 76 65 72 20 68 61 73 20 41 46 46 5f 54   never has AFF_T
5900: 45 58 54 20 2a 2f 0a 0a 20 20 70 52 69 67 68 74  EXT */..  pRight
5910: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b   = sqlite3ExprSk
5920: 69 70 43 6f 6c 6c 61 74 65 28 70 4c 69 73 74 2d  ipCollate(pList-
5930: 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[0].pExpr);.  
5940: 6f 70 20 3d 20 70 52 69 67 68 74 2d 3e 6f 70 3b  op = pRight->op;
5950: 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 56 41  .  if( op==TK_VA
5960: 52 49 41 42 4c 45 20 29 7b 0a 20 20 20 20 56 64  RIABLE ){.    Vd
5970: 62 65 20 2a 70 52 65 70 72 65 70 61 72 65 20 3d  be *pReprepare =
5980: 20 70 50 61 72 73 65 2d 3e 70 52 65 70 72 65 70   pParse->pReprep
5990: 61 72 65 3b 0a 20 20 20 20 69 6e 74 20 69 43 6f  are;.    int iCo
59a0: 6c 20 3d 20 70 52 69 67 68 74 2d 3e 69 43 6f 6c  l = pRight->iCol
59b0: 75 6d 6e 3b 0a 20 20 20 20 70 56 61 6c 20 3d 20  umn;.    pVal = 
59c0: 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 42 6f  sqlite3VdbeGetBo
59d0: 75 6e 64 56 61 6c 75 65 28 70 52 65 70 72 65 70  undValue(pReprep
59e0: 61 72 65 2c 20 69 43 6f 6c 2c 20 53 51 4c 49 54  are, iCol, SQLIT
59f0: 45 5f 41 46 46 5f 4e 4f 4e 45 29 3b 0a 20 20 20  E_AFF_NONE);.   
5a00: 20 69 66 28 20 70 56 61 6c 20 26 26 20 73 71 6c   if( pVal && sql
5a10: 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28  ite3_value_type(
5a20: 70 56 61 6c 29 3d 3d 53 51 4c 49 54 45 5f 54 45  pVal)==SQLITE_TE
5a30: 58 54 20 29 7b 0a 20 20 20 20 20 20 7a 20 3d 20  XT ){.      z = 
5a40: 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f  (char *)sqlite3_
5a50: 76 61 6c 75 65 5f 74 65 78 74 28 70 56 61 6c 29  value_text(pVal)
5a60: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
5a70: 74 65 33 56 64 62 65 53 65 74 56 61 72 6d 61 73  te3VdbeSetVarmas
5a80: 6b 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c  k(pParse->pVdbe,
5a90: 20 69 43 6f 6c 29 3b 0a 20 20 20 20 61 73 73 65   iCol);.    asse
5aa0: 72 74 28 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d  rt( pRight->op==
5ab0: 54 4b 5f 56 41 52 49 41 42 4c 45 20 7c 7c 20 70  TK_VARIABLE || p
5ac0: 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 52 45  Right->op==TK_RE
5ad0: 47 49 53 54 45 52 20 29 3b 0a 20 20 7d 65 6c 73  GISTER );.  }els
5ae0: 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 53 54 52  e if( op==TK_STR
5af0: 49 4e 47 20 29 7b 0a 20 20 20 20 7a 20 3d 20 70  ING ){.    z = p
5b00: 52 69 67 68 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b  Right->u.zToken;
5b10: 0a 20 20 7d 0a 20 20 69 66 28 20 7a 20 29 7b 0a  .  }.  if( z ){.
5b20: 20 20 20 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20      cnt = 0;.   
5b30: 20 77 68 69 6c 65 28 20 28 63 3d 7a 5b 63 6e 74   while( (c=z[cnt
5b40: 5d 29 21 3d 30 20 26 26 20 63 21 3d 77 63 5b 30  ])!=0 && c!=wc[0
5b50: 5d 20 26 26 20 63 21 3d 77 63 5b 31 5d 20 26 26  ] && c!=wc[1] &&
5b60: 20 63 21 3d 77 63 5b 32 5d 20 29 7b 0a 20 20 20   c!=wc[2] ){.   
5b70: 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 7d 0a     cnt++;.    }.
5b80: 20 20 20 20 69 66 28 20 63 6e 74 21 3d 30 20 26      if( cnt!=0 &
5b90: 26 20 32 35 35 21 3d 28 75 38 29 7a 5b 63 6e 74  & 255!=(u8)z[cnt
5ba0: 2d 31 5d 20 29 7b 0a 20 20 20 20 20 20 45 78 70  -1] ){.      Exp
5bb0: 72 20 2a 70 50 72 65 66 69 78 3b 0a 20 20 20 20  r *pPrefix;.    
5bc0: 20 20 2a 70 69 73 43 6f 6d 70 6c 65 74 65 20 3d    *pisComplete =
5bd0: 20 63 3d 3d 77 63 5b 30 5d 20 26 26 20 7a 5b 63   c==wc[0] && z[c
5be0: 6e 74 2b 31 5d 3d 3d 30 3b 0a 20 20 20 20 20 20  nt+1]==0;.      
5bf0: 70 50 72 65 66 69 78 20 3d 20 73 71 6c 69 74 65  pPrefix = sqlite
5c00: 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 53 54 52  3Expr(db, TK_STR
5c10: 49 4e 47 2c 20 7a 29 3b 0a 20 20 20 20 20 20 69  ING, z);.      i
5c20: 66 28 20 70 50 72 65 66 69 78 20 29 20 70 50 72  f( pPrefix ) pPr
5c30: 65 66 69 78 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 63  efix->u.zToken[c
5c40: 6e 74 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 2a  nt] = 0;.      *
5c50: 70 70 50 72 65 66 69 78 20 3d 20 70 50 72 65 66  ppPrefix = pPref
5c60: 69 78 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 70  ix;.      if( op
5c70: 3d 3d 54 4b 5f 56 41 52 49 41 42 4c 45 20 29 7b  ==TK_VARIABLE ){
5c80: 0a 20 20 20 20 20 20 20 20 56 64 62 65 20 2a 76  .        Vdbe *v
5c90: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
5ca0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
5cb0: 33 56 64 62 65 53 65 74 56 61 72 6d 61 73 6b 28  3VdbeSetVarmask(
5cc0: 76 2c 20 70 52 69 67 68 74 2d 3e 69 43 6f 6c 75  v, pRight->iColu
5cd0: 6d 6e 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  mn);.        if(
5ce0: 20 2a 70 69 73 43 6f 6d 70 6c 65 74 65 20 26 26   *pisComplete &&
5cf0: 20 70 52 69 67 68 74 2d 3e 75 2e 7a 54 6f 6b 65   pRight->u.zToke
5d00: 6e 5b 31 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  n[1] ){.        
5d10: 20 20 2f 2a 20 49 66 20 74 68 65 20 72 68 73 20    /* If the rhs 
5d20: 6f 66 20 74 68 65 20 4c 49 4b 45 20 65 78 70 72  of the LIKE expr
5d30: 65 73 73 69 6f 6e 20 69 73 20 61 20 76 61 72 69  ession is a vari
5d40: 61 62 6c 65 2c 20 61 6e 64 20 74 68 65 20 63 75  able, and the cu
5d50: 72 72 65 6e 74 0a 20 20 20 20 20 20 20 20 20 20  rrent.          
5d60: 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  ** value of the 
5d70: 76 61 72 69 61 62 6c 65 20 6d 65 61 6e 73 20 74  variable means t
5d80: 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20  here is no need 
5d90: 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20 4c 49  to invoke the LI
5da0: 4b 45 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  KE.          ** 
5db0: 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65 6e 20 6e  function, then n
5dc0: 6f 20 4f 50 5f 56 61 72 69 61 62 6c 65 20 77 69  o OP_Variable wi
5dd0: 6c 6c 20 62 65 20 61 64 64 65 64 20 74 6f 20 74  ll be added to t
5de0: 68 65 20 70 72 6f 67 72 61 6d 2e 0a 20 20 20 20  he program..    
5df0: 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 63 61        ** This ca
5e00: 75 73 65 73 20 70 72 6f 62 6c 65 6d 73 20 66 6f  uses problems fo
5e10: 72 20 74 68 65 20 73 71 6c 69 74 65 33 5f 62 69  r the sqlite3_bi
5e20: 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d  nd_parameter_nam
5e30: 65 28 29 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  e().          **
5e40: 20 41 50 49 2e 20 54 6f 20 77 6f 72 6b 20 61 72   API. To work ar
5e50: 6f 75 6e 64 20 74 68 65 6d 2c 20 61 64 64 20 61  ound them, add a
5e60: 20 64 75 6d 6d 79 20 4f 50 5f 56 61 72 69 61 62   dummy OP_Variab
5e70: 6c 65 20 68 65 72 65 2e 0a 20 20 20 20 20 20 20  le here..       
5e80: 20 20 20 2a 2f 20 0a 20 20 20 20 20 20 20 20 20     */ .         
5e90: 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65   int r1 = sqlite
5ea0: 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
5eb0: 73 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  se);.          s
5ec0: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61  qlite3ExprCodeTa
5ed0: 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 52 69  rget(pParse, pRi
5ee0: 67 68 74 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  ght, r1);.      
5ef0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
5f00: 68 61 6e 67 65 50 33 28 76 2c 20 73 71 6c 69 74  hangeP3(v, sqlit
5f10: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
5f20: 72 28 76 29 2d 31 2c 20 30 29 3b 0a 20 20 20 20  r(v)-1, 0);.    
5f30: 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
5f40: 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
5f50: 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20  se, r1);.       
5f60: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
5f70: 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 20 3d 20  else{.      z = 
5f80: 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  0;.    }.  }..  
5f90: 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65  sqlite3ValueFree
5fa0: 28 70 56 61 6c 29 3b 0a 20 20 72 65 74 75 72 6e  (pVal);.  return
5fb0: 20 28 7a 21 3d 30 29 3b 0a 7d 0a 23 65 6e 64 69   (z!=0);.}.#endi
5fc0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
5fd0: 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a 41 54 49  _LIKE_OPTIMIZATI
5fe0: 4f 4e 20 2a 2f 0a 0a 0a 23 69 66 6e 64 65 66 20  ON */...#ifndef 
5ff0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
6000: 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 43  UALTABLE./*.** C
6010: 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74  heck to see if t
6020: 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73  he given express
6030: 69 6f 6e 20 69 73 20 6f 66 20 74 68 65 20 66 6f  ion is of the fo
6040: 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  rm.**.**        
6050: 20 63 6f 6c 75 6d 6e 20 4d 41 54 43 48 20 65 78   column MATCH ex
6060: 70 72 0a 2a 2a 0a 2a 2a 20 49 66 20 69 74 20 69  pr.**.** If it i
6070: 73 20 74 68 65 6e 20 72 65 74 75 72 6e 20 54 52  s then return TR
6080: 55 45 2e 20 20 49 66 20 6e 6f 74 2c 20 72 65 74  UE.  If not, ret
6090: 75 72 6e 20 46 41 4c 53 45 2e 0a 2a 2f 0a 73 74  urn FALSE..*/.st
60a0: 61 74 69 63 20 69 6e 74 20 69 73 4d 61 74 63 68  atic int isMatch
60b0: 4f 66 43 6f 6c 75 6d 6e 28 0a 20 20 45 78 70 72  OfColumn(.  Expr
60c0: 20 2a 70 45 78 70 72 20 20 20 20 20 20 2f 2a 20   *pExpr      /* 
60d0: 54 65 73 74 20 74 68 69 73 20 65 78 70 72 65 73  Test this expres
60e0: 73 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 45 78 70  sion */.){.  Exp
60f0: 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b 0a 0a 20  rList *pList;.. 
6100: 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d   if( pExpr->op!=
6110: 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 29 7b 0a 20  TK_FUNCTION ){. 
6120: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
6130: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74  .  if( sqlite3St
6140: 72 49 43 6d 70 28 70 45 78 70 72 2d 3e 75 2e 7a  rICmp(pExpr->u.z
6150: 54 6f 6b 65 6e 2c 22 6d 61 74 63 68 22 29 21 3d  Token,"match")!=
6160: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
6170: 30 3b 0a 20 20 7d 0a 20 20 70 4c 69 73 74 20 3d  0;.  }.  pList =
6180: 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b   pExpr->x.pList;
6190: 0a 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e 45  .  if( pList->nE
61a0: 78 70 72 21 3d 32 20 29 7b 0a 20 20 20 20 72 65  xpr!=2 ){.    re
61b0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66  turn 0;.  }.  if
61c0: 28 20 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45  ( pList->a[1].pE
61d0: 78 70 72 2d 3e 6f 70 20 21 3d 20 54 4b 5f 43 4f  xpr->op != TK_CO
61e0: 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 72 65 74 75  LUMN ){.    retu
61f0: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 0;.  }.  retu
6200: 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  rn 1;.}.#endif /
6210: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  * SQLITE_OMIT_VI
6220: 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 2f  RTUALTABLE */../
6230: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 42 61 73  *.** If the pBas
6240: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 72 69  e expression ori
6250: 67 69 6e 61 74 65 64 20 69 6e 20 74 68 65 20 4f  ginated in the O
6260: 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73  N or USING claus
6270: 65 20 6f 66 0a 2a 2a 20 61 20 6a 6f 69 6e 2c 20  e of.** a join, 
6280: 74 68 65 6e 20 74 72 61 6e 73 66 65 72 20 74 68  then transfer th
6290: 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 6d 61  e appropriate ma
62a0: 72 6b 69 6e 67 73 20 6f 76 65 72 20 74 6f 20 64  rkings over to d
62b0: 65 72 69 76 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  erived..*/.stati
62c0: 63 20 76 6f 69 64 20 74 72 61 6e 73 66 65 72 4a  c void transferJ
62d0: 6f 69 6e 4d 61 72 6b 69 6e 67 73 28 45 78 70 72  oinMarkings(Expr
62e0: 20 2a 70 44 65 72 69 76 65 64 2c 20 45 78 70 72   *pDerived, Expr
62f0: 20 2a 70 42 61 73 65 29 7b 0a 20 20 69 66 28 20   *pBase){.  if( 
6300: 70 44 65 72 69 76 65 64 20 29 7b 0a 20 20 20 20  pDerived ){.    
6310: 70 44 65 72 69 76 65 64 2d 3e 66 6c 61 67 73 20  pDerived->flags 
6320: 7c 3d 20 70 42 61 73 65 2d 3e 66 6c 61 67 73 20  |= pBase->flags 
6330: 26 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 3b 0a 20  & EP_FromJoin;. 
6340: 20 20 20 70 44 65 72 69 76 65 64 2d 3e 69 52 69     pDerived->iRi
6350: 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 70  ghtJoinTable = p
6360: 42 61 73 65 2d 3e 69 52 69 67 68 74 4a 6f 69 6e  Base->iRightJoin
6370: 54 61 62 6c 65 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  Table;.  }.}../*
6380: 0a 2a 2a 20 4d 61 72 6b 20 74 65 72 6d 20 69 43  .** Mark term iC
6390: 68 69 6c 64 20 61 73 20 62 65 69 6e 67 20 61 20  hild as being a 
63a0: 63 68 69 6c 64 20 6f 66 20 74 65 72 6d 20 69 50  child of term iP
63b0: 61 72 65 6e 74 0a 2a 2f 0a 73 74 61 74 69 63 20  arent.*/.static 
63c0: 76 6f 69 64 20 6d 61 72 6b 54 65 72 6d 41 73 43  void markTermAsC
63d0: 68 69 6c 64 28 57 68 65 72 65 43 6c 61 75 73 65  hild(WhereClause
63e0: 20 2a 70 57 43 2c 20 69 6e 74 20 69 43 68 69 6c   *pWC, int iChil
63f0: 64 2c 20 69 6e 74 20 69 50 61 72 65 6e 74 29 7b  d, int iParent){
6400: 0a 20 20 70 57 43 2d 3e 61 5b 69 43 68 69 6c 64  .  pWC->a[iChild
6410: 5d 2e 69 50 61 72 65 6e 74 20 3d 20 69 50 61 72  ].iParent = iPar
6420: 65 6e 74 3b 0a 20 20 70 57 43 2d 3e 61 5b 69 43  ent;.  pWC->a[iC
6430: 68 69 6c 64 5d 2e 74 72 75 74 68 50 72 6f 62 20  hild].truthProb 
6440: 3d 20 70 57 43 2d 3e 61 5b 69 50 61 72 65 6e 74  = pWC->a[iParent
6450: 5d 2e 74 72 75 74 68 50 72 6f 62 3b 0a 20 20 70  ].truthProb;.  p
6460: 57 43 2d 3e 61 5b 69 50 61 72 65 6e 74 5d 2e 6e  WC->a[iParent].n
6470: 43 68 69 6c 64 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a  Child++;.}../*.*
6480: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 4e 2d 74  * Return the N-t
6490: 68 20 41 4e 44 2d 63 6f 6e 6e 65 63 74 65 64 20  h AND-connected 
64a0: 73 75 62 74 65 72 6d 20 6f 66 20 70 54 65 72 6d  subterm of pTerm
64b0: 2e 20 20 4f 72 20 69 66 20 70 54 65 72 6d 20 69  .  Or if pTerm i
64c0: 73 20 6e 6f 74 0a 2a 2a 20 61 20 63 6f 6e 6a 75  s not.** a conju
64d0: 6e 63 74 69 6f 6e 2c 20 74 68 65 6e 20 72 65 74  nction, then ret
64e0: 75 72 6e 20 6a 75 73 74 20 70 54 65 72 6d 20 77  urn just pTerm w
64f0: 68 65 6e 20 4e 3d 3d 30 2e 20 20 49 66 20 4e 20  hen N==0.  If N 
6500: 69 73 20 65 78 63 65 65 64 73 0a 2a 2a 20 74 68  is exceeds.** th
6510: 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69  e number of avai
6520: 6c 61 62 6c 65 20 73 75 62 74 65 72 6d 73 2c 20  lable subterms, 
6530: 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a  return NULL..*/.
6540: 73 74 61 74 69 63 20 57 68 65 72 65 54 65 72 6d  static WhereTerm
6550: 20 2a 77 68 65 72 65 4e 74 68 53 75 62 74 65 72   *whereNthSubter
6560: 6d 28 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65  m(WhereTerm *pTe
6570: 72 6d 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 69 66  rm, int N){.  if
6580: 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
6590: 6f 72 21 3d 57 4f 5f 41 4e 44 20 29 7b 0a 20 20  or!=WO_AND ){.  
65a0: 20 20 72 65 74 75 72 6e 20 4e 3d 3d 30 20 3f 20    return N==0 ? 
65b0: 70 54 65 72 6d 20 3a 20 30 3b 0a 20 20 7d 0a 20  pTerm : 0;.  }. 
65c0: 20 69 66 28 20 4e 3c 70 54 65 72 6d 2d 3e 75 2e   if( N<pTerm->u.
65d0: 70 41 6e 64 49 6e 66 6f 2d 3e 77 63 2e 6e 54 65  pAndInfo->wc.nTe
65e0: 72 6d 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  rm ){.    return
65f0: 20 26 70 54 65 72 6d 2d 3e 75 2e 70 41 6e 64 49   &pTerm->u.pAndI
6600: 6e 66 6f 2d 3e 77 63 2e 61 5b 4e 5d 3b 0a 20 20  nfo->wc.a[N];.  
6610: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
6620: 0a 2f 2a 0a 2a 2a 20 53 75 62 74 65 72 6d 73 20  ./*.** Subterms 
6630: 70 4f 6e 65 20 61 6e 64 20 70 54 77 6f 20 61 72  pOne and pTwo ar
6640: 65 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68  e contained with
6650: 69 6e 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  in WHERE clause 
6660: 70 57 43 2e 20 20 54 68 65 0a 2a 2a 20 74 77 6f  pWC.  The.** two
6670: 20 73 75 62 74 65 72 6d 73 20 61 72 65 20 69 6e   subterms are in
6680: 20 64 69 73 6a 75 6e 63 74 69 6f 6e 20 2d 20 74   disjunction - t
6690: 68 65 79 20 61 72 65 20 4f 52 2d 65 64 20 74 6f  hey are OR-ed to
66a0: 67 65 74 68 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66  gether..**.** If
66b0: 20 74 68 65 73 65 20 74 77 6f 20 74 65 72 6d 73   these two terms
66c0: 20 61 72 65 20 62 6f 74 68 20 6f 66 20 74 68 65   are both of the
66d0: 20 66 6f 72 6d 3a 20 20 22 41 20 6f 70 20 42 22   form:  "A op B"
66e0: 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 0a 2a   with the same.*
66f0: 2a 20 41 20 61 6e 64 20 42 20 76 61 6c 75 65 73  * A and B values
6700: 20 62 75 74 20 64 69 66 66 65 72 65 6e 74 20 6f   but different o
6710: 70 65 72 61 74 6f 72 73 20 61 6e 64 20 69 66 20  perators and if 
6720: 74 68 65 20 6f 70 65 72 61 74 6f 72 73 20 61 72  the operators ar
6730: 65 0a 2a 2a 20 63 6f 6d 70 61 74 69 62 6c 65 20  e.** compatible 
6740: 28 69 66 20 6f 6e 65 20 69 73 20 3d 20 61 6e 64  (if one is = and
6750: 20 74 68 65 20 6f 74 68 65 72 20 69 73 20 3c 2c   the other is <,
6760: 20 66 6f 72 20 65 78 61 6d 70 6c 65 29 20 74 68   for example) th
6770: 65 6e 0a 2a 2a 20 61 64 64 20 61 20 6e 65 77 20  en.** add a new 
6780: 76 69 72 74 75 61 6c 20 41 4e 44 20 74 65 72 6d  virtual AND term
6790: 20 74 6f 20 70 57 43 20 74 68 61 74 20 69 73 20   to pWC that is 
67a0: 74 68 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20  the combination 
67b0: 6f 66 20 74 68 65 0a 2a 2a 20 74 77 6f 2e 0a 2a  of the.** two..*
67c0: 2a 0a 2a 2a 20 53 6f 6d 65 20 65 78 61 6d 70 6c  *.** Some exampl
67d0: 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 78 3c 79  es:.**.**    x<y
67e0: 20 4f 52 20 78 3d 79 20 20 20 20 2d 2d 3e 20 20   OR x=y    -->  
67f0: 20 20 20 78 3c 3d 79 0a 2a 2a 20 20 20 20 78 3d     x<=y.**    x=
6800: 79 20 4f 52 20 78 3d 79 20 20 20 20 2d 2d 3e 20  y OR x=y    --> 
6810: 20 20 20 20 78 3d 79 0a 2a 2a 20 20 20 20 78 3c      x=y.**    x<
6820: 3d 79 20 4f 52 20 78 3c 79 20 20 20 2d 2d 3e 20  =y OR x<y   --> 
6830: 20 20 20 20 78 3c 3d 79 0a 2a 2a 0a 2a 2a 20 54      x<=y.**.** T
6840: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20  he following is 
6850: 4e 4f 54 20 67 65 6e 65 72 61 74 65 64 3a 0a 2a  NOT generated:.*
6860: 2a 0a 2a 2a 20 20 20 20 78 3c 79 20 4f 52 20 78  *.**    x<y OR x
6870: 3e 79 20 20 20 20 2d 2d 3e 20 20 20 20 20 78 21  >y    -->     x!
6880: 3d 79 20 20 20 20 20 0a 2a 2f 0a 73 74 61 74 69  =y     .*/.stati
6890: 63 20 76 6f 69 64 20 77 68 65 72 65 43 6f 6d 62  c void whereComb
68a0: 69 6e 65 44 69 73 6a 75 6e 63 74 73 28 0a 20 20  ineDisjuncts(.  
68b0: 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20  SrcList *pSrc,  
68c0: 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20 46 52         /* the FR
68d0: 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57  OM clause */.  W
68e0: 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c  hereClause *pWC,
68f0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d        /* The com
6900: 70 6c 65 74 65 20 57 48 45 52 45 20 63 6c 61 75  plete WHERE clau
6910: 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  se */.  WhereTer
6920: 6d 20 2a 70 4f 6e 65 2c 20 20 20 20 20 20 20 2f  m *pOne,       /
6930: 2a 20 46 69 72 73 74 20 64 69 73 6a 75 6e 63 74  * First disjunct
6940: 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
6950: 2a 70 54 77 6f 20 20 20 20 20 20 20 20 2f 2a 20  *pTwo        /* 
6960: 53 65 63 6f 6e 64 20 64 69 73 6a 75 6e 63 74 20  Second disjunct 
6970: 2a 2f 0a 29 7b 0a 20 20 75 31 36 20 65 4f 70 20  */.){.  u16 eOp 
6980: 3d 20 70 4f 6e 65 2d 3e 65 4f 70 65 72 61 74 6f  = pOne->eOperato
6990: 72 20 7c 20 70 54 77 6f 2d 3e 65 4f 70 65 72 61  r | pTwo->eOpera
69a0: 74 6f 72 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  tor;.  sqlite3 *
69b0: 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  db;           /*
69c0: 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
69d0: 74 69 6f 6e 20 28 66 6f 72 20 6d 61 6c 6c 6f 63  tion (for malloc
69e0: 29 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4e 65  ) */.  Expr *pNe
69f0: 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  w;            /*
6a00: 20 4e 65 77 20 76 69 72 74 75 61 6c 20 65 78 70   New virtual exp
6a10: 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  ression */.  int
6a20: 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   op;            
6a30: 20 20 20 20 2f 2a 20 4f 70 65 72 61 74 6f 72 20      /* Operator 
6a40: 66 6f 72 20 74 68 65 20 63 6f 6d 62 69 6e 65 64  for the combined
6a50: 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20   expression */. 
6a60: 20 69 6e 74 20 69 64 78 4e 65 77 3b 20 20 20 20   int idxNew;    
6a70: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
6a80: 20 69 6e 20 70 57 43 20 6f 66 20 74 68 65 20 6e   in pWC of the n
6a90: 65 78 74 20 76 69 72 74 75 61 6c 20 74 65 72 6d  ext virtual term
6aa0: 20 2a 2f 0a 0a 20 20 69 66 28 20 28 70 4f 6e 65   */..  if( (pOne
6ab0: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57  ->eOperator & (W
6ac0: 4f 5f 45 51 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45  O_EQ|WO_LT|WO_LE
6ad0: 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 29 29 3d 3d  |WO_GT|WO_GE))==
6ae0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
6af0: 28 20 28 70 54 77 6f 2d 3e 65 4f 70 65 72 61 74  ( (pTwo->eOperat
6b00: 6f 72 20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f 4c  or & (WO_EQ|WO_L
6b10: 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c 57 4f  T|WO_LE|WO_GT|WO
6b20: 5f 47 45 29 29 3d 3d 30 20 29 20 72 65 74 75 72  _GE))==0 ) retur
6b30: 6e 3b 0a 20 20 69 66 28 20 28 65 4f 70 20 26 20  n;.  if( (eOp & 
6b40: 28 57 4f 5f 45 51 7c 57 4f 5f 4c 54 7c 57 4f 5f  (WO_EQ|WO_LT|WO_
6b50: 4c 45 29 29 21 3d 65 4f 70 0a 20 20 20 26 26 20  LE))!=eOp.   && 
6b60: 28 65 4f 70 20 26 20 28 57 4f 5f 45 51 7c 57 4f  (eOp & (WO_EQ|WO
6b70: 5f 47 54 7c 57 4f 5f 47 45 29 29 21 3d 65 4f 70  _GT|WO_GE))!=eOp
6b80: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73   ) return;.  ass
6b90: 65 72 74 28 20 70 4f 6e 65 2d 3e 70 45 78 70 72  ert( pOne->pExpr
6ba0: 2d 3e 70 4c 65 66 74 21 3d 30 20 26 26 20 70 4f  ->pLeft!=0 && pO
6bb0: 6e 65 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68  ne->pExpr->pRigh
6bc0: 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  t!=0 );.  assert
6bd0: 28 20 70 54 77 6f 2d 3e 70 45 78 70 72 2d 3e 70  ( pTwo->pExpr->p
6be0: 4c 65 66 74 21 3d 30 20 26 26 20 70 54 77 6f 2d  Left!=0 && pTwo-
6bf0: 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 21 3d  >pExpr->pRight!=
6c00: 30 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  0 );.  if( sqlit
6c10: 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 4f  e3ExprCompare(pO
6c20: 6e 65 2d 3e 70 45 78 70 72 2d 3e 70 4c 65 66 74  ne->pExpr->pLeft
6c30: 2c 20 70 54 77 6f 2d 3e 70 45 78 70 72 2d 3e 70  , pTwo->pExpr->p
6c40: 4c 65 66 74 2c 20 2d 31 29 20 29 20 72 65 74 75  Left, -1) ) retu
6c50: 72 6e 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  rn;.  if( sqlite
6c60: 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 4f 6e  3ExprCompare(pOn
6c70: 65 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74  e->pExpr->pRight
6c80: 2c 20 70 54 77 6f 2d 3e 70 45 78 70 72 2d 3e 70  , pTwo->pExpr->p
6c90: 52 69 67 68 74 2c 20 2d 31 29 20 29 72 65 74 75  Right, -1) )retu
6ca0: 72 6e 3b 0a 20 20 2f 2a 20 49 66 20 77 65 20 72  rn;.  /* If we r
6cb0: 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c  each this point,
6cc0: 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20 74 77   it means the tw
6cd0: 6f 20 73 75 62 74 65 72 6d 73 20 63 61 6e 20 62  o subterms can b
6ce0: 65 20 63 6f 6d 62 69 6e 65 64 20 2a 2f 0a 20 20  e combined */.  
6cf0: 69 66 28 20 28 65 4f 70 20 26 20 28 65 4f 70 2d  if( (eOp & (eOp-
6d00: 31 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 66  1))!=0 ){.    if
6d10: 28 20 65 4f 70 20 26 20 28 57 4f 5f 4c 54 7c 57  ( eOp & (WO_LT|W
6d20: 4f 5f 4c 45 29 20 29 7b 0a 20 20 20 20 20 20 65  O_LE) ){.      e
6d30: 4f 70 20 3d 20 57 4f 5f 4c 45 3b 0a 20 20 20 20  Op = WO_LE;.    
6d40: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
6d50: 65 72 74 28 20 65 4f 70 20 26 20 28 57 4f 5f 47  ert( eOp & (WO_G
6d60: 54 7c 57 4f 5f 47 45 29 20 29 3b 0a 20 20 20 20  T|WO_GE) );.    
6d70: 20 20 65 4f 70 20 3d 20 57 4f 5f 47 45 3b 0a 20    eOp = WO_GE;. 
6d80: 20 20 20 7d 0a 20 20 7d 0a 20 20 64 62 20 3d 20     }.  }.  db = 
6d90: 70 57 43 2d 3e 70 57 49 6e 66 6f 2d 3e 70 50 61  pWC->pWInfo->pPa
6da0: 72 73 65 2d 3e 64 62 3b 0a 20 20 70 4e 65 77 20  rse->db;.  pNew 
6db0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
6dc0: 28 64 62 2c 20 70 4f 6e 65 2d 3e 70 45 78 70 72  (db, pOne->pExpr
6dd0: 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  , 0);.  if( pNew
6de0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
6df0: 66 6f 72 28 6f 70 3d 54 4b 5f 45 51 3b 20 65 4f  for(op=TK_EQ; eO
6e00: 70 21 3d 28 57 4f 5f 45 51 3c 3c 28 6f 70 2d 54  p!=(WO_EQ<<(op-T
6e10: 4b 5f 45 51 29 29 3b 20 6f 70 2b 2b 29 7b 20 61  K_EQ)); op++){ a
6e20: 73 73 65 72 74 28 20 6f 70 3c 54 4b 5f 47 45 20  ssert( op<TK_GE 
6e30: 29 3b 20 7d 0a 20 20 70 4e 65 77 2d 3e 6f 70 20  ); }.  pNew->op 
6e40: 3d 20 6f 70 3b 0a 20 20 69 64 78 4e 65 77 20 3d  = op;.  idxNew =
6e50: 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65   whereClauseInse
6e60: 72 74 28 70 57 43 2c 20 70 4e 65 77 2c 20 54 45  rt(pWC, pNew, TE
6e70: 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f  RM_VIRTUAL|TERM_
6e80: 44 59 4e 41 4d 49 43 29 3b 0a 20 20 65 78 70 72  DYNAMIC);.  expr
6e90: 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20 70 57  Analyze(pSrc, pW
6ea0: 43 2c 20 69 64 78 4e 65 77 29 3b 0a 7d 0a 0a 23  C, idxNew);.}..#
6eb0: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
6ec0: 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d  TE_OMIT_OR_OPTIM
6ed0: 49 5a 41 54 49 4f 4e 29 20 26 26 20 21 64 65 66  IZATION) && !def
6ee0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
6ef0: 5f 53 55 42 51 55 45 52 59 29 0a 2f 2a 0a 2a 2a  _SUBQUERY)./*.**
6f00: 20 41 6e 61 6c 79 7a 65 20 61 20 74 65 72 6d 20   Analyze a term 
6f10: 74 68 61 74 20 63 6f 6e 73 69 73 74 73 20 6f 66  that consists of
6f20: 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 4f 52 2d   two or more OR-
6f30: 63 6f 6e 6e 65 63 74 65 64 0a 2a 2a 20 73 75 62  connected.** sub
6f40: 74 65 72 6d 73 2e 20 20 53 6f 20 69 6e 3a 0a 2a  terms.  So in:.*
6f50: 2a 0a 2a 2a 20 20 20 20 20 2e 2e 2e 20 57 48 45  *.**     ... WHE
6f60: 52 45 20 20 28 61 3d 35 29 20 41 4e 44 20 28 62  RE  (a=5) AND (b
6f70: 3d 37 20 4f 52 20 63 3d 39 20 4f 52 20 64 3d 31  =7 OR c=9 OR d=1
6f80: 33 29 20 41 4e 44 20 28 64 3d 31 33 29 0a 2a 2a  3) AND (d=13).**
6f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6fa0: 20 20 20 20 20 20 20 20 20 20 5e 5e 5e 5e 5e 5e            ^^^^^^
6fb0: 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 0a 2a  ^^^^^^^^^^^^^^.*
6fc0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
6fd0: 65 20 61 6e 61 6c 79 7a 65 73 20 74 65 72 6d 73  e analyzes terms
6fe0: 20 73 75 63 68 20 61 73 20 74 68 65 20 6d 69 64   such as the mid
6ff0: 64 6c 65 20 74 65 72 6d 20 69 6e 20 74 68 65 20  dle term in the 
7000: 61 62 6f 76 65 20 65 78 61 6d 70 6c 65 2e 0a 2a  above example..*
7010: 2a 20 41 20 57 68 65 72 65 4f 72 54 65 72 6d 20  * A WhereOrTerm 
7020: 6f 62 6a 65 63 74 20 69 73 20 63 6f 6d 70 75 74  object is comput
7030: 65 64 20 61 6e 64 20 61 74 74 61 63 68 65 64 20  ed and attached 
7040: 74 6f 20 74 68 65 20 74 65 72 6d 20 75 6e 64 65  to the term unde
7050: 72 0a 2a 2a 20 61 6e 61 6c 79 73 69 73 2c 20 72  r.** analysis, r
7060: 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65  egardless of the
7070: 20 6f 75 74 63 6f 6d 65 20 6f 66 20 74 68 65 20   outcome of the 
7080: 61 6e 61 6c 79 73 69 73 2e 20 20 48 65 6e 63 65  analysis.  Hence
7090: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 57 68 65 72  :.**.**     Wher
70a0: 65 54 65 72 6d 2e 77 74 46 6c 61 67 73 20 20 20  eTerm.wtFlags   
70b0: 7c 3d 20 20 54 45 52 4d 5f 4f 52 49 4e 46 4f 0a  |=  TERM_ORINFO.
70c0: 2a 2a 20 20 20 20 20 57 68 65 72 65 54 65 72 6d  **     WhereTerm
70d0: 2e 75 2e 70 4f 72 49 6e 66 6f 20 20 3d 20 20 61  .u.pOrInfo  =  a
70e0: 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c   dynamically all
70f0: 6f 63 61 74 65 64 20 57 68 65 72 65 4f 72 54 65  ocated WhereOrTe
7100: 72 6d 20 6f 62 6a 65 63 74 0a 2a 2a 0a 2a 2a 20  rm object.**.** 
7110: 54 68 65 20 74 65 72 6d 20 62 65 69 6e 67 20 61  The term being a
7120: 6e 61 6c 79 7a 65 64 20 6d 75 73 74 20 68 61 76  nalyzed must hav
7130: 65 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 6f 66  e two or more of
7140: 20 4f 52 2d 63 6f 6e 6e 65 63 74 65 64 20 73 75   OR-connected su
7150: 62 74 65 72 6d 73 2e 0a 2a 2a 20 41 20 73 69 6e  bterms..** A sin
7160: 67 6c 65 20 73 75 62 74 65 72 6d 20 6d 69 67 68  gle subterm migh
7170: 74 20 62 65 20 61 20 73 65 74 20 6f 66 20 41 4e  t be a set of AN
7180: 44 2d 63 6f 6e 6e 65 63 74 65 64 20 73 75 62 2d  D-connected sub-
7190: 73 75 62 74 65 72 6d 73 2e 0a 2a 2a 20 45 78 61  subterms..** Exa
71a0: 6d 70 6c 65 73 20 6f 66 20 74 65 72 6d 73 20 75  mples of terms u
71b0: 6e 64 65 72 20 61 6e 61 6c 79 73 69 73 3a 0a 2a  nder analysis:.*
71c0: 2a 0a 2a 2a 20 20 20 20 20 28 41 29 20 20 20 20  *.**     (A)    
71d0: 20 74 31 2e 78 3d 74 32 2e 79 20 4f 52 20 74 31   t1.x=t2.y OR t1
71e0: 2e 78 3d 74 32 2e 7a 20 4f 52 20 74 31 2e 79 3d  .x=t2.z OR t1.y=
71f0: 31 35 20 4f 52 20 74 31 2e 7a 3d 74 33 2e 61 2b  15 OR t1.z=t3.a+
7200: 35 0a 2a 2a 20 20 20 20 20 28 42 29 20 20 20 20  5.**     (B)    
7210: 20 78 3d 65 78 70 72 31 20 4f 52 20 65 78 70 72   x=expr1 OR expr
7220: 32 3d 78 20 4f 52 20 78 3d 65 78 70 72 33 0a 2a  2=x OR x=expr3.*
7230: 2a 20 20 20 20 20 28 43 29 20 20 20 20 20 74 31  *     (C)     t1
7240: 2e 78 3d 74 32 2e 79 20 4f 52 20 28 74 31 2e 78  .x=t2.y OR (t1.x
7250: 3d 74 32 2e 7a 20 41 4e 44 20 74 31 2e 79 3d 31  =t2.z AND t1.y=1
7260: 35 29 0a 2a 2a 20 20 20 20 20 28 44 29 20 20 20  5).**     (D)   
7270: 20 20 78 3d 65 78 70 72 31 20 4f 52 20 28 79 3e    x=expr1 OR (y>
7280: 31 31 20 41 4e 44 20 79 3c 32 32 20 41 4e 44 20  11 AND y<22 AND 
7290: 7a 20 4c 49 4b 45 20 27 2a 68 65 6c 6c 6f 2a 27  z LIKE '*hello*'
72a0: 29 0a 2a 2a 20 20 20 20 20 28 45 29 20 20 20 20  ).**     (E)    
72b0: 20 28 70 2e 61 3d 31 20 41 4e 44 20 71 2e 62 3d   (p.a=1 AND q.b=
72c0: 32 20 41 4e 44 20 72 2e 63 3d 33 29 20 4f 52 20  2 AND r.c=3) OR 
72d0: 28 70 2e 78 3d 34 20 41 4e 44 20 71 2e 79 3d 35  (p.x=4 AND q.y=5
72e0: 20 41 4e 44 20 72 2e 7a 3d 36 29 0a 2a 2a 20 20   AND r.z=6).**  
72f0: 20 20 20 28 46 29 20 20 20 20 20 78 3e 41 20 4f     (F)     x>A O
7300: 52 20 28 78 3d 41 20 41 4e 44 20 79 3e 3d 42 29  R (x=A AND y>=B)
7310: 0a 2a 2a 0a 2a 2a 20 43 41 53 45 20 31 3a 0a 2a  .**.** CASE 1:.*
7320: 2a 0a 2a 2a 20 49 66 20 61 6c 6c 20 73 75 62 74  *.** If all subt
7330: 65 72 6d 73 20 61 72 65 20 6f 66 20 74 68 65 20  erms are of the 
7340: 66 6f 72 6d 20 54 2e 43 3d 65 78 70 72 20 66 6f  form T.C=expr fo
7350: 72 20 73 6f 6d 65 20 73 69 6e 67 6c 65 20 63 6f  r some single co
7360: 6c 75 6d 6e 20 6f 66 20 43 20 61 6e 64 0a 2a 2a  lumn of C and.**
7370: 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20   a single table 
7380: 54 20 28 61 73 20 73 68 6f 77 6e 20 69 6e 20 65  T (as shown in e
7390: 78 61 6d 70 6c 65 20 42 20 61 62 6f 76 65 29 20  xample B above) 
73a0: 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 6e 65  then create a ne
73b0: 77 20 76 69 72 74 75 61 6c 0a 2a 2a 20 74 65 72  w virtual.** ter
73c0: 6d 20 74 68 61 74 20 69 73 20 61 6e 20 65 71 75  m that is an equ
73d0: 69 76 61 6c 65 6e 74 20 49 4e 20 65 78 70 72 65  ivalent IN expre
73e0: 73 73 69 6f 6e 2e 20 20 49 6e 20 6f 74 68 65 72  ssion.  In other
73f0: 20 77 6f 72 64 73 2c 20 69 66 20 74 68 65 20 74   words, if the t
7400: 65 72 6d 0a 2a 2a 20 62 65 69 6e 67 20 61 6e 61  erm.** being ana
7410: 6c 79 7a 65 64 20 69 73 3a 0a 2a 2a 0a 2a 2a 20  lyzed is:.**.** 
7420: 20 20 20 20 20 78 20 3d 20 65 78 70 72 31 20 20       x = expr1  
7430: 4f 52 20 20 65 78 70 72 32 20 3d 20 78 20 20 4f  OR  expr2 = x  O
7440: 52 20 20 78 20 3d 20 65 78 70 72 33 0a 2a 2a 0a  R  x = expr3.**.
7450: 2a 2a 20 74 68 65 6e 20 63 72 65 61 74 65 20 61  ** then create a
7460: 20 6e 65 77 20 76 69 72 74 75 61 6c 20 74 65 72   new virtual ter
7470: 6d 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a  m like this:.**.
7480: 2a 2a 20 20 20 20 20 20 78 20 49 4e 20 28 65 78  **      x IN (ex
7490: 70 72 31 2c 65 78 70 72 32 2c 65 78 70 72 33 29  pr1,expr2,expr3)
74a0: 0a 2a 2a 0a 2a 2a 20 43 41 53 45 20 32 3a 0a 2a  .**.** CASE 2:.*
74b0: 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72  *.** If there ar
74c0: 65 20 65 78 61 63 74 6c 79 20 74 77 6f 20 64 69  e exactly two di
74d0: 73 6a 75 6e 63 74 73 20 6f 6e 65 20 73 69 64 65  sjuncts one side
74e0: 20 68 61 73 20 78 3e 41 20 61 6e 64 20 74 68 65   has x>A and the
74f0: 20 6f 74 68 65 72 20 73 69 64 65 0a 2a 2a 20 68   other side.** h
7500: 61 73 20 78 3d 41 20 28 66 6f 72 20 74 68 65 20  as x=A (for the 
7510: 73 61 6d 65 20 78 20 61 6e 64 20 41 29 20 74 68  same x and A) th
7520: 65 6e 20 61 64 64 20 61 20 6e 65 77 20 76 69 72  en add a new vir
7530: 74 75 61 6c 20 63 6f 6e 6a 75 6e 63 74 20 74 65  tual conjunct te
7540: 72 6d 20 74 6f 20 74 68 65 0a 2a 2a 20 57 48 45  rm to the.** WHE
7550: 52 45 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  RE clause of the
7560: 20 66 6f 72 6d 20 22 78 3e 3d 41 22 2e 20 20 45   form "x>=A".  E
7570: 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  xample:.**.**   
7580: 20 20 20 78 3e 41 20 4f 52 20 28 78 3d 41 20 41     x>A OR (x=A A
7590: 4e 44 20 79 3e 42 29 20 20 20 20 61 64 64 73 3a  ND y>B)    adds:
75a0: 20 20 20 20 78 3e 3d 41 0a 2a 2a 0a 2a 2a 20 54      x>=A.**.** T
75b0: 68 65 20 61 64 64 65 64 20 63 6f 6e 6a 75 6e 63  he added conjunc
75c0: 74 20 63 61 6e 20 73 6f 6d 65 74 69 6d 65 73 20  t can sometimes 
75d0: 62 65 20 68 65 6c 70 66 75 6c 20 69 6e 20 71 75  be helpful in qu
75e0: 65 72 79 20 70 6c 61 6e 6e 69 6e 67 2e 0a 2a 2a  ery planning..**
75f0: 0a 2a 2a 20 43 41 53 45 20 33 3a 0a 2a 2a 0a 2a  .** CASE 3:.**.*
7600: 2a 20 49 66 20 61 6c 6c 20 73 75 62 74 65 72 6d  * If all subterm
7610: 73 20 61 72 65 20 69 6e 64 65 78 61 62 6c 65 20  s are indexable 
7620: 62 79 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c  by a single tabl
7630: 65 20 54 2c 20 74 68 65 6e 20 73 65 74 0a 2a 2a  e T, then set.**
7640: 0a 2a 2a 20 20 20 20 20 57 68 65 72 65 54 65 72  .**     WhereTer
7650: 6d 2e 65 4f 70 65 72 61 74 6f 72 20 20 20 20 20  m.eOperator     
7660: 20 20 20 20 20 20 20 20 20 3d 20 20 57 4f 5f 4f           =  WO_O
7670: 52 0a 2a 2a 20 20 20 20 20 57 68 65 72 65 54 65  R.**     WhereTe
7680: 72 6d 2e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 69 6e  rm.u.pOrInfo->in
7690: 64 65 78 61 62 6c 65 20 20 7c 3d 20 20 74 68 65  dexable  |=  the
76a0: 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66   cursor number f
76b0: 6f 72 20 74 61 62 6c 65 20 54 0a 2a 2a 0a 2a 2a  or table T.**.**
76c0: 20 41 20 73 75 62 74 65 72 6d 20 69 73 20 22 69   A subterm is "i
76d0: 6e 64 65 78 61 62 6c 65 22 20 69 66 20 69 74 20  ndexable" if it 
76e0: 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a 2a  is of the form.*
76f0: 2a 20 22 54 2e 43 20 3c 6f 70 3e 20 3c 65 78 70  * "T.C <op> <exp
7700: 72 3e 22 20 77 68 65 72 65 20 43 20 69 73 20 61  r>" where C is a
7710: 6e 79 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 61 62  ny column of tab
7720: 6c 65 20 54 20 61 6e 64 20 0a 2a 2a 20 3c 6f 70  le T and .** <op
7730: 3e 20 69 73 20 6f 6e 65 20 6f 66 20 22 3d 22 2c  > is one of "=",
7740: 20 22 3c 22 2c 20 22 3c 3d 22 2c 20 22 3e 22 2c   "<", "<=", ">",
7750: 20 22 3e 3d 22 2c 20 22 49 53 20 4e 55 4c 4c 22   ">=", "IS NULL"
7760: 2c 20 6f 72 20 22 49 4e 22 2e 0a 2a 2a 20 41 20  , or "IN"..** A 
7770: 73 75 62 74 65 72 6d 20 69 73 20 61 6c 73 6f 20  subterm is also 
7780: 69 6e 64 65 78 61 62 6c 65 20 69 66 20 69 74 20  indexable if it 
7790: 69 73 20 61 6e 20 41 4e 44 20 6f 66 20 74 77 6f  is an AND of two
77a0: 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 73 75 62 73   or more.** subs
77b0: 75 62 74 65 72 6d 73 20 61 74 20 6c 65 61 73 74  ubterms at least
77c0: 20 6f 6e 65 20 6f 66 20 77 68 69 63 68 20 69 73   one of which is
77d0: 20 69 6e 64 65 78 61 62 6c 65 2e 20 20 49 6e 64   indexable.  Ind
77e0: 65 78 61 62 6c 65 20 41 4e 44 20 0a 2a 2a 20 73  exable AND .** s
77f0: 75 62 74 65 72 6d 73 20 68 61 76 65 20 74 68 65  ubterms have the
7800: 69 72 20 65 4f 70 65 72 61 74 6f 72 20 73 65 74  ir eOperator set
7810: 20 74 6f 20 57 4f 5f 41 4e 44 20 61 6e 64 20 74   to WO_AND and t
7820: 68 65 79 20 68 61 76 65 0a 2a 2a 20 75 2e 70 41  hey have.** u.pA
7830: 6e 64 49 6e 66 6f 20 73 65 74 20 74 6f 20 61 20  ndInfo set to a 
7840: 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f  dynamically allo
7850: 63 61 74 65 64 20 57 68 65 72 65 41 6e 64 54 65  cated WhereAndTe
7860: 72 6d 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a  rm object..**.**
7870: 20 46 72 6f 6d 20 61 6e 6f 74 68 65 72 20 70 6f   From another po
7880: 69 6e 74 20 6f 66 20 76 69 65 77 2c 20 22 69 6e  int of view, "in
7890: 64 65 78 61 62 6c 65 22 20 6d 65 61 6e 73 20 74  dexable" means t
78a0: 68 61 74 20 74 68 65 20 73 75 62 74 65 72 6d 20  hat the subterm 
78b0: 63 6f 75 6c 64 0a 2a 2a 20 70 6f 74 65 6e 74 69  could.** potenti
78c0: 61 6c 6c 79 20 62 65 20 75 73 65 64 20 77 69 74  ally be used wit
78d0: 68 20 61 6e 20 69 6e 64 65 78 20 69 66 20 61 6e  h an index if an
78e0: 20 61 70 70 72 6f 70 72 69 61 74 65 20 69 6e 64   appropriate ind
78f0: 65 78 20 65 78 69 73 74 73 2e 0a 2a 2a 20 54 68  ex exists..** Th
7900: 69 73 20 61 6e 61 6c 79 73 69 73 20 64 6f 65 73  is analysis does
7910: 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72 20 77 68   not consider wh
7920: 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65  ether or not the
7930: 20 69 6e 64 65 78 20 65 78 69 73 74 73 3b 20 74   index exists; t
7940: 68 61 74 0a 2a 2a 20 69 73 20 64 65 63 69 64 65  hat.** is decide
7950: 64 20 65 6c 73 65 77 68 65 72 65 2e 20 20 54 68  d elsewhere.  Th
7960: 69 73 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79  is analysis only
7970: 20 6c 6f 6f 6b 73 20 61 74 20 77 68 65 74 68 65   looks at whethe
7980: 72 20 73 75 62 74 65 72 6d 73 0a 2a 2a 20 61 70  r subterms.** ap
7990: 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 69 6e  propriate for in
79a0: 64 65 78 69 6e 67 20 65 78 69 73 74 2e 0a 2a 2a  dexing exist..**
79b0: 0a 2a 2a 20 41 6c 6c 20 65 78 61 6d 70 6c 65 73  .** All examples
79c0: 20 41 20 74 68 72 6f 75 67 68 20 45 20 61 62 6f   A through E abo
79d0: 76 65 20 73 61 74 69 73 66 79 20 63 61 73 65 20  ve satisfy case 
79e0: 32 2e 20 20 42 75 74 20 69 66 20 61 20 74 65 72  2.  But if a ter
79f0: 6d 0a 2a 2a 20 61 6c 73 6f 20 73 61 74 69 73 66  m.** also satisf
7a00: 69 65 73 20 63 61 73 65 20 31 20 28 73 75 63 68  ies case 1 (such
7a10: 20 61 73 20 42 29 20 77 65 20 6b 6e 6f 77 20 74   as B) we know t
7a20: 68 61 74 20 74 68 65 20 6f 70 74 69 6d 69 7a 65  hat the optimize
7a30: 72 20 77 69 6c 6c 0a 2a 2a 20 61 6c 77 61 79 73  r will.** always
7a40: 20 70 72 65 66 65 72 20 63 61 73 65 20 31 2c 20   prefer case 1, 
7a50: 73 6f 20 69 6e 20 74 68 61 74 20 63 61 73 65 20  so in that case 
7a60: 77 65 20 70 72 65 74 65 6e 64 20 74 68 61 74 20  we pretend that 
7a70: 63 61 73 65 20 32 20 69 73 20 6e 6f 74 0a 2a 2a  case 2 is not.**
7a80: 20 73 61 74 69 73 66 69 65 64 2e 0a 2a 2a 0a 2a   satisfied..**.*
7a90: 2a 20 49 74 20 6d 69 67 68 74 20 62 65 20 74 68  * It might be th
7aa0: 65 20 63 61 73 65 20 74 68 61 74 20 6d 75 6c 74  e case that mult
7ab0: 69 70 6c 65 20 74 61 62 6c 65 73 20 61 72 65 20  iple tables are 
7ac0: 69 6e 64 65 78 61 62 6c 65 2e 20 20 46 6f 72 20  indexable.  For 
7ad0: 65 78 61 6d 70 6c 65 2c 0a 2a 2a 20 28 45 29 20  example,.** (E) 
7ae0: 61 62 6f 76 65 20 69 73 20 69 6e 64 65 78 61 62  above is indexab
7af0: 6c 65 20 6f 6e 20 74 61 62 6c 65 73 20 50 2c 20  le on tables P, 
7b00: 51 2c 20 61 6e 64 20 52 2e 0a 2a 2a 0a 2a 2a 20  Q, and R..**.** 
7b10: 54 65 72 6d 73 20 74 68 61 74 20 73 61 74 69 73  Terms that satis
7b20: 66 79 20 63 61 73 65 20 32 20 61 72 65 20 63 61  fy case 2 are ca
7b30: 6e 64 69 64 61 74 65 73 20 66 6f 72 20 6c 6f 6f  ndidates for loo
7b40: 6b 75 70 20 62 79 20 75 73 69 6e 67 0a 2a 2a 20  kup by using.** 
7b50: 73 65 70 61 72 61 74 65 20 69 6e 64 69 63 65 73  separate indices
7b60: 20 74 6f 20 66 69 6e 64 20 72 6f 77 69 64 73 20   to find rowids 
7b70: 66 6f 72 20 65 61 63 68 20 73 75 62 74 65 72 6d  for each subterm
7b80: 20 61 6e 64 20 63 6f 6d 70 6f 73 69 6e 67 0a 2a   and composing.*
7b90: 2a 20 74 68 65 20 75 6e 69 6f 6e 20 6f 66 20 61  * the union of a
7ba0: 6c 6c 20 72 6f 77 69 64 73 20 75 73 69 6e 67 20  ll rowids using 
7bb0: 61 20 52 6f 77 53 65 74 20 6f 62 6a 65 63 74 2e  a RowSet object.
7bc0: 20 20 54 68 69 73 20 69 73 20 73 69 6d 69 6c 61    This is simila
7bd0: 72 0a 2a 2a 20 74 6f 20 22 62 69 74 6d 61 70 20  r.** to "bitmap 
7be0: 69 6e 64 69 63 65 73 22 20 69 6e 20 6f 74 68 65  indices" in othe
7bf0: 72 20 64 61 74 61 62 61 73 65 20 65 6e 67 69 6e  r database engin
7c00: 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 54 48 45 52 57  es..**.** OTHERW
7c10: 49 53 45 3a 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 65  ISE:.**.** If ne
7c20: 69 74 68 65 72 20 63 61 73 65 20 31 20 6e 6f 72  ither case 1 nor
7c30: 20 63 61 73 65 20 32 20 61 70 70 6c 79 2c 20 74   case 2 apply, t
7c40: 68 65 6e 20 6c 65 61 76 65 20 74 68 65 20 65 4f  hen leave the eO
7c50: 70 65 72 61 74 6f 72 20 73 65 74 20 74 6f 0a 2a  perator set to.*
7c60: 2a 20 7a 65 72 6f 2e 20 20 54 68 69 73 20 74 65  * zero.  This te
7c70: 72 6d 20 69 73 20 6e 6f 74 20 75 73 65 66 75 6c  rm is not useful
7c80: 20 66 6f 72 20 73 65 61 72 63 68 2e 0a 2a 2f 0a   for search..*/.
7c90: 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 72  static void expr
7ca0: 41 6e 61 6c 79 7a 65 4f 72 54 65 72 6d 28 0a 20  AnalyzeOrTerm(. 
7cb0: 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20   SrcList *pSrc, 
7cc0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68             /* th
7cd0: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f  e FROM clause */
7ce0: 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
7cf0: 70 57 43 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  pWC,         /* 
7d00: 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 57 48 45  the complete WHE
7d10: 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69  RE clause */.  i
7d20: 6e 74 20 69 64 78 54 65 72 6d 20 20 20 20 20 20  nt idxTerm      
7d30: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
7d40: 78 20 6f 66 20 74 68 65 20 4f 52 2d 74 65 72 6d  x of the OR-term
7d50: 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 20   to be analyzed 
7d60: 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 49 6e 66  */.){.  WhereInf
7d70: 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70 57 43 2d  o *pWInfo = pWC-
7d80: 3e 70 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20  >pWInfo;        
7d90: 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  /* WHERE clause 
7da0: 70 72 6f 63 65 73 73 69 6e 67 20 63 6f 6e 74 65  processing conte
7db0: 78 74 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70  xt */.  Parse *p
7dc0: 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e  Parse = pWInfo->
7dd0: 70 50 61 72 73 65 3b 20 20 20 20 20 20 20 20 20  pParse;         
7de0: 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78  /* Parser contex
7df0: 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  t */.  sqlite3 *
7e00: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
7e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7e20: 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
7e30: 63 74 69 6f 6e 20 2a 2f 0a 20 20 57 68 65 72 65  ction */.  Where
7e40: 54 65 72 6d 20 2a 70 54 65 72 6d 20 3d 20 26 70  Term *pTerm = &p
7e50: 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 20  WC->a[idxTerm]; 
7e60: 20 20 20 2f 2a 20 54 68 65 20 74 65 72 6d 20 74     /* The term t
7e70: 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f  o be analyzed */
7e80: 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d  .  Expr *pExpr =
7e90: 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 20 20   pTerm->pExpr;  
7ea0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
7eb0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 66 20  e expression of 
7ec0: 74 68 65 20 74 65 72 6d 20 2a 2f 0a 20 20 69 6e  the term */.  in
7ed0: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
7ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ef0: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
7f00: 75 6e 74 65 72 73 20 2a 2f 0a 20 20 57 68 65 72  unters */.  Wher
7f10: 65 43 6c 61 75 73 65 20 2a 70 4f 72 57 63 3b 20  eClause *pOrWc; 
7f20: 20 20 20 20 20 20 2f 2a 20 42 72 65 61 6b 75 70        /* Breakup
7f30: 20 6f 66 20 70 54 65 72 6d 20 69 6e 74 6f 20 73   of pTerm into s
7f40: 75 62 74 65 72 6d 73 20 2a 2f 0a 20 20 57 68 65  ubterms */.  Whe
7f50: 72 65 54 65 72 6d 20 2a 70 4f 72 54 65 72 6d 3b  reTerm *pOrTerm;
7f60: 20 20 20 20 20 20 20 2f 2a 20 41 20 53 75 62 2d         /* A Sub-
7f70: 74 65 72 6d 20 77 69 74 68 69 6e 20 74 68 65 20  term within the 
7f80: 70 4f 72 57 63 20 2a 2f 0a 20 20 57 68 65 72 65  pOrWc */.  Where
7f90: 4f 72 49 6e 66 6f 20 2a 70 4f 72 49 6e 66 6f 3b  OrInfo *pOrInfo;
7fa0: 20 20 20 20 20 2f 2a 20 41 64 64 69 74 69 6f 6e       /* Addition
7fb0: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  al information a
7fc0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70  ssociated with p
7fd0: 54 65 72 6d 20 2a 2f 0a 20 20 42 69 74 6d 61 73  Term */.  Bitmas
7fe0: 6b 20 63 68 6e 67 54 6f 49 4e 3b 20 20 20 20 20  k chngToIN;     
7ff0: 20 20 20 20 2f 2a 20 54 61 62 6c 65 73 20 74 68      /* Tables th
8000: 61 74 20 6d 69 67 68 74 20 73 61 74 69 73 66 79  at might satisfy
8010: 20 63 61 73 65 20 31 20 2a 2f 0a 20 20 42 69 74   case 1 */.  Bit
8020: 6d 61 73 6b 20 69 6e 64 65 78 61 62 6c 65 3b 20  mask indexable; 
8030: 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 73         /* Tables
8040: 20 74 68 61 74 20 61 72 65 20 69 6e 64 65 78 61   that are indexa
8050: 62 6c 65 2c 20 73 61 74 69 73 66 79 69 6e 67 20  ble, satisfying 
8060: 63 61 73 65 20 32 20 2a 2f 0a 0a 20 20 2f 2a 0a  case 2 */..  /*.
8070: 20 20 2a 2a 20 42 72 65 61 6b 20 74 68 65 20 4f    ** Break the O
8080: 52 20 63 6c 61 75 73 65 20 69 6e 74 6f 20 69 74  R clause into it
8090: 73 20 73 65 70 61 72 61 74 65 20 73 75 62 74 65  s separate subte
80a0: 72 6d 73 2e 20 20 54 68 65 20 73 75 62 74 65 72  rms.  The subter
80b0: 6d 73 20 61 72 65 0a 20 20 2a 2a 20 73 74 6f 72  ms are.  ** stor
80c0: 65 64 20 69 6e 20 61 20 57 68 65 72 65 43 6c 61  ed in a WhereCla
80d0: 75 73 65 20 73 74 72 75 63 74 75 72 65 20 63 6f  use structure co
80e0: 6e 74 61 69 6e 69 6e 67 20 77 69 74 68 69 6e 20  ntaining within 
80f0: 74 68 65 20 57 68 65 72 65 4f 72 49 6e 66 6f 0a  the WhereOrInfo.
8100: 20 20 2a 2a 20 6f 62 6a 65 63 74 20 74 68 61 74    ** object that
8110: 20 69 73 20 61 74 74 61 63 68 65 64 20 74 6f 20   is attached to 
8120: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 4f 52 20  the original OR 
8130: 63 6c 61 75 73 65 20 74 65 72 6d 2e 0a 20 20 2a  clause term..  *
8140: 2f 0a 20 20 61 73 73 65 72 74 28 20 28 70 54 65  /.  assert( (pTe
8150: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54  rm->wtFlags & (T
8160: 45 52 4d 5f 44 59 4e 41 4d 49 43 7c 54 45 52 4d  ERM_DYNAMIC|TERM
8170: 5f 4f 52 49 4e 46 4f 7c 54 45 52 4d 5f 41 4e 44  _ORINFO|TERM_AND
8180: 49 4e 46 4f 29 29 3d 3d 30 20 29 3b 0a 20 20 61  INFO))==0 );.  a
8190: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
81a0: 3d 3d 54 4b 5f 4f 52 20 29 3b 0a 20 20 70 54 65  ==TK_OR );.  pTe
81b0: 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 20 3d 20  rm->u.pOrInfo = 
81c0: 70 4f 72 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65  pOrInfo = sqlite
81d0: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
81e0: 2c 20 73 69 7a 65 6f 66 28 2a 70 4f 72 49 6e 66  , sizeof(*pOrInf
81f0: 6f 29 29 3b 0a 20 20 69 66 28 20 70 4f 72 49 6e  o));.  if( pOrIn
8200: 66 6f 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  fo==0 ) return;.
8210: 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73    pTerm->wtFlags
8220: 20 7c 3d 20 54 45 52 4d 5f 4f 52 49 4e 46 4f 3b   |= TERM_ORINFO;
8230: 0a 20 20 70 4f 72 57 63 20 3d 20 26 70 4f 72 49  .  pOrWc = &pOrI
8240: 6e 66 6f 2d 3e 77 63 3b 0a 20 20 77 68 65 72 65  nfo->wc;.  where
8250: 43 6c 61 75 73 65 49 6e 69 74 28 70 4f 72 57 63  ClauseInit(pOrWc
8260: 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 77 68 65  , pWInfo);.  whe
8270: 72 65 53 70 6c 69 74 28 70 4f 72 57 63 2c 20 70  reSplit(pOrWc, p
8280: 45 78 70 72 2c 20 54 4b 5f 4f 52 29 3b 0a 20 20  Expr, TK_OR);.  
8290: 65 78 70 72 41 6e 61 6c 79 7a 65 41 6c 6c 28 70  exprAnalyzeAll(p
82a0: 53 72 63 2c 20 70 4f 72 57 63 29 3b 0a 20 20 69  Src, pOrWc);.  i
82b0: 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
82c0: 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  led ) return;.  
82d0: 61 73 73 65 72 74 28 20 70 4f 72 57 63 2d 3e 6e  assert( pOrWc->n
82e0: 54 65 72 6d 3e 3d 32 20 29 3b 0a 0a 20 20 2f 2a  Term>=2 );..  /*
82f0: 0a 20 20 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68  .  ** Compute th
8300: 65 20 73 65 74 20 6f 66 20 74 61 62 6c 65 73 20  e set of tables 
8310: 74 68 61 74 20 6d 69 67 68 74 20 73 61 74 69 73  that might satis
8320: 66 79 20 63 61 73 65 73 20 31 20 6f 72 20 32 2e  fy cases 1 or 2.
8330: 0a 20 20 2a 2f 0a 20 20 69 6e 64 65 78 61 62 6c  .  */.  indexabl
8340: 65 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b  e = ~(Bitmask)0;
8350: 0a 20 20 63 68 6e 67 54 6f 49 4e 20 3d 20 7e 28  .  chngToIN = ~(
8360: 42 69 74 6d 61 73 6b 29 30 3b 0a 20 20 66 6f 72  Bitmask)0;.  for
8370: 28 69 3d 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d  (i=pOrWc->nTerm-
8380: 31 2c 20 70 4f 72 54 65 72 6d 3d 70 4f 72 57 63  1, pOrTerm=pOrWc
8390: 2d 3e 61 3b 20 69 3e 3d 30 20 26 26 20 69 6e 64  ->a; i>=0 && ind
83a0: 65 78 61 62 6c 65 3b 20 69 2d 2d 2c 20 70 4f 72  exable; i--, pOr
83b0: 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28  Term++){.    if(
83c0: 20 28 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72   (pOrTerm->eOper
83d0: 61 74 6f 72 20 26 20 57 4f 5f 53 49 4e 47 4c 45  ator & WO_SINGLE
83e0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 57 68  )==0 ){.      Wh
83f0: 65 72 65 41 6e 64 49 6e 66 6f 20 2a 70 41 6e 64  ereAndInfo *pAnd
8400: 49 6e 66 6f 3b 0a 20 20 20 20 20 20 61 73 73 65  Info;.      asse
8410: 72 74 28 20 28 70 4f 72 54 65 72 6d 2d 3e 77 74  rt( (pOrTerm->wt
8420: 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 41 4e  Flags & (TERM_AN
8430: 44 49 4e 46 4f 7c 54 45 52 4d 5f 4f 52 49 4e 46  DINFO|TERM_ORINF
8440: 4f 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  O))==0 );.      
8450: 63 68 6e 67 54 6f 49 4e 20 3d 20 30 3b 0a 20 20  chngToIN = 0;.  
8460: 20 20 20 20 70 41 6e 64 49 6e 66 6f 20 3d 20 73      pAndInfo = s
8470: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
8480: 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 41  w(db, sizeof(*pA
8490: 6e 64 49 6e 66 6f 29 29 3b 0a 20 20 20 20 20 20  ndInfo));.      
84a0: 69 66 28 20 70 41 6e 64 49 6e 66 6f 20 29 7b 0a  if( pAndInfo ){.
84b0: 20 20 20 20 20 20 20 20 57 68 65 72 65 43 6c 61          WhereCla
84c0: 75 73 65 20 2a 70 41 6e 64 57 43 3b 0a 20 20 20  use *pAndWC;.   
84d0: 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a       WhereTerm *
84e0: 70 41 6e 64 54 65 72 6d 3b 0a 20 20 20 20 20 20  pAndTerm;.      
84f0: 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20    int j;.       
8500: 20 42 69 74 6d 61 73 6b 20 62 20 3d 20 30 3b 0a   Bitmask b = 0;.
8510: 20 20 20 20 20 20 20 20 70 4f 72 54 65 72 6d 2d          pOrTerm-
8520: 3e 75 2e 70 41 6e 64 49 6e 66 6f 20 3d 20 70 41  >u.pAndInfo = pA
8530: 6e 64 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20  ndInfo;.        
8540: 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  pOrTerm->wtFlags
8550: 20 7c 3d 20 54 45 52 4d 5f 41 4e 44 49 4e 46 4f   |= TERM_ANDINFO
8560: 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 54 65 72  ;.        pOrTer
8570: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 57  m->eOperator = W
8580: 4f 5f 41 4e 44 3b 0a 20 20 20 20 20 20 20 20 70  O_AND;.        p
8590: 41 6e 64 57 43 20 3d 20 26 70 41 6e 64 49 6e 66  AndWC = &pAndInf
85a0: 6f 2d 3e 77 63 3b 0a 20 20 20 20 20 20 20 20 77  o->wc;.        w
85b0: 68 65 72 65 43 6c 61 75 73 65 49 6e 69 74 28 70  hereClauseInit(p
85c0: 41 6e 64 57 43 2c 20 70 57 43 2d 3e 70 57 49 6e  AndWC, pWC->pWIn
85d0: 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 77 68 65  fo);.        whe
85e0: 72 65 53 70 6c 69 74 28 70 41 6e 64 57 43 2c 20  reSplit(pAndWC, 
85f0: 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20  pOrTerm->pExpr, 
8600: 54 4b 5f 41 4e 44 29 3b 0a 20 20 20 20 20 20 20  TK_AND);.       
8610: 20 65 78 70 72 41 6e 61 6c 79 7a 65 41 6c 6c 28   exprAnalyzeAll(
8620: 70 53 72 63 2c 20 70 41 6e 64 57 43 29 3b 0a 20  pSrc, pAndWC);. 
8630: 20 20 20 20 20 20 20 70 41 6e 64 57 43 2d 3e 70         pAndWC->p
8640: 4f 75 74 65 72 20 3d 20 70 57 43 3b 0a 20 20 20  Outer = pWC;.   
8650: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 64       testcase( d
8660: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
8670: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  );.        if( !
8680: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
8690: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6f   ){.          fo
86a0: 72 28 6a 3d 30 2c 20 70 41 6e 64 54 65 72 6d 3d  r(j=0, pAndTerm=
86b0: 70 41 6e 64 57 43 2d 3e 61 3b 20 6a 3c 70 41 6e  pAndWC->a; j<pAn
86c0: 64 57 43 2d 3e 6e 54 65 72 6d 3b 20 6a 2b 2b 2c  dWC->nTerm; j++,
86d0: 20 70 41 6e 64 54 65 72 6d 2b 2b 29 7b 0a 20 20   pAndTerm++){.  
86e0: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
86f0: 28 20 70 41 6e 64 54 65 72 6d 2d 3e 70 45 78 70  ( pAndTerm->pExp
8700: 72 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  r );.           
8710: 20 69 66 28 20 61 6c 6c 6f 77 65 64 4f 70 28 70   if( allowedOp(p
8720: 41 6e 64 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e  AndTerm->pExpr->
8730: 6f 70 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  op) ){.         
8740: 20 20 20 20 20 62 20 7c 3d 20 67 65 74 4d 61 73       b |= getMas
8750: 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b  k(&pWInfo->sMask
8760: 53 65 74 2c 20 70 41 6e 64 54 65 72 6d 2d 3e 6c  Set, pAndTerm->l
8770: 65 66 74 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  eftCursor);.    
8780: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
8790: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
87a0: 20 20 20 20 20 20 20 20 69 6e 64 65 78 61 62 6c          indexabl
87b0: 65 20 26 3d 20 62 3b 0a 20 20 20 20 20 20 7d 0a  e &= b;.      }.
87c0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f      }else if( pO
87d0: 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  rTerm->wtFlags &
87e0: 20 54 45 52 4d 5f 43 4f 50 49 45 44 20 29 7b 0a   TERM_COPIED ){.
87f0: 20 20 20 20 20 20 2f 2a 20 53 6b 69 70 20 74 68        /* Skip th
8800: 69 73 20 74 65 72 6d 20 66 6f 72 20 6e 6f 77 2e  is term for now.
8810: 20 20 57 65 20 72 65 76 69 73 69 74 20 69 74 20    We revisit it 
8820: 77 68 65 6e 20 77 65 20 70 72 6f 63 65 73 73 20  when we process 
8830: 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f 72  the.      ** cor
8840: 72 65 73 70 6f 6e 64 69 6e 67 20 54 45 52 4d 5f  responding TERM_
8850: 56 49 52 54 55 41 4c 20 74 65 72 6d 20 2a 2f 0a  VIRTUAL term */.
8860: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
8870: 20 42 69 74 6d 61 73 6b 20 62 3b 0a 20 20 20 20   Bitmask b;.    
8880: 20 20 62 20 3d 20 67 65 74 4d 61 73 6b 28 26 70    b = getMask(&p
8890: 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c  WInfo->sMaskSet,
88a0: 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75   pOrTerm->leftCu
88b0: 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 69 66 28  rsor);.      if(
88c0: 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67   pOrTerm->wtFlag
88d0: 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  s & TERM_VIRTUAL
88e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 57 68 65 72   ){.        Wher
88f0: 65 54 65 72 6d 20 2a 70 4f 74 68 65 72 20 3d 20  eTerm *pOther = 
8900: 26 70 4f 72 57 63 2d 3e 61 5b 70 4f 72 54 65 72  &pOrWc->a[pOrTer
8910: 6d 2d 3e 69 50 61 72 65 6e 74 5d 3b 0a 20 20 20  m->iParent];.   
8920: 20 20 20 20 20 62 20 7c 3d 20 67 65 74 4d 61 73       b |= getMas
8930: 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b  k(&pWInfo->sMask
8940: 53 65 74 2c 20 70 4f 74 68 65 72 2d 3e 6c 65 66  Set, pOther->lef
8950: 74 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20  tCursor);.      
8960: 7d 0a 20 20 20 20 20 20 69 6e 64 65 78 61 62 6c  }.      indexabl
8970: 65 20 26 3d 20 62 3b 0a 20 20 20 20 20 20 69 66  e &= b;.      if
8980: 28 20 28 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65  ( (pOrTerm->eOpe
8990: 72 61 74 6f 72 20 26 20 57 4f 5f 45 51 29 3d 3d  rator & WO_EQ)==
89a0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 6e  0 ){.        chn
89b0: 67 54 6f 49 4e 20 3d 20 30 3b 0a 20 20 20 20 20  gToIN = 0;.     
89c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
89d0: 63 68 6e 67 54 6f 49 4e 20 26 3d 20 62 3b 0a 20  chngToIN &= b;. 
89e0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
89f0: 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 52 65 63 6f  ..  /*.  ** Reco
8a00: 72 64 20 74 68 65 20 73 65 74 20 6f 66 20 74 61  rd the set of ta
8a10: 62 6c 65 73 20 74 68 61 74 20 73 61 74 69 73 66  bles that satisf
8a20: 79 20 63 61 73 65 20 33 2e 20 20 54 68 65 20 73  y case 3.  The s
8a30: 65 74 20 6d 69 67 68 74 20 62 65 0a 20 20 2a 2a  et might be.  **
8a40: 20 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20 20 70   empty..  */.  p
8a50: 4f 72 49 6e 66 6f 2d 3e 69 6e 64 65 78 61 62 6c  OrInfo->indexabl
8a60: 65 20 3d 20 69 6e 64 65 78 61 62 6c 65 3b 0a 20  e = indexable;. 
8a70: 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
8a80: 72 20 3d 20 69 6e 64 65 78 61 62 6c 65 3d 3d 30  r = indexable==0
8a90: 20 3f 20 30 20 3a 20 57 4f 5f 4f 52 3b 0a 0a 20   ? 0 : WO_OR;.. 
8aa0: 20 2f 2a 20 46 6f 72 20 61 20 74 77 6f 2d 77 61   /* For a two-wa
8ab0: 79 20 4f 52 2c 20 61 74 74 65 6d 70 74 20 74 6f  y OR, attempt to
8ac0: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
8ad0: 63 61 73 65 20 32 2e 0a 20 20 2a 2f 0a 20 20 69  case 2..  */.  i
8ae0: 66 28 20 69 6e 64 65 78 61 62 6c 65 20 26 26 20  f( indexable && 
8af0: 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 3d 3d 32 20  pOrWc->nTerm==2 
8b00: 29 7b 0a 20 20 20 20 69 6e 74 20 69 4f 6e 65 20  ){.    int iOne 
8b10: 3d 20 30 3b 0a 20 20 20 20 57 68 65 72 65 54 65  = 0;.    WhereTe
8b20: 72 6d 20 2a 70 4f 6e 65 3b 0a 20 20 20 20 77 68  rm *pOne;.    wh
8b30: 69 6c 65 28 20 28 70 4f 6e 65 20 3d 20 77 68 65  ile( (pOne = whe
8b40: 72 65 4e 74 68 53 75 62 74 65 72 6d 28 26 70 4f  reNthSubterm(&pO
8b50: 72 57 63 2d 3e 61 5b 30 5d 2c 69 4f 6e 65 2b 2b  rWc->a[0],iOne++
8b60: 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ))!=0 ){.      i
8b70: 6e 74 20 69 54 77 6f 20 3d 20 30 3b 0a 20 20 20  nt iTwo = 0;.   
8b80: 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54     WhereTerm *pT
8b90: 77 6f 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  wo;.      while(
8ba0: 20 28 70 54 77 6f 20 3d 20 77 68 65 72 65 4e 74   (pTwo = whereNt
8bb0: 68 53 75 62 74 65 72 6d 28 26 70 4f 72 57 63 2d  hSubterm(&pOrWc-
8bc0: 3e 61 5b 31 5d 2c 69 54 77 6f 2b 2b 29 29 21 3d  >a[1],iTwo++))!=
8bd0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68 65  0 ){.        whe
8be0: 72 65 43 6f 6d 62 69 6e 65 44 69 73 6a 75 6e 63  reCombineDisjunc
8bf0: 74 73 28 70 53 72 63 2c 20 70 57 43 2c 20 70 4f  ts(pSrc, pWC, pO
8c00: 6e 65 2c 20 70 54 77 6f 29 3b 0a 20 20 20 20 20  ne, pTwo);.     
8c10: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
8c20: 2f 2a 0a 20 20 2a 2a 20 63 68 6e 67 54 6f 49 4e  /*.  ** chngToIN
8c30: 20 68 6f 6c 64 73 20 61 20 73 65 74 20 6f 66 20   holds a set of 
8c40: 74 61 62 6c 65 73 20 74 68 61 74 20 2a 6d 69 67  tables that *mig
8c50: 68 74 2a 20 73 61 74 69 73 66 79 20 63 61 73 65  ht* satisfy case
8c60: 20 31 2e 20 20 42 75 74 0a 20 20 2a 2a 20 77 65   1.  But.  ** we
8c70: 20 68 61 76 65 20 74 6f 20 64 6f 20 73 6f 6d 65   have to do some
8c80: 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 68 65 63   additional chec
8c90: 6b 69 6e 67 20 74 6f 20 73 65 65 20 69 66 20 63  king to see if c
8ca0: 61 73 65 20 31 20 72 65 61 6c 6c 79 0a 20 20 2a  ase 1 really.  *
8cb0: 2a 20 69 73 20 73 61 74 69 73 66 69 65 64 2e 0a  * is satisfied..
8cc0: 20 20 2a 2a 0a 20 20 2a 2a 20 63 68 6e 67 54 6f    **.  ** chngTo
8cd0: 49 4e 20 77 69 6c 6c 20 68 6f 6c 64 20 65 69 74  IN will hold eit
8ce0: 68 65 72 20 30 2c 20 31 2c 20 6f 72 20 32 20 62  her 0, 1, or 2 b
8cf0: 69 74 73 2e 20 20 54 68 65 20 30 2d 62 69 74 20  its.  The 0-bit 
8d00: 63 61 73 65 20 6d 65 61 6e 73 0a 20 20 2a 2a 20  case means.  ** 
8d10: 74 68 61 74 20 74 68 65 72 65 20 69 73 20 6e 6f  that there is no
8d20: 20 70 6f 73 73 69 62 69 6c 69 74 79 20 6f 66 20   possibility of 
8d30: 74 72 61 6e 73 66 6f 72 6d 69 6e 67 20 74 68 65  transforming the
8d40: 20 4f 52 20 63 6c 61 75 73 65 20 69 6e 74 6f 20   OR clause into 
8d50: 61 6e 0a 20 20 2a 2a 20 49 4e 20 6f 70 65 72 61  an.  ** IN opera
8d60: 74 6f 72 20 62 65 63 61 75 73 65 20 6f 6e 65 20  tor because one 
8d70: 6f 72 20 6d 6f 72 65 20 74 65 72 6d 73 20 69 6e  or more terms in
8d80: 20 74 68 65 20 4f 52 20 63 6c 61 75 73 65 20 63   the OR clause c
8d90: 6f 6e 74 61 69 6e 0a 20 20 2a 2a 20 73 6f 6d 65  ontain.  ** some
8da0: 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e  thing other than
8db0: 20 3d 3d 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20   == on a column 
8dc0: 69 6e 20 74 68 65 20 73 69 6e 67 6c 65 20 74 61  in the single ta
8dd0: 62 6c 65 2e 20 20 54 68 65 20 31 2d 62 69 74 0a  ble.  The 1-bit.
8de0: 20 20 2a 2a 20 63 61 73 65 20 6d 65 61 6e 73 20    ** case means 
8df0: 74 68 61 74 20 65 76 65 72 79 20 74 65 72 6d 20  that every term 
8e00: 6f 66 20 74 68 65 20 4f 52 20 63 6c 61 75 73 65  of the OR clause
8e10: 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a   is of the form.
8e20: 20 20 2a 2a 20 22 74 61 62 6c 65 2e 63 6f 6c 75    ** "table.colu
8e30: 6d 6e 3d 65 78 70 72 22 20 66 6f 72 20 73 6f 6d  mn=expr" for som
8e40: 65 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 2e 20  e single table. 
8e50: 20 54 68 65 20 6f 6e 65 20 62 69 74 20 74 68 61   The one bit tha
8e60: 74 20 69 73 20 73 65 74 0a 20 20 2a 2a 20 77 69  t is set.  ** wi
8e70: 6c 6c 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f  ll correspond to
8e80: 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 74 61 62 6c   the common tabl
8e90: 65 2e 20 20 57 65 20 73 74 69 6c 6c 20 6e 65 65  e.  We still nee
8ea0: 64 20 74 6f 20 63 68 65 63 6b 20 74 6f 20 6d 61  d to check to ma
8eb0: 6b 65 0a 20 20 2a 2a 20 73 75 72 65 20 74 68 65  ke.  ** sure the
8ec0: 20 73 61 6d 65 20 63 6f 6c 75 6d 6e 20 69 73 20   same column is 
8ed0: 75 73 65 64 20 6f 6e 20 61 6c 6c 20 74 65 72 6d  used on all term
8ee0: 73 2e 20 20 54 68 65 20 32 2d 62 69 74 20 63 61  s.  The 2-bit ca
8ef0: 73 65 20 69 73 20 77 68 65 6e 0a 20 20 2a 2a 20  se is when.  ** 
8f00: 74 68 65 20 61 6c 6c 20 74 65 72 6d 73 20 61 72  the all terms ar
8f10: 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 74  e of the form "t
8f20: 61 62 6c 65 31 2e 63 6f 6c 75 6d 6e 3d 74 61 62  able1.column=tab
8f30: 6c 65 32 2e 63 6f 6c 75 6d 6e 22 2e 20 20 49 74  le2.column".  It
8f40: 0a 20 20 2a 2a 20 6d 69 67 68 74 20 62 65 20 70  .  ** might be p
8f50: 6f 73 73 69 62 6c 65 20 74 6f 20 66 6f 72 6d 20  ossible to form 
8f60: 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 77  an IN operator w
8f70: 69 74 68 20 65 69 74 68 65 72 20 74 61 62 6c 65  ith either table
8f80: 31 2e 63 6f 6c 75 6d 6e 0a 20 20 2a 2a 20 6f 72  1.column.  ** or
8f90: 20 74 61 62 6c 65 32 2e 63 6f 6c 75 6d 6e 20 61   table2.column a
8fa0: 73 20 74 68 65 20 4c 48 53 20 69 66 20 65 69 74  s the LHS if eit
8fb0: 68 65 72 20 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f  her is common to
8fc0: 20 65 76 65 72 79 20 74 65 72 6d 20 6f 66 0a 20   every term of. 
8fd0: 20 2a 2a 20 74 68 65 20 4f 52 20 63 6c 61 75 73   ** the OR claus
8fe0: 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74  e..  **.  ** Not
8ff0: 65 20 74 68 61 74 20 74 65 72 6d 73 20 6f 66 20  e that terms of 
9000: 74 68 65 20 66 6f 72 6d 20 22 74 61 62 6c 65 2e  the form "table.
9010: 63 6f 6c 75 6d 6e 31 3d 74 61 62 6c 65 2e 63 6f  column1=table.co
9020: 6c 75 6d 6e 32 22 20 28 74 68 65 0a 20 20 2a 2a  lumn2" (the.  **
9030: 20 73 61 6d 65 20 74 61 62 6c 65 20 6f 6e 20 62   same table on b
9040: 6f 74 68 20 73 69 7a 65 73 20 6f 66 20 74 68 65  oth sizes of the
9050: 20 3d 3d 29 20 63 61 6e 6e 6f 74 20 62 65 20 6f   ==) cannot be o
9060: 70 74 69 6d 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20  ptimized..  */. 
9070: 20 69 66 28 20 63 68 6e 67 54 6f 49 4e 20 29 7b   if( chngToIN ){
9080: 0a 20 20 20 20 69 6e 74 20 6f 6b 54 6f 43 68 6e  .    int okToChn
9090: 67 54 6f 49 4e 20 3d 20 30 3b 20 20 20 20 20 2f  gToIN = 0;     /
90a0: 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 63 6f  * True if the co
90b0: 6e 76 65 72 73 69 6f 6e 20 74 6f 20 49 4e 20 69  nversion to IN i
90c0: 73 20 76 61 6c 69 64 20 2a 2f 0a 20 20 20 20 69  s valid */.    i
90d0: 6e 74 20 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b  nt iColumn = -1;
90e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75           /* Colu
90f0: 6d 6e 20 69 6e 64 65 78 20 6f 6e 20 6c 68 73 20  mn index on lhs 
9100: 6f 66 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a  of IN operator *
9110: 2f 0a 20 20 20 20 69 6e 74 20 69 43 75 72 73 6f  /.    int iCurso
9120: 72 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20  r = -1;         
9130: 2f 2a 20 54 61 62 6c 65 20 63 75 72 73 6f 72 20  /* Table cursor 
9140: 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 74 65  common to all te
9150: 72 6d 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6a  rms */.    int j
9160: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
9170: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
9180: 6e 74 65 72 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  nter */..    /* 
9190: 53 65 61 72 63 68 20 66 6f 72 20 61 20 74 61 62  Search for a tab
91a0: 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 74 68  le and column th
91b0: 61 74 20 61 70 70 65 61 72 73 20 6f 6e 20 6f 6e  at appears on on
91c0: 65 20 73 69 64 65 20 6f 72 20 74 68 65 0a 20 20  e side or the.  
91d0: 20 20 2a 2a 20 6f 74 68 65 72 20 6f 66 20 74 68    ** other of th
91e0: 65 20 3d 3d 20 6f 70 65 72 61 74 6f 72 20 69 6e  e == operator in
91f0: 20 65 76 65 72 79 20 73 75 62 74 65 72 6d 2e 20   every subterm. 
9200: 20 54 68 61 74 20 74 61 62 6c 65 20 61 6e 64 20   That table and 
9210: 63 6f 6c 75 6d 6e 0a 20 20 20 20 2a 2a 20 77 69  column.    ** wi
9220: 6c 6c 20 62 65 20 72 65 63 6f 72 64 65 64 20 69  ll be recorded i
9230: 6e 20 69 43 75 72 73 6f 72 20 61 6e 64 20 69 43  n iCursor and iC
9240: 6f 6c 75 6d 6e 2e 20 20 54 68 65 72 65 20 6d 69  olumn.  There mi
9250: 67 68 74 20 6e 6f 74 20 62 65 20 61 6e 79 0a 20  ght not be any. 
9260: 20 20 20 2a 2a 20 73 75 63 68 20 74 61 62 6c 65     ** such table
9270: 20 61 6e 64 20 63 6f 6c 75 6d 6e 2e 20 20 53 65   and column.  Se
9280: 74 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 69  t okToChngToIN i
9290: 66 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65  f an appropriate
92a0: 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20 61 6e   table.    ** an
92b0: 64 20 63 6f 6c 75 6d 6e 20 69 73 20 66 6f 75 6e  d column is foun
92c0: 64 20 62 75 74 20 6c 65 61 76 65 20 6f 6b 54 6f  d but leave okTo
92d0: 43 68 6e 67 54 6f 49 4e 20 66 61 6c 73 65 20 69  ChngToIN false i
92e0: 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20 20 20  f not found..   
92f0: 20 2a 2f 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b   */.    for(j=0;
9300: 20 6a 3c 32 20 26 26 20 21 6f 6b 54 6f 43 68 6e   j<2 && !okToChn
9310: 67 54 6f 49 4e 3b 20 6a 2b 2b 29 7b 0a 20 20 20  gToIN; j++){.   
9320: 20 20 20 70 4f 72 54 65 72 6d 20 3d 20 70 4f 72     pOrTerm = pOr
9330: 57 63 2d 3e 61 3b 0a 20 20 20 20 20 20 66 6f 72  Wc->a;.      for
9340: 28 69 3d 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d  (i=pOrWc->nTerm-
9350: 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 4f  1; i>=0; i--, pO
9360: 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  rTerm++){.      
9370: 20 20 61 73 73 65 72 74 28 20 70 4f 72 54 65 72    assert( pOrTer
9380: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
9390: 4f 5f 45 51 20 29 3b 0a 20 20 20 20 20 20 20 20  O_EQ );.        
93a0: 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  pOrTerm->wtFlags
93b0: 20 26 3d 20 7e 54 45 52 4d 5f 4f 52 5f 4f 4b 3b   &= ~TERM_OR_OK;
93c0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 72  .        if( pOr
93d0: 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
93e0: 3d 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20 20 20  ==iCursor ){.   
93f0: 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 69         /* This i
9400: 73 20 74 68 65 20 32 2d 62 69 74 20 63 61 73 65  s the 2-bit case
9410: 20 61 6e 64 20 77 65 20 61 72 65 20 6f 6e 20 74   and we are on t
9420: 68 65 20 73 65 63 6f 6e 64 20 69 74 65 72 61 74  he second iterat
9430: 69 6f 6e 20 61 6e 64 0a 20 20 20 20 20 20 20 20  ion and.        
9440: 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 74 65 72    ** current ter
9450: 6d 20 69 73 20 66 72 6f 6d 20 74 68 65 20 66 69  m is from the fi
9460: 72 73 74 20 69 74 65 72 61 74 69 6f 6e 2e 20 20  rst iteration.  
9470: 53 6f 20 73 6b 69 70 20 74 68 69 73 20 74 65 72  So skip this ter
9480: 6d 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  m. */.          
9490: 61 73 73 65 72 74 28 20 6a 3d 3d 31 20 29 3b 0a  assert( j==1 );.
94a0: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
94b0: 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ue;.        }.  
94c0: 20 20 20 20 20 20 69 66 28 20 28 63 68 6e 67 54        if( (chngT
94d0: 6f 49 4e 20 26 20 67 65 74 4d 61 73 6b 28 26 70  oIN & getMask(&p
94e0: 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c  WInfo->sMaskSet,
94f0: 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75   pOrTerm->leftCu
9500: 72 73 6f 72 29 29 3d 3d 30 20 29 7b 0a 20 20 20  rsor))==0 ){.   
9510: 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 74         /* This t
9520: 65 72 6d 20 6d 75 73 74 20 62 65 20 6f 66 20 74  erm must be of t
9530: 68 65 20 66 6f 72 6d 20 74 31 2e 61 3d 3d 74 32  he form t1.a==t2
9540: 2e 62 20 77 68 65 72 65 20 74 32 20 69 73 20 69  .b where t2 is i
9550: 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20  n the.          
9560: 2a 2a 20 63 68 6e 67 54 6f 49 4e 20 73 65 74 20  ** chngToIN set 
9570: 62 75 74 20 74 31 20 69 73 20 6e 6f 74 2e 20 20  but t1 is not.  
9580: 54 68 69 73 20 74 65 72 6d 20 77 69 6c 6c 20 62  This term will b
9590: 65 20 65 69 74 68 65 72 20 70 72 65 63 65 64 65  e either precede
95a0: 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f  d.          ** o
95b0: 72 20 66 6f 6c 6c 77 65 64 20 62 79 20 61 6e 20  r follwed by an 
95c0: 69 6e 76 65 72 74 65 64 20 63 6f 70 79 20 28 74  inverted copy (t
95d0: 32 2e 62 3d 3d 74 31 2e 61 29 2e 20 20 53 6b 69  2.b==t1.a).  Ski
95e0: 70 20 74 68 69 73 20 74 65 72 6d 20 0a 20 20 20  p this term .   
95f0: 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 75 73         ** and us
9600: 65 20 69 74 73 20 69 6e 76 65 72 73 69 6f 6e 2e  e its inversion.
9610: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65   */.          te
9620: 73 74 63 61 73 65 28 20 70 4f 72 54 65 72 6d 2d  stcase( pOrTerm-
9630: 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
9640: 43 4f 50 49 45 44 20 29 3b 0a 20 20 20 20 20 20  COPIED );.      
9650: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4f      testcase( pO
9660: 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  rTerm->wtFlags &
9670: 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b   TERM_VIRTUAL );
9680: 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
9690: 74 28 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c  t( pOrTerm->wtFl
96a0: 61 67 73 20 26 20 28 54 45 52 4d 5f 43 4f 50 49  ags & (TERM_COPI
96b0: 45 44 7c 54 45 52 4d 5f 56 49 52 54 55 41 4c 29  ED|TERM_VIRTUAL)
96c0: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f   );.          co
96d0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
96e0: 7d 0a 20 20 20 20 20 20 20 20 69 43 6f 6c 75 6d  }.        iColum
96f0: 6e 20 3d 20 70 4f 72 54 65 72 6d 2d 3e 75 2e 6c  n = pOrTerm->u.l
9700: 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  eftColumn;.     
9710: 20 20 20 69 43 75 72 73 6f 72 20 3d 20 70 4f 72     iCursor = pOr
9720: 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
9730: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
9740: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
9750: 66 28 20 69 3c 30 20 29 7b 0a 20 20 20 20 20 20  f( i<0 ){.      
9760: 20 20 2f 2a 20 4e 6f 20 63 61 6e 64 69 64 61 74    /* No candidat
9770: 65 20 74 61 62 6c 65 2b 63 6f 6c 75 6d 6e 20 77  e table+column w
9780: 61 73 20 66 6f 75 6e 64 2e 20 20 54 68 69 73 20  as found.  This 
9790: 63 61 6e 20 6f 6e 6c 79 20 6f 63 63 75 72 0a 20  can only occur. 
97a0: 20 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65         ** on the
97b0: 20 73 65 63 6f 6e 64 20 69 74 65 72 61 74 69 6f   second iteratio
97c0: 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73  n */.        ass
97d0: 65 72 74 28 20 6a 3d 3d 31 20 29 3b 0a 20 20 20  ert( j==1 );.   
97e0: 20 20 20 20 20 61 73 73 65 72 74 28 20 49 73 50       assert( IsP
97f0: 6f 77 65 72 4f 66 54 77 6f 28 63 68 6e 67 54 6f  owerOfTwo(chngTo
9800: 49 4e 29 20 29 3b 0a 20 20 20 20 20 20 20 20 61  IN) );.        a
9810: 73 73 65 72 74 28 20 63 68 6e 67 54 6f 49 4e 3d  ssert( chngToIN=
9820: 3d 67 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f  =getMask(&pWInfo
9830: 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 69 43 75 72  ->sMaskSet, iCur
9840: 73 6f 72 29 20 29 3b 0a 20 20 20 20 20 20 20 20  sor) );.        
9850: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
9860: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
9870: 3d 3d 31 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  ==1 );..      /*
9880: 20 57 65 20 68 61 76 65 20 66 6f 75 6e 64 20 61   We have found a
9890: 20 63 61 6e 64 69 64 61 74 65 20 74 61 62 6c 65   candidate table
98a0: 20 61 6e 64 20 63 6f 6c 75 6d 6e 2e 20 20 43 68   and column.  Ch
98b0: 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68  eck to see if th
98c0: 61 74 0a 20 20 20 20 20 20 2a 2a 20 74 61 62 6c  at.      ** tabl
98d0: 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 69 73 20  e and column is 
98e0: 63 6f 6d 6d 6f 6e 20 74 6f 20 65 76 65 72 79 20  common to every 
98f0: 74 65 72 6d 20 69 6e 20 74 68 65 20 4f 52 20 63  term in the OR c
9900: 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 6f  lause */.      o
9910: 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 3d 20 31 3b  kToChngToIN = 1;
9920: 0a 20 20 20 20 20 20 66 6f 72 28 3b 20 69 3e 3d  .      for(; i>=
9930: 30 20 26 26 20 6f 6b 54 6f 43 68 6e 67 54 6f 49  0 && okToChngToI
9940: 4e 3b 20 69 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b  N; i--, pOrTerm+
9950: 2b 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  +){.        asse
9960: 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70  rt( pOrTerm->eOp
9970: 65 72 61 74 6f 72 20 26 20 57 4f 5f 45 51 20 29  erator & WO_EQ )
9980: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f  ;.        if( pO
9990: 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  rTerm->leftCurso
99a0: 72 21 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20 20  r!=iCursor ){.  
99b0: 20 20 20 20 20 20 20 20 70 4f 72 54 65 72 6d 2d          pOrTerm-
99c0: 3e 77 74 46 6c 61 67 73 20 26 3d 20 7e 54 45 52  >wtFlags &= ~TER
99d0: 4d 5f 4f 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  M_OR_OK;.       
99e0: 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 72 54 65   }else if( pOrTe
99f0: 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e  rm->u.leftColumn
9a00: 21 3d 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20  !=iColumn ){.   
9a10: 20 20 20 20 20 20 20 6f 6b 54 6f 43 68 6e 67 54         okToChngT
9a20: 6f 49 4e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  oIN = 0;.       
9a30: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
9a40: 20 20 69 6e 74 20 61 66 66 4c 65 66 74 2c 20 61    int affLeft, a
9a50: 66 66 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20  ffRight;.       
9a60: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 72 69 67     /* If the rig
9a70: 68 74 2d 68 61 6e 64 20 73 69 64 65 20 69 73 20  ht-hand side is 
9a80: 61 6c 73 6f 20 61 20 63 6f 6c 75 6d 6e 2c 20 74  also a column, t
9a90: 68 65 6e 20 74 68 65 20 61 66 66 69 6e 69 74 69  hen the affiniti
9aa0: 65 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  es.          ** 
9ab0: 6f 66 20 62 6f 74 68 20 72 69 67 68 74 20 61 6e  of both right an
9ac0: 64 20 6c 65 66 74 20 73 69 64 65 73 20 6d 75 73  d left sides mus
9ad0: 74 20 62 65 20 73 75 63 68 20 74 68 61 74 20 6e  t be such that n
9ae0: 6f 20 74 79 70 65 0a 20 20 20 20 20 20 20 20 20  o type.         
9af0: 20 2a 2a 20 63 6f 6e 76 65 72 73 69 6f 6e 73 20   ** conversions 
9b00: 61 72 65 20 72 65 71 75 69 72 65 64 20 6f 6e 20  are required on 
9b10: 74 68 65 20 72 69 67 68 74 2e 20 20 28 54 69 63  the right.  (Tic
9b20: 6b 65 74 20 23 32 32 34 39 29 0a 20 20 20 20 20  ket #2249).     
9b30: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
9b40: 20 20 61 66 66 52 69 67 68 74 20 3d 20 73 71 6c    affRight = sql
9b50: 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79  ite3ExprAffinity
9b60: 28 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72 2d  (pOrTerm->pExpr-
9b70: 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20  >pRight);.      
9b80: 20 20 20 20 61 66 66 4c 65 66 74 20 3d 20 73 71      affLeft = sq
9b90: 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74  lite3ExprAffinit
9ba0: 79 28 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72  y(pOrTerm->pExpr
9bb0: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20  ->pLeft);.      
9bc0: 20 20 20 20 69 66 28 20 61 66 66 52 69 67 68 74      if( affRight
9bd0: 21 3d 30 20 26 26 20 61 66 66 52 69 67 68 74 21  !=0 && affRight!
9be0: 3d 61 66 66 4c 65 66 74 20 29 7b 0a 20 20 20 20  =affLeft ){.    
9bf0: 20 20 20 20 20 20 20 20 6f 6b 54 6f 43 68 6e 67          okToChng
9c00: 54 6f 49 4e 20 3d 20 30 3b 0a 20 20 20 20 20 20  ToIN = 0;.      
9c10: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
9c20: 20 20 20 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e         pOrTerm->
9c30: 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f  wtFlags |= TERM_
9c40: 4f 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20  OR_OK;.         
9c50: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
9c60: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
9c70: 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  /* At this point
9c80: 2c 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 69  , okToChngToIN i
9c90: 73 20 74 72 75 65 20 69 66 20 6f 72 69 67 69 6e  s true if origin
9ca0: 61 6c 20 70 54 65 72 6d 20 73 61 74 69 73 66 69  al pTerm satisfi
9cb0: 65 73 0a 20 20 20 20 2a 2a 20 63 61 73 65 20 31  es.    ** case 1
9cc0: 2e 20 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c  .  In that case,
9cd0: 20 63 6f 6e 73 74 72 75 63 74 20 61 20 6e 65 77   construct a new
9ce0: 20 76 69 72 74 75 61 6c 20 74 65 72 6d 20 74 68   virtual term th
9cf0: 61 74 20 69 73 20 0a 20 20 20 20 2a 2a 20 70 54  at is .    ** pT
9d00: 65 72 6d 20 63 6f 6e 76 65 72 74 65 64 20 69 6e  erm converted in
9d10: 74 6f 20 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f  to an IN operato
9d20: 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  r..    */.    if
9d30: 28 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 29  ( okToChngToIN )
9d40: 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 44  {.      Expr *pD
9d50: 75 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  up;            /
9d60: 2a 20 41 20 74 72 61 6e 73 69 65 6e 74 20 64 75  * A transient du
9d70: 70 6c 69 63 61 74 65 20 65 78 70 72 65 73 73 69  plicate expressi
9d80: 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72  on */.      Expr
9d90: 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 30 3b  List *pList = 0;
9da0: 20 20 20 2f 2a 20 54 68 65 20 52 48 53 20 6f 66     /* The RHS of
9db0: 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
9dc0: 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a   */.      Expr *
9dd0: 70 4c 65 66 74 20 3d 20 30 3b 20 20 20 20 20 20  pLeft = 0;      
9de0: 20 2f 2a 20 54 68 65 20 4c 48 53 20 6f 66 20 74   /* The LHS of t
9df0: 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a  he IN operator *
9e00: 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e  /.      Expr *pN
9e10: 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ew;            /
9e20: 2a 20 54 68 65 20 63 6f 6d 70 6c 65 74 65 20 49  * The complete I
9e30: 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 0a 20  N operator */.. 
9e40: 20 20 20 20 20 66 6f 72 28 69 3d 70 4f 72 57 63       for(i=pOrWc
9e50: 2d 3e 6e 54 65 72 6d 2d 31 2c 20 70 4f 72 54 65  ->nTerm-1, pOrTe
9e60: 72 6d 3d 70 4f 72 57 63 2d 3e 61 3b 20 69 3e 3d  rm=pOrWc->a; i>=
9e70: 30 3b 20 69 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b  0; i--, pOrTerm+
9e80: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
9e90: 28 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67  (pOrTerm->wtFlag
9ea0: 73 20 26 20 54 45 52 4d 5f 4f 52 5f 4f 4b 29 3d  s & TERM_OR_OK)=
9eb0: 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
9ec0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
9ed0: 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  OrTerm->eOperato
9ee0: 72 20 26 20 57 4f 5f 45 51 20 29 3b 0a 20 20 20  r & WO_EQ );.   
9ef0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 72       assert( pOr
9f00: 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
9f10: 3d 3d 69 43 75 72 73 6f 72 20 29 3b 0a 20 20 20  ==iCursor );.   
9f20: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 72       assert( pOr
9f30: 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75  Term->u.leftColu
9f40: 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e 20 29 3b 0a 20  mn==iColumn );. 
9f50: 20 20 20 20 20 20 20 70 44 75 70 20 3d 20 73 71         pDup = sq
9f60: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
9f70: 20 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72 2d   pOrTerm->pExpr-
9f80: 3e 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 20  >pRight, 0);.   
9f90: 20 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c       pList = sql
9fa0: 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
9fb0: 6e 64 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73  nd(pWInfo->pPars
9fc0: 65 2c 20 70 4c 69 73 74 2c 20 70 44 75 70 29 3b  e, pList, pDup);
9fd0: 0a 20 20 20 20 20 20 20 20 70 4c 65 66 74 20 3d  .        pLeft =
9fe0: 20 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72 2d   pOrTerm->pExpr-
9ff0: 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 7d 0a  >pLeft;.      }.
a000: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c        assert( pL
a010: 65 66 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  eft!=0 );.      
a020: 70 44 75 70 20 3d 20 73 71 6c 69 74 65 33 45 78  pDup = sqlite3Ex
a030: 70 72 44 75 70 28 64 62 2c 20 70 4c 65 66 74 2c  prDup(db, pLeft,
a040: 20 30 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 20   0);.      pNew 
a050: 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
a060: 50 61 72 73 65 2c 20 54 4b 5f 49 4e 2c 20 70 44  Parse, TK_IN, pD
a070: 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  up, 0, 0);.     
a080: 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20   if( pNew ){.   
a090: 20 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77 3b       int idxNew;
a0a0: 0a 20 20 20 20 20 20 20 20 74 72 61 6e 73 66 65  .        transfe
a0b0: 72 4a 6f 69 6e 4d 61 72 6b 69 6e 67 73 28 70 4e  rJoinMarkings(pN
a0c0: 65 77 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20  ew, pExpr);.    
a0d0: 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
a0e0: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 4e 65  rHasProperty(pNe
a0f0: 77 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  w, EP_xIsSelect)
a100: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77   );.        pNew
a110: 2d 3e 78 2e 70 4c 69 73 74 20 3d 20 70 4c 69 73  ->x.pList = pLis
a120: 74 3b 0a 20 20 20 20 20 20 20 20 69 64 78 4e 65  t;.        idxNe
a130: 77 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49  w = whereClauseI
a140: 6e 73 65 72 74 28 70 57 43 2c 20 70 4e 65 77 2c  nsert(pWC, pNew,
a150: 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45   TERM_VIRTUAL|TE
a160: 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20  RM_DYNAMIC);.   
a170: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
a180: 64 78 4e 65 77 3d 3d 30 20 29 3b 0a 20 20 20 20  dxNew==0 );.    
a190: 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 28      exprAnalyze(
a1a0: 70 53 72 63 2c 20 70 57 43 2c 20 69 64 78 4e 65  pSrc, pWC, idxNe
a1b0: 77 29 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72  w);.        pTer
a1c0: 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54  m = &pWC->a[idxT
a1d0: 65 72 6d 5d 3b 0a 20 20 20 20 20 20 20 20 6d 61  erm];.        ma
a1e0: 72 6b 54 65 72 6d 41 73 43 68 69 6c 64 28 70 57  rkTermAsChild(pW
a1f0: 43 2c 20 69 64 78 4e 65 77 2c 20 69 64 78 54 65  C, idxNew, idxTe
a200: 72 6d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  rm);.      }else
a210: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
a220: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
a230: 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 20 20  db, pList);.    
a240: 20 20 7d 0a 20 20 20 20 20 20 70 54 65 72 6d 2d    }.      pTerm-
a250: 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 57 4f 5f  >eOperator = WO_
a260: 4e 4f 4f 50 3b 20 20 2f 2a 20 63 61 73 65 20 31  NOOP;  /* case 1
a270: 20 74 72 75 6d 70 73 20 63 61 73 65 20 33 20 2a   trumps case 3 *
a280: 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65  /.    }.  }.}.#e
a290: 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f  ndif /* !SQLITE_
a2a0: 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41  OMIT_OR_OPTIMIZA
a2b0: 54 49 4f 4e 20 26 26 20 21 53 51 4c 49 54 45 5f  TION && !SQLITE_
a2c0: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f  OMIT_SUBQUERY */
a2d0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 6e 70 75  ../*.** The inpu
a2e0: 74 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  t to this routin
a2f0: 65 20 69 73 20 61 6e 20 57 68 65 72 65 54 65 72  e is an WhereTer
a300: 6d 20 73 74 72 75 63 74 75 72 65 20 77 69 74 68  m structure with
a310: 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 22 70 45   only the.** "pE
a320: 78 70 72 22 20 66 69 65 6c 64 20 66 69 6c 6c 65  xpr" field fille
a330: 64 20 69 6e 2e 20 20 54 68 65 20 6a 6f 62 20 6f  d in.  The job o
a340: 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  f this routine i
a350: 73 20 74 6f 20 61 6e 61 6c 79 7a 65 20 74 68 65  s to analyze the
a360: 0a 2a 2a 20 73 75 62 65 78 70 72 65 73 73 69 6f  .** subexpressio
a370: 6e 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 20 61  n and populate a
a380: 6c 6c 20 74 68 65 20 6f 74 68 65 72 20 66 69 65  ll the other fie
a390: 6c 64 73 20 6f 66 20 74 68 65 20 57 68 65 72 65  lds of the Where
a3a0: 54 65 72 6d 0a 2a 2a 20 73 74 72 75 63 74 75 72  Term.** structur
a3b0: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
a3c0: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6f 66  expression is of
a3d0: 20 74 68 65 20 66 6f 72 6d 20 22 3c 65 78 70 72   the form "<expr
a3e0: 3e 20 3c 6f 70 3e 20 58 22 20 69 74 20 67 65 74  > <op> X" it get
a3f0: 73 20 63 6f 6d 6d 75 74 65 64 0a 2a 2a 20 74 6f  s commuted.** to
a400: 20 74 68 65 20 73 74 61 6e 64 61 72 64 20 66 6f   the standard fo
a410: 72 6d 20 6f 66 20 22 58 20 3c 6f 70 3e 20 3c 65  rm of "X <op> <e
a420: 78 70 72 3e 22 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  xpr>"..**.** If 
a430: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
a440: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 58  s of the form "X
a450: 20 3c 6f 70 3e 20 59 22 20 77 68 65 72 65 20 62   <op> Y" where b
a460: 6f 74 68 20 58 20 61 6e 64 20 59 20 61 72 65 0a  oth X and Y are.
a470: 2a 2a 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e  ** columns, then
a480: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 65 78   the original ex
a490: 70 72 65 73 73 69 6f 6e 20 69 73 20 75 6e 63 68  pression is unch
a4a0: 61 6e 67 65 64 20 61 6e 64 20 61 20 6e 65 77 20  anged and a new 
a4b0: 76 69 72 74 75 61 6c 0a 2a 2a 20 74 65 72 6d 20  virtual.** term 
a4c0: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 59 20 3c  of the form "Y <
a4d0: 6f 70 3e 20 58 22 20 69 73 20 61 64 64 65 64 20  op> X" is added 
a4e0: 74 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  to the WHERE cla
a4f0: 75 73 65 20 61 6e 64 0a 2a 2a 20 61 6e 61 6c 79  use and.** analy
a500: 7a 65 64 20 73 65 70 61 72 61 74 65 6c 79 2e 20  zed separately. 
a510: 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 74 65   The original te
a520: 72 6d 20 69 73 20 6d 61 72 6b 65 64 20 77 69 74  rm is marked wit
a530: 68 20 54 45 52 4d 5f 43 4f 50 49 45 44 0a 2a 2a  h TERM_COPIED.**
a540: 20 61 6e 64 20 74 68 65 20 6e 65 77 20 74 65 72   and the new ter
a550: 6d 20 69 73 20 6d 61 72 6b 65 64 20 77 69 74 68  m is marked with
a560: 20 54 45 52 4d 5f 44 59 4e 41 4d 49 43 20 28 62   TERM_DYNAMIC (b
a570: 65 63 61 75 73 65 20 69 74 27 73 20 70 45 78 70  ecause it's pExp
a580: 72 0a 2a 2a 20 6e 65 65 64 73 20 74 6f 20 62 65  r.** needs to be
a590: 20 66 72 65 65 64 20 77 69 74 68 20 74 68 65 20   freed with the 
a5a0: 57 68 65 72 65 43 6c 61 75 73 65 29 20 61 6e 64  WhereClause) and
a5b0: 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 28 62   TERM_VIRTUAL (b
a5c0: 65 63 61 75 73 65 20 69 74 0a 2a 2a 20 69 73 20  ecause it.** is 
a5d0: 61 20 63 6f 6d 6d 75 74 65 64 20 63 6f 70 79 20  a commuted copy 
a5e0: 6f 66 20 61 20 70 72 69 6f 72 20 74 65 72 6d 2e  of a prior term.
a5f0: 29 20 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20  )  The original 
a600: 74 65 72 6d 20 68 61 73 20 6e 43 68 69 6c 64 3d  term has nChild=
a610: 31 0a 2a 2a 20 61 6e 64 20 74 68 65 20 63 6f 70  1.** and the cop
a620: 79 20 68 61 73 20 69 64 78 50 61 72 65 6e 74 20  y has idxParent 
a630: 73 65 74 20 74 6f 20 74 68 65 20 69 6e 64 65 78  set to the index
a640: 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   of the original
a650: 20 74 65 72 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63   term..*/.static
a660: 20 76 6f 69 64 20 65 78 70 72 41 6e 61 6c 79 7a   void exprAnalyz
a670: 65 28 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  e(.  SrcList *pS
a680: 72 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  rc,            /
a690: 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * the FROM claus
a6a0: 65 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75  e */.  WhereClau
a6b0: 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20  se *pWC,        
a6c0: 20 2f 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c   /* the WHERE cl
a6d0: 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 64  ause */.  int id
a6e0: 78 54 65 72 6d 20 20 20 20 20 20 20 20 20 20 20  xTerm           
a6f0: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
a700: 74 68 65 20 74 65 72 6d 20 74 6f 20 62 65 20 61  the term to be a
a710: 6e 61 6c 79 7a 65 64 20 2a 2f 0a 29 7b 0a 20 20  nalyzed */.){.  
a720: 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
a730: 6f 20 3d 20 70 57 43 2d 3e 70 57 49 6e 66 6f 3b  o = pWC->pWInfo;
a740: 20 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65   /* WHERE clause
a750: 20 70 72 6f 63 65 73 73 69 6e 67 20 63 6f 6e 74   processing cont
a760: 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  ext */.  WhereTe
a770: 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20  rm *pTerm;      
a780: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
a790: 20 74 65 72 6d 20 74 6f 20 62 65 20 61 6e 61 6c   term to be anal
a7a0: 79 7a 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 4d  yzed */.  WhereM
a7b0: 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74  askSet *pMaskSet
a7c0: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65  ;          /* Se
a7d0: 74 20 6f 66 20 74 61 62 6c 65 20 69 6e 64 65 78  t of table index
a7e0: 20 6d 61 73 6b 73 20 2a 2f 0a 20 20 45 78 70 72   masks */.  Expr
a7f0: 20 2a 70 45 78 70 72 3b 20 20 20 20 20 20 20 20   *pExpr;        
a800: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a810: 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74  The expression t
a820: 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f  o be analyzed */
a830: 0a 20 20 42 69 74 6d 61 73 6b 20 70 72 65 72 65  .  Bitmask prere
a840: 71 4c 65 66 74 3b 20 20 20 20 20 20 20 20 20 20  qLeft;          
a850: 20 20 20 20 2f 2a 20 50 72 65 72 65 71 75 65 73      /* Prereques
a860: 69 74 65 73 20 6f 66 20 74 68 65 20 70 45 78 70  ites of the pExp
a870: 72 2d 3e 70 4c 65 66 74 20 2a 2f 0a 20 20 42 69  r->pLeft */.  Bi
a880: 74 6d 61 73 6b 20 70 72 65 72 65 71 41 6c 6c 3b  tmask prereqAll;
a890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a8a0: 2a 20 50 72 65 72 65 71 75 65 73 69 74 65 73 20  * Prerequesites 
a8b0: 6f 66 20 70 45 78 70 72 20 2a 2f 0a 20 20 42 69  of pExpr */.  Bi
a8c0: 74 6d 61 73 6b 20 65 78 74 72 61 52 69 67 68 74  tmask extraRight
a8d0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f   = 0;          /
a8e0: 2a 20 45 78 74 72 61 20 64 65 70 65 6e 64 65 6e  * Extra dependen
a8f0: 63 69 65 73 20 6f 6e 20 4c 45 46 54 20 4a 4f 49  cies on LEFT JOI
a900: 4e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 53 74  N */.  Expr *pSt
a910: 72 31 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  r1 = 0;         
a920: 20 20 20 20 20 20 20 20 2f 2a 20 52 48 53 20 6f          /* RHS o
a930: 66 20 4c 49 4b 45 2f 47 4c 4f 42 20 6f 70 65 72  f LIKE/GLOB oper
a940: 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 73  ator */.  int is
a950: 43 6f 6d 70 6c 65 74 65 20 3d 20 30 3b 20 20 20  Complete = 0;   
a960: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 48             /* RH
a970: 53 20 6f 66 20 4c 49 4b 45 2f 47 4c 4f 42 20 65  S of LIKE/GLOB e
a980: 6e 64 73 20 77 69 74 68 20 77 69 6c 64 63 61 72  nds with wildcar
a990: 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43 61 73  d */.  int noCas
a9a0: 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  e = 0;          
a9b0: 20 20 20 20 20 20 20 20 2f 2a 20 75 70 70 65 72          /* upper
a9c0: 63 61 73 65 20 65 71 75 69 76 61 6c 65 6e 74 20  case equivalent 
a9d0: 74 6f 20 6c 6f 77 65 72 63 61 73 65 20 2a 2f 0a  to lowercase */.
a9e0: 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20    int op;       
a9f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa00: 20 20 20 2f 2a 20 54 6f 70 2d 6c 65 76 65 6c 20     /* Top-level 
aa10: 6f 70 65 72 61 74 6f 72 2e 20 20 70 45 78 70 72  operator.  pExpr
aa20: 2d 3e 6f 70 20 2a 2f 0a 20 20 50 61 72 73 65 20  ->op */.  Parse 
aa30: 2a 70 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f  *pParse = pWInfo
aa40: 2d 3e 70 50 61 72 73 65 3b 20 20 2f 2a 20 50 61  ->pParse;  /* Pa
aa50: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
aa60: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
aa70: 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20   pParse->db;    
aa80: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
aa90: 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a 20  connection */.. 
aaa0: 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
aab0: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74  ailed ){.    ret
aac0: 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 54 65 72 6d  urn;.  }.  pTerm
aad0: 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65   = &pWC->a[idxTe
aae0: 72 6d 5d 3b 0a 20 20 70 4d 61 73 6b 53 65 74 20  rm];.  pMaskSet 
aaf0: 3d 20 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b  = &pWInfo->sMask
ab00: 53 65 74 3b 0a 20 20 70 45 78 70 72 20 3d 20 70  Set;.  pExpr = p
ab10: 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 61  Term->pExpr;.  a
ab20: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
ab30: 21 3d 54 4b 5f 41 53 20 26 26 20 70 45 78 70 72  !=TK_AS && pExpr
ab40: 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 4c 41 54 45  ->op!=TK_COLLATE
ab50: 20 29 3b 0a 20 20 70 72 65 72 65 71 4c 65 66 74   );.  prereqLeft
ab60: 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67   = exprTableUsag
ab70: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70  e(pMaskSet, pExp
ab80: 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 6f 70 20  r->pLeft);.  op 
ab90: 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 69  = pExpr->op;.  i
aba0: 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e 20 29 7b 0a  f( op==TK_IN ){.
abb0: 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
abc0: 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a  r->pRight==0 );.
abd0: 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50      if( ExprHasP
abe0: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
abf0: 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a  P_xIsSelect) ){.
ac00: 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 70 72 65        pTerm->pre
ac10: 72 65 71 52 69 67 68 74 20 3d 20 65 78 70 72 53  reqRight = exprS
ac20: 65 6c 65 63 74 54 61 62 6c 65 55 73 61 67 65 28  electTableUsage(
ac30: 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d  pMaskSet, pExpr-
ac40: 3e 78 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  >x.pSelect);.   
ac50: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 54   }else{.      pT
ac60: 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
ac70: 20 3d 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65   = exprListTable
ac80: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
ac90: 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 29 3b  pExpr->x.pList);
aca0: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
acb0: 66 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c  f( op==TK_ISNULL
acc0: 20 29 7b 0a 20 20 20 20 70 54 65 72 6d 2d 3e 70   ){.    pTerm->p
acd0: 72 65 72 65 71 52 69 67 68 74 20 3d 20 30 3b 0a  rereqRight = 0;.
ace0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 54 65    }else{.    pTe
acf0: 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20  rm->prereqRight 
ad00: 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65  = exprTableUsage
ad10: 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72  (pMaskSet, pExpr
ad20: 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 7d 0a 20  ->pRight);.  }. 
ad30: 20 70 72 65 72 65 71 41 6c 6c 20 3d 20 65 78 70   prereqAll = exp
ad40: 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  rTableUsage(pMas
ad50: 6b 53 65 74 2c 20 70 45 78 70 72 29 3b 0a 20 20  kSet, pExpr);.  
ad60: 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
ad70: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46 72  rty(pExpr, EP_Fr
ad80: 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20 42  omJoin) ){.    B
ad90: 69 74 6d 61 73 6b 20 78 20 3d 20 67 65 74 4d 61  itmask x = getMa
ada0: 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78  sk(pMaskSet, pEx
adb0: 70 72 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61  pr->iRightJoinTa
adc0: 62 6c 65 29 3b 0a 20 20 20 20 70 72 65 72 65 71  ble);.    prereq
add0: 41 6c 6c 20 7c 3d 20 78 3b 0a 20 20 20 20 65 78  All |= x;.    ex
ade0: 74 72 61 52 69 67 68 74 20 3d 20 78 2d 31 3b 20  traRight = x-1; 
adf0: 20 2f 2a 20 4f 4e 20 63 6c 61 75 73 65 20 74 65   /* ON clause te
ae00: 72 6d 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 75  rms may not be u
ae10: 73 65 64 20 77 69 74 68 20 61 6e 20 69 6e 64 65  sed with an inde
ae20: 78 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x.              
ae30: 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 20 6c           ** on l
ae40: 65 66 74 20 74 61 62 6c 65 20 6f 66 20 61 20 4c  eft table of a L
ae50: 45 46 54 20 4a 4f 49 4e 2e 20 20 54 69 63 6b 65  EFT JOIN.  Ticke
ae60: 74 20 23 33 30 31 35 20 2a 2f 0a 20 20 7d 0a 20  t #3015 */.  }. 
ae70: 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c   pTerm->prereqAl
ae80: 6c 20 3d 20 70 72 65 72 65 71 41 6c 6c 3b 0a 20  l = prereqAll;. 
ae90: 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73   pTerm->leftCurs
aea0: 6f 72 20 3d 20 2d 31 3b 0a 20 20 70 54 65 72 6d  or = -1;.  pTerm
aeb0: 2d 3e 69 50 61 72 65 6e 74 20 3d 20 2d 31 3b 0a  ->iParent = -1;.
aec0: 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74    pTerm->eOperat
aed0: 6f 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 61 6c  or = 0;.  if( al
aee0: 6c 6f 77 65 64 4f 70 28 6f 70 29 20 29 7b 0a 20  lowedOp(op) ){. 
aef0: 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d     Expr *pLeft =
af00: 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70   sqlite3ExprSkip
af10: 43 6f 6c 6c 61 74 65 28 70 45 78 70 72 2d 3e 70  Collate(pExpr->p
af20: 4c 65 66 74 29 3b 0a 20 20 20 20 45 78 70 72 20  Left);.    Expr 
af30: 2a 70 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65  *pRight = sqlite
af40: 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65  3ExprSkipCollate
af50: 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b  (pExpr->pRight);
af60: 0a 20 20 20 20 75 31 36 20 6f 70 4d 61 73 6b 20  .    u16 opMask 
af70: 3d 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71  = (pTerm->prereq
af80: 52 69 67 68 74 20 26 20 70 72 65 72 65 71 4c 65  Right & prereqLe
af90: 66 74 29 3d 3d 30 20 3f 20 57 4f 5f 41 4c 4c 20  ft)==0 ? WO_ALL 
afa0: 3a 20 57 4f 5f 45 51 55 49 56 3b 0a 20 20 20 20  : WO_EQUIV;.    
afb0: 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54  if( pLeft->op==T
afc0: 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20  K_COLUMN ){.    
afd0: 20 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72    pTerm->leftCur
afe0: 73 6f 72 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61  sor = pLeft->iTa
aff0: 62 6c 65 3b 0a 20 20 20 20 20 20 70 54 65 72 6d  ble;.      pTerm
b000: 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d  ->u.leftColumn =
b010: 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b   pLeft->iColumn;
b020: 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 65 4f  .      pTerm->eO
b030: 70 65 72 61 74 6f 72 20 3d 20 6f 70 65 72 61 74  perator = operat
b040: 6f 72 4d 61 73 6b 28 6f 70 29 20 26 20 6f 70 4d  orMask(op) & opM
b050: 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ask;.    }.    i
b060: 66 28 20 70 52 69 67 68 74 20 26 26 20 70 52 69  f( pRight && pRi
b070: 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  ght->op==TK_COLU
b080: 4d 4e 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72  MN ){.      Wher
b090: 65 54 65 72 6d 20 2a 70 4e 65 77 3b 0a 20 20 20  eTerm *pNew;.   
b0a0: 20 20 20 45 78 70 72 20 2a 70 44 75 70 3b 0a 20     Expr *pDup;. 
b0b0: 20 20 20 20 20 75 31 36 20 65 45 78 74 72 61 4f       u16 eExtraO
b0c0: 70 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a  p = 0;        /*
b0d0: 20 45 78 74 72 61 20 62 69 74 73 20 66 6f 72 20   Extra bits for 
b0e0: 70 4e 65 77 2d 3e 65 4f 70 65 72 61 74 6f 72 20  pNew->eOperator 
b0f0: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 54 65  */.      if( pTe
b100: 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3e 3d  rm->leftCursor>=
b110: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  0 ){.        int
b120: 20 69 64 78 4e 65 77 3b 0a 20 20 20 20 20 20 20   idxNew;.       
b130: 20 70 44 75 70 20 3d 20 73 71 6c 69 74 65 33 45   pDup = sqlite3E
b140: 78 70 72 44 75 70 28 64 62 2c 20 70 45 78 70 72  xprDup(db, pExpr
b150: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 0);.        if
b160: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
b170: 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ed ){.          
b180: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
b190: 65 28 64 62 2c 20 70 44 75 70 29 3b 0a 20 20 20  e(db, pDup);.   
b1a0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20         return;. 
b1b0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
b1c0: 20 69 64 78 4e 65 77 20 3d 20 77 68 65 72 65 43   idxNew = whereC
b1d0: 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c  lauseInsert(pWC,
b1e0: 20 70 44 75 70 2c 20 54 45 52 4d 5f 56 49 52 54   pDup, TERM_VIRT
b1f0: 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43  UAL|TERM_DYNAMIC
b200: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  );.        if( i
b210: 64 78 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72  dxNew==0 ) retur
b220: 6e 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20  n;.        pNew 
b230: 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77  = &pWC->a[idxNew
b240: 5d 3b 0a 20 20 20 20 20 20 20 20 6d 61 72 6b 54  ];.        markT
b250: 65 72 6d 41 73 43 68 69 6c 64 28 70 57 43 2c 20  ermAsChild(pWC, 
b260: 69 64 78 4e 65 77 2c 20 69 64 78 54 65 72 6d 29  idxNew, idxTerm)
b270: 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 20  ;.        pTerm 
b280: 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72  = &pWC->a[idxTer
b290: 6d 5d 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72  m];.        pTer
b2a0: 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45  m->wtFlags |= TE
b2b0: 52 4d 5f 43 4f 50 49 45 44 3b 0a 20 20 20 20 20  RM_COPIED;.     
b2c0: 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70     if( pExpr->op
b2d0: 3d 3d 54 4b 5f 45 51 0a 20 20 20 20 20 20 20 20  ==TK_EQ.        
b2e0: 20 26 26 20 21 45 78 70 72 48 61 73 50 72 6f 70   && !ExprHasProp
b2f0: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46  erty(pExpr, EP_F
b300: 72 6f 6d 4a 6f 69 6e 29 0a 20 20 20 20 20 20 20  romJoin).       
b310: 20 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f    && Optimizatio
b320: 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20 53 51 4c  nEnabled(db, SQL
b330: 49 54 45 5f 54 72 61 6e 73 69 74 69 76 65 29 0a  ITE_Transitive).
b340: 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
b350: 20 20 20 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65       pTerm->eOpe
b360: 72 61 74 6f 72 20 7c 3d 20 57 4f 5f 45 51 55 49  rator |= WO_EQUI
b370: 56 3b 0a 20 20 20 20 20 20 20 20 20 20 65 45 78  V;.          eEx
b380: 74 72 61 4f 70 20 3d 20 57 4f 5f 45 51 55 49 56  traOp = WO_EQUIV
b390: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
b3a0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
b3b0: 20 70 44 75 70 20 3d 20 70 45 78 70 72 3b 0a 20   pDup = pExpr;. 
b3c0: 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 70 54         pNew = pT
b3d0: 65 72 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  erm;.      }.   
b3e0: 20 20 20 65 78 70 72 43 6f 6d 6d 75 74 65 28 70     exprCommute(p
b3f0: 50 61 72 73 65 2c 20 70 44 75 70 29 3b 0a 20 20  Parse, pDup);.  
b400: 20 20 20 20 70 4c 65 66 74 20 3d 20 73 71 6c 69      pLeft = sqli
b410: 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61  te3ExprSkipColla
b420: 74 65 28 70 44 75 70 2d 3e 70 4c 65 66 74 29 3b  te(pDup->pLeft);
b430: 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6c 65 66  .      pNew->lef
b440: 74 43 75 72 73 6f 72 20 3d 20 70 4c 65 66 74 2d  tCursor = pLeft-
b450: 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 70  >iTable;.      p
b460: 4e 65 77 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d  New->u.leftColum
b470: 6e 20 3d 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75  n = pLeft->iColu
b480: 6d 6e 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  mn;.      testca
b490: 73 65 28 20 28 70 72 65 72 65 71 4c 65 66 74 20  se( (prereqLeft 
b4a0: 7c 20 65 78 74 72 61 52 69 67 68 74 29 20 21 3d  | extraRight) !=
b4b0: 20 70 72 65 72 65 71 4c 65 66 74 20 29 3b 0a 20   prereqLeft );. 
b4c0: 20 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65       pNew->prere
b4d0: 71 52 69 67 68 74 20 3d 20 70 72 65 72 65 71 4c  qRight = prereqL
b4e0: 65 66 74 20 7c 20 65 78 74 72 61 52 69 67 68 74  eft | extraRight
b4f0: 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 72  ;.      pNew->pr
b500: 65 72 65 71 41 6c 6c 20 3d 20 70 72 65 72 65 71  ereqAll = prereq
b510: 41 6c 6c 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  All;.      pNew-
b520: 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 28 6f 70  >eOperator = (op
b530: 65 72 61 74 6f 72 4d 61 73 6b 28 70 44 75 70 2d  eratorMask(pDup-
b540: 3e 6f 70 29 20 2b 20 65 45 78 74 72 61 4f 70 29  >op) + eExtraOp)
b550: 20 26 20 6f 70 4d 61 73 6b 3b 0a 20 20 20 20 7d   & opMask;.    }
b560: 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  .  }..#ifndef SQ
b570: 4c 49 54 45 5f 4f 4d 49 54 5f 42 45 54 57 45 45  LITE_OMIT_BETWEE
b580: 4e 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 20  N_OPTIMIZATION. 
b590: 20 2f 2a 20 49 66 20 61 20 74 65 72 6d 20 69 73   /* If a term is
b5a0: 20 74 68 65 20 42 45 54 57 45 45 4e 20 6f 70 65   the BETWEEN ope
b5b0: 72 61 74 6f 72 2c 20 63 72 65 61 74 65 20 74 77  rator, create tw
b5c0: 6f 20 6e 65 77 20 76 69 72 74 75 61 6c 20 74 65  o new virtual te
b5d0: 72 6d 73 0a 20 20 2a 2a 20 74 68 61 74 20 64 65  rms.  ** that de
b5e0: 66 69 6e 65 20 74 68 65 20 72 61 6e 67 65 20 74  fine the range t
b5f0: 68 61 74 20 74 68 65 20 42 45 54 57 45 45 4e 20  hat the BETWEEN 
b600: 69 6d 70 6c 65 6d 65 6e 74 73 2e 20 20 46 6f 72  implements.  For
b610: 20 65 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20   example:.  **. 
b620: 20 2a 2a 20 20 20 20 20 20 61 20 42 45 54 57 45   **      a BETWE
b630: 45 4e 20 62 20 41 4e 44 20 63 0a 20 20 2a 2a 0a  EN b AND c.  **.
b640: 20 20 2a 2a 20 69 73 20 63 6f 6e 76 65 72 74 65    ** is converte
b650: 64 20 69 6e 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a  d into:.  **.  *
b660: 2a 20 20 20 20 20 20 28 61 20 42 45 54 57 45 45  *      (a BETWEE
b670: 4e 20 62 20 41 4e 44 20 63 29 20 41 4e 44 20 28  N b AND c) AND (
b680: 61 3e 3d 62 29 20 41 4e 44 20 28 61 3c 3d 63 29  a>=b) AND (a<=c)
b690: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 74  .  **.  ** The t
b6a0: 77 6f 20 6e 65 77 20 74 65 72 6d 73 20 61 72 65  wo new terms are
b6b0: 20 61 64 64 65 64 20 6f 6e 74 6f 20 74 68 65 20   added onto the 
b6c0: 65 6e 64 20 6f 66 20 74 68 65 20 57 68 65 72 65  end of the Where
b6d0: 43 6c 61 75 73 65 20 6f 62 6a 65 63 74 2e 0a 20  Clause object.. 
b6e0: 20 2a 2a 20 54 68 65 20 6e 65 77 20 74 65 72 6d   ** The new term
b6f0: 73 20 61 72 65 20 22 64 79 6e 61 6d 69 63 22 20  s are "dynamic" 
b700: 61 6e 64 20 61 72 65 20 63 68 69 6c 64 72 65 6e  and are children
b710: 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   of the original
b720: 20 42 45 54 57 45 45 4e 0a 20 20 2a 2a 20 74 65   BETWEEN.  ** te
b730: 72 6d 2e 20 20 54 68 61 74 20 6d 65 61 6e 73 20  rm.  That means 
b740: 74 68 61 74 20 69 66 20 74 68 65 20 42 45 54 57  that if the BETW
b750: 45 45 4e 20 74 65 72 6d 20 69 73 20 63 6f 64 65  EEN term is code
b760: 64 2c 20 74 68 65 20 63 68 69 6c 64 72 65 6e 20  d, the children 
b770: 61 72 65 0a 20 20 2a 2a 20 73 6b 69 70 70 65 64  are.  ** skipped
b780: 2e 20 20 4f 72 2c 20 69 66 20 74 68 65 20 63 68  .  Or, if the ch
b790: 69 6c 64 72 65 6e 20 61 72 65 20 73 61 74 69 73  ildren are satis
b7a0: 66 69 65 64 20 62 79 20 61 6e 20 69 6e 64 65 78  fied by an index
b7b0: 2c 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 20  , the original. 
b7c0: 20 2a 2a 20 42 45 54 57 45 45 4e 20 74 65 72 6d   ** BETWEEN term
b7d0: 20 69 73 20 73 6b 69 70 70 65 64 2e 0a 20 20 2a   is skipped..  *
b7e0: 2f 0a 20 20 65 6c 73 65 20 69 66 28 20 70 45 78  /.  else if( pEx
b7f0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 42 45 54 57 45  pr->op==TK_BETWE
b800: 45 4e 20 26 26 20 70 57 43 2d 3e 6f 70 3d 3d 54  EN && pWC->op==T
b810: 4b 5f 41 4e 44 20 29 7b 0a 20 20 20 20 45 78 70  K_AND ){.    Exp
b820: 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70  rList *pList = p
b830: 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20  Expr->x.pList;. 
b840: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 73 74     int i;.    st
b850: 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 6f 70  atic const u8 op
b860: 73 5b 5d 20 3d 20 7b 54 4b 5f 47 45 2c 20 54 4b  s[] = {TK_GE, TK
b870: 5f 4c 45 7d 3b 0a 20 20 20 20 61 73 73 65 72 74  _LE};.    assert
b880: 28 20 70 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20  ( pList!=0 );.  
b890: 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d    assert( pList-
b8a0: 3e 6e 45 78 70 72 3d 3d 32 20 29 3b 0a 20 20 20  >nExpr==2 );.   
b8b0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 32 3b 20 69   for(i=0; i<2; i
b8c0: 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  ++){.      Expr 
b8d0: 2a 70 4e 65 77 45 78 70 72 3b 0a 20 20 20 20 20  *pNewExpr;.     
b8e0: 20 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20 20   int idxNew;.   
b8f0: 20 20 20 70 4e 65 77 45 78 70 72 20 3d 20 73 71     pNewExpr = sq
b900: 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
b910: 65 2c 20 6f 70 73 5b 69 5d 2c 20 0a 20 20 20 20  e, ops[i], .    
b920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b930: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
b940: 45 78 70 72 44 75 70 28 64 62 2c 20 70 45 78 70  ExprDup(db, pExp
b950: 72 2d 3e 70 4c 65 66 74 2c 20 30 29 2c 0a 20 20  r->pLeft, 0),.  
b960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b970: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
b980: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4c  e3ExprDup(db, pL
b990: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c  ist->a[i].pExpr,
b9a0: 20 30 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 74   0), 0);.      t
b9b0: 72 61 6e 73 66 65 72 4a 6f 69 6e 4d 61 72 6b 69  ransferJoinMarki
b9c0: 6e 67 73 28 70 4e 65 77 45 78 70 72 2c 20 70 45  ngs(pNewExpr, pE
b9d0: 78 70 72 29 3b 0a 20 20 20 20 20 20 69 64 78 4e  xpr);.      idxN
b9e0: 65 77 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65  ew = whereClause
b9f0: 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e 65 77  Insert(pWC, pNew
ba00: 45 78 70 72 2c 20 54 45 52 4d 5f 56 49 52 54 55  Expr, TERM_VIRTU
ba10: 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29  AL|TERM_DYNAMIC)
ba20: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
ba30: 28 20 69 64 78 4e 65 77 3d 3d 30 20 29 3b 0a 20  ( idxNew==0 );. 
ba40: 20 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65       exprAnalyze
ba50: 28 70 53 72 63 2c 20 70 57 43 2c 20 69 64 78 4e  (pSrc, pWC, idxN
ba60: 65 77 29 3b 0a 20 20 20 20 20 20 70 54 65 72 6d  ew);.      pTerm
ba70: 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65   = &pWC->a[idxTe
ba80: 72 6d 5d 3b 0a 20 20 20 20 20 20 6d 61 72 6b 54  rm];.      markT
ba90: 65 72 6d 41 73 43 68 69 6c 64 28 70 57 43 2c 20  ermAsChild(pWC, 
baa0: 69 64 78 4e 65 77 2c 20 69 64 78 54 65 72 6d 29  idxNew, idxTerm)
bab0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
bac0: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
bad0: 54 5f 42 45 54 57 45 45 4e 5f 4f 50 54 49 4d 49  T_BETWEEN_OPTIMI
bae0: 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66 20 21  ZATION */..#if !
baf0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
bb00: 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54  MIT_OR_OPTIMIZAT
bb10: 49 4f 4e 29 20 26 26 20 21 64 65 66 69 6e 65 64  ION) && !defined
bb20: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42  (SQLITE_OMIT_SUB
bb30: 51 55 45 52 59 29 0a 20 20 2f 2a 20 41 6e 61 6c  QUERY).  /* Anal
bb40: 79 7a 65 20 61 20 74 65 72 6d 20 74 68 61 74 20  yze a term that 
bb50: 69 73 20 63 6f 6d 70 6f 73 65 64 20 6f 66 20 74  is composed of t
bb60: 77 6f 20 6f 72 20 6d 6f 72 65 20 73 75 62 74 65  wo or more subte
bb70: 72 6d 73 20 63 6f 6e 6e 65 63 74 65 64 20 62 79  rms connected by
bb80: 0a 20 20 2a 2a 20 61 6e 20 4f 52 20 6f 70 65 72  .  ** an OR oper
bb90: 61 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73  ator..  */.  els
bba0: 65 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d  e if( pExpr->op=
bbb0: 3d 54 4b 5f 4f 52 20 29 7b 0a 20 20 20 20 61 73  =TK_OR ){.    as
bbc0: 73 65 72 74 28 20 70 57 43 2d 3e 6f 70 3d 3d 54  sert( pWC->op==T
bbd0: 4b 5f 41 4e 44 20 29 3b 0a 20 20 20 20 65 78 70  K_AND );.    exp
bbe0: 72 41 6e 61 6c 79 7a 65 4f 72 54 65 72 6d 28 70  rAnalyzeOrTerm(p
bbf0: 53 72 63 2c 20 70 57 43 2c 20 69 64 78 54 65 72  Src, pWC, idxTer
bc00: 6d 29 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d 20  m);.    pTerm = 
bc10: 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d  &pWC->a[idxTerm]
bc20: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ;.  }.#endif /* 
bc30: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f  SQLITE_OMIT_OR_O
bc40: 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a  PTIMIZATION */..
bc50: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
bc60: 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a  MIT_LIKE_OPTIMIZ
bc70: 41 54 49 4f 4e 0a 20 20 2f 2a 20 41 64 64 20 63  ATION.  /* Add c
bc80: 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f 20 72 65  onstraints to re
bc90: 64 75 63 65 20 74 68 65 20 73 65 61 72 63 68 20  duce the search 
bca0: 73 70 61 63 65 20 6f 6e 20 61 20 4c 49 4b 45 20  space on a LIKE 
bcb0: 6f 72 20 47 4c 4f 42 0a 20 20 2a 2a 20 6f 70 65  or GLOB.  ** ope
bcc0: 72 61 74 6f 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  rator..  **.  **
bcd0: 20 41 20 6c 69 6b 65 20 70 61 74 74 65 72 6e 20   A like pattern 
bce0: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 78 20 4c  of the form "x L
bcf0: 49 4b 45 20 27 61 42 63 25 27 22 20 69 73 20 63  IKE 'aBc%'" is c
bd00: 68 61 6e 67 65 64 20 69 6e 74 6f 20 63 6f 6e 73  hanged into cons
bd10: 74 72 61 69 6e 74 73 0a 20 20 2a 2a 0a 20 20 2a  traints.  **.  *
bd20: 2a 20 20 20 20 20 20 20 20 20 20 78 3e 3d 27 41  *          x>='A
bd30: 42 43 27 20 41 4e 44 20 78 3c 27 61 62 64 27 20  BC' AND x<'abd' 
bd40: 41 4e 44 20 78 20 4c 49 4b 45 20 27 61 42 63 25  AND x LIKE 'aBc%
bd50: 27 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  '.  **.  ** The 
bd60: 6c 61 73 74 20 63 68 61 72 61 63 74 65 72 20 6f  last character o
bd70: 66 20 74 68 65 20 70 72 65 66 69 78 20 22 61 62  f the prefix "ab
bd80: 63 22 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65  c" is incremente
bd90: 64 20 74 6f 20 66 6f 72 6d 20 74 68 65 0a 20 20  d to form the.  
bda0: 2a 2a 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20 63  ** termination c
bdb0: 6f 6e 64 69 74 69 6f 6e 20 22 61 62 64 22 2e 20  ondition "abd". 
bdc0: 20 49 66 20 63 61 73 65 20 69 73 20 6e 6f 74 20   If case is not 
bdd0: 73 69 67 6e 69 66 69 63 61 6e 74 20 28 74 68 65  significant (the
bde0: 20 64 65 66 61 75 6c 74 0a 20 20 2a 2a 20 66 6f   default.  ** fo
bdf0: 72 20 4c 49 4b 45 29 20 74 68 65 6e 20 74 68 65  r LIKE) then the
be00: 20 6c 6f 77 65 72 2d 62 6f 75 6e 64 20 69 73 20   lower-bound is 
be10: 6d 61 64 65 20 61 6c 6c 20 75 70 70 65 72 63 61  made all upperca
be20: 73 65 20 61 6e 64 20 74 68 65 20 75 70 70 65 72  se and the upper
be30: 2d 0a 20 20 2a 2a 20 62 6f 75 6e 64 20 69 73 20  -.  ** bound is 
be40: 6d 61 64 65 20 61 6c 6c 20 6c 6f 77 65 72 63 61  made all lowerca
be50: 73 65 20 73 6f 20 74 68 61 74 20 74 68 65 20 62  se so that the b
be60: 6f 75 6e 64 73 20 61 6c 73 6f 20 77 6f 72 6b 20  ounds also work 
be70: 77 68 65 6e 20 63 6f 6d 70 61 72 69 6e 67 0a 20  when comparing. 
be80: 20 2a 2a 20 42 4c 4f 42 73 2e 0a 20 20 2a 2f 0a   ** BLOBs..  */.
be90: 20 20 69 66 28 20 70 57 43 2d 3e 6f 70 3d 3d 54    if( pWC->op==T
bea0: 4b 5f 41 4e 44 20 0a 20 20 20 26 26 20 69 73 4c  K_AND .   && isL
beb0: 69 6b 65 4f 72 47 6c 6f 62 28 70 50 61 72 73 65  ikeOrGlob(pParse
bec0: 2c 20 70 45 78 70 72 2c 20 26 70 53 74 72 31 2c  , pExpr, &pStr1,
bed0: 20 26 69 73 43 6f 6d 70 6c 65 74 65 2c 20 26 6e   &isComplete, &n
bee0: 6f 43 61 73 65 29 0a 20 20 29 7b 0a 20 20 20 20  oCase).  ){.    
bef0: 45 78 70 72 20 2a 70 4c 65 66 74 3b 20 20 20 20  Expr *pLeft;    
bf00: 20 20 20 2f 2a 20 4c 48 53 20 6f 66 20 4c 49 4b     /* LHS of LIK
bf10: 45 2f 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72 20  E/GLOB operator 
bf20: 2a 2f 0a 20 20 20 20 45 78 70 72 20 2a 70 53 74  */.    Expr *pSt
bf30: 72 32 3b 20 20 20 20 20 20 20 2f 2a 20 43 6f 70  r2;       /* Cop
bf40: 79 20 6f 66 20 70 53 74 72 31 20 2d 20 52 48 53  y of pStr1 - RHS
bf50: 20 6f 66 20 4c 49 4b 45 2f 47 4c 4f 42 20 6f 70   of LIKE/GLOB op
bf60: 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 45 78  erator */.    Ex
bf70: 70 72 20 2a 70 4e 65 77 45 78 70 72 31 3b 0a 20  pr *pNewExpr1;. 
bf80: 20 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70     Expr *pNewExp
bf90: 72 32 3b 0a 20 20 20 20 69 6e 74 20 69 64 78 4e  r2;.    int idxN
bfa0: 65 77 31 3b 0a 20 20 20 20 69 6e 74 20 69 64 78  ew1;.    int idx
bfb0: 4e 65 77 32 3b 0a 20 20 20 20 63 6f 6e 73 74 20  New2;.    const 
bfc0: 63 68 61 72 20 2a 7a 43 6f 6c 6c 53 65 71 4e 61  char *zCollSeqNa
bfd0: 6d 65 3b 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20  me;     /* Name 
bfe0: 6f 66 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  of collating seq
bff0: 75 65 6e 63 65 20 2a 2f 0a 20 20 20 20 63 6f 6e  uence */.    con
c000: 73 74 20 75 31 36 20 77 74 46 6c 61 67 73 20 3d  st u16 wtFlags =
c010: 20 54 45 52 4d 5f 4c 49 4b 45 4f 50 54 20 7c 20   TERM_LIKEOPT | 
c020: 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 7c 20 54  TERM_VIRTUAL | T
c030: 45 52 4d 5f 44 59 4e 41 4d 49 43 3b 0a 0a 20 20  ERM_DYNAMIC;..  
c040: 20 20 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d    pLeft = pExpr-
c050: 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70  >x.pList->a[1].p
c060: 45 78 70 72 3b 0a 20 20 20 20 70 53 74 72 32 20  Expr;.    pStr2 
c070: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
c080: 28 64 62 2c 20 70 53 74 72 31 2c 20 30 29 3b 0a  (db, pStr1, 0);.
c090: 0a 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20  .    /* Convert 
c0a0: 74 68 65 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20  the lower bound 
c0b0: 74 6f 20 75 70 70 65 72 2d 63 61 73 65 20 61 6e  to upper-case an
c0c0: 64 20 74 68 65 20 75 70 70 65 72 20 62 6f 75 6e  d the upper boun
c0d0: 64 20 74 6f 0a 20 20 20 20 2a 2a 20 6c 6f 77 65  d to.    ** lowe
c0e0: 72 2d 63 61 73 65 20 28 75 70 70 65 72 2d 63 61  r-case (upper-ca
c0f0: 73 65 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  se is less than 
c100: 6c 6f 77 65 72 2d 63 61 73 65 20 69 6e 20 41 53  lower-case in AS
c110: 43 49 49 29 20 73 6f 20 74 68 61 74 0a 20 20 20  CII) so that.   
c120: 20 2a 2a 20 74 68 65 20 72 61 6e 67 65 20 63 6f   ** the range co
c130: 6e 73 74 72 61 69 6e 74 73 20 61 6c 73 6f 20 77  nstraints also w
c140: 6f 72 6b 20 66 6f 72 20 42 4c 4f 42 73 0a 20 20  ork for BLOBs.  
c150: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 6f 43    */.    if( noC
c160: 61 73 65 20 26 26 20 21 70 50 61 72 73 65 2d 3e  ase && !pParse->
c170: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
c180: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   ){.      int i;
c190: 0a 20 20 20 20 20 20 63 68 61 72 20 63 3b 0a 20  .      char c;. 
c1a0: 20 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c       pTerm->wtFl
c1b0: 61 67 73 20 7c 3d 20 54 45 52 4d 5f 4c 49 4b 45  ags |= TERM_LIKE
c1c0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
c1d0: 20 28 63 20 3d 20 70 53 74 72 31 2d 3e 75 2e 7a   (c = pStr1->u.z
c1e0: 54 6f 6b 65 6e 5b 69 5d 29 21 3d 30 3b 20 69 2b  Token[i])!=0; i+
c1f0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 53 74 72  +){.        pStr
c200: 31 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 69 5d 20 3d  1->u.zToken[i] =
c210: 20 73 71 6c 69 74 65 33 54 6f 75 70 70 65 72 28   sqlite3Toupper(
c220: 63 29 3b 0a 20 20 20 20 20 20 20 20 70 53 74 72  c);.        pStr
c230: 32 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 69 5d 20 3d  2->u.zToken[i] =
c240: 20 73 71 6c 69 74 65 33 54 6f 6c 6f 77 65 72 28   sqlite3Tolower(
c250: 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  c);.      }.    
c260: 7d 0a 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e  }..    if( !db->
c270: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
c280: 20 20 20 20 20 20 75 38 20 63 2c 20 2a 70 43 3b        u8 c, *pC;
c290: 20 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 63         /* Last c
c2a0: 68 61 72 61 63 74 65 72 20 62 65 66 6f 72 65 20  haracter before 
c2b0: 74 68 65 20 66 69 72 73 74 20 77 69 6c 64 63 61  the first wildca
c2c0: 72 64 20 2a 2f 0a 20 20 20 20 20 20 70 43 20 3d  rd */.      pC =
c2d0: 20 28 75 38 2a 29 26 70 53 74 72 32 2d 3e 75 2e   (u8*)&pStr2->u.
c2e0: 7a 54 6f 6b 65 6e 5b 73 71 6c 69 74 65 33 53 74  zToken[sqlite3St
c2f0: 72 6c 65 6e 33 30 28 70 53 74 72 32 2d 3e 75 2e  rlen30(pStr2->u.
c300: 7a 54 6f 6b 65 6e 29 2d 31 5d 3b 0a 20 20 20 20  zToken)-1];.    
c310: 20 20 63 20 3d 20 2a 70 43 3b 0a 20 20 20 20 20    c = *pC;.     
c320: 20 69 66 28 20 6e 6f 43 61 73 65 20 29 7b 0a 20   if( noCase ){. 
c330: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f         /* The po
c340: 69 6e 74 20 69 73 20 74 6f 20 69 6e 63 72 65 6d  int is to increm
c350: 65 6e 74 20 74 68 65 20 6c 61 73 74 20 63 68 61  ent the last cha
c360: 72 61 63 74 65 72 20 62 65 66 6f 72 65 20 74 68  racter before th
c370: 65 20 66 69 72 73 74 0a 20 20 20 20 20 20 20 20  e first.        
c380: 2a 2a 20 77 69 6c 64 63 61 72 64 2e 20 20 42 75  ** wildcard.  Bu
c390: 74 20 69 66 20 77 65 20 69 6e 63 72 65 6d 65 6e  t if we incremen
c3a0: 74 20 27 40 27 2c 20 74 68 61 74 20 77 69 6c 6c  t '@', that will
c3b0: 20 70 75 73 68 20 69 74 20 69 6e 74 6f 20 74 68   push it into th
c3c0: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 70  e.        ** alp
c3d0: 68 61 62 65 74 69 63 20 72 61 6e 67 65 20 77 68  habetic range wh
c3e0: 65 72 65 20 63 61 73 65 20 63 6f 6e 76 65 72 73  ere case convers
c3f0: 69 6f 6e 73 20 77 69 6c 6c 20 6d 65 73 73 20 75  ions will mess u
c400: 70 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a  p the .        *
c410: 2a 20 69 6e 65 71 75 61 6c 69 74 79 2e 20 20 54  * inequality.  T
c420: 6f 20 61 76 6f 69 64 20 74 68 69 73 2c 20 6d 61  o avoid this, ma
c430: 6b 65 20 73 75 72 65 20 74 6f 20 61 6c 73 6f 20  ke sure to also 
c440: 72 75 6e 20 74 68 65 20 66 75 6c 6c 0a 20 20 20  run the full.   
c450: 20 20 20 20 20 2a 2a 20 4c 49 4b 45 20 6f 6e 20       ** LIKE on 
c460: 61 6c 6c 20 63 61 6e 64 69 64 61 74 65 20 65 78  all candidate ex
c470: 70 72 65 73 73 69 6f 6e 73 20 62 79 20 63 6c 65  pressions by cle
c480: 61 72 69 6e 67 20 74 68 65 20 69 73 43 6f 6d 70  aring the isComp
c490: 6c 65 74 65 20 66 6c 61 67 0a 20 20 20 20 20 20  lete flag.      
c4a0: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
c4b0: 20 63 3d 3d 27 41 27 2d 31 20 29 20 69 73 43 6f   c=='A'-1 ) isCo
c4c0: 6d 70 6c 65 74 65 20 3d 20 30 3b 0a 20 20 20 20  mplete = 0;.    
c4d0: 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33 55      c = sqlite3U
c4e0: 70 70 65 72 54 6f 4c 6f 77 65 72 5b 63 5d 3b 0a  pperToLower[c];.
c4f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 70        }.      *p
c500: 43 20 3d 20 63 20 2b 20 31 3b 0a 20 20 20 20 7d  C = c + 1;.    }
c510: 0a 20 20 20 20 7a 43 6f 6c 6c 53 65 71 4e 61 6d  .    zCollSeqNam
c520: 65 20 3d 20 6e 6f 43 61 73 65 20 3f 20 22 4e 4f  e = noCase ? "NO
c530: 43 41 53 45 22 20 3a 20 22 42 49 4e 41 52 59 22  CASE" : "BINARY"
c540: 3b 0a 20 20 20 20 70 4e 65 77 45 78 70 72 31 20  ;.    pNewExpr1 
c550: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
c560: 28 64 62 2c 20 70 4c 65 66 74 2c 20 30 29 3b 0a  (db, pLeft, 0);.
c570: 20 20 20 20 70 4e 65 77 45 78 70 72 31 20 3d 20      pNewExpr1 = 
c580: 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61  sqlite3PExpr(pPa
c590: 72 73 65 2c 20 54 4b 5f 47 45 2c 0a 20 20 20 20  rse, TK_GE,.    
c5a0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
c5b0: 70 72 41 64 64 43 6f 6c 6c 61 74 65 53 74 72 69  prAddCollateStri
c5c0: 6e 67 28 70 50 61 72 73 65 2c 70 4e 65 77 45 78  ng(pParse,pNewEx
c5d0: 70 72 31 2c 7a 43 6f 6c 6c 53 65 71 4e 61 6d 65  pr1,zCollSeqName
c5e0: 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 53  ),.           pS
c5f0: 74 72 31 2c 20 30 29 3b 0a 20 20 20 20 74 72 61  tr1, 0);.    tra
c600: 6e 73 66 65 72 4a 6f 69 6e 4d 61 72 6b 69 6e 67  nsferJoinMarking
c610: 73 28 70 4e 65 77 45 78 70 72 31 2c 20 70 45 78  s(pNewExpr1, pEx
c620: 70 72 29 3b 0a 20 20 20 20 69 64 78 4e 65 77 31  pr);.    idxNew1
c630: 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e   = whereClauseIn
c640: 73 65 72 74 28 70 57 43 2c 20 70 4e 65 77 45 78  sert(pWC, pNewEx
c650: 70 72 31 2c 20 77 74 46 6c 61 67 73 29 3b 0a 20  pr1, wtFlags);. 
c660: 20 20 20 74 65 73 74 63 61 73 65 28 20 69 64 78     testcase( idx
c670: 4e 65 77 31 3d 3d 30 20 29 3b 0a 20 20 20 20 65  New1==0 );.    e
c680: 78 70 72 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c  xprAnalyze(pSrc,
c690: 20 70 57 43 2c 20 69 64 78 4e 65 77 31 29 3b 0a   pWC, idxNew1);.
c6a0: 20 20 20 20 70 4e 65 77 45 78 70 72 32 20 3d 20      pNewExpr2 = 
c6b0: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
c6c0: 62 2c 20 70 4c 65 66 74 2c 20 30 29 3b 0a 20 20  b, pLeft, 0);.  
c6d0: 20 20 70 4e 65 77 45 78 70 72 32 20 3d 20 73 71    pNewExpr2 = sq
c6e0: 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
c6f0: 65 2c 20 54 4b 5f 4c 54 2c 0a 20 20 20 20 20 20  e, TK_LT,.      
c700: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
c710: 41 64 64 43 6f 6c 6c 61 74 65 53 74 72 69 6e 67  AddCollateString
c720: 28 70 50 61 72 73 65 2c 70 4e 65 77 45 78 70 72  (pParse,pNewExpr
c730: 32 2c 7a 43 6f 6c 6c 53 65 71 4e 61 6d 65 29 2c  2,zCollSeqName),
c740: 0a 20 20 20 20 20 20 20 20 20 20 20 70 53 74 72  .           pStr
c750: 32 2c 20 30 29 3b 0a 20 20 20 20 74 72 61 6e 73  2, 0);.    trans
c760: 66 65 72 4a 6f 69 6e 4d 61 72 6b 69 6e 67 73 28  ferJoinMarkings(
c770: 70 4e 65 77 45 78 70 72 32 2c 20 70 45 78 70 72  pNewExpr2, pExpr
c780: 29 3b 0a 20 20 20 20 69 64 78 4e 65 77 32 20 3d  );.    idxNew2 =
c790: 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65   whereClauseInse
c7a0: 72 74 28 70 57 43 2c 20 70 4e 65 77 45 78 70 72  rt(pWC, pNewExpr
c7b0: 32 2c 20 77 74 46 6c 61 67 73 29 3b 0a 20 20 20  2, wtFlags);.   
c7c0: 20 74 65 73 74 63 61 73 65 28 20 69 64 78 4e 65   testcase( idxNe
c7d0: 77 32 3d 3d 30 20 29 3b 0a 20 20 20 20 65 78 70  w2==0 );.    exp
c7e0: 72 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20 70  rAnalyze(pSrc, p
c7f0: 57 43 2c 20 69 64 78 4e 65 77 32 29 3b 0a 20 20  WC, idxNew2);.  
c800: 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e    pTerm = &pWC->
c810: 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20  a[idxTerm];.    
c820: 69 66 28 20 69 73 43 6f 6d 70 6c 65 74 65 20 29  if( isComplete )
c830: 7b 0a 20 20 20 20 20 20 6d 61 72 6b 54 65 72 6d  {.      markTerm
c840: 41 73 43 68 69 6c 64 28 70 57 43 2c 20 69 64 78  AsChild(pWC, idx
c850: 4e 65 77 31 2c 20 69 64 78 54 65 72 6d 29 3b 0a  New1, idxTerm);.
c860: 20 20 20 20 20 20 6d 61 72 6b 54 65 72 6d 41 73        markTermAs
c870: 43 68 69 6c 64 28 70 57 43 2c 20 69 64 78 4e 65  Child(pWC, idxNe
c880: 77 32 2c 20 69 64 78 54 65 72 6d 29 3b 0a 20 20  w2, idxTerm);.  
c890: 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f    }.  }.#endif /
c8a0: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49  * SQLITE_OMIT_LI
c8b0: 4b 45 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20  KE_OPTIMIZATION 
c8c0: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
c8d0: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
c8e0: 41 42 4c 45 0a 20 20 2f 2a 20 41 64 64 20 61 20  ABLE.  /* Add a 
c8f0: 57 4f 5f 4d 41 54 43 48 20 61 75 78 69 6c 69 61  WO_MATCH auxilia
c900: 72 79 20 74 65 72 6d 20 74 6f 20 74 68 65 20 63  ry term to the c
c910: 6f 6e 73 74 72 61 69 6e 74 20 73 65 74 20 69 66  onstraint set if
c920: 20 74 68 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e   the.  ** curren
c930: 74 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  t expression is 
c940: 6f 66 20 74 68 65 20 66 6f 72 6d 3a 20 20 63 6f  of the form:  co
c950: 6c 75 6d 6e 20 4d 41 54 43 48 20 65 78 70 72 2e  lumn MATCH expr.
c960: 0a 20 20 2a 2a 20 54 68 69 73 20 69 6e 66 6f 72  .  ** This infor
c970: 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 62  mation is used b
c980: 79 20 74 68 65 20 78 42 65 73 74 49 6e 64 65 78  y the xBestIndex
c990: 20 6d 65 74 68 6f 64 73 20 6f 66 0a 20 20 2a 2a   methods of.  **
c9a0: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 2e   virtual tables.
c9b0: 20 20 54 68 65 20 6e 61 74 69 76 65 20 71 75 65    The native que
c9c0: 72 79 20 6f 70 74 69 6d 69 7a 65 72 20 64 6f 65  ry optimizer doe
c9d0: 73 20 6e 6f 74 20 61 74 74 65 6d 70 74 0a 20 20  s not attempt.  
c9e0: 2a 2a 20 74 6f 20 64 6f 20 61 6e 79 74 68 69 6e  ** to do anythin
c9f0: 67 20 77 69 74 68 20 4d 41 54 43 48 20 66 75 6e  g with MATCH fun
ca00: 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69  ctions..  */.  i
ca10: 66 28 20 69 73 4d 61 74 63 68 4f 66 43 6f 6c 75  f( isMatchOfColu
ca20: 6d 6e 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20  mn(pExpr) ){.   
ca30: 20 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20 20   int idxNew;.   
ca40: 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c 20 2a   Expr *pRight, *
ca50: 70 4c 65 66 74 3b 0a 20 20 20 20 57 68 65 72 65  pLeft;.    Where
ca60: 54 65 72 6d 20 2a 70 4e 65 77 54 65 72 6d 3b 0a  Term *pNewTerm;.
ca70: 20 20 20 20 42 69 74 6d 61 73 6b 20 70 72 65 72      Bitmask prer
ca80: 65 71 43 6f 6c 75 6d 6e 2c 20 70 72 65 72 65 71  eqColumn, prereq
ca90: 45 78 70 72 3b 0a 0a 20 20 20 20 70 52 69 67 68  Expr;..    pRigh
caa0: 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  t = pExpr->x.pLi
cab0: 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a  st->a[0].pExpr;.
cac0: 20 20 20 20 70 4c 65 66 74 20 3d 20 70 45 78 70      pLeft = pExp
cad0: 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 31 5d  r->x.pList->a[1]
cae0: 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 72 65 72  .pExpr;.    prer
caf0: 65 71 45 78 70 72 20 3d 20 65 78 70 72 54 61 62  eqExpr = exprTab
cb00: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
cb10: 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20 70  , pRight);.    p
cb20: 72 65 72 65 71 43 6f 6c 75 6d 6e 20 3d 20 65 78  rereqColumn = ex
cb30: 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  prTableUsage(pMa
cb40: 73 6b 53 65 74 2c 20 70 4c 65 66 74 29 3b 0a 20  skSet, pLeft);. 
cb50: 20 20 20 69 66 28 20 28 70 72 65 72 65 71 45 78     if( (prereqEx
cb60: 70 72 20 26 20 70 72 65 72 65 71 43 6f 6c 75 6d  pr & prereqColum
cb70: 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 45  n)==0 ){.      E
cb80: 78 70 72 20 2a 70 4e 65 77 45 78 70 72 3b 0a 20  xpr *pNewExpr;. 
cb90: 20 20 20 20 20 70 4e 65 77 45 78 70 72 20 3d 20       pNewExpr = 
cba0: 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61  sqlite3PExpr(pPa
cbb0: 72 73 65 2c 20 54 4b 5f 4d 41 54 43 48 2c 20 0a  rse, TK_MATCH, .
cbc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cbd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c                0,
cbe0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
cbf0: 64 62 2c 20 70 52 69 67 68 74 2c 20 30 29 2c 20  db, pRight, 0), 
cc00: 30 29 3b 0a 20 20 20 20 20 20 69 64 78 4e 65 77  0);.      idxNew
cc10: 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e   = whereClauseIn
cc20: 73 65 72 74 28 70 57 43 2c 20 70 4e 65 77 45 78  sert(pWC, pNewEx
cc30: 70 72 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  pr, TERM_VIRTUAL
cc40: 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a  |TERM_DYNAMIC);.
cc50: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
cc60: 69 64 78 4e 65 77 3d 3d 30 20 29 3b 0a 20 20 20  idxNew==0 );.   
cc70: 20 20 20 70 4e 65 77 54 65 72 6d 20 3d 20 26 70     pNewTerm = &p
cc80: 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 3b 0a 20  WC->a[idxNew];. 
cc90: 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 70       pNewTerm->p
cca0: 72 65 72 65 71 52 69 67 68 74 20 3d 20 70 72 65  rereqRight = pre
ccb0: 72 65 71 45 78 70 72 3b 0a 20 20 20 20 20 20 70  reqExpr;.      p
ccc0: 4e 65 77 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72  NewTerm->leftCur
ccd0: 73 6f 72 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61  sor = pLeft->iTa
cce0: 62 6c 65 3b 0a 20 20 20 20 20 20 70 4e 65 77 54  ble;.      pNewT
ccf0: 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d  erm->u.leftColum
cd00: 6e 20 3d 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75  n = pLeft->iColu
cd10: 6d 6e 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65  mn;.      pNewTe
cd20: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20  rm->eOperator = 
cd30: 57 4f 5f 4d 41 54 43 48 3b 0a 20 20 20 20 20 20  WO_MATCH;.      
cd40: 6d 61 72 6b 54 65 72 6d 41 73 43 68 69 6c 64 28  markTermAsChild(
cd50: 70 57 43 2c 20 69 64 78 4e 65 77 2c 20 69 64 78  pWC, idxNew, idx
cd60: 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 70 54 65  Term);.      pTe
cd70: 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78  rm = &pWC->a[idx
cd80: 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 70 54 65  Term];.      pTe
cd90: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54  rm->wtFlags |= T
cda0: 45 52 4d 5f 43 4f 50 49 45 44 3b 0a 20 20 20 20  ERM_COPIED;.    
cdb0: 20 20 70 4e 65 77 54 65 72 6d 2d 3e 70 72 65 72    pNewTerm->prer
cdc0: 65 71 41 6c 6c 20 3d 20 70 54 65 72 6d 2d 3e 70  eqAll = pTerm->p
cdd0: 72 65 72 65 71 41 6c 6c 3b 0a 20 20 20 20 7d 0a  rereqAll;.    }.
cde0: 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
cdf0: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
ce00: 4c 54 41 42 4c 45 20 2a 2f 0a 0a 23 69 66 64 65  LTABLE */..#ifde
ce10: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
ce20: 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20  STAT3_OR_STAT4. 
ce30: 20 2f 2a 20 57 68 65 6e 20 73 71 6c 69 74 65 5f   /* When sqlite_
ce40: 73 74 61 74 33 20 68 69 73 74 6f 67 72 61 6d 20  stat3 histogram 
ce50: 64 61 74 61 20 69 73 20 61 76 61 69 6c 61 62 6c  data is availabl
ce60: 65 20 61 6e 20 6f 70 65 72 61 74 6f 72 20 6f 66  e an operator of
ce70: 20 74 68 65 0a 20 20 2a 2a 20 66 6f 72 6d 20 22   the.  ** form "
ce80: 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 22 20 63  x IS NOT NULL" c
ce90: 61 6e 20 73 6f 6d 65 74 69 6d 65 73 20 62 65 20  an sometimes be 
cea0: 65 76 61 6c 75 61 74 65 64 20 6d 6f 72 65 20 65  evaluated more e
ceb0: 66 66 69 63 69 65 6e 74 6c 79 0a 20 20 2a 2a 20  fficiently.  ** 
cec0: 61 73 20 22 78 3e 4e 55 4c 4c 22 20 69 66 20 78  as "x>NULL" if x
ced0: 20 69 73 20 6e 6f 74 20 61 6e 20 49 4e 54 45 47   is not an INTEG
cee0: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 20  ER PRIMARY KEY. 
cef0: 20 53 6f 20 63 6f 6e 73 74 72 75 63 74 20 61 0a   So construct a.
cf00: 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 74 65 72    ** virtual ter
cf10: 6d 20 6f 66 20 74 68 61 74 20 66 6f 72 6d 2e 0a  m of that form..
cf20: 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65 20 74    **.  ** Note t
cf30: 68 61 74 20 74 68 65 20 76 69 72 74 75 61 6c 20  hat the virtual 
cf40: 74 65 72 6d 20 6d 75 73 74 20 62 65 20 74 61 67  term must be tag
cf50: 67 65 64 20 77 69 74 68 20 54 45 52 4d 5f 56 4e  ged with TERM_VN
cf60: 55 4c 4c 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20  ULL.  This.  ** 
cf70: 54 45 52 4d 5f 56 4e 55 4c 4c 20 74 61 67 20 77  TERM_VNULL tag w
cf80: 69 6c 6c 20 73 75 70 70 72 65 73 73 20 74 68 65  ill suppress the
cf90: 20 6e 6f 74 2d 6e 75 6c 6c 20 63 68 65 63 6b 20   not-null check 
cfa0: 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  at the beginning
cfb0: 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 6c 6f 6f  .  ** of the loo
cfc0: 70 2e 20 20 57 69 74 68 6f 75 74 20 74 68 65 20  p.  Without the 
cfd0: 54 45 52 4d 5f 56 4e 55 4c 4c 20 66 6c 61 67 2c  TERM_VNULL flag,
cfe0: 20 74 68 65 20 6e 6f 74 2d 6e 75 6c 6c 20 63 68   the not-null ch
cff0: 65 63 6b 20 61 74 0a 20 20 2a 2a 20 74 68 65 20  eck at.  ** the 
d000: 73 74 61 72 74 20 6f 66 20 74 68 65 20 6c 6f 6f  start of the loo
d010: 70 20 77 69 6c 6c 20 70 72 65 76 65 6e 74 20 61  p will prevent a
d020: 6e 79 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20  ny results from 
d030: 62 65 69 6e 67 20 72 65 74 75 72 6e 65 64 2e 0a  being returned..
d040: 20 20 2a 2f 0a 20 20 69 66 28 20 70 45 78 70 72    */.  if( pExpr
d050: 2d 3e 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c  ->op==TK_NOTNULL
d060: 0a 20 20 20 26 26 20 70 45 78 70 72 2d 3e 70 4c  .   && pExpr->pL
d070: 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  eft->op==TK_COLU
d080: 4d 4e 0a 20 20 20 26 26 20 70 45 78 70 72 2d 3e  MN.   && pExpr->
d090: 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d  pLeft->iColumn>=
d0a0: 30 0a 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61  0.   && Optimiza
d0b0: 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20  tionEnabled(db, 
d0c0: 53 51 4c 49 54 45 5f 53 74 61 74 33 34 29 0a 20  SQLITE_Stat34). 
d0d0: 20 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 4e   ){.    Expr *pN
d0e0: 65 77 45 78 70 72 3b 0a 20 20 20 20 45 78 70 72  ewExpr;.    Expr
d0f0: 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d   *pLeft = pExpr-
d100: 3e 70 4c 65 66 74 3b 0a 20 20 20 20 69 6e 74 20  >pLeft;.    int 
d110: 69 64 78 4e 65 77 3b 0a 20 20 20 20 57 68 65 72  idxNew;.    Wher
d120: 65 54 65 72 6d 20 2a 70 4e 65 77 54 65 72 6d 3b  eTerm *pNewTerm;
d130: 0a 0a 20 20 20 20 70 4e 65 77 45 78 70 72 20 3d  ..    pNewExpr =
d140: 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
d150: 61 72 73 65 2c 20 54 4b 5f 47 54 2c 0a 20 20 20  arse, TK_GT,.   
d160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d170: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
d180: 45 78 70 72 44 75 70 28 64 62 2c 20 70 4c 65 66  ExprDup(db, pLef
d190: 74 2c 20 30 29 2c 0a 20 20 20 20 20 20 20 20 20  t, 0),.         
d1a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d1b0: 20 20 20 73 71 6c 69 74 65 33 50 45 78 70 72 28     sqlite3PExpr(
d1c0: 70 50 61 72 73 65 2c 20 54 4b 5f 4e 55 4c 4c 2c  pParse, TK_NULL,
d1d0: 20 30 2c 20 30 2c 20 30 29 2c 20 30 29 3b 0a 0a   0, 0, 0), 0);..
d1e0: 20 20 20 20 69 64 78 4e 65 77 20 3d 20 77 68 65      idxNew = whe
d1f0: 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70  reClauseInsert(p
d200: 57 43 2c 20 70 4e 65 77 45 78 70 72 2c 0a 20 20  WC, pNewExpr,.  
d210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d220: 20 20 20 20 20 20 20 20 20 20 20 20 54 45 52 4d              TERM
d230: 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59  _VIRTUAL|TERM_DY
d240: 4e 41 4d 49 43 7c 54 45 52 4d 5f 56 4e 55 4c 4c  NAMIC|TERM_VNULL
d250: 29 3b 0a 20 20 20 20 69 66 28 20 69 64 78 4e 65  );.    if( idxNe
d260: 77 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 54  w ){.      pNewT
d270: 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64  erm = &pWC->a[id
d280: 78 4e 65 77 5d 3b 0a 20 20 20 20 20 20 70 4e 65  xNew];.      pNe
d290: 77 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  wTerm->prereqRig
d2a0: 68 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4e  ht = 0;.      pN
d2b0: 65 77 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73  ewTerm->leftCurs
d2c0: 6f 72 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62  or = pLeft->iTab
d2d0: 6c 65 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65  le;.      pNewTe
d2e0: 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e  rm->u.leftColumn
d2f0: 20 3d 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d   = pLeft->iColum
d300: 6e 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72  n;.      pNewTer
d310: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 57  m->eOperator = W
d320: 4f 5f 47 54 3b 0a 20 20 20 20 20 20 6d 61 72 6b  O_GT;.      mark
d330: 54 65 72 6d 41 73 43 68 69 6c 64 28 70 57 43 2c  TermAsChild(pWC,
d340: 20 69 64 78 4e 65 77 2c 20 69 64 78 54 65 72 6d   idxNew, idxTerm
d350: 29 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d  );.      pTerm =
d360: 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d   &pWC->a[idxTerm
d370: 5d 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e  ];.      pTerm->
d380: 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f  wtFlags |= TERM_
d390: 43 4f 50 49 45 44 3b 0a 20 20 20 20 20 20 70 4e  COPIED;.      pN
d3a0: 65 77 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c  ewTerm->prereqAl
d3b0: 6c 20 3d 20 70 54 65 72 6d 2d 3e 70 72 65 72 65  l = pTerm->prere
d3c0: 71 41 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  qAll;.    }.  }.
d3d0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
d3e0: 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52  _ENABLE_STAT3_OR
d3f0: 5f 53 54 41 54 34 20 2a 2f 0a 0a 20 20 2f 2a 20  _STAT4 */..  /* 
d400: 50 72 65 76 65 6e 74 20 4f 4e 20 63 6c 61 75 73  Prevent ON claus
d410: 65 20 74 65 72 6d 73 20 6f 66 20 61 20 4c 45 46  e terms of a LEF
d420: 54 20 4a 4f 49 4e 20 66 72 6f 6d 20 62 65 69 6e  T JOIN from bein
d430: 67 20 75 73 65 64 20 74 6f 20 64 72 69 76 65 0a  g used to drive.
d440: 20 20 2a 2a 20 61 6e 20 69 6e 64 65 78 20 66 6f    ** an index fo
d450: 72 20 74 61 62 6c 65 73 20 74 6f 20 74 68 65 20  r tables to the 
d460: 6c 65 66 74 20 6f 66 20 74 68 65 20 6a 6f 69 6e  left of the join
d470: 2e 0a 20 20 2a 2f 0a 20 20 70 54 65 72 6d 2d 3e  ..  */.  pTerm->
d480: 70 72 65 72 65 71 52 69 67 68 74 20 7c 3d 20 65  prereqRight |= e
d490: 78 74 72 61 52 69 67 68 74 3b 0a 7d 0a 0a 2f 2a  xtraRight;.}../*
d4a0: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
d4b0: 6e 20 73 65 61 72 63 68 65 73 20 70 4c 69 73 74  n searches pList
d4c0: 20 66 6f 72 20 61 6e 20 65 6e 74 72 79 20 74 68   for an entry th
d4d0: 61 74 20 6d 61 74 63 68 65 73 20 74 68 65 20 69  at matches the i
d4e0: 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 0a 2a 2a  Col-th column.**
d4f0: 20 6f 66 20 69 6e 64 65 78 20 70 49 64 78 2e 0a   of index pIdx..
d500: 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 68 20 61 6e  **.** If such an
d510: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66   expression is f
d520: 6f 75 6e 64 2c 20 69 74 73 20 69 6e 64 65 78 20  ound, its index 
d530: 69 6e 20 70 4c 69 73 74 2d 3e 61 5b 5d 20 69 73  in pList->a[] is
d540: 20 72 65 74 75 72 6e 65 64 2e 20 49 66 0a 2a 2a   returned. If.**
d550: 20 6e 6f 20 65 78 70 72 65 73 73 69 6f 6e 20 69   no expression i
d560: 73 20 66 6f 75 6e 64 2c 20 2d 31 20 69 73 20 72  s found, -1 is r
d570: 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
d580: 69 63 20 69 6e 74 20 66 69 6e 64 49 6e 64 65 78  ic int findIndex
d590: 43 6f 6c 28 0a 20 20 50 61 72 73 65 20 2a 70 50  Col(.  Parse *pP
d5a0: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  arse,           
d5b0: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20         /* Parse 
d5c0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
d5d0: 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20  rList *pList,   
d5e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d5f0: 45 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20  Expression list 
d600: 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 69  to search */.  i
d610: 6e 74 20 69 42 61 73 65 2c 20 20 20 20 20 20 20  nt iBase,       
d620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d630: 2a 20 43 75 72 73 6f 72 20 66 6f 72 20 74 61 62  * Cursor for tab
d640: 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  le associated wi
d650: 74 68 20 70 49 64 78 20 2a 2f 0a 20 20 49 6e 64  th pIdx */.  Ind
d660: 65 78 20 2a 70 49 64 78 2c 20 20 20 20 20 20 20  ex *pIdx,       
d670: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d680: 49 6e 64 65 78 20 74 6f 20 6d 61 74 63 68 20 63  Index to match c
d690: 6f 6c 75 6d 6e 20 6f 66 20 2a 2f 0a 20 20 69 6e  olumn of */.  in
d6a0: 74 20 69 43 6f 6c 20 20 20 20 20 20 20 20 20 20  t iCol          
d6b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d6c0: 20 43 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78   Column of index
d6d0: 20 74 6f 20 6d 61 74 63 68 20 2a 2f 0a 29 7b 0a   to match */.){.
d6e0: 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74    int i;.  const
d6f0: 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70   char *zColl = p
d700: 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 43 6f 6c  Idx->azColl[iCol
d710: 5d 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  ];..  for(i=0; i
d720: 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  <pList->nExpr; i
d730: 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
d740: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b   = sqlite3ExprSk
d750: 69 70 43 6f 6c 6c 61 74 65 28 70 4c 69 73 74 2d  ipCollate(pList-
d760: 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[i].pExpr);.  
d770: 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f    if( p->op==TK_
d780: 43 4f 4c 55 4d 4e 0a 20 20 20 20 20 26 26 20 70  COLUMN.     && p
d790: 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 49 64 78 2d  ->iColumn==pIdx-
d7a0: 3e 61 69 43 6f 6c 75 6d 6e 5b 69 43 6f 6c 5d 0a  >aiColumn[iCol].
d7b0: 20 20 20 20 20 26 26 20 70 2d 3e 69 54 61 62 6c       && p->iTabl
d7c0: 65 3d 3d 69 42 61 73 65 0a 20 20 20 20 29 7b 0a  e==iBase.    ){.
d7d0: 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
d7e0: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
d7f0: 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
d800: 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  , pList->a[i].pE
d810: 78 70 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  xpr);.      if( 
d820: 41 4c 57 41 59 53 28 70 43 6f 6c 6c 29 20 26 26  ALWAYS(pColl) &&
d830: 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43   0==sqlite3StrIC
d840: 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c  mp(pColl->zName,
d850: 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 20   zColl) ){.     
d860: 20 20 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 20     return i;.   
d870: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
d880: 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a    return -1;.}..
d890: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
d8a0: 65 20 69 66 20 74 68 65 20 44 49 53 54 49 4e 43  e if the DISTINC
d8b0: 54 20 65 78 70 72 65 73 73 69 6f 6e 2d 6c 69 73  T expression-lis
d8c0: 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  t passed as the 
d8d0: 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74 0a 2a  third argument.*
d8e0: 2a 20 69 73 20 72 65 64 75 6e 64 61 6e 74 2e 0a  * is redundant..
d8f0: 2a 2a 0a 2a 2a 20 41 20 44 49 53 54 49 4e 43 54  **.** A DISTINCT
d900: 20 6c 69 73 74 20 69 73 20 72 65 64 75 6e 64 61   list is redunda
d910: 6e 74 20 69 66 20 74 68 65 20 64 61 74 61 62 61  nt if the databa
d920: 73 65 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65  se contains some
d930: 20 73 75 62 73 65 74 20 6f 66 0a 2a 2a 20 63 6f   subset of.** co
d940: 6c 75 6d 6e 73 20 74 68 61 74 20 61 72 65 20 75  lumns that are u
d950: 6e 69 71 75 65 20 61 6e 64 20 6e 6f 6e 2d 6e 75  nique and non-nu
d960: 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ll..*/.static in
d970: 74 20 69 73 44 69 73 74 69 6e 63 74 52 65 64 75  t isDistinctRedu
d980: 6e 64 61 6e 74 28 0a 20 20 50 61 72 73 65 20 2a  ndant(.  Parse *
d990: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
d9a0: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
d9b0: 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69  ntext */.  SrcLi
d9c0: 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 20  st *pTabList,   
d9d0: 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d       /* The FROM
d9e0: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65   clause */.  Whe
d9f0: 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20  reClause *pWC,  
da00: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48         /* The WH
da10: 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
da20: 45 78 70 72 4c 69 73 74 20 2a 70 44 69 73 74 69  ExprList *pDisti
da30: 6e 63 74 20 20 20 20 20 20 20 2f 2a 20 54 68 65  nct       /* The
da40: 20 72 65 73 75 6c 74 20 73 65 74 20 74 68 61 74   result set that
da50: 20 6e 65 65 64 73 20 74 6f 20 62 65 20 44 49 53   needs to be DIS
da60: 54 49 4e 43 54 20 2a 2f 0a 29 7b 0a 20 20 54 61  TINCT */.){.  Ta
da70: 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 49 6e 64  ble *pTab;.  Ind
da80: 65 78 20 2a 70 49 64 78 3b 0a 20 20 69 6e 74 20  ex *pIdx;.  int 
da90: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
daa0: 20 20 20 20 20 20 20 20 20 20 20 20 0a 20 20 69              .  i
dab0: 6e 74 20 69 42 61 73 65 3b 0a 0a 20 20 2f 2a 20  nt iBase;..  /* 
dac0: 49 66 20 74 68 65 72 65 20 69 73 20 6d 6f 72 65  If there is more
dad0: 20 74 68 61 6e 20 6f 6e 65 20 74 61 62 6c 65 20   than one table 
dae0: 6f 72 20 73 75 62 2d 73 65 6c 65 63 74 20 69 6e  or sub-select in
daf0: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
db00: 20 6f 66 0a 20 20 2a 2a 20 74 68 69 73 20 71 75   of.  ** this qu
db10: 65 72 79 2c 20 74 68 65 6e 20 69 74 20 77 69 6c  ery, then it wil
db20: 6c 20 6e 6f 74 20 62 65 20 70 6f 73 73 69 62 6c  l not be possibl
db30: 65 20 74 6f 20 73 68 6f 77 20 74 68 61 74 20 74  e to show that t
db40: 68 65 20 44 49 53 54 49 4e 43 54 20 0a 20 20 2a  he DISTINCT .  *
db50: 2a 20 63 6c 61 75 73 65 20 69 73 20 72 65 64 75  * clause is redu
db60: 6e 64 61 6e 74 2e 20 2a 2f 0a 20 20 69 66 28 20  ndant. */.  if( 
db70: 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 21 3d  pTabList->nSrc!=
db80: 31 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  1 ) return 0;.  
db90: 69 42 61 73 65 20 3d 20 70 54 61 62 4c 69 73 74  iBase = pTabList
dba0: 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72 3b 0a  ->a[0].iCursor;.
dbb0: 20 20 70 54 61 62 20 3d 20 70 54 61 62 4c 69 73    pTab = pTabLis
dbc0: 74 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 0a 20  t->a[0].pTab;.. 
dbd0: 20 2f 2a 20 49 66 20 61 6e 79 20 6f 66 20 74 68   /* If any of th
dbe0: 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 73  e expressions is
dbf0: 20 61 6e 20 49 50 4b 20 63 6f 6c 75 6d 6e 20 6f   an IPK column o
dc00: 6e 20 74 61 62 6c 65 20 69 42 61 73 65 2c 20 74  n table iBase, t
dc10: 68 65 6e 20 72 65 74 75 72 6e 20 0a 20 20 2a 2a  hen return .  **
dc20: 20 74 72 75 65 2e 20 4e 6f 74 65 3a 20 54 68 65   true. Note: The
dc30: 20 28 70 2d 3e 69 54 61 62 6c 65 3d 3d 69 42 61   (p->iTable==iBa
dc40: 73 65 29 20 70 61 72 74 20 6f 66 20 74 68 69 73  se) part of this
dc50: 20 74 65 73 74 20 6d 61 79 20 62 65 20 66 61 6c   test may be fal
dc60: 73 65 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 63  se if the.  ** c
dc70: 75 72 72 65 6e 74 20 53 45 4c 45 43 54 20 69 73  urrent SELECT is
dc80: 20 61 20 63 6f 72 72 65 6c 61 74 65 64 20 73 75   a correlated su
dc90: 62 2d 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20  b-query..  */.  
dca0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 44 69 73 74  for(i=0; i<pDist
dcb0: 69 6e 63 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  inct->nExpr; i++
dcc0: 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 20 3d  ){.    Expr *p =
dcd0: 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70   sqlite3ExprSkip
dce0: 43 6f 6c 6c 61 74 65 28 70 44 69 73 74 69 6e 63  Collate(pDistinc
dcf0: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a  t->a[i].pExpr);.
dd00: 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54      if( p->op==T
dd10: 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 2d 3e 69  K_COLUMN && p->i
dd20: 54 61 62 6c 65 3d 3d 69 42 61 73 65 20 26 26 20  Table==iBase && 
dd30: 70 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 20 72  p->iColumn<0 ) r
dd40: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20  eturn 1;.  }..  
dd50: 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20  /* Loop through 
dd60: 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f 6e 20 74  all indices on t
dd70: 68 65 20 74 61 62 6c 65 2c 20 63 68 65 63 6b 69  he table, checki
dd80: 6e 67 20 65 61 63 68 20 74 6f 20 73 65 65 20 69  ng each to see i
dd90: 66 20 69 74 20 6d 61 6b 65 73 0a 20 20 2a 2a 20  f it makes.  ** 
dda0: 74 68 65 20 44 49 53 54 49 4e 43 54 20 71 75 61  the DISTINCT qua
ddb0: 6c 69 66 69 65 72 20 72 65 64 75 6e 64 61 6e 74  lifier redundant
ddc0: 2e 20 49 74 20 64 6f 65 73 20 73 6f 20 69 66 3a  . It does so if:
ddd0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 31 2e 20  .  **.  **   1. 
dde0: 54 68 65 20 69 6e 64 65 78 20 69 73 20 69 74 73  The index is its
ddf0: 65 6c 66 20 55 4e 49 51 55 45 2c 20 61 6e 64 0a  elf UNIQUE, and.
de00: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 32 2e 20 41    **.  **   2. A
de10: 6c 6c 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  ll of the column
de20: 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78 20 61  s in the index a
de30: 72 65 20 65 69 74 68 65 72 20 70 61 72 74 20 6f  re either part o
de40: 66 20 74 68 65 20 70 44 69 73 74 69 6e 63 74 0a  f the pDistinct.
de50: 20 20 2a 2a 20 20 20 20 20 20 6c 69 73 74 2c 20    **      list, 
de60: 6f 72 20 65 6c 73 65 20 74 68 65 20 57 48 45 52  or else the WHER
de70: 45 20 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e  E clause contain
de80: 73 20 61 20 74 65 72 6d 20 6f 66 20 74 68 65 20  s a term of the 
de90: 66 6f 72 6d 20 22 63 6f 6c 3d 58 22 2c 0a 20 20  form "col=X",.  
dea0: 2a 2a 20 20 20 20 20 20 77 68 65 72 65 20 58 20  **      where X 
deb0: 69 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 76 61  is a constant va
dec0: 6c 75 65 2e 20 54 68 65 20 63 6f 6c 6c 61 74 69  lue. The collati
ded0: 6f 6e 20 73 65 71 75 65 6e 63 65 73 20 6f 66 20  on sequences of 
dee0: 74 68 65 0a 20 20 2a 2a 20 20 20 20 20 20 63 6f  the.  **      co
def0: 6d 70 61 72 69 73 6f 6e 20 61 6e 64 20 73 65 6c  mparison and sel
df00: 65 63 74 2d 6c 69 73 74 20 65 78 70 72 65 73 73  ect-list express
df10: 69 6f 6e 73 20 6d 75 73 74 20 6d 61 74 63 68 20  ions must match 
df20: 74 68 6f 73 65 20 6f 66 20 74 68 65 20 69 6e 64  those of the ind
df30: 65 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ex..  **.  **   
df40: 33 2e 20 41 6c 6c 20 6f 66 20 74 68 6f 73 65 20  3. All of those 
df50: 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20 66 6f  index columns fo
df60: 72 20 77 68 69 63 68 20 74 68 65 20 57 48 45 52  r which the WHER
df70: 45 20 63 6c 61 75 73 65 20 64 6f 65 73 20 6e 6f  E clause does no
df80: 74 0a 20 20 2a 2a 20 20 20 20 20 20 63 6f 6e 74  t.  **      cont
df90: 61 69 6e 20 61 20 22 63 6f 6c 3d 58 22 20 74 65  ain a "col=X" te
dfa0: 72 6d 20 61 72 65 20 73 75 62 6a 65 63 74 20 74  rm are subject t
dfb0: 6f 20 61 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e  o a NOT NULL con
dfc0: 73 74 72 61 69 6e 74 2e 0a 20 20 2a 2f 0a 20 20  straint..  */.  
dfd0: 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70  for(pIdx=pTab->p
dfe0: 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64  Index; pIdx; pId
dff0: 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a  x=pIdx->pNext){.
e000: 20 20 20 20 69 66 28 20 21 49 73 55 6e 69 71 75      if( !IsUniqu
e010: 65 49 6e 64 65 78 28 70 49 64 78 29 20 29 20 63  eIndex(pIdx) ) c
e020: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 66 6f 72  ontinue;.    for
e030: 28 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 4b  (i=0; i<pIdx->nK
e040: 65 79 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  eyCol; i++){.   
e050: 20 20 20 69 31 36 20 69 43 6f 6c 20 3d 20 70 49     i16 iCol = pI
e060: 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b  dx->aiColumn[i];
e070: 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 66 69  .      if( 0==fi
e080: 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 42 61 73  ndTerm(pWC, iBas
e090: 65 2c 20 69 43 6f 6c 2c 20 7e 28 42 69 74 6d 61  e, iCol, ~(Bitma
e0a0: 73 6b 29 30 2c 20 57 4f 5f 45 51 2c 20 70 49 64  sk)0, WO_EQ, pId
e0b0: 78 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  x) ){.        in
e0c0: 74 20 69 49 64 78 43 6f 6c 20 3d 20 66 69 6e 64  t iIdxCol = find
e0d0: 49 6e 64 65 78 43 6f 6c 28 70 50 61 72 73 65 2c  IndexCol(pParse,
e0e0: 20 70 44 69 73 74 69 6e 63 74 2c 20 69 42 61 73   pDistinct, iBas
e0f0: 65 2c 20 70 49 64 78 2c 20 69 29 3b 0a 20 20 20  e, pIdx, i);.   
e100: 20 20 20 20 20 69 66 28 20 69 49 64 78 43 6f 6c       if( iIdxCol
e110: 3c 30 20 7c 7c 20 70 54 61 62 2d 3e 61 43 6f 6c  <0 || pTab->aCol
e120: 5b 69 43 6f 6c 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d  [iCol].notNull==
e130: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62  0 ){.          b
e140: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
e150: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
e160: 20 20 69 66 28 20 69 3d 3d 70 49 64 78 2d 3e 6e    if( i==pIdx->n
e170: 4b 65 79 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20  KeyCol ){.      
e180: 2f 2a 20 54 68 69 73 20 69 6e 64 65 78 20 69 6d  /* This index im
e190: 70 6c 69 65 73 20 74 68 61 74 20 74 68 65 20 44  plies that the D
e1a0: 49 53 54 49 4e 43 54 20 71 75 61 6c 69 66 69 65  ISTINCT qualifie
e1b0: 72 20 69 73 20 72 65 64 75 6e 64 61 6e 74 2e 20  r is redundant. 
e1c0: 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
e1d0: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  1;.    }.  }..  
e1e0: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a  return 0;.}.../*
e1f0: 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65  .** Estimate the
e200: 20 6c 6f 67 61 72 69 74 68 6d 20 6f 66 20 74 68   logarithm of th
e210: 65 20 69 6e 70 75 74 20 76 61 6c 75 65 20 74 6f  e input value to
e220: 20 62 61 73 65 20 32 2e 0a 2a 2f 0a 73 74 61 74   base 2..*/.stat
e230: 69 63 20 4c 6f 67 45 73 74 20 65 73 74 4c 6f 67  ic LogEst estLog
e240: 28 4c 6f 67 45 73 74 20 4e 29 7b 0a 20 20 72 65  (LogEst N){.  re
e250: 74 75 72 6e 20 4e 3c 3d 31 30 20 3f 20 30 20 3a  turn N<=10 ? 0 :
e260: 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 4e   sqlite3LogEst(N
e270: 29 20 2d 20 33 33 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ) - 33;.}../*.**
e280: 20 54 77 6f 20 72 6f 75 74 69 6e 65 73 20 66 6f   Two routines fo
e290: 72 20 70 72 69 6e 74 69 6e 67 20 74 68 65 20 63  r printing the c
e2a0: 6f 6e 74 65 6e 74 20 6f 66 20 61 6e 20 73 71 6c  ontent of an sql
e2b0: 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 0a  ite3_index_info.
e2c0: 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 20 20 55  ** structure.  U
e2d0: 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20  sed for testing 
e2e0: 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f 6e  and debugging on
e2f0: 6c 79 2e 20 20 49 66 20 6e 65 69 74 68 65 72 0a  ly.  If neither.
e300: 2a 2a 20 53 51 4c 49 54 45 5f 54 45 53 54 20 6f  ** SQLITE_TEST o
e310: 72 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 61  r SQLITE_DEBUG a
e320: 72 65 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e  re defined, then
e330: 20 74 68 65 73 65 20 72 6f 75 74 69 6e 65 73 0a   these routines.
e340: 2a 2a 20 61 72 65 20 6e 6f 2d 6f 70 73 2e 0a 2a  ** are no-ops..*
e350: 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  /.#if !defined(S
e360: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
e370: 41 4c 54 41 42 4c 45 29 20 26 26 20 64 65 66 69  ALTABLE) && defi
e380: 6e 65 64 28 57 48 45 52 45 54 52 41 43 45 5f 45  ned(WHERETRACE_E
e390: 4e 41 42 4c 45 44 29 0a 73 74 61 74 69 63 20 76  NABLED).static v
e3a0: 6f 69 64 20 54 52 41 43 45 5f 49 44 58 5f 49 4e  oid TRACE_IDX_IN
e3b0: 50 55 54 53 28 73 71 6c 69 74 65 33 5f 69 6e 64  PUTS(sqlite3_ind
e3c0: 65 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 69  ex_info *p){.  i
e3d0: 6e 74 20 69 3b 0a 20 20 69 66 28 20 21 73 71 6c  nt i;.  if( !sql
e3e0: 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20 29  ite3WhereTrace )
e3f0: 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69   return;.  for(i
e400: 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72  =0; i<p->nConstr
e410: 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  aint; i++){.    
e420: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
e430: 74 66 28 22 20 20 63 6f 6e 73 74 72 61 69 6e 74  tf("  constraint
e440: 5b 25 64 5d 3a 20 63 6f 6c 3d 25 64 20 74 65 72  [%d]: col=%d ter
e450: 6d 69 64 3d 25 64 20 6f 70 3d 25 64 20 75 73 61  mid=%d op=%d usa
e460: 62 6c 65 64 3d 25 64 5c 6e 22 2c 0a 20 20 20 20  bled=%d\n",.    
e470: 20 20 20 69 2c 0a 20 20 20 20 20 20 20 70 2d 3e     i,.       p->
e480: 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 69  aConstraint[i].i
e490: 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 70  Column,.       p
e4a0: 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d  ->aConstraint[i]
e4b0: 2e 69 54 65 72 6d 4f 66 66 73 65 74 2c 0a 20 20  .iTermOffset,.  
e4c0: 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61       p->aConstra
e4d0: 69 6e 74 5b 69 5d 2e 6f 70 2c 0a 20 20 20 20 20  int[i].op,.     
e4e0: 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74    p->aConstraint
e4f0: 5b 69 5d 2e 75 73 61 62 6c 65 29 3b 0a 20 20 7d  [i].usable);.  }
e500: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
e510: 3e 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b  >nOrderBy; i++){
e520: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
e530: 67 50 72 69 6e 74 66 28 22 20 20 6f 72 64 65 72  gPrintf("  order
e540: 62 79 5b 25 64 5d 3a 20 63 6f 6c 3d 25 64 20 64  by[%d]: col=%d d
e550: 65 73 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  esc=%d\n",.     
e560: 20 20 69 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61    i,.       p->a
e570: 4f 72 64 65 72 42 79 5b 69 5d 2e 69 43 6f 6c 75  OrderBy[i].iColu
e580: 6d 6e 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 4f  mn,.       p->aO
e590: 72 64 65 72 42 79 5b 69 5d 2e 64 65 73 63 29 3b  rderBy[i].desc);
e5a0: 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f  .  }.}.static vo
e5b0: 69 64 20 54 52 41 43 45 5f 49 44 58 5f 4f 55 54  id TRACE_IDX_OUT
e5c0: 50 55 54 53 28 73 71 6c 69 74 65 33 5f 69 6e 64  PUTS(sqlite3_ind
e5d0: 65 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 69  ex_info *p){.  i
e5e0: 6e 74 20 69 3b 0a 20 20 69 66 28 20 21 73 71 6c  nt i;.  if( !sql
e5f0: 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20 29  ite3WhereTrace )
e600: 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69   return;.  for(i
e610: 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72  =0; i<p->nConstr
e620: 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  aint; i++){.    
e630: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
e640: 74 66 28 22 20 20 75 73 61 67 65 5b 25 64 5d 3a  tf("  usage[%d]:
e650: 20 61 72 67 76 49 64 78 3d 25 64 20 6f 6d 69 74   argvIdx=%d omit
e660: 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69  =%d\n",.       i
e670: 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e  ,.       p->aCon
e680: 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e  straintUsage[i].
e690: 61 72 67 76 49 6e 64 65 78 2c 0a 20 20 20 20 20  argvIndex,.     
e6a0: 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74    p->aConstraint
e6b0: 55 73 61 67 65 5b 69 5d 2e 6f 6d 69 74 29 3b 0a  Usage[i].omit);.
e6c0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 65 62    }.  sqlite3Deb
e6d0: 75 67 50 72 69 6e 74 66 28 22 20 20 69 64 78 4e  ugPrintf("  idxN
e6e0: 75 6d 3d 25 64 5c 6e 22 2c 20 70 2d 3e 69 64 78  um=%d\n", p->idx
e6f0: 4e 75 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  Num);.  sqlite3D
e700: 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 69 64  ebugPrintf("  id
e710: 78 53 74 72 3d 25 73 5c 6e 22 2c 20 70 2d 3e 69  xStr=%s\n", p->i
e720: 64 78 53 74 72 29 3b 0a 20 20 73 71 6c 69 74 65  dxStr);.  sqlite
e730: 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20  3DebugPrintf("  
e740: 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 3d  orderByConsumed=
e750: 25 64 5c 6e 22 2c 20 70 2d 3e 6f 72 64 65 72 42  %d\n", p->orderB
e760: 79 43 6f 6e 73 75 6d 65 64 29 3b 0a 20 20 73 71  yConsumed);.  sq
e770: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
e780: 28 22 20 20 65 73 74 69 6d 61 74 65 64 43 6f 73  ("  estimatedCos
e790: 74 3d 25 67 5c 6e 22 2c 20 70 2d 3e 65 73 74 69  t=%g\n", p->esti
e7a0: 6d 61 74 65 64 43 6f 73 74 29 3b 0a 20 20 73 71  matedCost);.  sq
e7b0: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
e7c0: 28 22 20 20 65 73 74 69 6d 61 74 65 64 52 6f 77  ("  estimatedRow
e7d0: 73 3d 25 6c 6c 64 5c 6e 22 2c 20 70 2d 3e 65 73  s=%lld\n", p->es
e7e0: 74 69 6d 61 74 65 64 52 6f 77 73 29 3b 0a 7d 0a  timatedRows);.}.
e7f0: 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 54 52  #else.#define TR
e800: 41 43 45 5f 49 44 58 5f 49 4e 50 55 54 53 28 41  ACE_IDX_INPUTS(A
e810: 29 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45 5f  ).#define TRACE_
e820: 49 44 58 5f 4f 55 54 50 55 54 53 28 41 29 0a 23  IDX_OUTPUTS(A).#
e830: 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
e840: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d  QLITE_OMIT_AUTOM
e850: 41 54 49 43 5f 49 4e 44 45 58 0a 2f 2a 0a 2a 2a  ATIC_INDEX./*.**
e860: 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
e870: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
e880: 20 74 65 72 6d 20 70 54 65 72 6d 20 69 73 20 6f   term pTerm is o
e890: 66 20 61 20 66 6f 72 6d 20 77 68 65 72 65 20 69  f a form where i
e8a0: 74 0a 2a 2a 20 63 6f 75 6c 64 20 62 65 20 75 73  t.** could be us
e8b0: 65 64 20 77 69 74 68 20 61 6e 20 69 6e 64 65 78  ed with an index
e8c0: 20 74 6f 20 61 63 63 65 73 73 20 70 53 72 63 2c   to access pSrc,
e8d0: 20 61 73 73 75 6d 69 6e 67 20 61 6e 20 61 70 70   assuming an app
e8e0: 72 6f 70 72 69 61 74 65 0a 2a 2a 20 69 6e 64 65  ropriate.** inde
e8f0: 78 20 65 78 69 73 74 65 64 2e 0a 2a 2f 0a 73 74  x existed..*/.st
e900: 61 74 69 63 20 69 6e 74 20 74 65 72 6d 43 61 6e  atic int termCan
e910: 44 72 69 76 65 49 6e 64 65 78 28 0a 20 20 57 68  DriveIndex(.  Wh
e920: 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20  ereTerm *pTerm, 
e930: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e940: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
e950: 6d 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20  m to check */.  
e960: 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
e970: 74 65 6d 20 2a 70 53 72 63 2c 20 20 20 20 20 2f  tem *pSrc,     /
e980: 2a 20 54 61 62 6c 65 20 77 65 20 61 72 65 20 74  * Table we are t
e990: 72 79 69 6e 67 20 74 6f 20 61 63 63 65 73 73 20  rying to access 
e9a0: 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74  */.  Bitmask not
e9b0: 52 65 61 64 79 20 20 20 20 20 20 20 20 20 20 20  Ready           
e9c0: 20 20 20 20 2f 2a 20 54 61 62 6c 65 73 20 69 6e      /* Tables in
e9d0: 20 6f 75 74 65 72 20 6c 6f 6f 70 73 20 6f 66 20   outer loops of 
e9e0: 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 29 7b 0a 20  the join */.){. 
e9f0: 20 63 68 61 72 20 61 66 66 3b 0a 20 20 69 66 28   char aff;.  if(
ea00: 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73   pTerm->leftCurs
ea10: 6f 72 21 3d 70 53 72 63 2d 3e 69 43 75 72 73 6f  or!=pSrc->iCurso
ea20: 72 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  r ) return 0;.  
ea30: 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65  if( (pTerm->eOpe
ea40: 72 61 74 6f 72 20 26 20 57 4f 5f 45 51 29 3d 3d  rator & WO_EQ)==
ea50: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
ea60: 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72  if( (pTerm->prer
ea70: 65 71 52 69 67 68 74 20 26 20 6e 6f 74 52 65 61  eqRight & notRea
ea80: 64 79 29 21 3d 30 20 29 20 72 65 74 75 72 6e 20  dy)!=0 ) return 
ea90: 30 3b 0a 20 20 69 66 28 20 70 54 65 72 6d 2d 3e  0;.  if( pTerm->
eaa0: 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3c 30 20 29  u.leftColumn<0 )
eab0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 61 66 66   return 0;.  aff
eac0: 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 2d 3e 61   = pSrc->pTab->a
ead0: 43 6f 6c 5b 70 54 65 72 6d 2d 3e 75 2e 6c 65 66  Col[pTerm->u.lef
eae0: 74 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69 74  tColumn].affinit
eaf0: 79 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  y;.  if( !sqlite
eb00: 33 49 6e 64 65 78 41 66 66 69 6e 69 74 79 4f 6b  3IndexAffinityOk
eb10: 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 61  (pTerm->pExpr, a
eb20: 66 66 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ff) ) return 0;.
eb30: 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65    return 1;.}.#e
eb40: 6e 64 69 66 0a 0a 0a 23 69 66 6e 64 65 66 20 53  ndif...#ifndef S
eb50: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d  QLITE_OMIT_AUTOM
eb60: 41 54 49 43 5f 49 4e 44 45 58 0a 2f 2a 0a 2a 2a  ATIC_INDEX./*.**
eb70: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
eb80: 6f 20 63 6f 6e 73 74 72 75 63 74 20 74 68 65 20  o construct the 
eb90: 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 66 6f 72  Index object for
eba0: 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e   an automatic in
ebb0: 64 65 78 0a 2a 2a 20 61 6e 64 20 74 6f 20 73 65  dex.** and to se
ebc0: 74 20 75 70 20 74 68 65 20 57 68 65 72 65 4c 65  t up the WhereLe
ebd0: 76 65 6c 20 6f 62 6a 65 63 74 20 70 4c 65 76 65  vel object pLeve
ebe0: 6c 20 73 6f 20 74 68 61 74 20 74 68 65 20 63 6f  l so that the co
ebf0: 64 65 20 67 65 6e 65 72 61 74 6f 72 0a 2a 2a 20  de generator.** 
ec00: 6d 61 6b 65 73 20 75 73 65 20 6f 66 20 74 68 65  makes use of the
ec10: 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78   automatic index
ec20: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
ec30: 20 63 6f 6e 73 74 72 75 63 74 41 75 74 6f 6d 61   constructAutoma
ec40: 74 69 63 49 6e 64 65 78 28 0a 20 20 50 61 72 73  ticIndex(.  Pars
ec50: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
ec60: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
ec70: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
ec80: 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  /.  WhereClause 
ec90: 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20 20 20  *pWC,           
eca0: 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
ecb0: 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  use */.  struct 
ecc0: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53  SrcList_item *pS
ecd0: 72 63 2c 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d  rc,  /* The FROM
ece0: 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74 6f 20   clause term to 
ecf0: 67 65 74 20 74 68 65 20 6e 65 78 74 20 69 6e 64  get the next ind
ed00: 65 78 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  ex */.  Bitmask 
ed10: 6e 6f 74 52 65 61 64 79 2c 20 20 20 20 20 20 20  notReady,       
ed20: 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 63      /* Mask of c
ed30: 75 72 73 6f 72 73 20 74 68 61 74 20 61 72 65 20  ursors that are 
ed40: 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f  not available */
ed50: 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70  .  WhereLevel *p
ed60: 4c 65 76 65 6c 20 20 20 20 20 20 20 20 20 20 2f  Level          /
ed70: 2a 20 57 72 69 74 65 20 6e 65 77 20 69 6e 64 65  * Write new inde
ed80: 78 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  x here */.){.  i
ed90: 6e 74 20 6e 4b 65 79 43 6f 6c 3b 20 20 20 20 20  nt nKeyCol;     
eda0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
edb0: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
edc0: 69 6e 20 74 68 65 20 63 6f 6e 73 74 72 75 63 74  in the construct
edd0: 65 64 20 69 6e 64 65 78 20 2a 2f 0a 20 20 57 68  ed index */.  Wh
ede0: 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20  ereTerm *pTerm; 
edf0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73            /* A s
ee00: 69 6e 67 6c 65 20 74 65 72 6d 20 6f 66 20 74 68  ingle term of th
ee10: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
ee20: 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  /.  WhereTerm *p
ee30: 57 43 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20  WCEnd;          
ee40: 2f 2a 20 45 6e 64 20 6f 66 20 70 57 43 2d 3e 61  /* End of pWC->a
ee50: 5b 5d 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  [] */.  Index *p
ee60: 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  Idx;            
ee70: 20 20 20 20 2f 2a 20 4f 62 6a 65 63 74 20 64 65      /* Object de
ee80: 73 63 72 69 62 69 6e 67 20 74 68 65 20 74 72 61  scribing the tra
ee90: 6e 73 69 65 6e 74 20 69 6e 64 65 78 20 2a 2f 0a  nsient index */.
eea0: 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20    Vdbe *v;      
eeb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
eec0: 20 50 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   Prepared statem
eed0: 65 6e 74 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  ent under constr
eee0: 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  uction */.  int 
eef0: 61 64 64 72 49 6e 69 74 3b 20 20 20 20 20 20 20  addrInit;       
ef00: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
ef10: 73 73 20 6f 66 20 74 68 65 20 69 6e 69 74 69 61  ss of the initia
ef20: 6c 69 7a 61 74 69 6f 6e 20 62 79 70 61 73 73 20  lization bypass 
ef30: 6a 75 6d 70 20 2a 2f 0a 20 20 54 61 62 6c 65 20  jump */.  Table 
ef40: 2a 70 54 61 62 6c 65 3b 20 20 20 20 20 20 20 20  *pTable;        
ef50: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62        /* The tab
ef60: 6c 65 20 62 65 69 6e 67 20 69 6e 64 65 78 65 64  le being indexed
ef70: 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 54 6f   */.  int addrTo
ef80: 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
ef90: 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20    /* Top of the 
efa0: 69 6e 64 65 78 20 66 69 6c 6c 20 6c 6f 6f 70 20  index fill loop 
efb0: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 63 6f  */.  int regReco
efc0: 72 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rd;             
efd0: 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c   /* Register hol
efe0: 64 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 72 65  ding an index re
eff0: 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b  cord */.  int n;
f000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f010: 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20        /* Column 
f020: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  counter */.  int
f030: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
f040: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
f050: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
f060: 74 20 6d 78 42 69 74 43 6f 6c 3b 20 20 20 20 20  t mxBitCol;     
f070: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78            /* Max
f080: 69 6d 75 6d 20 63 6f 6c 75 6d 6e 20 69 6e 20 70  imum column in p
f090: 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20 2a 2f 0a  Src->colUsed */.
f0a0: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
f0b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
f0c0: 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   Collating seque
f0d0: 6e 63 65 20 74 6f 20 6f 6e 20 61 20 63 6f 6c 75  nce to on a colu
f0e0: 6d 6e 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f  mn */.  WhereLoo
f0f0: 70 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20  p *pLoop;       
f100: 20 20 20 20 2f 2a 20 54 68 65 20 4c 6f 6f 70 20      /* The Loop 
f110: 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 68 61 72  object */.  char
f120: 20 2a 7a 4e 6f 74 55 73 65 64 3b 20 20 20 20 20   *zNotUsed;     
f130: 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61          /* Extra
f140: 20 73 70 61 63 65 20 6f 6e 20 74 68 65 20 65 6e   space on the en
f150: 64 20 6f 66 20 70 49 64 78 20 2a 2f 0a 20 20 42  d of pIdx */.  B
f160: 69 74 6d 61 73 6b 20 69 64 78 43 6f 6c 73 3b 20  itmask idxCols; 
f170: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69             /* Bi
f180: 74 6d 61 70 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  tmap of columns 
f190: 75 73 65 64 20 66 6f 72 20 69 6e 64 65 78 69 6e  used for indexin
f1a0: 67 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 65  g */.  Bitmask e
f1b0: 78 74 72 61 43 6f 6c 73 3b 20 20 20 20 20 20 20  xtraCols;       
f1c0: 20 20 20 2f 2a 20 42 69 74 6d 61 70 20 6f 66 20     /* Bitmap of 
f1d0: 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d  additional colum
f1e0: 6e 73 20 2a 2f 0a 20 20 75 38 20 73 65 6e 74 57  ns */.  u8 sentW
f1f0: 61 72 6e 69 6e 67 20 3d 20 30 3b 20 20 20 20 20  arning = 0;     
f200: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61      /* True if a
f210: 20 77 61 72 6e 6e 69 6e 67 20 68 61 73 20 62 65   warnning has be
f220: 65 6e 20 69 73 73 75 65 64 20 2a 2f 0a 20 20 45  en issued */.  E
f230: 78 70 72 20 2a 70 50 61 72 74 69 61 6c 20 3d 20  xpr *pPartial = 
f240: 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  0;         /* Pa
f250: 72 74 69 61 6c 20 49 6e 64 65 78 20 45 78 70 72  rtial Index Expr
f260: 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ession */.  int 
f270: 69 43 6f 6e 74 69 6e 75 65 20 3d 20 30 3b 20 20  iContinue = 0;  
f280: 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
f290: 68 65 72 65 20 74 6f 20 73 6b 69 70 20 65 78 63  here to skip exc
f2a0: 6c 75 64 65 64 20 72 6f 77 73 20 2a 2f 0a 0a 20  luded rows */.. 
f2b0: 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
f2c0: 65 20 74 6f 20 73 6b 69 70 20 6f 76 65 72 20 74  e to skip over t
f2d0: 68 65 20 63 72 65 61 74 69 6f 6e 20 61 6e 64 20  he creation and 
f2e0: 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f  initialization o
f2f0: 66 20 74 68 65 0a 20 20 2a 2a 20 74 72 61 6e 73  f the.  ** trans
f300: 69 65 6e 74 20 69 6e 64 65 78 20 6f 6e 20 32 6e  ient index on 2n
f310: 64 20 61 6e 64 20 73 75 62 73 65 71 75 65 6e 74  d and subsequent
f320: 20 69 74 65 72 61 74 69 6f 6e 73 20 6f 66 20 74   iterations of t
f330: 68 65 20 6c 6f 6f 70 2e 20 2a 2f 0a 20 20 76 20  he loop. */.  v 
f340: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
f350: 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20  .  assert( v!=0 
f360: 29 3b 0a 20 20 61 64 64 72 49 6e 69 74 20 3d 20  );.  addrInit = 
f370: 73 71 6c 69 74 65 33 43 6f 64 65 4f 6e 63 65 28  sqlite3CodeOnce(
f380: 70 50 61 72 73 65 29 3b 20 56 64 62 65 43 6f 76  pParse); VdbeCov
f390: 65 72 61 67 65 28 76 29 3b 0a 0a 20 20 2f 2a 20  erage(v);..  /* 
f3a0: 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72  Count the number
f3b0: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74   of columns that
f3c0: 20 77 69 6c 6c 20 62 65 20 61 64 64 65 64 20 74   will be added t
f3d0: 6f 20 74 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a  o the index.  **
f3e0: 20 61 6e 64 20 75 73 65 64 20 74 6f 20 6d 61 74   and used to mat
f3f0: 63 68 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  ch WHERE clause 
f400: 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20  constraints */. 
f410: 20 6e 4b 65 79 43 6f 6c 20 3d 20 30 3b 0a 20 20   nKeyCol = 0;.  
f420: 70 54 61 62 6c 65 20 3d 20 70 53 72 63 2d 3e 70  pTable = pSrc->p
f430: 54 61 62 3b 0a 20 20 70 57 43 45 6e 64 20 3d 20  Tab;.  pWCEnd = 
f440: 26 70 57 43 2d 3e 61 5b 70 57 43 2d 3e 6e 54 65  &pWC->a[pWC->nTe
f450: 72 6d 5d 3b 0a 20 20 70 4c 6f 6f 70 20 3d 20 70  rm];.  pLoop = p
f460: 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20  Level->pWLoop;. 
f470: 20 69 64 78 43 6f 6c 73 20 3d 20 30 3b 0a 20 20   idxCols = 0;.  
f480: 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61  for(pTerm=pWC->a
f490: 3b 20 70 54 65 72 6d 3c 70 57 43 45 6e 64 3b 20  ; pTerm<pWCEnd; 
f4a0: 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 45 78  pTerm++){.    Ex
f4b0: 70 72 20 2a 70 45 78 70 72 20 3d 20 70 54 65 72  pr *pExpr = pTer
f4c0: 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 61 73  m->pExpr;.    as
f4d0: 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
f4e0: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
f4f0: 5f 46 72 6f 6d 4a 6f 69 6e 29 20 20 20 20 2f 2a  _FromJoin)    /*
f500: 20 70 72 65 72 65 71 20 61 6c 77 61 79 73 20 6e   prereq always n
f510: 6f 6e 2d 7a 65 72 6f 20 2a 2f 0a 20 20 20 20 20  on-zero */.     
f520: 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 69 52      || pExpr->iR
f530: 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 21 3d 70  ightJoinTable!=p
f540: 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 20 20 2f  Src->iCursor   /
f550: 2a 20 20 20 66 6f 72 20 74 68 65 20 72 69 67 68  *   for the righ
f560: 74 2d 68 61 6e 64 20 20 20 2a 2f 0a 20 20 20 20  t-hand   */.    
f570: 20 20 20 20 20 7c 7c 20 70 4c 6f 6f 70 2d 3e 70       || pLoop->p
f580: 72 65 72 65 71 21 3d 30 20 29 3b 20 20 20 20 20  rereq!=0 );     
f590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f5a0: 2f 2a 20 20 20 74 61 62 6c 65 20 6f 66 20 61 20  /*   table of a 
f5b0: 4c 45 46 54 20 4a 4f 49 4e 20 2a 2f 0a 20 20 20  LEFT JOIN */.   
f5c0: 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 70 72 65 72   if( pLoop->prer
f5d0: 65 71 3d 3d 30 0a 20 20 20 20 20 26 26 20 28 70  eq==0.     && (p
f5e0: 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
f5f0: 54 45 52 4d 5f 56 49 52 54 55 41 4c 29 3d 3d 30  TERM_VIRTUAL)==0
f600: 0a 20 20 20 20 20 26 26 20 21 45 78 70 72 48 61  .     && !ExprHa
f610: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
f620: 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 0a 20 20   EP_FromJoin).  
f630: 20 20 20 26 26 20 73 71 6c 69 74 65 33 45 78 70     && sqlite3Exp
f640: 72 49 73 54 61 62 6c 65 43 6f 6e 73 74 61 6e 74  rIsTableConstant
f650: 28 70 45 78 70 72 2c 20 70 53 72 63 2d 3e 69 43  (pExpr, pSrc->iC
f660: 75 72 73 6f 72 29 20 29 7b 0a 20 20 20 20 20 20  ursor) ){.      
f670: 70 50 61 72 74 69 61 6c 20 3d 20 73 71 6c 69 74  pPartial = sqlit
f680: 65 33 45 78 70 72 41 6e 64 28 70 50 61 72 73 65  e3ExprAnd(pParse
f690: 2d 3e 64 62 2c 20 70 50 61 72 74 69 61 6c 2c 0a  ->db, pPartial,.
f6a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f6b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f6c0: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70  sqlite3ExprDup(p
f6d0: 50 61 72 73 65 2d 3e 64 62 2c 20 70 45 78 70 72  Parse->db, pExpr
f6e0: 2c 20 30 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20  , 0));.    }.   
f6f0: 20 69 66 28 20 74 65 72 6d 43 61 6e 44 72 69 76   if( termCanDriv
f700: 65 49 6e 64 65 78 28 70 54 65 72 6d 2c 20 70 53  eIndex(pTerm, pS
f710: 72 63 2c 20 6e 6f 74 52 65 61 64 79 29 20 29 7b  rc, notReady) ){
f720: 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20  .      int iCol 
f730: 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43  = pTerm->u.leftC
f740: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 42 69 74  olumn;.      Bit
f750: 6d 61 73 6b 20 63 4d 61 73 6b 20 3d 20 69 43 6f  mask cMask = iCo
f760: 6c 3e 3d 42 4d 53 20 3f 20 4d 41 53 4b 42 49 54  l>=BMS ? MASKBIT
f770: 28 42 4d 53 2d 31 29 20 3a 20 4d 41 53 4b 42 49  (BMS-1) : MASKBI
f780: 54 28 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20 74  T(iCol);.      t
f790: 65 73 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d 42  estcase( iCol==B
f7a0: 4d 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  MS );.      test
f7b0: 63 61 73 65 28 20 69 43 6f 6c 3d 3d 42 4d 53 2d  case( iCol==BMS-
f7c0: 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  1 );.      if( !
f7d0: 73 65 6e 74 57 61 72 6e 69 6e 67 20 29 7b 0a 20  sentWarning ){. 
f7e0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c         sqlite3_l
f7f0: 6f 67 28 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e  og(SQLITE_WARNIN
f800: 47 5f 41 55 54 4f 49 4e 44 45 58 2c 0a 20 20 20  G_AUTOINDEX,.   
f810: 20 20 20 20 20 20 20 20 20 22 61 75 74 6f 6d 61           "automa
f820: 74 69 63 20 69 6e 64 65 78 20 6f 6e 20 25 73 28  tic index on %s(
f830: 25 73 29 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e  %s)", pTable->zN
f840: 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ame,.           
f850: 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43   pTable->aCol[iC
f860: 6f 6c 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ol].zName);.    
f870: 20 20 20 20 73 65 6e 74 57 61 72 6e 69 6e 67 20      sentWarning 
f880: 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
f890: 20 20 20 69 66 28 20 28 69 64 78 43 6f 6c 73 20     if( (idxCols 
f8a0: 26 20 63 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20  & cMask)==0 ){. 
f8b0: 20 20 20 20 20 20 20 69 66 28 20 77 68 65 72 65         if( where
f8c0: 4c 6f 6f 70 52 65 73 69 7a 65 28 70 50 61 72 73  LoopResize(pPars
f8d0: 65 2d 3e 64 62 2c 20 70 4c 6f 6f 70 2c 20 6e 4b  e->db, pLoop, nK
f8e0: 65 79 43 6f 6c 2b 31 29 20 29 7b 0a 20 20 20 20  eyCol+1) ){.    
f8f0: 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
f900: 75 74 6f 5f 69 6e 64 65 78 5f 63 72 65 61 74 65  uto_index_create
f910: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
f920: 20 20 20 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72      pLoop->aLTer
f930: 6d 5b 6e 4b 65 79 43 6f 6c 2b 2b 5d 20 3d 20 70  m[nKeyCol++] = p
f940: 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 69 64  Term;.        id
f950: 78 43 6f 6c 73 20 7c 3d 20 63 4d 61 73 6b 3b 0a  xCols |= cMask;.
f960: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
f970: 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 4b 65 79  }.  assert( nKey
f980: 43 6f 6c 3e 30 20 29 3b 0a 20 20 70 4c 6f 6f 70  Col>0 );.  pLoop
f990: 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20  ->u.btree.nEq = 
f9a0: 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20  pLoop->nLTerm = 
f9b0: 6e 4b 65 79 43 6f 6c 3b 0a 20 20 70 4c 6f 6f 70  nKeyCol;.  pLoop
f9c0: 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52  ->wsFlags = WHER
f9d0: 45 5f 43 4f 4c 55 4d 4e 5f 45 51 20 7c 20 57 48  E_COLUMN_EQ | WH
f9e0: 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20 7c 20 57  ERE_IDX_ONLY | W
f9f0: 48 45 52 45 5f 49 4e 44 45 58 45 44 0a 20 20 20  HERE_INDEXED.   
fa00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fa10: 20 20 7c 20 57 48 45 52 45 5f 41 55 54 4f 5f 49    | WHERE_AUTO_I
fa20: 4e 44 45 58 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e  NDEX;..  /* Coun
fa30: 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
fa40: 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d  additional colum
fa50: 6e 73 20 6e 65 65 64 65 64 20 74 6f 20 63 72 65  ns needed to cre
fa60: 61 74 65 20 61 0a 20 20 2a 2a 20 63 6f 76 65 72  ate a.  ** cover
fa70: 69 6e 67 20 69 6e 64 65 78 2e 20 20 41 20 22 63  ing index.  A "c
fa80: 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 22 20 69  overing index" i
fa90: 73 20 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20  s an index that 
faa0: 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 0a 20 20 2a  contains all.  *
fab0: 2a 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 61  * columns that a
fac0: 72 65 20 6e 65 65 64 65 64 20 62 79 20 74 68 65  re needed by the
fad0: 20 71 75 65 72 79 2e 20 20 57 69 74 68 20 61 20   query.  With a 
fae0: 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 2c 20  covering index, 
faf0: 74 68 65 0a 20 20 2a 2a 20 6f 72 69 67 69 6e 61  the.  ** origina
fb00: 6c 20 74 61 62 6c 65 20 6e 65 76 65 72 20 6e 65  l table never ne
fb10: 65 64 73 20 74 6f 20 62 65 20 61 63 63 65 73 73  eds to be access
fb20: 65 64 2e 20 20 41 75 74 6f 6d 61 74 69 63 20 69  ed.  Automatic i
fb30: 6e 64 69 63 65 73 20 6d 75 73 74 0a 20 20 2a 2a  ndices must.  **
fb40: 20 62 65 20 61 20 63 6f 76 65 72 69 6e 67 20 69   be a covering i
fb50: 6e 64 65 78 20 62 65 63 61 75 73 65 20 74 68 65  ndex because the
fb60: 20 69 6e 64 65 78 20 77 69 6c 6c 20 6e 6f 74 20   index will not 
fb70: 62 65 20 75 70 64 61 74 65 64 20 69 66 20 74 68  be updated if th
fb80: 65 0a 20 20 2a 2a 20 6f 72 69 67 69 6e 61 6c 20  e.  ** original 
fb90: 74 61 62 6c 65 20 63 68 61 6e 67 65 73 20 61 6e  table changes an
fba0: 64 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20  d the index and 
fbb0: 74 61 62 6c 65 20 63 61 6e 6e 6f 74 20 62 6f 74  table cannot bot
fbc0: 68 20 62 65 20 75 73 65 64 0a 20 20 2a 2a 20 69  h be used.  ** i
fbd0: 66 20 74 68 65 79 20 67 6f 20 6f 75 74 20 6f 66  f they go out of
fbe0: 20 73 79 6e 63 2e 0a 20 20 2a 2f 0a 20 20 65 78   sync..  */.  ex
fbf0: 74 72 61 43 6f 6c 73 20 3d 20 70 53 72 63 2d 3e  traCols = pSrc->
fc00: 63 6f 6c 55 73 65 64 20 26 20 28 7e 69 64 78 43  colUsed & (~idxC
fc10: 6f 6c 73 20 7c 20 4d 41 53 4b 42 49 54 28 42 4d  ols | MASKBIT(BM
fc20: 53 2d 31 29 29 3b 0a 20 20 6d 78 42 69 74 43 6f  S-1));.  mxBitCo
fc30: 6c 20 3d 20 4d 49 4e 28 42 4d 53 2d 31 2c 70 54  l = MIN(BMS-1,pT
fc40: 61 62 6c 65 2d 3e 6e 43 6f 6c 29 3b 0a 20 20 74  able->nCol);.  t
fc50: 65 73 74 63 61 73 65 28 20 70 54 61 62 6c 65 2d  estcase( pTable-
fc60: 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a  >nCol==BMS-1 );.
fc70: 20 20 74 65 73 74 63 61 73 65 28 20 70 54 61 62    testcase( pTab
fc80: 6c 65 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 32 20  le->nCol==BMS-2 
fc90: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
fca0: 6d 78 42 69 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  mxBitCol; i++){.
fcb0: 20 20 20 20 69 66 28 20 65 78 74 72 61 43 6f 6c      if( extraCol
fcc0: 73 20 26 20 4d 41 53 4b 42 49 54 28 69 29 20 29  s & MASKBIT(i) )
fcd0: 20 6e 4b 65 79 43 6f 6c 2b 2b 3b 0a 20 20 7d 0a   nKeyCol++;.  }.
fce0: 20 20 69 66 28 20 70 53 72 63 2d 3e 63 6f 6c 55    if( pSrc->colU
fcf0: 73 65 64 20 26 20 4d 41 53 4b 42 49 54 28 42 4d  sed & MASKBIT(BM
fd00: 53 2d 31 29 20 29 7b 0a 20 20 20 20 6e 4b 65 79  S-1) ){.    nKey
fd10: 43 6f 6c 20 2b 3d 20 70 54 61 62 6c 65 2d 3e 6e  Col += pTable->n
fd20: 43 6f 6c 20 2d 20 42 4d 53 20 2b 20 31 3b 0a 20  Col - BMS + 1;. 
fd30: 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 73 74 72 75   }..  /* Constru
fd40: 63 74 20 74 68 65 20 49 6e 64 65 78 20 6f 62 6a  ct the Index obj
fd50: 65 63 74 20 74 6f 20 64 65 73 63 72 69 62 65 20  ect to describe 
fd60: 74 68 69 73 20 69 6e 64 65 78 20 2a 2f 0a 20 20  this index */.  
fd70: 70 49 64 78 20 3d 20 73 71 6c 69 74 65 33 41 6c  pIdx = sqlite3Al
fd80: 6c 6f 63 61 74 65 49 6e 64 65 78 4f 62 6a 65 63  locateIndexObjec
fd90: 74 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 6e 4b  t(pParse->db, nK
fda0: 65 79 43 6f 6c 2b 31 2c 20 30 2c 20 26 7a 4e 6f  eyCol+1, 0, &zNo
fdb0: 74 55 73 65 64 29 3b 0a 20 20 69 66 28 20 70 49  tUsed);.  if( pI
fdc0: 64 78 3d 3d 30 20 29 20 67 6f 74 6f 20 65 6e 64  dx==0 ) goto end
fdd0: 5f 61 75 74 6f 5f 69 6e 64 65 78 5f 63 72 65 61  _auto_index_crea
fde0: 74 65 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62  te;.  pLoop->u.b
fdf0: 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 70 49  tree.pIndex = pI
fe00: 64 78 3b 0a 20 20 70 49 64 78 2d 3e 7a 4e 61 6d  dx;.  pIdx->zNam
fe10: 65 20 3d 20 22 61 75 74 6f 2d 69 6e 64 65 78 22  e = "auto-index"
fe20: 3b 0a 20 20 70 49 64 78 2d 3e 70 54 61 62 6c 65  ;.  pIdx->pTable
fe30: 20 3d 20 70 54 61 62 6c 65 3b 0a 20 20 6e 20 3d   = pTable;.  n =
fe40: 20 30 3b 0a 20 20 69 64 78 43 6f 6c 73 20 3d 20   0;.  idxCols = 
fe50: 30 3b 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d 70  0;.  for(pTerm=p
fe60: 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 57 43  WC->a; pTerm<pWC
fe70: 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20  End; pTerm++){. 
fe80: 20 20 20 69 66 28 20 74 65 72 6d 43 61 6e 44 72     if( termCanDr
fe90: 69 76 65 49 6e 64 65 78 28 70 54 65 72 6d 2c 20  iveIndex(pTerm, 
fea0: 70 53 72 63 2c 20 6e 6f 74 52 65 61 64 79 29 20  pSrc, notReady) 
feb0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f  ){.      int iCo
fec0: 6c 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66  l = pTerm->u.lef
fed0: 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 42  tColumn;.      B
fee0: 69 74 6d 61 73 6b 20 63 4d 61 73 6b 20 3d 20 69  itmask cMask = i
fef0: 43 6f 6c 3e 3d 42 4d 53 20 3f 20 4d 41 53 4b 42  Col>=BMS ? MASKB
ff00: 49 54 28 42 4d 53 2d 31 29 20 3a 20 4d 41 53 4b  IT(BMS-1) : MASK
ff10: 42 49 54 28 69 43 6f 6c 29 3b 0a 20 20 20 20 20  BIT(iCol);.     
ff20: 20 74 65 73 74 63 61 73 65 28 20 69 43 6f 6c 3d   testcase( iCol=
ff30: 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20 20  =BMS-1 );.      
ff40: 74 65 73 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d  testcase( iCol==
ff50: 42 4d 53 20 29 3b 0a 20 20 20 20 20 20 69 66 28  BMS );.      if(
ff60: 20 28 69 64 78 43 6f 6c 73 20 26 20 63 4d 61 73   (idxCols & cMas
ff70: 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  k)==0 ){.       
ff80: 20 45 78 70 72 20 2a 70 58 20 3d 20 70 54 65 72   Expr *pX = pTer
ff90: 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  m->pExpr;.      
ffa0: 20 20 69 64 78 43 6f 6c 73 20 7c 3d 20 63 4d 61    idxCols |= cMa
ffb0: 73 6b 3b 0a 20 20 20 20 20 20 20 20 70 49 64 78  sk;.        pIdx
ffc0: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20  ->aiColumn[n] = 
ffd0: 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c  pTerm->u.leftCol
ffe0: 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 70 43 6f  umn;.        pCo
fff0: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61  ll = sqlite3Bina
10000 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71  ryCompareCollSeq
10010 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 4c 65  (pParse, pX->pLe
10020 66 74 2c 20 70 58 2d 3e 70 52 69 67 68 74 29 3b  ft, pX->pRight);
10030 0a 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61  .        pIdx->a
10040 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 41 4c 57 41 59  zColl[n] = ALWAY
10050 53 28 70 43 6f 6c 6c 29 20 3f 20 70 43 6f 6c 6c  S(pColl) ? pColl
10060 2d 3e 7a 4e 61 6d 65 20 3a 20 22 42 49 4e 41 52  ->zName : "BINAR
10070 59 22 3b 0a 20 20 20 20 20 20 20 20 6e 2b 2b 3b  Y";.        n++;
10080 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
10090 20 7d 0a 20 20 61 73 73 65 72 74 28 20 28 75 33   }.  assert( (u3
100a0 32 29 6e 3d 3d 70 4c 6f 6f 70 2d 3e 75 2e 62 74  2)n==pLoop->u.bt
100b0 72 65 65 2e 6e 45 71 20 29 3b 0a 0a 20 20 2f 2a  ree.nEq );..  /*
100c0 20 41 64 64 20 61 64 64 69 74 69 6f 6e 61 6c 20   Add additional 
100d0 63 6f 6c 75 6d 6e 73 20 6e 65 65 64 65 64 20 74  columns needed t
100e0 6f 20 6d 61 6b 65 20 74 68 65 20 61 75 74 6f 6d  o make the autom
100f0 61 74 69 63 20 69 6e 64 65 78 20 69 6e 74 6f 0a  atic index into.
10100 20 20 2a 2a 20 61 20 63 6f 76 65 72 69 6e 67 20    ** a covering 
10110 69 6e 64 65 78 20 2a 2f 0a 20 20 66 6f 72 28 69  index */.  for(i
10120 3d 30 3b 20 69 3c 6d 78 42 69 74 43 6f 6c 3b 20  =0; i<mxBitCol; 
10130 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 65 78  i++){.    if( ex
10140 74 72 61 43 6f 6c 73 20 26 20 4d 41 53 4b 42 49  traCols & MASKBI
10150 54 28 69 29 20 29 7b 0a 20 20 20 20 20 20 70 49  T(i) ){.      pI
10160 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20  dx->aiColumn[n] 
10170 3d 20 69 3b 0a 20 20 20 20 20 20 70 49 64 78 2d  = i;.      pIdx-
10180 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 22 42 49  >azColl[n] = "BI
10190 4e 41 52 59 22 3b 0a 20 20 20 20 20 20 6e 2b 2b  NARY";.      n++
101a0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
101b0 28 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20  ( pSrc->colUsed 
101c0 26 20 4d 41 53 4b 42 49 54 28 42 4d 53 2d 31 29  & MASKBIT(BMS-1)
101d0 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 42 4d   ){.    for(i=BM
101e0 53 2d 31 3b 20 69 3c 70 54 61 62 6c 65 2d 3e 6e  S-1; i<pTable->n
101f0 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
10200 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
10210 6e 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20 70 49  n] = i;.      pI
10220 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20  dx->azColl[n] = 
10230 22 42 49 4e 41 52 59 22 3b 0a 20 20 20 20 20 20  "BINARY";.      
10240 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n++;.    }.  }. 
10250 20 61 73 73 65 72 74 28 20 6e 3d 3d 6e 4b 65 79   assert( n==nKey
10260 43 6f 6c 20 29 3b 0a 20 20 70 49 64 78 2d 3e 61  Col );.  pIdx->a
10270 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 2d 31 3b  iColumn[n] = -1;
10280 0a 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b  .  pIdx->azColl[
10290 6e 5d 20 3d 20 22 42 49 4e 41 52 59 22 3b 0a 0a  n] = "BINARY";..
102a0 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20    /* Create the 
102b0 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20  automatic index 
102c0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 4c 65  */.  assert( pLe
102d0 76 65 6c 2d 3e 69 49 64 78 43 75 72 3e 3d 30 20  vel->iIdxCur>=0 
102e0 29 3b 0a 20 20 70 4c 65 76 65 6c 2d 3e 69 49 64  );.  pLevel->iId
102f0 78 43 75 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e  xCur = pParse->n
10300 54 61 62 2b 2b 3b 0a 20 20 73 71 6c 69 74 65 33  Tab++;.  sqlite3
10310 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
10320 5f 4f 70 65 6e 41 75 74 6f 69 6e 64 65 78 2c 20  _OpenAutoindex, 
10330 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 2c  pLevel->iIdxCur,
10340 20 6e 4b 65 79 43 6f 6c 2b 31 29 3b 0a 20 20 73   nKeyCol+1);.  s
10350 71 6c 69 74 65 33 56 64 62 65 53 65 74 50 34 4b  qlite3VdbeSetP4K
10360 65 79 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70  eyInfo(pParse, p
10370 49 64 78 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d  Idx);.  VdbeComm
10380 65 6e 74 28 28 76 2c 20 22 66 6f 72 20 25 73 22  ent((v, "for %s"
10390 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29  , pTable->zName)
103a0 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 74 68  );..  /* Fill th
103b0 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65  e automatic inde
103c0 78 20 77 69 74 68 20 63 6f 6e 74 65 6e 74 20 2a  x with content *
103d0 2f 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43  /.  sqlite3ExprC
103e0 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29  achePush(pParse)
103f0 3b 0a 20 20 61 64 64 72 54 6f 70 20 3d 20 73 71  ;.  addrTop = sq
10400 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
10410 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 70 4c  v, OP_Rewind, pL
10420 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 29 3b 20  evel->iTabCur); 
10430 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
10440 0a 20 20 69 66 28 20 70 50 61 72 74 69 61 6c 20  .  if( pPartial 
10450 29 7b 0a 20 20 20 20 69 43 6f 6e 74 69 6e 75 65  ){.    iContinue
10460 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
10470 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
10480 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
10490 73 65 28 70 50 61 72 73 65 2c 20 70 50 61 72 74  se(pParse, pPart
104a0 69 61 6c 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20  ial, iContinue, 
104b0 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
104c0 4c 29 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 77  L);.    pLoop->w
104d0 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f  sFlags |= WHERE_
104e0 50 41 52 54 49 41 4c 49 44 58 3b 0a 20 20 7d 0a  PARTIALIDX;.  }.
104f0 20 20 72 65 67 52 65 63 6f 72 64 20 3d 20 73 71    regRecord = sq
10500 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
10510 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74  pParse);.  sqlit
10520 65 33 47 65 6e 65 72 61 74 65 49 6e 64 65 78 4b  e3GenerateIndexK
10530 65 79 28 70 50 61 72 73 65 2c 20 70 49 64 78 2c  ey(pParse, pIdx,
10540 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72   pLevel->iTabCur
10550 2c 20 72 65 67 52 65 63 6f 72 64 2c 20 30 2c 20  , regRecord, 0, 
10560 30 2c 20 30 2c 20 30 29 3b 0a 20 20 73 71 6c 69  0, 0, 0);.  sqli
10570 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
10580 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 70   OP_IdxInsert, p
10590 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 2c 20  Level->iIdxCur, 
105a0 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 73 71  regRecord);.  sq
105b0 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
105c0 35 28 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45 53  5(v, OPFLAG_USES
105d0 45 45 4b 52 45 53 55 4c 54 29 3b 0a 20 20 69 66  EEKRESULT);.  if
105e0 28 20 70 50 61 72 74 69 61 6c 20 29 20 73 71 6c  ( pPartial ) sql
105f0 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
10600 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 69 6e 75  abel(v, iContinu
10610 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  e);.  sqlite3Vdb
10620 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
10630 78 74 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62  xt, pLevel->iTab
10640 43 75 72 2c 20 61 64 64 72 54 6f 70 2b 31 29 3b  Cur, addrTop+1);
10650 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
10660 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  ;.  sqlite3VdbeC
10670 68 61 6e 67 65 50 35 28 76 2c 20 53 51 4c 49 54  hangeP5(v, SQLIT
10680 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 41 55 54  E_STMTSTATUS_AUT
10690 4f 49 4e 44 45 58 29 3b 0a 20 20 73 71 6c 69 74  OINDEX);.  sqlit
106a0 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
106b0 2c 20 61 64 64 72 54 6f 70 29 3b 0a 20 20 73 71  , addrTop);.  sq
106c0 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
106d0 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 52  Reg(pParse, regR
106e0 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65  ecord);.  sqlite
106f0 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50  3ExprCachePop(pP
10700 61 72 73 65 29 3b 0a 20 20 0a 20 20 2f 2a 20 4a  arse);.  .  /* J
10710 75 6d 70 20 68 65 72 65 20 77 68 65 6e 20 73 6b  ump here when sk
10720 69 70 70 69 6e 67 20 74 68 65 20 69 6e 69 74 69  ipping the initi
10730 61 6c 69 7a 61 74 69 6f 6e 20 2a 2f 0a 20 20 73  alization */.  s
10740 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
10750 72 65 28 76 2c 20 61 64 64 72 49 6e 69 74 29 3b  re(v, addrInit);
10760 0a 0a 65 6e 64 5f 61 75 74 6f 5f 69 6e 64 65 78  ..end_auto_index
10770 5f 63 72 65 61 74 65 3a 0a 20 20 73 71 6c 69 74  _create:.  sqlit
10780 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 50 61  e3ExprDelete(pPa
10790 72 73 65 2d 3e 64 62 2c 20 70 50 61 72 74 69 61  rse->db, pPartia
107a0 6c 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  l);.}.#endif /* 
107b0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
107c0 4d 41 54 49 43 5f 49 4e 44 45 58 20 2a 2f 0a 0a  MATIC_INDEX */..
107d0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
107e0 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
107f0 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
10800 61 6e 64 20 70 6f 70 75 6c 61 74 65 20 61 6e 20  and populate an 
10810 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
10820 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20 49 74  fo structure. It
10830 20 69 73 20 74 68 65 20 0a 2a 2a 20 72 65 73 70   is the .** resp
10840 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68  onsibility of th
10850 65 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e  e caller to even
10860 74 75 61 6c 6c 79 20 72 65 6c 65 61 73 65 20 74  tually release t
10870 68 65 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20  he structure.** 
10880 62 79 20 70 61 73 73 69 6e 67 20 74 68 65 20 70  by passing the p
10890 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20  ointer returned 
108a0 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
108b0 20 74 6f 20 73 71 6c 69 74 65 33 5f 66 72 65 65   to sqlite3_free
108c0 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71  ()..*/.static sq
108d0 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
108e0 20 2a 61 6c 6c 6f 63 61 74 65 49 6e 64 65 78 49   *allocateIndexI
108f0 6e 66 6f 28 0a 20 20 50 61 72 73 65 20 2a 70 50  nfo(.  Parse *pP
10900 61 72 73 65 2c 0a 20 20 57 68 65 72 65 43 6c 61  arse,.  WhereCla
10910 75 73 65 20 2a 70 57 43 2c 0a 20 20 73 74 72 75  use *pWC,.  stru
10920 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
10930 2a 70 53 72 63 2c 0a 20 20 45 78 70 72 4c 69 73  *pSrc,.  ExprLis
10940 74 20 2a 70 4f 72 64 65 72 42 79 0a 29 7b 0a 20  t *pOrderBy.){. 
10950 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74   int i, j;.  int
10960 20 6e 54 65 72 6d 3b 0a 20 20 73 74 72 75 63 74   nTerm;.  struct
10970 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63   sqlite3_index_c
10980 6f 6e 73 74 72 61 69 6e 74 20 2a 70 49 64 78 43  onstraint *pIdxC
10990 6f 6e 73 3b 0a 20 20 73 74 72 75 63 74 20 73 71  ons;.  struct sq
109a0 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65  lite3_index_orde
109b0 72 62 79 20 2a 70 49 64 78 4f 72 64 65 72 42 79  rby *pIdxOrderBy
109c0 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69 74  ;.  struct sqlit
109d0 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61  e3_index_constra
109e0 69 6e 74 5f 75 73 61 67 65 20 2a 70 55 73 61 67  int_usage *pUsag
109f0 65 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  e;.  WhereTerm *
10a00 70 54 65 72 6d 3b 0a 20 20 69 6e 74 20 6e 4f 72  pTerm;.  int nOr
10a10 64 65 72 42 79 3b 0a 20 20 73 71 6c 69 74 65 33  derBy;.  sqlite3
10a20 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49 64  _index_info *pId
10a30 78 49 6e 66 6f 3b 0a 0a 20 20 2f 2a 20 43 6f 75  xInfo;..  /* Cou
10a40 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  nt the number of
10a50 20 70 6f 73 73 69 62 6c 65 20 57 48 45 52 45 20   possible WHERE 
10a60 63 6c 61 75 73 65 20 63 6f 6e 73 74 72 61 69 6e  clause constrain
10a70 74 73 20 72 65 66 65 72 72 69 6e 67 0a 20 20 2a  ts referring.  *
10a80 2a 20 74 6f 20 74 68 69 73 20 76 69 72 74 75 61  * to this virtua
10a90 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 66 6f 72  l table */.  for
10aa0 28 69 3d 6e 54 65 72 6d 3d 30 2c 20 70 54 65 72  (i=nTerm=0, pTer
10ab0 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c 70 57 43 2d  m=pWC->a; i<pWC-
10ac0 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c 20 70 54 65  >nTerm; i++, pTe
10ad0 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70  rm++){.    if( p
10ae0 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
10af0 20 21 3d 20 70 53 72 63 2d 3e 69 43 75 72 73 6f   != pSrc->iCurso
10b00 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  r ) continue;.  
10b10 20 20 61 73 73 65 72 74 28 20 49 73 50 6f 77 65    assert( IsPowe
10b20 72 4f 66 54 77 6f 28 70 54 65 72 6d 2d 3e 65 4f  rOfTwo(pTerm->eO
10b30 70 65 72 61 74 6f 72 20 26 20 7e 57 4f 5f 45 51  perator & ~WO_EQ
10b40 55 49 56 29 20 29 3b 0a 20 20 20 20 74 65 73 74  UIV) );.    test
10b50 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70  case( pTerm->eOp
10b60 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29  erator & WO_IN )
10b70 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
10b80 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
10b90 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a   & WO_ISNULL );.
10ba0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
10bb0 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
10bc0 20 57 4f 5f 41 4c 4c 20 29 3b 0a 20 20 20 20 69   WO_ALL );.    i
10bd0 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  f( (pTerm->eOper
10be0 61 74 6f 72 20 26 20 7e 28 57 4f 5f 49 53 4e 55  ator & ~(WO_ISNU
10bf0 4c 4c 7c 57 4f 5f 45 51 55 49 56 29 29 3d 3d 30  LL|WO_EQUIV))==0
10c00 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
10c10 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c   if( pTerm->wtFl
10c20 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c  ags & TERM_VNULL
10c30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
10c40 20 6e 54 65 72 6d 2b 2b 3b 0a 20 20 7d 0a 0a 20   nTerm++;.  }.. 
10c50 20 2f 2a 20 49 66 20 74 68 65 20 4f 52 44 45 52   /* If the ORDER
10c60 20 42 59 20 63 6c 61 75 73 65 20 63 6f 6e 74 61   BY clause conta
10c70 69 6e 73 20 6f 6e 6c 79 20 63 6f 6c 75 6d 6e 73  ins only columns
10c80 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   in the current 
10c90 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 74 61  .  ** virtual ta
10ca0 62 6c 65 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74  ble then allocat
10cb0 65 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 20  e space for the 
10cc0 61 4f 72 64 65 72 42 79 20 70 61 72 74 20 6f 66  aOrderBy part of
10cd0 0a 20 20 2a 2a 20 74 68 65 20 73 71 6c 69 74 65  .  ** the sqlite
10ce0 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72  3_index_info str
10cf0 75 63 74 75 72 65 2e 0a 20 20 2a 2f 0a 20 20 6e  ucture..  */.  n
10d00 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 69  OrderBy = 0;.  i
10d10 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  f( pOrderBy ){. 
10d20 20 20 20 69 6e 74 20 6e 20 3d 20 70 4f 72 64 65     int n = pOrde
10d30 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  rBy->nExpr;.    
10d40 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b  for(i=0; i<n; i+
10d50 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  +){.      Expr *
10d60 70 45 78 70 72 20 3d 20 70 4f 72 64 65 72 42 79  pExpr = pOrderBy
10d70 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
10d80 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f      if( pExpr->o
10d90 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20  p!=TK_COLUMN || 
10da0 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d 70  pExpr->iTable!=p
10db0 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 20 62  Src->iCursor ) b
10dc0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
10dd0 69 66 28 20 69 3d 3d 6e 29 7b 0a 20 20 20 20 20  if( i==n){.     
10de0 20 6e 4f 72 64 65 72 42 79 20 3d 20 6e 3b 0a 20   nOrderBy = n;. 
10df0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41     }.  }..  /* A
10e00 6c 6c 6f 63 61 74 65 20 74 68 65 20 73 71 6c 69  llocate the sqli
10e10 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73  te3_index_info s
10e20 74 72 75 63 74 75 72 65 0a 20 20 2a 2f 0a 20 20  tructure.  */.  
10e30 70 49 64 78 49 6e 66 6f 20 3d 20 73 71 6c 69 74  pIdxInfo = sqlit
10e40 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70  e3DbMallocZero(p
10e50 50 61 72 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f  Parse->db, sizeo
10e60 66 28 2a 70 49 64 78 49 6e 66 6f 29 0a 20 20 20  f(*pIdxInfo).   
10e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e80 20 20 20 20 20 20 20 20 2b 20 28 73 69 7a 65 6f          + (sizeo
10e90 66 28 2a 70 49 64 78 43 6f 6e 73 29 20 2b 20 73  f(*pIdxCons) + s
10ea0 69 7a 65 6f 66 28 2a 70 55 73 61 67 65 29 29 2a  izeof(*pUsage))*
10eb0 6e 54 65 72 6d 0a 20 20 20 20 20 20 20 20 20 20  nTerm.          
10ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ed0 20 2b 20 73 69 7a 65 6f 66 28 2a 70 49 64 78 4f   + sizeof(*pIdxO
10ee0 72 64 65 72 42 79 29 2a 6e 4f 72 64 65 72 42 79  rderBy)*nOrderBy
10ef0 20 29 3b 0a 20 20 69 66 28 20 70 49 64 78 49 6e   );.  if( pIdxIn
10f00 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  fo==0 ){.    sql
10f10 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
10f20 72 73 65 2c 20 22 6f 75 74 20 6f 66 20 6d 65 6d  rse, "out of mem
10f30 6f 72 79 22 29 3b 0a 20 20 20 20 72 65 74 75 72  ory");.    retur
10f40 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  n 0;.  }..  /* I
10f50 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 73 74  nitialize the st
10f60 72 75 63 74 75 72 65 2e 20 20 54 68 65 20 73 71  ructure.  The sq
10f70 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
10f80 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61   structure conta
10f90 69 6e 73 0a 20 20 2a 2a 20 6d 61 6e 79 20 66 69  ins.  ** many fi
10fa0 65 6c 64 73 20 74 68 61 74 20 61 72 65 20 64 65  elds that are de
10fb0 63 6c 61 72 65 64 20 22 63 6f 6e 73 74 22 20 74  clared "const" t
10fc0 6f 20 70 72 65 76 65 6e 74 20 78 42 65 73 74 49  o prevent xBestI
10fd0 6e 64 65 78 20 66 72 6f 6d 0a 20 20 2a 2a 20 63  ndex from.  ** c
10fe0 68 61 6e 67 69 6e 67 20 74 68 65 6d 2e 20 20 57  hanging them.  W
10ff0 65 20 68 61 76 65 20 74 6f 20 64 6f 20 73 6f 6d  e have to do som
11000 65 20 66 75 6e 6b 79 20 63 61 73 74 69 6e 67 20  e funky casting 
11010 69 6e 20 6f 72 64 65 72 20 74 6f 0a 20 20 2a 2a  in order to.  **
11020 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 6f 73   initialize thos
11030 65 20 66 69 65 6c 64 73 2e 0a 20 20 2a 2f 0a 20  e fields..  */. 
11040 20 70 49 64 78 43 6f 6e 73 20 3d 20 28 73 74 72   pIdxCons = (str
11050 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
11060 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 29 26 70  x_constraint*)&p
11070 49 64 78 49 6e 66 6f 5b 31 5d 3b 0a 20 20 70 49  IdxInfo[1];.  pI
11080 64 78 4f 72 64 65 72 42 79 20 3d 20 28 73 74 72  dxOrderBy = (str
11090 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
110a0 78 5f 6f 72 64 65 72 62 79 2a 29 26 70 49 64 78  x_orderby*)&pIdx
110b0 43 6f 6e 73 5b 6e 54 65 72 6d 5d 3b 0a 20 20 70  Cons[nTerm];.  p
110c0 55 73 61 67 65 20 3d 20 28 73 74 72 75 63 74 20  Usage = (struct 
110d0 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f  sqlite3_index_co
110e0 6e 73 74 72 61 69 6e 74 5f 75 73 61 67 65 2a 29  nstraint_usage*)
110f0 26 70 49 64 78 4f 72 64 65 72 42 79 5b 6e 4f 72  &pIdxOrderBy[nOr
11100 64 65 72 42 79 5d 3b 0a 20 20 2a 28 69 6e 74 2a  derBy];.  *(int*
11110 29 26 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e  )&pIdxInfo->nCon
11120 73 74 72 61 69 6e 74 20 3d 20 6e 54 65 72 6d 3b  straint = nTerm;
11130 0a 20 20 2a 28 69 6e 74 2a 29 26 70 49 64 78 49  .  *(int*)&pIdxI
11140 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 20 3d 20  nfo->nOrderBy = 
11150 6e 4f 72 64 65 72 42 79 3b 0a 20 20 2a 28 73 74  nOrderBy;.  *(st
11160 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
11170 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 2a 29  ex_constraint**)
11180 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73  &pIdxInfo->aCons
11190 74 72 61 69 6e 74 20 3d 20 70 49 64 78 43 6f 6e  traint = pIdxCon
111a0 73 3b 0a 20 20 2a 28 73 74 72 75 63 74 20 73 71  s;.  *(struct sq
111b0 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65  lite3_index_orde
111c0 72 62 79 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d  rby**)&pIdxInfo-
111d0 3e 61 4f 72 64 65 72 42 79 20 3d 20 70 49 64 78  >aOrderBy = pIdx
111e0 4f 72 64 65 72 42 79 3b 0a 20 20 2a 28 73 74 72  OrderBy;.  *(str
111f0 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
11200 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61  x_constraint_usa
11210 67 65 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e  ge**)&pIdxInfo->
11220 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65  aConstraintUsage
11230 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   =.             
11240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11270 20 20 20 20 20 20 70 55 73 61 67 65 3b 0a 0a 20        pUsage;.. 
11280 20 66 6f 72 28 69 3d 6a 3d 30 2c 20 70 54 65 72   for(i=j=0, pTer
11290 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c 70 57 43 2d  m=pWC->a; i<pWC-
112a0 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c 20 70 54 65  >nTerm; i++, pTe
112b0 72 6d 2b 2b 29 7b 0a 20 20 20 20 75 38 20 6f 70  rm++){.    u8 op
112c0 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  ;.    if( pTerm-
112d0 3e 6c 65 66 74 43 75 72 73 6f 72 20 21 3d 20 70  >leftCursor != p
112e0 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 20 63  Src->iCursor ) c
112f0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73  ontinue;.    ass
11300 65 72 74 28 20 49 73 50 6f 77 65 72 4f 66 54 77  ert( IsPowerOfTw
11310 6f 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  o(pTerm->eOperat
11320 6f 72 20 26 20 7e 57 4f 5f 45 51 55 49 56 29 20  or & ~WO_EQUIV) 
11330 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
11340 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
11350 72 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20 20 20  r & WO_IN );.   
11360 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
11370 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
11380 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 74  _ISNULL );.    t
11390 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
113a0 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 41  eOperator & WO_A
113b0 4c 4c 20 29 3b 0a 20 20 20 20 69 66 28 20 28 70  LL );.    if( (p
113c0 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
113d0 26 20 7e 28 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f  & ~(WO_ISNULL|WO
113e0 5f 45 51 55 49 56 29 29 3d 3d 30 20 29 20 63 6f  _EQUIV))==0 ) co
113f0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
11400 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
11410 20 54 45 52 4d 5f 56 4e 55 4c 4c 20 29 20 63 6f   TERM_VNULL ) co
11420 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70 49 64 78  ntinue;.    pIdx
11430 43 6f 6e 73 5b 6a 5d 2e 69 43 6f 6c 75 6d 6e 20  Cons[j].iColumn 
11440 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43  = pTerm->u.leftC
11450 6f 6c 75 6d 6e 3b 0a 20 20 20 20 70 49 64 78 43  olumn;.    pIdxC
11460 6f 6e 73 5b 6a 5d 2e 69 54 65 72 6d 4f 66 66 73  ons[j].iTermOffs
11470 65 74 20 3d 20 69 3b 0a 20 20 20 20 6f 70 20 3d  et = i;.    op =
11480 20 28 75 38 29 70 54 65 72 6d 2d 3e 65 4f 70 65   (u8)pTerm->eOpe
11490 72 61 74 6f 72 20 26 20 57 4f 5f 41 4c 4c 3b 0a  rator & WO_ALL;.
114a0 20 20 20 20 69 66 28 20 6f 70 3d 3d 57 4f 5f 49      if( op==WO_I
114b0 4e 20 29 20 6f 70 20 3d 20 57 4f 5f 45 51 3b 0a  N ) op = WO_EQ;.
114c0 20 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e      pIdxCons[j].
114d0 6f 70 20 3d 20 6f 70 3b 0a 20 20 20 20 2f 2a 20  op = op;.    /* 
114e0 54 68 65 20 64 69 72 65 63 74 20 61 73 73 69 67  The direct assig
114f0 6e 6d 65 6e 74 20 69 6e 20 74 68 65 20 70 72 65  nment in the pre
11500 76 69 6f 75 73 20 6c 69 6e 65 20 69 73 20 70 6f  vious line is po
11510 73 73 69 62 6c 65 20 6f 6e 6c 79 20 62 65 63 61  ssible only beca
11520 75 73 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 57  use.    ** the W
11530 4f 5f 20 61 6e 64 20 53 51 4c 49 54 45 5f 49 4e  O_ and SQLITE_IN
11540 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 20  DEX_CONSTRAINT_ 
11550 63 6f 64 65 73 20 61 72 65 20 69 64 65 6e 74 69  codes are identi
11560 63 61 6c 2e 20 20 54 68 65 0a 20 20 20 20 2a 2a  cal.  The.    **
11570 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72   following asser
11580 74 73 20 76 65 72 69 66 79 20 74 68 69 73 20 66  ts verify this f
11590 61 63 74 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65  act. */.    asse
115a0 72 74 28 20 57 4f 5f 45 51 3d 3d 53 51 4c 49 54  rt( WO_EQ==SQLIT
115b0 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49  E_INDEX_CONSTRAI
115c0 4e 54 5f 45 51 20 29 3b 0a 20 20 20 20 61 73 73  NT_EQ );.    ass
115d0 65 72 74 28 20 57 4f 5f 4c 54 3d 3d 53 51 4c 49  ert( WO_LT==SQLI
115e0 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41  TE_INDEX_CONSTRA
115f0 49 4e 54 5f 4c 54 20 29 3b 0a 20 20 20 20 61 73  INT_LT );.    as
11600 73 65 72 74 28 20 57 4f 5f 4c 45 3d 3d 53 51 4c  sert( WO_LE==SQL
11610 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52  ITE_INDEX_CONSTR
11620 41 49 4e 54 5f 4c 45 20 29 3b 0a 20 20 20 20 61  AINT_LE );.    a
11630 73 73 65 72 74 28 20 57 4f 5f 47 54 3d 3d 53 51  ssert( WO_GT==SQ
11640 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54  LITE_INDEX_CONST
11650 52 41 49 4e 54 5f 47 54 20 29 3b 0a 20 20 20 20  RAINT_GT );.    
11660 61 73 73 65 72 74 28 20 57 4f 5f 47 45 3d 3d 53  assert( WO_GE==S
11670 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53  QLITE_INDEX_CONS
11680 54 52 41 49 4e 54 5f 47 45 20 29 3b 0a 20 20 20  TRAINT_GE );.   
11690 20 61 73 73 65 72 74 28 20 57 4f 5f 4d 41 54 43   assert( WO_MATC
116a0 48 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f  H==SQLITE_INDEX_
116b0 43 4f 4e 53 54 52 41 49 4e 54 5f 4d 41 54 43 48  CONSTRAINT_MATCH
116c0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
116d0 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
116e0 20 26 20 28 57 4f 5f 49 4e 7c 57 4f 5f 45 51 7c   & (WO_IN|WO_EQ|
116f0 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 47  WO_LT|WO_LE|WO_G
11700 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4d 41 54 43 48  T|WO_GE|WO_MATCH
11710 29 20 29 3b 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20  ) );.    j++;.  
11720 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  }.  for(i=0; i<n
11730 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20  OrderBy; i++){. 
11740 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d     Expr *pExpr =
11750 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
11760 70 45 78 70 72 3b 0a 20 20 20 20 70 49 64 78 4f  pExpr;.    pIdxO
11770 72 64 65 72 42 79 5b 69 5d 2e 69 43 6f 6c 75 6d  rderBy[i].iColum
11780 6e 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  n = pExpr->iColu
11790 6d 6e 3b 0a 20 20 20 20 70 49 64 78 4f 72 64 65  mn;.    pIdxOrde
117a0 72 42 79 5b 69 5d 2e 64 65 73 63 20 3d 20 70 4f  rBy[i].desc = pO
117b0 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72  rderBy->a[i].sor
117c0 74 4f 72 64 65 72 3b 0a 20 20 7d 0a 0a 20 20 72  tOrder;.  }..  r
117d0 65 74 75 72 6e 20 70 49 64 78 49 6e 66 6f 3b 0a  eturn pIdxInfo;.
117e0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74 61 62  }../*.** The tab
117f0 6c 65 20 6f 62 6a 65 63 74 20 72 65 66 65 72 65  le object refere
11800 6e 63 65 20 70 61 73 73 65 64 20 61 73 20 74 68  nce passed as th
11810 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
11820 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  t to this functi
11830 6f 6e 0a 2a 2a 20 6d 75 73 74 20 72 65 70 72 65  on.** must repre
11840 73 65 6e 74 20 61 20 76 69 72 74 75 61 6c 20 74  sent a virtual t
11850 61 62 6c 65 2e 20 54 68 69 73 20 66 75 6e 63 74  able. This funct
11860 69 6f 6e 20 69 6e 76 6f 6b 65 73 20 74 68 65 20  ion invokes the 
11870 78 42 65 73 74 49 6e 64 65 78 28 29 0a 2a 2a 20  xBestIndex().** 
11880 6d 65 74 68 6f 64 20 6f 66 20 74 68 65 20 76 69  method of the vi
11890 72 74 75 61 6c 20 74 61 62 6c 65 20 77 69 74 68  rtual table with
118a0 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64   the sqlite3_ind
118b0 65 78 5f 69 6e 66 6f 20 6f 62 6a 65 63 74 20 74  ex_info object t
118c0 68 61 74 0a 2a 2a 20 63 6f 6d 65 73 20 69 6e 20  hat.** comes in 
118d0 61 73 20 74 68 65 20 33 72 64 20 61 72 67 75 6d  as the 3rd argum
118e0 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63  ent to this func
118f0 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  tion..**.** If a
11900 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
11910 70 50 61 72 73 65 20 69 73 20 70 6f 70 75 6c 61  pParse is popula
11920 74 65 64 20 77 69 74 68 20 61 6e 20 65 72 72 6f  ted with an erro
11930 72 20 6d 65 73 73 61 67 65 20 61 6e 64 20 61 0a  r message and a.
11940 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75  ** non-zero valu
11950 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  e is returned. O
11960 74 68 65 72 77 69 73 65 2c 20 30 20 69 73 20 72  therwise, 0 is r
11970 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20  eturned and the 
11980 6f 75 74 70 75 74 0a 2a 2a 20 70 61 72 74 20 6f  output.** part o
11990 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e  f the sqlite3_in
119a0 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75  dex_info structu
119b0 72 65 20 69 73 20 6c 65 66 74 20 70 6f 70 75 6c  re is left popul
119c0 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 74  ated..**.** Whet
119d0 68 65 72 20 6f 72 20 6e 6f 74 20 61 6e 20 65 72  her or not an er
119e0 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 2c  ror is returned,
119f0 20 69 74 20 69 73 20 74 68 65 20 72 65 73 70 6f   it is the respo
11a00 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65  nsibility of the
11a10 0a 2a 2a 20 63 61 6c 6c 65 72 20 74 6f 20 65 76  .** caller to ev
11a20 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 20 70 2d  entually free p-
11a30 3e 69 64 78 53 74 72 20 69 66 20 70 2d 3e 6e 65  >idxStr if p->ne
11a40 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 20 69  edToFreeIdxStr i
11a50 6e 64 69 63 61 74 65 73 0a 2a 2a 20 74 68 61 74  ndicates.** that
11a60 20 74 68 69 73 20 69 73 20 72 65 71 75 69 72 65   this is require
11a70 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
11a80 20 76 74 61 62 42 65 73 74 49 6e 64 65 78 28 50   vtabBestIndex(P
11a90 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61  arse *pParse, Ta
11aa0 62 6c 65 20 2a 70 54 61 62 2c 20 73 71 6c 69 74  ble *pTab, sqlit
11ab0 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70  e3_index_info *p
11ac0 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61  ){.  sqlite3_vta
11ad0 62 20 2a 70 56 74 61 62 20 3d 20 73 71 6c 69 74  b *pVtab = sqlit
11ae0 65 33 47 65 74 56 54 61 62 6c 65 28 70 50 61 72  e3GetVTable(pPar
11af0 73 65 2d 3e 64 62 2c 20 70 54 61 62 29 2d 3e 70  se->db, pTab)->p
11b00 56 74 61 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Vtab;.  int i;. 
11b10 20 69 6e 74 20 72 63 3b 0a 0a 20 20 54 52 41 43   int rc;..  TRAC
11b20 45 5f 49 44 58 5f 49 4e 50 55 54 53 28 70 29 3b  E_IDX_INPUTS(p);
11b30 0a 20 20 72 63 20 3d 20 70 56 74 61 62 2d 3e 70  .  rc = pVtab->p
11b40 4d 6f 64 75 6c 65 2d 3e 78 42 65 73 74 49 6e 64  Module->xBestInd
11b50 65 78 28 70 56 74 61 62 2c 20 70 29 3b 0a 20 20  ex(pVtab, p);.  
11b60 54 52 41 43 45 5f 49 44 58 5f 4f 55 54 50 55 54  TRACE_IDX_OUTPUT
11b70 53 28 70 29 3b 0a 0a 20 20 69 66 28 20 72 63 21  S(p);..  if( rc!
11b80 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
11b90 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
11ba0 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 20 20  _NOMEM ){.      
11bb0 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
11bc0 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20  ocFailed = 1;.  
11bd0 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70 56 74    }else if( !pVt
11be0 61 62 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20  ab->zErrMsg ){. 
11bf0 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
11c00 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25 73  rMsg(pParse, "%s
11c10 22 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74 72  ", sqlite3ErrStr
11c20 28 72 63 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65  (rc));.    }else
11c30 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
11c40 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
11c50 22 25 73 22 2c 20 70 56 74 61 62 2d 3e 7a 45 72  "%s", pVtab->zEr
11c60 72 4d 73 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  rMsg);.    }.  }
11c70 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
11c80 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b  pVtab->zErrMsg);
11c90 0a 20 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73  .  pVtab->zErrMs
11ca0 67 20 3d 20 30 3b 0a 0a 20 20 66 6f 72 28 69 3d  g = 0;..  for(i=
11cb0 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61  0; i<p->nConstra
11cc0 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  int; i++){.    i
11cd0 66 28 20 21 70 2d 3e 61 43 6f 6e 73 74 72 61 69  f( !p->aConstrai
11ce0 6e 74 5b 69 5d 2e 75 73 61 62 6c 65 20 26 26 20  nt[i].usable && 
11cf0 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73  p->aConstraintUs
11d00 61 67 65 5b 69 5d 2e 61 72 67 76 49 6e 64 65 78  age[i].argvIndex
11d10 3e 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  >0 ){.      sqli
11d20 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
11d30 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22  se, .          "
11d40 74 61 62 6c 65 20 25 73 3a 20 78 42 65 73 74 49  table %s: xBestI
11d50 6e 64 65 78 20 72 65 74 75 72 6e 65 64 20 61 6e  ndex returned an
11d60 20 69 6e 76 61 6c 69 64 20 70 6c 61 6e 22 2c 20   invalid plan", 
11d70 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
11d80 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
11d90 6e 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3b 0a  n pParse->nErr;.
11da0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  }.#endif /* !def
11db0 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
11dc0 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 20 2a  _VIRTUALTABLE) *
11dd0 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  /..#ifdef SQLITE
11de0 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52  _ENABLE_STAT3_OR
11df0 5f 53 54 41 54 34 0a 2f 2a 0a 2a 2a 20 45 73 74  _STAT4./*.** Est
11e00 69 6d 61 74 65 20 74 68 65 20 6c 6f 63 61 74 69  imate the locati
11e10 6f 6e 20 6f 66 20 61 20 70 61 72 74 69 63 75 6c  on of a particul
11e20 61 72 20 6b 65 79 20 61 6d 6f 6e 67 20 61 6c 6c  ar key among all
11e30 20 6b 65 79 73 20 69 6e 20 61 6e 0a 2a 2a 20 69   keys in an.** i
11e40 6e 64 65 78 2e 20 20 53 74 6f 72 65 20 74 68 65  ndex.  Store the
11e50 20 72 65 73 75 6c 74 73 20 69 6e 20 61 53 74 61   results in aSta
11e60 74 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  t as follows:.**
11e70 0a 2a 2a 20 20 20 20 61 53 74 61 74 5b 30 5d 20  .**    aStat[0] 
11e80 20 20 20 20 20 45 73 74 2e 20 6e 75 6d 62 65 72       Est. number
11e90 20 6f 66 20 72 6f 77 73 20 6c 65 73 73 20 74 68   of rows less th
11ea0 61 6e 20 70 52 65 63 0a 2a 2a 20 20 20 20 61 53  an pRec.**    aS
11eb0 74 61 74 5b 31 5d 20 20 20 20 20 20 45 73 74 2e  tat[1]      Est.
11ec0 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
11ed0 65 71 75 61 6c 20 74 6f 20 70 52 65 63 0a 2a 2a  equal to pRec.**
11ee0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 69  .** Return the i
11ef0 6e 64 65 78 20 6f 66 20 74 68 65 20 73 61 6d 70  ndex of the samp
11f00 6c 65 20 74 68 61 74 20 69 73 20 74 68 65 20 73  le that is the s
11f10 6d 61 6c 6c 65 73 74 20 73 61 6d 70 6c 65 20 74  mallest sample t
11f20 68 61 74 0a 2a 2a 20 69 73 20 67 72 65 61 74 65  hat.** is greate
11f30 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  r than or equal 
11f40 74 6f 20 70 52 65 63 2e 20 4e 6f 74 65 20 74 68  to pRec. Note th
11f50 61 74 20 74 68 69 73 20 69 6e 64 65 78 20 69 73  at this index is
11f60 20 6e 6f 74 20 61 6e 20 69 6e 64 65 78 0a 2a 2a   not an index.**
11f70 20 69 6e 74 6f 20 74 68 65 20 61 53 61 6d 70 6c   into the aSampl
11f80 65 5b 5d 20 61 72 72 61 79 20 2d 20 69 74 20 69  e[] array - it i
11f90 73 20 61 6e 20 69 6e 64 65 78 20 69 6e 74 6f 20  s an index into 
11fa0 61 20 76 69 72 74 75 61 6c 20 73 65 74 20 6f 66  a virtual set of
11fb0 20 73 61 6d 70 6c 65 73 0a 2a 2a 20 62 61 73 65   samples.** base
11fc0 64 20 6f 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74  d on the content
11fd0 73 20 6f 66 20 61 53 61 6d 70 6c 65 5b 5d 20 61  s of aSample[] a
11fe0 6e 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  nd the number of
11ff0 20 66 69 65 6c 64 73 20 69 6e 20 72 65 63 6f 72   fields in recor
12000 64 20 0a 2a 2a 20 70 52 65 63 2e 20 0a 2a 2f 0a  d .** pRec. .*/.
12010 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
12020 4b 65 79 53 74 61 74 73 28 0a 20 20 50 61 72 73  KeyStats(.  Pars
12030 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
12040 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
12050 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
12060 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 2c  /.  Index *pIdx,
12070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12080 2f 2a 20 49 6e 64 65 78 20 74 6f 20 63 6f 6e 73  /* Index to cons
12090 69 64 65 72 20 64 6f 6d 61 69 6e 20 6f 66 20 2a  ider domain of *
120a0 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  /.  UnpackedReco
120b0 72 64 20 2a 70 52 65 63 2c 20 20 20 20 20 20 20  rd *pRec,       
120c0 2f 2a 20 56 65 63 74 6f 72 20 6f 66 20 76 61 6c  /* Vector of val
120d0 75 65 73 20 74 6f 20 63 6f 6e 73 69 64 65 72 20  ues to consider 
120e0 2a 2f 0a 20 20 69 6e 74 20 72 6f 75 6e 64 55 70  */.  int roundUp
120f0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
12100 20 2f 2a 20 52 6f 75 6e 64 20 75 70 20 69 66 20   /* Round up if 
12110 74 72 75 65 2e 20 20 52 6f 75 6e 64 20 64 6f 77  true.  Round dow
12120 6e 20 69 66 20 66 61 6c 73 65 20 2a 2f 0a 20 20  n if false */.  
12130 74 52 6f 77 63 6e 74 20 2a 61 53 74 61 74 20 20  tRowcnt *aStat  
12140 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
12150 55 54 3a 20 73 74 61 74 73 20 77 72 69 74 74 65  UT: stats writte
12160 6e 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 49  n here */.){.  I
12170 6e 64 65 78 53 61 6d 70 6c 65 20 2a 61 53 61 6d  ndexSample *aSam
12180 70 6c 65 20 3d 20 70 49 64 78 2d 3e 61 53 61 6d  ple = pIdx->aSam
12190 70 6c 65 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 3b  ple;.  int iCol;
121a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
121b0 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 72     /* Index of r
121c0 65 71 75 69 72 65 64 20 73 74 61 74 73 20 69 6e  equired stats in
121d0 20 61 6e 45 71 5b 5d 20 65 74 63 2e 20 2a 2f 0a   anEq[] etc. */.
121e0 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
121f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12200 20 49 6e 64 65 78 20 6f 66 20 66 69 72 73 74 20   Index of first 
12210 73 61 6d 70 6c 65 20 3e 3d 20 70 52 65 63 20 2a  sample >= pRec *
12220 2f 0a 20 20 69 6e 74 20 69 53 61 6d 70 6c 65 3b  /.  int iSample;
12230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12240 2f 2a 20 53 6d 61 6c 6c 65 73 74 20 73 61 6d 70  /* Smallest samp
12250 6c 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20 6f  le larger than o
12260 72 20 65 71 75 61 6c 20 74 6f 20 70 52 65 63 20  r equal to pRec 
12270 2a 2f 0a 20 20 69 6e 74 20 69 4d 69 6e 20 3d 20  */.  int iMin = 
12280 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
12290 20 2f 2a 20 53 6d 61 6c 6c 65 73 74 20 73 61 6d   /* Smallest sam
122a0 70 6c 65 20 6e 6f 74 20 79 65 74 20 74 65 73 74  ple not yet test
122b0 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 54 65 73  ed */.  int iTes
122c0 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
122d0 20 20 20 20 2f 2a 20 4e 65 78 74 20 73 61 6d 70      /* Next samp
122e0 6c 65 20 74 6f 20 74 65 73 74 20 2a 2f 0a 20 20  le to test */.  
122f0 69 6e 74 20 72 65 73 3b 20 20 20 20 20 20 20 20  int res;        
12300 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
12310 65 73 75 6c 74 20 6f 66 20 63 6f 6d 70 61 72 69  esult of compari
12320 73 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f  son operation */
12330 0a 20 20 69 6e 74 20 6e 46 69 65 6c 64 3b 20 20  .  int nField;  
12340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12350 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 69 65 6c  * Number of fiel
12360 64 73 20 69 6e 20 70 52 65 63 20 2a 2f 0a 20 20  ds in pRec */.  
12370 74 52 6f 77 63 6e 74 20 69 4c 6f 77 65 72 20 3d  tRowcnt iLower =
12380 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 61   0;         /* a
12390 6e 4c 74 5b 5d 20 2b 20 61 6e 45 71 5b 5d 20 6f  nLt[] + anEq[] o
123a0 66 20 6c 61 72 67 65 73 74 20 73 61 6d 70 6c 65  f largest sample
123b0 20 70 52 65 63 20 69 73 20 3e 20 2a 2f 0a 0a 23   pRec is > */..#
123c0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 45  ifndef SQLITE_DE
123d0 42 55 47 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  BUG.  UNUSED_PAR
123e0 41 4d 45 54 45 52 28 20 70 50 61 72 73 65 20 29  AMETER( pParse )
123f0 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72  ;.#endif.  asser
12400 74 28 20 70 52 65 63 21 3d 30 20 29 3b 0a 20 20  t( pRec!=0 );.  
12410 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6e 53  assert( pIdx->nS
12420 61 6d 70 6c 65 3e 30 20 29 3b 0a 20 20 61 73 73  ample>0 );.  ass
12430 65 72 74 28 20 70 52 65 63 2d 3e 6e 46 69 65 6c  ert( pRec->nFiel
12440 64 3e 30 20 26 26 20 70 52 65 63 2d 3e 6e 46 69  d>0 && pRec->nFi
12450 65 6c 64 3c 3d 70 49 64 78 2d 3e 6e 53 61 6d 70  eld<=pIdx->nSamp
12460 6c 65 43 6f 6c 20 29 3b 0a 0a 20 20 2f 2a 20 44  leCol );..  /* D
12470 6f 20 61 20 62 69 6e 61 72 79 20 73 65 61 72 63  o a binary searc
12480 68 20 74 6f 20 66 69 6e 64 20 74 68 65 20 66 69  h to find the fi
12490 72 73 74 20 73 61 6d 70 6c 65 20 67 72 65 61 74  rst sample great
124a0 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  er than or equal
124b0 0a 20 20 2a 2a 20 74 6f 20 70 52 65 63 2e 20 49  .  ** to pRec. I
124c0 66 20 70 52 65 63 20 63 6f 6e 74 61 69 6e 73 20  f pRec contains 
124d0 61 20 73 69 6e 67 6c 65 20 66 69 65 6c 64 2c 20  a single field, 
124e0 74 68 65 20 73 65 74 20 6f 66 20 73 61 6d 70 6c  the set of sampl
124f0 65 73 20 74 6f 20 73 65 61 72 63 68 0a 20 20 2a  es to search.  *
12500 2a 20 69 73 20 73 69 6d 70 6c 79 20 74 68 65 20  * is simply the 
12510 61 53 61 6d 70 6c 65 5b 5d 20 61 72 72 61 79 2e  aSample[] array.
12520 20 49 66 20 74 68 65 20 73 61 6d 70 6c 65 73 20   If the samples 
12530 69 6e 20 61 53 61 6d 70 6c 65 5b 5d 20 63 6f 6e  in aSample[] con
12540 74 61 69 6e 20 6d 6f 72 65 0a 20 20 2a 2a 20 74  tain more.  ** t
12550 68 61 6e 20 6f 6e 65 20 66 69 65 6c 64 73 2c 20  han one fields, 
12560 61 6c 6c 20 66 69 65 6c 64 73 20 66 6f 6c 6c 6f  all fields follo
12570 77 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 61  wing the first a
12580 72 65 20 69 67 6e 6f 72 65 64 2e 0a 20 20 2a 2a  re ignored..  **
12590 0a 20 20 2a 2a 20 49 66 20 70 52 65 63 20 63 6f  .  ** If pRec co
125a0 6e 74 61 69 6e 73 20 4e 20 66 69 65 6c 64 73 2c  ntains N fields,
125b0 20 77 68 65 72 65 20 4e 20 69 73 20 6d 6f 72 65   where N is more
125c0 20 74 68 61 6e 20 6f 6e 65 2c 20 74 68 65 6e 20   than one, then 
125d0 61 73 20 77 65 6c 6c 20 61 73 20 74 68 65 0a 20  as well as the. 
125e0 20 2a 2a 20 73 61 6d 70 6c 65 73 20 69 6e 20 61   ** samples in a
125f0 53 61 6d 70 6c 65 5b 5d 20 28 74 72 75 6e 63 61  Sample[] (trunca
12600 74 65 64 20 74 6f 20 4e 20 66 69 65 6c 64 73 29  ted to N fields)
12610 2c 20 74 68 65 20 73 65 61 72 63 68 20 61 6c 73  , the search als
12620 6f 20 68 61 73 20 74 6f 0a 20 20 2a 2a 20 63 6f  o has to.  ** co
12630 6e 73 69 64 65 72 20 70 72 65 66 69 78 65 73 20  nsider prefixes 
12640 6f 66 20 74 68 6f 73 65 20 73 61 6d 70 6c 65 73  of those samples
12650 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69  . For example, i
12660 66 20 74 68 65 20 73 65 74 20 6f 66 20 73 61 6d  f the set of sam
12670 70 6c 65 73 0a 20 20 2a 2a 20 69 6e 20 61 53 61  ples.  ** in aSa
12680 6d 70 6c 65 20 69 73 3a 0a 20 20 2a 2a 0a 20 20  mple is:.  **.  
12690 2a 2a 20 20 20 20 20 61 53 61 6d 70 6c 65 5b 30  **     aSample[0
126a0 5d 20 3d 20 28 61 2c 20 35 29 20 0a 20 20 2a 2a  ] = (a, 5) .  **
126b0 20 20 20 20 20 61 53 61 6d 70 6c 65 5b 31 5d 20       aSample[1] 
126c0 3d 20 28 61 2c 20 31 30 29 20 0a 20 20 2a 2a 20  = (a, 10) .  ** 
126d0 20 20 20 20 61 53 61 6d 70 6c 65 5b 32 5d 20 3d      aSample[2] =
126e0 20 28 62 2c 20 35 29 20 0a 20 20 2a 2a 20 20 20   (b, 5) .  **   
126f0 20 20 61 53 61 6d 70 6c 65 5b 33 5d 20 3d 20 28    aSample[3] = (
12700 63 2c 20 31 30 30 29 20 0a 20 20 2a 2a 20 20 20  c, 100) .  **   
12710 20 20 61 53 61 6d 70 6c 65 5b 34 5d 20 3d 20 28    aSample[4] = (
12720 63 2c 20 31 30 35 29 0a 20 20 2a 2a 0a 20 20 2a  c, 105).  **.  *
12730 2a 20 54 68 65 6e 20 74 68 65 20 73 65 61 72 63  * Then the searc
12740 68 20 73 70 61 63 65 20 73 68 6f 75 6c 64 20 69  h space should i
12750 64 65 61 6c 6c 79 20 62 65 20 74 68 65 20 73 61  deally be the sa
12760 6d 70 6c 65 73 20 61 62 6f 76 65 20 61 6e 64 20  mples above and 
12770 74 68 65 20 0a 20 20 2a 2a 20 75 6e 69 71 75 65  the .  ** unique
12780 20 70 72 65 66 69 78 65 73 20 5b 61 5d 2c 20 5b   prefixes [a], [
12790 62 5d 20 61 6e 64 20 5b 63 5d 2e 20 42 75 74 20  b] and [c]. But 
127a0 73 69 6e 63 65 20 74 68 61 74 20 69 73 20 68 61  since that is ha
127b0 72 64 20 74 6f 20 6f 72 67 61 6e 69 7a 65 2c 20  rd to organize, 
127c0 0a 20 20 2a 2a 20 74 68 65 20 63 6f 64 65 20 61  .  ** the code a
127d0 63 74 75 61 6c 6c 79 20 73 65 61 72 63 68 65 73  ctually searches
127e0 20 74 68 69 73 20 73 65 74 3a 0a 20 20 2a 2a 0a   this set:.  **.
127f0 20 20 2a 2a 20 20 20 20 20 30 3a 20 28 61 29 20    **     0: (a) 
12800 0a 20 20 2a 2a 20 20 20 20 20 31 3a 20 28 61 2c  .  **     1: (a,
12810 20 35 29 20 0a 20 20 2a 2a 20 20 20 20 20 32 3a   5) .  **     2:
12820 20 28 61 2c 20 31 30 29 20 0a 20 20 2a 2a 20 20   (a, 10) .  **  
12830 20 20 20 33 3a 20 28 61 2c 20 31 30 29 20 0a 20     3: (a, 10) . 
12840 20 2a 2a 20 20 20 20 20 34 3a 20 28 62 29 20 0a   **     4: (b) .
12850 20 20 2a 2a 20 20 20 20 20 35 3a 20 28 62 2c 20    **     5: (b, 
12860 35 29 20 0a 20 20 2a 2a 20 20 20 20 20 36 3a 20  5) .  **     6: 
12870 28 63 29 20 0a 20 20 2a 2a 20 20 20 20 20 37 3a  (c) .  **     7:
12880 20 28 63 2c 20 31 30 30 29 20 0a 20 20 2a 2a 20   (c, 100) .  ** 
12890 20 20 20 20 38 3a 20 28 63 2c 20 31 30 35 29 0a      8: (c, 105).
128a0 20 20 2a 2a 20 20 20 20 20 39 3a 20 28 63 2c 20    **     9: (c, 
128b0 31 30 35 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46  105).  **.  ** F
128c0 6f 72 20 65 61 63 68 20 73 61 6d 70 6c 65 20 69  or each sample i
128d0 6e 20 74 68 65 20 61 53 61 6d 70 6c 65 5b 5d 20  n the aSample[] 
128e0 61 72 72 61 79 2c 20 4e 20 73 61 6d 70 6c 65 73  array, N samples
128f0 20 61 72 65 20 70 72 65 73 65 6e 74 20 69 6e 20   are present in 
12900 74 68 65 0a 20 20 2a 2a 20 65 66 66 65 63 74 69  the.  ** effecti
12910 76 65 20 73 61 6d 70 6c 65 20 61 72 72 61 79 2e  ve sample array.
12920 20 49 6e 20 74 68 65 20 61 62 6f 76 65 2c 20 73   In the above, s
12930 61 6d 70 6c 65 73 20 30 20 61 6e 64 20 31 20 61  amples 0 and 1 a
12940 72 65 20 62 61 73 65 64 20 6f 6e 20 0a 20 20 2a  re based on .  *
12950 2a 20 73 61 6d 70 6c 65 20 61 53 61 6d 70 6c 65  * sample aSample
12960 5b 30 5d 2e 20 53 61 6d 70 6c 65 73 20 32 20 61  [0]. Samples 2 a
12970 6e 64 20 33 20 6f 6e 20 61 53 61 6d 70 6c 65 5b  nd 3 on aSample[
12980 31 5d 20 65 74 63 2e 0a 20 20 2a 2a 0a 20 20 2a  1] etc..  **.  *
12990 2a 20 4f 66 74 65 6e 2c 20 73 61 6d 70 6c 65 20  * Often, sample 
129a0 69 20 6f 66 20 65 61 63 68 20 62 6c 6f 63 6b 20  i of each block 
129b0 6f 66 20 4e 20 65 66 66 65 63 74 69 76 65 20 73  of N effective s
129c0 61 6d 70 6c 65 73 20 68 61 73 20 28 69 2b 31 29  amples has (i+1)
129d0 20 66 69 65 6c 64 73 2e 0a 20 20 2a 2a 20 45 78   fields..  ** Ex
129e0 63 65 70 74 2c 20 65 61 63 68 20 73 61 6d 70 6c  cept, each sampl
129f0 65 20 6d 61 79 20 62 65 20 65 78 74 65 6e 64 65  e may be extende
12a00 64 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74  d to ensure that
12a10 20 69 74 20 69 73 20 67 72 65 61 74 65 72 20 74   it is greater t
12a20 68 61 6e 20 6f 72 0a 20 20 2a 2a 20 65 71 75 61  han or.  ** equa
12a30 6c 20 74 6f 20 74 68 65 20 70 72 65 76 69 6f 75  l to the previou
12a40 73 20 73 61 6d 70 6c 65 20 69 6e 20 74 68 65 20  s sample in the 
12a50 61 72 72 61 79 2e 20 46 6f 72 20 65 78 61 6d 70  array. For examp
12a60 6c 65 2c 20 69 6e 20 74 68 65 20 61 62 6f 76 65  le, in the above
12a70 2c 20 0a 20 20 2a 2a 20 73 61 6d 70 6c 65 20 32  , .  ** sample 2
12a80 20 69 73 20 74 68 65 20 66 69 72 73 74 20 73 61   is the first sa
12a90 6d 70 6c 65 20 6f 66 20 61 20 62 6c 6f 63 6b 20  mple of a block 
12aa0 6f 66 20 4e 20 73 61 6d 70 6c 65 73 2c 20 73 6f  of N samples, so
12ab0 20 61 74 20 66 69 72 73 74 20 69 74 20 0a 20 20   at first it .  
12ac0 2a 2a 20 61 70 70 65 61 72 73 20 74 68 61 74 20  ** appears that 
12ad0 69 74 20 73 68 6f 75 6c 64 20 62 65 20 31 20 66  it should be 1 f
12ae0 69 65 6c 64 20 69 6e 20 73 69 7a 65 2e 20 48 6f  ield in size. Ho
12af0 77 65 76 65 72 2c 20 74 68 61 74 20 77 6f 75 6c  wever, that woul
12b00 64 20 6d 61 6b 65 20 69 74 20 0a 20 20 2a 2a 20  d make it .  ** 
12b10 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 73 61 6d  smaller than sam
12b20 70 6c 65 20 31 2c 20 73 6f 20 74 68 65 20 62 69  ple 1, so the bi
12b30 6e 61 72 79 20 73 65 61 72 63 68 20 77 6f 75 6c  nary search woul
12b40 64 20 6e 6f 74 20 77 6f 72 6b 2e 20 41 73 20 61  d not work. As a
12b50 20 72 65 73 75 6c 74 2c 20 0a 20 20 2a 2a 20 69   result, .  ** i
12b60 74 20 69 73 20 65 78 74 65 6e 64 65 64 20 74 6f  t is extended to
12b70 20 74 77 6f 20 66 69 65 6c 64 73 2e 20 54 68 65   two fields. The
12b80 20 64 75 70 6c 69 63 61 74 65 73 20 74 68 61 74   duplicates that
12b90 20 74 68 69 73 20 63 72 65 61 74 65 73 20 64 6f   this creates do
12ba0 20 6e 6f 74 20 0a 20 20 2a 2a 20 63 61 75 73 65   not .  ** cause
12bb0 20 61 6e 79 20 70 72 6f 62 6c 65 6d 73 2e 0a 20   any problems.. 
12bc0 20 2a 2f 0a 20 20 6e 46 69 65 6c 64 20 3d 20 70   */.  nField = p
12bd0 52 65 63 2d 3e 6e 46 69 65 6c 64 3b 0a 20 20 69  Rec->nField;.  i
12be0 43 6f 6c 20 3d 20 30 3b 0a 20 20 69 53 61 6d 70  Col = 0;.  iSamp
12bf0 6c 65 20 3d 20 70 49 64 78 2d 3e 6e 53 61 6d 70  le = pIdx->nSamp
12c00 6c 65 20 2a 20 6e 46 69 65 6c 64 3b 0a 20 20 64  le * nField;.  d
12c10 6f 7b 0a 20 20 20 20 69 6e 74 20 69 53 61 6d 70  o{.    int iSamp
12c20 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
12c30 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e       /* Index in
12c40 20 61 53 61 6d 70 6c 65 5b 5d 20 6f 66 20 74 65   aSample[] of te
12c50 73 74 20 73 61 6d 70 6c 65 20 2a 2f 0a 20 20 20  st sample */.   
12c60 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20   int n;         
12c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12c80 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 69 65 6c  * Number of fiel
12c90 64 73 20 69 6e 20 74 65 73 74 20 73 61 6d 70 6c  ds in test sampl
12ca0 65 20 2a 2f 0a 0a 20 20 20 20 69 54 65 73 74 20  e */..    iTest 
12cb0 3d 20 28 69 4d 69 6e 2b 69 53 61 6d 70 6c 65 29  = (iMin+iSample)
12cc0 2f 32 3b 0a 20 20 20 20 69 53 61 6d 70 20 3d 20  /2;.    iSamp = 
12cd0 69 54 65 73 74 20 2f 20 6e 46 69 65 6c 64 3b 0a  iTest / nField;.
12ce0 20 20 20 20 69 66 28 20 69 53 61 6d 70 3e 30 20      if( iSamp>0 
12cf0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ){.      /* The 
12d00 70 72 6f 70 6f 73 65 64 20 65 66 66 65 63 74 69  proposed effecti
12d10 76 65 20 73 61 6d 70 6c 65 20 69 73 20 61 20 70  ve sample is a p
12d20 72 65 66 69 78 20 6f 66 20 73 61 6d 70 6c 65 20  refix of sample 
12d30 61 53 61 6d 70 6c 65 5b 69 53 61 6d 70 5d 2e 0a  aSample[iSamp]..
12d40 20 20 20 20 20 20 2a 2a 20 53 70 65 63 69 66 69        ** Specifi
12d50 63 61 6c 6c 79 2c 20 74 68 65 20 73 68 6f 72 74  cally, the short
12d60 65 73 74 20 70 72 65 66 69 78 20 6f 66 20 61 74  est prefix of at
12d70 20 6c 65 61 73 74 20 28 31 20 2b 20 69 54 65 73   least (1 + iTes
12d80 74 25 6e 46 69 65 6c 64 29 20 0a 20 20 20 20 20  t%nField) .     
12d90 20 2a 2a 20 66 69 65 6c 64 73 20 74 68 61 74 20   ** fields that 
12da0 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
12db0 74 68 65 20 70 72 65 76 69 6f 75 73 20 65 66 66  the previous eff
12dc0 65 63 74 69 76 65 20 73 61 6d 70 6c 65 2e 20 20  ective sample.  
12dd0 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 6e 3d 28  */.      for(n=(
12de0 69 54 65 73 74 20 25 20 6e 46 69 65 6c 64 29 20  iTest % nField) 
12df0 2b 20 31 3b 20 6e 3c 6e 46 69 65 6c 64 3b 20 6e  + 1; n<nField; n
12e00 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
12e10 20 61 53 61 6d 70 6c 65 5b 69 53 61 6d 70 2d 31   aSample[iSamp-1
12e20 5d 2e 61 6e 4c 74 5b 6e 2d 31 5d 21 3d 61 53 61  ].anLt[n-1]!=aSa
12e30 6d 70 6c 65 5b 69 53 61 6d 70 5d 2e 61 6e 4c 74  mple[iSamp].anLt
12e40 5b 6e 2d 31 5d 20 29 20 62 72 65 61 6b 3b 0a 20  [n-1] ) break;. 
12e50 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
12e60 7b 0a 20 20 20 20 20 20 6e 20 3d 20 69 54 65 73  {.      n = iTes
12e70 74 20 2b 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20  t + 1;.    }..  
12e80 20 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 20 3d    pRec->nField =
12e90 20 6e 3b 0a 20 20 20 20 72 65 73 20 3d 20 73 71   n;.    res = sq
12ea0 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
12eb0 6f 6d 70 61 72 65 28 61 53 61 6d 70 6c 65 5b 69  ompare(aSample[i
12ec0 53 61 6d 70 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65  Samp].n, aSample
12ed0 5b 69 53 61 6d 70 5d 2e 70 2c 20 70 52 65 63 29  [iSamp].p, pRec)
12ee0 3b 0a 20 20 20 20 69 66 28 20 72 65 73 3c 30 20  ;.    if( res<0 
12ef0 29 7b 0a 20 20 20 20 20 20 69 4c 6f 77 65 72 20  ){.      iLower 
12f00 3d 20 61 53 61 6d 70 6c 65 5b 69 53 61 6d 70 5d  = aSample[iSamp]
12f10 2e 61 6e 4c 74 5b 6e 2d 31 5d 20 2b 20 61 53 61  .anLt[n-1] + aSa
12f20 6d 70 6c 65 5b 69 53 61 6d 70 5d 2e 61 6e 45 71  mple[iSamp].anEq
12f30 5b 6e 2d 31 5d 3b 0a 20 20 20 20 20 20 69 4d 69  [n-1];.      iMi
12f40 6e 20 3d 20 69 54 65 73 74 2b 31 3b 0a 20 20 20  n = iTest+1;.   
12f50 20 7d 65 6c 73 65 20 69 66 28 20 72 65 73 3d 3d   }else if( res==
12f60 30 20 26 26 20 6e 3c 6e 46 69 65 6c 64 20 29 7b  0 && n<nField ){
12f70 0a 20 20 20 20 20 20 69 4c 6f 77 65 72 20 3d 20  .      iLower = 
12f80 61 53 61 6d 70 6c 65 5b 69 53 61 6d 70 5d 2e 61  aSample[iSamp].a
12f90 6e 4c 74 5b 6e 2d 31 5d 3b 0a 20 20 20 20 20 20  nLt[n-1];.      
12fa0 69 4d 69 6e 20 3d 20 69 54 65 73 74 2b 31 3b 0a  iMin = iTest+1;.
12fb0 20 20 20 20 20 20 72 65 73 20 3d 20 2d 31 3b 0a        res = -1;.
12fc0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
12fd0 20 69 53 61 6d 70 6c 65 20 3d 20 69 54 65 73 74   iSample = iTest
12fe0 3b 0a 20 20 20 20 20 20 69 43 6f 6c 20 3d 20 6e  ;.      iCol = n
12ff0 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69  -1;.    }.  }whi
13000 6c 65 28 20 72 65 73 20 26 26 20 69 4d 69 6e 3c  le( res && iMin<
13010 69 53 61 6d 70 6c 65 20 29 3b 0a 20 20 69 20 3d  iSample );.  i =
13020 20 69 53 61 6d 70 6c 65 20 2f 20 6e 46 69 65 6c   iSample / nFiel
13030 64 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  d;..#ifdef SQLIT
13040 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 54 68 65  E_DEBUG.  /* The
13050 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72   following asser
13060 74 20 73 74 61 74 65 6d 65 6e 74 73 20 63 68 65  t statements che
13070 63 6b 20 74 68 61 74 20 74 68 65 20 62 69 6e 61  ck that the bina
13080 72 79 20 73 65 61 72 63 68 20 63 6f 64 65 0a 20  ry search code. 
13090 20 2a 2a 20 61 62 6f 76 65 20 66 6f 75 6e 64 20   ** above found 
130a0 74 68 65 20 72 69 67 68 74 20 61 6e 73 77 65 72  the right answer
130b0 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20 73 65 72  . This block ser
130c0 76 65 73 20 6e 6f 20 70 75 72 70 6f 73 65 20 6f  ves no purpose o
130d0 74 68 65 72 0a 20 20 2a 2a 20 74 68 61 6e 20 74  ther.  ** than t
130e0 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20 61 73 73  o invoke the ass
130f0 65 72 74 73 2e 20 20 2a 2f 0a 20 20 69 66 28 20  erts.  */.  if( 
13100 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
13110 6f 63 46 61 69 6c 65 64 3d 3d 30 20 29 7b 0a 20  ocFailed==0 ){. 
13120 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b     if( res==0 ){
13130 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 28 72 65  .      /* If (re
13140 73 3d 3d 30 29 20 69 73 20 74 72 75 65 2c 20 74  s==0) is true, t
13150 68 65 6e 20 70 52 65 63 20 6d 75 73 74 20 62 65  hen pRec must be
13160 20 65 71 75 61 6c 20 74 6f 20 73 61 6d 70 6c 65   equal to sample
13170 20 69 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73   i. */.      ass
13180 65 72 74 28 20 69 3c 70 49 64 78 2d 3e 6e 53 61  ert( i<pIdx->nSa
13190 6d 70 6c 65 20 29 3b 0a 20 20 20 20 20 20 61 73  mple );.      as
131a0 73 65 72 74 28 20 69 43 6f 6c 3d 3d 6e 46 69 65  sert( iCol==nFie
131b0 6c 64 2d 31 20 29 3b 0a 20 20 20 20 20 20 70 52  ld-1 );.      pR
131c0 65 63 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 46 69  ec->nField = nFi
131d0 65 6c 64 3b 0a 20 20 20 20 20 20 61 73 73 65 72  eld;.      asser
131e0 74 28 20 30 3d 3d 73 71 6c 69 74 65 33 56 64 62  t( 0==sqlite3Vdb
131f0 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 61  eRecordCompare(a
13200 53 61 6d 70 6c 65 5b 69 5d 2e 6e 2c 20 61 53 61  Sample[i].n, aSa
13210 6d 70 6c 65 5b 69 5d 2e 70 2c 20 70 52 65 63 29  mple[i].p, pRec)
13220 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20   .           || 
13230 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
13240 6f 63 46 61 69 6c 65 64 20 0a 20 20 20 20 20 20  ocFailed .      
13250 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
13260 20 20 20 20 2f 2a 20 55 6e 6c 65 73 73 20 69 3d      /* Unless i=
13270 3d 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 2c 20  =pIdx->nSample, 
13280 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74 20  indicating that 
13290 70 52 65 63 20 69 73 20 6c 61 72 67 65 72 20 74  pRec is larger t
132a0 68 61 6e 0a 20 20 20 20 20 20 2a 2a 20 61 6c 6c  han.      ** all
132b0 20 73 61 6d 70 6c 65 73 20 69 6e 20 74 68 65 20   samples in the 
132c0 61 53 61 6d 70 6c 65 5b 5d 20 61 72 72 61 79 2c  aSample[] array,
132d0 20 70 52 65 63 20 6d 75 73 74 20 62 65 20 73 6d   pRec must be sm
132e0 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 0a 20  aller than the. 
132f0 20 20 20 20 20 2a 2a 20 28 69 43 6f 6c 2b 31 29       ** (iCol+1)
13300 20 66 69 65 6c 64 20 70 72 65 66 69 78 20 6f 66   field prefix of
13310 20 73 61 6d 70 6c 65 20 69 2e 20 20 2a 2f 0a 20   sample i.  */. 
13320 20 20 20 20 20 61 73 73 65 72 74 28 20 69 3c 3d       assert( i<=
13330 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 26 26  pIdx->nSample &&
13340 20 69 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 70   i>=0 );.      p
13350 52 65 63 2d 3e 6e 46 69 65 6c 64 20 3d 20 69 43  Rec->nField = iC
13360 6f 6c 2b 31 3b 0a 20 20 20 20 20 20 61 73 73 65  ol+1;.      asse
13370 72 74 28 20 69 3d 3d 70 49 64 78 2d 3e 6e 53 61  rt( i==pIdx->nSa
13380 6d 70 6c 65 20 0a 20 20 20 20 20 20 20 20 20 20  mple .          
13390 20 7c 7c 20 73 71 6c 69 74 65 33 56 64 62 65 52   || sqlite3VdbeR
133a0 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 61 53 61  ecordCompare(aSa
133b0 6d 70 6c 65 5b 69 5d 2e 6e 2c 20 61 53 61 6d 70  mple[i].n, aSamp
133c0 6c 65 5b 69 5d 2e 70 2c 20 70 52 65 63 29 3e 30  le[i].p, pRec)>0
133d0 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70  .           || p
133e0 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
133f0 63 46 61 69 6c 65 64 20 29 3b 0a 0a 20 20 20 20  cFailed );..    
13400 20 20 2f 2a 20 69 66 20 69 3d 3d 30 20 61 6e 64    /* if i==0 and
13410 20 69 43 6f 6c 3d 3d 30 2c 20 74 68 65 6e 20 72   iCol==0, then r
13420 65 63 6f 72 64 20 70 52 65 63 20 69 73 20 73 6d  ecord pRec is sm
13430 61 6c 6c 65 72 20 74 68 61 6e 20 61 6c 6c 20 73  aller than all s
13440 61 6d 70 6c 65 73 0a 20 20 20 20 20 20 2a 2a 20  amples.      ** 
13450 69 6e 20 74 68 65 20 61 53 61 6d 70 6c 65 5b 5d  in the aSample[]
13460 20 61 72 72 61 79 2e 20 4f 74 68 65 72 77 69 73   array. Otherwis
13470 65 2c 20 69 66 20 28 69 43 6f 6c 3e 30 29 20 74  e, if (iCol>0) t
13480 68 65 6e 20 70 52 65 63 20 6d 75 73 74 0a 20 20  hen pRec must.  
13490 20 20 20 20 2a 2a 20 62 65 20 67 72 65 61 74 65      ** be greate
134a0 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  r than or equal 
134b0 74 6f 20 74 68 65 20 28 69 43 6f 6c 29 20 66 69  to the (iCol) fi
134c0 65 6c 64 20 70 72 65 66 69 78 20 6f 66 20 73 61  eld prefix of sa
134d0 6d 70 6c 65 20 69 2e 0a 20 20 20 20 20 20 2a 2a  mple i..      **
134e0 20 49 66 20 28 69 3e 30 29 2c 20 74 68 65 6e 20   If (i>0), then 
134f0 70 52 65 63 20 6d 75 73 74 20 61 6c 73 6f 20 62  pRec must also b
13500 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 73  e greater than s
13510 61 6d 70 6c 65 20 28 69 2d 31 29 2e 20 20 2a 2f  ample (i-1).  */
13520 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3e  .      if( iCol>
13530 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 52 65  0 ){.        pRe
13540 63 2d 3e 6e 46 69 65 6c 64 20 3d 20 69 43 6f 6c  c->nField = iCol
13550 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
13560 28 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  ( sqlite3VdbeRec
13570 6f 72 64 43 6f 6d 70 61 72 65 28 61 53 61 6d 70  ordCompare(aSamp
13580 6c 65 5b 69 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65  le[i].n, aSample
13590 5b 69 5d 2e 70 2c 20 70 52 65 63 29 3c 3d 30 0a  [i].p, pRec)<=0.
135a0 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
135b0 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
135c0 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
135d0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 3e    }.      if( i>
135e0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 52 65  0 ){.        pRe
135f0 63 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 46 69 65  c->nField = nFie
13600 6c 64 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ld;.        asse
13610 72 74 28 20 73 71 6c 69 74 65 33 56 64 62 65 52  rt( sqlite3VdbeR
13620 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 61 53 61  ecordCompare(aSa
13630 6d 70 6c 65 5b 69 2d 31 5d 2e 6e 2c 20 61 53 61  mple[i-1].n, aSa
13640 6d 70 6c 65 5b 69 2d 31 5d 2e 70 2c 20 70 52 65  mple[i-1].p, pRe
13650 63 29 3c 30 0a 20 20 20 20 20 20 20 20 20 20 20  c)<0.           
13660 20 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d    || pParse->db-
13670 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
13680 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
13690 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 69 66 64   }.#endif /* ifd
136a0 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  ef SQLITE_DEBUG 
136b0 2a 2f 0a 0a 20 20 69 66 28 20 72 65 73 3d 3d 30  */..  if( res==0
136c0 20 29 7b 0a 20 20 20 20 2f 2a 20 52 65 63 6f 72   ){.    /* Recor
136d0 64 20 70 52 65 63 20 69 73 20 65 71 75 61 6c 20  d pRec is equal 
136e0 74 6f 20 73 61 6d 70 6c 65 20 69 20 2a 2f 0a 20  to sample i */. 
136f0 20 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3d     assert( iCol=
13700 3d 6e 46 69 65 6c 64 2d 31 20 29 3b 0a 20 20 20  =nField-1 );.   
13710 20 61 53 74 61 74 5b 30 5d 20 3d 20 61 53 61 6d   aStat[0] = aSam
13720 70 6c 65 5b 69 5d 2e 61 6e 4c 74 5b 69 43 6f 6c  ple[i].anLt[iCol
13730 5d 3b 0a 20 20 20 20 61 53 74 61 74 5b 31 5d 20  ];.    aStat[1] 
13740 3d 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 61 6e 45  = aSample[i].anE
13750 71 5b 69 43 6f 6c 5d 3b 0a 20 20 7d 65 6c 73 65  q[iCol];.  }else
13760 7b 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73  {.    /* At this
13770 20 70 6f 69 6e 74 2c 20 74 68 65 20 28 69 43 6f   point, the (iCo
13780 6c 2b 31 29 20 66 69 65 6c 64 20 70 72 65 66 69  l+1) field prefi
13790 78 20 6f 66 20 61 53 61 6d 70 6c 65 5b 69 5d 20  x of aSample[i] 
137a0 69 73 20 74 68 65 20 66 69 72 73 74 20 0a 20 20  is the first .  
137b0 20 20 2a 2a 20 73 61 6d 70 6c 65 20 74 68 61 74    ** sample that
137c0 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
137d0 20 70 52 65 63 2e 20 4f 72 2c 20 69 66 20 69 3d   pRec. Or, if i=
137e0 3d 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 74  =pIdx->nSample t
137f0 68 65 6e 20 70 52 65 63 0a 20 20 20 20 2a 2a 20  hen pRec.    ** 
13800 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 61  is larger than a
13810 6c 6c 20 73 61 6d 70 6c 65 73 20 69 6e 20 74 68  ll samples in th
13820 65 20 61 72 72 61 79 2e 20 2a 2f 0a 20 20 20 20  e array. */.    
13830 74 52 6f 77 63 6e 74 20 69 55 70 70 65 72 2c 20  tRowcnt iUpper, 
13840 69 47 61 70 3b 0a 20 20 20 20 69 66 28 20 69 3e  iGap;.    if( i>
13850 3d 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 29  =pIdx->nSample )
13860 7b 0a 20 20 20 20 20 20 69 55 70 70 65 72 20 3d  {.      iUpper =
13870 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 54 6f   sqlite3LogEstTo
13880 49 6e 74 28 70 49 64 78 2d 3e 61 69 52 6f 77 4c  Int(pIdx->aiRowL
13890 6f 67 45 73 74 5b 30 5d 29 3b 0a 20 20 20 20 7d  ogEst[0]);.    }
138a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 55 70 70  else{.      iUpp
138b0 65 72 20 3d 20 61 53 61 6d 70 6c 65 5b 69 5d 2e  er = aSample[i].
138c0 61 6e 4c 74 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20  anLt[iCol];.    
138d0 7d 0a 0a 20 20 20 20 69 66 28 20 69 4c 6f 77 65  }..    if( iLowe
138e0 72 3e 3d 69 55 70 70 65 72 20 29 7b 0a 20 20 20  r>=iUpper ){.   
138f0 20 20 20 69 47 61 70 20 3d 20 30 3b 0a 20 20 20     iGap = 0;.   
13900 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 47   }else{.      iG
13910 61 70 20 3d 20 69 55 70 70 65 72 20 2d 20 69 4c  ap = iUpper - iL
13920 6f 77 65 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ower;.    }.    
13930 69 66 28 20 72 6f 75 6e 64 55 70 20 29 7b 0a 20  if( roundUp ){. 
13940 20 20 20 20 20 69 47 61 70 20 3d 20 28 69 47 61       iGap = (iGa
13950 70 2a 32 29 2f 33 3b 0a 20 20 20 20 7d 65 6c 73  p*2)/3;.    }els
13960 65 7b 0a 20 20 20 20 20 20 69 47 61 70 20 3d 20  e{.      iGap = 
13970 69 47 61 70 2f 33 3b 0a 20 20 20 20 7d 0a 20 20  iGap/3;.    }.  
13980 20 20 61 53 74 61 74 5b 30 5d 20 3d 20 69 4c 6f    aStat[0] = iLo
13990 77 65 72 20 2b 20 69 47 61 70 3b 0a 20 20 20 20  wer + iGap;.    
139a0 61 53 74 61 74 5b 31 5d 20 3d 20 70 49 64 78 2d  aStat[1] = pIdx-
139b0 3e 61 41 76 67 45 71 5b 69 43 6f 6c 5d 3b 0a 20  >aAvgEq[iCol];. 
139c0 20 7d 0a 0a 20 20 2f 2a 20 52 65 73 74 6f 72 65   }..  /* Restore
139d0 20 74 68 65 20 70 52 65 63 2d 3e 6e 46 69 65 6c   the pRec->nFiel
139e0 64 20 76 61 6c 75 65 20 62 65 66 6f 72 65 20 72  d value before r
139f0 65 74 75 72 6e 69 6e 67 2e 20 20 2a 2f 0a 20 20  eturning.  */.  
13a00 70 52 65 63 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e  pRec->nField = n
13a10 46 69 65 6c 64 3b 0a 20 20 72 65 74 75 72 6e 20  Field;.  return 
13a20 69 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  i;.}.#endif /* S
13a30 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
13a40 54 33 5f 4f 52 5f 53 54 41 54 34 20 2a 2f 0a 0a  T3_OR_STAT4 */..
13a50 2f 2a 0a 2a 2a 20 49 66 20 69 74 20 69 73 20 6e  /*.** If it is n
13a60 6f 74 20 4e 55 4c 4c 2c 20 70 54 65 72 6d 20 69  ot NULL, pTerm i
13a70 73 20 61 20 74 65 72 6d 20 74 68 61 74 20 70 72  s a term that pr
13a80 6f 76 69 64 65 73 20 61 6e 20 75 70 70 65 72 20  ovides an upper 
13a90 6f 72 20 6c 6f 77 65 72 0a 2a 2a 20 62 6f 75 6e  or lower.** boun
13aa0 64 20 6f 6e 20 61 20 72 61 6e 67 65 20 73 63 61  d on a range sca
13ab0 6e 2e 20 57 69 74 68 6f 75 74 20 63 6f 6e 73 69  n. Without consi
13ac0 64 65 72 69 6e 67 20 70 54 65 72 6d 2c 20 69 74  dering pTerm, it
13ad0 20 69 73 20 65 73 74 69 6d 61 74 65 64 20 0a 2a   is estimated .*
13ae0 2a 20 74 68 61 74 20 74 68 65 20 73 63 61 6e 20  * that the scan 
13af0 77 69 6c 6c 20 76 69 73 69 74 20 6e 4e 65 77 20  will visit nNew 
13b00 72 6f 77 73 2e 20 54 68 69 73 20 66 75 6e 63 74  rows. This funct
13b10 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20  ion returns the 
13b20 6e 75 6d 62 65 72 0a 2a 2a 20 65 73 74 69 6d 61  number.** estima
13b30 74 65 64 20 74 6f 20 62 65 20 76 69 73 69 74 65  ted to be visite
13b40 64 20 61 66 74 65 72 20 74 61 6b 69 6e 67 20 70  d after taking p
13b50 54 65 72 6d 20 69 6e 74 6f 20 61 63 63 6f 75 6e  Term into accoun
13b60 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  t..**.** If the 
13b70 75 73 65 72 20 65 78 70 6c 69 63 69 74 6c 79 20  user explicitly 
13b80 73 70 65 63 69 66 69 65 64 20 61 20 6c 69 6b 65  specified a like
13b90 6c 69 68 6f 6f 64 28 29 20 76 61 6c 75 65 20 66  lihood() value f
13ba0 6f 72 20 74 68 69 73 20 74 65 72 6d 2c 0a 2a 2a  or this term,.**
13bb0 20 74 68 65 6e 20 74 68 65 20 72 65 74 75 72 6e   then the return
13bc0 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 6c 69   value is the li
13bd0 6b 65 6c 69 68 6f 6f 64 20 6d 75 6c 74 69 70 6c  kelihood multipl
13be0 69 65 64 20 62 79 20 74 68 65 20 6e 75 6d 62 65  ied by the numbe
13bf0 72 20 6f 66 0a 2a 2a 20 69 6e 70 75 74 20 72 6f  r of.** input ro
13c00 77 73 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74  ws. Otherwise, t
13c10 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 73 73  his function ass
13c20 75 6d 65 73 20 74 68 61 74 20 61 6e 20 22 49 53  umes that an "IS
13c30 20 4e 4f 54 20 4e 55 4c 4c 22 20 74 65 72 6d 0a   NOT NULL" term.
13c40 2a 2a 20 68 61 73 20 61 20 6c 69 6b 65 6c 69 68  ** has a likelih
13c50 6f 6f 64 20 6f 66 20 30 2e 35 30 2c 20 61 6e 64  ood of 0.50, and
13c60 20 61 6e 79 20 6f 74 68 65 72 20 74 65 72 6d 20   any other term 
13c70 61 20 6c 69 6b 65 6c 69 68 6f 6f 64 20 6f 66 20  a likelihood of 
13c80 30 2e 32 35 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  0.25..*/.static 
13c90 4c 6f 67 45 73 74 20 77 68 65 72 65 52 61 6e 67  LogEst whereRang
13ca0 65 41 64 6a 75 73 74 28 57 68 65 72 65 54 65 72  eAdjust(WhereTer
13cb0 6d 20 2a 70 54 65 72 6d 2c 20 4c 6f 67 45 73 74  m *pTerm, LogEst
13cc0 20 6e 4e 65 77 29 7b 0a 20 20 4c 6f 67 45 73 74   nNew){.  LogEst
13cd0 20 6e 52 65 74 20 3d 20 6e 4e 65 77 3b 0a 20 20   nRet = nNew;.  
13ce0 69 66 28 20 70 54 65 72 6d 20 29 7b 0a 20 20 20  if( pTerm ){.   
13cf0 20 69 66 28 20 70 54 65 72 6d 2d 3e 74 72 75 74   if( pTerm->trut
13d00 68 50 72 6f 62 3c 3d 30 20 29 7b 0a 20 20 20 20  hProb<=0 ){.    
13d10 20 20 6e 52 65 74 20 2b 3d 20 70 54 65 72 6d 2d    nRet += pTerm-
13d20 3e 74 72 75 74 68 50 72 6f 62 3b 0a 20 20 20 20  >truthProb;.    
13d30 7d 65 6c 73 65 20 69 66 28 20 28 70 54 65 72 6d  }else if( (pTerm
13d40 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
13d50 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29 7b 0a 20 20  _VNULL)==0 ){.  
13d60 20 20 20 20 6e 52 65 74 20 2d 3d 20 32 30 3b 20      nRet -= 20; 
13d70 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 32         assert( 2
13d80 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  0==sqlite3LogEst
13d90 28 34 29 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  (4) );.    }.  }
13da0 0a 20 20 72 65 74 75 72 6e 20 6e 52 65 74 3b 0a  .  return nRet;.
13db0 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
13dc0 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52  _ENABLE_STAT3_OR
13dd0 5f 53 54 41 54 34 0a 2f 2a 20 0a 2a 2a 20 54 68  _STAT4./* .** Th
13de0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
13df0 61 6c 6c 65 64 20 74 6f 20 65 73 74 69 6d 61 74  alled to estimat
13e00 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
13e10 72 6f 77 73 20 76 69 73 69 74 65 64 20 62 79 20  rows visited by 
13e20 61 0a 2a 2a 20 72 61 6e 67 65 2d 73 63 61 6e 20  a.** range-scan 
13e30 6f 6e 20 61 20 73 6b 69 70 2d 73 63 61 6e 20 69  on a skip-scan i
13e40 6e 64 65 78 2e 20 46 6f 72 20 65 78 61 6d 70 6c  ndex. For exampl
13e50 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 43 52 45 41 54  e:.**.**   CREAT
13e60 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31  E INDEX i1 ON t1
13e70 28 61 2c 20 62 2c 20 63 29 3b 0a 2a 2a 20 20 20  (a, b, c);.**   
13e80 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
13e90 20 57 48 45 52 45 20 61 3d 3f 20 41 4e 44 20 63   WHERE a=? AND c
13ea0 20 42 45 54 57 45 45 4e 20 3f 20 41 4e 44 20 3f   BETWEEN ? AND ?
13eb0 3b 0a 2a 2a 0a 2a 2a 20 56 61 6c 75 65 20 70 4c  ;.**.** Value pL
13ec0 6f 6f 70 2d 3e 6e 4f 75 74 20 69 73 20 63 75 72  oop->nOut is cur
13ed0 72 65 6e 74 6c 79 20 73 65 74 20 74 6f 20 74 68  rently set to th
13ee0 65 20 65 73 74 69 6d 61 74 65 64 20 6e 75 6d 62  e estimated numb
13ef0 65 72 20 6f 66 20 72 6f 77 73 20 0a 2a 2a 20 76  er of rows .** v
13f00 69 73 69 74 65 64 20 66 6f 72 20 73 63 61 6e 6e  isited for scann
13f10 69 6e 67 20 28 61 3d 3f 20 41 4e 44 20 62 3d 3f  ing (a=? AND b=?
13f20 29 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ). This function
13f30 20 72 65 64 75 63 65 73 20 74 68 61 74 20 65 73   reduces that es
13f40 74 69 6d 61 74 65 20 0a 2a 2a 20 62 79 20 73 6f  timate .** by so
13f50 6d 65 20 66 61 63 74 6f 72 20 74 6f 20 61 63 63  me factor to acc
13f60 6f 75 6e 74 20 66 6f 72 20 74 68 65 20 28 63 20  ount for the (c 
13f70 42 45 54 57 45 45 4e 20 3f 20 41 4e 44 20 3f 29  BETWEEN ? AND ?)
13f80 20 65 78 70 72 65 73 73 69 6f 6e 20 62 61 73 65   expression base
13f90 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 74 61 74  d.** on the stat
13fa0 34 20 64 61 74 61 20 66 6f 72 20 74 68 65 20 69  4 data for the i
13fb0 6e 64 65 78 2e 20 74 68 69 73 20 73 63 61 6e 20  ndex. this scan 
13fc0 77 69 6c 6c 20 62 65 20 70 65 66 6f 72 6d 65 64  will be peformed
13fd0 20 6d 75 6c 74 69 70 6c 65 20 0a 2a 2a 20 74 69   multiple .** ti
13fe0 6d 65 73 20 28 6f 6e 63 65 20 66 6f 72 20 65 61  mes (once for ea
13ff0 63 68 20 28 61 2c 62 29 20 63 6f 6d 62 69 6e 61  ch (a,b) combina
14000 74 69 6f 6e 20 74 68 61 74 20 6d 61 74 63 68 65  tion that matche
14010 73 20 61 3d 3f 29 20 69 73 20 64 65 61 6c 74 20  s a=?) is dealt 
14020 77 69 74 68 20 0a 2a 2a 20 62 79 20 74 68 65 20  with .** by the 
14030 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 74  caller..**.** It
14040 20 64 6f 65 73 20 74 68 69 73 20 62 79 20 73 63   does this by sc
14050 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67 68 20 61  anning through a
14060 6c 6c 20 73 74 61 74 34 20 73 61 6d 70 6c 65 73  ll stat4 samples
14070 2c 20 63 6f 6d 70 61 72 69 6e 67 20 76 61 6c 75  , comparing valu
14080 65 73 0a 2a 2a 20 65 78 74 72 61 63 74 65 64 20  es.** extracted 
14090 66 72 6f 6d 20 70 4c 6f 77 65 72 20 61 6e 64 20  from pLower and 
140a0 70 55 70 70 65 72 20 77 69 74 68 20 74 68 65 20  pUpper with the 
140b0 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 63 6f  corresponding co
140c0 6c 75 6d 6e 20 69 6e 20 65 61 63 68 0a 2a 2a 20  lumn in each.** 
140d0 73 61 6d 70 6c 65 2e 20 49 66 20 4c 20 61 6e 64  sample. If L and
140e0 20 55 20 61 72 65 20 74 68 65 20 6e 75 6d 62 65   U are the numbe
140f0 72 20 6f 66 20 73 61 6d 70 6c 65 73 20 66 6f 75  r of samples fou
14100 6e 64 20 74 6f 20 62 65 20 6c 65 73 73 20 74 68  nd to be less th
14110 61 6e 20 6f 72 0a 2a 2a 20 65 71 75 61 6c 20 74  an or.** equal t
14120 6f 20 74 68 65 20 76 61 6c 75 65 73 20 65 78 74  o the values ext
14130 72 61 63 74 65 64 20 66 72 6f 6d 20 70 4c 6f 77  racted from pLow
14140 65 72 20 61 6e 64 20 70 55 70 70 65 72 20 72 65  er and pUpper re
14150 73 70 65 63 74 69 76 65 6c 79 2c 20 61 6e 64 0a  spectively, and.
14160 2a 2a 20 4e 20 69 73 20 74 68 65 20 74 6f 74 61  ** N is the tota
14170 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73 61 6d 70  l number of samp
14180 6c 65 73 2c 20 74 68 65 20 70 4c 6f 6f 70 2d 3e  les, the pLoop->
14190 6e 4f 75 74 20 76 61 6c 75 65 20 69 73 20 61 64  nOut value is ad
141a0 6a 75 73 74 65 64 0a 2a 2a 20 61 73 20 66 6f 6c  justed.** as fol
141b0 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 6e 4f  lows:.**.**   nO
141c0 75 74 20 3d 20 6e 4f 75 74 20 2a 20 28 20 6d 69  ut = nOut * ( mi
141d0 6e 28 55 20 2d 20 4c 2c 20 31 29 20 2f 20 4e 20  n(U - L, 1) / N 
141e0 29 0a 2a 2a 0a 2a 2a 20 49 66 20 70 4c 6f 77 65  ).**.** If pLowe
141f0 72 20 69 73 20 4e 55 4c 4c 2c 20 6f 72 20 61 20  r is NULL, or a 
14200 76 61 6c 75 65 20 63 61 6e 6e 6f 74 20 62 65 20  value cannot be 
14210 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74  extracted from t
14220 68 65 20 74 65 72 6d 2c 20 4c 20 69 73 0a 2a 2a  he term, L is.**
14230 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 49 66   set to zero. If
14240 20 70 55 70 70 65 72 20 69 73 20 4e 55 4c 4c 2c   pUpper is NULL,
14250 20 6f 72 20 61 20 76 61 6c 75 65 20 63 61 6e 6e   or a value cann
14260 6f 74 20 62 65 20 65 78 74 72 61 63 74 65 64 20  ot be extracted 
14270 66 72 6f 6d 20 69 74 2c 0a 2a 2a 20 55 20 69 73  from it,.** U is
14280 20 73 65 74 20 74 6f 20 4e 2e 0a 2a 2a 0a 2a 2a   set to N..**.**
14290 20 4e 6f 72 6d 61 6c 6c 79 2c 20 74 68 69 73 20   Normally, this 
142a0 66 75 6e 63 74 69 6f 6e 20 73 65 74 73 20 2a 70  function sets *p
142b0 62 44 6f 6e 65 20 74 6f 20 31 20 62 65 66 6f 72  bDone to 1 befor
142c0 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 48 6f 77  e returning. How
142d0 65 76 65 72 2c 0a 2a 2a 20 69 66 20 6e 6f 20 76  ever,.** if no v
142e0 61 6c 75 65 20 63 61 6e 20 62 65 20 65 78 74 72  alue can be extr
142f0 61 63 74 65 64 20 66 72 6f 6d 20 65 69 74 68 65  acted from eithe
14300 72 20 70 4c 6f 77 65 72 20 6f 72 20 70 55 70 70  r pLower or pUpp
14310 65 72 20 28 61 6e 64 20 73 6f 20 74 68 65 0a 2a  er (and so the.*
14320 2a 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68  * estimate of th
14330 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
14340 20 64 65 6c 69 76 65 72 65 64 20 72 65 6d 61 69   delivered remai
14350 6e 73 20 75 6e 63 68 61 6e 67 65 64 29 2c 20 2a  ns unchanged), *
14360 70 62 44 6f 6e 65 0a 2a 2a 20 69 73 20 6c 65 66  pbDone.** is lef
14370 74 20 61 73 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 49  t as is..**.** I
14380 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
14390 73 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  s, an SQLite err
143a0 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
143b0 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ned. Otherwise, 
143c0 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  .** SQLITE_OK..*
143d0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  /.static int whe
143e0 72 65 52 61 6e 67 65 53 6b 69 70 53 63 61 6e 45  reRangeSkipScanE
143f0 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  st(.  Parse *pPa
14400 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61  rse,       /* Pa
14410 72 73 69 6e 67 20 26 20 63 6f 64 65 20 67 65 6e  rsing & code gen
14420 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20  erating context 
14430 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  */.  WhereTerm *
14440 70 4c 6f 77 65 72 2c 20 20 20 2f 2a 20 4c 6f 77  pLower,   /* Low
14450 65 72 20 62 6f 75 6e 64 20 6f 6e 20 74 68 65 20  er bound on the 
14460 72 61 6e 67 65 2e 20 65 78 3a 20 22 78 3e 31 32  range. ex: "x>12
14470 33 22 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c  3" Might be NULL
14480 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
14490 2a 70 55 70 70 65 72 2c 20 20 20 2f 2a 20 55 70  *pUpper,   /* Up
144a0 70 65 72 20 62 6f 75 6e 64 20 6f 6e 20 74 68 65  per bound on the
144b0 20 72 61 6e 67 65 2e 20 65 78 3a 20 22 78 3c 34   range. ex: "x<4
144c0 35 35 22 20 4d 69 67 68 74 20 62 65 20 4e 55 4c  55" Might be NUL
144d0 4c 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70  L */.  WhereLoop
144e0 20 2a 70 4c 6f 6f 70 2c 20 20 20 20 2f 2a 20 55   *pLoop,    /* U
144f0 70 64 61 74 65 20 74 68 65 20 2e 6e 4f 75 74 20  pdate the .nOut 
14500 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20 6c 6f  value of this lo
14510 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 62 44  op */.  int *pbD
14520 6f 6e 65 20 20 20 20 20 20 20 20 20 20 2f 2a 20  one          /* 
14530 53 65 74 20 74 6f 20 74 72 75 65 20 69 66 20 61  Set to true if a
14540 74 20 6c 65 61 73 74 20 6f 6e 65 20 65 78 70 72  t least one expr
14550 2e 20 76 61 6c 75 65 20 65 78 74 72 61 63 74 65  . value extracte
14560 64 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 20  d */.){.  Index 
14570 2a 70 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  *p = pLoop->u.bt
14580 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 69 6e  ree.pIndex;.  in
14590 74 20 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e 75  t nEq = pLoop->u
145a0 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20 73 71  .btree.nEq;.  sq
145b0 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
145c0 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 6e 4c  se->db;.  int nL
145d0 6f 77 65 72 20 3d 20 2d 31 3b 0a 20 20 69 6e 74  ower = -1;.  int
145e0 20 6e 55 70 70 65 72 20 3d 20 70 2d 3e 6e 53 61   nUpper = p->nSa
145f0 6d 70 6c 65 2b 31 3b 0a 20 20 69 6e 74 20 72 63  mple+1;.  int rc
14600 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
14610 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 61 69  int iCol = p->ai
14620 43 6f 6c 75 6d 6e 5b 6e 45 71 5d 3b 0a 20 20 75  Column[nEq];.  u
14630 38 20 61 66 66 20 3d 20 69 43 6f 6c 3e 3d 30 20  8 aff = iCol>=0 
14640 3f 20 70 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f  ? p->pTable->aCo
14650 6c 5b 69 43 6f 6c 5d 2e 61 66 66 69 6e 69 74 79  l[iCol].affinity
14660 20 3a 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e   : SQLITE_AFF_IN
14670 54 45 47 45 52 3b 0a 20 20 43 6f 6c 6c 53 65 71  TEGER;.  CollSeq
14680 20 2a 70 43 6f 6c 6c 3b 0a 20 20 0a 20 20 73 71   *pColl;.  .  sq
14690 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 31 20  lite3_value *p1 
146a0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  = 0;          /*
146b0 20 56 61 6c 75 65 20 65 78 74 72 61 63 74 65 64   Value extracted
146c0 20 66 72 6f 6d 20 70 4c 6f 77 65 72 20 2a 2f 0a   from pLower */.
146d0 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
146e0 2a 70 32 20 3d 20 30 3b 20 20 20 20 20 20 20 20  *p2 = 0;        
146f0 20 20 2f 2a 20 56 61 6c 75 65 20 65 78 74 72 61    /* Value extra
14700 63 74 65 64 20 66 72 6f 6d 20 70 55 70 70 65 72  cted from pUpper
14710 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61   */.  sqlite3_va
14720 6c 75 65 20 2a 70 56 61 6c 20 3d 20 30 3b 20 20  lue *pVal = 0;  
14730 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 65        /* Value e
14740 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 72 65  xtracted from re
14750 63 6f 72 64 20 2a 2f 0a 0a 20 20 70 43 6f 6c 6c  cord */..  pColl
14760 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65   = sqlite3Locate
14770 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
14780 70 2d 3e 61 7a 43 6f 6c 6c 5b 6e 45 71 5d 29 3b  p->azColl[nEq]);
14790 0a 20 20 69 66 28 20 70 4c 6f 77 65 72 20 29 7b  .  if( pLower ){
147a0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
147b0 33 53 74 61 74 34 56 61 6c 75 65 46 72 6f 6d 45  3Stat4ValueFromE
147c0 78 70 72 28 70 50 61 72 73 65 2c 20 70 4c 6f 77  xpr(pParse, pLow
147d0 65 72 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68  er->pExpr->pRigh
147e0 74 2c 20 61 66 66 2c 20 26 70 31 29 3b 0a 20 20  t, aff, &p1);.  
147f0 20 20 6e 4c 6f 77 65 72 20 3d 20 30 3b 0a 20 20    nLower = 0;.  
14800 7d 0a 20 20 69 66 28 20 70 55 70 70 65 72 20 26  }.  if( pUpper &
14810 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
14820 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
14830 74 65 33 53 74 61 74 34 56 61 6c 75 65 46 72 6f  te3Stat4ValueFro
14840 6d 45 78 70 72 28 70 50 61 72 73 65 2c 20 70 55  mExpr(pParse, pU
14850 70 70 65 72 2d 3e 70 45 78 70 72 2d 3e 70 52 69  pper->pExpr->pRi
14860 67 68 74 2c 20 61 66 66 2c 20 26 70 32 29 3b 0a  ght, aff, &p2);.
14870 20 20 20 20 6e 55 70 70 65 72 20 3d 20 70 32 20      nUpper = p2 
14880 3f 20 30 20 3a 20 70 2d 3e 6e 53 61 6d 70 6c 65  ? 0 : p->nSample
14890 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 31 20  ;.  }..  if( p1 
148a0 7c 7c 20 70 32 20 29 7b 0a 20 20 20 20 69 6e 74  || p2 ){.    int
148b0 20 69 3b 0a 20 20 20 20 69 6e 74 20 6e 44 69 66   i;.    int nDif
148c0 66 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  f;.    for(i=0; 
148d0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
148e0 20 69 3c 70 2d 3e 6e 53 61 6d 70 6c 65 3b 20 69   i<p->nSample; i
148f0 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ++){.      rc = 
14900 73 71 6c 69 74 65 33 53 74 61 74 34 43 6f 6c 75  sqlite3Stat4Colu
14910 6d 6e 28 64 62 2c 20 70 2d 3e 61 53 61 6d 70 6c  mn(db, p->aSampl
14920 65 5b 69 5d 2e 70 2c 20 70 2d 3e 61 53 61 6d 70  e[i].p, p->aSamp
14930 6c 65 5b 69 5d 2e 6e 2c 20 6e 45 71 2c 20 26 70  le[i].n, nEq, &p
14940 56 61 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Val);.      if( 
14950 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
14960 20 70 31 20 29 7b 0a 20 20 20 20 20 20 20 20 69   p1 ){.        i
14970 6e 74 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33  nt res = sqlite3
14980 4d 65 6d 43 6f 6d 70 61 72 65 28 70 31 2c 20 70  MemCompare(p1, p
14990 56 61 6c 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20 20  Val, pColl);.   
149a0 20 20 20 20 20 69 66 28 20 72 65 73 3e 3d 30 20       if( res>=0 
149b0 29 20 6e 4c 6f 77 65 72 2b 2b 3b 0a 20 20 20 20  ) nLower++;.    
149c0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
149d0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
149e0 32 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  2 ){.        int
149f0 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33 4d 65   res = sqlite3Me
14a00 6d 43 6f 6d 70 61 72 65 28 70 32 2c 20 70 56 61  mCompare(p2, pVa
14a10 6c 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20 20 20 20  l, pColl);.     
14a20 20 20 20 69 66 28 20 72 65 73 3e 3d 30 20 29 20     if( res>=0 ) 
14a30 6e 55 70 70 65 72 2b 2b 3b 0a 20 20 20 20 20 20  nUpper++;.      
14a40 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6e 44 69 66  }.    }.    nDif
14a50 66 20 3d 20 28 6e 55 70 70 65 72 20 2d 20 6e 4c  f = (nUpper - nL
14a60 6f 77 65 72 29 3b 0a 20 20 20 20 69 66 28 20 6e  ower);.    if( n
14a70 44 69 66 66 3c 3d 30 20 29 20 6e 44 69 66 66 20  Diff<=0 ) nDiff 
14a80 3d 20 31 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  = 1;..    /* If 
14a90 74 68 65 72 65 20 69 73 20 62 6f 74 68 20 61 6e  there is both an
14aa0 20 75 70 70 65 72 20 61 6e 64 20 6c 6f 77 65 72   upper and lower
14ab0 20 62 6f 75 6e 64 20 73 70 65 63 69 66 69 65 64   bound specified
14ac0 2c 20 61 6e 64 20 74 68 65 20 0a 20 20 20 20 2a  , and the .    *
14ad0 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 73 20 69 6e  * comparisons in
14ae0 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65 79  dicate that they
14af0 20 61 72 65 20 63 6c 6f 73 65 20 74 6f 67 65 74   are close toget
14b00 68 65 72 2c 20 75 73 65 20 74 68 65 20 66 61 6c  her, use the fal
14b10 6c 62 61 63 6b 0a 20 20 20 20 2a 2a 20 6d 65 74  lback.    ** met
14b20 68 6f 64 20 28 61 73 73 75 6d 65 20 74 68 61 74  hod (assume that
14b30 20 74 68 65 20 73 63 61 6e 20 76 69 73 69 74 73   the scan visits
14b40 20 31 2f 36 34 20 6f 66 20 74 68 65 20 72 6f 77   1/64 of the row
14b50 73 29 20 66 6f 72 20 65 73 74 69 6d 61 74 69 6e  s) for estimatin
14b60 67 0a 20 20 20 20 2a 2a 20 74 68 65 20 6e 75 6d  g.    ** the num
14b70 62 65 72 20 6f 66 20 72 6f 77 73 20 76 69 73 69  ber of rows visi
14b80 74 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ted. Otherwise, 
14b90 65 73 74 69 6d 61 74 65 20 74 68 65 20 6e 75 6d  estimate the num
14ba0 62 65 72 20 6f 66 20 72 6f 77 73 0a 20 20 20 20  ber of rows.    
14bb0 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 6d 65 74  ** using the met
14bc0 68 6f 64 20 64 65 73 63 72 69 62 65 64 20 69 6e  hod described in
14bd0 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d   the header comm
14be0 65 6e 74 20 66 6f 72 20 74 68 69 73 20 66 75 6e  ent for this fun
14bf0 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69 66  ction. */.    if
14c00 28 20 6e 44 69 66 66 21 3d 31 20 7c 7c 20 70 55  ( nDiff!=1 || pU
14c10 70 70 65 72 3d 3d 30 20 7c 7c 20 70 4c 6f 77 65  pper==0 || pLowe
14c20 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  r==0 ){.      in
14c30 74 20 6e 41 64 6a 75 73 74 20 3d 20 28 73 71 6c  t nAdjust = (sql
14c40 69 74 65 33 4c 6f 67 45 73 74 28 70 2d 3e 6e 53  ite3LogEst(p->nS
14c50 61 6d 70 6c 65 29 20 2d 20 73 71 6c 69 74 65 33  ample) - sqlite3
14c60 4c 6f 67 45 73 74 28 6e 44 69 66 66 29 29 3b 0a  LogEst(nDiff));.
14c70 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75        pLoop->nOu
14c80 74 20 2d 3d 20 6e 41 64 6a 75 73 74 3b 0a 20 20  t -= nAdjust;.  
14c90 20 20 20 20 2a 70 62 44 6f 6e 65 20 3d 20 31 3b      *pbDone = 1;
14ca0 0a 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43  .      WHERETRAC
14cb0 45 28 30 78 31 30 2c 20 28 22 72 61 6e 67 65 20  E(0x10, ("range 
14cc0 73 6b 69 70 2d 73 63 61 6e 20 72 65 67 69 6f 6e  skip-scan region
14cd0 73 3a 20 25 75 2e 2e 25 75 20 20 61 64 6a 75 73  s: %u..%u  adjus
14ce0 74 3d 25 64 20 65 73 74 3d 25 64 5c 6e 22 2c 0a  t=%d est=%d\n",.
14cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14d00 20 20 20 20 20 20 20 20 20 20 20 6e 4c 6f 77 65             nLowe
14d10 72 2c 20 6e 55 70 70 65 72 2c 20 6e 41 64 6a 75  r, nUpper, nAdju
14d20 73 74 2a 2d 31 2c 20 70 4c 6f 6f 70 2d 3e 6e 4f  st*-1, pLoop->nO
14d30 75 74 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d  ut));.    }..  }
14d40 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
14d50 28 20 2a 70 62 44 6f 6e 65 3d 3d 30 20 29 3b 0a  ( *pbDone==0 );.
14d60 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 56 61    }..  sqlite3Va
14d70 6c 75 65 46 72 65 65 28 70 31 29 3b 0a 20 20 73  lueFree(p1);.  s
14d80 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28  qlite3ValueFree(
14d90 70 32 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 61  p2);.  sqlite3Va
14da0 6c 75 65 46 72 65 65 28 70 56 61 6c 29 3b 0a 0a  lueFree(pVal);..
14db0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
14dc0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
14dd0 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f  ENABLE_STAT3_OR_
14de0 53 54 41 54 34 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  STAT4 */../*.** 
14df0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
14e00 20 75 73 65 64 20 74 6f 20 65 73 74 69 6d 61 74   used to estimat
14e10 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
14e20 72 6f 77 73 20 74 68 61 74 20 77 69 6c 6c 20 62  rows that will b
14e30 65 20 76 69 73 69 74 65 64 0a 2a 2a 20 62 79 20  e visited.** by 
14e40 73 63 61 6e 6e 69 6e 67 20 61 6e 20 69 6e 64 65  scanning an inde
14e50 78 20 66 6f 72 20 61 20 72 61 6e 67 65 20 6f 66  x for a range of
14e60 20 76 61 6c 75 65 73 2e 20 54 68 65 20 72 61 6e   values. The ran
14e70 67 65 20 6d 61 79 20 68 61 76 65 20 61 6e 20 75  ge may have an u
14e80 70 70 65 72 0a 2a 2a 20 62 6f 75 6e 64 2c 20 61  pper.** bound, a
14e90 20 6c 6f 77 65 72 20 62 6f 75 6e 64 2c 20 6f 72   lower bound, or
14ea0 20 62 6f 74 68 2e 20 54 68 65 20 57 48 45 52 45   both. The WHERE
14eb0 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 74 68   clause terms th
14ec0 61 74 20 73 65 74 20 74 68 65 20 75 70 70 65 72  at set the upper
14ed0 0a 2a 2a 20 61 6e 64 20 6c 6f 77 65 72 20 62 6f  .** and lower bo
14ee0 75 6e 64 73 20 61 72 65 20 72 65 70 72 65 73 65  unds are represe
14ef0 6e 74 65 64 20 62 79 20 70 4c 6f 77 65 72 20 61  nted by pLower a
14f00 6e 64 20 70 55 70 70 65 72 20 72 65 73 70 65 63  nd pUpper respec
14f10 74 69 76 65 6c 79 2e 20 46 6f 72 0a 2a 2a 20 65  tively. For.** e
14f20 78 61 6d 70 6c 65 2c 20 61 73 73 75 6d 69 6e 67  xample, assuming
14f30 20 74 68 61 74 20 69 6e 64 65 78 20 70 20 69 73   that index p is
14f40 20 6f 6e 20 74 31 28 61 29 3a 0a 2a 2a 0a 2a 2a   on t1(a):.**.**
14f50 20 20 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 57     ... FROM t1 W
14f60 48 45 52 45 20 61 20 3e 20 3f 20 41 4e 44 20 61  HERE a > ? AND a
14f70 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20   < ? ....**     
14f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
14f90 5f 5f 5f 5f 5f 7c 20 20 20 7c 5f 5f 5f 5f 5f 7c  _____|   |_____|
14fa0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
14fb0 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20            |     
14fc0 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20      |.**        
14fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 6f               pLo
14fe0 77 65 72 20 20 20 20 70 55 70 70 65 72 0a 2a 2a  wer    pUpper.**
14ff0 0a 2a 2a 20 49 66 20 65 69 74 68 65 72 20 6f 66  .** If either of
15000 20 74 68 65 20 75 70 70 65 72 20 6f 72 20 6c 6f   the upper or lo
15010 77 65 72 20 62 6f 75 6e 64 20 69 73 20 6e 6f 74  wer bound is not
15020 20 70 72 65 73 65 6e 74 2c 20 74 68 65 6e 20 4e   present, then N
15030 55 4c 4c 20 69 73 20 70 61 73 73 65 64 20 69 6e  ULL is passed in
15040 0a 2a 2a 20 70 6c 61 63 65 20 6f 66 20 74 68 65  .** place of the
15050 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 57   corresponding W
15060 68 65 72 65 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20  hereTerm..**.** 
15070 54 68 65 20 76 61 6c 75 65 20 69 6e 20 28 70 42  The value in (pB
15080 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e  uilder->pNew->u.
15090 62 74 72 65 65 2e 6e 45 71 29 20 69 73 20 74 68  btree.nEq) is th
150a0 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
150b0 69 6e 64 65 78 0a 2a 2a 20 63 6f 6c 75 6d 6e 20  index.** column 
150c0 73 75 62 6a 65 63 74 20 74 6f 20 74 68 65 20 72  subject to the r
150d0 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 2e  ange constraint.
150e0 20 4f 72 2c 20 65 71 75 69 76 61 6c 65 6e 74 6c   Or, equivalentl
150f0 79 2c 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  y, the number of
15100 0a 2a 2a 20 65 71 75 61 6c 69 74 79 20 63 6f 6e  .** equality con
15110 73 74 72 61 69 6e 74 73 20 6f 70 74 69 6d 69 7a  straints optimiz
15120 65 64 20 62 79 20 74 68 65 20 70 72 6f 70 6f 73  ed by the propos
15130 65 64 20 69 6e 64 65 78 20 73 63 61 6e 2e 20 46  ed index scan. F
15140 6f 72 20 65 78 61 6d 70 6c 65 2c 0a 2a 2a 20 61  or example,.** a
15150 73 73 75 6d 69 6e 67 20 69 6e 64 65 78 20 70 20  ssuming index p 
15160 69 73 20 6f 6e 20 74 31 28 61 2c 20 62 29 2c 20  is on t1(a, b), 
15170 61 6e 64 20 74 68 65 20 53 51 4c 20 71 75 65 72  and the SQL quer
15180 79 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e  y is:.**.**   ..
15190 2e 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  . FROM t1 WHERE 
151a0 61 20 3d 20 3f 20 41 4e 44 20 62 20 3e 20 3f 20  a = ? AND b > ? 
151b0 41 4e 44 20 62 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a  AND b < ? ....**
151c0 0a 2a 2a 20 74 68 65 6e 20 6e 45 71 20 69 73 20  .** then nEq is 
151d0 73 65 74 20 74 6f 20 31 20 28 61 73 20 74 68 65  set to 1 (as the
151e0 20 72 61 6e 67 65 20 72 65 73 74 72 69 63 74 65   range restricte
151f0 64 20 63 6f 6c 75 6d 6e 2c 20 62 2c 20 69 73 20  d column, b, is 
15200 74 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a 20 6c  the second .** l
15210 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20  eft-most column 
15220 6f 66 20 74 68 65 20 69 6e 64 65 78 29 2e 20 4f  of the index). O
15230 72 2c 20 69 66 20 74 68 65 20 71 75 65 72 79 20  r, if the query 
15240 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20  is:.**.**   ... 
15250 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 20  FROM t1 WHERE a 
15260 3e 20 3f 20 41 4e 44 20 61 20 3c 20 3f 20 2e 2e  > ? AND a < ? ..
15270 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 6e 45 71  ..**.** then nEq
15280 20 69 73 20 73 65 74 20 74 6f 20 30 2e 0a 2a 2a   is set to 0..**
15290 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 66 75  .** When this fu
152a0 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
152b0 2c 20 2a 70 6e 4f 75 74 20 69 73 20 73 65 74 20  , *pnOut is set 
152c0 74 6f 20 74 68 65 20 73 71 6c 69 74 65 33 4c 6f  to the sqlite3Lo
152d0 67 45 73 74 28 29 20 6f 66 20 74 68 65 0a 2a 2a  gEst() of the.**
152e0 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
152f0 74 68 61 74 20 74 68 65 20 69 6e 64 65 78 20 73  that the index s
15300 63 61 6e 20 69 73 20 65 78 70 65 63 74 65 64 20  can is expected 
15310 74 6f 20 76 69 73 69 74 20 77 69 74 68 6f 75 74  to visit without
15320 20 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 69 6e 67   .** considering
15330 20 74 68 65 20 72 61 6e 67 65 20 63 6f 6e 73 74   the range const
15340 72 61 69 6e 74 73 2e 20 49 66 20 6e 45 71 20 69  raints. If nEq i
15350 73 20 30 2c 20 74 68 65 6e 20 2a 70 6e 4f 75 74  s 0, then *pnOut
15360 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
15370 66 20 0a 2a 2a 20 72 6f 77 73 20 69 6e 20 74 68  f .** rows in th
15380 65 20 69 6e 64 65 78 2e 20 41 73 73 75 6d 69 6e  e index. Assumin
15390 67 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72  g no error occur
153a0 73 2c 20 2a 70 6e 4f 75 74 20 69 73 20 61 64 6a  s, *pnOut is adj
153b0 75 73 74 65 64 20 28 72 65 64 75 63 65 64 29 0a  usted (reduced).
153c0 2a 2a 20 74 6f 20 61 63 63 6f 75 6e 74 20 66 6f  ** to account fo
153d0 72 20 74 68 65 20 72 61 6e 67 65 20 63 6f 6e 73  r the range cons
153e0 74 72 61 69 6e 74 73 20 70 4c 6f 77 65 72 20 61  traints pLower a
153f0 6e 64 20 70 55 70 70 65 72 2e 0a 2a 2a 20 0a 2a  nd pUpper..** .*
15400 2a 20 49 6e 20 74 68 65 20 61 62 73 65 6e 63 65  * In the absence
15410 20 6f 66 20 73 71 6c 69 74 65 5f 73 74 61 74 34   of sqlite_stat4
15420 20 41 4e 41 4c 59 5a 45 20 64 61 74 61 2c 20 6f   ANALYZE data, o
15430 72 20 69 66 20 73 75 63 68 20 64 61 74 61 20 63  r if such data c
15440 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 75 73 65 64  annot be.** used
15450 2c 20 61 20 73 69 6e 67 6c 65 20 72 61 6e 67 65  , a single range
15460 20 69 6e 65 71 75 61 6c 69 74 79 20 72 65 64 75   inequality redu
15470 63 65 73 20 74 68 65 20 73 65 61 72 63 68 20 73  ces the search s
15480 70 61 63 65 20 62 79 20 61 20 66 61 63 74 6f 72  pace by a factor
15490 20 6f 66 20 34 2e 20 0a 2a 2a 20 61 6e 64 20 61   of 4. .** and a
154a0 20 70 61 69 72 20 6f 66 20 63 6f 6e 73 74 72 61   pair of constra
154b0 69 6e 74 73 20 28 78 3e 3f 20 41 4e 44 20 78 3c  ints (x>? AND x<
154c0 3f 29 20 72 65 64 75 63 65 73 20 74 68 65 20 65  ?) reduces the e
154d0 78 70 65 63 74 65 64 20 6e 75 6d 62 65 72 20 6f  xpected number o
154e0 66 0a 2a 2a 20 72 6f 77 73 20 76 69 73 69 74 65  f.** rows visite
154f0 64 20 62 79 20 61 20 66 61 63 74 6f 72 20 6f 66  d by a factor of
15500 20 36 34 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69   64..*/.static i
15510 6e 74 20 77 68 65 72 65 52 61 6e 67 65 53 63 61  nt whereRangeSca
15520 6e 45 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70  nEst(.  Parse *p
15530 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20  Parse,       /* 
15540 50 61 72 73 69 6e 67 20 26 20 63 6f 64 65 20 67  Parsing & code g
15550 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78  enerating contex
15560 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70  t */.  WhereLoop
15570 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65  Builder *pBuilde
15580 72 2c 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  r,.  WhereTerm *
15590 70 4c 6f 77 65 72 2c 20 20 20 2f 2a 20 4c 6f 77  pLower,   /* Low
155a0 65 72 20 62 6f 75 6e 64 20 6f 6e 20 74 68 65 20  er bound on the 
155b0 72 61 6e 67 65 2e 20 65 78 3a 20 22 78 3e 31 32  range. ex: "x>12
155c0 33 22 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c  3" Might be NULL
155d0 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
155e0 2a 70 55 70 70 65 72 2c 20 20 20 2f 2a 20 55 70  *pUpper,   /* Up
155f0 70 65 72 20 62 6f 75 6e 64 20 6f 6e 20 74 68 65  per bound on the
15600 20 72 61 6e 67 65 2e 20 65 78 3a 20 22 78 3c 34   range. ex: "x<4
15610 35 35 22 20 4d 69 67 68 74 20 62 65 20 4e 55 4c  55" Might be NUL
15620 4c 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70  L */.  WhereLoop
15630 20 2a 70 4c 6f 6f 70 20 20 20 20 20 2f 2a 20 4d   *pLoop     /* M
15640 6f 64 69 66 79 20 74 68 65 20 2e 6e 4f 75 74 20  odify the .nOut 
15650 61 6e 64 20 6d 61 79 62 65 20 2e 72 52 75 6e 20  and maybe .rRun 
15660 66 69 65 6c 64 73 20 2a 2f 0a 29 7b 0a 20 20 69  fields */.){.  i
15670 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
15680 4b 3b 0a 20 20 69 6e 74 20 6e 4f 75 74 20 3d 20  K;.  int nOut = 
15690 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 3b 0a 20 20 4c  pLoop->nOut;.  L
156a0 6f 67 45 73 74 20 6e 4e 65 77 3b 0a 0a 23 69 66  ogEst nNew;..#if
156b0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
156c0 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34  E_STAT3_OR_STAT4
156d0 0a 20 20 49 6e 64 65 78 20 2a 70 20 3d 20 70 4c  .  Index *p = pL
156e0 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  oop->u.btree.pIn
156f0 64 65 78 3b 0a 20 20 69 6e 74 20 6e 45 71 20 3d  dex;.  int nEq =
15700 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
15710 6e 45 71 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 6e  nEq;..  if( p->n
15720 53 61 6d 70 6c 65 3e 30 20 26 26 20 6e 45 71 3c  Sample>0 && nEq<
15730 70 2d 3e 6e 53 61 6d 70 6c 65 43 6f 6c 20 29 7b  p->nSampleCol ){
15740 0a 20 20 20 20 69 66 28 20 6e 45 71 3d 3d 70 42  .    if( nEq==pB
15750 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69  uilder->nRecVali
15760 64 20 29 7b 0a 20 20 20 20 20 20 55 6e 70 61 63  d ){.      Unpac
15770 6b 65 64 52 65 63 6f 72 64 20 2a 70 52 65 63 20  kedRecord *pRec 
15780 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 52 65 63  = pBuilder->pRec
15790 3b 0a 20 20 20 20 20 20 74 52 6f 77 63 6e 74 20  ;.      tRowcnt 
157a0 61 5b 32 5d 3b 0a 20 20 20 20 20 20 75 38 20 61  a[2];.      u8 a
157b0 66 66 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 56 61  ff;..      /* Va
157c0 72 69 61 62 6c 65 20 69 4c 6f 77 65 72 20 77 69  riable iLower wi
157d0 6c 6c 20 62 65 20 73 65 74 20 74 6f 20 74 68 65  ll be set to the
157e0 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65   estimate of the
157f0 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
15800 69 6e 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  in .      ** the
15810 20 69 6e 64 65 78 20 74 68 61 74 20 61 72 65 20   index that are 
15820 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20 6c 6f  less than the lo
15830 77 65 72 20 62 6f 75 6e 64 20 6f 66 20 74 68 65  wer bound of the
15840 20 72 61 6e 67 65 20 71 75 65 72 79 2e 20 54 68   range query. Th
15850 65 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 77 65 72  e.      ** lower
15860 20 62 6f 75 6e 64 20 62 65 69 6e 67 20 74 68 65   bound being the
15870 20 63 6f 6e 63 61 74 65 6e 61 74 69 6f 6e 20 6f   concatenation o
15880 66 20 24 50 20 61 6e 64 20 24 4c 2c 20 77 68 65  f $P and $L, whe
15890 72 65 20 24 50 20 69 73 20 74 68 65 0a 20 20 20  re $P is the.   
158a0 20 20 20 2a 2a 20 6b 65 79 2d 70 72 65 66 69 78     ** key-prefix
158b0 20 66 6f 72 6d 65 64 20 62 79 20 74 68 65 20 6e   formed by the n
158c0 45 71 20 76 61 6c 75 65 73 20 6d 61 74 63 68 65  Eq values matche
158d0 64 20 61 67 61 69 6e 73 74 20 74 68 65 20 6e 45  d against the nE
158e0 71 20 6c 65 66 74 2d 6d 6f 73 74 0a 20 20 20 20  q left-most.    
158f0 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20 6f 66 20    ** columns of 
15900 74 68 65 20 69 6e 64 65 78 2c 20 61 6e 64 20 24  the index, and $
15910 4c 20 69 73 20 74 68 65 20 76 61 6c 75 65 20 69  L is the value i
15920 6e 20 70 4c 6f 77 65 72 2e 0a 20 20 20 20 20 20  n pLower..      
15930 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4f 72 2c 20  **.      ** Or, 
15940 69 66 20 70 4c 6f 77 65 72 20 69 73 20 4e 55 4c  if pLower is NUL
15950 4c 20 6f 72 20 24 4c 20 63 61 6e 6e 6f 74 20 62  L or $L cannot b
15960 65 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  e extracted from
15970 20 69 74 20 28 62 65 63 61 75 73 65 20 69 74 0a   it (because it.
15980 20 20 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20        ** is not 
15990 61 20 73 69 6d 70 6c 65 20 76 61 72 69 61 62 6c  a simple variabl
159a0 65 20 6f 72 20 6c 69 74 65 72 61 6c 20 76 61 6c  e or literal val
159b0 75 65 29 2c 20 74 68 65 20 6c 6f 77 65 72 20 62  ue), the lower b
159c0 6f 75 6e 64 20 6f 66 20 74 68 65 0a 20 20 20 20  ound of the.    
159d0 20 20 2a 2a 20 72 61 6e 67 65 20 69 73 20 24 50    ** range is $P
159e0 2e 20 44 75 65 20 74 6f 20 61 20 71 75 69 72 6b  . Due to a quirk
159f0 20 69 6e 20 74 68 65 20 77 61 79 20 77 68 65 72   in the way wher
15a00 65 4b 65 79 53 74 61 74 73 28 29 20 77 6f 72 6b  eKeyStats() work
15a10 73 2c 20 65 76 65 6e 0a 20 20 20 20 20 20 2a 2a  s, even.      **
15a20 20 69 66 20 24 4c 20 69 73 20 61 76 61 69 6c 61   if $L is availa
15a30 62 6c 65 2c 20 77 68 65 72 65 4b 65 79 53 74 61  ble, whereKeySta
15a40 74 73 28 29 20 69 73 20 63 61 6c 6c 65 64 20 66  ts() is called f
15a50 6f 72 20 62 6f 74 68 20 28 24 50 29 20 61 6e 64  or both ($P) and
15a60 20 0a 20 20 20 20 20 20 2a 2a 20 28 24 50 3a 24   .      ** ($P:$
15a70 4c 29 20 61 6e 64 20 74 68 65 20 6c 61 72 67 65  L) and the large
15a80 72 20 6f 66 20 74 68 65 20 74 77 6f 20 72 65 74  r of the two ret
15a90 75 72 6e 65 64 20 76 61 6c 75 65 73 20 69 73 20  urned values is 
15aa0 75 73 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  used..      **. 
15ab0 20 20 20 20 20 2a 2a 20 53 69 6d 69 6c 61 72 6c       ** Similarl
15ac0 79 2c 20 69 55 70 70 65 72 20 69 73 20 74 6f 20  y, iUpper is to 
15ad0 62 65 20 73 65 74 20 74 6f 20 74 68 65 20 65 73  be set to the es
15ae0 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20 6e 75  timate of the nu
15af0 6d 62 65 72 20 6f 66 20 72 6f 77 73 0a 20 20 20  mber of rows.   
15b00 20 20 20 2a 2a 20 6c 65 73 73 20 74 68 61 6e 20     ** less than 
15b10 74 68 65 20 75 70 70 65 72 20 62 6f 75 6e 64 20  the upper bound 
15b20 6f 66 20 74 68 65 20 72 61 6e 67 65 20 71 75 65  of the range que
15b30 72 79 2e 20 57 68 65 72 65 20 74 68 65 20 75 70  ry. Where the up
15b40 70 65 72 20 62 6f 75 6e 64 0a 20 20 20 20 20 20  per bound.      
15b50 2a 2a 20 69 73 20 65 69 74 68 65 72 20 28 24 50  ** is either ($P
15b60 29 20 6f 72 20 28 24 50 3a 24 55 29 2e 20 41 67  ) or ($P:$U). Ag
15b70 61 69 6e 2c 20 65 76 65 6e 20 69 66 20 24 55 20  ain, even if $U 
15b80 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 62 6f  is available, bo
15b90 74 68 20 76 61 6c 75 65 73 0a 20 20 20 20 20 20  th values.      
15ba0 2a 2a 20 6f 66 20 69 55 70 70 65 72 20 61 72 65  ** of iUpper are
15bb0 20 72 65 71 75 65 73 74 65 64 20 6f 66 20 77 68   requested of wh
15bc0 65 72 65 4b 65 79 53 74 61 74 73 28 29 20 61 6e  ereKeyStats() an
15bd0 64 20 74 68 65 20 73 6d 61 6c 6c 65 72 20 75 73  d the smaller us
15be0 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  ed..      **.   
15bf0 20 20 20 2a 2a 20 54 68 65 20 6e 75 6d 62 65 72     ** The number
15c00 20 6f 66 20 72 6f 77 73 20 62 65 74 77 65 65 6e   of rows between
15c10 20 74 68 65 20 74 77 6f 20 62 6f 75 6e 64 73 20   the two bounds 
15c20 69 73 20 74 68 65 6e 20 6a 75 73 74 20 69 55 70  is then just iUp
15c30 70 65 72 2d 69 4c 6f 77 65 72 2e 0a 20 20 20 20  per-iLower..    
15c40 20 20 2a 2f 0a 20 20 20 20 20 20 74 52 6f 77 63    */.      tRowc
15c50 6e 74 20 69 4c 6f 77 65 72 3b 20 20 20 20 20 2f  nt iLower;     /
15c60 2a 20 52 6f 77 73 20 6c 65 73 73 20 74 68 61 6e  * Rows less than
15c70 20 74 68 65 20 6c 6f 77 65 72 20 62 6f 75 6e 64   the lower bound
15c80 20 2a 2f 0a 20 20 20 20 20 20 74 52 6f 77 63 6e   */.      tRowcn
15c90 74 20 69 55 70 70 65 72 3b 20 20 20 20 20 2f 2a  t iUpper;     /*
15ca0 20 52 6f 77 73 20 6c 65 73 73 20 74 68 61 6e 20   Rows less than 
15cb0 74 68 65 20 75 70 70 65 72 20 62 6f 75 6e 64 20  the upper bound 
15cc0 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 4c 77  */.      int iLw
15cd0 72 49 64 78 20 3d 20 2d 32 3b 20 20 20 2f 2a 20  rIdx = -2;   /* 
15ce0 61 53 61 6d 70 6c 65 5b 5d 20 66 6f 72 20 74 68  aSample[] for th
15cf0 65 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20 2a 2f  e lower bound */
15d00 0a 20 20 20 20 20 20 69 6e 74 20 69 55 70 72 49  .      int iUprI
15d10 64 78 20 3d 20 2d 31 3b 20 20 20 2f 2a 20 61 53  dx = -1;   /* aS
15d20 61 6d 70 6c 65 5b 5d 20 66 6f 72 20 74 68 65 20  ample[] for the 
15d30 75 70 70 65 72 20 62 6f 75 6e 64 20 2a 2f 0a 0a  upper bound */..
15d40 20 20 20 20 20 20 69 66 28 20 70 52 65 63 20 29        if( pRec )
15d50 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  {.        testca
15d60 73 65 28 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64  se( pRec->nField
15d70 21 3d 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63  !=pBuilder->nRec
15d80 56 61 6c 69 64 20 29 3b 0a 20 20 20 20 20 20 20  Valid );.       
15d90 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 20 3d 20   pRec->nField = 
15da0 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61  pBuilder->nRecVa
15db0 6c 69 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  lid;.      }.   
15dc0 20 20 20 69 66 28 20 6e 45 71 3d 3d 70 2d 3e 6e     if( nEq==p->n
15dd0 4b 65 79 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20  KeyCol ){.      
15de0 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41    aff = SQLITE_A
15df0 46 46 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20  FF_INTEGER;.    
15e00 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
15e10 20 61 66 66 20 3d 20 70 2d 3e 70 54 61 62 6c 65   aff = p->pTable
15e20 2d 3e 61 43 6f 6c 5b 70 2d 3e 61 69 43 6f 6c 75  ->aCol[p->aiColu
15e30 6d 6e 5b 6e 45 71 5d 5d 2e 61 66 66 69 6e 69 74  mn[nEq]].affinit
15e40 79 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  y;.      }.     
15e50 20 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 69 4c   /* Determine iL
15e60 6f 77 65 72 20 61 6e 64 20 69 55 70 70 65 72 20  ower and iUpper 
15e70 75 73 69 6e 67 20 28 24 50 29 20 6f 6e 6c 79 2e  using ($P) only.
15e80 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6e 45   */.      if( nE
15e90 71 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  q==0 ){.        
15ea0 69 4c 6f 77 65 72 20 3d 20 30 3b 0a 20 20 20 20  iLower = 0;.    
15eb0 20 20 20 20 69 55 70 70 65 72 20 3d 20 70 2d 3e      iUpper = p->
15ec0 6e 52 6f 77 45 73 74 30 3b 0a 20 20 20 20 20 20  nRowEst0;.      
15ed0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
15ee0 2a 20 4e 6f 74 65 3a 20 74 68 69 73 20 63 61 6c  * Note: this cal
15ef0 6c 20 63 6f 75 6c 64 20 62 65 20 6f 70 74 69 6d  l could be optim
15f00 69 7a 65 64 20 61 77 61 79 20 2d 20 73 69 6e 63  ized away - sinc
15f10 65 20 74 68 65 20 73 61 6d 65 20 76 61 6c 75 65  e the same value
15f20 73 20 6d 75 73 74 20 0a 20 20 20 20 20 20 20 20  s must .        
15f30 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 72 65 71  ** have been req
15f40 75 65 73 74 65 64 20 77 68 65 6e 20 74 65 73 74  uested when test
15f50 69 6e 67 20 6b 65 79 20 24 50 20 69 6e 20 77 68  ing key $P in wh
15f60 65 72 65 45 71 75 61 6c 53 63 61 6e 45 73 74 28  ereEqualScanEst(
15f70 29 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 77  ).  */.        w
15f80 68 65 72 65 4b 65 79 53 74 61 74 73 28 70 50 61  hereKeyStats(pPa
15f90 72 73 65 2c 20 70 2c 20 70 52 65 63 2c 20 30 2c  rse, p, pRec, 0,
15fa0 20 61 29 3b 0a 20 20 20 20 20 20 20 20 69 4c 6f   a);.        iLo
15fb0 77 65 72 20 3d 20 61 5b 30 5d 3b 0a 20 20 20 20  wer = a[0];.    
15fc0 20 20 20 20 69 55 70 70 65 72 20 3d 20 61 5b 30      iUpper = a[0
15fd0 5d 20 2b 20 61 5b 31 5d 3b 0a 20 20 20 20 20 20  ] + a[1];.      
15fe0 7d 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  }..      assert(
15ff0 20 70 4c 6f 77 65 72 3d 3d 30 20 7c 7c 20 28 70   pLower==0 || (p
16000 4c 6f 77 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72  Lower->eOperator
16010 20 26 20 28 57 4f 5f 47 54 7c 57 4f 5f 47 45 29   & (WO_GT|WO_GE)
16020 29 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73  )!=0 );.      as
16030 73 65 72 74 28 20 70 55 70 70 65 72 3d 3d 30 20  sert( pUpper==0 
16040 7c 7c 20 28 70 55 70 70 65 72 2d 3e 65 4f 70 65  || (pUpper->eOpe
16050 72 61 74 6f 72 20 26 20 28 57 4f 5f 4c 54 7c 57  rator & (WO_LT|W
16060 4f 5f 4c 45 29 29 21 3d 30 20 29 3b 0a 20 20 20  O_LE))!=0 );.   
16070 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 53     assert( p->aS
16080 6f 72 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20  ortOrder!=0 );. 
16090 20 20 20 20 20 69 66 28 20 70 2d 3e 61 53 6f 72       if( p->aSor
160a0 74 4f 72 64 65 72 5b 6e 45 71 5d 20 29 7b 0a 20  tOrder[nEq] ){. 
160b0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 6f         /* The ro
160c0 6c 65 73 20 6f 66 20 70 4c 6f 77 65 72 20 61 6e  les of pLower an
160d0 64 20 70 55 70 70 65 72 20 61 72 65 20 73 77 61  d pUpper are swa
160e0 70 70 65 64 20 66 6f 72 20 61 20 44 45 53 43 20  pped for a DESC 
160f0 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 20  index */.       
16100 20 53 57 41 50 28 57 68 65 72 65 54 65 72 6d 2a   SWAP(WhereTerm*
16110 2c 20 70 4c 6f 77 65 72 2c 20 70 55 70 70 65 72  , pLower, pUpper
16120 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
16130 20 20 2f 2a 20 49 66 20 70 6f 73 73 69 62 6c 65    /* If possible
16140 2c 20 69 6d 70 72 6f 76 65 20 6f 6e 20 74 68 65  , improve on the
16150 20 69 4c 6f 77 65 72 20 65 73 74 69 6d 61 74 65   iLower estimate
16160 20 75 73 69 6e 67 20 28 24 50 3a 24 4c 29 2e 20   using ($P:$L). 
16170 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 4c 6f  */.      if( pLo
16180 77 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 69  wer ){.        i
16190 6e 74 20 62 4f 6b 3b 20 20 20 20 20 20 20 20 20  nt bOk;         
161a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
161b0 75 65 20 69 66 20 76 61 6c 75 65 20 69 73 20 65  ue if value is e
161c0 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 70 45  xtracted from pE
161d0 78 70 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 45  xpr */.        E
161e0 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4c 6f  xpr *pExpr = pLo
161f0 77 65 72 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67  wer->pExpr->pRig
16200 68 74 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ht;.        rc =
16210 20 73 71 6c 69 74 65 33 53 74 61 74 34 50 72 6f   sqlite3Stat4Pro
16220 62 65 53 65 74 56 61 6c 75 65 28 70 50 61 72 73  beSetValue(pPars
16230 65 2c 20 70 2c 20 26 70 52 65 63 2c 20 70 45 78  e, p, &pRec, pEx
16240 70 72 2c 20 61 66 66 2c 20 6e 45 71 2c 20 26 62  pr, aff, nEq, &b
16250 4f 6b 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  Ok);.        if(
16260 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
16270 26 20 62 4f 6b 20 29 7b 0a 20 20 20 20 20 20 20  & bOk ){.       
16280 20 20 20 74 52 6f 77 63 6e 74 20 69 4e 65 77 3b     tRowcnt iNew;
16290 0a 20 20 20 20 20 20 20 20 20 20 69 4c 77 72 49  .          iLwrI
162a0 64 78 20 3d 20 77 68 65 72 65 4b 65 79 53 74 61  dx = whereKeySta
162b0 74 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70 52  ts(pParse, p, pR
162c0 65 63 2c 20 30 2c 20 61 29 3b 0a 20 20 20 20 20  ec, 0, a);.     
162d0 20 20 20 20 20 69 4e 65 77 20 3d 20 61 5b 30 5d       iNew = a[0]
162e0 20 2b 20 28 28 70 4c 6f 77 65 72 2d 3e 65 4f 70   + ((pLower->eOp
162f0 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 47 54 7c  erator & (WO_GT|
16300 57 4f 5f 4c 45 29 29 20 3f 20 61 5b 31 5d 20 3a  WO_LE)) ? a[1] :
16310 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69   0);.          i
16320 66 28 20 69 4e 65 77 3e 69 4c 6f 77 65 72 20 29  f( iNew>iLower )
16330 20 69 4c 6f 77 65 72 20 3d 20 69 4e 65 77 3b 0a   iLower = iNew;.
16340 20 20 20 20 20 20 20 20 20 20 6e 4f 75 74 2d 2d            nOut--
16350 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4c 6f 77  ;.          pLow
16360 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  er = 0;.        
16370 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  }.      }..     
16380 20 2f 2a 20 49 66 20 70 6f 73 73 69 62 6c 65 2c   /* If possible,
16390 20 69 6d 70 72 6f 76 65 20 6f 6e 20 74 68 65 20   improve on the 
163a0 69 55 70 70 65 72 20 65 73 74 69 6d 61 74 65 20  iUpper estimate 
163b0 75 73 69 6e 67 20 28 24 50 3a 24 55 29 2e 20 2a  using ($P:$U). *
163c0 2f 0a 20 20 20 20 20 20 69 66 28 20 70 55 70 70  /.      if( pUpp
163d0 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  er ){.        in
163e0 74 20 62 4f 6b 3b 20 20 20 20 20 20 20 20 20 20  t bOk;          
163f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
16400 65 20 69 66 20 76 61 6c 75 65 20 69 73 20 65 78  e if value is ex
16410 74 72 61 63 74 65 64 20 66 72 6f 6d 20 70 45 78  tracted from pEx
16420 70 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 45 78  pr */.        Ex
16430 70 72 20 2a 70 45 78 70 72 20 3d 20 70 55 70 70  pr *pExpr = pUpp
16440 65 72 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68  er->pExpr->pRigh
16450 74 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  t;.        rc = 
16460 73 71 6c 69 74 65 33 53 74 61 74 34 50 72 6f 62  sqlite3Stat4Prob
16470 65 53 65 74 56 61 6c 75 65 28 70 50 61 72 73 65  eSetValue(pParse
16480 2c 20 70 2c 20 26 70 52 65 63 2c 20 70 45 78 70  , p, &pRec, pExp
16490 72 2c 20 61 66 66 2c 20 6e 45 71 2c 20 26 62 4f  r, aff, nEq, &bO
164a0 6b 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  k);.        if( 
164b0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
164c0 20 62 4f 6b 20 29 7b 0a 20 20 20 20 20 20 20 20   bOk ){.        
164d0 20 20 74 52 6f 77 63 6e 74 20 69 4e 65 77 3b 0a    tRowcnt iNew;.
164e0 20 20 20 20 20 20 20 20 20 20 69 55 70 72 49 64            iUprId
164f0 78 20 3d 20 77 68 65 72 65 4b 65 79 53 74 61 74  x = whereKeyStat
16500 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70 52 65  s(pParse, p, pRe
16510 63 2c 20 31 2c 20 61 29 3b 0a 20 20 20 20 20 20  c, 1, a);.      
16520 20 20 20 20 69 4e 65 77 20 3d 20 61 5b 30 5d 20      iNew = a[0] 
16530 2b 20 28 28 70 55 70 70 65 72 2d 3e 65 4f 70 65  + ((pUpper->eOpe
16540 72 61 74 6f 72 20 26 20 28 57 4f 5f 47 54 7c 57  rator & (WO_GT|W
16550 4f 5f 4c 45 29 29 20 3f 20 61 5b 31 5d 20 3a 20  O_LE)) ? a[1] : 
16560 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  0);.          if
16570 28 20 69 4e 65 77 3c 69 55 70 70 65 72 20 29 20  ( iNew<iUpper ) 
16580 69 55 70 70 65 72 20 3d 20 69 4e 65 77 3b 0a 20  iUpper = iNew;. 
16590 20 20 20 20 20 20 20 20 20 6e 4f 75 74 2d 2d 3b           nOut--;
165a0 0a 20 20 20 20 20 20 20 20 20 20 70 55 70 70 65  .          pUppe
165b0 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  r = 0;.        }
165c0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
165d0 70 42 75 69 6c 64 65 72 2d 3e 70 52 65 63 20 3d  pBuilder->pRec =
165e0 20 70 52 65 63 3b 0a 20 20 20 20 20 20 69 66 28   pRec;.      if(
165f0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
16600 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 55  {.        if( iU
16610 70 70 65 72 3e 69 4c 6f 77 65 72 20 29 7b 0a 20  pper>iLower ){. 
16620 20 20 20 20 20 20 20 20 20 6e 4e 65 77 20 3d 20           nNew = 
16630 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 69 55  sqlite3LogEst(iU
16640 70 70 65 72 20 2d 20 69 4c 6f 77 65 72 29 3b 0a  pper - iLower);.
16650 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 55 4e            /* TUN
16660 49 4e 47 3a 20 20 49 66 20 62 6f 74 68 20 69 55  ING:  If both iU
16670 70 70 65 72 20 61 6e 64 20 69 4c 6f 77 65 72 20  pper and iLower 
16680 61 72 65 20 64 65 72 69 76 65 64 20 66 72 6f 6d  are derived from
16690 20 74 68 65 20 73 61 6d 65 0a 20 20 20 20 20 20   the same.      
166a0 20 20 20 20 2a 2a 20 73 61 6d 70 6c 65 2c 20 74      ** sample, t
166b0 68 65 6e 20 61 73 73 75 6d 65 20 74 68 65 79 20  hen assume they 
166c0 61 72 65 20 34 78 20 6d 6f 72 65 20 73 65 6c 65  are 4x more sele
166d0 63 74 69 76 65 2e 20 20 54 68 69 73 20 62 72 69  ctive.  This bri
166e0 6e 67 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ngs.          **
166f0 20 74 68 65 20 65 73 74 69 6d 61 74 65 64 20 73   the estimated s
16700 65 6c 65 63 74 69 76 69 74 79 20 6d 6f 72 65 20  electivity more 
16710 69 6e 20 6c 69 6e 65 20 77 69 74 68 20 77 68 61  in line with wha
16720 74 20 69 74 20 77 6f 75 6c 64 20 62 65 0a 20 20  t it would be.  
16730 20 20 20 20 20 20 20 20 2a 2a 20 69 66 20 65 73          ** if es
16740 74 69 6d 61 74 65 64 20 77 69 74 68 6f 75 74 20  timated without 
16750 74 68 65 20 75 73 65 20 6f 66 20 53 54 41 54 33  the use of STAT3
16760 2f 34 20 74 61 62 6c 65 73 2e 20 2a 2f 0a 20 20  /4 tables. */.  
16770 20 20 20 20 20 20 20 20 69 66 28 20 69 4c 77 72          if( iLwr
16780 49 64 78 3d 3d 69 55 70 72 49 64 78 20 29 20 6e  Idx==iUprIdx ) n
16790 4e 65 77 20 2d 3d 20 32 30 3b 20 20 61 73 73 65  New -= 20;  asse
167a0 72 74 28 20 32 30 3d 3d 73 71 6c 69 74 65 33 4c  rt( 20==sqlite3L
167b0 6f 67 45 73 74 28 34 29 20 29 3b 0a 20 20 20 20  ogEst(4) );.    
167c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
167d0 20 20 20 20 20 6e 4e 65 77 20 3d 20 31 30 3b 20       nNew = 10; 
167e0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 31         assert( 1
167f0 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  0==sqlite3LogEst
16800 28 32 29 20 29 3b 0a 20 20 20 20 20 20 20 20 7d  (2) );.        }
16810 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 4e 65  .        if( nNe
16820 77 3c 6e 4f 75 74 20 29 7b 0a 20 20 20 20 20 20  w<nOut ){.      
16830 20 20 20 20 6e 4f 75 74 20 3d 20 6e 4e 65 77 3b      nOut = nNew;
16840 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
16850 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78     WHERETRACE(0x
16860 31 30 2c 20 28 22 53 54 41 54 34 20 72 61 6e 67  10, ("STAT4 rang
16870 65 20 73 63 61 6e 3a 20 25 75 2e 2e 25 75 20 20  e scan: %u..%u  
16880 65 73 74 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  est=%d\n",.     
16890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
168a0 20 20 20 20 20 20 28 75 33 32 29 69 4c 6f 77 65        (u32)iLowe
168b0 72 2c 20 28 75 33 32 29 69 55 70 70 65 72 2c 20  r, (u32)iUpper, 
168c0 6e 4f 75 74 29 29 3b 0a 20 20 20 20 20 20 7d 0a  nOut));.      }.
168d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
168e0 20 69 6e 74 20 62 44 6f 6e 65 20 3d 20 30 3b 0a   int bDone = 0;.
168f0 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65        rc = where
16900 52 61 6e 67 65 53 6b 69 70 53 63 61 6e 45 73 74  RangeSkipScanEst
16910 28 70 50 61 72 73 65 2c 20 70 4c 6f 77 65 72 2c  (pParse, pLower,
16920 20 70 55 70 70 65 72 2c 20 70 4c 6f 6f 70 2c 20   pUpper, pLoop, 
16930 26 62 44 6f 6e 65 29 3b 0a 20 20 20 20 20 20 69  &bDone);.      i
16940 66 28 20 62 44 6f 6e 65 20 29 20 72 65 74 75 72  f( bDone ) retur
16950 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  n rc;.    }.  }.
16960 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50  #else.  UNUSED_P
16970 41 52 41 4d 45 54 45 52 28 70 50 61 72 73 65 29  ARAMETER(pParse)
16980 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
16990 45 54 45 52 28 70 42 75 69 6c 64 65 72 29 3b 0a  ETER(pBuilder);.
169a0 20 20 61 73 73 65 72 74 28 20 70 4c 6f 77 65 72    assert( pLower
169b0 20 7c 7c 20 70 55 70 70 65 72 20 29 3b 0a 23 65   || pUpper );.#e
169c0 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 70  ndif.  assert( p
169d0 55 70 70 65 72 3d 3d 30 20 7c 7c 20 28 70 55 70  Upper==0 || (pUp
169e0 70 65 72 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  per->wtFlags & T
169f0 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29 3b  ERM_VNULL)==0 );
16a00 0a 20 20 6e 4e 65 77 20 3d 20 77 68 65 72 65 52  .  nNew = whereR
16a10 61 6e 67 65 41 64 6a 75 73 74 28 70 4c 6f 77 65  angeAdjust(pLowe
16a20 72 2c 20 6e 4f 75 74 29 3b 0a 20 20 6e 4e 65 77  r, nOut);.  nNew
16a30 20 3d 20 77 68 65 72 65 52 61 6e 67 65 41 64 6a   = whereRangeAdj
16a40 75 73 74 28 70 55 70 70 65 72 2c 20 6e 4e 65 77  ust(pUpper, nNew
16a50 29 3b 0a 0a 20 20 2f 2a 20 54 55 4e 49 4e 47 3a  );..  /* TUNING:
16a60 20 49 66 20 74 68 65 72 65 20 69 73 20 62 6f 74   If there is bot
16a70 68 20 61 6e 20 75 70 70 65 72 20 61 6e 64 20 6c  h an upper and l
16a80 6f 77 65 72 20 6c 69 6d 69 74 20 61 6e 64 20 6e  ower limit and n
16a90 65 69 74 68 65 72 20 6c 69 6d 69 74 0a 20 20 2a  either limit.  *
16aa0 2a 20 68 61 73 20 61 6e 20 61 70 70 6c 69 63 61  * has an applica
16ab0 74 69 6f 6e 2d 64 65 66 69 6e 65 64 20 6c 69 6b  tion-defined lik
16ac0 65 6c 69 68 6f 6f 64 28 29 2c 20 61 73 73 75 6d  elihood(), assum
16ad0 65 20 74 68 65 20 72 61 6e 67 65 20 69 73 0a 20  e the range is. 
16ae0 20 2a 2a 20 72 65 64 75 63 65 64 20 62 79 20 61   ** reduced by a
16af0 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20 37 35 25  n additional 75%
16b00 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61  . This means tha
16b10 74 2c 20 62 79 20 64 65 66 61 75 6c 74 2c 20 61  t, by default, a
16b20 6e 20 6f 70 65 6e 2d 65 6e 64 65 64 0a 20 20 2a  n open-ended.  *
16b30 2a 20 72 61 6e 67 65 20 71 75 65 72 79 20 28 65  * range query (e
16b40 2e 67 2e 20 63 6f 6c 20 3e 20 3f 29 20 69 73 20  .g. col > ?) is 
16b50 61 73 73 75 6d 65 64 20 74 6f 20 6d 61 74 63 68  assumed to match
16b60 20 31 2f 34 20 6f 66 20 74 68 65 20 72 6f 77 73   1/4 of the rows
16b70 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 69 6e 64   in the.  ** ind
16b80 65 78 2e 20 57 68 69 6c 65 20 61 20 63 6c 6f 73  ex. While a clos
16b90 65 64 20 72 61 6e 67 65 20 28 65 2e 67 2e 20 63  ed range (e.g. c
16ba0 6f 6c 20 42 45 54 57 45 45 4e 20 3f 20 41 4e 44  ol BETWEEN ? AND
16bb0 20 3f 29 20 69 73 20 65 73 74 69 6d 61 74 65 64   ?) is estimated
16bc0 20 74 6f 0a 20 20 2a 2a 20 6d 61 74 63 68 20 31   to.  ** match 1
16bd0 2f 36 34 20 6f 66 20 74 68 65 20 69 6e 64 65 78  /64 of the index
16be0 2e 20 2a 2f 20 0a 20 20 69 66 28 20 70 4c 6f 77  . */ .  if( pLow
16bf0 65 72 20 26 26 20 70 4c 6f 77 65 72 2d 3e 74 72  er && pLower->tr
16c00 75 74 68 50 72 6f 62 3e 30 20 26 26 20 70 55 70  uthProb>0 && pUp
16c10 70 65 72 20 26 26 20 70 55 70 70 65 72 2d 3e 74  per && pUpper->t
16c20 72 75 74 68 50 72 6f 62 3e 30 20 29 7b 0a 20 20  ruthProb>0 ){.  
16c30 20 20 6e 4e 65 77 20 2d 3d 20 32 30 3b 0a 20 20    nNew -= 20;.  
16c40 7d 0a 0a 20 20 6e 4f 75 74 20 2d 3d 20 28 70 4c  }..  nOut -= (pL
16c50 6f 77 65 72 21 3d 30 29 20 2b 20 28 70 55 70 70  ower!=0) + (pUpp
16c60 65 72 21 3d 30 29 3b 0a 20 20 69 66 28 20 6e 4e  er!=0);.  if( nN
16c70 65 77 3c 31 30 20 29 20 6e 4e 65 77 20 3d 20 31  ew<10 ) nNew = 1
16c80 30 3b 0a 20 20 69 66 28 20 6e 4e 65 77 3c 6e 4f  0;.  if( nNew<nO
16c90 75 74 20 29 20 6e 4f 75 74 20 3d 20 6e 4e 65 77  ut ) nOut = nNew
16ca0 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 57 48  ;.#if defined(WH
16cb0 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
16cc0 29 0a 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 6e  ).  if( pLoop->n
16cd0 4f 75 74 3e 6e 4f 75 74 20 29 7b 0a 20 20 20 20  Out>nOut ){.    
16ce0 57 48 45 52 45 54 52 41 43 45 28 30 78 31 30 2c  WHERETRACE(0x10,
16cf0 28 22 52 61 6e 67 65 20 73 63 61 6e 20 6c 6f 77  ("Range scan low
16d00 65 72 73 20 6e 4f 75 74 20 66 72 6f 6d 20 25 64  ers nOut from %d
16d10 20 74 6f 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20   to %d\n",.     
16d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
16d30 4c 6f 6f 70 2d 3e 6e 4f 75 74 2c 20 6e 4f 75 74  Loop->nOut, nOut
16d40 29 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ));.  }.#endif. 
16d50 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 3d 20 28   pLoop->nOut = (
16d60 4c 6f 67 45 73 74 29 6e 4f 75 74 3b 0a 20 20 72  LogEst)nOut;.  r
16d70 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
16d80 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
16d90 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34  E_STAT3_OR_STAT4
16da0 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20  ./*.** Estimate 
16db0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
16dc0 77 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  ws that will be 
16dd0 72 65 74 75 72 6e 65 64 20 62 61 73 65 64 20 6f  returned based o
16de0 6e 0a 2a 2a 20 61 6e 20 65 71 75 61 6c 69 74 79  n.** an equality
16df0 20 63 6f 6e 73 74 72 61 69 6e 74 20 78 3d 56 41   constraint x=VA
16e00 4c 55 45 20 61 6e 64 20 77 68 65 72 65 20 74 68  LUE and where th
16e10 61 74 20 56 41 4c 55 45 20 6f 63 63 75 72 73 20  at VALUE occurs 
16e20 69 6e 0a 2a 2a 20 74 68 65 20 68 69 73 74 6f 67  in.** the histog
16e30 72 61 6d 20 64 61 74 61 2e 20 20 54 68 69 73 20  ram data.  This 
16e40 6f 6e 6c 79 20 77 6f 72 6b 73 20 77 68 65 6e 20  only works when 
16e50 78 20 69 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f  x is the left-mo
16e60 73 74 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 6f 66 20  st.** column of 
16e70 61 6e 20 69 6e 64 65 78 20 61 6e 64 20 73 71 6c  an index and sql
16e80 69 74 65 5f 73 74 61 74 33 20 68 69 73 74 6f 67  ite_stat3 histog
16e90 72 61 6d 20 64 61 74 61 20 69 73 20 61 76 61 69  ram data is avai
16ea0 6c 61 62 6c 65 0a 2a 2a 20 66 6f 72 20 74 68 61  lable.** for tha
16eb0 74 20 69 6e 64 65 78 2e 20 20 57 68 65 6e 20 70  t index.  When p
16ec0 45 78 70 72 3d 3d 4e 55 4c 4c 20 74 68 61 74 20  Expr==NULL that 
16ed0 6d 65 61 6e 73 20 74 68 65 20 63 6f 6e 73 74 72  means the constr
16ee0 61 69 6e 74 20 69 73 0a 2a 2a 20 22 78 20 49 53  aint is.** "x IS
16ef0 20 4e 55 4c 4c 22 20 69 6e 73 74 65 61 64 20 6f   NULL" instead o
16f00 66 20 22 78 3d 56 41 4c 55 45 22 2e 0a 2a 2a 0a  f "x=VALUE"..**.
16f10 2a 2a 20 57 72 69 74 65 20 74 68 65 20 65 73 74  ** Write the est
16f20 69 6d 61 74 65 64 20 72 6f 77 20 63 6f 75 6e 74  imated row count
16f30 20 69 6e 74 6f 20 2a 70 6e 52 6f 77 20 61 6e 64   into *pnRow and
16f40 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
16f50 4b 2e 20 0a 2a 2a 20 49 66 20 75 6e 61 62 6c 65  K. .** If unable
16f60 20 74 6f 20 6d 61 6b 65 20 61 6e 20 65 73 74 69   to make an esti
16f70 6d 61 74 65 2c 20 6c 65 61 76 65 20 2a 70 6e 52  mate, leave *pnR
16f80 6f 77 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64  ow unchanged and
16f90 20 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a   return.** non-z
16fa0 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ero..**.** This 
16fb0 72 6f 75 74 69 6e 65 20 63 61 6e 20 66 61 69 6c  routine can fail
16fc0 20 69 66 20 69 74 20 69 73 20 75 6e 61 62 6c 65   if it is unable
16fd0 20 74 6f 20 6c 6f 61 64 20 61 20 63 6f 6c 6c 61   to load a colla
16fe0 74 69 6e 67 20 73 65 71 75 65 6e 63 65 0a 2a 2a  ting sequence.**
16ff0 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 73 74   required for st
17000 72 69 6e 67 20 63 6f 6d 70 61 72 69 73 6f 6e 2c  ring comparison,
17010 20 6f 72 20 69 66 20 75 6e 61 62 6c 65 20 74 6f   or if unable to
17020 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79   allocate memory
17030 0a 2a 2a 20 66 6f 72 20 61 20 55 54 46 20 63 6f  .** for a UTF co
17040 6e 76 65 72 73 69 6f 6e 20 72 65 71 75 69 72 65  nversion require
17050 64 20 66 6f 72 20 63 6f 6d 70 61 72 69 73 6f 6e  d for comparison
17060 2e 20 20 54 68 65 20 65 72 72 6f 72 20 69 73 20  .  The error is 
17070 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 74 68 65  stored.** in the
17080 20 70 50 61 72 73 65 20 73 74 72 75 63 74 75 72   pParse structur
17090 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
170a0 20 77 68 65 72 65 45 71 75 61 6c 53 63 61 6e 45   whereEqualScanE
170b0 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  st(.  Parse *pPa
170c0 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61  rse,       /* Pa
170d0 72 73 69 6e 67 20 26 20 63 6f 64 65 20 67 65 6e  rsing & code gen
170e0 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20  erating context 
170f0 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75  */.  WhereLoopBu
17100 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c  ilder *pBuilder,
17110 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  .  Expr *pExpr, 
17120 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65          /* Expre
17130 73 73 69 6f 6e 20 66 6f 72 20 56 41 4c 55 45 20  ssion for VALUE 
17140 69 6e 20 74 68 65 20 78 3d 56 41 4c 55 45 20 63  in the x=VALUE c
17150 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 74  onstraint */.  t
17160 52 6f 77 63 6e 74 20 2a 70 6e 52 6f 77 20 20 20  Rowcnt *pnRow   
17170 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
17180 20 72 65 76 69 73 65 64 20 72 6f 77 20 65 73 74   revised row est
17190 69 6d 61 74 65 20 68 65 72 65 20 2a 2f 0a 29 7b  imate here */.){
171a0 0a 20 20 49 6e 64 65 78 20 2a 70 20 3d 20 70 42  .  Index *p = pB
171b0 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e  uilder->pNew->u.
171c0 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20  btree.pIndex;.  
171d0 69 6e 74 20 6e 45 71 20 3d 20 70 42 75 69 6c 64  int nEq = pBuild
171e0 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74 72 65  er->pNew->u.btre
171f0 65 2e 6e 45 71 3b 0a 20 20 55 6e 70 61 63 6b 65  e.nEq;.  Unpacke
17200 64 52 65 63 6f 72 64 20 2a 70 52 65 63 20 3d 20  dRecord *pRec = 
17210 70 42 75 69 6c 64 65 72 2d 3e 70 52 65 63 3b 0a  pBuilder->pRec;.
17220 20 20 75 38 20 61 66 66 3b 20 20 20 20 20 20 20    u8 aff;       
17230 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
17240 6f 6c 75 6d 6e 20 61 66 66 69 6e 69 74 79 20 2a  olumn affinity *
17250 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
17260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17270 20 53 75 62 66 75 6e 63 74 69 6f 6e 20 72 65 74   Subfunction ret
17280 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 74 52  urn code */.  tR
17290 6f 77 63 6e 74 20 61 5b 32 5d 3b 20 20 20 20 20  owcnt a[2];     
172a0 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74 69          /* Stati
172b0 73 74 69 63 73 20 2a 2f 0a 20 20 69 6e 74 20 62  stics */.  int b
172c0 4f 6b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6e  Ok;..  assert( n
172d0 45 71 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65 72  Eq>=1 );.  asser
172e0 74 28 20 6e 45 71 3c 3d 70 2d 3e 6e 43 6f 6c 75  t( nEq<=p->nColu
172f0 6d 6e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  mn );.  assert( 
17300 70 2d 3e 61 53 61 6d 70 6c 65 21 3d 30 20 29 3b  p->aSample!=0 );
17310 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 53  .  assert( p->nS
17320 61 6d 70 6c 65 3e 30 20 29 3b 0a 20 20 61 73 73  ample>0 );.  ass
17330 65 72 74 28 20 70 42 75 69 6c 64 65 72 2d 3e 6e  ert( pBuilder->n
17340 52 65 63 56 61 6c 69 64 3c 6e 45 71 20 29 3b 0a  RecValid<nEq );.
17350 0a 20 20 2f 2a 20 49 66 20 76 61 6c 75 65 73 20  .  /* If values 
17360 61 72 65 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c  are not availabl
17370 65 20 66 6f 72 20 61 6c 6c 20 66 69 65 6c 64 73  e for all fields
17380 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 74 6f   of the index to
17390 20 74 68 65 20 6c 65 66 74 0a 20 20 2a 2a 20 6f   the left.  ** o
173a0 66 20 74 68 69 73 20 6f 6e 65 2c 20 6e 6f 20 65  f this one, no e
173b0 73 74 69 6d 61 74 65 20 63 61 6e 20 62 65 20 6d  stimate can be m
173c0 61 64 65 2e 20 52 65 74 75 72 6e 20 53 51 4c 49  ade. Return SQLI
173d0 54 45 5f 4e 4f 54 46 4f 55 4e 44 2e 20 2a 2f 0a  TE_NOTFOUND. */.
173e0 20 20 69 66 28 20 70 42 75 69 6c 64 65 72 2d 3e    if( pBuilder->
173f0 6e 52 65 63 56 61 6c 69 64 3c 28 6e 45 71 2d 31  nRecValid<(nEq-1
17400 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
17410 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b  SQLITE_NOTFOUND;
17420 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 69 73 20  .  }..  /* This 
17430 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69  is an optimizati
17440 6f 6e 20 6f 6e 6c 79 2e 20 54 68 65 20 63 61 6c  on only. The cal
17450 6c 20 74 6f 20 73 71 6c 69 74 65 33 53 74 61 74  l to sqlite3Stat
17460 34 50 72 6f 62 65 53 65 74 56 61 6c 75 65 28 29  4ProbeSetValue()
17470 0a 20 20 2a 2a 20 62 65 6c 6f 77 20 77 6f 75 6c  .  ** below woul
17480 64 20 72 65 74 75 72 6e 20 74 68 65 20 73 61 6d  d return the sam
17490 65 20 76 61 6c 75 65 2e 20 20 2a 2f 0a 20 20 69  e value.  */.  i
174a0 66 28 20 6e 45 71 3e 3d 70 2d 3e 6e 43 6f 6c 75  f( nEq>=p->nColu
174b0 6d 6e 20 29 7b 0a 20 20 20 20 2a 70 6e 52 6f 77  mn ){.    *pnRow
174c0 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 1;.    return
174d0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
174e0 0a 20 20 61 66 66 20 3d 20 70 2d 3e 70 54 61 62  .  aff = p->pTab
174f0 6c 65 2d 3e 61 43 6f 6c 5b 70 2d 3e 61 69 43 6f  le->aCol[p->aiCo
17500 6c 75 6d 6e 5b 6e 45 71 2d 31 5d 5d 2e 61 66 66  lumn[nEq-1]].aff
17510 69 6e 69 74 79 3b 0a 20 20 72 63 20 3d 20 73 71  inity;.  rc = sq
17520 6c 69 74 65 33 53 74 61 74 34 50 72 6f 62 65 53  lite3Stat4ProbeS
17530 65 74 56 61 6c 75 65 28 70 50 61 72 73 65 2c 20  etValue(pParse, 
17540 70 2c 20 26 70 52 65 63 2c 20 70 45 78 70 72 2c  p, &pRec, pExpr,
17550 20 61 66 66 2c 20 6e 45 71 2d 31 2c 20 26 62 4f   aff, nEq-1, &bO
17560 6b 29 3b 0a 20 20 70 42 75 69 6c 64 65 72 2d 3e  k);.  pBuilder->
17570 70 52 65 63 20 3d 20 70 52 65 63 3b 0a 20 20 69  pRec = pRec;.  i
17580 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
17590 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
175a0 69 66 28 20 62 4f 6b 3d 3d 30 20 29 20 72 65 74  if( bOk==0 ) ret
175b0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f  urn SQLITE_NOTFO
175c0 55 4e 44 3b 0a 20 20 70 42 75 69 6c 64 65 72 2d  UND;.  pBuilder-
175d0 3e 6e 52 65 63 56 61 6c 69 64 20 3d 20 6e 45 71  >nRecValid = nEq
175e0 3b 0a 0a 20 20 77 68 65 72 65 4b 65 79 53 74 61  ;..  whereKeySta
175f0 74 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70 52  ts(pParse, p, pR
17600 65 63 2c 20 30 2c 20 61 29 3b 0a 20 20 57 48 45  ec, 0, a);.  WHE
17610 52 45 54 52 41 43 45 28 30 78 31 30 2c 28 22 65  RETRACE(0x10,("e
17620 71 75 61 6c 69 74 79 20 73 63 61 6e 20 72 65 67  quality scan reg
17630 69 6f 6e 73 3a 20 25 64 5c 6e 22 2c 20 28 69 6e  ions: %d\n", (in
17640 74 29 61 5b 31 5d 29 29 3b 0a 20 20 2a 70 6e 52  t)a[1]));.  *pnR
17650 6f 77 20 3d 20 61 5b 31 5d 3b 0a 20 20 0a 20 20  ow = a[1];.  .  
17660 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
17670 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e  dif /* SQLITE_EN
17680 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54  ABLE_STAT3_OR_ST
17690 41 54 34 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53  AT4 */..#ifdef S
176a0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
176b0 54 33 5f 4f 52 5f 53 54 41 54 34 0a 2f 2a 0a 2a  T3_OR_STAT4./*.*
176c0 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65 20 6e  * Estimate the n
176d0 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68  umber of rows th
176e0 61 74 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72  at will be retur
176f0 6e 65 64 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20  ned based on.** 
17700 61 6e 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74  an IN constraint
17710 20 77 68 65 72 65 20 74 68 65 20 72 69 67 68 74   where the right
17720 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68  -hand side of th
17730 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 0a 2a 2a  e IN operator.**
17740 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20 76 61   is a list of va
17750 6c 75 65 73 2e 20 20 45 78 61 6d 70 6c 65 3a 0a  lues.  Example:.
17760 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 57 48 45  **.**        WHE
17770 52 45 20 78 20 49 4e 20 28 31 2c 32 2c 33 2c 34  RE x IN (1,2,3,4
17780 29 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68  ).**.** Write th
17790 65 20 65 73 74 69 6d 61 74 65 64 20 72 6f 77 20  e estimated row 
177a0 63 6f 75 6e 74 20 69 6e 74 6f 20 2a 70 6e 52 6f  count into *pnRo
177b0 77 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c  w and return SQL
177c0 49 54 45 5f 4f 4b 2e 20 0a 2a 2a 20 49 66 20 75  ITE_OK. .** If u
177d0 6e 61 62 6c 65 20 74 6f 20 6d 61 6b 65 20 61 6e  nable to make an
177e0 20 65 73 74 69 6d 61 74 65 2c 20 6c 65 61 76 65   estimate, leave
177f0 20 2a 70 6e 52 6f 77 20 75 6e 63 68 61 6e 67 65   *pnRow unchange
17800 64 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20  d and return.** 
17810 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20  non-zero..**.** 
17820 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e  This routine can
17830 20 66 61 69 6c 20 69 66 20 69 74 20 69 73 20 75   fail if it is u
17840 6e 61 62 6c 65 20 74 6f 20 6c 6f 61 64 20 61 20  nable to load a 
17850 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
17860 63 65 0a 2a 2a 20 72 65 71 75 69 72 65 64 20 66  ce.** required f
17870 6f 72 20 73 74 72 69 6e 67 20 63 6f 6d 70 61 72  or string compar
17880 69 73 6f 6e 2c 20 6f 72 20 69 66 20 75 6e 61 62  ison, or if unab
17890 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d  le to allocate m
178a0 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20 61 20 55  emory.** for a U
178b0 54 46 20 63 6f 6e 76 65 72 73 69 6f 6e 20 72 65  TF conversion re
178c0 71 75 69 72 65 64 20 66 6f 72 20 63 6f 6d 70 61  quired for compa
178d0 72 69 73 6f 6e 2e 20 20 54 68 65 20 65 72 72 6f  rison.  The erro
178e0 72 20 69 73 20 73 74 6f 72 65 64 0a 2a 2a 20 69  r is stored.** i
178f0 6e 20 74 68 65 20 70 50 61 72 73 65 20 73 74 72  n the pParse str
17900 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69  ucture..*/.stati
17910 63 20 69 6e 74 20 77 68 65 72 65 49 6e 53 63 61  c int whereInSca
17920 6e 45 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70  nEst(.  Parse *p
17930 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20  Parse,       /* 
17940 50 61 72 73 69 6e 67 20 26 20 63 6f 64 65 20 67  Parsing & code g
17950 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78  enerating contex
17960 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70  t */.  WhereLoop
17970 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65  Builder *pBuilde
17980 72 2c 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  r,.  ExprList *p
17990 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 54 68 65  List,     /* The
179a0 20 76 61 6c 75 65 20 6c 69 73 74 20 6f 6e 20 74   value list on t
179b0 68 65 20 52 48 53 20 6f 66 20 22 78 20 49 4e 20  he RHS of "x IN 
179c0 28 76 31 2c 76 32 2c 76 33 2c 2e 2e 2e 29 22 20  (v1,v2,v3,...)" 
179d0 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 2a 70 6e  */.  tRowcnt *pn
179e0 52 6f 77 20 20 20 20 20 20 20 2f 2a 20 57 72 69  Row       /* Wri
179f0 74 65 20 74 68 65 20 72 65 76 69 73 65 64 20 72  te the revised r
17a00 6f 77 20 65 73 74 69 6d 61 74 65 20 68 65 72 65  ow estimate here
17a10 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 20 2a   */.){.  Index *
17a20 70 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e  p = pBuilder->pN
17a30 65 77 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  ew->u.btree.pInd
17a40 65 78 3b 0a 20 20 69 36 34 20 6e 52 6f 77 30 20  ex;.  i64 nRow0 
17a50 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 54  = sqlite3LogEstT
17a60 6f 49 6e 74 28 70 2d 3e 61 69 52 6f 77 4c 6f 67  oInt(p->aiRowLog
17a70 45 73 74 5b 30 5d 29 3b 0a 20 20 69 6e 74 20 6e  Est[0]);.  int n
17a80 52 65 63 56 61 6c 69 64 20 3d 20 70 42 75 69 6c  RecValid = pBuil
17a90 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3b 0a  der->nRecValid;.
17aa0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
17ab0 45 5f 4f 4b 3b 20 20 20 20 20 2f 2a 20 53 75 62  E_OK;     /* Sub
17ac0 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 20  function return 
17ad0 63 6f 64 65 20 2a 2f 0a 20 20 74 52 6f 77 63 6e  code */.  tRowcn
17ae0 74 20 6e 45 73 74 3b 20 20 20 20 20 20 20 20 20  t nEst;         
17af0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
17b00 6f 77 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65  ows for a single
17b10 20 74 65 72 6d 20 2a 2f 0a 20 20 74 52 6f 77 63   term */.  tRowc
17b20 6e 74 20 6e 52 6f 77 45 73 74 20 3d 20 30 3b 20  nt nRowEst = 0; 
17b30 20 20 20 2f 2a 20 4e 65 77 20 65 73 74 69 6d 61     /* New estima
17b40 74 65 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72  te of the number
17b50 20 6f 66 20 72 6f 77 73 20 2a 2f 0a 20 20 69 6e   of rows */.  in
17b60 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
17b70 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
17b80 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65  unter */..  asse
17b90 72 74 28 20 70 2d 3e 61 53 61 6d 70 6c 65 21 3d  rt( p->aSample!=
17ba0 30 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  0 );.  for(i=0; 
17bb0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
17bc0 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   i<pList->nExpr;
17bd0 20 69 2b 2b 29 7b 0a 20 20 20 20 6e 45 73 74 20   i++){.    nEst 
17be0 3d 20 6e 52 6f 77 30 3b 0a 20 20 20 20 72 63 20  = nRow0;.    rc 
17bf0 3d 20 77 68 65 72 65 45 71 75 61 6c 53 63 61 6e  = whereEqualScan
17c00 45 73 74 28 70 50 61 72 73 65 2c 20 70 42 75 69  Est(pParse, pBui
17c10 6c 64 65 72 2c 20 70 4c 69 73 74 2d 3e 61 5b 69  lder, pList->a[i
17c20 5d 2e 70 45 78 70 72 2c 20 26 6e 45 73 74 29 3b  ].pExpr, &nEst);
17c30 0a 20 20 20 20 6e 52 6f 77 45 73 74 20 2b 3d 20  .    nRowEst += 
17c40 6e 45 73 74 3b 0a 20 20 20 20 70 42 75 69 6c 64  nEst;.    pBuild
17c50 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20 3d 20  er->nRecValid = 
17c60 6e 52 65 63 56 61 6c 69 64 3b 0a 20 20 7d 0a 0a  nRecValid;.  }..
17c70 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
17c80 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 6e  _OK ){.    if( n
17c90 52 6f 77 45 73 74 20 3e 20 6e 52 6f 77 30 20 29  RowEst > nRow0 )
17ca0 20 6e 52 6f 77 45 73 74 20 3d 20 6e 52 6f 77 30   nRowEst = nRow0
17cb0 3b 0a 20 20 20 20 2a 70 6e 52 6f 77 20 3d 20 6e  ;.    *pnRow = n
17cc0 52 6f 77 45 73 74 3b 0a 20 20 20 20 57 48 45 52  RowEst;.    WHER
17cd0 45 54 52 41 43 45 28 30 78 31 30 2c 28 22 49 4e  ETRACE(0x10,("IN
17ce0 20 72 6f 77 20 65 73 74 69 6d 61 74 65 3a 20 65   row estimate: e
17cf0 73 74 3d 25 64 5c 6e 22 2c 20 6e 52 6f 77 45 73  st=%d\n", nRowEs
17d00 74 29 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  t));.  }.  asser
17d10 74 28 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65  t( pBuilder->nRe
17d20 63 56 61 6c 69 64 3d 3d 6e 52 65 63 56 61 6c 69  cValid==nRecVali
17d30 64 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  d );.  return rc
17d40 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
17d50 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
17d60 33 5f 4f 52 5f 53 54 41 54 34 20 2a 2f 0a 0a 2f  3_OR_STAT4 */../
17d70 2a 0a 2a 2a 20 44 69 73 61 62 6c 65 20 61 20 74  *.** Disable a t
17d80 65 72 6d 20 69 6e 20 74 68 65 20 57 48 45 52 45  erm in the WHERE
17d90 20 63 6c 61 75 73 65 2e 20 20 45 78 63 65 70 74   clause.  Except
17da0 2c 20 64 6f 20 6e 6f 74 20 64 69 73 61 62 6c 65  , do not disable
17db0 20 74 68 65 20 74 65 72 6d 0a 2a 2a 20 69 66 20   the term.** if 
17dc0 69 74 20 63 6f 6e 74 72 6f 6c 73 20 61 20 4c 45  it controls a LE
17dd0 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 61 6e  FT OUTER JOIN an
17de0 64 20 69 74 20 64 69 64 20 6e 6f 74 20 6f 72 69  d it did not ori
17df0 67 69 6e 61 74 65 20 69 6e 20 74 68 65 20 4f 4e  ginate in the ON
17e00 0a 2a 2a 20 6f 72 20 55 53 49 4e 47 20 63 6c 61  .** or USING cla
17e10 75 73 65 20 6f 66 20 74 68 61 74 20 6a 6f 69 6e  use of that join
17e20 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e 73 69 64 65 72  ..**.** Consider
17e30 20 74 68 65 20 74 65 72 6d 20 74 32 2e 7a 3d 27   the term t2.z='
17e40 6f 6b 27 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f  ok' in the follo
17e50 77 69 6e 67 20 71 75 65 72 69 65 73 3a 0a 2a 2a  wing queries:.**
17e60 0a 2a 2a 20 20 20 28 31 29 20 20 53 45 4c 45 43  .**   (1)  SELEC
17e70 54 20 2a 20 46 52 4f 4d 20 74 31 20 4c 45 46 54  T * FROM t1 LEFT
17e80 20 4a 4f 49 4e 20 74 32 20 4f 4e 20 74 31 2e 61   JOIN t2 ON t1.a
17e90 3d 74 32 2e 78 20 57 48 45 52 45 20 74 32 2e 7a  =t2.x WHERE t2.z
17ea0 3d 27 6f 6b 27 0a 2a 2a 20 20 20 28 32 29 20 20  ='ok'.**   (2)  
17eb0 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
17ec0 20 4c 45 46 54 20 4a 4f 49 4e 20 74 32 20 4f 4e   LEFT JOIN t2 ON
17ed0 20 74 31 2e 61 3d 74 32 2e 78 20 41 4e 44 20 74   t1.a=t2.x AND t
17ee0 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 20 20 20 28 33  2.z='ok'.**   (3
17ef0 29 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  )  SELECT * FROM
17f00 20 74 31 2c 20 74 32 20 57 48 45 52 45 20 74 31   t1, t2 WHERE t1
17f10 2e 61 3d 74 32 2e 78 20 41 4e 44 20 74 32 2e 7a  .a=t2.x AND t2.z
17f20 3d 27 6f 6b 27 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ='ok'.**.** The 
17f30 74 32 2e 7a 3d 27 6f 6b 27 20 69 73 20 64 69 73  t2.z='ok' is dis
17f40 61 62 6c 65 64 20 69 6e 20 74 68 65 20 69 6e 20  abled in the in 
17f50 28 32 29 20 62 65 63 61 75 73 65 20 69 74 20 6f  (2) because it o
17f60 72 69 67 69 6e 61 74 65 73 0a 2a 2a 20 69 6e 20  riginates.** in 
17f70 74 68 65 20 4f 4e 20 63 6c 61 75 73 65 2e 20 20  the ON clause.  
17f80 54 68 65 20 74 65 72 6d 20 69 73 20 64 69 73 61  The term is disa
17f90 62 6c 65 64 20 69 6e 20 28 33 29 20 62 65 63 61  bled in (3) beca
17fa0 75 73 65 20 69 74 20 69 73 20 6e 6f 74 20 70 61  use it is not pa
17fb0 72 74 0a 2a 2a 20 6f 66 20 61 20 4c 45 46 54 20  rt.** of a LEFT 
17fc0 4f 55 54 45 52 20 4a 4f 49 4e 2e 20 20 49 6e 20  OUTER JOIN.  In 
17fd0 28 31 29 2c 20 74 68 65 20 74 65 72 6d 20 69 73  (1), the term is
17fe0 20 6e 6f 74 20 64 69 73 61 62 6c 65 64 2e 0a 2a   not disabled..*
17ff0 2a 0a 2a 2a 20 44 69 73 61 62 6c 69 6e 67 20 61  *.** Disabling a
18000 20 74 65 72 6d 20 63 61 75 73 65 73 20 74 68 61   term causes tha
18010 74 20 74 65 72 6d 20 74 6f 20 6e 6f 74 20 62 65  t term to not be
18020 20 74 65 73 74 65 64 20 69 6e 20 74 68 65 20 69   tested in the i
18030 6e 6e 65 72 20 6c 6f 6f 70 0a 2a 2a 20 6f 66 20  nner loop.** of 
18040 74 68 65 20 6a 6f 69 6e 2e 20 20 44 69 73 61 62  the join.  Disab
18050 6c 69 6e 67 20 69 73 20 61 6e 20 6f 70 74 69 6d  ling is an optim
18060 69 7a 61 74 69 6f 6e 2e 20 20 57 68 65 6e 20 74  ization.  When t
18070 65 72 6d 73 20 61 72 65 20 73 61 74 69 73 66 69  erms are satisfi
18080 65 64 0a 2a 2a 20 62 79 20 69 6e 64 69 63 65 73  ed.** by indices
18090 2c 20 77 65 20 64 69 73 61 62 6c 65 20 74 68 65  , we disable the
180a0 6d 20 74 6f 20 70 72 65 76 65 6e 74 20 72 65 64  m to prevent red
180b0 75 6e 64 61 6e 74 20 74 65 73 74 73 20 69 6e 20  undant tests in 
180c0 74 68 65 20 69 6e 6e 65 72 0a 2a 2a 20 6c 6f 6f  the inner.** loo
180d0 70 2e 20 20 57 65 20 77 6f 75 6c 64 20 67 65 74  p.  We would get
180e0 20 74 68 65 20 63 6f 72 72 65 63 74 20 72 65 73   the correct res
180f0 75 6c 74 73 20 69 66 20 6e 6f 74 68 69 6e 67 20  ults if nothing 
18100 77 65 72 65 20 65 76 65 72 20 64 69 73 61 62 6c  were ever disabl
18110 65 64 2c 0a 2a 2a 20 62 75 74 20 6a 6f 69 6e 73  ed,.** but joins
18120 20 6d 69 67 68 74 20 72 75 6e 20 61 20 6c 69 74   might run a lit
18130 74 6c 65 20 73 6c 6f 77 65 72 2e 20 20 54 68 65  tle slower.  The
18140 20 74 72 69 63 6b 20 69 73 20 74 6f 20 64 69 73   trick is to dis
18150 61 62 6c 65 20 61 73 20 6d 75 63 68 0a 2a 2a 20  able as much.** 
18160 61 73 20 77 65 20 63 61 6e 20 77 69 74 68 6f 75  as we can withou
18170 74 20 64 69 73 61 62 6c 69 6e 67 20 74 6f 6f 20  t disabling too 
18180 6d 75 63 68 2e 20 20 49 66 20 77 65 20 64 69 73  much.  If we dis
18190 61 62 6c 65 64 20 69 6e 20 28 31 29 2c 20 77 65  abled in (1), we
181a0 27 64 20 67 65 74 0a 2a 2a 20 74 68 65 20 77 72  'd get.** the wr
181b0 6f 6e 67 20 61 6e 73 77 65 72 2e 20 20 53 65 65  ong answer.  See
181c0 20 74 69 63 6b 65 74 20 23 38 31 33 2e 0a 2a 2a   ticket #813..**
181d0 0a 2a 2a 20 49 66 20 61 6c 6c 20 74 68 65 20 63  .** If all the c
181e0 68 69 6c 64 72 65 6e 20 6f 66 20 61 20 74 65 72  hildren of a ter
181f0 6d 20 61 72 65 20 64 69 73 61 62 6c 65 64 2c 20  m are disabled, 
18200 74 68 65 6e 20 74 68 61 74 20 74 65 72 6d 20 69  then that term i
18210 73 20 61 6c 73 6f 0a 2a 2a 20 61 75 74 6f 6d 61  s also.** automa
18220 74 69 63 61 6c 6c 79 20 64 69 73 61 62 6c 65 64  tically disabled
18230 2e 20 20 49 6e 20 74 68 69 73 20 77 61 79 2c 20  .  In this way, 
18240 74 65 72 6d 73 20 67 65 74 20 64 69 73 61 62 6c  terms get disabl
18250 65 64 20 69 66 20 64 65 72 69 76 65 64 0a 2a 2a  ed if derived.**
18260 20 76 69 72 74 75 61 6c 20 74 65 72 6d 73 20 61   virtual terms a
18270 72 65 20 74 65 73 74 65 64 20 66 69 72 73 74 2e  re tested first.
18280 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a    For example:.*
18290 2a 0a 2a 2a 20 20 20 20 20 20 78 20 47 4c 4f 42  *.**      x GLOB
182a0 20 27 61 62 63 2a 27 20 41 4e 44 20 78 3e 3d 27   'abc*' AND x>='
182b0 61 62 63 27 20 41 4e 44 20 78 3c 27 61 63 64 27  abc' AND x<'acd'
182c0 0a 2a 2a 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f  .**      \______
182d0 5f 5f 5f 5f 5f 2f 20 20 20 20 20 5c 5f 5f 5f 5f  _____/     \____
182e0 5f 5f 2f 20 20 20 20 20 5c 5f 5f 5f 5f 5f 2f 0a  __/     \_____/.
182f0 2a 2a 20 20 20 20 20 20 20 20 20 70 61 72 65 6e  **         paren
18300 74 20 20 20 20 20 20 20 20 20 20 63 68 69 6c 64  t          child
18310 31 20 20 20 20 20 20 20 63 68 69 6c 64 32 0a 2a  1       child2.*
18320 2a 0a 2a 2a 20 4f 6e 6c 79 20 74 68 65 20 70 61  *.** Only the pa
18330 72 65 6e 74 20 74 65 72 6d 20 77 61 73 20 69 6e  rent term was in
18340 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 57 48   the original WH
18350 45 52 45 20 63 6c 61 75 73 65 2e 20 20 54 68 65  ERE clause.  The
18360 20 63 68 69 6c 64 31 0a 2a 2a 20 61 6e 64 20 63   child1.** and c
18370 68 69 6c 64 32 20 74 65 72 6d 73 20 77 65 72 65  hild2 terms were
18380 20 61 64 64 65 64 20 62 79 20 74 68 65 20 4c 49   added by the LI
18390 4b 45 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e  KE optimization.
183a0 20 20 49 66 20 62 6f 74 68 20 6f 66 0a 2a 2a 20    If both of.** 
183b0 74 68 65 20 76 69 72 74 75 61 6c 20 63 68 69 6c  the virtual chil
183c0 64 20 74 65 72 6d 73 20 61 72 65 20 76 61 6c 69  d terms are vali
183d0 64 2c 20 74 68 65 6e 20 74 65 73 74 69 6e 67 20  d, then testing 
183e0 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20 63 61  of the parent ca
183f0 6e 20 62 65 20 0a 2a 2a 20 73 6b 69 70 70 65 64  n be .** skipped
18400 2e 0a 2a 2a 0a 2a 2a 20 55 73 75 61 6c 6c 79 20  ..**.** Usually 
18410 74 68 65 20 70 61 72 65 6e 74 20 74 65 72 6d 20  the parent term 
18420 69 73 20 6d 61 72 6b 65 64 20 61 73 20 54 45 52  is marked as TER
18430 4d 5f 43 4f 44 45 44 2e 20 20 42 75 74 20 69 66  M_CODED.  But if
18440 20 74 68 65 20 70 61 72 65 6e 74 0a 2a 2a 20 74   the parent.** t
18450 65 72 6d 20 77 61 73 20 6f 72 69 67 69 6e 61 6c  erm was original
18460 6c 79 20 54 45 52 4d 5f 4c 49 4b 45 2c 20 74 68  ly TERM_LIKE, th
18470 65 6e 20 74 68 65 20 70 61 72 65 6e 74 20 67 65  en the parent ge
18480 74 73 20 54 45 52 4d 5f 4c 49 4b 45 43 4f 4e 44  ts TERM_LIKECOND
18490 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 20 54 68 65   instead..** The
184a0 20 54 45 52 4d 5f 4c 49 4b 45 43 4f 4e 44 20 6d   TERM_LIKECOND m
184b0 61 72 6b 69 6e 67 20 69 6e 64 69 63 61 74 65 73  arking indicates
184c0 20 74 68 61 74 20 74 68 65 20 74 65 72 6d 20 73   that the term s
184d0 68 6f 75 6c 64 20 62 65 20 63 6f 64 65 64 20 69  hould be coded i
184e0 6e 73 69 64 65 0a 2a 2a 20 61 20 63 6f 6e 64 69  nside.** a condi
184f0 74 69 6f 6e 61 6c 20 73 75 63 68 20 74 68 61 74  tional such that
18500 20 69 73 20 6f 6e 6c 79 20 65 76 61 6c 75 61 74   is only evaluat
18510 65 64 20 6f 6e 20 74 68 65 20 73 65 63 6f 6e 64  ed on the second
18520 20 70 61 73 73 20 6f 66 20 61 0a 2a 2a 20 4c 49   pass of a.** LI
18530 4b 45 2d 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  KE-optimization 
18540 6c 6f 6f 70 2c 20 77 68 65 6e 20 73 63 61 6e 6e  loop, when scann
18550 69 6e 67 20 42 4c 4f 42 73 20 69 6e 73 74 65 61  ing BLOBs instea
18560 64 20 6f 66 20 73 74 72 69 6e 67 73 2e 0a 2a 2f  d of strings..*/
18570 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 69 73  .static void dis
18580 61 62 6c 65 54 65 72 6d 28 57 68 65 72 65 4c 65  ableTerm(WhereLe
18590 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 57 68 65  vel *pLevel, Whe
185a0 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 29 7b 0a  reTerm *pTerm){.
185b0 20 20 69 6e 74 20 6e 4c 6f 6f 70 20 3d 20 30 3b    int nLoop = 0;
185c0 0a 20 20 77 68 69 6c 65 28 20 70 54 65 72 6d 0a  .  while( pTerm.
185d0 20 20 20 20 20 20 26 26 20 28 70 54 65 72 6d 2d        && (pTerm-
185e0 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
185f0 43 4f 44 45 44 29 3d 3d 30 0a 20 20 20 20 20 20  CODED)==0.      
18600 26 26 20 28 70 4c 65 76 65 6c 2d 3e 69 4c 65 66  && (pLevel->iLef
18610 74 4a 6f 69 6e 3d 3d 30 20 7c 7c 20 45 78 70 72  tJoin==0 || Expr
18620 48 61 73 50 72 6f 70 65 72 74 79 28 70 54 65 72  HasProperty(pTer
18630 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f 46 72 6f  m->pExpr, EP_Fro
18640 6d 4a 6f 69 6e 29 29 0a 20 20 20 20 20 20 26 26  mJoin)).      &&
18650 20 28 70 4c 65 76 65 6c 2d 3e 6e 6f 74 52 65 61   (pLevel->notRea
18660 64 79 20 26 20 70 54 65 72 6d 2d 3e 70 72 65 72  dy & pTerm->prer
18670 65 71 41 6c 6c 29 3d 3d 30 0a 20 20 29 7b 0a 20  eqAll)==0.  ){. 
18680 20 20 20 69 66 28 20 6e 4c 6f 6f 70 20 26 26 20     if( nLoop && 
18690 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20  (pTerm->wtFlags 
186a0 26 20 54 45 52 4d 5f 4c 49 4b 45 29 21 3d 30 20  & TERM_LIKE)!=0 
186b0 29 7b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e  ){.      pTerm->
186c0 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f  wtFlags |= TERM_
186d0 4c 49 4b 45 43 4f 4e 44 3b 0a 20 20 20 20 7d 65  LIKECOND;.    }e
186e0 6c 73 65 7b 0a 20 20 20 20 20 20 70 54 65 72 6d  lse{.      pTerm
186f0 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52  ->wtFlags |= TER
18700 4d 5f 43 4f 44 45 44 3b 0a 20 20 20 20 7d 0a 20  M_CODED;.    }. 
18710 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 69 50     if( pTerm->iP
18720 61 72 65 6e 74 3c 30 20 29 20 62 72 65 61 6b 3b  arent<0 ) break;
18730 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70 54  .    pTerm = &pT
18740 65 72 6d 2d 3e 70 57 43 2d 3e 61 5b 70 54 65 72  erm->pWC->a[pTer
18750 6d 2d 3e 69 50 61 72 65 6e 74 5d 3b 0a 20 20 20  m->iParent];.   
18760 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 2d 2d   pTerm->nChild--
18770 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  ;.    if( pTerm-
18780 3e 6e 43 68 69 6c 64 21 3d 30 20 29 20 62 72 65  >nChild!=0 ) bre
18790 61 6b 3b 0a 20 20 20 20 6e 4c 6f 6f 70 2b 2b 3b  ak;.    nLoop++;
187a0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  .  }.}../*.** Co
187b0 64 65 20 61 6e 20 4f 50 5f 41 66 66 69 6e 69 74  de an OP_Affinit
187c0 79 20 6f 70 63 6f 64 65 20 74 6f 20 61 70 70 6c  y opcode to appl
187d0 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61 66 66  y the column aff
187e0 69 6e 69 74 79 20 73 74 72 69 6e 67 20 7a 41 66  inity string zAf
187f0 66 0a 2a 2a 20 74 6f 20 74 68 65 20 6e 20 72 65  f.** to the n re
18800 67 69 73 74 65 72 73 20 73 74 61 72 74 69 6e 67  gisters starting
18810 20 61 74 20 62 61 73 65 2e 20 0a 2a 2a 0a 2a 2a   at base. .**.**
18820 20 41 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74   As an optimizat
18830 69 6f 6e 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f  ion, SQLITE_AFF_
18840 4e 4f 4e 45 20 65 6e 74 72 69 65 73 20 28 77 68  NONE entries (wh
18850 69 63 68 20 61 72 65 20 6e 6f 2d 6f 70 73 29 20  ich are no-ops) 
18860 61 74 20 74 68 65 0a 2a 2a 20 62 65 67 69 6e 6e  at the.** beginn
18870 69 6e 67 20 61 6e 64 20 65 6e 64 20 6f 66 20 7a  ing and end of z
18880 41 66 66 20 61 72 65 20 69 67 6e 6f 72 65 64 2e  Aff are ignored.
18890 20 20 49 66 20 61 6c 6c 20 65 6e 74 72 69 65 73    If all entries
188a0 20 69 6e 20 7a 41 66 66 20 61 72 65 0a 2a 2a 20   in zAff are.** 
188b0 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 2c  SQLITE_AFF_NONE,
188c0 20 74 68 65 6e 20 6e 6f 20 63 6f 64 65 20 67 65   then no code ge
188d0 74 73 20 67 65 6e 65 72 61 74 65 64 2e 0a 2a 2a  ts generated..**
188e0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
188f0 20 6d 61 6b 65 73 20 69 74 73 20 6f 77 6e 20 63   makes its own c
18900 6f 70 79 20 6f 66 20 7a 41 66 66 20 73 6f 20 74  opy of zAff so t
18910 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20 69  hat the caller i
18920 73 20 66 72 65 65 0a 2a 2a 20 74 6f 20 6d 6f 64  s free.** to mod
18930 69 66 79 20 7a 41 66 66 20 61 66 74 65 72 20 74  ify zAff after t
18940 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
18950 72 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  rns..*/.static v
18960 6f 69 64 20 63 6f 64 65 41 70 70 6c 79 41 66 66  oid codeApplyAff
18970 69 6e 69 74 79 28 50 61 72 73 65 20 2a 70 50 61  inity(Parse *pPa
18980 72 73 65 2c 20 69 6e 74 20 62 61 73 65 2c 20 69  rse, int base, i
18990 6e 74 20 6e 2c 20 63 68 61 72 20 2a 7a 41 66 66  nt n, char *zAff
189a0 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
189b0 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
189c0 69 66 28 20 7a 41 66 66 3d 3d 30 20 29 7b 0a 20  if( zAff==0 ){. 
189d0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73     assert( pPars
189e0 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
189f0 6c 65 64 20 29 3b 0a 20 20 20 20 72 65 74 75 72  led );.    retur
18a00 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  n;.  }.  assert(
18a10 20 76 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 41   v!=0 );..  /* A
18a20 64 6a 75 73 74 20 62 61 73 65 20 61 6e 64 20 6e  djust base and n
18a30 20 74 6f 20 73 6b 69 70 20 6f 76 65 72 20 53 51   to skip over SQ
18a40 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 65 6e  LITE_AFF_NONE en
18a50 74 72 69 65 73 20 61 74 20 74 68 65 20 62 65 67  tries at the beg
18a60 69 6e 6e 69 6e 67 0a 20 20 2a 2a 20 61 6e 64 20  inning.  ** and 
18a70 65 6e 64 20 6f 66 20 74 68 65 20 61 66 66 69 6e  end of the affin
18a80 69 74 79 20 73 74 72 69 6e 67 2e 0a 20 20 2a 2f  ity string..  */
18a90 0a 20 20 77 68 69 6c 65 28 20 6e 3e 30 20 26 26  .  while( n>0 &&
18aa0 20 7a 41 66 66 5b 30 5d 3d 3d 53 51 4c 49 54 45   zAff[0]==SQLITE
18ab0 5f 41 46 46 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20  _AFF_NONE ){.   
18ac0 20 6e 2d 2d 3b 0a 20 20 20 20 62 61 73 65 2b 2b   n--;.    base++
18ad0 3b 0a 20 20 20 20 7a 41 66 66 2b 2b 3b 0a 20 20  ;.    zAff++;.  
18ae0 7d 0a 20 20 77 68 69 6c 65 28 20 6e 3e 31 20 26  }.  while( n>1 &
18af0 26 20 7a 41 66 66 5b 6e 2d 31 5d 3d 3d 53 51 4c  & zAff[n-1]==SQL
18b00 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 29 7b 0a  ITE_AFF_NONE ){.
18b10 20 20 20 20 6e 2d 2d 3b 0a 20 20 7d 0a 0a 20 20      n--;.  }..  
18b20 2f 2a 20 43 6f 64 65 20 74 68 65 20 4f 50 5f 41  /* Code the OP_A
18b30 66 66 69 6e 69 74 79 20 6f 70 63 6f 64 65 20 69  ffinity opcode i
18b40 66 20 74 68 65 72 65 20 69 73 20 61 6e 79 74 68  f there is anyth
18b50 69 6e 67 20 6c 65 66 74 20 74 6f 20 64 6f 2e 20  ing left to do. 
18b60 2a 2f 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a  */.  if( n>0 ){.
18b70 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
18b80 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 66 66 69  ddOp2(v, OP_Affi
18b90 6e 69 74 79 2c 20 62 61 73 65 2c 20 6e 29 3b 0a  nity, base, n);.
18ba0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
18bb0 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 7a  hangeP4(v, -1, z
18bc0 41 66 66 2c 20 6e 29 3b 0a 20 20 20 20 73 71 6c  Aff, n);.    sql
18bd0 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66  ite3ExprCacheAff
18be0 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72  inityChange(pPar
18bf0 73 65 2c 20 62 61 73 65 2c 20 6e 29 3b 0a 20 20  se, base, n);.  
18c00 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  }.}.../*.** Gene
18c10 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20  rate code for a 
18c20 73 69 6e 67 6c 65 20 65 71 75 61 6c 69 74 79 20  single equality 
18c30 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52  term of the WHER
18c40 45 20 63 6c 61 75 73 65 2e 20 20 41 6e 20 65 71  E clause.  An eq
18c50 75 61 6c 69 74 79 0a 2a 2a 20 74 65 72 6d 20 63  uality.** term c
18c60 61 6e 20 62 65 20 65 69 74 68 65 72 20 58 3d 65  an be either X=e
18c70 78 70 72 20 6f 72 20 58 20 49 4e 20 28 2e 2e 2e  xpr or X IN (...
18c80 29 2e 20 20 20 70 54 65 72 6d 20 69 73 20 74 68  ).   pTerm is th
18c90 65 20 74 65 72 6d 20 74 6f 20 62 65 20 0a 2a 2a  e term to be .**
18ca0 20 63 6f 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68   coded..**.** Th
18cb0 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20  e current value 
18cc0 66 6f 72 20 74 68 65 20 63 6f 6e 73 74 72 61 69  for the constrai
18cd0 6e 74 20 69 73 20 6c 65 66 74 20 69 6e 20 72 65  nt is left in re
18ce0 67 69 73 74 65 72 20 69 52 65 67 2e 0a 2a 2a 0a  gister iReg..**.
18cf0 2a 2a 20 46 6f 72 20 61 20 63 6f 6e 73 74 72 61  ** For a constra
18d00 69 6e 74 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  int of the form 
18d10 58 3d 65 78 70 72 2c 20 74 68 65 20 65 78 70 72  X=expr, the expr
18d20 65 73 73 69 6f 6e 20 69 73 20 65 76 61 6c 75 61  ession is evalua
18d30 74 65 64 20 61 6e 64 20 69 74 73 0a 2a 2a 20 72  ted and its.** r
18d40 65 73 75 6c 74 20 69 73 20 6c 65 66 74 20 6f 6e  esult is left on
18d50 20 74 68 65 20 73 74 61 63 6b 2e 20 20 46 6f 72   the stack.  For
18d60 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 66 20   constraints of 
18d70 74 68 65 20 66 6f 72 6d 20 58 20 49 4e 20 28 2e  the form X IN (.
18d80 2e 2e 29 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  ..).** this rout
18d90 69 6e 65 20 73 65 74 73 20 75 70 20 61 20 6c 6f  ine sets up a lo
18da0 6f 70 20 74 68 61 74 20 77 69 6c 6c 20 69 74 65  op that will ite
18db0 72 61 74 65 20 6f 76 65 72 20 61 6c 6c 20 76 61  rate over all va
18dc0 6c 75 65 73 20 6f 66 20 58 2e 0a 2a 2f 0a 73 74  lues of X..*/.st
18dd0 61 74 69 63 20 69 6e 74 20 63 6f 64 65 45 71 75  atic int codeEqu
18de0 61 6c 69 74 79 54 65 72 6d 28 0a 20 20 50 61 72  alityTerm(.  Par
18df0 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
18e00 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20   /* The parsing 
18e10 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65  context */.  Whe
18e20 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 20  reTerm *pTerm,  
18e30 20 2f 2a 20 54 68 65 20 74 65 72 6d 20 6f 66 20   /* The term of 
18e40 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
18e50 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a   to be coded */.
18e60 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c    WhereLevel *pL
18e70 65 76 65 6c 2c 20 2f 2a 20 54 68 65 20 6c 65 76  evel, /* The lev
18e80 65 6c 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63  el of the FROM c
18e90 6c 61 75 73 65 20 77 65 20 61 72 65 20 77 6f 72  lause we are wor
18ea0 6b 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20 69 6e 74  king on */.  int
18eb0 20 69 45 71 2c 20 20 20 20 20 20 20 20 20 20 20   iEq,           
18ec0 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65   /* Index of the
18ed0 20 65 71 75 61 6c 69 74 79 20 74 65 72 6d 20 77   equality term w
18ee0 69 74 68 69 6e 20 74 68 69 73 20 6c 65 76 65 6c  ithin this level
18ef0 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65 76 2c 20   */.  int bRev, 
18f00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
18f10 65 20 66 6f 72 20 72 65 76 65 72 73 65 2d 6f 72  e for reverse-or
18f20 64 65 72 20 49 4e 20 6f 70 65 72 61 74 69 6f 6e  der IN operation
18f30 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 72 67  s */.  int iTarg
18f40 65 74 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74  et         /* At
18f50 74 65 6d 70 74 20 74 6f 20 6c 65 61 76 65 20 72  tempt to leave r
18f60 65 73 75 6c 74 73 20 69 6e 20 74 68 69 73 20 72  esults in this r
18f70 65 67 69 73 74 65 72 20 2a 2f 0a 29 7b 0a 20 20  egister */.){.  
18f80 45 78 70 72 20 2a 70 58 20 3d 20 70 54 65 72 6d  Expr *pX = pTerm
18f90 2d 3e 70 45 78 70 72 3b 0a 20 20 56 64 62 65 20  ->pExpr;.  Vdbe 
18fa0 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
18fb0 62 65 3b 0a 20 20 69 6e 74 20 69 52 65 67 3b 20  be;.  int iReg; 
18fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18fd0 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c   /* Register hol
18fe0 64 69 6e 67 20 72 65 73 75 6c 74 73 20 2a 2f 0a  ding results */.
18ff0 0a 20 20 61 73 73 65 72 74 28 20 69 54 61 72 67  .  assert( iTarg
19000 65 74 3e 30 20 29 3b 0a 20 20 69 66 28 20 70 58  et>0 );.  if( pX
19010 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20 7c 7c 20 70  ->op==TK_EQ || p
19020 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 29 7b 0a  X->op==TK_IS ){.
19030 20 20 20 20 69 52 65 67 20 3d 20 73 71 6c 69 74      iReg = sqlit
19040 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74  e3ExprCodeTarget
19050 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 52 69  (pParse, pX->pRi
19060 67 68 74 2c 20 69 54 61 72 67 65 74 29 3b 0a 20  ght, iTarget);. 
19070 20 7d 65 6c 73 65 20 69 66 28 20 70 58 2d 3e 6f   }else if( pX->o
19080 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b 0a  p==TK_ISNULL ){.
19090 20 20 20 20 69 52 65 67 20 3d 20 69 54 61 72 67      iReg = iTarg
190a0 65 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  et;.    sqlite3V
190b0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
190c0 4e 75 6c 6c 2c 20 30 2c 20 69 52 65 67 29 3b 0a  Null, 0, iReg);.
190d0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
190e0 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 7d  MIT_SUBQUERY.  }
190f0 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 65 54  else{.    int eT
19100 79 70 65 3b 0a 20 20 20 20 69 6e 74 20 69 54 61  ype;.    int iTa
19110 62 3b 0a 20 20 20 20 73 74 72 75 63 74 20 49 6e  b;.    struct In
19120 4c 6f 6f 70 20 2a 70 49 6e 3b 0a 20 20 20 20 57  Loop *pIn;.    W
19130 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 20  hereLoop *pLoop 
19140 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70  = pLevel->pWLoop
19150 3b 0a 0a 20 20 20 20 69 66 28 20 28 70 4c 6f 6f  ;..    if( (pLoo
19160 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
19170 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  RE_VIRTUALTABLE)
19180 3d 3d 30 0a 20 20 20 20 20 20 26 26 20 70 4c 6f  ==0.      && pLo
19190 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  op->u.btree.pInd
191a0 65 78 21 3d 30 0a 20 20 20 20 20 20 26 26 20 70  ex!=0.      && p
191b0 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49  Loop->u.btree.pI
191c0 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72  ndex->aSortOrder
191d0 5b 69 45 71 5d 0a 20 20 20 20 29 7b 0a 20 20 20  [iEq].    ){.   
191e0 20 20 20 74 65 73 74 63 61 73 65 28 20 69 45 71     testcase( iEq
191f0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ==0 );.      tes
19200 74 63 61 73 65 28 20 62 52 65 76 20 29 3b 0a 20  tcase( bRev );. 
19210 20 20 20 20 20 62 52 65 76 20 3d 20 21 62 52 65       bRev = !bRe
19220 76 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  v;.    }.    ass
19230 65 72 74 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f  ert( pX->op==TK_
19240 49 4e 20 29 3b 0a 20 20 20 20 69 52 65 67 20 3d  IN );.    iReg =
19250 20 69 54 61 72 67 65 74 3b 0a 20 20 20 20 65 54   iTarget;.    eT
19260 79 70 65 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  ype = sqlite3Fin
19270 64 49 6e 49 6e 64 65 78 28 70 50 61 72 73 65 2c  dInIndex(pParse,
19280 20 70 58 2c 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f   pX, IN_INDEX_LO
19290 4f 50 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  OP, 0);.    if( 
192a0 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f  eType==IN_INDEX_
192b0 49 4e 44 45 58 5f 44 45 53 43 20 29 7b 0a 20 20  INDEX_DESC ){.  
192c0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 62 52      testcase( bR
192d0 65 76 20 29 3b 0a 20 20 20 20 20 20 62 52 65 76  ev );.      bRev
192e0 20 3d 20 21 62 52 65 76 3b 0a 20 20 20 20 7d 0a   = !bRev;.    }.
192f0 20 20 20 20 69 54 61 62 20 3d 20 70 58 2d 3e 69      iTab = pX->i
19300 54 61 62 6c 65 3b 0a 20 20 20 20 73 71 6c 69 74  Table;.    sqlit
19310 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
19320 62 52 65 76 20 3f 20 4f 50 5f 4c 61 73 74 20 3a  bRev ? OP_Last :
19330 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 54 61 62   OP_Rewind, iTab
19340 2c 20 30 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  , 0);.    VdbeCo
19350 76 65 72 61 67 65 49 66 28 76 2c 20 62 52 65 76  verageIf(v, bRev
19360 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72  );.    VdbeCover
19370 61 67 65 49 66 28 76 2c 20 21 62 52 65 76 29 3b  ageIf(v, !bRev);
19380 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 4c  .    assert( (pL
19390 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
193a0 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 29 3d 3d  HERE_MULTI_OR)==
193b0 30 20 29 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e  0 );.    pLoop->
193c0 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45  wsFlags |= WHERE
193d0 5f 49 4e 5f 41 42 4c 45 3b 0a 20 20 20 20 69 66  _IN_ABLE;.    if
193e0 28 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e  ( pLevel->u.in.n
193f0 49 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  In==0 ){.      p
19400 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 20 3d  Level->addrNxt =
19410 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
19420 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 7d 0a  Label(v);.    }.
19430 20 20 20 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e      pLevel->u.in
19440 2e 6e 49 6e 2b 2b 3b 0a 20 20 20 20 70 4c 65 76  .nIn++;.    pLev
19450 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70  el->u.in.aInLoop
19460 20 3d 0a 20 20 20 20 20 20 20 73 71 6c 69 74 65   =.       sqlite
19470 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65  3DbReallocOrFree
19480 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c 65  (pParse->db, pLe
19490 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f  vel->u.in.aInLoo
194a0 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  p,.             
194b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
194c0 20 73 69 7a 65 6f 66 28 70 4c 65 76 65 6c 2d 3e   sizeof(pLevel->
194d0 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 5b 30 5d 29  u.in.aInLoop[0])
194e0 2a 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49  *pLevel->u.in.nI
194f0 6e 29 3b 0a 20 20 20 20 70 49 6e 20 3d 20 70 4c  n);.    pIn = pL
19500 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f  evel->u.in.aInLo
19510 6f 70 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 20  op;.    if( pIn 
19520 29 7b 0a 20 20 20 20 20 20 70 49 6e 20 2b 3d 20  ){.      pIn += 
19530 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e  pLevel->u.in.nIn
19540 20 2d 20 31 3b 0a 20 20 20 20 20 20 70 49 6e 2d   - 1;.      pIn-
19550 3e 69 43 75 72 20 3d 20 69 54 61 62 3b 0a 20 20  >iCur = iTab;.  
19560 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 49      if( eType==I
19570 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 20 29 7b  N_INDEX_ROWID ){
19580 0a 20 20 20 20 20 20 20 20 70 49 6e 2d 3e 61 64  .        pIn->ad
19590 64 72 49 6e 54 6f 70 20 3d 20 73 71 6c 69 74 65  drInTop = sqlite
195a0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
195b0 50 5f 52 6f 77 69 64 2c 20 69 54 61 62 2c 20 69  P_Rowid, iTab, i
195c0 52 65 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Reg);.      }els
195d0 65 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 2d 3e  e{.        pIn->
195e0 61 64 64 72 49 6e 54 6f 70 20 3d 20 73 71 6c 69  addrInTop = sqli
195f0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
19600 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 54 61 62   OP_Column, iTab
19610 2c 20 30 2c 20 69 52 65 67 29 3b 0a 20 20 20 20  , 0, iReg);.    
19620 20 20 7d 0a 20 20 20 20 20 20 70 49 6e 2d 3e 65    }.      pIn->e
19630 45 6e 64 4c 6f 6f 70 4f 70 20 3d 20 62 52 65 76  EndLoopOp = bRev
19640 20 3f 20 4f 50 5f 50 72 65 76 49 66 4f 70 65 6e   ? OP_PrevIfOpen
19650 20 3a 20 4f 50 5f 4e 65 78 74 49 66 4f 70 65 6e   : OP_NextIfOpen
19660 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
19670 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
19680 49 73 4e 75 6c 6c 2c 20 69 52 65 67 29 3b 20 56  IsNull, iReg); V
19690 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
196a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
196b0 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49   pLevel->u.in.nI
196c0 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 23 65 6e  n = 0;.    }.#en
196d0 64 69 66 0a 20 20 7d 0a 20 20 64 69 73 61 62 6c  dif.  }.  disabl
196e0 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 54  eTerm(pLevel, pT
196f0 65 72 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 69  erm);.  return i
19700 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  Reg;.}../*.** Ge
19710 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
19720 20 77 69 6c 6c 20 65 76 61 6c 75 61 74 65 20 61   will evaluate a
19730 6c 6c 20 3d 3d 20 61 6e 64 20 49 4e 20 63 6f 6e  ll == and IN con
19740 73 74 72 61 69 6e 74 73 20 66 6f 72 20 61 6e 0a  straints for an.
19750 2a 2a 20 69 6e 64 65 78 20 73 63 61 6e 2e 0a 2a  ** index scan..*
19760 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65  *.** For example
19770 2c 20 63 6f 6e 73 69 64 65 72 20 74 61 62 6c 65  , consider table
19780 20 74 31 28 61 2c 62 2c 63 2c 64 2c 65 2c 66 29   t1(a,b,c,d,e,f)
19790 20 77 69 74 68 20 69 6e 64 65 78 20 69 31 28 61   with index i1(a
197a0 2c 62 2c 63 29 2e 0a 2a 2a 20 53 75 70 70 6f 73  ,b,c)..** Suppos
197b0 65 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  e the WHERE clau
197c0 73 65 20 69 73 20 74 68 69 73 3a 20 20 61 3d 3d  se is this:  a==
197d0 35 20 41 4e 44 20 62 20 49 4e 20 28 31 2c 32 2c  5 AND b IN (1,2,
197e0 33 29 20 41 4e 44 20 63 3e 35 20 41 4e 44 20 63  3) AND c>5 AND c
197f0 3c 31 30 0a 2a 2a 20 54 68 65 20 69 6e 64 65 78  <10.** The index
19800 20 68 61 73 20 61 73 20 6d 61 6e 79 20 61 73 20   has as many as 
19810 74 68 72 65 65 20 65 71 75 61 6c 69 74 79 20 63  three equality c
19820 6f 6e 73 74 72 61 69 6e 74 73 2c 20 62 75 74 20  onstraints, but 
19830 69 6e 20 74 68 69 73 0a 2a 2a 20 65 78 61 6d 70  in this.** examp
19840 6c 65 2c 20 74 68 65 20 74 68 69 72 64 20 22 63  le, the third "c
19850 22 20 76 61 6c 75 65 20 69 73 20 61 6e 20 69 6e  " value is an in
19860 65 71 75 61 6c 69 74 79 2e 20 20 53 6f 20 6f 6e  equality.  So on
19870 6c 79 20 74 77 6f 20 0a 2a 2a 20 63 6f 6e 73 74  ly two .** const
19880 72 61 69 6e 74 73 20 61 72 65 20 63 6f 64 65 64  raints are coded
19890 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
198a0 77 69 6c 6c 20 67 65 6e 65 72 61 74 65 20 63 6f  will generate co
198b0 64 65 20 74 6f 20 65 76 61 6c 75 61 74 65 0a 2a  de to evaluate.*
198c0 2a 20 61 3d 3d 35 20 61 6e 64 20 62 20 49 4e 20  * a==5 and b IN 
198d0 28 31 2c 32 2c 33 29 2e 20 20 54 68 65 20 63 75  (1,2,3).  The cu
198e0 72 72 65 6e 74 20 76 61 6c 75 65 73 20 66 6f 72  rrent values for
198f0 20 61 20 61 6e 64 20 62 20 77 69 6c 6c 20 62 65   a and b will be
19900 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 63 6f   stored.** in co
19910 6e 73 65 63 75 74 69 76 65 20 72 65 67 69 73 74  nsecutive regist
19920 65 72 73 20 61 6e 64 20 74 68 65 20 69 6e 64 65  ers and the inde
19930 78 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 72  x of the first r
19940 65 67 69 73 74 65 72 20 69 73 20 72 65 74 75 72  egister is retur
19950 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68  ned..**.** In th
19960 65 20 65 78 61 6d 70 6c 65 20 61 62 6f 76 65 20  e example above 
19970 6e 45 71 3d 3d 32 2e 20 20 42 75 74 20 74 68 69  nEq==2.  But thi
19980 73 20 73 75 62 72 6f 75 74 69 6e 65 20 77 6f 72  s subroutine wor
19990 6b 73 20 66 6f 72 20 61 6e 79 20 76 61 6c 75 65  ks for any value
199a0 0a 2a 2a 20 6f 66 20 6e 45 71 20 69 6e 63 6c 75  .** of nEq inclu
199b0 64 69 6e 67 20 30 2e 20 20 49 66 20 6e 45 71 3d  ding 0.  If nEq=
199c0 3d 30 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  =0, this routine
199d0 20 69 73 20 6e 65 61 72 6c 79 20 61 20 6e 6f 2d   is nearly a no-
199e0 6f 70 2e 0a 2a 2a 20 54 68 65 20 6f 6e 6c 79 20  op..** The only 
199f0 74 68 69 6e 67 20 69 74 20 64 6f 65 73 20 69 73  thing it does is
19a00 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 70 4c   allocate the pL
19a10 65 76 65 6c 2d 3e 69 4d 65 6d 20 6d 65 6d 6f 72  evel->iMem memor
19a20 79 20 63 65 6c 6c 20 61 6e 64 0a 2a 2a 20 63 6f  y cell and.** co
19a30 6d 70 75 74 65 20 74 68 65 20 61 66 66 69 6e 69  mpute the affini
19a40 74 79 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a  ty string..**.**
19a50 20 54 68 65 20 6e 45 78 74 72 61 52 65 67 20 70   The nExtraReg p
19a60 61 72 61 6d 65 74 65 72 20 69 73 20 30 20 6f 72  arameter is 0 or
19a70 20 31 2e 20 20 49 74 20 69 73 20 30 20 69 66 20   1.  It is 0 if 
19a80 61 6c 6c 20 57 48 45 52 45 20 63 6c 61 75 73 65  all WHERE clause
19a90 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 2a 2a 20   constraints.** 
19aa0 61 72 65 20 3d 3d 20 6f 72 20 49 4e 20 61 6e 64  are == or IN and
19ab0 20 61 72 65 20 63 6f 76 65 72 65 64 20 62 79 20   are covered by 
19ac0 74 68 65 20 6e 45 71 2e 20 20 6e 45 78 74 72 61  the nEq.  nExtra
19ad0 52 65 67 20 69 73 20 31 20 69 66 20 74 68 65 72  Reg is 1 if ther
19ae0 65 20 69 73 0a 2a 2a 20 61 6e 20 69 6e 65 71 75  e is.** an inequ
19af0 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
19b00 20 28 73 75 63 68 20 61 73 20 74 68 65 20 22 63   (such as the "c
19b10 3e 3d 35 20 41 4e 44 20 63 3c 31 30 22 20 69 6e  >=5 AND c<10" in
19b20 20 74 68 65 20 65 78 61 6d 70 6c 65 29 20 74 68   the example) th
19b30 61 74 0a 2a 2a 20 6f 63 63 75 72 73 20 61 66 74  at.** occurs aft
19b40 65 72 20 74 68 65 20 6e 45 71 20 71 75 61 6c 69  er the nEq quali
19b50 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 0a  ty constraints..
19b60 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
19b70 6e 65 20 61 6c 6c 6f 63 61 74 65 73 20 61 20 72  ne allocates a r
19b80 61 6e 67 65 20 6f 66 20 6e 45 71 2b 6e 45 78 74  ange of nEq+nExt
19b90 72 61 52 65 67 20 6d 65 6d 6f 72 79 20 63 65 6c  raReg memory cel
19ba0 6c 73 20 61 6e 64 20 72 65 74 75 72 6e 73 0a 2a  ls and returns.*
19bb0 2a 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  * the index of t
19bc0 68 65 20 66 69 72 73 74 20 6d 65 6d 6f 72 79 20  he first memory 
19bd0 63 65 6c 6c 20 69 6e 20 74 68 61 74 20 72 61 6e  cell in that ran
19be0 67 65 2e 20 54 68 65 20 63 6f 64 65 20 74 68 61  ge. The code tha
19bf0 74 0a 2a 2a 20 63 61 6c 6c 73 20 74 68 69 73 20  t.** calls this 
19c00 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 75 73 65  routine will use
19c10 20 74 68 61 74 20 6d 65 6d 6f 72 79 20 72 61 6e   that memory ran
19c20 67 65 20 74 6f 20 73 74 6f 72 65 20 6b 65 79 73  ge to store keys
19c30 20 66 6f 72 0a 2a 2a 20 73 74 61 72 74 20 61 6e   for.** start an
19c40 64 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20 63 6f  d termination co
19c50 6e 64 69 74 69 6f 6e 73 20 6f 66 20 74 68 65 20  nditions of the 
19c60 6c 6f 6f 70 2e 0a 2a 2a 20 6b 65 79 20 76 61 6c  loop..** key val
19c70 75 65 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20  ue of the loop. 
19c80 20 49 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20   If one or more 
19c90 49 4e 20 6f 70 65 72 61 74 6f 72 73 20 61 70 70  IN operators app
19ca0 65 61 72 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69  ear, then.** thi
19cb0 73 20 72 6f 75 74 69 6e 65 20 61 6c 6c 6f 63 61  s routine alloca
19cc0 74 65 73 20 61 6e 20 61 64 64 69 74 69 6f 6e 61  tes an additiona
19cd0 6c 20 6e 45 71 20 6d 65 6d 6f 72 79 20 63 65 6c  l nEq memory cel
19ce0 6c 73 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c 0a  ls for internal.
19cf0 2a 2a 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 42 65  ** use..**.** Be
19d00 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20  fore returning, 
19d10 2a 70 7a 41 66 66 20 69 73 20 73 65 74 20 74 6f  *pzAff is set to
19d20 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66   point to a buff
19d30 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 0a  er containing a.
19d40 2a 2a 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63  ** copy of the c
19d50 6f 6c 75 6d 6e 20 61 66 66 69 6e 69 74 79 20 73  olumn affinity s
19d60 74 72 69 6e 67 20 6f 66 20 74 68 65 20 69 6e 64  tring of the ind
19d70 65 78 20 61 6c 6c 6f 63 61 74 65 64 20 75 73 69  ex allocated usi
19d80 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 44 62 4d  ng.** sqlite3DbM
19d90 61 6c 6c 6f 63 28 29 2e 20 45 78 63 65 70 74 2c  alloc(). Except,
19da0 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
19db0 63 6f 70 79 20 6f 66 20 74 68 65 20 73 74 72 69  copy of the stri
19dc0 6e 67 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a  ng associated.**
19dd0 20 77 69 74 68 20 65 71 75 61 6c 69 74 79 20 63   with equality c
19de0 6f 6e 73 74 72 61 69 6e 74 73 20 74 68 61 74 20  onstraints that 
19df0 75 73 65 20 4e 4f 4e 45 20 61 66 66 69 6e 69 74  use NONE affinit
19e00 79 20 61 72 65 20 73 65 74 20 74 6f 0a 2a 2a 20  y are set to.** 
19e10 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 2e  SQLITE_AFF_NONE.
19e20 20 54 68 69 73 20 69 73 20 74 6f 20 64 65 61 6c   This is to deal
19e30 20 77 69 74 68 20 53 51 4c 20 73 75 63 68 20 61   with SQL such a
19e40 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  s the following:
19e50 0a 2a 2a 0a 2a 2a 20 20 20 43 52 45 41 54 45 20  .**.**   CREATE 
19e60 54 41 42 4c 45 20 74 31 28 61 20 54 45 58 54 20  TABLE t1(a TEXT 
19e70 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 29 3b  PRIMARY KEY, b);
19e80 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 2e 2e 2e  .**   SELECT ...
19e90 20 46 52 4f 4d 20 74 31 20 41 53 20 74 32 2c 20   FROM t1 AS t2, 
19ea0 74 31 20 57 48 45 52 45 20 74 31 2e 61 20 3d 20  t1 WHERE t1.a = 
19eb0 74 32 2e 62 3b 0a 2a 2a 0a 2a 2a 20 49 6e 20 74  t2.b;.**.** In t
19ec0 68 65 20 65 78 61 6d 70 6c 65 20 61 62 6f 76 65  he example above
19ed0 2c 20 74 68 65 20 69 6e 64 65 78 20 6f 6e 20 74  , the index on t
19ee0 31 28 61 29 20 68 61 73 20 54 45 58 54 20 61 66  1(a) has TEXT af
19ef0 66 69 6e 69 74 79 2e 20 42 75 74 20 73 69 6e 63  finity. But sinc
19f00 65 0a 2a 2a 20 74 68 65 20 72 69 67 68 74 20 68  e.** the right h
19f10 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65 20  and side of the 
19f20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
19f30 69 6e 74 20 28 74 32 2e 62 29 20 68 61 73 20 4e  int (t2.b) has N
19f40 4f 4e 45 20 61 66 66 69 6e 69 74 79 2c 0a 2a 2a  ONE affinity,.**
19f50 20 6e 6f 20 63 6f 6e 76 65 72 73 69 6f 6e 20 73   no conversion s
19f60 68 6f 75 6c 64 20 62 65 20 61 74 74 65 6d 70 74  hould be attempt
19f70 65 64 20 62 65 66 6f 72 65 20 75 73 69 6e 67 20  ed before using 
19f80 61 20 74 32 2e 62 20 76 61 6c 75 65 20 61 73 20  a t2.b value as 
19f90 70 61 72 74 20 6f 66 0a 2a 2a 20 61 20 6b 65 79  part of.** a key
19fa0 20 74 6f 20 73 65 61 72 63 68 20 74 68 65 20 69   to search the i
19fb0 6e 64 65 78 2e 20 48 65 6e 63 65 20 74 68 65 20  ndex. Hence the 
19fc0 66 69 72 73 74 20 62 79 74 65 20 69 6e 20 74 68  first byte in th
19fd0 65 20 72 65 74 75 72 6e 65 64 20 61 66 66 69 6e  e returned affin
19fe0 69 74 79 0a 2a 2a 20 73 74 72 69 6e 67 20 69 6e  ity.** string in
19ff0 20 74 68 69 73 20 65 78 61 6d 70 6c 65 20 77 6f   this example wo
1a000 75 6c 64 20 62 65 20 73 65 74 20 74 6f 20 53 51  uld be set to SQ
1a010 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 2e 0a 2a  LITE_AFF_NONE..*
1a020 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 64  /.static int cod
1a030 65 41 6c 6c 45 71 75 61 6c 69 74 79 54 65 72 6d  eAllEqualityTerm
1a040 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  s(.  Parse *pPar
1a050 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61  se,        /* Pa
1a060 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
1a070 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70  .  WhereLevel *p
1a080 4c 65 76 65 6c 2c 20 20 20 2f 2a 20 57 68 69 63  Level,   /* Whic
1a090 68 20 6e 65 73 74 65 64 20 6c 6f 6f 70 20 6f 66  h nested loop of
1a0a0 20 74 68 65 20 46 52 4f 4d 20 77 65 20 61 72 65   the FROM we are
1a0b0 20 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 69 6e 74   coding */.  int
1a0c0 20 62 52 65 76 2c 20 20 20 20 20 20 20 20 20 20   bRev,          
1a0d0 20 20 20 2f 2a 20 52 65 76 65 72 73 65 20 74 68     /* Reverse th
1a0e0 65 20 6f 72 64 65 72 20 6f 66 20 49 4e 20 6f 70  e order of IN op
1a0f0 65 72 61 74 6f 72 73 20 2a 2f 0a 20 20 69 6e 74  erators */.  int
1a100 20 6e 45 78 74 72 61 52 65 67 2c 20 20 20 20 20   nExtraReg,     
1a110 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1a120 65 78 74 72 61 20 72 65 67 69 73 74 65 72 73 20  extra registers 
1a130 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20  to allocate */. 
1a140 20 63 68 61 72 20 2a 2a 70 7a 41 66 66 20 20 20   char **pzAff   
1a150 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53         /* OUT: S
1a160 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61  et to point to a
1a170 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20 2a  ffinity string *
1a180 2f 0a 29 7b 0a 20 20 75 31 36 20 6e 45 71 3b 20  /.){.  u16 nEq; 
1a190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a1a0 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62       /* The numb
1a1b0 65 72 20 6f 66 20 3d 3d 20 6f 72 20 49 4e 20 63  er of == or IN c
1a1c0 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f 20 63 6f  onstraints to co
1a1d0 64 65 20 2a 2f 0a 20 20 75 31 36 20 6e 53 6b 69  de */.  u16 nSki
1a1e0 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
1a1f0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1a200 6f 66 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c  of left-most col
1a210 75 6d 6e 73 20 74 6f 20 73 6b 69 70 20 2a 2f 0a  umns to skip */.
1a220 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
1a230 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 20 20 20  se->pVdbe;      
1a240 2f 2a 20 54 68 65 20 76 6d 20 75 6e 64 65 72 20  /* The vm under 
1a250 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a  construction */.
1a260 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20    Index *pIdx;  
1a270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a280 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 62 65 69  /* The index bei
1a290 6e 67 20 75 73 65 64 20 66 6f 72 20 74 68 69 73  ng used for this
1a2a0 20 6c 6f 6f 70 20 2a 2f 0a 20 20 57 68 65 72 65   loop */.  Where
1a2b0 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20  Term *pTerm;    
1a2c0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69           /* A si
1a2d0 6e 67 6c 65 20 63 6f 6e 73 74 72 61 69 6e 74 20  ngle constraint 
1a2e0 74 65 72 6d 20 2a 2f 0a 20 20 57 68 65 72 65 4c  term */.  WhereL
1a2f0 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20  oop *pLoop;     
1a300 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57          /* The W
1a310 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20  hereLoop object 
1a320 2a 2f 0a 20 20 69 6e 74 20 6a 3b 20 20 20 20 20  */.  int j;     
1a330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a340 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
1a350 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 42  er */.  int regB
1a360 61 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ase;            
1a370 20 20 20 20 20 20 2f 2a 20 42 61 73 65 20 72 65        /* Base re
1a380 67 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  gister */.  int 
1a390 6e 52 65 67 3b 20 20 20 20 20 20 20 20 20 20 20  nReg;           
1a3a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1a3b0 62 65 72 20 6f 66 20 72 65 67 69 73 74 65 72 73  ber of registers
1a3c0 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a   to allocate */.
1a3d0 20 20 63 68 61 72 20 2a 7a 41 66 66 3b 20 20 20    char *zAff;   
1a3e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a3f0 2f 2a 20 41 66 66 69 6e 69 74 79 20 73 74 72 69  /* Affinity stri
1a400 6e 67 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a  ng to return */.
1a410 0a 20 20 2f 2a 20 54 68 69 73 20 6d 6f 64 75 6c  .  /* This modul
1a420 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64  e is only called
1a430 20 6f 6e 20 71 75 65 72 79 20 70 6c 61 6e 73 20   on query plans 
1a440 74 68 61 74 20 75 73 65 20 61 6e 20 69 6e 64 65  that use an inde
1a450 78 2e 20 2a 2f 0a 20 20 70 4c 6f 6f 70 20 3d 20  x. */.  pLoop = 
1a460 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a  pLevel->pWLoop;.
1a470 20 20 61 73 73 65 72 74 28 20 28 70 4c 6f 6f 70    assert( (pLoop
1a480 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
1a490 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 3d  E_VIRTUALTABLE)=
1a4a0 3d 30 20 29 3b 0a 20 20 6e 45 71 20 3d 20 70 4c  =0 );.  nEq = pL
1a4b0 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  oop->u.btree.nEq
1a4c0 3b 0a 20 20 6e 53 6b 69 70 20 3d 20 70 4c 6f 6f  ;.  nSkip = pLoo
1a4d0 70 2d 3e 6e 53 6b 69 70 3b 0a 20 20 70 49 64 78  p->nSkip;.  pIdx
1a4e0 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65   = pLoop->u.btre
1a4f0 65 2e 70 49 6e 64 65 78 3b 0a 20 20 61 73 73 65  e.pIndex;.  asse
1a500 72 74 28 20 70 49 64 78 21 3d 30 20 29 3b 0a 0a  rt( pIdx!=0 );..
1a510 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
1a520 68 6f 77 20 6d 61 6e 79 20 6d 65 6d 6f 72 79 20  how many memory 
1a530 63 65 6c 6c 73 20 77 65 20 77 69 6c 6c 20 6e 65  cells we will ne
1a540 65 64 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65  ed then allocate
1a550 20 74 68 65 6d 2e 0a 20 20 2a 2f 0a 20 20 72 65   them..  */.  re
1a560 67 42 61 73 65 20 3d 20 70 50 61 72 73 65 2d 3e  gBase = pParse->
1a570 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 6e 52 65 67  nMem + 1;.  nReg
1a580 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65   = pLoop->u.btre
1a590 65 2e 6e 45 71 20 2b 20 6e 45 78 74 72 61 52 65  e.nEq + nExtraRe
1a5a0 67 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65  g;.  pParse->nMe
1a5b0 6d 20 2b 3d 20 6e 52 65 67 3b 0a 0a 20 20 7a 41  m += nReg;..  zA
1a5c0 66 66 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  ff = sqlite3DbSt
1a5d0 72 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c  rDup(pParse->db,
1a5e0 20 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66   sqlite3IndexAff
1a5f0 69 6e 69 74 79 53 74 72 28 76 2c 20 70 49 64 78  inityStr(v, pIdx
1a600 29 29 3b 0a 20 20 69 66 28 20 21 7a 41 66 66 20  ));.  if( !zAff 
1a610 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 64  ){.    pParse->d
1a620 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
1a630 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  = 1;.  }..  if( 
1a640 6e 53 6b 69 70 20 29 7b 0a 20 20 20 20 69 6e 74  nSkip ){.    int
1a650 20 69 49 64 78 43 75 72 20 3d 20 70 4c 65 76 65   iIdxCur = pLeve
1a660 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20 20 20  l->iIdxCur;.    
1a670 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1a680 31 28 76 2c 20 28 62 52 65 76 3f 4f 50 5f 4c 61  1(v, (bRev?OP_La
1a690 73 74 3a 4f 50 5f 52 65 77 69 6e 64 29 2c 20 69  st:OP_Rewind), i
1a6a0 49 64 78 43 75 72 29 3b 0a 20 20 20 20 56 64 62  IdxCur);.    Vdb
1a6b0 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 62  eCoverageIf(v, b
1a6c0 52 65 76 3d 3d 30 29 3b 0a 20 20 20 20 56 64 62  Rev==0);.    Vdb
1a6d0 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 62  eCoverageIf(v, b
1a6e0 52 65 76 21 3d 30 29 3b 0a 20 20 20 20 56 64 62  Rev!=0);.    Vdb
1a6f0 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 62 65  eComment((v, "be
1a700 67 69 6e 20 73 6b 69 70 2d 73 63 61 6e 20 6f 6e  gin skip-scan on
1a710 20 25 73 22 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d   %s", pIdx->zNam
1a720 65 29 29 3b 0a 20 20 20 20 6a 20 3d 20 73 71 6c  e));.    j = sql
1a730 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76  ite3VdbeAddOp0(v
1a740 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20 20 20  , OP_Goto);.    
1a750 70 4c 65 76 65 6c 2d 3e 61 64 64 72 53 6b 69 70  pLevel->addrSkip
1a760 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
1a770 64 4f 70 34 49 6e 74 28 76 2c 20 28 62 52 65 76  dOp4Int(v, (bRev
1a780 3f 4f 50 5f 53 65 65 6b 4c 54 3a 4f 50 5f 53 65  ?OP_SeekLT:OP_Se
1a790 65 6b 47 54 29 2c 0a 20 20 20 20 20 20 20 20 20  ekGT),.         
1a7a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a7b0 20 20 20 69 49 64 78 43 75 72 2c 20 30 2c 20 72     iIdxCur, 0, r
1a7c0 65 67 42 61 73 65 2c 20 6e 53 6b 69 70 29 3b 0a  egBase, nSkip);.
1a7d0 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
1a7e0 49 66 28 76 2c 20 62 52 65 76 3d 3d 30 29 3b 0a  If(v, bRev==0);.
1a7f0 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
1a800 49 66 28 76 2c 20 62 52 65 76 21 3d 30 29 3b 0a  If(v, bRev!=0);.
1a810 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
1a820 75 6d 70 48 65 72 65 28 76 2c 20 6a 29 3b 0a 20  umpHere(v, j);. 
1a830 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 53     for(j=0; j<nS
1a840 6b 69 70 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  kip; j++){.     
1a850 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1a860 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  p3(v, OP_Column,
1a870 20 69 49 64 78 43 75 72 2c 20 6a 2c 20 72 65 67   iIdxCur, j, reg
1a880 42 61 73 65 2b 6a 29 3b 0a 20 20 20 20 20 20 61  Base+j);.      a
1a890 73 73 65 72 74 28 20 70 49 64 78 2d 3e 61 69 43  ssert( pIdx->aiC
1a8a0 6f 6c 75 6d 6e 5b 6a 5d 3e 3d 30 20 29 3b 0a 20  olumn[j]>=0 );. 
1a8b0 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
1a8c0 28 28 76 2c 20 22 25 73 22 2c 20 70 49 64 78 2d  ((v, "%s", pIdx-
1a8d0 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 70 49  >pTable->aCol[pI
1a8e0 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 5d  dx->aiColumn[j]]
1a8f0 2e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 7d 0a  .zName));.    }.
1a900 20 20 7d 20 20 20 20 0a 0a 20 20 2f 2a 20 45 76    }    ..  /* Ev
1a910 61 6c 75 61 74 65 20 74 68 65 20 65 71 75 61 6c  aluate the equal
1a920 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a  ity constraints.
1a930 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 7a    */.  assert( z
1a940 41 66 66 3d 3d 30 20 7c 7c 20 28 69 6e 74 29 73  Aff==0 || (int)s
1a950 74 72 6c 65 6e 28 7a 41 66 66 29 3e 3d 6e 45 71  trlen(zAff)>=nEq
1a960 20 29 3b 0a 20 20 66 6f 72 28 6a 3d 6e 53 6b 69   );.  for(j=nSki
1a970 70 3b 20 6a 3c 6e 45 71 3b 20 6a 2b 2b 29 7b 0a  p; j<nEq; j++){.
1a980 20 20 20 20 69 6e 74 20 72 31 3b 0a 20 20 20 20      int r1;.    
1a990 70 54 65 72 6d 20 3d 20 70 4c 6f 6f 70 2d 3e 61  pTerm = pLoop->a
1a9a0 4c 54 65 72 6d 5b 6a 5d 3b 0a 20 20 20 20 61 73  LTerm[j];.    as
1a9b0 73 65 72 74 28 20 70 54 65 72 6d 21 3d 30 20 29  sert( pTerm!=0 )
1a9c0 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c  ;.    /* The fol
1a9d0 6c 6f 77 69 6e 67 20 74 65 73 74 63 61 73 65 20  lowing testcase 
1a9e0 69 73 20 74 72 75 65 20 66 6f 72 20 69 6e 64 69  is true for indi
1a9f0 63 65 73 20 77 69 74 68 20 72 65 64 75 6e 64 61  ces with redunda
1aa00 6e 74 20 63 6f 6c 75 6d 6e 73 2e 20 0a 20 20 20  nt columns. .   
1aa10 20 2a 2a 20 45 78 3a 20 43 52 45 41 54 45 20 49   ** Ex: CREATE I
1aa20 4e 44 45 58 20 69 31 20 4f 4e 20 74 31 28 61 2c  NDEX i1 ON t1(a,
1aa30 62 2c 61 29 3b 20 53 45 4c 45 43 54 20 2a 20 46  b,a); SELECT * F
1aa40 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3d 30  ROM t1 WHERE a=0
1aa50 20 41 4e 44 20 62 3d 30 3b 20 2a 2f 0a 20 20 20   AND b=0; */.   
1aa60 20 74 65 73 74 63 61 73 65 28 20 28 70 54 65 72   testcase( (pTer
1aa70 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
1aa80 4d 5f 43 4f 44 45 44 29 21 3d 30 20 29 3b 0a 20  M_CODED)!=0 );. 
1aa90 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
1aaa0 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
1aab0 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20 20  RM_VIRTUAL );.  
1aac0 20 20 72 31 20 3d 20 63 6f 64 65 45 71 75 61 6c    r1 = codeEqual
1aad0 69 74 79 54 65 72 6d 28 70 50 61 72 73 65 2c 20  ityTerm(pParse, 
1aae0 70 54 65 72 6d 2c 20 70 4c 65 76 65 6c 2c 20 6a  pTerm, pLevel, j
1aaf0 2c 20 62 52 65 76 2c 20 72 65 67 42 61 73 65 2b  , bRev, regBase+
1ab00 6a 29 3b 0a 20 20 20 20 69 66 28 20 72 31 21 3d  j);.    if( r1!=
1ab10 72 65 67 42 61 73 65 2b 6a 20 29 7b 0a 20 20 20  regBase+j ){.   
1ab20 20 20 20 69 66 28 20 6e 52 65 67 3d 3d 31 20 29     if( nReg==1 )
1ab30 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1ab40 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
1ab50 70 50 61 72 73 65 2c 20 72 65 67 42 61 73 65 29  pParse, regBase)
1ab60 3b 0a 20 20 20 20 20 20 20 20 72 65 67 42 61 73  ;.        regBas
1ab70 65 20 3d 20 72 31 3b 0a 20 20 20 20 20 20 7d 65  e = r1;.      }e
1ab80 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
1ab90 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1aba0 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 72 31 2c 20  , OP_SCopy, r1, 
1abb0 72 65 67 42 61 73 65 2b 6a 29 3b 0a 20 20 20 20  regBase+j);.    
1abc0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 74 65    }.    }.    te
1abd0 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65  stcase( pTerm->e
1abe0 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53  Operator & WO_IS
1abf0 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 74 65 73 74  NULL );.    test
1ac00 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70  case( pTerm->eOp
1ac10 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29  erator & WO_IN )
1ac20 3b 0a 20 20 20 20 69 66 28 20 28 70 54 65 72 6d  ;.    if( (pTerm
1ac30 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57  ->eOperator & (W
1ac40 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 49 4e 29 29  O_ISNULL|WO_IN))
1ac50 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 45 78 70  ==0 ){.      Exp
1ac60 72 20 2a 70 52 69 67 68 74 20 3d 20 70 54 65 72  r *pRight = pTer
1ac70 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74  m->pExpr->pRight
1ac80 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ;.      if( sqli
1ac90 74 65 33 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c  te3ExprCanBeNull
1aca0 28 70 52 69 67 68 74 29 20 26 26 20 70 54 65 72  (pRight) && pTer
1acb0 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 21 3d 57 4f  m->eOperator!=WO
1acc0 5f 49 53 20 29 7b 0a 20 20 20 20 20 20 20 20 73  _IS ){.        s
1acd0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1ace0 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72  (v, OP_IsNull, r
1acf0 65 67 42 61 73 65 2b 6a 2c 20 70 4c 65 76 65 6c  egBase+j, pLevel
1ad00 2d 3e 61 64 64 72 42 72 6b 29 3b 0a 20 20 20 20  ->addrBrk);.    
1ad10 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
1ad20 28 76 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  (v);.      }.   
1ad30 20 20 20 69 66 28 20 7a 41 66 66 20 29 7b 0a 20     if( zAff ){. 
1ad40 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
1ad50 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74  e3CompareAffinit
1ad60 79 28 70 52 69 67 68 74 2c 20 7a 41 66 66 5b 6a  y(pRight, zAff[j
1ad70 5d 29 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ])==SQLITE_AFF_N
1ad80 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ONE ){.         
1ad90 20 7a 41 66 66 5b 6a 5d 20 3d 20 53 51 4c 49 54   zAff[j] = SQLIT
1ada0 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20  E_AFF_NONE;.    
1adb0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
1adc0 28 20 73 71 6c 69 74 65 33 45 78 70 72 4e 65 65  ( sqlite3ExprNee
1add0 64 73 4e 6f 41 66 66 69 6e 69 74 79 43 68 61 6e  dsNoAffinityChan
1ade0 67 65 28 70 52 69 67 68 74 2c 20 7a 41 66 66 5b  ge(pRight, zAff[
1adf0 6a 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  j]) ){.         
1ae00 20 7a 41 66 66 5b 6a 5d 20 3d 20 53 51 4c 49 54   zAff[j] = SQLIT
1ae10 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20  E_AFF_NONE;.    
1ae20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1ae30 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 7a 41 66 66    }.  }.  *pzAff
1ae40 20 3d 20 7a 41 66 66 3b 0a 20 20 72 65 74 75 72   = zAff;.  retur
1ae50 6e 20 72 65 67 42 61 73 65 3b 0a 7d 0a 0a 23 69  n regBase;.}..#i
1ae60 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1ae70 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20  T_EXPLAIN./*.** 
1ae80 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
1ae90 61 20 68 65 6c 70 65 72 20 66 6f 72 20 65 78 70  a helper for exp
1aea0 6c 61 69 6e 49 6e 64 65 78 52 61 6e 67 65 28 29  lainIndexRange()
1aeb0 20 62 65 6c 6f 77 0a 2a 2a 0a 2a 2a 20 70 53 74   below.**.** pSt
1aec0 72 20 68 6f 6c 64 73 20 74 68 65 20 74 65 78 74  r holds the text
1aed0 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f   of an expressio
1aee0 6e 20 74 68 61 74 20 77 65 20 61 72 65 20 62 75  n that we are bu
1aef0 69 6c 64 69 6e 67 20 75 70 20 6f 6e 65 20 74 65  ilding up one te
1af00 72 6d 0a 2a 2a 20 61 74 20 61 20 74 69 6d 65 2e  rm.** at a time.
1af10 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61    This routine a
1af20 64 64 73 20 61 20 6e 65 77 20 74 65 72 6d 20 74  dds a new term t
1af30 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
1af40 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 20   expression..** 
1af50 54 65 72 6d 73 20 61 72 65 20 73 65 70 61 72 61  Terms are separa
1af60 74 65 64 20 62 79 20 41 4e 44 20 73 6f 20 61 64  ted by AND so ad
1af70 64 20 74 68 65 20 22 41 4e 44 22 20 74 65 78 74  d the "AND" text
1af80 20 66 6f 72 20 73 65 63 6f 6e 64 20 61 6e 64 20   for second and 
1af90 73 75 62 73 65 71 75 65 6e 74 0a 2a 2a 20 74 65  subsequent.** te
1afa0 72 6d 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73 74 61  rms only..*/.sta
1afb0 74 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69 6e  tic void explain
1afc0 41 70 70 65 6e 64 54 65 72 6d 28 0a 20 20 53 74  AppendTerm(.  St
1afd0 72 41 63 63 75 6d 20 2a 70 53 74 72 2c 20 20 20  rAccum *pStr,   
1afe0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1aff0 20 74 65 78 74 20 65 78 70 72 65 73 73 69 6f 6e   text expression
1b000 20 62 65 69 6e 67 20 62 75 69 6c 74 20 2a 2f 0a   being built */.
1b010 20 20 69 6e 74 20 69 54 65 72 6d 2c 20 20 20 20    int iTerm,    
1b020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b030 20 49 6e 64 65 78 20 6f 66 20 74 68 69 73 20 74   Index of this t
1b040 65 72 6d 2e 20 20 46 69 72 73 74 20 69 73 20 7a  erm.  First is z
1b050 65 72 6f 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ero */.  const c
1b060 68 61 72 20 2a 7a 43 6f 6c 75 6d 6e 2c 20 20 20  har *zColumn,   
1b070 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
1b080 74 68 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20  the column */.  
1b090 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70 20  const char *zOp 
1b0a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1b0b0 61 6d 65 20 6f 66 20 74 68 65 20 6f 70 65 72 61  ame of the opera
1b0c0 74 6f 72 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  tor */.){.  if( 
1b0d0 69 54 65 72 6d 20 29 20 73 71 6c 69 74 65 33 53  iTerm ) sqlite3S
1b0e0 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 70 53  trAccumAppend(pS
1b0f0 74 72 2c 20 22 20 41 4e 44 20 22 2c 20 35 29 3b  tr, " AND ", 5);
1b100 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63  .  sqlite3StrAcc
1b110 75 6d 41 70 70 65 6e 64 41 6c 6c 28 70 53 74 72  umAppendAll(pStr
1b120 2c 20 7a 43 6f 6c 75 6d 6e 29 3b 0a 20 20 73 71  , zColumn);.  sq
1b130 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70  lite3StrAccumApp
1b140 65 6e 64 28 70 53 74 72 2c 20 7a 4f 70 2c 20 31  end(pStr, zOp, 1
1b150 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41  );.  sqlite3StrA
1b160 63 63 75 6d 41 70 70 65 6e 64 28 70 53 74 72 2c  ccumAppend(pStr,
1b170 20 22 3f 22 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a   "?", 1);.}../*.
1b180 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 4c 65 76  ** Argument pLev
1b190 65 6c 20 64 65 73 63 72 69 62 65 73 20 61 20 73  el describes a s
1b1a0 74 72 61 74 65 67 79 20 66 6f 72 20 73 63 61 6e  trategy for scan
1b1b0 6e 69 6e 67 20 74 61 62 6c 65 20 70 54 61 62 2e  ning table pTab.
1b1c0 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69   This .** functi
1b1d0 6f 6e 20 61 70 70 65 6e 64 73 20 74 65 78 74 20  on appends text 
1b1e0 74 6f 20 70 53 74 72 20 74 68 61 74 20 64 65 73  to pStr that des
1b1f0 63 72 69 62 65 73 20 74 68 65 20 73 75 62 73 65  cribes the subse
1b200 74 20 6f 66 20 74 61 62 6c 65 0a 2a 2a 20 72 6f  t of table.** ro
1b210 77 73 20 73 63 61 6e 6e 65 64 20 62 79 20 74 68  ws scanned by th
1b220 65 20 73 74 72 61 74 65 67 79 20 69 6e 20 74 68  e strategy in th
1b230 65 20 66 6f 72 6d 20 6f 66 20 61 6e 20 53 51 4c  e form of an SQL
1b240 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a   expression..**.
1b250 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  ** For example, 
1b260 69 66 20 74 68 65 20 71 75 65 72 79 3a 0a 2a 2a  if the query:.**
1b270 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a 20 46  .**   SELECT * F
1b280 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3d 31  ROM t1 WHERE a=1
1b290 20 41 4e 44 20 62 3e 32 3b 0a 2a 2a 0a 2a 2a 20   AND b>2;.**.** 
1b2a0 69 73 20 72 75 6e 20 61 6e 64 20 74 68 65 72 65  is run and there
1b2b0 20 69 73 20 61 6e 20 69 6e 64 65 78 20 6f 6e 20   is an index on 
1b2c0 28 61 2c 20 62 29 2c 20 74 68 65 6e 20 74 68 69  (a, b), then thi
1b2d0 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
1b2e0 6e 73 20 61 0a 2a 2a 20 73 74 72 69 6e 67 20 73  ns a.** string s
1b2f0 69 6d 69 6c 61 72 20 74 6f 3a 0a 2a 2a 0a 2a 2a  imilar to:.**.**
1b300 20 20 20 22 61 3d 3f 20 41 4e 44 20 62 3e 3f 22     "a=? AND b>?"
1b310 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1b320 65 78 70 6c 61 69 6e 49 6e 64 65 78 52 61 6e 67  explainIndexRang
1b330 65 28 53 74 72 41 63 63 75 6d 20 2a 70 53 74 72  e(StrAccum *pStr
1b340 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f  , WhereLoop *pLo
1b350 6f 70 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 29  op, Table *pTab)
1b360 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65  {.  Index *pInde
1b370 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72  x = pLoop->u.btr
1b380 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 75 31 36  ee.pIndex;.  u16
1b390 20 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e   nEq = pLoop->u.
1b3a0 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20 75 31 36  btree.nEq;.  u16
1b3b0 20 6e 53 6b 69 70 20 3d 20 70 4c 6f 6f 70 2d 3e   nSkip = pLoop->
1b3c0 6e 53 6b 69 70 3b 0a 20 20 69 6e 74 20 69 2c 20  nSkip;.  int i, 
1b3d0 6a 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f  j;.  Column *aCo
1b3e0 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 3b 0a  l = pTab->aCol;.
1b3f0 20 20 69 31 36 20 2a 61 69 43 6f 6c 75 6d 6e 20    i16 *aiColumn 
1b400 3d 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75  = pIndex->aiColu
1b410 6d 6e 3b 0a 0a 20 20 69 66 28 20 6e 45 71 3d 3d  mn;..  if( nEq==
1b420 30 20 26 26 20 28 70 4c 6f 6f 70 2d 3e 77 73 46  0 && (pLoop->wsF
1b430 6c 61 67 73 26 28 57 48 45 52 45 5f 42 54 4d 5f  lags&(WHERE_BTM_
1b440 4c 49 4d 49 54 7c 57 48 45 52 45 5f 54 4f 50 5f  LIMIT|WHERE_TOP_
1b450 4c 49 4d 49 54 29 29 3d 3d 30 20 29 20 72 65 74  LIMIT))==0 ) ret
1b460 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 53 74  urn;.  sqlite3St
1b470 72 41 63 63 75 6d 41 70 70 65 6e 64 28 70 53 74  rAccumAppend(pSt
1b480 72 2c 20 22 20 28 22 2c 20 32 29 3b 0a 20 20 66  r, " (", 2);.  f
1b490 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 71 3b 20 69  or(i=0; i<nEq; i
1b4a0 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  ++){.    char *z
1b4b0 20 3d 20 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3c   = aiColumn[i] <
1b4c0 20 30 20 3f 20 22 72 6f 77 69 64 22 20 3a 20 61   0 ? "rowid" : a
1b4d0 43 6f 6c 5b 61 69 43 6f 6c 75 6d 6e 5b 69 5d 5d  Col[aiColumn[i]]
1b4e0 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28 20  .zName;.    if( 
1b4f0 69 3e 3d 6e 53 6b 69 70 20 29 7b 0a 20 20 20 20  i>=nSkip ){.    
1b500 20 20 65 78 70 6c 61 69 6e 41 70 70 65 6e 64 54    explainAppendT
1b510 65 72 6d 28 70 53 74 72 2c 20 69 2c 20 7a 2c 20  erm(pStr, i, z, 
1b520 22 3d 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  "=");.    }else{
1b530 0a 20 20 20 20 20 20 69 66 28 20 69 20 29 20 73  .      if( i ) s
1b540 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70  qlite3StrAccumAp
1b550 70 65 6e 64 28 70 53 74 72 2c 20 22 20 41 4e 44  pend(pStr, " AND
1b560 20 22 2c 20 35 29 3b 0a 20 20 20 20 20 20 73 71   ", 5);.      sq
1b570 6c 69 74 65 33 58 50 72 69 6e 74 66 28 70 53 74  lite3XPrintf(pSt
1b580 72 2c 20 30 2c 20 22 41 4e 59 28 25 73 29 22 2c  r, 0, "ANY(%s)",
1b590 20 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a   z);.    }.  }..
1b5a0 20 20 6a 20 3d 20 69 3b 0a 20 20 69 66 28 20 70    j = i;.  if( p
1b5b0 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 26 57 48  Loop->wsFlags&WH
1b5c0 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 7b  ERE_BTM_LIMIT ){
1b5d0 0a 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 61  .    char *z = a
1b5e0 69 43 6f 6c 75 6d 6e 5b 6a 5d 20 3c 20 30 20 3f  iColumn[j] < 0 ?
1b5f0 20 22 72 6f 77 69 64 22 20 3a 20 61 43 6f 6c 5b   "rowid" : aCol[
1b600 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 5d 2e 7a 4e 61  aiColumn[j]].zNa
1b610 6d 65 3b 0a 20 20 20 20 65 78 70 6c 61 69 6e 41  me;.    explainA
1b620 70 70 65 6e 64 54 65 72 6d 28 70 53 74 72 2c 20  ppendTerm(pStr, 
1b630 69 2b 2b 2c 20 7a 2c 20 22 3e 22 29 3b 0a 20 20  i++, z, ">");.  
1b640 7d 0a 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77  }.  if( pLoop->w
1b650 73 46 6c 61 67 73 26 57 48 45 52 45 5f 54 4f 50  sFlags&WHERE_TOP
1b660 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 63 68  _LIMIT ){.    ch
1b670 61 72 20 2a 7a 20 3d 20 61 69 43 6f 6c 75 6d 6e  ar *z = aiColumn
1b680 5b 6a 5d 20 3c 20 30 20 3f 20 22 72 6f 77 69 64  [j] < 0 ? "rowid
1b690 22 20 3a 20 61 43 6f 6c 5b 61 69 43 6f 6c 75 6d  " : aCol[aiColum
1b6a0 6e 5b 6a 5d 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  n[j]].zName;.   
1b6b0 20 65 78 70 6c 61 69 6e 41 70 70 65 6e 64 54 65   explainAppendTe
1b6c0 72 6d 28 70 53 74 72 2c 20 69 2c 20 7a 2c 20 22  rm(pStr, i, z, "
1b6d0 3c 22 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  <");.  }.  sqlit
1b6e0 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64  e3StrAccumAppend
1b6f0 28 70 53 74 72 2c 20 22 29 22 2c 20 31 29 3b 0a  (pStr, ")", 1);.
1b700 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
1b710 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
1b720 70 20 75 6e 6c 65 73 73 20 63 75 72 72 65 6e 74  p unless current
1b730 6c 79 20 70 72 6f 63 65 73 73 69 6e 67 20 61 6e  ly processing an
1b740 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50   EXPLAIN QUERY P
1b750 4c 41 4e 0a 2a 2a 20 63 6f 6d 6d 61 6e 64 2c 20  LAN.** command, 
1b760 6f 72 20 69 66 20 65 69 74 68 65 72 20 53 51 4c  or if either SQL
1b770 49 54 45 5f 44 45 42 55 47 20 6f 72 20 53 51 4c  ITE_DEBUG or SQL
1b780 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f  ITE_ENABLE_STMT_
1b790 53 43 41 4e 53 54 41 54 55 53 20 77 61 73 0a 2a  SCANSTATUS was.*
1b7a0 2a 20 64 65 66 69 6e 65 64 20 61 74 20 63 6f 6d  * defined at com
1b7b0 70 69 6c 65 2d 74 69 6d 65 2e 20 49 66 20 69 74  pile-time. If it
1b7c0 20 69 73 20 6e 6f 74 20 61 20 6e 6f 2d 6f 70 2c   is not a no-op,
1b7d0 20 61 20 73 69 6e 67 6c 65 20 4f 50 5f 45 78 70   a single OP_Exp
1b7e0 6c 61 69 6e 20 6f 70 63 6f 64 65 20 0a 2a 2a 20  lain opcode .** 
1b7f0 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  is added to the 
1b800 6f 75 74 70 75 74 20 74 6f 20 64 65 73 63 72 69  output to descri
1b810 62 65 20 74 68 65 20 74 61 62 6c 65 20 73 63 61  be the table sca
1b820 6e 20 73 74 72 61 74 65 67 79 20 69 6e 20 70 4c  n strategy in pL
1b830 65 76 65 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  evel..**.** If a
1b840 6e 20 4f 50 5f 45 78 70 6c 61 69 6e 20 6f 70 63  n OP_Explain opc
1b850 6f 64 65 20 69 73 20 61 64 64 65 64 20 74 6f 20  ode is added to 
1b860 74 68 65 20 56 4d 2c 20 69 74 73 20 61 64 64 72  the VM, its addr
1b870 65 73 73 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ess is returned.
1b880 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69  .** Otherwise, i
1b890 66 20 6e 6f 20 4f 50 5f 45 78 70 6c 61 69 6e 20  f no OP_Explain 
1b8a0 69 73 20 63 6f 64 65 64 2c 20 7a 65 72 6f 20 69  is coded, zero i
1b8b0 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
1b8c0 74 61 74 69 63 20 69 6e 74 20 65 78 70 6c 61 69  tatic int explai
1b8d0 6e 4f 6e 65 53 63 61 6e 28 0a 20 20 50 61 72 73  nOneScan(.  Pars
1b8e0 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
1b8f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
1b900 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  arse context */.
1b910 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
1b920 69 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  ist,            
1b930 20 20 2f 2a 20 54 61 62 6c 65 20 6c 69 73 74 20    /* Table list 
1b940 74 68 69 73 20 6c 6f 6f 70 20 72 65 66 65 72 73  this loop refers
1b950 20 74 6f 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65   to */.  WhereLe
1b960 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 20 20 20  vel *pLevel,    
1b970 20 20 20 20 20 20 20 20 20 2f 2a 20 53 63 61 6e           /* Scan
1b980 20 74 6f 20 77 72 69 74 65 20 4f 50 5f 45 78 70   to write OP_Exp
1b990 6c 61 69 6e 20 6f 70 63 6f 64 65 20 66 6f 72 20  lain opcode for 
1b9a0 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 76 65 6c 2c  */.  int iLevel,
1b9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b9c0 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 66 6f       /* Value fo
1b9d0 72 20 22 6c 65 76 65 6c 22 20 63 6f 6c 75 6d 6e  r "level" column
1b9e0 20 6f 66 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20   of output */.  
1b9f0 69 6e 74 20 69 46 72 6f 6d 2c 20 20 20 20 20 20  int iFrom,      
1ba00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba10 2f 2a 20 56 61 6c 75 65 20 66 6f 72 20 22 66 72  /* Value for "fr
1ba20 6f 6d 22 20 63 6f 6c 75 6d 6e 20 6f 66 20 6f 75  om" column of ou
1ba30 74 70 75 74 20 2a 2f 0a 20 20 75 31 36 20 77 63  tput */.  u16 wc
1ba40 74 72 6c 46 6c 61 67 73 20 20 20 20 20 20 20 20  trlFlags        
1ba50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
1ba60 67 73 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c  gs passed to sql
1ba70 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
1ba80 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 65 74   */.){.  int ret
1ba90 20 3d 20 30 3b 0a 23 69 66 20 21 64 65 66 69 6e   = 0;.#if !defin
1baa0 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29  ed(SQLITE_DEBUG)
1bab0 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
1bac0 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f  ITE_ENABLE_STMT_
1bad0 53 43 41 4e 53 54 41 54 55 53 29 0a 20 20 69 66  SCANSTATUS).  if
1bae0 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69  ( pParse->explai
1baf0 6e 3d 3d 32 20 29 0a 23 65 6e 64 69 66 0a 20 20  n==2 ).#endif.  
1bb00 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63  {.    struct Src
1bb10 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
1bb20 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b   = &pTabList->a[
1bb30 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a  pLevel->iFrom];.
1bb40 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50      Vdbe *v = pP
1bb50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 20  arse->pVdbe;    
1bb60 20 20 2f 2a 20 56 4d 20 62 65 69 6e 67 20 63 6f    /* VM being co
1bb70 6e 73 74 72 75 63 74 65 64 20 2a 2f 0a 20 20 20  nstructed */.   
1bb80 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
1bb90 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 2f  Parse->db;     /
1bba0 2a 20 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c  * Database handl
1bbb0 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49 64  e */.    int iId
1bbc0 20 3d 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 65   = pParse->iSele
1bbd0 63 74 49 64 3b 20 20 2f 2a 20 53 65 6c 65 63 74  ctId;  /* Select
1bbe0 20 69 64 20 28 6c 65 66 74 2d 6d 6f 73 74 20 6f   id (left-most o
1bbf0 75 74 70 75 74 20 63 6f 6c 75 6d 6e 29 20 2a 2f  utput column) */
1bc00 0a 20 20 20 20 69 6e 74 20 69 73 53 65 61 72 63  .    int isSearc
1bc10 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h;              
1bc20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61     /* True for a
1bc30 20 53 45 41 52 43 48 2e 20 46 61 6c 73 65 20 66   SEARCH. False f
1bc40 6f 72 20 53 43 41 4e 2e 20 2a 2f 0a 20 20 20 20  or SCAN. */.    
1bc50 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70  WhereLoop *pLoop
1bc60 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1bc70 20 54 68 65 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67   The controlling
1bc80 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63   WhereLoop objec
1bc90 74 20 2a 2f 0a 20 20 20 20 75 33 32 20 66 6c 61  t */.    u32 fla
1bca0 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  gs;             
1bcb0 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20         /* Flags 
1bcc0 74 68 61 74 20 64 65 73 63 72 69 62 65 20 74 68  that describe th
1bcd0 69 73 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 63  is loop */.    c
1bce0 68 61 72 20 2a 7a 4d 73 67 3b 20 20 20 20 20 20  har *zMsg;      
1bcf0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1bd00 54 65 78 74 20 74 6f 20 61 64 64 20 74 6f 20 45  Text to add to E
1bd10 51 50 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 20  QP output */.   
1bd20 20 53 74 72 41 63 63 75 6d 20 73 74 72 3b 20 20   StrAccum str;  
1bd30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1bd40 2a 20 45 51 50 20 6f 75 74 70 75 74 20 73 74 72  * EQP output str
1bd50 69 6e 67 20 2a 2f 0a 20 20 20 20 63 68 61 72 20  ing */.    char 
1bd60 7a 42 75 66 5b 31 30 30 5d 3b 20 20 20 20 20 20  zBuf[100];      
1bd70 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74           /* Init
1bd80 69 61 6c 20 73 70 61 63 65 20 66 6f 72 20 45 51  ial space for EQ
1bd90 50 20 6f 75 74 70 75 74 20 73 74 72 69 6e 67 20  P output string 
1bda0 2a 2f 0a 0a 20 20 20 20 70 4c 6f 6f 70 20 3d 20  */..    pLoop = 
1bdb0 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a  pLevel->pWLoop;.
1bdc0 20 20 20 20 66 6c 61 67 73 20 3d 20 70 4c 6f 6f      flags = pLoo
1bdd0 70 2d 3e 77 73 46 6c 61 67 73 3b 0a 20 20 20 20  p->wsFlags;.    
1bde0 69 66 28 20 28 66 6c 61 67 73 26 57 48 45 52 45  if( (flags&WHERE
1bdf0 5f 4d 55 4c 54 49 5f 4f 52 29 20 7c 7c 20 28 77  _MULTI_OR) || (w
1be00 63 74 72 6c 46 6c 61 67 73 26 57 48 45 52 45 5f  ctrlFlags&WHERE_
1be10 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 29 20 29  ONETABLE_ONLY) )
1be20 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 20 20   return 0;..    
1be30 69 73 53 65 61 72 63 68 20 3d 20 28 66 6c 61 67  isSearch = (flag
1be40 73 26 28 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d  s&(WHERE_BTM_LIM
1be50 49 54 7c 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d  IT|WHERE_TOP_LIM
1be60 49 54 29 29 21 3d 30 0a 20 20 20 20 20 20 20 20  IT))!=0.        
1be70 20 20 20 20 7c 7c 20 28 28 66 6c 61 67 73 26 57      || ((flags&W
1be80 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c  HERE_VIRTUALTABL
1be90 45 29 3d 3d 30 20 26 26 20 28 70 4c 6f 6f 70 2d  E)==0 && (pLoop-
1bea0 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3e 30 29 29  >u.btree.nEq>0))
1beb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
1bec0 28 77 63 74 72 6c 46 6c 61 67 73 26 28 57 48 45  (wctrlFlags&(WHE
1bed0 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 7c 57  RE_ORDERBY_MIN|W
1bee0 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 41 58  HERE_ORDERBY_MAX
1bef0 29 29 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33  ));..    sqlite3
1bf00 53 74 72 41 63 63 75 6d 49 6e 69 74 28 26 73 74  StrAccumInit(&st
1bf10 72 2c 20 7a 42 75 66 2c 20 73 69 7a 65 6f 66 28  r, zBuf, sizeof(
1bf20 7a 42 75 66 29 2c 20 53 51 4c 49 54 45 5f 4d 41  zBuf), SQLITE_MA
1bf30 58 5f 4c 45 4e 47 54 48 29 3b 0a 20 20 20 20 73  X_LENGTH);.    s
1bf40 74 72 2e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20  tr.db = db;.    
1bf50 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41  sqlite3StrAccumA
1bf60 70 70 65 6e 64 41 6c 6c 28 26 73 74 72 2c 20 69  ppendAll(&str, i
1bf70 73 53 65 61 72 63 68 20 3f 20 22 53 45 41 52 43  sSearch ? "SEARC
1bf80 48 22 20 3a 20 22 53 43 41 4e 22 29 3b 0a 20 20  H" : "SCAN");.  
1bf90 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 53 65    if( pItem->pSe
1bfa0 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 73 71  lect ){.      sq
1bfb0 6c 69 74 65 33 58 50 72 69 6e 74 66 28 26 73 74  lite3XPrintf(&st
1bfc0 72 2c 20 30 2c 20 22 20 53 55 42 51 55 45 52 59  r, 0, " SUBQUERY
1bfd0 20 25 64 22 2c 20 70 49 74 65 6d 2d 3e 69 53 65   %d", pItem->iSe
1bfe0 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 7d 65 6c  lectId);.    }el
1bff0 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
1c000 33 58 50 72 69 6e 74 66 28 26 73 74 72 2c 20 30  3XPrintf(&str, 0
1c010 2c 20 22 20 54 41 42 4c 45 20 25 73 22 2c 20 70  , " TABLE %s", p
1c020 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Item->zName);.  
1c030 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 49 74    }..    if( pIt
1c040 65 6d 2d 3e 7a 41 6c 69 61 73 20 29 7b 0a 20 20  em->zAlias ){.  
1c050 20 20 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e      sqlite3XPrin
1c060 74 66 28 26 73 74 72 2c 20 30 2c 20 22 20 41 53  tf(&str, 0, " AS
1c070 20 25 73 22 2c 20 70 49 74 65 6d 2d 3e 7a 41 6c   %s", pItem->zAl
1c080 69 61 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ias);.    }.    
1c090 69 66 28 20 28 66 6c 61 67 73 20 26 20 28 57 48  if( (flags & (WH
1c0a0 45 52 45 5f 49 50 4b 7c 57 48 45 52 45 5f 56 49  ERE_IPK|WHERE_VI
1c0b0 52 54 55 41 4c 54 41 42 4c 45 29 29 3d 3d 30 20  RTUALTABLE))==0 
1c0c0 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  ){.      const c
1c0d0 68 61 72 20 2a 7a 46 6d 74 20 3d 20 30 3b 0a 20  har *zFmt = 0;. 
1c0e0 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78       Index *pIdx
1c0f0 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ;..      assert(
1c100 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
1c110 70 49 6e 64 65 78 21 3d 30 20 29 3b 0a 20 20 20  pIndex!=0 );.   
1c120 20 20 20 70 49 64 78 20 3d 20 70 4c 6f 6f 70 2d     pIdx = pLoop-
1c130 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b  >u.btree.pIndex;
1c140 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
1c150 28 66 6c 61 67 73 26 57 48 45 52 45 5f 41 55 54  (flags&WHERE_AUT
1c160 4f 5f 49 4e 44 45 58 29 20 7c 7c 20 28 66 6c 61  O_INDEX) || (fla
1c170 67 73 26 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c  gs&WHERE_IDX_ONL
1c180 59 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Y) );.      if( 
1c190 21 48 61 73 52 6f 77 69 64 28 70 49 74 65 6d 2d  !HasRowid(pItem-
1c1a0 3e 70 54 61 62 29 20 26 26 20 49 73 50 72 69 6d  >pTab) && IsPrim
1c1b0 61 72 79 4b 65 79 49 6e 64 65 78 28 70 49 64 78  aryKeyIndex(pIdx
1c1c0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ) ){.        if(
1c1d0 20 69 73 53 65 61 72 63 68 20 29 7b 0a 20 20 20   isSearch ){.   
1c1e0 20 20 20 20 20 20 20 7a 46 6d 74 20 3d 20 22 50         zFmt = "P
1c1f0 52 49 4d 41 52 59 20 4b 45 59 22 3b 0a 20 20 20  RIMARY KEY";.   
1c200 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
1c210 73 65 20 69 66 28 20 66 6c 61 67 73 20 26 20 57  se if( flags & W
1c220 48 45 52 45 5f 50 41 52 54 49 41 4c 49 44 58 20  HERE_PARTIALIDX 
1c230 29 7b 0a 20 20 20 20 20 20 20 20 7a 46 6d 74 20  ){.        zFmt 
1c240 3d 20 22 41 55 54 4f 4d 41 54 49 43 20 50 41 52  = "AUTOMATIC PAR
1c250 54 49 41 4c 20 43 4f 56 45 52 49 4e 47 20 49 4e  TIAL COVERING IN
1c260 44 45 58 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73  DEX";.      }els
1c270 65 20 69 66 28 20 66 6c 61 67 73 20 26 20 57 48  e if( flags & WH
1c280 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 20 29  ERE_AUTO_INDEX )
1c290 7b 0a 20 20 20 20 20 20 20 20 7a 46 6d 74 20 3d  {.        zFmt =
1c2a0 20 22 41 55 54 4f 4d 41 54 49 43 20 43 4f 56 45   "AUTOMATIC COVE
1c2b0 52 49 4e 47 20 49 4e 44 45 58 22 3b 0a 20 20 20  RING INDEX";.   
1c2c0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61     }else if( fla
1c2d0 67 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f  gs & WHERE_IDX_O
1c2e0 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  NLY ){.        z
1c2f0 46 6d 74 20 3d 20 22 43 4f 56 45 52 49 4e 47 20  Fmt = "COVERING 
1c300 49 4e 44 45 58 20 25 73 22 3b 0a 20 20 20 20 20  INDEX %s";.     
1c310 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1c320 7a 46 6d 74 20 3d 20 22 49 4e 44 45 58 20 25 73  zFmt = "INDEX %s
1c330 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  ";.      }.     
1c340 20 69 66 28 20 7a 46 6d 74 20 29 7b 0a 20 20 20   if( zFmt ){.   
1c350 20 20 20 20 20 73 71 6c 69 74 65 33 53 74 72 41       sqlite3StrA
1c360 63 63 75 6d 41 70 70 65 6e 64 28 26 73 74 72 2c  ccumAppend(&str,
1c370 20 22 20 55 53 49 4e 47 20 22 2c 20 37 29 3b 0a   " USING ", 7);.
1c380 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 58          sqlite3X
1c390 50 72 69 6e 74 66 28 26 73 74 72 2c 20 30 2c 20  Printf(&str, 0, 
1c3a0 7a 46 6d 74 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d  zFmt, pIdx->zNam
1c3b0 65 29 3b 0a 20 20 20 20 20 20 20 20 65 78 70 6c  e);.        expl
1c3c0 61 69 6e 49 6e 64 65 78 52 61 6e 67 65 28 26 73  ainIndexRange(&s
1c3d0 74 72 2c 20 70 4c 6f 6f 70 2c 20 70 49 74 65 6d  tr, pLoop, pItem
1c3e0 2d 3e 70 54 61 62 29 3b 0a 20 20 20 20 20 20 7d  ->pTab);.      }
1c3f0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28  .    }else if( (
1c400 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 50  flags & WHERE_IP
1c410 4b 29 21 3d 30 20 26 26 20 28 66 6c 61 67 73 20  K)!=0 && (flags 
1c420 26 20 57 48 45 52 45 5f 43 4f 4e 53 54 52 41 49  & WHERE_CONSTRAI
1c430 4e 54 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  NT)!=0 ){.      
1c440 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52 61 6e  const char *zRan
1c450 67 65 3b 0a 20 20 20 20 20 20 69 66 28 20 66 6c  ge;.      if( fl
1c460 61 67 73 26 28 57 48 45 52 45 5f 43 4f 4c 55 4d  ags&(WHERE_COLUM
1c470 4e 5f 45 51 7c 57 48 45 52 45 5f 43 4f 4c 55 4d  N_EQ|WHERE_COLUM
1c480 4e 5f 49 4e 29 20 29 7b 0a 20 20 20 20 20 20 20  N_IN) ){.       
1c490 20 7a 52 61 6e 67 65 20 3d 20 22 28 72 6f 77 69   zRange = "(rowi
1c4a0 64 3d 3f 29 22 3b 0a 20 20 20 20 20 20 7d 65 6c  d=?)";.      }el
1c4b0 73 65 20 69 66 28 20 28 66 6c 61 67 73 26 57 48  se if( (flags&WH
1c4c0 45 52 45 5f 42 4f 54 48 5f 4c 49 4d 49 54 29 3d  ERE_BOTH_LIMIT)=
1c4d0 3d 57 48 45 52 45 5f 42 4f 54 48 5f 4c 49 4d 49  =WHERE_BOTH_LIMI
1c4e0 54 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 52 61  T ){.        zRa
1c4f0 6e 67 65 20 3d 20 22 28 72 6f 77 69 64 3e 3f 20  nge = "(rowid>? 
1c500 41 4e 44 20 72 6f 77 69 64 3c 3f 29 22 3b 0a 20  AND rowid<?)";. 
1c510 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 66       }else if( f
1c520 6c 61 67 73 26 57 48 45 52 45 5f 42 54 4d 5f 4c  lags&WHERE_BTM_L
1c530 49 4d 49 54 20 29 7b 0a 20 20 20 20 20 20 20 20  IMIT ){.        
1c540 7a 52 61 6e 67 65 20 3d 20 22 28 72 6f 77 69 64  zRange = "(rowid
1c550 3e 3f 29 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73  >?)";.      }els
1c560 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  e{.        asser
1c570 74 28 20 66 6c 61 67 73 26 57 48 45 52 45 5f 54  t( flags&WHERE_T
1c580 4f 50 5f 4c 49 4d 49 54 29 3b 0a 20 20 20 20 20  OP_LIMIT);.     
1c590 20 20 20 7a 52 61 6e 67 65 20 3d 20 22 28 72 6f     zRange = "(ro
1c5a0 77 69 64 3c 3f 29 22 3b 0a 20 20 20 20 20 20 7d  wid<?)";.      }
1c5b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 74  .      sqlite3St
1c5c0 72 41 63 63 75 6d 41 70 70 65 6e 64 41 6c 6c 28  rAccumAppendAll(
1c5d0 26 73 74 72 2c 20 22 20 55 53 49 4e 47 20 49 4e  &str, " USING IN
1c5e0 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
1c5f0 59 20 22 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Y ");.      sqli
1c600 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e  te3StrAccumAppen
1c610 64 41 6c 6c 28 26 73 74 72 2c 20 7a 52 61 6e 67  dAll(&str, zRang
1c620 65 29 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  e);.    }.#ifnde
1c630 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
1c640 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 65  RTUALTABLE.    e
1c650 6c 73 65 20 69 66 28 20 28 66 6c 61 67 73 20 26  lse if( (flags &
1c660 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41   WHERE_VIRTUALTA
1c670 42 4c 45 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  BLE)!=0 ){.     
1c680 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28   sqlite3XPrintf(
1c690 26 73 74 72 2c 20 30 2c 20 22 20 56 49 52 54 55  &str, 0, " VIRTU
1c6a0 41 4c 20 54 41 42 4c 45 20 49 4e 44 45 58 20 25  AL TABLE INDEX %
1c6b0 64 3a 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20  d:%s",.         
1c6c0 20 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e           pLoop->
1c6d0 75 2e 76 74 61 62 2e 69 64 78 4e 75 6d 2c 20 70  u.vtab.idxNum, p
1c6e0 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78  Loop->u.vtab.idx
1c6f0 53 74 72 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  Str);.    }.#end
1c700 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  if.#ifdef SQLITE
1c710 5f 45 58 50 4c 41 49 4e 5f 45 53 54 49 4d 41 54  _EXPLAIN_ESTIMAT
1c720 45 44 5f 52 4f 57 53 0a 20 20 20 20 69 66 28 20  ED_ROWS.    if( 
1c730 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 3e 3d 31 30 20  pLoop->nOut>=10 
1c740 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1c750 58 50 72 69 6e 74 66 28 26 73 74 72 2c 20 30 2c  XPrintf(&str, 0,
1c760 20 22 20 28 7e 25 6c 6c 75 20 72 6f 77 73 29 22   " (~%llu rows)"
1c770 2c 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 54  , sqlite3LogEstT
1c780 6f 49 6e 74 28 70 4c 6f 6f 70 2d 3e 6e 4f 75 74  oInt(pLoop->nOut
1c790 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ));.    }else{. 
1c7a0 20 20 20 20 20 73 71 6c 69 74 65 33 53 74 72 41       sqlite3StrA
1c7b0 63 63 75 6d 41 70 70 65 6e 64 28 26 73 74 72 2c  ccumAppend(&str,
1c7c0 20 22 20 28 7e 31 20 72 6f 77 29 22 2c 20 39 29   " (~1 row)", 9)
1c7d0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
1c7e0 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65     zMsg = sqlite
1c7f0 33 53 74 72 41 63 63 75 6d 46 69 6e 69 73 68 28  3StrAccumFinish(
1c800 26 73 74 72 29 3b 0a 20 20 20 20 72 65 74 20 3d  &str);.    ret =
1c810 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1c820 70 34 28 76 2c 20 4f 50 5f 45 78 70 6c 61 69 6e  p4(v, OP_Explain
1c830 2c 20 69 49 64 2c 20 69 4c 65 76 65 6c 2c 20 69  , iId, iLevel, i
1c840 46 72 6f 6d 2c 20 7a 4d 73 67 2c 50 34 5f 44 59  From, zMsg,P4_DY
1c850 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 20 20 72 65  NAMIC);.  }.  re
1c860 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 23 65 6c 73  turn ret;.}.#els
1c870 65 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61  e.# define expla
1c880 69 6e 4f 6e 65 53 63 61 6e 28 75 2c 76 2c 77 2c  inOneScan(u,v,w,
1c890 78 2c 79 2c 7a 29 20 30 0a 23 65 6e 64 69 66 20  x,y,z) 0.#endif 
1c8a0 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  /* SQLITE_OMIT_E
1c8b0 58 50 4c 41 49 4e 20 2a 2f 0a 0a 23 69 66 64 65  XPLAIN */..#ifde
1c8c0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
1c8d0 53 54 4d 54 5f 53 43 41 4e 53 54 41 54 55 53 0a  STMT_SCANSTATUS.
1c8e0 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 65 20  /*.** Configure 
1c8f0 74 68 65 20 56 4d 20 70 61 73 73 65 64 20 61 73  the VM passed as
1c900 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
1c910 65 6e 74 20 77 69 74 68 20 61 6e 0a 2a 2a 20 73  ent with an.** s
1c920 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63 61 6e  qlite3_stmt_scan
1c930 73 74 61 74 75 73 28 29 20 65 6e 74 72 79 20 63  status() entry c
1c940 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
1c950 74 68 65 20 73 63 61 6e 20 75 73 65 64 20 74 6f  the scan used to
1c960 20 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 6c   .** implement l
1c970 65 76 65 6c 20 70 4c 76 6c 2e 20 41 72 67 75 6d  evel pLvl. Argum
1c980 65 6e 74 20 70 53 72 63 6c 69 73 74 20 69 73 20  ent pSrclist is 
1c990 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
1c9a0 20 46 52 4f 4d 20 0a 2a 2a 20 63 6c 61 75 73 65   FROM .** clause
1c9b0 20 74 68 61 74 20 74 68 65 20 73 63 61 6e 20 72   that the scan r
1c9c0 65 61 64 73 20 64 61 74 61 20 66 72 6f 6d 2e 0a  eads data from..
1c9d0 2a 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e  **.** If argumen
1c9e0 74 20 61 64 64 72 45 78 70 6c 61 69 6e 20 69 73  t addrExplain is
1c9f0 20 6e 6f 74 20 30 2c 20 69 74 20 6d 75 73 74 20   not 0, it must 
1ca00 62 65 20 74 68 65 20 61 64 64 72 65 73 73 20 6f  be the address o
1ca10 66 20 61 6e 20 0a 2a 2a 20 4f 50 5f 45 78 70 6c  f an .** OP_Expl
1ca20 61 69 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ain instruction 
1ca30 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20 74  that describes t
1ca40 68 65 20 73 61 6d 65 20 6c 6f 6f 70 2e 0a 2a 2f  he same loop..*/
1ca50 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 64 64  .static void add
1ca60 53 63 61 6e 53 74 61 74 75 73 28 0a 20 20 56 64  ScanStatus(.  Vd
1ca70 62 65 20 2a 76 2c 20 20 20 20 20 20 20 20 20 20  be *v,          
1ca80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ca90 20 56 64 62 65 20 74 6f 20 61 64 64 20 73 63 61   Vdbe to add sca
1caa0 6e 73 74 61 74 75 73 20 65 6e 74 72 79 20 74 6f  nstatus entry to
1cab0 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
1cac0 53 72 63 6c 69 73 74 2c 20 20 20 20 20 20 20 20  Srclist,        
1cad0 20 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c        /* FROM cl
1cae0 61 75 73 65 20 70 4c 76 6c 20 72 65 61 64 73 20  ause pLvl reads 
1caf0 64 61 74 61 20 66 72 6f 6d 20 2a 2f 0a 20 20 57  data from */.  W
1cb00 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c 2c  hereLevel *pLvl,
1cb10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1cb20 2a 20 4c 65 76 65 6c 20 74 6f 20 61 64 64 20 73  * Level to add s
1cb30 63 61 6e 73 74 61 74 75 73 28 29 20 65 6e 74 72  canstatus() entr
1cb40 79 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 61  y for */.  int a
1cb50 64 64 72 45 78 70 6c 61 69 6e 20 20 20 20 20 20  ddrExplain      
1cb60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
1cb70 64 72 65 73 73 20 6f 66 20 4f 50 5f 45 78 70 6c  dress of OP_Expl
1cb80 61 69 6e 20 28 6f 72 20 30 29 20 2a 2f 0a 29 7b  ain (or 0) */.){
1cb90 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1cba0 4f 62 6a 20 3d 20 30 3b 0a 20 20 57 68 65 72 65  Obj = 0;.  Where
1cbb0 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 20 3d 20 70 4c  Loop *pLoop = pL
1cbc0 76 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 69 66  vl->pWLoop;.  if
1cbd0 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  ( (pLoop->wsFlag
1cbe0 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41  s & WHERE_VIRTUA
1cbf0 4c 54 41 42 4c 45 29 3d 3d 30 20 20 26 26 20 20  LTABLE)==0  &&  
1cc00 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70  pLoop->u.btree.p
1cc10 49 6e 64 65 78 21 3d 30 20 29 7b 0a 20 20 20 20  Index!=0 ){.    
1cc20 7a 4f 62 6a 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e  zObj = pLoop->u.
1cc30 62 74 72 65 65 2e 70 49 6e 64 65 78 2d 3e 7a 4e  btree.pIndex->zN
1cc40 61 6d 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ame;.  }else{.  
1cc50 20 20 7a 4f 62 6a 20 3d 20 70 53 72 63 6c 69 73    zObj = pSrclis
1cc60 74 2d 3e 61 5b 70 4c 76 6c 2d 3e 69 46 72 6f 6d  t->a[pLvl->iFrom
1cc70 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 7d 0a 20 20 73  ].zName;.  }.  s
1cc80 71 6c 69 74 65 33 56 64 62 65 53 63 61 6e 53 74  qlite3VdbeScanSt
1cc90 61 74 75 73 28 0a 20 20 20 20 20 20 76 2c 20 61  atus(.      v, a
1cca0 64 64 72 45 78 70 6c 61 69 6e 2c 20 70 4c 76 6c  ddrExplain, pLvl
1ccb0 2d 3e 61 64 64 72 42 6f 64 79 2c 20 70 4c 76 6c  ->addrBody, pLvl
1ccc0 2d 3e 61 64 64 72 56 69 73 69 74 2c 20 70 4c 6f  ->addrVisit, pLo
1ccd0 6f 70 2d 3e 6e 4f 75 74 2c 20 7a 4f 62 6a 0a 20  op->nOut, zObj. 
1cce0 20 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65   );.}.#else.# de
1ccf0 66 69 6e 65 20 61 64 64 53 63 61 6e 53 74 61 74  fine addScanStat
1cd00 75 73 28 61 2c 20 62 2c 20 63 2c 20 64 29 20 28  us(a, b, c, d) (
1cd10 28 76 6f 69 64 29 64 29 0a 23 65 6e 64 69 66 0a  (void)d).#endif.
1cd20 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6d 6f  ./*.** If the mo
1cd30 73 74 20 72 65 63 65 6e 74 6c 79 20 63 6f 64 65  st recently code
1cd40 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73  d instruction is
1cd50 20 61 20 63 6f 6e 73 74 61 6e 74 20 72 61 6e 67   a constant rang
1cd60 65 20 63 6f 6e 74 72 61 69 6e 74 0a 2a 2a 20 74  e contraint.** t
1cd70 68 61 74 20 6f 72 69 67 69 6e 61 74 65 64 20 66  hat originated f
1cd80 72 6f 6d 20 74 68 65 20 4c 49 4b 45 20 6f 70 74  rom the LIKE opt
1cd90 69 6d 69 7a 61 74 69 6f 6e 2c 20 74 68 65 6e 20  imization, then 
1cda0 63 68 61 6e 67 65 20 74 68 65 20 50 33 20 74 6f  change the P3 to
1cdb0 20 62 65 0a 2a 2a 20 70 4c 6f 6f 70 2d 3e 69 4c   be.** pLoop->iL
1cdc0 69 6b 65 52 65 70 43 6e 74 72 20 61 6e 64 20 73  ikeRepCntr and s
1cdd0 65 74 20 50 35 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  et P5..**.** The
1cde0 20 4c 49 4b 45 20 6f 70 74 69 6d 69 7a 61 74 69   LIKE optimizati
1cdf0 6f 6e 20 74 72 79 73 20 74 6f 20 65 76 61 6c 75  on trys to evalu
1ce00 61 74 65 20 22 78 20 4c 49 4b 45 20 27 61 62 63  ate "x LIKE 'abc
1ce10 25 27 22 20 61 73 20 61 20 72 61 6e 67 65 0a 2a  %'" as a range.*
1ce20 2a 20 65 78 70 72 65 73 73 69 6f 6e 3a 20 22 78  * expression: "x
1ce30 3e 3d 27 41 42 43 27 20 41 4e 44 20 78 3c 27 61  >='ABC' AND x<'a
1ce40 62 64 27 22 2e 20 20 42 75 74 20 74 68 69 73 20  bd'".  But this 
1ce50 72 65 71 75 69 72 65 73 20 74 68 61 74 20 74 68  requires that th
1ce60 65 20 72 61 6e 67 65 0a 2a 2a 20 73 63 61 6e 20  e range.** scan 
1ce70 6c 6f 6f 70 20 72 75 6e 20 74 77 69 63 65 2c 20  loop run twice, 
1ce80 6f 6e 63 65 20 66 6f 72 20 73 74 72 69 6e 67 73  once for strings
1ce90 20 61 6e 64 20 61 20 73 65 63 6f 6e 64 20 74 69   and a second ti
1cea0 6d 65 20 66 6f 72 20 42 4c 4f 42 73 2e 0a 2a 2a  me for BLOBs..**
1ceb0 20 54 68 65 20 4f 50 5f 53 74 72 69 6e 67 20 6f   The OP_String o
1cec0 70 63 6f 64 65 73 20 6f 6e 20 74 68 65 20 73 65  pcodes on the se
1ced0 63 6f 6e 64 20 70 61 73 73 20 63 6f 6e 76 65 72  cond pass conver
1cee0 74 20 74 68 65 20 75 70 70 65 72 20 61 6e 64 20  t the upper and 
1cef0 6c 6f 77 65 72 0a 2a 2a 20 62 6f 75 6e 64 20 73  lower.** bound s
1cf00 74 72 69 6e 67 20 63 6f 6e 74 61 6e 74 73 20 74  tring contants t
1cf10 6f 20 62 6c 6f 62 73 2e 20 20 54 68 69 73 20 72  o blobs.  This r
1cf20 6f 75 74 69 6e 65 20 6d 61 6b 65 73 20 74 68 65  outine makes the
1cf30 20 6e 65 63 65 73 73 61 72 79 20 63 68 61 6e 67   necessary chang
1cf40 65 73 0a 2a 2a 20 74 6f 20 74 68 65 20 4f 50 5f  es.** to the OP_
1cf50 53 74 72 69 6e 67 20 6f 70 63 6f 64 65 73 20 66  String opcodes f
1cf60 6f 72 20 74 68 61 74 20 74 6f 20 68 61 70 70 65  or that to happe
1cf70 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
1cf80 64 20 77 68 65 72 65 4c 69 6b 65 4f 70 74 69 6d  d whereLikeOptim
1cf90 69 7a 61 74 69 6f 6e 53 74 72 69 6e 67 46 69 78  izationStringFix
1cfa0 75 70 28 0a 20 20 56 64 62 65 20 2a 76 2c 20 20  up(.  Vdbe *v,  
1cfb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1cfc0 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
1cfd0 65 6e 74 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  ent under constr
1cfe0 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 57 68 65 72  uction */.  Wher
1cff0 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20  eLevel *pLevel, 
1d000 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 6f 70 20      /* The loop 
1d010 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
1d020 65 20 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72 20  e LIKE operator 
1d030 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  */.  WhereTerm *
1d040 70 54 65 72 6d 20 20 20 20 20 20 20 20 2f 2a 20  pTerm        /* 
1d050 54 68 65 20 75 70 70 65 72 20 6f 72 20 6c 6f 77  The upper or low
1d060 65 72 20 62 6f 75 6e 64 20 6a 75 73 74 20 63 6f  er bound just co
1d070 64 65 64 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  ded */.){.  if( 
1d080 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
1d090 20 54 45 52 4d 5f 4c 49 4b 45 4f 50 54 20 29 7b   TERM_LIKEOPT ){
1d0a0 0a 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70  .    VdbeOp *pOp
1d0b0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c  ;.    assert( pL
1d0c0 65 76 65 6c 2d 3e 69 4c 69 6b 65 52 65 70 43 6e  evel->iLikeRepCn
1d0d0 74 72 3e 30 20 29 3b 0a 20 20 20 20 70 4f 70 20  tr>0 );.    pOp 
1d0e0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74  = sqlite3VdbeGet
1d0f0 4f 70 28 76 2c 20 2d 31 29 3b 0a 20 20 20 20 61  Op(v, -1);.    a
1d100 73 73 65 72 74 28 20 70 4f 70 21 3d 30 20 29 3b  ssert( pOp!=0 );
1d110 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70  .    assert( pOp
1d120 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 53 74 72  ->opcode==OP_Str
1d130 69 6e 67 38 20 0a 20 20 20 20 20 20 20 20 20 20  ing8 .          
1d140 20 20 7c 7c 20 70 54 65 72 6d 2d 3e 70 57 43 2d    || pTerm->pWC-
1d150 3e 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d  >pWInfo->pParse-
1d160 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
1d170 64 20 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 33  d );.    pOp->p3
1d180 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 4c 69 6b 65   = pLevel->iLike
1d190 52 65 70 43 6e 74 72 3b 0a 20 20 20 20 70 4f 70  RepCntr;.    pOp
1d1a0 2d 3e 70 35 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a  ->p5 = 1;.  }.}.
1d1b0 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
1d1c0 63 6f 64 65 20 66 6f 72 20 74 68 65 20 73 74 61  code for the sta
1d1d0 72 74 20 6f 66 20 74 68 65 20 69 4c 65 76 65 6c  rt of the iLevel
1d1e0 2d 74 68 20 6c 6f 6f 70 20 69 6e 20 74 68 65 20  -th loop in the 
1d1f0 57 48 45 52 45 20 63 6c 61 75 73 65 0a 2a 2a 20  WHERE clause.** 
1d200 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 64  implementation d
1d210 65 73 63 72 69 62 65 64 20 62 79 20 70 57 49 6e  escribed by pWIn
1d220 66 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42 69  fo..*/.static Bi
1d230 74 6d 61 73 6b 20 63 6f 64 65 4f 6e 65 4c 6f 6f  tmask codeOneLoo
1d240 70 53 74 61 72 74 28 0a 20 20 57 68 65 72 65 49  pStart(.  WhereI
1d250 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 20 20 20 2f  nfo *pWInfo,   /
1d260 2a 20 43 6f 6d 70 6c 65 74 65 20 69 6e 66 6f 72  * Complete infor
1d270 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65  mation about the
1d280 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
1d290 0a 20 20 69 6e 74 20 69 4c 65 76 65 6c 2c 20 20  .  int iLevel,  
1d2a0 20 20 20 20 20 20 20 20 2f 2a 20 57 68 69 63 68          /* Which
1d2b0 20 6c 65 76 65 6c 20 6f 66 20 70 57 49 6e 66 6f   level of pWInfo
1d2c0 2d 3e 61 5b 5d 20 73 68 6f 75 6c 64 20 62 65 20  ->a[] should be 
1d2d0 63 6f 64 65 64 20 2a 2f 0a 20 20 42 69 74 6d 61  coded */.  Bitma
1d2e0 73 6b 20 6e 6f 74 52 65 61 64 79 20 20 20 20 20  sk notReady     
1d2f0 2f 2a 20 57 68 69 63 68 20 74 61 62 6c 65 73 20  /* Which tables 
1d300 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 61 76  are currently av
1d310 61 69 6c 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20  ailable */.){.  
1d320 69 6e 74 20 6a 2c 20 6b 3b 20 20 20 20 20 20 20  int j, k;       
1d330 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
1d340 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69  nters */.  int i
1d350 43 75 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  Cur;            
1d360 2f 2a 20 54 68 65 20 56 44 42 45 20 63 75 72 73  /* The VDBE curs
1d370 6f 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  or for the table
1d380 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 4e 78   */.  int addrNx
1d390 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68  t;         /* Wh
1d3a0 65 72 65 20 74 6f 20 6a 75 6d 70 20 74 6f 20 63  ere to jump to c
1d3b0 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 74 68 65  ontinue with the
1d3c0 20 6e 65 78 74 20 49 4e 20 63 61 73 65 20 2a 2f   next IN case */
1d3d0 0a 20 20 69 6e 74 20 6f 6d 69 74 54 61 62 6c 65  .  int omitTable
1d3e0 3b 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20  ;       /* True 
1d3f0 69 66 20 77 65 20 75 73 65 20 74 68 65 20 69 6e  if we use the in
1d400 64 65 78 20 6f 6e 6c 79 20 2a 2f 0a 20 20 69 6e  dex only */.  in
1d410 74 20 62 52 65 76 3b 20 20 20 20 20 20 20 20 20  t bRev;         
1d420 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 77 65     /* True if we
1d430 20 6e 65 65 64 20 74 6f 20 73 63 61 6e 20 69 6e   need to scan in
1d440 20 72 65 76 65 72 73 65 20 6f 72 64 65 72 20 2a   reverse order *
1d450 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a  /.  WhereLevel *
1d460 70 4c 65 76 65 6c 3b 20 20 2f 2a 20 54 68 65 20  pLevel;  /* The 
1d470 77 68 65 72 65 20 6c 65 76 65 6c 20 74 6f 20 62  where level to b
1d480 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 57 68 65  e coded */.  Whe
1d490 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20  reLoop *pLoop;  
1d4a0 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65 4c 6f    /* The WhereLo
1d4b0 6f 70 20 6f 62 6a 65 63 74 20 62 65 69 6e 67 20  op object being 
1d4c0 63 6f 64 65 64 20 2a 2f 0a 20 20 57 68 65 72 65  coded */.  Where
1d4d0 43 6c 61 75 73 65 20 2a 70 57 43 3b 20 20 20 20  Clause *pWC;    
1d4e0 2f 2a 20 44 65 63 6f 6d 70 6f 73 69 74 69 6f 6e  /* Decomposition
1d4f0 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20 57   of the entire W
1d500 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
1d510 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
1d520 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
1d530 20 2f 2a 20 41 20 57 48 45 52 45 20 63 6c 61 75   /* A WHERE clau
1d540 73 65 20 74 65 72 6d 20 2a 2f 0a 20 20 50 61 72  se term */.  Par
1d550 73 65 20 2a 70 50 61 72 73 65 3b 20 20 20 20 20  se *pParse;     
1d560 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1d570 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
1d580 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
1d590 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1d5a0 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
1d5b0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
1d5c0 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20   Vdbe *v;       
1d5d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d5e0 20 2f 2a 20 54 68 65 20 70 72 65 70 61 72 65 64   /* The prepared
1d5f0 20 73 74 6d 74 20 75 6e 64 65 72 20 63 6f 6e 73   stmt under cons
1d600 74 72 75 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 73  tructions */.  s
1d610 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
1d620 65 6d 20 2a 70 54 61 62 49 74 65 6d 3b 20 20 2f  em *pTabItem;  /
1d630 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65  * FROM clause te
1d640 72 6d 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a  rm being coded *
1d650 2f 0a 20 20 69 6e 74 20 61 64 64 72 42 72 6b 3b  /.  int addrBrk;
1d660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d670 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65      /* Jump here
1d680 20 74 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f 66   to break out of
1d690 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69   the loop */.  i
1d6a0 6e 74 20 61 64 64 72 43 6f 6e 74 3b 20 20 20 20  nt addrCont;    
1d6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1d6c0 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 63  * Jump here to c
1d6d0 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 6e 65 78  ontinue with nex
1d6e0 74 20 63 79 63 6c 65 20 2a 2f 0a 20 20 69 6e 74  t cycle */.  int
1d6f0 20 69 52 6f 77 69 64 52 65 67 20 3d 20 30 3b 20   iRowidReg = 0; 
1d700 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 20         /* Rowid 
1d710 69 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 69  is stored in thi
1d720 73 20 72 65 67 69 73 74 65 72 2c 20 69 66 20 6e  s register, if n
1d730 6f 74 20 7a 65 72 6f 20 2a 2f 0a 20 20 69 6e 74  ot zero */.  int
1d740 20 69 52 65 6c 65 61 73 65 52 65 67 20 3d 20 30   iReleaseReg = 0
1d750 3b 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 72  ;      /* Temp r
1d760 65 67 69 73 74 65 72 20 74 6f 20 66 72 65 65 20  egister to free 
1d770 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
1d780 20 2a 2f 0a 0a 20 20 70 50 61 72 73 65 20 3d 20   */..  pParse = 
1d790 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a  pWInfo->pParse;.
1d7a0 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56    v = pParse->pV
1d7b0 64 62 65 3b 0a 20 20 70 57 43 20 3d 20 26 70 57  dbe;.  pWC = &pW
1d7c0 49 6e 66 6f 2d 3e 73 57 43 3b 0a 20 20 64 62 20  Info->sWC;.  db 
1d7d0 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
1d7e0 70 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f  pLevel = &pWInfo
1d7f0 2d 3e 61 5b 69 4c 65 76 65 6c 5d 3b 0a 20 20 70  ->a[iLevel];.  p
1d800 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70  Loop = pLevel->p
1d810 57 4c 6f 6f 70 3b 0a 20 20 70 54 61 62 49 74 65  WLoop;.  pTabIte
1d820 6d 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 70 54 61  m = &pWInfo->pTa
1d830 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d  bList->a[pLevel-
1d840 3e 69 46 72 6f 6d 5d 3b 0a 20 20 69 43 75 72 20  >iFrom];.  iCur 
1d850 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72  = pTabItem->iCur
1d860 73 6f 72 3b 0a 20 20 70 4c 65 76 65 6c 2d 3e 6e  sor;.  pLevel->n
1d870 6f 74 52 65 61 64 79 20 3d 20 6e 6f 74 52 65 61  otReady = notRea
1d880 64 79 20 26 20 7e 67 65 74 4d 61 73 6b 28 26 70  dy & ~getMask(&p
1d890 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c  WInfo->sMaskSet,
1d8a0 20 69 43 75 72 29 3b 0a 20 20 62 52 65 76 20 3d   iCur);.  bRev =
1d8b0 20 28 70 57 49 6e 66 6f 2d 3e 72 65 76 4d 61 73   (pWInfo->revMas
1d8c0 6b 3e 3e 69 4c 65 76 65 6c 29 26 31 3b 0a 20 20  k>>iLevel)&1;.  
1d8d0 6f 6d 69 74 54 61 62 6c 65 20 3d 20 28 70 4c 6f  omitTable = (pLo
1d8e0 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
1d8f0 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 21 3d 30  ERE_IDX_ONLY)!=0
1d900 20 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20   .           && 
1d910 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c  (pWInfo->wctrlFl
1d920 61 67 73 20 26 20 57 48 45 52 45 5f 46 4f 52 43  ags & WHERE_FORC
1d930 45 5f 54 41 42 4c 45 29 3d 3d 30 3b 0a 20 20 56  E_TABLE)==0;.  V
1d940 64 62 65 4d 6f 64 75 6c 65 43 6f 6d 6d 65 6e 74  dbeModuleComment
1d950 28 28 76 2c 20 22 42 65 67 69 6e 20 57 48 45 52  ((v, "Begin WHER
1d960 45 2d 6c 6f 6f 70 25 64 3a 20 25 73 22 2c 69 4c  E-loop%d: %s",iL
1d970 65 76 65 6c 2c 70 54 61 62 49 74 65 6d 2d 3e 70  evel,pTabItem->p
1d980 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 0a 20  Tab->zName));.. 
1d990 20 2f 2a 20 43 72 65 61 74 65 20 6c 61 62 65 6c   /* Create label
1d9a0 73 20 66 6f 72 20 74 68 65 20 22 62 72 65 61 6b  s for the "break
1d9b0 22 20 61 6e 64 20 22 63 6f 6e 74 69 6e 75 65 22  " and "continue"
1d9c0 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 0a 20 20   instructions.  
1d9d0 2a 2a 20 66 6f 72 20 74 68 65 20 63 75 72 72 65  ** for the curre
1d9e0 6e 74 20 6c 6f 6f 70 2e 20 20 4a 75 6d 70 20 74  nt loop.  Jump t
1d9f0 6f 20 61 64 64 72 42 72 6b 20 74 6f 20 62 72 65  o addrBrk to bre
1da00 61 6b 20 6f 75 74 20 6f 66 20 61 20 6c 6f 6f 70  ak out of a loop
1da10 2e 0a 20 20 2a 2a 20 4a 75 6d 70 20 74 6f 20 63  ..  ** Jump to c
1da20 6f 6e 74 20 74 6f 20 67 6f 20 69 6d 6d 65 64 69  ont to go immedi
1da30 61 74 65 6c 79 20 74 6f 20 74 68 65 20 6e 65 78  ately to the nex
1da40 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74  t iteration of t
1da50 68 65 0a 20 20 2a 2a 20 6c 6f 6f 70 2e 0a 20 20  he.  ** loop..  
1da60 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 74 68 65  **.  ** When the
1da70 72 65 20 69 73 20 61 6e 20 49 4e 20 6f 70 65 72  re is an IN oper
1da80 61 74 6f 72 2c 20 77 65 20 61 6c 73 6f 20 68 61  ator, we also ha
1da90 76 65 20 61 20 22 61 64 64 72 4e 78 74 22 20 6c  ve a "addrNxt" l
1daa0 61 62 65 6c 20 74 68 61 74 0a 20 20 2a 2a 20 6d  abel that.  ** m
1dab0 65 61 6e 73 20 74 6f 20 63 6f 6e 74 69 6e 75 65  eans to continue
1dac0 20 77 69 74 68 20 74 68 65 20 6e 65 78 74 20 49   with the next I
1dad0 4e 20 76 61 6c 75 65 20 63 6f 6d 62 69 6e 61 74  N value combinat
1dae0 69 6f 6e 2e 20 20 57 68 65 6e 0a 20 20 2a 2a 20  ion.  When.  ** 
1daf0 74 68 65 72 65 20 61 72 65 20 6e 6f 20 49 4e 20  there are no IN 
1db00 6f 70 65 72 61 74 6f 72 73 20 69 6e 20 74 68 65  operators in the
1db10 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20 74 68   constraints, th
1db20 65 20 22 61 64 64 72 4e 78 74 22 20 6c 61 62 65  e "addrNxt" labe
1db30 6c 0a 20 20 2a 2a 20 69 73 20 74 68 65 20 73 61  l.  ** is the sa
1db40 6d 65 20 61 73 20 22 61 64 64 72 42 72 6b 22 2e  me as "addrBrk".
1db50 0a 20 20 2a 2f 0a 20 20 61 64 64 72 42 72 6b 20  .  */.  addrBrk 
1db60 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72  = pLevel->addrBr
1db70 6b 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72  k = pLevel->addr
1db80 4e 78 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Nxt = sqlite3Vdb
1db90 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
1dba0 20 61 64 64 72 43 6f 6e 74 20 3d 20 70 4c 65 76   addrCont = pLev
1dbb0 65 6c 2d 3e 61 64 64 72 43 6f 6e 74 20 3d 20 73  el->addrCont = s
1dbc0 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
1dbd0 62 65 6c 28 76 29 3b 0a 0a 20 20 2f 2a 20 49 66  bel(v);..  /* If
1dbe0 20 74 68 69 73 20 69 73 20 74 68 65 20 72 69 67   this is the rig
1dbf0 68 74 20 74 61 62 6c 65 20 6f 66 20 61 20 4c 45  ht table of a LE
1dc00 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 2c 20 61  FT OUTER JOIN, a
1dc10 6c 6c 6f 63 61 74 65 20 61 6e 64 0a 20 20 2a 2a  llocate and.  **
1dc20 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 20 6d 65   initialize a me
1dc30 6d 6f 72 79 20 63 65 6c 6c 20 74 68 61 74 20 72  mory cell that r
1dc40 65 63 6f 72 64 73 20 69 66 20 74 68 69 73 20 74  ecords if this t
1dc50 61 62 6c 65 20 6d 61 74 63 68 65 73 20 61 6e 79  able matches any
1dc60 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20 74 68 65  .  ** row of the
1dc70 20 6c 65 66 74 20 74 61 62 6c 65 20 6f 66 20 74   left table of t
1dc80 68 65 20 6a 6f 69 6e 2e 0a 20 20 2a 2f 0a 20 20  he join..  */.  
1dc90 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f  if( pLevel->iFro
1dca0 6d 3e 30 20 26 26 20 28 70 54 61 62 49 74 65 6d  m>0 && (pTabItem
1dcb0 5b 30 5d 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a  [0].jointype & J
1dcc0 54 5f 4c 45 46 54 29 21 3d 30 20 29 7b 0a 20 20  T_LEFT)!=0 ){.  
1dcd0 20 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a    pLevel->iLeftJ
1dce0 6f 69 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  oin = ++pParse->
1dcf0 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65  nMem;.    sqlite
1dd00 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1dd10 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 70 4c  P_Integer, 0, pL
1dd20 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29  evel->iLeftJoin)
1dd30 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e  ;.    VdbeCommen
1dd40 74 28 28 76 2c 20 22 69 6e 69 74 20 4c 45 46 54  t((v, "init LEFT
1dd50 20 4a 4f 49 4e 20 6e 6f 2d 6d 61 74 63 68 20 66   JOIN no-match f
1dd60 6c 61 67 22 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f  lag"));.  }..  /
1dd70 2a 20 53 70 65 63 69 61 6c 20 63 61 73 65 20 6f  * Special case o
1dd80 66 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  f a FROM clause 
1dd90 73 75 62 71 75 65 72 79 20 69 6d 70 6c 65 6d 65  subquery impleme
1dda0 6e 74 65 64 20 61 73 20 61 20 63 6f 2d 72 6f 75  nted as a co-rou
1ddb0 74 69 6e 65 20 2a 2f 0a 20 20 69 66 28 20 70 54  tine */.  if( pT
1ddc0 61 62 49 74 65 6d 2d 3e 76 69 61 43 6f 72 6f 75  abItem->viaCorou
1ddd0 74 69 6e 65 20 29 7b 0a 20 20 20 20 69 6e 74 20  tine ){.    int 
1dde0 72 65 67 59 69 65 6c 64 20 3d 20 70 54 61 62 49  regYield = pTabI
1ddf0 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 3b 0a  tem->regReturn;.
1de00 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1de10 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 69 74  ddOp3(v, OP_Init
1de20 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 59 69  Coroutine, regYi
1de30 65 6c 64 2c 20 30 2c 20 70 54 61 62 49 74 65 6d  eld, 0, pTabItem
1de40 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 29 3b 0a  ->addrFillSub);.
1de50 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d      pLevel->p2 =
1de60 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1de70 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c  Op2(v, OP_Yield,
1de80 20 72 65 67 59 69 65 6c 64 2c 20 61 64 64 72 42   regYield, addrB
1de90 72 6b 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76  rk);.    VdbeCov
1dea0 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 56 64  erage(v);.    Vd
1deb0 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6e  beComment((v, "n
1dec0 65 78 74 20 72 6f 77 20 6f 66 20 5c 22 25 73 5c  ext row of \"%s\
1ded0 22 22 2c 20 70 54 61 62 49 74 65 6d 2d 3e 70 54  "", pTabItem->pT
1dee0 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20  ab->zName));.   
1def0 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50   pLevel->op = OP
1df00 5f 47 6f 74 6f 3b 0a 20 20 7d 65 6c 73 65 0a 0a  _Goto;.  }else..
1df10 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1df20 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
1df30 0a 20 20 69 66 28 20 20 28 70 4c 6f 6f 70 2d 3e  .  if(  (pLoop->
1df40 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
1df50 56 49 52 54 55 41 4c 54 41 42 4c 45 29 21 3d 30  VIRTUALTABLE)!=0
1df60 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20   ){.    /* Case 
1df70 31 3a 20 20 54 68 65 20 74 61 62 6c 65 20 69 73  1:  The table is
1df80 20 61 20 76 69 72 74 75 61 6c 2d 74 61 62 6c 65   a virtual-table
1df90 2e 20 20 55 73 65 20 74 68 65 20 56 46 69 6c 74  .  Use the VFilt
1dfa0 65 72 20 61 6e 64 20 56 4e 65 78 74 0a 20 20 20  er and VNext.   
1dfb0 20 2a 2a 20 20 20 20 20 20 20 20 20 20 74 6f 20   **          to 
1dfc0 61 63 63 65 73 73 20 74 68 65 20 64 61 74 61 2e  access the data.
1dfd0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20  .    */.    int 
1dfe0 69 52 65 67 3b 20 20 20 2f 2a 20 50 33 20 56 61  iReg;   /* P3 Va
1dff0 6c 75 65 20 66 6f 72 20 4f 50 5f 56 46 69 6c 74  lue for OP_VFilt
1e000 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64  er */.    int ad
1e010 64 72 4e 6f 74 46 6f 75 6e 64 3b 0a 20 20 20 20  drNotFound;.    
1e020 69 6e 74 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20  int nConstraint 
1e030 3d 20 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 3b  = pLoop->nLTerm;
1e040 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ..    sqlite3Exp
1e050 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73  rCachePush(pPars
1e060 65 29 3b 0a 20 20 20 20 69 52 65 67 20 3d 20 73  e);.    iReg = s
1e070 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e  qlite3GetTempRan
1e080 67 65 28 70 50 61 72 73 65 2c 20 6e 43 6f 6e 73  ge(pParse, nCons
1e090 74 72 61 69 6e 74 2b 32 29 3b 0a 20 20 20 20 61  traint+2);.    a
1e0a0 64 64 72 4e 6f 74 46 6f 75 6e 64 20 3d 20 70 4c  ddrNotFound = pL
1e0b0 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b 3b 0a 20  evel->addrBrk;. 
1e0c0 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 43     for(j=0; j<nC
1e0d0 6f 6e 73 74 72 61 69 6e 74 3b 20 6a 2b 2b 29 7b  onstraint; j++){
1e0e0 0a 20 20 20 20 20 20 69 6e 74 20 69 54 61 72 67  .      int iTarg
1e0f0 65 74 20 3d 20 69 52 65 67 2b 6a 2b 32 3b 0a 20  et = iReg+j+2;. 
1e100 20 20 20 20 20 70 54 65 72 6d 20 3d 20 70 4c 6f       pTerm = pLo
1e110 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 3b 0a 20  op->aLTerm[j];. 
1e120 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 3d 3d       if( pTerm==
1e130 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
1e140 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65      if( pTerm->e
1e150 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e  Operator & WO_IN
1e160 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65   ){.        code
1e170 45 71 75 61 6c 69 74 79 54 65 72 6d 28 70 50 61  EqualityTerm(pPa
1e180 72 73 65 2c 20 70 54 65 72 6d 2c 20 70 4c 65 76  rse, pTerm, pLev
1e190 65 6c 2c 20 6a 2c 20 62 52 65 76 2c 20 69 54 61  el, j, bRev, iTa
1e1a0 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 61  rget);.        a
1e1b0 64 64 72 4e 6f 74 46 6f 75 6e 64 20 3d 20 70 4c  ddrNotFound = pL
1e1c0 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 3b 0a 20  evel->addrNxt;. 
1e1d0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1e1e0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
1e1f0 6f 64 65 28 70 50 61 72 73 65 2c 20 70 54 65 72  ode(pParse, pTer
1e200 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74  m->pExpr->pRight
1e210 2c 20 69 54 61 72 67 65 74 29 3b 0a 20 20 20 20  , iTarget);.    
1e220 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
1e230 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1e240 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70  v, OP_Integer, p
1e250 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78  Loop->u.vtab.idx
1e260 4e 75 6d 2c 20 69 52 65 67 29 3b 0a 20 20 20 20  Num, iReg);.    
1e270 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1e280 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
1e290 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2c 20 69 52   nConstraint, iR
1e2a0 65 67 2b 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  eg+1);.    sqlit
1e2b0 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
1e2c0 4f 50 5f 56 46 69 6c 74 65 72 2c 20 69 43 75 72  OP_VFilter, iCur
1e2d0 2c 20 61 64 64 72 4e 6f 74 46 6f 75 6e 64 2c 20  , addrNotFound, 
1e2e0 69 52 65 67 2c 0a 20 20 20 20 20 20 20 20 20 20  iReg,.          
1e2f0 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 6f 6f              pLoo
1e300 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72  p->u.vtab.idxStr
1e310 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1e320 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 75          pLoop->u
1e330 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3f  .vtab.needFree ?
1e340 20 50 34 5f 4d 50 52 49 4e 54 46 20 3a 20 50 34   P4_MPRINTF : P4
1e350 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 56 64  _STATIC);.    Vd
1e360 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
1e370 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62     pLoop->u.vtab
1e380 2e 6e 65 65 64 46 72 65 65 20 3d 20 30 3b 0a 20  .needFree = 0;. 
1e390 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 43     for(j=0; j<nC
1e3a0 6f 6e 73 74 72 61 69 6e 74 20 26 26 20 6a 3c 31  onstraint && j<1
1e3b0 36 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69  6; j++){.      i
1e3c0 66 28 20 28 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61  f( (pLoop->u.vta
1e3d0 62 2e 6f 6d 69 74 4d 61 73 6b 3e 3e 6a 29 26 31  b.omitMask>>j)&1
1e3e0 20 29 7b 0a 20 20 20 20 20 20 20 20 64 69 73 61   ){.        disa
1e3f0 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20  bleTerm(pLevel, 
1e400 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d  pLoop->aLTerm[j]
1e410 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
1e420 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20  .    pLevel->op 
1e430 3d 20 4f 50 5f 56 4e 65 78 74 3b 0a 20 20 20 20  = OP_VNext;.    
1e440 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69 43 75  pLevel->p1 = iCu
1e450 72 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  r;.    pLevel->p
1e460 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  2 = sqlite3VdbeC
1e470 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
1e480 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
1e490 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  eTempRange(pPars
1e4a0 65 2c 20 69 52 65 67 2c 20 6e 43 6f 6e 73 74 72  e, iReg, nConstr
1e4b0 61 69 6e 74 2b 32 29 3b 0a 20 20 20 20 73 71 6c  aint+2);.    sql
1e4c0 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70  ite3ExprCachePop
1e4d0 28 70 50 61 72 73 65 29 3b 0a 20 20 7d 65 6c 73  (pParse);.  }els
1e4e0 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  e.#endif /* SQLI
1e4f0 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
1e500 41 42 4c 45 20 2a 2f 0a 0a 20 20 69 66 28 20 28  ABLE */..  if( (
1e510 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
1e520 20 57 48 45 52 45 5f 49 50 4b 29 21 3d 30 0a 20   WHERE_IPK)!=0. 
1e530 20 20 26 26 20 28 70 4c 6f 6f 70 2d 3e 77 73 46    && (pLoop->wsF
1e540 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 43 4f  lags & (WHERE_CO
1e550 4c 55 4d 4e 5f 49 4e 7c 57 48 45 52 45 5f 43 4f  LUMN_IN|WHERE_CO
1e560 4c 55 4d 4e 5f 45 51 29 29 21 3d 30 0a 20 20 29  LUMN_EQ))!=0.  )
1e570 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 32 3a  {.    /* Case 2:
1e580 20 20 57 65 20 63 61 6e 20 64 69 72 65 63 74 6c    We can directl
1e590 79 20 72 65 66 65 72 65 6e 63 65 20 61 20 73 69  y reference a si
1e5a0 6e 67 6c 65 20 72 6f 77 20 75 73 69 6e 67 20 61  ngle row using a
1e5b0 6e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  n.    **        
1e5c0 20 20 65 71 75 61 6c 69 74 79 20 63 6f 6d 70 61    equality compa
1e5d0 72 69 73 6f 6e 20 61 67 61 69 6e 73 74 20 74 68  rison against th
1e5e0 65 20 52 4f 57 49 44 20 66 69 65 6c 64 2e 20 20  e ROWID field.  
1e5f0 4f 72 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  Or.    **       
1e600 20 20 20 77 65 20 72 65 66 65 72 65 6e 63 65 20     we reference 
1e610 6d 75 6c 74 69 70 6c 65 20 72 6f 77 73 20 75 73  multiple rows us
1e620 69 6e 67 20 61 20 22 72 6f 77 69 64 20 49 4e 20  ing a "rowid IN 
1e630 28 2e 2e 2e 29 22 0a 20 20 20 20 2a 2a 20 20 20  (...)".    **   
1e640 20 20 20 20 20 20 20 63 6f 6e 73 74 72 75 63 74         construct
1e650 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
1e660 65 72 74 28 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  ert( pLoop->u.bt
1e670 72 65 65 2e 6e 45 71 3d 3d 31 20 29 3b 0a 20 20  ree.nEq==1 );.  
1e680 20 20 70 54 65 72 6d 20 3d 20 70 4c 6f 6f 70 2d    pTerm = pLoop-
1e690 3e 61 4c 54 65 72 6d 5b 30 5d 3b 0a 20 20 20 20  >aLTerm[0];.    
1e6a0 61 73 73 65 72 74 28 20 70 54 65 72 6d 21 3d 30  assert( pTerm!=0
1e6b0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
1e6c0 70 54 65 72 6d 2d 3e 70 45 78 70 72 21 3d 30 20  pTerm->pExpr!=0 
1e6d0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f  );.    assert( o
1e6e0 6d 69 74 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20  mitTable==0 );. 
1e6f0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
1e700 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
1e710 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20 20  RM_VIRTUAL );.  
1e720 20 20 69 52 65 6c 65 61 73 65 52 65 67 20 3d 20    iReleaseReg = 
1e730 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
1e740 20 20 20 20 69 52 6f 77 69 64 52 65 67 20 3d 20      iRowidReg = 
1e750 63 6f 64 65 45 71 75 61 6c 69 74 79 54 65 72 6d  codeEqualityTerm
1e760 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2c 20  (pParse, pTerm, 
1e770 70 4c 65 76 65 6c 2c 20 30 2c 20 62 52 65 76 2c  pLevel, 0, bRev,
1e780 20 69 52 65 6c 65 61 73 65 52 65 67 29 3b 0a 20   iReleaseReg);. 
1e790 20 20 20 69 66 28 20 69 52 6f 77 69 64 52 65 67     if( iRowidReg
1e7a0 21 3d 69 52 65 6c 65 61 73 65 52 65 67 20 29 20  !=iReleaseReg ) 
1e7b0 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
1e7c0 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 69 52  mpReg(pParse, iR
1e7d0 65 6c 65 61 73 65 52 65 67 29 3b 0a 20 20 20 20  eleaseReg);.    
1e7e0 61 64 64 72 4e 78 74 20 3d 20 70 4c 65 76 65 6c  addrNxt = pLevel
1e7f0 2d 3e 61 64 64 72 4e 78 74 3b 0a 20 20 20 20 73  ->addrNxt;.    s
1e800 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1e810 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74  (v, OP_MustBeInt
1e820 2c 20 69 52 6f 77 69 64 52 65 67 2c 20 61 64 64  , iRowidReg, add
1e830 72 4e 78 74 29 3b 20 56 64 62 65 43 6f 76 65 72  rNxt); VdbeCover
1e840 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69  age(v);.    sqli
1e850 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
1e860 20 4f 50 5f 4e 6f 74 45 78 69 73 74 73 2c 20 69   OP_NotExists, i
1e870 43 75 72 2c 20 61 64 64 72 4e 78 74 2c 20 69 52  Cur, addrNxt, iR
1e880 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20 56 64  owidReg);.    Vd
1e890 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
1e8a0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
1e8b0 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67  cheAffinityChang
1e8c0 65 28 70 50 61 72 73 65 2c 20 69 52 6f 77 69 64  e(pParse, iRowid
1e8d0 52 65 67 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c  Reg, 1);.    sql
1e8e0 69 74 65 33 45 78 70 72 43 61 63 68 65 53 74 6f  ite3ExprCacheSto
1e8f0 72 65 28 70 50 61 72 73 65 2c 20 69 43 75 72 2c  re(pParse, iCur,
1e900 20 2d 31 2c 20 69 52 6f 77 69 64 52 65 67 29 3b   -1, iRowidReg);
1e910 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  .    VdbeComment
1e920 28 28 76 2c 20 22 70 6b 22 29 29 3b 0a 20 20 20  ((v, "pk"));.   
1e930 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50   pLevel->op = OP
1e940 5f 4e 6f 6f 70 3b 0a 20 20 7d 65 6c 73 65 20 69  _Noop;.  }else i
1e950 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  f( (pLoop->wsFla
1e960 67 73 20 26 20 57 48 45 52 45 5f 49 50 4b 29 21  gs & WHERE_IPK)!
1e970 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  =0.         && (
1e980 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
1e990 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41   WHERE_COLUMN_RA
1e9a0 4e 47 45 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20  NGE)!=0.  ){.   
1e9b0 20 2f 2a 20 43 61 73 65 20 33 3a 20 20 57 65 20   /* Case 3:  We 
1e9c0 68 61 76 65 20 61 6e 20 69 6e 65 71 75 61 6c 69  have an inequali
1e9d0 74 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61 67  ty comparison ag
1e9e0 61 69 6e 73 74 20 74 68 65 20 52 4f 57 49 44 20  ainst the ROWID 
1e9f0 66 69 65 6c 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  field..    */.  
1ea00 20 20 69 6e 74 20 74 65 73 74 4f 70 20 3d 20 4f    int testOp = O
1ea10 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 69 6e 74 20  P_Noop;.    int 
1ea20 73 74 61 72 74 3b 0a 20 20 20 20 69 6e 74 20 6d  start;.    int m
1ea30 65 6d 45 6e 64 56 61 6c 75 65 20 3d 20 30 3b 0a  emEndValue = 0;.
1ea40 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
1ea50 53 74 61 72 74 2c 20 2a 70 45 6e 64 3b 0a 0a 20  Start, *pEnd;.. 
1ea60 20 20 20 61 73 73 65 72 74 28 20 6f 6d 69 74 54     assert( omitT
1ea70 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 20 20 6a  able==0 );.    j
1ea80 20 3d 20 30 3b 0a 20 20 20 20 70 53 74 61 72 74   = 0;.    pStart
1ea90 20 3d 20 70 45 6e 64 20 3d 20 30 3b 0a 20 20 20   = pEnd = 0;.   
1eaa0 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c   if( pLoop->wsFl
1eab0 61 67 73 20 26 20 57 48 45 52 45 5f 42 54 4d 5f  ags & WHERE_BTM_
1eac0 4c 49 4d 49 54 20 29 20 70 53 74 61 72 74 20 3d  LIMIT ) pStart =
1ead0 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a   pLoop->aLTerm[j
1eae0 2b 2b 5d 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f  ++];.    if( pLo
1eaf0 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
1eb00 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20 29 20  ERE_TOP_LIMIT ) 
1eb10 70 45 6e 64 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c  pEnd = pLoop->aL
1eb20 54 65 72 6d 5b 6a 2b 2b 5d 3b 0a 20 20 20 20 61  Term[j++];.    a
1eb30 73 73 65 72 74 28 20 70 53 74 61 72 74 21 3d 30  ssert( pStart!=0
1eb40 20 7c 7c 20 70 45 6e 64 21 3d 30 20 29 3b 0a 20   || pEnd!=0 );. 
1eb50 20 20 20 69 66 28 20 62 52 65 76 20 29 7b 0a 20     if( bRev ){. 
1eb60 20 20 20 20 20 70 54 65 72 6d 20 3d 20 70 53 74       pTerm = pSt
1eb70 61 72 74 3b 0a 20 20 20 20 20 20 70 53 74 61 72  art;.      pStar
1eb80 74 20 3d 20 70 45 6e 64 3b 0a 20 20 20 20 20 20  t = pEnd;.      
1eb90 70 45 6e 64 20 3d 20 70 54 65 72 6d 3b 0a 20 20  pEnd = pTerm;.  
1eba0 20 20 7d 0a 20 20 20 20 69 66 28 20 70 53 74 61    }.    if( pSta
1ebb0 72 74 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72  rt ){.      Expr
1ebc0 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20 20   *pX;           
1ebd0 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73    /* The express
1ebe0 69 6f 6e 20 74 68 61 74 20 64 65 66 69 6e 65 73  ion that defines
1ebf0 20 74 68 65 20 73 74 61 72 74 20 62 6f 75 6e 64   the start bound
1ec00 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 31   */.      int r1
1ec10 2c 20 72 54 65 6d 70 3b 20 20 20 20 20 20 20 20  , rTemp;        
1ec20 2f 2a 20 52 65 67 69 73 74 65 72 73 20 66 6f 72  /* Registers for
1ec30 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 74 61   holding the sta
1ec40 72 74 20 62 6f 75 6e 64 61 72 79 20 2a 2f 0a 0a  rt boundary */..
1ec50 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c        /* The fol
1ec60 6c 6f 77 69 6e 67 20 63 6f 6e 73 74 61 6e 74 20  lowing constant 
1ec70 6d 61 70 73 20 54 4b 5f 78 78 20 63 6f 64 65 73  maps TK_xx codes
1ec80 20 69 6e 74 6f 20 63 6f 72 72 65 73 70 6f 6e 64   into correspond
1ec90 69 6e 67 20 0a 20 20 20 20 20 20 2a 2a 20 73 65  ing .      ** se
1eca0 65 6b 20 6f 70 63 6f 64 65 73 2e 20 20 49 74 20  ek opcodes.  It 
1ecb0 64 65 70 65 6e 64 73 20 6f 6e 20 61 20 70 61 72  depends on a par
1ecc0 74 69 63 75 6c 61 72 20 6f 72 64 65 72 69 6e 67  ticular ordering
1ecd0 20 6f 66 20 54 4b 5f 78 78 0a 20 20 20 20 20 20   of TK_xx.      
1ece0 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 75  */.      const u
1ecf0 38 20 61 4d 6f 76 65 4f 70 5b 5d 20 3d 20 7b 0a  8 aMoveOp[] = {.
1ed00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 4b             /* TK
1ed10 5f 47 54 20 2a 2f 20 20 4f 50 5f 53 65 65 6b 47  _GT */  OP_SeekG
1ed20 54 2c 0a 20 20 20 20 20 20 20 20 20 20 20 2f 2a  T,.           /*
1ed30 20 54 4b 5f 4c 45 20 2a 2f 20 20 4f 50 5f 53 65   TK_LE */  OP_Se
1ed40 65 6b 4c 45 2c 0a 20 20 20 20 20 20 20 20 20 20  ekLE,.          
1ed50 20 2f 2a 20 54 4b 5f 4c 54 20 2a 2f 20 20 4f 50   /* TK_LT */  OP
1ed60 5f 53 65 65 6b 4c 54 2c 0a 20 20 20 20 20 20 20  _SeekLT,.       
1ed70 20 20 20 20 2f 2a 20 54 4b 5f 47 45 20 2a 2f 20      /* TK_GE */ 
1ed80 20 4f 50 5f 53 65 65 6b 47 45 0a 20 20 20 20 20   OP_SeekGE.     
1ed90 20 7d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   };.      assert
1eda0 28 20 54 4b 5f 4c 45 3d 3d 54 4b 5f 47 54 2b 31  ( TK_LE==TK_GT+1
1edb0 20 29 3b 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65   );      /* Make
1edc0 20 73 75 72 65 20 74 68 65 20 6f 72 64 65 72 69   sure the orderi
1edd0 6e 67 2e 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73  ng.. */.      as
1ede0 73 65 72 74 28 20 54 4b 5f 4c 54 3d 3d 54 4b 5f  sert( TK_LT==TK_
1edf0 47 54 2b 32 20 29 3b 20 20 20 20 20 20 2f 2a 20  GT+2 );      /* 
1ee00 20 2e 2e 2e 20 6f 66 20 74 68 65 20 54 4b 5f 78   ... of the TK_x
1ee10 78 20 76 61 6c 75 65 73 2e 2e 2e 20 2a 2f 0a 20  x values... */. 
1ee20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
1ee30 47 45 3d 3d 54 4b 5f 47 54 2b 33 20 29 3b 20 20  GE==TK_GT+3 );  
1ee40 20 20 20 20 2f 2a 20 20 2e 2e 2e 20 69 73 20 63      /*  ... is c
1ee50 6f 72 72 65 63 63 74 2e 20 2a 2f 0a 0a 20 20 20  orrecct. */..   
1ee60 20 20 20 61 73 73 65 72 74 28 20 28 70 53 74 61     assert( (pSta
1ee70 72 74 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rt->wtFlags & TE
1ee80 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29 3b 0a  RM_VNULL)==0 );.
1ee90 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1eea0 70 53 74 61 72 74 2d 3e 77 74 46 6c 61 67 73 20  pStart->wtFlags 
1eeb0 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29  & TERM_VIRTUAL )
1eec0 3b 0a 20 20 20 20 20 20 70 58 20 3d 20 70 53 74  ;.      pX = pSt
1eed0 61 72 74 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  art->pExpr;.    
1eee0 20 20 61 73 73 65 72 74 28 20 70 58 21 3d 30 20    assert( pX!=0 
1eef0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1ef00 65 28 20 70 53 74 61 72 74 2d 3e 6c 65 66 74 43  e( pStart->leftC
1ef10 75 72 73 6f 72 21 3d 69 43 75 72 20 29 3b 20 2f  ursor!=iCur ); /
1ef20 2a 20 74 72 61 6e 73 69 74 69 76 65 20 63 6f 6e  * transitive con
1ef30 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 20 20  straints */.    
1ef40 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78    r1 = sqlite3Ex
1ef50 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
1ef60 65 2c 20 70 58 2d 3e 70 52 69 67 68 74 2c 20 26  e, pX->pRight, &
1ef70 72 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 73 71  rTemp);.      sq
1ef80 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
1ef90 76 2c 20 61 4d 6f 76 65 4f 70 5b 70 58 2d 3e 6f  v, aMoveOp[pX->o
1efa0 70 2d 54 4b 5f 47 54 5d 2c 20 69 43 75 72 2c 20  p-TK_GT], iCur, 
1efb0 61 64 64 72 42 72 6b 2c 20 72 31 29 3b 0a 20 20  addrBrk, r1);.  
1efc0 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
1efd0 28 76 2c 20 22 70 6b 22 29 29 3b 0a 20 20 20 20  (v, "pk"));.    
1efe0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
1eff0 28 76 2c 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 47  (v, pX->op==TK_G
1f000 54 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  T);.      VdbeCo
1f010 76 65 72 61 67 65 49 66 28 76 2c 20 70 58 2d 3e  verageIf(v, pX->
1f020 6f 70 3d 3d 54 4b 5f 4c 45 29 3b 0a 20 20 20 20  op==TK_LE);.    
1f030 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
1f040 28 76 2c 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 4c  (v, pX->op==TK_L
1f050 54 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  T);.      VdbeCo
1f060 76 65 72 61 67 65 49 66 28 76 2c 20 70 58 2d 3e  verageIf(v, pX->
1f070 6f 70 3d 3d 54 4b 5f 47 45 29 3b 0a 20 20 20 20  op==TK_GE);.    
1f080 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
1f090 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  heAffinityChange
1f0a0 28 70 50 61 72 73 65 2c 20 72 31 2c 20 31 29 3b  (pParse, r1, 1);
1f0b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
1f0c0 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
1f0d0 72 73 65 2c 20 72 54 65 6d 70 29 3b 0a 20 20 20  rse, rTemp);.   
1f0e0 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70     disableTerm(p
1f0f0 4c 65 76 65 6c 2c 20 70 53 74 61 72 74 29 3b 0a  Level, pStart);.
1f100 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1f110 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1f120 70 32 28 76 2c 20 62 52 65 76 20 3f 20 4f 50 5f  p2(v, bRev ? OP_
1f130 4c 61 73 74 20 3a 20 4f 50 5f 52 65 77 69 6e 64  Last : OP_Rewind
1f140 2c 20 69 43 75 72 2c 20 61 64 64 72 42 72 6b 29  , iCur, addrBrk)
1f150 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
1f160 72 61 67 65 49 66 28 76 2c 20 62 52 65 76 3d 3d  rageIf(v, bRev==
1f170 30 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  0);.      VdbeCo
1f180 76 65 72 61 67 65 49 66 28 76 2c 20 62 52 65 76  verageIf(v, bRev
1f190 21 3d 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  !=0);.    }.    
1f1a0 69 66 28 20 70 45 6e 64 20 29 7b 0a 20 20 20 20  if( pEnd ){.    
1f1b0 20 20 45 78 70 72 20 2a 70 58 3b 0a 20 20 20 20    Expr *pX;.    
1f1c0 20 20 70 58 20 3d 20 70 45 6e 64 2d 3e 70 45 78    pX = pEnd->pEx
1f1d0 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  pr;.      assert
1f1e0 28 20 70 58 21 3d 30 20 29 3b 0a 20 20 20 20 20  ( pX!=0 );.     
1f1f0 20 61 73 73 65 72 74 28 20 28 70 45 6e 64 2d 3e   assert( (pEnd->
1f200 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
1f210 4e 55 4c 4c 29 3d 3d 30 20 29 3b 0a 20 20 20 20  NULL)==0 );.    
1f220 20 20 74 65 73 74 63 61 73 65 28 20 70 45 6e 64    testcase( pEnd
1f230 2d 3e 6c 65 66 74 43 75 72 73 6f 72 21 3d 69 43  ->leftCursor!=iC
1f240 75 72 20 29 3b 20 2f 2a 20 54 72 61 6e 73 69 74  ur ); /* Transit
1f250 69 76 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  ive constraints 
1f260 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  */.      testcas
1f270 65 28 20 70 45 6e 64 2d 3e 77 74 46 6c 61 67 73  e( pEnd->wtFlags
1f280 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20   & TERM_VIRTUAL 
1f290 29 3b 0a 20 20 20 20 20 20 6d 65 6d 45 6e 64 56  );.      memEndV
1f2a0 61 6c 75 65 20 3d 20 2b 2b 70 50 61 72 73 65 2d  alue = ++pParse-
1f2b0 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c  >nMem;.      sql
1f2c0 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
1f2d0 72 73 65 2c 20 70 58 2d 3e 70 52 69 67 68 74 2c  rse, pX->pRight,
1f2e0 20 6d 65 6d 45 6e 64 56 61 6c 75 65 29 3b 0a 20   memEndValue);. 
1f2f0 20 20 20 20 20 69 66 28 20 70 58 2d 3e 6f 70 3d       if( pX->op=
1f300 3d 54 4b 5f 4c 54 20 7c 7c 20 70 58 2d 3e 6f 70  =TK_LT || pX->op
1f310 3d 3d 54 4b 5f 47 54 20 29 7b 0a 20 20 20 20 20  ==TK_GT ){.     
1f320 20 20 20 74 65 73 74 4f 70 20 3d 20 62 52 65 76     testOp = bRev
1f330 20 3f 20 4f 50 5f 4c 65 20 3a 20 4f 50 5f 47 65   ? OP_Le : OP_Ge
1f340 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1f350 20 20 20 20 20 20 20 74 65 73 74 4f 70 20 3d 20         testOp = 
1f360 62 52 65 76 20 3f 20 4f 50 5f 4c 74 20 3a 20 4f  bRev ? OP_Lt : O
1f370 50 5f 47 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  P_Gt;.      }.  
1f380 20 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28      disableTerm(
1f390 70 4c 65 76 65 6c 2c 20 70 45 6e 64 29 3b 0a 20  pLevel, pEnd);. 
1f3a0 20 20 20 7d 0a 20 20 20 20 73 74 61 72 74 20 3d     }.    start =
1f3b0 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
1f3c0 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
1f3d0 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 62 52 65  pLevel->op = bRe
1f3e0 76 20 3f 20 4f 50 5f 50 72 65 76 20 3a 20 4f 50  v ? OP_Prev : OP
1f3f0 5f 4e 65 78 74 3b 0a 20 20 20 20 70 4c 65 76 65  _Next;.    pLeve
1f400 6c 2d 3e 70 31 20 3d 20 69 43 75 72 3b 0a 20 20  l->p1 = iCur;.  
1f410 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 73    pLevel->p2 = s
1f420 74 61 72 74 3b 0a 20 20 20 20 61 73 73 65 72 74  tart;.    assert
1f430 28 20 70 4c 65 76 65 6c 2d 3e 70 35 3d 3d 30 20  ( pLevel->p5==0 
1f440 29 3b 0a 20 20 20 20 69 66 28 20 74 65 73 74 4f  );.    if( testO
1f450 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20  p!=OP_Noop ){.  
1f460 20 20 20 20 69 52 6f 77 69 64 52 65 67 20 3d 20      iRowidReg = 
1f470 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
1f480 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1f490 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f  eAddOp2(v, OP_Ro
1f4a0 77 69 64 2c 20 69 43 75 72 2c 20 69 52 6f 77 69  wid, iCur, iRowi
1f4b0 64 52 65 67 29 3b 0a 20 20 20 20 20 20 73 71 6c  dReg);.      sql
1f4c0 69 74 65 33 45 78 70 72 43 61 63 68 65 53 74 6f  ite3ExprCacheSto
1f4d0 72 65 28 70 50 61 72 73 65 2c 20 69 43 75 72 2c  re(pParse, iCur,
1f4e0 20 2d 31 2c 20 69 52 6f 77 69 64 52 65 67 29 3b   -1, iRowidReg);
1f4f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1f500 62 65 41 64 64 4f 70 33 28 76 2c 20 74 65 73 74  beAddOp3(v, test
1f510 4f 70 2c 20 6d 65 6d 45 6e 64 56 61 6c 75 65 2c  Op, memEndValue,
1f520 20 61 64 64 72 42 72 6b 2c 20 69 52 6f 77 69 64   addrBrk, iRowid
1f530 52 65 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65  Reg);.      Vdbe
1f540 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 74 65  CoverageIf(v, te
1f550 73 74 4f 70 3d 3d 4f 50 5f 4c 65 29 3b 0a 20 20  stOp==OP_Le);.  
1f560 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
1f570 49 66 28 76 2c 20 74 65 73 74 4f 70 3d 3d 4f 50  If(v, testOp==OP
1f580 5f 4c 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65  _Lt);.      Vdbe
1f590 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 74 65  CoverageIf(v, te
1f5a0 73 74 4f 70 3d 3d 4f 50 5f 47 65 29 3b 0a 20 20  stOp==OP_Ge);.  
1f5b0 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
1f5c0 49 66 28 76 2c 20 74 65 73 74 4f 70 3d 3d 4f 50  If(v, testOp==OP
1f5d0 5f 47 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  _Gt);.      sqli
1f5e0 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
1f5f0 76 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55  v, SQLITE_AFF_NU
1f600 4d 45 52 49 43 20 7c 20 53 51 4c 49 54 45 5f 4a  MERIC | SQLITE_J
1f610 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20  UMPIFNULL);.    
1f620 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c  }.  }else if( pL
1f630 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
1f640 48 45 52 45 5f 49 4e 44 45 58 45 44 20 29 7b 0a  HERE_INDEXED ){.
1f650 20 20 20 20 2f 2a 20 43 61 73 65 20 34 3a 20 41      /* Case 4: A
1f660 20 73 63 61 6e 20 75 73 69 6e 67 20 61 6e 20 69   scan using an i
1f670 6e 64 65 78 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  ndex..    **.   
1f680 20 2a 2a 20 20 20 20 20 20 20 20 20 54 68 65 20   **         The 
1f690 57 48 45 52 45 20 63 6c 61 75 73 65 20 6d 61 79  WHERE clause may
1f6a0 20 63 6f 6e 74 61 69 6e 20 7a 65 72 6f 20 6f 72   contain zero or
1f6b0 20 6d 6f 72 65 20 65 71 75 61 6c 69 74 79 20 0a   more equality .
1f6c0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74      **         t
1f6d0 65 72 6d 73 20 28 22 3d 3d 22 20 6f 72 20 22 49  erms ("==" or "I
1f6e0 4e 22 20 6f 70 65 72 61 74 6f 72 73 29 20 74 68  N" operators) th
1f6f0 61 74 20 72 65 66 65 72 20 74 6f 20 74 68 65 20  at refer to the 
1f700 4e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  N.    **        
1f710 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d   left-most colum
1f720 6e 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e  ns of the index.
1f730 20 49 74 20 6d 61 79 20 61 6c 73 6f 20 63 6f 6e   It may also con
1f740 74 61 69 6e 0a 20 20 20 20 2a 2a 20 20 20 20 20  tain.    **     
1f750 20 20 20 20 69 6e 65 71 75 61 6c 69 74 79 20 63      inequality c
1f760 6f 6e 73 74 72 61 69 6e 74 73 20 28 3e 2c 20 3c  onstraints (>, <
1f770 2c 20 3e 3d 20 6f 72 20 3c 3d 29 20 6f 6e 20 74  , >= or <=) on t
1f780 68 65 20 69 6e 64 65 78 65 64 0a 20 20 20 20 2a  he indexed.    *
1f790 2a 20 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e  *         column
1f7a0 20 74 68 61 74 20 69 6d 6d 65 64 69 61 74 65 6c   that immediatel
1f7b0 79 20 66 6f 6c 6c 6f 77 73 20 74 68 65 20 4e 20  y follows the N 
1f7c0 65 71 75 61 6c 69 74 69 65 73 2e 20 4f 6e 6c 79  equalities. Only
1f7d0 20 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20   .    **        
1f7e0 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
1f7f0 63 6f 6c 75 6d 6e 20 63 61 6e 20 62 65 20 61 6e  column can be an
1f800 20 69 6e 65 71 75 61 6c 69 74 79 20 2d 20 74 68   inequality - th
1f810 65 20 72 65 73 74 20 6d 75 73 74 0a 20 20 20 20  e rest must.    
1f820 2a 2a 20 20 20 20 20 20 20 20 20 75 73 65 20 74  **         use t
1f830 68 65 20 22 3d 3d 22 20 61 6e 64 20 22 49 4e 22  he "==" and "IN"
1f840 20 6f 70 65 72 61 74 6f 72 73 2e 20 46 6f 72 20   operators. For 
1f850 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20  example, if the 
1f860 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
1f870 69 6e 64 65 78 20 69 73 20 6f 6e 20 28 78 2c 79  index is on (x,y
1f880 2c 7a 29 2c 20 74 68 65 6e 20 74 68 65 20 66 6f  ,z), then the fo
1f890 6c 6c 6f 77 69 6e 67 20 63 6c 61 75 73 65 73 20  llowing clauses 
1f8a0 61 72 65 20 61 6c 6c 20 0a 20 20 20 20 2a 2a 20  are all .    ** 
1f8b0 20 20 20 20 20 20 20 20 6f 70 74 69 6d 69 7a 65          optimize
1f8c0 64 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  d:.    **.    **
1f8d0 20 20 20 20 20 20 20 20 20 20 20 20 78 3d 35 0a              x=5.
1f8e0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
1f8f0 20 20 78 3d 35 20 41 4e 44 20 79 3d 31 30 0a 20    x=5 AND y=10. 
1f900 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20     **           
1f910 20 78 3d 35 20 41 4e 44 20 79 3c 31 30 0a 20 20   x=5 AND y<10.  
1f920 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20    **            
1f930 78 3d 35 20 41 4e 44 20 79 3e 35 20 41 4e 44 20  x=5 AND y>5 AND 
1f940 79 3c 31 30 0a 20 20 20 20 2a 2a 20 20 20 20 20  y<10.    **     
1f950 20 20 20 20 20 20 20 78 3d 35 20 41 4e 44 20 79         x=5 AND y
1f960 3d 35 20 41 4e 44 20 7a 3c 3d 31 30 0a 20 20 20  =5 AND z<=10.   
1f970 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   **.    **      
1f980 20 20 20 54 68 65 20 7a 3c 31 30 20 74 65 72 6d     The z<10 term
1f990 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
1f9a0 67 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64  g cannot be used
1f9b0 2c 20 6f 6e 6c 79 0a 20 20 20 20 2a 2a 20 20 20  , only.    **   
1f9c0 20 20 20 20 20 20 74 68 65 20 78 3d 35 20 74 65        the x=5 te
1f9d0 72 6d 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  rm:.    **.    *
1f9e0 2a 20 20 20 20 20 20 20 20 20 20 20 20 78 3d 35  *            x=5
1f9f0 20 41 4e 44 20 7a 3c 31 30 0a 20 20 20 20 2a 2a   AND z<10.    **
1fa00 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
1fa10 4e 20 6d 61 79 20 62 65 20 7a 65 72 6f 20 69 66  N may be zero if
1fa20 20 74 68 65 72 65 20 61 72 65 20 69 6e 65 71 75   there are inequ
1fa30 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
1fa40 73 2e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  s..    **       
1fa50 20 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6e    If there are n
1fa60 6f 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e  o inequality con
1fa70 73 74 72 61 69 6e 74 73 2c 20 74 68 65 6e 20 4e  straints, then N
1fa80 20 69 73 20 61 74 0a 20 20 20 20 2a 2a 20 20 20   is at.    **   
1fa90 20 20 20 20 20 20 6c 65 61 73 74 20 6f 6e 65 2e        least one.
1faa0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
1fab0 20 20 20 20 20 20 20 54 68 69 73 20 63 61 73 65         This case
1fac0 20 69 73 20 61 6c 73 6f 20 75 73 65 64 20 77 68   is also used wh
1fad0 65 6e 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  en there are no 
1fae0 57 48 45 52 45 20 63 6c 61 75 73 65 0a 20 20 20  WHERE clause.   
1faf0 20 2a 2a 20 20 20 20 20 20 20 20 20 63 6f 6e 73   **         cons
1fb00 74 72 61 69 6e 74 73 20 62 75 74 20 61 6e 20 69  traints but an i
1fb10 6e 64 65 78 20 69 73 20 73 65 6c 65 63 74 65 64  ndex is selected
1fb20 20 61 6e 79 77 61 79 2c 20 69 6e 20 6f 72 64 65   anyway, in orde
1fb30 72 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  r.    **        
1fb40 20 74 6f 20 66 6f 72 63 65 20 74 68 65 20 6f 75   to force the ou
1fb50 74 70 75 74 20 6f 72 64 65 72 20 74 6f 20 63 6f  tput order to co
1fb60 6e 66 6f 72 6d 20 74 6f 20 61 6e 20 4f 52 44 45  nform to an ORDE
1fb70 52 20 42 59 2e 0a 20 20 20 20 2a 2f 20 20 0a 20  R BY..    */  . 
1fb80 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
1fb90 75 38 20 61 53 74 61 72 74 4f 70 5b 5d 20 3d 20  u8 aStartOp[] = 
1fba0 7b 0a 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20  {.      0,.     
1fbb0 20 30 2c 0a 20 20 20 20 20 20 4f 50 5f 52 65 77   0,.      OP_Rew
1fbc0 69 6e 64 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ind,           /
1fbd0 2a 20 32 3a 20 28 21 73 74 61 72 74 5f 63 6f 6e  * 2: (!start_con
1fbe0 73 74 72 61 69 6e 74 73 20 26 26 20 73 74 61 72  straints && star
1fbf0 74 45 71 20 26 26 20 20 21 62 52 65 76 29 20 2a  tEq &&  !bRev) *
1fc00 2f 0a 20 20 20 20 20 20 4f 50 5f 4c 61 73 74 2c  /.      OP_Last,
1fc10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1fc20 33 3a 20 28 21 73 74 61 72 74 5f 63 6f 6e 73 74  3: (!start_const
1fc30 72 61 69 6e 74 73 20 26 26 20 73 74 61 72 74 45  raints && startE
1fc40 71 20 26 26 20 20 20 62 52 65 76 29 20 2a 2f 0a  q &&   bRev) */.
1fc50 20 20 20 20 20 20 4f 50 5f 53 65 65 6b 47 54 2c        OP_SeekGT,
1fc60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 34 3a             /* 4:
1fc70 20 28 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69   (start_constrai
1fc80 6e 74 73 20 20 26 26 20 21 73 74 61 72 74 45 71  nts  && !startEq
1fc90 20 26 26 20 21 62 52 65 76 29 20 2a 2f 0a 20 20   && !bRev) */.  
1fca0 20 20 20 20 4f 50 5f 53 65 65 6b 4c 54 2c 20 20      OP_SeekLT,  
1fcb0 20 20 20 20 20 20 20 20 20 2f 2a 20 35 3a 20 28           /* 5: (
1fcc0 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74  start_constraint
1fcd0 73 20 20 26 26 20 21 73 74 61 72 74 45 71 20 26  s  && !startEq &
1fce0 26 20 20 62 52 65 76 29 20 2a 2f 0a 20 20 20 20  &  bRev) */.    
1fcf0 20 20 4f 50 5f 53 65 65 6b 47 45 2c 20 20 20 20    OP_SeekGE,    
1fd00 20 20 20 20 20 20 20 2f 2a 20 36 3a 20 28 73 74         /* 6: (st
1fd10 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20  art_constraints 
1fd20 20 26 26 20 20 73 74 61 72 74 45 71 20 26 26 20   &&  startEq && 
1fd30 21 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20  !bRev) */.      
1fd40 4f 50 5f 53 65 65 6b 4c 45 20 20 20 20 20 20 20  OP_SeekLE       
1fd50 20 20 20 20 20 2f 2a 20 37 3a 20 28 73 74 61 72       /* 7: (star
1fd60 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 20 26  t_constraints  &
1fd70 26 20 20 73 74 61 72 74 45 71 20 26 26 20 20 62  &  startEq &&  b
1fd80 52 65 76 29 20 2a 2f 0a 20 20 20 20 7d 3b 0a 20  Rev) */.    };. 
1fd90 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
1fda0 75 38 20 61 45 6e 64 4f 70 5b 5d 20 3d 20 7b 0a  u8 aEndOp[] = {.
1fdb0 20 20 20 20 20 20 4f 50 5f 49 64 78 47 45 2c 20        OP_IdxGE, 
1fdc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30 3a             /* 0:
1fdd0 20 28 65 6e 64 5f 63 6f 6e 73 74 72 61 69 6e 74   (end_constraint
1fde0 73 20 26 26 20 21 62 52 65 76 20 26 26 20 21 65  s && !bRev && !e
1fdf0 6e 64 45 71 29 20 2a 2f 0a 20 20 20 20 20 20 4f  ndEq) */.      O
1fe00 50 5f 49 64 78 47 54 2c 20 20 20 20 20 20 20 20  P_IdxGT,        
1fe10 20 20 20 20 2f 2a 20 31 3a 20 28 65 6e 64 5f 63      /* 1: (end_c
1fe20 6f 6e 73 74 72 61 69 6e 74 73 20 26 26 20 21 62  onstraints && !b
1fe30 52 65 76 20 26 26 20 20 65 6e 64 45 71 29 20 2a  Rev &&  endEq) *
1fe40 2f 0a 20 20 20 20 20 20 4f 50 5f 49 64 78 4c 45  /.      OP_IdxLE
1fe50 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
1fe60 32 3a 20 28 65 6e 64 5f 63 6f 6e 73 74 72 61 69  2: (end_constrai
1fe70 6e 74 73 20 26 26 20 20 62 52 65 76 20 26 26 20  nts &&  bRev && 
1fe80 21 65 6e 64 45 71 29 20 2a 2f 0a 20 20 20 20 20  !endEq) */.     
1fe90 20 4f 50 5f 49 64 78 4c 54 2c 20 20 20 20 20 20   OP_IdxLT,      
1fea0 20 20 20 20 20 20 2f 2a 20 33 3a 20 28 65 6e 64        /* 3: (end
1feb0 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 26 26 20  _constraints && 
1fec0 20 62 52 65 76 20 26 26 20 20 65 6e 64 45 71 29   bRev &&  endEq)
1fed0 20 2a 2f 0a 20 20 20 20 7d 3b 0a 20 20 20 20 75   */.    };.    u
1fee0 31 36 20 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e  16 nEq = pLoop->
1fef0 75 2e 62 74 72 65 65 2e 6e 45 71 3b 20 20 20 20  u.btree.nEq;    
1ff00 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 3d 3d   /* Number of ==
1ff10 20 6f 72 20 49 4e 20 74 65 72 6d 73 20 2a 2f 0a   or IN terms */.
1ff20 20 20 20 20 69 6e 74 20 72 65 67 42 61 73 65 3b      int regBase;
1ff30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ff40 20 2f 2a 20 42 61 73 65 20 72 65 67 69 73 74 65   /* Base registe
1ff50 72 20 68 6f 6c 64 69 6e 67 20 63 6f 6e 73 74 72  r holding constr
1ff60 61 69 6e 74 20 76 61 6c 75 65 73 20 2a 2f 0a 20  aint values */. 
1ff70 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 52     WhereTerm *pR
1ff80 61 6e 67 65 53 74 61 72 74 20 3d 20 30 3b 20 20  angeStart = 0;  
1ff90 2f 2a 20 49 6e 65 71 75 61 6c 69 74 79 20 63 6f  /* Inequality co
1ffa0 6e 73 74 72 61 69 6e 74 20 61 74 20 72 61 6e 67  nstraint at rang
1ffb0 65 20 73 74 61 72 74 20 2a 2f 0a 20 20 20 20 57  e start */.    W
1ffc0 68 65 72 65 54 65 72 6d 20 2a 70 52 61 6e 67 65  hereTerm *pRange
1ffd0 45 6e 64 20 3d 20 30 3b 20 20 20 20 2f 2a 20 49  End = 0;    /* I
1ffe0 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72  nequality constr
1fff0 61 69 6e 74 20 61 74 20 72 61 6e 67 65 20 65 6e  aint at range en
20000 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 74 61  d */.    int sta
20010 72 74 45 71 3b 20 20 20 20 20 20 20 20 20 20 20  rtEq;           
20020 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
20030 20 72 61 6e 67 65 20 73 74 61 72 74 20 75 73 65   range start use
20040 73 20 3d 3d 2c 20 3e 3d 20 6f 72 20 3c 3d 20 2a  s ==, >= or <= *
20050 2f 0a 20 20 20 20 69 6e 74 20 65 6e 64 45 71 3b  /.    int endEq;
20060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20070 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 72 61     /* True if ra
20080 6e 67 65 20 65 6e 64 20 75 73 65 73 20 3d 3d 2c  nge end uses ==,
20090 20 3e 3d 20 6f 72 20 3c 3d 20 2a 2f 0a 20 20 20   >= or <= */.   
200a0 20 69 6e 74 20 73 74 61 72 74 5f 63 6f 6e 73 74   int start_const
200b0 72 61 69 6e 74 73 3b 20 20 20 20 20 20 20 2f 2a  raints;       /*
200c0 20 53 74 61 72 74 20 6f 66 20 72 61 6e 67 65 20   Start of range 
200d0 69 73 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 2a  is constrained *
200e0 2f 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6e 73 74  /.    int nConst
200f0 72 61 69 6e 74 3b 20 20 20 20 20 20 20 20 20 20  raint;          
20100 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
20110 63 6f 6e 73 74 72 61 69 6e 74 20 74 65 72 6d 73  constraint terms
20120 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70   */.    Index *p
20130 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  Idx;            
20140 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65       /* The inde
20150 78 20 77 65 20 77 69 6c 6c 20 62 65 20 75 73 69  x we will be usi
20160 6e 67 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49  ng */.    int iI
20170 64 78 43 75 72 3b 20 20 20 20 20 20 20 20 20 20  dxCur;          
20180 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44         /* The VD
20190 42 45 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68  BE cursor for th
201a0 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 69  e index */.    i
201b0 6e 74 20 6e 45 78 74 72 61 52 65 67 20 3d 20 30  nt nExtraReg = 0
201c0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
201d0 75 6d 62 65 72 20 6f 66 20 65 78 74 72 61 20 72  umber of extra r
201e0 65 67 69 73 74 65 72 73 20 6e 65 65 64 65 64 20  egisters needed 
201f0 2a 2f 0a 20 20 20 20 69 6e 74 20 6f 70 3b 20 20  */.    int op;  
20200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20210 20 20 20 20 2f 2a 20 49 6e 73 74 72 75 63 74 69      /* Instructi
20220 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 20  on opcode */.   
20230 20 63 68 61 72 20 2a 7a 53 74 61 72 74 41 66 66   char *zStartAff
20240 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
20250 20 41 66 66 69 6e 69 74 79 20 66 6f 72 20 73 74   Affinity for st
20260 61 72 74 20 6f 66 20 72 61 6e 67 65 20 63 6f 6e  art of range con
20270 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20 20 63  straint */.    c
20280 68 61 72 20 63 45 6e 64 41 66 66 20 3d 20 30 3b  har cEndAff = 0;
20290 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
202a0 66 66 69 6e 69 74 79 20 66 6f 72 20 65 6e 64 20  ffinity for end 
202b0 6f 66 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61  of range constra
202c0 69 6e 74 20 2a 2f 0a 20 20 20 20 75 38 20 62 53  int */.    u8 bS
202d0 65 65 6b 50 61 73 74 4e 75 6c 6c 20 3d 20 30 3b  eekPastNull = 0;
202e0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
202f0 74 6f 20 73 65 65 6b 20 70 61 73 74 20 69 6e 69  to seek past ini
20300 74 69 61 6c 20 6e 75 6c 6c 73 20 2a 2f 0a 20 20  tial nulls */.  
20310 20 20 75 38 20 62 53 74 6f 70 41 74 4e 75 6c 6c    u8 bStopAtNull
20320 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f   = 0;          /
20330 2a 20 41 64 64 20 63 6f 6e 64 69 74 69 6f 6e 20  * Add condition 
20340 74 6f 20 74 65 72 6d 69 6e 61 74 65 20 61 74 20  to terminate at 
20350 4e 55 4c 4c 73 20 2a 2f 0a 0a 20 20 20 20 70 49  NULLs */..    pI
20360 64 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  dx = pLoop->u.bt
20370 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 20 20  ree.pIndex;.    
20380 69 49 64 78 43 75 72 20 3d 20 70 4c 65 76 65 6c  iIdxCur = pLevel
20390 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20 20 20 61  ->iIdxCur;.    a
203a0 73 73 65 72 74 28 20 6e 45 71 3e 3d 70 4c 6f 6f  ssert( nEq>=pLoo
203b0 70 2d 3e 6e 53 6b 69 70 20 29 3b 0a 0a 20 20 20  p->nSkip );..   
203c0 20 2f 2a 20 49 66 20 74 68 69 73 20 6c 6f 6f 70   /* If this loop
203d0 20 73 61 74 69 73 66 69 65 73 20 61 20 73 6f 72   satisfies a sor
203e0 74 20 6f 72 64 65 72 20 28 70 4f 72 64 65 72 42  t order (pOrderB
203f0 79 29 20 72 65 71 75 65 73 74 20 74 68 61 74 20  y) request that 
20400 0a 20 20 20 20 2a 2a 20 77 61 73 20 70 61 73 73  .    ** was pass
20410 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  ed to this funct
20420 69 6f 6e 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  ion to implement
20430 20 61 20 22 53 45 4c 45 43 54 20 6d 69 6e 28 78   a "SELECT min(x
20440 29 20 2e 2e 2e 22 20 0a 20 20 20 20 2a 2a 20 71  ) ..." .    ** q
20450 75 65 72 79 2c 20 74 68 65 6e 20 74 68 65 20 63  uery, then the c
20460 61 6c 6c 65 72 20 77 69 6c 6c 20 6f 6e 6c 79 20  aller will only 
20470 61 6c 6c 6f 77 20 74 68 65 20 6c 6f 6f 70 20 74  allow the loop t
20480 6f 20 72 75 6e 20 66 6f 72 0a 20 20 20 20 2a 2a  o run for.    **
20490 20 61 20 73 69 6e 67 6c 65 20 69 74 65 72 61 74   a single iterat
204a0 69 6f 6e 2e 20 54 68 69 73 20 6d 65 61 6e 73 20  ion. This means 
204b0 74 68 61 74 20 74 68 65 20 66 69 72 73 74 20 72  that the first r
204c0 6f 77 20 72 65 74 75 72 6e 65 64 0a 20 20 20 20  ow returned.    
204d0 2a 2a 20 73 68 6f 75 6c 64 20 6e 6f 74 20 68 61  ** should not ha
204e0 76 65 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65 20  ve a NULL value 
204f0 73 74 6f 72 65 64 20 69 6e 20 27 78 27 2e 20 49  stored in 'x'. I
20500 66 20 63 6f 6c 75 6d 6e 20 27 78 27 20 69 73 0a  f column 'x' is.
20510 20 20 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74      ** the first
20520 20 6f 6e 65 20 61 66 74 65 72 20 74 68 65 20 6e   one after the n
20530 45 71 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73  Eq equality cons
20540 74 72 61 69 6e 74 73 20 69 6e 20 74 68 65 20 69  traints in the i
20550 6e 64 65 78 2c 0a 20 20 20 20 2a 2a 20 74 68 69  ndex,.    ** thi
20560 73 20 72 65 71 75 69 72 65 73 20 73 6f 6d 65 20  s requires some 
20570 73 70 65 63 69 61 6c 20 68 61 6e 64 6c 69 6e 67  special handling
20580 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
20590 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72  ert( pWInfo->pOr
205a0 64 65 72 42 79 3d 3d 30 0a 20 20 20 20 20 20 20  derBy==0.       
205b0 20 20 7c 7c 20 70 57 49 6e 66 6f 2d 3e 70 4f 72    || pWInfo->pOr
205c0 64 65 72 42 79 2d 3e 6e 45 78 70 72 3d 3d 31 0a  derBy->nExpr==1.
205d0 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70 57 49           || (pWI
205e0 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 26  nfo->wctrlFlags&
205f0 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49  WHERE_ORDERBY_MI
20600 4e 29 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  N)==0 );.    if(
20610 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46   (pWInfo->wctrlF
20620 6c 61 67 73 26 57 48 45 52 45 5f 4f 52 44 45 52  lags&WHERE_ORDER
20630 42 59 5f 4d 49 4e 29 21 3d 30 0a 20 20 20 20 20  BY_MIN)!=0.     
20640 26 26 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61  && pWInfo->nOBSa
20650 74 3e 30 0a 20 20 20 20 20 26 26 20 28 70 49 64  t>0.     && (pId
20660 78 2d 3e 6e 4b 65 79 43 6f 6c 3e 6e 45 71 29 0a  x->nKeyCol>nEq).
20670 20 20 20 20 29 7b 0a 20 20 20 20 20 20 61 73 73      ){.      ass
20680 65 72 74 28 20 70 4c 6f 6f 70 2d 3e 6e 53 6b 69  ert( pLoop->nSki
20690 70 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 53  p==0 );.      bS
206a0 65 65 6b 50 61 73 74 4e 75 6c 6c 20 3d 20 31 3b  eekPastNull = 1;
206b0 0a 20 20 20 20 20 20 6e 45 78 74 72 61 52 65 67  .      nExtraReg
206c0 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   = 1;.    }..   
206d0 20 2f 2a 20 46 69 6e 64 20 61 6e 79 20 69 6e 65   /* Find any ine
206e0 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
206f0 6e 74 20 74 65 72 6d 73 20 66 6f 72 20 74 68 65  nt terms for the
20700 20 73 74 61 72 74 20 61 6e 64 20 65 6e 64 20 0a   start and end .
20710 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 72 61      ** of the ra
20720 6e 67 65 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20  nge. .    */.   
20730 20 6a 20 3d 20 6e 45 71 3b 0a 20 20 20 20 69 66   j = nEq;.    if
20740 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  ( pLoop->wsFlags
20750 20 26 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d   & WHERE_BTM_LIM
20760 49 54 20 29 7b 0a 20 20 20 20 20 20 70 52 61 6e  IT ){.      pRan
20770 67 65 53 74 61 72 74 20 3d 20 70 4c 6f 6f 70 2d  geStart = pLoop-
20780 3e 61 4c 54 65 72 6d 5b 6a 2b 2b 5d 3b 0a 20 20  >aLTerm[j++];.  
20790 20 20 20 20 6e 45 78 74 72 61 52 65 67 20 3d 20      nExtraReg = 
207a0 31 3b 0a 20 20 20 20 20 20 2f 2a 20 4c 69 6b 65  1;.      /* Like
207b0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 72 61   optimization ra
207c0 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  nge constraints 
207d0 61 6c 77 61 79 73 20 6f 63 63 75 72 20 69 6e 20  always occur in 
207e0 70 61 69 72 73 20 2a 2f 0a 20 20 20 20 20 20 61  pairs */.      a
207f0 73 73 65 72 74 28 20 28 70 52 61 6e 67 65 53 74  ssert( (pRangeSt
20800 61 72 74 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  art->wtFlags & T
20810 45 52 4d 5f 4c 49 4b 45 4f 50 54 29 3d 3d 30 20  ERM_LIKEOPT)==0 
20820 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  || .            
20830 20 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67    (pLoop->wsFlag
20840 73 20 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49  s & WHERE_TOP_LI
20850 4d 49 54 29 21 3d 30 20 29 3b 0a 20 20 20 20 7d  MIT)!=0 );.    }
20860 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e  .    if( pLoop->
20870 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
20880 54 4f 50 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20  TOP_LIMIT ){.   
20890 20 20 20 70 52 61 6e 67 65 45 6e 64 20 3d 20 70     pRangeEnd = p
208a0 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 2b 2b  Loop->aLTerm[j++
208b0 5d 3b 0a 20 20 20 20 20 20 6e 45 78 74 72 61 52  ];.      nExtraR
208c0 65 67 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66  eg = 1;.      if
208d0 28 20 28 70 52 61 6e 67 65 45 6e 64 2d 3e 77 74  ( (pRangeEnd->wt
208e0 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 4c 49 4b  Flags & TERM_LIK
208f0 45 4f 50 54 29 21 3d 30 20 29 7b 0a 20 20 20 20  EOPT)!=0 ){.    
20900 20 20 20 20 61 73 73 65 72 74 28 20 70 52 61 6e      assert( pRan
20910 67 65 53 74 61 72 74 21 3d 30 20 29 3b 20 20 20  geStart!=0 );   
20920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20930 20 20 2f 2a 20 4c 49 4b 45 20 6f 70 74 20 63 6f    /* LIKE opt co
20940 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 20  nstraints */.   
20950 20 20 20 20 20 61 73 73 65 72 74 28 20 70 52 61       assert( pRa
20960 6e 67 65 53 74 61 72 74 2d 3e 77 74 46 6c 61 67  ngeStart->wtFlag
20970 73 20 26 20 54 45 52 4d 5f 4c 49 4b 45 4f 50 54  s & TERM_LIKEOPT
20980 20 29 3b 20 20 20 2f 2a 20 6f 63 63 75 72 20 69   );   /* occur i
20990 6e 20 70 61 69 72 73 20 2a 2f 0a 20 20 20 20 20  n pairs */.     
209a0 20 20 20 70 4c 65 76 65 6c 2d 3e 69 4c 69 6b 65     pLevel->iLike
209b0 52 65 70 43 6e 74 72 20 3d 20 2b 2b 70 50 61 72  RepCntr = ++pPar
209c0 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
209d0 20 20 74 65 73 74 63 61 73 65 28 20 62 52 65 76    testcase( bRev
209e0 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74   );.        test
209f0 63 61 73 65 28 20 70 49 64 78 2d 3e 61 53 6f 72  case( pIdx->aSor
20a00 74 4f 72 64 65 72 5b 6e 45 71 5d 3d 3d 53 51 4c  tOrder[nEq]==SQL
20a10 49 54 45 5f 53 4f 5f 44 45 53 43 20 29 3b 0a 20  ITE_SO_DESC );. 
20a20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
20a30 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
20a40 6e 74 65 67 65 72 2c 0a 20 20 20 20 20 20 20 20  nteger,.        
20a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20a60 20 20 62 52 65 76 20 5e 20 28 70 49 64 78 2d 3e    bRev ^ (pIdx->
20a70 61 53 6f 72 74 4f 72 64 65 72 5b 6e 45 71 5d 3d  aSortOrder[nEq]=
20a80 3d 53 51 4c 49 54 45 5f 53 4f 5f 44 45 53 43 29  =SQLITE_SO_DESC)
20a90 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
20aa0 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 65 76              pLev
20ab0 65 6c 2d 3e 69 4c 69 6b 65 52 65 70 43 6e 74 72  el->iLikeRepCntr
20ac0 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
20ad0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4c 49 4b 45  omment((v, "LIKE
20ae0 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 22 29 29   loop counter"))
20af0 3b 0a 20 20 20 20 20 20 20 20 70 4c 65 76 65 6c  ;.        pLevel
20b00 2d 3e 61 64 64 72 4c 69 6b 65 52 65 70 20 3d 20  ->addrLikeRep = 
20b10 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
20b20 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20  ntAddr(v);.     
20b30 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 52 61   }.      if( pRa
20b40 6e 67 65 53 74 61 72 74 3d 3d 30 0a 20 20 20 20  ngeStart==0.    
20b50 20 20 20 26 26 20 28 6a 20 3d 20 70 49 64 78 2d     && (j = pIdx-
20b60 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 45 71 5d 29 3e  >aiColumn[nEq])>
20b70 3d 30 20 0a 20 20 20 20 20 20 20 26 26 20 70 49  =0 .       && pI
20b80 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c  dx->pTable->aCol
20b90 5b 6a 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 0a 20  [j].notNull==0. 
20ba0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
20bb0 62 53 65 65 6b 50 61 73 74 4e 75 6c 6c 20 3d 20  bSeekPastNull = 
20bc0 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
20bd0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 52 61  .    assert( pRa
20be0 6e 67 65 45 6e 64 3d 3d 30 20 7c 7c 20 28 70 52  ngeEnd==0 || (pR
20bf0 61 6e 67 65 45 6e 64 2d 3e 77 74 46 6c 61 67 73  angeEnd->wtFlags
20c00 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d   & TERM_VNULL)==
20c10 30 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 47 65 6e  0 );..    /* Gen
20c20 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 65 76  erate code to ev
20c30 61 6c 75 61 74 65 20 61 6c 6c 20 63 6f 6e 73 74  aluate all const
20c40 72 61 69 6e 74 20 74 65 72 6d 73 20 75 73 69 6e  raint terms usin
20c50 67 20 3d 3d 20 6f 72 20 49 4e 0a 20 20 20 20 2a  g == or IN.    *
20c60 2a 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20  * and store the 
20c70 76 61 6c 75 65 73 20 6f 66 20 74 68 6f 73 65 20  values of those 
20c80 74 65 72 6d 73 20 69 6e 20 61 6e 20 61 72 72 61  terms in an arra
20c90 79 20 6f 66 20 72 65 67 69 73 74 65 72 73 0a 20  y of registers. 
20ca0 20 20 20 2a 2a 20 73 74 61 72 74 69 6e 67 20 61     ** starting a
20cb0 74 20 72 65 67 42 61 73 65 2e 0a 20 20 20 20 2a  t regBase..    *
20cc0 2f 0a 20 20 20 20 72 65 67 42 61 73 65 20 3d 20  /.    regBase = 
20cd0 63 6f 64 65 41 6c 6c 45 71 75 61 6c 69 74 79 54  codeAllEqualityT
20ce0 65 72 6d 73 28 70 50 61 72 73 65 2c 70 4c 65 76  erms(pParse,pLev
20cf0 65 6c 2c 62 52 65 76 2c 6e 45 78 74 72 61 52 65  el,bRev,nExtraRe
20d00 67 2c 26 7a 53 74 61 72 74 41 66 66 29 3b 0a 20  g,&zStartAff);. 
20d10 20 20 20 61 73 73 65 72 74 28 20 7a 53 74 61 72     assert( zStar
20d20 74 41 66 66 3d 3d 30 20 7c 7c 20 73 71 6c 69 74  tAff==0 || sqlit
20d30 65 33 53 74 72 6c 65 6e 33 30 28 7a 53 74 61 72  e3Strlen30(zStar
20d40 74 41 66 66 29 3e 3d 6e 45 71 20 29 3b 0a 20 20  tAff)>=nEq );.  
20d50 20 20 69 66 28 20 7a 53 74 61 72 74 41 66 66 20    if( zStartAff 
20d60 29 20 63 45 6e 64 41 66 66 20 3d 20 7a 53 74 61  ) cEndAff = zSta
20d70 72 74 41 66 66 5b 6e 45 71 5d 3b 0a 20 20 20 20  rtAff[nEq];.    
20d80 61 64 64 72 4e 78 74 20 3d 20 70 4c 65 76 65 6c  addrNxt = pLevel
20d90 2d 3e 61 64 64 72 4e 78 74 3b 0a 0a 20 20 20 20  ->addrNxt;..    
20da0 2f 2a 20 49 66 20 77 65 20 61 72 65 20 64 6f 69  /* If we are doi
20db0 6e 67 20 61 20 72 65 76 65 72 73 65 20 6f 72 64  ng a reverse ord
20dc0 65 72 20 73 63 61 6e 20 6f 6e 20 61 6e 20 61 73  er scan on an as
20dd0 63 65 6e 64 69 6e 67 20 69 6e 64 65 78 2c 20 6f  cending index, o
20de0 72 0a 20 20 20 20 2a 2a 20 61 20 66 6f 72 77 61  r.    ** a forwa
20df0 72 64 20 6f 72 64 65 72 20 73 63 61 6e 20 6f 6e  rd order scan on
20e00 20 61 20 64 65 73 63 65 6e 64 69 6e 67 20 69 6e   a descending in
20e10 64 65 78 2c 20 69 6e 74 65 72 63 68 61 6e 67 65  dex, interchange
20e20 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 73 74 61   the .    ** sta
20e30 72 74 20 61 6e 64 20 65 6e 64 20 74 65 72 6d 73  rt and end terms
20e40 20 28 70 52 61 6e 67 65 53 74 61 72 74 20 61 6e   (pRangeStart an
20e50 64 20 70 52 61 6e 67 65 45 6e 64 29 2e 0a 20 20  d pRangeEnd)..  
20e60 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 6e 45    */.    if( (nE
20e70 71 3c 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 20  q<pIdx->nKeyCol 
20e80 26 26 20 62 52 65 76 3d 3d 28 70 49 64 78 2d 3e  && bRev==(pIdx->
20e90 61 53 6f 72 74 4f 72 64 65 72 5b 6e 45 71 5d 3d  aSortOrder[nEq]=
20ea0 3d 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43 29 29  =SQLITE_SO_ASC))
20eb0 0a 20 20 20 20 20 7c 7c 20 28 62 52 65 76 20 26  .     || (bRev &
20ec0 26 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3d  & pIdx->nKeyCol=
20ed0 3d 6e 45 71 29 0a 20 20 20 20 29 7b 0a 20 20 20  =nEq).    ){.   
20ee0 20 20 20 53 57 41 50 28 57 68 65 72 65 54 65 72     SWAP(WhereTer
20ef0 6d 20 2a 2c 20 70 52 61 6e 67 65 45 6e 64 2c 20  m *, pRangeEnd, 
20f00 70 52 61 6e 67 65 53 74 61 72 74 29 3b 0a 20 20  pRangeStart);.  
20f10 20 20 20 20 53 57 41 50 28 75 38 2c 20 62 53 65      SWAP(u8, bSe
20f20 65 6b 50 61 73 74 4e 75 6c 6c 2c 20 62 53 74 6f  ekPastNull, bSto
20f30 70 41 74 4e 75 6c 6c 29 3b 0a 20 20 20 20 7d 0a  pAtNull);.    }.
20f40 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
20f50 52 61 6e 67 65 53 74 61 72 74 20 26 26 20 28 70  RangeStart && (p
20f60 52 61 6e 67 65 53 74 61 72 74 2d 3e 65 4f 70 65  RangeStart->eOpe
20f70 72 61 74 6f 72 20 26 20 57 4f 5f 4c 45 29 21 3d  rator & WO_LE)!=
20f80 30 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  0 );.    testcas
20f90 65 28 20 70 52 61 6e 67 65 53 74 61 72 74 20 26  e( pRangeStart &
20fa0 26 20 28 70 52 61 6e 67 65 53 74 61 72 74 2d 3e  & (pRangeStart->
20fb0 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 47  eOperator & WO_G
20fc0 45 29 21 3d 30 20 29 3b 0a 20 20 20 20 74 65 73  E)!=0 );.    tes
20fd0 74 63 61 73 65 28 20 70 52 61 6e 67 65 45 6e 64  tcase( pRangeEnd
20fe0 20 26 26 20 28 70 52 61 6e 67 65 45 6e 64 2d 3e   && (pRangeEnd->
20ff0 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 4c  eOperator & WO_L
21000 45 29 21 3d 30 20 29 3b 0a 20 20 20 20 74 65 73  E)!=0 );.    tes
21010 74 63 61 73 65 28 20 70 52 61 6e 67 65 45 6e 64  tcase( pRangeEnd
21020 20 26 26 20 28 70 52 61 6e 67 65 45 6e 64 2d 3e   && (pRangeEnd->
21030 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 47  eOperator & WO_G
21040 45 29 21 3d 30 20 29 3b 0a 20 20 20 20 73 74 61  E)!=0 );.    sta
21050 72 74 45 71 20 3d 20 21 70 52 61 6e 67 65 53 74  rtEq = !pRangeSt
21060 61 72 74 20 7c 7c 20 70 52 61 6e 67 65 53 74 61  art || pRangeSta
21070 72 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rt->eOperator & 
21080 28 57 4f 5f 4c 45 7c 57 4f 5f 47 45 29 3b 0a 20  (WO_LE|WO_GE);. 
21090 20 20 20 65 6e 64 45 71 20 3d 20 20 20 21 70 52     endEq =   !pR
210a0 61 6e 67 65 45 6e 64 20 7c 7c 20 70 52 61 6e 67  angeEnd || pRang
210b0 65 45 6e 64 2d 3e 65 4f 70 65 72 61 74 6f 72 20  eEnd->eOperator 
210c0 26 20 28 57 4f 5f 4c 45 7c 57 4f 5f 47 45 29 3b  & (WO_LE|WO_GE);
210d0 0a 20 20 20 20 73 74 61 72 74 5f 63 6f 6e 73 74  .    start_const
210e0 72 61 69 6e 74 73 20 3d 20 70 52 61 6e 67 65 53  raints = pRangeS
210f0 74 61 72 74 20 7c 7c 20 6e 45 71 3e 30 3b 0a 0a  tart || nEq>0;..
21100 20 20 20 20 2f 2a 20 53 65 65 6b 20 74 68 65 20      /* Seek the 
21110 69 6e 64 65 78 20 63 75 72 73 6f 72 20 74 6f 20  index cursor to 
21120 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
21130 20 72 61 6e 67 65 2e 20 2a 2f 0a 20 20 20 20 6e   range. */.    n
21140 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 6e 45 71  Constraint = nEq
21150 3b 0a 20 20 20 20 69 66 28 20 70 52 61 6e 67 65  ;.    if( pRange
21160 53 74 61 72 74 20 29 7b 0a 20 20 20 20 20 20 45  Start ){.      E
21170 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70 52  xpr *pRight = pR
21180 61 6e 67 65 53 74 61 72 74 2d 3e 70 45 78 70 72  angeStart->pExpr
21190 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  ->pRight;.      
211a0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
211b0 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 2c 20  pParse, pRight, 
211c0 72 65 67 42 61 73 65 2b 6e 45 71 29 3b 0a 20 20  regBase+nEq);.  
211d0 20 20 20 20 77 68 65 72 65 4c 69 6b 65 4f 70 74      whereLikeOpt
211e0 69 6d 69 7a 61 74 69 6f 6e 53 74 72 69 6e 67 46  imizationStringF
211f0 69 78 75 70 28 76 2c 20 70 4c 65 76 65 6c 2c 20  ixup(v, pLevel, 
21200 70 52 61 6e 67 65 53 74 61 72 74 29 3b 0a 20 20  pRangeStart);.  
21210 20 20 20 20 69 66 28 20 28 70 52 61 6e 67 65 53      if( (pRangeS
21220 74 61 72 74 2d 3e 77 74 46 6c 61 67 73 20 26 20  tart->wtFlags & 
21230 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 0a 20  TERM_VNULL)==0. 
21240 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
21250 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28 70 52  ExprCanBeNull(pR
21260 69 67 68 74 29 0a 20 20 20 20 20 20 29 7b 0a 20  ight).      ){. 
21270 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
21280 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
21290 73 4e 75 6c 6c 2c 20 72 65 67 42 61 73 65 2b 6e  sNull, regBase+n
212a0 45 71 2c 20 61 64 64 72 4e 78 74 29 3b 0a 20 20  Eq, addrNxt);.  
212b0 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
212c0 67 65 28 76 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ge(v);.      }. 
212d0 20 20 20 20 20 69 66 28 20 7a 53 74 61 72 74 41       if( zStartA
212e0 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  ff ){.        if
212f0 28 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65  ( sqlite3Compare
21300 41 66 66 69 6e 69 74 79 28 70 52 69 67 68 74 2c  Affinity(pRight,
21310 20 7a 53 74 61 72 74 41 66 66 5b 6e 45 71 5d 29   zStartAff[nEq])
21320 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  ==SQLITE_AFF_NON
21330 45 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  E){.          /*
21340 20 53 69 6e 63 65 20 74 68 65 20 63 6f 6d 70 61   Since the compa
21350 72 69 73 6f 6e 20 69 73 20 74 6f 20 62 65 20 70  rison is to be p
21360 65 72 66 6f 72 6d 65 64 20 77 69 74 68 20 6e 6f  erformed with no
21370 20 63 6f 6e 76 65 72 73 69 6f 6e 73 0a 20 20 20   conversions.   
21380 20 20 20 20 20 20 20 2a 2a 20 61 70 70 6c 69 65         ** applie
21390 64 20 74 6f 20 74 68 65 20 6f 70 65 72 61 6e 64  d to the operand
213a0 73 2c 20 73 65 74 20 74 68 65 20 61 66 66 69 6e  s, set the affin
213b0 69 74 79 20 74 6f 20 61 70 70 6c 79 20 74 6f 20  ity to apply to 
213c0 70 52 69 67 68 74 20 74 6f 20 0a 20 20 20 20 20  pRight to .     
213d0 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 41       ** SQLITE_A
213e0 46 46 5f 4e 4f 4e 45 2e 20 20 2a 2f 0a 20 20 20  FF_NONE.  */.   
213f0 20 20 20 20 20 20 20 7a 53 74 61 72 74 41 66 66         zStartAff
21400 5b 6e 45 71 5d 20 3d 20 53 51 4c 49 54 45 5f 41  [nEq] = SQLITE_A
21410 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20  FF_NONE;.       
21420 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 73   }.        if( s
21430 71 6c 69 74 65 33 45 78 70 72 4e 65 65 64 73 4e  qlite3ExprNeedsN
21440 6f 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  oAffinityChange(
21450 70 52 69 67 68 74 2c 20 7a 53 74 61 72 74 41 66  pRight, zStartAf
21460 66 5b 6e 45 71 5d 29 20 29 7b 0a 20 20 20 20 20  f[nEq]) ){.     
21470 20 20 20 20 20 7a 53 74 61 72 74 41 66 66 5b 6e       zStartAff[n
21480 45 71 5d 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  Eq] = SQLITE_AFF
21490 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d  _NONE;.        }
214a0 0a 20 20 20 20 20 20 7d 20 20 0a 20 20 20 20 20  .      }  .     
214b0 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b 0a   nConstraint++;.
214c0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
214d0 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 77 74 46  pRangeStart->wtF
214e0 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54  lags & TERM_VIRT
214f0 55 41 4c 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65  UAL );.    }else
21500 20 69 66 28 20 62 53 65 65 6b 50 61 73 74 4e 75   if( bSeekPastNu
21510 6c 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ll ){.      sqli
21520 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
21530 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65 67   OP_Null, 0, reg
21540 42 61 73 65 2b 6e 45 71 29 3b 0a 20 20 20 20 20  Base+nEq);.     
21550 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b 0a   nConstraint++;.
21560 20 20 20 20 20 20 73 74 61 72 74 45 71 20 3d 20        startEq = 
21570 30 3b 0a 20 20 20 20 20 20 73 74 61 72 74 5f 63  0;.      start_c
21580 6f 6e 73 74 72 61 69 6e 74 73 20 3d 20 31 3b 0a  onstraints = 1;.
21590 20 20 20 20 7d 0a 20 20 20 20 63 6f 64 65 41 70      }.    codeAp
215a0 70 6c 79 41 66 66 69 6e 69 74 79 28 70 50 61 72  plyAffinity(pPar
215b0 73 65 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f  se, regBase, nCo
215c0 6e 73 74 72 61 69 6e 74 20 2d 20 62 53 65 65 6b  nstraint - bSeek
215d0 50 61 73 74 4e 75 6c 6c 2c 20 7a 53 74 61 72 74  PastNull, zStart
215e0 41 66 66 29 3b 0a 20 20 20 20 6f 70 20 3d 20 61  Aff);.    op = a
215f0 53 74 61 72 74 4f 70 5b 28 73 74 61 72 74 5f 63  StartOp[(start_c
21600 6f 6e 73 74 72 61 69 6e 74 73 3c 3c 32 29 20 2b  onstraints<<2) +
21610 20 28 73 74 61 72 74 45 71 3c 3c 31 29 20 2b 20   (startEq<<1) + 
21620 62 52 65 76 5d 3b 0a 20 20 20 20 61 73 73 65 72  bRev];.    asser
21630 74 28 20 6f 70 21 3d 30 20 29 3b 0a 20 20 20 20  t( op!=0 );.    
21640 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
21650 34 49 6e 74 28 76 2c 20 6f 70 2c 20 69 49 64 78  4Int(v, op, iIdx
21660 43 75 72 2c 20 61 64 64 72 4e 78 74 2c 20 72 65  Cur, addrNxt, re
21670 67 42 61 73 65 2c 20 6e 43 6f 6e 73 74 72 61 69  gBase, nConstrai
21680 6e 74 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76  nt);.    VdbeCov
21690 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 56 64  erage(v);.    Vd
216a0 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
216b0 6f 70 3d 3d 4f 50 5f 52 65 77 69 6e 64 29 3b 20  op==OP_Rewind); 
216c0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f   testcase( op==O
216d0 50 5f 52 65 77 69 6e 64 20 29 3b 0a 20 20 20 20  P_Rewind );.    
216e0 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
216f0 2c 20 6f 70 3d 3d 4f 50 5f 4c 61 73 74 29 3b 20  , op==OP_Last); 
21700 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
21710 3d 4f 50 5f 4c 61 73 74 20 29 3b 0a 20 20 20 20  =OP_Last );.    
21720 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
21730 2c 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 47 54 29  , op==OP_SeekGT)
21740 3b 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d  ;  testcase( op=
21750 3d 4f 50 5f 53 65 65 6b 47 54 20 29 3b 0a 20 20  =OP_SeekGT );.  
21760 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
21770 28 76 2c 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 47  (v, op==OP_SeekG
21780 45 29 3b 20 20 74 65 73 74 63 61 73 65 28 20 6f  E);  testcase( o
21790 70 3d 3d 4f 50 5f 53 65 65 6b 47 45 20 29 3b 0a  p==OP_SeekGE );.
217a0 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
217b0 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 53 65 65  If(v, op==OP_See
217c0 6b 4c 45 29 3b 20 20 74 65 73 74 63 61 73 65 28  kLE);  testcase(
217d0 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 4c 45 20 29   op==OP_SeekLE )
217e0 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61  ;.    VdbeCovera
217f0 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 53  geIf(v, op==OP_S
21800 65 65 6b 4c 54 29 3b 20 20 74 65 73 74 63 61 73  eekLT);  testcas
21810 65 28 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 4c 54  e( op==OP_SeekLT
21820 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 4c 6f 61 64   );..    /* Load
21830 20 74 68 65 20 76 61 6c 75 65 20 66 6f 72 20 74   the value for t
21840 68 65 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f  he inequality co
21850 6e 73 74 72 61 69 6e 74 20 61 74 20 74 68 65 20  nstraint at the 
21860 65 6e 64 20 6f 66 20 74 68 65 0a 20 20 20 20 2a  end of the.    *
21870 2a 20 72 61 6e 67 65 20 28 69 66 20 61 6e 79 29  * range (if any)
21880 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e 43 6f  ..    */.    nCo
21890 6e 73 74 72 61 69 6e 74 20 3d 20 6e 45 71 3b 0a  nstraint = nEq;.
218a0 20 20 20 20 69 66 28 20 70 52 61 6e 67 65 45 6e      if( pRangeEn
218b0 64 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  d ){.      Expr 
218c0 2a 70 52 69 67 68 74 20 3d 20 70 52 61 6e 67 65  *pRight = pRange
218d0 45 6e 64 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67  End->pExpr->pRig
218e0 68 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ht;.      sqlite
218f0 33 45 78 70 72 43 61 63 68 65 52 65 6d 6f 76 65  3ExprCacheRemove
21900 28 70 50 61 72 73 65 2c 20 72 65 67 42 61 73 65  (pParse, regBase
21910 2b 6e 45 71 2c 20 31 29 3b 0a 20 20 20 20 20 20  +nEq, 1);.      
21920 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
21930 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 2c 20  pParse, pRight, 
21940 72 65 67 42 61 73 65 2b 6e 45 71 29 3b 0a 20 20  regBase+nEq);.  
21950 20 20 20 20 77 68 65 72 65 4c 69 6b 65 4f 70 74      whereLikeOpt
21960 69 6d 69 7a 61 74 69 6f 6e 53 74 72 69 6e 67 46  imizationStringF
21970 69 78 75 70 28 76 2c 20 70 4c 65 76 65 6c 2c 20  ixup(v, pLevel, 
21980 70 52 61 6e 67 65 45 6e 64 29 3b 0a 20 20 20 20  pRangeEnd);.    
21990 20 20 69 66 28 20 28 70 52 61 6e 67 65 45 6e 64    if( (pRangeEnd
219a0 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
219b0 5f 56 4e 55 4c 4c 29 3d 3d 30 0a 20 20 20 20 20  _VNULL)==0.     
219c0 20 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72    && sqlite3Expr
219d0 43 61 6e 42 65 4e 75 6c 6c 28 70 52 69 67 68 74  CanBeNull(pRight
219e0 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  ).      ){.     
219f0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
21a00 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c  dOp2(v, OP_IsNul
21a10 6c 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 2c 20  l, regBase+nEq, 
21a20 61 64 64 72 4e 78 74 29 3b 0a 20 20 20 20 20 20  addrNxt);.      
21a30 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
21a40 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
21a50 20 69 66 28 20 73 71 6c 69 74 65 33 43 6f 6d 70   if( sqlite3Comp
21a60 61 72 65 41 66 66 69 6e 69 74 79 28 70 52 69 67  areAffinity(pRig
21a70 68 74 2c 20 63 45 6e 64 41 66 66 29 21 3d 53 51  ht, cEndAff)!=SQ
21a80 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 0a 20 20  LITE_AFF_NONE.  
21a90 20 20 20 20 20 26 26 20 21 73 71 6c 69 74 65 33       && !sqlite3
21aa0 45 78 70 72 4e 65 65 64 73 4e 6f 41 66 66 69 6e  ExprNeedsNoAffin
21ab0 69 74 79 43 68 61 6e 67 65 28 70 52 69 67 68 74  ityChange(pRight
21ac0 2c 20 63 45 6e 64 41 66 66 29 0a 20 20 20 20 20  , cEndAff).     
21ad0 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65   ){.        code
21ae0 41 70 70 6c 79 41 66 66 69 6e 69 74 79 28 70 50  ApplyAffinity(pP
21af0 61 72 73 65 2c 20 72 65 67 42 61 73 65 2b 6e 45  arse, regBase+nE
21b00 71 2c 20 31 2c 20 26 63 45 6e 64 41 66 66 29 3b  q, 1, &cEndAff);
21b10 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e  .      }.      n
21b20 43 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b 0a 20 20  Constraint++;.  
21b30 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 52      testcase( pR
21b40 61 6e 67 65 45 6e 64 2d 3e 77 74 46 6c 61 67 73  angeEnd->wtFlags
21b50 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20   & TERM_VIRTUAL 
21b60 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
21b70 20 62 53 74 6f 70 41 74 4e 75 6c 6c 20 29 7b 0a   bStopAtNull ){.
21b80 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
21b90 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75  eAddOp2(v, OP_Nu
21ba0 6c 6c 2c 20 30 2c 20 72 65 67 42 61 73 65 2b 6e  ll, 0, regBase+n
21bb0 45 71 29 3b 0a 20 20 20 20 20 20 65 6e 64 45 71  Eq);.      endEq
21bc0 20 3d 20 30 3b 0a 20 20 20 20 20 20 6e 43 6f 6e   = 0;.      nCon
21bd0 73 74 72 61 69 6e 74 2b 2b 3b 0a 20 20 20 20 7d  straint++;.    }
21be0 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
21bf0 65 65 28 64 62 2c 20 7a 53 74 61 72 74 41 66 66  ee(db, zStartAff
21c00 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 6f 70 20 6f  );..    /* Top o
21c10 66 20 74 68 65 20 6c 6f 6f 70 20 62 6f 64 79 20  f the loop body 
21c20 2a 2f 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  */.    pLevel->p
21c30 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  2 = sqlite3VdbeC
21c40 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 0a  urrentAddr(v);..
21c50 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20      /* Check if 
21c60 74 68 65 20 69 6e 64 65 78 20 63 75 72 73 6f 72  the index cursor
21c70 20 69 73 20 70 61 73 74 20 74 68 65 20 65 6e 64   is past the end
21c80 20 6f 66 20 74 68 65 20 72 61 6e 67 65 2e 20 2a   of the range. *
21c90 2f 0a 20 20 20 20 69 66 28 20 6e 43 6f 6e 73 74  /.    if( nConst
21ca0 72 61 69 6e 74 20 29 7b 0a 20 20 20 20 20 20 6f  raint ){.      o
21cb0 70 20 3d 20 61 45 6e 64 4f 70 5b 62 52 65 76 2a  p = aEndOp[bRev*
21cc0 32 20 2b 20 65 6e 64 45 71 5d 3b 0a 20 20 20 20  2 + endEq];.    
21cd0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
21ce0 4f 70 34 49 6e 74 28 76 2c 20 6f 70 2c 20 69 49  Op4Int(v, op, iI
21cf0 64 78 43 75 72 2c 20 61 64 64 72 4e 78 74 2c 20  dxCur, addrNxt, 
21d00 72 65 67 42 61 73 65 2c 20 6e 43 6f 6e 73 74 72  regBase, nConstr
21d10 61 69 6e 74 29 3b 0a 20 20 20 20 20 20 74 65 73  aint);.      tes
21d20 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 49 64  tcase( op==OP_Id
21d30 78 47 54 20 29 3b 20 20 56 64 62 65 43 6f 76 65  xGT );  VdbeCove
21d40 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50  rageIf(v, op==OP
21d50 5f 49 64 78 47 54 20 29 3b 0a 20 20 20 20 20 20  _IdxGT );.      
21d60 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50  testcase( op==OP
21d70 5f 49 64 78 47 45 20 29 3b 20 20 56 64 62 65 43  _IdxGE );  VdbeC
21d80 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d  overageIf(v, op=
21d90 3d 4f 50 5f 49 64 78 47 45 20 29 3b 0a 20 20 20  =OP_IdxGE );.   
21da0 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
21db0 3d 4f 50 5f 49 64 78 4c 54 20 29 3b 20 20 56 64  =OP_IdxLT );  Vd
21dc0 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
21dd0 6f 70 3d 3d 4f 50 5f 49 64 78 4c 54 20 29 3b 0a  op==OP_IdxLT );.
21de0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
21df0 6f 70 3d 3d 4f 50 5f 49 64 78 4c 45 20 29 3b 20  op==OP_IdxLE ); 
21e00 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
21e10 76 2c 20 6f 70 3d 3d 4f 50 5f 49 64 78 4c 45 20  v, op==OP_IdxLE 
21e20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
21e30 20 53 65 65 6b 20 74 68 65 20 74 61 62 6c 65 20   Seek the table 
21e40 63 75 72 73 6f 72 2c 20 69 66 20 72 65 71 75 69  cursor, if requi
21e50 72 65 64 20 2a 2f 0a 20 20 20 20 64 69 73 61 62  red */.    disab
21e60 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70  leTerm(pLevel, p
21e70 52 61 6e 67 65 53 74 61 72 74 29 3b 0a 20 20 20  RangeStart);.   
21e80 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65   disableTerm(pLe
21e90 76 65 6c 2c 20 70 52 61 6e 67 65 45 6e 64 29 3b  vel, pRangeEnd);
21ea0 0a 20 20 20 20 69 66 28 20 6f 6d 69 74 54 61 62  .    if( omitTab
21eb0 6c 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 70  le ){.      /* p
21ec0 49 64 78 20 69 73 20 61 20 63 6f 76 65 72 69 6e  Idx is a coverin
21ed0 67 20 69 6e 64 65 78 2e 20 20 4e 6f 20 6e 65 65  g index.  No nee
21ee0 64 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20  d to access the 
21ef0 6d 61 69 6e 20 74 61 62 6c 65 2e 20 2a 2f 0a 20  main table. */. 
21f00 20 20 20 7d 65 6c 73 65 20 69 66 28 20 48 61 73     }else if( Has
21f10 52 6f 77 69 64 28 70 49 64 78 2d 3e 70 54 61 62  Rowid(pIdx->pTab
21f20 6c 65 29 20 29 7b 0a 20 20 20 20 20 20 69 52 6f  le) ){.      iRo
21f30 77 69 64 52 65 67 20 3d 20 2b 2b 70 50 61 72 73  widReg = ++pPars
21f40 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73  e->nMem;.      s
21f50 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
21f60 28 76 2c 20 4f 50 5f 49 64 78 52 6f 77 69 64 2c  (v, OP_IdxRowid,
21f70 20 69 49 64 78 43 75 72 2c 20 69 52 6f 77 69 64   iIdxCur, iRowid
21f80 52 65 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Reg);.      sqli
21f90 74 65 33 45 78 70 72 43 61 63 68 65 53 74 6f 72  te3ExprCacheStor
21fa0 65 28 70 50 61 72 73 65 2c 20 69 43 75 72 2c 20  e(pParse, iCur, 
21fb0 2d 31 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a  -1, iRowidReg);.
21fc0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
21fd0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65  eAddOp2(v, OP_Se
21fe0 65 6b 2c 20 69 43 75 72 2c 20 69 52 6f 77 69 64  ek, iCur, iRowid
21ff0 52 65 67 29 3b 20 20 2f 2a 20 44 65 66 65 72 72  Reg);  /* Deferr
22000 65 64 20 73 65 65 6b 20 2a 2f 0a 20 20 20 20 7d  ed seek */.    }
22010 65 6c 73 65 20 69 66 28 20 69 43 75 72 21 3d 69  else if( iCur!=i
22020 49 64 78 43 75 72 20 29 7b 0a 20 20 20 20 20 20  IdxCur ){.      
22030 49 6e 64 65 78 20 2a 70 50 6b 20 3d 20 73 71 6c  Index *pPk = sql
22040 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e  ite3PrimaryKeyIn
22050 64 65 78 28 70 49 64 78 2d 3e 70 54 61 62 6c 65  dex(pIdx->pTable
22060 29 3b 0a 20 20 20 20 20 20 69 52 6f 77 69 64 52  );.      iRowidR
22070 65 67 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  eg = sqlite3GetT
22080 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
22090 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 29 3b 0a   pPk->nKeyCol);.
220a0 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
220b0 3c 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a  <pPk->nKeyCol; j
220c0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 6b 20 3d  ++){.        k =
220d0 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f 66   sqlite3ColumnOf
220e0 49 6e 64 65 78 28 70 49 64 78 2c 20 70 50 6b 2d  Index(pIdx, pPk-
220f0 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 29 3b 0a 20  >aiColumn[j]);. 
22100 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
22110 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
22120 6f 6c 75 6d 6e 2c 20 69 49 64 78 43 75 72 2c 20  olumn, iIdxCur, 
22130 6b 2c 20 69 52 6f 77 69 64 52 65 67 2b 6a 29 3b  k, iRowidReg+j);
22140 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
22150 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
22160 49 6e 74 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75  Int(v, OP_NotFou
22170 6e 64 2c 20 69 43 75 72 2c 20 61 64 64 72 43 6f  nd, iCur, addrCo
22180 6e 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  nt,.            
22190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
221a0 52 6f 77 69 64 52 65 67 2c 20 70 50 6b 2d 3e 6e  RowidReg, pPk->n
221b0 4b 65 79 43 6f 6c 29 3b 20 56 64 62 65 43 6f 76  KeyCol); VdbeCov
221c0 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 7d 0a  erage(v);.    }.
221d0 0a 20 20 20 20 2f 2a 20 52 65 63 6f 72 64 20 74  .    /* Record t
221e0 68 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 75  he instruction u
221f0 73 65 64 20 74 6f 20 74 65 72 6d 69 6e 61 74 65  sed to terminate
22200 20 74 68 65 20 6c 6f 6f 70 2e 20 44 69 73 61 62   the loop. Disab
22210 6c 65 20 0a 20 20 20 20 2a 2a 20 57 48 45 52 45  le .    ** WHERE
22220 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 6d 61   clause terms ma
22230 64 65 20 72 65 64 75 6e 64 61 6e 74 20 62 79 20  de redundant by 
22240 74 68 65 20 69 6e 64 65 78 20 72 61 6e 67 65 20  the index range 
22250 73 63 61 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  scan..    */.   
22260 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c   if( pLoop->wsFl
22270 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 52  ags & WHERE_ONER
22280 4f 57 20 29 7b 0a 20 20 20 20 20 20 70 4c 65 76  OW ){.      pLev
22290 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 6f 6f 70  el->op = OP_Noop
222a0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
222b0 62 52 65 76 20 29 7b 0a 20 20 20 20 20 20 70 4c  bRev ){.      pL
222c0 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 50 72  evel->op = OP_Pr
222d0 65 76 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ev;.    }else{. 
222e0 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20       pLevel->op 
222f0 3d 20 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20 7d  = OP_Next;.    }
22300 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20  .    pLevel->p1 
22310 3d 20 69 49 64 78 43 75 72 3b 0a 20 20 20 20 70  = iIdxCur;.    p
22320 4c 65 76 65 6c 2d 3e 70 33 20 3d 20 28 70 4c 6f  Level->p3 = (pLo
22330 6f 70 2d 3e 77 73 46 6c 61 67 73 26 57 48 45 52  op->wsFlags&WHER
22340 45 5f 55 4e 51 5f 57 41 4e 54 45 44 29 21 3d 30  E_UNQ_WANTED)!=0
22350 20 3f 20 31 3a 30 3b 0a 20 20 20 20 69 66 28 20   ? 1:0;.    if( 
22360 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  (pLoop->wsFlags 
22370 26 20 57 48 45 52 45 5f 43 4f 4e 53 54 52 41 49  & WHERE_CONSTRAI
22380 4e 54 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  NT)==0 ){.      
22390 70 4c 65 76 65 6c 2d 3e 70 35 20 3d 20 53 51 4c  pLevel->p5 = SQL
223a0 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 46  ITE_STMTSTATUS_F
223b0 55 4c 4c 53 43 41 4e 5f 53 54 45 50 3b 0a 20 20  ULLSCAN_STEP;.  
223c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
223d0 73 73 65 72 74 28 20 70 4c 65 76 65 6c 2d 3e 70  ssert( pLevel->p
223e0 35 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20  5==0 );.    }.  
223f0 7d 65 6c 73 65 0a 0a 23 69 66 6e 64 65 66 20 53  }else..#ifndef S
22400 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50  QLITE_OMIT_OR_OP
22410 54 49 4d 49 5a 41 54 49 4f 4e 0a 20 20 69 66 28  TIMIZATION.  if(
22420 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20   pLoop->wsFlags 
22430 26 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52  & WHERE_MULTI_OR
22440 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20   ){.    /* Case 
22450 35 3a 20 20 54 77 6f 20 6f 72 20 6d 6f 72 65 20  5:  Two or more 
22460 73 65 70 61 72 61 74 65 6c 79 20 69 6e 64 65 78  separately index
22470 65 64 20 74 65 72 6d 73 20 63 6f 6e 6e 65 63 74  ed terms connect
22480 65 64 20 62 79 20 4f 52 0a 20 20 20 20 2a 2a 0a  ed by OR.    **.
22490 20 20 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a      ** Example:.
224a0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
224b0 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
224c0 61 2c 62 2c 63 2c 64 29 3b 0a 20 20 20 20 2a 2a  a,b,c,d);.    **
224d0 20 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20     CREATE INDEX 
224e0 69 31 20 4f 4e 20 74 31 28 61 29 3b 0a 20 20 20  i1 ON t1(a);.   
224f0 20 2a 2a 20 20 20 43 52 45 41 54 45 20 49 4e 44   **   CREATE IND
22500 45 58 20 69 32 20 4f 4e 20 74 31 28 62 29 3b 0a  EX i2 ON t1(b);.
22510 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20      **   CREATE 
22520 49 4e 44 45 58 20 69 33 20 4f 4e 20 74 31 28 63  INDEX i3 ON t1(c
22530 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  );.    **.    **
22540 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
22550 20 74 31 20 57 48 45 52 45 20 61 3d 35 20 4f 52   t1 WHERE a=5 OR
22560 20 62 3d 37 20 4f 52 20 28 63 3d 31 31 20 41 4e   b=7 OR (c=11 AN
22570 44 20 64 3d 31 33 29 0a 20 20 20 20 2a 2a 0a 20  D d=13).    **. 
22580 20 20 20 2a 2a 20 49 6e 20 74 68 65 20 65 78 61     ** In the exa
22590 6d 70 6c 65 2c 20 74 68 65 72 65 20 61 72 65 20  mple, there are 
225a0 74 68 72 65 65 20 69 6e 64 65 78 65 64 20 74 65  three indexed te
225b0 72 6d 73 20 63 6f 6e 6e 65 63 74 65 64 20 62 79  rms connected by
225c0 20 4f 52 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20   OR..    ** The 
225d0 74 6f 70 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  top of the loop 
225e0 6c 6f 6f 6b 73 20 6c 69 6b 65 20 74 68 69 73 3a  looks like this:
225f0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
22600 20 20 20 20 20 20 20 20 4e 75 6c 6c 20 20 20 20          Null    
22610 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20     1            
22620 20 20 20 20 23 20 5a 65 72 6f 20 74 68 65 20 72      # Zero the r
22630 6f 77 73 65 74 20 69 6e 20 72 65 67 20 31 0a 20  owset in reg 1. 
22640 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
22650 6e 2c 20 66 6f 72 20 65 61 63 68 20 69 6e 64 65  n, for each inde
22660 78 65 64 20 74 65 72 6d 2c 20 74 68 65 20 66 6f  xed term, the fo
22670 6c 6c 6f 77 69 6e 67 2e 20 54 68 65 20 61 72 67  llowing. The arg
22680 75 6d 65 6e 74 73 20 74 6f 0a 20 20 20 20 2a 2a  uments to.    **
22690 20 52 6f 77 53 65 74 54 65 73 74 20 61 72 65 20   RowSetTest are 
226a0 73 75 63 68 20 74 68 61 74 20 74 68 65 20 72 6f  such that the ro
226b0 77 69 64 20 6f 66 20 74 68 65 20 63 75 72 72 65  wid of the curre
226c0 6e 74 20 72 6f 77 20 69 73 20 69 6e 73 65 72 74  nt row is insert
226d0 65 64 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20 74  ed.    ** into t
226e0 68 65 20 52 6f 77 53 65 74 2e 20 49 66 20 69 74  he RowSet. If it
226f0 20 69 73 20 61 6c 72 65 61 64 79 20 70 72 65 73   is already pres
22700 65 6e 74 2c 20 63 6f 6e 74 72 6f 6c 20 73 6b 69  ent, control ski
22710 70 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 47 6f  ps the.    ** Go
22720 73 75 62 20 6f 70 63 6f 64 65 20 61 6e 64 20 6a  sub opcode and j
22730 75 6d 70 73 20 73 74 72 61 69 67 68 74 20 74 6f  umps straight to
22740 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61   the code genera
22750 74 65 64 20 62 79 20 57 68 65 72 65 45 6e 64 28  ted by WhereEnd(
22760 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  )..    **.    **
22770 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57          sqlite3W
22780 68 65 72 65 42 65 67 69 6e 28 3c 74 65 72 6d 3e  hereBegin(<term>
22790 29 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  ).    **        
227a0 20 20 52 6f 77 53 65 74 54 65 73 74 20 20 20 20    RowSetTest    
227b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
227c0 49 6e 73 65 72 74 20 72 6f 77 69 64 20 69 6e 74  Insert rowid int
227d0 6f 20 72 6f 77 73 65 74 0a 20 20 20 20 2a 2a 20  o rowset.    ** 
227e0 20 20 20 20 20 20 20 20 20 47 6f 73 75 62 20 20           Gosub  
227f0 20 20 20 20 32 20 41 0a 20 20 20 20 2a 2a 20 20      2 A.    **  
22800 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65        sqlite3Whe
22810 72 65 45 6e 64 28 29 0a 20 20 20 20 2a 2a 0a 20  reEnd().    **. 
22820 20 20 20 2a 2a 20 46 6f 6c 6c 6f 77 69 6e 67 20     ** Following 
22830 74 68 65 20 61 62 6f 76 65 2c 20 63 6f 64 65 20  the above, code 
22840 74 6f 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65  to terminate the
22850 20 6c 6f 6f 70 2e 20 4c 61 62 65 6c 20 41 2c 20   loop. Label A, 
22860 74 68 65 20 74 61 72 67 65 74 0a 20 20 20 20 2a  the target.    *
22870 2a 20 6f 66 20 74 68 65 20 47 6f 73 75 62 20 61  * of the Gosub a
22880 62 6f 76 65 2c 20 6a 75 6d 70 73 20 74 6f 20 74  bove, jumps to t
22890 68 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 72  he instruction r
228a0 69 67 68 74 20 61 66 74 65 72 20 74 68 65 20 47  ight after the G
228b0 6f 74 6f 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  oto..    **.    
228c0 2a 2a 20 20 20 20 20 20 20 20 20 20 4e 75 6c 6c  **          Null
228d0 20 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20         1        
228e0 20 20 20 20 20 20 20 20 23 20 5a 65 72 6f 20 74          # Zero t
228f0 68 65 20 72 6f 77 73 65 74 20 69 6e 20 72 65 67  he rowset in reg
22900 20 31 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20   1.    **       
22910 20 20 20 47 6f 74 6f 20 20 20 20 20 20 20 42 20     Goto       B 
22920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23                 #
22930 20 54 68 65 20 6c 6f 6f 70 20 69 73 20 66 69 6e   The loop is fin
22940 69 73 68 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20  ished..    **.  
22950 20 20 2a 2a 20 20 20 20 20 20 20 41 3a 20 3c 6c    **       A: <l
22960 6f 6f 70 20 62 6f 64 79 3e 20 20 20 20 20 20 20  oop body>       
22970 20 20 20 20 20 20 20 20 20 20 23 20 52 65 74 75            # Retu
22980 72 6e 20 64 61 74 61 2c 20 77 68 61 74 65 76 65  rn data, whateve
22990 72 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  r..    **.    **
229a0 20 20 20 20 20 20 20 20 20 20 52 65 74 75 72 6e            Return
229b0 20 20 20 20 20 32 20 20 20 20 20 20 20 20 20 20       2          
229c0 20 20 20 20 20 20 23 20 4a 75 6d 70 20 62 61 63        # Jump bac
229d0 6b 20 74 6f 20 74 68 65 20 47 6f 73 75 62 0a 20  k to the Gosub. 
229e0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
229f0 20 20 20 42 3a 20 3c 61 66 74 65 72 20 74 68 65     B: <after the
22a00 20 6c 6f 6f 70 3e 0a 20 20 20 20 2a 2a 0a 20 20   loop>.    **.  
22a10 20 20 2a 2a 20 41 64 64 65 64 20 32 30 31 34 2d    ** Added 2014-
22a20 30 35 2d 32 36 3a 20 49 66 20 74 68 65 20 74 61  05-26: If the ta
22a30 62 6c 65 20 69 73 20 61 20 57 49 54 48 4f 55 54  ble is a WITHOUT
22a40 20 52 4f 57 49 44 20 74 61 62 6c 65 2c 20 74 68   ROWID table, th
22a50 65 6e 0a 20 20 20 20 2a 2a 20 75 73 65 20 61 6e  en.    ** use an
22a60 20 65 70 68 65 6d 65 72 61 6c 20 69 6e 64 65 78   ephemeral index
22a70 20 69 6e 73 74 65 61 64 20 6f 66 20 61 20 52 6f   instead of a Ro
22a80 77 53 65 74 20 74 6f 20 72 65 63 6f 72 64 20 74  wSet to record t
22a90 68 65 20 70 72 69 6d 61 72 79 0a 20 20 20 20 2a  he primary.    *
22aa0 2a 20 6b 65 79 73 20 6f 66 20 74 68 65 20 72 6f  * keys of the ro
22ab0 77 73 20 77 65 20 68 61 76 65 20 61 6c 72 65 61  ws we have alrea
22ac0 64 79 20 73 65 65 6e 2e 0a 20 20 20 20 2a 2a 0a  dy seen..    **.
22ad0 20 20 20 20 2a 2f 0a 20 20 20 20 57 68 65 72 65      */.    Where
22ae0 43 6c 61 75 73 65 20 2a 70 4f 72 57 63 3b 20 20  Clause *pOrWc;  
22af0 20 20 2f 2a 20 54 68 65 20 4f 52 2d 63 6c 61 75    /* The OR-clau
22b00 73 65 20 62 72 6f 6b 65 6e 20 6f 75 74 20 69 6e  se broken out in
22b10 74 6f 20 73 75 62 74 65 72 6d 73 20 2a 2f 0a 20  to subterms */. 
22b20 20 20 20 53 72 63 4c 69 73 74 20 2a 70 4f 72 54     SrcList *pOrT
22b30 61 62 3b 20 20 20 20 20 20 20 2f 2a 20 53 68 6f  ab;       /* Sho
22b40 72 74 65 6e 65 64 20 74 61 62 6c 65 20 6c 69 73  rtened table lis
22b50 74 20 6f 72 20 4f 52 2d 63 6c 61 75 73 65 20 67  t or OR-clause g
22b60 65 6e 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 20  eneration */.   
22b70 20 49 6e 64 65 78 20 2a 70 43 6f 76 20 3d 20 30   Index *pCov = 0
22b80 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
22b90 20 50 6f 74 65 6e 74 69 61 6c 20 63 6f 76 65 72   Potential cover
22ba0 69 6e 67 20 69 6e 64 65 78 20 28 6f 72 20 4e 55  ing index (or NU
22bb0 4c 4c 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  LL) */.    int i
22bc0 43 6f 76 43 75 72 20 3d 20 70 50 61 72 73 65 2d  CovCur = pParse-
22bd0 3e 6e 54 61 62 2b 2b 3b 20 20 2f 2a 20 43 75 72  >nTab++;  /* Cur
22be0 73 6f 72 20 75 73 65 64 20 66 6f 72 20 69 6e 64  sor used for ind
22bf0 65 78 20 73 63 61 6e 73 20 28 69 66 20 61 6e 79  ex scans (if any
22c00 29 20 2a 2f 0a 0a 20 20 20 20 69 6e 74 20 72 65  ) */..    int re
22c10 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70 50 61 72  gReturn = ++pPar
22c20 73 65 2d 3e 6e 4d 65 6d 3b 20 20 20 20 20 20 20  se->nMem;       
22c30 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20      /* Register 
22c40 75 73 65 64 20 77 69 74 68 20 4f 50 5f 47 6f 73  used with OP_Gos
22c50 75 62 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65  ub */.    int re
22c60 67 52 6f 77 73 65 74 20 3d 20 30 3b 20 20 20 20  gRowset = 0;    
22c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22c80 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20      /* Register 
22c90 66 6f 72 20 52 6f 77 53 65 74 20 6f 62 6a 65 63  for RowSet objec
22ca0 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65 67  t */.    int reg
22cb0 52 6f 77 69 64 20 3d 20 30 3b 20 20 20 20 20 20  Rowid = 0;      
22cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22cd0 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68     /* Register h
22ce0 6f 6c 64 69 6e 67 20 72 6f 77 69 64 20 2a 2f 0a  olding rowid */.
22cf0 20 20 20 20 69 6e 74 20 69 4c 6f 6f 70 42 6f 64      int iLoopBod
22d00 79 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  y = sqlite3VdbeM
22d10 61 6b 65 4c 61 62 65 6c 28 76 29 3b 20 20 2f 2a  akeLabel(v);  /*
22d20 20 53 74 61 72 74 20 6f 66 20 6c 6f 6f 70 20 62   Start of loop b
22d30 6f 64 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  ody */.    int i
22d40 52 65 74 49 6e 69 74 3b 20 20 20 20 20 20 20 20  RetInit;        
22d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22d60 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
22d70 6f 66 20 72 65 67 52 65 74 75 72 6e 20 69 6e 69  of regReturn ini
22d80 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 75 6e 74  t */.    int unt
22d90 65 73 74 65 64 54 65 72 6d 73 20 3d 20 30 3b 20  estedTerms = 0; 
22da0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
22db0 6f 6d 65 20 74 65 72 6d 73 20 6e 6f 74 20 63 6f  ome terms not co
22dc0 6d 70 6c 65 74 65 6c 79 20 74 65 73 74 65 64 20  mpletely tested 
22dd0 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b 20 20  */.    int ii;  
22de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22df0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
22e00 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20  p counter */.   
22e10 20 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73 3b   u16 wctrlFlags;
22e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22e30 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 66 6f 72      /* Flags for
22e40 20 73 75 62 2d 57 48 45 52 45 20 63 6c 61 75 73   sub-WHERE claus
22e50 65 20 2a 2f 0a 20 20 20 20 45 78 70 72 20 2a 70  e */.    Expr *p
22e60 41 6e 64 45 78 70 72 20 3d 20 30 3b 20 20 20 20  AndExpr = 0;    
22e70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
22e80 6e 20 22 2e 2e 20 41 4e 44 20 28 2e 2e 2e 29 22  n ".. AND (...)"
22e90 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20   expression */. 
22ea0 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
22eb0 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 3b   pTabItem->pTab;
22ec0 0a 20 20 20 0a 20 20 20 20 70 54 65 72 6d 20 3d  .   .    pTerm =
22ed0 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 30   pLoop->aLTerm[0
22ee0 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ];.    assert( p
22ef0 54 65 72 6d 21 3d 30 20 29 3b 0a 20 20 20 20 61  Term!=0 );.    a
22f00 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 65 4f  ssert( pTerm->eO
22f10 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 4f 52 20  perator & WO_OR 
22f20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  );.    assert( (
22f30 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
22f40 20 54 45 52 4d 5f 4f 52 49 4e 46 4f 29 21 3d 30   TERM_ORINFO)!=0
22f50 20 29 3b 0a 20 20 20 20 70 4f 72 57 63 20 3d 20   );.    pOrWc = 
22f60 26 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66  &pTerm->u.pOrInf
22f70 6f 2d 3e 77 63 3b 0a 20 20 20 20 70 4c 65 76 65  o->wc;.    pLeve
22f80 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 52 65 74 75 72  l->op = OP_Retur
22f90 6e 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  n;.    pLevel->p
22fa0 31 20 3d 20 72 65 67 52 65 74 75 72 6e 3b 0a 0a  1 = regReturn;..
22fb0 20 20 20 20 2f 2a 20 53 65 74 20 75 70 20 61 20      /* Set up a 
22fc0 6e 65 77 20 53 72 63 4c 69 73 74 20 69 6e 20 70  new SrcList in p
22fd0 4f 72 54 61 62 20 63 6f 6e 74 61 69 6e 69 6e 67  OrTab containing
22fe0 20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67   the table being
22ff0 20 73 63 61 6e 6e 65 64 0a 20 20 20 20 2a 2a 20   scanned.    ** 
23000 62 79 20 74 68 69 73 20 6c 6f 6f 70 20 69 6e 20  by this loop in 
23010 74 68 65 20 61 5b 30 5d 20 73 6c 6f 74 20 61 6e  the a[0] slot an
23020 64 20 61 6c 6c 20 6e 6f 74 52 65 61 64 79 20 74  d all notReady t
23030 61 62 6c 65 73 20 69 6e 20 61 5b 31 2e 2e 5d 20  ables in a[1..] 
23040 73 6c 6f 74 73 2e 0a 20 20 20 20 2a 2a 20 54 68  slots..    ** Th
23050 69 73 20 62 65 63 6f 6d 65 73 20 74 68 65 20 53  is becomes the S
23060 72 63 4c 69 73 74 20 69 6e 20 74 68 65 20 72 65  rcList in the re
23070 63 75 72 73 69 76 65 20 63 61 6c 6c 20 74 6f 20  cursive call to 
23080 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
23090 6e 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  n()..    */.    
230a0 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76  if( pWInfo->nLev
230b0 65 6c 3e 31 20 29 7b 0a 20 20 20 20 20 20 69 6e  el>1 ){.      in
230c0 74 20 6e 4e 6f 74 52 65 61 64 79 3b 20 20 20 20  t nNotReady;    
230d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
230e0 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6e 6f  The number of no
230f0 74 52 65 61 64 79 20 74 61 62 6c 65 73 20 2a 2f  tReady tables */
23100 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 53 72  .      struct Sr
23110 63 4c 69 73 74 5f 69 74 65 6d 20 2a 6f 72 69 67  cList_item *orig
23120 53 72 63 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67  Src;     /* Orig
23130 69 6e 61 6c 20 6c 69 73 74 20 6f 66 20 74 61 62  inal list of tab
23140 6c 65 73 20 2a 2f 0a 20 20 20 20 20 20 6e 4e 6f  les */.      nNo
23150 74 52 65 61 64 79 20 3d 20 70 57 49 6e 66 6f 2d  tReady = pWInfo-
23160 3e 6e 4c 65 76 65 6c 20 2d 20 69 4c 65 76 65 6c  >nLevel - iLevel
23170 20 2d 20 31 3b 0a 20 20 20 20 20 20 70 4f 72 54   - 1;.      pOrT
23180 61 62 20 3d 20 73 71 6c 69 74 65 33 53 74 61 63  ab = sqlite3Stac
23190 6b 41 6c 6c 6f 63 52 61 77 28 64 62 2c 0a 20 20  kAllocRaw(db,.  
231a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
231b0 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66            sizeof
231c0 28 2a 70 4f 72 54 61 62 29 2b 20 6e 4e 6f 74 52  (*pOrTab)+ nNotR
231d0 65 61 64 79 2a 73 69 7a 65 6f 66 28 70 4f 72 54  eady*sizeof(pOrT
231e0 61 62 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 20 20  ab->a[0]));.    
231f0 20 20 69 66 28 20 70 4f 72 54 61 62 3d 3d 30 20    if( pOrTab==0 
23200 29 20 72 65 74 75 72 6e 20 6e 6f 74 52 65 61 64  ) return notRead
23210 79 3b 0a 20 20 20 20 20 20 70 4f 72 54 61 62 2d  y;.      pOrTab-
23220 3e 6e 41 6c 6c 6f 63 20 3d 20 28 75 38 29 28 6e  >nAlloc = (u8)(n
23230 4e 6f 74 52 65 61 64 79 20 2b 20 31 29 3b 0a 20  NotReady + 1);. 
23240 20 20 20 20 20 70 4f 72 54 61 62 2d 3e 6e 53 72       pOrTab->nSr
23250 63 20 3d 20 70 4f 72 54 61 62 2d 3e 6e 41 6c 6c  c = pOrTab->nAll
23260 6f 63 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79  oc;.      memcpy
23270 28 70 4f 72 54 61 62 2d 3e 61 2c 20 70 54 61 62  (pOrTab->a, pTab
23280 49 74 65 6d 2c 20 73 69 7a 65 6f 66 28 2a 70 54  Item, sizeof(*pT
23290 61 62 49 74 65 6d 29 29 3b 0a 20 20 20 20 20 20  abItem));.      
232a0 6f 72 69 67 53 72 63 20 3d 20 70 57 49 6e 66 6f  origSrc = pWInfo
232b0 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 3b 0a 20  ->pTabList->a;. 
232c0 20 20 20 20 20 66 6f 72 28 6b 3d 31 3b 20 6b 3c       for(k=1; k<
232d0 3d 6e 4e 6f 74 52 65 61 64 79 3b 20 6b 2b 2b 29  =nNotReady; k++)
232e0 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  {.        memcpy
232f0 28 26 70 4f 72 54 61 62 2d 3e 61 5b 6b 5d 2c 20  (&pOrTab->a[k], 
23300 26 6f 72 69 67 53 72 63 5b 70 4c 65 76 65 6c 5b  &origSrc[pLevel[
23310 6b 5d 2e 69 46 72 6f 6d 5d 2c 20 73 69 7a 65 6f  k].iFrom], sizeo
23320 66 28 70 4f 72 54 61 62 2d 3e 61 5b 6b 5d 29 29  f(pOrTab->a[k]))
23330 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
23340 6c 73 65 7b 0a 20 20 20 20 20 20 70 4f 72 54 61  lse{.      pOrTa
23350 62 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62  b = pWInfo->pTab
23360 4c 69 73 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  List;.    }..   
23370 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74   /* Initialize t
23380 68 65 20 72 6f 77 73 65 74 20 72 65 67 69 73 74  he rowset regist
23390 65 72 20 74 6f 20 63 6f 6e 74 61 69 6e 20 4e 55  er to contain NU
233a0 4c 4c 2e 20 41 6e 20 53 51 4c 20 4e 55 4c 4c 20  LL. An SQL NULL 
233b0 69 73 20 0a 20 20 20 20 2a 2a 20 65 71 75 69 76  is .    ** equiv
233c0 61 6c 65 6e 74 20 74 6f 20 61 6e 20 65 6d 70 74  alent to an empt
233d0 79 20 72 6f 77 73 65 74 2e 20 20 4f 72 2c 20 63  y rowset.  Or, c
233e0 72 65 61 74 65 20 61 6e 20 65 70 68 65 6d 65 72  reate an ephemer
233f0 61 6c 20 69 6e 64 65 78 0a 20 20 20 20 2a 2a 20  al index.    ** 
23400 63 61 70 61 62 6c 65 20 6f 66 20 68 6f 6c 64 69  capable of holdi
23410 6e 67 20 70 72 69 6d 61 72 79 20 6b 65 79 73 20  ng primary keys 
23420 69 6e 20 74 68 65 20 63 61 73 65 20 6f 66 20 61  in the case of a
23430 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 2e 0a   WITHOUT ROWID..
23440 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c      **.    ** Al
23450 73 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 72 65  so initialize re
23460 67 52 65 74 75 72 6e 20 74 6f 20 63 6f 6e 74 61  gReturn to conta
23470 69 6e 20 74 68 65 20 61 64 64 72 65 73 73 20 6f  in the address o
23480 66 20 74 68 65 20 69 6e 73 74 72 75 63 74 69 6f  f the instructio
23490 6e 20 0a 20 20 20 20 2a 2a 20 69 6d 6d 65 64 69  n .    ** immedi
234a0 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20  ately following 
234b0 74 68 65 20 4f 50 5f 52 65 74 75 72 6e 20 61 74  the OP_Return at
234c0 20 74 68 65 20 62 6f 74 74 6f 6d 20 6f 66 20 74   the bottom of t
234d0 68 65 20 6c 6f 6f 70 2e 20 54 68 69 73 0a 20 20  he loop. This.  
234e0 20 20 2a 2a 20 69 73 20 72 65 71 75 69 72 65 64    ** is required
234f0 20 69 6e 20 61 20 66 65 77 20 6f 62 73 63 75 72   in a few obscur
23500 65 20 4c 45 46 54 20 4a 4f 49 4e 20 63 61 73 65  e LEFT JOIN case
23510 73 20 77 68 65 72 65 20 63 6f 6e 74 72 6f 6c 20  s where control 
23520 6a 75 6d 70 73 0a 20 20 20 20 2a 2a 20 6f 76 65  jumps.    ** ove
23530 72 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65  r the top of the
23540 20 6c 6f 6f 70 20 69 6e 74 6f 20 74 68 65 20 62   loop into the b
23550 6f 64 79 20 6f 66 20 69 74 2e 20 49 6e 20 74 68  ody of it. In th
23560 69 73 20 63 61 73 65 20 74 68 65 20 0a 20 20 20  is case the .   
23570 20 2a 2a 20 63 6f 72 72 65 63 74 20 72 65 73 70   ** correct resp
23580 6f 6e 73 65 20 66 6f 72 20 74 68 65 20 65 6e 64  onse for the end
23590 2d 6f 66 2d 6c 6f 6f 70 20 63 6f 64 65 20 28 74  -of-loop code (t
235a0 68 65 20 4f 50 5f 52 65 74 75 72 6e 29 20 69 73  he OP_Return) is
235b0 20 74 6f 20 0a 20 20 20 20 2a 2a 20 66 61 6c 6c   to .    ** fall
235c0 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20   through to the 
235d0 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e  next instruction
235e0 2c 20 6a 75 73 74 20 61 73 20 61 6e 20 4f 50 5f  , just as an OP_
235f0 4e 65 78 74 20 64 6f 65 73 20 69 66 0a 20 20 20  Next does if.   
23600 20 2a 2a 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e   ** called on an
23610 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 63   uninitialized c
23620 75 72 73 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20  ursor..    */.  
23630 20 20 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e 77    if( (pWInfo->w
23640 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
23650 45 5f 44 55 50 4c 49 43 41 54 45 53 5f 4f 4b 29  E_DUPLICATES_OK)
23660 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==0 ){.      if(
23670 20 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20   HasRowid(pTab) 
23680 29 7b 0a 20 20 20 20 20 20 20 20 72 65 67 52 6f  ){.        regRo
23690 77 73 65 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d  wset = ++pParse-
236a0 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 73  >nMem;.        s
236b0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
236c0 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20  (v, OP_Null, 0, 
236d0 72 65 67 52 6f 77 73 65 74 29 3b 0a 20 20 20 20  regRowset);.    
236e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
236f0 20 49 6e 64 65 78 20 2a 70 50 6b 20 3d 20 73 71   Index *pPk = sq
23700 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49  lite3PrimaryKeyI
23710 6e 64 65 78 28 70 54 61 62 29 3b 0a 20 20 20 20  ndex(pTab);.    
23720 20 20 20 20 72 65 67 52 6f 77 73 65 74 20 3d 20      regRowset = 
23730 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
23740 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
23750 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
23760 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 72  OpenEphemeral, r
23770 65 67 52 6f 77 73 65 74 2c 20 70 50 6b 2d 3e 6e  egRowset, pPk->n
23780 4b 65 79 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20  KeyCol);.       
23790 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 50   sqlite3VdbeSetP
237a0 34 4b 65 79 49 6e 66 6f 28 70 50 61 72 73 65 2c  4KeyInfo(pParse,
237b0 20 70 50 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20   pPk);.      }. 
237c0 20 20 20 20 20 72 65 67 52 6f 77 69 64 20 3d 20       regRowid = 
237d0 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
237e0 20 20 20 20 7d 0a 20 20 20 20 69 52 65 74 49 6e      }.    iRetIn
237f0 69 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  it = sqlite3Vdbe
23800 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
23810 65 67 65 72 2c 20 30 2c 20 72 65 67 52 65 74 75  eger, 0, regRetu
23820 72 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  rn);..    /* If 
23830 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 57 48 45  the original WHE
23840 52 45 20 63 6c 61 75 73 65 20 69 73 20 7a 20 6f  RE clause is z o
23850 66 20 74 68 65 20 66 6f 72 6d 3a 20 20 28 78 31  f the form:  (x1
23860 20 4f 52 20 78 32 20 4f 52 20 2e 2e 2e 29 20 41   OR x2 OR ...) A
23870 4e 44 20 79 0a 20 20 20 20 2a 2a 20 54 68 65 6e  ND y.    ** Then
23880 20 66 6f 72 20 65 76 65 72 79 20 74 65 72 6d 20   for every term 
23890 78 4e 2c 20 65 76 61 6c 75 61 74 65 20 61 73 20  xN, evaluate as 
238a0 74 68 65 20 73 75 62 65 78 70 72 65 73 73 69 6f  the subexpressio
238b0 6e 3a 20 78 4e 20 41 4e 44 20 7a 0a 20 20 20 20  n: xN AND z.    
238c0 2a 2a 20 54 68 61 74 20 77 61 79 2c 20 74 65 72  ** That way, ter
238d0 6d 73 20 69 6e 20 79 20 74 68 61 74 20 61 72 65  ms in y that are
238e0 20 66 61 63 74 6f 72 65 64 20 69 6e 74 6f 20 74   factored into t
238f0 68 65 20 64 69 73 6a 75 6e 63 74 69 6f 6e 20 77  he disjunction w
23900 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20 70 69  ill.    ** be pi
23910 63 6b 65 64 20 75 70 20 62 79 20 74 68 65 20 72  cked up by the r
23920 65 63 75 72 73 69 76 65 20 63 61 6c 6c 73 20 74  ecursive calls t
23930 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  o sqlite3WhereBe
23940 67 69 6e 28 29 20 62 65 6c 6f 77 2e 0a 20 20 20  gin() below..   
23950 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 63 74 75 61   **.    ** Actua
23960 6c 6c 79 2c 20 65 61 63 68 20 73 75 62 65 78 70  lly, each subexp
23970 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 76 65  ression is conve
23980 72 74 65 64 20 74 6f 20 22 78 4e 20 41 4e 44 20  rted to "xN AND 
23990 77 22 20 77 68 65 72 65 20 77 20 69 73 0a 20 20  w" where w is.  
239a0 20 20 2a 2a 20 74 68 65 20 22 69 6e 74 65 72 65    ** the "intere
239b0 73 74 69 6e 67 22 20 74 65 72 6d 73 20 6f 66 20  sting" terms of 
239c0 7a 20 2d 20 74 65 72 6d 73 20 74 68 61 74 20 64  z - terms that d
239d0 69 64 20 6e 6f 74 20 6f 72 69 67 69 6e 61 74 65  id not originate
239e0 20 69 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 4f   in the.    ** O
239f0 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73  N or USING claus
23a00 65 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e  e of a LEFT JOIN
23a10 2c 20 61 6e 64 20 74 65 72 6d 73 20 74 68 61 74  , and terms that
23a20 20 61 72 65 20 75 73 61 62 6c 65 20 61 73 20 0a   are usable as .
23a30 20 20 20 20 2a 2a 20 69 6e 64 69 63 65 73 2e 0a      ** indices..
23a40 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
23a50 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  is optimization 
23a60 61 6c 73 6f 20 6f 6e 6c 79 20 61 70 70 6c 69 65  also only applie
23a70 73 20 69 66 20 74 68 65 20 28 78 31 20 4f 52 20  s if the (x1 OR 
23a80 78 32 20 4f 52 20 2e 2e 2e 29 20 74 65 72 6d 0a  x2 OR ...) term.
23a90 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 63 6f      ** is not co
23aa0 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 4f  ntained in the O
23ab0 4e 20 63 6c 61 75 73 65 20 6f 66 20 61 20 4c 45  N clause of a LE
23ac0 46 54 20 4a 4f 49 4e 2e 0a 20 20 20 20 2a 2a 20  FT JOIN..    ** 
23ad0 53 65 65 20 74 69 63 6b 65 74 20 68 74 74 70 3a  See ticket http:
23ae0 2f 2f 77 77 77 2e 73 71 6c 69 74 65 2e 6f 72 67  //www.sqlite.org
23af0 2f 73 72 63 2f 69 6e 66 6f 2f 66 32 33 36 39 33  /src/info/f23693
23b00 30 34 65 34 0a 20 20 20 20 2a 2f 0a 20 20 20 20  04e4.    */.    
23b10 69 66 28 20 70 57 43 2d 3e 6e 54 65 72 6d 3e 31  if( pWC->nTerm>1
23b20 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 54   ){.      int iT
23b30 65 72 6d 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  erm;.      for(i
23b40 54 65 72 6d 3d 30 3b 20 69 54 65 72 6d 3c 70 57  Term=0; iTerm<pW
23b50 43 2d 3e 6e 54 65 72 6d 3b 20 69 54 65 72 6d 2b  C->nTerm; iTerm+
23b60 2b 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72  +){.        Expr
23b70 20 2a 70 45 78 70 72 20 3d 20 70 57 43 2d 3e 61   *pExpr = pWC->a
23b80 5b 69 54 65 72 6d 5d 2e 70 45 78 70 72 3b 0a 20  [iTerm].pExpr;. 
23b90 20 20 20 20 20 20 20 69 66 28 20 26 70 57 43 2d         if( &pWC-
23ba0 3e 61 5b 69 54 65 72 6d 5d 20 3d 3d 20 70 54 65  >a[iTerm] == pTe
23bb0 72 6d 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  rm ) continue;. 
23bc0 20 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48         if( ExprH
23bd0 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
23be0 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29  , EP_FromJoin) )
23bf0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
23c00 20 20 20 69 66 28 20 28 70 57 43 2d 3e 61 5b 69     if( (pWC->a[i
23c10 54 65 72 6d 5d 2e 77 74 46 6c 61 67 73 20 26 20  Term].wtFlags & 
23c20 54 45 52 4d 5f 56 49 52 54 55 41 4c 29 21 3d 30  TERM_VIRTUAL)!=0
23c30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
23c40 20 20 20 20 20 69 66 28 20 28 70 57 43 2d 3e 61       if( (pWC->a
23c50 5b 69 54 65 72 6d 5d 2e 65 4f 70 65 72 61 74 6f  [iTerm].eOperato
23c60 72 20 26 20 57 4f 5f 41 4c 4c 29 3d 3d 30 20 29  r & WO_ALL)==0 )
23c70 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
23c80 20 20 20 74 65 73 74 63 61 73 65 28 20 70 57 43     testcase( pWC
23c90 2d 3e 61 5b 69 54 65 72 6d 5d 2e 77 74 46 6c 61  ->a[iTerm].wtFla
23ca0 67 73 20 26 20 54 45 52 4d 5f 4f 52 49 4e 46 4f  gs & TERM_ORINFO
23cb0 20 29 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70   );.        pExp
23cc0 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  r = sqlite3ExprD
23cd0 75 70 28 64 62 2c 20 70 45 78 70 72 2c 20 30 29  up(db, pExpr, 0)
23ce0 3b 0a 20 20 20 20 20 20 20 20 70 41 6e 64 45 78  ;.        pAndEx
23cf0 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pr = sqlite3Expr
23d00 41 6e 64 28 64 62 2c 20 70 41 6e 64 45 78 70 72  And(db, pAndExpr
23d10 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  , pExpr);.      
23d20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 41 6e 64  }.      if( pAnd
23d30 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20  Expr ){.        
23d40 70 41 6e 64 45 78 70 72 20 3d 20 73 71 6c 69 74  pAndExpr = sqlit
23d50 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
23d60 54 4b 5f 41 4e 44 2c 20 30 2c 20 70 41 6e 64 45  TK_AND, 0, pAndE
23d70 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  xpr, 0);.      }
23d80 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52  .    }..    /* R
23d90 75 6e 20 61 20 73 65 70 61 72 61 74 65 20 57 48  un a separate WH
23da0 45 52 45 20 63 6c 61 75 73 65 20 66 6f 72 20 65  ERE clause for e
23db0 61 63 68 20 74 65 72 6d 20 6f 66 20 74 68 65 20  ach term of the 
23dc0 4f 52 20 63 6c 61 75 73 65 2e 20 20 41 66 74 65  OR clause.  Afte
23dd0 72 0a 20 20 20 20 2a 2a 20 65 6c 69 6d 69 6e 61  r.    ** elimina
23de0 74 69 6e 67 20 64 75 70 6c 69 63 61 74 65 73 20  ting duplicates 
23df0 66 72 6f 6d 20 6f 74 68 65 72 20 57 48 45 52 45  from other WHERE
23e00 20 63 6c 61 75 73 65 73 2c 20 74 68 65 20 61 63   clauses, the ac
23e10 74 69 6f 6e 20 66 6f 72 20 65 61 63 68 0a 20 20  tion for each.  
23e20 20 20 2a 2a 20 73 75 62 2d 57 48 45 52 45 20 63    ** sub-WHERE c
23e30 6c 61 75 73 65 20 69 73 20 74 6f 20 74 6f 20 69  lause is to to i
23e40 6e 76 6f 6b 65 20 74 68 65 20 6d 61 69 6e 20 6c  nvoke the main l
23e50 6f 6f 70 20 62 6f 64 79 20 61 73 20 61 20 73 75  oop body as a su
23e60 62 72 6f 75 74 69 6e 65 2e 0a 20 20 20 20 2a 2f  broutine..    */
23e70 0a 20 20 20 20 77 63 74 72 6c 46 6c 61 67 73 20  .    wctrlFlags 
23e80 3d 20 20 57 48 45 52 45 5f 4f 4d 49 54 5f 4f 50  =  WHERE_OMIT_OP
23e90 45 4e 5f 43 4c 4f 53 45 0a 20 20 20 20 20 20 20  EN_CLOSE.       
23ea0 20 20 20 20 20 20 20 20 20 7c 20 57 48 45 52 45           | WHERE
23eb0 5f 46 4f 52 43 45 5f 54 41 42 4c 45 0a 20 20 20  _FORCE_TABLE.   
23ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 57               | W
23ed0 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e  HERE_ONETABLE_ON
23ee0 4c 59 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  LY.             
23ef0 20 20 20 7c 20 57 48 45 52 45 5f 4e 4f 5f 41 55     | WHERE_NO_AU
23f00 54 4f 49 4e 44 45 58 3b 0a 20 20 20 20 66 6f 72  TOINDEX;.    for
23f10 28 69 69 3d 30 3b 20 69 69 3c 70 4f 72 57 63 2d  (ii=0; ii<pOrWc-
23f20 3e 6e 54 65 72 6d 3b 20 69 69 2b 2b 29 7b 0a 20  >nTerm; ii++){. 
23f30 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a       WhereTerm *
23f40 70 4f 72 54 65 72 6d 20 3d 20 26 70 4f 72 57 63  pOrTerm = &pOrWc
23f50 2d 3e 61 5b 69 69 5d 3b 0a 20 20 20 20 20 20 69  ->a[ii];.      i
23f60 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74  f( pOrTerm->left
23f70 43 75 72 73 6f 72 3d 3d 69 43 75 72 20 7c 7c 20  Cursor==iCur || 
23f80 28 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61  (pOrTerm->eOpera
23f90 74 6f 72 20 26 20 57 4f 5f 41 4e 44 29 21 3d 30  tor & WO_AND)!=0
23fa0 20 29 7b 0a 20 20 20 20 20 20 20 20 57 68 65 72   ){.        Wher
23fb0 65 49 6e 66 6f 20 2a 70 53 75 62 57 49 6e 66 6f  eInfo *pSubWInfo
23fc0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ;           /* I
23fd0 6e 66 6f 20 66 6f 72 20 73 69 6e 67 6c 65 20 4f  nfo for single O
23fe0 52 2d 74 65 72 6d 20 73 63 61 6e 20 2a 2f 0a 20  R-term scan */. 
23ff0 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 4f 72         Expr *pOr
24000 45 78 70 72 20 3d 20 70 4f 72 54 65 72 6d 2d 3e  Expr = pOrTerm->
24010 70 45 78 70 72 3b 20 2f 2a 20 43 75 72 72 65 6e  pExpr; /* Curren
24020 74 20 4f 52 20 63 6c 61 75 73 65 20 74 65 72 6d  t OR clause term
24030 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
24040 6a 31 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  j1 = 0;         
24050 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
24060 64 64 72 65 73 73 20 6f 66 20 6a 75 6d 70 20 6f  ddress of jump o
24070 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  peration */.    
24080 20 20 20 20 69 66 28 20 70 41 6e 64 45 78 70 72      if( pAndExpr
24090 20 26 26 20 21 45 78 70 72 48 61 73 50 72 6f 70   && !ExprHasProp
240a0 65 72 74 79 28 70 4f 72 45 78 70 72 2c 20 45 50  erty(pOrExpr, EP
240b0 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20  _FromJoin) ){.  
240c0 20 20 20 20 20 20 20 20 70 41 6e 64 45 78 70 72          pAndExpr
240d0 2d 3e 70 4c 65 66 74 20 3d 20 70 4f 72 45 78 70  ->pLeft = pOrExp
240e0 72 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 72  r;.          pOr
240f0 45 78 70 72 20 3d 20 70 41 6e 64 45 78 70 72 3b  Expr = pAndExpr;
24100 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
24110 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75     /* Loop throu
24120 67 68 20 74 61 62 6c 65 20 65 6e 74 72 69 65 73  gh table entries
24130 20 74 68 61 74 20 6d 61 74 63 68 20 74 65 72 6d   that match term
24140 20 70 4f 72 54 65 72 6d 2e 20 2a 2f 0a 20 20 20   pOrTerm. */.   
24150 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28       WHERETRACE(
24160 30 78 66 66 66 66 2c 20 28 22 53 75 62 70 6c 61  0xffff, ("Subpla
24170 6e 20 66 6f 72 20 4f 52 2d 63 6c 61 75 73 65 3a  n for OR-clause:
24180 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 20 20 70  \n"));.        p
24190 53 75 62 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74  SubWInfo = sqlit
241a0 65 33 57 68 65 72 65 42 65 67 69 6e 28 70 50 61  e3WhereBegin(pPa
241b0 72 73 65 2c 20 70 4f 72 54 61 62 2c 20 70 4f 72  rse, pOrTab, pOr
241c0 45 78 70 72 2c 20 30 2c 20 30 2c 0a 20 20 20 20  Expr, 0, 0,.    
241d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
241e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
241f0 20 20 77 63 74 72 6c 46 6c 61 67 73 2c 20 69 43    wctrlFlags, iC
24200 6f 76 43 75 72 29 3b 0a 20 20 20 20 20 20 20 20  ovCur);.        
24210 61 73 73 65 72 74 28 20 70 53 75 62 57 49 6e 66  assert( pSubWInf
24220 6f 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72  o || pParse->nEr
24230 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  r || db->mallocF
24240 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20  ailed );.       
24250 20 69 66 28 20 70 53 75 62 57 49 6e 66 6f 20 29   if( pSubWInfo )
24260 7b 0a 20 20 20 20 20 20 20 20 20 20 57 68 65 72  {.          Wher
24270 65 4c 6f 6f 70 20 2a 70 53 75 62 4c 6f 6f 70 3b  eLoop *pSubLoop;
24280 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 61  .          int a
24290 64 64 72 45 78 70 6c 61 69 6e 20 3d 20 65 78 70  ddrExplain = exp
242a0 6c 61 69 6e 4f 6e 65 53 63 61 6e 28 0a 20 20 20  lainOneScan(.   
242b0 20 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73             pPars
242c0 65 2c 20 70 4f 72 54 61 62 2c 20 26 70 53 75 62  e, pOrTab, &pSub
242d0 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2c 20 69 4c 65  WInfo->a[0], iLe
242e0 76 65 6c 2c 20 70 4c 65 76 65 6c 2d 3e 69 46 72  vel, pLevel->iFr
242f0 6f 6d 2c 20 30 0a 20 20 20 20 20 20 20 20 20 20  om, 0.          
24300 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 64 64  );.          add
24310 53 63 61 6e 53 74 61 74 75 73 28 76 2c 20 70 4f  ScanStatus(v, pO
24320 72 54 61 62 2c 20 26 70 53 75 62 57 49 6e 66 6f  rTab, &pSubWInfo
24330 2d 3e 61 5b 30 5d 2c 20 61 64 64 72 45 78 70 6c  ->a[0], addrExpl
24340 61 69 6e 29 3b 0a 0a 20 20 20 20 20 20 20 20 20  ain);..         
24350 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65 20   /* This is the 
24360 73 75 62 2d 57 48 45 52 45 20 63 6c 61 75 73 65  sub-WHERE clause
24370 20 62 6f 64 79 2e 20 20 46 69 72 73 74 20 73 6b   body.  First sk
24380 69 70 20 6f 76 65 72 0a 20 20 20 20 20 20 20 20  ip over.        
24390 20 20 2a 2a 20 64 75 70 6c 69 63 61 74 65 20 72    ** duplicate r
243a0 6f 77 73 20 66 72 6f 6d 20 70 72 69 6f 72 20 73  ows from prior s
243b0 75 62 2d 57 48 45 52 45 20 63 6c 61 75 73 65 73  ub-WHERE clauses
243c0 2c 20 61 6e 64 20 72 65 63 6f 72 64 20 74 68 65  , and record the
243d0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72 6f  .          ** ro
243e0 77 69 64 20 28 6f 72 20 50 52 49 4d 41 52 59 20  wid (or PRIMARY 
243f0 4b 45 59 29 20 66 6f 72 20 74 68 65 20 63 75 72  KEY) for the cur
24400 72 65 6e 74 20 72 6f 77 20 73 6f 20 74 68 61 74  rent row so that
24410 20 74 68 65 20 73 61 6d 65 0a 20 20 20 20 20 20   the same.      
24420 20 20 20 20 2a 2a 20 72 6f 77 20 77 69 6c 6c 20      ** row will 
24430 62 65 20 73 6b 69 70 70 65 64 20 69 6e 20 73 75  be skipped in su
24440 62 73 65 71 75 65 6e 74 20 73 75 62 2d 57 48 45  bsequent sub-WHE
24450 52 45 20 63 6c 61 75 73 65 73 2e 0a 20 20 20 20  RE clauses..    
24460 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
24470 20 20 20 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e     if( (pWInfo->
24480 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
24490 52 45 5f 44 55 50 4c 49 43 41 54 45 53 5f 4f 4b  RE_DUPLICATES_OK
244a0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
244b0 20 20 20 20 69 6e 74 20 72 3b 0a 20 20 20 20 20      int r;.     
244c0 20 20 20 20 20 20 20 69 6e 74 20 69 53 65 74 20         int iSet 
244d0 3d 20 28 28 69 69 3d 3d 70 4f 72 57 63 2d 3e 6e  = ((ii==pOrWc->n
244e0 54 65 72 6d 2d 31 29 3f 2d 31 3a 69 69 29 3b 0a  Term-1)?-1:ii);.
244f0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
24500 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 29  HasRowid(pTab) )
24510 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
24520 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  r = sqlite3ExprC
24530 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28 70 50 61  odeGetColumn(pPa
24540 72 73 65 2c 20 70 54 61 62 2c 20 2d 31 2c 20 69  rse, pTab, -1, i
24550 43 75 72 2c 20 72 65 67 52 6f 77 69 64 2c 20 30  Cur, regRowid, 0
24560 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
24570 20 6a 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62   j1 = sqlite3Vdb
24580 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
24590 5f 52 6f 77 53 65 74 54 65 73 74 2c 20 72 65 67  _RowSetTest, reg
245a0 52 6f 77 73 65 74 2c 20 30 2c 20 72 2c 69 53 65  Rowset, 0, r,iSe
245b0 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  t);.            
245c0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
245d0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
245e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
245f0 20 20 20 20 49 6e 64 65 78 20 2a 70 50 6b 20 3d      Index *pPk =
24600 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b   sqlite3PrimaryK
24610 65 79 49 6e 64 65 78 28 70 54 61 62 29 3b 0a 20  eyIndex(pTab);. 
24620 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74               int
24630 20 6e 50 6b 20 3d 20 70 50 6b 2d 3e 6e 4b 65 79   nPk = pPk->nKey
24640 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Col;.           
24650 20 20 20 69 6e 74 20 69 50 6b 3b 0a 0a 20 20 20     int iPk;..   
24660 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
24670 61 64 20 74 68 65 20 50 4b 20 69 6e 74 6f 20 61  ad the PK into a
24680 6e 20 61 72 72 61 79 20 6f 66 20 74 65 6d 70 20  n array of temp 
24690 72 65 67 69 73 74 65 72 73 2e 20 2a 2f 0a 20 20  registers. */.  
246a0 20 20 20 20 20 20 20 20 20 20 20 20 72 20 3d 20              r = 
246b0 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61  sqlite3GetTempRa
246c0 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 50 6b 29  nge(pParse, nPk)
246d0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
246e0 66 6f 72 28 69 50 6b 3d 30 3b 20 69 50 6b 3c 6e  for(iPk=0; iPk<n
246f0 50 6b 3b 20 69 50 6b 2b 2b 29 7b 0a 20 20 20 20  Pk; iPk++){.    
24700 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
24710 69 43 6f 6c 20 3d 20 70 50 6b 2d 3e 61 69 43 6f  iCol = pPk->aiCo
24720 6c 75 6d 6e 5b 69 50 6b 5d 3b 0a 20 20 20 20 20  lumn[iPk];.     
24730 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
24740 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c  e3ExprCodeGetCol
24750 75 6d 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62  umn(pParse, pTab
24760 2c 20 69 43 6f 6c 2c 20 69 43 75 72 2c 20 72 2b  , iCol, iCur, r+
24770 69 50 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  iPk, 0);.       
24780 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
24790 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b          /* Check
247a0 20 69 66 20 74 68 65 20 74 65 6d 70 20 74 61 62   if the temp tab
247b0 6c 65 20 61 6c 72 65 61 64 79 20 63 6f 6e 74 61  le already conta
247c0 69 6e 73 20 74 68 69 73 20 6b 65 79 2e 20 49 66  ins this key. If
247d0 20 73 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20   so,.           
247e0 20 20 20 2a 2a 20 74 68 65 20 72 6f 77 20 68 61     ** the row ha
247f0 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 69  s already been i
24800 6e 63 6c 75 64 65 64 20 69 6e 20 74 68 65 20 72  ncluded in the r
24810 65 73 75 6c 74 20 73 65 74 20 61 6e 64 0a 20 20  esult set and.  
24820 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63              ** c
24830 61 6e 20 62 65 20 69 67 6e 6f 72 65 64 20 28 62  an be ignored (b
24840 79 20 6a 75 6d 70 69 6e 67 20 70 61 73 74 20 74  y jumping past t
24850 68 65 20 47 6f 73 75 62 20 62 65 6c 6f 77 29 2e  he Gosub below).
24860 20 4f 74 68 65 72 77 69 73 65 2c 0a 20 20 20 20   Otherwise,.    
24870 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 73            ** ins
24880 65 72 74 20 74 68 65 20 6b 65 79 20 69 6e 74 6f  ert the key into
24890 20 74 68 65 20 74 65 6d 70 20 74 61 62 6c 65 20   the temp table 
248a0 61 6e 64 20 70 72 6f 63 65 65 64 20 77 69 74 68  and proceed with
248b0 20 70 72 6f 63 65 73 73 69 6e 67 0a 20 20 20 20   processing.    
248c0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65            ** the
248d0 20 72 6f 77 2e 0a 20 20 20 20 20 20 20 20 20 20   row..          
248e0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 20      **.         
248f0 20 20 20 20 20 2a 2a 20 55 73 65 20 73 6f 6d 65       ** Use some
24900 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6f 70 74   of the same opt
24910 69 6d 69 7a 61 74 69 6f 6e 73 20 61 73 20 4f 50  imizations as OP
24920 5f 52 6f 77 53 65 74 54 65 73 74 3a 20 49 66 20  _RowSetTest: If 
24930 69 53 65 74 0a 20 20 20 20 20 20 20 20 20 20 20  iSet.           
24940 20 20 20 2a 2a 20 69 73 20 7a 65 72 6f 2c 20 61     ** is zero, a
24950 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 20 6b  ssume that the k
24960 65 79 20 63 61 6e 6e 6f 74 20 61 6c 72 65 61 64  ey cannot alread
24970 79 20 62 65 20 70 72 65 73 65 6e 74 20 69 6e 0a  y be present in.
24980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
24990 20 74 68 65 20 74 65 6d 70 20 74 61 62 6c 65 2e   the temp table.
249a0 20 41 6e 64 20 69 66 20 69 53 65 74 20 69 73 20   And if iSet is 
249b0 2d 31 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20  -1, assume that 
249c0 74 68 65 72 65 20 69 73 20 6e 6f 20 0a 20 20 20  there is no .   
249d0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6e 65             ** ne
249e0 65 64 20 74 6f 20 69 6e 73 65 72 74 20 74 68 65  ed to insert the
249f0 20 6b 65 79 20 69 6e 74 6f 20 74 68 65 20 74 65   key into the te
24a00 6d 70 20 74 61 62 6c 65 2c 20 61 73 20 69 74 20  mp table, as it 
24a10 77 69 6c 6c 20 6e 65 76 65 72 20 0a 20 20 20 20  will never .    
24a20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 65 20            ** be 
24a30 74 65 73 74 65 64 20 66 6f 72 2e 20 20 2a 2f 20  tested for.  */ 
24a40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
24a50 66 28 20 69 53 65 74 20 29 7b 0a 20 20 20 20 20  f( iSet ){.     
24a60 20 20 20 20 20 20 20 20 20 20 20 6a 31 20 3d 20             j1 = 
24a70 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
24a80 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64  4Int(v, OP_Found
24a90 2c 20 72 65 67 52 6f 77 73 65 74 2c 20 30 2c 20  , regRowset, 0, 
24aa0 72 2c 20 6e 50 6b 29 3b 0a 20 20 20 20 20 20 20  r, nPk);.       
24ab0 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76           VdbeCov
24ac0 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
24ad0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
24ae0 20 20 20 20 20 20 20 20 69 66 28 20 69 53 65 74          if( iSet
24af0 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  >=0 ){.         
24b00 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
24b10 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d  beAddOp3(v, OP_M
24b20 61 6b 65 52 65 63 6f 72 64 2c 20 72 2c 20 6e 50  akeRecord, r, nP
24b30 6b 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20  k, regRowid);.  
24b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
24b50 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
24b60 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c  v, OP_IdxInsert,
24b70 20 72 65 67 52 6f 77 73 65 74 2c 20 72 65 67 52   regRowset, regR
24b80 6f 77 69 64 2c 20 30 29 3b 0a 20 20 20 20 20 20  owid, 0);.      
24b90 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 53            if( iS
24ba0 65 74 20 29 20 73 71 6c 69 74 65 33 56 64 62 65  et ) sqlite3Vdbe
24bb0 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
24bc0 41 47 5f 55 53 45 53 45 45 4b 52 45 53 55 4c 54  AG_USESEEKRESULT
24bd0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
24be0 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
24bf0 20 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65    /* Release the
24c00 20 61 72 72 61 79 20 6f 66 20 74 65 6d 70 20 72   array of temp r
24c10 65 67 69 73 74 65 72 73 20 2a 2f 0a 20 20 20 20  egisters */.    
24c20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
24c30 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67  3ReleaseTempRang
24c40 65 28 70 50 61 72 73 65 2c 20 72 2c 20 6e 50 6b  e(pParse, r, nPk
24c50 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
24c60 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  .          }..  
24c70 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 76 6f 6b          /* Invok
24c80 65 20 74 68 65 20 6d 61 69 6e 20 6c 6f 6f 70 20  e the main loop 
24c90 62 6f 64 79 20 61 73 20 61 20 73 75 62 72 6f 75  body as a subrou
24ca0 74 69 6e 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  tine */.        
24cb0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
24cc0 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
24cd0 20 72 65 67 52 65 74 75 72 6e 2c 20 69 4c 6f 6f   regReturn, iLoo
24ce0 70 42 6f 64 79 29 3b 0a 0a 20 20 20 20 20 20 20  pBody);..       
24cf0 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
24d00 28 73 6b 69 70 70 69 6e 67 20 74 68 65 20 6d 61  (skipping the ma
24d10 69 6e 20 6c 6f 6f 70 20 62 6f 64 79 20 73 75 62  in loop body sub
24d20 72 6f 75 74 69 6e 65 29 20 69 66 20 74 68 65 0a  routine) if the.
24d30 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 75 72            ** cur
24d40 72 65 6e 74 20 73 75 62 2d 57 48 45 52 45 20 72  rent sub-WHERE r
24d50 6f 77 20 69 73 20 61 20 64 75 70 6c 69 63 61 74  ow is a duplicat
24d60 65 20 66 72 6f 6d 20 70 72 69 6f 72 20 73 75 62  e from prior sub
24d70 2d 57 48 45 52 45 73 2e 20 2a 2f 0a 20 20 20 20  -WHEREs. */.    
24d80 20 20 20 20 20 20 69 66 28 20 6a 31 20 29 20 73        if( j1 ) s
24d90 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
24da0 72 65 28 76 2c 20 6a 31 29 3b 0a 0a 20 20 20 20  re(v, j1);..    
24db0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 53 75        /* The pSu
24dc0 62 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64  bWInfo->untested
24dd0 54 65 72 6d 73 20 66 6c 61 67 20 6d 65 61 6e 73  Terms flag means
24de0 20 74 68 61 74 20 74 68 69 73 20 4f 52 20 74 65   that this OR te
24df0 72 6d 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  rm.          ** 
24e00 63 6f 6e 74 61 69 6e 65 64 20 6f 6e 65 20 6f 72  contained one or
24e10 20 6d 6f 72 65 20 41 4e 44 20 74 65 72 6d 20 66   more AND term f
24e20 72 6f 6d 20 61 20 6e 6f 74 52 65 61 64 79 20 74  rom a notReady t
24e30 61 62 6c 65 2e 20 20 54 68 65 0a 20 20 20 20 20  able.  The.     
24e40 20 20 20 20 20 2a 2a 20 74 65 72 6d 73 20 66 72       ** terms fr
24e50 6f 6d 20 74 68 65 20 6e 6f 74 52 65 61 64 79 20  om the notReady 
24e60 74 61 62 6c 65 20 63 6f 75 6c 64 20 6e 6f 74 20  table could not 
24e70 62 65 20 74 65 73 74 65 64 20 61 6e 64 20 77 69  be tested and wi
24e80 6c 6c 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ll.          ** 
24e90 6e 65 65 64 20 74 6f 20 62 65 20 74 65 73 74 65  need to be teste
24ea0 64 20 6c 61 74 65 72 2e 0a 20 20 20 20 20 20 20  d later..       
24eb0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
24ec0 69 66 28 20 70 53 75 62 57 49 6e 66 6f 2d 3e 75  if( pSubWInfo->u
24ed0 6e 74 65 73 74 65 64 54 65 72 6d 73 20 29 20 75  ntestedTerms ) u
24ee0 6e 74 65 73 74 65 64 54 65 72 6d 73 20 3d 20 31  ntestedTerms = 1
24ef0 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;..          /* 
24f00 49 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 4f 52  If all of the OR
24f10 2d 63 6f 6e 6e 65 63 74 65 64 20 74 65 72 6d 73  -connected terms
24f20 20 61 72 65 20 6f 70 74 69 6d 69 7a 65 64 20 75   are optimized u
24f30 73 69 6e 67 20 74 68 65 20 73 61 6d 65 0a 20 20  sing the same.  
24f40 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 64 65 78          ** index
24f50 2c 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20  , and the index 
24f60 69 73 20 6f 70 65 6e 65 64 20 75 73 69 6e 67 20  is opened using 
24f70 74 68 65 20 73 61 6d 65 20 63 75 72 73 6f 72 20  the same cursor 
24f80 6e 75 6d 62 65 72 0a 20 20 20 20 20 20 20 20 20  number.         
24f90 20 2a 2a 20 62 79 20 65 61 63 68 20 63 61 6c 6c   ** by each call
24fa0 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65   to sqlite3Where
24fb0 42 65 67 69 6e 28 29 20 6d 61 64 65 20 62 79 20  Begin() made by 
24fc0 74 68 69 73 20 6c 6f 6f 70 2c 20 69 74 20 6d 61  this loop, it ma
24fd0 79 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62  y.          ** b
24fe0 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 75 73  e possible to us
24ff0 65 20 74 68 61 74 20 69 6e 64 65 78 20 61 73 20  e that index as 
25000 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78  a covering index
25010 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 0a 20  ..          **. 
25020 20 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20 74           ** If t
25030 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  he call to sqlit
25040 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 61  e3WhereBegin() a
25050 62 6f 76 65 20 72 65 73 75 6c 74 65 64 20 69 6e  bove resulted in
25060 20 61 20 73 63 61 6e 20 74 68 61 74 0a 20 20 20   a scan that.   
25070 20 20 20 20 20 20 20 2a 2a 20 75 73 65 73 20 61         ** uses a
25080 6e 20 69 6e 64 65 78 2c 20 61 6e 64 20 74 68 69  n index, and thi
25090 73 20 69 73 20 65 69 74 68 65 72 20 74 68 65 20  s is either the 
250a0 66 69 72 73 74 20 4f 52 2d 63 6f 6e 6e 65 63 74  first OR-connect
250b0 65 64 20 74 65 72 6d 0a 20 20 20 20 20 20 20 20  ed term.        
250c0 20 20 2a 2a 20 70 72 6f 63 65 73 73 65 64 20 6f    ** processed o
250d0 72 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 74  r the index is t
250e0 68 65 20 73 61 6d 65 20 61 73 20 74 68 61 74 20  he same as that 
250f0 75 73 65 64 20 62 79 20 61 6c 6c 20 70 72 65 76  used by all prev
25100 69 6f 75 73 0a 20 20 20 20 20 20 20 20 20 20 2a  ious.          *
25110 2a 20 74 65 72 6d 73 2c 20 73 65 74 20 70 43 6f  * terms, set pCo
25120 76 20 74 6f 20 74 68 65 20 63 61 6e 64 69 64 61  v to the candida
25130 74 65 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65  te covering inde
25140 78 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 73 65  x. Otherwise, se
25150 74 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  t .          ** 
25160 70 43 6f 76 20 74 6f 20 4e 55 4c 4c 20 74 6f 20  pCov to NULL to 
25170 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 6e 6f  indicate that no
25180 20 63 61 6e 64 69 64 61 74 65 20 63 6f 76 65 72   candidate cover
25190 69 6e 67 20 69 6e 64 65 78 20 77 69 6c 6c 20 0a  ing index will .
251a0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 65 20            ** be 
251b0 61 76 61 69 6c 61 62 6c 65 2e 0a 20 20 20 20 20  available..     
251c0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
251d0 20 20 70 53 75 62 4c 6f 6f 70 20 3d 20 70 53 75    pSubLoop = pSu
251e0 62 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70 57 4c  bWInfo->a[0].pWL
251f0 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20 20 20 61  oop;.          a
25200 73 73 65 72 74 28 20 28 70 53 75 62 4c 6f 6f 70  ssert( (pSubLoop
25210 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
25220 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 3d 3d 30  E_AUTO_INDEX)==0
25230 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   );.          if
25240 28 20 28 70 53 75 62 4c 6f 6f 70 2d 3e 77 73 46  ( (pSubLoop->wsF
25250 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44  lags & WHERE_IND
25260 45 58 45 44 29 21 3d 30 0a 20 20 20 20 20 20 20  EXED)!=0.       
25270 20 20 20 20 26 26 20 28 69 69 3d 3d 30 20 7c 7c      && (ii==0 ||
25280 20 70 53 75 62 4c 6f 6f 70 2d 3e 75 2e 62 74 72   pSubLoop->u.btr
25290 65 65 2e 70 49 6e 64 65 78 3d 3d 70 43 6f 76 29  ee.pIndex==pCov)
252a0 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28  .           && (
252b0 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 7c  HasRowid(pTab) |
252c0 7c 20 21 49 73 50 72 69 6d 61 72 79 4b 65 79 49  | !IsPrimaryKeyI
252d0 6e 64 65 78 28 70 53 75 62 4c 6f 6f 70 2d 3e 75  ndex(pSubLoop->u
252e0 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 29 29 0a  .btree.pIndex)).
252f0 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20            ){.   
25300 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
25310 20 70 53 75 62 57 49 6e 66 6f 2d 3e 61 5b 30 5d   pSubWInfo->a[0]
25320 2e 69 49 64 78 43 75 72 3d 3d 69 43 6f 76 43 75  .iIdxCur==iCovCu
25330 72 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  r );.           
25340 20 70 43 6f 76 20 3d 20 70 53 75 62 4c 6f 6f 70   pCov = pSubLoop
25350 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
25360 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 77 63  ;.            wc
25370 74 72 6c 46 6c 61 67 73 20 7c 3d 20 57 48 45 52  trlFlags |= WHER
25380 45 5f 52 45 4f 50 45 4e 5f 49 44 58 3b 0a 20 20  E_REOPEN_IDX;.  
25390 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
253a0 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 76 20             pCov 
253b0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 0;.          }
253c0 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  ..          /* F
253d0 69 6e 69 73 68 20 74 68 65 20 6c 6f 6f 70 20 74  inish the loop t
253e0 68 72 6f 75 67 68 20 74 61 62 6c 65 20 65 6e 74  hrough table ent
253f0 72 69 65 73 20 74 68 61 74 20 6d 61 74 63 68 20  ries that match 
25400 74 65 72 6d 20 70 4f 72 54 65 72 6d 2e 20 2a 2f  term pOrTerm. */
25410 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
25420 65 33 57 68 65 72 65 45 6e 64 28 70 53 75 62 57  e3WhereEnd(pSubW
25430 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 7d  Info);.        }
25440 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
25450 20 20 20 70 4c 65 76 65 6c 2d 3e 75 2e 70 43 6f     pLevel->u.pCo
25460 76 69 64 78 20 3d 20 70 43 6f 76 3b 0a 20 20 20  vidx = pCov;.   
25470 20 69 66 28 20 70 43 6f 76 20 29 20 70 4c 65 76   if( pCov ) pLev
25480 65 6c 2d 3e 69 49 64 78 43 75 72 20 3d 20 69 43  el->iIdxCur = iC
25490 6f 76 43 75 72 3b 0a 20 20 20 20 69 66 28 20 70  ovCur;.    if( p
254a0 41 6e 64 45 78 70 72 20 29 7b 0a 20 20 20 20 20  AndExpr ){.     
254b0 20 70 41 6e 64 45 78 70 72 2d 3e 70 4c 65 66 74   pAndExpr->pLeft
254c0 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69   = 0;.      sqli
254d0 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
254e0 2c 20 70 41 6e 64 45 78 70 72 29 3b 0a 20 20 20  , pAndExpr);.   
254f0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64   }.    sqlite3Vd
25500 62 65 43 68 61 6e 67 65 50 31 28 76 2c 20 69 52  beChangeP1(v, iR
25510 65 74 49 6e 69 74 2c 20 73 71 6c 69 74 65 33 56  etInit, sqlite3V
25520 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
25530 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  ));.    sqlite3V
25540 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
25550 47 6f 74 6f 2c 20 30 2c 20 70 4c 65 76 65 6c 2d  Goto, 0, pLevel-
25560 3e 61 64 64 72 42 72 6b 29 3b 0a 20 20 20 20 73  >addrBrk);.    s
25570 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
25580 65 4c 61 62 65 6c 28 76 2c 20 69 4c 6f 6f 70 42  eLabel(v, iLoopB
25590 6f 64 79 29 3b 0a 0a 20 20 20 20 69 66 28 20 70  ody);..    if( p
255a0 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3e 31 20  WInfo->nLevel>1 
255b0 29 20 73 71 6c 69 74 65 33 53 74 61 63 6b 46 72  ) sqlite3StackFr
255c0 65 65 28 64 62 2c 20 70 4f 72 54 61 62 29 3b 0a  ee(db, pOrTab);.
255d0 20 20 20 20 69 66 28 20 21 75 6e 74 65 73 74 65      if( !unteste
255e0 64 54 65 72 6d 73 20 29 20 64 69 73 61 62 6c 65  dTerms ) disable
255f0 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 54 65  Term(pLevel, pTe
25600 72 6d 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e  rm);.  }else.#en
25610 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
25620 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49  IT_OR_OPTIMIZATI
25630 4f 4e 20 2a 2f 0a 0a 20 20 7b 0a 20 20 20 20 2f  ON */..  {.    /
25640 2a 20 43 61 73 65 20 36 3a 20 20 54 68 65 72 65  * Case 6:  There
25650 20 69 73 20 6e 6f 20 75 73 61 62 6c 65 20 69 6e   is no usable in
25660 64 65 78 2e 20 20 57 65 20 6d 75 73 74 20 64 6f  dex.  We must do
25670 20 61 20 63 6f 6d 70 6c 65 74 65 0a 20 20 20 20   a complete.    
25680 2a 2a 20 20 20 20 20 20 20 20 20 20 73 63 61 6e  **          scan
25690 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20 74   of the entire t
256a0 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  able..    */.   
256b0 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38   static const u8
256c0 20 61 53 74 65 70 5b 5d 20 3d 20 7b 20 4f 50 5f   aStep[] = { OP_
256d0 4e 65 78 74 2c 20 4f 50 5f 50 72 65 76 20 7d 3b  Next, OP_Prev };
256e0 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73  .    static cons
256f0 74 20 75 38 20 61 53 74 61 72 74 5b 5d 20 3d 20  t u8 aStart[] = 
25700 7b 20 4f 50 5f 52 65 77 69 6e 64 2c 20 4f 50 5f  { OP_Rewind, OP_
25710 4c 61 73 74 20 7d 3b 0a 20 20 20 20 61 73 73 65  Last };.    asse
25720 72 74 28 20 62 52 65 76 3d 3d 30 20 7c 7c 20 62  rt( bRev==0 || b
25730 52 65 76 3d 3d 31 20 29 3b 0a 20 20 20 20 69 66  Rev==1 );.    if
25740 28 20 70 54 61 62 49 74 65 6d 2d 3e 69 73 52 65  ( pTabItem->isRe
25750 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20 20  cursive ){.     
25760 20 2f 2a 20 54 61 62 6c 65 73 20 6d 61 72 6b 65   /* Tables marke
25770 64 20 69 73 52 65 63 75 72 73 69 76 65 20 68 61  d isRecursive ha
25780 76 65 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65  ve only a single
25790 20 72 6f 77 20 74 68 61 74 20 69 73 20 73 74 6f   row that is sto
257a0 72 65 64 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20  red in.      ** 
257b0 61 20 70 73 65 75 64 6f 2d 63 75 72 73 6f 72 2e  a pseudo-cursor.
257c0 20 20 4e 6f 20 6e 65 65 64 20 74 6f 20 52 65 77    No need to Rew
257d0 69 6e 64 20 6f 72 20 4e 65 78 74 20 73 75 63 68  ind or Next such
257e0 20 63 75 72 73 6f 72 73 2e 20 2a 2f 0a 20 20 20   cursors. */.   
257f0 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20     pLevel->op = 
25800 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 7d 65 6c  OP_Noop;.    }el
25810 73 65 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c  se{.      pLevel
25820 2d 3e 6f 70 20 3d 20 61 53 74 65 70 5b 62 52 65  ->op = aStep[bRe
25830 76 5d 3b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c  v];.      pLevel
25840 2d 3e 70 31 20 3d 20 69 43 75 72 3b 0a 20 20 20  ->p1 = iCur;.   
25850 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20     pLevel->p2 = 
25860 31 20 2b 20 73 71 6c 69 74 65 33 56 64 62 65 41  1 + sqlite3VdbeA
25870 64 64 4f 70 32 28 76 2c 20 61 53 74 61 72 74 5b  ddOp2(v, aStart[
25880 62 52 65 76 5d 2c 20 69 43 75 72 2c 20 61 64 64  bRev], iCur, add
25890 72 42 72 6b 29 3b 0a 20 20 20 20 20 20 56 64 62  rBrk);.      Vdb
258a0 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 62  eCoverageIf(v, b
258b0 52 65 76 3d 3d 30 29 3b 0a 20 20 20 20 20 20 56  Rev==0);.      V
258c0 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
258d0 20 62 52 65 76 21 3d 30 29 3b 0a 20 20 20 20 20   bRev!=0);.     
258e0 20 70 4c 65 76 65 6c 2d 3e 70 35 20 3d 20 53 51   pLevel->p5 = SQ
258f0 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f  LITE_STMTSTATUS_
25900 46 55 4c 4c 53 43 41 4e 5f 53 54 45 50 3b 0a 20  FULLSCAN_STEP;. 
25910 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 64 65 66     }.  }..#ifdef
25920 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
25930 54 4d 54 5f 53 43 41 4e 53 54 41 54 55 53 0a 20  TMT_SCANSTATUS. 
25940 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 56 69 73   pLevel->addrVis
25950 69 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  it = sqlite3Vdbe
25960 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
25970 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 6e 73  #endif..  /* Ins
25980 65 72 74 20 63 6f 64 65 20 74 6f 20 74 65 73 74  ert code to test
25990 20 65 76 65 72 79 20 73 75 62 65 78 70 72 65 73   every subexpres
259a0 73 69 6f 6e 20 74 68 61 74 20 63 61 6e 20 62 65  sion that can be
259b0 20 63 6f 6d 70 6c 65 74 65 6c 79 0a 20 20 2a 2a   completely.  **
259c0 20 63 6f 6d 70 75 74 65 64 20 75 73 69 6e 67 20   computed using 
259d0 74 68 65 20 63 75 72 72 65 6e 74 20 73 65 74 20  the current set 
259e0 6f 66 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a  of tables..  */.
259f0 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d    for(pTerm=pWC-
25a00 3e 61 2c 20 6a 3d 70 57 43 2d 3e 6e 54 65 72 6d  >a, j=pWC->nTerm
25a10 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c 20 70 54 65 72  ; j>0; j--, pTer
25a20 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  m++){.    Expr *
25a30 70 45 3b 0a 20 20 20 20 69 6e 74 20 73 6b 69 70  pE;.    int skip
25a40 4c 69 6b 65 41 64 64 72 20 3d 20 30 3b 0a 20 20  LikeAddr = 0;.  
25a50 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
25a60 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
25a70 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20 20 20  M_VIRTUAL );.   
25a80 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
25a90 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
25aa0 5f 43 4f 44 45 44 20 29 3b 0a 20 20 20 20 69 66  _CODED );.    if
25ab0 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  ( pTerm->wtFlags
25ac0 20 26 20 28 54 45 52 4d 5f 56 49 52 54 55 41 4c   & (TERM_VIRTUAL
25ad0 7c 54 45 52 4d 5f 43 4f 44 45 44 29 20 29 20 63  |TERM_CODED) ) c
25ae0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
25af0 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41   (pTerm->prereqA
25b00 6c 6c 20 26 20 70 4c 65 76 65 6c 2d 3e 6e 6f 74  ll & pLevel->not
25b10 52 65 61 64 79 29 21 3d 30 20 29 7b 0a 20 20 20  Ready)!=0 ){.   
25b20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 57 49     testcase( pWI
25b30 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54 65 72  nfo->untestedTer
25b40 6d 73 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20  ms==0.          
25b50 20 20 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d       && (pWInfo-
25b60 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  >wctrlFlags & WH
25b70 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c  ERE_ONETABLE_ONL
25b80 59 29 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  Y)!=0 );.      p
25b90 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54  WInfo->untestedT
25ba0 65 72 6d 73 20 3d 20 31 3b 0a 20 20 20 20 20 20  erms = 1;.      
25bb0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a  continue;.    }.
25bc0 20 20 20 20 70 45 20 3d 20 70 54 65 72 6d 2d 3e      pE = pTerm->
25bd0 70 45 78 70 72 3b 0a 20 20 20 20 61 73 73 65 72  pExpr;.    asser
25be0 74 28 20 70 45 21 3d 30 20 29 3b 0a 20 20 20 20  t( pE!=0 );.    
25bf0 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66  if( pLevel->iLef
25c00 74 4a 6f 69 6e 20 26 26 20 21 45 78 70 72 48 61  tJoin && !ExprHa
25c10 73 50 72 6f 70 65 72 74 79 28 70 45 2c 20 45 50  sProperty(pE, EP
25c20 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20  _FromJoin) ){.  
25c30 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
25c40 20 20 7d 0a 20 20 20 20 69 66 28 20 70 54 65 72    }.    if( pTer
25c50 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
25c60 4d 5f 4c 49 4b 45 43 4f 4e 44 20 29 7b 0a 20 20  M_LIKECOND ){.  
25c70 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 65 76      assert( pLev
25c80 65 6c 2d 3e 69 4c 69 6b 65 52 65 70 43 6e 74 72  el->iLikeRepCntr
25c90 3e 30 20 29 3b 0a 20 20 20 20 20 20 73 6b 69 70  >0 );.      skip
25ca0 4c 69 6b 65 41 64 64 72 20 3d 20 73 71 6c 69 74  LikeAddr = sqlit
25cb0 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
25cc0 4f 50 5f 49 66 4e 6f 74 2c 20 70 4c 65 76 65 6c  OP_IfNot, pLevel
25cd0 2d 3e 69 4c 69 6b 65 52 65 70 43 6e 74 72 29 3b  ->iLikeRepCntr);
25ce0 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
25cf0 61 67 65 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20  age(v);.    }.  
25d00 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
25d10 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 2c  alse(pParse, pE,
25d20 20 61 64 64 72 43 6f 6e 74 2c 20 53 51 4c 49 54   addrCont, SQLIT
25d30 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20  E_JUMPIFNULL);. 
25d40 20 20 20 69 66 28 20 73 6b 69 70 4c 69 6b 65 41     if( skipLikeA
25d50 64 64 72 20 29 20 73 71 6c 69 74 65 33 56 64 62  ddr ) sqlite3Vdb
25d60 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 73 6b 69  eJumpHere(v, ski
25d70 70 4c 69 6b 65 41 64 64 72 29 3b 0a 20 20 20 20  pLikeAddr);.    
25d80 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c  pTerm->wtFlags |
25d90 3d 20 54 45 52 4d 5f 43 4f 44 45 44 3b 0a 20 20  = TERM_CODED;.  
25da0 7d 0a 0a 20 20 2f 2a 20 49 6e 73 65 72 74 20 63  }..  /* Insert c
25db0 6f 64 65 20 74 6f 20 74 65 73 74 20 66 6f 72 20  ode to test for 
25dc0 69 6d 70 6c 69 65 64 20 63 6f 6e 73 74 72 61 69  implied constrai
25dd0 6e 74 73 20 62 61 73 65 64 20 6f 6e 20 74 72 61  nts based on tra
25de0 6e 73 69 74 69 76 69 74 79 0a 20 20 2a 2a 20 6f  nsitivity.  ** o
25df0 66 20 74 68 65 20 22 3d 3d 22 20 6f 70 65 72 61  f the "==" opera
25e00 74 6f 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45  tor..  **.  ** E
25e10 78 61 6d 70 6c 65 3a 20 49 66 20 74 68 65 20 57  xample: If the W
25e20 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 74  HERE clause cont
25e30 61 69 6e 73 20 22 74 31 2e 61 3d 74 32 2e 62 22  ains "t1.a=t2.b"
25e40 20 61 6e 64 20 22 74 32 2e 62 3d 31 32 33 22 0a   and "t2.b=123".
25e50 20 20 2a 2a 20 61 6e 64 20 77 65 20 61 72 65 20    ** and we are 
25e60 63 6f 64 69 6e 67 20 74 68 65 20 74 31 20 6c 6f  coding the t1 lo
25e70 6f 70 20 61 6e 64 20 74 68 65 20 74 32 20 6c 6f  op and the t2 lo
25e80 6f 70 20 68 61 73 20 6e 6f 74 20 79 65 74 20 63  op has not yet c
25e90 6f 64 65 64 2c 0a 20 20 2a 2a 20 74 68 65 6e 20  oded,.  ** then 
25ea0 77 65 20 63 61 6e 6e 6f 74 20 75 73 65 20 74 68  we cannot use th
25eb0 65 20 22 74 31 2e 61 3d 74 32 2e 62 22 20 63 6f  e "t1.a=t2.b" co
25ec0 6e 73 74 72 61 69 6e 74 2c 20 62 75 74 20 77 65  nstraint, but we
25ed0 20 63 61 6e 20 63 6f 64 65 0a 20 20 2a 2a 20 74   can code.  ** t
25ee0 68 65 20 69 6d 70 6c 69 65 64 20 22 74 31 2e 61  he implied "t1.a
25ef0 3d 31 32 33 22 20 63 6f 6e 73 74 72 61 69 6e 74  =123" constraint
25f00 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 54 65  ..  */.  for(pTe
25f10 72 6d 3d 70 57 43 2d 3e 61 2c 20 6a 3d 70 57 43  rm=pWC->a, j=pWC
25f20 2d 3e 6e 54 65 72 6d 3b 20 6a 3e 30 3b 20 6a 2d  ->nTerm; j>0; j-
25f30 2d 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  -, pTerm++){.   
25f40 20 45 78 70 72 20 2a 70 45 2c 20 2a 70 45 41 6c   Expr *pE, *pEAl
25f50 74 3b 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d  t;.    WhereTerm
25f60 20 2a 70 41 6c 74 3b 0a 20 20 20 20 69 66 28 20   *pAlt;.    if( 
25f70 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
25f80 20 28 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54   (TERM_VIRTUAL|T
25f90 45 52 4d 5f 43 4f 44 45 44 29 20 29 20 63 6f 6e  ERM_CODED) ) con
25fa0 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70  tinue;.    if( p
25fb0 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 21  Term->eOperator!
25fc0 3d 28 57 4f 5f 45 51 55 49 56 7c 57 4f 5f 45 51  =(WO_EQUIV|WO_EQ
25fd0 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
25fe0 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66    if( pTerm->lef
25ff0 74 43 75 72 73 6f 72 21 3d 69 43 75 72 20 29 20  tCursor!=iCur ) 
26000 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
26010 28 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a  ( pLevel->iLeftJ
26020 6f 69 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  oin ) continue;.
26030 20 20 20 20 70 45 20 3d 20 70 54 65 72 6d 2d 3e      pE = pTerm->
26040 70 45 78 70 72 3b 0a 20 20 20 20 61 73 73 65 72  pExpr;.    asser
26050 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
26060 72 74 79 28 70 45 2c 20 45 50 5f 46 72 6f 6d 4a  rty(pE, EP_FromJ
26070 6f 69 6e 29 20 29 3b 0a 20 20 20 20 61 73 73 65  oin) );.    asse
26080 72 74 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72  rt( (pTerm->prer
26090 65 71 52 69 67 68 74 20 26 20 70 4c 65 76 65 6c  eqRight & pLevel
260a0 2d 3e 6e 6f 74 52 65 61 64 79 29 21 3d 30 20 29  ->notReady)!=0 )
260b0 3b 0a 20 20 20 20 70 41 6c 74 20 3d 20 66 69 6e  ;.    pAlt = fin
260c0 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c  dTerm(pWC, iCur,
260d0 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f   pTerm->u.leftCo
260e0 6c 75 6d 6e 2c 20 6e 6f 74 52 65 61 64 79 2c 20  lumn, notReady, 
260f0 57 4f 5f 45 51 7c 57 4f 5f 49 4e 2c 20 30 29 3b  WO_EQ|WO_IN, 0);
26100 0a 20 20 20 20 69 66 28 20 70 41 6c 74 3d 3d 30  .    if( pAlt==0
26110 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
26120 20 69 66 28 20 70 41 6c 74 2d 3e 77 74 46 6c 61   if( pAlt->wtFla
26130 67 73 20 26 20 28 54 45 52 4d 5f 43 4f 44 45 44  gs & (TERM_CODED
26140 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
26150 20 20 74 65 73 74 63 61 73 65 28 20 70 41 6c 74    testcase( pAlt
26160 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
26170 5f 45 51 20 29 3b 0a 20 20 20 20 74 65 73 74 63  _EQ );.    testc
26180 61 73 65 28 20 70 41 6c 74 2d 3e 65 4f 70 65 72  ase( pAlt->eOper
26190 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29 3b 0a  ator & WO_IN );.
261a0 20 20 20 20 56 64 62 65 4d 6f 64 75 6c 65 43 6f      VdbeModuleCo
261b0 6d 6d 65 6e 74 28 28 76 2c 20 22 62 65 67 69 6e  mment((v, "begin
261c0 20 74 72 61 6e 73 69 74 69 76 65 20 63 6f 6e 73   transitive cons
261d0 74 72 61 69 6e 74 22 29 29 3b 0a 20 20 20 20 70  traint"));.    p
261e0 45 41 6c 74 20 3d 20 73 71 6c 69 74 65 33 53 74  EAlt = sqlite3St
261f0 61 63 6b 41 6c 6c 6f 63 52 61 77 28 64 62 2c 20  ackAllocRaw(db, 
26200 73 69 7a 65 6f 66 28 2a 70 45 41 6c 74 29 29 3b  sizeof(*pEAlt));
26210 0a 20 20 20 20 69 66 28 20 70 45 41 6c 74 20 29  .    if( pEAlt )
26220 7b 0a 20 20 20 20 20 20 2a 70 45 41 6c 74 20 3d  {.      *pEAlt =
26230 20 2a 70 41 6c 74 2d 3e 70 45 78 70 72 3b 0a 20   *pAlt->pExpr;. 
26240 20 20 20 20 20 70 45 41 6c 74 2d 3e 70 4c 65 66       pEAlt->pLef
26250 74 20 3d 20 70 45 2d 3e 70 4c 65 66 74 3b 0a 20  t = pE->pLeft;. 
26260 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
26270 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
26280 70 45 41 6c 74 2c 20 61 64 64 72 43 6f 6e 74 2c  pEAlt, addrCont,
26290 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55   SQLITE_JUMPIFNU
262a0 4c 4c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  LL);.      sqlit
262b0 65 33 53 74 61 63 6b 46 72 65 65 28 64 62 2c 20  e3StackFree(db, 
262c0 70 45 41 6c 74 29 3b 0a 20 20 20 20 7d 0a 20 20  pEAlt);.    }.  
262d0 7d 0a 0a 20 20 2f 2a 20 46 6f 72 20 61 20 4c 45  }..  /* For a LE
262e0 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 2c 20 67  FT OUTER JOIN, g
262f0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
26300 74 20 77 69 6c 6c 20 72 65 63 6f 72 64 20 74 68  t will record th
26310 65 20 66 61 63 74 20 74 68 61 74 0a 20 20 2a 2a  e fact that.  **
26320 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 72 6f   at least one ro
26330 77 20 6f 66 20 74 68 65 20 72 69 67 68 74 20 74  w of the right t
26340 61 62 6c 65 20 68 61 73 20 6d 61 74 63 68 65 64  able has matched
26350 20 74 68 65 20 6c 65 66 74 20 74 61 62 6c 65 2e   the left table.
26360 20 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c    .  */.  if( pL
26370 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20  evel->iLeftJoin 
26380 29 7b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 61  ){.    pLevel->a
26390 64 64 72 46 69 72 73 74 20 3d 20 73 71 6c 69 74  ddrFirst = sqlit
263a0 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
263b0 72 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  r(v);.    sqlite
263c0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
263d0 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 70 4c  P_Integer, 1, pL
263e0 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29  evel->iLeftJoin)
263f0 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e  ;.    VdbeCommen
26400 74 28 28 76 2c 20 22 72 65 63 6f 72 64 20 4c 45  t((v, "record LE
26410 46 54 20 4a 4f 49 4e 20 68 69 74 22 29 29 3b 0a  FT JOIN hit"));.
26420 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
26430 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65  acheClear(pParse
26440 29 3b 0a 20 20 20 20 66 6f 72 28 70 54 65 72 6d  );.    for(pTerm
26450 3d 70 57 43 2d 3e 61 2c 20 6a 3d 30 3b 20 6a 3c  =pWC->a, j=0; j<
26460 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 6a 2b 2b 2c  pWC->nTerm; j++,
26470 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20   pTerm++){.     
26480 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
26490 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
264a0 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20 20 20 20  _VIRTUAL );.    
264b0 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
264c0 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
264d0 4d 5f 43 4f 44 45 44 20 29 3b 0a 20 20 20 20 20  M_CODED );.     
264e0 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c   if( pTerm->wtFl
264f0 61 67 73 20 26 20 28 54 45 52 4d 5f 56 49 52 54  ags & (TERM_VIRT
26500 55 41 4c 7c 54 45 52 4d 5f 43 4f 44 45 44 29 20  UAL|TERM_CODED) 
26510 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
26520 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72    if( (pTerm->pr
26530 65 72 65 71 41 6c 6c 20 26 20 70 4c 65 76 65 6c  ereqAll & pLevel
26540 2d 3e 6e 6f 74 52 65 61 64 79 29 21 3d 30 20 29  ->notReady)!=0 )
26550 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
26560 28 20 70 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74  ( pWInfo->untest
26570 65 64 54 65 72 6d 73 20 29 3b 0a 20 20 20 20 20  edTerms );.     
26580 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
26590 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
265a0 74 28 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 20  t( pTerm->pExpr 
265b0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
265c0 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
265d0 73 65 2c 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  se, pTerm->pExpr
265e0 2c 20 61 64 64 72 43 6f 6e 74 2c 20 53 51 4c 49  , addrCont, SQLI
265f0 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a  TE_JUMPIFNULL);.
26600 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46        pTerm->wtF
26610 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44  lags |= TERM_COD
26620 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ED;.    }.  }.. 
26630 20 72 65 74 75 72 6e 20 70 4c 65 76 65 6c 2d 3e   return pLevel->
26640 6e 6f 74 52 65 61 64 79 3b 0a 7d 0a 0a 23 69 66  notReady;.}..#if
26650 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45  def WHERETRACE_E
26660 4e 41 42 4c 45 44 0a 2f 2a 0a 2a 2a 20 50 72 69  NABLED./*.** Pri
26670 6e 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  nt the content o
26680 66 20 61 20 57 68 65 72 65 54 65 72 6d 20 6f 62  f a WhereTerm ob
26690 6a 65 63 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ject.*/.static v
266a0 6f 69 64 20 77 68 65 72 65 54 65 72 6d 50 72 69  oid whereTermPri
266b0 6e 74 28 57 68 65 72 65 54 65 72 6d 20 2a 70 54  nt(WhereTerm *pT
266c0 65 72 6d 2c 20 69 6e 74 20 69 54 65 72 6d 29 7b  erm, int iTerm){
266d0 0a 20 20 69 66 28 20 70 54 65 72 6d 3d 3d 30 20  .  if( pTerm==0 
266e0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  ){.    sqlite3De
266f0 62 75 67 50 72 69 6e 74 66 28 22 54 45 52 4d 2d  bugPrintf("TERM-
26700 25 2d 33 64 20 4e 55 4c 4c 5c 6e 22 2c 20 69 54  %-3d NULL\n", iT
26710 65 72 6d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  erm);.  }else{. 
26720 20 20 20 63 68 61 72 20 7a 54 79 70 65 5b 34 5d     char zType[4]
26730 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 54 79  ;.    memcpy(zTy
26740 70 65 2c 20 22 2e 2e 2e 22 2c 20 34 29 3b 0a 20  pe, "...", 4);. 
26750 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74     if( pTerm->wt
26760 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52  Flags & TERM_VIR
26770 54 55 41 4c 20 29 20 7a 54 79 70 65 5b 30 5d 20  TUAL ) zType[0] 
26780 3d 20 27 56 27 3b 0a 20 20 20 20 69 66 28 20 70  = 'V';.    if( p
26790 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
267a0 26 20 57 4f 5f 45 51 55 49 56 20 20 29 20 7a 54  & WO_EQUIV  ) zT
267b0 79 70 65 5b 31 5d 20 3d 20 27 45 27 3b 0a 20 20  ype[1] = 'E';.  
267c0 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
267d0 70 65 72 74 79 28 70 54 65 72 6d 2d 3e 70 45 78  perty(pTerm->pEx
267e0 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  pr, EP_FromJoin)
267f0 20 29 20 7a 54 79 70 65 5b 32 5d 20 3d 20 27 4c   ) zType[2] = 'L
26800 27 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  ';.    sqlite3De
26810 62 75 67 50 72 69 6e 74 66 28 22 54 45 52 4d 2d  bugPrintf("TERM-
26820 25 2d 33 64 20 25 70 20 25 73 20 63 75 72 73 6f  %-3d %p %s curso
26830 72 3d 25 2d 33 64 20 70 72 6f 62 3d 25 2d 33 64  r=%-3d prob=%-3d
26840 20 6f 70 3d 30 78 25 30 33 78 5c 6e 22 2c 0a 20   op=0x%03x\n",. 
26850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26860 20 20 20 20 20 20 69 54 65 72 6d 2c 20 70 54 65        iTerm, pTe
26870 72 6d 2c 20 7a 54 79 70 65 2c 20 70 54 65 72 6d  rm, zType, pTerm
26880 2d 3e 6c 65 66 74 43 75 72 73 6f 72 2c 20 70 54  ->leftCursor, pT
26890 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 2c 0a  erm->truthProb,.
268a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
268b0 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 65 4f         pTerm->eO
268c0 70 65 72 61 74 6f 72 29 3b 0a 20 20 20 20 73 71  perator);.    sq
268d0 6c 69 74 65 33 54 72 65 65 56 69 65 77 45 78 70  lite3TreeViewExp
268e0 72 28 30 2c 20 70 54 65 72 6d 2d 3e 70 45 78 70  r(0, pTerm->pExp
268f0 72 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  r, 0);.  }.}.#en
26900 64 69 66 0a 0a 23 69 66 64 65 66 20 57 48 45 52  dif..#ifdef WHER
26910 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 2f  ETRACE_ENABLED./
26920 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 57 68 65  *.** Print a Whe
26930 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 66 6f  reLoop object fo
26940 72 20 64 65 62 75 67 67 69 6e 67 20 70 75 72 70  r debugging purp
26950 6f 73 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76  oses.*/.static v
26960 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 50 72 69  oid whereLoopPri
26970 6e 74 28 57 68 65 72 65 4c 6f 6f 70 20 2a 70 2c  nt(WhereLoop *p,
26980 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
26990 43 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20  C){.  WhereInfo 
269a0 2a 70 57 49 6e 66 6f 20 3d 20 70 57 43 2d 3e 70  *pWInfo = pWC->p
269b0 57 49 6e 66 6f 3b 0a 20 20 69 6e 74 20 6e 62 20  WInfo;.  int nb 
269c0 3d 20 31 2b 28 70 57 49 6e 66 6f 2d 3e 70 54 61  = 1+(pWInfo->pTa
269d0 62 4c 69 73 74 2d 3e 6e 53 72 63 2b 37 29 2f 38  bList->nSrc+7)/8
269e0 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  ;.  struct SrcLi
269f0 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d  st_item *pItem =
26a00 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73   pWInfo->pTabLis
26a10 74 2d 3e 61 20 2b 20 70 2d 3e 69 54 61 62 3b 0a  t->a + p->iTab;.
26a20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
26a30 70 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 73  pItem->pTab;.  s
26a40 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
26a50 66 28 22 25 63 25 32 64 2e 25 30 2a 6c 6c 78 2e  f("%c%2d.%0*llx.
26a60 25 30 2a 6c 6c 78 22 2c 20 70 2d 3e 63 49 64 2c  %0*llx", p->cId,
26a70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
26a80 20 20 20 20 20 20 70 2d 3e 69 54 61 62 2c 20 6e        p->iTab, n
26a90 62 2c 20 70 2d 3e 6d 61 73 6b 53 65 6c 66 2c 20  b, p->maskSelf, 
26aa0 6e 62 2c 20 70 2d 3e 70 72 65 72 65 71 29 3b 0a  nb, p->prereq);.
26ab0 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
26ac0 69 6e 74 66 28 22 20 25 31 32 73 22 2c 0a 20 20  intf(" %12s",.  
26ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26ae0 20 20 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73     pItem->zAlias
26af0 20 3f 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73   ? pItem->zAlias
26b00 20 3a 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b   : pTab->zName);
26b10 0a 20 20 69 66 28 20 28 70 2d 3e 77 73 46 6c 61  .  if( (p->wsFla
26b20 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55  gs & WHERE_VIRTU
26b30 41 4c 54 41 42 4c 45 29 3d 3d 30 20 29 7b 0a 20  ALTABLE)==0 ){. 
26b40 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
26b50 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28 20 70 2d  Name;.    if( p-
26b60 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20  >u.btree.pIndex 
26b70 26 26 20 28 7a 4e 61 6d 65 20 3d 20 70 2d 3e 75  && (zName = p->u
26b80 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 2d 3e 7a  .btree.pIndex->z
26b90 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20  Name)!=0 ){.    
26ba0 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 4e    if( strncmp(zN
26bb0 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 61 75 74  ame, "sqlite_aut
26bc0 6f 69 6e 64 65 78 5f 22 2c 20 31 37 29 3d 3d 30  oindex_", 17)==0
26bd0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
26be0 69 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  i = sqlite3Strle
26bf0 6e 33 30 28 7a 4e 61 6d 65 29 20 2d 20 31 3b 0a  n30(zName) - 1;.
26c00 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 7a          while( z
26c10 4e 61 6d 65 5b 69 5d 21 3d 27 5f 27 20 29 20 69  Name[i]!='_' ) i
26c20 2d 2d 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d  --;.        zNam
26c30 65 20 2b 3d 20 69 3b 0a 20 20 20 20 20 20 7d 0a  e += i;.      }.
26c40 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
26c50 75 67 50 72 69 6e 74 66 28 22 2e 25 2d 31 36 73  ugPrintf(".%-16s
26c60 20 25 32 64 22 2c 20 7a 4e 61 6d 65 2c 20 70 2d   %2d", zName, p-
26c70 3e 75 2e 62 74 72 65 65 2e 6e 45 71 29 3b 0a 20  >u.btree.nEq);. 
26c80 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
26c90 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
26ca0 74 66 28 22 25 32 30 73 22 2c 22 22 29 3b 0a 20  tf("%20s","");. 
26cb0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
26cc0 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 69    char *z;.    i
26cd0 66 28 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78  f( p->u.vtab.idx
26ce0 53 74 72 20 29 7b 0a 20 20 20 20 20 20 7a 20 3d  Str ){.      z =
26cf0 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
26d00 28 22 28 25 64 2c 5c 22 25 73 5c 22 2c 25 78 29  ("(%d,\"%s\",%x)
26d10 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
26d20 20 20 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78     p->u.vtab.idx
26d30 4e 75 6d 2c 20 70 2d 3e 75 2e 76 74 61 62 2e 69  Num, p->u.vtab.i
26d40 64 78 53 74 72 2c 20 70 2d 3e 75 2e 76 74 61 62  dxStr, p->u.vtab
26d50 2e 6f 6d 69 74 4d 61 73 6b 29 3b 0a 20 20 20 20  .omitMask);.    
26d60 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 20 3d  }else{.      z =
26d70 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
26d80 28 22 28 25 64 2c 25 78 29 22 2c 20 70 2d 3e 75  ("(%d,%x)", p->u
26d90 2e 76 74 61 62 2e 69 64 78 4e 75 6d 2c 20 70 2d  .vtab.idxNum, p-
26da0 3e 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b  >u.vtab.omitMask
26db0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
26dc0 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
26dd0 22 20 25 2d 31 39 73 22 2c 20 7a 29 3b 0a 20 20  " %-19s", z);.  
26de0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
26df0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  );.  }.  if( p->
26e00 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
26e10 53 4b 49 50 53 43 41 4e 20 29 7b 0a 20 20 20 20  SKIPSCAN ){.    
26e20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
26e30 74 66 28 22 20 66 20 25 30 35 78 20 25 64 2d 25  tf(" f %05x %d-%
26e40 64 22 2c 20 70 2d 3e 77 73 46 6c 61 67 73 2c 20  d", p->wsFlags, 
26e50 70 2d 3e 6e 4c 54 65 72 6d 2c 70 2d 3e 6e 53 6b  p->nLTerm,p->nSk
26e60 69 70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ip);.  }else{.  
26e70 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
26e80 69 6e 74 66 28 22 20 66 20 25 30 35 78 20 4e 20  intf(" f %05x N 
26e90 25 64 22 2c 20 70 2d 3e 77 73 46 6c 61 67 73 2c  %d", p->wsFlags,
26ea0 20 70 2d 3e 6e 4c 54 65 72 6d 29 3b 0a 20 20 7d   p->nLTerm);.  }
26eb0 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50  .  sqlite3DebugP
26ec0 72 69 6e 74 66 28 22 20 63 6f 73 74 20 25 64 2c  rintf(" cost %d,
26ed0 25 64 2c 25 64 5c 6e 22 2c 20 70 2d 3e 72 53 65  %d,%d\n", p->rSe
26ee0 74 75 70 2c 20 70 2d 3e 72 52 75 6e 2c 20 70 2d  tup, p->rRun, p-
26ef0 3e 6e 4f 75 74 29 3b 0a 20 20 69 66 28 20 70 2d  >nOut);.  if( p-
26f00 3e 6e 4c 54 65 72 6d 20 26 26 20 28 73 71 6c 69  >nLTerm && (sqli
26f10 74 65 33 57 68 65 72 65 54 72 61 63 65 20 26 20  te3WhereTrace & 
26f20 30 78 31 30 30 29 21 3d 30 20 29 7b 0a 20 20 20  0x100)!=0 ){.   
26f30 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
26f40 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4c 54 65 72 6d  i=0; i<p->nLTerm
26f50 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 77 68  ; i++){.      wh
26f60 65 72 65 54 65 72 6d 50 72 69 6e 74 28 70 2d 3e  ereTermPrint(p->
26f70 61 4c 54 65 72 6d 5b 69 5d 2c 20 69 29 3b 0a 20  aLTerm[i], i);. 
26f80 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69     }.  }.}.#endi
26f90 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  f../*.** Convert
26fa0 20 62 75 6c 6b 20 6d 65 6d 6f 72 79 20 69 6e 74   bulk memory int
26fb0 6f 20 61 20 76 61 6c 69 64 20 57 68 65 72 65 4c  o a valid WhereL
26fc0 6f 6f 70 20 74 68 61 74 20 63 61 6e 20 62 65 20  oop that can be 
26fd0 70 61 73 73 65 64 0a 2a 2a 20 74 6f 20 77 68 65  passed.** to whe
26fe0 72 65 4c 6f 6f 70 43 6c 65 61 72 20 68 61 72 6d  reLoopClear harm
26ff0 6c 65 73 73 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69  lessly..*/.stati
27000 63 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70  c void whereLoop
27010 49 6e 69 74 28 57 68 65 72 65 4c 6f 6f 70 20 2a  Init(WhereLoop *
27020 70 29 7b 0a 20 20 70 2d 3e 61 4c 54 65 72 6d 20  p){.  p->aLTerm 
27030 3d 20 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65  = p->aLTermSpace
27040 3b 0a 20 20 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20  ;.  p->nLTerm = 
27050 30 3b 0a 20 20 70 2d 3e 6e 4c 53 6c 6f 74 20 3d  0;.  p->nLSlot =
27060 20 41 72 72 61 79 53 69 7a 65 28 70 2d 3e 61 4c   ArraySize(p->aL
27070 54 65 72 6d 53 70 61 63 65 29 3b 0a 20 20 70 2d  TermSpace);.  p-
27080 3e 77 73 46 6c 61 67 73 20 3d 20 30 3b 0a 7d 0a  >wsFlags = 0;.}.
27090 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65  ./*.** Clear the
270a0 20 57 68 65 72 65 4c 6f 6f 70 2e 75 20 75 6e 69   WhereLoop.u uni
270b0 6f 6e 2e 20 20 4c 65 61 76 65 20 57 68 65 72 65  on.  Leave Where
270c0 4c 6f 6f 70 2e 70 4c 54 65 72 6d 20 69 6e 74 61  Loop.pLTerm inta
270d0 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ct..*/.static vo
270e0 69 64 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61  id whereLoopClea
270f0 72 55 6e 69 6f 6e 28 73 71 6c 69 74 65 33 20 2a  rUnion(sqlite3 *
27100 64 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  db, WhereLoop *p
27110 29 7b 0a 20 20 69 66 28 20 70 2d 3e 77 73 46 6c  ){.  if( p->wsFl
27120 61 67 73 20 26 20 28 57 48 45 52 45 5f 56 49 52  ags & (WHERE_VIR
27130 54 55 41 4c 54 41 42 4c 45 7c 57 48 45 52 45 5f  TUALTABLE|WHERE_
27140 41 55 54 4f 5f 49 4e 44 45 58 29 20 29 7b 0a 20  AUTO_INDEX) ){. 
27150 20 20 20 69 66 28 20 28 70 2d 3e 77 73 46 6c 61     if( (p->wsFla
27160 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55  gs & WHERE_VIRTU
27170 41 4c 54 41 42 4c 45 29 21 3d 30 20 26 26 20 70  ALTABLE)!=0 && p
27180 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65  ->u.vtab.needFre
27190 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  e ){.      sqlit
271a0 65 33 5f 66 72 65 65 28 70 2d 3e 75 2e 76 74 61  e3_free(p->u.vta
271b0 62 2e 69 64 78 53 74 72 29 3b 0a 20 20 20 20 20  b.idxStr);.     
271c0 20 70 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46   p->u.vtab.needF
271d0 72 65 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  ree = 0;.      p
271e0 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72 20  ->u.vtab.idxStr 
271f0 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  = 0;.    }else i
27200 66 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26  f( (p->wsFlags &
27210 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45   WHERE_AUTO_INDE
27220 58 29 21 3d 30 20 26 26 20 70 2d 3e 75 2e 62 74  X)!=0 && p->u.bt
27230 72 65 65 2e 70 49 6e 64 65 78 21 3d 30 20 29 7b  ree.pIndex!=0 ){
27240 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
27250 46 72 65 65 28 64 62 2c 20 70 2d 3e 75 2e 62 74  Free(db, p->u.bt
27260 72 65 65 2e 70 49 6e 64 65 78 2d 3e 7a 43 6f 6c  ree.pIndex->zCol
27270 41 66 66 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Aff);.      sqli
27280 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
27290 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 29  >u.btree.pIndex)
272a0 3b 0a 20 20 20 20 20 20 70 2d 3e 75 2e 62 74 72  ;.      p->u.btr
272b0 65 65 2e 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20  ee.pIndex = 0;. 
272c0 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
272d0 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20 69 6e 74  * Deallocate int
272e0 65 72 6e 61 6c 20 6d 65 6d 6f 72 79 20 75 73 65  ernal memory use
272f0 64 20 62 79 20 61 20 57 68 65 72 65 4c 6f 6f 70  d by a WhereLoop
27300 20 6f 62 6a 65 63 74 0a 2a 2f 0a 73 74 61 74 69   object.*/.stati
27310 63 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70  c void whereLoop
27320 43 6c 65 61 72 28 73 71 6c 69 74 65 33 20 2a 64  Clear(sqlite3 *d
27330 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29  b, WhereLoop *p)
27340 7b 0a 20 20 69 66 28 20 70 2d 3e 61 4c 54 65 72  {.  if( p->aLTer
27350 6d 21 3d 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63  m!=p->aLTermSpac
27360 65 20 29 20 73 71 6c 69 74 65 33 44 62 46 72 65  e ) sqlite3DbFre
27370 65 28 64 62 2c 20 70 2d 3e 61 4c 54 65 72 6d 29  e(db, p->aLTerm)
27380 3b 0a 20 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65  ;.  whereLoopCle
27390 61 72 55 6e 69 6f 6e 28 64 62 2c 20 70 29 3b 0a  arUnion(db, p);.
273a0 20 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28    whereLoopInit(
273b0 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63  p);.}../*.** Inc
273c0 72 65 61 73 65 20 74 68 65 20 6d 65 6d 6f 72 79  rease the memory
273d0 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 6f 72 20   allocation for 
273e0 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 5d 20  pLoop->aLTerm[] 
273f0 74 6f 20 62 65 20 61 74 20 6c 65 61 73 74 20 6e  to be at least n
27400 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
27410 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28  whereLoopResize(
27420 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65  sqlite3 *db, Whe
27430 72 65 4c 6f 6f 70 20 2a 70 2c 20 69 6e 74 20 6e  reLoop *p, int n
27440 29 7b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  ){.  WhereTerm *
27450 2a 70 61 4e 65 77 3b 0a 20 20 69 66 28 20 70 2d  *paNew;.  if( p-
27460 3e 6e 4c 53 6c 6f 74 3e 3d 6e 20 29 20 72 65 74  >nLSlot>=n ) ret
27470 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
27480 20 6e 20 3d 20 28 6e 2b 37 29 26 7e 37 3b 0a 20   n = (n+7)&~7;. 
27490 20 70 61 4e 65 77 20 3d 20 73 71 6c 69 74 65 33   paNew = sqlite3
274a0 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20  DbMallocRaw(db, 
274b0 73 69 7a 65 6f 66 28 70 2d 3e 61 4c 54 65 72 6d  sizeof(p->aLTerm
274c0 5b 30 5d 29 2a 6e 29 3b 0a 20 20 69 66 28 20 70  [0])*n);.  if( p
274d0 61 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e  aNew==0 ) return
274e0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
274f0 20 6d 65 6d 63 70 79 28 70 61 4e 65 77 2c 20 70   memcpy(paNew, p
27500 2d 3e 61 4c 54 65 72 6d 2c 20 73 69 7a 65 6f 66  ->aLTerm, sizeof
27510 28 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d 29 2a 70  (p->aLTerm[0])*p
27520 2d 3e 6e 4c 53 6c 6f 74 29 3b 0a 20 20 69 66 28  ->nLSlot);.  if(
27530 20 70 2d 3e 61 4c 54 65 72 6d 21 3d 70 2d 3e 61   p->aLTerm!=p->a
27540 4c 54 65 72 6d 53 70 61 63 65 20 29 20 73 71 6c  LTermSpace ) sql
27550 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
27560 2d 3e 61 4c 54 65 72 6d 29 3b 0a 20 20 70 2d 3e  ->aLTerm);.  p->
27570 61 4c 54 65 72 6d 20 3d 20 70 61 4e 65 77 3b 0a  aLTerm = paNew;.
27580 20 20 70 2d 3e 6e 4c 53 6c 6f 74 20 3d 20 6e 3b    p->nLSlot = n;
27590 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
275a0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72  _OK;.}../*.** Tr
275b0 61 6e 73 66 65 72 20 63 6f 6e 74 65 6e 74 20 66  ansfer content f
275c0 72 6f 6d 20 74 68 65 20 73 65 63 6f 6e 64 20 70  rom the second p
275d0 4c 6f 6f 70 20 69 6e 74 6f 20 74 68 65 20 66 69  Loop into the fi
275e0 72 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  rst..*/.static i
275f0 6e 74 20 77 68 65 72 65 4c 6f 6f 70 58 66 65 72  nt whereLoopXfer
27600 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68  (sqlite3 *db, Wh
27610 65 72 65 4c 6f 6f 70 20 2a 70 54 6f 2c 20 57 68  ereLoop *pTo, Wh
27620 65 72 65 4c 6f 6f 70 20 2a 70 46 72 6f 6d 29 7b  ereLoop *pFrom){
27630 0a 20 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61  .  whereLoopClea
27640 72 55 6e 69 6f 6e 28 64 62 2c 20 70 54 6f 29 3b  rUnion(db, pTo);
27650 0a 20 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70  .  if( whereLoop
27660 52 65 73 69 7a 65 28 64 62 2c 20 70 54 6f 2c 20  Resize(db, pTo, 
27670 70 46 72 6f 6d 2d 3e 6e 4c 54 65 72 6d 29 20 29  pFrom->nLTerm) )
27680 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 70 54  {.    memset(&pT
27690 6f 2d 3e 75 2c 20 30 2c 20 73 69 7a 65 6f 66 28  o->u, 0, sizeof(
276a0 70 54 6f 2d 3e 75 29 29 3b 0a 20 20 20 20 72 65  pTo->u));.    re
276b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
276c0 4d 3b 0a 20 20 7d 0a 20 20 6d 65 6d 63 70 79 28  M;.  }.  memcpy(
276d0 70 54 6f 2c 20 70 46 72 6f 6d 2c 20 57 48 45 52  pTo, pFrom, WHER
276e0 45 5f 4c 4f 4f 50 5f 58 46 45 52 5f 53 5a 29 3b  E_LOOP_XFER_SZ);
276f0 0a 20 20 6d 65 6d 63 70 79 28 70 54 6f 2d 3e 61  .  memcpy(pTo->a
27700 4c 54 65 72 6d 2c 20 70 46 72 6f 6d 2d 3e 61 4c  LTerm, pFrom->aL
27710 54 65 72 6d 2c 20 70 54 6f 2d 3e 6e 4c 54 65 72  Term, pTo->nLTer
27720 6d 2a 73 69 7a 65 6f 66 28 70 54 6f 2d 3e 61 4c  m*sizeof(pTo->aL
27730 54 65 72 6d 5b 30 5d 29 29 3b 0a 20 20 69 66 28  Term[0]));.  if(
27740 20 70 46 72 6f 6d 2d 3e 77 73 46 6c 61 67 73 20   pFrom->wsFlags 
27750 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54  & WHERE_VIRTUALT
27760 41 42 4c 45 20 29 7b 0a 20 20 20 20 70 46 72 6f  ABLE ){.    pFro
27770 6d 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72  m->u.vtab.needFr
27780 65 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20  ee = 0;.  }else 
27790 69 66 28 20 28 70 46 72 6f 6d 2d 3e 77 73 46 6c  if( (pFrom->wsFl
277a0 61 67 73 20 26 20 57 48 45 52 45 5f 41 55 54 4f  ags & WHERE_AUTO
277b0 5f 49 4e 44 45 58 29 21 3d 30 20 29 7b 0a 20 20  _INDEX)!=0 ){.  
277c0 20 20 70 46 72 6f 6d 2d 3e 75 2e 62 74 72 65 65    pFrom->u.btree
277d0 2e 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 7d  .pIndex = 0;.  }
277e0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
277f0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  _OK;.}../*.** De
27800 6c 65 74 65 20 61 20 57 68 65 72 65 4c 6f 6f 70  lete a WhereLoop
27810 20 6f 62 6a 65 63 74 0a 2a 2f 0a 73 74 61 74 69   object.*/.stati
27820 63 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70  c void whereLoop
27830 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a  Delete(sqlite3 *
27840 64 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  db, WhereLoop *p
27850 29 7b 0a 20 20 77 68 65 72 65 4c 6f 6f 70 43 6c  ){.  whereLoopCl
27860 65 61 72 28 64 62 2c 20 70 29 3b 0a 20 20 73 71  ear(db, p);.  sq
27870 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
27880 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65  p);.}../*.** Fre
27890 65 20 61 20 57 68 65 72 65 49 6e 66 6f 20 73 74  e a WhereInfo st
278a0 72 75 63 74 75 72 65 0a 2a 2f 0a 73 74 61 74 69  ructure.*/.stati
278b0 63 20 76 6f 69 64 20 77 68 65 72 65 49 6e 66 6f  c void whereInfo
278c0 46 72 65 65 28 73 71 6c 69 74 65 33 20 2a 64 62  Free(sqlite3 *db
278d0 2c 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49  , WhereInfo *pWI
278e0 6e 66 6f 29 7b 0a 20 20 69 66 28 20 41 4c 57 41  nfo){.  if( ALWA
278f0 59 53 28 70 57 49 6e 66 6f 29 20 29 7b 0a 20 20  YS(pWInfo) ){.  
27900 20 20 77 68 65 72 65 43 6c 61 75 73 65 43 6c 65    whereClauseCle
27910 61 72 28 26 70 57 49 6e 66 6f 2d 3e 73 57 43 29  ar(&pWInfo->sWC)
27920 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 57 49  ;.    while( pWI
27930 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 20 29 7b 0a 20  nfo->pLoops ){. 
27940 20 20 20 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a       WhereLoop *
27950 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f  p = pWInfo->pLoo
27960 70 73 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f  ps;.      pWInfo
27970 2d 3e 70 4c 6f 6f 70 73 20 3d 20 70 2d 3e 70 4e  ->pLoops = p->pN
27980 65 78 74 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 77  extLoop;.      w
27990 68 65 72 65 4c 6f 6f 70 44 65 6c 65 74 65 28 64  hereLoopDelete(d
279a0 62 2c 20 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20  b, p);.    }.   
279b0 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 62 53 68   if( pWInfo->bSh
279c0 6f 72 74 63 75 74 20 29 7b 0a 20 20 20 20 20 20  ortcut ){.      
279d0 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 28 64  whereLoopClear(d
279e0 62 2c 20 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e  b, pWInfo->a[0].
279f0 70 57 4c 6f 6f 70 29 3b 0a 20 20 20 20 7d 0a 20  pWLoop);.    }. 
27a00 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
27a10 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20  (db, pWInfo);.  
27a20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  }.}../*.** Retur
27a30 6e 20 54 52 55 45 20 69 66 20 61 6c 6c 20 6f 66  n TRUE if all of
27a40 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   the following a
27a50 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20  re true:.**.**  
27a60 20 28 31 29 20 20 58 20 68 61 73 20 74 68 65 20   (1)  X has the 
27a70 73 61 6d 65 20 6f 72 20 6c 6f 77 65 72 20 63 6f  same or lower co
27a80 73 74 20 74 68 61 74 20 59 0a 2a 2a 20 20 20 28  st that Y.**   (
27a90 32 29 20 20 58 20 69 73 20 61 20 70 72 6f 70 65  2)  X is a prope
27aa0 72 20 73 75 62 73 65 74 20 6f 66 20 59 0a 2a 2a  r subset of Y.**
27ab0 20 20 20 28 33 29 20 20 58 20 73 6b 69 70 73 20     (3)  X skips 
27ac0 61 74 20 6c 65 61 73 74 20 61 73 20 6d 61 6e 79  at least as many
27ad0 20 63 6f 6c 75 6d 6e 73 20 61 73 20 59 0a 2a 2a   columns as Y.**
27ae0 0a 2a 2a 20 42 79 20 22 70 72 6f 70 65 72 20 73  .** By "proper s
27af0 75 62 73 65 74 22 20 77 65 20 6d 65 61 6e 20 74  ubset" we mean t
27b00 68 61 74 20 58 20 75 73 65 73 20 66 65 77 65 72  hat X uses fewer
27b10 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65   WHERE clause te
27b20 72 6d 73 0a 2a 2a 20 74 68 61 6e 20 59 20 61 6e  rms.** than Y an
27b30 64 20 74 68 61 74 20 65 76 65 72 79 20 57 48 45  d that every WHE
27b40 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20 75  RE clause term u
27b50 73 65 64 20 62 79 20 58 20 69 73 20 61 6c 73 6f  sed by X is also
27b60 20 75 73 65 64 0a 2a 2a 20 62 79 20 59 2e 0a 2a   used.** by Y..*
27b70 2a 0a 2a 2a 20 49 66 20 58 20 69 73 20 61 20 70  *.** If X is a p
27b80 72 6f 70 65 72 20 73 75 62 73 65 74 20 6f 66 20  roper subset of 
27b90 59 20 74 68 65 6e 20 59 20 69 73 20 61 20 62 65  Y then Y is a be
27ba0 74 74 65 72 20 63 68 6f 69 63 65 20 61 6e 64 20  tter choice and 
27bb0 6f 75 67 68 74 0a 2a 2a 20 74 6f 20 68 61 76 65  ought.** to have
27bc0 20 61 20 6c 6f 77 65 72 20 63 6f 73 74 2e 20 20   a lower cost.  
27bd0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  This routine ret
27be0 75 72 6e 73 20 54 52 55 45 20 77 68 65 6e 20 74  urns TRUE when t
27bf0 68 61 74 20 63 6f 73 74 20 0a 2a 2a 20 72 65 6c  hat cost .** rel
27c00 61 74 69 6f 6e 73 68 69 70 20 69 73 20 69 6e 76  ationship is inv
27c10 65 72 74 65 64 20 61 6e 64 20 6e 65 65 64 73 20  erted and needs 
27c20 74 6f 20 62 65 20 61 64 6a 75 73 74 65 64 2e 20  to be adjusted. 
27c30 20 54 68 65 20 74 68 69 72 64 20 72 75 6c 65 0a   The third rule.
27c40 2a 2a 20 77 61 73 20 61 64 64 65 64 20 62 65 63  ** was added bec
27c50 61 75 73 65 20 69 66 20 58 20 75 73 65 73 20 73  ause if X uses s
27c60 6b 69 70 2d 73 63 61 6e 20 6c 65 73 73 20 74 68  kip-scan less th
27c70 61 6e 20 59 20 69 74 20 73 74 69 6c 6c 20 6d 69  an Y it still mi
27c80 67 68 74 0a 2a 2a 20 64 65 73 65 72 76 65 20 61  ght.** deserve a
27c90 20 6c 6f 77 65 72 20 63 6f 73 74 20 65 76 65 6e   lower cost even
27ca0 20 69 66 20 69 74 20 69 73 20 61 20 70 72 6f 70   if it is a prop
27cb0 65 72 20 73 75 62 73 65 74 20 6f 66 20 59 2e 0a  er subset of Y..
27cc0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68  */.static int wh
27cd0 65 72 65 4c 6f 6f 70 43 68 65 61 70 65 72 50 72  ereLoopCheaperPr
27ce0 6f 70 65 72 53 75 62 73 65 74 28 0a 20 20 63 6f  operSubset(.  co
27cf0 6e 73 74 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  nst WhereLoop *p
27d00 58 2c 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73  X,       /* Firs
27d10 74 20 57 68 65 72 65 4c 6f 6f 70 20 74 6f 20 63  t WhereLoop to c
27d20 6f 6d 70 61 72 65 20 2a 2f 0a 20 20 63 6f 6e 73  ompare */.  cons
27d30 74 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 59 20  t WhereLoop *pY 
27d40 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 61 72         /* Compar
27d50 65 20 61 67 61 69 6e 73 74 20 74 68 69 73 20 57  e against this W
27d60 68 65 72 65 4c 6f 6f 70 20 2a 2f 0a 29 7b 0a 20  hereLoop */.){. 
27d70 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 66 28   int i, j;.  if(
27d80 20 70 58 2d 3e 6e 4c 54 65 72 6d 2d 70 58 2d 3e   pX->nLTerm-pX->
27d90 6e 53 6b 69 70 20 3e 3d 20 70 59 2d 3e 6e 4c 54  nSkip >= pY->nLT
27da0 65 72 6d 2d 70 59 2d 3e 6e 53 6b 69 70 20 29 7b  erm-pY->nSkip ){
27db0 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 2f  .    return 0; /
27dc0 2a 20 58 20 69 73 20 6e 6f 74 20 61 20 73 75 62  * X is not a sub
27dd0 73 65 74 20 6f 66 20 59 20 2a 2f 0a 20 20 7d 0a  set of Y */.  }.
27de0 20 20 69 66 28 20 70 59 2d 3e 6e 53 6b 69 70 20    if( pY->nSkip 
27df0 3e 20 70 58 2d 3e 6e 53 6b 69 70 20 29 20 72 65  > pX->nSkip ) re
27e00 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 58  turn 0;.  if( pX
27e10 2d 3e 72 52 75 6e 20 3e 3d 20 70 59 2d 3e 72 52  ->rRun >= pY->rR
27e20 75 6e 20 29 7b 0a 20 20 20 20 69 66 28 20 70 58  un ){.    if( pX
27e30 2d 3e 72 52 75 6e 20 3e 20 70 59 2d 3e 72 52 75  ->rRun > pY->rRu
27e40 6e 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  n ) return 0;   
27e50 20 2f 2a 20 58 20 63 6f 73 74 73 20 6d 6f 72 65   /* X costs more
27e60 20 74 68 61 6e 20 59 20 2a 2f 0a 20 20 20 20 69   than Y */.    i
27e70 66 28 20 70 58 2d 3e 6e 4f 75 74 20 3e 20 70 59  f( pX->nOut > pY
27e80 2d 3e 6e 4f 75 74 20 29 20 72 65 74 75 72 6e 20  ->nOut ) return 
27e90 30 3b 20 20 20 20 2f 2a 20 58 20 63 6f 73 74 73  0;    /* X costs
27ea0 20 6d 6f 72 65 20 74 68 61 6e 20 59 20 2a 2f 0a   more than Y */.
27eb0 20 20 7d 0a 20 20 66 6f 72 28 69 3d 70 58 2d 3e    }.  for(i=pX->
27ec0 6e 4c 54 65 72 6d 2d 31 3b 20 69 3e 3d 30 3b 20  nLTerm-1; i>=0; 
27ed0 69 2d 2d 29 7b 0a 20 20 20 20 69 66 28 20 70 58  i--){.    if( pX
27ee0 2d 3e 61 4c 54 65 72 6d 5b 69 5d 3d 3d 30 20 29  ->aLTerm[i]==0 )
27ef0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 66   continue;.    f
27f00 6f 72 28 6a 3d 70 59 2d 3e 6e 4c 54 65 72 6d 2d  or(j=pY->nLTerm-
27f10 31 3b 20 6a 3e 3d 30 3b 20 6a 2d 2d 29 7b 0a 20  1; j>=0; j--){. 
27f20 20 20 20 20 20 69 66 28 20 70 59 2d 3e 61 4c 54       if( pY->aLT
27f30 65 72 6d 5b 6a 5d 3d 3d 70 58 2d 3e 61 4c 54 65  erm[j]==pX->aLTe
27f40 72 6d 5b 69 5d 20 29 20 62 72 65 61 6b 3b 0a 20  rm[i] ) break;. 
27f50 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6a 3c 30     }.    if( j<0
27f60 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a   ) return 0;  /*
27f70 20 58 20 6e 6f 74 20 61 20 73 75 62 73 65 74 20   X not a subset 
27f80 6f 66 20 59 20 73 69 6e 63 65 20 74 65 72 6d 20  of Y since term 
27f90 58 5b 69 5d 20 6e 6f 74 20 75 73 65 64 20 62 79  X[i] not used by
27fa0 20 59 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75   Y */.  }.  retu
27fb0 72 6e 20 31 3b 20 20 2f 2a 20 41 6c 6c 20 63 6f  rn 1;  /* All co
27fc0 6e 64 69 74 69 6f 6e 73 20 6d 65 65 74 20 2a 2f  nditions meet */
27fd0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f  .}../*.** Try to
27fe0 20 61 64 6a 75 73 74 20 74 68 65 20 63 6f 73 74   adjust the cost
27ff0 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70 20 70 54   of WhereLoop pT
28000 65 6d 70 6c 61 74 65 20 75 70 77 61 72 64 73 20  emplate upwards 
28010 6f 72 20 64 6f 77 6e 77 61 72 64 73 20 73 6f 0a  or downwards so.
28020 2a 2a 20 74 68 61 74 3a 0a 2a 2a 0a 2a 2a 20 20  ** that:.**.**  
28030 20 28 31 29 20 70 54 65 6d 70 6c 61 74 65 20 63   (1) pTemplate c
28040 6f 73 74 73 20 6c 65 73 73 20 74 68 61 6e 20 61  osts less than a
28050 6e 79 20 6f 74 68 65 72 20 57 68 65 72 65 4c 6f  ny other WhereLo
28060 6f 70 73 20 74 68 61 74 20 61 72 65 20 61 20 70  ops that are a p
28070 72 6f 70 65 72 0a 2a 2a 20 20 20 20 20 20 20 73  roper.**       s
28080 75 62 73 65 74 20 6f 66 20 70 54 65 6d 70 6c 61  ubset of pTempla
28090 74 65 0a 2a 2a 0a 2a 2a 20 20 20 28 32 29 20 70  te.**.**   (2) p
280a0 54 65 6d 70 6c 61 74 65 20 63 6f 73 74 73 20 6d  Template costs m
280b0 6f 72 65 20 74 68 61 6e 20 61 6e 79 20 6f 74 68  ore than any oth
280c0 65 72 20 57 68 65 72 65 4c 6f 6f 70 73 20 66 6f  er WhereLoops fo
280d0 72 20 77 68 69 63 68 20 70 54 65 6d 70 6c 61 74  r which pTemplat
280e0 65 0a 2a 2a 20 20 20 20 20 20 20 69 73 20 61 20  e.**       is a 
280f0 70 72 6f 70 65 72 20 73 75 62 73 65 74 2e 0a 2a  proper subset..*
28100 2a 0a 2a 2a 20 54 6f 20 73 61 79 20 22 57 68 65  *.** To say "Whe
28110 72 65 4c 6f 6f 70 20 58 20 69 73 20 61 20 70 72  reLoop X is a pr
28120 6f 70 65 72 20 73 75 62 73 65 74 20 6f 66 20 59  oper subset of Y
28130 22 20 6d 65 61 6e 73 20 74 68 61 74 20 58 20 75  " means that X u
28140 73 65 73 20 66 65 77 65 72 0a 2a 2a 20 57 48 45  ses fewer.** WHE
28150 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20  RE clause terms 
28160 74 68 61 6e 20 59 20 61 6e 64 20 74 68 61 74 20  than Y and that 
28170 65 76 65 72 79 20 57 48 45 52 45 20 63 6c 61 75  every WHERE clau
28180 73 65 20 74 65 72 6d 20 75 73 65 64 20 62 79 20  se term used by 
28190 58 20 69 73 0a 2a 2a 20 61 6c 73 6f 20 75 73 65  X is.** also use
281a0 64 20 62 79 20 59 2e 0a 2a 2f 0a 73 74 61 74 69  d by Y..*/.stati
281b0 63 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70  c void whereLoop
281c0 41 64 6a 75 73 74 43 6f 73 74 28 63 6f 6e 73 74  AdjustCost(const
281d0 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 2c 20 57   WhereLoop *p, W
281e0 68 65 72 65 4c 6f 6f 70 20 2a 70 54 65 6d 70 6c  hereLoop *pTempl
281f0 61 74 65 29 7b 0a 20 20 69 66 28 20 28 70 54 65  ate){.  if( (pTe
28200 6d 70 6c 61 74 65 2d 3e 77 73 46 6c 61 67 73 20  mplate->wsFlags 
28210 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29  & WHERE_INDEXED)
28220 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
28230 66 6f 72 28 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e  for(; p; p=p->pN
28240 65 78 74 4c 6f 6f 70 29 7b 0a 20 20 20 20 69 66  extLoop){.    if
28250 28 20 70 2d 3e 69 54 61 62 21 3d 70 54 65 6d 70  ( p->iTab!=pTemp
28260 6c 61 74 65 2d 3e 69 54 61 62 20 29 20 63 6f 6e  late->iTab ) con
28270 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 28  tinue;.    if( (
28280 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
28290 52 45 5f 49 4e 44 45 58 45 44 29 3d 3d 30 20 29  RE_INDEXED)==0 )
282a0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
282b0 66 28 20 77 68 65 72 65 4c 6f 6f 70 43 68 65 61  f( whereLoopChea
282c0 70 65 72 50 72 6f 70 65 72 53 75 62 73 65 74 28  perProperSubset(
282d0 70 2c 20 70 54 65 6d 70 6c 61 74 65 29 20 29 7b  p, pTemplate) ){
282e0 0a 20 20 20 20 20 20 2f 2a 20 41 64 6a 75 73 74  .      /* Adjust
282f0 20 70 54 65 6d 70 6c 61 74 65 20 63 6f 73 74 20   pTemplate cost 
28300 64 6f 77 6e 77 61 72 64 20 73 6f 20 74 68 61 74  downward so that
28310 20 69 74 20 69 73 20 63 68 65 61 70 65 72 20 74   it is cheaper t
28320 68 61 6e 20 69 74 73 20 0a 20 20 20 20 20 20 2a  han its .      *
28330 2a 20 73 75 62 73 65 74 20 70 2e 20 2a 2f 0a 20  * subset p. */. 
28340 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28       WHERETRACE(
28350 30 78 38 30 2c 28 22 73 75 62 73 65 74 20 63 6f  0x80,("subset co
28360 73 74 20 61 64 6a 75 73 74 6d 65 6e 74 20 25 64  st adjustment %d
28370 2c 25 64 20 74 6f 20 25 64 2c 25 64 5c 6e 22 2c  ,%d to %d,%d\n",
28380 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
28390 20 20 20 20 20 20 20 20 70 54 65 6d 70 6c 61 74          pTemplat
283a0 65 2d 3e 72 52 75 6e 2c 20 70 54 65 6d 70 6c 61  e->rRun, pTempla
283b0 74 65 2d 3e 6e 4f 75 74 2c 20 70 2d 3e 72 52 75  te->nOut, p->rRu
283c0 6e 2c 20 70 2d 3e 6e 4f 75 74 2d 31 29 29 3b 0a  n, p->nOut-1));.
283d0 20 20 20 20 20 20 70 54 65 6d 70 6c 61 74 65 2d        pTemplate-
283e0 3e 72 52 75 6e 20 3d 20 70 2d 3e 72 52 75 6e 3b  >rRun = p->rRun;
283f0 0a 20 20 20 20 20 20 70 54 65 6d 70 6c 61 74 65  .      pTemplate
28400 2d 3e 6e 4f 75 74 20 3d 20 70 2d 3e 6e 4f 75 74  ->nOut = p->nOut
28410 20 2d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20   - 1;.    }else 
28420 69 66 28 20 77 68 65 72 65 4c 6f 6f 70 43 68 65  if( whereLoopChe
28430 61 70 65 72 50 72 6f 70 65 72 53 75 62 73 65 74  aperProperSubset
28440 28 70 54 65 6d 70 6c 61 74 65 2c 20 70 29 20 29  (pTemplate, p) )
28450 7b 0a 20 20 20 20 20 20 2f 2a 20 41 64 6a 75 73  {.      /* Adjus
28460 74 20 70 54 65 6d 70 6c 61 74 65 20 63 6f 73 74  t pTemplate cost
28470 20 75 70 77 61 72 64 20 73 6f 20 74 68 61 74 20   upward so that 
28480 69 74 20 69 73 20 63 6f 73 74 6c 69 65 72 20 74  it is costlier t
28490 68 61 6e 20 70 20 73 69 6e 63 65 0a 20 20 20 20  han p since.    
284a0 20 20 2a 2a 20 70 54 65 6d 70 6c 61 74 65 20 69    ** pTemplate i
284b0 73 20 61 20 70 72 6f 70 65 72 20 73 75 62 73 65  s a proper subse
284c0 74 20 6f 66 20 70 20 2a 2f 0a 20 20 20 20 20 20  t of p */.      
284d0 57 48 45 52 45 54 52 41 43 45 28 30 78 38 30 2c  WHERETRACE(0x80,
284e0 28 22 73 75 62 73 65 74 20 63 6f 73 74 20 61 64  ("subset cost ad
284f0 6a 75 73 74 6d 65 6e 74 20 25 64 2c 25 64 20 74  justment %d,%d t
28500 6f 20 25 64 2c 25 64 5c 6e 22 2c 0a 20 20 20 20  o %d,%d\n",.    
28510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28520 20 20 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52     pTemplate->rR
28530 75 6e 2c 20 70 54 65 6d 70 6c 61 74 65 2d 3e 6e  un, pTemplate->n
28540 4f 75 74 2c 20 70 2d 3e 72 52 75 6e 2c 20 70 2d  Out, p->rRun, p-
28550 3e 6e 4f 75 74 2b 31 29 29 3b 0a 20 20 20 20 20  >nOut+1));.     
28560 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e   pTemplate->rRun
28570 20 3d 20 70 2d 3e 72 52 75 6e 3b 0a 20 20 20 20   = p->rRun;.    
28580 20 20 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75    pTemplate->nOu
28590 74 20 3d 20 70 2d 3e 6e 4f 75 74 20 2b 20 31 3b  t = p->nOut + 1;
285a0 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
285b0 0a 2a 2a 20 53 65 61 72 63 68 20 74 68 65 20 6c  .** Search the l
285c0 69 73 74 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70  ist of WhereLoop
285d0 73 20 69 6e 20 2a 70 70 50 72 65 76 20 6c 6f 6f  s in *ppPrev loo
285e0 6b 69 6e 67 20 66 6f 72 20 6f 6e 65 20 74 68 61  king for one tha
285f0 74 20 63 61 6e 20 62 65 0a 2a 2a 20 73 75 70 70  t can be.** supp
28600 6c 61 6e 74 65 64 20 62 79 20 70 54 65 6d 70 6c  lanted by pTempl
28610 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ate..**.** Retur
28620 6e 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 57 68  n NULL if the Wh
28630 65 72 65 4c 6f 6f 70 20 6c 69 73 74 20 63 6f 6e  ereLoop list con
28640 74 61 69 6e 73 20 61 6e 20 65 6e 74 72 79 20 74  tains an entry t
28650 68 61 74 20 63 61 6e 20 73 75 70 70 6c 61 6e 74  hat can supplant
28660 0a 2a 2a 20 70 54 65 6d 70 6c 61 74 65 2c 20 69  .** pTemplate, i
28670 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 20 69 66  n other words if
28680 20 70 54 65 6d 70 6c 61 74 65 20 64 6f 65 73 20   pTemplate does 
28690 6e 6f 74 20 62 65 6c 6f 6e 67 20 6f 6e 20 74 68  not belong on th
286a0 65 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  e list..**.** If
286b0 20 70 58 20 69 73 20 61 20 57 68 65 72 65 4c 6f   pX is a WhereLo
286c0 6f 70 20 74 68 61 74 20 70 54 65 6d 70 6c 61 74  op that pTemplat
286d0 65 20 63 61 6e 20 73 75 70 70 6c 61 6e 74 2c 20  e can supplant, 
286e0 74 68 65 6e 20 72 65 74 75 72 6e 20 74 68 65 0a  then return the.
286f0 2a 2a 20 6c 69 6e 6b 20 74 68 61 74 20 70 6f 69  ** link that poi
28700 6e 74 73 20 74 6f 20 70 58 2e 0a 2a 2a 0a 2a 2a  nts to pX..**.**
28710 20 49 66 20 70 54 65 6d 70 6c 61 74 65 20 63 61   If pTemplate ca
28720 6e 6e 6f 74 20 73 75 70 70 6c 61 6e 74 20 61 6e  nnot supplant an
28730 79 20 65 78 69 73 74 69 6e 67 20 65 6c 65 6d 65  y existing eleme
28740 6e 74 20 6f 66 20 74 68 65 20 6c 69 73 74 20 62  nt of the list b
28750 75 74 20 6e 65 65 64 73 0a 2a 2a 20 74 6f 20 62  ut needs.** to b
28760 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 6c  e added to the l
28770 69 73 74 2c 20 74 68 65 6e 20 72 65 74 75 72 6e  ist, then return
28780 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
28790 65 20 74 61 69 6c 20 6f 66 20 74 68 65 20 6c 69  e tail of the li
287a0 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 57 68  st..*/.static Wh
287b0 65 72 65 4c 6f 6f 70 20 2a 2a 77 68 65 72 65 4c  ereLoop **whereL
287c0 6f 6f 70 46 69 6e 64 4c 65 73 73 65 72 28 0a 20  oopFindLesser(. 
287d0 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a 70 70 50   WhereLoop **ppP
287e0 72 65 76 2c 0a 20 20 63 6f 6e 73 74 20 57 68 65  rev,.  const Whe
287f0 72 65 4c 6f 6f 70 20 2a 70 54 65 6d 70 6c 61 74  reLoop *pTemplat
28800 65 0a 29 7b 0a 20 20 57 68 65 72 65 4c 6f 6f 70  e.){.  WhereLoop
28810 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 28 2a 70   *p;.  for(p=(*p
28820 70 50 72 65 76 29 3b 20 70 3b 20 70 70 50 72 65  pPrev); p; ppPre
28830 76 3d 26 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 2c  v=&p->pNextLoop,
28840 20 70 3d 2a 70 70 50 72 65 76 29 7b 0a 20 20 20   p=*ppPrev){.   
28850 20 69 66 28 20 70 2d 3e 69 54 61 62 21 3d 70 54   if( p->iTab!=pT
28860 65 6d 70 6c 61 74 65 2d 3e 69 54 61 62 20 7c 7c  emplate->iTab ||
28870 20 70 2d 3e 69 53 6f 72 74 49 64 78 21 3d 70 54   p->iSortIdx!=pT
28880 65 6d 70 6c 61 74 65 2d 3e 69 53 6f 72 74 49 64  emplate->iSortId
28890 78 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  x ){.      /* If
288a0 20 65 69 74 68 65 72 20 74 68 65 20 69 54 61 62   either the iTab
288b0 20 6f 72 20 69 53 6f 72 74 49 64 78 20 76 61 6c   or iSortIdx val
288c0 75 65 73 20 66 6f 72 20 74 77 6f 20 57 68 65 72  ues for two Wher
288d0 65 4c 6f 6f 70 20 61 72 65 20 64 69 66 66 65 72  eLoop are differ
288e0 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  ent.      ** the
288f0 6e 20 74 68 6f 73 65 20 57 68 65 72 65 4c 6f 6f  n those WhereLoo
28900 70 73 20 6e 65 65 64 20 74 6f 20 62 65 20 63 6f  ps need to be co
28910 6e 73 69 64 65 72 65 64 20 73 65 70 61 72 61 74  nsidered separat
28920 65 6c 79 2e 20 20 4e 65 69 74 68 65 72 20 69 73  ely.  Neither is
28930 0a 20 20 20 20 20 20 2a 2a 20 61 20 63 61 6e 64  .      ** a cand
28940 69 64 61 74 65 20 74 6f 20 72 65 70 6c 61 63 65  idate to replace
28950 20 74 68 65 20 6f 74 68 65 72 2e 20 2a 2f 0a 20   the other. */. 
28960 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
28970 20 20 20 7d 0a 20 20 20 20 2f 2a 20 49 6e 20 74     }.    /* In t
28980 68 65 20 63 75 72 72 65 6e 74 20 69 6d 70 6c 65  he current imple
28990 6d 65 6e 74 61 74 69 6f 6e 2c 20 74 68 65 20 72  mentation, the r
289a0 53 65 74 75 70 20 76 61 6c 75 65 20 69 73 20 65  Setup value is e
289b0 69 74 68 65 72 20 7a 65 72 6f 0a 20 20 20 20 2a  ither zero.    *
289c0 2a 20 6f 72 20 74 68 65 20 63 6f 73 74 20 6f 66  * or the cost of
289d0 20 62 75 69 6c 64 69 6e 67 20 61 6e 20 61 75 74   building an aut
289e0 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 28 4e 6c  omatic index (Nl
289f0 6f 67 4e 29 20 61 6e 64 20 74 68 65 20 4e 6c 6f  ogN) and the Nlo
28a00 67 4e 0a 20 20 20 20 2a 2a 20 69 73 20 74 68 65  gN.    ** is the
28a10 20 73 61 6d 65 20 66 6f 72 20 63 6f 6d 70 61 74   same for compat
28a20 69 62 6c 65 20 57 68 65 72 65 4c 6f 6f 70 73 2e  ible WhereLoops.
28a30 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
28a40 70 2d 3e 72 53 65 74 75 70 3d 3d 30 20 7c 7c 20  p->rSetup==0 || 
28a50 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75  pTemplate->rSetu
28a60 70 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20  p==0 .          
28a70 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 72 53 65         || p->rSe
28a80 74 75 70 3d 3d 70 54 65 6d 70 6c 61 74 65 2d 3e  tup==pTemplate->
28a90 72 53 65 74 75 70 20 29 3b 0a 0a 20 20 20 20 2f  rSetup );..    /
28aa0 2a 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74  * whereLoopAddBt
28ab0 72 65 65 28 29 20 61 6c 77 61 79 73 20 67 65 6e  ree() always gen
28ac0 65 72 61 74 65 73 20 61 6e 64 20 69 6e 73 65 72  erates and inser
28ad0 74 73 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63  ts the automatic
28ae0 20 69 6e 64 65 78 0a 20 20 20 20 2a 2a 20 63 61   index.    ** ca
28af0 73 65 20 66 69 72 73 74 2e 20 20 48 65 6e 63 65  se first.  Hence
28b00 20 63 6f 6d 70 61 74 69 62 6c 65 20 63 61 6e 64   compatible cand
28b10 69 64 61 74 65 20 57 68 65 72 65 4c 6f 6f 70 73  idate WhereLoops
28b20 20 6e 65 76 65 72 20 68 61 76 65 20 61 20 6c 61   never have a la
28b30 72 67 65 72 0a 20 20 20 20 2a 2a 20 72 53 65 74  rger.    ** rSet
28b40 75 70 2e 20 43 61 6c 6c 20 74 68 69 73 20 53 45  up. Call this SE
28b50 54 55 50 2d 49 4e 56 41 52 49 41 4e 54 20 2a 2f  TUP-INVARIANT */
28b60 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
28b70 72 53 65 74 75 70 3e 3d 70 54 65 6d 70 6c 61 74  rSetup>=pTemplat
28b80 65 2d 3e 72 53 65 74 75 70 20 29 3b 0a 0a 20 20  e->rSetup );..  
28b90 20 20 2f 2a 20 41 6e 79 20 6c 6f 6f 70 20 75 73    /* Any loop us
28ba0 69 6e 67 20 61 6e 20 61 70 70 6c 69 61 74 69 6f  ing an appliatio
28bb0 6e 2d 64 65 66 69 6e 65 64 20 69 6e 64 65 78 20  n-defined index 
28bc0 28 6f 72 20 50 52 49 4d 41 52 59 20 4b 45 59 20  (or PRIMARY KEY 
28bd0 6f 72 0a 20 20 20 20 2a 2a 20 55 4e 49 51 55 45  or.    ** UNIQUE
28be0 20 63 6f 6e 73 74 72 61 69 6e 74 29 20 77 69 74   constraint) wit
28bf0 68 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 3d 3d  h one or more ==
28c00 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 69 73 20   constraints is 
28c10 62 65 74 74 65 72 0a 20 20 20 20 2a 2a 20 74 68  better.    ** th
28c20 61 6e 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20  an an automatic 
28c30 69 6e 64 65 78 2e 20 55 6e 6c 65 73 73 20 69 74  index. Unless it
28c40 20 69 73 20 61 20 73 6b 69 70 2d 73 63 61 6e 2e   is a skip-scan.
28c50 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 2d 3e   */.    if( (p->
28c60 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
28c70 41 55 54 4f 5f 49 4e 44 45 58 29 21 3d 30 0a 20  AUTO_INDEX)!=0. 
28c80 20 20 20 20 26 26 20 28 70 54 65 6d 70 6c 61 74      && (pTemplat
28c90 65 2d 3e 6e 53 6b 69 70 29 3d 3d 30 0a 20 20 20  e->nSkip)==0.   
28ca0 20 20 26 26 20 28 70 54 65 6d 70 6c 61 74 65 2d    && (pTemplate-
28cb0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
28cc0 5f 49 4e 44 45 58 45 44 29 21 3d 30 0a 20 20 20  _INDEXED)!=0.   
28cd0 20 20 26 26 20 28 70 54 65 6d 70 6c 61 74 65 2d    && (pTemplate-
28ce0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
28cf0 5f 43 4f 4c 55 4d 4e 5f 45 51 29 21 3d 30 0a 20  _COLUMN_EQ)!=0. 
28d00 20 20 20 20 26 26 20 28 70 2d 3e 70 72 65 72 65      && (p->prere
28d10 71 20 26 20 70 54 65 6d 70 6c 61 74 65 2d 3e 70  q & pTemplate->p
28d20 72 65 72 65 71 29 3d 3d 70 54 65 6d 70 6c 61 74  rereq)==pTemplat
28d30 65 2d 3e 70 72 65 72 65 71 0a 20 20 20 20 29 7b  e->prereq.    ){
28d40 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
28d50 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 65    }..    /* If e
28d60 78 69 73 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f  xisting WhereLoo
28d70 70 20 70 20 69 73 20 62 65 74 74 65 72 20 74 68  p p is better th
28d80 61 6e 20 70 54 65 6d 70 6c 61 74 65 2c 20 70 54  an pTemplate, pT
28d90 65 6d 70 6c 61 74 65 20 63 61 6e 20 62 65 0a 20  emplate can be. 
28da0 20 20 20 2a 2a 20 64 69 73 63 61 72 64 65 64 2e     ** discarded.
28db0 20 20 57 68 65 72 65 4c 6f 6f 70 20 70 20 69 73    WhereLoop p is
28dc0 20 62 65 74 74 65 72 20 69 66 3a 0a 20 20 20 20   better if:.    
28dd0 2a 2a 20 20 20 28 31 29 20 20 70 20 68 61 73 20  **   (1)  p has 
28de0 6e 6f 20 6d 6f 72 65 20 64 65 70 65 6e 64 65 6e  no more dependen
28df0 63 69 65 73 20 74 68 61 6e 20 70 54 65 6d 70 6c  cies than pTempl
28e00 61 74 65 2c 20 61 6e 64 0a 20 20 20 20 2a 2a 20  ate, and.    ** 
28e10 20 20 28 32 29 20 20 70 20 68 61 73 20 61 6e 20    (2)  p has an 
28e20 65 71 75 61 6c 20 6f 72 20 6c 6f 77 65 72 20 63  equal or lower c
28e30 6f 73 74 20 74 68 61 6e 20 70 54 65 6d 70 6c 61  ost than pTempla
28e40 74 65 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  te.    */.    if
28e50 28 20 28 70 2d 3e 70 72 65 72 65 71 20 26 20 70  ( (p->prereq & p
28e60 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65 71  Template->prereq
28e70 29 3d 3d 70 2d 3e 70 72 65 72 65 71 20 20 20 20  )==p->prereq    
28e80 2f 2a 20 28 31 29 20 20 2a 2f 0a 20 20 20 20 20  /* (1)  */.     
28e90 26 26 20 70 2d 3e 72 53 65 74 75 70 3c 3d 70 54  && p->rSetup<=pT
28ea0 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75 70 20  emplate->rSetup 
28eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ec0 20 2f 2a 20 28 32 61 29 20 2a 2f 0a 20 20 20 20   /* (2a) */.    
28ed0 20 26 26 20 70 2d 3e 72 52 75 6e 3c 3d 70 54 65   && p->rRun<=pTe
28ee0 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 20 20 20 20  mplate->rRun    
28ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28f00 20 20 2f 2a 20 28 32 62 29 20 2a 2f 0a 20 20 20    /* (2b) */.   
28f10 20 20 26 26 20 70 2d 3e 6e 4f 75 74 3c 3d 70 54    && p->nOut<=pT
28f20 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74 20 20 20  emplate->nOut   
28f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28f40 20 20 20 2f 2a 20 28 32 63 29 20 2a 2f 0a 20 20     /* (2c) */.  
28f50 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72    ){.      retur
28f60 6e 20 30 3b 20 20 2f 2a 20 44 69 73 63 61 72 64  n 0;  /* Discard
28f70 20 70 54 65 6d 70 6c 61 74 65 20 2a 2f 0a 20 20   pTemplate */.  
28f80 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70    }..    /* If p
28f90 54 65 6d 70 6c 61 74 65 20 69 73 20 61 6c 77 61  Template is alwa
28fa0 79 73 20 62 65 74 74 65 72 20 74 68 61 6e 20 70  ys better than p
28fb0 2c 20 74 68 65 6e 20 63 61 75 73 65 20 70 20 74  , then cause p t
28fc0 6f 20 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e  o be overwritten
28fd0 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 70 54 65  .    ** with pTe
28fe0 6d 70 6c 61 74 65 2e 20 20 70 54 65 6d 70 6c 61  mplate.  pTempla
28ff0 74 65 20 69 73 20 62 65 74 74 65 72 20 74 68 61  te is better tha
29000 6e 20 70 20 69 66 3a 0a 20 20 20 20 2a 2a 20 20  n p if:.    **  
29010 20 28 31 29 20 20 70 54 65 6d 70 6c 61 74 65 20   (1)  pTemplate 
29020 68 61 73 20 6e 6f 20 6d 6f 72 65 20 64 65 70 65  has no more depe
29030 6e 64 65 6e 63 65 73 20 74 68 61 6e 20 70 2c 20  ndences than p, 
29040 61 6e 64 0a 20 20 20 20 2a 2a 20 20 20 28 32 29  and.    **   (2)
29050 20 20 70 54 65 6d 70 6c 61 74 65 20 68 61 73 20    pTemplate has 
29060 61 6e 20 65 71 75 61 6c 20 6f 72 20 6c 6f 77 65  an equal or lowe
29070 72 20 63 6f 73 74 20 74 68 61 6e 20 70 2e 0a 20  r cost than p.. 
29080 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70     */.    if( (p
29090 2d 3e 70 72 65 72 65 71 20 26 20 70 54 65 6d 70  ->prereq & pTemp
290a0 6c 61 74 65 2d 3e 70 72 65 72 65 71 29 3d 3d 70  late->prereq)==p
290b0 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65 71  Template->prereq
290c0 20 20 20 2f 2a 20 28 31 29 20 20 2a 2f 0a 20 20     /* (1)  */.  
290d0 20 20 20 26 26 20 70 2d 3e 72 52 75 6e 3e 3d 70     && p->rRun>=p
290e0 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 20 20  Template->rRun  
290f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29100 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 32             /* (2
29110 61 29 20 2a 2f 0a 20 20 20 20 20 26 26 20 70 2d  a) */.     && p-
29120 3e 6e 4f 75 74 3e 3d 70 54 65 6d 70 6c 61 74 65  >nOut>=pTemplate
29130 2d 3e 6e 4f 75 74 20 20 20 20 20 20 20 20 20 20  ->nOut          
29140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29150 20 20 20 2f 2a 20 28 32 62 29 20 2a 2f 0a 20 20     /* (2b) */.  
29160 20 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72    ){.      asser
29170 74 28 20 70 2d 3e 72 53 65 74 75 70 3e 3d 70 54  t( p->rSetup>=pT
29180 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75 70 20  emplate->rSetup 
29190 29 3b 20 2f 2a 20 53 45 54 55 50 2d 49 4e 56 41  ); /* SETUP-INVA
291a0 52 49 41 4e 54 20 61 62 6f 76 65 20 2a 2f 0a 20  RIANT above */. 
291b0 20 20 20 20 20 62 72 65 61 6b 3b 20 20 20 2f 2a       break;   /*
291c0 20 43 61 75 73 65 20 70 20 74 6f 20 62 65 20 6f   Cause p to be o
291d0 76 65 72 77 72 69 74 74 65 6e 20 62 79 20 70 54  verwritten by pT
291e0 65 6d 70 6c 61 74 65 20 2a 2f 0a 20 20 20 20 7d  emplate */.    }
291f0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 70  .  }.  return pp
29200 50 72 65 76 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  Prev;.}../*.** I
29210 6e 73 65 72 74 20 6f 72 20 72 65 70 6c 61 63 65  nsert or replace
29220 20 61 20 57 68 65 72 65 4c 6f 6f 70 20 65 6e 74   a WhereLoop ent
29230 72 79 20 75 73 69 6e 67 20 74 68 65 20 74 65 6d  ry using the tem
29240 70 6c 61 74 65 20 73 75 70 70 6c 69 65 64 2e 0a  plate supplied..
29250 2a 2a 0a 2a 2a 20 41 6e 20 65 78 69 73 74 69 6e  **.** An existin
29260 67 20 57 68 65 72 65 4c 6f 6f 70 20 65 6e 74 72  g WhereLoop entr
29270 79 20 6d 69 67 68 74 20 62 65 20 6f 76 65 72 77  y might be overw
29280 72 69 74 74 65 6e 20 69 66 20 74 68 65 20 6e 65  ritten if the ne
29290 77 20 74 65 6d 70 6c 61 74 65 0a 2a 2a 20 69 73  w template.** is
292a0 20 62 65 74 74 65 72 20 61 6e 64 20 68 61 73 20   better and has 
292b0 66 65 77 65 72 20 64 65 70 65 6e 64 65 6e 63 69  fewer dependenci
292c0 65 73 2e 20 20 4f 72 20 74 68 65 20 74 65 6d 70  es.  Or the temp
292d0 6c 61 74 65 20 77 69 6c 6c 20 62 65 20 69 67 6e  late will be ign
292e0 6f 72 65 64 0a 2a 2a 20 61 6e 64 20 6e 6f 20 69  ored.** and no i
292f0 6e 73 65 72 74 20 77 69 6c 6c 20 6f 63 63 75 72  nsert will occur
29300 20 69 66 20 61 6e 20 65 78 69 73 74 69 6e 67 20   if an existing 
29310 57 68 65 72 65 4c 6f 6f 70 20 69 73 20 66 61 73  WhereLoop is fas
29320 74 65 72 20 61 6e 64 20 68 61 73 0a 2a 2a 20 66  ter and has.** f
29330 65 77 65 72 20 64 65 70 65 6e 64 65 6e 63 69 65  ewer dependencie
29340 73 20 74 68 61 6e 20 74 68 65 20 74 65 6d 70 6c  s than the templ
29350 61 74 65 2e 20 20 4f 74 68 65 72 77 69 73 65 20  ate.  Otherwise 
29360 61 20 6e 65 77 20 57 68 65 72 65 4c 6f 6f 70 20  a new WhereLoop 
29370 69 73 0a 2a 2a 20 61 64 64 65 64 20 62 61 73 65  is.** added base
29380 64 20 6f 6e 20 74 68 65 20 74 65 6d 70 6c 61 74  d on the templat
29390 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 42 75 69  e..**.** If pBui
293a0 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20 69 73 20  lder->pOrSet is 
293b0 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20 77 65  not NULL then we
293c0 20 63 61 72 65 20 61 62 6f 75 74 20 6f 6e 6c 79   care about only
293d0 20 74 68 65 0a 2a 2a 20 70 72 65 72 65 71 75 69   the.** prerequi
293e0 73 69 74 65 73 20 61 6e 64 20 72 52 75 6e 20 61  sites and rRun a
293f0 6e 64 20 6e 4f 75 74 20 63 6f 73 74 73 20 6f 66  nd nOut costs of
29400 20 74 68 65 20 4e 20 62 65 73 74 20 6c 6f 6f 70   the N best loop
29410 73 2e 20 20 54 68 61 74 0a 2a 2a 20 69 6e 66 6f  s.  That.** info
29420 72 6d 61 74 69 6f 6e 20 69 73 20 67 61 74 68 65  rmation is gathe
29430 72 65 64 20 69 6e 20 74 68 65 20 70 42 75 69 6c  red in the pBuil
29440 64 65 72 2d 3e 70 4f 72 53 65 74 20 6f 62 6a 65  der->pOrSet obje
29450 63 74 2e 20 20 54 68 69 73 20 73 70 65 63 69 61  ct.  This specia
29460 6c 0a 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67 20  l.** processing 
29470 6d 6f 64 65 20 69 73 20 75 73 65 64 20 6f 6e 6c  mode is used onl
29480 79 20 66 6f 72 20 4f 52 20 63 6c 61 75 73 65 20  y for OR clause 
29490 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a  processing..**.*
294a0 2a 20 57 68 65 6e 20 61 63 63 75 6d 75 6c 61 74  * When accumulat
294b0 69 6e 67 20 6d 75 6c 74 69 70 6c 65 20 6c 6f 6f  ing multiple loo
294c0 70 73 20 28 77 68 65 6e 20 70 42 75 69 6c 64 65  ps (when pBuilde
294d0 72 2d 3e 70 4f 72 53 65 74 20 69 73 20 4e 55 4c  r->pOrSet is NUL
294e0 4c 29 20 77 65 0a 2a 2a 20 73 74 69 6c 6c 20 6d  L) we.** still m
294f0 69 67 68 74 20 6f 76 65 72 77 72 69 74 65 20 73  ight overwrite s
29500 69 6d 69 6c 61 72 20 6c 6f 6f 70 73 20 77 69 74  imilar loops wit
29510 68 20 74 68 65 20 6e 65 77 20 74 65 6d 70 6c 61  h the new templa
29520 74 65 20 69 66 20 74 68 65 0a 2a 2a 20 6e 65 77  te if the.** new
29530 20 74 65 6d 70 6c 61 74 65 20 69 73 20 62 65 74   template is bet
29540 74 65 72 2e 20 20 4c 6f 6f 70 73 20 6d 61 79 20  ter.  Loops may 
29550 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e 20 69  be overwritten i
29560 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
29570 0a 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61  .** conditions a
29580 72 65 20 6d 65 74 3a 0a 2a 2a 0a 2a 2a 20 20 20  re met:.**.**   
29590 20 28 31 29 20 20 54 68 65 79 20 68 61 76 65 20   (1)  They have 
295a0 74 68 65 20 73 61 6d 65 20 69 54 61 62 2e 0a 2a  the same iTab..*
295b0 2a 20 20 20 20 28 32 29 20 20 54 68 65 79 20 68  *    (2)  They h
295c0 61 76 65 20 74 68 65 20 73 61 6d 65 20 69 53 6f  ave the same iSo
295d0 72 74 49 64 78 2e 0a 2a 2a 20 20 20 20 28 33 29  rtIdx..**    (3)
295e0 20 20 54 68 65 20 74 65 6d 70 6c 61 74 65 20 68    The template h
295f0 61 73 20 73 61 6d 65 20 6f 72 20 66 65 77 65 72  as same or fewer
29600 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20 74 68   dependencies th
29610 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  an the current l
29620 6f 6f 70 0a 2a 2a 20 20 20 20 28 34 29 20 20 54  oop.**    (4)  T
29630 68 65 20 74 65 6d 70 6c 61 74 65 20 68 61 73 20  he template has 
29640 74 68 65 20 73 61 6d 65 20 6f 72 20 6c 6f 77 65  the same or lowe
29650 72 20 63 6f 73 74 20 74 68 61 6e 20 74 68 65 20  r cost than the 
29660 63 75 72 72 65 6e 74 20 6c 6f 6f 70 0a 2a 2f 0a  current loop.*/.
29670 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
29680 4c 6f 6f 70 49 6e 73 65 72 74 28 57 68 65 72 65  LoopInsert(Where
29690 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75  LoopBuilder *pBu
296a0 69 6c 64 65 72 2c 20 57 68 65 72 65 4c 6f 6f 70  ilder, WhereLoop
296b0 20 2a 70 54 65 6d 70 6c 61 74 65 29 7b 0a 20 20   *pTemplate){.  
296c0 57 68 65 72 65 4c 6f 6f 70 20 2a 2a 70 70 50 72  WhereLoop **ppPr
296d0 65 76 2c 20 2a 70 3b 0a 20 20 57 68 65 72 65 49  ev, *p;.  WhereI
296e0 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70 42  nfo *pWInfo = pB
296f0 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a  uilder->pWInfo;.
29700 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
29710 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e  pWInfo->pParse->
29720 64 62 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 42 75  db;..  /* If pBu
29730 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20 69 73  ilder->pOrSet is
29740 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 6f   defined, then o
29750 6e 6c 79 20 6b 65 65 70 20 74 72 61 63 6b 20 6f  nly keep track o
29760 66 20 74 68 65 20 63 6f 73 74 73 0a 20 20 2a 2a  f the costs.  **
29770 20 61 6e 64 20 70 72 65 72 65 71 73 2e 0a 20 20   and prereqs..  
29780 2a 2f 0a 20 20 69 66 28 20 70 42 75 69 6c 64 65  */.  if( pBuilde
29790 72 2d 3e 70 4f 72 53 65 74 21 3d 30 20 29 7b 0a  r->pOrSet!=0 ){.
297a0 23 69 66 20 57 48 45 52 45 54 52 41 43 45 5f 45  #if WHERETRACE_E
297b0 4e 41 42 4c 45 44 0a 20 20 20 20 75 31 36 20 6e  NABLED.    u16 n
297c0 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72   = pBuilder->pOr
297d0 53 65 74 2d 3e 6e 3b 0a 20 20 20 20 69 6e 74 20  Set->n;.    int 
297e0 78 20 3d 0a 23 65 6e 64 69 66 0a 20 20 20 20 77  x =.#endif.    w
297f0 68 65 72 65 4f 72 49 6e 73 65 72 74 28 70 42 75  hereOrInsert(pBu
29800 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 2c 20 70  ilder->pOrSet, p
29810 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65 71  Template->prereq
29820 2c 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75  , pTemplate->rRu
29830 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n,.             
29840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29850 20 20 20 20 20 20 20 70 54 65 6d 70 6c 61 74 65         pTemplate
29860 2d 3e 6e 4f 75 74 29 3b 0a 23 69 66 20 57 48 45  ->nOut);.#if WHE
29870 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20  RETRACE_ENABLED 
29880 2f 2a 20 30 78 38 20 2a 2f 0a 20 20 20 20 69 66  /* 0x8 */.    if
29890 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72  ( sqlite3WhereTr
298a0 61 63 65 20 26 20 30 78 38 20 29 7b 0a 20 20 20  ace & 0x8 ){.   
298b0 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
298c0 72 69 6e 74 66 28 78 3f 22 20 20 20 6f 72 2d 25  rintf(x?"   or-%
298d0 64 3a 20 20 22 3a 22 20 20 20 6f 72 2d 58 3a 20  d:  ":"   or-X: 
298e0 20 22 2c 20 6e 29 3b 0a 20 20 20 20 20 20 77 68   ", n);.      wh
298f0 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 54 65  ereLoopPrint(pTe
29900 6d 70 6c 61 74 65 2c 20 70 42 75 69 6c 64 65 72  mplate, pBuilder
29910 2d 3e 70 57 43 29 3b 0a 20 20 20 20 7d 0a 23 65  ->pWC);.    }.#e
29920 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20  ndif.    return 
29930 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
29940 20 20 2f 2a 20 4c 6f 6f 6b 20 66 6f 72 20 61 6e    /* Look for an
29950 20 65 78 69 73 74 69 6e 67 20 57 68 65 72 65 4c   existing WhereL
29960 6f 6f 70 20 74 6f 20 72 65 70 6c 61 63 65 20 77  oop to replace w
29970 69 74 68 20 70 54 65 6d 70 6c 61 74 65 0a 20 20  ith pTemplate.  
29980 2a 2f 0a 20 20 77 68 65 72 65 4c 6f 6f 70 41 64  */.  whereLoopAd
29990 6a 75 73 74 43 6f 73 74 28 70 57 49 6e 66 6f 2d  justCost(pWInfo-
299a0 3e 70 4c 6f 6f 70 73 2c 20 70 54 65 6d 70 6c 61  >pLoops, pTempla
299b0 74 65 29 3b 0a 20 20 70 70 50 72 65 76 20 3d 20  te);.  ppPrev = 
299c0 77 68 65 72 65 4c 6f 6f 70 46 69 6e 64 4c 65 73  whereLoopFindLes
299d0 73 65 72 28 26 70 57 49 6e 66 6f 2d 3e 70 4c 6f  ser(&pWInfo->pLo
299e0 6f 70 73 2c 20 70 54 65 6d 70 6c 61 74 65 29 3b  ops, pTemplate);
299f0 0a 0a 20 20 69 66 28 20 70 70 50 72 65 76 3d 3d  ..  if( ppPrev==
29a00 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72  0 ){.    /* Ther
29a10 65 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  e already exists
29a20 20 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f 6e 20   a WhereLoop on 
29a30 74 68 65 20 6c 69 73 74 20 74 68 61 74 20 69 73  the list that is
29a40 20 62 65 74 74 65 72 0a 20 20 20 20 2a 2a 20 74   better.    ** t
29a50 68 61 6e 20 70 54 65 6d 70 6c 61 74 65 2c 20 73  han pTemplate, s
29a60 6f 20 6a 75 73 74 20 69 67 6e 6f 72 65 20 70 54  o just ignore pT
29a70 65 6d 70 6c 61 74 65 20 2a 2f 0a 23 69 66 20 57  emplate */.#if W
29a80 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
29a90 44 20 2f 2a 20 30 78 38 20 2a 2f 0a 20 20 20 20  D /* 0x8 */.    
29aa0 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65  if( sqlite3Where
29ab0 54 72 61 63 65 20 26 20 30 78 38 20 29 7b 0a 20  Trace & 0x8 ){. 
29ac0 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
29ad0 67 50 72 69 6e 74 66 28 22 20 20 20 73 6b 69 70  gPrintf("   skip
29ae0 3a 20 22 29 3b 0a 20 20 20 20 20 20 77 68 65 72  : ");.      wher
29af0 65 4c 6f 6f 70 50 72 69 6e 74 28 70 54 65 6d 70  eLoopPrint(pTemp
29b00 6c 61 74 65 2c 20 70 42 75 69 6c 64 65 72 2d 3e  late, pBuilder->
29b10 70 57 43 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  pWC);.    }.#end
29b20 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  if.    return SQ
29b30 4c 49 54 45 5f 4f 4b 3b 20 20 0a 20 20 7d 65 6c  LITE_OK;  .  }el
29b40 73 65 7b 0a 20 20 20 20 70 20 3d 20 2a 70 70 50  se{.    p = *ppP
29b50 72 65 76 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  rev;.  }..  /* I
29b60 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20  f we reach this 
29b70 70 6f 69 6e 74 20 69 74 20 6d 65 61 6e 73 20 74  point it means t
29b80 68 61 74 20 65 69 74 68 65 72 20 70 5b 5d 20 73  hat either p[] s
29b90 68 6f 75 6c 64 20 62 65 20 6f 76 65 72 77 72 69  hould be overwri
29ba0 74 74 65 6e 0a 20 20 2a 2a 20 77 69 74 68 20 70  tten.  ** with p
29bb0 54 65 6d 70 6c 61 74 65 5b 5d 20 69 66 20 70 5b  Template[] if p[
29bc0 5d 20 65 78 69 73 74 73 2c 20 6f 72 20 69 66 20  ] exists, or if 
29bd0 70 3d 3d 4e 55 4c 4c 20 74 68 65 6e 20 61 6c 6c  p==NULL then all
29be0 6f 63 61 74 65 20 61 20 6e 65 77 0a 20 20 2a 2a  ocate a new.  **
29bf0 20 57 68 65 72 65 4c 6f 6f 70 20 61 6e 64 20 69   WhereLoop and i
29c00 6e 73 65 72 74 20 69 74 2e 0a 20 20 2a 2f 0a 23  nsert it..  */.#
29c10 69 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  if WHERETRACE_EN
29c20 41 42 4c 45 44 20 2f 2a 20 30 78 38 20 2a 2f 0a  ABLED /* 0x8 */.
29c30 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65    if( sqlite3Whe
29c40 72 65 54 72 61 63 65 20 26 20 30 78 38 20 29 7b  reTrace & 0x8 ){
29c50 0a 20 20 20 20 69 66 28 20 70 21 3d 30 20 29 7b  .    if( p!=0 ){
29c60 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65  .      sqlite3De
29c70 62 75 67 50 72 69 6e 74 66 28 22 72 65 70 6c 61  bugPrintf("repla
29c80 63 65 3a 20 22 29 3b 0a 20 20 20 20 20 20 77 68  ce: ");.      wh
29c90 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 2c 20  ereLoopPrint(p, 
29ca0 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 29 3b 0a  pBuilder->pWC);.
29cb0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
29cc0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20  3DebugPrintf("  
29cd0 20 20 61 64 64 3a 20 22 29 3b 0a 20 20 20 20 77    add: ");.    w
29ce0 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 54  hereLoopPrint(pT
29cf0 65 6d 70 6c 61 74 65 2c 20 70 42 75 69 6c 64 65  emplate, pBuilde
29d00 72 2d 3e 70 57 43 29 3b 0a 20 20 7d 0a 23 65 6e  r->pWC);.  }.#en
29d10 64 69 66 0a 20 20 69 66 28 20 70 3d 3d 30 20 29  dif.  if( p==0 )
29d20 7b 0a 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  {.    /* Allocat
29d30 65 20 61 20 6e 65 77 20 57 68 65 72 65 4c 6f 6f  e a new WhereLoo
29d40 70 20 74 6f 20 61 64 64 20 74 6f 20 74 68 65 20  p to add to the 
29d50 65 6e 64 20 6f 66 20 74 68 65 20 6c 69 73 74 20  end of the list 
29d60 2a 2f 0a 20 20 20 20 2a 70 70 50 72 65 76 20 3d  */.    *ppPrev =
29d70 20 70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61   p = sqlite3DbMa
29d80 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65  llocRaw(db, size
29d90 6f 66 28 57 68 65 72 65 4c 6f 6f 70 29 29 3b 0a  of(WhereLoop));.
29da0 20 20 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72      if( p==0 ) r
29db0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
29dc0 45 4d 3b 0a 20 20 20 20 77 68 65 72 65 4c 6f 6f  EM;.    whereLoo
29dd0 70 49 6e 69 74 28 70 29 3b 0a 20 20 20 20 70 2d  pInit(p);.    p-
29de0 3e 70 4e 65 78 74 4c 6f 6f 70 20 3d 20 30 3b 0a  >pNextLoop = 0;.
29df0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
29e00 57 65 20 77 69 6c 6c 20 62 65 20 6f 76 65 72 77  We will be overw
29e10 72 69 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70  riting WhereLoop
29e20 20 70 5b 5d 2e 20 20 42 75 74 20 62 65 66 6f 72   p[].  But befor
29e30 65 20 77 65 20 64 6f 2c 20 66 69 72 73 74 0a 20  e we do, first. 
29e40 20 20 20 2a 2a 20 67 6f 20 74 68 72 6f 75 67 68     ** go through
29e50 20 74 68 65 20 72 65 73 74 20 6f 66 20 74 68 65   the rest of the
29e60 20 6c 69 73 74 20 61 6e 64 20 64 65 6c 65 74 65   list and delete
29e70 20 61 6e 79 20 6f 74 68 65 72 20 65 6e 74 72 69   any other entri
29e80 65 73 20 62 65 73 69 64 65 73 0a 20 20 20 20 2a  es besides.    *
29e90 2a 20 70 5b 5d 20 74 68 61 74 20 61 72 65 20 61  * p[] that are a
29ea0 6c 73 6f 20 73 75 70 70 6c 61 74 65 64 20 62 79  lso supplated by
29eb0 20 70 54 65 6d 70 6c 61 74 65 20 2a 2f 0a 20 20   pTemplate */.  
29ec0 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a 70 70    WhereLoop **pp
29ed0 54 61 69 6c 20 3d 20 26 70 2d 3e 70 4e 65 78 74  Tail = &p->pNext
29ee0 4c 6f 6f 70 3b 0a 20 20 20 20 57 68 65 72 65 4c  Loop;.    WhereL
29ef0 6f 6f 70 20 2a 70 54 6f 44 65 6c 3b 0a 20 20 20  oop *pToDel;.   
29f00 20 77 68 69 6c 65 28 20 2a 70 70 54 61 69 6c 20   while( *ppTail 
29f10 29 7b 0a 20 20 20 20 20 20 70 70 54 61 69 6c 20  ){.      ppTail 
29f20 3d 20 77 68 65 72 65 4c 6f 6f 70 46 69 6e 64 4c  = whereLoopFindL
29f30 65 73 73 65 72 28 70 70 54 61 69 6c 2c 20 70 54  esser(ppTail, pT
29f40 65 6d 70 6c 61 74 65 29 3b 0a 20 20 20 20 20 20  emplate);.      
29f50 69 66 28 20 70 70 54 61 69 6c 3d 3d 30 20 29 20  if( ppTail==0 ) 
29f60 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 70 54 6f  break;.      pTo
29f70 44 65 6c 20 3d 20 2a 70 70 54 61 69 6c 3b 0a 20  Del = *ppTail;. 
29f80 20 20 20 20 20 69 66 28 20 70 54 6f 44 65 6c 3d       if( pToDel=
29f90 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
29fa0 20 20 2a 70 70 54 61 69 6c 20 3d 20 70 54 6f 44    *ppTail = pToD
29fb0 65 6c 2d 3e 70 4e 65 78 74 4c 6f 6f 70 3b 0a 23  el->pNextLoop;.#
29fc0 69 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  if WHERETRACE_EN
29fd0 41 42 4c 45 44 20 2f 2a 20 30 78 38 20 2a 2f 0a  ABLED /* 0x8 */.
29fe0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
29ff0 33 57 68 65 72 65 54 72 61 63 65 20 26 20 30 78  3WhereTrace & 0x
2a000 38 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  8 ){.        sql
2a010 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
2a020 22 20 64 65 6c 65 74 65 3a 20 22 29 3b 0a 20 20  " delete: ");.  
2a030 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50        whereLoopP
2a040 72 69 6e 74 28 70 54 6f 44 65 6c 2c 20 70 42 75  rint(pToDel, pBu
2a050 69 6c 64 65 72 2d 3e 70 57 43 29 3b 0a 20 20 20  ilder->pWC);.   
2a060 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
2a070 20 20 77 68 65 72 65 4c 6f 6f 70 44 65 6c 65 74    whereLoopDelet
2a080 65 28 64 62 2c 20 70 54 6f 44 65 6c 29 3b 0a 20  e(db, pToDel);. 
2a090 20 20 20 7d 0a 20 20 7d 0a 20 20 77 68 65 72 65     }.  }.  where
2a0a0 4c 6f 6f 70 58 66 65 72 28 64 62 2c 20 70 2c 20  LoopXfer(db, p, 
2a0b0 70 54 65 6d 70 6c 61 74 65 29 3b 0a 20 20 69 66  pTemplate);.  if
2a0c0 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  ( (p->wsFlags & 
2a0d0 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42  WHERE_VIRTUALTAB
2a0e0 4c 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 49 6e  LE)==0 ){.    In
2a0f0 64 65 78 20 2a 70 49 6e 64 65 78 20 3d 20 70 2d  dex *pIndex = p-
2a100 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b  >u.btree.pIndex;
2a110 0a 20 20 20 20 69 66 28 20 70 49 6e 64 65 78 20  .    if( pIndex 
2a120 26 26 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 3d  && pIndex->tnum=
2a130 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 75  =0 ){.      p->u
2a140 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20  .btree.pIndex = 
2a150 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  0;.    }.  }.  r
2a160 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2a170 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74  .}../*.** Adjust
2a180 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 2e 6e   the WhereLoop.n
2a190 4f 75 74 20 76 61 6c 75 65 20 64 6f 77 6e 77 61  Out value downwa
2a1a0 72 64 20 74 6f 20 61 63 63 6f 75 6e 74 20 66 6f  rd to account fo
2a1b0 72 20 74 65 72 6d 73 20 6f 66 20 74 68 65 0a 2a  r terms of the.*
2a1c0 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  * WHERE clause t
2a1d0 68 61 74 20 72 65 66 65 72 65 6e 63 65 20 74 68  hat reference th
2a1e0 65 20 6c 6f 6f 70 20 62 75 74 20 77 68 69 63 68  e loop but which
2a1f0 20 61 72 65 20 6e 6f 74 20 75 73 65 64 20 62 79   are not used by
2a200 20 61 6e 0a 2a 2a 20 69 6e 64 65 78 2e 0a 2a 0a   an.** index..*.
2a210 2a 2a 20 46 6f 72 20 65 76 65 72 79 20 57 48 45  ** For every WHE
2a220 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74  RE clause term t
2a230 68 61 74 20 69 73 20 6e 6f 74 20 75 73 65 64 20  hat is not used 
2a240 62 79 20 74 68 65 20 69 6e 64 65 78 0a 2a 2a 20  by the index.** 
2a250 61 6e 64 20 77 68 69 63 68 20 68 61 73 20 61 20  and which has a 
2a260 74 72 75 74 68 20 70 72 6f 62 61 62 69 6c 69 74  truth probabilit
2a270 79 20 61 73 73 69 67 6e 65 64 20 62 79 20 6f 6e  y assigned by on
2a280 65 20 6f 66 20 74 68 65 20 6c 69 6b 65 6c 69 68  e of the likelih
2a290 6f 6f 64 28 29 2c 0a 2a 2a 20 6c 69 6b 65 6c 79  ood(),.** likely
2a2a0 28 29 2c 20 6f 72 20 75 6e 6c 69 6b 65 6c 79 28  (), or unlikely(
2a2b0 29 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 73 2c  ) SQL functions,
2a2c0 20 72 65 64 75 63 65 20 74 68 65 20 65 73 74 69   reduce the esti
2a2d0 6d 61 74 65 64 20 6e 75 6d 62 65 72 0a 2a 2a 20  mated number.** 
2a2e0 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20 62  of output rows b
2a2f0 79 20 74 68 65 20 70 72 6f 62 61 62 69 6c 69 74  y the probabilit
2a300 79 20 73 70 65 63 69 66 69 65 64 2e 0a 2a 2a 0a  y specified..**.
2a310 2a 2a 20 54 55 4e 49 4e 47 3a 20 20 46 6f 72 20  ** TUNING:  For 
2a320 65 76 65 72 79 20 57 48 45 52 45 20 63 6c 61 75  every WHERE clau
2a330 73 65 20 74 65 72 6d 20 74 68 61 74 20 69 73 20  se term that is 
2a340 6e 6f 74 20 75 73 65 64 20 62 79 20 74 68 65 20  not used by the 
2a350 69 6e 64 65 78 0a 2a 2a 20 61 6e 64 20 77 68 69  index.** and whi
2a360 63 68 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65  ch does not have
2a370 20 61 6e 20 61 73 73 69 67 6e 65 64 20 74 72 75   an assigned tru
2a380 74 68 20 70 72 6f 62 61 62 69 6c 69 74 79 2c 20  th probability, 
2a390 68 65 75 72 69 73 74 69 63 73 0a 2a 2a 20 64 65  heuristics.** de
2a3a0 73 63 72 69 62 65 64 20 62 65 6c 6f 77 20 61 72  scribed below ar
2a3b0 65 20 75 73 65 64 20 74 6f 20 74 72 79 20 74 6f  e used to try to
2a3c0 20 65 73 74 69 6d 61 74 65 20 74 68 65 20 74 72   estimate the tr
2a3d0 75 74 68 20 70 72 6f 62 61 62 69 6c 69 74 79 2e  uth probability.
2a3e0 0a 2a 2a 20 54 4f 44 4f 20 2d 2d 3e 20 50 65 72  .** TODO --> Per
2a3f0 68 61 70 73 20 74 68 69 73 20 69 73 20 73 6f 6d  haps this is som
2a400 65 74 68 69 6e 67 20 74 68 61 74 20 63 6f 75 6c  ething that coul
2a410 64 20 62 65 20 69 6d 70 72 6f 76 65 64 20 62 79  d be improved by
2a420 20 62 65 74 74 65 72 0a 2a 2a 20 74 61 62 6c 65   better.** table
2a430 20 73 74 61 74 69 73 74 69 63 73 2e 0a 2a 2a 0a   statistics..**.
2a440 2a 2a 20 48 65 75 72 69 73 74 69 63 20 31 3a 20  ** Heuristic 1: 
2a450 20 45 73 74 69 6d 61 74 65 20 74 68 65 20 74 72   Estimate the tr
2a460 75 74 68 20 70 72 6f 62 61 62 69 6c 69 74 79 20  uth probability 
2a470 61 73 20 39 33 2e 37 35 25 2e 20 20 54 68 65 20  as 93.75%.  The 
2a480 39 33 2e 37 35 25 0a 2a 2a 20 76 61 6c 75 65 20  93.75%.** value 
2a490 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 2d  corresponds to -
2a4a0 31 20 69 6e 20 4c 6f 67 45 73 74 20 6e 6f 74 61  1 in LogEst nota
2a4b0 74 69 6f 6e 2c 20 73 6f 20 74 68 69 73 20 6d 65  tion, so this me
2a4c0 61 6e 73 20 64 65 63 72 65 6d 65 6e 74 0a 2a 2a  ans decrement.**
2a4d0 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 2e 6e   the WhereLoop.n
2a4e0 4f 75 74 20 66 69 65 6c 64 20 66 6f 72 20 65 76  Out field for ev
2a4f0 65 72 79 20 73 75 63 68 20 57 48 45 52 45 20 63  ery such WHERE c
2a500 6c 61 75 73 65 20 74 65 72 6d 2e 0a 2a 2a 0a 2a  lause term..**.*
2a510 2a 20 48 65 75 72 69 73 74 69 63 20 32 3a 20 20  * Heuristic 2:  
2a520 49 66 20 74 68 65 72 65 20 65 78 69 73 74 73 20  If there exists 
2a530 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 57 48 45 52  one or more WHER
2a540 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 6f  E clause terms o
2a550 66 20 74 68 65 0a 2a 2a 20 66 6f 72 6d 20 22 78  f the.** form "x
2a560 3d 3d 45 58 50 52 22 20 61 6e 64 20 45 58 50 52  ==EXPR" and EXPR
2a570 20 69 73 20 6e 6f 74 20 61 20 63 6f 6e 73 74 61   is not a consta
2a580 6e 74 20 30 20 6f 72 20 31 2c 20 74 68 65 6e 20  nt 0 or 1, then 
2a590 6d 61 6b 65 20 73 75 72 65 20 74 68 65 0a 2a 2a  make sure the.**
2a5a0 20 66 69 6e 61 6c 20 6f 75 74 70 75 74 20 72 6f   final output ro
2a5b0 77 20 65 73 74 69 6d 61 74 65 20 69 73 20 6e 6f  w estimate is no
2a5c0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 31 2f   greater than 1/
2a5d0 34 20 6f 66 20 74 68 65 20 74 6f 74 61 6c 20 6e  4 of the total n
2a5e0 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 72 6f 77 73  umber.** of rows
2a5f0 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20   in the table.  
2a600 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
2a610 61 73 73 75 6d 65 20 74 68 61 74 20 78 3d 3d 45  assume that x==E
2a620 58 50 52 20 77 69 6c 6c 20 66 69 6c 74 65 72 0a  XPR will filter.
2a630 2a 2a 20 6f 75 74 20 61 74 20 6c 65 61 73 74 20  ** out at least 
2a640 33 20 6f 75 74 20 6f 66 20 34 20 72 6f 77 73 2e  3 out of 4 rows.
2a650 20 20 49 66 20 45 58 50 52 20 69 73 20 2d 31 20    If EXPR is -1 
2a660 6f 72 20 30 20 6f 72 20 31 2c 20 74 68 65 6e 20  or 0 or 1, then 
2a670 6d 61 79 62 65 20 74 68 65 0a 2a 2a 20 22 78 22  maybe the.** "x"
2a680 20 63 6f 6c 75 6d 6e 20 69 73 20 62 6f 6f 6c 65   column is boole
2a690 61 6e 20 6f 72 20 65 6c 73 65 20 2d 31 20 6f 72  an or else -1 or
2a6a0 20 30 20 6f 72 20 31 20 69 73 20 61 20 63 6f 6d   0 or 1 is a com
2a6b0 6d 6f 6e 20 64 65 66 61 75 6c 74 20 76 61 6c 75  mon default valu
2a6c0 65 0a 2a 2a 20 6f 6e 20 74 68 65 20 22 78 22 20  e.** on the "x" 
2a6d0 63 6f 6c 75 6d 6e 20 61 6e 64 20 73 6f 20 69 6e  column and so in
2a6e0 20 74 68 61 74 20 63 61 73 65 20 6f 6e 6c 79 20   that case only 
2a6f0 63 61 70 20 74 68 65 20 6f 75 74 70 75 74 20 72  cap the output r
2a700 6f 77 20 65 73 74 69 6d 61 74 65 0a 2a 2a 20 61  ow estimate.** a
2a710 74 20 31 2f 32 20 69 6e 73 74 65 61 64 20 6f 66  t 1/2 instead of
2a720 20 31 2f 34 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   1/4..*/.static 
2a730 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 4f 75  void whereLoopOu
2a740 74 70 75 74 41 64 6a 75 73 74 28 0a 20 20 57 68  tputAdjust(.  Wh
2a750 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20  ereClause *pWC, 
2a760 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
2a770 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68  E clause */.  Wh
2a780 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 2c 20  ereLoop *pLoop, 
2a790 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 6f 70       /* The loop
2a7a0 20 74 6f 20 61 64 6a 75 73 74 20 64 6f 77 6e 77   to adjust downw
2a7b0 61 72 64 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20  ard */.  LogEst 
2a7c0 6e 52 6f 77 20 20 20 20 20 20 20 20 20 20 20 20  nRow            
2a7d0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 6f 77  /* Number of row
2a7e0 73 20 69 6e 20 74 68 65 20 65 6e 74 69 72 65 20  s in the entire 
2a7f0 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 57 68  table */.){.  Wh
2a800 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20  ereTerm *pTerm, 
2a810 2a 70 58 3b 0a 20 20 42 69 74 6d 61 73 6b 20 6e  *pX;.  Bitmask n
2a820 6f 74 41 6c 6c 6f 77 65 64 20 3d 20 7e 28 70 4c  otAllowed = ~(pL
2a830 6f 6f 70 2d 3e 70 72 65 72 65 71 7c 70 4c 6f 6f  oop->prereq|pLoo
2a840 70 2d 3e 6d 61 73 6b 53 65 6c 66 29 3b 0a 20 20  p->maskSelf);.  
2a850 69 6e 74 20 69 2c 20 6a 2c 20 6b 3b 0a 20 20 4c  int i, j, k;.  L
2a860 6f 67 45 73 74 20 69 52 65 64 75 63 65 20 3d 20  ogEst iReduce = 
2a870 30 3b 20 20 20 20 2f 2a 20 70 4c 6f 6f 70 2d 3e  0;    /* pLoop->
2a880 6e 4f 75 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20  nOut should not 
2a890 65 78 63 65 65 64 20 6e 52 6f 77 2d 69 52 65 64  exceed nRow-iRed
2a8a0 75 63 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  uce */..  assert
2a8b0 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  ( (pLoop->wsFlag
2a8c0 73 20 26 20 57 48 45 52 45 5f 41 55 54 4f 5f 49  s & WHERE_AUTO_I
2a8d0 4e 44 45 58 29 3d 3d 30 20 29 3b 0a 20 20 66 6f  NDEX)==0 );.  fo
2a8e0 72 28 69 3d 70 57 43 2d 3e 6e 54 65 72 6d 2c 20  r(i=pWC->nTerm, 
2a8f0 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 69 3e  pTerm=pWC->a; i>
2a900 30 3b 20 69 2d 2d 2c 20 70 54 65 72 6d 2b 2b 29  0; i--, pTerm++)
2a910 7b 0a 20 20 20 20 69 66 28 20 28 70 54 65 72 6d  {.    if( (pTerm
2a920 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
2a930 5f 56 49 52 54 55 41 4c 29 21 3d 30 20 29 20 62  _VIRTUAL)!=0 ) b
2a940 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 28 70  reak;.    if( (p
2a950 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20  Term->prereqAll 
2a960 26 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c  & pLoop->maskSel
2a970 66 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  f)==0 ) continue
2a980 3b 0a 20 20 20 20 69 66 28 20 28 70 54 65 72 6d  ;.    if( (pTerm
2a990 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26 20 6e 6f  ->prereqAll & no
2a9a0 74 41 6c 6c 6f 77 65 64 29 21 3d 30 20 29 20 63  tAllowed)!=0 ) c
2a9b0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 66 6f 72  ontinue;.    for
2a9c0 28 6a 3d 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d  (j=pLoop->nLTerm
2a9d0 2d 31 3b 20 6a 3e 3d 30 3b 20 6a 2d 2d 29 7b 0a  -1; j>=0; j--){.
2a9e0 20 20 20 20 20 20 70 58 20 3d 20 70 4c 6f 6f 70        pX = pLoop
2a9f0 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 3b 0a 20 20 20  ->aLTerm[j];.   
2aa00 20 20 20 69 66 28 20 70 58 3d 3d 30 20 29 20 63     if( pX==0 ) c
2aa10 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69  ontinue;.      i
2aa20 66 28 20 70 58 3d 3d 70 54 65 72 6d 20 29 20 62  f( pX==pTerm ) b
2aa30 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 66 28 20  reak;.      if( 
2aa40 70 58 2d 3e 69 50 61 72 65 6e 74 3e 3d 30 20 26  pX->iParent>=0 &
2aa50 26 20 28 26 70 57 43 2d 3e 61 5b 70 58 2d 3e 69  & (&pWC->a[pX->i
2aa60 50 61 72 65 6e 74 5d 29 3d 3d 70 54 65 72 6d 20  Parent])==pTerm 
2aa70 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20  ) break;.    }. 
2aa80 20 20 20 69 66 28 20 6a 3c 30 20 29 7b 0a 20 20     if( j<0 ){.  
2aa90 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 74      if( pTerm->t
2aaa0 72 75 74 68 50 72 6f 62 3c 3d 30 20 29 7b 0a 20  ruthProb<=0 ){. 
2aab0 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 20 74         /* If a t
2aac0 72 75 74 68 20 70 72 6f 62 61 62 69 6c 69 74 79  ruth probability
2aad0 20 69 73 20 73 70 65 63 69 66 69 65 64 20 75 73   is specified us
2aae0 69 6e 67 20 74 68 65 20 6c 69 6b 65 6c 69 68 6f  ing the likeliho
2aaf0 6f 64 28 29 20 68 69 6e 74 73 2c 0a 20 20 20 20  od() hints,.    
2ab00 20 20 20 20 2a 2a 20 74 68 65 6e 20 75 73 65 20      ** then use 
2ab10 74 68 65 20 70 72 6f 62 61 62 69 6c 69 74 79 20  the probability 
2ab20 70 72 6f 76 69 64 65 64 20 62 79 20 74 68 65 20  provided by the 
2ab30 61 70 70 6c 69 63 61 74 69 6f 6e 2e 20 2a 2f 0a  application. */.
2ab40 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e          pLoop->n
2ab50 4f 75 74 20 2b 3d 20 70 54 65 72 6d 2d 3e 74 72  Out += pTerm->tr
2ab60 75 74 68 50 72 6f 62 3b 0a 20 20 20 20 20 20 7d  uthProb;.      }
2ab70 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
2ab80 20 49 6e 20 74 68 65 20 61 62 73 65 6e 63 65 20   In the absence 
2ab90 6f 66 20 65 78 70 6c 69 63 69 74 20 74 72 75 74  of explicit trut
2aba0 68 20 70 72 6f 62 61 62 69 6c 69 74 69 65 73 2c  h probabilities,
2abb0 20 75 73 65 20 68 65 75 72 69 73 74 69 63 73 20   use heuristics 
2abc0 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 67 75  to.        ** gu
2abd0 65 73 73 20 61 20 72 65 61 73 6f 6e 61 62 6c 65  ess a reasonable
2abe0 20 74 72 75 74 68 20 70 72 6f 62 61 62 69 6c 69   truth probabili
2abf0 74 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70  ty. */.        p
2ac00 4c 6f 6f 70 2d 3e 6e 4f 75 74 2d 2d 3b 0a 20 20  Loop->nOut--;.  
2ac10 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d        if( pTerm-
2ac20 3e 65 4f 70 65 72 61 74 6f 72 26 57 4f 5f 45 51  >eOperator&WO_EQ
2ac30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45 78   ){.          Ex
2ac40 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70 54 65  pr *pRight = pTe
2ac50 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68  rm->pExpr->pRigh
2ac60 74 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  t;.          if(
2ac70 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e   sqlite3ExprIsIn
2ac80 74 65 67 65 72 28 70 52 69 67 68 74 2c 20 26 6b  teger(pRight, &k
2ac90 29 20 26 26 20 6b 3e 3d 28 2d 31 29 20 26 26 20  ) && k>=(-1) && 
2aca0 6b 3c 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  k<=1 ){.        
2acb0 20 20 20 20 6b 20 3d 20 31 30 3b 0a 20 20 20 20      k = 10;.    
2acc0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2acd0 20 20 20 20 20 20 20 20 20 6b 20 3d 20 32 30 3b           k = 20;
2ace0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2acf0 20 20 20 20 20 20 20 69 66 28 20 69 52 65 64 75         if( iRedu
2ad00 63 65 3c 6b 20 29 20 69 52 65 64 75 63 65 20 3d  ce<k ) iReduce =
2ad10 20 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   k;.        }.  
2ad20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
2ad30 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 6e 4f 75    if( pLoop->nOu
2ad40 74 20 3e 20 6e 52 6f 77 2d 69 52 65 64 75 63 65  t > nRow-iReduce
2ad50 20 29 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20   )  pLoop->nOut 
2ad60 3d 20 6e 52 6f 77 20 2d 20 69 52 65 64 75 63 65  = nRow - iReduce
2ad70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73  ;.}../*.** Adjus
2ad80 74 20 74 68 65 20 63 6f 73 74 20 43 20 62 79 20  t the cost C by 
2ad90 74 68 65 20 63 6f 73 74 4d 75 6c 74 20 66 61 63  the costMult fac
2ada0 74 65 72 20 54 2e 20 20 54 68 69 73 20 6f 6e 6c  ter T.  This onl
2adb0 79 20 6f 63 63 75 72 73 20 69 66 0a 2a 2a 20 63  y occurs if.** c
2adc0 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 2d 44 53  ompiled with -DS
2add0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 53  QLITE_ENABLE_COS
2ade0 54 4d 55 4c 54 0a 2a 2f 0a 23 69 66 64 65 66 20  TMULT.*/.#ifdef 
2adf0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f  SQLITE_ENABLE_CO
2ae00 53 54 4d 55 4c 54 0a 23 20 64 65 66 69 6e 65 20  STMULT.# define 
2ae10 41 70 70 6c 79 43 6f 73 74 4d 75 6c 74 69 70 6c  ApplyCostMultipl
2ae20 69 65 72 28 43 2c 54 29 20 20 43 20 2b 3d 20 54  ier(C,T)  C += T
2ae30 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
2ae40 41 70 70 6c 79 43 6f 73 74 4d 75 6c 74 69 70 6c  ApplyCostMultipl
2ae50 69 65 72 28 43 2c 54 29 0a 23 65 6e 64 69 66 0a  ier(C,T).#endif.
2ae60 0a 2f 2a 0a 2a 2a 20 57 65 20 68 61 76 65 20 73  ./*.** We have s
2ae70 6f 20 66 61 72 20 6d 61 74 63 68 65 64 20 70 42  o far matched pB
2ae80 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e  uilder->pNew->u.
2ae90 62 74 72 65 65 2e 6e 45 71 20 74 65 72 6d 73 20  btree.nEq terms 
2aea0 6f 66 20 74 68 65 20 0a 2a 2a 20 69 6e 64 65 78  of the .** index
2aeb0 20 70 49 6e 64 65 78 2e 20 54 72 79 20 74 6f 20   pIndex. Try to 
2aec0 6d 61 74 63 68 20 6f 6e 65 20 6d 6f 72 65 2e 0a  match one more..
2aed0 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20  **.** When this 
2aee0 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
2aef0 65 64 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e  ed, pBuilder->pN
2af00 65 77 2d 3e 6e 4f 75 74 20 63 6f 6e 74 61 69 6e  ew->nOut contain
2af10 73 20 74 68 65 20 0a 2a 2a 20 6e 75 6d 62 65 72  s the .** number
2af20 20 6f 66 20 72 6f 77 73 20 65 78 70 65 63 74 65   of rows expecte
2af30 64 20 74 6f 20 62 65 20 76 69 73 69 74 65 64 20  d to be visited 
2af40 62 79 20 66 69 6c 74 65 72 69 6e 67 20 75 73 69  by filtering usi
2af50 6e 67 20 74 68 65 20 6e 45 71 20 0a 2a 2a 20 74  ng the nEq .** t
2af60 65 72 6d 73 20 6f 6e 6c 79 2e 20 49 66 20 69 74  erms only. If it
2af70 20 69 73 20 6d 6f 64 69 66 69 65 64 2c 20 74 68   is modified, th
2af80 69 73 20 76 61 6c 75 65 20 69 73 20 72 65 73 74  is value is rest
2af90 6f 72 65 64 20 62 65 66 6f 72 65 20 74 68 69 73  ored before this
2afa0 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65   .** function re
2afb0 74 75 72 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  turns..**.** If 
2afc0 70 50 72 6f 62 65 2d 3e 74 6e 75 6d 3d 3d 30 2c  pProbe->tnum==0,
2afd0 20 74 68 61 74 20 6d 65 61 6e 73 20 70 49 6e 64   that means pInd
2afe0 65 78 20 69 73 20 61 20 66 61 6b 65 20 69 6e 64  ex is a fake ind
2aff0 65 78 20 75 73 65 64 20 66 6f 72 20 74 68 65 0a  ex used for the.
2b000 2a 2a 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  ** INTEGER PRIMA
2b010 52 59 20 4b 45 59 2e 0a 2a 2f 0a 73 74 61 74 69  RY KEY..*/.stati
2b020 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41  c int whereLoopA
2b030 64 64 42 74 72 65 65 49 6e 64 65 78 28 0a 20 20  ddBtreeIndex(.  
2b040 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72  WhereLoopBuilder
2b050 20 2a 70 42 75 69 6c 64 65 72 2c 20 20 20 20 20   *pBuilder,     
2b060 2f 2a 20 54 68 65 20 57 68 65 72 65 4c 6f 6f 70  /* The WhereLoop
2b070 20 66 61 63 74 6f 72 79 20 2a 2f 0a 20 20 73 74   factory */.  st
2b080 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
2b090 6d 20 2a 70 53 72 63 2c 20 20 20 20 20 20 2f 2a  m *pSrc,      /*
2b0a0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72   FROM clause ter
2b0b0 6d 20 62 65 69 6e 67 20 61 6e 61 6c 79 7a 65 64  m being analyzed
2b0c0 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 50 72   */.  Index *pPr
2b0d0 6f 62 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  obe,            
2b0e0 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65        /* An inde
2b0f0 78 20 6f 6e 20 70 53 72 63 20 2a 2f 0a 20 20 4c  x on pSrc */.  L
2b100 6f 67 45 73 74 20 6e 49 6e 4d 75 6c 20 20 20 20  ogEst nInMul    
2b110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2b120 2a 20 6c 6f 67 28 4e 75 6d 62 65 72 20 6f 66 20  * log(Number of 
2b130 69 74 65 72 61 74 69 6f 6e 73 20 64 75 65 20 74  iterations due t
2b140 6f 20 49 4e 29 20 2a 2f 0a 29 7b 0a 20 20 57 68  o IN) */.){.  Wh
2b150 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20  ereInfo *pWInfo 
2b160 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e  = pBuilder->pWIn
2b170 66 6f 3b 20 20 2f 2a 20 57 48 45 52 45 20 61 6e  fo;  /* WHERE an
2b180 61 6c 79 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f  alyse context */
2b190 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
2b1a0 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73   = pWInfo->pPars
2b1b0 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72  e;        /* Par
2b1c0 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
2b1d0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
2b1e0 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20  pParse->db;     
2b1f0 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f    /* Database co
2b200 6e 6e 65 63 74 69 6f 6e 20 6d 61 6c 6c 6f 63 20  nnection malloc 
2b210 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65  context */.  Whe
2b220 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 20 20 20  reLoop *pNew;   
2b230 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2b240 54 65 6d 70 6c 61 74 65 20 57 68 65 72 65 4c 6f  Template WhereLo
2b250 6f 70 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  op under constru
2b260 63 74 69 6f 6e 20 2a 2f 0a 20 20 57 68 65 72 65  ction */.  Where
2b270 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20  Term *pTerm;    
2b280 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
2b290 57 68 65 72 65 54 65 72 6d 20 75 6e 64 65 72 20  WhereTerm under 
2b2a0 63 6f 6e 73 69 64 65 72 61 74 69 6f 6e 20 2a 2f  consideration */
2b2b0 0a 20 20 69 6e 74 20 6f 70 4d 61 73 6b 3b 20 20  .  int opMask;  
2b2c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b2d0 20 20 20 2f 2a 20 56 61 6c 69 64 20 6f 70 65 72     /* Valid oper
2b2e0 61 74 6f 72 73 20 66 6f 72 20 63 6f 6e 73 74 72  ators for constr
2b2f0 61 69 6e 74 73 20 2a 2f 0a 20 20 57 68 65 72 65  aints */.  Where
2b300 53 63 61 6e 20 73 63 61 6e 3b 20 20 20 20 20 20  Scan scan;      
2b310 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74             /* It
2b320 65 72 61 74 6f 72 20 66 6f 72 20 57 48 45 52 45  erator for WHERE
2b330 20 74 65 72 6d 73 20 2a 2f 0a 20 20 42 69 74 6d   terms */.  Bitm
2b340 61 73 6b 20 73 61 76 65 64 5f 70 72 65 72 65 71  ask saved_prereq
2b350 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  ;           /* O
2b360 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66  riginal value of
2b370 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 2a 2f   pNew->prereq */
2b380 0a 20 20 75 31 36 20 73 61 76 65 64 5f 6e 4c 54  .  u16 saved_nLT
2b390 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  erm;            
2b3a0 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76     /* Original v
2b3b0 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 6e 4c  alue of pNew->nL
2b3c0 54 65 72 6d 20 2a 2f 0a 20 20 75 31 36 20 73 61  Term */.  u16 sa
2b3d0 76 65 64 5f 6e 45 71 3b 20 20 20 20 20 20 20 20  ved_nEq;        
2b3e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69            /* Ori
2b3f0 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70  ginal value of p
2b400 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
2b410 20 2a 2f 0a 20 20 75 31 36 20 73 61 76 65 64 5f   */.  u16 saved_
2b420 6e 53 6b 69 70 3b 20 20 20 20 20 20 20 20 20 20  nSkip;          
2b430 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61        /* Origina
2b440 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d  l value of pNew-
2b450 3e 6e 53 6b 69 70 20 2a 2f 0a 20 20 75 33 32 20  >nSkip */.  u32 
2b460 73 61 76 65 64 5f 77 73 46 6c 61 67 73 3b 20 20  saved_wsFlags;  
2b470 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
2b480 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66  riginal value of
2b490 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 2a   pNew->wsFlags *
2b4a0 2f 0a 20 20 4c 6f 67 45 73 74 20 73 61 76 65 64  /.  LogEst saved
2b4b0 5f 6e 4f 75 74 3b 20 20 20 20 20 20 20 20 20 20  _nOut;          
2b4c0 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20      /* Original 
2b4d0 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 6e  value of pNew->n
2b4e0 4f 75 74 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f  Out */.  int iCo
2b4f0 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
2b500 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
2b510 78 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  x of the column 
2b520 69 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a  in the table */.
2b530 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
2b540 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
2b550 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
2b560 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 72 53 69   */.  LogEst rSi
2b570 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
2b580 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2b590 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74  of rows in the t
2b5a0 61 62 6c 65 20 2a 2f 0a 20 20 4c 6f 67 45 73 74  able */.  LogEst
2b5b0 20 72 4c 6f 67 53 69 7a 65 3b 20 20 20 20 20 20   rLogSize;      
2b5c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 67            /* Log
2b5d0 61 72 69 74 68 6d 20 6f 66 20 74 61 62 6c 65 20  arithm of table 
2b5e0 73 69 7a 65 20 2a 2f 0a 20 20 57 68 65 72 65 54  size */.  WhereT
2b5f0 65 72 6d 20 2a 70 54 6f 70 20 3d 20 30 2c 20 2a  erm *pTop = 0, *
2b600 70 42 74 6d 20 3d 20 30 3b 20 2f 2a 20 54 6f 70  pBtm = 0; /* Top
2b610 20 61 6e 64 20 62 6f 74 74 6f 6d 20 72 61 6e 67   and bottom rang
2b620 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f  e constraints */
2b630 0a 0a 20 20 70 4e 65 77 20 3d 20 70 42 75 69 6c  ..  pNew = pBuil
2b640 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 69 66 28  der->pNew;.  if(
2b650 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
2b660 64 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  d ) return SQLIT
2b670 45 5f 4e 4f 4d 45 4d 3b 0a 0a 20 20 61 73 73 65  E_NOMEM;..  asse
2b680 72 74 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61  rt( (pNew->wsFla
2b690 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55  gs & WHERE_VIRTU
2b6a0 41 4c 54 41 42 4c 45 29 3d 3d 30 20 29 3b 0a 20  ALTABLE)==0 );. 
2b6b0 20 61 73 73 65 72 74 28 20 28 70 4e 65 77 2d 3e   assert( (pNew->
2b6c0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
2b6d0 54 4f 50 5f 4c 49 4d 49 54 29 3d 3d 30 20 29 3b  TOP_LIMIT)==0 );
2b6e0 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e 77 73 46  .  if( pNew->wsF
2b6f0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 42 54 4d  lags & WHERE_BTM
2b700 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 6f 70  _LIMIT ){.    op
2b710 4d 61 73 6b 20 3d 20 57 4f 5f 4c 54 7c 57 4f 5f  Mask = WO_LT|WO_
2b720 4c 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  LE;.  }else if( 
2b730 70 50 72 6f 62 65 2d 3e 74 6e 75 6d 3c 3d 30 20  pProbe->tnum<=0 
2b740 7c 7c 20 28 70 53 72 63 2d 3e 6a 6f 69 6e 74 79  || (pSrc->jointy
2b750 70 65 20 26 20 4a 54 5f 4c 45 46 54 29 21 3d 30  pe & JT_LEFT)!=0
2b760 20 29 7b 0a 20 20 20 20 6f 70 4d 61 73 6b 20 3d   ){.    opMask =
2b770 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 7c 57 4f 5f   WO_EQ|WO_IN|WO_
2b780 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4c 54 7c 57  GT|WO_GE|WO_LT|W
2b790 4f 5f 4c 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  O_LE;.  }else{. 
2b7a0 20 20 20 6f 70 4d 61 73 6b 20 3d 20 57 4f 5f 45     opMask = WO_E
2b7b0 51 7c 57 4f 5f 49 4e 7c 57 4f 5f 49 53 4e 55 4c  Q|WO_IN|WO_ISNUL
2b7c0 4c 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f  L|WO_GT|WO_GE|WO
2b7d0 5f 4c 54 7c 57 4f 5f 4c 45 3b 0a 20 20 7d 0a 20  _LT|WO_LE;.  }. 
2b7e0 20 69 66 28 20 70 50 72 6f 62 65 2d 3e 62 55 6e   if( pProbe->bUn
2b7f0 6f 72 64 65 72 65 64 20 29 20 6f 70 4d 61 73 6b  ordered ) opMask
2b800 20 26 3d 20 7e 28 57 4f 5f 47 54 7c 57 4f 5f 47   &= ~(WO_GT|WO_G
2b810 45 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 3b 0a  E|WO_LT|WO_LE);.
2b820 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d  .  assert( pNew-
2b830 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3c 70 50 72  >u.btree.nEq<pPr
2b840 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a  obe->nColumn );.
2b850 20 20 69 43 6f 6c 20 3d 20 70 50 72 6f 62 65 2d    iCol = pProbe-
2b860 3e 61 69 43 6f 6c 75 6d 6e 5b 70 4e 65 77 2d 3e  >aiColumn[pNew->
2b870 75 2e 62 74 72 65 65 2e 6e 45 71 5d 3b 0a 0a 20  u.btree.nEq];.. 
2b880 20 70 54 65 72 6d 20 3d 20 77 68 65 72 65 53 63   pTerm = whereSc
2b890 61 6e 49 6e 69 74 28 26 73 63 61 6e 2c 20 70 42  anInit(&scan, pB
2b8a0 75 69 6c 64 65 72 2d 3e 70 57 43 2c 20 70 53 72  uilder->pWC, pSr
2b8b0 63 2d 3e 69 43 75 72 73 6f 72 2c 20 69 43 6f 6c  c->iCursor, iCol
2b8c0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2b8d0 20 20 20 20 20 20 20 20 20 20 6f 70 4d 61 73 6b            opMask
2b8e0 2c 20 70 50 72 6f 62 65 29 3b 0a 20 20 73 61 76  , pProbe);.  sav
2b8f0 65 64 5f 6e 45 71 20 3d 20 70 4e 65 77 2d 3e 75  ed_nEq = pNew->u
2b900 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20 73 61  .btree.nEq;.  sa
2b910 76 65 64 5f 6e 53 6b 69 70 20 3d 20 70 4e 65 77  ved_nSkip = pNew
2b920 2d 3e 6e 53 6b 69 70 3b 0a 20 20 73 61 76 65 64  ->nSkip;.  saved
2b930 5f 6e 4c 54 65 72 6d 20 3d 20 70 4e 65 77 2d 3e  _nLTerm = pNew->
2b940 6e 4c 54 65 72 6d 3b 0a 20 20 73 61 76 65 64 5f  nLTerm;.  saved_
2b950 77 73 46 6c 61 67 73 20 3d 20 70 4e 65 77 2d 3e  wsFlags = pNew->
2b960 77 73 46 6c 61 67 73 3b 0a 20 20 73 61 76 65 64  wsFlags;.  saved
2b970 5f 70 72 65 72 65 71 20 3d 20 70 4e 65 77 2d 3e  _prereq = pNew->
2b980 70 72 65 72 65 71 3b 0a 20 20 73 61 76 65 64 5f  prereq;.  saved_
2b990 6e 4f 75 74 20 3d 20 70 4e 65 77 2d 3e 6e 4f 75  nOut = pNew->nOu
2b9a0 74 3b 0a 20 20 70 4e 65 77 2d 3e 72 53 65 74 75  t;.  pNew->rSetu
2b9b0 70 20 3d 20 30 3b 0a 20 20 72 53 69 7a 65 20 3d  p = 0;.  rSize =
2b9c0 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f   pProbe->aiRowLo
2b9d0 67 45 73 74 5b 30 5d 3b 0a 20 20 72 4c 6f 67 53  gEst[0];.  rLogS
2b9e0 69 7a 65 20 3d 20 65 73 74 4c 6f 67 28 72 53 69  ize = estLog(rSi
2b9f0 7a 65 29 3b 0a 20 20 66 6f 72 28 3b 20 72 63 3d  ze);.  for(; rc=
2ba00 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 54  =SQLITE_OK && pT
2ba10 65 72 6d 21 3d 30 3b 20 70 54 65 72 6d 20 3d 20  erm!=0; pTerm = 
2ba20 77 68 65 72 65 53 63 61 6e 4e 65 78 74 28 26 73  whereScanNext(&s
2ba30 63 61 6e 29 29 7b 0a 20 20 20 20 75 31 36 20 65  can)){.    u16 e
2ba40 4f 70 20 3d 20 70 54 65 72 6d 2d 3e 65 4f 70 65  Op = pTerm->eOpe
2ba50 72 61 74 6f 72 3b 20 20 20 2f 2a 20 53 68 6f 72  rator;   /* Shor
2ba60 74 68 61 6e 64 20 66 6f 72 20 70 54 65 72 6d 2d  thand for pTerm-
2ba70 3e 65 4f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  >eOperator */.  
2ba80 20 20 4c 6f 67 45 73 74 20 72 43 6f 73 74 49 64    LogEst rCostId
2ba90 78 3b 0a 20 20 20 20 4c 6f 67 45 73 74 20 6e 4f  x;.    LogEst nO
2baa0 75 74 55 6e 61 64 6a 75 73 74 65 64 3b 20 20 20  utUnadjusted;   
2bab0 20 20 20 20 20 2f 2a 20 6e 4f 75 74 20 62 65 66       /* nOut bef
2bac0 6f 72 65 20 49 4e 28 29 20 61 6e 64 20 57 48 45  ore IN() and WHE
2bad0 52 45 20 61 64 6a 75 73 74 6d 65 6e 74 73 20 2a  RE adjustments *
2bae0 2f 0a 20 20 20 20 69 6e 74 20 6e 49 6e 20 3d 20  /.    int nIn = 
2baf0 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  0;.#ifdef SQLITE
2bb00 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52  _ENABLE_STAT3_OR
2bb10 5f 53 54 41 54 34 0a 20 20 20 20 69 6e 74 20 6e  _STAT4.    int n
2bb20 52 65 63 56 61 6c 69 64 20 3d 20 70 42 75 69 6c  RecValid = pBuil
2bb30 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3b 0a  der->nRecValid;.
2bb40 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 28  #endif.    if( (
2bb50 65 4f 70 3d 3d 57 4f 5f 49 53 4e 55 4c 4c 20 7c  eOp==WO_ISNULL |
2bb60 7c 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  | (pTerm->wtFlag
2bb70 73 26 54 45 52 4d 5f 56 4e 55 4c 4c 29 21 3d 30  s&TERM_VNULL)!=0
2bb80 29 0a 20 20 20 20 20 26 26 20 28 69 43 6f 6c 3c  ).     && (iCol<
2bb90 30 20 7c 7c 20 70 53 72 63 2d 3e 70 54 61 62 2d  0 || pSrc->pTab-
2bba0 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 6e 6f 74 4e  >aCol[iCol].notN
2bbb0 75 6c 6c 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  ull).    ){.    
2bbc0 20 20 63 6f 6e 74 69 6e 75 65 3b 20 2f 2a 20 69    continue; /* i
2bbd0 67 6e 6f 72 65 20 49 53 20 5b 4e 4f 54 5d 20 4e  gnore IS [NOT] N
2bbe0 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  ULL constraints 
2bbf0 6f 6e 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6c 75  on NOT NULL colu
2bc00 6d 6e 73 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20  mns */.    }.   
2bc10 20 69 66 28 20 70 54 65 72 6d 2d 3e 70 72 65 72   if( pTerm->prer
2bc20 65 71 52 69 67 68 74 20 26 20 70 4e 65 77 2d 3e  eqRight & pNew->
2bc30 6d 61 73 6b 53 65 6c 66 20 29 20 63 6f 6e 74 69  maskSelf ) conti
2bc40 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f 20  nue;..    /* Do 
2bc50 6e 6f 74 20 61 6c 6c 6f 77 20 74 68 65 20 75 70  not allow the up
2bc60 70 65 72 20 62 6f 75 6e 64 20 6f 66 20 61 20 4c  per bound of a L
2bc70 49 4b 45 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  IKE optimization
2bc80 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e   range constrain
2bc90 74 0a 20 20 20 20 2a 2a 20 74 6f 20 6d 69 78 20  t.    ** to mix 
2bca0 77 69 74 68 20 61 20 6c 6f 77 65 72 20 72 61 6e  with a lower ran
2bcb0 67 65 20 62 6f 75 6e 64 20 66 72 6f 6d 20 73 6f  ge bound from so
2bcc0 6d 65 20 6f 74 68 65 72 20 73 6f 75 72 63 65 20  me other source 
2bcd0 2a 2f 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d  */.    if( pTerm
2bce0 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
2bcf0 5f 4c 49 4b 45 4f 50 54 20 26 26 20 70 54 65 72  _LIKEOPT && pTer
2bd00 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f  m->eOperator==WO
2bd10 5f 4c 54 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  _LT ) continue;.
2bd20 0a 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61  .    pNew->wsFla
2bd30 67 73 20 3d 20 73 61 76 65 64 5f 77 73 46 6c 61  gs = saved_wsFla
2bd40 67 73 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e  gs;.    pNew->u.
2bd50 62 74 72 65 65 2e 6e 45 71 20 3d 20 73 61 76 65  btree.nEq = save
2bd60 64 5f 6e 45 71 3b 0a 20 20 20 20 70 4e 65 77 2d  d_nEq;.    pNew-
2bd70 3e 6e 4c 54 65 72 6d 20 3d 20 73 61 76 65 64 5f  >nLTerm = saved_
2bd80 6e 4c 54 65 72 6d 3b 0a 20 20 20 20 69 66 28 20  nLTerm;.    if( 
2bd90 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28  whereLoopResize(
2bda0 64 62 2c 20 70 4e 65 77 2c 20 70 4e 65 77 2d 3e  db, pNew, pNew->
2bdb0 6e 4c 54 65 72 6d 2b 31 29 20 29 20 62 72 65 61  nLTerm+1) ) brea
2bdc0 6b 3b 20 2f 2a 20 4f 4f 4d 20 2a 2f 0a 20 20 20  k; /* OOM */.   
2bdd0 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 70 4e   pNew->aLTerm[pN
2bde0 65 77 2d 3e 6e 4c 54 65 72 6d 2b 2b 5d 20 3d 20  ew->nLTerm++] = 
2bdf0 70 54 65 72 6d 3b 0a 20 20 20 20 70 4e 65 77 2d  pTerm;.    pNew-
2be00 3e 70 72 65 72 65 71 20 3d 20 28 73 61 76 65 64  >prereq = (saved
2be10 5f 70 72 65 72 65 71 20 7c 20 70 54 65 72 6d 2d  _prereq | pTerm-
2be20 3e 70 72 65 72 65 71 52 69 67 68 74 29 20 26 20  >prereqRight) & 
2be30 7e 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 3b  ~pNew->maskSelf;
2be40 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 49  ..    assert( nI
2be50 6e 4d 75 6c 3d 3d 30 0a 20 20 20 20 20 20 20 20  nMul==0.        
2be60 7c 7c 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67  || (pNew->wsFlag
2be70 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  s & WHERE_COLUMN
2be80 5f 4e 55 4c 4c 29 21 3d 30 20 0a 20 20 20 20 20  _NULL)!=0 .     
2be90 20 20 20 7c 7c 20 28 70 4e 65 77 2d 3e 77 73 46     || (pNew->wsF
2bea0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c  lags & WHERE_COL
2beb0 55 4d 4e 5f 49 4e 29 21 3d 30 20 0a 20 20 20 20  UMN_IN)!=0 .    
2bec0 20 20 20 20 7c 7c 20 28 70 4e 65 77 2d 3e 77 73      || (pNew->ws
2bed0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 53 4b  Flags & WHERE_SK
2bee0 49 50 53 43 41 4e 29 21 3d 30 20 0a 20 20 20 20  IPSCAN)!=0 .    
2bef0 29 3b 0a 0a 20 20 20 20 69 66 28 20 65 4f 70 20  );..    if( eOp 
2bf00 26 20 57 4f 5f 49 4e 20 29 7b 0a 20 20 20 20 20  & WO_IN ){.     
2bf10 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70   Expr *pExpr = p
2bf20 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Term->pExpr;.   
2bf30 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73     pNew->wsFlags
2bf40 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e   |= WHERE_COLUMN
2bf50 5f 49 4e 3b 0a 20 20 20 20 20 20 69 66 28 20 45  _IN;.      if( E
2bf60 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
2bf70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
2bf80 63 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ct) ){.        /
2bf90 2a 20 22 78 20 49 4e 20 28 53 45 4c 45 43 54 20  * "x IN (SELECT 
2bfa0 2e 2e 2e 29 22 3a 20 20 54 55 4e 49 4e 47 3a 20  ...)":  TUNING: 
2bfb0 74 68 65 20 53 45 4c 45 43 54 20 72 65 74 75 72  the SELECT retur
2bfc0 6e 73 20 32 35 20 72 6f 77 73 20 2a 2f 0a 20 20  ns 25 rows */.  
2bfd0 20 20 20 20 20 20 6e 49 6e 20 3d 20 34 36 3b 20        nIn = 46; 
2bfe0 20 61 73 73 65 72 74 28 20 34 36 3d 3d 73 71 6c   assert( 46==sql
2bff0 69 74 65 33 4c 6f 67 45 73 74 28 32 35 29 20 29  ite3LogEst(25) )
2c000 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
2c010 28 20 41 4c 57 41 59 53 28 70 45 78 70 72 2d 3e  ( ALWAYS(pExpr->
2c020 78 2e 70 4c 69 73 74 20 26 26 20 70 45 78 70 72  x.pList && pExpr
2c030 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ->x.pList->nExpr
2c040 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
2c050 22 78 20 49 4e 20 28 76 61 6c 75 65 2c 20 76 61  "x IN (value, va
2c060 6c 75 65 2c 20 2e 2e 2e 29 22 20 2a 2f 0a 20 20  lue, ...)" */.  
2c070 20 20 20 20 20 20 6e 49 6e 20 3d 20 73 71 6c 69        nIn = sqli
2c080 74 65 33 4c 6f 67 45 73 74 28 70 45 78 70 72 2d  te3LogEst(pExpr-
2c090 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 29  >x.pList->nExpr)
2c0a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2c0b0 61 73 73 65 72 74 28 20 6e 49 6e 3e 30 20 29 3b  assert( nIn>0 );
2c0c0 20 20 2f 2a 20 52 48 53 20 61 6c 77 61 79 73 20    /* RHS always 
2c0d0 68 61 73 20 32 20 6f 72 20 6d 6f 72 65 20 74 65  has 2 or more te
2c0e0 72 6d 73 2e 2e 2e 20 20 54 68 65 20 70 61 72 73  rms...  The pars
2c0f0 65 72 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  er.             
2c100 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 68             ** ch
2c110 61 6e 67 65 73 20 22 78 20 49 4e 20 28 3f 29 22  anges "x IN (?)"
2c120 20 69 6e 74 6f 20 22 78 3d 3f 22 2e 20 2a 2f 0a   into "x=?". */.
2c130 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65  .    }else if( e
2c140 4f 70 20 26 20 28 57 4f 5f 45 51 29 20 29 7b 0a  Op & (WO_EQ) ){.
2c150 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c        pNew->wsFl
2c160 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c  ags |= WHERE_COL
2c170 55 4d 4e 5f 45 51 3b 0a 20 20 20 20 20 20 69 66  UMN_EQ;.      if
2c180 28 20 69 43 6f 6c 3c 30 20 7c 7c 20 28 6e 49 6e  ( iCol<0 || (nIn
2c190 4d 75 6c 3d 3d 30 20 26 26 20 70 4e 65 77 2d 3e  Mul==0 && pNew->
2c1a0 75 2e 62 74 72 65 65 2e 6e 45 71 3d 3d 70 50 72  u.btree.nEq==pPr
2c1b0 6f 62 65 2d 3e 6e 4b 65 79 43 6f 6c 2d 31 29 20  obe->nKeyCol-1) 
2c1c0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  ){.        if( i
2c1d0 43 6f 6c 3e 3d 30 20 26 26 20 21 49 73 55 6e 69  Col>=0 && !IsUni
2c1e0 71 75 65 49 6e 64 65 78 28 70 50 72 6f 62 65 29  queIndex(pProbe)
2c1f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e   ){.          pN
2c200 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57  ew->wsFlags |= W
2c210 48 45 52 45 5f 55 4e 51 5f 57 41 4e 54 45 44 3b  HERE_UNQ_WANTED;
2c220 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
2c230 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
2c240 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45  wsFlags |= WHERE
2c250 5f 4f 4e 45 52 4f 57 3b 0a 20 20 20 20 20 20 20  _ONEROW;.       
2c260 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
2c270 65 6c 73 65 20 69 66 28 20 65 4f 70 20 26 20 57  else if( eOp & W
2c280 4f 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20  O_ISNULL ){.    
2c290 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20    pNew->wsFlags 
2c2a0 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  |= WHERE_COLUMN_
2c2b0 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 20  NULL;.    }else 
2c2c0 69 66 28 20 65 4f 70 20 26 20 28 57 4f 5f 47 54  if( eOp & (WO_GT
2c2d0 7c 57 4f 5f 47 45 29 20 29 7b 0a 20 20 20 20 20  |WO_GE) ){.     
2c2e0 20 74 65 73 74 63 61 73 65 28 20 65 4f 70 20 26   testcase( eOp &
2c2f0 20 57 4f 5f 47 54 20 29 3b 0a 20 20 20 20 20 20   WO_GT );.      
2c300 74 65 73 74 63 61 73 65 28 20 65 4f 70 20 26 20  testcase( eOp & 
2c310 57 4f 5f 47 45 20 29 3b 0a 20 20 20 20 20 20 70  WO_GE );.      p
2c320 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20  New->wsFlags |= 
2c330 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e  WHERE_COLUMN_RAN
2c340 47 45 7c 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d  GE|WHERE_BTM_LIM
2c350 49 54 3b 0a 20 20 20 20 20 20 70 42 74 6d 20 3d  IT;.      pBtm =
2c360 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 54   pTerm;.      pT
2c370 6f 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66  op = 0;.      if
2c380 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  ( pTerm->wtFlags
2c390 20 26 20 54 45 52 4d 5f 4c 49 4b 45 4f 50 54 20   & TERM_LIKEOPT 
2c3a0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 61  ){.        /* Ra
2c3b0 6e 67 65 20 63 6f 6e 74 72 61 69 6e 74 73 20 74  nge contraints t
2c3c0 68 61 74 20 63 6f 6d 65 20 66 72 6f 6d 20 74 68  hat come from th
2c3d0 65 20 4c 49 4b 45 20 6f 70 74 69 6d 69 7a 61 74  e LIKE optimizat
2c3e0 69 6f 6e 20 61 72 65 0a 20 20 20 20 20 20 20 20  ion are.        
2c3f0 2a 2a 20 61 6c 77 61 79 73 20 75 73 65 64 20 69  ** always used i
2c400 6e 20 70 61 69 72 73 2e 20 2a 2f 0a 20 20 20 20  n pairs. */.    
2c410 20 20 20 20 70 54 6f 70 20 3d 20 26 70 54 65 72      pTop = &pTer
2c420 6d 5b 31 5d 3b 0a 20 20 20 20 20 20 20 20 61 73  m[1];.        as
2c430 73 65 72 74 28 20 28 70 54 6f 70 2d 28 70 54 65  sert( (pTop-(pTe
2c440 72 6d 2d 3e 70 57 43 2d 3e 61 29 29 3c 70 54 65  rm->pWC->a))<pTe
2c450 72 6d 2d 3e 70 57 43 2d 3e 6e 54 65 72 6d 20 29  rm->pWC->nTerm )
2c460 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
2c470 28 20 70 54 6f 70 2d 3e 77 74 46 6c 61 67 73 20  ( pTop->wtFlags 
2c480 26 20 54 45 52 4d 5f 4c 49 4b 45 4f 50 54 20 29  & TERM_LIKEOPT )
2c490 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
2c4a0 28 20 70 54 6f 70 2d 3e 65 4f 70 65 72 61 74 6f  ( pTop->eOperato
2c4b0 72 3d 3d 57 4f 5f 4c 54 20 29 3b 0a 20 20 20 20  r==WO_LT );.    
2c4c0 20 20 20 20 69 66 28 20 77 68 65 72 65 4c 6f 6f      if( whereLoo
2c4d0 70 52 65 73 69 7a 65 28 64 62 2c 20 70 4e 65 77  pResize(db, pNew
2c4e0 2c 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b 31  , pNew->nLTerm+1
2c4f0 29 20 29 20 62 72 65 61 6b 3b 20 2f 2a 20 4f 4f  ) ) break; /* OO
2c500 4d 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65  M */.        pNe
2c510 77 2d 3e 61 4c 54 65 72 6d 5b 70 4e 65 77 2d 3e  w->aLTerm[pNew->
2c520 6e 4c 54 65 72 6d 2b 2b 5d 20 3d 20 70 54 6f 70  nLTerm++] = pTop
2c530 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
2c540 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45  wsFlags |= WHERE
2c550 5f 54 4f 50 5f 4c 49 4d 49 54 3b 0a 20 20 20 20  _TOP_LIMIT;.    
2c560 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
2c570 20 20 20 20 20 61 73 73 65 72 74 28 20 65 4f 70       assert( eOp
2c580 20 26 20 28 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29   & (WO_LT|WO_LE)
2c590 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
2c5a0 73 65 28 20 65 4f 70 20 26 20 57 4f 5f 4c 54 20  se( eOp & WO_LT 
2c5b0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
2c5c0 65 28 20 65 4f 70 20 26 20 57 4f 5f 4c 45 20 29  e( eOp & WO_LE )
2c5d0 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73  ;.      pNew->ws
2c5e0 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43  Flags |= WHERE_C
2c5f0 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c 57 48 45 52  OLUMN_RANGE|WHER
2c600 45 5f 54 4f 50 5f 4c 49 4d 49 54 3b 0a 20 20 20  E_TOP_LIMIT;.   
2c610 20 20 20 70 54 6f 70 20 3d 20 70 54 65 72 6d 3b     pTop = pTerm;
2c620 0a 20 20 20 20 20 20 70 42 74 6d 20 3d 20 28 70  .      pBtm = (p
2c630 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  New->wsFlags & W
2c640 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 29 21  HERE_BTM_LIMIT)!
2c650 3d 30 20 3f 0a 20 20 20 20 20 20 20 20 20 20 20  =0 ?.           
2c660 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
2c670 61 4c 54 65 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54  aLTerm[pNew->nLT
2c680 65 72 6d 2d 32 5d 20 3a 20 30 3b 0a 20 20 20 20  erm-2] : 0;.    
2c690 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69  }..    /* At thi
2c6a0 73 20 70 6f 69 6e 74 20 70 4e 65 77 2d 3e 6e 4f  s point pNew->nO
2c6b0 75 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  ut is set to the
2c6c0 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
2c6d0 65 78 70 65 63 74 65 64 20 74 6f 0a 20 20 20 20  expected to.    
2c6e0 2a 2a 20 62 65 20 76 69 73 69 74 65 64 20 62 79  ** be visited by
2c6f0 20 74 68 65 20 69 6e 64 65 78 20 73 63 61 6e 20   the index scan 
2c700 62 65 66 6f 72 65 20 63 6f 6e 73 69 64 65 72 69  before consideri
2c710 6e 67 20 74 65 72 6d 20 70 54 65 72 6d 2c 20 6f  ng term pTerm, o
2c720 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 76 61 6c  r the.    ** val
2c730 75 65 73 20 6f 66 20 6e 49 6e 20 61 6e 64 20 6e  ues of nIn and n
2c740 49 6e 4d 75 6c 2e 20 49 6e 20 6f 74 68 65 72 20  InMul. In other 
2c750 77 6f 72 64 73 2c 20 61 73 73 75 6d 69 6e 67 20  words, assuming 
2c760 74 68 61 74 20 61 6c 6c 20 0a 20 20 20 20 2a 2a  that all .    **
2c770 20 22 78 20 49 4e 28 2e 2e 2e 29 22 20 74 65 72   "x IN(...)" ter
2c780 6d 73 20 61 72 65 20 72 65 70 6c 61 63 65 64 20  ms are replaced 
2c790 77 69 74 68 20 22 78 20 3d 20 3f 22 2e 20 54 68  with "x = ?". Th
2c7a0 69 73 20 62 6c 6f 63 6b 20 75 70 64 61 74 65 73  is block updates
2c7b0 0a 20 20 20 20 2a 2a 20 74 68 65 20 76 61 6c 75  .    ** the valu
2c7c0 65 20 6f 66 20 70 4e 65 77 2d 3e 6e 4f 75 74 20  e of pNew->nOut 
2c7d0 74 6f 20 61 63 63 6f 75 6e 74 20 66 6f 72 20 70  to account for p
2c7e0 54 65 72 6d 20 28 62 75 74 20 6e 6f 74 20 6e 49  Term (but not nI
2c7f0 6e 2f 6e 49 6e 4d 75 6c 29 2e 20 20 2a 2f 0a 20  n/nInMul).  */. 
2c800 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d     assert( pNew-
2c810 3e 6e 4f 75 74 3d 3d 73 61 76 65 64 5f 6e 4f 75  >nOut==saved_nOu
2c820 74 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65  t );.    if( pNe
2c830 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  w->wsFlags & WHE
2c840 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 20  RE_COLUMN_RANGE 
2c850 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 64 6a 75  ){.      /* Adju
2c860 73 74 20 6e 4f 75 74 20 75 73 69 6e 67 20 73 74  st nOut using st
2c870 61 74 33 2f 73 74 61 74 34 20 64 61 74 61 2e 20  at3/stat4 data. 
2c880 4f 72 2c 20 69 66 20 74 68 65 72 65 20 69 73 20  Or, if there is 
2c890 6e 6f 20 73 74 61 74 33 2f 73 74 61 74 34 0a 20  no stat3/stat4. 
2c8a0 20 20 20 20 20 2a 2a 20 64 61 74 61 2c 20 75 73       ** data, us
2c8b0 69 6e 67 20 73 6f 6d 65 20 6f 74 68 65 72 20 65  ing some other e
2c8c0 73 74 69 6d 61 74 65 2e 20 20 2a 2f 0a 20 20 20  stimate.  */.   
2c8d0 20 20 20 77 68 65 72 65 52 61 6e 67 65 53 63 61     whereRangeSca
2c8e0 6e 45 73 74 28 70 50 61 72 73 65 2c 20 70 42 75  nEst(pParse, pBu
2c8f0 69 6c 64 65 72 2c 20 70 42 74 6d 2c 20 70 54 6f  ilder, pBtm, pTo
2c900 70 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 7d 65  p, pNew);.    }e
2c910 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  lse{.      int n
2c920 45 71 20 3d 20 2b 2b 70 4e 65 77 2d 3e 75 2e 62  Eq = ++pNew->u.b
2c930 74 72 65 65 2e 6e 45 71 3b 0a 20 20 20 20 20 20  tree.nEq;.      
2c940 61 73 73 65 72 74 28 20 65 4f 70 20 26 20 28 57  assert( eOp & (W
2c950 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 45 51 7c 57  O_ISNULL|WO_EQ|W
2c960 4f 5f 49 4e 29 20 29 3b 0a 0a 20 20 20 20 20 20  O_IN) );..      
2c970 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4f  assert( pNew->nO
2c980 75 74 3d 3d 73 61 76 65 64 5f 6e 4f 75 74 20 29  ut==saved_nOut )
2c990 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72  ;.      if( pTer
2c9a0 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3c 3d 30 20  m->truthProb<=0 
2c9b0 26 26 20 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20 20  && iCol>=0 ){.  
2c9c0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 65        assert( (e
2c9d0 4f 70 20 26 20 57 4f 5f 49 4e 29 20 7c 7c 20 6e  Op & WO_IN) || n
2c9e0 49 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  In==0 );.       
2c9f0 20 74 65 73 74 63 61 73 65 28 20 65 4f 70 20 26   testcase( eOp &
2ca00 20 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 20 20   WO_IN );.      
2ca10 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b 3d 20    pNew->nOut += 
2ca20 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62  pTerm->truthProb
2ca30 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
2ca40 6e 4f 75 74 20 2d 3d 20 6e 49 6e 3b 0a 20 20 20  nOut -= nIn;.   
2ca50 20 20 20 7d 65 6c 73 65 7b 0a 23 69 66 64 65 66     }else{.#ifdef
2ca60 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
2ca70 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20  TAT3_OR_STAT4.  
2ca80 20 20 20 20 20 20 74 52 6f 77 63 6e 74 20 6e 4f        tRowcnt nO
2ca90 75 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ut = 0;.        
2caa0 69 66 28 20 6e 49 6e 4d 75 6c 3d 3d 30 20 0a 20  if( nInMul==0 . 
2cab0 20 20 20 20 20 20 20 20 26 26 20 70 50 72 6f 62          && pProb
2cac0 65 2d 3e 6e 53 61 6d 70 6c 65 20 0a 20 20 20 20  e->nSample .    
2cad0 20 20 20 20 20 26 26 20 70 4e 65 77 2d 3e 75 2e       && pNew->u.
2cae0 62 74 72 65 65 2e 6e 45 71 3c 3d 70 50 72 6f 62  btree.nEq<=pProb
2caf0 65 2d 3e 6e 53 61 6d 70 6c 65 43 6f 6c 0a 20 20  e->nSampleCol.  
2cb00 20 20 20 20 20 20 20 26 26 20 28 28 65 4f 70 20         && ((eOp 
2cb10 26 20 57 4f 5f 49 4e 29 3d 3d 30 20 7c 7c 20 21  & WO_IN)==0 || !
2cb20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
2cb30 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50  pTerm->pExpr, EP
2cb40 5f 78 49 73 53 65 6c 65 63 74 29 29 0a 20 20 20  _xIsSelect)).   
2cb50 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
2cb60 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
2cb70 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  pTerm->pExpr;.  
2cb80 20 20 20 20 20 20 20 20 69 66 28 20 28 65 4f 70          if( (eOp
2cb90 20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 4e   & (WO_EQ|WO_ISN
2cba0 55 4c 4c 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  ULL))!=0 ){.    
2cbb0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
2cbc0 28 20 65 4f 70 20 26 20 57 4f 5f 45 51 20 29 3b  ( eOp & WO_EQ );
2cbd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73  .            tes
2cbe0 74 63 61 73 65 28 20 65 4f 70 20 26 20 57 4f 5f  tcase( eOp & WO_
2cbf0 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20  ISNULL );.      
2cc00 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65        rc = where
2cc10 45 71 75 61 6c 53 63 61 6e 45 73 74 28 70 50 61  EqualScanEst(pPa
2cc20 72 73 65 2c 20 70 42 75 69 6c 64 65 72 2c 20 70  rse, pBuilder, p
2cc30 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 6e  Expr->pRight, &n
2cc40 4f 75 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Out);.          
2cc50 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
2cc60 20 20 20 72 63 20 3d 20 77 68 65 72 65 49 6e 53     rc = whereInS
2cc70 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c 20 70  canEst(pParse, p
2cc80 42 75 69 6c 64 65 72 2c 20 70 45 78 70 72 2d 3e  Builder, pExpr->
2cc90 78 2e 70 4c 69 73 74 2c 20 26 6e 4f 75 74 29 3b  x.pList, &nOut);
2cca0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2ccb0 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
2ccc0 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 29  QLITE_NOTFOUND )
2ccd0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2cce0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
2ccf0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 62  c!=SQLITE_OK ) b
2cd00 72 65 61 6b 3b 20 20 20 20 20 20 20 20 20 20 2f  reak;          /
2cd10 2a 20 4a 75 6d 70 20 6f 75 74 20 6f 66 20 74 68  * Jump out of th
2cd20 65 20 70 54 65 72 6d 20 6c 6f 6f 70 20 2a 2f 0a  e pTerm loop */.
2cd30 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 4f            if( nO
2cd40 75 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ut ){.          
2cd50 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73    pNew->nOut = s
2cd60 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 6e 4f 75  qlite3LogEst(nOu
2cd70 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  t);.            
2cd80 69 66 28 20 70 4e 65 77 2d 3e 6e 4f 75 74 3e 73  if( pNew->nOut>s
2cd90 61 76 65 64 5f 6e 4f 75 74 20 29 20 70 4e 65 77  aved_nOut ) pNew
2cda0 2d 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e  ->nOut = saved_n
2cdb0 4f 75 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Out;.           
2cdc0 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2d 3d 20 6e   pNew->nOut -= n
2cdd0 49 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  In;.          }.
2cde0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2cdf0 20 20 69 66 28 20 6e 4f 75 74 3d 3d 30 20 29 0a    if( nOut==0 ).
2ce00 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7b  #endif.        {
2ce10 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d  .          pNew-
2ce20 3e 6e 4f 75 74 20 2b 3d 20 28 70 50 72 6f 62 65  >nOut += (pProbe
2ce30 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 6e 45  ->aiRowLogEst[nE
2ce40 71 5d 20 2d 20 70 50 72 6f 62 65 2d 3e 61 69 52  q] - pProbe->aiR
2ce50 6f 77 4c 6f 67 45 73 74 5b 6e 45 71 2d 31 5d 29  owLogEst[nEq-1])
2ce60 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2ce70 65 4f 70 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20  eOp & WO_ISNULL 
2ce80 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ){.            /
2ce90 2a 20 54 55 4e 49 4e 47 3a 20 49 66 20 74 68 65  * TUNING: If the
2cea0 72 65 20 69 73 20 6e 6f 20 6c 69 6b 65 6c 69 68  re is no likelih
2ceb0 6f 6f 64 28 29 20 76 61 6c 75 65 2c 20 61 73 73  ood() value, ass
2cec0 75 6d 65 20 74 68 61 74 20 61 20 0a 20 20 20 20  ume that a .    
2ced0 20 20 20 20 20 20 20 20 2a 2a 20 22 63 6f 6c 20          ** "col 
2cee0 49 53 20 4e 55 4c 4c 22 20 65 78 70 72 65 73 73  IS NULL" express
2cef0 69 6f 6e 20 6d 61 74 63 68 65 73 20 74 77 69 63  ion matches twic
2cf00 65 20 61 73 20 6d 61 6e 79 20 72 6f 77 73 20 0a  e as many rows .
2cf10 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61              ** a
2cf20 73 20 28 63 6f 6c 3d 3f 29 2e 20 2a 2f 0a 20 20  s (col=?). */.  
2cf30 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
2cf40 6e 4f 75 74 20 2b 3d 20 31 30 3b 0a 20 20 20 20  nOut += 10;.    
2cf50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2cf60 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
2cf70 0a 20 20 20 20 2f 2a 20 53 65 74 20 72 43 6f 73  .    /* Set rCos
2cf80 74 49 64 78 20 74 6f 20 74 68 65 20 63 6f 73 74  tIdx to the cost
2cf90 20 6f 66 20 76 69 73 69 74 69 6e 67 20 73 65 6c   of visiting sel
2cfa0 65 63 74 65 64 20 72 6f 77 73 20 69 6e 20 69 6e  ected rows in in
2cfb0 64 65 78 2e 20 41 64 64 0a 20 20 20 20 2a 2a 20  dex. Add.    ** 
2cfc0 69 74 20 74 6f 20 70 4e 65 77 2d 3e 72 52 75 6e  it to pNew->rRun
2cfd0 2c 20 77 68 69 63 68 20 69 73 20 63 75 72 72 65  , which is curre
2cfe0 6e 74 6c 79 20 73 65 74 20 74 6f 20 74 68 65 20  ntly set to the 
2cff0 63 6f 73 74 20 6f 66 20 74 68 65 20 69 6e 64 65  cost of the inde
2d000 78 0a 20 20 20 20 2a 2a 20 73 65 65 6b 20 6f 6e  x.    ** seek on
2d010 6c 79 2e 20 54 68 65 6e 2c 20 69 66 20 74 68 69  ly. Then, if thi
2d020 73 20 69 73 20 61 20 6e 6f 6e 2d 63 6f 76 65 72  s is a non-cover
2d030 69 6e 67 20 69 6e 64 65 78 2c 20 61 64 64 20 74  ing index, add t
2d040 68 65 20 63 6f 73 74 20 6f 66 0a 20 20 20 20 2a  he cost of.    *
2d050 2a 20 76 69 73 69 74 69 6e 67 20 74 68 65 20 72  * visiting the r
2d060 6f 77 73 20 69 6e 20 74 68 65 20 6d 61 69 6e 20  ows in the main 
2d070 74 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 72  table.  */.    r
2d080 43 6f 73 74 49 64 78 20 3d 20 70 4e 65 77 2d 3e  CostIdx = pNew->
2d090 6e 4f 75 74 20 2b 20 31 20 2b 20 28 31 35 2a 70  nOut + 1 + (15*p
2d0a0 50 72 6f 62 65 2d 3e 73 7a 49 64 78 52 6f 77 29  Probe->szIdxRow)
2d0b0 2f 70 53 72 63 2d 3e 70 54 61 62 2d 3e 73 7a 54  /pSrc->pTab->szT
2d0c0 61 62 52 6f 77 3b 0a 20 20 20 20 70 4e 65 77 2d  abRow;.    pNew-
2d0d0 3e 72 52 75 6e 20 3d 20 73 71 6c 69 74 65 33 4c  >rRun = sqlite3L
2d0e0 6f 67 45 73 74 41 64 64 28 72 4c 6f 67 53 69 7a  ogEstAdd(rLogSiz
2d0f0 65 2c 20 72 43 6f 73 74 49 64 78 29 3b 0a 20 20  e, rCostIdx);.  
2d100 20 20 69 66 28 20 28 70 4e 65 77 2d 3e 77 73 46    if( (pNew->wsF
2d110 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 49 44  lags & (WHERE_ID
2d120 58 5f 4f 4e 4c 59 7c 57 48 45 52 45 5f 49 50 4b  X_ONLY|WHERE_IPK
2d130 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  ))==0 ){.      p
2d140 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 73 71 6c 69  New->rRun = sqli
2d150 74 65 33 4c 6f 67 45 73 74 41 64 64 28 70 4e 65  te3LogEstAdd(pNe
2d160 77 2d 3e 72 52 75 6e 2c 20 70 4e 65 77 2d 3e 6e  w->rRun, pNew->n
2d170 4f 75 74 20 2b 20 31 36 29 3b 0a 20 20 20 20 7d  Out + 16);.    }
2d180 0a 20 20 20 20 41 70 70 6c 79 43 6f 73 74 4d 75  .    ApplyCostMu
2d190 6c 74 69 70 6c 69 65 72 28 70 4e 65 77 2d 3e 72  ltiplier(pNew->r
2d1a0 52 75 6e 2c 20 70 50 72 6f 62 65 2d 3e 70 54 61  Run, pProbe->pTa
2d1b0 62 6c 65 2d 3e 63 6f 73 74 4d 75 6c 74 29 3b 0a  ble->costMult);.
2d1c0 0a 20 20 20 20 6e 4f 75 74 55 6e 61 64 6a 75 73  .    nOutUnadjus
2d1d0 74 65 64 20 3d 20 70 4e 65 77 2d 3e 6e 4f 75 74  ted = pNew->nOut
2d1e0 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e  ;.    pNew->rRun
2d1f0 20 2b 3d 20 6e 49 6e 4d 75 6c 20 2b 20 6e 49 6e   += nInMul + nIn
2d200 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74  ;.    pNew->nOut
2d210 20 2b 3d 20 6e 49 6e 4d 75 6c 20 2b 20 6e 49 6e   += nInMul + nIn
2d220 3b 0a 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 4f  ;.    whereLoopO
2d230 75 74 70 75 74 41 64 6a 75 73 74 28 70 42 75 69  utputAdjust(pBui
2d240 6c 64 65 72 2d 3e 70 57 43 2c 20 70 4e 65 77 2c  lder->pWC, pNew,
2d250 20 72 53 69 7a 65 29 3b 0a 20 20 20 20 72 63 20   rSize);.    rc 
2d260 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72  = whereLoopInser
2d270 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e 65 77  t(pBuilder, pNew
2d280 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 4e 65 77  );..    if( pNew
2d290 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
2d2a0 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 20 29  E_COLUMN_RANGE )
2d2b0 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f  {.      pNew->nO
2d2c0 75 74 20 3d 20 73 61 76 65 64 5f 6e 4f 75 74 3b  ut = saved_nOut;
2d2d0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2d2e0 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 6e    pNew->nOut = n
2d2f0 4f 75 74 55 6e 61 64 6a 75 73 74 65 64 3b 0a 20  OutUnadjusted;. 
2d300 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 28 70     }..    if( (p
2d310 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  New->wsFlags & W
2d320 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 3d  HERE_TOP_LIMIT)=
2d330 3d 30 0a 20 20 20 20 20 26 26 20 70 4e 65 77 2d  =0.     && pNew-
2d340 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3c 70 50 72  >u.btree.nEq<pPr
2d350 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 0a 20 20 20  obe->nColumn.   
2d360 20 29 7b 0a 20 20 20 20 20 20 77 68 65 72 65 4c   ){.      whereL
2d370 6f 6f 70 41 64 64 42 74 72 65 65 49 6e 64 65 78  oopAddBtreeIndex
2d380 28 70 42 75 69 6c 64 65 72 2c 20 70 53 72 63 2c  (pBuilder, pSrc,
2d390 20 70 50 72 6f 62 65 2c 20 6e 49 6e 4d 75 6c 2b   pProbe, nInMul+
2d3a0 6e 49 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  nIn);.    }.    
2d3b0 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76  pNew->nOut = sav
2d3c0 65 64 5f 6e 4f 75 74 3b 0a 23 69 66 64 65 66 20  ed_nOut;.#ifdef 
2d3d0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
2d3e0 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 20  AT3_OR_STAT4.   
2d3f0 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56   pBuilder->nRecV
2d400 61 6c 69 64 20 3d 20 6e 52 65 63 56 61 6c 69 64  alid = nRecValid
2d410 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 70  ;.#endif.  }.  p
2d420 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 73 61  New->prereq = sa
2d430 76 65 64 5f 70 72 65 72 65 71 3b 0a 20 20 70 4e  ved_prereq;.  pN
2d440 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20  ew->u.btree.nEq 
2d450 3d 20 73 61 76 65 64 5f 6e 45 71 3b 0a 20 20 70  = saved_nEq;.  p
2d460 4e 65 77 2d 3e 6e 53 6b 69 70 20 3d 20 73 61 76  New->nSkip = sav
2d470 65 64 5f 6e 53 6b 69 70 3b 0a 20 20 70 4e 65 77  ed_nSkip;.  pNew
2d480 2d 3e 77 73 46 6c 61 67 73 20 3d 20 73 61 76 65  ->wsFlags = save
2d490 64 5f 77 73 46 6c 61 67 73 3b 0a 20 20 70 4e 65  d_wsFlags;.  pNe
2d4a0 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64 5f  w->nOut = saved_
2d4b0 6e 4f 75 74 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4c  nOut;.  pNew->nL
2d4c0 54 65 72 6d 20 3d 20 73 61 76 65 64 5f 6e 4c 54  Term = saved_nLT
2d4d0 65 72 6d 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 73 69  erm;..  /* Consi
2d4e0 64 65 72 20 75 73 69 6e 67 20 61 20 73 6b 69 70  der using a skip
2d4f0 2d 73 63 61 6e 20 69 66 20 74 68 65 72 65 20 61  -scan if there a
2d500 72 65 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75  re no WHERE clau
2d510 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20  se constraints. 
2d520 20 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20 66 6f   ** available fo
2d530 72 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20  r the left-most 
2d540 74 65 72 6d 73 20 6f 66 20 74 68 65 20 69 6e 64  terms of the ind
2d550 65 78 2c 20 61 6e 64 20 69 66 20 74 68 65 20 61  ex, and if the a
2d560 76 65 72 61 67 65 0a 20 20 2a 2a 20 6e 75 6d 62  verage.  ** numb
2d570 65 72 20 6f 66 20 72 65 70 65 61 74 73 20 69 6e  er of repeats in
2d580 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 74   the left-most t
2d590 65 72 6d 73 20 69 73 20 61 74 20 6c 65 61 73 74  erms is at least
2d5a0 20 31 38 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20   18. .  **.  ** 
2d5b0 54 68 65 20 6d 61 67 69 63 20 6e 75 6d 62 65 72  The magic number
2d5c0 20 31 38 20 69 73 20 73 65 6c 65 63 74 65 64 20   18 is selected 
2d5d0 6f 6e 20 74 68 65 20 62 61 73 69 73 20 74 68 61  on the basis tha
2d5e0 74 20 73 63 61 6e 6e 69 6e 67 20 31 37 20 72 6f  t scanning 17 ro
2d5f0 77 73 0a 20 20 2a 2a 20 69 73 20 61 6c 6d 6f 73  ws.  ** is almos
2d600 74 20 61 6c 77 61 79 73 20 71 75 69 63 6b 65 72  t always quicker
2d610 20 74 68 61 6e 20 61 6e 20 69 6e 64 65 78 20 73   than an index s
2d620 65 65 6b 20 28 65 76 65 6e 20 74 68 6f 75 67 68  eek (even though
2d630 20 69 66 20 74 68 65 20 69 6e 64 65 78 0a 20 20   if the index.  
2d640 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 66 65 77 65  ** contains fewe
2d650 72 20 74 68 61 6e 20 32 5e 31 37 20 72 6f 77 73  r than 2^17 rows
2d660 20 77 65 20 61 73 73 75 6d 65 20 6f 74 68 65 72   we assume other
2d670 77 69 73 65 20 69 6e 20 6f 74 68 65 72 20 70 61  wise in other pa
2d680 72 74 73 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20  rts of.  ** the 
2d690 63 6f 64 65 29 2e 20 41 6e 64 2c 20 65 76 65 6e  code). And, even
2d6a0 20 69 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 69   if it is not, i
2d6b0 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20  t should not be 
2d6c0 74 6f 6f 20 6d 75 63 68 20 73 6c 6f 77 65 72 2e  too much slower.
2d6d0 20 0a 20 20 2a 2a 20 4f 6e 20 74 68 65 20 6f 74   .  ** On the ot
2d6e0 68 65 72 20 68 61 6e 64 2c 20 74 68 65 20 65 78  her hand, the ex
2d6f0 74 72 61 20 73 65 65 6b 73 20 63 6f 75 6c 64 20  tra seeks could 
2d700 65 6e 64 20 75 70 20 62 65 69 6e 67 20 73 69 67  end up being sig
2d710 6e 69 66 69 63 61 6e 74 6c 79 0a 20 20 2a 2a 20  nificantly.  ** 
2d720 6d 6f 72 65 20 65 78 70 65 6e 73 69 76 65 2e 20  more expensive. 
2d730 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 34 32   */.  assert( 42
2d740 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  ==sqlite3LogEst(
2d750 31 38 29 20 29 3b 0a 20 20 69 66 28 20 73 61 76  18) );.  if( sav
2d760 65 64 5f 6e 45 71 3d 3d 73 61 76 65 64 5f 6e 53  ed_nEq==saved_nS
2d770 6b 69 70 0a 20 20 20 26 26 20 73 61 76 65 64 5f  kip.   && saved_
2d780 6e 45 71 2b 31 3c 70 50 72 6f 62 65 2d 3e 6e 4b  nEq+1<pProbe->nK
2d790 65 79 43 6f 6c 0a 20 20 20 26 26 20 70 50 72 6f  eyCol.   && pPro
2d7a0 62 65 2d 3e 6e 6f 53 6b 69 70 53 63 61 6e 3d 3d  be->noSkipScan==
2d7b0 30 0a 20 20 20 26 26 20 70 50 72 6f 62 65 2d 3e  0.   && pProbe->
2d7c0 61 69 52 6f 77 4c 6f 67 45 73 74 5b 73 61 76 65  aiRowLogEst[save
2d7d0 64 5f 6e 45 71 2b 31 5d 3e 3d 34 32 20 20 2f 2a  d_nEq+1]>=42  /*
2d7e0 20 54 55 4e 49 4e 47 3a 20 4d 69 6e 69 6d 75 6d   TUNING: Minimum
2d7f0 20 66 6f 72 20 73 6b 69 70 2d 73 63 61 6e 20 2a   for skip-scan *
2d800 2f 0a 20 20 20 26 26 20 28 72 63 20 3d 20 77 68  /.   && (rc = wh
2d810 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62  ereLoopResize(db
2d820 2c 20 70 4e 65 77 2c 20 70 4e 65 77 2d 3e 6e 4c  , pNew, pNew->nL
2d830 54 65 72 6d 2b 31 29 29 3d 3d 53 51 4c 49 54 45  Term+1))==SQLITE
2d840 5f 4f 4b 0a 20 20 29 7b 0a 20 20 20 20 4c 6f 67  _OK.  ){.    Log
2d850 45 73 74 20 6e 49 74 65 72 3b 0a 20 20 20 20 70  Est nIter;.    p
2d860 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
2d870 2b 2b 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 53  ++;.    pNew->nS
2d880 6b 69 70 2b 2b 3b 0a 20 20 20 20 70 4e 65 77 2d  kip++;.    pNew-
2d890 3e 61 4c 54 65 72 6d 5b 70 4e 65 77 2d 3e 6e 4c  >aLTerm[pNew->nL
2d8a0 54 65 72 6d 2b 2b 5d 20 3d 20 30 3b 0a 20 20 20  Term++] = 0;.   
2d8b0 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c   pNew->wsFlags |
2d8c0 3d 20 57 48 45 52 45 5f 53 4b 49 50 53 43 41 4e  = WHERE_SKIPSCAN
2d8d0 3b 0a 20 20 20 20 6e 49 74 65 72 20 3d 20 70 50  ;.    nIter = pP
2d8e0 72 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73  robe->aiRowLogEs
2d8f0 74 5b 73 61 76 65 64 5f 6e 45 71 5d 20 2d 20 70  t[saved_nEq] - p
2d900 50 72 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45  Probe->aiRowLogE
2d910 73 74 5b 73 61 76 65 64 5f 6e 45 71 2b 31 5d 3b  st[saved_nEq+1];
2d920 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20  .    pNew->nOut 
2d930 2d 3d 20 6e 49 74 65 72 3b 0a 20 20 20 20 2f 2a  -= nIter;.    /*
2d940 20 54 55 4e 49 4e 47 3a 20 20 42 65 63 61 75 73   TUNING:  Becaus
2d950 65 20 75 6e 63 65 72 74 61 69 6e 74 69 65 73 20  e uncertainties 
2d960 69 6e 20 74 68 65 20 65 73 74 69 6d 61 74 65 73  in the estimates
2d970 20 66 6f 72 20 73 6b 69 70 2d 73 63 61 6e 20 71   for skip-scan q
2d980 75 65 72 69 65 73 2c 0a 20 20 20 20 2a 2a 20 61  ueries,.    ** a
2d990 64 64 20 61 20 31 2e 33 37 35 20 66 75 64 67 65  dd a 1.375 fudge
2d9a0 20 66 61 63 74 6f 72 20 74 6f 20 6d 61 6b 65 20   factor to make 
2d9b0 73 6b 69 70 2d 73 63 61 6e 20 73 6c 69 67 68 74  skip-scan slight
2d9c0 6c 79 20 6c 65 73 73 20 6c 69 6b 65 6c 79 2e 20  ly less likely. 
2d9d0 2a 2f 0a 20 20 20 20 6e 49 74 65 72 20 2b 3d 20  */.    nIter += 
2d9e0 35 3b 0a 20 20 20 20 77 68 65 72 65 4c 6f 6f 70  5;.    whereLoop
2d9f0 41 64 64 42 74 72 65 65 49 6e 64 65 78 28 70 42  AddBtreeIndex(pB
2da00 75 69 6c 64 65 72 2c 20 70 53 72 63 2c 20 70 50  uilder, pSrc, pP
2da10 72 6f 62 65 2c 20 6e 49 74 65 72 20 2b 20 6e 49  robe, nIter + nI
2da20 6e 4d 75 6c 29 3b 0a 20 20 20 20 70 4e 65 77 2d  nMul);.    pNew-
2da30 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e 4f  >nOut = saved_nO
2da40 75 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e  ut;.    pNew->u.
2da50 62 74 72 65 65 2e 6e 45 71 20 3d 20 73 61 76 65  btree.nEq = save
2da60 64 5f 6e 45 71 3b 0a 20 20 20 20 70 4e 65 77 2d  d_nEq;.    pNew-
2da70 3e 6e 53 6b 69 70 20 3d 20 73 61 76 65 64 5f 6e  >nSkip = saved_n
2da80 53 6b 69 70 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  Skip;.    pNew->
2da90 77 73 46 6c 61 67 73 20 3d 20 73 61 76 65 64 5f  wsFlags = saved_
2daa0 77 73 46 6c 61 67 73 3b 0a 20 20 7d 0a 0a 20 20  wsFlags;.  }..  
2dab0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2dac0 0a 2a 2a 20 52 65 74 75 72 6e 20 54 72 75 65 20  .** Return True 
2dad0 69 66 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c  if it is possibl
2dae0 65 20 74 68 61 74 20 70 49 6e 64 65 78 20 6d 69  e that pIndex mi
2daf0 67 68 74 20 62 65 20 75 73 65 66 75 6c 20 69 6e  ght be useful in
2db00 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67  .** implementing
2db10 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
2db20 61 75 73 65 20 69 6e 20 70 42 75 69 6c 64 65 72  ause in pBuilder
2db30 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 46  ..**.** Return F
2db40 61 6c 73 65 20 69 66 20 70 42 75 69 6c 64 65 72  alse if pBuilder
2db50 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69   does not contai
2db60 6e 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  n an ORDER BY cl
2db70 61 75 73 65 20 6f 72 0a 2a 2a 20 69 66 20 74 68  ause or.** if th
2db80 65 72 65 20 69 73 20 6e 6f 20 77 61 79 20 66 6f  ere is no way fo
2db90 72 20 70 49 6e 64 65 78 20 74 6f 20 62 65 20 75  r pIndex to be u
2dba0 73 65 66 75 6c 20 69 6e 20 69 6d 70 6c 65 6d 65  seful in impleme
2dbb0 6e 74 69 6e 67 20 74 68 61 74 0a 2a 2a 20 4f 52  nting that.** OR
2dbc0 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 0a 2a  DER BY clause..*
2dbd0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 64  /.static int ind
2dbe0 65 78 4d 69 67 68 74 48 65 6c 70 57 69 74 68 4f  exMightHelpWithO
2dbf0 72 64 65 72 42 79 28 0a 20 20 57 68 65 72 65 4c  rderBy(.  WhereL
2dc00 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69  oopBuilder *pBui
2dc10 6c 64 65 72 2c 0a 20 20 49 6e 64 65 78 20 2a 70  lder,.  Index *p
2dc20 49 6e 64 65 78 2c 0a 20 20 69 6e 74 20 69 43 75  Index,.  int iCu
2dc30 72 73 6f 72 0a 29 7b 0a 20 20 45 78 70 72 4c 69  rsor.){.  ExprLi
2dc40 73 74 20 2a 70 4f 42 3b 0a 20 20 69 6e 74 20 69  st *pOB;.  int i
2dc50 69 2c 20 6a 6a 3b 0a 0a 20 20 69 66 28 20 70 49  i, jj;..  if( pI
2dc60 6e 64 65 78 2d 3e 62 55 6e 6f 72 64 65 72 65 64  ndex->bUnordered
2dc70 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
2dc80 66 28 20 28 70 4f 42 20 3d 20 70 42 75 69 6c 64  f( (pOB = pBuild
2dc90 65 72 2d 3e 70 57 49 6e 66 6f 2d 3e 70 4f 72 64  er->pWInfo->pOrd
2dca0 65 72 42 79 29 3d 3d 30 20 29 20 72 65 74 75 72  erBy)==0 ) retur
2dcb0 6e 20 30 3b 0a 20 20 66 6f 72 28 69 69 3d 30 3b  n 0;.  for(ii=0;
2dcc0 20 69 69 3c 70 4f 42 2d 3e 6e 45 78 70 72 3b 20   ii<pOB->nExpr; 
2dcd0 69 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20  ii++){.    Expr 
2dce0 2a 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  *pExpr = sqlite3
2dcf0 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28  ExprSkipCollate(
2dd00 70 4f 42 2d 3e 61 5b 69 69 5d 2e 70 45 78 70 72  pOB->a[ii].pExpr
2dd10 29 3b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72  );.    if( pExpr
2dd20 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op!=TK_COLUMN 
2dd30 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
2dd40 69 66 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  if( pExpr->iTabl
2dd50 65 3d 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20 20  e==iCursor ){.  
2dd60 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69      if( pExpr->i
2dd70 43 6f 6c 75 6d 6e 3c 30 20 29 20 72 65 74 75 72  Column<0 ) retur
2dd80 6e 20 31 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  n 1;.      for(j
2dd90 6a 3d 30 3b 20 6a 6a 3c 70 49 6e 64 65 78 2d 3e  j=0; jj<pIndex->
2dda0 6e 4b 65 79 43 6f 6c 3b 20 6a 6a 2b 2b 29 7b 0a  nKeyCol; jj++){.
2ddb0 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78 70          if( pExp
2ddc0 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 49 6e 64  r->iColumn==pInd
2ddd0 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 6a 5d  ex->aiColumn[jj]
2dde0 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20   ) return 1;.   
2ddf0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
2de00 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
2de10 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 62 69 74  .** Return a bit
2de20 6d 61 73 6b 20 77 68 65 72 65 20 31 73 20 69 6e  mask where 1s in
2de30 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65 20  dicate that the 
2de40 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 63 6f  corresponding co
2de50 6c 75 6d 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 74  lumn of.** the t
2de60 61 62 6c 65 20 69 73 20 75 73 65 64 20 62 79 20  able is used by 
2de70 61 6e 20 69 6e 64 65 78 2e 20 20 4f 6e 6c 79 20  an index.  Only 
2de80 74 68 65 20 66 69 72 73 74 20 36 33 20 63 6f 6c  the first 63 col
2de90 75 6d 6e 73 20 61 72 65 20 63 6f 6e 73 69 64 65  umns are conside
2dea0 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42  red..*/.static B
2deb0 69 74 6d 61 73 6b 20 63 6f 6c 75 6d 6e 73 49 6e  itmask columnsIn
2dec0 49 6e 64 65 78 28 49 6e 64 65 78 20 2a 70 49 64  Index(Index *pId
2ded0 78 29 7b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 20  x){.  Bitmask m 
2dee0 3d 20 30 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20  = 0;.  int j;.  
2def0 66 6f 72 28 6a 3d 70 49 64 78 2d 3e 6e 43 6f 6c  for(j=pIdx->nCol
2df00 75 6d 6e 2d 31 3b 20 6a 3e 3d 30 3b 20 6a 2d 2d  umn-1; j>=0; j--
2df10 29 7b 0a 20 20 20 20 69 6e 74 20 78 20 3d 20 70  ){.    int x = p
2df20 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d  Idx->aiColumn[j]
2df30 3b 0a 20 20 20 20 69 66 28 20 78 3e 3d 30 20 29  ;.    if( x>=0 )
2df40 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
2df50 28 20 78 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20  ( x==BMS-1 );.  
2df60 20 20 20 20 74 65 73 74 63 61 73 65 28 20 78 3d      testcase( x=
2df70 3d 42 4d 53 2d 32 20 29 3b 0a 20 20 20 20 20 20  =BMS-2 );.      
2df80 69 66 28 20 78 3c 42 4d 53 2d 31 20 29 20 6d 20  if( x<BMS-1 ) m 
2df90 7c 3d 20 4d 41 53 4b 42 49 54 28 78 29 3b 0a 20  |= MASKBIT(x);. 
2dfa0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
2dfb0 6e 20 6d 3b 0a 7d 0a 0a 2f 2a 20 43 68 65 63 6b  n m;.}../* Check
2dfc0 20 74 6f 20 73 65 65 20 69 66 20 61 20 70 61 72   to see if a par
2dfd0 74 69 61 6c 20 69 6e 64 65 78 20 77 69 74 68 20  tial index with 
2dfe0 70 50 61 72 74 49 6e 64 65 78 57 68 65 72 65 20  pPartIndexWhere 
2dff0 63 61 6e 20 62 65 20 75 73 65 64 0a 2a 2a 20 69  can be used.** i
2e000 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 71 75  n the current qu
2e010 65 72 79 2e 20 20 52 65 74 75 72 6e 20 74 72 75  ery.  Return tru
2e020 65 20 69 66 20 69 74 20 63 61 6e 20 62 65 20 61  e if it can be a
2e030 6e 64 20 66 61 6c 73 65 20 69 66 20 6e 6f 74 2e  nd false if not.
2e040 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
2e050 68 65 72 65 55 73 61 62 6c 65 50 61 72 74 69 61  hereUsablePartia
2e060 6c 49 6e 64 65 78 28 69 6e 74 20 69 54 61 62 2c  lIndex(int iTab,
2e070 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
2e080 43 2c 20 45 78 70 72 20 2a 70 57 68 65 72 65 29  C, Expr *pWhere)
2e090 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 57 68 65  {.  int i;.  Whe
2e0a0 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20  reTerm *pTerm;. 
2e0b0 20 66 6f 72 28 69 3d 30 2c 20 70 54 65 72 6d 3d   for(i=0, pTerm=
2e0c0 70 57 43 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e  pWC->a; i<pWC->n
2e0d0 54 65 72 6d 3b 20 69 2b 2b 2c 20 70 54 65 72 6d  Term; i++, pTerm
2e0e0 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
2e0f0 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45  Expr = pTerm->pE
2e100 78 70 72 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  xpr;.    if( sql
2e110 69 74 65 33 45 78 70 72 49 6d 70 6c 69 65 73 45  ite3ExprImpliesE
2e120 78 70 72 28 70 45 78 70 72 2c 20 70 57 68 65 72  xpr(pExpr, pWher
2e130 65 2c 20 69 54 61 62 29 20 0a 20 20 20 20 20 26  e, iTab) .     &
2e140 26 20 28 21 45 78 70 72 48 61 73 50 72 6f 70 65  & (!ExprHasPrope
2e150 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46 72  rty(pExpr, EP_Fr
2e160 6f 6d 4a 6f 69 6e 29 20 7c 7c 20 70 45 78 70 72  omJoin) || pExpr
2e170 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c  ->iRightJoinTabl
2e180 65 3d 3d 69 54 61 62 29 0a 20 20 20 20 29 7b 0a  e==iTab).    ){.
2e190 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
2e1a0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
2e1b0 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  rn 0;.}../*.** A
2e1c0 64 64 20 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70  dd all WhereLoop
2e1d0 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 61 20 73   objects for a s
2e1e0 69 6e 67 6c 65 20 74 61 62 6c 65 20 6f 66 20 74  ingle table of t
2e1f0 68 65 20 6a 6f 69 6e 20 77 68 65 72 65 20 74 68  he join where th
2e200 65 20 74 61 62 6c 65 0a 2a 2a 20 69 73 20 69 64  e table.** is id
2e210 65 6e 66 69 65 64 20 62 79 20 70 42 75 69 6c 64  enfied by pBuild
2e220 65 72 2d 3e 70 4e 65 77 2d 3e 69 54 61 62 2e 20  er->pNew->iTab. 
2e230 20 54 68 61 74 20 74 61 62 6c 65 20 69 73 20 67   That table is g
2e240 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 0a  uaranteed to be.
2e250 2a 2a 20 61 20 62 2d 74 72 65 65 20 74 61 62 6c  ** a b-tree tabl
2e260 65 2c 20 6e 6f 74 20 61 20 76 69 72 74 75 61 6c  e, not a virtual
2e270 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68   table..**.** Th
2e280 65 20 63 6f 73 74 73 20 28 57 68 65 72 65 4c 6f  e costs (WhereLo
2e290 6f 70 2e 72 52 75 6e 29 20 6f 66 20 74 68 65 20  op.rRun) of the 
2e2a0 62 2d 74 72 65 65 20 6c 6f 6f 70 73 20 61 64 64  b-tree loops add
2e2b0 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
2e2c0 69 6f 6e 0a 2a 2a 20 61 72 65 20 63 61 6c 63 75  ion.** are calcu
2e2d0 6c 61 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73  lated as follows
2e2e0 3a 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 66 75  :.**.** For a fu
2e2f0 6c 6c 20 73 63 61 6e 2c 20 61 73 73 75 6d 69 6e  ll scan, assumin
2e300 67 20 74 68 65 20 74 61 62 6c 65 20 28 6f 72 20  g the table (or 
2e310 69 6e 64 65 78 29 20 63 6f 6e 74 61 69 6e 73 20  index) contains 
2e320 6e 52 6f 77 20 72 6f 77 73 3a 0a 2a 2a 0a 2a 2a  nRow rows:.**.**
2e330 20 20 20 20 20 63 6f 73 74 20 3d 20 6e 52 6f 77       cost = nRow
2e340 20 2a 20 33 2e 30 20 20 20 20 20 20 20 20 20 20   * 3.0          
2e350 20 20 20 20 20 20 20 20 20 20 2f 2f 20 66 75 6c            // ful
2e360 6c 2d 74 61 62 6c 65 20 73 63 61 6e 0a 2a 2a 20  l-table scan.** 
2e370 20 20 20 20 63 6f 73 74 20 3d 20 6e 52 6f 77 20      cost = nRow 
2e380 2a 20 4b 20 20 20 20 20 20 20 20 20 20 20 20 20  * K             
2e390 20 20 20 20 20 20 20 20 20 2f 2f 20 73 63 61 6e           // scan
2e3a0 20 6f 66 20 63 6f 76 65 72 69 6e 67 20 69 6e 64   of covering ind
2e3b0 65 78 0a 2a 2a 20 20 20 20 20 63 6f 73 74 20 3d  ex.**     cost =
2e3c0 20 6e 52 6f 77 20 2a 20 28 4b 2b 33 2e 30 29 20   nRow * (K+3.0) 
2e3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2e3e0 2f 20 73 63 61 6e 20 6f 66 20 6e 6f 6e 2d 63 6f  / scan of non-co
2e3f0 76 65 72 69 6e 67 20 69 6e 64 65 78 0a 2a 2a 0a  vering index.**.
2e400 2a 2a 20 77 68 65 72 65 20 4b 20 69 73 20 61 20  ** where K is a 
2e410 76 61 6c 75 65 20 62 65 74 77 65 65 6e 20 31 2e  value between 1.
2e420 31 20 61 6e 64 20 33 2e 30 20 73 65 74 20 62 61  1 and 3.0 set ba
2e430 73 65 64 20 6f 6e 20 74 68 65 20 72 65 6c 61 74  sed on the relat
2e440 69 76 65 20 0a 2a 2a 20 65 73 74 69 6d 61 74 65  ive .** estimate
2e450 64 20 61 76 65 72 61 67 65 20 73 69 7a 65 20 6f  d average size o
2e460 66 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20  f the index and 
2e470 74 61 62 6c 65 20 72 65 63 6f 72 64 73 2e 0a 2a  table records..*
2e480 2a 0a 2a 2a 20 46 6f 72 20 61 6e 20 69 6e 64 65  *.** For an inde
2e490 78 20 73 63 61 6e 2c 20 77 68 65 72 65 20 6e 56  x scan, where nV
2e4a0 69 73 69 74 20 69 73 20 74 68 65 20 6e 75 6d 62  isit is the numb
2e4b0 65 72 20 6f 66 20 69 6e 64 65 78 20 72 6f 77 73  er of index rows
2e4c0 20 76 69 73 69 74 65 64 0a 2a 2a 20 62 79 20 74   visited.** by t
2e4d0 68 65 20 73 63 61 6e 2c 20 61 6e 64 20 6e 53 65  he scan, and nSe
2e4e0 65 6b 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  ek is the number
2e4f0 20 6f 66 20 73 65 65 6b 20 6f 70 65 72 61 74 69   of seek operati
2e500 6f 6e 73 20 72 65 71 75 69 72 65 64 20 6f 6e 20  ons required on 
2e510 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 62 2d  .** the index b-
2e520 74 72 65 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  tree:.**.**     
2e530 63 6f 73 74 20 3d 20 6e 53 65 65 6b 20 2a 20 28  cost = nSeek * (
2e540 6c 6f 67 28 6e 52 6f 77 29 20 2b 20 4b 20 2a 20  log(nRow) + K * 
2e550 6e 56 69 73 69 74 29 20 20 20 20 20 20 20 20 20  nVisit)         
2e560 20 2f 2f 20 63 6f 76 65 72 69 6e 67 20 69 6e 64   // covering ind
2e570 65 78 0a 2a 2a 20 20 20 20 20 63 6f 73 74 20 3d  ex.**     cost =
2e580 20 6e 53 65 65 6b 20 2a 20 28 6c 6f 67 28 6e 52   nSeek * (log(nR
2e590 6f 77 29 20 2b 20 28 4b 2b 33 2e 30 29 20 2a 20  ow) + (K+3.0) * 
2e5a0 6e 56 69 73 69 74 29 20 20 20 20 2f 2f 20 6e 6f  nVisit)    // no
2e5b0 6e 2d 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78  n-covering index
2e5c0 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c  .**.** Normally,
2e5d0 20 6e 53 65 65 6b 20 69 73 20 31 2e 20 6e 53 65   nSeek is 1. nSe
2e5e0 65 6b 20 76 61 6c 75 65 73 20 67 72 65 61 74 65  ek values greate
2e5f0 72 20 74 68 61 6e 20 31 20 63 6f 6d 65 20 61 62  r than 1 come ab
2e600 6f 75 74 20 69 66 20 74 68 65 20 0a 2a 2a 20 57  out if the .** W
2e610 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e 63 6c  HERE clause incl
2e620 75 64 65 73 20 22 78 20 49 4e 20 28 2e 2e 2e 2e  udes "x IN (....
2e630 29 22 20 74 65 72 6d 73 20 75 73 65 64 20 69 6e  )" terms used in
2e640 20 70 6c 61 63 65 20 6f 66 20 22 78 3d 3f 22 2e   place of "x=?".
2e650 20 4f 72 20 77 68 65 6e 20 0a 2a 2a 20 69 6d 70   Or when .** imp
2e660 6c 69 63 69 74 20 22 78 20 49 4e 20 28 53 45 4c  licit "x IN (SEL
2e670 45 43 54 20 78 20 46 52 4f 4d 20 74 62 6c 29 22  ECT x FROM tbl)"
2e680 20 74 65 72 6d 73 20 61 72 65 20 61 64 64 65 64   terms are added
2e690 20 66 6f 72 20 73 6b 69 70 2d 73 63 61 6e 73 2e   for skip-scans.
2e6a0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 73 74 69 6d  .**.** The estim
2e6b0 61 74 65 64 20 76 61 6c 75 65 73 20 28 6e 52 6f  ated values (nRo
2e6c0 77 2c 20 6e 56 69 73 69 74 2c 20 6e 53 65 65 6b  w, nVisit, nSeek
2e6d0 29 20 6f 66 74 65 6e 20 63 6f 6e 74 61 69 6e 20  ) often contain 
2e6e0 61 20 6c 61 72 67 65 20 61 6d 6f 75 6e 74 0a 2a  a large amount.*
2e6f0 2a 20 6f 66 20 75 6e 63 65 72 74 61 69 6e 74 79  * of uncertainty
2e700 2e 20 20 46 6f 72 20 74 68 69 73 20 72 65 61 73  .  For this reas
2e710 6f 6e 2c 20 73 63 6f 72 69 6e 67 20 69 73 20 64  on, scoring is d
2e720 65 73 69 67 6e 65 64 20 74 6f 20 70 69 63 6b 20  esigned to pick 
2e730 70 6c 61 6e 73 20 74 68 61 74 0a 2a 2a 20 22 64  plans that.** "d
2e740 6f 20 74 68 65 20 6c 65 61 73 74 20 68 61 72 6d  o the least harm
2e750 22 20 69 66 20 74 68 65 20 65 73 74 69 6d 61 74  " if the estimat
2e760 65 73 20 61 72 65 20 69 6e 61 63 63 75 72 61 74  es are inaccurat
2e770 65 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  e.  For example,
2e780 20 61 0a 2a 2a 20 6c 6f 67 28 6e 52 6f 77 29 20   a.** log(nRow) 
2e790 66 61 63 74 6f 72 20 69 73 20 6f 6d 69 74 74 65  factor is omitte
2e7a0 64 20 66 72 6f 6d 20 61 20 6e 6f 6e 2d 63 6f 76  d from a non-cov
2e7b0 65 72 69 6e 67 20 69 6e 64 65 78 20 73 63 61 6e  ering index scan
2e7c0 20 69 6e 20 6f 72 64 65 72 20 74 6f 0a 2a 2a 20   in order to.** 
2e7d0 62 69 61 73 20 74 68 65 20 73 63 6f 72 69 6e 67  bias the scoring
2e7e0 20 69 6e 20 66 61 76 6f 72 20 6f 66 20 75 73 69   in favor of usi
2e7f0 6e 67 20 61 6e 20 69 6e 64 65 78 2c 20 73 69 6e  ng an index, sin
2e800 63 65 20 74 68 65 20 77 6f 72 73 74 2d 63 61 73  ce the worst-cas
2e810 65 0a 2a 2a 20 70 65 72 66 6f 72 6d 61 6e 63 65  e.** performance
2e820 20 6f 66 20 75 73 69 6e 67 20 61 6e 20 69 6e 64   of using an ind
2e830 65 78 20 69 73 20 66 61 72 20 62 65 74 74 65 72  ex is far better
2e840 20 74 68 61 6e 20 74 68 65 20 77 6f 72 73 74 2d   than the worst-
2e850 63 61 73 65 20 70 65 72 66 6f 72 6d 61 6e 63 65  case performance
2e860 0a 2a 2a 20 6f 66 20 61 20 66 75 6c 6c 20 74 61  .** of a full ta
2e870 62 6c 65 20 73 63 61 6e 2e 0a 2a 2f 0a 73 74 61  ble scan..*/.sta
2e880 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f  tic int whereLoo
2e890 70 41 64 64 42 74 72 65 65 28 0a 20 20 57 68 65  pAddBtree(.  Whe
2e8a0 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70  reLoopBuilder *p
2e8b0 42 75 69 6c 64 65 72 2c 20 2f 2a 20 57 48 45 52  Builder, /* WHER
2e8c0 45 20 63 6c 61 75 73 65 20 69 6e 66 6f 72 6d 61  E clause informa
2e8d0 74 69 6f 6e 20 2a 2f 0a 20 20 42 69 74 6d 61 73  tion */.  Bitmas
2e8e0 6b 20 6d 45 78 74 72 61 20 20 20 20 20 20 20 20  k mExtra        
2e8f0 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 70        /* Extra p
2e900 72 65 72 65 71 75 65 73 69 74 65 73 20 66 6f 72  rerequesites for
2e910 20 75 73 69 6e 67 20 74 68 69 73 20 74 61 62 6c   using this tabl
2e920 65 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 49  e */.){.  WhereI
2e930 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20  nfo *pWInfo;    
2e940 20 20 20 20 20 20 2f 2a 20 57 48 45 52 45 20 61        /* WHERE a
2e950 6e 61 6c 79 73 69 73 20 63 6f 6e 74 65 78 74 20  nalysis context 
2e960 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 50 72 6f  */.  Index *pPro
2e970 62 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  be;             
2e980 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 77 65 20   /* An index we 
2e990 61 72 65 20 65 76 61 6c 75 61 74 69 6e 67 20 2a  are evaluating *
2e9a0 2f 0a 20 20 49 6e 64 65 78 20 73 50 6b 3b 20 20  /.  Index sPk;  
2e9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e9c0 2f 2a 20 41 20 66 61 6b 65 20 69 6e 64 65 78 20  /* A fake index 
2e9d0 6f 62 6a 65 63 74 20 66 6f 72 20 74 68 65 20 70  object for the p
2e9e0 72 69 6d 61 72 79 20 6b 65 79 20 2a 2f 0a 20 20  rimary key */.  
2e9f0 4c 6f 67 45 73 74 20 61 69 52 6f 77 45 73 74 50  LogEst aiRowEstP
2ea00 6b 5b 32 5d 3b 20 20 20 20 20 20 20 2f 2a 20 54  k[2];       /* T
2ea10 68 65 20 61 69 52 6f 77 4c 6f 67 45 73 74 5b 5d  he aiRowLogEst[]
2ea20 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 73   value for the s
2ea30 50 6b 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 31  Pk index */.  i1
2ea40 36 20 61 69 43 6f 6c 75 6d 6e 50 6b 20 3d 20 2d  6 aiColumnPk = -
2ea50 31 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  1;        /* The
2ea60 20 61 43 6f 6c 75 6d 6e 5b 5d 20 76 61 6c 75 65   aColumn[] value
2ea70 20 66 6f 72 20 74 68 65 20 73 50 6b 20 69 6e 64   for the sPk ind
2ea80 65 78 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  ex */.  SrcList 
2ea90 2a 70 54 61 62 4c 69 73 74 3b 20 20 20 20 20 20  *pTabList;      
2eaa0 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20      /* The FROM 
2eab0 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75  clause */.  stru
2eac0 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
2ead0 2a 70 53 72 63 3b 20 20 2f 2a 20 54 68 65 20 46  *pSrc;  /* The F
2eae0 52 4f 4d 20 63 6c 61 75 73 65 20 62 74 72 65 65  ROM clause btree
2eaf0 20 74 65 72 6d 20 74 6f 20 61 64 64 20 2a 2f 0a   term to add */.
2eb00 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65    WhereLoop *pNe
2eb10 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  w;            /*
2eb20 20 54 65 6d 70 6c 61 74 65 20 57 68 65 72 65 4c   Template WhereL
2eb30 6f 6f 70 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  oop object */.  
2eb40 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
2eb50 4f 4b 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52  OK;         /* R
2eb60 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
2eb70 69 6e 74 20 69 53 6f 72 74 49 64 78 20 3d 20 31  int iSortIdx = 1
2eb80 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ;           /* I
2eb90 6e 64 65 78 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  ndex number */. 
2eba0 20 69 6e 74 20 62 3b 20 20 20 20 20 20 20 20 20   int b;         
2ebb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2ebc0 41 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 20  A boolean value 
2ebd0 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 72 53 69 7a  */.  LogEst rSiz
2ebe0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
2ebf0 20 2f 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f   /* number of ro
2ec00 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  ws in the table 
2ec10 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 72 4c 6f 67  */.  LogEst rLog
2ec20 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
2ec30 20 2f 2a 20 4c 6f 67 61 72 69 74 68 6d 20 6f 66   /* Logarithm of
2ec40 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
2ec50 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65  ows in the table
2ec60 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
2ec70 65 20 2a 70 57 43 3b 20 20 20 20 20 20 20 20 20  e *pWC;         
2ec80 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 64 20    /* The parsed 
2ec90 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
2eca0 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20    Table *pTab;  
2ecb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2ecc0 20 54 61 62 6c 65 20 62 65 69 6e 67 20 71 75 65   Table being que
2ecd0 72 69 65 64 20 2a 2f 0a 20 20 0a 20 20 70 4e 65  ried */.  .  pNe
2ece0 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e  w = pBuilder->pN
2ecf0 65 77 3b 0a 20 20 70 57 49 6e 66 6f 20 3d 20 70  ew;.  pWInfo = p
2ed00 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b  Builder->pWInfo;
2ed10 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 57  .  pTabList = pW
2ed20 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 3b 0a  Info->pTabList;.
2ed30 20 20 70 53 72 63 20 3d 20 70 54 61 62 4c 69 73    pSrc = pTabLis
2ed40 74 2d 3e 61 20 2b 20 70 4e 65 77 2d 3e 69 54 61  t->a + pNew->iTa
2ed50 62 3b 0a 20 20 70 54 61 62 20 3d 20 70 53 72 63  b;.  pTab = pSrc
2ed60 2d 3e 70 54 61 62 3b 0a 20 20 70 57 43 20 3d 20  ->pTab;.  pWC = 
2ed70 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 3b 0a 20  pBuilder->pWC;. 
2ed80 20 61 73 73 65 72 74 28 20 21 49 73 56 69 72 74   assert( !IsVirt
2ed90 75 61 6c 28 70 53 72 63 2d 3e 70 54 61 62 29 20  ual(pSrc->pTab) 
2eda0 29 3b 0a 0a 20 20 69 66 28 20 70 53 72 63 2d 3e  );..  if( pSrc->
2edb0 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 2f 2a  pIndex ){.    /*
2edc0 20 41 6e 20 49 4e 44 45 58 45 44 20 42 59 20 63   An INDEXED BY c
2edd0 6c 61 75 73 65 20 73 70 65 63 69 66 69 65 73 20  lause specifies 
2ede0 61 20 70 61 72 74 69 63 75 6c 61 72 20 69 6e 64  a particular ind
2edf0 65 78 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20 20  ex to use */.   
2ee00 20 70 50 72 6f 62 65 20 3d 20 70 53 72 63 2d 3e   pProbe = pSrc->
2ee10 70 49 6e 64 65 78 3b 0a 20 20 7d 65 6c 73 65 20  pIndex;.  }else 
2ee20 69 66 28 20 21 48 61 73 52 6f 77 69 64 28 70 54  if( !HasRowid(pT
2ee30 61 62 29 20 29 7b 0a 20 20 20 20 70 50 72 6f 62  ab) ){.    pProb
2ee40 65 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65 78  e = pTab->pIndex
2ee50 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
2ee60 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 20 49 4e  * There is no IN
2ee70 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 2e  DEXED BY clause.
2ee80 20 20 43 72 65 61 74 65 20 61 20 66 61 6b 65 20    Create a fake 
2ee90 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 69 6e 20  Index object in 
2eea0 6c 6f 63 61 6c 0a 20 20 20 20 2a 2a 20 76 61 72  local.    ** var
2eeb0 69 61 62 6c 65 20 73 50 6b 20 74 6f 20 72 65 70  iable sPk to rep
2eec0 72 65 73 65 6e 74 20 74 68 65 20 72 6f 77 69 64  resent the rowid
2eed0 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69 6e 64   primary key ind
2eee0 65 78 2e 20 20 4d 61 6b 65 20 74 68 69 73 0a 20  ex.  Make this. 
2eef0 20 20 20 2a 2a 20 66 61 6b 65 20 69 6e 64 65 78     ** fake index
2ef00 20 74 68 65 20 66 69 72 73 74 20 69 6e 20 61 20   the first in a 
2ef10 63 68 61 69 6e 20 6f 66 20 49 6e 64 65 78 20 6f  chain of Index o
2ef20 62 6a 65 63 74 73 20 77 69 74 68 20 61 6c 6c 20  bjects with all 
2ef30 6f 66 20 74 68 65 20 72 65 61 6c 0a 20 20 20 20  of the real.    
2ef40 2a 2a 20 69 6e 64 69 63 65 73 20 74 6f 20 66 6f  ** indices to fo
2ef50 6c 6c 6f 77 20 2a 2f 0a 20 20 20 20 49 6e 64 65  llow */.    Inde
2ef60 78 20 2a 70 46 69 72 73 74 3b 20 20 20 20 20 20  x *pFirst;      
2ef70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
2ef80 69 72 73 74 20 6f 66 20 72 65 61 6c 20 69 6e 64  irst of real ind
2ef90 69 63 65 73 20 6f 6e 20 74 68 65 20 74 61 62 6c  ices on the tabl
2efa0 65 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28  e */.    memset(
2efb0 26 73 50 6b 2c 20 30 2c 20 73 69 7a 65 6f 66 28  &sPk, 0, sizeof(
2efc0 49 6e 64 65 78 29 29 3b 0a 20 20 20 20 73 50 6b  Index));.    sPk
2efd0 2e 6e 4b 65 79 43 6f 6c 20 3d 20 31 3b 0a 20 20  .nKeyCol = 1;.  
2efe0 20 20 73 50 6b 2e 6e 43 6f 6c 75 6d 6e 20 3d 20    sPk.nColumn = 
2eff0 31 3b 0a 20 20 20 20 73 50 6b 2e 61 69 43 6f 6c  1;.    sPk.aiCol
2f000 75 6d 6e 20 3d 20 26 61 69 43 6f 6c 75 6d 6e 50  umn = &aiColumnP
2f010 6b 3b 0a 20 20 20 20 73 50 6b 2e 61 69 52 6f 77  k;.    sPk.aiRow
2f020 4c 6f 67 45 73 74 20 3d 20 61 69 52 6f 77 45 73  LogEst = aiRowEs
2f030 74 50 6b 3b 0a 20 20 20 20 73 50 6b 2e 6f 6e 45  tPk;.    sPk.onE
2f040 72 72 6f 72 20 3d 20 4f 45 5f 52 65 70 6c 61 63  rror = OE_Replac
2f050 65 3b 0a 20 20 20 20 73 50 6b 2e 70 54 61 62 6c  e;.    sPk.pTabl
2f060 65 20 3d 20 70 54 61 62 3b 0a 20 20 20 20 73 50  e = pTab;.    sP
2f070 6b 2e 73 7a 49 64 78 52 6f 77 20 3d 20 70 54 61  k.szIdxRow = pTa
2f080 62 2d 3e 73 7a 54 61 62 52 6f 77 3b 0a 20 20 20  b->szTabRow;.   
2f090 20 61 69 52 6f 77 45 73 74 50 6b 5b 30 5d 20 3d   aiRowEstPk[0] =
2f0a0 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73   pTab->nRowLogEs
2f0b0 74 3b 0a 20 20 20 20 61 69 52 6f 77 45 73 74 50  t;.    aiRowEstP
2f0c0 6b 5b 31 5d 20 3d 20 30 3b 0a 20 20 20 20 70 46  k[1] = 0;.    pF
2f0d0 69 72 73 74 20 3d 20 70 53 72 63 2d 3e 70 54 61  irst = pSrc->pTa
2f0e0 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 69  b->pIndex;.    i
2f0f0 66 28 20 70 53 72 63 2d 3e 6e 6f 74 49 6e 64 65  f( pSrc->notInde
2f100 78 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  xed==0 ){.      
2f110 2f 2a 20 54 68 65 20 72 65 61 6c 20 69 6e 64 69  /* The real indi
2f120 63 65 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ces of the table
2f130 20 61 72 65 20 6f 6e 6c 79 20 63 6f 6e 73 69 64   are only consid
2f140 65 72 65 64 20 69 66 20 74 68 65 0a 20 20 20 20  ered if the.    
2f150 20 20 2a 2a 20 4e 4f 54 20 49 4e 44 45 58 45 44    ** NOT INDEXED
2f160 20 71 75 61 6c 69 66 69 65 72 20 69 73 20 6f 6d   qualifier is om
2f170 69 74 74 65 64 20 66 72 6f 6d 20 74 68 65 20 46  itted from the F
2f180 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ROM clause */.  
2f190 20 20 20 20 73 50 6b 2e 70 4e 65 78 74 20 3d 20      sPk.pNext = 
2f1a0 70 46 69 72 73 74 3b 0a 20 20 20 20 7d 0a 20 20  pFirst;.    }.  
2f1b0 20 20 70 50 72 6f 62 65 20 3d 20 26 73 50 6b 3b    pProbe = &sPk;
2f1c0 0a 20 20 7d 0a 20 20 72 53 69 7a 65 20 3d 20 70  .  }.  rSize = p
2f1d0 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 3b  Tab->nRowLogEst;
2f1e0 0a 20 20 72 4c 6f 67 53 69 7a 65 20 3d 20 65 73  .  rLogSize = es
2f1f0 74 4c 6f 67 28 72 53 69 7a 65 29 3b 0a 0a 23 69  tLog(rSize);..#i
2f200 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2f210 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45  T_AUTOMATIC_INDE
2f220 58 0a 20 20 2f 2a 20 41 75 74 6f 6d 61 74 69 63  X.  /* Automatic
2f230 20 69 6e 64 65 78 65 73 20 2a 2f 0a 20 20 69 66   indexes */.  if
2f240 28 20 21 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72  ( !pBuilder->pOr
2f250 53 65 74 0a 20 20 20 26 26 20 28 70 57 49 6e 66  Set.   && (pWInf
2f260 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20  o->wctrlFlags & 
2f270 57 48 45 52 45 5f 4e 4f 5f 41 55 54 4f 49 4e 44  WHERE_NO_AUTOIND
2f280 45 58 29 3d 3d 30 0a 20 20 20 26 26 20 28 70 57  EX)==0.   && (pW
2f290 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62  Info->pParse->db
2f2a0 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
2f2b0 5f 41 75 74 6f 49 6e 64 65 78 29 21 3d 30 0a 20  _AutoIndex)!=0. 
2f2c0 20 20 26 26 20 70 53 72 63 2d 3e 70 49 6e 64 65    && pSrc->pInde
2f2d0 78 3d 3d 30 0a 20 20 20 26 26 20 21 70 53 72 63  x==0.   && !pSrc
2f2e0 2d 3e 76 69 61 43 6f 72 6f 75 74 69 6e 65 0a 20  ->viaCoroutine. 
2f2f0 20 20 26 26 20 21 70 53 72 63 2d 3e 6e 6f 74 49    && !pSrc->notI
2f300 6e 64 65 78 65 64 0a 20 20 20 26 26 20 48 61 73  ndexed.   && Has
2f310 52 6f 77 69 64 28 70 54 61 62 29 0a 20 20 20 26  Rowid(pTab).   &
2f320 26 20 21 70 53 72 63 2d 3e 69 73 43 6f 72 72 65  & !pSrc->isCorre
2f330 6c 61 74 65 64 0a 20 20 20 26 26 20 21 70 53 72  lated.   && !pSr
2f340 63 2d 3e 69 73 52 65 63 75 72 73 69 76 65 0a 20  c->isRecursive. 
2f350 20 29 7b 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72   ){.    /* Gener
2f360 61 74 65 20 61 75 74 6f 2d 69 6e 64 65 78 20 57  ate auto-index W
2f370 68 65 72 65 4c 6f 6f 70 73 20 2a 2f 0a 20 20 20  hereLoops */.   
2f380 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
2f390 6d 3b 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d  m;.    WhereTerm
2f3a0 20 2a 70 57 43 45 6e 64 20 3d 20 70 57 43 2d 3e   *pWCEnd = pWC->
2f3b0 61 20 2b 20 70 57 43 2d 3e 6e 54 65 72 6d 3b 0a  a + pWC->nTerm;.
2f3c0 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57      for(pTerm=pW
2f3d0 43 2d 3e 61 3b 20 72 63 3d 3d 53 51 4c 49 54 45  C->a; rc==SQLITE
2f3e0 5f 4f 4b 20 26 26 20 70 54 65 72 6d 3c 70 57 43  _OK && pTerm<pWC
2f3f0 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20  End; pTerm++){. 
2f400 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e       if( pTerm->
2f410 70 72 65 72 65 71 52 69 67 68 74 20 26 20 70 4e  prereqRight & pN
2f420 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 20 29 20 63  ew->maskSelf ) c
2f430 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69  ontinue;.      i
2f440 66 28 20 74 65 72 6d 43 61 6e 44 72 69 76 65 49  f( termCanDriveI
2f450 6e 64 65 78 28 70 54 65 72 6d 2c 20 70 53 72 63  ndex(pTerm, pSrc
2f460 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  , 0) ){.        
2f470 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  pNew->u.btree.nE
2f480 71 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70  q = 1;.        p
2f490 4e 65 77 2d 3e 6e 53 6b 69 70 20 3d 20 30 3b 0a  New->nSkip = 0;.
2f4a0 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e          pNew->u.
2f4b0 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 30  btree.pIndex = 0
2f4c0 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
2f4d0 6e 4c 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20  nLTerm = 1;.    
2f4e0 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d      pNew->aLTerm
2f4f0 5b 30 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20  [0] = pTerm;.   
2f500 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20       /* TUNING: 
2f510 4f 6e 65 2d 74 69 6d 65 20 63 6f 73 74 20 66 6f  One-time cost fo
2f520 72 20 63 6f 6d 70 75 74 69 6e 67 20 74 68 65 20  r computing the 
2f530 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20  automatic index 
2f540 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 73  is.        ** es
2f550 74 69 6d 61 74 65 64 20 74 6f 20 62 65 20 58 2a  timated to be X*
2f560 4e 2a 6c 6f 67 32 28 4e 29 20 77 68 65 72 65 20  N*log2(N) where 
2f570 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  N is the number 
2f580 6f 66 20 72 6f 77 73 20 69 6e 0a 20 20 20 20 20  of rows in.     
2f590 20 20 20 2a 2a 20 74 68 65 20 74 61 62 6c 65 20     ** the table 
2f5a0 62 65 69 6e 67 20 69 6e 64 65 78 65 64 20 61 6e  being indexed an
2f5b0 64 20 77 68 65 72 65 20 58 20 69 73 20 37 20 28  d where X is 7 (
2f5c0 4c 6f 67 45 73 74 3d 32 38 29 20 66 6f 72 20 6e  LogEst=28) for n
2f5d0 6f 72 6d 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a  ormal.        **
2f5e0 20 74 61 62 6c 65 73 20 6f 72 20 31 2e 33 37 35   tables or 1.375
2f5f0 20 28 4c 6f 67 45 73 74 3d 34 29 20 66 6f 72 20   (LogEst=4) for 
2f600 76 69 65 77 73 20 61 6e 64 20 73 75 62 71 75 65  views and subque
2f610 72 69 65 73 2e 20 20 54 68 65 20 76 61 6c 75 65  ries.  The value
2f620 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 58  .        ** of X
2f630 20 69 73 20 73 6d 61 6c 6c 65 72 20 66 6f 72 20   is smaller for 
2f640 76 69 65 77 73 20 61 6e 64 20 73 75 62 71 75 65  views and subque
2f650 72 69 65 73 20 73 6f 20 74 68 61 74 20 74 68 65  ries so that the
2f660 20 71 75 65 72 79 20 70 6c 61 6e 6e 65 72 0a 20   query planner. 
2f670 20 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62         ** will b
2f680 65 20 6d 6f 72 65 20 61 67 67 72 65 73 73 69 76  e more aggressiv
2f690 65 20 61 62 6f 75 74 20 67 65 6e 65 72 61 74 69  e about generati
2f6a0 6e 67 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64  ng automatic ind
2f6b0 65 78 65 73 20 66 6f 72 0a 20 20 20 20 20 20 20  exes for.       
2f6c0 20 2a 2a 20 74 68 6f 73 65 20 6f 62 6a 65 63 74   ** those object
2f6d0 73 2c 20 73 69 6e 63 65 20 74 68 65 72 65 20 69  s, since there i
2f6e0 73 20 6e 6f 20 6f 70 70 6f 72 74 75 6e 69 74 79  s no opportunity
2f6f0 20 74 6f 20 61 64 64 20 73 63 68 65 6d 61 0a 20   to add schema. 
2f700 20 20 20 20 20 20 20 2a 2a 20 69 6e 64 65 78 65         ** indexe
2f710 73 20 6f 6e 20 73 75 62 71 75 65 72 69 65 73 20  s on subqueries 
2f720 61 6e 64 20 76 69 65 77 73 2e 20 2a 2f 0a 20 20  and views. */.  
2f730 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 53 65 74        pNew->rSet
2f740 75 70 20 3d 20 72 4c 6f 67 53 69 7a 65 20 2b 20  up = rLogSize + 
2f750 72 53 69 7a 65 20 2b 20 34 3b 0a 20 20 20 20 20  rSize + 4;.     
2f760 20 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65     if( pTab->pSe
2f770 6c 65 63 74 3d 3d 30 20 26 26 20 28 70 54 61 62  lect==0 && (pTab
2f780 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f  ->tabFlags & TF_
2f790 45 70 68 65 6d 65 72 61 6c 29 3d 3d 30 20 29 7b  Ephemeral)==0 ){
2f7a0 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d  .          pNew-
2f7b0 3e 72 53 65 74 75 70 20 2b 3d 20 32 34 3b 0a 20  >rSetup += 24;. 
2f7c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2f7d0 20 41 70 70 6c 79 43 6f 73 74 4d 75 6c 74 69 70   ApplyCostMultip
2f7e0 6c 69 65 72 28 70 4e 65 77 2d 3e 72 53 65 74 75  lier(pNew->rSetu
2f7f0 70 2c 20 70 54 61 62 2d 3e 63 6f 73 74 4d 75 6c  p, pTab->costMul
2f800 74 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54  t);.        /* T
2f810 55 4e 49 4e 47 3a 20 45 61 63 68 20 69 6e 64 65  UNING: Each inde
2f820 78 20 6c 6f 6f 6b 75 70 20 79 69 65 6c 64 73 20  x lookup yields 
2f830 32 30 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74  20 rows in the t
2f840 61 62 6c 65 2e 20 20 54 68 69 73 0a 20 20 20 20  able.  This.    
2f850 20 20 20 20 2a 2a 20 69 73 20 6d 6f 72 65 20 74      ** is more t
2f860 68 61 6e 20 74 68 65 20 75 73 75 61 6c 20 67 75  han the usual gu
2f870 65 73 73 20 6f 66 20 31 30 20 72 6f 77 73 2c 20  ess of 10 rows, 
2f880 73 69 6e 63 65 20 77 65 20 68 61 76 65 20 6e 6f  since we have no
2f890 20 77 61 79 0a 20 20 20 20 20 20 20 20 2a 2a 20   way.        ** 
2f8a0 6f 66 20 6b 6e 6f 77 69 6e 67 20 68 6f 77 20 73  of knowing how s
2f8b0 65 6c 65 63 74 69 76 65 20 74 68 65 20 69 6e 64  elective the ind
2f8c0 65 78 20 77 69 6c 6c 20 75 6c 74 69 6d 61 74 65  ex will ultimate
2f8d0 6c 79 20 62 65 2e 20 20 49 74 20 77 6f 75 6c 64  ly be.  It would
2f8e0 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20  .        ** not 
2f8f0 62 65 20 75 6e 72 65 61 73 6f 6e 61 62 6c 65 20  be unreasonable 
2f900 74 6f 20 6d 61 6b 65 20 74 68 69 73 20 76 61 6c  to make this val
2f910 75 65 20 6d 75 63 68 20 6c 61 72 67 65 72 2e 20  ue much larger. 
2f920 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  */.        pNew-
2f930 3e 6e 4f 75 74 20 3d 20 34 33 3b 20 20 61 73 73  >nOut = 43;  ass
2f940 65 72 74 28 20 34 33 3d 3d 73 71 6c 69 74 65 33  ert( 43==sqlite3
2f950 4c 6f 67 45 73 74 28 32 30 29 20 29 3b 0a 20 20  LogEst(20) );.  
2f960 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e        pNew->rRun
2f970 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
2f980 41 64 64 28 72 4c 6f 67 53 69 7a 65 2c 70 4e 65  Add(rLogSize,pNe
2f990 77 2d 3e 6e 4f 75 74 29 3b 0a 20 20 20 20 20 20  w->nOut);.      
2f9a0 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20    pNew->wsFlags 
2f9b0 3d 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44  = WHERE_AUTO_IND
2f9c0 45 58 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  EX;.        pNew
2f9d0 2d 3e 70 72 65 72 65 71 20 3d 20 6d 45 78 74 72  ->prereq = mExtr
2f9e0 61 20 7c 20 70 54 65 72 6d 2d 3e 70 72 65 72 65  a | pTerm->prere
2f9f0 71 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20  qRight;.        
2fa00 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e  rc = whereLoopIn
2fa10 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70  sert(pBuilder, p
2fa20 4e 65 77 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  New);.      }.  
2fa30 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f    }.  }.#endif /
2fa40 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  * SQLITE_OMIT_AU
2fa50 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 20 2a 2f  TOMATIC_INDEX */
2fa60 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72  ..  /* Loop over
2fa70 20 61 6c 6c 20 69 6e 64 69 63 65 73 0a 20 20 2a   all indices.  *
2fa80 2f 0a 20 20 66 6f 72 28 3b 20 72 63 3d 3d 53 51  /.  for(; rc==SQ
2fa90 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 72 6f 62  LITE_OK && pProb
2faa0 65 3b 20 70 50 72 6f 62 65 3d 70 50 72 6f 62 65  e; pProbe=pProbe
2fab0 2d 3e 70 4e 65 78 74 2c 20 69 53 6f 72 74 49 64  ->pNext, iSortId
2fac0 78 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 50  x++){.    if( pP
2fad0 72 6f 62 65 2d 3e 70 50 61 72 74 49 64 78 57 68  robe->pPartIdxWh
2fae0 65 72 65 21 3d 30 0a 20 20 20 20 20 26 26 20 21  ere!=0.     && !
2faf0 77 68 65 72 65 55 73 61 62 6c 65 50 61 72 74 69  whereUsableParti
2fb00 61 6c 49 6e 64 65 78 28 70 53 72 63 2d 3e 69 43  alIndex(pSrc->iC
2fb10 75 72 73 6f 72 2c 20 70 57 43 2c 20 70 50 72 6f  ursor, pWC, pPro
2fb20 62 65 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72  be->pPartIdxWher
2fb30 65 29 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74  e) ){.      test
2fb40 63 61 73 65 28 20 70 4e 65 77 2d 3e 69 54 61 62  case( pNew->iTab
2fb50 21 3d 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20  !=pSrc->iCursor 
2fb60 29 3b 20 20 2f 2a 20 53 65 65 20 74 69 63 6b 65  );  /* See ticke
2fb70 74 20 5b 39 38 64 39 37 33 62 38 66 35 5d 20 2a  t [98d973b8f5] *
2fb80 2f 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  /.      continue
2fb90 3b 20 20 2f 2a 20 50 61 72 74 69 61 6c 20 69 6e  ;  /* Partial in
2fba0 64 65 78 20 69 6e 61 70 70 72 6f 70 72 69 61 74  dex inappropriat
2fbb0 65 20 66 6f 72 20 74 68 69 73 20 71 75 65 72 79  e for this query
2fbc0 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 72 53   */.    }.    rS
2fbd0 69 7a 65 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69  ize = pProbe->ai
2fbe0 52 6f 77 4c 6f 67 45 73 74 5b 30 5d 3b 0a 20 20  RowLogEst[0];.  
2fbf0 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e    pNew->u.btree.
2fc00 6e 45 71 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65  nEq = 0;.    pNe
2fc10 77 2d 3e 6e 53 6b 69 70 20 3d 20 30 3b 0a 20 20  w->nSkip = 0;.  
2fc20 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d    pNew->nLTerm =
2fc30 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 53   0;.    pNew->iS
2fc40 6f 72 74 49 64 78 20 3d 20 30 3b 0a 20 20 20 20  ortIdx = 0;.    
2fc50 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 30  pNew->rSetup = 0
2fc60 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72  ;.    pNew->prer
2fc70 65 71 20 3d 20 6d 45 78 74 72 61 3b 0a 20 20 20  eq = mExtra;.   
2fc80 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 72 53   pNew->nOut = rS
2fc90 69 7a 65 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75  ize;.    pNew->u
2fca0 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20  .btree.pIndex = 
2fcb0 70 50 72 6f 62 65 3b 0a 20 20 20 20 62 20 3d 20  pProbe;.    b = 
2fcc0 69 6e 64 65 78 4d 69 67 68 74 48 65 6c 70 57 69  indexMightHelpWi
2fcd0 74 68 4f 72 64 65 72 42 79 28 70 42 75 69 6c 64  thOrderBy(pBuild
2fce0 65 72 2c 20 70 50 72 6f 62 65 2c 20 70 53 72 63  er, pProbe, pSrc
2fcf0 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  ->iCursor);.    
2fd00 2f 2a 20 54 68 65 20 4f 4e 45 50 41 53 53 5f 44  /* The ONEPASS_D
2fd10 45 53 49 52 45 44 20 66 6c 61 67 73 20 6e 65 76  ESIRED flags nev
2fd20 65 72 20 6f 63 63 75 72 73 20 74 6f 67 65 74 68  er occurs togeth
2fd30 65 72 20 77 69 74 68 20 4f 52 44 45 52 20 42 59  er with ORDER BY
2fd40 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
2fd50 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c  (pWInfo->wctrlFl
2fd60 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50  ags & WHERE_ONEP
2fd70 41 53 53 5f 44 45 53 49 52 45 44 29 3d 3d 30 20  ASS_DESIRED)==0 
2fd80 7c 7c 20 62 3d 3d 30 20 29 3b 0a 20 20 20 20 69  || b==0 );.    i
2fd90 66 28 20 70 50 72 6f 62 65 2d 3e 74 6e 75 6d 3c  f( pProbe->tnum<
2fda0 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  =0 ){.      /* I
2fdb0 6e 74 65 67 65 72 20 70 72 69 6d 61 72 79 20 6b  nteger primary k
2fdc0 65 79 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20  ey index */.    
2fdd0 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20    pNew->wsFlags 
2fde0 3d 20 57 48 45 52 45 5f 49 50 4b 3b 0a 0a 20 20  = WHERE_IPK;..  
2fdf0 20 20 20 20 2f 2a 20 46 75 6c 6c 20 74 61 62 6c      /* Full tabl
2fe00 65 20 73 63 61 6e 20 2a 2f 0a 20 20 20 20 20 20  e scan */.      
2fe10 70 4e 65 77 2d 3e 69 53 6f 72 74 49 64 78 20 3d  pNew->iSortIdx =
2fe20 20 62 20 3f 20 69 53 6f 72 74 49 64 78 20 3a 20   b ? iSortIdx : 
2fe30 30 3b 0a 20 20 20 20 20 20 2f 2a 20 54 55 4e 49  0;.      /* TUNI
2fe40 4e 47 3a 20 43 6f 73 74 20 6f 66 20 66 75 6c 6c  NG: Cost of full
2fe50 20 74 61 62 6c 65 20 73 63 61 6e 20 69 73 20 28   table scan is (
2fe60 4e 2a 33 2e 30 29 2e 20 2a 2f 0a 20 20 20 20 20  N*3.0). */.     
2fe70 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 72 53   pNew->rRun = rS
2fe80 69 7a 65 20 2b 20 31 36 3b 0a 20 20 20 20 20 20  ize + 16;.      
2fe90 41 70 70 6c 79 43 6f 73 74 4d 75 6c 74 69 70 6c  ApplyCostMultipl
2fea0 69 65 72 28 70 4e 65 77 2d 3e 72 52 75 6e 2c 20  ier(pNew->rRun, 
2feb0 70 54 61 62 2d 3e 63 6f 73 74 4d 75 6c 74 29 3b  pTab->costMult);
2fec0 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70  .      whereLoop
2fed0 4f 75 74 70 75 74 41 64 6a 75 73 74 28 70 57 43  OutputAdjust(pWC
2fee0 2c 20 70 4e 65 77 2c 20 72 53 69 7a 65 29 3b 0a  , pNew, rSize);.
2fef0 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65        rc = where
2ff00 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c  LoopInsert(pBuil
2ff10 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20  der, pNew);.    
2ff20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 72    pNew->nOut = r
2ff30 53 69 7a 65 3b 0a 20 20 20 20 20 20 69 66 28 20  Size;.      if( 
2ff40 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  rc ) break;.    
2ff50 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 42 69 74  }else{.      Bit
2ff60 6d 61 73 6b 20 6d 3b 0a 20 20 20 20 20 20 69 66  mask m;.      if
2ff70 28 20 70 50 72 6f 62 65 2d 3e 69 73 43 6f 76 65  ( pProbe->isCove
2ff80 72 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 20 20  ring ){.        
2ff90 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20  pNew->wsFlags = 
2ffa0 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20 7c  WHERE_IDX_ONLY |
2ffb0 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 3b 0a   WHERE_INDEXED;.
2ffc0 20 20 20 20 20 20 20 20 6d 20 3d 20 30 3b 0a 20          m = 0;. 
2ffd0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2ffe0 20 20 20 20 6d 20 3d 20 70 53 72 63 2d 3e 63 6f      m = pSrc->co
2fff0 6c 55 73 65 64 20 26 20 7e 63 6f 6c 75 6d 6e 73  lUsed & ~columns
30000 49 6e 49 6e 64 65 78 28 70 50 72 6f 62 65 29 3b  InIndex(pProbe);
30010 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 77  .        pNew->w
30020 73 46 6c 61 67 73 20 3d 20 28 6d 3d 3d 30 29 20  sFlags = (m==0) 
30030 3f 20 28 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c  ? (WHERE_IDX_ONL
30040 59 7c 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29  Y|WHERE_INDEXED)
30050 20 3a 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44   : WHERE_INDEXED
30060 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
30070 20 2f 2a 20 46 75 6c 6c 20 73 63 61 6e 20 76 69   /* Full scan vi
30080 61 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20  a index */.     
30090 20 69 66 28 20 62 0a 20 20 20 20 20 20 20 7c 7c   if( b.       ||
300a0 20 21 48 61 73 52 6f 77 69 64 28 70 54 61 62 29   !HasRowid(pTab)
300b0 0a 20 20 20 20 20 20 20 7c 7c 20 28 20 6d 3d 3d  .       || ( m==
300c0 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 50  0.         && pP
300d0 72 6f 62 65 2d 3e 62 55 6e 6f 72 64 65 72 65 64  robe->bUnordered
300e0 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20  ==0.         && 
300f0 28 70 50 72 6f 62 65 2d 3e 73 7a 49 64 78 52 6f  (pProbe->szIdxRo
30100 77 3c 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77  w<pTab->szTabRow
30110 29 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 70  ).         && (p
30120 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67  WInfo->wctrlFlag
30130 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53  s & WHERE_ONEPAS
30140 53 5f 44 45 53 49 52 45 44 29 3d 3d 30 0a 20 20  S_DESIRED)==0.  
30150 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65         && sqlite
30160 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 55  3GlobalConfig.bU
30170 73 65 43 69 73 0a 20 20 20 20 20 20 20 20 20 26  seCis.         &
30180 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e  & OptimizationEn
30190 61 62 6c 65 64 28 70 57 49 6e 66 6f 2d 3e 70 50  abled(pWInfo->pP
301a0 61 72 73 65 2d 3e 64 62 2c 20 53 51 4c 49 54 45  arse->db, SQLITE
301b0 5f 43 6f 76 65 72 49 64 78 53 63 61 6e 29 0a 20  _CoverIdxScan). 
301c0 20 20 20 20 20 20 20 20 20 29 0a 20 20 20 20 20           ).     
301d0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77   ){.        pNew
301e0 2d 3e 69 53 6f 72 74 49 64 78 20 3d 20 62 20 3f  ->iSortIdx = b ?
301f0 20 69 53 6f 72 74 49 64 78 20 3a 20 30 3b 0a 0a   iSortIdx : 0;..
30200 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
30210 6f 73 74 20 6f 66 20 76 69 73 69 74 69 6e 67 20  ost of visiting 
30220 74 68 65 20 69 6e 64 65 78 20 72 6f 77 73 20 69  the index rows i
30230 73 20 4e 2a 4b 2c 20 77 68 65 72 65 20 4b 20 69  s N*K, where K i
30240 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 65 74  s.        ** bet
30250 77 65 65 6e 20 31 2e 31 20 61 6e 64 20 33 2e 30  ween 1.1 and 3.0
30260 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74  , depending on t
30270 68 65 20 72 65 6c 61 74 69 76 65 20 73 69 7a 65  he relative size
30280 73 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20  s of the.       
30290 20 2a 2a 20 69 6e 64 65 78 20 61 6e 64 20 74 61   ** index and ta
302a0 62 6c 65 20 72 6f 77 73 2e 20 49 66 20 74 68 69  ble rows. If thi
302b0 73 20 69 73 20 61 20 6e 6f 6e 2d 63 6f 76 65 72  s is a non-cover
302c0 69 6e 67 20 69 6e 64 65 78 20 73 63 61 6e 2c 0a  ing index scan,.
302d0 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 73 6f 20          ** also 
302e0 61 64 64 20 74 68 65 20 63 6f 73 74 20 6f 66 20  add the cost of 
302f0 76 69 73 69 74 69 6e 67 20 74 61 62 6c 65 20 72  visiting table r
30300 6f 77 73 20 28 4e 2a 33 2e 30 29 2e 20 20 2a 2f  ows (N*3.0).  */
30310 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72  .        pNew->r
30320 52 75 6e 20 3d 20 72 53 69 7a 65 20 2b 20 31 20  Run = rSize + 1 
30330 2b 20 28 31 35 2a 70 50 72 6f 62 65 2d 3e 73 7a  + (15*pProbe->sz
30340 49 64 78 52 6f 77 29 2f 70 54 61 62 2d 3e 73 7a  IdxRow)/pTab->sz
30350 54 61 62 52 6f 77 3b 0a 20 20 20 20 20 20 20 20  TabRow;.        
30360 69 66 28 20 6d 21 3d 30 20 29 7b 0a 20 20 20 20  if( m!=0 ){.    
30370 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e        pNew->rRun
30380 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
30390 41 64 64 28 70 4e 65 77 2d 3e 72 52 75 6e 2c 20  Add(pNew->rRun, 
303a0 72 53 69 7a 65 2b 31 36 29 3b 0a 20 20 20 20 20  rSize+16);.     
303b0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 41 70 70     }.        App
303c0 6c 79 43 6f 73 74 4d 75 6c 74 69 70 6c 69 65 72  lyCostMultiplier
303d0 28 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 70 54 61  (pNew->rRun, pTa
303e0 62 2d 3e 63 6f 73 74 4d 75 6c 74 29 3b 0a 20 20  b->costMult);.  
303f0 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 4f        whereLoopO
30400 75 74 70 75 74 41 64 6a 75 73 74 28 70 57 43 2c  utputAdjust(pWC,
30410 20 70 4e 65 77 2c 20 72 53 69 7a 65 29 3b 0a 20   pNew, rSize);. 
30420 20 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72         rc = wher
30430 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69  eLoopInsert(pBui
30440 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20  lder, pNew);.   
30450 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20       pNew->nOut 
30460 3d 20 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20  = rSize;.       
30470 20 69 66 28 20 72 63 20 29 20 62 72 65 61 6b 3b   if( rc ) break;
30480 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
30490 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f      rc = whereLo
304a0 6f 70 41 64 64 42 74 72 65 65 49 6e 64 65 78 28  opAddBtreeIndex(
304b0 70 42 75 69 6c 64 65 72 2c 20 70 53 72 63 2c 20  pBuilder, pSrc, 
304c0 70 50 72 6f 62 65 2c 20 30 29 3b 0a 23 69 66 64  pProbe, 0);.#ifd
304d0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
304e0 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a  _STAT3_OR_STAT4.
304f0 20 20 20 20 73 71 6c 69 74 65 33 53 74 61 74 34      sqlite3Stat4
30500 50 72 6f 62 65 46 72 65 65 28 70 42 75 69 6c 64  ProbeFree(pBuild
30510 65 72 2d 3e 70 52 65 63 29 3b 0a 20 20 20 20 70  er->pRec);.    p
30520 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c  Builder->nRecVal
30530 69 64 20 3d 20 30 3b 0a 20 20 20 20 70 42 75 69  id = 0;.    pBui
30540 6c 64 65 72 2d 3e 70 52 65 63 20 3d 20 30 3b 0a  lder->pRec = 0;.
30550 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49  #endif..    /* I
30560 66 20 74 68 65 72 65 20 77 61 73 20 61 6e 20 49  f there was an I
30570 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65  NDEXED BY clause
30580 2c 20 74 68 65 6e 20 6f 6e 6c 79 20 74 68 61 74  , then only that
30590 20 6f 6e 65 20 69 6e 64 65 78 20 69 73 0a 20 20   one index is.  
305a0 20 20 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 2e    ** considered.
305b0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 72 63   */.    if( pSrc
305c0 2d 3e 70 49 6e 64 65 78 20 29 20 62 72 65 61 6b  ->pIndex ) break
305d0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
305e0 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  c;.}..#ifndef SQ
305f0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
30600 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 41 64 64  LTABLE./*.** Add
30610 20 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 20 6f   all WhereLoop o
30620 62 6a 65 63 74 73 20 66 6f 72 20 61 20 74 61 62  bjects for a tab
30630 6c 65 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 69  le of the join i
30640 64 65 6e 74 69 66 69 65 64 20 62 79 0a 2a 2a 20  dentified by.** 
30650 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e  pBuilder->pNew->
30660 69 54 61 62 2e 20 20 54 68 61 74 20 74 61 62 6c  iTab.  That tabl
30670 65 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  e is guaranteed 
30680 74 6f 20 62 65 20 61 20 76 69 72 74 75 61 6c 20  to be a virtual 
30690 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  table..*/.static
306a0 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64   int whereLoopAd
306b0 64 56 69 72 74 75 61 6c 28 0a 20 20 57 68 65 72  dVirtual(.  Wher
306c0 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42  eLoopBuilder *pB
306d0 75 69 6c 64 65 72 2c 20 20 2f 2a 20 57 48 45 52  uilder,  /* WHER
306e0 45 20 63 6c 61 75 73 65 20 69 6e 66 6f 72 6d 61  E clause informa
306f0 74 69 6f 6e 20 2a 2f 0a 20 20 42 69 74 6d 61 73  tion */.  Bitmas
30700 6b 20 6d 45 78 74 72 61 0a 29 7b 0a 20 20 57 68  k mExtra.){.  Wh
30710 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b  ereInfo *pWInfo;
30720 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 48             /* WH
30730 45 52 45 20 61 6e 61 6c 79 73 69 73 20 63 6f 6e  ERE analysis con
30740 74 65 78 74 20 2a 2f 0a 20 20 50 61 72 73 65 20  text */.  Parse 
30750 2a 70 50 61 72 73 65 3b 20 20 20 20 20 20 20 20  *pParse;        
30760 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
30770 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
30780 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
30790 70 57 43 3b 20 20 20 20 20 20 20 20 20 20 20 20  pWC;            
307a0 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
307b0 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  use */.  struct 
307c0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53  SrcList_item *pS
307d0 72 63 3b 20 20 20 2f 2a 20 54 68 65 20 46 52 4f  rc;   /* The FRO
307e0 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74 6f  M clause term to
307f0 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 54 61 62   search */.  Tab
30800 6c 65 20 2a 70 54 61 62 3b 0a 20 20 73 71 6c 69  le *pTab;.  sqli
30810 74 65 33 20 2a 64 62 3b 0a 20 20 73 71 6c 69 74  te3 *db;.  sqlit
30820 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70  e3_index_info *p
30830 49 64 78 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63  IdxInfo;.  struc
30840 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  t sqlite3_index_
30850 63 6f 6e 73 74 72 61 69 6e 74 20 2a 70 49 64 78  constraint *pIdx
30860 43 6f 6e 73 3b 0a 20 20 73 74 72 75 63 74 20 73  Cons;.  struct s
30870 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e  qlite3_index_con
30880 73 74 72 61 69 6e 74 5f 75 73 61 67 65 20 2a 70  straint_usage *p
30890 55 73 61 67 65 3b 0a 20 20 57 68 65 72 65 54 65  Usage;.  WhereTe
308a0 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 69 6e 74  rm *pTerm;.  int
308b0 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 69 54 65   i, j;.  int iTe
308c0 72 6d 2c 20 6d 78 54 65 72 6d 3b 0a 20 20 69 6e  rm, mxTerm;.  in
308d0 74 20 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20  t nConstraint;. 
308e0 20 69 6e 74 20 73 65 65 6e 49 6e 20 3d 20 30 3b   int seenIn = 0;
308f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
30900 20 54 72 75 65 20 69 66 20 61 6e 20 49 4e 20 6f   True if an IN o
30910 70 65 72 61 74 6f 72 20 69 73 20 73 65 65 6e 20  perator is seen 
30920 2a 2f 0a 20 20 69 6e 74 20 73 65 65 6e 56 61 72  */.  int seenVar
30930 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
30940 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 6e    /* True if a n
30950 6f 6e 2d 63 6f 6e 73 74 61 6e 74 20 63 6f 6e 73  on-constant cons
30960 74 72 61 69 6e 74 20 69 73 20 73 65 65 6e 20 2a  traint is seen *
30970 2f 0a 20 20 69 6e 74 20 69 50 68 61 73 65 3b 20  /.  int iPhase; 
30980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30990 20 2f 2a 20 30 3a 20 63 6f 6e 73 74 20 77 2f 6f   /* 0: const w/o
309a0 20 49 4e 2c 20 31 3a 20 63 6f 6e 73 74 2c 20 32   IN, 1: const, 2
309b0 3a 20 6e 6f 20 49 4e 2c 20 20 32 3a 20 49 4e 20  : no IN,  2: IN 
309c0 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  */.  WhereLoop *
309d0 70 4e 65 77 3b 0a 20 20 69 6e 74 20 72 63 20 3d  pNew;.  int rc =
309e0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 70   SQLITE_OK;..  p
309f0 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72  WInfo = pBuilder
30a00 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 70 50 61 72  ->pWInfo;.  pPar
30a10 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61  se = pWInfo->pPa
30a20 72 73 65 3b 0a 20 20 64 62 20 3d 20 70 50 61 72  rse;.  db = pPar
30a30 73 65 2d 3e 64 62 3b 0a 20 20 70 57 43 20 3d 20  se->db;.  pWC = 
30a40 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 3b 0a 20  pBuilder->pWC;. 
30a50 20 70 4e 65 77 20 3d 20 70 42 75 69 6c 64 65 72   pNew = pBuilder
30a60 2d 3e 70 4e 65 77 3b 0a 20 20 70 53 72 63 20 3d  ->pNew;.  pSrc =
30a70 20 26 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69   &pWInfo->pTabLi
30a80 73 74 2d 3e 61 5b 70 4e 65 77 2d 3e 69 54 61 62  st->a[pNew->iTab
30a90 5d 3b 0a 20 20 70 54 61 62 20 3d 20 70 53 72 63  ];.  pTab = pSrc
30aa0 2d 3e 70 54 61 62 3b 0a 20 20 61 73 73 65 72 74  ->pTab;.  assert
30ab0 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  ( IsVirtual(pTab
30ac0 29 20 29 3b 0a 20 20 70 49 64 78 49 6e 66 6f 20  ) );.  pIdxInfo 
30ad0 3d 20 61 6c 6c 6f 63 61 74 65 49 6e 64 65 78 49  = allocateIndexI
30ae0 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 57 43 2c  nfo(pParse, pWC,
30af0 20 70 53 72 63 2c 20 70 42 75 69 6c 64 65 72 2d   pSrc, pBuilder-
30b00 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 69 66  >pOrderBy);.  if
30b10 28 20 70 49 64 78 49 6e 66 6f 3d 3d 30 20 29 20  ( pIdxInfo==0 ) 
30b20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
30b30 4d 45 4d 3b 0a 20 20 70 4e 65 77 2d 3e 70 72 65  MEM;.  pNew->pre
30b40 72 65 71 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d  req = 0;.  pNew-
30b50 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a 20 20 70  >rSetup = 0;.  p
30b60 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57  New->wsFlags = W
30b70 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c  HERE_VIRTUALTABL
30b80 45 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72  E;.  pNew->nLTer
30b90 6d 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 75  m = 0;.  pNew->u
30ba0 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3d  .vtab.needFree =
30bb0 20 30 3b 0a 20 20 70 55 73 61 67 65 20 3d 20 70   0;.  pUsage = p
30bc0 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72  IdxInfo->aConstr
30bd0 61 69 6e 74 55 73 61 67 65 3b 0a 20 20 6e 43 6f  aintUsage;.  nCo
30be0 6e 73 74 72 61 69 6e 74 20 3d 20 70 49 64 78 49  nstraint = pIdxI
30bf0 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74  nfo->nConstraint
30c00 3b 0a 20 20 69 66 28 20 77 68 65 72 65 4c 6f 6f  ;.  if( whereLoo
30c10 70 52 65 73 69 7a 65 28 64 62 2c 20 70 4e 65 77  pResize(db, pNew
30c20 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74 29 20 29  , nConstraint) )
30c30 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  {.    sqlite3DbF
30c40 72 65 65 28 64 62 2c 20 70 49 64 78 49 6e 66 6f  ree(db, pIdxInfo
30c50 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
30c60 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
30c70 0a 20 20 66 6f 72 28 69 50 68 61 73 65 3d 30 3b  .  for(iPhase=0;
30c80 20 69 50 68 61 73 65 3c 3d 33 3b 20 69 50 68 61   iPhase<=3; iPha
30c90 73 65 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 21  se++){.    if( !
30ca0 73 65 65 6e 49 6e 20 26 26 20 28 69 50 68 61 73  seenIn && (iPhas
30cb0 65 26 31 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  e&1)!=0 ){.     
30cc0 20 69 50 68 61 73 65 2b 2b 3b 0a 20 20 20 20 20   iPhase++;.     
30cd0 20 69 66 28 20 69 50 68 61 73 65 3e 33 20 29 20   if( iPhase>3 ) 
30ce0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
30cf0 20 69 66 28 20 21 73 65 65 6e 56 61 72 20 26 26   if( !seenVar &&
30d00 20 69 50 68 61 73 65 3e 31 20 29 20 62 72 65 61   iPhase>1 ) brea
30d10 6b 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 20  k;.    pIdxCons 
30d20 3d 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74  = *(struct sqlit
30d30 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61  e3_index_constra
30d40 69 6e 74 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d  int**)&pIdxInfo-
30d50 3e 61 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20  >aConstraint;.  
30d60 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64    for(i=0; i<pId
30d70 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69  xInfo->nConstrai
30d80 6e 74 3b 20 69 2b 2b 2c 20 70 49 64 78 43 6f 6e  nt; i++, pIdxCon
30d90 73 2b 2b 29 7b 0a 20 20 20 20 20 20 6a 20 3d 20  s++){.      j = 
30da0 70 49 64 78 43 6f 6e 73 2d 3e 69 54 65 72 6d 4f  pIdxCons->iTermO
30db0 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70 54 65  ffset;.      pTe
30dc0 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 6a 5d 3b  rm = &pWC->a[j];
30dd0 0a 20 20 20 20 20 20 73 77 69 74 63 68 28 20 69  .      switch( i
30de0 50 68 61 73 65 20 29 7b 0a 20 20 20 20 20 20 20  Phase ){.       
30df0 20 63 61 73 65 20 30 3a 20 20 20 20 2f 2a 20 43   case 0:    /* C
30e00 6f 6e 73 74 61 6e 74 73 20 77 69 74 68 6f 75 74  onstants without
30e10 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a   IN operator */.
30e20 20 20 20 20 20 20 20 20 20 20 70 49 64 78 43 6f            pIdxCo
30e30 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20 30 3b 0a  ns->usable = 0;.
30e40 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70            if( (p
30e50 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
30e60 26 20 57 4f 5f 49 4e 29 21 3d 30 20 29 7b 0a 20  & WO_IN)!=0 ){. 
30e70 20 20 20 20 20 20 20 20 20 20 20 73 65 65 6e 49             seenI
30e80 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  n = 1;.         
30e90 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
30ea0 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69   pTerm->prereqRi
30eb0 67 68 74 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ght!=0 ){.      
30ec0 20 20 20 20 20 20 73 65 65 6e 56 61 72 20 3d 20        seenVar = 
30ed0 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  1;.          }el
30ee0 73 65 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65  se if( (pTerm->e
30ef0 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e  Operator & WO_IN
30f00 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
30f10 20 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73      pIdxCons->us
30f20 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  able = 1;.      
30f30 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
30f40 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63  break;.        c
30f50 61 73 65 20 31 3a 20 20 20 20 2f 2a 20 43 6f 6e  ase 1:    /* Con
30f60 73 74 61 6e 74 73 20 77 69 74 68 20 49 4e 20 6f  stants with IN o
30f70 70 65 72 61 74 6f 72 73 20 2a 2f 0a 20 20 20 20  perators */.    
30f80 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 65        assert( se
30f90 65 6e 49 6e 20 29 3b 0a 20 20 20 20 20 20 20 20  enIn );.        
30fa0 20 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62    pIdxCons->usab
30fb0 6c 65 20 3d 20 28 70 54 65 72 6d 2d 3e 70 72 65  le = (pTerm->pre
30fc0 72 65 71 52 69 67 68 74 3d 3d 30 29 3b 0a 20 20  reqRight==0);.  
30fd0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
30fe0 20 20 20 20 20 20 20 63 61 73 65 20 32 3a 20 20         case 2:  
30ff0 20 20 2f 2a 20 56 61 72 69 61 62 6c 65 73 20 77    /* Variables w
31000 69 74 68 6f 75 74 20 49 4e 20 2a 2f 0a 20 20 20  ithout IN */.   
31010 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73         assert( s
31020 65 65 6e 56 61 72 20 29 3b 0a 20 20 20 20 20 20  eenVar );.      
31030 20 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73      pIdxCons->us
31040 61 62 6c 65 20 3d 20 28 70 54 65 72 6d 2d 3e 65  able = (pTerm->e
31050 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e  Operator & WO_IN
31060 29 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20 20 20  )==0;.          
31070 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 64  break;.        d
31080 65 66 61 75 6c 74 3a 20 20 20 2f 2a 20 56 61 72  efault:   /* Var
31090 69 61 62 6c 65 73 20 77 69 74 68 20 49 4e 20 2a  iables with IN *
310a0 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  /.          asse
310b0 72 74 28 20 73 65 65 6e 56 61 72 20 26 26 20 73  rt( seenVar && s
310c0 65 65 6e 49 6e 20 29 3b 0a 20 20 20 20 20 20 20  eenIn );.       
310d0 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61     pIdxCons->usa
310e0 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ble = 1;.       
310f0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
31100 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73  }.    }.    mems
31110 65 74 28 70 55 73 61 67 65 2c 20 30 2c 20 73 69  et(pUsage, 0, si
31120 7a 65 6f 66 28 70 55 73 61 67 65 5b 30 5d 29 2a  zeof(pUsage[0])*
31130 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74  pIdxInfo->nConst
31140 72 61 69 6e 74 29 3b 0a 20 20 20 20 69 66 28 20  raint);.    if( 
31150 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f  pIdxInfo->needTo
31160 46 72 65 65 49 64 78 53 74 72 20 29 20 73 71 6c  FreeIdxStr ) sql
31170 69 74 65 33 5f 66 72 65 65 28 70 49 64 78 49 6e  ite3_free(pIdxIn
31180 66 6f 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20 20  fo->idxStr);.   
31190 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74   pIdxInfo->idxSt
311a0 72 20 3d 20 30 3b 0a 20 20 20 20 70 49 64 78 49  r = 0;.    pIdxI
311b0 6e 66 6f 2d 3e 69 64 78 4e 75 6d 20 3d 20 30 3b  nfo->idxNum = 0;
311c0 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6e  .    pIdxInfo->n
311d0 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 20  eedToFreeIdxStr 
311e0 3d 20 30 3b 0a 20 20 20 20 70 49 64 78 49 6e 66  = 0;.    pIdxInf
311f0 6f 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d  o->orderByConsum
31200 65 64 20 3d 20 30 3b 0a 20 20 20 20 70 49 64 78  ed = 0;.    pIdx
31210 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43  Info->estimatedC
31220 6f 73 74 20 3d 20 53 51 4c 49 54 45 5f 42 49 47  ost = SQLITE_BIG
31230 5f 44 42 4c 20 2f 20 28 64 6f 75 62 6c 65 29 32  _DBL / (double)2
31240 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e  ;.    pIdxInfo->
31250 65 73 74 69 6d 61 74 65 64 52 6f 77 73 20 3d 20  estimatedRows = 
31260 32 35 3b 0a 20 20 20 20 72 63 20 3d 20 76 74 61  25;.    rc = vta
31270 62 42 65 73 74 49 6e 64 65 78 28 70 50 61 72 73  bBestIndex(pPars
31280 65 2c 20 70 54 61 62 2c 20 70 49 64 78 49 6e 66  e, pTab, pIdxInf
31290 6f 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  o);.    if( rc )
312a0 20 67 6f 74 6f 20 77 68 65 72 65 4c 6f 6f 70 41   goto whereLoopA
312b0 64 64 56 74 61 62 5f 65 78 69 74 3b 0a 20 20 20  ddVtab_exit;.   
312c0 20 70 49 64 78 43 6f 6e 73 20 3d 20 2a 28 73 74   pIdxCons = *(st
312d0 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
312e0 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 2a 29  ex_constraint**)
312f0 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73  &pIdxInfo->aCons
31300 74 72 61 69 6e 74 3b 0a 20 20 20 20 70 4e 65 77  traint;.    pNew
31310 2d 3e 70 72 65 72 65 71 20 3d 20 6d 45 78 74 72  ->prereq = mExtr
31320 61 3b 0a 20 20 20 20 6d 78 54 65 72 6d 20 3d 20  a;.    mxTerm = 
31330 2d 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  -1;.    assert( 
31340 70 4e 65 77 2d 3e 6e 4c 53 6c 6f 74 3e 3d 6e 43  pNew->nLSlot>=nC
31350 6f 6e 73 74 72 61 69 6e 74 20 29 3b 0a 20 20 20  onstraint );.   
31360 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6e   for(i=0; i<nCon
31370 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29 20 70 4e  straint; i++) pN
31380 65 77 2d 3e 61 4c 54 65 72 6d 5b 69 5d 20 3d 20  ew->aLTerm[i] = 
31390 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76  0;.    pNew->u.v
313a0 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 20 3d 20 30  tab.omitMask = 0
313b0 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
313c0 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b  <nConstraint; i+
313d0 2b 2c 20 70 49 64 78 43 6f 6e 73 2b 2b 29 7b 0a  +, pIdxCons++){.
313e0 20 20 20 20 20 20 69 66 28 20 28 69 54 65 72 6d        if( (iTerm
313f0 20 3d 20 70 55 73 61 67 65 5b 69 5d 2e 61 72 67   = pUsage[i].arg
31400 76 49 6e 64 65 78 20 2d 20 31 29 3e 3d 30 20 29  vIndex - 1)>=0 )
31410 7b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 70 49  {.        j = pI
31420 64 78 43 6f 6e 73 2d 3e 69 54 65 72 6d 4f 66 66  dxCons->iTermOff
31430 73 65 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28  set;.        if(
31440 20 69 54 65 72 6d 3e 3d 6e 43 6f 6e 73 74 72 61   iTerm>=nConstra
31450 69 6e 74 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  int.         || 
31460 6a 3c 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  j<0.         || 
31470 6a 3e 3d 70 57 43 2d 3e 6e 54 65 72 6d 0a 20 20  j>=pWC->nTerm.  
31480 20 20 20 20 20 20 20 7c 7c 20 70 4e 65 77 2d 3e         || pNew->
31490 61 4c 54 65 72 6d 5b 69 54 65 72 6d 5d 21 3d 30  aLTerm[iTerm]!=0
314a0 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
314b0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
314c0 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20  E_ERROR;.       
314d0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
314e0 73 67 28 70 50 61 72 73 65 2c 20 22 25 73 2e 78  sg(pParse, "%s.x
314f0 42 65 73 74 49 6e 64 65 78 28 29 20 6d 61 6c 66  BestIndex() malf
31500 75 6e 63 74 69 6f 6e 22 2c 20 70 54 61 62 2d 3e  unction", pTab->
31510 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
31520 20 20 67 6f 74 6f 20 77 68 65 72 65 4c 6f 6f 70    goto whereLoop
31530 41 64 64 56 74 61 62 5f 65 78 69 74 3b 0a 20 20  AddVtab_exit;.  
31540 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
31550 74 65 73 74 63 61 73 65 28 20 69 54 65 72 6d 3d  testcase( iTerm=
31560 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 2d 31 20 29  =nConstraint-1 )
31570 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
31580 73 65 28 20 6a 3d 3d 30 20 29 3b 0a 20 20 20 20  se( j==0 );.    
31590 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 3d      testcase( j=
315a0 3d 70 57 43 2d 3e 6e 54 65 72 6d 2d 31 20 29 3b  =pWC->nTerm-1 );
315b0 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 20 3d  .        pTerm =
315c0 20 26 70 57 43 2d 3e 61 5b 6a 5d 3b 0a 20 20 20   &pWC->a[j];.   
315d0 20 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65       pNew->prere
315e0 71 20 7c 3d 20 70 54 65 72 6d 2d 3e 70 72 65 72  q |= pTerm->prer
315f0 65 71 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20  eqRight;.       
31600 20 61 73 73 65 72 74 28 20 69 54 65 72 6d 3c 70   assert( iTerm<p
31610 4e 65 77 2d 3e 6e 4c 53 6c 6f 74 20 29 3b 0a 20  New->nLSlot );. 
31620 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54         pNew->aLT
31630 65 72 6d 5b 69 54 65 72 6d 5d 20 3d 20 70 54 65  erm[iTerm] = pTe
31640 72 6d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  rm;.        if( 
31650 69 54 65 72 6d 3e 6d 78 54 65 72 6d 20 29 20 6d  iTerm>mxTerm ) m
31660 78 54 65 72 6d 20 3d 20 69 54 65 72 6d 3b 0a 20  xTerm = iTerm;. 
31670 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
31680 20 69 54 65 72 6d 3d 3d 31 35 20 29 3b 0a 20 20   iTerm==15 );.  
31690 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
316a0 69 54 65 72 6d 3d 3d 31 36 20 29 3b 0a 20 20 20  iTerm==16 );.   
316b0 20 20 20 20 20 69 66 28 20 69 54 65 72 6d 3c 31       if( iTerm<1
316c0 36 20 26 26 20 70 55 73 61 67 65 5b 69 5d 2e 6f  6 && pUsage[i].o
316d0 6d 69 74 20 29 20 70 4e 65 77 2d 3e 75 2e 76 74  mit ) pNew->u.vt
316e0 61 62 2e 6f 6d 69 74 4d 61 73 6b 20 7c 3d 20 31  ab.omitMask |= 1
316f0 3c 3c 69 54 65 72 6d 3b 0a 20 20 20 20 20 20 20  <<iTerm;.       
31700 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70   if( (pTerm->eOp
31710 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 29 21  erator & WO_IN)!
31720 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
31730 69 66 28 20 70 55 73 61 67 65 5b 69 5d 2e 6f 6d  if( pUsage[i].om
31740 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  it==0 ){.       
31750 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61       /* Do not a
31760 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20 61 6e  ttempt to use an
31770 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 20 69   IN constraint i
31780 66 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61  f the virtual ta
31790 62 6c 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  ble.            
317a0 2a 2a 20 73 61 79 73 20 74 68 61 74 20 74 68 65  ** says that the
317b0 20 65 71 75 69 76 61 6c 65 6e 74 20 45 51 20 63   equivalent EQ c
317c0 6f 6e 73 74 72 61 69 6e 74 20 63 61 6e 6e 6f 74  onstraint cannot
317d0 20 62 65 20 73 61 66 65 6c 79 20 6f 6d 69 74 74   be safely omitt
317e0 65 64 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  ed..            
317f0 2a 2a 20 49 66 20 77 65 20 64 6f 20 61 74 74 65  ** If we do atte
31800 6d 70 74 20 74 6f 20 75 73 65 20 73 75 63 68 20  mpt to use such 
31810 61 20 63 6f 6e 73 74 72 61 69 6e 74 2c 20 73 6f  a constraint, so
31820 6d 65 20 72 6f 77 73 20 6d 69 67 68 74 20 62 65  me rows might be
31830 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
31840 72 65 70 65 61 74 65 64 20 69 6e 20 74 68 65 20  repeated in the 
31850 6f 75 74 70 75 74 2e 20 2a 2f 0a 20 20 20 20 20  output. */.     
31860 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
31870 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
31880 20 20 20 20 2f 2a 20 41 20 76 69 72 74 75 61 6c      /* A virtual
31890 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 63   table that is c
318a0 6f 6e 73 74 72 61 69 6e 65 64 20 62 79 20 61 6e  onstrained by an
318b0 20 49 4e 20 63 6c 61 75 73 65 20 6d 61 79 20 6e   IN clause may n
318c0 6f 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ot.          ** 
318d0 63 6f 6e 73 75 6d 65 20 74 68 65 20 4f 52 44 45  consume the ORDE
318e0 52 20 42 59 20 63 6c 61 75 73 65 20 62 65 63 61  R BY clause beca
318f0 75 73 65 20 28 31 29 20 74 68 65 20 6f 72 64 65  use (1) the orde
31900 72 20 6f 66 20 49 4e 20 74 65 72 6d 73 0a 20 20  r of IN terms.  
31910 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 6e 6f          ** is no
31920 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 72 65  t necessarily re
31930 6c 61 74 65 64 20 74 6f 20 74 68 65 20 6f 72 64  lated to the ord
31940 65 72 20 6f 66 20 6f 75 74 70 75 74 20 74 65 72  er of output ter
31950 6d 73 20 61 6e 64 0a 20 20 20 20 20 20 20 20 20  ms and.         
31960 20 2a 2a 20 28 32 29 20 4d 75 6c 74 69 70 6c 65   ** (2) Multiple
31970 20 6f 75 74 70 75 74 73 20 66 72 6f 6d 20 61 20   outputs from a 
31980 73 69 6e 67 6c 65 20 49 4e 20 76 61 6c 75 65 20  single IN value 
31990 77 69 6c 6c 20 6e 6f 74 20 6d 65 72 67 65 0a 20  will not merge. 
319a0 20 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 67 65           ** toge
319b0 74 68 65 72 2e 20 20 2a 2f 0a 20 20 20 20 20 20  ther.  */.      
319c0 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6f 72      pIdxInfo->or
319d0 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 20 3d 20  derByConsumed = 
319e0 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
319f0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
31a00 66 28 20 69 3e 3d 6e 43 6f 6e 73 74 72 61 69 6e  f( i>=nConstrain
31a10 74 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d  t ){.      pNew-
31a20 3e 6e 4c 54 65 72 6d 20 3d 20 6d 78 54 65 72 6d  >nLTerm = mxTerm
31a30 2b 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  +1;.      assert
31a40 28 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 3c 3d  ( pNew->nLTerm<=
31a50 70 4e 65 77 2d 3e 6e 4c 53 6c 6f 74 20 29 3b 0a  pNew->nLSlot );.
31a60 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74        pNew->u.vt
31a70 61 62 2e 69 64 78 4e 75 6d 20 3d 20 70 49 64 78  ab.idxNum = pIdx
31a80 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d 3b 0a 20 20  Info->idxNum;.  
31a90 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62      pNew->u.vtab
31aa0 2e 6e 65 65 64 46 72 65 65 20 3d 20 70 49 64 78  .needFree = pIdx
31ab0 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65  Info->needToFree
31ac0 49 64 78 53 74 72 3b 0a 20 20 20 20 20 20 70 49  IdxStr;.      pI
31ad0 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72  dxInfo->needToFr
31ae0 65 65 49 64 78 53 74 72 20 3d 20 30 3b 0a 20 20  eeIdxStr = 0;.  
31af0 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62      pNew->u.vtab
31b00 2e 69 64 78 53 74 72 20 3d 20 70 49 64 78 49 6e  .idxStr = pIdxIn
31b10 66 6f 2d 3e 69 64 78 53 74 72 3b 0a 20 20 20 20  fo->idxStr;.    
31b20 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69    pNew->u.vtab.i
31b30 73 4f 72 64 65 72 65 64 20 3d 20 28 69 38 29 28  sOrdered = (i8)(
31b40 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42  pIdxInfo->orderB
31b50 79 43 6f 6e 73 75 6d 65 64 20 3f 0a 20 20 20 20  yConsumed ?.    
31b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31b80 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64    pIdxInfo->nOrd
31b90 65 72 42 79 20 3a 20 30 29 3b 0a 20 20 20 20 20  erBy : 0);.     
31ba0 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20   pNew->rSetup = 
31bb0 30 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 72  0;.      pNew->r
31bc0 52 75 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  Run = sqlite3Log
31bd0 45 73 74 46 72 6f 6d 44 6f 75 62 6c 65 28 70 49  EstFromDouble(pI
31be0 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65  dxInfo->estimate
31bf0 64 43 6f 73 74 29 3b 0a 20 20 20 20 20 20 70 4e  dCost);.      pN
31c00 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 71 6c 69 74  ew->nOut = sqlit
31c10 65 33 4c 6f 67 45 73 74 28 70 49 64 78 49 6e 66  e3LogEst(pIdxInf
31c20 6f 2d 3e 65 73 74 69 6d 61 74 65 64 52 6f 77 73  o->estimatedRows
31c30 29 3b 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f  );.      whereLo
31c40 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65  opInsert(pBuilde
31c50 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20  r, pNew);.      
31c60 69 66 28 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62  if( pNew->u.vtab
31c70 2e 6e 65 65 64 46 72 65 65 20 29 7b 0a 20 20 20  .needFree ){.   
31c80 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
31c90 65 28 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69  e(pNew->u.vtab.i
31ca0 64 78 53 74 72 29 3b 0a 20 20 20 20 20 20 20 20  dxStr);.        
31cb0 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65  pNew->u.vtab.nee
31cc0 64 46 72 65 65 20 3d 20 30 3b 0a 20 20 20 20 20  dFree = 0;.     
31cd0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20 20 0a 0a   }.    }.  }  ..
31ce0 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 74 61 62  whereLoopAddVtab
31cf0 5f 65 78 69 74 3a 0a 20 20 69 66 28 20 70 49 64  _exit:.  if( pId
31d00 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65  xInfo->needToFre
31d10 65 49 64 78 53 74 72 20 29 20 73 71 6c 69 74 65  eIdxStr ) sqlite
31d20 33 5f 66 72 65 65 28 70 49 64 78 49 6e 66 6f 2d  3_free(pIdxInfo-
31d30 3e 69 64 78 53 74 72 29 3b 0a 20 20 73 71 6c 69  >idxStr);.  sqli
31d40 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49  te3DbFree(db, pI
31d50 64 78 49 6e 66 6f 29 3b 0a 20 20 72 65 74 75 72  dxInfo);.  retur
31d60 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  n rc;.}.#endif /
31d70 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  * SQLITE_OMIT_VI
31d80 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 2f  RTUALTABLE */../
31d90 2a 0a 2a 2a 20 41 64 64 20 57 68 65 72 65 4c 6f  *.** Add WhereLo
31da0 6f 70 20 65 6e 74 72 69 65 73 20 74 6f 20 68 61  op entries to ha
31db0 6e 64 6c 65 20 4f 52 20 74 65 72 6d 73 2e 20 20  ndle OR terms.  
31dc0 54 68 69 73 20 77 6f 72 6b 73 20 66 6f 72 20 65  This works for e
31dd0 69 74 68 65 72 0a 2a 2a 20 62 74 72 65 65 73 20  ither.** btrees 
31de0 6f 72 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  or virtual table
31df0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
31e00 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 4f 72 28   whereLoopAddOr(
31e10 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72  WhereLoopBuilder
31e20 20 2a 70 42 75 69 6c 64 65 72 2c 20 42 69 74 6d   *pBuilder, Bitm
31e30 61 73 6b 20 6d 45 78 74 72 61 29 7b 0a 20 20 57  ask mExtra){.  W
31e40 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
31e50 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49   = pBuilder->pWI
31e60 6e 66 6f 3b 0a 20 20 57 68 65 72 65 43 6c 61 75  nfo;.  WhereClau
31e70 73 65 20 2a 70 57 43 3b 0a 20 20 57 68 65 72 65  se *pWC;.  Where
31e80 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a 20 20 57 68  Loop *pNew;.  Wh
31e90 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20  ereTerm *pTerm, 
31ea0 2a 70 57 43 45 6e 64 3b 0a 20 20 69 6e 74 20 72  *pWCEnd;.  int r
31eb0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
31ec0 20 69 6e 74 20 69 43 75 72 3b 0a 20 20 57 68 65   int iCur;.  Whe
31ed0 72 65 43 6c 61 75 73 65 20 74 65 6d 70 57 43 3b  reClause tempWC;
31ee0 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c  .  WhereLoopBuil
31ef0 64 65 72 20 73 53 75 62 42 75 69 6c 64 3b 0a 20  der sSubBuild;. 
31f00 20 57 68 65 72 65 4f 72 53 65 74 20 73 53 75 6d   WhereOrSet sSum
31f10 2c 20 73 43 75 72 3b 0a 20 20 73 74 72 75 63 74  , sCur;.  struct
31f20 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
31f30 49 74 65 6d 3b 0a 20 20 0a 20 20 70 57 43 20 3d  Item;.  .  pWC =
31f40 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 3b 0a   pBuilder->pWC;.
31f50 20 20 70 57 43 45 6e 64 20 3d 20 70 57 43 2d 3e    pWCEnd = pWC->
31f60 61 20 2b 20 70 57 43 2d 3e 6e 54 65 72 6d 3b 0a  a + pWC->nTerm;.
31f70 20 20 70 4e 65 77 20 3d 20 70 42 75 69 6c 64 65    pNew = pBuilde
31f80 72 2d 3e 70 4e 65 77 3b 0a 20 20 6d 65 6d 73 65  r->pNew;.  memse
31f90 74 28 26 73 53 75 6d 2c 20 30 2c 20 73 69 7a 65  t(&sSum, 0, size
31fa0 6f 66 28 73 53 75 6d 29 29 3b 0a 20 20 70 49 74  of(sSum));.  pIt
31fb0 65 6d 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61  em = pWInfo->pTa
31fc0 62 4c 69 73 74 2d 3e 61 20 2b 20 70 4e 65 77 2d  bList->a + pNew-
31fd0 3e 69 54 61 62 3b 0a 20 20 69 43 75 72 20 3d 20  >iTab;.  iCur = 
31fe0 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a  pItem->iCursor;.
31ff0 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43  .  for(pTerm=pWC
32000 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 57 43 45 6e  ->a; pTerm<pWCEn
32010 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  d && rc==SQLITE_
32020 4f 4b 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20  OK; pTerm++){.  
32030 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f    if( (pTerm->eO
32040 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 4f 52 29  perator & WO_OR)
32050 21 3d 30 0a 20 20 20 20 20 26 26 20 28 70 54 65  !=0.     && (pTe
32060 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 69  rm->u.pOrInfo->i
32070 6e 64 65 78 61 62 6c 65 20 26 20 70 4e 65 77 2d  ndexable & pNew-
32080 3e 6d 61 73 6b 53 65 6c 66 29 21 3d 30 20 0a 20  >maskSelf)!=0 . 
32090 20 20 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72     ){.      Wher
320a0 65 43 6c 61 75 73 65 20 2a 20 63 6f 6e 73 74 20  eClause * const 
320b0 70 4f 72 57 43 20 3d 20 26 70 54 65 72 6d 2d 3e  pOrWC = &pTerm->
320c0 75 2e 70 4f 72 49 6e 66 6f 2d 3e 77 63 3b 0a 20  u.pOrInfo->wc;. 
320d0 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a       WhereTerm *
320e0 20 63 6f 6e 73 74 20 70 4f 72 57 43 45 6e 64 20   const pOrWCEnd 
320f0 3d 20 26 70 4f 72 57 43 2d 3e 61 5b 70 4f 72 57  = &pOrWC->a[pOrW
32100 43 2d 3e 6e 54 65 72 6d 5d 3b 0a 20 20 20 20 20  C->nTerm];.     
32110 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 72 54   WhereTerm *pOrT
32120 65 72 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20 6f  erm;.      int o
32130 6e 63 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 69  nce = 1;.      i
32140 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 0a 20 20  nt i, j;.    .  
32150 20 20 20 20 73 53 75 62 42 75 69 6c 64 20 3d 20      sSubBuild = 
32160 2a 70 42 75 69 6c 64 65 72 3b 0a 20 20 20 20 20  *pBuilder;.     
32170 20 73 53 75 62 42 75 69 6c 64 2e 70 4f 72 64 65   sSubBuild.pOrde
32180 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 73  rBy = 0;.      s
32190 53 75 62 42 75 69 6c 64 2e 70 4f 72 53 65 74 20  SubBuild.pOrSet 
321a0 3d 20 26 73 43 75 72 3b 0a 0a 20 20 20 20 20 20  = &sCur;..      
321b0 57 48 45 52 45 54 52 41 43 45 28 30 78 32 30 30  WHERETRACE(0x200
321c0 2c 20 28 22 42 65 67 69 6e 20 70 72 6f 63 65 73  , ("Begin proces
321d0 73 69 6e 67 20 4f 52 2d 63 6c 61 75 73 65 20 25  sing OR-clause %
321e0 70 5c 6e 22 2c 20 70 54 65 72 6d 29 29 3b 0a 20  p\n", pTerm));. 
321f0 20 20 20 20 20 66 6f 72 28 70 4f 72 54 65 72 6d       for(pOrTerm
32200 3d 70 4f 72 57 43 2d 3e 61 3b 20 70 4f 72 54 65  =pOrWC->a; pOrTe
32210 72 6d 3c 70 4f 72 57 43 45 6e 64 3b 20 70 4f 72  rm<pOrWCEnd; pOr
32220 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Term++){.       
32230 20 69 66 28 20 28 70 4f 72 54 65 72 6d 2d 3e 65   if( (pOrTerm->e
32240 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 41 4e  Operator & WO_AN
32250 44 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  D)!=0 ){.       
32260 20 20 20 73 53 75 62 42 75 69 6c 64 2e 70 57 43     sSubBuild.pWC
32270 20 3d 20 26 70 4f 72 54 65 72 6d 2d 3e 75 2e 70   = &pOrTerm->u.p
32280 41 6e 64 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20  AndInfo->wc;.   
32290 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
322a0 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73  OrTerm->leftCurs
322b0 6f 72 3d 3d 69 43 75 72 20 29 7b 0a 20 20 20 20  or==iCur ){.    
322c0 20 20 20 20 20 20 74 65 6d 70 57 43 2e 70 57 49        tempWC.pWI
322d0 6e 66 6f 20 3d 20 70 57 43 2d 3e 70 57 49 6e 66  nfo = pWC->pWInf
322e0 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 6d  o;.          tem
322f0 70 57 43 2e 70 4f 75 74 65 72 20 3d 20 70 57 43  pWC.pOuter = pWC
32300 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 6d 70  ;.          temp
32310 57 43 2e 6f 70 20 3d 20 54 4b 5f 41 4e 44 3b 0a  WC.op = TK_AND;.
32320 20 20 20 20 20 20 20 20 20 20 74 65 6d 70 57 43            tempWC
32330 2e 6e 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20  .nTerm = 1;.    
32340 20 20 20 20 20 20 74 65 6d 70 57 43 2e 61 20 3d        tempWC.a =
32350 20 70 4f 72 54 65 72 6d 3b 0a 20 20 20 20 20 20   pOrTerm;.      
32360 20 20 20 20 73 53 75 62 42 75 69 6c 64 2e 70 57      sSubBuild.pW
32370 43 20 3d 20 26 74 65 6d 70 57 43 3b 0a 20 20 20  C = &tempWC;.   
32380 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
32390 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
323a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
323b0 20 20 73 43 75 72 2e 6e 20 3d 20 30 3b 0a 23 69    sCur.n = 0;.#i
323c0 66 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f  fdef WHERETRACE_
323d0 45 4e 41 42 4c 45 44 0a 20 20 20 20 20 20 20 20  ENABLED.        
323e0 57 48 45 52 45 54 52 41 43 45 28 30 78 32 30 30  WHERETRACE(0x200
323f0 2c 20 28 22 4f 52 2d 74 65 72 6d 20 25 64 20 6f  , ("OR-term %d o
32400 66 20 25 70 20 68 61 73 20 25 64 20 73 75 62 74  f %p has %d subt
32410 65 72 6d 73 3a 5c 6e 22 2c 20 0a 20 20 20 20 20  erms:\n", .     
32420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 69                (i
32430 6e 74 29 28 70 4f 72 54 65 72 6d 2d 70 4f 72 57  nt)(pOrTerm-pOrW
32440 43 2d 3e 61 29 2c 20 70 54 65 72 6d 2c 20 73 53  C->a), pTerm, sS
32450 75 62 42 75 69 6c 64 2e 70 57 43 2d 3e 6e 54 65  ubBuild.pWC->nTe
32460 72 6d 29 29 3b 0a 20 20 20 20 20 20 20 20 69 66  rm));.        if
32470 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72  ( sqlite3WhereTr
32480 61 63 65 20 26 20 30 78 34 30 30 20 29 7b 0a 20  ace & 0x400 ){. 
32490 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30           for(i=0
324a0 3b 20 69 3c 73 53 75 62 42 75 69 6c 64 2e 70 57  ; i<sSubBuild.pW
324b0 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 29 7b 0a  C->nTerm; i++){.
324c0 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72              wher
324d0 65 54 65 72 6d 50 72 69 6e 74 28 26 73 53 75 62  eTermPrint(&sSub
324e0 42 75 69 6c 64 2e 70 57 43 2d 3e 61 5b 69 5d 2c  Build.pWC->a[i],
324f0 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   i);.          }
32500 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  .        }.#endi
32510 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  f.#ifndef SQLITE
32520 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
32530 4c 45 0a 20 20 20 20 20 20 20 20 69 66 28 20 49  LE.        if( I
32540 73 56 69 72 74 75 61 6c 28 70 49 74 65 6d 2d 3e  sVirtual(pItem->
32550 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20  pTab) ){.       
32560 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f     rc = whereLoo
32570 70 41 64 64 56 69 72 74 75 61 6c 28 26 73 53 75  pAddVirtual(&sSu
32580 62 42 75 69 6c 64 2c 20 6d 45 78 74 72 61 29 3b  bBuild, mExtra);
32590 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 23  .        }else.#
325a0 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7b 0a  endif.        {.
325b0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 77            rc = w
325c0 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65  hereLoopAddBtree
325d0 28 26 73 53 75 62 42 75 69 6c 64 2c 20 6d 45 78  (&sSubBuild, mEx
325e0 74 72 61 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  tra);.        }.
325f0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
32600 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
32610 20 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72         rc = wher
32620 65 4c 6f 6f 70 41 64 64 4f 72 28 26 73 53 75 62  eLoopAddOr(&sSub
32630 42 75 69 6c 64 2c 20 6d 45 78 74 72 61 29 3b 0a  Build, mExtra);.
32640 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
32650 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
32660 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 43 75 72 2e  LITE_OK || sCur.
32670 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  n==0 );.        
32680 69 66 28 20 73 43 75 72 2e 6e 3d 3d 30 20 29 7b  if( sCur.n==0 ){
32690 0a 20 20 20 20 20 20 20 20 20 20 73 53 75 6d 2e  .          sSum.
326a0 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  n = 0;.         
326b0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
326c0 7d 65 6c 73 65 20 69 66 28 20 6f 6e 63 65 20 29  }else if( once )
326d0 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68 65 72  {.          wher
326e0 65 4f 72 4d 6f 76 65 28 26 73 53 75 6d 2c 20 26  eOrMove(&sSum, &
326f0 73 43 75 72 29 3b 0a 20 20 20 20 20 20 20 20 20  sCur);.         
32700 20 6f 6e 63 65 20 3d 20 30 3b 0a 20 20 20 20 20   once = 0;.     
32710 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
32720 20 20 20 20 57 68 65 72 65 4f 72 53 65 74 20 73      WhereOrSet s
32730 50 72 65 76 3b 0a 20 20 20 20 20 20 20 20 20 20  Prev;.          
32740 77 68 65 72 65 4f 72 4d 6f 76 65 28 26 73 50 72  whereOrMove(&sPr
32750 65 76 2c 20 26 73 53 75 6d 29 3b 0a 20 20 20 20  ev, &sSum);.    
32760 20 20 20 20 20 20 73 53 75 6d 2e 6e 20 3d 20 30        sSum.n = 0
32770 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  ;.          for(
32780 69 3d 30 3b 20 69 3c 73 50 72 65 76 2e 6e 3b 20  i=0; i<sPrev.n; 
32790 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
327a0 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 73 43 75    for(j=0; j<sCu
327b0 72 2e 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  r.n; j++){.     
327c0 20 20 20 20 20 20 20 20 20 77 68 65 72 65 4f 72           whereOr
327d0 49 6e 73 65 72 74 28 26 73 53 75 6d 2c 20 73 50  Insert(&sSum, sP
327e0 72 65 76 2e 61 5b 69 5d 2e 70 72 65 72 65 71 20  rev.a[i].prereq 
327f0 7c 20 73 43 75 72 2e 61 5b 6a 5d 2e 70 72 65 72  | sCur.a[j].prer
32800 65 71 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  eq,.            
32810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32820 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64  sqlite3LogEstAdd
32830 28 73 50 72 65 76 2e 61 5b 69 5d 2e 72 52 75 6e  (sPrev.a[i].rRun
32840 2c 20 73 43 75 72 2e 61 5b 6a 5d 2e 72 52 75 6e  , sCur.a[j].rRun
32850 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
32860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
32870 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28  qlite3LogEstAdd(
32880 73 50 72 65 76 2e 61 5b 69 5d 2e 6e 4f 75 74 2c  sPrev.a[i].nOut,
32890 20 73 43 75 72 2e 61 5b 6a 5d 2e 6e 4f 75 74 29   sCur.a[j].nOut)
328a0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
328b0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
328c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
328d0 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72       pNew->nLTer
328e0 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 4e 65  m = 1;.      pNe
328f0 77 2d 3e 61 4c 54 65 72 6d 5b 30 5d 20 3d 20 70  w->aLTerm[0] = p
32900 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 4e 65 77  Term;.      pNew
32910 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52  ->wsFlags = WHER
32920 45 5f 4d 55 4c 54 49 5f 4f 52 3b 0a 20 20 20 20  E_MULTI_OR;.    
32930 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d    pNew->rSetup =
32940 20 30 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e   0;.      pNew->
32950 69 53 6f 72 74 49 64 78 20 3d 20 30 3b 0a 20 20  iSortIdx = 0;.  
32960 20 20 20 20 6d 65 6d 73 65 74 28 26 70 4e 65 77      memset(&pNew
32970 2d 3e 75 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70  ->u, 0, sizeof(p
32980 4e 65 77 2d 3e 75 29 29 3b 0a 20 20 20 20 20 20  New->u));.      
32990 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c  for(i=0; rc==SQL
329a0 49 54 45 5f 4f 4b 20 26 26 20 69 3c 73 53 75 6d  ITE_OK && i<sSum
329b0 2e 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  .n; i++){.      
329c0 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 43 75 72    /* TUNING: Cur
329d0 72 65 6e 74 6c 79 20 73 53 75 6d 2e 61 5b 69 5d  rently sSum.a[i]
329e0 2e 72 52 75 6e 20 69 73 20 73 65 74 20 74 6f 20  .rRun is set to 
329f0 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 63  the sum of the c
32a00 6f 73 74 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  osts.        ** 
32a10 6f 66 20 61 6c 6c 20 73 75 62 2d 73 63 61 6e 73  of all sub-scans
32a20 20 72 65 71 75 69 72 65 64 20 62 79 20 74 68 65   required by the
32a30 20 4f 52 2d 73 63 61 6e 2e 20 48 6f 77 65 76 65   OR-scan. Howeve
32a40 72 2c 20 64 75 65 20 74 6f 20 72 6f 75 6e 64 69  r, due to roundi
32a50 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 72  ng.        ** er
32a60 72 6f 72 73 2c 20 69 74 20 6d 61 79 20 62 65 20  rors, it may be 
32a70 74 68 61 74 20 74 68 65 20 63 6f 73 74 20 6f 66  that the cost of
32a80 20 74 68 65 20 4f 52 2d 73 63 61 6e 20 69 73 20   the OR-scan is 
32a90 65 71 75 61 6c 20 74 6f 20 69 74 73 0a 20 20 20  equal to its.   
32aa0 20 20 20 20 20 2a 2a 20 6d 6f 73 74 20 65 78 70       ** most exp
32ab0 65 6e 73 69 76 65 20 73 75 62 2d 73 63 61 6e 2e  ensive sub-scan.
32ac0 20 41 64 64 20 74 68 65 20 73 6d 61 6c 6c 65 73   Add the smalles
32ad0 74 20 70 6f 73 73 69 62 6c 65 20 70 65 6e 61 6c  t possible penal
32ae0 74 79 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 28  ty .        ** (
32af0 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 6d 75  equivalent to mu
32b00 6c 74 69 70 6c 79 69 6e 67 20 74 68 65 20 63 6f  ltiplying the co
32b10 73 74 20 62 79 20 31 2e 30 37 29 20 74 6f 20 65  st by 1.07) to e
32b20 6e 73 75 72 65 20 74 68 61 74 20 0a 20 20 20 20  nsure that .    
32b30 20 20 20 20 2a 2a 20 74 68 69 73 20 64 6f 65 73      ** this does
32b40 20 6e 6f 74 20 68 61 70 70 65 6e 2e 20 4f 74 68   not happen. Oth
32b50 65 72 77 69 73 65 2c 20 66 6f 72 20 57 48 45 52  erwise, for WHER
32b60 45 20 63 6c 61 75 73 65 73 20 73 75 63 68 20 61  E clauses such a
32b70 73 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  s the.        **
32b80 20 66 6f 6c 6c 6f 77 69 6e 67 20 77 68 65 72 65   following where
32b90 20 74 68 65 72 65 20 69 73 20 61 6e 20 69 6e 64   there is an ind
32ba0 65 78 20 6f 6e 20 22 79 22 3a 0a 20 20 20 20 20  ex on "y":.     
32bb0 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
32bc0 20 20 20 20 20 57 48 45 52 45 20 6c 69 6b 65 6c       WHERE likel
32bd0 69 68 6f 6f 64 28 78 3d 3f 2c 20 30 2e 39 39 29  ihood(x=?, 0.99)
32be0 20 4f 52 20 79 3d 3f 0a 20 20 20 20 20 20 20 20   OR y=?.        
32bf0 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  **.        ** th
32c00 65 20 70 6c 61 6e 6e 65 72 20 6d 61 79 20 65 6c  e planner may el
32c10 65 63 74 20 74 6f 20 22 4f 52 22 20 74 6f 67 65  ect to "OR" toge
32c20 74 68 65 72 20 61 20 66 75 6c 6c 2d 74 61 62 6c  ther a full-tabl
32c30 65 20 73 63 61 6e 20 61 6e 64 20 61 6e 0a 20 20  e scan and an.  
32c40 20 20 20 20 20 20 2a 2a 20 69 6e 64 65 78 20 6c        ** index l
32c50 6f 6f 6b 75 70 2e 20 41 6e 64 20 6f 74 68 65 72  ookup. And other
32c60 20 73 69 6d 69 6c 61 72 6c 79 20 6f 64 64 20 72   similarly odd r
32c70 65 73 75 6c 74 73 2e 20 20 2a 2f 0a 20 20 20 20  esults.  */.    
32c80 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d      pNew->rRun =
32c90 20 73 53 75 6d 2e 61 5b 69 5d 2e 72 52 75 6e 20   sSum.a[i].rRun 
32ca0 2b 20 31 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  + 1;.        pNe
32cb0 77 2d 3e 6e 4f 75 74 20 3d 20 73 53 75 6d 2e 61  w->nOut = sSum.a
32cc0 5b 69 5d 2e 6e 4f 75 74 3b 0a 20 20 20 20 20 20  [i].nOut;.      
32cd0 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d    pNew->prereq =
32ce0 20 73 53 75 6d 2e 61 5b 69 5d 2e 70 72 65 72 65   sSum.a[i].prere
32cf0 71 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  q;.        rc = 
32d00 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28  whereLoopInsert(
32d10 70 42 75 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b  pBuilder, pNew);
32d20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 57  .      }.      W
32d30 48 45 52 45 54 52 41 43 45 28 30 78 32 30 30 2c  HERETRACE(0x200,
32d40 20 28 22 45 6e 64 20 70 72 6f 63 65 73 73 69 6e   ("End processin
32d50 67 20 4f 52 2d 63 6c 61 75 73 65 20 25 70 5c 6e  g OR-clause %p\n
32d60 22 2c 20 70 54 65 72 6d 29 29 3b 0a 20 20 20 20  ", pTerm));.    
32d70 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
32d80 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  c;.}../*.** Add 
32d90 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62  all WhereLoop ob
32da0 6a 65 63 74 73 20 66 6f 72 20 61 6c 6c 20 74 61  jects for all ta
32db0 62 6c 65 73 20 0a 2a 2f 0a 73 74 61 74 69 63 20  bles .*/.static 
32dc0 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  int whereLoopAdd
32dd0 41 6c 6c 28 57 68 65 72 65 4c 6f 6f 70 42 75 69  All(WhereLoopBui
32de0 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 29 7b  lder *pBuilder){
32df0 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  .  WhereInfo *pW
32e00 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d  Info = pBuilder-
32e10 3e 70 57 49 6e 66 6f 3b 0a 20 20 42 69 74 6d 61  >pWInfo;.  Bitma
32e20 73 6b 20 6d 45 78 74 72 61 20 3d 20 30 3b 0a 20  sk mExtra = 0;. 
32e30 20 42 69 74 6d 61 73 6b 20 6d 50 72 69 6f 72 20   Bitmask mPrior 
32e40 3d 20 30 3b 0a 20 20 69 6e 74 20 69 54 61 62 3b  = 0;.  int iTab;
32e50 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62  .  SrcList *pTab
32e60 4c 69 73 74 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  List = pWInfo->p
32e70 54 61 62 4c 69 73 74 3b 0a 20 20 73 74 72 75 63  TabList;.  struc
32e80 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
32e90 70 49 74 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33  pItem;.  sqlite3
32ea0 20 2a 64 62 20 3d 20 70 57 49 6e 66 6f 2d 3e 70   *db = pWInfo->p
32eb0 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74  Parse->db;.  int
32ec0 20 6e 54 61 62 4c 69 73 74 20 3d 20 70 57 49 6e   nTabList = pWIn
32ed0 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 0a 20 20 69 6e  fo->nLevel;.  in
32ee0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
32ef0 3b 0a 20 20 75 38 20 70 72 69 6f 72 4a 6f 69 6e  ;.  u8 priorJoin
32f00 54 79 70 65 20 3d 20 30 3b 0a 20 20 57 68 65 72  Type = 0;.  Wher
32f10 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a 0a 20 20  eLoop *pNew;..  
32f20 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72 20 74 68 65  /* Loop over the
32f30 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 6a   tables in the j
32f40 6f 69 6e 2c 20 66 72 6f 6d 20 6c 65 66 74 20 74  oin, from left t
32f50 6f 20 72 69 67 68 74 20 2a 2f 0a 20 20 70 4e 65  o right */.  pNe
32f60 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e  w = pBuilder->pN
32f70 65 77 3b 0a 20 20 66 6f 72 28 69 54 61 62 3d 30  ew;.  for(iTab=0
32f80 2c 20 70 49 74 65 6d 3d 70 54 61 62 4c 69 73 74  , pItem=pTabList
32f90 2d 3e 61 3b 20 69 54 61 62 3c 6e 54 61 62 4c 69  ->a; iTab<nTabLi
32fa0 73 74 3b 20 69 54 61 62 2b 2b 2c 20 70 49 74 65  st; iTab++, pIte
32fb0 6d 2b 2b 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e  m++){.    pNew->
32fc0 69 54 61 62 20 3d 20 69 54 61 62 3b 0a 20 20 20  iTab = iTab;.   
32fd0 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 20   pNew->maskSelf 
32fe0 3d 20 67 65 74 4d 61 73 6b 28 26 70 57 49 6e 66  = getMask(&pWInf
32ff0 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 70 49 74  o->sMaskSet, pIt
33000 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20  em->iCursor);.  
33010 20 20 69 66 28 20 28 28 70 49 74 65 6d 2d 3e 6a    if( ((pItem->j
33020 6f 69 6e 74 79 70 65 7c 70 72 69 6f 72 4a 6f 69  ointype|priorJoi
33030 6e 54 79 70 65 29 20 26 20 28 4a 54 5f 4c 45 46  nType) & (JT_LEF
33040 54 7c 4a 54 5f 43 52 4f 53 53 29 29 21 3d 30 20  T|JT_CROSS))!=0 
33050 29 7b 0a 20 20 20 20 20 20 6d 45 78 74 72 61 20  ){.      mExtra 
33060 3d 20 6d 50 72 69 6f 72 3b 0a 20 20 20 20 7d 0a  = mPrior;.    }.
33070 20 20 20 20 70 72 69 6f 72 4a 6f 69 6e 54 79 70      priorJoinTyp
33080 65 20 3d 20 70 49 74 65 6d 2d 3e 6a 6f 69 6e 74  e = pItem->joint
33090 79 70 65 3b 0a 20 20 20 20 69 66 28 20 49 73 56  ype;.    if( IsV
330a0 69 72 74 75 61 6c 28 70 49 74 65 6d 2d 3e 70 54  irtual(pItem->pT
330b0 61 62 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ab) ){.      rc 
330c0 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 69  = whereLoopAddVi
330d0 72 74 75 61 6c 28 70 42 75 69 6c 64 65 72 2c 20  rtual(pBuilder, 
330e0 6d 45 78 74 72 61 29 3b 0a 20 20 20 20 7d 65 6c  mExtra);.    }el
330f0 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77  se{.      rc = w
33100 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65  hereLoopAddBtree
33110 28 70 42 75 69 6c 64 65 72 2c 20 6d 45 78 74 72  (pBuilder, mExtr
33120 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  a);.    }.    if
33130 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
33140 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68  ){.      rc = wh
33150 65 72 65 4c 6f 6f 70 41 64 64 4f 72 28 70 42 75  ereLoopAddOr(pBu
33160 69 6c 64 65 72 2c 20 6d 45 78 74 72 61 29 3b 0a  ilder, mExtra);.
33170 20 20 20 20 7d 0a 20 20 20 20 6d 50 72 69 6f 72      }.    mPrior
33180 20 7c 3d 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65   |= pNew->maskSe
33190 6c 66 3b 0a 20 20 20 20 69 66 28 20 72 63 20 7c  lf;.    if( rc |
331a0 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
331b0 65 64 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  ed ) break;.  }.
331c0 20 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72    whereLoopClear
331d0 28 64 62 2c 20 70 4e 65 77 29 3b 0a 20 20 72 65  (db, pNew);.  re
331e0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
331f0 2a 20 45 78 61 6d 69 6e 65 20 61 20 57 68 65 72  * Examine a Wher
33200 65 50 61 74 68 20 28 77 69 74 68 20 74 68 65 20  ePath (with the 
33210 61 64 64 69 74 69 6f 6e 20 6f 66 20 74 68 65 20  addition of the 
33220 65 78 74 72 61 20 57 68 65 72 65 4c 6f 6f 70 20  extra WhereLoop 
33230 6f 66 20 74 68 65 20 35 74 68 0a 2a 2a 20 70 61  of the 5th.** pa
33240 72 61 6d 65 74 65 72 73 29 20 74 6f 20 73 65 65  rameters) to see
33250 20 69 66 20 69 74 20 6f 75 74 70 75 74 73 20 72   if it outputs r
33260 6f 77 73 20 69 6e 20 74 68 65 20 72 65 71 75 65  ows in the reque
33270 73 74 65 64 20 4f 52 44 45 52 20 42 59 0a 2a 2a  sted ORDER BY.**
33280 20 28 6f 72 20 47 52 4f 55 50 20 42 59 29 20 77   (or GROUP BY) w
33290 69 74 68 6f 75 74 20 72 65 71 75 69 72 69 6e 67  ithout requiring
332a0 20 61 20 73 65 70 61 72 61 74 65 20 73 6f 72 74   a separate sort
332b0 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 52 65 74   operation.  Ret
332c0 75 72 6e 20 4e 3a 0a 2a 2a 20 0a 2a 2a 20 20 20  urn N:.** .**   
332d0 4e 3e 30 3a 20 20 20 4e 20 74 65 72 6d 73 20 6f  N>0:   N terms o
332e0 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  f the ORDER BY c
332f0 6c 61 75 73 65 20 61 72 65 20 73 61 74 69 73 66  lause are satisf
33300 69 65 64 0a 2a 2a 20 20 20 4e 3d 3d 30 3a 20 20  ied.**   N==0:  
33310 4e 6f 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  No terms of the 
33320 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
33330 61 72 65 20 73 61 74 69 73 66 69 65 64 0a 2a 2a  are satisfied.**
33340 20 20 20 4e 3c 30 3a 20 20 20 55 6e 6b 6e 6f 77     N<0:   Unknow
33350 6e 20 79 65 74 20 68 6f 77 20 6d 61 6e 79 20 74  n yet how many t
33360 65 72 6d 73 20 6f 66 20 4f 52 44 45 52 20 42 59  erms of ORDER BY
33370 20 6d 69 67 68 74 20 62 65 20 73 61 74 69 73 66   might be satisf
33380 69 65 64 2e 20 20 20 0a 2a 2a 0a 2a 2a 20 4e 6f  ied.   .**.** No
33390 74 65 20 74 68 61 74 20 70 72 6f 63 65 73 73 69  te that processi
333a0 6e 67 20 66 6f 72 20 57 48 45 52 45 5f 47 52 4f  ng for WHERE_GRO
333b0 55 50 42 59 20 61 6e 64 20 57 48 45 52 45 5f 44  UPBY and WHERE_D
333c0 49 53 54 49 4e 43 54 42 59 20 69 73 20 6e 6f 74  ISTINCTBY is not
333d0 20 61 73 0a 2a 2a 20 73 74 72 69 63 74 2e 20 20   as.** strict.  
333e0 57 69 74 68 20 47 52 4f 55 50 20 42 59 20 61 6e  With GROUP BY an
333f0 64 20 44 49 53 54 49 4e 43 54 20 74 68 65 20 6f  d DISTINCT the o
33400 6e 6c 79 20 72 65 71 75 69 72 65 6d 65 6e 74 20  nly requirement 
33410 69 73 20 74 68 61 74 0a 2a 2a 20 65 71 75 69 76  is that.** equiv
33420 61 6c 65 6e 74 20 72 6f 77 73 20 61 70 70 65 61  alent rows appea
33430 72 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 64  r immediately ad
33440 6a 61 63 65 6e 74 20 74 6f 20 6f 6e 65 20 61 6e  jacent to one an
33450 6f 74 68 65 72 2e 20 20 47 52 4f 55 50 20 42 59  other.  GROUP BY
33460 0a 2a 2a 20 61 6e 64 20 44 49 53 54 49 4e 43 54  .** and DISTINCT
33470 20 64 6f 20 6e 6f 74 20 72 65 71 75 69 72 65 20   do not require 
33480 72 6f 77 73 20 74 6f 20 61 70 70 65 61 72 20 69  rows to appear i
33490 6e 20 61 6e 79 20 70 61 72 74 69 63 75 6c 61 72  n any particular
334a0 20 6f 72 64 65 72 20 61 73 20 6c 6f 6e 67 0a 2a   order as long.*
334b0 2a 20 61 73 20 65 71 75 69 76 61 6c 65 6e 74 20  * as equivalent 
334c0 72 6f 77 73 20 61 72 65 20 67 72 6f 75 70 65 64  rows are grouped
334d0 20 74 6f 67 65 74 68 65 72 2e 20 20 54 68 75 73   together.  Thus
334e0 20 66 6f 72 20 47 52 4f 55 50 20 42 59 20 61 6e   for GROUP BY an
334f0 64 20 44 49 53 54 49 4e 43 54 0a 2a 2a 20 74 68  d DISTINCT.** th
33500 65 20 70 4f 72 64 65 72 42 79 20 74 65 72 6d 73  e pOrderBy terms
33510 20 63 61 6e 20 62 65 20 6d 61 74 63 68 65 64 20   can be matched 
33520 69 6e 20 61 6e 79 20 6f 72 64 65 72 2e 20 20 57  in any order.  W
33530 69 74 68 20 4f 52 44 45 52 20 42 59 2c 20 74 68  ith ORDER BY, th
33540 65 20 0a 2a 2a 20 70 4f 72 64 65 72 42 79 20 74  e .** pOrderBy t
33550 65 72 6d 73 20 6d 75 73 74 20 62 65 20 6d 61 74  erms must be mat
33560 63 68 65 64 20 69 6e 20 73 74 72 69 63 74 20 6c  ched in strict l
33570 65 66 74 2d 74 6f 2d 72 69 67 68 74 20 6f 72 64  eft-to-right ord
33580 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 38  er..*/.static i8
33590 20 77 68 65 72 65 50 61 74 68 53 61 74 69 73 66   wherePathSatisf
335a0 69 65 73 4f 72 64 65 72 42 79 28 0a 20 20 57 68  iesOrderBy(.  Wh
335b0 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c  ereInfo *pWInfo,
335c0 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
335d0 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70   clause */.  Exp
335e0 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c  rList *pOrderBy,
335f0 20 20 20 2f 2a 20 4f 52 44 45 52 20 42 59 20 6f     /* ORDER BY o
33600 72 20 47 52 4f 55 50 20 42 59 20 6f 72 20 44 49  r GROUP BY or DI
33610 53 54 49 4e 43 54 20 63 6c 61 75 73 65 20 74 6f  STINCT clause to
33620 20 63 68 65 63 6b 20 2a 2f 0a 20 20 57 68 65 72   check */.  Wher
33630 65 50 61 74 68 20 2a 70 50 61 74 68 2c 20 20 20  ePath *pPath,   
33640 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65 50 61    /* The WherePa
33650 74 68 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20  th to check */. 
33660 20 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73 2c   u16 wctrlFlags,
33670 20 20 20 20 20 20 20 2f 2a 20 4d 69 67 68 74 20         /* Might 
33680 63 6f 6e 74 61 69 6e 20 57 48 45 52 45 5f 47 52  contain WHERE_GR
33690 4f 55 50 42 59 20 6f 72 20 57 48 45 52 45 5f 44  OUPBY or WHERE_D
336a0 49 53 54 49 4e 43 54 42 59 20 2a 2f 0a 20 20 75  ISTINCTBY */.  u
336b0 31 36 20 6e 4c 6f 6f 70 2c 20 20 20 20 20 20 20  16 nLoop,       
336c0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
336d0 66 20 65 6e 74 72 69 65 73 20 69 6e 20 70 50 61  f entries in pPa
336e0 74 68 2d 3e 61 4c 6f 6f 70 5b 5d 20 2a 2f 0a 20  th->aLoop[] */. 
336f0 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 61 73   WhereLoop *pLas
33700 74 2c 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68  t,     /* Add th
33710 69 73 20 57 68 65 72 65 4c 6f 6f 70 20 74 6f 20  is WhereLoop to 
33720 74 68 65 20 65 6e 64 20 6f 66 20 70 50 61 74 68  the end of pPath
33730 2d 3e 61 4c 6f 6f 70 5b 5d 20 2a 2f 0a 20 20 42  ->aLoop[] */.  B
33740 69 74 6d 61 73 6b 20 2a 70 52 65 76 4d 61 73 6b  itmask *pRevMask
33750 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 61 73       /* OUT: Mas
33760 6b 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70 73 20  k of WhereLoops 
33770 74 6f 20 72 75 6e 20 69 6e 20 72 65 76 65 72 73  to run in revers
33780 65 20 6f 72 64 65 72 20 2a 2f 0a 29 7b 0a 20 20  e order */.){.  
33790 75 38 20 72 65 76 53 65 74 3b 20 20 20 20 20 20  u8 revSet;      
337a0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
337b0 20 72 65 76 20 69 73 20 6b 6e 6f 77 6e 20 2a 2f   rev is known */
337c0 0a 20 20 75 38 20 72 65 76 3b 20 20 20 20 20 20  .  u8 rev;      
337d0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70           /* Comp
337e0 6f 73 69 74 65 20 73 6f 72 74 20 6f 72 64 65 72  osite sort order
337f0 20 2a 2f 0a 20 20 75 38 20 72 65 76 49 64 78 3b   */.  u8 revIdx;
33800 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
33810 6e 64 65 78 20 73 6f 72 74 20 6f 72 64 65 72 20  ndex sort order 
33820 2a 2f 0a 20 20 75 38 20 69 73 4f 72 64 65 72 44  */.  u8 isOrderD
33830 69 73 74 69 6e 63 74 3b 20 20 20 2f 2a 20 41 6c  istinct;   /* Al
33840 6c 20 70 72 69 6f 72 20 57 68 65 72 65 4c 6f 6f  l prior WhereLoo
33850 70 73 20 61 72 65 20 6f 72 64 65 72 2d 64 69 73  ps are order-dis
33860 74 69 6e 63 74 20 2a 2f 0a 20 20 75 38 20 64 69  tinct */.  u8 di
33870 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 3b 20 20  stinctColumns;  
33880 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20   /* True if the 
33890 6c 6f 6f 70 20 68 61 73 20 55 4e 49 51 55 45 20  loop has UNIQUE 
338a0 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6c 75 6d 6e 73  NOT NULL columns
338b0 20 2a 2f 0a 20 20 75 38 20 69 73 4d 61 74 63 68   */.  u8 isMatch
338c0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69  ;           /* i
338d0 43 6f 6c 75 6d 6e 20 6d 61 74 63 68 65 73 20 61  Column matches a
338e0 20 74 65 72 6d 20 6f 66 20 74 68 65 20 4f 52 44   term of the ORD
338f0 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  ER BY clause */.
33900 20 20 75 31 36 20 6e 4b 65 79 43 6f 6c 3b 20 20    u16 nKeyCol;  
33910 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
33920 72 20 6f 66 20 6b 65 79 20 63 6f 6c 75 6d 6e 73  r of key columns
33930 20 69 6e 20 70 49 6e 64 65 78 20 2a 2f 0a 20 20   in pIndex */.  
33940 75 31 36 20 6e 43 6f 6c 75 6d 6e 3b 20 20 20 20  u16 nColumn;    
33950 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e        /* Total n
33960 75 6d 62 65 72 20 6f 66 20 6f 72 64 65 72 65 64  umber of ordered
33970 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
33980 69 6e 64 65 78 20 2a 2f 0a 20 20 75 31 36 20 6e  index */.  u16 n
33990 4f 72 64 65 72 42 79 3b 20 20 20 20 20 20 20 20  OrderBy;        
339a0 20 2f 2a 20 4e 75 6d 62 65 72 20 74 65 72 6d 73   /* Number terms
339b0 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59   in the ORDER BY
339c0 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74   clause */.  int
339d0 20 69 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20   iLoop;         
339e0 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 57     /* Index of W
339f0 68 65 72 65 4c 6f 6f 70 20 69 6e 20 70 50 61 74  hereLoop in pPat
33a00 68 20 62 65 69 6e 67 20 70 72 6f 63 65 73 73 65  h being processe
33a10 64 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  d */.  int i, j;
33a20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
33a30 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f  Loop counters */
33a40 0a 20 20 69 6e 74 20 69 43 75 72 3b 20 20 20 20  .  int iCur;    
33a50 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
33a60 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 63 75  or number for cu
33a70 72 72 65 6e 74 20 57 68 65 72 65 4c 6f 6f 70 20  rrent WhereLoop 
33a80 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e  */.  int iColumn
33a90 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20  ;          /* A 
33aa0 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 77 69  column number wi
33ab0 74 68 69 6e 20 74 61 62 6c 65 20 69 43 75 72 20  thin table iCur 
33ac0 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  */.  WhereLoop *
33ad0 70 4c 6f 6f 70 20 3d 20 30 3b 20 2f 2a 20 43 75  pLoop = 0; /* Cu
33ae0 72 72 65 6e 74 20 57 68 65 72 65 4c 6f 6f 70 20  rrent WhereLoop 
33af0 62 65 69 6e 67 20 70 72 6f 63 65 73 73 65 64 2e  being processed.
33b00 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
33b10 2a 70 54 65 72 6d 3b 20 20 20 20 20 2f 2a 20 41  *pTerm;     /* A
33b20 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 6f 66 20   single term of 
33b30 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
33b40 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4f 42 45   */.  Expr *pOBE
33b50 78 70 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 41  xpr;        /* A
33b60 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 66 72 6f  n expression fro
33b70 6d 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  m the ORDER BY c
33b80 6c 61 75 73 65 20 2a 2f 0a 20 20 43 6f 6c 6c 53  lause */.  CollS
33b90 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 20 20  eq *pColl;      
33ba0 20 2f 2a 20 43 4f 4c 4c 41 54 45 20 66 75 6e 63   /* COLLATE func
33bb0 74 69 6f 6e 20 66 72 6f 6d 20 61 6e 20 4f 52 44  tion from an ORD
33bc0 45 52 20 42 59 20 63 6c 61 75 73 65 20 74 65 72  ER BY clause ter
33bd0 6d 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  m */.  Index *pI
33be0 6e 64 65 78 3b 20 20 20 20 20 20 20 20 2f 2a 20  ndex;        /* 
33bf0 54 68 65 20 69 6e 64 65 78 20 61 73 73 6f 63 69  The index associ
33c00 61 74 65 64 20 77 69 74 68 20 70 4c 6f 6f 70 20  ated with pLoop 
33c10 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
33c20 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73   = pWInfo->pPars
33c30 65 2d 3e 64 62 3b 20 20 2f 2a 20 44 61 74 61 62  e->db;  /* Datab
33c40 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
33c50 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6f 62 53 61  /.  Bitmask obSa
33c60 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4d 61 73  t = 0;    /* Mas
33c70 6b 20 6f 66 20 4f 52 44 45 52 20 42 59 20 74 65  k of ORDER BY te
33c80 72 6d 73 20 73 61 74 69 73 66 69 65 64 20 73 6f  rms satisfied so
33c90 20 66 61 72 20 2a 2f 0a 20 20 42 69 74 6d 61 73   far */.  Bitmas
33ca0 6b 20 6f 62 44 6f 6e 65 3b 20 20 20 20 20 20 20  k obDone;       
33cb0 2f 2a 20 4d 61 73 6b 20 6f 66 20 61 6c 6c 20 4f  /* Mask of all O
33cc0 52 44 45 52 20 42 59 20 74 65 72 6d 73 20 2a 2f  RDER BY terms */
33cd0 0a 20 20 42 69 74 6d 61 73 6b 20 6f 72 64 65 72  .  Bitmask order
33ce0 44 69 73 74 69 6e 63 74 4d 61 73 6b 3b 20 20 2f  DistinctMask;  /
33cf0 2a 20 4d 61 73 6b 20 6f 66 20 61 6c 6c 20 77 65  * Mask of all we
33d00 6c 6c 2d 6f 72 64 65 72 65 64 20 6c 6f 6f 70 73  ll-ordered loops
33d10 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 72 65   */.  Bitmask re
33d20 61 64 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  ady;            
33d30 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 69 6e 6e    /* Mask of inn
33d40 65 72 20 6c 6f 6f 70 73 20 2a 2f 0a 0a 20 20 2f  er loops */..  /
33d50 2a 0a 20 20 2a 2a 20 57 65 20 73 61 79 20 74 68  *.  ** We say th
33d60 65 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 20 22  e WhereLoop is "
33d70 6f 6e 65 2d 72 6f 77 22 20 69 66 20 69 74 20 67  one-row" if it g
33d80 65 6e 65 72 61 74 65 73 20 6e 6f 20 6d 6f 72 65  enerates no more
33d90 20 74 68 61 6e 20 6f 6e 65 0a 20 20 2a 2a 20 72   than one.  ** r
33da0 6f 77 20 6f 66 20 6f 75 74 70 75 74 2e 20 20 41  ow of output.  A
33db0 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 20 6f 6e   WhereLoop is on
33dc0 65 2d 72 6f 77 20 69 66 20 61 6c 6c 20 6f 66 20  e-row if all of 
33dd0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72  the following ar
33de0 65 20 74 72 75 65 3a 0a 20 20 2a 2a 20 20 28 61  e true:.  **  (a
33df0 29 20 41 6c 6c 20 69 6e 64 65 78 20 63 6f 6c 75  ) All index colu
33e00 6d 6e 73 20 6d 61 74 63 68 20 77 69 74 68 20 57  mns match with W
33e10 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 2e 0a  HERE_COLUMN_EQ..
33e20 20 20 2a 2a 20 20 28 62 29 20 54 68 65 20 69 6e    **  (b) The in
33e30 64 65 78 20 69 73 20 75 6e 69 71 75 65 0a 20 20  dex is unique.  
33e40 2a 2a 20 41 6e 79 20 57 68 65 72 65 4c 6f 6f 70  ** Any WhereLoop
33e50 20 77 69 74 68 20 61 6e 20 57 48 45 52 45 5f 43   with an WHERE_C
33e60 4f 4c 55 4d 4e 5f 45 51 20 63 6f 6e 73 74 72 61  OLUMN_EQ constra
33e70 69 6e 74 20 6f 6e 20 74 68 65 20 72 6f 77 69 64  int on the rowid
33e80 20 69 73 20 6f 6e 65 2d 72 6f 77 2e 0a 20 20 2a   is one-row..  *
33e90 2a 20 45 76 65 72 79 20 6f 6e 65 2d 72 6f 77 20  * Every one-row 
33ea0 57 68 65 72 65 4c 6f 6f 70 20 77 69 6c 6c 20 68  WhereLoop will h
33eb0 61 76 65 20 74 68 65 20 57 48 45 52 45 5f 4f 4e  ave the WHERE_ON
33ec0 45 52 4f 57 20 62 69 74 20 73 65 74 20 69 6e 20  EROW bit set in 
33ed0 77 73 46 6c 61 67 73 2e 0a 20 20 2a 2a 0a 20 20  wsFlags..  **.  
33ee0 2a 2a 20 57 65 20 73 61 79 20 74 68 65 20 57 68  ** We say the Wh
33ef0 65 72 65 4c 6f 6f 70 20 69 73 20 22 6f 72 64 65  ereLoop is "orde
33f00 72 2d 64 69 73 74 69 6e 63 74 22 20 69 66 20 74  r-distinct" if t
33f10 68 65 20 73 65 74 20 6f 66 20 63 6f 6c 75 6d 6e  he set of column
33f20 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 74 68 61 74  s from.  ** that
33f30 20 57 68 65 72 65 4c 6f 6f 70 20 74 68 61 74 20   WhereLoop that 
33f40 61 72 65 20 69 6e 20 74 68 65 20 4f 52 44 45 52  are in the ORDER
33f50 20 42 59 20 63 6c 61 75 73 65 20 61 72 65 20 64   BY clause are d
33f60 69 66 66 65 72 65 6e 74 20 66 6f 72 20 65 76 65  ifferent for eve
33f70 72 79 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20 74  ry.  ** row of t
33f80 68 65 20 57 68 65 72 65 4c 6f 6f 70 2e 20 20 45  he WhereLoop.  E
33f90 76 65 72 79 20 6f 6e 65 2d 72 6f 77 20 57 68 65  very one-row Whe
33fa0 72 65 4c 6f 6f 70 20 69 73 20 61 75 74 6f 6d 61  reLoop is automa
33fb0 74 69 63 61 6c 6c 79 0a 20 20 2a 2a 20 6f 72 64  tically.  ** ord
33fc0 65 72 2d 64 69 73 74 69 6e 63 74 2e 20 20 20 41  er-distinct.   A
33fd0 20 57 68 65 72 65 4c 6f 6f 70 20 74 68 61 74 20   WhereLoop that 
33fe0 68 61 73 20 6e 6f 20 63 6f 6c 75 6d 6e 73 20 69  has no columns i
33ff0 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  n the ORDER BY c
34000 6c 61 75 73 65 0a 20 20 2a 2a 20 69 73 20 6e 6f  lause.  ** is no
34010 74 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74  t order-distinct
34020 2e 20 54 6f 20 62 65 20 6f 72 64 65 72 2d 64 69  . To be order-di
34030 73 74 69 6e 63 74 20 69 73 20 6e 6f 74 20 71 75  stinct is not qu
34040 69 74 65 20 74 68 65 20 73 61 6d 65 20 61 73 20  ite the same as 
34050 62 65 69 6e 67 0a 20 20 2a 2a 20 55 4e 49 51 55  being.  ** UNIQU
34060 45 20 73 69 6e 63 65 20 61 20 55 4e 49 51 55 45  E since a UNIQUE
34070 20 63 6f 6c 75 6d 6e 20 6f 72 20 69 6e 64 65 78   column or index
34080 20 63 61 6e 20 68 61 76 65 20 6d 75 6c 74 69 70   can have multip
34090 6c 65 20 72 6f 77 73 20 74 68 61 74 20 0a 20 20  le rows that .  
340a0 2a 2a 20 61 72 65 20 4e 55 4c 4c 20 61 6e 64 20  ** are NULL and 
340b0 4e 55 4c 4c 20 76 61 6c 75 65 73 20 61 72 65 20  NULL values are 
340c0 65 71 75 69 76 61 6c 65 6e 74 20 66 6f 72 20 74  equivalent for t
340d0 68 65 20 70 75 72 70 6f 73 65 20 6f 66 20 6f 72  he purpose of or
340e0 64 65 72 2d 64 69 73 74 69 6e 63 74 2e 0a 20 20  der-distinct..  
340f0 2a 2a 20 54 6f 20 62 65 20 6f 72 64 65 72 2d 64  ** To be order-d
34100 69 73 74 69 6e 63 74 2c 20 74 68 65 20 63 6f 6c  istinct, the col
34110 75 6d 6e 73 20 6d 75 73 74 20 62 65 20 55 4e 49  umns must be UNI
34120 51 55 45 20 61 6e 64 20 4e 4f 54 20 4e 55 4c 4c  QUE and NOT NULL
34130 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  **.  ** The 
34140 72 6f 77 69 64 20 66 6f 72 20 61 20 74 61 62 6c  rowid for a tabl
34150 65 20 69 73 20 61 6c 77 61 79 73 20 55 4e 49 51  e is always UNIQ
34160 55 45 20 61 6e 64 20 4e 4f 54 20 4e 55 4c 4c 20  UE and NOT NULL 
34170 73 6f 20 77 68 65 6e 65 76 65 72 20 74 68 65 0a  so whenever the.
34180 20 20 2a 2a 20 72 6f 77 69 64 20 61 70 70 65 61    ** rowid appea
34190 72 73 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20  rs in the ORDER 
341a0 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65 20 63  BY clause, the c
341b0 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 57 68 65  orresponding Whe
341c0 72 65 4c 6f 6f 70 20 69 73 0a 20 20 2a 2a 20 61  reLoop is.  ** a
341d0 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 6f 72 64  utomatically ord
341e0 65 72 2d 64 69 73 74 69 6e 63 74 2e 0a 20 20 2a  er-distinct..  *
341f0 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f 72  /..  assert( pOr
34200 64 65 72 42 79 21 3d 30 20 29 3b 0a 20 20 69 66  derBy!=0 );.  if
34210 28 20 6e 4c 6f 6f 70 20 26 26 20 4f 70 74 69 6d  ( nLoop && Optim
34220 69 7a 61 74 69 6f 6e 44 69 73 61 62 6c 65 64 28  izationDisabled(
34230 64 62 2c 20 53 51 4c 49 54 45 5f 4f 72 64 65 72  db, SQLITE_Order
34240 42 79 49 64 78 4a 6f 69 6e 29 20 29 20 72 65 74  ByIdxJoin) ) ret
34250 75 72 6e 20 30 3b 0a 0a 20 20 6e 4f 72 64 65 72  urn 0;..  nOrder
34260 42 79 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e  By = pOrderBy->n
34270 45 78 70 72 3b 0a 20 20 74 65 73 74 63 61 73 65  Expr;.  testcase
34280 28 20 6e 4f 72 64 65 72 42 79 3d 3d 42 4d 53 2d  ( nOrderBy==BMS-
34290 31 20 29 3b 0a 20 20 69 66 28 20 6e 4f 72 64 65  1 );.  if( nOrde
342a0 72 42 79 3e 42 4d 53 2d 31 20 29 20 72 65 74 75  rBy>BMS-1 ) retu
342b0 72 6e 20 30 3b 20 20 2f 2a 20 43 61 6e 6e 6f 74  rn 0;  /* Cannot
342c0 20 6f 70 74 69 6d 69 7a 65 20 6f 76 65 72 6c 79   optimize overly
342d0 20 6c 61 72 67 65 20 4f 52 44 45 52 20 42 59 73   large ORDER BYs
342e0 20 2a 2f 0a 20 20 69 73 4f 72 64 65 72 44 69 73   */.  isOrderDis
342f0 74 69 6e 63 74 20 3d 20 31 3b 0a 20 20 6f 62 44  tinct = 1;.  obD
34300 6f 6e 65 20 3d 20 4d 41 53 4b 42 49 54 28 6e 4f  one = MASKBIT(nO
34310 72 64 65 72 42 79 29 2d 31 3b 0a 20 20 6f 72 64  rderBy)-1;.  ord
34320 65 72 44 69 73 74 69 6e 63 74 4d 61 73 6b 20 3d  erDistinctMask =
34330 20 30 3b 0a 20 20 72 65 61 64 79 20 3d 20 30 3b   0;.  ready = 0;
34340 0a 20 20 66 6f 72 28 69 4c 6f 6f 70 3d 30 3b 20  .  for(iLoop=0; 
34350 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20  isOrderDistinct 
34360 26 26 20 6f 62 53 61 74 3c 6f 62 44 6f 6e 65 20  && obSat<obDone 
34370 26 26 20 69 4c 6f 6f 70 3c 3d 6e 4c 6f 6f 70 3b  && iLoop<=nLoop;
34380 20 69 4c 6f 6f 70 2b 2b 29 7b 0a 20 20 20 20 69   iLoop++){.    i
34390 66 28 20 69 4c 6f 6f 70 3e 30 20 29 20 72 65 61  f( iLoop>0 ) rea
343a0 64 79 20 7c 3d 20 70 4c 6f 6f 70 2d 3e 6d 61 73  dy |= pLoop->mas
343b0 6b 53 65 6c 66 3b 0a 20 20 20 20 70 4c 6f 6f 70  kSelf;.    pLoop
343c0 20 3d 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70 20 3f   = iLoop<nLoop ?
343d0 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b 69 4c   pPath->aLoop[iL
343e0 6f 6f 70 5d 20 3a 20 70 4c 61 73 74 3b 0a 20 20  oop] : pLast;.  
343f0 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46    if( pLoop->wsF
34400 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52  lags & WHERE_VIR
34410 54 55 41 4c 54 41 42 4c 45 20 29 7b 0a 20 20 20  TUALTABLE ){.   
34420 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 75 2e     if( pLoop->u.
34430 76 74 61 62 2e 69 73 4f 72 64 65 72 65 64 20 29  vtab.isOrdered )
34440 20 6f 62 53 61 74 20 3d 20 6f 62 44 6f 6e 65 3b   obSat = obDone;
34450 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
34460 20 20 7d 0a 20 20 20 20 69 43 75 72 20 3d 20 70    }.    iCur = p
34470 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d  WInfo->pTabList-
34480 3e 61 5b 70 4c 6f 6f 70 2d 3e 69 54 61 62 5d 2e  >a[pLoop->iTab].
34490 69 43 75 72 73 6f 72 3b 0a 0a 20 20 20 20 2f 2a  iCursor;..    /*
344a0 20 4d 61 72 6b 20 6f 66 66 20 61 6e 79 20 4f 52   Mark off any OR
344b0 44 45 52 20 42 59 20 74 65 72 6d 20 58 20 74 68  DER BY term X th
344c0 61 74 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 69  at is a column i
344d0 6e 20 74 68 65 20 74 61 62 6c 65 20 6f 66 0a 20  n the table of. 
344e0 20 20 20 2a 2a 20 74 68 65 20 63 75 72 72 65 6e     ** the curren
344f0 74 20 6c 6f 6f 70 20 66 6f 72 20 77 68 69 63 68  t loop for which
34500 20 74 68 65 72 65 20 69 73 20 74 65 72 6d 20 69   there is term i
34510 6e 20 74 68 65 20 57 48 45 52 45 0a 20 20 20 20  n the WHERE.    
34520 2a 2a 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  ** clause of the
34530 20 66 6f 72 6d 20 58 20 49 53 20 4e 55 4c 4c 20   form X IS NULL 
34540 6f 72 20 58 3d 3f 20 74 68 61 74 20 72 65 66 65  or X=? that refe
34550 72 65 6e 63 65 20 6f 6e 6c 79 20 6f 75 74 65 72  rence only outer
34560 0a 20 20 20 20 2a 2a 20 6c 6f 6f 70 73 2e 0a 20  .    ** loops.. 
34570 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d     */.    for(i=
34580 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69  0; i<nOrderBy; i
34590 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 4d  ++){.      if( M
345a0 41 53 4b 42 49 54 28 69 29 20 26 20 6f 62 53 61  ASKBIT(i) & obSa
345b0 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  t ) continue;.  
345c0 20 20 20 20 70 4f 42 45 78 70 72 20 3d 20 73 71      pOBExpr = sq
345d0 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c  lite3ExprSkipCol
345e0 6c 61 74 65 28 70 4f 72 64 65 72 42 79 2d 3e 61  late(pOrderBy->a
345f0 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [i].pExpr);.    
34600 20 20 69 66 28 20 70 4f 42 45 78 70 72 2d 3e 6f    if( pOBExpr->o
34610 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 63  p!=TK_COLUMN ) c
34620 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69  ontinue;.      i
34630 66 28 20 70 4f 42 45 78 70 72 2d 3e 69 54 61 62  f( pOBExpr->iTab
34640 6c 65 21 3d 69 43 75 72 20 29 20 63 6f 6e 74 69  le!=iCur ) conti
34650 6e 75 65 3b 0a 20 20 20 20 20 20 70 54 65 72 6d  nue;.      pTerm
34660 20 3d 20 66 69 6e 64 54 65 72 6d 28 26 70 57 49   = findTerm(&pWI
34670 6e 66 6f 2d 3e 73 57 43 2c 20 69 43 75 72 2c 20  nfo->sWC, iCur, 
34680 70 4f 42 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  pOBExpr->iColumn
34690 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
346a0 20 20 20 20 20 20 20 20 20 7e 72 65 61 64 79 2c           ~ready,
346b0 20 57 4f 5f 45 51 7c 57 4f 5f 49 53 4e 55 4c 4c   WO_EQ|WO_ISNULL
346c0 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
346d0 70 54 65 72 6d 3d 3d 30 20 29 20 63 6f 6e 74 69  pTerm==0 ) conti
346e0 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 28  nue;.      if( (
346f0 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
34700 26 57 4f 5f 45 51 29 21 3d 30 20 26 26 20 70 4f  &WO_EQ)!=0 && pO
34710 42 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d  BExpr->iColumn>=
34720 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e  0 ){.        con
34730 73 74 20 63 68 61 72 20 2a 7a 31 2c 20 2a 7a 32  st char *z1, *z2
34740 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20  ;.        pColl 
34750 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
34760 6c 53 65 71 28 70 57 49 6e 66 6f 2d 3e 70 50 61  lSeq(pWInfo->pPa
34770 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 61  rse, pOrderBy->a
34780 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [i].pExpr);.    
34790 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29      if( !pColl )
347a0 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66   pColl = db->pDf
347b0 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20  ltColl;.        
347c0 7a 31 20 3d 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d  z1 = pColl->zNam
347d0 65 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c  e;.        pColl
347e0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
347f0 6c 6c 53 65 71 28 70 57 49 6e 66 6f 2d 3e 70 50  llSeq(pWInfo->pP
34800 61 72 73 65 2c 20 70 54 65 72 6d 2d 3e 70 45 78  arse, pTerm->pEx
34810 70 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  pr);.        if(
34820 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20   !pColl ) pColl 
34830 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b  = db->pDfltColl;
34840 0a 20 20 20 20 20 20 20 20 7a 32 20 3d 20 70 43  .        z2 = pC
34850 6f 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20  oll->zName;.    
34860 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
34870 74 72 49 43 6d 70 28 7a 31 2c 20 7a 32 29 21 3d  trICmp(z1, z2)!=
34880 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
34890 20 20 20 20 7d 0a 20 20 20 20 20 20 6f 62 53 61      }.      obSa
348a0 74 20 7c 3d 20 4d 41 53 4b 42 49 54 28 69 29 3b  t |= MASKBIT(i);
348b0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
348c0 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  (pLoop->wsFlags 
348d0 26 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 29 3d  & WHERE_ONEROW)=
348e0 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
348f0 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
34900 20 57 48 45 52 45 5f 49 50 4b 20 29 7b 0a 20 20   WHERE_IPK ){.  
34910 20 20 20 20 20 20 70 49 6e 64 65 78 20 3d 20 30        pIndex = 0
34920 3b 0a 20 20 20 20 20 20 20 20 6e 4b 65 79 43 6f  ;.        nKeyCo
34930 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 6e  l = 0;.        n
34940 43 6f 6c 75 6d 6e 20 3d 20 31 3b 0a 20 20 20 20  Column = 1;.    
34950 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 49 6e    }else if( (pIn
34960 64 65 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62  dex = pLoop->u.b
34970 74 72 65 65 2e 70 49 6e 64 65 78 29 3d 3d 30 20  tree.pIndex)==0 
34980 7c 7c 20 70 49 6e 64 65 78 2d 3e 62 55 6e 6f 72  || pIndex->bUnor
34990 64 65 72 65 64 20 29 7b 0a 20 20 20 20 20 20 20  dered ){.       
349a0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
349b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
349c0 6e 4b 65 79 43 6f 6c 20 3d 20 70 49 6e 64 65 78  nKeyCol = pIndex
349d0 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20 20 20 20  ->nKeyCol;.     
349e0 20 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 70 49 6e     nColumn = pIn
349f0 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20  dex->nColumn;.  
34a00 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43        assert( nC
34a10 6f 6c 75 6d 6e 3d 3d 6e 4b 65 79 43 6f 6c 2b 31  olumn==nKeyCol+1
34a20 20 7c 7c 20 21 48 61 73 52 6f 77 69 64 28 70 49   || !HasRowid(pI
34a30 6e 64 65 78 2d 3e 70 54 61 62 6c 65 29 20 29 3b  ndex->pTable) );
34a40 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
34a50 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d   pIndex->aiColum
34a60 6e 5b 6e 43 6f 6c 75 6d 6e 2d 31 5d 3d 3d 28 2d  n[nColumn-1]==(-
34a70 31 29 20 7c 7c 20 21 48 61 73 52 6f 77 69 64 28  1) || !HasRowid(
34a80 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 29 29  pIndex->pTable))
34a90 3b 0a 20 20 20 20 20 20 20 20 69 73 4f 72 64 65  ;.        isOrde
34aa0 72 44 69 73 74 69 6e 63 74 20 3d 20 49 73 55 6e  rDistinct = IsUn
34ab0 69 71 75 65 49 6e 64 65 78 28 70 49 6e 64 65 78  iqueIndex(pIndex
34ac0 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
34ad0 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67    /* Loop throug
34ae0 68 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 6f 66  h all columns of
34af0 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20 64   the index and d
34b00 65 61 6c 20 77 69 74 68 20 74 68 65 20 6f 6e 65  eal with the one
34b10 73 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20  s.      ** that 
34b20 61 72 65 20 6e 6f 74 20 63 6f 6e 73 74 72 61 69  are not constrai
34b30 6e 65 64 20 62 79 20 3d 3d 20 6f 72 20 49 4e 2e  ned by == or IN.
34b40 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
34b50 72 65 76 20 3d 20 72 65 76 53 65 74 20 3d 20 30  rev = revSet = 0
34b60 3b 0a 20 20 20 20 20 20 64 69 73 74 69 6e 63 74  ;.      distinct
34b70 43 6f 6c 75 6d 6e 73 20 3d 20 30 3b 0a 20 20 20  Columns = 0;.   
34b80 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 43     for(j=0; j<nC
34b90 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20  olumn; j++){.   
34ba0 20 20 20 20 20 75 38 20 62 4f 6e 63 65 3b 20 20       u8 bOnce;  
34bb0 20 2f 2a 20 54 72 75 65 20 74 6f 20 72 75 6e 20   /* True to run 
34bc0 74 68 65 20 4f 52 44 45 52 20 42 59 20 73 65 61  the ORDER BY sea
34bd0 72 63 68 20 6c 6f 6f 70 20 2a 2f 0a 0a 20 20 20  rch loop */..   
34be0 20 20 20 20 20 2f 2a 20 53 6b 69 70 20 6f 76 65       /* Skip ove
34bf0 72 20 3d 3d 20 61 6e 64 20 49 53 20 4e 55 4c 4c  r == and IS NULL
34c00 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20   terms */.      
34c10 20 20 69 66 28 20 6a 3c 70 4c 6f 6f 70 2d 3e 75    if( j<pLoop->u
34c20 2e 62 74 72 65 65 2e 6e 45 71 0a 20 20 20 20 20  .btree.nEq.     
34c30 20 20 20 20 26 26 20 70 4c 6f 6f 70 2d 3e 6e 53      && pLoop->nS
34c40 6b 69 70 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  kip==0.         
34c50 26 26 20 28 28 69 20 3d 20 70 4c 6f 6f 70 2d 3e  && ((i = pLoop->
34c60 61 4c 54 65 72 6d 5b 6a 5d 2d 3e 65 4f 70 65 72  aLTerm[j]->eOper
34c70 61 74 6f 72 29 20 26 20 28 57 4f 5f 45 51 7c 57  ator) & (WO_EQ|W
34c80 4f 5f 49 53 4e 55 4c 4c 29 29 21 3d 30 0a 20 20  O_ISNULL))!=0.  
34c90 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
34ca0 20 20 20 69 66 28 20 69 20 26 20 57 4f 5f 49 53     if( i & WO_IS
34cb0 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20  NULL ){.        
34cc0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 73      testcase( is
34cd0 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 29 3b  OrderDistinct );
34ce0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f  .            isO
34cf0 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20 30  rderDistinct = 0
34d00 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
34d10 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
34d20 3b 20 20 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  ;  .        }.. 
34d30 20 20 20 20 20 20 20 2f 2a 20 47 65 74 20 74 68         /* Get th
34d40 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20  e column number 
34d50 69 6e 20 74 68 65 20 74 61 62 6c 65 20 28 69 43  in the table (iC
34d60 6f 6c 75 6d 6e 29 20 61 6e 64 20 73 6f 72 74 20  olumn) and sort 
34d70 6f 72 64 65 72 0a 20 20 20 20 20 20 20 20 2a 2a  order.        **
34d80 20 28 72 65 76 49 64 78 29 20 66 6f 72 20 74 68   (revIdx) for th
34d90 65 20 6a 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66  e j-th column of
34da0 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 20 20   the index..    
34db0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
34dc0 66 28 20 70 49 6e 64 65 78 20 29 7b 0a 20 20 20  f( pIndex ){.   
34dd0 20 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d         iColumn =
34de0 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d   pIndex->aiColum
34df0 6e 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  n[j];.          
34e00 72 65 76 49 64 78 20 3d 20 70 49 6e 64 65 78 2d  revIdx = pIndex-
34e10 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6a 5d 3b 0a  >aSortOrder[j];.
34e20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 43            if( iC
34e30 6f 6c 75 6d 6e 3d 3d 70 49 6e 64 65 78 2d 3e 70  olumn==pIndex->p
34e40 54 61 62 6c 65 2d 3e 69 50 4b 65 79 20 29 20 69  Table->iPKey ) i
34e50 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20  Column = -1;.   
34e60 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
34e70 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20        iColumn = 
34e80 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  -1;.          re
34e90 76 49 64 78 20 3d 20 30 3b 0a 20 20 20 20 20 20  vIdx = 0;.      
34ea0 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20    }..        /* 
34eb0 41 6e 20 75 6e 63 6f 6e 73 74 72 61 69 6e 65 64  An unconstrained
34ec0 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 6d 69 67   column that mig
34ed0 68 74 20 62 65 20 4e 55 4c 4c 20 6d 65 61 6e 73  ht be NULL means
34ee0 20 74 68 61 74 20 74 68 69 73 0a 20 20 20 20 20   that this.     
34ef0 20 20 20 2a 2a 20 57 68 65 72 65 4c 6f 6f 70 20     ** WhereLoop 
34f00 69 73 20 6e 6f 74 20 77 65 6c 6c 2d 6f 72 64 65  is not well-orde
34f10 72 65 64 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  red.        */. 
34f20 20 20 20 20 20 20 20 69 66 28 20 69 73 4f 72 64         if( isOrd
34f30 65 72 44 69 73 74 69 6e 63 74 0a 20 20 20 20 20  erDistinct.     
34f40 20 20 20 20 26 26 20 69 43 6f 6c 75 6d 6e 3e 3d      && iColumn>=
34f50 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 6a 3e  0.         && j>
34f60 3d 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e  =pLoop->u.btree.
34f70 6e 45 71 0a 20 20 20 20 20 20 20 20 20 26 26 20  nEq.         && 
34f80 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e  pIndex->pTable->
34f90 61 43 6f 6c 5b 69 43 6f 6c 75 6d 6e 5d 2e 6e 6f  aCol[iColumn].no
34fa0 74 4e 75 6c 6c 3d 3d 30 0a 20 20 20 20 20 20 20  tNull==0.       
34fb0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 73   ){.          is
34fc0 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20  OrderDistinct = 
34fd0 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  0;.        }..  
34fe0 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 20 74 68        /* Find th
34ff0 65 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20  e ORDER BY term 
35000 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 73  that corresponds
35010 20 74 6f 20 74 68 65 20 6a 2d 74 68 20 63 6f 6c   to the j-th col
35020 75 6d 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  umn.        ** o
35030 66 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20  f the index and 
35040 6d 61 72 6b 20 74 68 61 74 20 4f 52 44 45 52 20  mark that ORDER 
35050 42 59 20 74 65 72 6d 20 6f 66 66 20 0a 20 20 20  BY term off .   
35060 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
35070 62 4f 6e 63 65 20 3d 20 31 3b 0a 20 20 20 20 20  bOnce = 1;.     
35080 20 20 20 69 73 4d 61 74 63 68 20 3d 20 30 3b 0a     isMatch = 0;.
35090 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
350a0 20 62 4f 6e 63 65 20 26 26 20 69 3c 6e 4f 72 64   bOnce && i<nOrd
350b0 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  erBy; i++){.    
350c0 20 20 20 20 20 20 69 66 28 20 4d 41 53 4b 42 49        if( MASKBI
350d0 54 28 69 29 20 26 20 6f 62 53 61 74 20 29 20 63  T(i) & obSat ) c
350e0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
350f0 20 20 20 70 4f 42 45 78 70 72 20 3d 20 73 71 6c     pOBExpr = sql
35100 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c  ite3ExprSkipColl
35110 61 74 65 28 70 4f 72 64 65 72 42 79 2d 3e 61 5b  ate(pOrderBy->a[
35120 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  i].pExpr);.     
35130 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 77       testcase( w
35140 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
35150 45 5f 47 52 4f 55 50 42 59 20 29 3b 0a 20 20 20  E_GROUPBY );.   
35160 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
35170 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48   wctrlFlags & WH
35180 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59 20 29  ERE_DISTINCTBY )
35190 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
351a0 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 28 57  (wctrlFlags & (W
351b0 48 45 52 45 5f 47 52 4f 55 50 42 59 7c 57 48 45  HERE_GROUPBY|WHE
351c0 52 45 5f 44 49 53 54 49 4e 43 54 42 59 29 29 3d  RE_DISTINCTBY))=
351d0 3d 30 20 29 20 62 4f 6e 63 65 20 3d 20 30 3b 0a  =0 ) bOnce = 0;.
351e0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4f            if( pO
351f0 42 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f  BExpr->op!=TK_CO
35200 4c 55 4d 4e 20 29 20 63 6f 6e 74 69 6e 75 65 3b  LUMN ) continue;
35210 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
35220 4f 42 45 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d  OBExpr->iTable!=
35230 69 43 75 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b  iCur ) continue;
35240 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
35250 4f 42 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 21  OBExpr->iColumn!
35260 3d 69 43 6f 6c 75 6d 6e 20 29 20 63 6f 6e 74 69  =iColumn ) conti
35270 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 69  nue;.          i
35280 66 28 20 69 43 6f 6c 75 6d 6e 3e 3d 30 20 29 7b  f( iColumn>=0 ){
35290 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f  .            pCo
352a0 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
352b0 43 6f 6c 6c 53 65 71 28 70 57 49 6e 66 6f 2d 3e  CollSeq(pWInfo->
352c0 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79  pParse, pOrderBy
352d0 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[i].pExpr);. 
352e0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21             if( !
352f0 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20  pColl ) pColl = 
35300 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20  db->pDfltColl;. 
35310 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73             if( s
35320 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 43  qlite3StrICmp(pC
35330 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 70 49 6e 64  oll->zName, pInd
35340 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 29 21 3d  ex->azColl[j])!=
35350 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
35360 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
35370 20 20 20 20 69 73 4d 61 74 63 68 20 3d 20 31 3b      isMatch = 1;
35380 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
35390 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
353a0 20 20 20 20 69 66 28 20 69 73 4d 61 74 63 68 20      if( isMatch 
353b0 26 26 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26  && (wctrlFlags &
353c0 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59 29 3d   WHERE_GROUPBY)=
353d0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
353e0 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
353f0 20 73 6f 72 74 20 6f 72 64 65 72 20 69 73 20 63   sort order is c
35400 6f 6d 70 61 74 69 62 6c 65 20 69 6e 20 61 6e 20  ompatible in an 
35410 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e  ORDER BY clause.
35420 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 53 6f  .          ** So
35430 72 74 20 6f 72 64 65 72 20 69 73 20 69 72 72 65  rt order is irre
35440 6c 65 76 61 6e 74 20 66 6f 72 20 61 20 47 52 4f  levant for a GRO
35450 55 50 20 42 59 20 63 6c 61 75 73 65 2e 20 2a 2f  UP BY clause. */
35460 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
35470 65 76 53 65 74 20 29 7b 0a 20 20 20 20 20 20 20  evSet ){.       
35480 20 20 20 20 20 69 66 28 20 28 72 65 76 20 5e 20       if( (rev ^ 
35490 72 65 76 49 64 78 29 21 3d 70 4f 72 64 65 72 42  revIdx)!=pOrderB
354a0 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65  y->a[i].sortOrde
354b0 72 20 29 20 69 73 4d 61 74 63 68 20 3d 20 30 3b  r ) isMatch = 0;
354c0 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
354d0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  {.            re
354e0 76 20 3d 20 72 65 76 49 64 78 20 5e 20 70 4f 72  v = revIdx ^ pOr
354f0 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74  derBy->a[i].sort
35500 4f 72 64 65 72 3b 0a 20 20 20 20 20 20 20 20 20  Order;.         
35510 20 20 20 69 66 28 20 72 65 76 20 29 20 2a 70 52     if( rev ) *pR
35520 65 76 4d 61 73 6b 20 7c 3d 20 4d 41 53 4b 42 49  evMask |= MASKBI
35530 54 28 69 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20  T(iLoop);.      
35540 20 20 20 20 20 20 72 65 76 53 65 74 20 3d 20 31        revSet = 1
35550 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
35560 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
35570 69 66 28 20 69 73 4d 61 74 63 68 20 29 7b 0a 20  if( isMatch ){. 
35580 20 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f           if( iCo
35590 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20  lumn<0 ){.      
355a0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
355b0 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 3d  distinctColumns=
355c0 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  =0 );.          
355d0 20 20 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e    distinctColumn
355e0 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  s = 1;.         
355f0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6f 62 53   }.          obS
35600 61 74 20 7c 3d 20 4d 41 53 4b 42 49 54 28 69 29  at |= MASKBIT(i)
35610 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
35620 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f  .          /* No
35630 20 6d 61 74 63 68 20 66 6f 75 6e 64 20 2a 2f 0a   match found */.
35640 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6a 3d            if( j=
35650 3d 30 20 7c 7c 20 6a 3c 6e 4b 65 79 43 6f 6c 20  =0 || j<nKeyCol 
35660 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  ){.            t
35670 65 73 74 63 61 73 65 28 20 69 73 4f 72 64 65 72  estcase( isOrder
35680 44 69 73 74 69 6e 63 74 21 3d 30 20 29 3b 0a 20  Distinct!=0 );. 
35690 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64             isOrd
356a0 65 72 44 69 73 74 69 6e 63 74 20 3d 20 30 3b 0a  erDistinct = 0;.
356b0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
356c0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
356d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 2f       }.      } /
356e0 2a 20 65 6e 64 20 4c 6f 6f 70 20 6f 76 65 72 20  * end Loop over 
356f0 61 6c 6c 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e  all index column
35700 73 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 64  s */.      if( d
35710 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 20 29  istinctColumns )
35720 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  {.        testca
35730 73 65 28 20 69 73 4f 72 64 65 72 44 69 73 74 69  se( isOrderDisti
35740 6e 63 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  nct==0 );.      
35750 20 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63    isOrderDistinc
35760 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  t = 1;.      }. 
35770 20 20 20 7d 20 2f 2a 20 65 6e 64 2d 69 66 20 6e     } /* end-if n
35780 6f 74 20 6f 6e 65 2d 72 6f 77 20 2a 2f 0a 0a 20  ot one-row */.. 
35790 20 20 20 2f 2a 20 4d 61 72 6b 20 6f 66 66 20 61     /* Mark off a
357a0 6e 79 20 6f 74 68 65 72 20 4f 52 44 45 52 20 42  ny other ORDER B
357b0 59 20 74 65 72 6d 73 20 74 68 61 74 20 72 65 66  Y terms that ref
357c0 65 72 65 6e 63 65 20 70 4c 6f 6f 70 20 2a 2f 0a  erence pLoop */.
357d0 20 20 20 20 69 66 28 20 69 73 4f 72 64 65 72 44      if( isOrderD
357e0 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 20  istinct ){.     
357f0 20 6f 72 64 65 72 44 69 73 74 69 6e 63 74 4d 61   orderDistinctMa
35800 73 6b 20 7c 3d 20 70 4c 6f 6f 70 2d 3e 6d 61 73  sk |= pLoop->mas
35810 6b 53 65 6c 66 3b 0a 20 20 20 20 20 20 66 6f 72  kSelf;.      for
35820 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79  (i=0; i<nOrderBy
35830 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
35840 45 78 70 72 20 2a 70 3b 0a 20 20 20 20 20 20 20  Expr *p;.       
35850 20 42 69 74 6d 61 73 6b 20 6d 54 65 72 6d 3b 0a   Bitmask mTerm;.
35860 20 20 20 20 20 20 20 20 69 66 28 20 4d 41 53 4b          if( MASK
35870 42 49 54 28 69 29 20 26 20 6f 62 53 61 74 20 29  BIT(i) & obSat )
35880 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
35890 20 20 20 70 20 3d 20 70 4f 72 64 65 72 42 79 2d     p = pOrderBy-
358a0 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
358b0 20 20 20 20 20 6d 54 65 72 6d 20 3d 20 65 78 70       mTerm = exp
358c0 72 54 61 62 6c 65 55 73 61 67 65 28 26 70 57 49  rTableUsage(&pWI
358d0 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 70 29  nfo->sMaskSet,p)
358e0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6d 54  ;.        if( mT
358f0 65 72 6d 3d 3d 30 20 26 26 20 21 73 71 6c 69 74  erm==0 && !sqlit
35900 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
35910 28 70 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  (p) ) continue;.
35920 20 20 20 20 20 20 20 20 69 66 28 20 28 6d 54 65          if( (mTe
35930 72 6d 26 7e 6f 72 64 65 72 44 69 73 74 69 6e 63  rm&~orderDistinc
35940 74 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20  tMask)==0 ){.   
35950 20 20 20 20 20 20 20 6f 62 53 61 74 20 7c 3d 20         obSat |= 
35960 4d 41 53 4b 42 49 54 28 69 29 3b 0a 20 20 20 20  MASKBIT(i);.    
35970 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
35980 20 20 7d 0a 20 20 7d 20 2f 2a 20 45 6e 64 20 74    }.  } /* End t
35990 68 65 20 6c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c  he loop over all
359a0 20 57 68 65 72 65 4c 6f 6f 70 73 20 66 72 6f 6d   WhereLoops from
359b0 20 6f 75 74 65 72 2d 6d 6f 73 74 20 64 6f 77 6e   outer-most down
359c0 20 74 6f 20 69 6e 6e 65 72 2d 6d 6f 73 74 20 2a   to inner-most *
359d0 2f 0a 20 20 69 66 28 20 6f 62 53 61 74 3d 3d 6f  /.  if( obSat==o
359e0 62 44 6f 6e 65 20 29 20 72 65 74 75 72 6e 20 28  bDone ) return (
359f0 69 38 29 6e 4f 72 64 65 72 42 79 3b 0a 20 20 69  i8)nOrderBy;.  i
35a00 66 28 20 21 69 73 4f 72 64 65 72 44 69 73 74 69  f( !isOrderDisti
35a10 6e 63 74 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  nct ){.    for(i
35a20 3d 6e 4f 72 64 65 72 42 79 2d 31 3b 20 69 3e 30  =nOrderBy-1; i>0
35a30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 42 69  ; i--){.      Bi
35a40 74 6d 61 73 6b 20 6d 20 3d 20 4d 41 53 4b 42 49  tmask m = MASKBI
35a50 54 28 69 29 20 2d 20 31 3b 0a 20 20 20 20 20 20  T(i) - 1;.      
35a60 69 66 28 20 28 6f 62 53 61 74 26 6d 29 3d 3d 6d  if( (obSat&m)==m
35a70 20 29 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 20   ) return i;.   
35a80 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b   }.    return 0;
35a90 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31  .  }.  return -1
35aa0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  ;.}.../*.** If t
35ab0 68 65 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59  he WHERE_GROUPBY
35ac0 20 66 6c 61 67 20 69 73 20 73 65 74 20 69 6e 20   flag is set in 
35ad0 74 68 65 20 6d 61 73 6b 20 70 61 73 73 65 64 20  the mask passed 
35ae0 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  to sqlite3WhereB
35af0 65 67 69 6e 28 29 2c 0a 2a 2a 20 74 68 65 20 70  egin(),.** the p
35b00 6c 61 6e 6e 65 72 20 61 73 73 75 6d 65 73 20 74  lanner assumes t
35b10 68 61 74 20 74 68 65 20 73 70 65 63 69 66 69 65  hat the specifie
35b20 64 20 70 4f 72 64 65 72 42 79 20 6c 69 73 74 20  d pOrderBy list 
35b30 69 73 20 61 63 74 75 61 6c 6c 79 20 61 20 47 52  is actually a GR
35b40 4f 55 50 0a 2a 2a 20 42 59 20 63 6c 61 75 73 65  OUP.** BY clause
35b50 20 2d 20 61 6e 64 20 73 6f 20 61 6e 79 20 6f 72   - and so any or
35b60 64 65 72 20 74 68 61 74 20 67 72 6f 75 70 73 20  der that groups 
35b70 72 6f 77 73 20 61 73 20 72 65 71 75 69 72 65 64  rows as required
35b80 20 73 61 74 69 73 66 69 65 73 20 74 68 65 0a 2a   satisfies the.*
35b90 2a 20 72 65 71 75 65 73 74 2e 0a 2a 2a 0a 2a 2a  * request..**.**
35ba0 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 6e 20 74 68   Normally, in th
35bb0 69 73 20 63 61 73 65 20 69 74 20 69 73 20 6e 6f  is case it is no
35bc0 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 74  t possible for t
35bd0 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 64 65 74  he caller to det
35be0 65 72 6d 69 6e 65 0a 2a 2a 20 77 68 65 74 68 65  ermine.** whethe
35bf0 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 72 6f 77  r or not the row
35c00 73 20 61 72 65 20 72 65 61 6c 6c 79 20 62 65 69  s are really bei
35c10 6e 67 20 64 65 6c 69 76 65 72 65 64 20 69 6e 20  ng delivered in 
35c20 73 6f 72 74 65 64 20 6f 72 64 65 72 2c 20 6f 72  sorted order, or
35c30 0a 2a 2a 20 6a 75 73 74 20 69 6e 20 73 6f 6d 65  .** just in some
35c40 20 6f 74 68 65 72 20 6f 72 64 65 72 20 74 68 61   other order tha
35c50 74 20 70 72 6f 76 69 64 65 73 20 74 68 65 20 72  t provides the r
35c60 65 71 75 69 72 65 64 20 67 72 6f 75 70 69 6e 67  equired grouping
35c70 2e 20 48 6f 77 65 76 65 72 2c 0a 2a 2a 20 69 66  . However,.** if
35c80 20 74 68 65 20 57 48 45 52 45 5f 53 4f 52 54 42   the WHERE_SORTB
35c90 59 47 52 4f 55 50 20 66 6c 61 67 20 69 73 20 61  YGROUP flag is a
35ca0 6c 73 6f 20 70 61 73 73 65 64 20 74 6f 20 73 71  lso passed to sq
35cb0 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
35cc0 29 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20  ), then.** this 
35cd0 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65 20  function may be 
35ce0 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 72 65  called on the re
35cf0 74 75 72 6e 65 64 20 57 68 65 72 65 49 6e 66 6f  turned WhereInfo
35d00 20 6f 62 6a 65 63 74 2e 20 49 74 20 72 65 74 75   object. It retu
35d10 72 6e 73 0a 2a 2a 20 74 72 75 65 20 69 66 20 74  rns.** true if t
35d20 68 65 20 72 6f 77 73 20 72 65 61 6c 6c 79 20 77  he rows really w
35d30 69 6c 6c 20 62 65 20 73 6f 72 74 65 64 20 69 6e  ill be sorted in
35d40 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 6f   the specified o
35d50 72 64 65 72 2c 20 6f 72 20 66 61 6c 73 65 0a 2a  rder, or false.*
35d60 2a 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a  * otherwise..**.
35d70 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  ** For example, 
35d80 61 73 73 75 6d 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20  assuming:.**.** 
35d90 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69    CREATE INDEX i
35da0 31 20 4f 4e 20 74 31 28 78 2c 20 59 29 3b 0a 2a  1 ON t1(x, Y);.*
35db0 2a 0a 2a 2a 20 74 68 65 6e 0a 2a 2a 0a 2a 2a 20  *.** then.**.** 
35dc0 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
35dd0 74 31 20 47 52 4f 55 50 20 42 59 20 78 2c 79 20  t1 GROUP BY x,y 
35de0 4f 52 44 45 52 20 42 59 20 78 2c 79 3b 20 20 20  ORDER BY x,y;   
35df0 2d 2d 20 49 73 53 6f 72 74 65 64 28 29 3d 3d 31  -- IsSorted()==1
35e00 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a 20 46  .**   SELECT * F
35e10 52 4f 4d 20 74 31 20 47 52 4f 55 50 20 42 59 20  ROM t1 GROUP BY 
35e20 79 2c 78 20 4f 52 44 45 52 20 42 59 20 79 2c 78  y,x ORDER BY y,x
35e30 3b 20 20 20 2d 2d 20 49 73 53 6f 72 74 65 64 28  ;   -- IsSorted(
35e40 29 3d 3d 30 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  )==0.*/.int sqli
35e50 74 65 33 57 68 65 72 65 49 73 53 6f 72 74 65 64  te3WhereIsSorted
35e60 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e  (WhereInfo *pWIn
35e70 66 6f 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  fo){.  assert( p
35e80 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67  WInfo->wctrlFlag
35e90 73 20 26 20 57 48 45 52 45 5f 47 52 4f 55 50 42  s & WHERE_GROUPB
35ea0 59 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  Y );.  assert( p
35eb0 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67  WInfo->wctrlFlag
35ec0 73 20 26 20 57 48 45 52 45 5f 53 4f 52 54 42 59  s & WHERE_SORTBY
35ed0 47 52 4f 55 50 20 29 3b 0a 20 20 72 65 74 75 72  GROUP );.  retur
35ee0 6e 20 70 57 49 6e 66 6f 2d 3e 73 6f 72 74 65 64  n pWInfo->sorted
35ef0 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 57 48 45 52  ;.}..#ifdef WHER
35f00 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 2f  ETRACE_ENABLED./
35f10 2a 20 46 6f 72 20 64 65 62 75 67 67 69 6e 67 20  * For debugging 
35f20 75 73 65 20 6f 6e 6c 79 3a 20 2a 2f 0a 73 74 61  use only: */.sta
35f30 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
35f40 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28 57 68  wherePathName(Wh
35f50 65 72 65 50 61 74 68 20 2a 70 50 61 74 68 2c 20  erePath *pPath, 
35f60 69 6e 74 20 6e 4c 6f 6f 70 2c 20 57 68 65 72 65  int nLoop, Where
35f70 4c 6f 6f 70 20 2a 70 4c 61 73 74 29 7b 0a 20 20  Loop *pLast){.  
35f80 73 74 61 74 69 63 20 63 68 61 72 20 7a 4e 61 6d  static char zNam
35f90 65 5b 36 35 5d 3b 0a 20 20 69 6e 74 20 69 3b 0a  e[65];.  int i;.
35fa0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4c 6f    for(i=0; i<nLo
35fb0 6f 70 3b 20 69 2b 2b 29 7b 20 7a 4e 61 6d 65 5b  op; i++){ zName[
35fc0 69 5d 20 3d 20 70 50 61 74 68 2d 3e 61 4c 6f 6f  i] = pPath->aLoo
35fd0 70 5b 69 5d 2d 3e 63 49 64 3b 20 7d 0a 20 20 69  p[i]->cId; }.  i
35fe0 66 28 20 70 4c 61 73 74 20 29 20 7a 4e 61 6d 65  f( pLast ) zName
35ff0 5b 69 2b 2b 5d 20 3d 20 70 4c 61 73 74 2d 3e 63  [i++] = pLast->c
36000 49 64 3b 0a 20 20 7a 4e 61 6d 65 5b 69 5d 20 3d  Id;.  zName[i] =
36010 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 7a 4e 61   0;.  return zNa
36020 6d 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  me;.}.#endif../*
36030 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63  .** Return the c
36040 6f 73 74 20 6f 66 20 73 6f 72 74 69 6e 67 20 6e  ost of sorting n
36050 52 6f 77 20 72 6f 77 73 2c 20 61 73 73 75 6d 69  Row rows, assumi
36060 6e 67 20 74 68 61 74 20 74 68 65 20 6b 65 79 73  ng that the keys
36070 20 68 61 76 65 20 0a 2a 2a 20 6e 4f 72 64 65 72   have .** nOrder
36080 62 79 20 63 6f 6c 75 6d 6e 73 20 61 6e 64 20 74  by columns and t
36090 68 61 74 20 74 68 65 20 66 69 72 73 74 20 6e 53  hat the first nS
360a0 6f 72 74 65 64 20 63 6f 6c 75 6d 6e 73 20 61 72  orted columns ar
360b0 65 20 61 6c 72 65 61 64 79 20 69 6e 0a 2a 2a 20  e already in.** 
360c0 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  order..*/.static
360d0 20 4c 6f 67 45 73 74 20 77 68 65 72 65 53 6f 72   LogEst whereSor
360e0 74 69 6e 67 43 6f 73 74 28 0a 20 20 57 68 65 72  tingCost(.  Wher
360f0 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 0a 20  eInfo *pWInfo,. 
36100 20 4c 6f 67 45 73 74 20 6e 52 6f 77 2c 0a 20 20   LogEst nRow,.  
36110 69 6e 74 20 6e 4f 72 64 65 72 42 79 2c 0a 20 20  int nOrderBy,.  
36120 69 6e 74 20 6e 53 6f 72 74 65 64 0a 29 7b 0a 20  int nSorted.){. 
36130 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 45 73 74 69   /* TUNING: Esti
36140 6d 61 74 65 64 20 63 6f 73 74 20 6f 66 20 61 20  mated cost of a 
36150 66 75 6c 6c 20 65 78 74 65 72 6e 61 6c 20 73 6f  full external so
36160 72 74 2c 20 77 68 65 72 65 20 4e 20 69 73 20 0a  rt, where N is .
36170 20 20 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20    ** the number 
36180 6f 66 20 72 6f 77 73 20 74 6f 20 73 6f 72 74 20  of rows to sort 
36190 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  is:.  **.  **   
361a0 63 6f 73 74 20 3d 20 28 33 2e 30 20 2a 20 4e 20  cost = (3.0 * N 
361b0 2a 20 6c 6f 67 28 4e 29 29 2e 0a 20 20 2a 2a 20  * log(N))..  ** 
361c0 0a 20 20 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65  .  ** Or, if the
361d0 20 6f 72 64 65 72 2d 62 79 20 63 6c 61 75 73 65   order-by clause
361e0 20 68 61 73 20 58 20 74 65 72 6d 73 20 62 75 74   has X terms but
361f0 20 6f 6e 6c 79 20 74 68 65 20 6c 61 73 74 20 59   only the last Y
36200 20 0a 20 20 2a 2a 20 74 65 72 6d 73 20 61 72 65   .  ** terms are
36210 20 6f 75 74 20 6f 66 20 6f 72 64 65 72 2c 20 74   out of order, t
36220 68 65 6e 20 62 6c 6f 63 6b 2d 73 6f 72 74 69 6e  hen block-sortin
36230 67 20 77 69 6c 6c 20 72 65 64 75 63 65 20 74 68  g will reduce th
36240 65 20 0a 20 20 2a 2a 20 73 6f 72 74 69 6e 67 20  e .  ** sorting 
36250 63 6f 73 74 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20  cost to:.  **.  
36260 2a 2a 20 20 20 63 6f 73 74 20 3d 20 28 33 2e 30  **   cost = (3.0
36270 20 2a 20 4e 20 2a 20 6c 6f 67 28 4e 29 29 20 2a   * N * log(N)) *
36280 20 28 59 2f 58 29 0a 20 20 2a 2a 0a 20 20 2a 2a   (Y/X).  **.  **
36290 20 54 68 65 20 28 59 2f 58 29 20 74 65 72 6d 20   The (Y/X) term 
362a0 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 75  is implemented u
362b0 73 69 6e 67 20 73 74 61 63 6b 20 76 61 72 69 61  sing stack varia
362c0 62 6c 65 20 72 53 63 61 6c 65 0a 20 20 2a 2a 20  ble rScale.  ** 
362d0 62 65 6c 6f 77 2e 20 20 2a 2f 0a 20 20 4c 6f 67  below.  */.  Log
362e0 45 73 74 20 72 53 63 61 6c 65 2c 20 72 53 6f 72  Est rScale, rSor
362f0 74 43 6f 73 74 3b 0a 20 20 61 73 73 65 72 74 28  tCost;.  assert(
36300 20 6e 4f 72 64 65 72 42 79 3e 30 20 26 26 20 36   nOrderBy>0 && 6
36310 36 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  6==sqlite3LogEst
36320 28 31 30 30 29 20 29 3b 0a 20 20 72 53 63 61 6c  (100) );.  rScal
36330 65 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  e = sqlite3LogEs
36340 74 28 28 6e 4f 72 64 65 72 42 79 2d 6e 53 6f 72  t((nOrderBy-nSor
36350 74 65 64 29 2a 31 30 30 2f 6e 4f 72 64 65 72 42  ted)*100/nOrderB
36360 79 29 20 2d 20 36 36 3b 0a 20 20 72 53 6f 72 74  y) - 66;.  rSort
36370 43 6f 73 74 20 3d 20 6e 52 6f 77 20 2b 20 65 73  Cost = nRow + es
36380 74 4c 6f 67 28 6e 52 6f 77 29 20 2b 20 72 53 63  tLog(nRow) + rSc
36390 61 6c 65 20 2b 20 31 36 3b 0a 0a 20 20 2f 2a 20  ale + 16;..  /* 
363a0 54 55 4e 49 4e 47 3a 20 54 68 65 20 63 6f 73 74  TUNING: The cost
363b0 20 6f 66 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67   of implementing
363c0 20 44 49 53 54 49 4e 43 54 20 75 73 69 6e 67 20   DISTINCT using 
363d0 61 20 42 2d 54 52 45 45 20 69 73 0a 20 20 2a 2a  a B-TREE is.  **
363e0 20 73 69 6d 69 6c 61 72 20 62 75 74 20 77 69 74   similar but wit
363f0 68 20 61 20 6c 61 72 67 65 72 20 63 6f 6e 73 74  h a larger const
36400 61 6e 74 20 6f 66 20 70 72 6f 70 6f 72 74 69 6f  ant of proportio
36410 6e 61 6c 69 74 79 2e 20 0a 20 20 2a 2a 20 4d 75  nality. .  ** Mu
36420 6c 74 69 70 6c 79 20 62 79 20 61 6e 20 61 64 64  ltiply by an add
36430 69 74 69 6f 6e 61 6c 20 66 61 63 74 6f 72 20 6f  itional factor o
36440 66 20 33 2e 30 2e 20 20 2a 2f 0a 20 20 69 66 28  f 3.0.  */.  if(
36450 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c   pWInfo->wctrlFl
36460 61 67 73 20 26 20 57 48 45 52 45 5f 57 41 4e 54  ags & WHERE_WANT
36470 5f 44 49 53 54 49 4e 43 54 20 29 7b 0a 20 20 20  _DISTINCT ){.   
36480 20 72 53 6f 72 74 43 6f 73 74 20 2b 3d 20 31 36   rSortCost += 16
36490 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
364a0 72 53 6f 72 74 43 6f 73 74 3b 0a 7d 0a 0a 2f 2a  rSortCost;.}../*
364b0 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 6c 69  .** Given the li
364c0 73 74 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70 20  st of WhereLoop 
364d0 6f 62 6a 65 63 74 73 20 61 74 20 70 57 49 6e 66  objects at pWInf
364e0 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 74 68 69 73 20  o->pLoops, this 
364f0 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 74 74 65 6d  routine.** attem
36500 70 74 73 20 74 6f 20 66 69 6e 64 20 74 68 65 20  pts to find the 
36510 6c 6f 77 65 73 74 20 63 6f 73 74 20 70 61 74 68  lowest cost path
36520 20 74 68 61 74 20 76 69 73 69 74 73 20 65 61 63   that visits eac
36530 68 20 57 68 65 72 65 4c 6f 6f 70 0a 2a 2a 20 6f  h WhereLoop.** o
36540 6e 63 65 2e 20 20 54 68 69 73 20 70 61 74 68 20  nce.  This path 
36550 69 73 20 74 68 65 6e 20 6c 6f 61 64 65 64 20 69  is then loaded i
36560 6e 74 6f 20 74 68 65 20 70 57 49 6e 66 6f 2d 3e  nto the pWInfo->
36570 61 5b 5d 2e 70 57 4c 6f 6f 70 20 66 69 65 6c 64  a[].pWLoop field
36580 73 2e 0a 2a 2a 0a 2a 2a 20 41 73 73 75 6d 65 20  s..**.** Assume 
36590 74 68 61 74 20 74 68 65 20 74 6f 74 61 6c 20 6e  that the total n
365a0 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20  umber of output 
365b0 72 6f 77 73 20 74 68 61 74 20 77 69 6c 6c 20 6e  rows that will n
365c0 65 65 64 20 74 6f 20 62 65 20 73 6f 72 74 65 64  eed to be sorted
365d0 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 6e 52 6f 77  .** will be nRow
365e0 45 73 74 20 28 69 6e 20 74 68 65 20 31 30 2a 6c  Est (in the 10*l
365f0 6f 67 32 20 72 65 70 72 65 73 65 6e 74 61 74 69  og2 representati
36600 6f 6e 29 2e 20 20 4f 72 2c 20 69 67 6e 6f 72 65  on).  Or, ignore
36610 20 73 6f 72 74 69 6e 67 0a 2a 2a 20 63 6f 73 74   sorting.** cost
36620 73 20 69 66 20 6e 52 6f 77 45 73 74 3d 3d 30 2e  s if nRowEst==0.
36630 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  .**.** Return SQ
36640 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
36650 73 73 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 4d  ss or SQLITE_NOM
36660 45 4d 20 6f 66 20 61 20 6d 65 6d 6f 72 79 20 61  EM of a memory a
36670 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 65 72 72  llocation.** err
36680 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73 74  or occurs..*/.st
36690 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 50 61  atic int wherePa
366a0 74 68 53 6f 6c 76 65 72 28 57 68 65 72 65 49 6e  thSolver(WhereIn
366b0 66 6f 20 2a 70 57 49 6e 66 6f 2c 20 4c 6f 67 45  fo *pWInfo, LogE
366c0 73 74 20 6e 52 6f 77 45 73 74 29 7b 0a 20 20 69  st nRowEst){.  i
366d0 6e 74 20 6d 78 43 68 6f 69 63 65 3b 20 20 20 20  nt mxChoice;    
366e0 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69           /* Maxi
366f0 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 73 69  mum number of si
36700 6d 75 6c 74 61 6e 65 6f 75 73 20 70 61 74 68 73  multaneous paths
36710 20 74 72 61 63 6b 65 64 20 2a 2f 0a 20 20 69 6e   tracked */.  in
36720 74 20 6e 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20  t nLoop;        
36730 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
36740 72 20 6f 66 20 74 65 72 6d 73 20 69 6e 20 74 68  r of terms in th
36750 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20 50 61 72 73  e join */.  Pars
36760 65 20 2a 70 50 61 72 73 65 3b 20 20 20 20 20 20  e *pParse;      
36770 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
36780 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73 71   context */.  sq
36790 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20  lite3 *db;      
367a0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
367b0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
367c0 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 6f 6f  on */.  int iLoo
367d0 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
367e0 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
367f0 72 20 6f 76 65 72 20 74 68 65 20 74 65 72 6d 73  r over the terms
36800 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a   of the join */.
36810 20 20 69 6e 74 20 69 69 2c 20 6a 6a 3b 20 20 20    int ii, jj;   
36820 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
36830 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a  oop counters */.
36840 20 20 69 6e 74 20 6d 78 49 20 3d 20 30 3b 20 20    int mxI = 0;  
36850 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
36860 6e 64 65 78 20 6f 66 20 6e 65 78 74 20 65 6e 74  ndex of next ent
36870 72 79 20 74 6f 20 72 65 70 6c 61 63 65 20 2a 2f  ry to replace */
36880 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72 42 79 3b  .  int nOrderBy;
36890 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
368a0 4e 75 6d 62 65 72 20 6f 66 20 4f 52 44 45 52 20  Number of ORDER 
368b0 42 59 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20  BY clause terms 
368c0 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 6d 78 43 6f  */.  LogEst mxCo
368d0 73 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f  st = 0;        /
368e0 2a 20 4d 61 78 69 6d 75 6d 20 63 6f 73 74 20 6f  * Maximum cost o
368f0 66 20 61 20 73 65 74 20 6f 66 20 70 61 74 68 73  f a set of paths
36900 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 6d 78 55   */.  LogEst mxU
36910 6e 73 6f 72 74 65 64 20 3d 20 30 3b 20 20 20 20  nsorted = 0;    
36920 2f 2a 20 4d 61 78 69 6d 75 6d 20 75 6e 73 6f 72  /* Maximum unsor
36930 74 65 64 20 63 6f 73 74 20 6f 66 20 61 20 73 65  ted cost of a se
36940 74 20 6f 66 20 70 61 74 68 20 2a 2f 0a 20 20 69  t of path */.  i
36950 6e 74 20 6e 54 6f 2c 20 6e 46 72 6f 6d 3b 20 20  nt nTo, nFrom;  
36960 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
36970 65 72 20 6f 66 20 76 61 6c 69 64 20 65 6e 74 72  er of valid entr
36980 69 65 73 20 69 6e 20 61 54 6f 5b 5d 20 61 6e 64  ies in aTo[] and
36990 20 61 46 72 6f 6d 5b 5d 20 2a 2f 0a 20 20 57 68   aFrom[] */.  Wh
369a0 65 72 65 50 61 74 68 20 2a 61 46 72 6f 6d 3b 20  erePath *aFrom; 
369b0 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 6e          /* All n
369c0 46 72 6f 6d 20 70 61 74 68 73 20 61 74 20 74 68  From paths at th
369d0 65 20 70 72 65 76 69 6f 75 73 20 6c 65 76 65 6c  e previous level
369e0 20 2a 2f 0a 20 20 57 68 65 72 65 50 61 74 68 20   */.  WherePath 
369f0 2a 61 54 6f 3b 20 20 20 20 20 20 20 20 20 20 20  *aTo;           
36a00 2f 2a 20 54 68 65 20 6e 54 6f 20 62 65 73 74 20  /* The nTo best 
36a10 70 61 74 68 73 20 61 74 20 74 68 65 20 63 75 72  paths at the cur
36a20 72 65 6e 74 20 6c 65 76 65 6c 20 2a 2f 0a 20 20  rent level */.  
36a30 57 68 65 72 65 50 61 74 68 20 2a 70 46 72 6f 6d  WherePath *pFrom
36a40 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20  ;         /* An 
36a50 65 6c 65 6d 65 6e 74 20 6f 66 20 61 46 72 6f 6d  element of aFrom
36a60 5b 5d 20 74 68 61 74 20 77 65 20 61 72 65 20 77  [] that we are w
36a70 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20 57  orking on */.  W
36a80 68 65 72 65 50 61 74 68 20 2a 70 54 6f 3b 20 20  herePath *pTo;  
36a90 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65           /* An e
36aa0 6c 65 6d 65 6e 74 20 6f 66 20 61 54 6f 5b 5d 20  lement of aTo[] 
36ab0 74 68 61 74 20 77 65 20 61 72 65 20 77 6f 72 6b  that we are work
36ac0 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20 57 68 65 72  ing on */.  Wher
36ad0 65 4c 6f 6f 70 20 2a 70 57 4c 6f 6f 70 3b 20 20  eLoop *pWLoop;  
36ae0 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20        /* One of 
36af0 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62  the WhereLoop ob
36b00 6a 65 63 74 73 20 2a 2f 0a 20 20 57 68 65 72 65  jects */.  Where
36b10 4c 6f 6f 70 20 2a 2a 70 58 3b 20 20 20 20 20 20  Loop **pX;      
36b20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20       /* Used to 
36b30 64 69 76 79 20 75 70 20 74 68 65 20 70 53 70 61  divy up the pSpa
36b40 63 65 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 4c  ce memory */.  L
36b50 6f 67 45 73 74 20 2a 61 53 6f 72 74 43 6f 73 74  ogEst *aSortCost
36b60 20 3d 20 30 3b 20 20 20 20 2f 2a 20 53 6f 72 74   = 0;    /* Sort
36b70 69 6e 67 20 61 6e 64 20 70 61 72 74 69 61 6c 20  ing and partial 
36b80 73 6f 72 74 69 6e 67 20 63 6f 73 74 73 20 2a 2f  sorting costs */
36b90 0a 20 20 63 68 61 72 20 2a 70 53 70 61 63 65 3b  .  char *pSpace;
36ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
36bb0 54 65 6d 70 6f 72 61 72 79 20 6d 65 6d 6f 72 79  Temporary memory
36bc0 20 75 73 65 64 20 62 79 20 74 68 69 73 20 72 6f   used by this ro
36bd0 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  utine */.  int n
36be0 53 70 61 63 65 3b 20 20 20 20 20 20 20 20 20 20  Space;          
36bf0 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66       /* Bytes of
36c00 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64   space allocated
36c10 20 61 74 20 70 53 70 61 63 65 20 2a 2f 0a 0a 20   at pSpace */.. 
36c20 20 70 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f   pParse = pWInfo
36c30 2d 3e 70 50 61 72 73 65 3b 0a 20 20 64 62 20 3d  ->pParse;.  db =
36c40 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 6e   pParse->db;.  n
36c50 4c 6f 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 6e  Loop = pWInfo->n
36c60 4c 65 76 65 6c 3b 0a 20 20 2f 2a 20 54 55 4e 49  Level;.  /* TUNI
36c70 4e 47 3a 20 46 6f 72 20 73 69 6d 70 6c 65 20 71  NG: For simple q
36c80 75 65 72 69 65 73 2c 20 6f 6e 6c 79 20 74 68 65  ueries, only the
36c90 20 62 65 73 74 20 70 61 74 68 20 69 73 20 74 72   best path is tr
36ca0 61 63 6b 65 64 2e 0a 20 20 2a 2a 20 46 6f 72 20  acked..  ** For 
36cb0 32 2d 77 61 79 20 6a 6f 69 6e 73 2c 20 74 68 65  2-way joins, the
36cc0 20 35 20 62 65 73 74 20 70 61 74 68 73 20 61 72   5 best paths ar
36cd0 65 20 66 6f 6c 6c 6f 77 65 64 2e 0a 20 20 2a 2a  e followed..  **
36ce0 20 46 6f 72 20 6a 6f 69 6e 73 20 6f 66 20 33 20   For joins of 3 
36cf0 6f 72 20 6d 6f 72 65 20 74 61 62 6c 65 73 2c 20  or more tables, 
36d00 74 72 61 63 6b 20 74 68 65 20 31 30 20 62 65 73  track the 10 bes
36d10 74 20 70 61 74 68 73 20 2a 2f 0a 20 20 6d 78 43  t paths */.  mxC
36d20 68 6f 69 63 65 20 3d 20 28 6e 4c 6f 6f 70 3c 3d  hoice = (nLoop<=
36d30 31 29 20 3f 20 31 20 3a 20 28 6e 4c 6f 6f 70 3d  1) ? 1 : (nLoop=
36d40 3d 32 20 3f 20 35 20 3a 20 31 30 29 3b 0a 20 20  =2 ? 5 : 10);.  
36d50 61 73 73 65 72 74 28 20 6e 4c 6f 6f 70 3c 3d 70  assert( nLoop<=p
36d60 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d  WInfo->pTabList-
36d70 3e 6e 53 72 63 20 29 3b 0a 20 20 57 48 45 52 45  >nSrc );.  WHERE
36d80 54 52 41 43 45 28 30 78 30 30 32 2c 20 28 22 2d  TRACE(0x002, ("-
36d90 2d 2d 2d 20 62 65 67 69 6e 20 73 6f 6c 76 65 72  --- begin solver
36da0 2e 20 20 28 6e 52 6f 77 45 73 74 3d 25 64 29 5c  .  (nRowEst=%d)\
36db0 6e 22 2c 20 6e 52 6f 77 45 73 74 29 29 3b 0a 0a  n", nRowEst));..
36dc0 20 20 2f 2a 20 49 66 20 6e 52 6f 77 45 73 74 20    /* If nRowEst 
36dd0 69 73 20 7a 65 72 6f 20 61 6e 64 20 74 68 65 72  is zero and ther
36de0 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59  e is an ORDER BY
36df0 20 63 6c 61 75 73 65 2c 20 69 67 6e 6f 72 65 20   clause, ignore 
36e00 69 74 2e 20 49 6e 20 74 68 69 73 0a 20 20 2a 2a  it. In this.  **
36e10 20 63 61 73 65 20 74 68 65 20 70 75 72 70 6f 73   case the purpos
36e20 65 20 6f 66 20 74 68 69 73 20 63 61 6c 6c 20 69  e of this call i
36e30 73 20 74 6f 20 65 73 74 69 6d 61 74 65 20 74 68  s to estimate th
36e40 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
36e50 20 72 65 74 75 72 6e 65 64 0a 20 20 2a 2a 20 62   returned.  ** b
36e60 79 20 74 68 65 20 6f 76 65 72 61 6c 6c 20 71 75  y the overall qu
36e70 65 72 79 2e 20 4f 6e 63 65 20 74 68 69 73 20 65  ery. Once this e
36e80 73 74 69 6d 61 74 65 20 68 61 73 20 62 65 65 6e  stimate has been
36e90 20 6f 62 74 61 69 6e 65 64 2c 20 74 68 65 20 63   obtained, the c
36ea0 61 6c 6c 65 72 0a 20 20 2a 2a 20 77 69 6c 6c 20  aller.  ** will 
36eb0 69 6e 76 6f 6b 65 20 74 68 69 73 20 66 75 6e 63  invoke this func
36ec0 74 69 6f 6e 20 61 20 73 65 63 6f 6e 64 20 74 69  tion a second ti
36ed0 6d 65 2c 20 70 61 73 73 69 6e 67 20 74 68 65 20  me, passing the 
36ee0 65 73 74 69 6d 61 74 65 20 61 73 20 74 68 65 0a  estimate as the.
36ef0 20 20 2a 2a 20 6e 52 6f 77 45 73 74 20 70 61 72    ** nRowEst par
36f00 61 6d 65 74 65 72 2e 20 20 2a 2f 0a 20 20 69 66  ameter.  */.  if
36f10 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72  ( pWInfo->pOrder
36f20 42 79 3d 3d 30 20 7c 7c 20 6e 52 6f 77 45 73 74  By==0 || nRowEst
36f30 3d 3d 30 20 29 7b 0a 20 20 20 20 6e 4f 72 64 65  ==0 ){.    nOrde
36f40 72 42 79 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  rBy = 0;.  }else
36f50 7b 0a 20 20 20 20 6e 4f 72 64 65 72 42 79 20 3d  {.    nOrderBy =
36f60 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42   pWInfo->pOrderB
36f70 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 7d 0a 0a 20  y->nExpr;.  }.. 
36f80 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64   /* Allocate and
36f90 20 69 6e 69 74 69 61 6c 69 7a 65 20 73 70 61 63   initialize spac
36fa0 65 20 66 6f 72 20 61 54 6f 2c 20 61 46 72 6f 6d  e for aTo, aFrom
36fb0 20 61 6e 64 20 61 53 6f 72 74 43 6f 73 74 5b 5d   and aSortCost[]
36fc0 20 2a 2f 0a 20 20 6e 53 70 61 63 65 20 3d 20 28   */.  nSpace = (
36fd0 73 69 7a 65 6f 66 28 57 68 65 72 65 50 61 74 68  sizeof(WherePath
36fe0 29 2b 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f  )+sizeof(WhereLo
36ff0 6f 70 2a 29 2a 6e 4c 6f 6f 70 29 2a 6d 78 43 68  op*)*nLoop)*mxCh
37000 6f 69 63 65 2a 32 3b 0a 20 20 6e 53 70 61 63 65  oice*2;.  nSpace
37010 20 2b 3d 20 73 69 7a 65 6f 66 28 4c 6f 67 45 73   += sizeof(LogEs
37020 74 29 20 2a 20 6e 4f 72 64 65 72 42 79 3b 0a 20  t) * nOrderBy;. 
37030 20 70 53 70 61 63 65 20 3d 20 73 71 6c 69 74 65   pSpace = sqlite
37040 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c  3DbMallocRaw(db,
37050 20 6e 53 70 61 63 65 29 3b 0a 20 20 69 66 28 20   nSpace);.  if( 
37060 70 53 70 61 63 65 3d 3d 30 20 29 20 72 65 74 75  pSpace==0 ) retu
37070 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
37080 0a 20 20 61 54 6f 20 3d 20 28 57 68 65 72 65 50  .  aTo = (WhereP
37090 61 74 68 2a 29 70 53 70 61 63 65 3b 0a 20 20 61  ath*)pSpace;.  a
370a0 46 72 6f 6d 20 3d 20 61 54 6f 2b 6d 78 43 68 6f  From = aTo+mxCho
370b0 69 63 65 3b 0a 20 20 6d 65 6d 73 65 74 28 61 46  ice;.  memset(aF
370c0 72 6f 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61  rom, 0, sizeof(a
370d0 46 72 6f 6d 5b 30 5d 29 29 3b 0a 20 20 70 58 20  From[0]));.  pX 
370e0 3d 20 28 57 68 65 72 65 4c 6f 6f 70 2a 2a 29 28  = (WhereLoop**)(
370f0 61 46 72 6f 6d 2b 6d 78 43 68 6f 69 63 65 29 3b  aFrom+mxChoice);
37100 0a 20 20 66 6f 72 28 69 69 3d 6d 78 43 68 6f 69  .  for(ii=mxChoi
37110 63 65 2a 32 2c 20 70 46 72 6f 6d 3d 61 54 6f 3b  ce*2, pFrom=aTo;
37120 20 69 69 3e 30 3b 20 69 69 2d 2d 2c 20 70 46 72   ii>0; ii--, pFr
37130 6f 6d 2b 2b 2c 20 70 58 20 2b 3d 20 6e 4c 6f 6f  om++, pX += nLoo
37140 70 29 7b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 61  p){.    pFrom->a
37150 4c 6f 6f 70 20 3d 20 70 58 3b 0a 20 20 7d 0a 20  Loop = pX;.  }. 
37160 20 69 66 28 20 6e 4f 72 64 65 72 42 79 20 29 7b   if( nOrderBy ){
37170 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
37180 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20   is an ORDER BY 
37190 63 6c 61 75 73 65 20 61 6e 64 20 69 74 20 69 73  clause and it is
371a0 20 6e 6f 74 20 62 65 69 6e 67 20 69 67 6e 6f 72   not being ignor
371b0 65 64 2c 20 73 65 74 20 75 70 0a 20 20 20 20 2a  ed, set up.    *
371c0 2a 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 20  * space for the 
371d0 61 53 6f 72 74 43 6f 73 74 5b 5d 20 61 72 72 61  aSortCost[] arra
371e0 79 2e 20 45 61 63 68 20 65 6c 65 6d 65 6e 74 20  y. Each element 
371f0 6f 66 20 74 68 65 20 61 53 6f 72 74 43 6f 73 74  of the aSortCost
37200 20 61 72 72 61 79 0a 20 20 20 20 2a 2a 20 69 73   array.    ** is
37210 20 65 69 74 68 65 72 20 7a 65 72 6f 20 2d 20 6d   either zero - m
37220 65 61 6e 69 6e 67 20 69 74 20 68 61 73 20 6e 6f  eaning it has no
37230 74 20 79 65 74 20 62 65 65 6e 20 69 6e 69 74 69  t yet been initi
37240 61 6c 69 7a 65 64 20 2d 20 6f 72 20 74 68 65 0a  alized - or the.
37250 20 20 20 20 2a 2a 20 63 6f 73 74 20 6f 66 20 73      ** cost of s
37260 6f 72 74 69 6e 67 20 6e 52 6f 77 45 73 74 20 72  orting nRowEst r
37270 6f 77 73 20 6f 66 20 64 61 74 61 20 77 68 65 72  ows of data wher
37280 65 20 74 68 65 20 66 69 72 73 74 20 58 20 74 65  e the first X te
37290 72 6d 73 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68  rms of.    ** th
372a0 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
372b0 65 20 61 72 65 20 61 6c 72 65 61 64 79 20 69 6e  e are already in
372c0 20 6f 72 64 65 72 2c 20 77 68 65 72 65 20 58 20   order, where X 
372d0 69 73 20 74 68 65 20 61 72 72 61 79 20 0a 20 20  is the array .  
372e0 20 20 2a 2a 20 69 6e 64 65 78 2e 20 20 2a 2f 0a    ** index.  */.
372f0 20 20 20 20 61 53 6f 72 74 43 6f 73 74 20 3d 20      aSortCost = 
37300 28 4c 6f 67 45 73 74 2a 29 70 58 3b 0a 20 20 20  (LogEst*)pX;.   
37310 20 6d 65 6d 73 65 74 28 61 53 6f 72 74 43 6f 73   memset(aSortCos
37320 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 4c 6f 67  t, 0, sizeof(Log
37330 45 73 74 29 20 2a 20 6e 4f 72 64 65 72 42 79 29  Est) * nOrderBy)
37340 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
37350 61 53 6f 72 74 43 6f 73 74 3d 3d 30 20 7c 7c 20  aSortCost==0 || 
37360 26 70 53 70 61 63 65 5b 6e 53 70 61 63 65 5d 3d  &pSpace[nSpace]=
37370 3d 28 63 68 61 72 2a 29 26 61 53 6f 72 74 43 6f  =(char*)&aSortCo
37380 73 74 5b 6e 4f 72 64 65 72 42 79 5d 20 29 3b 0a  st[nOrderBy] );.
37390 20 20 61 73 73 65 72 74 28 20 61 53 6f 72 74 43    assert( aSortC
373a0 6f 73 74 21 3d 30 20 7c 7c 20 26 70 53 70 61 63  ost!=0 || &pSpac
373b0 65 5b 6e 53 70 61 63 65 5d 3d 3d 28 63 68 61 72  e[nSpace]==(char
373c0 2a 29 70 58 20 29 3b 0a 0a 20 20 2f 2a 20 53 65  *)pX );..  /* Se
373d0 65 64 20 74 68 65 20 73 65 61 72 63 68 20 77 69  ed the search wi
373e0 74 68 20 61 20 73 69 6e 67 6c 65 20 57 68 65 72  th a single Wher
373f0 65 50 61 74 68 20 63 6f 6e 74 61 69 6e 69 6e 67  ePath containing
37400 20 7a 65 72 6f 20 57 68 65 72 65 4c 6f 6f 70 73   zero WhereLoops
37410 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 55 4e 49  ..  **.  ** TUNI
37420 4e 47 3a 20 44 6f 20 6e 6f 74 20 6c 65 74 20 74  NG: Do not let t
37430 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 69 74 65  he number of ite
37440 72 61 74 69 6f 6e 73 20 67 6f 20 61 62 6f 76 65  rations go above
37450 20 32 38 2e 20 20 49 66 20 74 68 65 20 63 6f 73   28.  If the cos
37460 74 0a 20 20 2a 2a 20 6f 66 20 63 6f 6d 70 75 74  t.  ** of comput
37470 69 6e 67 20 61 6e 20 61 75 74 6f 6d 61 74 69 63  ing an automatic
37480 20 69 6e 64 65 78 20 69 73 20 6e 6f 74 20 70 61   index is not pa
37490 69 64 20 62 61 63 6b 20 77 69 74 68 69 6e 20 74  id back within t
374a0 68 65 20 66 69 72 73 74 20 32 38 0a 20 20 2a 2a  he first 28.  **
374b0 20 72 6f 77 73 2c 20 74 68 65 6e 20 64 6f 20 6e   rows, then do n
374c0 6f 74 20 75 73 65 20 74 68 65 20 61 75 74 6f 6d  ot use the autom
374d0 61 74 69 63 20 69 6e 64 65 78 2e 20 2a 2f 0a 20  atic index. */. 
374e0 20 61 46 72 6f 6d 5b 30 5d 2e 6e 52 6f 77 20 3d   aFrom[0].nRow =
374f0 20 4d 49 4e 28 70 50 61 72 73 65 2d 3e 6e 51 75   MIN(pParse->nQu
37500 65 72 79 4c 6f 6f 70 2c 20 34 38 29 3b 20 20 61  eryLoop, 48);  a
37510 73 73 65 72 74 28 20 34 38 3d 3d 73 71 6c 69 74  ssert( 48==sqlit
37520 65 33 4c 6f 67 45 73 74 28 32 38 29 20 29 3b 0a  e3LogEst(28) );.
37530 20 20 6e 46 72 6f 6d 20 3d 20 31 3b 0a 20 20 61    nFrom = 1;.  a
37540 73 73 65 72 74 28 20 61 46 72 6f 6d 5b 30 5d 2e  ssert( aFrom[0].
37550 69 73 4f 72 64 65 72 65 64 3d 3d 30 20 29 3b 0a  isOrdered==0 );.
37560 20 20 69 66 28 20 6e 4f 72 64 65 72 42 79 20 29    if( nOrderBy )
37570 7b 0a 20 20 20 20 2f 2a 20 49 66 20 6e 4c 6f 6f  {.    /* If nLoo
37580 70 20 69 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20  p is zero, then 
37590 74 68 65 72 65 20 61 72 65 20 6e 6f 20 46 52 4f  there are no FRO
375a0 4d 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 71  M terms in the q
375b0 75 65 72 79 2e 20 53 69 6e 63 65 0a 20 20 20 20  uery. Since.    
375c0 2a 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65 20  ** in this case 
375d0 74 68 65 20 71 75 65 72 79 20 6d 61 79 20 72 65  the query may re
375e0 74 75 72 6e 20 61 20 6d 61 78 69 6d 75 6d 20 6f  turn a maximum o
375f0 66 20 6f 6e 65 20 72 6f 77 2c 20 74 68 65 20 72  f one row, the r
37600 65 73 75 6c 74 73 0a 20 20 20 20 2a 2a 20 61 72  esults.    ** ar
37610 65 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  e already in the
37620 20 72 65 71 75 65 73 74 65 64 20 6f 72 64 65 72   requested order
37630 2e 20 53 65 74 20 69 73 4f 72 64 65 72 65 64 20  . Set isOrdered 
37640 74 6f 20 6e 4f 72 64 65 72 42 79 20 74 6f 0a 20  to nOrderBy to. 
37650 20 20 20 2a 2a 20 69 6e 64 69 63 61 74 65 20 74     ** indicate t
37660 68 69 73 2e 20 4f 72 2c 20 69 66 20 6e 4c 6f 6f  his. Or, if nLoo
37670 70 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  p is greater tha
37680 6e 20 7a 65 72 6f 2c 20 73 65 74 20 69 73 4f 72  n zero, set isOr
37690 64 65 72 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20  dered to.    ** 
376a0 2d 31 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 74  -1, indicating t
376b0 68 61 74 20 74 68 65 20 72 65 73 75 6c 74 20 73  hat the result s
376c0 65 74 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f  et may or may no
376d0 74 20 62 65 20 6f 72 64 65 72 65 64 2c 20 0a 20  t be ordered, . 
376e0 20 20 20 2a 2a 20 64 65 70 65 6e 64 69 6e 67 20     ** depending 
376f0 6f 6e 20 74 68 65 20 6c 6f 6f 70 73 20 61 64 64  on the loops add
37700 65 64 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e  ed to the curren
37710 74 20 70 6c 61 6e 2e 20 20 2a 2f 0a 20 20 20 20  t plan.  */.    
37720 61 46 72 6f 6d 5b 30 5d 2e 69 73 4f 72 64 65 72  aFrom[0].isOrder
37730 65 64 20 3d 20 6e 4c 6f 6f 70 3e 30 20 3f 20 2d  ed = nLoop>0 ? -
37740 31 20 3a 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20  1 : nOrderBy;.  
37750 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20  }..  /* Compute 
37760 73 75 63 63 65 73 73 69 76 65 6c 79 20 6c 6f 6e  successively lon
37770 67 65 72 20 57 68 65 72 65 50 61 74 68 73 20 75  ger WherePaths u
37780 73 69 6e 67 20 74 68 65 20 70 72 65 76 69 6f 75  sing the previou
37790 73 20 67 65 6e 65 72 61 74 69 6f 6e 0a 20 20 2a  s generation.  *
377a0 2a 20 6f 66 20 57 68 65 72 65 50 61 74 68 73 20  * of WherePaths 
377b0 61 73 20 74 68 65 20 62 61 73 69 73 20 66 6f 72  as the basis for
377c0 20 74 68 65 20 6e 65 78 74 2e 20 20 4b 65 65 70   the next.  Keep
377d0 20 74 72 61 63 6b 20 6f 66 20 74 68 65 20 6d 78   track of the mx
377e0 43 68 6f 69 63 65 0a 20 20 2a 2a 20 62 65 73 74  Choice.  ** best
377f0 20 70 61 74 68 73 20 61 74 20 65 61 63 68 20 67   paths at each g
37800 65 6e 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 66  eneration */.  f
37810 6f 72 28 69 4c 6f 6f 70 3d 30 3b 20 69 4c 6f 6f  or(iLoop=0; iLoo
37820 70 3c 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f 70 2b 2b  p<nLoop; iLoop++
37830 29 7b 0a 20 20 20 20 6e 54 6f 20 3d 20 30 3b 0a  ){.    nTo = 0;.
37840 20 20 20 20 66 6f 72 28 69 69 3d 30 2c 20 70 46      for(ii=0, pF
37850 72 6f 6d 3d 61 46 72 6f 6d 3b 20 69 69 3c 6e 46  rom=aFrom; ii<nF
37860 72 6f 6d 3b 20 69 69 2b 2b 2c 20 70 46 72 6f 6d  rom; ii++, pFrom
37870 2b 2b 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 70  ++){.      for(p
37880 57 4c 6f 6f 70 3d 70 57 49 6e 66 6f 2d 3e 70 4c  WLoop=pWInfo->pL
37890 6f 6f 70 73 3b 20 70 57 4c 6f 6f 70 3b 20 70 57  oops; pWLoop; pW
378a0 4c 6f 6f 70 3d 70 57 4c 6f 6f 70 2d 3e 70 4e 65  Loop=pWLoop->pNe
378b0 78 74 4c 6f 6f 70 29 7b 0a 20 20 20 20 20 20 20  xtLoop){.       
378c0 20 4c 6f 67 45 73 74 20 6e 4f 75 74 3b 20 20 20   LogEst nOut;   
378d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
378e0 20 20 20 2f 2a 20 52 6f 77 73 20 76 69 73 69 74     /* Rows visit
378f0 65 64 20 62 79 20 28 70 46 72 6f 6d 2b 70 57 4c  ed by (pFrom+pWL
37900 6f 6f 70 29 20 2a 2f 0a 20 20 20 20 20 20 20 20  oop) */.        
37910 4c 6f 67 45 73 74 20 72 43 6f 73 74 3b 20 20 20  LogEst rCost;   
37920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37930 20 20 2f 2a 20 43 6f 73 74 20 6f 66 20 70 61 74    /* Cost of pat
37940 68 20 28 70 46 72 6f 6d 2b 70 57 4c 6f 6f 70 29  h (pFrom+pWLoop)
37950 20 2a 2f 0a 20 20 20 20 20 20 20 20 4c 6f 67 45   */.        LogE
37960 73 74 20 72 55 6e 73 6f 72 74 65 64 3b 20 20 20  st rUnsorted;   
37970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
37980 20 55 6e 73 6f 72 74 65 64 20 63 6f 73 74 20 6f   Unsorted cost o
37990 66 20 28 70 46 72 6f 6d 2b 70 57 4c 6f 6f 70 29  f (pFrom+pWLoop)
379a0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 38 20 69   */.        i8 i
379b0 73 4f 72 64 65 72 65 64 20 3d 20 70 46 72 6f 6d  sOrdered = pFrom
379c0 2d 3e 69 73 4f 72 64 65 72 65 64 3b 20 20 2f 2a  ->isOrdered;  /*
379d0 20 69 73 4f 72 64 65 72 65 64 20 66 6f 72 20 28   isOrdered for (
379e0 70 46 72 6f 6d 2b 70 57 4c 6f 6f 70 29 20 2a 2f  pFrom+pWLoop) */
379f0 0a 20 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b  .        Bitmask
37a00 20 6d 61 73 6b 4e 65 77 3b 20 20 20 20 20 20 20   maskNew;       
37a10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
37a20 73 6b 20 6f 66 20 73 72 63 20 76 69 73 69 74 65  sk of src visite
37a30 64 20 62 79 20 28 2e 2e 29 20 2a 2f 0a 20 20 20  d by (..) */.   
37a40 20 20 20 20 20 42 69 74 6d 61 73 6b 20 72 65 76       Bitmask rev
37a50 4d 61 73 6b 20 3d 20 30 3b 20 20 20 20 20 20 20  Mask = 0;       
37a60 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
37a70 66 20 72 65 76 2d 6f 72 64 65 72 20 6c 6f 6f 70  f rev-order loop
37a80 73 20 66 6f 72 20 28 2e 2e 29 20 2a 2f 0a 0a 20  s for (..) */.. 
37a90 20 20 20 20 20 20 20 69 66 28 20 28 70 57 4c 6f         if( (pWLo
37aa0 6f 70 2d 3e 70 72 65 72 65 71 20 26 20 7e 70 46  op->prereq & ~pF
37ab0 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 29 21 3d  rom->maskLoop)!=
37ac0 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
37ad0 20 20 20 20 20 20 69 66 28 20 28 70 57 4c 6f 6f        if( (pWLoo
37ae0 70 2d 3e 6d 61 73 6b 53 65 6c 66 20 26 20 70 46  p->maskSelf & pF
37af0 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 29 21 3d  rom->maskLoop)!=
37b00 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
37b10 20 20 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73        /* At this
37b20 20 70 6f 69 6e 74 2c 20 70 57 4c 6f 6f 70 20 69   point, pWLoop i
37b30 73 20 61 20 63 61 6e 64 69 64 61 74 65 20 74 6f  s a candidate to
37b40 20 62 65 20 74 68 65 20 6e 65 78 74 20 6c 6f 6f   be the next loo
37b50 70 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 43  p. .        ** C
37b60 6f 6d 70 75 74 65 20 69 74 73 20 63 6f 73 74 20  ompute its cost 
37b70 2a 2f 0a 20 20 20 20 20 20 20 20 72 55 6e 73 6f  */.        rUnso
37b80 72 74 65 64 20 3d 20 73 71 6c 69 74 65 33 4c 6f  rted = sqlite3Lo
37b90 67 45 73 74 41 64 64 28 70 57 4c 6f 6f 70 2d 3e  gEstAdd(pWLoop->
37ba0 72 53 65 74 75 70 2c 70 57 4c 6f 6f 70 2d 3e 72  rSetup,pWLoop->r
37bb0 52 75 6e 20 2b 20 70 46 72 6f 6d 2d 3e 6e 52 6f  Run + pFrom->nRo
37bc0 77 29 3b 0a 20 20 20 20 20 20 20 20 72 55 6e 73  w);.        rUns
37bd0 6f 72 74 65 64 20 3d 20 73 71 6c 69 74 65 33 4c  orted = sqlite3L
37be0 6f 67 45 73 74 41 64 64 28 72 55 6e 73 6f 72 74  ogEstAdd(rUnsort
37bf0 65 64 2c 20 70 46 72 6f 6d 2d 3e 72 55 6e 73 6f  ed, pFrom->rUnso
37c00 72 74 65 64 29 3b 0a 20 20 20 20 20 20 20 20 6e  rted);.        n
37c10 4f 75 74 20 3d 20 70 46 72 6f 6d 2d 3e 6e 52 6f  Out = pFrom->nRo
37c20 77 20 2b 20 70 57 4c 6f 6f 70 2d 3e 6e 4f 75 74  w + pWLoop->nOut
37c30 3b 0a 20 20 20 20 20 20 20 20 6d 61 73 6b 4e 65  ;.        maskNe
37c40 77 20 3d 20 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c  w = pFrom->maskL
37c50 6f 6f 70 20 7c 20 70 57 4c 6f 6f 70 2d 3e 6d 61  oop | pWLoop->ma
37c60 73 6b 53 65 6c 66 3b 0a 20 20 20 20 20 20 20 20  skSelf;.        
37c70 69 66 28 20 69 73 4f 72 64 65 72 65 64 3c 30 20  if( isOrdered<0 
37c80 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 73 4f  ){.          isO
37c90 72 64 65 72 65 64 20 3d 20 77 68 65 72 65 50 61  rdered = wherePa
37ca0 74 68 53 61 74 69 73 66 69 65 73 4f 72 64 65 72  thSatisfiesOrder
37cb0 42 79 28 70 57 49 6e 66 6f 2c 0a 20 20 20 20 20  By(pWInfo,.     
37cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37cd0 20 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72    pWInfo->pOrder
37ce0 42 79 2c 20 70 46 72 6f 6d 2c 20 70 57 49 6e 66  By, pFrom, pWInf
37cf0 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 2c 0a 20  o->wctrlFlags,. 
37d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37d10 20 20 20 20 20 20 69 4c 6f 6f 70 2c 20 70 57 4c        iLoop, pWL
37d20 6f 6f 70 2c 20 26 72 65 76 4d 61 73 6b 29 3b 0a  oop, &revMask);.
37d30 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
37d40 20 20 20 20 20 20 20 20 20 72 65 76 4d 61 73 6b           revMask
37d50 20 3d 20 70 46 72 6f 6d 2d 3e 72 65 76 4c 6f 6f   = pFrom->revLoo
37d60 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  p;.        }.   
37d70 20 20 20 20 20 69 66 28 20 69 73 4f 72 64 65 72       if( isOrder
37d80 65 64 3e 3d 30 20 26 26 20 69 73 4f 72 64 65 72  ed>=0 && isOrder
37d90 65 64 3c 6e 4f 72 64 65 72 42 79 20 29 7b 0a 20  ed<nOrderBy ){. 
37da0 20 20 20 20 20 20 20 20 20 69 66 28 20 61 53 6f           if( aSo
37db0 72 74 43 6f 73 74 5b 69 73 4f 72 64 65 72 65 64  rtCost[isOrdered
37dc0 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ]==0 ){.        
37dd0 20 20 20 20 61 53 6f 72 74 43 6f 73 74 5b 69 73      aSortCost[is
37de0 4f 72 64 65 72 65 64 5d 20 3d 20 77 68 65 72 65  Ordered] = where
37df0 53 6f 72 74 69 6e 67 43 6f 73 74 28 0a 20 20 20  SortingCost(.   
37e00 20 20 20 20 20 20 20 20 20 20 20 20 20 70 57 49               pWI
37e10 6e 66 6f 2c 20 6e 52 6f 77 45 73 74 2c 20 6e 4f  nfo, nRowEst, nO
37e20 72 64 65 72 42 79 2c 20 69 73 4f 72 64 65 72 65  rderBy, isOrdere
37e30 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 29 3b  d.            );
37e40 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
37e50 20 20 20 20 20 20 20 72 43 6f 73 74 20 3d 20 73         rCost = s
37e60 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28  qlite3LogEstAdd(
37e70 72 55 6e 73 6f 72 74 65 64 2c 20 61 53 6f 72 74  rUnsorted, aSort
37e80 43 6f 73 74 5b 69 73 4f 72 64 65 72 65 64 5d 29  Cost[isOrdered])
37e90 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 57 48 45  ;..          WHE
37ea0 52 45 54 52 41 43 45 28 30 78 30 30 32 2c 0a 20  RETRACE(0x002,. 
37eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 22 2d               ("-
37ec0 2d 2d 2d 20 73 6f 72 74 20 63 6f 73 74 3d 25 2d  --- sort cost=%-
37ed0 33 64 20 28 25 64 2f 25 64 29 20 69 6e 63 72 65  3d (%d/%d) incre
37ee0 61 73 65 73 20 63 6f 73 74 20 25 33 64 20 74 6f  ases cost %3d to
37ef0 20 25 2d 33 64 5c 6e 22 2c 0a 20 20 20 20 20 20   %-3d\n",.      
37f00 20 20 20 20 20 20 20 20 20 61 53 6f 72 74 43 6f           aSortCo
37f10 73 74 5b 69 73 4f 72 64 65 72 65 64 5d 2c 20 28  st[isOrdered], (
37f20 6e 4f 72 64 65 72 42 79 2d 69 73 4f 72 64 65 72  nOrderBy-isOrder
37f30 65 64 29 2c 20 6e 4f 72 64 65 72 42 79 2c 20 0a  ed), nOrderBy, .
37f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
37f50 55 6e 73 6f 72 74 65 64 2c 20 72 43 6f 73 74 29  Unsorted, rCost)
37f60 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
37f70 7b 0a 20 20 20 20 20 20 20 20 20 20 72 43 6f 73  {.          rCos
37f80 74 20 3d 20 72 55 6e 73 6f 72 74 65 64 3b 0a 20  t = rUnsorted;. 
37f90 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
37fa0 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65    /* Check to se
37fb0 65 20 69 66 20 70 57 4c 6f 6f 70 20 73 68 6f 75  e if pWLoop shou
37fc0 6c 64 20 62 65 20 61 64 64 65 64 20 74 6f 20 74  ld be added to t
37fd0 68 65 20 73 65 74 20 6f 66 0a 20 20 20 20 20 20  he set of.      
37fe0 20 20 2a 2a 20 6d 78 43 68 6f 69 63 65 20 62 65    ** mxChoice be
37ff0 73 74 2d 73 6f 2d 66 61 72 20 70 61 74 68 73 2e  st-so-far paths.
38000 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
38010 20 20 20 20 2a 2a 20 46 69 72 73 74 20 6c 6f 6f      ** First loo
38020 6b 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69 6e  k for an existin
38030 67 20 70 61 74 68 20 61 6d 6f 6e 67 20 62 65 73  g path among bes
38040 74 2d 73 6f 2d 66 61 72 20 70 61 74 68 73 0a 20  t-so-far paths. 
38050 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 63         ** that c
38060 6f 76 65 72 73 20 74 68 65 20 73 61 6d 65 20 73  overs the same s
38070 65 74 20 6f 66 20 6c 6f 6f 70 73 20 61 6e 64 20  et of loops and 
38080 68 61 73 20 74 68 65 20 73 61 6d 65 20 69 73 4f  has the same isO
38090 72 64 65 72 65 64 0a 20 20 20 20 20 20 20 20 2a  rdered.        *
380a0 2a 20 73 65 74 74 69 6e 67 20 61 73 20 74 68 65  * setting as the
380b0 20 63 75 72 72 65 6e 74 20 70 61 74 68 20 63 61   current path ca
380c0 6e 64 69 64 61 74 65 2e 0a 20 20 20 20 20 20 20  ndidate..       
380d0 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54   **.        ** T
380e0 68 65 20 74 65 72 6d 20 22 28 28 70 54 6f 2d 3e  he term "((pTo->
380f0 69 73 4f 72 64 65 72 65 64 5e 69 73 4f 72 64 65  isOrdered^isOrde
38100 72 65 64 29 26 30 78 38 30 29 3d 3d 30 22 20 69  red)&0x80)==0" i
38110 73 20 65 71 75 69 76 61 6c 65 6e 74 0a 20 20 20  s equivalent.   
38120 20 20 20 20 20 2a 2a 20 74 6f 20 28 70 54 6f 2d       ** to (pTo-
38130 3e 69 73 4f 72 64 65 72 65 64 3d 3d 28 2d 31 29  >isOrdered==(-1)
38140 29 3d 3d 28 69 73 4f 72 64 65 72 65 64 3d 3d 28  )==(isOrdered==(
38150 2d 31 29 29 22 20 66 6f 72 20 74 68 65 20 72 61  -1))" for the ra
38160 6e 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  nge.        ** o
38170 66 20 6c 65 67 61 6c 20 76 61 6c 75 65 73 20 66  f legal values f
38180 6f 72 20 69 73 4f 72 64 65 72 65 64 2c 20 2d 31  or isOrdered, -1
38190 2e 2e 36 34 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ..64..        */
381a0 0a 20 20 20 20 20 20 20 20 66 6f 72 2